Fork of daniellemaywood.uk/gleam — Wasm codegen work
2

Configure Feed

Select the types of activity you want to include in your feed.

gleam / compiler-core / src / metadata / module_decoder.rs
29 kB 774 lines
1#![allow(clippy::unnecessary_wraps)] // Needed for macro 2 3use capnp::{text, text_list}; 4use ecow::EcoString; 5use itertools::Itertools; 6 7use crate::{ 8 Result, 9 analyse::Inferred, 10 ast::{ 11 BitArrayOption, BitArraySegment, CallArg, Constant, Publicity, SrcSpan, TypedConstant, 12 TypedConstantBitArraySegment, TypedConstantBitArraySegmentOption, 13 }, 14 build::Origin, 15 line_numbers::{Character, LineNumbers}, 16 parse::LiteralFloatValue, 17 reference::{Reference, ReferenceKind, ReferenceMap}, 18 schema_capnp::{self as schema, *}, 19 type_::{ 20 self, AccessorsMap, Deprecation, FieldMap, ModuleInterface, Opaque, RecordAccessor, 21 References, Type, TypeAliasConstructor, TypeConstructor, TypeValueConstructor, 22 TypeValueConstructorField, TypeVariantConstructors, ValueConstructor, 23 ValueConstructorVariant, 24 expression::{Implementations, Purity}, 25 }, 26 uid::UniqueIdGenerator, 27}; 28use std::{collections::HashMap, collections::HashSet, io::BufRead, sync::Arc}; 29 30macro_rules! read_vec { 31 ($reader:expr, $self:expr, $method:ident) => {{ 32 let reader = $reader; 33 let mut vec = Vec::with_capacity(reader.len() as usize); 34 for reader in reader.into_iter() { 35 let value = $self.$method(&reader)?; 36 vec.push(value); 37 } 38 vec 39 }}; 40} 41 42macro_rules! read_hashmap { 43 ($reader:expr, $self:expr, $method:ident) => {{ 44 let reader = $reader; 45 let mut map = HashMap::with_capacity(reader.len() as usize); 46 for prop in reader.into_iter() { 47 let name = $self.string(prop.get_key()?)?; 48 let values = $self.$method(&prop.get_value()?.into())?; 49 let _ = map.insert(name, values); 50 } 51 map 52 }}; 53} 54 55#[derive(Debug)] 56pub struct ModuleDecoder { 57 ids: UniqueIdGenerator, 58 type_var_id_map: HashMap<u64, u64>, 59} 60 61impl ModuleDecoder { 62 pub fn new(ids: UniqueIdGenerator) -> Self { 63 Self { 64 ids, 65 type_var_id_map: Default::default(), 66 } 67 } 68 69 pub fn read(&mut self, reader: impl BufRead) -> Result<ModuleInterface> { 70 let message_reader = 71 capnp::serialize_packed::read_message(reader, capnp::message::ReaderOptions::new())?; 72 let reader = message_reader.get_root::<module::Reader<'_>>()?; 73 74 Ok(ModuleInterface { 75 name: self.string(reader.get_name()?)?, 76 package: self.string(reader.get_package()?)?, 77 is_internal: reader.get_is_internal(), 78 origin: Origin::Src, 79 values: read_hashmap!(reader.get_values()?, self, value_constructor), 80 types: read_hashmap!(reader.get_types()?, self, type_constructor), 81 types_value_constructors: read_hashmap!( 82 reader.get_types_constructors()?, 83 self, 84 type_variants_constructors 85 ), 86 accessors: read_hashmap!(reader.get_accessors()?, self, accessors_map), 87 line_numbers: self.line_numbers(&reader.get_line_numbers()?)?, 88 src_path: self.str(reader.get_src_path()?)?.into(), 89 warnings: vec![], 90 minimum_required_version: self.version(&reader.get_required_version()?), 91 type_aliases: read_hashmap!(reader.get_type_aliases()?, self, type_alias_constructor), 92 documentation: self.string_list(reader.get_documentation()?)?, 93 contains_echo: reader.get_contains_echo(), 94 references: self.references(reader.get_references()?)?, 95 inline_functions: HashMap::new(), 96 }) 97 } 98 99 fn string(&self, reader: text::Reader<'_>) -> Result<EcoString> { 100 self.str(reader).map(|str| str.into()) 101 } 102 103 fn string_list(&self, reader: text_list::Reader<'_>) -> Result<Vec<EcoString>> { 104 let mut vec = Vec::with_capacity(reader.len() as usize); 105 for reader in reader.into_iter() { 106 vec.push(self.string(reader?)?); 107 } 108 Ok(vec) 109 } 110 111 fn str<'a>(&self, reader: text::Reader<'a>) -> Result<&'a str> { 112 reader 113 .to_str() 114 .map_err(|_| capnp::Error::failed("String contains non-utf8 characters".into()).into()) 115 } 116 117 fn references(&self, reader: references::Reader<'_>) -> Result<References> { 118 Ok(References { 119 imported_modules: self.string_set(reader.get_imported_modules()?)?, 120 value_references: self.reference_map(reader.get_value_references()?)?, 121 type_references: self.reference_map(reader.get_type_references()?)?, 122 }) 123 } 124 125 fn string_set(&self, reader: text_list::Reader<'_>) -> Result<HashSet<EcoString>> { 126 let mut set = HashSet::with_capacity(reader.len() as usize); 127 for reader in reader.into_iter() { 128 let _ = set.insert(self.string(reader?)?); 129 } 130 Ok(set) 131 } 132 133 fn reference_map( 134 &self, 135 reader: capnp::struct_list::Reader<'_, reference_map::Owned>, 136 ) -> Result<ReferenceMap> { 137 let mut map = HashMap::with_capacity(reader.len() as usize); 138 for prop in reader.into_iter() { 139 let module = self.string(prop.get_module()?)?; 140 let name = self.string(prop.get_name()?)?; 141 let references = read_vec!(prop.get_references()?, self, reference); 142 let _ = map.insert((module, name), references); 143 } 144 Ok(map) 145 } 146 147 fn reference(&self, reader: &reference::Reader<'_>) -> Result<Reference> { 148 Ok(Reference { 149 location: self.src_span(&reader.get_location()?)?, 150 kind: self.reference_kind(&reader.get_kind()?)?, 151 }) 152 } 153 154 fn reference_kind(&self, reader: &reference_kind::Reader<'_>) -> Result<ReferenceKind> { 155 use reference_kind::Which; 156 Ok(match reader.which()? { 157 Which::Qualified(_) => ReferenceKind::Qualified, 158 Which::Unqualified(_) => ReferenceKind::Unqualified, 159 Which::Import(_) => ReferenceKind::Import, 160 Which::Definition(_) => ReferenceKind::Definition, 161 Which::Alias(_) => ReferenceKind::Alias, 162 }) 163 } 164 165 fn type_constructor( 166 &mut self, 167 reader: &type_constructor::Reader<'_>, 168 ) -> Result<TypeConstructor> { 169 let type_ = self.type_(&reader.get_type()?)?; 170 let deprecation = reader.get_deprecated()?; 171 let deprecation = if deprecation.is_empty() { 172 Deprecation::NotDeprecated 173 } else { 174 Deprecation::Deprecated { 175 message: self.string(deprecation)?, 176 } 177 }; 178 Ok(TypeConstructor { 179 publicity: self.publicity(reader.get_publicity()?)?, 180 origin: self.src_span(&reader.get_origin()?)?, 181 module: self.string(reader.get_module()?)?, 182 parameters: read_vec!(reader.get_parameters()?, self, type_), 183 type_, 184 deprecation, 185 documentation: self.optional_string(self.str(reader.get_documentation()?)?), 186 }) 187 } 188 189 fn type_alias_constructor( 190 &mut self, 191 reader: &type_alias_constructor::Reader<'_>, 192 ) -> Result<TypeAliasConstructor> { 193 let type_ = self.type_(&reader.get_type()?)?; 194 let deprecation = reader.get_deprecation()?; 195 let deprecation = if deprecation.is_empty() { 196 Deprecation::NotDeprecated 197 } else { 198 Deprecation::Deprecated { 199 message: self.string(deprecation)?, 200 } 201 }; 202 let parameters = read_vec!(&reader.get_parameters()?, self, type_); 203 Ok(TypeAliasConstructor { 204 publicity: self.publicity(reader.get_publicity()?)?, 205 origin: self.src_span(&reader.get_origin()?)?, 206 module: self.string(reader.get_module()?)?, 207 type_, 208 deprecation, 209 documentation: self.optional_string(self.str(reader.get_documentation()?)?), 210 arity: reader.get_arity() as usize, 211 parameters, 212 }) 213 } 214 215 fn type_(&mut self, reader: &schema::type_::Reader<'_>) -> Result<Arc<Type>> { 216 use schema::type_::Which; 217 match reader.which()? { 218 Which::App(reader) => self.type_app(&reader), 219 Which::Fn(reader) => self.type_fn(&reader), 220 Which::Tuple(reader) => self.type_tuple(&reader), 221 Which::Var(reader) => self.type_var(&reader), 222 } 223 } 224 225 fn type_app(&mut self, reader: &schema::type_::app::Reader<'_>) -> Result<Arc<Type>> { 226 let package = self.string(reader.get_package()?)?; 227 let module = self.string(reader.get_module()?)?; 228 let name = self.string(reader.get_name()?)?; 229 let arguments = read_vec!(&reader.get_parameters()?, self, type_); 230 let inferred_variant = self.inferred_variant(&reader.get_inferred_variant()?)?; 231 let publicity = self.publicity(reader.get_publicity()?)?; 232 233 Ok(Arc::new(Type::Named { 234 publicity, 235 package, 236 module, 237 name, 238 arguments, 239 inferred_variant, 240 })) 241 } 242 243 fn type_fn(&mut self, reader: &schema::type_::fn_::Reader<'_>) -> Result<Arc<Type>> { 244 let return_ = self.type_(&reader.get_return()?)?; 245 let arguments = read_vec!(&reader.get_arguments()?, self, type_); 246 Ok(Arc::new(Type::Fn { arguments, return_ })) 247 } 248 249 fn type_tuple(&mut self, reader: &schema::type_::tuple::Reader<'_>) -> Result<Arc<Type>> { 250 let elements = read_vec!(&reader.get_elements()?, self, type_); 251 Ok(Arc::new(Type::Tuple { elements })) 252 } 253 254 fn type_var(&mut self, reader: &schema::type_::var::Reader<'_>) -> Result<Arc<Type>> { 255 let serialized_id = reader.get_id(); 256 let id = self.get_or_insert_type_var_id(serialized_id); 257 Ok(type_::generic_var(id)) 258 } 259 260 fn get_or_insert_type_var_id(&mut self, id: u64) -> u64 { 261 match self.type_var_id_map.get(&id) { 262 Some(&id) => id, 263 None => { 264 let new_id = self.ids.next(); 265 let _ = self.type_var_id_map.insert(id, new_id); 266 new_id 267 } 268 } 269 } 270 271 fn type_variants_constructors( 272 &mut self, 273 reader: &types_variant_constructors::Reader<'_>, 274 ) -> Result<TypeVariantConstructors> { 275 let variants = reader 276 .get_variants()? 277 .iter() 278 .map(|r| self.type_value_constructor(&r)) 279 .try_collect()?; 280 let type_parameters_ids = read_vec!( 281 reader.get_type_parameters_ids()?, 282 self, 283 type_variant_constructor_type_parameter_id 284 ); 285 let opaque = if reader.get_opaque() { 286 Opaque::Opaque 287 } else { 288 Opaque::NotOpaque 289 }; 290 291 Ok(TypeVariantConstructors { 292 variants, 293 type_parameters_ids, 294 opaque, 295 }) 296 } 297 298 fn type_variant_constructor_type_parameter_id(&mut self, i: &u16) -> Result<u64> { 299 Ok(self.get_or_insert_type_var_id(*i as u64)) 300 } 301 302 fn type_value_constructor( 303 &mut self, 304 reader: &type_value_constructor::Reader<'_>, 305 ) -> Result<TypeValueConstructor> { 306 Ok(TypeValueConstructor { 307 name: self.string(reader.get_name()?)?, 308 parameters: read_vec!( 309 reader.get_parameters()?, 310 self, 311 type_value_constructor_parameter 312 ), 313 documentation: self.optional_string(self.str(reader.get_documentation()?)?), 314 }) 315 } 316 317 fn type_value_constructor_parameter( 318 &mut self, 319 reader: &type_value_constructor_parameter::Reader<'_>, 320 ) -> Result<TypeValueConstructorField> { 321 Ok(TypeValueConstructorField { 322 type_: self.type_(&reader.get_type()?)?, 323 label: self.optional_string(self.str(reader.get_label()?)?), 324 documentation: self.optional_string(self.str(reader.get_documentation()?)?), 325 }) 326 } 327 328 fn inferred_variant(&mut self, reader: &inferred_variant::Reader<'_>) -> Result<Option<u16>> { 329 use schema::inferred_variant::Which; 330 match reader.which()? { 331 Which::Unknown(_) => Ok(None), 332 Which::Inferred(variant) => Ok(Some(variant)), 333 } 334 } 335 336 fn value_constructor( 337 &mut self, 338 reader: &value_constructor::Reader<'_>, 339 ) -> Result<ValueConstructor> { 340 let type_ = self.type_(&reader.get_type()?)?; 341 let variant = self.value_constructor_variant(&reader.get_variant()?)?; 342 let publicity = self.publicity(reader.get_publicity()?)?; 343 let deprecation = reader.get_deprecated()?; 344 let deprecation = if deprecation.is_empty() { 345 Deprecation::NotDeprecated 346 } else { 347 Deprecation::Deprecated { 348 message: self.string(deprecation)?, 349 } 350 }; 351 Ok(ValueConstructor { 352 deprecation, 353 publicity, 354 type_, 355 variant, 356 }) 357 } 358 359 fn publicity(&self, reader: publicity::Reader<'_>) -> Result<Publicity> { 360 match reader.which()? { 361 publicity::Which::Public(()) => Ok(Publicity::Public), 362 publicity::Which::Private(()) => Ok(Publicity::Private), 363 publicity::Which::Internal(reader) => match reader?.which()? { 364 option::Which::None(()) => Ok(Publicity::Internal { 365 attribute_location: None, 366 }), 367 option::Which::Some(reader) => Ok(Publicity::Internal { 368 attribute_location: Some(self.src_span(&reader?)?), 369 }), 370 }, 371 } 372 } 373 374 fn constant(&mut self, reader: &constant::Reader<'_>) -> Result<TypedConstant> { 375 use constant::Which; 376 match reader.which()? { 377 Which::Int(reader) => Ok(self.constant_int(self.str(reader?)?)), 378 Which::Float(reader) => Ok(self.constant_float(self.str(reader?)?)), 379 Which::String(reader) => Ok(self.constant_string(self.str(reader?)?)), 380 Which::Tuple(reader) => self.constant_tuple(&reader), 381 Which::List(reader) => self.constant_list(&reader), 382 Which::Record(reader) => self.constant_record(&reader), 383 Which::BitArray(reader) => self.constant_bit_array(&reader?), 384 Which::Var(reader) => self.constant_var(&reader), 385 Which::StringConcatenation(reader) => self.constant_string_concatenation(&reader), 386 } 387 } 388 389 fn constant_int(&self, value: &str) -> TypedConstant { 390 Constant::Int { 391 location: Default::default(), 392 value: value.into(), 393 int_value: crate::parse::parse_int_value(value).expect("int value to parse as bigint"), 394 } 395 } 396 397 fn constant_float(&self, value: &str) -> TypedConstant { 398 Constant::Float { 399 location: Default::default(), 400 value: value.into(), 401 float_value: LiteralFloatValue::parse(value) 402 .expect("float value to parse as non-NaN f64"), 403 } 404 } 405 406 fn constant_string(&self, value: &str) -> TypedConstant { 407 Constant::String { 408 location: Default::default(), 409 value: value.into(), 410 } 411 } 412 413 fn constant_tuple(&mut self, reader: &constant::tuple::Reader<'_>) -> Result<TypedConstant> { 414 let type_ = self.type_(&reader.get_type()?)?; 415 Ok(Constant::Tuple { 416 location: Default::default(), 417 elements: read_vec!(reader.get_elements()?, self, constant), 418 type_, 419 }) 420 } 421 422 fn constant_list(&mut self, reader: &constant::list::Reader<'_>) -> Result<TypedConstant> { 423 let type_ = self.type_(&reader.get_type()?)?; 424 Ok(Constant::List { 425 location: Default::default(), 426 elements: read_vec!(reader.get_elements()?, self, constant), 427 type_, 428 }) 429 } 430 431 fn constant_record(&mut self, reader: &constant::record::Reader<'_>) -> Result<TypedConstant> { 432 let type_ = self.type_(&reader.get_type()?)?; 433 let tag = self.string(reader.get_tag()?)?; 434 let arguments = read_vec!(reader.get_args()?, self, constant_call_arg); 435 Ok(Constant::Record { 436 location: Default::default(), 437 module: Default::default(), 438 name: Default::default(), 439 arguments, 440 tag, 441 type_, 442 field_map: Inferred::Unknown, 443 record_constructor: None, 444 }) 445 } 446 447 fn constant_call_arg( 448 &mut self, 449 reader: &constant::Reader<'_>, 450 ) -> Result<CallArg<TypedConstant>> { 451 Ok(CallArg { 452 implicit: None, 453 label: Default::default(), 454 location: Default::default(), 455 value: self.constant(reader)?, 456 }) 457 } 458 459 fn constant_bit_array( 460 &mut self, 461 reader: &capnp::struct_list::Reader<'_, bit_array_segment::Owned>, 462 ) -> Result<TypedConstant> { 463 Ok(Constant::BitArray { 464 location: Default::default(), 465 segments: read_vec!(reader, self, bit_array_segment), 466 }) 467 } 468 469 fn constant_var(&mut self, reader: &constant::var::Reader<'_>) -> Result<TypedConstant> { 470 let type_ = self.type_(&reader.get_type()?)?; 471 let module = self.optional_string(self.str(reader.get_module()?)?); 472 let name = reader.get_name()?; 473 let constructor = self.value_constructor(&reader.get_constructor()?)?; 474 Ok(Constant::Var { 475 location: Default::default(), 476 module: module.map(|module| (module, Default::default())), 477 name: self.string(name)?, 478 constructor: Some(Box::from(constructor)), 479 type_, 480 }) 481 } 482 483 fn constant_string_concatenation( 484 &mut self, 485 reader: &constant::string_concatenation::Reader<'_>, 486 ) -> Result<TypedConstant> { 487 Ok(Constant::StringConcatenation { 488 location: Default::default(), 489 left: Box::new(self.constant(&reader.get_left()?)?), 490 right: Box::new(self.constant(&reader.get_right()?)?), 491 }) 492 } 493 494 fn bit_array_segment( 495 &mut self, 496 reader: &bit_array_segment::Reader<'_>, 497 ) -> Result<TypedConstantBitArraySegment> { 498 Ok(BitArraySegment { 499 location: Default::default(), 500 type_: self.type_(&reader.get_type()?)?, 501 value: Box::new(self.constant(&reader.get_value()?)?), 502 options: read_vec!(reader.get_options()?, self, bit_array_segment_option), 503 }) 504 } 505 506 fn bit_array_segment_option( 507 &mut self, 508 reader: &bit_array_segment_option::Reader<'_>, 509 ) -> Result<TypedConstantBitArraySegmentOption> { 510 use bit_array_segment_option::Which; 511 Ok(match reader.which()? { 512 Which::Bytes(_) => BitArrayOption::Bytes { 513 location: Default::default(), 514 }, 515 Which::Integer(_) => BitArrayOption::Int { 516 location: Default::default(), 517 }, 518 Which::Float(_) => BitArrayOption::Float { 519 location: Default::default(), 520 }, 521 Which::Bits(_) => BitArrayOption::Bits { 522 location: Default::default(), 523 }, 524 Which::Utf8(_) => BitArrayOption::Utf8 { 525 location: Default::default(), 526 }, 527 Which::Utf16(_) => BitArrayOption::Utf16 { 528 location: Default::default(), 529 }, 530 Which::Utf32(_) => BitArrayOption::Utf32 { 531 location: Default::default(), 532 }, 533 Which::Utf8Codepoint(_) => BitArrayOption::Utf8Codepoint { 534 location: Default::default(), 535 }, 536 Which::Utf16Codepoint(_) => BitArrayOption::Utf16Codepoint { 537 location: Default::default(), 538 }, 539 Which::Utf32Codepoint(_) => BitArrayOption::Utf32Codepoint { 540 location: Default::default(), 541 }, 542 Which::Signed(_) => BitArrayOption::Signed { 543 location: Default::default(), 544 }, 545 Which::Unsigned(_) => BitArrayOption::Unsigned { 546 location: Default::default(), 547 }, 548 Which::Big(_) => BitArrayOption::Big { 549 location: Default::default(), 550 }, 551 Which::Little(_) => BitArrayOption::Little { 552 location: Default::default(), 553 }, 554 Which::Native(_) => BitArrayOption::Native { 555 location: Default::default(), 556 }, 557 Which::Size(reader) => BitArrayOption::Size { 558 location: Default::default(), 559 short_form: reader.get_short_form(), 560 value: Box::new(self.constant(&reader.get_value()?)?), 561 }, 562 Which::Unit(reader) => BitArrayOption::Unit { 563 location: Default::default(), 564 value: reader.get_value(), 565 }, 566 }) 567 } 568 569 fn value_constructor_variant( 570 &mut self, 571 reader: &value_constructor_variant::Reader<'_>, 572 ) -> Result<ValueConstructorVariant> { 573 use value_constructor_variant::Which; 574 match reader.which()? { 575 Which::ModuleConstant(reader) => self.module_constant_variant(&reader), 576 Which::ModuleFn(reader) => self.module_fn_variant(&reader), 577 Which::Record(reader) => self.record(&reader), 578 } 579 } 580 581 fn module_constant_variant( 582 &mut self, 583 reader: &value_constructor_variant::module_constant::Reader<'_>, 584 ) -> Result<ValueConstructorVariant> { 585 Ok(ValueConstructorVariant::ModuleConstant { 586 documentation: self.optional_string(self.str(reader.get_documentation()?)?), 587 location: self.src_span(&reader.get_location()?)?, 588 literal: self.constant(&reader.get_literal()?)?, 589 module: self.string(reader.get_module()?)?, 590 name: self.string(reader.get_name()?)?, 591 implementations: self.implementations(reader.get_implementations()?), 592 }) 593 } 594 595 fn optional_string(&self, str: &str) -> Option<EcoString> { 596 if str.is_empty() { 597 None 598 } else { 599 Some(str.into()) 600 } 601 } 602 603 fn src_span(&self, reader: &src_span::Reader<'_>) -> Result<SrcSpan> { 604 Ok(SrcSpan { 605 start: reader.get_start(), 606 end: reader.get_end(), 607 }) 608 } 609 610 fn module_fn_variant( 611 &self, 612 reader: &value_constructor_variant::module_fn::Reader<'_>, 613 ) -> Result<ValueConstructorVariant> { 614 let purity = match reader.get_purity()?.which()? { 615 purity::Which::Pure(()) => Purity::Pure, 616 purity::Which::TrustedPure(()) => Purity::TrustedPure, 617 purity::Which::Impure(()) => Purity::Impure, 618 purity::Which::Unknown(()) => Purity::Unknown, 619 }; 620 621 Ok(ValueConstructorVariant::ModuleFn { 622 name: self.string(reader.get_name()?)?, 623 module: self.string(reader.get_module()?)?, 624 arity: reader.get_arity() as usize, 625 field_map: self.field_map(&reader.get_field_map()?)?, 626 location: self.src_span(&reader.get_location()?)?, 627 documentation: self.optional_string(self.str(reader.get_documentation()?)?), 628 implementations: self.implementations(reader.get_implementations()?), 629 external_erlang: self.optional_external(reader.get_external_erlang()?)?, 630 external_javascript: self.optional_external(reader.get_external_javascript()?)?, 631 purity, 632 }) 633 } 634 635 fn implementations(&self, reader: implementations::Reader<'_>) -> Implementations { 636 Implementations { 637 gleam: reader.get_gleam(), 638 uses_erlang_externals: reader.get_uses_erlang_externals(), 639 uses_javascript_externals: reader.get_uses_javascript_externals(), 640 can_run_on_erlang: reader.get_can_run_on_erlang(), 641 can_run_on_javascript: reader.get_can_run_on_javascript(), 642 } 643 } 644 645 fn record( 646 &self, 647 reader: &value_constructor_variant::record::Reader<'_>, 648 ) -> Result<ValueConstructorVariant> { 649 Ok(ValueConstructorVariant::Record { 650 name: self.string(reader.get_name()?)?, 651 module: self.string(reader.get_module()?)?, 652 arity: reader.get_arity(), 653 variants_count: reader.get_constructors_count(), 654 field_map: self.field_map(&reader.get_field_map()?)?, 655 location: self.src_span(&reader.get_location()?)?, 656 documentation: self.optional_string(self.str(reader.get_documentation()?)?), 657 variant_index: reader.get_constructor_index(), 658 }) 659 } 660 661 fn field_map(&self, reader: &option::Reader<'_, field_map::Owned>) -> Result<Option<FieldMap>> { 662 use option::Which; 663 Ok(match reader.which()? { 664 Which::None(_) => None, 665 Which::Some(reader) => Some({ 666 let reader = reader?; 667 FieldMap { 668 arity: reader.get_arity(), 669 fields: read_hashmap!(&reader.get_fields()?, self, u32), 670 } 671 }), 672 }) 673 } 674 675 fn u32(&self, i: &boxed_u_int32::Reader<'_>) -> Result<u32> { 676 Ok(i.get_value()) 677 } 678 679 fn accessors_map(&mut self, reader: &accessors_map::Reader<'_>) -> Result<AccessorsMap> { 680 Ok(AccessorsMap { 681 publicity: self.publicity(reader.get_publicity()?)?, 682 type_: self.type_(&reader.get_type()?)?, 683 shared_accessors: read_hashmap!(&reader.get_shared_accessors()?, self, record_accessor), 684 variant_specific_accessors: read_vec!( 685 &reader.get_variant_specific_accessors()?, 686 self, 687 variant_specific_accessors 688 ), 689 variant_positional_accessors: read_vec!( 690 &reader.get_positional_accessors()?, 691 self, 692 positional_accessors 693 ), 694 }) 695 } 696 697 fn variant_specific_accessors( 698 &mut self, 699 reader: &variant_specific_accessors::Reader<'_>, 700 ) -> Result<HashMap<EcoString, RecordAccessor>> { 701 Ok(read_hashmap!( 702 &reader.get_accessors()?, 703 self, 704 record_accessor 705 )) 706 } 707 708 fn positional_accessors( 709 &mut self, 710 reader: &positional_accessors::Reader<'_>, 711 ) -> Result<Vec<Arc<Type>>> { 712 Ok(read_vec!(&reader.get_accessors()?, self, type_)) 713 } 714 715 fn record_accessor(&mut self, reader: &record_accessor::Reader<'_>) -> Result<RecordAccessor> { 716 Ok(RecordAccessor { 717 index: reader.get_index() as u64, 718 label: self.string(reader.get_label()?)?, 719 type_: self.type_(&reader.get_type()?)?, 720 documentation: self.optional_string(self.str(reader.get_documentation()?)?), 721 }) 722 } 723 724 fn line_starts(&mut self, i: &u32) -> Result<u32> { 725 Ok(*i) 726 } 727 728 fn line_numbers(&mut self, reader: &line_numbers::Reader<'_>) -> Result<LineNumbers> { 729 Ok(LineNumbers { 730 length: reader.get_length(), 731 line_starts: read_vec!(reader.get_line_starts()?, self, line_starts), 732 mapping: self.mapping(reader.get_mapping()?), 733 }) 734 } 735 736 fn mapping( 737 &self, 738 reader: capnp::struct_list::Reader<'_, character::Owned>, 739 ) -> HashMap<usize, Character> { 740 let mut map = HashMap::with_capacity(reader.len() as usize); 741 for character in reader.into_iter() { 742 let byte_index = character.get_byte_index() as usize; 743 let length_utf8 = character.get_length_utf8(); 744 let length_utf16 = character.get_length_utf16(); 745 _ = map.insert( 746 byte_index, 747 Character { 748 length_utf16, 749 length_utf8, 750 }, 751 ) 752 } 753 map 754 } 755 756 fn version(&self, reader: &version::Reader<'_>) -> hexpm::version::Version { 757 hexpm::version::Version::new(reader.get_major(), reader.get_minor(), reader.get_patch()) 758 } 759 760 fn optional_external( 761 &self, 762 reader: option::Reader<'_, external::Owned>, 763 ) -> Result<Option<(EcoString, EcoString)>> { 764 match reader.which()? { 765 option::Which::None(()) => Ok(None), 766 option::Which::Some(reader) => { 767 let reader = reader?; 768 let module = self.string(reader.get_module()?)?; 769 let function = self.string(reader.get_function()?)?; 770 Ok(Some((module, function))) 771 } 772 } 773 } 774}