diff --git a/starstream-compiler/src/formatter.rs b/starstream-compiler/src/formatter.rs index 13305afb..8bc20835 100644 --- a/starstream-compiler/src/formatter.rs +++ b/starstream-compiler/src/formatter.rs @@ -239,7 +239,7 @@ fn struct_definition_to_doc<'a>( ) -> RcDoc<'a, ()> { // Use struct name's end position as body_start to avoid picking up // comments that belong to the struct definition itself - let body_start = definition.name.span.map(|s| s.end).unwrap_or(0); + let body_start = definition.name.span().end; RcDoc::text("struct") .append(RcDoc::space()) @@ -304,7 +304,7 @@ fn enum_definition_to_doc<'a>( ) -> RcDoc<'a, ()> { // Use enum name's end position as body_start to avoid picking up // comments that belong to the enum definition itself - let body_start = definition.name.span.map(|s| s.end).unwrap_or(0); + let body_start = definition.name.span().end; RcDoc::text("enum") .append(RcDoc::space()) @@ -383,7 +383,7 @@ fn enum_variant_to_doc<'a>( } EnumVariantPayload::Struct(fields) => { // Use variant name's end as body_start for struct fields - let body_start = variant.name.span.map(|s| s.end).unwrap_or(0); + let body_start = variant.name.span().end; let body = if fields.len() < 3 { inline_struct_fields_to_doc(fields, source) } else { diff --git a/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__abi__tests__abi_empty.snap b/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__abi__tests__abi_empty.snap index 40d94cb7..ce4151e5 100644 --- a/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__abi__tests__abi_empty.snap +++ b/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__abi__tests__abi_empty.snap @@ -5,9 +5,7 @@ description: "Code:\n\nabi Events {}" AbiDef { name: Identifier { name: "Events", - span: Some( - 4..10, - ), + span: 4..10, }, parts: [], } diff --git a/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__abi__tests__abi_event_no_params.snap b/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__abi__tests__abi_event_no_params.snap index 1498e998..2e1d379d 100644 --- a/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__abi__tests__abi_event_no_params.snap +++ b/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__abi__tests__abi_event_no_params.snap @@ -5,18 +5,14 @@ description: "Code:\n\nabi Events {\n event Ping();\n}\n" AbiDef { name: Identifier { name: "Events", - span: Some( - 4..10, - ), + span: 4..10, }, parts: [ Event( EventDef { name: Identifier { name: "Ping", - span: Some( - 23..27, - ), + span: 23..27, }, params: [], }, diff --git a/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__abi__tests__abi_multiple_events.snap b/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__abi__tests__abi_multiple_events.snap index 299588ef..324c72c1 100644 --- a/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__abi__tests__abi_multiple_events.snap +++ b/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__abi__tests__abi_multiple_events.snap @@ -5,33 +5,25 @@ description: "Code:\n\nabi Events {\n event Transfer(sender: i64, to: i64, am AbiDef { name: Identifier { name: "Events", - span: Some( - 4..10, - ), + span: 4..10, }, parts: [ Event( EventDef { name: Identifier { name: "Transfer", - span: Some( - 23..31, - ), + span: 23..31, }, params: [ FunctionParam { name: Identifier { name: "sender", - span: Some( - 32..38, - ), + span: 32..38, }, ty: TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 40..43, - ), + span: 40..43, }, generics: [], }, @@ -39,16 +31,12 @@ AbiDef { FunctionParam { name: Identifier { name: "to", - span: Some( - 45..47, - ), + span: 45..47, }, ty: TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 49..52, - ), + span: 49..52, }, generics: [], }, @@ -56,16 +44,12 @@ AbiDef { FunctionParam { name: Identifier { name: "amount", - span: Some( - 54..60, - ), + span: 54..60, }, ty: TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 62..65, - ), + span: 62..65, }, generics: [], }, @@ -77,24 +61,18 @@ AbiDef { EventDef { name: Identifier { name: "Log", - span: Some( - 78..81, - ), + span: 78..81, }, params: [ FunctionParam { name: Identifier { name: "message", - span: Some( - 82..89, - ), + span: 82..89, }, ty: TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 91..94, - ), + span: 91..94, }, generics: [], }, diff --git a/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__abi__tests__abi_single_event.snap b/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__abi__tests__abi_single_event.snap index 09dd31a8..83f32650 100644 --- a/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__abi__tests__abi_single_event.snap +++ b/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__abi__tests__abi_single_event.snap @@ -5,33 +5,25 @@ description: "Code:\n\nabi Events {\n event Transfer(sender: i64, to: i64);\n AbiDef { name: Identifier { name: "Events", - span: Some( - 4..10, - ), + span: 4..10, }, parts: [ Event( EventDef { name: Identifier { name: "Transfer", - span: Some( - 23..31, - ), + span: 23..31, }, params: [ FunctionParam { name: Identifier { name: "sender", - span: Some( - 32..38, - ), + span: 32..38, }, ty: TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 40..43, - ), + span: 40..43, }, generics: [], }, @@ -39,16 +31,12 @@ AbiDef { FunctionParam { name: Identifier { name: "to", - span: Some( - 45..47, - ), + span: 45..47, }, ty: TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 49..52, - ), + span: 49..52, }, generics: [], }, diff --git a/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__enum_def__tests__enum_struct_variants.snap b/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__enum_def__tests__enum_struct_variants.snap index 5edcda00..e3fadc2e 100644 --- a/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__enum_def__tests__enum_struct_variants.snap +++ b/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__enum_def__tests__enum_struct_variants.snap @@ -5,33 +5,25 @@ description: "Code:\n\nenum Result { Ok { value: i64 }, Err { msg: i64 } }" EnumDef { name: Identifier { name: "Result", - span: Some( - 5..11, - ), + span: 5..11, }, variants: [ EnumVariant { name: Identifier { name: "Ok", - span: Some( - 14..16, - ), + span: 14..16, }, payload: Struct( [ StructField { name: Identifier { name: "value", - span: Some( - 19..24, - ), + span: 19..24, }, ty: TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 26..29, - ), + span: 26..29, }, generics: [], }, @@ -44,25 +36,19 @@ EnumDef { EnumVariant { name: Identifier { name: "Err", - span: Some( - 33..36, - ), + span: 33..36, }, payload: Struct( [ StructField { name: Identifier { name: "msg", - span: Some( - 39..42, - ), + span: 39..42, }, ty: TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 44..47, - ), + span: 44..47, }, generics: [], }, diff --git a/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__enum_def__tests__enum_tuple_variants.snap b/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__enum_def__tests__enum_tuple_variants.snap index 74d66fb1..9987a7ce 100644 --- a/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__enum_def__tests__enum_tuple_variants.snap +++ b/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__enum_def__tests__enum_tuple_variants.snap @@ -5,26 +5,20 @@ description: "Code:\n\nenum Option { Some(i64), None }" EnumDef { name: Identifier { name: "Option", - span: Some( - 5..11, - ), + span: 5..11, }, variants: [ EnumVariant { name: Identifier { name: "Some", - span: Some( - 14..18, - ), + span: 14..18, }, payload: Tuple( [ TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 19..22, - ), + span: 19..22, }, generics: [], }, @@ -35,9 +29,7 @@ EnumDef { EnumVariant { name: Identifier { name: "None", - span: Some( - 25..29, - ), + span: 25..29, }, payload: Unit, span: 25..30, diff --git a/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__enum_def__tests__enum_unit_variants.snap b/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__enum_def__tests__enum_unit_variants.snap index 85db35f9..7033bbfa 100644 --- a/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__enum_def__tests__enum_unit_variants.snap +++ b/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__enum_def__tests__enum_unit_variants.snap @@ -5,17 +5,13 @@ description: "Code:\n\nenum Color { Red, Green, Blue }" EnumDef { name: Identifier { name: "Color", - span: Some( - 5..10, - ), + span: 5..10, }, variants: [ EnumVariant { name: Identifier { name: "Red", - span: Some( - 13..16, - ), + span: 13..16, }, payload: Unit, span: 13..16, @@ -23,9 +19,7 @@ EnumDef { EnumVariant { name: Identifier { name: "Green", - span: Some( - 18..23, - ), + span: 18..23, }, payload: Unit, span: 18..23, @@ -33,9 +27,7 @@ EnumDef { EnumVariant { name: Identifier { name: "Blue", - span: Some( - 25..29, - ), + span: 25..29, }, payload: Unit, span: 25..30, diff --git a/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__function__tests__function_script_export.snap b/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__function__tests__function_script_export.snap index 3c16b2ad..f503eb9b 100644 --- a/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__function__tests__function_script_export.snap +++ b/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__function__tests__function_script_export.snap @@ -8,9 +8,7 @@ FunctionDef { ), name: Identifier { name: "main", - span: Some( - 10..14, - ), + span: 10..14, }, params: [], return_type: None, diff --git a/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__function__tests__function_simple.snap b/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__function__tests__function_simple.snap index 1c1eb52a..18931f91 100644 --- a/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__function__tests__function_simple.snap +++ b/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__function__tests__function_simple.snap @@ -6,9 +6,7 @@ FunctionDef { export: None, name: Identifier { name: "foo", - span: Some( - 3..6, - ), + span: 3..6, }, params: [], return_type: None, diff --git a/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__function__tests__function_with_params.snap b/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__function__tests__function_with_params.snap index 6b478b94..104ef7a9 100644 --- a/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__function__tests__function_with_params.snap +++ b/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__function__tests__function_with_params.snap @@ -6,24 +6,18 @@ FunctionDef { export: None, name: Identifier { name: "add", - span: Some( - 3..6, - ), + span: 3..6, }, params: [ FunctionParam { name: Identifier { name: "a", - span: Some( - 7..8, - ), + span: 7..8, }, ty: TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 10..13, - ), + span: 10..13, }, generics: [], }, @@ -31,16 +25,12 @@ FunctionDef { FunctionParam { name: Identifier { name: "b", - span: Some( - 15..16, - ), + span: 15..16, }, ty: TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 18..21, - ), + span: 18..21, }, generics: [], }, @@ -50,9 +40,7 @@ FunctionDef { TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 26..29, - ), + span: 26..29, }, generics: [], }, @@ -64,9 +52,7 @@ FunctionDef { node: Identifier( Identifier { name: "a", - span: Some( - 32..33, - ), + span: 32..33, }, ), span: 32..34, diff --git a/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__import__tests__import_named.snap b/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__import__tests__import_named.snap index 8b7df75c..da9bf1f1 100644 --- a/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__import__tests__import_named.snap +++ b/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__import__tests__import_named.snap @@ -8,15 +8,11 @@ ImportDef { ImportNamedItem { imported: Identifier { name: "blockHeight", - span: Some( - 9..20, - ), + span: 9..20, }, local: Identifier { name: "blockHeight", - span: Some( - 9..20, - ), + span: 9..20, }, }, ], @@ -24,22 +20,16 @@ ImportDef { from: ImportSource { namespace: Identifier { name: "starstream", - span: Some( - 28..38, - ), + span: 28..38, }, package: Identifier { name: "std", - span: Some( - 39..42, - ), + span: 39..42, }, interface: Some( Identifier { name: "cardano", - span: Some( - 43..50, - ), + span: 43..50, }, ), }, diff --git a/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__import__tests__import_named_multiple.snap b/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__import__tests__import_named_multiple.snap index 9bc54079..1eaaef19 100644 --- a/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__import__tests__import_named_multiple.snap +++ b/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__import__tests__import_named_multiple.snap @@ -8,29 +8,21 @@ ImportDef { ImportNamedItem { imported: Identifier { name: "blockHeight", - span: Some( - 9..20, - ), + span: 9..20, }, local: Identifier { name: "blockHeight", - span: Some( - 9..20, - ), + span: 9..20, }, }, ImportNamedItem { imported: Identifier { name: "now", - span: Some( - 22..25, - ), + span: 22..25, }, local: Identifier { name: "now", - span: Some( - 22..25, - ), + span: 22..25, }, }, ], @@ -38,22 +30,16 @@ ImportDef { from: ImportSource { namespace: Identifier { name: "starstream", - span: Some( - 33..43, - ), + span: 33..43, }, package: Identifier { name: "std", - span: Some( - 44..47, - ), + span: 44..47, }, interface: Some( Identifier { name: "cardano", - span: Some( - 48..55, - ), + span: 48..55, }, ), }, diff --git a/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__import__tests__import_named_with_alias.snap b/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__import__tests__import_named_with_alias.snap index 72f18d5b..b0285028 100644 --- a/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__import__tests__import_named_with_alias.snap +++ b/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__import__tests__import_named_with_alias.snap @@ -8,15 +8,11 @@ ImportDef { ImportNamedItem { imported: Identifier { name: "blockHeight", - span: Some( - 9..20, - ), + span: 9..20, }, local: Identifier { name: "height", - span: Some( - 24..30, - ), + span: 24..30, }, }, ], @@ -24,22 +20,16 @@ ImportDef { from: ImportSource { namespace: Identifier { name: "starstream", - span: Some( - 38..48, - ), + span: 38..48, }, package: Identifier { name: "std", - span: Some( - 49..52, - ), + span: 49..52, }, interface: Some( Identifier { name: "cardano", - span: Some( - 53..60, - ), + span: 53..60, }, ), }, diff --git a/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__import__tests__import_namespace.snap b/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__import__tests__import_namespace.snap index e4f47e66..6cf27431 100644 --- a/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__import__tests__import_namespace.snap +++ b/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__import__tests__import_namespace.snap @@ -6,23 +6,17 @@ ImportDef { items: Namespace( Identifier { name: "context", - span: Some( - 7..14, - ), + span: 7..14, }, ), from: ImportSource { namespace: Identifier { name: "starstream", - span: Some( - 20..30, - ), + span: 20..30, }, package: Identifier { name: "std", - span: Some( - 31..34, - ), + span: 31..34, }, interface: None, }, diff --git a/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__struct_def__tests__struct_multiple_fields.snap b/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__struct_def__tests__struct_multiple_fields.snap index aef6ffbc..a1d5e62f 100644 --- a/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__struct_def__tests__struct_multiple_fields.snap +++ b/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__struct_def__tests__struct_multiple_fields.snap @@ -5,24 +5,18 @@ description: "Code:\n\nstruct Point { x: i64, y: i64 }" StructDef { name: Identifier { name: "Point", - span: Some( - 7..12, - ), + span: 7..12, }, fields: [ StructField { name: Identifier { name: "x", - span: Some( - 15..16, - ), + span: 15..16, }, ty: TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 18..21, - ), + span: 18..21, }, generics: [], }, @@ -31,16 +25,12 @@ StructDef { StructField { name: Identifier { name: "y", - span: Some( - 23..24, - ), + span: 23..24, }, ty: TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 26..29, - ), + span: 26..29, }, generics: [], }, diff --git a/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__struct_def__tests__struct_single_field.snap b/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__struct_def__tests__struct_single_field.snap index 6dd8699d..5aa8bfe5 100644 --- a/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__struct_def__tests__struct_single_field.snap +++ b/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__struct_def__tests__struct_single_field.snap @@ -5,24 +5,18 @@ description: "Code:\n\nstruct Point { x: i64 }" StructDef { name: Identifier { name: "Point", - span: Some( - 7..12, - ), + span: 7..12, }, fields: [ StructField { name: Identifier { name: "x", - span: Some( - 15..16, - ), + span: 15..16, }, ty: TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 18..21, - ), + span: 18..21, }, generics: [], }, diff --git a/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__utxo__tests__utxo_empty.snap b/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__utxo__tests__utxo_empty.snap index 8210ecc8..b9059bbf 100644 --- a/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__utxo__tests__utxo_empty.snap +++ b/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__utxo__tests__utxo_empty.snap @@ -5,9 +5,7 @@ description: "Code:\n\nutxo Counter {}" UtxoDef { name: Identifier { name: "Counter", - span: Some( - 5..12, - ), + span: 5..12, }, parts: [], } diff --git a/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__utxo__tests__utxo_with_storage.snap b/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__utxo__tests__utxo_with_storage.snap index d6a8cc58..b225a091 100644 --- a/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__utxo__tests__utxo_with_storage.snap +++ b/starstream-compiler/src/parser/definition/snapshots/starstream_compiler__parser__definition__utxo__tests__utxo_with_storage.snap @@ -5,9 +5,7 @@ description: "Code:\n\nutxo Counter {\n storage {\n let mut count: i64 UtxoDef { name: Identifier { name: "Counter", - span: Some( - 5..12, - ), + span: 5..12, }, parts: [ Storage( @@ -15,16 +13,12 @@ UtxoDef { UtxoGlobal { name: Identifier { name: "count", - span: Some( - 45..50, - ), + span: 45..50, }, ty: TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 52..55, - ), + span: 52..55, }, generics: [], }, diff --git a/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__emit__tests__emit_no_args.snap b/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__emit__tests__emit_no_args.snap index a74733d2..ffd08e14 100644 --- a/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__emit__tests__emit_no_args.snap +++ b/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__emit__tests__emit_no_args.snap @@ -6,9 +6,7 @@ Spanned { node: Emit { event: Identifier { name: "Ping", - span: Some( - 18..22, - ), + span: 18..22, }, args: [], }, diff --git a/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__emit__tests__emit_with_args.snap b/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__emit__tests__emit_with_args.snap index b09d5868..4cc80a62 100644 --- a/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__emit__tests__emit_with_args.snap +++ b/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__emit__tests__emit_with_args.snap @@ -6,18 +6,14 @@ Spanned { node: Emit { event: Identifier { name: "Transfer", - span: Some( - 23..31, - ), + span: 23..31, }, args: [ Spanned { node: Identifier( Identifier { name: "sender", - span: Some( - 32..38, - ), + span: 32..38, }, ), span: 32..38, @@ -26,9 +22,7 @@ Spanned { node: Identifier( Identifier { name: "to", - span: Some( - 40..42, - ), + span: 40..42, }, ), span: 40..42, @@ -37,9 +31,7 @@ Spanned { node: Identifier( Identifier { name: "amount", - span: Some( - 44..50, - ), + span: 44..50, }, ), span: 44..50, diff --git a/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__enum_constructor__tests__enum_constructor_expression.snap b/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__enum_constructor__tests__enum_constructor_expression.snap index 7655d6b0..a923c958 100644 --- a/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__enum_constructor__tests__enum_constructor_expression.snap +++ b/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__enum_constructor__tests__enum_constructor_expression.snap @@ -6,15 +6,11 @@ Spanned { node: EnumConstructor { enum_name: Identifier { name: "Result", - span: Some( - 0..6, - ), + span: 0..6, }, variant: Identifier { name: "Ok", - span: Some( - 8..10, - ), + span: 8..10, }, payload: Tuple( [ @@ -22,9 +18,7 @@ Spanned { node: Identifier( Identifier { name: "answer", - span: Some( - 11..17, - ), + span: 11..17, }, ), span: 11..17, diff --git a/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__enum_constructor__tests__enum_constructor_unit.snap b/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__enum_constructor__tests__enum_constructor_unit.snap index 1d0609d8..2e422de2 100644 --- a/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__enum_constructor__tests__enum_constructor_unit.snap +++ b/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__enum_constructor__tests__enum_constructor_unit.snap @@ -6,15 +6,11 @@ Spanned { node: EnumConstructor { enum_name: Identifier { name: "Option", - span: Some( - 0..6, - ), + span: 0..6, }, variant: Identifier { name: "None", - span: Some( - 8..12, - ), + span: 8..12, }, payload: Unit, }, diff --git a/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__if_expr__tests__if_else.snap b/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__if_expr__tests__if_else.snap index 9021b60c..972c23cb 100644 --- a/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__if_expr__tests__if_else.snap +++ b/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__if_expr__tests__if_else.snap @@ -10,9 +10,7 @@ Spanned { node: Identifier( Identifier { name: "flag", - span: Some( - 4..8, - ), + span: 4..8, }, ), span: 4..8, @@ -24,9 +22,7 @@ Spanned { mutable: false, name: Identifier { name: "a", - span: Some( - 16..17, - ), + span: 16..17, }, ty: None, value: Spanned { @@ -53,9 +49,7 @@ Spanned { node: Assignment { target: Identifier { name: "value", - span: Some( - 32..37, - ), + span: 32..37, }, value: Spanned { node: Binary { @@ -64,9 +58,7 @@ Spanned { node: Identifier( Identifier { name: "value", - span: Some( - 40..45, - ), + span: 40..45, }, ), span: 40..46, diff --git a/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__if_expr__tests__if_else_if.snap b/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__if_expr__tests__if_else_if.snap index 619f9a66..902dbd4b 100644 --- a/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__if_expr__tests__if_else_if.snap +++ b/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__if_expr__tests__if_else_if.snap @@ -10,9 +10,7 @@ Spanned { node: Identifier( Identifier { name: "a", - span: Some( - 4..5, - ), + span: 4..5, }, ), span: 4..5, @@ -37,9 +35,7 @@ Spanned { node: Identifier( Identifier { name: "b", - span: Some( - 22..23, - ), + span: 22..23, }, ), span: 22..23, diff --git a/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__literal__tests__identifier.snap b/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__literal__tests__identifier.snap index 72e3bf05..99ccc97b 100644 --- a/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__literal__tests__identifier.snap +++ b/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__literal__tests__identifier.snap @@ -6,9 +6,7 @@ Spanned { node: Identifier( Identifier { name: "foo", - span: Some( - 0..3, - ), + span: 0..3, }, ), span: 0..3, diff --git a/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__match_expr__tests__match_expression.snap b/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__match_expr__tests__match_expression.snap index eef1e8c8..0ad18c42 100644 --- a/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__match_expr__tests__match_expression.snap +++ b/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__match_expr__tests__match_expression.snap @@ -8,9 +8,7 @@ Spanned { node: Identifier( Identifier { name: "value", - span: Some( - 6..11, - ), + span: 6..11, }, ), span: 6..12, @@ -20,24 +18,18 @@ Spanned { pattern: EnumVariant { enum_name: Identifier { name: "Result", - span: Some( - 18..24, - ), + span: 18..24, }, variant: Identifier { name: "Ok", - span: Some( - 26..28, - ), + span: 26..28, }, payload: Tuple( [ Binding( Identifier { name: "inner", - span: Some( - 29..34, - ), + span: 29..34, }, ), ], @@ -50,9 +42,7 @@ Spanned { node: Identifier( Identifier { name: "inner", - span: Some( - 49..54, - ), + span: 49..54, }, ), span: 49..59, @@ -66,24 +56,18 @@ Spanned { pattern: EnumVariant { enum_name: Identifier { name: "Result", - span: Some( - 66..72, - ), + span: 66..72, }, variant: Identifier { name: "Err", - span: Some( - 74..77, - ), + span: 74..77, }, payload: Tuple( [ Binding( Identifier { name: "reason", - span: Some( - 78..84, - ), + span: 78..84, }, ), ], @@ -96,9 +80,7 @@ Spanned { node: Identifier( Identifier { name: "reason", - span: Some( - 99..105, - ), + span: 99..105, }, ), span: 99..110, diff --git a/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__raise__tests__raise_call.snap b/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__raise__tests__raise_call.snap index eeb0eb6b..dd102d04 100644 --- a/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__raise__tests__raise_call.snap +++ b/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__raise__tests__raise_call.snap @@ -10,9 +10,7 @@ Spanned { node: Identifier( Identifier { name: "blockHeight", - span: Some( - 6..17, - ), + span: 6..17, }, ), span: 6..17, diff --git a/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__raise__tests__raise_namespaced_call.snap b/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__raise__tests__raise_namespaced_call.snap index cac31270..fddc4595 100644 --- a/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__raise__tests__raise_namespaced_call.snap +++ b/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__raise__tests__raise_namespaced_call.snap @@ -8,15 +8,11 @@ Spanned { node: EnumConstructor { enum_name: Identifier { name: "context", - span: Some( - 6..13, - ), + span: 6..13, }, variant: Identifier { name: "blockHeight", - span: Some( - 15..26, - ), + span: 15..26, }, payload: Tuple( [], diff --git a/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__runtime__tests__runtime_call.snap b/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__runtime__tests__runtime_call.snap index b79f0746..89a9f6e2 100644 --- a/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__runtime__tests__runtime_call.snap +++ b/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__runtime__tests__runtime_call.snap @@ -10,9 +10,7 @@ Spanned { node: Identifier( Identifier { name: "blockHeight", - span: Some( - 8..19, - ), + span: 8..19, }, ), span: 8..19, diff --git a/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__runtime__tests__runtime_namespaced_call.snap b/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__runtime__tests__runtime_namespaced_call.snap index 8888bfd5..197ea87e 100644 --- a/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__runtime__tests__runtime_namespaced_call.snap +++ b/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__runtime__tests__runtime_namespaced_call.snap @@ -8,15 +8,11 @@ Spanned { node: EnumConstructor { enum_name: Identifier { name: "context", - span: Some( - 8..15, - ), + span: 8..15, }, variant: Identifier { name: "blockHeight", - span: Some( - 17..28, - ), + span: 17..28, }, payload: Tuple( [], diff --git a/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__struct_literal__tests__struct_literal_expression.snap b/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__struct_literal__tests__struct_literal_expression.snap index 249d7bc4..72aa9c5c 100644 --- a/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__struct_literal__tests__struct_literal_expression.snap +++ b/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__struct_literal__tests__struct_literal_expression.snap @@ -6,17 +6,13 @@ Spanned { node: StructLiteral { name: Identifier { name: "Point", - span: Some( - 0..5, - ), + span: 0..5, }, fields: [ StructLiteralField { name: Identifier { name: "x", - span: Some( - 12..13, - ), + span: 12..13, }, value: Spanned { node: Literal( @@ -30,9 +26,7 @@ Spanned { StructLiteralField { name: Identifier { name: "y", - span: Some( - 23..24, - ), + span: 23..24, }, value: Spanned { node: Binary { @@ -41,9 +35,7 @@ Spanned { node: Identifier( Identifier { name: "value", - span: Some( - 26..31, - ), + span: 26..31, }, ), span: 26..32, diff --git a/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__tests__block.snap b/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__tests__block.snap index e6933f7e..56e56c9f 100644 --- a/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__tests__block.snap +++ b/starstream-compiler/src/parser/expression/primary/snapshots/starstream_compiler__parser__expression__primary__tests__block.snap @@ -11,9 +11,7 @@ Spanned { mutable: true, name: Identifier { name: "a", - span: Some( - 10..11, - ), + span: 10..11, }, ty: None, value: Spanned { @@ -31,9 +29,7 @@ Spanned { node: Assignment { target: Identifier { name: "a", - span: Some( - 17..18, - ), + span: 17..18, }, value: Spanned { node: Binary { @@ -42,9 +38,7 @@ Spanned { node: Identifier( Identifier { name: "a", - span: Some( - 21..22, - ), + span: 21..22, }, ), span: 21..23, diff --git a/starstream-compiler/src/parser/expression/snapshots/starstream_compiler__parser__expression__tests__field_access_chain.snap b/starstream-compiler/src/parser/expression/snapshots/starstream_compiler__parser__expression__tests__field_access_chain.snap index db55c978..c414f81d 100644 --- a/starstream-compiler/src/parser/expression/snapshots/starstream_compiler__parser__expression__tests__field_access_chain.snap +++ b/starstream-compiler/src/parser/expression/snapshots/starstream_compiler__parser__expression__tests__field_access_chain.snap @@ -10,27 +10,21 @@ Spanned { node: Identifier( Identifier { name: "state", - span: Some( - 0..5, - ), + span: 0..5, }, ), span: 0..5, }, field: Identifier { name: "position", - span: Some( - 6..14, - ), + span: 6..14, }, }, span: 0..14, }, field: Identifier { name: "x", - span: Some( - 15..16, - ), + span: 15..16, }, }, span: 0..16, diff --git a/starstream-compiler/src/parser/expression/snapshots/starstream_compiler__parser__expression__tests__field_access_then_call.snap b/starstream-compiler/src/parser/expression/snapshots/starstream_compiler__parser__expression__tests__field_access_then_call.snap index f771efd6..2e942ea5 100644 --- a/starstream-compiler/src/parser/expression/snapshots/starstream_compiler__parser__expression__tests__field_access_then_call.snap +++ b/starstream-compiler/src/parser/expression/snapshots/starstream_compiler__parser__expression__tests__field_access_then_call.snap @@ -10,18 +10,14 @@ Spanned { node: Identifier( Identifier { name: "obj", - span: Some( - 0..3, - ), + span: 0..3, }, ), span: 0..3, }, field: Identifier { name: "method", - span: Some( - 4..10, - ), + span: 4..10, }, }, span: 0..10, @@ -31,9 +27,7 @@ Spanned { node: Identifier( Identifier { name: "x", - span: Some( - 11..12, - ), + span: 11..12, }, ), span: 11..12, diff --git a/starstream-compiler/src/parser/expression/snapshots/starstream_compiler__parser__expression__tests__function_call_chained_with_field.snap b/starstream-compiler/src/parser/expression/snapshots/starstream_compiler__parser__expression__tests__function_call_chained_with_field.snap index 1e66208c..d83a3d20 100644 --- a/starstream-compiler/src/parser/expression/snapshots/starstream_compiler__parser__expression__tests__function_call_chained_with_field.snap +++ b/starstream-compiler/src/parser/expression/snapshots/starstream_compiler__parser__expression__tests__function_call_chained_with_field.snap @@ -10,9 +10,7 @@ Spanned { node: Identifier( Identifier { name: "foo", - span: Some( - 0..3, - ), + span: 0..3, }, ), span: 0..3, @@ -23,9 +21,7 @@ Spanned { }, field: Identifier { name: "bar", - span: Some( - 6..9, - ), + span: 6..9, }, }, span: 0..9, diff --git a/starstream-compiler/src/parser/expression/snapshots/starstream_compiler__parser__expression__tests__function_call_no_args.snap b/starstream-compiler/src/parser/expression/snapshots/starstream_compiler__parser__expression__tests__function_call_no_args.snap index 1d0e1d72..0d50c8c6 100644 --- a/starstream-compiler/src/parser/expression/snapshots/starstream_compiler__parser__expression__tests__function_call_no_args.snap +++ b/starstream-compiler/src/parser/expression/snapshots/starstream_compiler__parser__expression__tests__function_call_no_args.snap @@ -8,9 +8,7 @@ Spanned { node: Identifier( Identifier { name: "foo", - span: Some( - 0..3, - ), + span: 0..3, }, ), span: 0..3, diff --git a/starstream-compiler/src/parser/expression/snapshots/starstream_compiler__parser__expression__tests__function_call_with_args.snap b/starstream-compiler/src/parser/expression/snapshots/starstream_compiler__parser__expression__tests__function_call_with_args.snap index f763342c..e1d72d09 100644 --- a/starstream-compiler/src/parser/expression/snapshots/starstream_compiler__parser__expression__tests__function_call_with_args.snap +++ b/starstream-compiler/src/parser/expression/snapshots/starstream_compiler__parser__expression__tests__function_call_with_args.snap @@ -8,9 +8,7 @@ Spanned { node: Identifier( Identifier { name: "add", - span: Some( - 0..3, - ), + span: 0..3, }, ), span: 0..3, diff --git a/starstream-compiler/src/parser/snapshots/starstream_compiler__parser__statement__tests__assignment.snap b/starstream-compiler/src/parser/snapshots/starstream_compiler__parser__statement__tests__assignment.snap index 25fe4f64..7352d9e1 100644 --- a/starstream-compiler/src/parser/snapshots/starstream_compiler__parser__statement__tests__assignment.snap +++ b/starstream-compiler/src/parser/snapshots/starstream_compiler__parser__statement__tests__assignment.snap @@ -5,9 +5,7 @@ description: "Code:\n\nvalue = value + 1;" Assignment { target: Identifier { name: "value", - span: Some( - 0..5, - ), + span: 0..5, }, value: Spanned { node: Binary { @@ -16,9 +14,7 @@ Assignment { node: Identifier( Identifier { name: "value", - span: Some( - 8..13, - ), + span: 8..13, }, ), span: 8..14, diff --git a/starstream-compiler/src/parser/snapshots/starstream_compiler__parser__statement__tests__expression_statement.snap b/starstream-compiler/src/parser/snapshots/starstream_compiler__parser__statement__tests__expression_statement.snap index 1656632d..cd585db9 100644 --- a/starstream-compiler/src/parser/snapshots/starstream_compiler__parser__statement__tests__expression_statement.snap +++ b/starstream-compiler/src/parser/snapshots/starstream_compiler__parser__statement__tests__expression_statement.snap @@ -10,9 +10,7 @@ Expression( node: Identifier( Identifier { name: "value", - span: Some( - 0..5, - ), + span: 0..5, }, ), span: 0..6, diff --git a/starstream-compiler/src/parser/snapshots/starstream_compiler__parser__statement__tests__let_binding.snap b/starstream-compiler/src/parser/snapshots/starstream_compiler__parser__statement__tests__let_binding.snap index d546a144..b9184672 100644 --- a/starstream-compiler/src/parser/snapshots/starstream_compiler__parser__statement__tests__let_binding.snap +++ b/starstream-compiler/src/parser/snapshots/starstream_compiler__parser__statement__tests__let_binding.snap @@ -6,9 +6,7 @@ VariableDeclaration { mutable: false, name: Identifier { name: "answer", - span: Some( - 4..10, - ), + span: 4..10, }, ty: None, value: Spanned { diff --git a/starstream-compiler/src/parser/snapshots/starstream_compiler__parser__statement__tests__let_mut_binding.snap b/starstream-compiler/src/parser/snapshots/starstream_compiler__parser__statement__tests__let_mut_binding.snap index 04167665..70111461 100644 --- a/starstream-compiler/src/parser/snapshots/starstream_compiler__parser__statement__tests__let_mut_binding.snap +++ b/starstream-compiler/src/parser/snapshots/starstream_compiler__parser__statement__tests__let_mut_binding.snap @@ -6,9 +6,7 @@ VariableDeclaration { mutable: true, name: Identifier { name: "answer", - span: Some( - 8..14, - ), + span: 8..14, }, ty: None, value: Spanned { diff --git a/starstream-compiler/src/parser/snapshots/starstream_compiler__parser__statement__tests__return_with_value.snap b/starstream-compiler/src/parser/snapshots/starstream_compiler__parser__statement__tests__return_with_value.snap index ee9618a1..ece58335 100644 --- a/starstream-compiler/src/parser/snapshots/starstream_compiler__parser__statement__tests__return_with_value.snap +++ b/starstream-compiler/src/parser/snapshots/starstream_compiler__parser__statement__tests__return_with_value.snap @@ -8,9 +8,7 @@ Return( node: Identifier( Identifier { name: "flag", - span: Some( - 7..11, - ), + span: 7..11, }, ), span: 7..11, diff --git a/starstream-compiler/src/parser/snapshots/starstream_compiler__parser__statement__tests__while_loop.snap b/starstream-compiler/src/parser/snapshots/starstream_compiler__parser__statement__tests__while_loop.snap index 1c4a4277..5f7dc2d6 100644 --- a/starstream-compiler/src/parser/snapshots/starstream_compiler__parser__statement__tests__while_loop.snap +++ b/starstream-compiler/src/parser/snapshots/starstream_compiler__parser__statement__tests__while_loop.snap @@ -10,9 +10,7 @@ While { node: Identifier( Identifier { name: "count", - span: Some( - 7..12, - ), + span: 7..12, }, ), span: 7..13, @@ -34,9 +32,7 @@ While { node: Assignment { target: Identifier { name: "count", - span: Some( - 21..26, - ), + span: 21..26, }, value: Spanned { node: Binary { @@ -45,9 +41,7 @@ While { node: Identifier( Identifier { name: "count", - span: Some( - 29..34, - ), + span: 29..34, }, ), span: 29..35, diff --git a/starstream-compiler/src/typecheck/exhaustiveness.rs b/starstream-compiler/src/typecheck/exhaustiveness.rs index f1ef3fa0..ac2e998b 100644 --- a/starstream-compiler/src/typecheck/exhaustiveness.rs +++ b/starstream-compiler/src/typecheck/exhaustiveness.rs @@ -780,12 +780,12 @@ pub fn check_match( /// For compound patterns, returns a span covering the entire pattern. fn pattern_span(pattern: &TypedPattern) -> Option { match pattern { - TypedPattern::Binding(id) => id.span, + TypedPattern::Binding(id) => id.opt_span(), TypedPattern::Wildcard => None, TypedPattern::Literal(_) => None, // Literals don't have spans in TypedPattern TypedPattern::Struct { name, fields } => { // Try to span from name to the last field - let start = name.span?; + let start = name.span(); let end = fields .last() .and_then(|f| pattern_span(&f.pattern)) @@ -797,18 +797,18 @@ fn pattern_span(pattern: &TypedPattern) -> Option { variant, payload, } => { - let start = enum_name.span?; + let start = enum_name.span(); // Find the end span: payload fields/patterns, or variant name let end = match payload { - TypedEnumPatternPayload::Unit => variant.span.unwrap_or(start), + TypedEnumPatternPayload::Unit => variant.span_or(start), TypedEnumPatternPayload::Tuple(patterns) => patterns .last() .and_then(pattern_span) - .unwrap_or_else(|| variant.span.unwrap_or(start)), + .unwrap_or_else(|| variant.span_or(start)), TypedEnumPatternPayload::Struct(fields) => fields .last() .and_then(|f| pattern_span(&f.pattern)) - .unwrap_or_else(|| variant.span.unwrap_or(start)), + .unwrap_or_else(|| variant.span_or(start)), }; Some(merge_spans(start, end)) } diff --git a/starstream-compiler/src/typecheck/infer.rs b/starstream-compiler/src/typecheck/infer.rs index fb20d228..5fe0aa65 100644 --- a/starstream-compiler/src/typecheck/infer.rs +++ b/starstream-compiler/src/typecheck/infer.rs @@ -6,8 +6,9 @@ use std::{ }; use starstream_types::{ - AbiDef, AbiPart, EffectKind, EventDef, GenericTypeDef, Scheme, Span, Spanned, Type, TypeParam, - TypeVarId, TypedUtxoDef, TypedUtxoGlobal, TypedUtxoPart, UtxoDef, UtxoGlobal, UtxoPart, + AbiDef, AbiPart, DUMMY_SPAN, EffectKind, EventDef, GenericTypeDef, Scheme, Span, Spanned, Type, + TypeParam, TypeVarId, TypedUtxoDef, TypedUtxoGlobal, TypedUtxoPart, UtxoDef, UtxoGlobal, + UtxoPart, ast::{ BinaryOp, Block, Definition, EnumConstructorPayload, EnumDef, EnumPatternPayload, EnumVariantPayload, Expr, FunctionDef, Identifier, ImportDef, ImportItems, Literal, @@ -405,10 +406,7 @@ impl Inferencer { let info_variants: Vec = variants .into_iter() .map(|(vname, kind)| EnumVariantInfo { - name: Identifier { - name: vname.to_string(), - span: None, - }, + name: Identifier::anon(vname), kind, }) .collect(); @@ -420,7 +418,7 @@ impl Inferencer { kind: TypeEntryKind::Enum { variants: info_variants, }, - span: dummy_span(), + span: DUMMY_SPAN, type_params, doc: Some(doc.into()), variant_docs: variant_docs @@ -479,7 +477,7 @@ impl Inferencer { fn register_function(&mut self, def: &FunctionDef) -> Result<(), TypeError> { let name = def.name.name.clone(); - let name_span = def.name.span.unwrap_or_else(dummy_span); + let name_span = def.name.span(); if let Some(existing) = self.functions.get(&name) { return Err( @@ -493,7 +491,7 @@ impl Inferencer { for param in &def.params { let ty = self.type_from_annotation(¶m.ty)?; param_types.push(ty); - param_spans.push(param.ty.name.span.unwrap_or_else(dummy_span)); + param_spans.push(param.ty.name.span()); } let return_type = match &def.return_type { Some(annotation) => self.type_from_annotation(annotation)?, @@ -524,7 +522,7 @@ impl Inferencer { namespace: namespace.clone(), package: package.clone(), }, - import.from.namespace.span.unwrap_or_else(dummy_span), + import.from.namespace.span(), )); } @@ -538,7 +536,7 @@ impl Inferencer { package: package.clone(), interface: "".to_string(), }, - import.from.package.span.unwrap_or_else(dummy_span), + import.from.package.span(), ) .with_help("named imports require an interface, e.g., `starstream:std/cardano`") })?; @@ -553,7 +551,7 @@ impl Inferencer { package: package.clone(), interface: interface.name.clone(), }, - interface.span.unwrap_or_else(dummy_span), + interface.span(), ) })?; @@ -564,7 +562,7 @@ impl Inferencer { path: format!("{namespace}:{package}/{}", interface.name), name: item.imported.name.clone(), }, - item.imported.span.unwrap_or_else(dummy_span), + item.imported.span(), ) })?; @@ -576,7 +574,7 @@ impl Inferencer { param_spans: vec![], // No source spans for builtins return_type: builtin.return_type.clone(), effect: builtin.effect, - name_span: item.local.span.unwrap_or_else(dummy_span), + name_span: item.local.span(), }, ); @@ -584,7 +582,7 @@ impl Inferencer { env.insert( item.local.name.clone(), Binding { - decl_span: item.local.span.unwrap_or_else(dummy_span), + decl_span: item.local.span(), mutable: false, scheme: Scheme::monomorphic(builtin.to_function_type()), }, @@ -600,7 +598,7 @@ impl Inferencer { package: package.clone(), interface: "".to_string(), }, - import.from.package.span.unwrap_or_else(dummy_span), + import.from.package.span(), ) .with_help("namespace imports require an interface, e.g., `import cardano from starstream:std/cardano;`") })?; @@ -615,7 +613,7 @@ impl Inferencer { package: package.clone(), interface: interface.name.clone(), }, - interface.span.unwrap_or_else(dummy_span), + interface.span(), ) })?; @@ -629,7 +627,7 @@ impl Inferencer { param_spans: vec![], return_type: builtin.return_type.clone(), effect: builtin.effect, - name_span: alias.span.unwrap_or_else(dummy_span), + name_span: alias.span(), }, ); } @@ -652,14 +650,14 @@ impl Inferencer { fn register_event(&mut self, event: &EventDef) -> Result<(), TypeError> { let name = event.name.name.clone(); - let name_span = event.name.span.unwrap_or_else(dummy_span); + let name_span = event.name.span(); let mut param_types = Vec::with_capacity(event.params.len()); let mut param_spans = Vec::with_capacity(event.params.len()); for param in &event.params { let ty = self.type_from_annotation(¶m.ty)?; param_types.push(ty); - param_spans.push(param.ty.name.span.unwrap_or_else(dummy_span)); + param_spans.push(param.ty.name.span()); } self.events.insert( name, @@ -677,7 +675,7 @@ impl Inferencer { if let Some(existing) = self.types.get(&name) { return Err(TypeError::new( TypeErrorKind::TypeAlreadyDefined { name }, - def.name.span.unwrap_or_else(dummy_span), + def.name.span(), ) .with_secondary(existing.span, "previously defined here")); } @@ -691,20 +689,17 @@ impl Inferencer { struct_name: def.name.name.clone(), field_name: field.name.name.clone(), }, - field.name.span.unwrap_or_else(dummy_span), + field.name.span(), ) .with_primary_message("duplicate") .with_secondary(*previous_span, "first defined here")); } - seen.insert( - field.name.name.clone(), - field.name.span.unwrap_or_else(dummy_span), - ); + seen.insert(field.name.name.clone(), field.name.span()); let ty = self.type_from_annotation(&field.ty)?; fields.push(StructFieldInfo { name: field.name.clone(), ty, - span: field.name.span.unwrap_or_else(dummy_span), + span: field.name.span(), }); } @@ -718,7 +713,7 @@ impl Inferencer { TypeEntry { ty, kind: TypeEntryKind::Struct { fields }, - span: def.name.span.unwrap_or_else(dummy_span), + span: def.name.span(), type_params: vec![], doc: None, variant_docs: HashMap::new(), @@ -732,7 +727,7 @@ impl Inferencer { if let Some(existing) = self.types.get(&name) { return Err(TypeError::new( TypeErrorKind::TypeAlreadyDefined { name }, - def.name.span.unwrap_or_else(dummy_span), + def.name.span(), ) .with_secondary(existing.span, "previously defined here")); } @@ -746,15 +741,12 @@ impl Inferencer { enum_name: def.name.name.clone(), variant_name: variant.name.name.clone(), }, - variant.name.span.unwrap_or_else(dummy_span), + variant.name.span(), ) .with_primary_message("duplicate") .with_secondary(*previous_span, "first defined here")); } - seen.insert( - variant.name.name.clone(), - variant.name.span.unwrap_or_else(dummy_span), - ); + seen.insert(variant.name.name.clone(), variant.name.span()); let kind = match &variant.payload { EnumVariantPayload::Unit => EnumVariantInfoKind::Unit, EnumVariantPayload::Tuple(items) => { @@ -777,20 +769,17 @@ impl Inferencer { ), field_name: field.name.name.clone(), }, - field.name.span.unwrap_or_else(dummy_span), + field.name.span(), ) .with_primary_message("duplicate") .with_secondary(*previous_span, "first defined here")); } - seen_fields.insert( - field.name.name.clone(), - field.name.span.unwrap_or_else(dummy_span), - ); + seen_fields.insert(field.name.name.clone(), field.name.span()); let ty = self.type_from_annotation(&field.ty)?; payload.push(StructFieldInfo { name: field.name.clone(), ty, - span: field.name.span.unwrap_or_else(dummy_span), + span: field.name.span(), }); } EnumVariantInfoKind::Struct(payload) @@ -827,7 +816,7 @@ impl Inferencer { TypeEntry { ty, kind: TypeEntryKind::Enum { variants }, - span: def.name.span.unwrap_or_else(dummy_span), + span: def.name.span(), type_params: vec![], doc: None, variant_docs: HashMap::new(), @@ -842,7 +831,7 @@ impl Inferencer { TypeErrorKind::UnknownStruct { name: def.name.name.clone(), }, - def.name.span.unwrap_or_else(dummy_span), + def.name.span(), ) })?; @@ -868,7 +857,7 @@ impl Inferencer { TypeErrorKind::UnknownEnum { name: def.name.name.clone(), }, - def.name.span.unwrap_or_else(dummy_span), + def.name.span(), ) })?; @@ -975,7 +964,7 @@ impl Inferencer { TypeErrorKind::UnknownEvent { name: event.name.name.clone(), }, - event.name.span.unwrap_or_else(dummy_span), + event.name.span(), ) })?; @@ -1022,7 +1011,7 @@ impl Inferencer { if function.return_type.is_some() { return Err(TypeError::new( TypeErrorKind::ReturnTypeNotAllowed, - function.name.span.unwrap_or_else(dummy_span), + function.name.span(), )); } let (func, trace) = self.infer_function(env, function)?; @@ -1050,7 +1039,7 @@ impl Inferencer { env.insert( var.name.name.clone(), Binding { - decl_span: var.name.span.unwrap_or_else(dummy_span), + decl_span: var.name.span(), mutable: true, scheme: Scheme::monomorphic(ty.clone()), }, @@ -1067,7 +1056,7 @@ impl Inferencer { TypeErrorKind::UnknownStruct { name: name.name.clone(), }, - name.span.unwrap_or_else(dummy_span), + name.span(), ) }) } @@ -1078,7 +1067,7 @@ impl Inferencer { TypeErrorKind::UnknownEnum { name: name.name.clone(), }, - name.span.unwrap_or_else(dummy_span), + name.span(), ) }) } @@ -1184,14 +1173,14 @@ impl Inferencer { TypeErrorKind::Redeclaration { name: ident.name.clone(), }, - ident.span.unwrap_or_else(dummy_span), + ident.span(), )); } env.insert( ident.name.clone(), Binding { - decl_span: ident.span.unwrap_or_else(dummy_span), + decl_span: ident.span(), mutable: false, scheme: Scheme::monomorphic(ty), }, @@ -1244,7 +1233,7 @@ impl Inferencer { expected_ty.clone(), info.ty.clone(), value_span, - enum_name.span.unwrap_or_else(dummy_span), + enum_name.span(), TypeErrorKind::PatternEnumMismatch { enum_name: enum_name.name.clone(), found: self.apply(&expected_ty), @@ -1262,7 +1251,7 @@ impl Inferencer { enum_name: enum_name.name.clone(), variant_name: variant.name.clone(), }, - variant.span.unwrap_or_else(dummy_span), + variant.span(), ) })?; @@ -1279,7 +1268,7 @@ impl Inferencer { expected: EnumPayloadKind::tuple(expected.len()), found: EnumPayloadKind::tuple(patterns.len()), }, - variant.span.unwrap_or_else(dummy_span), + variant.span(), )); } @@ -1308,15 +1297,12 @@ impl Inferencer { TypeErrorKind::DuplicateStructLiteralField { field_name: field.name.name.clone(), }, - field.name.span.unwrap_or_else(dummy_span), + field.name.span(), ) .with_primary_message("duplicate") .with_secondary(*previous_span, "first used here")); } - seen.insert( - field.name.name.clone(), - field.name.span.unwrap_or_else(dummy_span), - ); + seen.insert(field.name.name.clone(), field.name.span()); let expected_field = expected_fields.remove(&field.name.name).ok_or_else(|| { @@ -1325,7 +1311,7 @@ impl Inferencer { struct_name: struct_name.clone(), field_name: field.name.name.clone(), }, - field.name.span.unwrap_or_else(dummy_span), + field.name.span(), ) })?; @@ -1348,7 +1334,7 @@ impl Inferencer { struct_name, field_name: missing_field, }, - variant.span.unwrap_or_else(dummy_span), + variant.span(), )); } @@ -1362,7 +1348,7 @@ impl Inferencer { expected: enum_payload_kind_from_variant(expected_kind), found: enum_payload_kind_from_pattern(found_payload), }, - variant.span.unwrap_or_else(dummy_span), + variant.span(), )); } }; @@ -1382,7 +1368,7 @@ impl Inferencer { expected_ty.clone(), info.ty.clone(), value_span, - name.span.unwrap_or_else(dummy_span), + name.span(), TypeErrorKind::GeneralMismatch { expected: info.ty.clone(), found: expected_ty.clone(), @@ -1404,15 +1390,12 @@ impl Inferencer { TypeErrorKind::DuplicateStructLiteralField { field_name: field.name.name.clone(), }, - field.name.span.unwrap_or_else(dummy_span), + field.name.span(), ) .with_primary_message("duplicate") .with_secondary(*previous_span, "first used here")); } - seen.insert( - field.name.name.clone(), - field.name.span.unwrap_or_else(dummy_span), - ); + seen.insert(field.name.name.clone(), field.name.span()); let expected_field = expected_fields.remove(&field.name.name).ok_or_else(|| { @@ -1421,7 +1404,7 @@ impl Inferencer { struct_name: name.name.clone(), field_name: field.name.name.clone(), }, - field.name.span.unwrap_or_else(dummy_span), + field.name.span(), ) })?; @@ -1444,7 +1427,7 @@ impl Inferencer { struct_name: name.name.clone(), field_name, }, - name.span.unwrap_or_else(dummy_span), + name.span(), )); } @@ -1511,11 +1494,7 @@ impl Inferencer { env.insert( param.name.name.clone(), Binding { - decl_span: param - .name - .span - .or(function.name.span) - .unwrap_or_else(dummy_span), + decl_span: param.name.span_or(function.name.span()), mutable: false, scheme: Scheme::monomorphic(ty.clone()), }, @@ -1529,13 +1508,9 @@ impl Inferencer { let (expected_return, return_span) = match &function.return_type { Some(annotation) => ( self.type_from_annotation(annotation)?, - annotation - .name - .span - .or(function.name.span) - .unwrap_or_else(dummy_span), + annotation.name.span_or(function.name.span()), ), - None => (Type::unit(), function.name.span.unwrap_or_else(dummy_span)), + None => (Type::unit(), function.name.span()), }; let mut ctx = FunctionCtx { @@ -1558,7 +1533,7 @@ impl Inferencer { TypeErrorKind::MissingReturn { expected: expected_return, }, - function.name.span.unwrap_or(return_span), + function.name.span_or(return_span), ) .with_help("add a `return` or tail expression to satisfy the signature")); } @@ -1601,7 +1576,7 @@ impl Inferencer { TypeErrorKind::Redeclaration { name: name.name.clone(), }, - name.span.unwrap_or(value.span), + name.span_or(value.span), ) .with_secondary(previous_decl.decl_span, "previously defined here")); } @@ -1616,7 +1591,7 @@ impl Inferencer { let (new_value_type, unify_trace) = self.unify( expected_type.clone(), value_type.clone(), - name.span.unwrap_or(value.span), + name.span_or(value.span), value.span, TypeErrorKind::AssignmentMismatch { name: name.name.clone(), @@ -1632,7 +1607,7 @@ impl Inferencer { env.insert( name.name.clone(), Binding { - decl_span: name.span.unwrap_or(value.span), + decl_span: name.span_or(value.span), mutable: *mutable, scheme, }, @@ -1662,7 +1637,7 @@ impl Inferencer { TypeErrorKind::UnknownVariable { name: target.name.clone(), }, - target.span.unwrap_or(value.span), + target.span_or(value.span), ) })?; @@ -1671,7 +1646,7 @@ impl Inferencer { TypeErrorKind::AssignmentToImmutable { name: target.name.clone(), }, - target.span.unwrap_or(value.span), + target.span_or(value.span), ) .with_primary_message("assigned here") .with_secondary(binding.decl_span, "declared without `mut` here") @@ -1686,7 +1661,7 @@ impl Inferencer { actual_type.clone(), expected_type.clone(), value.span, - target.span.unwrap_or(value.span), + target.span_or(value.span), TypeErrorKind::AssignmentMismatch { name: target.name.clone(), expected: self.apply(&expected_type), @@ -1894,26 +1869,22 @@ impl Inferencer { ); Ok((typed, tree)) } - Expr::Identifier(Identifier { name, span }) => { - let ty = if let Some(binding) = env.get(name).cloned() { + Expr::Identifier(ident) => { + let ty = if let Some(binding) = env.get(ident.as_str()).cloned() { self.instantiate(&binding.scheme) - } else if let Some(func_info) = self.functions.get(name) { + } else if let Some(func_info) = self.functions.get(ident.as_str()) { Type::function(func_info.param_types.clone(), func_info.return_type.clone()) } else { - let span = span.unwrap_or(expr.span); + let span = ident.span_or(expr.span); return Err(TypeError::new( - TypeErrorKind::UnknownVariable { name: name.clone() }, + TypeErrorKind::UnknownVariable { + name: ident.name.clone(), + }, span, )); }; let typed = Spanned::new( - TypedExpr::new( - ty.clone(), - TypedExprKind::Identifier(Identifier { - name: name.clone(), - span: *span, - }), - ), + TypedExpr::new(ty.clone(), TypedExprKind::Identifier(ident.clone())), expr.span, ); let result_repr = self.maybe_string(|| self.format_type(&ty)); @@ -2177,15 +2148,12 @@ impl Inferencer { TypeErrorKind::DuplicateStructLiteralField { field_name: field.name.name.clone(), }, - field.name.span.unwrap_or_else(dummy_span), + field.name.span(), ) .with_primary_message("duplicate") .with_secondary(*previous_span, "first used here")); } - seen.insert( - field.name.name.clone(), - field.name.span.unwrap_or_else(dummy_span), - ); + seen.insert(field.name.name.clone(), field.name.span()); let (expected_ty, _) = expected.remove(&field.name.name).ok_or_else(|| { TypeError::new( @@ -2193,7 +2161,7 @@ impl Inferencer { struct_name: name.name.clone(), field_name: field.name.name.clone(), }, - field.name.span.unwrap_or_else(dummy_span), + field.name.span(), ) })?; @@ -2203,7 +2171,7 @@ impl Inferencer { actual_ty.clone(), expected_ty.clone(), field.value.span, - field.name.span.unwrap_or(field.value.span), + field.name.span_or(field.value.span), TypeErrorKind::GeneralMismatch { expected: expected_ty, found: self.apply(&actual_ty), @@ -2224,7 +2192,7 @@ impl Inferencer { struct_name: name.name.clone(), field_name, }, - name.span.unwrap_or_else(dummy_span), + name.span(), )); } @@ -2263,7 +2231,7 @@ impl Inferencer { field_name: field.name.clone(), ty: target_ty.clone(), }, - field.span.unwrap_or_else(dummy_span), + field.span(), ) })?, _ => { @@ -2343,7 +2311,7 @@ impl Inferencer { TypeErrorKind::RuntimeWithoutKeyword { function_name: variant.name.clone(), }, - variant.span.unwrap_or(expr.span), + variant.span_or(expr.span), ) .with_help(format!( "use `runtime` to call runtime functions, e.g., `runtime {}::{}()`", @@ -2357,7 +2325,7 @@ impl Inferencer { TypeErrorKind::EffectfulWithoutRaise { function_name: variant.name.clone(), }, - variant.span.unwrap_or(expr.span), + variant.span_or(expr.span), ) .with_help(format!( "use `raise` to call effectful functions, e.g., `raise {}::{}()`", @@ -2411,14 +2379,14 @@ impl Inferencer { effect, }; - let callee_ident = Identifier { - name: format!("{}::{}", enum_name.name, variant.name), - span: variant.span, - }; + let callee_ident = Identifier::new( + format!("{}::{}", enum_name.name, variant.name), + variant.span(), + ); let typed_callee = Spanned::new( TypedExpr::new(callee_ty, TypedExprKind::Identifier(callee_ident)), - variant.span.unwrap_or(expr.span), + variant.span_or(expr.span), ); let typed = Spanned::new( @@ -2449,7 +2417,7 @@ impl Inferencer { path: enum_name.name.clone(), name: variant.name.clone(), }, - variant.span.unwrap_or_else(dummy_span), + variant.span(), )); } @@ -2469,7 +2437,7 @@ impl Inferencer { namespace: enum_name.name.clone(), package: "".to_string(), }, - enum_name.span.unwrap_or_else(dummy_span), + enum_name.span(), ) .with_primary_message(format!("unknown namespace `{}`", enum_name.name)) .with_help(format!( @@ -2481,7 +2449,7 @@ impl Inferencer { TypeErrorKind::UnknownEnum { name: enum_name.name.clone(), }, - enum_name.span.unwrap_or_else(dummy_span), + enum_name.span(), ) } })?; @@ -2495,7 +2463,7 @@ impl Inferencer { enum_name: enum_name.name.clone(), variant_name: variant.name.clone(), }, - variant.span.unwrap_or_else(dummy_span), + variant.span(), ) })?; @@ -2516,7 +2484,7 @@ impl Inferencer { expected: EnumPayloadKind::tuple(expected.len()), found: EnumPayloadKind::tuple(values.len()), }, - variant.span.unwrap_or_else(dummy_span), + variant.span(), )); } @@ -2528,7 +2496,7 @@ impl Inferencer { actual_ty.clone(), expected_ty.clone(), expr.span, - variant.span.unwrap_or(expr.span), + variant.span_or(expr.span), TypeErrorKind::GeneralMismatch { expected: expected_ty.clone(), found: self.apply(&actual_ty), @@ -2559,15 +2527,12 @@ impl Inferencer { TypeErrorKind::DuplicateStructLiteralField { field_name: field.name.name.clone(), }, - field.name.span.unwrap_or_else(dummy_span), + field.name.span(), ) .with_primary_message("duplicate") .with_secondary(*previous_span, "first used here")); } - seen.insert( - field.name.name.clone(), - field.name.span.unwrap_or_else(dummy_span), - ); + seen.insert(field.name.name.clone(), field.name.span()); let expected_field = expected_fields.remove(&field.name.name).ok_or_else(|| { @@ -2576,7 +2541,7 @@ impl Inferencer { struct_name: struct_name.clone(), field_name: field.name.name.clone(), }, - field.name.span.unwrap_or_else(dummy_span), + field.name.span(), ) })?; @@ -2587,7 +2552,7 @@ impl Inferencer { actual_ty.clone(), expected_field.ty.clone(), field.value.span, - field.name.span.unwrap_or(field.value.span), + field.name.span_or(field.value.span), TypeErrorKind::GeneralMismatch { expected: expected_field.ty.clone(), found: self.apply(&actual_ty), @@ -2608,7 +2573,7 @@ impl Inferencer { struct_name, field_name: missing_field, }, - variant.span.unwrap_or_else(dummy_span), + variant.span(), )); } @@ -2622,7 +2587,7 @@ impl Inferencer { expected: enum_payload_kind_from_variant(expected_kind), found: enum_payload_kind_from_constructor(found_payload), }, - variant.span.unwrap_or_else(dummy_span), + variant.span(), )); } }; @@ -2993,7 +2958,7 @@ impl Inferencer { TypeErrorKind::UnknownEvent { name: event.name.clone(), }, - event.span.unwrap_or(expr.span), + event.span_or(expr.span), ) })?; @@ -3182,7 +3147,7 @@ impl Inferencer { TypeErrorKind::UnsupportedTypeFeature { description: "generic type parameters are not supported yet".to_string(), }, - annotation.name.span.unwrap_or_else(dummy_span), + annotation.name.span(), ) .with_help("remove `<...>` until generics are implemented")); } @@ -3195,7 +3160,7 @@ impl Inferencer { expected: param_count, found: annotation.generics.len(), }, - annotation.name.span.unwrap_or_else(dummy_span), + annotation.name.span(), )); } @@ -3222,14 +3187,14 @@ impl Inferencer { expected: entry.type_params.len(), found: 0, }, - annotation.name.span.unwrap_or_else(dummy_span), + annotation.name.span(), )), Some(entry) => Ok(entry.ty.clone()), None => Err(TypeError::new( TypeErrorKind::UnknownTypeAnnotation { name: other.to_string(), }, - annotation.name.span.unwrap_or_else(dummy_span), + annotation.name.span(), )), }, } @@ -4119,14 +4084,6 @@ impl Inferencer { } } -fn dummy_span() -> Span { - Span { - start: 0, - end: 0, - context: (), - } -} - /// Recursively replace any variables mentioned in `mapping` within `ty`. fn substitute_type(ty: &Type, mapping: &HashMap) -> Type { match ty { diff --git a/starstream-language-server/src/document.rs b/starstream-language-server/src/document.rs index a12be501..f7a59ff0 100644 --- a/starstream-language-server/src/document.rs +++ b/starstream-language-server/src/document.rs @@ -465,7 +465,7 @@ impl DocumentState { match &import.items { TypedImportItems::Named(items) => { for item in items { - if let Some(span) = item.local.span { + if let Some(span) = item.local.opt_span() { self.definition_entries.push(DefinitionEntry { usage: span, target: span, @@ -479,7 +479,7 @@ impl DocumentState { } } TypedImportItems::Namespace { alias, functions } => { - if let Some(alias_span) = alias.span { + if let Some(alias_span) = alias.opt_span() { self.definition_entries.push(DefinitionEntry { usage: alias_span, target: alias_span, @@ -508,7 +508,7 @@ impl DocumentState { source: &str, doc: Option, ) { - if let Some(span) = definition.name.span { + if let Some(span) = definition.name.opt_span() { self.definition_entries.push(DefinitionEntry { usage: span, target: span, @@ -543,7 +543,7 @@ impl DocumentState { .entry(definition.name.name.clone()) .or_default(); for field in &definition.fields { - if let Some(span) = field.name.span { + if let Some(span) = field.name.opt_span() { entry.insert(field.name.name.clone(), span); } type_entry.insert(field.name.name.clone(), field.ty.clone()); @@ -554,7 +554,7 @@ impl DocumentState { let untyped_fields = untyped.map(|u| &u.fields[..]).unwrap_or(&[]); for (field, untyped_field) in definition.fields.iter().zip(untyped_fields.iter()) { let field_doc = self.comment_map.doc_comments(untyped_field.span, source); - if let Some(span) = field.name.span { + if let Some(span) = field.name.opt_span() { self.add_hover_span_with_doc(span, &field.ty, field_doc.clone()); // Store field doc for use at field access sites @@ -575,7 +575,7 @@ impl DocumentState { source: &str, doc: Option, ) { - if let Some(span) = definition.name.span { + if let Some(span) = definition.name.opt_span() { self.definition_entries.push(DefinitionEntry { usage: span, target: span, @@ -604,7 +604,7 @@ impl DocumentState { entry.clear(); for variant in &definition.variants { - if let Some(span) = variant.name.span { + if let Some(span) = variant.name.opt_span() { self.definition_entries.push(DefinitionEntry { usage: span, target: span, @@ -645,7 +645,7 @@ impl DocumentState { .or_default(); def_entry.clear(); for field in fields { - if let Some(span) = field.name.span { + if let Some(span) = field.name.opt_span() { def_entry.insert(field.name.name.clone(), span); field_hovers.push((span, field.ty.clone())); } @@ -665,7 +665,7 @@ impl DocumentState { self.enum_variant_docs.insert(key, doc.clone()); } - if let Some(span) = variant.name.span { + if let Some(span) = variant.name.opt_span() { self.add_hover_label_with_doc( span, format_enum_variant_hover_from_info( @@ -685,7 +685,7 @@ impl DocumentState { TypedUtxoPart::Storage(vars) => { let global = scopes.first_mut().unwrap(); for var in vars { - if let Some(span) = var.name.span { + if let Some(span) = var.name.opt_span() { global.insert(var.name.name.clone(), span); self.definition_entries.push(DefinitionEntry { usage: span, @@ -709,7 +709,7 @@ impl DocumentState { _source: &str, doc: Option, ) { - if let Some(span) = definition.name.span { + if let Some(span) = definition.name.opt_span() { self.definition_entries.push(DefinitionEntry { usage: span, target: span, @@ -723,7 +723,7 @@ impl DocumentState { for part in &definition.parts { match part { TypedAbiPart::Event(event) => { - if let Some(span) = event.name.span { + if let Some(span) = event.name.opt_span() { self.definition_entries.push(DefinitionEntry { usage: span, target: span, @@ -742,7 +742,7 @@ impl DocumentState { scopes: &mut Vec>, doc: Option, ) { - if let Some(span) = function.name.span { + if let Some(span) = function.name.opt_span() { self.function_definitions .insert(function.name.name.clone(), span); @@ -785,7 +785,7 @@ impl DocumentState { if let Some(scope) = scopes.last_mut() { for param in &function.params { - if let Some(span) = param.name.span { + if let Some(span) = param.name.opt_span() { scope.insert(param.name.name.clone(), span); self.definition_entries.push(DefinitionEntry { @@ -816,7 +816,7 @@ impl DocumentState { } => { self.collect_expr(value, scopes); - if let Some(span) = name.span { + if let Some(span) = name.opt_span() { self.definition_entries.push(DefinitionEntry { usage: span, target: span, @@ -827,16 +827,16 @@ impl DocumentState { } } - if let Some(span) = name.span { + if let Some(span) = name.opt_span() { self.add_hover_span(span, &value.node.ty); } } TypedStatement::Assignment { target, value } => { self.collect_expr(value, scopes); - self.add_usage(target.span, &target.name, scopes); + self.add_usage(target.opt_span(), &target.name, scopes); - if let Some(span) = target.span { + if let Some(span) = target.opt_span() { self.add_hover_span(span, &value.node.ty); } } @@ -871,7 +871,7 @@ impl DocumentState { match &expr.node.kind { TypedExprKind::Identifier(identifier) => { - let usage_span = identifier.span.unwrap_or(expr.span); + let usage_span = identifier.span_or(expr.span); self.add_usage(Some(usage_span), &identifier.name, scopes); } @@ -884,10 +884,10 @@ impl DocumentState { TypedExprKind::Grouping(inner) => self.collect_expr(inner, scopes), TypedExprKind::Literal(_) => {} TypedExprKind::StructLiteral { name, fields } => { - self.add_type_usage(name.span, &name.name); + self.add_type_usage(name.opt_span(), &name.name); // Add hover for struct name with doc comment - if let Some(span) = name.span + if let Some(span) = name.opt_span() && let Some(ty) = self.struct_types.get(&name.name).cloned() { let struct_doc = self.struct_docs.get(&name.name).cloned(); @@ -900,10 +900,10 @@ impl DocumentState { } TypedExprKind::FieldAccess { target, field } => { self.collect_expr(target, scopes); - self.add_field_access_usage(field.span, &target.node.ty, &field.name); + self.add_field_access_usage(field.opt_span(), &target.node.ty, &field.name); // Add hover with doc comment for field access - if let Some(field_span) = field.span { + if let Some(field_span) = field.opt_span() { // Find the struct name from the target type if let Some(struct_name) = self.find_struct_name_for_type(&target.node.ty) { // Get field type and doc @@ -925,10 +925,10 @@ impl DocumentState { variant, payload, } => { - self.add_type_usage(enum_name.span, &enum_name.name); + self.add_type_usage(enum_name.opt_span(), &enum_name.name); // Add hover for enum name with doc comment - if let Some(span) = enum_name.span { + if let Some(span) = enum_name.opt_span() { let enum_doc = self.enum_docs.get(&enum_name.name).cloned(); self.add_generic_or_concrete_type_hover( span, @@ -938,9 +938,9 @@ impl DocumentState { ); } - self.add_enum_variant_usage(variant.span, &enum_name.name, &variant.name); + self.add_enum_variant_usage(variant.opt_span(), &enum_name.name, &variant.name); self.add_variant_hover( - variant.span, + variant.opt_span(), &enum_name.name, &variant.name, Some(&expr.node.ty), @@ -957,7 +957,7 @@ impl DocumentState { for field in fields { self.collect_expr(&field.value, scopes); self.add_enum_variant_field_usage( - field.name.span, + field.name.opt_span(), &enum_name.name, &variant.name, &field.name.name, @@ -993,7 +993,7 @@ impl DocumentState { if let Some((signature, doc)) = self.function_docs.get(&identifier.name).cloned() { - let usage_span = identifier.span.unwrap_or(callee.span); + let usage_span = identifier.span_or(callee.span); self.add_hover_label_with_doc(usage_span, signature, Some(doc)); self.add_usage(Some(usage_span), &identifier.name, scopes); } else { @@ -1008,7 +1008,7 @@ impl DocumentState { } } TypedExprKind::Emit { event, args } => { - if let Some(span) = event.span { + if let Some(span) = event.opt_span() { self.add_hover_label(span, format!("event {}", event.name)); } @@ -1048,7 +1048,7 @@ impl DocumentState { ) { match pattern { TypedPattern::Binding(identifier) => { - if let Some(span) = identifier.span { + if let Some(span) = identifier.opt_span() { self.definition_entries.push(DefinitionEntry { usage: span, target: span, @@ -1070,10 +1070,10 @@ impl DocumentState { // Literal patterns don't introduce bindings or references } TypedPattern::Struct { name, fields } => { - self.add_type_usage(name.span, &name.name); + self.add_type_usage(name.opt_span(), &name.name); // Add hover for struct name with doc comment - if let Some(span) = name.span + if let Some(span) = name.opt_span() && let Some(ty) = self.struct_types.get(&name.name).cloned() { let struct_doc = self.struct_docs.get(&name.name).cloned(); @@ -1081,11 +1081,15 @@ impl DocumentState { } for field in fields { - self.add_struct_field_usage(field.name.span, &name.name, &field.name.name); + self.add_struct_field_usage( + field.name.opt_span(), + &name.name, + &field.name.name, + ); let field_ty = self.lookup_struct_field_type(&name.name, &field.name.name); - if let Some(span) = field.name.span + if let Some(span) = field.name.opt_span() && let Some(ty) = field_ty.as_ref() { self.add_hover_span(span, ty); @@ -1099,9 +1103,9 @@ impl DocumentState { variant, payload, } => { - self.add_type_usage(enum_name.span, &enum_name.name); + self.add_type_usage(enum_name.opt_span(), &enum_name.name); - if let Some(span) = enum_name.span { + if let Some(span) = enum_name.opt_span() { // Include enum doc comment for the enum name in pattern let enum_doc = self.enum_docs.get(&enum_name.name).cloned(); self.add_generic_or_concrete_type_hover( @@ -1112,9 +1116,9 @@ impl DocumentState { ); } - self.add_enum_variant_usage(variant.span, &enum_name.name, &variant.name); + self.add_enum_variant_usage(variant.opt_span(), &enum_name.name, &variant.name); self.add_variant_hover( - variant.span, + variant.opt_span(), &enum_name.name, &variant.name, expected_ty.as_ref(), @@ -1143,7 +1147,7 @@ impl DocumentState { TypedEnumPatternPayload::Struct(fields) => { for field in fields { self.add_enum_variant_field_usage( - field.name.span, + field.name.opt_span(), &enum_name.name, &variant.name, &field.name.name, @@ -1155,7 +1159,7 @@ impl DocumentState { &field.name.name, ); - if let Some(span) = field.name.span + if let Some(span) = field.name.opt_span() && let Some(ty) = field_ty.as_ref() { self.add_hover_span(span, ty); @@ -1177,7 +1181,7 @@ impl DocumentState { ) { self.collect_expr(&field.value, scopes); - self.add_struct_field_usage(field.name.span, struct_name, &field.name.name); + self.add_struct_field_usage(field.name.opt_span(), struct_name, &field.name.name); } fn add_hover_span(&mut self, span: Span, ty: &Type) { @@ -1505,9 +1509,9 @@ impl DocumentState { } fn collect_type_annotation_node(&mut self, annotation: &TypeAnnotation) { - self.add_type_usage(annotation.name.span, &annotation.name.name); + self.add_type_usage(annotation.name.opt_span(), &annotation.name.name); - if let Some(span) = annotation.name.span + if let Some(span) = annotation.name.opt_span() && let Some(label) = self.type_label_for_name(&annotation.name.name) { // Look up doc comment for struct or enum types @@ -1718,7 +1722,7 @@ impl DocumentState { } fn function_symbol(&self, function: &TypedFunctionDef) -> Option { - let name_span = function.name.span?; + let name_span = function.name.opt_span()?; #[allow(deprecated)] let symbol = DocumentSymbol { @@ -1736,10 +1740,10 @@ impl DocumentState { } fn struct_symbol(&self, definition: &TypedStructDef) -> Option { - let name_span = definition.name.span?; + let name_span = definition.name.opt_span()?; let mut children = Vec::new(); for field in &definition.fields { - if let Some(span) = field.name.span { + if let Some(span) = field.name.opt_span() { #[allow(deprecated)] let child = DocumentSymbol { name: field.name.name.clone(), @@ -1775,10 +1779,10 @@ impl DocumentState { } fn enum_symbol(&self, definition: &TypedEnumDef) -> Option { - let name_span = definition.name.span?; + let name_span = definition.name.opt_span()?; let mut children = Vec::new(); for variant in &definition.variants { - if let Some(span) = variant.name.span { + if let Some(span) = variant.name.opt_span() { let detail = match &variant.payload { TypedEnumVariantPayload::Unit => None, TypedEnumVariantPayload::Tuple(types) => { @@ -1843,13 +1847,13 @@ impl DocumentState { } fn utxo_symbol(&self, definition: &TypedUtxoDef) -> Option { - let name_span = definition.name.span?; + let name_span = definition.name.opt_span()?; let mut children = Vec::new(); for part in &definition.parts { match part { TypedUtxoPart::Storage(vars) => { for var in vars { - if let Some(span) = var.name.span { + if let Some(span) = var.name.opt_span() { #[allow(deprecated)] let child = DocumentSymbol { name: var.name.name.clone(), @@ -1891,13 +1895,13 @@ impl DocumentState { } fn abi_symbol(&self, definition: &TypedAbiDef) -> Option { - let name_span = definition.name.span?; + let name_span = definition.name.opt_span()?; let mut children = Vec::new(); for part in &definition.parts { match part { TypedAbiPart::Event(event) => { - if let Some(span) = event.name.span { + if let Some(span) = event.name.opt_span() { let params = event .params .iter() diff --git a/starstream-to-wasm/src/lib.rs b/starstream-to-wasm/src/lib.rs index 512da240..61a236e5 100644 --- a/starstream-to-wasm/src/lib.rs +++ b/starstream-to-wasm/src/lib.rs @@ -105,8 +105,6 @@ struct Compiler { // Function building. core_func_type_cache: HashMap, - global_vars: HashMap, - global_record_type: Vec, /// Map from name to function index. callables: HashMap, @@ -121,9 +119,6 @@ impl Compiler { // TODO: any other final activity on the sections here, such as // committing constants to the memory/data section. - // Generate suspend/resume functions. - self.generate_storage_exports(); - // Generate memory. if self.bump_ptr > 0 { const PAGE_SIZE: u32 = 64 * 1024; @@ -253,14 +248,18 @@ impl Compiler { fn todo(&mut self, why: String) -> ErrorToken { // TODO: better span - self.push_error(Span::from(0..0), format!("TODO: {why}")) + self.push_error(DUMMY_SPAN, format!("TODO: {why}")) } - fn generate_storage_exports(&mut self) { - let fields = std::mem::take(&mut self.global_record_type); + fn generate_storage_exports( + &mut self, + name: &Identifier, + scope: &dyn Locals, + fields: Vec, + ) { if !fields.is_empty() { let storage_struct = Type::Record(RecordType { - name: "Storage".into(), + name: name.name.clone(), fields: fields .iter() .map(|f| RecordFieldType { @@ -270,63 +269,69 @@ impl Compiler { .collect(), }); self.visit_struct(&TypedStructDef { - name: Identifier::anon("Storage"), + name: name.clone(), fields: fields.clone(), ty: storage_struct.clone(), }); - self.visit_function(&TypedFunctionDef { - export: Some(FunctionExport::Script), - name: Identifier::anon("get_storage"), - params: Vec::new(), - return_type: storage_struct.clone(), - effect: EffectKind::Pure, - body: TypedBlock::from(Spanned::none(TypedExpr { - ty: storage_struct.clone(), - kind: TypedExprKind::StructLiteral { - name: Identifier::anon("Storage"), - fields: fields + self.visit_function( + &TypedFunctionDef { + export: Some(FunctionExport::Script), + name: Identifier::anon(format!("{name}::get_storage")), + params: Vec::new(), + return_type: storage_struct.clone(), + effect: EffectKind::Pure, + body: TypedBlock::from(Spanned::none(TypedExpr { + ty: storage_struct.clone(), + kind: TypedExprKind::StructLiteral { + name: name.clone(), + fields: fields + .iter() + .map(|f| TypedStructLiteralField { + name: f.name.clone(), + value: Spanned::none(TypedExpr { + ty: f.ty.clone(), + kind: TypedExprKind::Identifier(f.name.clone()), + }), + }) + .collect(), + }, + })), + }, + scope, + ); + self.visit_function( + &TypedFunctionDef { + export: Some(FunctionExport::Script), + name: Identifier::anon(format!("{name}::set_storage")), + params: vec![TypedFunctionParam { + name: Identifier::anon("storage"), + ty: storage_struct.clone(), + }], + return_type: Type::Unit, + effect: EffectKind::Pure, + body: TypedBlock::from( + fields .iter() - .map(|f| TypedStructLiteralField { - name: f.name.clone(), + .map(|f| TypedStatement::Assignment { + target: f.name.clone(), value: Spanned::none(TypedExpr { ty: f.ty.clone(), - kind: TypedExprKind::Identifier(f.name.clone()), + kind: TypedExprKind::FieldAccess { + target: Box::new(Spanned::none(TypedExpr { + ty: storage_struct.clone(), + kind: TypedExprKind::Identifier(Identifier::anon( + "storage", + )), + })), + field: f.name.clone(), + }, }), }) - .collect(), - }, - })), - }); - self.visit_function(&TypedFunctionDef { - export: Some(FunctionExport::Script), - name: Identifier::anon("set_storage"), - params: vec![TypedFunctionParam { - name: Identifier::anon("storage"), - ty: storage_struct.clone(), - }], - return_type: Type::Unit, - effect: EffectKind::Pure, - body: TypedBlock::from( - fields - .iter() - .map(|f| TypedStatement::Assignment { - target: f.name.clone(), - value: Spanned::none(TypedExpr { - ty: f.ty.clone(), - kind: TypedExprKind::FieldAccess { - target: Box::new(Spanned::none(TypedExpr { - ty: storage_struct.clone(), - kind: TypedExprKind::Identifier(Identifier::anon( - "storage", - )), - })), - field: f.name.clone(), - }, - }), - }) - .collect::>(), - ), - }); + .collect::>(), + ), + }, + scope, + ); } } @@ -408,7 +413,7 @@ impl Compiler { code.instructions().local_get(0); // [sum, x] code.instructions().local_get(1); // [sum, x, y] code.instructions().i64_xor(); // [sum, x^y] - code.instructions().i64_const(0); // [sum, x^y, 0] + code.instructions().i64_const(0); // [sum, x^y, 0] code.instructions().i64_ge_s(); // [sum, (x^y)>=0] // (sum^x)<0 @@ -623,12 +628,7 @@ impl Compiler { } wrapper_func.instructions().call(func_idx); // Write to our return slot. - self.component_store( - function.name.span.unwrap_or(Span::from(0..0)), - &mut wrapper_func, - &result, - 0, - ); + self.component_store(function.name.span(), &mut wrapper_func, &result, 0); // Return our return slot. wrapper_func.instructions().i32_const(return_slot as i32); wrapper_func.instructions().end(); @@ -645,7 +645,7 @@ impl Compiler { .export(&name, ComponentTypeRef::Func(type_idx)); } else { self.push_error( - function.name.span.unwrap_or(Span::from(0..0)), + function.name.span(), "TODO: Component ABI for function with too many params", ); } @@ -1020,7 +1020,7 @@ impl Compiler { TypedDefinition::Import(_) => { /* Handled above. */ } TypedDefinition::Abi(_) => { /* Handled above. */ } - TypedDefinition::Function(func) => self.visit_function(func), + TypedDefinition::Function(func) => self.visit_function(func, &()), TypedDefinition::Struct(struct_) => self.visit_struct(struct_), TypedDefinition::Utxo(utxo) => self.visit_utxo(utxo), TypedDefinition::Enum(enum_) => self.visit_enum(enum_), @@ -1048,7 +1048,7 @@ impl Compiler { } => { let mut core_params = Vec::with_capacity(16); let mut core_results = Vec::with_capacity(1); - let span = item.local.span.unwrap_or(Span::from(0..0)); + let span = item.local.span(); for p in params { _ = self.star_to_core_types(span, &mut core_params, p); } @@ -1095,7 +1095,7 @@ impl Compiler { match part { TypedAbiPart::Event(event) => { let mut core_params = Vec::with_capacity(16); - let span = event.name.span.unwrap_or(Span::from(0..0)); + let span = event.name.span(); for p in &event.params { _ = self.star_to_core_types(span, &mut core_params, &p.ty); } @@ -1131,31 +1131,23 @@ impl Compiler { } } - fn visit_function(&mut self, function: &TypedFunctionDef) { - let mut locals = HashMap::::new(); + fn visit_function(&mut self, function: &TypedFunctionDef, parent: &dyn Locals) { + let mut locals = HashMap::::new(); let mut params = Vec::with_capacity(16); for p in &function.params { - locals.insert(p.name.name.clone(), u32::try_from(params.len()).unwrap()); - _ = self.star_to_core_types( - p.name - .span - .or(function.name.span) - .unwrap_or(Span::from(0..0)), - &mut params, - &p.ty, + locals.insert( + p.name.name.clone(), + Var::Local(u32::try_from(params.len()).unwrap()), ); + _ = self.star_to_core_types(p.name.span_or(function.name.span()), &mut params, &p.ty); } let mut func = Function::from_params(¶ms); let mut results = Vec::with_capacity(1); - _ = self.star_to_core_types( - function.name.span.unwrap_or(Span::from(0..0)), - &mut results, - &function.return_type, - ); + _ = self.star_to_core_types(function.name.span(), &mut results, &function.return_type); - let _ = self.visit_block_stack(&mut func, &(&() as &dyn Locals, &locals), &function.body); + let _ = self.visit_block_stack(&mut func, &(parent, &locals), &function.body); func.instructions().end(); let idx = self.add_function( @@ -1186,30 +1178,32 @@ impl Compiler { fn visit_utxo(&mut self, utxo: &TypedUtxoDef) { // TODO: use the utxo name to declare the type, etc. + let mut utxo_storage = HashMap::new(); + let mut utxo_record_type = Vec::new(); for part in &utxo.parts { match part { TypedUtxoPart::Storage(vars) => { for var in vars { let mut types = Vec::new(); - _ = self.star_to_core_types( - utxo.name.span.unwrap_or(Span::from(0..0)), - &mut types, - &var.ty, - ); + _ = self.star_to_core_types(utxo.name.span(), &mut types, &var.ty); let idx = self.add_globals(types.iter().copied()); - // TODO: treat these identifiers as scoped only to this UTXO, rather than true globals - self.global_vars.insert(var.name.name.clone(), idx); - self.global_record_type.push(TypedStructField { + utxo_storage.insert(var.name.name.clone(), Var::Global(idx)); + utxo_record_type.push(TypedStructField { name: var.name.clone(), ty: var.ty.clone(), }); } } TypedUtxoPart::MainFn(function) => { - self.visit_function(function); + self.visit_function(function, &(&() as &dyn Locals, &utxo_storage)); } } } + self.generate_storage_exports( + &utxo.name, + &(&() as &dyn Locals, &utxo_storage), + utxo_record_type, + ); } /// Start a new identifier scope and generate bytecode for the statements @@ -1220,7 +1214,7 @@ impl Compiler { func: &mut Function, parent: &dyn Locals, block: &TypedBlock, - ) -> Result> { + ) -> Result> { let mut locals = HashMap::new(); for statement in &block.statements { match statement { @@ -1236,7 +1230,7 @@ impl Compiler { let mut local_types = Vec::new(); _ = self.star_to_core_types(value.span, &mut local_types, &value.node.ty); let local = func.add_locals(local_types.iter().copied()); - locals.insert(name.name.clone(), local); + locals.insert(name.name.clone(), Var::Local(local)); if self .visit_expr_stack(func, &(parent, &locals), value.span, &value.node) @@ -1249,24 +1243,7 @@ impl Compiler { } } TypedStatement::Assignment { target, value } => { - if let Some(local) = (parent, &locals).get(&target.name) { - if self - .visit_expr_stack(func, &(parent, &locals), value.span, &value.node) - .is_ok() - { - let mut local_types = Vec::new(); - _ = self.star_to_core_types( - value.span, - &mut local_types, - &value.node.ty, - ); - - // Pop from stack to set locals in reverse order. - for i in (0..local_types.len()).rev() { - func.instructions().local_set(local + (i as u32)); - } - } - } else if let Some(global) = self.global_vars.get(&target.name).copied() { + if let Some(var) = (parent, &locals).get(&target.name) { if self .visit_expr_stack(func, &(parent, &locals), value.span, &value.node) .is_ok() @@ -1275,13 +1252,22 @@ impl Compiler { _ = self.star_to_core_types(value.span, &mut types, &value.node.ty); // Pop from stack to set locals in reverse order. - for i in (0..types.len()).rev() { - func.instructions().global_set(global + (i as u32)); + match var { + Var::Local(local) => { + for i in (0..types.len()).rev() { + func.instructions().local_set(local + (i as u32)); + } + } + Var::Global(global) => { + for i in (0..types.len()).rev() { + func.instructions().global_set(global + (i as u32)); + } + } } } } else { self.push_error( - target.span.unwrap_or(value.span), + target.span_or(value.span), format!("unknown name {:?}", target.name), ); } @@ -1479,19 +1465,23 @@ impl Compiler { match &expr.kind { // Identifiers TypedExprKind::Identifier(ident) => { - if let Some(local) = locals.get(&ident.name) { - for i in 0..self.star_count_core_types(&expr.ty) { - func.instructions().local_get(local + i); - } - Ok(()) - } else if let Some(global) = self.global_vars.get(&ident.name).copied() { - for i in 0..self.star_count_core_types(&expr.ty) { - func.instructions().global_get(global + i); + if let Some(var) = locals.get(&ident.name) { + match var { + Var::Local(local) => { + for i in 0..self.star_count_core_types(&expr.ty) { + func.instructions().local_get(local + i); + } + } + Var::Global(global) => { + for i in 0..self.star_count_core_types(&expr.ty) { + func.instructions().global_get(global + i); + } + } } Ok(()) } else { Err(self.push_error( - ident.span.unwrap_or(span), + ident.span_or(span), format!("unknown name {:?}", &ident.name), )) } @@ -1868,7 +1858,7 @@ impl Compiler { Ok(()) } else { Err(self.push_error( - field.span.unwrap_or(target.span), + field.span_or(target.span), format!( "no field {:?} on type {:?}", field.as_str(), @@ -1878,7 +1868,7 @@ impl Compiler { } } other => Err(self.push_error( - field.span.unwrap_or(target.span), + field.span_or(target.span), format!("field access is only valid on structs, not {:?}", other), )), } @@ -2341,7 +2331,7 @@ impl Compiler { for b in bindings { if b.action == *action { let (local, _ty) = &col_locals[b.column]; - arm_locals.insert(b.name.clone(), *local); + arm_locals.insert(b.name.clone(), Var::Local(*local)); } } @@ -2703,19 +2693,25 @@ impl Compiler { } } +#[derive(Clone, Copy)] +enum Var { + Local(u32), + Global(u32), +} + // Probably inefficient, but fun. Fix later? trait Locals { - fn get(&self, name: &str) -> Option; + fn get(&self, name: &str) -> Option; } impl Locals for () { - fn get(&self, _: &str) -> Option { + fn get(&self, _: &str) -> Option { None } } -impl Locals for (&dyn Locals, &HashMap) { - fn get(&self, name: &str) -> Option { +impl Locals for (&dyn Locals, &HashMap) { + fn get(&self, name: &str) -> Option { match self.1.get(name) { Some(v) => Some(*v), None => self.0.get(name), @@ -2804,9 +2800,9 @@ fn to_kebab_case(name: &str) -> String { } } out.push(ch); - } else if ch == '_' - && let Some(p) = prev - && p != '_' + } else if (ch == '_' || ch == ':') + && let Some(l) = out.chars().last() + && l != '-' { out.push('-'); } diff --git a/starstream-to-wasm/tests/inputs/utxo_storage.star b/starstream-to-wasm/tests/inputs/utxo_storage.star index c1e1e2cf..7174c501 100644 --- a/starstream-to-wasm/tests/inputs/utxo_storage.star +++ b/starstream-to-wasm/tests/inputs/utxo_storage.star @@ -1,10 +1,12 @@ utxo MyUtxo { storage { let mut counter: i64; + let mut multiplier: i64; + } + main fn increment() { + counter = counter + 1; + } + main fn increment_mult() { + multiplier = multiplier + 1; } -} - -script fn increment() -> i64 { - counter = counter + 1; - counter } diff --git a/starstream-to-wasm/tests/inputs/utxo_storage_2.star b/starstream-to-wasm/tests/inputs/utxo_storage_2.star deleted file mode 100644 index 0e6f9f0f..00000000 --- a/starstream-to-wasm/tests/inputs/utxo_storage_2.star +++ /dev/null @@ -1,16 +0,0 @@ -utxo MyUtxo { - storage { - let mut counter: i64; - let mut multiplier: i64; - } -} - -script fn increment() -> i64 { - counter = counter + 1; - counter * multiplier -} - -script fn increment_mult() -> i64 { - multiplier = multiplier + 1; - counter * multiplier -} diff --git a/starstream-to-wasm/tests/inputs/utxo_storage_err.star b/starstream-to-wasm/tests/inputs/utxo_storage_err.star new file mode 100644 index 00000000..626ef863 --- /dev/null +++ b/starstream-to-wasm/tests/inputs/utxo_storage_err.star @@ -0,0 +1,9 @@ +utxo MyUtxo { + storage { + let mut counter: i64; + } +} + +script fn get() -> i64 { + counter +} diff --git a/starstream-to-wasm/tests/snapshots/inputs@add.star.snap b/starstream-to-wasm/tests/snapshots/inputs@add.star.snap index 276a7476..decc0878 100644 --- a/starstream-to-wasm/tests/snapshots/inputs@add.star.snap +++ b/starstream-to-wasm/tests/snapshots/inputs@add.star.snap @@ -14,24 +14,18 @@ Program { ), name: Identifier { name: "add", - span: Some( - 10..13, - ), + span: 10..13, }, params: [ FunctionParam { name: Identifier { name: "x", - span: Some( - 14..15, - ), + span: 14..15, }, ty: TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 17..20, - ), + span: 17..20, }, generics: [], }, @@ -39,16 +33,12 @@ Program { FunctionParam { name: Identifier { name: "y", - span: Some( - 22..23, - ), + span: 22..23, }, ty: TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 25..28, - ), + span: 25..28, }, generics: [], }, @@ -58,9 +48,7 @@ Program { TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 33..36, - ), + span: 33..36, }, generics: [], }, @@ -75,9 +63,7 @@ Program { node: Identifier( Identifier { name: "x", - span: Some( - 43..44, - ), + span: 43..44, }, ), span: 43..45, @@ -86,9 +72,7 @@ Program { node: Identifier( Identifier { name: "y", - span: Some( - 47..48, - ), + span: 47..48, }, ), span: 47..49, @@ -126,26 +110,20 @@ TypedProgram { ), name: Identifier { name: "add", - span: Some( - 10..13, - ), + span: 10..13, }, params: [ TypedFunctionParam { name: Identifier { name: "x", - span: Some( - 14..15, - ), + span: 14..15, }, ty: Int, }, TypedFunctionParam { name: Identifier { name: "y", - span: Some( - 22..23, - ), + span: 22..23, }, ty: Int, }, @@ -166,9 +144,7 @@ TypedProgram { kind: Identifier( Identifier { name: "x", - span: Some( - 43..44, - ), + span: 43..44, }, ), }, @@ -180,9 +156,7 @@ TypedProgram { kind: Identifier( Identifier { name: "y", - span: Some( - 47..48, - ), + span: 47..48, }, ), }, diff --git a/starstream-to-wasm/tests/snapshots/inputs@blockheight.star.snap b/starstream-to-wasm/tests/snapshots/inputs@blockheight.star.snap index 184da8f4..12082521 100644 --- a/starstream-to-wasm/tests/snapshots/inputs@blockheight.star.snap +++ b/starstream-to-wasm/tests/snapshots/inputs@blockheight.star.snap @@ -14,15 +14,11 @@ Program { ImportNamedItem { imported: Identifier { name: "blockHeight", - span: Some( - 9..20, - ), + span: 9..20, }, local: Identifier { name: "blockHeight", - span: Some( - 9..20, - ), + span: 9..20, }, }, ], @@ -30,22 +26,16 @@ Program { from: ImportSource { namespace: Identifier { name: "starstream", - span: Some( - 28..38, - ), + span: 28..38, }, package: Identifier { name: "std", - span: Some( - 39..42, - ), + span: 39..42, }, interface: Some( Identifier { name: "cardano", - span: Some( - 43..50, - ), + span: 43..50, }, ), }, @@ -61,18 +51,14 @@ Program { ), name: Identifier { name: "reexport", - span: Some( - 63..71, - ), + span: 63..71, }, params: [], return_type: Some( TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 77..80, - ), + span: 77..80, }, generics: [], }, @@ -89,9 +75,7 @@ Program { node: Identifier( Identifier { name: "blockHeight", - span: Some( - 95..106, - ), + span: 95..106, }, ), span: 95..106, @@ -116,9 +100,7 @@ Program { node: Identifier( Identifier { name: "blockHeight", - span: Some( - 122..133, - ), + span: 122..133, }, ), span: 122..133, @@ -145,18 +127,14 @@ Program { ), name: Identifier { name: "second", - span: Some( - 149..155, - ), + span: 149..155, }, params: [], return_type: Some( TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 161..164, - ), + span: 161..164, }, generics: [], }, @@ -170,9 +148,7 @@ Program { node: Identifier( Identifier { name: "reexport", - span: Some( - 171..179, - ), + span: 171..179, }, ), span: 171..179, @@ -220,15 +196,11 @@ TypedProgram { TypedImportNamedItem { imported: Identifier { name: "blockHeight", - span: Some( - 9..20, - ), + span: 9..20, }, local: Identifier { name: "blockHeight", - span: Some( - 9..20, - ), + span: 9..20, }, ty: Function { params: [], @@ -241,22 +213,16 @@ TypedProgram { from: TypedImportSource { namespace: Identifier { name: "starstream", - span: Some( - 28..38, - ), + span: 28..38, }, package: Identifier { name: "std", - span: Some( - 39..42, - ), + span: 39..42, }, interface: Some( Identifier { name: "cardano", - span: Some( - 43..50, - ), + span: 43..50, }, ), }, @@ -269,9 +235,7 @@ TypedProgram { ), name: Identifier { name: "reexport", - span: Some( - 63..71, - ), + span: 63..71, }, params: [], return_type: Int, @@ -297,9 +261,7 @@ TypedProgram { kind: Identifier( Identifier { name: "blockHeight", - span: Some( - 95..106, - ), + span: 95..106, }, ), }, @@ -335,9 +297,7 @@ TypedProgram { kind: Identifier( Identifier { name: "blockHeight", - span: Some( - 122..133, - ), + span: 122..133, }, ), }, @@ -363,9 +323,7 @@ TypedProgram { ), name: Identifier { name: "second", - span: Some( - 149..155, - ), + span: 149..155, }, params: [], return_type: Int, @@ -387,9 +345,7 @@ TypedProgram { kind: Identifier( Identifier { name: "reexport", - span: Some( - 171..179, - ), + span: 171..179, }, ), }, diff --git a/starstream-to-wasm/tests/snapshots/inputs@empty.star.snap b/starstream-to-wasm/tests/snapshots/inputs@empty.star.snap index 824ca296..43b09f46 100644 --- a/starstream-to-wasm/tests/snapshots/inputs@empty.star.snap +++ b/starstream-to-wasm/tests/snapshots/inputs@empty.star.snap @@ -18,9 +18,7 @@ Program { ), name: Identifier { name: "main", - span: Some( - 22..26, - ), + span: 22..26, }, params: [], return_type: None, @@ -49,9 +47,7 @@ TypedProgram { ), name: Identifier { name: "main", - span: Some( - 22..26, - ), + span: 22..26, }, params: [], return_type: Unit, diff --git a/starstream-to-wasm/tests/snapshots/inputs@enum.star.snap b/starstream-to-wasm/tests/snapshots/inputs@enum.star.snap index 69294a5a..bb913023 100644 --- a/starstream-to-wasm/tests/snapshots/inputs@enum.star.snap +++ b/starstream-to-wasm/tests/snapshots/inputs@enum.star.snap @@ -11,26 +11,20 @@ Program { EnumDef { name: Identifier { name: "Foo", - span: Some( - 5..8, - ), + span: 5..8, }, variants: [ EnumVariant { name: Identifier { name: "Bar", - span: Some( - 15..18, - ), + span: 15..18, }, payload: Tuple( [ TypeAnnotation { name: Identifier { name: "bool", - span: Some( - 19..23, - ), + span: 19..23, }, generics: [], }, @@ -41,18 +35,14 @@ Program { EnumVariant { name: Identifier { name: "Baz", - span: Some( - 30..33, - ), + span: 30..33, }, payload: Tuple( [ TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 34..37, - ), + span: 34..37, }, generics: [], }, @@ -71,24 +61,18 @@ Program { export: None, name: Identifier { name: "accepts_foo", - span: Some( - 46..57, - ), + span: 46..57, }, params: [ FunctionParam { name: Identifier { name: "foo", - span: Some( - 58..61, - ), + span: 58..61, }, ty: TypeAnnotation { name: Identifier { name: "Foo", - span: Some( - 63..66, - ), + span: 63..66, }, generics: [], }, @@ -112,9 +96,7 @@ Program { ), name: Identifier { name: "get_bar", - span: Some( - 83..90, - ), + span: 83..90, }, params: [], return_type: None, @@ -128,9 +110,7 @@ Program { node: Identifier( Identifier { name: "accepts_foo", - span: Some( - 99..110, - ), + span: 99..110, }, ), span: 99..110, @@ -140,15 +120,11 @@ Program { node: EnumConstructor { enum_name: Identifier { name: "Foo", - span: Some( - 111..114, - ), + span: 111..114, }, variant: Identifier { name: "Bar", - span: Some( - 116..119, - ), + span: 116..119, }, payload: Tuple( [ @@ -188,9 +164,7 @@ Program { ), name: Identifier { name: "get_baz", - span: Some( - 141..148, - ), + span: 141..148, }, params: [], return_type: None, @@ -204,9 +178,7 @@ Program { node: Identifier( Identifier { name: "accepts_foo", - span: Some( - 157..168, - ), + span: 157..168, }, ), span: 157..168, @@ -216,15 +188,11 @@ Program { node: EnumConstructor { enum_name: Identifier { name: "Foo", - span: Some( - 169..172, - ), + span: 169..172, }, variant: Identifier { name: "Baz", - span: Some( - 174..177, - ), + span: 174..177, }, payload: Tuple( [ @@ -292,17 +260,13 @@ TypedProgram { TypedEnumDef { name: Identifier { name: "Foo", - span: Some( - 5..8, - ), + span: 5..8, }, variants: [ TypedEnumVariant { name: Identifier { name: "Bar", - span: Some( - 15..18, - ), + span: 15..18, }, payload: Tuple( [ @@ -313,9 +277,7 @@ TypedProgram { TypedEnumVariant { name: Identifier { name: "Baz", - span: Some( - 30..33, - ), + span: 30..33, }, payload: Tuple( [ @@ -355,17 +317,13 @@ TypedProgram { export: None, name: Identifier { name: "accepts_foo", - span: Some( - 46..57, - ), + span: 46..57, }, params: [ TypedFunctionParam { name: Identifier { name: "foo", - span: Some( - 58..61, - ), + span: 58..61, }, ty: Enum( EnumType { @@ -408,9 +366,7 @@ TypedProgram { ), name: Identifier { name: "get_bar", - span: Some( - 83..90, - ), + span: 83..90, }, params: [], return_type: Unit, @@ -457,9 +413,7 @@ TypedProgram { kind: Identifier( Identifier { name: "accepts_foo", - span: Some( - 99..110, - ), + span: 99..110, }, ), }, @@ -495,15 +449,11 @@ TypedProgram { kind: EnumConstructor { enum_name: Identifier { name: "Foo", - span: Some( - 111..114, - ), + span: 111..114, }, variant: Identifier { name: "Bar", - span: Some( - 116..119, - ), + span: 116..119, }, payload: Tuple( [ @@ -542,9 +492,7 @@ TypedProgram { ), name: Identifier { name: "get_baz", - span: Some( - 141..148, - ), + span: 141..148, }, params: [], return_type: Unit, @@ -591,9 +539,7 @@ TypedProgram { kind: Identifier( Identifier { name: "accepts_foo", - span: Some( - 157..168, - ), + span: 157..168, }, ), }, @@ -629,15 +575,11 @@ TypedProgram { kind: EnumConstructor { enum_name: Identifier { name: "Foo", - span: Some( - 169..172, - ), + span: 169..172, }, variant: Identifier { name: "Baz", - span: Some( - 174..177, - ), + span: 174..177, }, payload: Tuple( [ diff --git a/starstream-to-wasm/tests/snapshots/inputs@enum_simple.star.snap b/starstream-to-wasm/tests/snapshots/inputs@enum_simple.star.snap index 259d9e66..337c9741 100644 --- a/starstream-to-wasm/tests/snapshots/inputs@enum_simple.star.snap +++ b/starstream-to-wasm/tests/snapshots/inputs@enum_simple.star.snap @@ -1,6 +1,6 @@ --- source: starstream-to-wasm/tests/snapshots.rs -input_file: starstream-to-wasm/tests/inputs/utxo_definition.star +input_file: starstream-to-wasm/tests/inputs/enum_simple.star --- ==== AST ==== Program { @@ -11,17 +11,13 @@ Program { EnumDef { name: Identifier { name: "Message", - span: Some( - 5..12, - ), + span: 5..12, }, variants: [ EnumVariant { name: Identifier { name: "Ping", - span: Some( - 19..23, - ), + span: 19..23, }, payload: Unit, span: 19..23, @@ -29,18 +25,14 @@ Program { EnumVariant { name: Identifier { name: "Pong", - span: Some( - 29..33, - ), + span: 29..33, }, payload: Tuple( [ TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 34..37, - ), + span: 34..37, }, generics: [], }, @@ -65,26 +57,20 @@ TypedProgram { TypedEnumDef { name: Identifier { name: "Message", - span: Some( - 5..12, - ), + span: 5..12, }, variants: [ TypedEnumVariant { name: Identifier { name: "Ping", - span: Some( - 19..23, - ), + span: 19..23, }, payload: Unit, }, TypedEnumVariant { name: Identifier { name: "Pong", - span: Some( - 29..33, - ), + span: 29..33, }, payload: Tuple( [ diff --git a/starstream-to-wasm/tests/snapshots/inputs@events.star.snap b/starstream-to-wasm/tests/snapshots/inputs@events.star.snap index 9b16673d..2e881743 100644 --- a/starstream-to-wasm/tests/snapshots/inputs@events.star.snap +++ b/starstream-to-wasm/tests/snapshots/inputs@events.star.snap @@ -11,18 +11,14 @@ Program { AbiDef { name: Identifier { name: "Foo", - span: Some( - 4..7, - ), + span: 4..7, }, parts: [ Event( EventDef { name: Identifier { name: "Hello", - span: Some( - 20..25, - ), + span: 20..25, }, params: [], }, @@ -40,9 +36,7 @@ Program { ), name: Identifier { name: "main", - span: Some( - 42..46, - ), + span: 42..46, }, params: [], return_type: None, @@ -54,9 +48,7 @@ Program { node: Emit { event: Identifier { name: "Hello", - span: Some( - 60..65, - ), + span: 60..65, }, args: [], }, @@ -89,18 +81,14 @@ TypedProgram { TypedAbiDef { name: Identifier { name: "Foo", - span: Some( - 4..7, - ), + span: 4..7, }, parts: [ Event( TypedEventDef { name: Identifier { name: "Hello", - span: Some( - 20..25, - ), + span: 20..25, }, params: [], }, @@ -115,9 +103,7 @@ TypedProgram { ), name: Identifier { name: "main", - span: Some( - 42..46, - ), + span: 42..46, }, params: [], return_type: Unit, @@ -131,9 +117,7 @@ TypedProgram { kind: Emit { event: Identifier { name: "Hello", - span: Some( - 60..65, - ), + span: 60..65, }, args: [], }, diff --git a/starstream-to-wasm/tests/snapshots/inputs@if_elseif_else.star.snap b/starstream-to-wasm/tests/snapshots/inputs@if_elseif_else.star.snap index 7abe574a..ac978ca7 100644 --- a/starstream-to-wasm/tests/snapshots/inputs@if_elseif_else.star.snap +++ b/starstream-to-wasm/tests/snapshots/inputs@if_elseif_else.star.snap @@ -14,9 +14,7 @@ Program { ), name: Identifier { name: "main", - span: Some( - 10..14, - ), + span: 10..14, }, params: [], return_type: None, @@ -159,9 +157,7 @@ TypedProgram { ), name: Identifier { name: "main", - span: Some( - 10..14, - ), + span: 10..14, }, params: [], return_type: Unit, diff --git a/starstream-to-wasm/tests/snapshots/inputs@if_expression.star.snap b/starstream-to-wasm/tests/snapshots/inputs@if_expression.star.snap index ee5fd621..958872ee 100644 --- a/starstream-to-wasm/tests/snapshots/inputs@if_expression.star.snap +++ b/starstream-to-wasm/tests/snapshots/inputs@if_expression.star.snap @@ -14,18 +14,14 @@ Program { ), name: Identifier { name: "main", - span: Some( - 10..14, - ), + span: 10..14, }, params: [], return_type: Some( TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 20..23, - ), + span: 20..23, }, generics: [], }, @@ -154,9 +150,7 @@ TypedProgram { ), name: Identifier { name: "main", - span: Some( - 10..14, - ), + span: 10..14, }, params: [], return_type: Int, diff --git a/starstream-to-wasm/tests/snapshots/inputs@match_expression.star.snap b/starstream-to-wasm/tests/snapshots/inputs@match_expression.star.snap index 80dbed68..b22cdce4 100644 --- a/starstream-to-wasm/tests/snapshots/inputs@match_expression.star.snap +++ b/starstream-to-wasm/tests/snapshots/inputs@match_expression.star.snap @@ -11,24 +11,18 @@ Program { StructDef { name: Identifier { name: "Ctx", - span: Some( - 7..10, - ), + span: 7..10, }, fields: [ StructField { name: Identifier { name: "x", - span: Some( - 17..18, - ), + span: 17..18, }, ty: TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 20..23, - ), + span: 20..23, }, generics: [], }, @@ -44,26 +38,20 @@ Program { EnumDef { name: Identifier { name: "Thing", - span: Some( - 33..38, - ), + span: 33..38, }, variants: [ EnumVariant { name: Identifier { name: "Wow", - span: Some( - 45..48, - ), + span: 45..48, }, payload: Tuple( [ TypeAnnotation { name: Identifier { name: "Ctx", - span: Some( - 49..52, - ), + span: 49..52, }, generics: [], }, @@ -74,9 +62,7 @@ Program { EnumVariant { name: Identifier { name: "Who", - span: Some( - 59..62, - ), + span: 59..62, }, payload: Unit, span: 59..62, @@ -91,26 +77,20 @@ Program { EnumDef { name: Identifier { name: "Foo", - span: Some( - 72..75, - ), + span: 72..75, }, variants: [ EnumVariant { name: Identifier { name: "Bar", - span: Some( - 82..85, - ), + span: 82..85, }, payload: Tuple( [ TypeAnnotation { name: Identifier { name: "bool", - span: Some( - 86..90, - ), + span: 86..90, }, generics: [], }, @@ -121,18 +101,14 @@ Program { EnumVariant { name: Identifier { name: "Baz", - span: Some( - 97..100, - ), + span: 97..100, }, payload: Tuple( [ TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 101..104, - ), + span: 101..104, }, generics: [], }, @@ -143,18 +119,14 @@ Program { EnumVariant { name: Identifier { name: "Thing", - span: Some( - 111..116, - ), + span: 111..116, }, payload: Tuple( [ TypeAnnotation { name: Identifier { name: "Thing", - span: Some( - 117..122, - ), + span: 117..122, }, generics: [], }, @@ -173,24 +145,18 @@ Program { export: None, name: Identifier { name: "match_foo", - span: Some( - 131..140, - ), + span: 131..140, }, params: [ FunctionParam { name: Identifier { name: "foo", - span: Some( - 141..144, - ), + span: 141..144, }, ty: TypeAnnotation { name: Identifier { name: "Foo", - span: Some( - 146..149, - ), + span: 146..149, }, generics: [], }, @@ -200,9 +166,7 @@ Program { TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 154..157, - ), + span: 154..157, }, generics: [], }, @@ -216,9 +180,7 @@ Program { node: Identifier( Identifier { name: "foo", - span: Some( - 170..173, - ), + span: 170..173, }, ), span: 170..174, @@ -228,39 +190,29 @@ Program { pattern: EnumVariant { enum_name: Identifier { name: "Foo", - span: Some( - 184..187, - ), + span: 184..187, }, variant: Identifier { name: "Thing", - span: Some( - 189..194, - ), + span: 189..194, }, payload: Tuple( [ EnumVariant { enum_name: Identifier { name: "Thing", - span: Some( - 195..200, - ), + span: 195..200, }, variant: Identifier { name: "Wow", - span: Some( - 202..205, - ), + span: 202..205, }, payload: Tuple( [ Binding( Identifier { name: "ctx", - span: Some( - 206..209, - ), + span: 206..209, }, ), ], @@ -278,18 +230,14 @@ Program { node: Identifier( Identifier { name: "ctx", - span: Some( - 229..232, - ), + span: 229..232, }, ), span: 229..232, }, field: Identifier { name: "x", - span: Some( - 233..234, - ), + span: 233..234, }, }, span: 229..243, @@ -303,24 +251,18 @@ Program { pattern: EnumVariant { enum_name: Identifier { name: "Foo", - span: Some( - 254..257, - ), + span: 254..257, }, variant: Identifier { name: "Bar", - span: Some( - 259..262, - ), + span: 259..262, }, payload: Tuple( [ Binding( Identifier { name: "b", - span: Some( - 263..264, - ), + span: 263..264, }, ), ], @@ -346,24 +288,18 @@ Program { pattern: EnumVariant { enum_name: Identifier { name: "Foo", - span: Some( - 304..307, - ), + span: 304..307, }, variant: Identifier { name: "Baz", - span: Some( - 309..312, - ), + span: 309..312, }, payload: Tuple( [ Binding( Identifier { name: "n", - span: Some( - 313..314, - ), + span: 313..314, }, ), ], @@ -376,9 +312,7 @@ Program { node: Identifier( Identifier { name: "n", - span: Some( - 333..334, - ), + span: 333..334, }, ), span: 333..343, @@ -425,24 +359,18 @@ Program { export: None, name: Identifier { name: "match_with_wildcard", - span: Some( - 398..417, - ), + span: 398..417, }, params: [ FunctionParam { name: Identifier { name: "foo", - span: Some( - 418..421, - ), + span: 418..421, }, ty: TypeAnnotation { name: Identifier { name: "Foo", - span: Some( - 423..426, - ), + span: 423..426, }, generics: [], }, @@ -452,9 +380,7 @@ Program { TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 431..434, - ), + span: 431..434, }, generics: [], }, @@ -468,9 +394,7 @@ Program { node: Identifier( Identifier { name: "foo", - span: Some( - 447..450, - ), + span: 447..450, }, ), span: 447..451, @@ -480,24 +404,18 @@ Program { pattern: EnumVariant { enum_name: Identifier { name: "Foo", - span: Some( - 461..464, - ), + span: 461..464, }, variant: Identifier { name: "Bar", - span: Some( - 466..469, - ), + span: 466..469, }, payload: Tuple( [ Binding( Identifier { name: "b", - span: Some( - 470..471, - ), + span: 470..471, }, ), ], @@ -556,24 +474,18 @@ Program { export: None, name: Identifier { name: "match_literal", - span: Some( - 555..568, - ), + span: 555..568, }, params: [ FunctionParam { name: Identifier { name: "x", - span: Some( - 569..570, - ), + span: 569..570, }, ty: TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 572..575, - ), + span: 572..575, }, generics: [], }, @@ -583,9 +495,7 @@ Program { TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 580..583, - ), + span: 580..583, }, generics: [], }, @@ -599,9 +509,7 @@ Program { node: Identifier( Identifier { name: "x", - span: Some( - 596..597, - ), + span: 596..597, }, ), span: 596..598, @@ -666,17 +574,13 @@ Program { EnumDef { name: Identifier { name: "Message", - span: Some( - 695..702, - ), + span: 695..702, }, variants: [ EnumVariant { name: Identifier { name: "Ping", - span: Some( - 709..713, - ), + span: 709..713, }, payload: Unit, span: 709..713, @@ -684,25 +588,19 @@ Program { EnumVariant { name: Identifier { name: "Point", - span: Some( - 719..724, - ), + span: 719..724, }, payload: Struct( [ StructField { name: Identifier { name: "x", - span: Some( - 727..728, - ), + span: 727..728, }, ty: TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 730..733, - ), + span: 730..733, }, generics: [], }, @@ -711,16 +609,12 @@ Program { StructField { name: Identifier { name: "y", - span: Some( - 735..736, - ), + span: 735..736, }, ty: TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 738..741, - ), + span: 738..741, }, generics: [], }, @@ -741,24 +635,18 @@ Program { export: None, name: Identifier { name: "match_point", - span: Some( - 751..762, - ), + span: 751..762, }, params: [ FunctionParam { name: Identifier { name: "msg", - span: Some( - 763..766, - ), + span: 763..766, }, ty: TypeAnnotation { name: Identifier { name: "Message", - span: Some( - 768..775, - ), + span: 768..775, }, generics: [], }, @@ -768,9 +656,7 @@ Program { TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 780..783, - ), + span: 780..783, }, generics: [], }, @@ -784,9 +670,7 @@ Program { node: Identifier( Identifier { name: "msg", - span: Some( - 796..799, - ), + span: 796..799, }, ), span: 796..800, @@ -796,47 +680,35 @@ Program { pattern: EnumVariant { enum_name: Identifier { name: "Message", - span: Some( - 810..817, - ), + span: 810..817, }, variant: Identifier { name: "Point", - span: Some( - 819..824, - ), + span: 819..824, }, payload: Struct( [ StructPatternField { name: Identifier { name: "x", - span: Some( - 827..828, - ), + span: 827..828, }, pattern: Binding( Identifier { name: "x", - span: Some( - 827..828, - ), + span: 827..828, }, ), }, StructPatternField { name: Identifier { name: "y", - span: Some( - 830..831, - ), + span: 830..831, }, pattern: Binding( Identifier { name: "y", - span: Some( - 830..831, - ), + span: 830..831, }, ), }, @@ -853,9 +725,7 @@ Program { node: Identifier( Identifier { name: "x", - span: Some( - 851..852, - ), + span: 851..852, }, ), span: 851..853, @@ -864,9 +734,7 @@ Program { node: Identifier( Identifier { name: "y", - span: Some( - 855..856, - ), + span: 855..856, }, ), span: 855..865, @@ -918,9 +786,7 @@ Program { ), name: Identifier { name: "get_bar", - span: Some( - 927..934, - ), + span: 927..934, }, params: [], return_type: None, @@ -934,9 +800,7 @@ Program { node: Identifier( Identifier { name: "match_foo", - span: Some( - 943..952, - ), + span: 943..952, }, ), span: 943..952, @@ -946,15 +810,11 @@ Program { node: EnumConstructor { enum_name: Identifier { name: "Foo", - span: Some( - 953..956, - ), + span: 953..956, }, variant: Identifier { name: "Bar", - span: Some( - 958..961, - ), + span: 958..961, }, payload: Tuple( [ @@ -1235,17 +1095,13 @@ TypedProgram { TypedStructDef { name: Identifier { name: "Ctx", - span: Some( - 7..10, - ), + span: 7..10, }, fields: [ TypedStructField { name: Identifier { name: "x", - span: Some( - 17..18, - ), + span: 17..18, }, ty: Int, }, @@ -1267,17 +1123,13 @@ TypedProgram { TypedEnumDef { name: Identifier { name: "Thing", - span: Some( - 33..38, - ), + span: 33..38, }, variants: [ TypedEnumVariant { name: Identifier { name: "Wow", - span: Some( - 45..48, - ), + span: 45..48, }, payload: Tuple( [ @@ -1298,9 +1150,7 @@ TypedProgram { TypedEnumVariant { name: Identifier { name: "Who", - span: Some( - 59..62, - ), + span: 59..62, }, payload: Unit, }, @@ -1341,17 +1191,13 @@ TypedProgram { TypedEnumDef { name: Identifier { name: "Foo", - span: Some( - 72..75, - ), + span: 72..75, }, variants: [ TypedEnumVariant { name: Identifier { name: "Bar", - span: Some( - 82..85, - ), + span: 82..85, }, payload: Tuple( [ @@ -1362,9 +1208,7 @@ TypedProgram { TypedEnumVariant { name: Identifier { name: "Baz", - span: Some( - 97..100, - ), + span: 97..100, }, payload: Tuple( [ @@ -1375,9 +1219,7 @@ TypedProgram { TypedEnumVariant { name: Identifier { name: "Thing", - span: Some( - 111..116, - ), + span: 111..116, }, payload: Tuple( [ @@ -1483,17 +1325,13 @@ TypedProgram { export: None, name: Identifier { name: "match_foo", - span: Some( - 131..140, - ), + span: 131..140, }, params: [ TypedFunctionParam { name: Identifier { name: "foo", - span: Some( - 141..144, - ), + span: 141..144, }, ty: Enum( EnumType { @@ -1633,9 +1471,7 @@ TypedProgram { kind: Identifier( Identifier { name: "foo", - span: Some( - 170..173, - ), + span: 170..173, }, ), }, @@ -1646,39 +1482,29 @@ TypedProgram { pattern: EnumVariant { enum_name: Identifier { name: "Foo", - span: Some( - 184..187, - ), + span: 184..187, }, variant: Identifier { name: "Thing", - span: Some( - 189..194, - ), + span: 189..194, }, payload: Tuple( [ EnumVariant { enum_name: Identifier { name: "Thing", - span: Some( - 195..200, - ), + span: 195..200, }, variant: Identifier { name: "Wow", - span: Some( - 202..205, - ), + span: 202..205, }, payload: Tuple( [ Binding( Identifier { name: "ctx", - span: Some( - 206..209, - ), + span: 206..209, }, ), ], @@ -1710,9 +1536,7 @@ TypedProgram { kind: Identifier( Identifier { name: "ctx", - span: Some( - 229..232, - ), + span: 229..232, }, ), }, @@ -1720,9 +1544,7 @@ TypedProgram { }, field: Identifier { name: "x", - span: Some( - 233..234, - ), + span: 233..234, }, }, }, @@ -1735,24 +1557,18 @@ TypedProgram { pattern: EnumVariant { enum_name: Identifier { name: "Foo", - span: Some( - 254..257, - ), + span: 254..257, }, variant: Identifier { name: "Bar", - span: Some( - 259..262, - ), + span: 259..262, }, payload: Tuple( [ Binding( Identifier { name: "b", - span: Some( - 263..264, - ), + span: 263..264, }, ), ], @@ -1779,24 +1595,18 @@ TypedProgram { pattern: EnumVariant { enum_name: Identifier { name: "Foo", - span: Some( - 304..307, - ), + span: 304..307, }, variant: Identifier { name: "Baz", - span: Some( - 309..312, - ), + span: 309..312, }, payload: Tuple( [ Binding( Identifier { name: "n", - span: Some( - 313..314, - ), + span: 313..314, }, ), ], @@ -1811,9 +1621,7 @@ TypedProgram { kind: Identifier( Identifier { name: "n", - span: Some( - 333..334, - ), + span: 333..334, }, ), }, @@ -1855,17 +1663,13 @@ TypedProgram { export: None, name: Identifier { name: "match_with_wildcard", - span: Some( - 398..417, - ), + span: 398..417, }, params: [ TypedFunctionParam { name: Identifier { name: "foo", - span: Some( - 418..421, - ), + span: 418..421, }, ty: Enum( EnumType { @@ -2005,9 +1809,7 @@ TypedProgram { kind: Identifier( Identifier { name: "foo", - span: Some( - 447..450, - ), + span: 447..450, }, ), }, @@ -2018,24 +1820,18 @@ TypedProgram { pattern: EnumVariant { enum_name: Identifier { name: "Foo", - span: Some( - 461..464, - ), + span: 461..464, }, variant: Identifier { name: "Bar", - span: Some( - 466..469, - ), + span: 466..469, }, payload: Tuple( [ Binding( Identifier { name: "b", - span: Some( - 470..471, - ), + span: 470..471, }, ), ], @@ -2091,17 +1887,13 @@ TypedProgram { export: None, name: Identifier { name: "match_literal", - span: Some( - 555..568, - ), + span: 555..568, }, params: [ TypedFunctionParam { name: Identifier { name: "x", - span: Some( - 569..570, - ), + span: 569..570, }, ty: Int, }, @@ -2121,9 +1913,7 @@ TypedProgram { kind: Identifier( Identifier { name: "x", - span: Some( - 596..597, - ), + span: 596..597, }, ), }, @@ -2185,44 +1975,34 @@ TypedProgram { TypedEnumDef { name: Identifier { name: "Message", - span: Some( - 695..702, - ), + span: 695..702, }, variants: [ TypedEnumVariant { name: Identifier { name: "Ping", - span: Some( - 709..713, - ), + span: 709..713, }, payload: Unit, }, TypedEnumVariant { name: Identifier { name: "Point", - span: Some( - 719..724, - ), + span: 719..724, }, payload: Struct( [ TypedStructField { name: Identifier { name: "x", - span: Some( - 727..728, - ), + span: 727..728, }, ty: Int, }, TypedStructField { name: Identifier { name: "y", - span: Some( - 735..736, - ), + span: 735..736, }, ty: Int, }, @@ -2264,17 +2044,13 @@ TypedProgram { export: None, name: Identifier { name: "match_point", - span: Some( - 751..762, - ), + span: 751..762, }, params: [ TypedFunctionParam { name: Identifier { name: "msg", - span: Some( - 763..766, - ), + span: 763..766, }, ty: Enum( EnumType { @@ -2346,9 +2122,7 @@ TypedProgram { kind: Identifier( Identifier { name: "msg", - span: Some( - 796..799, - ), + span: 796..799, }, ), }, @@ -2359,47 +2133,35 @@ TypedProgram { pattern: EnumVariant { enum_name: Identifier { name: "Message", - span: Some( - 810..817, - ), + span: 810..817, }, variant: Identifier { name: "Point", - span: Some( - 819..824, - ), + span: 819..824, }, payload: Struct( [ TypedStructPatternField { name: Identifier { name: "x", - span: Some( - 827..828, - ), + span: 827..828, }, pattern: Binding( Identifier { name: "x", - span: Some( - 827..828, - ), + span: 827..828, }, ), }, TypedStructPatternField { name: Identifier { name: "y", - span: Some( - 830..831, - ), + span: 830..831, }, pattern: Binding( Identifier { name: "y", - span: Some( - 830..831, - ), + span: 830..831, }, ), }, @@ -2420,9 +2182,7 @@ TypedProgram { kind: Identifier( Identifier { name: "x", - span: Some( - 851..852, - ), + span: 851..852, }, ), }, @@ -2434,9 +2194,7 @@ TypedProgram { kind: Identifier( Identifier { name: "y", - span: Some( - 855..856, - ), + span: 855..856, }, ), }, @@ -2484,9 +2242,7 @@ TypedProgram { ), name: Identifier { name: "get_bar", - span: Some( - 927..934, - ), + span: 927..934, }, params: [], return_type: Unit, @@ -2570,9 +2326,7 @@ TypedProgram { kind: Identifier( Identifier { name: "match_foo", - span: Some( - 943..952, - ), + span: 943..952, }, ), }, @@ -2645,15 +2399,11 @@ TypedProgram { kind: EnumConstructor { enum_name: Identifier { name: "Foo", - span: Some( - 953..956, - ), + span: 953..956, }, variant: Identifier { name: "Bar", - span: Some( - 958..961, - ), + span: 958..961, }, payload: Tuple( [ diff --git a/starstream-to-wasm/tests/snapshots/inputs@multiple_functions.star.snap b/starstream-to-wasm/tests/snapshots/inputs@multiple_functions.star.snap index 49177188..b5bcee73 100644 --- a/starstream-to-wasm/tests/snapshots/inputs@multiple_functions.star.snap +++ b/starstream-to-wasm/tests/snapshots/inputs@multiple_functions.star.snap @@ -12,9 +12,7 @@ Program { export: None, name: Identifier { name: "main", - span: Some( - 3..7, - ), + span: 3..7, }, params: [], return_type: None, @@ -25,9 +23,7 @@ Program { mutable: false, name: Identifier { name: "flag", - span: Some( - 20..24, - ), + span: 20..24, }, ty: None, value: Spanned { @@ -51,9 +47,7 @@ Program { node: Identifier( Identifier { name: "flag", - span: Some( - 41..45, - ), + span: 41..45, }, ), span: 41..45, @@ -102,18 +96,14 @@ Program { export: None, name: Identifier { name: "compute", - span: Some( - 106..113, - ), + span: 106..113, }, params: [], return_type: Some( TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 119..122, - ), + span: 119..122, }, generics: [], }, @@ -125,9 +115,7 @@ Program { mutable: false, name: Identifier { name: "base", - span: Some( - 133..137, - ), + span: 133..137, }, ty: None, value: Spanned { @@ -150,9 +138,7 @@ Program { node: Identifier( Identifier { name: "base", - span: Some( - 148..152, - ), + span: 148..152, }, ), span: 148..153, @@ -220,9 +206,7 @@ TypedProgram { export: None, name: Identifier { name: "main", - span: Some( - 3..7, - ), + span: 3..7, }, params: [], return_type: Unit, @@ -233,9 +217,7 @@ TypedProgram { mutable: false, name: Identifier { name: "flag", - span: Some( - 20..24, - ), + span: 20..24, }, value: Spanned { node: TypedExpr { @@ -263,9 +245,7 @@ TypedProgram { kind: Identifier( Identifier { name: "flag", - span: Some( - 41..45, - ), + span: 41..45, }, ), }, @@ -304,9 +284,7 @@ TypedProgram { export: None, name: Identifier { name: "compute", - span: Some( - 106..113, - ), + span: 106..113, }, params: [], return_type: Int, @@ -317,9 +295,7 @@ TypedProgram { mutable: false, name: Identifier { name: "base", - span: Some( - 133..137, - ), + span: 133..137, }, value: Spanned { node: TypedExpr { @@ -346,9 +322,7 @@ TypedProgram { kind: Identifier( Identifier { name: "base", - span: Some( - 148..152, - ), + span: 148..152, }, ), }, diff --git a/starstream-to-wasm/tests/snapshots/inputs@option_result.star.snap b/starstream-to-wasm/tests/snapshots/inputs@option_result.star.snap index e17eea0c..08aae07c 100644 --- a/starstream-to-wasm/tests/snapshots/inputs@option_result.star.snap +++ b/starstream-to-wasm/tests/snapshots/inputs@option_result.star.snap @@ -12,26 +12,20 @@ Program { export: None, name: Identifier { name: "make_some", - span: Some( - 3..12, - ), + span: 3..12, }, params: [], return_type: Some( TypeAnnotation { name: Identifier { name: "Option", - span: Some( - 18..24, - ), + span: 18..24, }, generics: [ TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 25..28, - ), + span: 25..28, }, generics: [], }, @@ -45,15 +39,11 @@ Program { node: EnumConstructor { enum_name: Identifier { name: "Option", - span: Some( - 36..42, - ), + span: 36..42, }, variant: Identifier { name: "Some", - span: Some( - 44..48, - ), + span: 44..48, }, payload: Tuple( [ @@ -83,26 +73,20 @@ Program { export: None, name: Identifier { name: "make_none", - span: Some( - 59..68, - ), + span: 59..68, }, params: [], return_type: Some( TypeAnnotation { name: Identifier { name: "Option", - span: Some( - 74..80, - ), + span: 74..80, }, generics: [ TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 81..84, - ), + span: 81..84, }, generics: [], }, @@ -116,15 +100,11 @@ Program { node: EnumConstructor { enum_name: Identifier { name: "Option", - span: Some( - 92..98, - ), + span: 92..98, }, variant: Identifier { name: "None", - span: Some( - 100..104, - ), + span: 100..104, }, payload: Unit, }, @@ -143,32 +123,24 @@ Program { export: None, name: Identifier { name: "unwrap_option", - span: Some( - 111..124, - ), + span: 111..124, }, params: [ FunctionParam { name: Identifier { name: "opt", - span: Some( - 125..128, - ), + span: 125..128, }, ty: TypeAnnotation { name: Identifier { name: "Option", - span: Some( - 130..136, - ), + span: 130..136, }, generics: [ TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 137..140, - ), + span: 137..140, }, generics: [], }, @@ -180,9 +152,7 @@ Program { TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 146..149, - ), + span: 146..149, }, generics: [], }, @@ -196,9 +166,7 @@ Program { node: Identifier( Identifier { name: "opt", - span: Some( - 162..165, - ), + span: 162..165, }, ), span: 162..166, @@ -208,24 +176,18 @@ Program { pattern: EnumVariant { enum_name: Identifier { name: "Option", - span: Some( - 176..182, - ), + span: 176..182, }, variant: Identifier { name: "Some", - span: Some( - 184..188, - ), + span: 184..188, }, payload: Tuple( [ Binding( Identifier { name: "v", - span: Some( - 189..190, - ), + span: 189..190, }, ), ], @@ -238,9 +200,7 @@ Program { node: Identifier( Identifier { name: "v", - span: Some( - 209..210, - ), + span: 209..210, }, ), span: 209..219, @@ -254,15 +214,11 @@ Program { pattern: EnumVariant { enum_name: Identifier { name: "Option", - span: Some( - 230..236, - ), + span: 230..236, }, variant: Identifier { name: "None", - span: Some( - 238..242, - ), + span: 238..242, }, payload: Unit, }, @@ -299,35 +255,27 @@ Program { export: None, name: Identifier { name: "make_ok", - span: Some( - 285..292, - ), + span: 285..292, }, params: [], return_type: Some( TypeAnnotation { name: Identifier { name: "Result", - span: Some( - 298..304, - ), + span: 298..304, }, generics: [ TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 305..308, - ), + span: 305..308, }, generics: [], }, TypeAnnotation { name: Identifier { name: "bool", - span: Some( - 310..314, - ), + span: 310..314, }, generics: [], }, @@ -341,15 +289,11 @@ Program { node: EnumConstructor { enum_name: Identifier { name: "Result", - span: Some( - 322..328, - ), + span: 322..328, }, variant: Identifier { name: "Ok", - span: Some( - 330..332, - ), + span: 330..332, }, payload: Tuple( [ @@ -379,35 +323,27 @@ Program { export: None, name: Identifier { name: "make_err", - span: Some( - 343..351, - ), + span: 343..351, }, params: [], return_type: Some( TypeAnnotation { name: Identifier { name: "Result", - span: Some( - 357..363, - ), + span: 357..363, }, generics: [ TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 364..367, - ), + span: 364..367, }, generics: [], }, TypeAnnotation { name: Identifier { name: "bool", - span: Some( - 369..373, - ), + span: 369..373, }, generics: [], }, @@ -421,15 +357,11 @@ Program { node: EnumConstructor { enum_name: Identifier { name: "Result", - span: Some( - 381..387, - ), + span: 381..387, }, variant: Identifier { name: "Err", - span: Some( - 389..392, - ), + span: 389..392, }, payload: Tuple( [ @@ -459,41 +391,31 @@ Program { export: None, name: Identifier { name: "unwrap_result", - span: Some( - 406..419, - ), + span: 406..419, }, params: [ FunctionParam { name: Identifier { name: "res", - span: Some( - 420..423, - ), + span: 420..423, }, ty: TypeAnnotation { name: Identifier { name: "Result", - span: Some( - 425..431, - ), + span: 425..431, }, generics: [ TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 432..435, - ), + span: 432..435, }, generics: [], }, TypeAnnotation { name: Identifier { name: "bool", - span: Some( - 437..441, - ), + span: 437..441, }, generics: [], }, @@ -505,9 +427,7 @@ Program { TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 447..450, - ), + span: 447..450, }, generics: [], }, @@ -521,9 +441,7 @@ Program { node: Identifier( Identifier { name: "res", - span: Some( - 463..466, - ), + span: 463..466, }, ), span: 463..467, @@ -533,24 +451,18 @@ Program { pattern: EnumVariant { enum_name: Identifier { name: "Result", - span: Some( - 477..483, - ), + span: 477..483, }, variant: Identifier { name: "Ok", - span: Some( - 485..487, - ), + span: 485..487, }, payload: Tuple( [ Binding( Identifier { name: "v", - span: Some( - 488..489, - ), + span: 488..489, }, ), ], @@ -563,9 +475,7 @@ Program { node: Identifier( Identifier { name: "v", - span: Some( - 508..509, - ), + span: 508..509, }, ), span: 508..518, @@ -579,24 +489,18 @@ Program { pattern: EnumVariant { enum_name: Identifier { name: "Result", - span: Some( - 529..535, - ), + span: 529..535, }, variant: Identifier { name: "Err", - span: Some( - 537..540, - ), + span: 537..540, }, payload: Tuple( [ Binding( Identifier { name: "e", - span: Some( - 541..542, - ), + span: 541..542, }, ), ], @@ -634,32 +538,24 @@ Program { StructDef { name: Identifier { name: "Thing", - span: Some( - 590..595, - ), + span: 590..595, }, fields: [ StructField { name: Identifier { name: "x", - span: Some( - 602..603, - ), + span: 602..603, }, ty: TypeAnnotation { name: Identifier { name: "Option", - span: Some( - 605..611, - ), + span: 605..611, }, generics: [ TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 612..615, - ), + span: 612..615, }, generics: [], }, @@ -680,24 +576,18 @@ Program { ), name: Identifier { name: "run", - span: Some( - 631..634, - ), + span: 631..634, }, params: [ FunctionParam { name: Identifier { name: "x", - span: Some( - 635..636, - ), + span: 635..636, }, ty: TypeAnnotation { name: Identifier { name: "Thing", - span: Some( - 638..643, - ), + span: 638..643, }, generics: [], }, @@ -705,33 +595,25 @@ Program { FunctionParam { name: Identifier { name: "y", - span: Some( - 645..646, - ), + span: 645..646, }, ty: TypeAnnotation { name: Identifier { name: "Result", - span: Some( - 648..654, - ), + span: 648..654, }, generics: [ TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 655..658, - ), + span: 655..658, }, generics: [], }, TypeAnnotation { name: Identifier { name: "bool", - span: Some( - 660..664, - ), + span: 660..664, }, generics: [], }, @@ -750,9 +632,7 @@ Program { node: Identifier( Identifier { name: "unwrap_option", - span: Some( - 673..686, - ), + span: 673..686, }, ), span: 673..686, @@ -764,9 +644,7 @@ Program { node: Identifier( Identifier { name: "make_some", - span: Some( - 687..696, - ), + span: 687..696, }, ), span: 687..696, @@ -790,9 +668,7 @@ Program { node: Identifier( Identifier { name: "unwrap_result", - span: Some( - 705..718, - ), + span: 705..718, }, ), span: 705..718, @@ -804,9 +680,7 @@ Program { node: Identifier( Identifier { name: "make_ok", - span: Some( - 719..726, - ), + span: 719..726, }, ), span: 719..726, @@ -1026,9 +900,7 @@ TypedProgram { export: None, name: Identifier { name: "make_some", - span: Some( - 3..12, - ), + span: 3..12, }, params: [], return_type: Enum( @@ -1084,15 +956,11 @@ TypedProgram { kind: EnumConstructor { enum_name: Identifier { name: "Option", - span: Some( - 36..42, - ), + span: 36..42, }, variant: Identifier { name: "Some", - span: Some( - 44..48, - ), + span: 44..48, }, payload: Tuple( [ @@ -1122,9 +990,7 @@ TypedProgram { export: None, name: Identifier { name: "make_none", - span: Some( - 59..68, - ), + span: 59..68, }, params: [], return_type: Enum( @@ -1180,15 +1046,11 @@ TypedProgram { kind: EnumConstructor { enum_name: Identifier { name: "Option", - span: Some( - 92..98, - ), + span: 92..98, }, variant: Identifier { name: "None", - span: Some( - 100..104, - ), + span: 100..104, }, payload: Unit, }, @@ -1204,17 +1066,13 @@ TypedProgram { export: None, name: Identifier { name: "unwrap_option", - span: Some( - 111..124, - ), + span: 111..124, }, params: [ TypedFunctionParam { name: Identifier { name: "opt", - span: Some( - 125..128, - ), + span: 125..128, }, ty: Enum( EnumType { @@ -1276,9 +1134,7 @@ TypedProgram { kind: Identifier( Identifier { name: "opt", - span: Some( - 162..165, - ), + span: 162..165, }, ), }, @@ -1289,24 +1145,18 @@ TypedProgram { pattern: EnumVariant { enum_name: Identifier { name: "Option", - span: Some( - 176..182, - ), + span: 176..182, }, variant: Identifier { name: "Some", - span: Some( - 184..188, - ), + span: 184..188, }, payload: Tuple( [ Binding( Identifier { name: "v", - span: Some( - 189..190, - ), + span: 189..190, }, ), ], @@ -1321,9 +1171,7 @@ TypedProgram { kind: Identifier( Identifier { name: "v", - span: Some( - 209..210, - ), + span: 209..210, }, ), }, @@ -1336,15 +1184,11 @@ TypedProgram { pattern: EnumVariant { enum_name: Identifier { name: "Option", - span: Some( - 230..236, - ), + span: 230..236, }, variant: Identifier { name: "None", - span: Some( - 238..242, - ), + span: 238..242, }, payload: Unit, }, @@ -1379,9 +1223,7 @@ TypedProgram { export: None, name: Identifier { name: "make_ok", - span: Some( - 285..292, - ), + span: 285..292, }, params: [], return_type: Enum( @@ -1447,15 +1289,11 @@ TypedProgram { kind: EnumConstructor { enum_name: Identifier { name: "Result", - span: Some( - 322..328, - ), + span: 322..328, }, variant: Identifier { name: "Ok", - span: Some( - 330..332, - ), + span: 330..332, }, payload: Tuple( [ @@ -1485,9 +1323,7 @@ TypedProgram { export: None, name: Identifier { name: "make_err", - span: Some( - 343..351, - ), + span: 343..351, }, params: [], return_type: Enum( @@ -1553,15 +1389,11 @@ TypedProgram { kind: EnumConstructor { enum_name: Identifier { name: "Result", - span: Some( - 381..387, - ), + span: 381..387, }, variant: Identifier { name: "Err", - span: Some( - 389..392, - ), + span: 389..392, }, payload: Tuple( [ @@ -1591,17 +1423,13 @@ TypedProgram { export: None, name: Identifier { name: "unwrap_result", - span: Some( - 406..419, - ), + span: 406..419, }, params: [ TypedFunctionParam { name: Identifier { name: "res", - span: Some( - 420..423, - ), + span: 420..423, }, ty: Enum( EnumType { @@ -1673,9 +1501,7 @@ TypedProgram { kind: Identifier( Identifier { name: "res", - span: Some( - 463..466, - ), + span: 463..466, }, ), }, @@ -1686,24 +1512,18 @@ TypedProgram { pattern: EnumVariant { enum_name: Identifier { name: "Result", - span: Some( - 477..483, - ), + span: 477..483, }, variant: Identifier { name: "Ok", - span: Some( - 485..487, - ), + span: 485..487, }, payload: Tuple( [ Binding( Identifier { name: "v", - span: Some( - 488..489, - ), + span: 488..489, }, ), ], @@ -1718,9 +1538,7 @@ TypedProgram { kind: Identifier( Identifier { name: "v", - span: Some( - 508..509, - ), + span: 508..509, }, ), }, @@ -1733,24 +1551,18 @@ TypedProgram { pattern: EnumVariant { enum_name: Identifier { name: "Result", - span: Some( - 529..535, - ), + span: 529..535, }, variant: Identifier { name: "Err", - span: Some( - 537..540, - ), + span: 537..540, }, payload: Tuple( [ Binding( Identifier { name: "e", - span: Some( - 541..542, - ), + span: 541..542, }, ), ], @@ -1786,17 +1598,13 @@ TypedProgram { TypedStructDef { name: Identifier { name: "Thing", - span: Some( - 590..595, - ), + span: 590..595, }, fields: [ TypedStructField { name: Identifier { name: "x", - span: Some( - 602..603, - ), + span: 602..603, }, ty: Enum( EnumType { @@ -1863,17 +1671,13 @@ TypedProgram { ), name: Identifier { name: "run", - span: Some( - 631..634, - ), + span: 631..634, }, params: [ TypedFunctionParam { name: Identifier { name: "x", - span: Some( - 635..636, - ), + span: 635..636, }, ty: Record( RecordType { @@ -1911,9 +1715,7 @@ TypedProgram { TypedFunctionParam { name: Identifier { name: "y", - span: Some( - 645..646, - ), + span: 645..646, }, ty: Enum( EnumType { @@ -1986,9 +1788,7 @@ TypedProgram { kind: Identifier( Identifier { name: "unwrap_option", - span: Some( - 673..686, - ), + span: 673..686, }, ), }, @@ -2051,9 +1851,7 @@ TypedProgram { kind: Identifier( Identifier { name: "make_some", - span: Some( - 687..696, - ), + span: 687..696, }, ), }, @@ -2113,9 +1911,7 @@ TypedProgram { kind: Identifier( Identifier { name: "unwrap_result", - span: Some( - 705..718, - ), + span: 705..718, }, ), }, @@ -2188,9 +1984,7 @@ TypedProgram { kind: Identifier( Identifier { name: "make_ok", - span: Some( - 719..726, - ), + span: 719..726, }, ), }, diff --git a/starstream-to-wasm/tests/snapshots/inputs@struct_definition.star.snap b/starstream-to-wasm/tests/snapshots/inputs@struct_definition.star.snap index a63a044f..15d3e5eb 100644 --- a/starstream-to-wasm/tests/snapshots/inputs@struct_definition.star.snap +++ b/starstream-to-wasm/tests/snapshots/inputs@struct_definition.star.snap @@ -11,24 +11,18 @@ Program { StructDef { name: Identifier { name: "Point", - span: Some( - 7..12, - ), + span: 7..12, }, fields: [ StructField { name: Identifier { name: "x", - span: Some( - 19..20, - ), + span: 19..20, }, ty: TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 22..25, - ), + span: 22..25, }, generics: [], }, @@ -37,16 +31,12 @@ Program { StructField { name: Identifier { name: "y", - span: Some( - 31..32, - ), + span: 31..32, }, ty: TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 34..37, - ), + span: 34..37, }, generics: [], }, @@ -69,26 +59,20 @@ TypedProgram { TypedStructDef { name: Identifier { name: "Point", - span: Some( - 7..12, - ), + span: 7..12, }, fields: [ TypedStructField { name: Identifier { name: "x", - span: Some( - 19..20, - ), + span: 19..20, }, ty: Int, }, TypedStructField { name: Identifier { name: "y", - span: Some( - 31..32, - ), + span: 31..32, }, ty: Int, }, diff --git a/starstream-to-wasm/tests/snapshots/inputs@struct_param.star.snap b/starstream-to-wasm/tests/snapshots/inputs@struct_param.star.snap index acf47474..83a5ff3c 100644 --- a/starstream-to-wasm/tests/snapshots/inputs@struct_param.star.snap +++ b/starstream-to-wasm/tests/snapshots/inputs@struct_param.star.snap @@ -11,24 +11,18 @@ Program { StructDef { name: Identifier { name: "Token", - span: Some( - 7..12, - ), + span: 7..12, }, fields: [ StructField { name: Identifier { name: "amount", - span: Some( - 19..25, - ), + span: 19..25, }, ty: TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 27..30, - ), + span: 27..30, }, generics: [], }, @@ -37,16 +31,12 @@ Program { StructField { name: Identifier { name: "price", - span: Some( - 36..41, - ), + span: 36..41, }, ty: TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 43..46, - ), + span: 43..46, }, generics: [], }, @@ -65,24 +55,18 @@ Program { ), name: Identifier { name: "total_value", - span: Some( - 61..72, - ), + span: 61..72, }, params: [ FunctionParam { name: Identifier { name: "token", - span: Some( - 73..78, - ), + span: 73..78, }, ty: TypeAnnotation { name: Identifier { name: "Token", - span: Some( - 80..85, - ), + span: 80..85, }, generics: [], }, @@ -92,9 +76,7 @@ Program { TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 90..93, - ), + span: 90..93, }, generics: [], }, @@ -111,18 +93,14 @@ Program { node: Identifier( Identifier { name: "token", - span: Some( - 100..105, - ), + span: 100..105, }, ), span: 100..105, }, field: Identifier { name: "amount", - span: Some( - 106..112, - ), + span: 106..112, }, }, span: 100..113, @@ -133,18 +111,14 @@ Program { node: Identifier( Identifier { name: "token", - span: Some( - 115..120, - ), + span: 115..120, }, ), span: 115..120, }, field: Identifier { name: "price", - span: Some( - 121..126, - ), + span: 121..126, }, }, span: 115..127, @@ -197,26 +171,20 @@ TypedProgram { TypedStructDef { name: Identifier { name: "Token", - span: Some( - 7..12, - ), + span: 7..12, }, fields: [ TypedStructField { name: Identifier { name: "amount", - span: Some( - 19..25, - ), + span: 19..25, }, ty: Int, }, TypedStructField { name: Identifier { name: "price", - span: Some( - 36..41, - ), + span: 36..41, }, ty: Int, }, @@ -245,17 +213,13 @@ TypedProgram { ), name: Identifier { name: "total_value", - span: Some( - 61..72, - ), + span: 61..72, }, params: [ TypedFunctionParam { name: Identifier { name: "token", - span: Some( - 73..78, - ), + span: 73..78, }, ty: Record( RecordType { @@ -308,9 +272,7 @@ TypedProgram { kind: Identifier( Identifier { name: "token", - span: Some( - 100..105, - ), + span: 100..105, }, ), }, @@ -318,9 +280,7 @@ TypedProgram { }, field: Identifier { name: "amount", - span: Some( - 106..112, - ), + span: 106..112, }, }, }, @@ -350,9 +310,7 @@ TypedProgram { kind: Identifier( Identifier { name: "token", - span: Some( - 115..120, - ), + span: 115..120, }, ), }, @@ -360,9 +318,7 @@ TypedProgram { }, field: Identifier { name: "price", - span: Some( - 121..126, - ), + span: 121..126, }, }, }, diff --git a/starstream-to-wasm/tests/snapshots/inputs@utxo_main_fn.star.snap b/starstream-to-wasm/tests/snapshots/inputs@utxo_main_fn.star.snap index c76b76e0..0048135e 100644 --- a/starstream-to-wasm/tests/snapshots/inputs@utxo_main_fn.star.snap +++ b/starstream-to-wasm/tests/snapshots/inputs@utxo_main_fn.star.snap @@ -11,18 +11,14 @@ Program { AbiDef { name: Identifier { name: "FooAbi", - span: Some( - 4..10, - ), + span: 4..10, }, parts: [ Event( EventDef { name: Identifier { name: "HelloEvent", - span: Some( - 23..33, - ), + span: 23..33, }, params: [], }, @@ -37,9 +33,7 @@ Program { UtxoDef { name: Identifier { name: "MyUtxo", - span: Some( - 45..51, - ), + span: 45..51, }, parts: [ MainFn( @@ -49,9 +43,7 @@ Program { ), name: Identifier { name: "hello_utxo", - span: Some( - 66..76, - ), + span: 66..76, }, params: [], return_type: None, @@ -63,9 +55,7 @@ Program { node: Emit { event: Identifier { name: "HelloEvent", - span: Some( - 94..104, - ), + span: 94..104, }, args: [], }, @@ -102,18 +92,14 @@ TypedProgram { TypedAbiDef { name: Identifier { name: "FooAbi", - span: Some( - 4..10, - ), + span: 4..10, }, parts: [ Event( TypedEventDef { name: Identifier { name: "HelloEvent", - span: Some( - 23..33, - ), + span: 23..33, }, params: [], }, @@ -125,9 +111,7 @@ TypedProgram { TypedUtxoDef { name: Identifier { name: "MyUtxo", - span: Some( - 45..51, - ), + span: 45..51, }, parts: [ MainFn( @@ -137,9 +121,7 @@ TypedProgram { ), name: Identifier { name: "hello_utxo", - span: Some( - 66..76, - ), + span: 66..76, }, params: [], return_type: Unit, @@ -153,9 +135,7 @@ TypedProgram { kind: Emit { event: Identifier { name: "HelloEvent", - span: Some( - 94..104, - ), + span: 94..104, }, args: [], }, diff --git a/starstream-to-wasm/tests/snapshots/inputs@utxo_storage.star.snap b/starstream-to-wasm/tests/snapshots/inputs@utxo_storage.star.snap index 46776bd8..4597feec 100644 --- a/starstream-to-wasm/tests/snapshots/inputs@utxo_storage.star.snap +++ b/starstream-to-wasm/tests/snapshots/inputs@utxo_storage.star.snap @@ -11,9 +11,7 @@ Program { UtxoDef { name: Identifier { name: "MyUtxo", - span: Some( - 5..11, - ), + span: 5..11, }, parts: [ Storage( @@ -21,126 +19,159 @@ Program { UtxoGlobal { name: Identifier { name: "counter", - span: Some( - 44..51, - ), + span: 44..51, + }, + ty: TypeAnnotation { + name: Identifier { + name: "i64", + span: 53..56, + }, + generics: [], + }, + }, + UtxoGlobal { + name: Identifier { + name: "multiplier", + span: 74..84, }, ty: TypeAnnotation { name: Identifier { name: "i64", - span: Some( - 53..56, - ), + span: 86..89, }, generics: [], }, }, ], ), - ], - }, - ), - span: 0..67, - }, - Spanned { - node: Function( - FunctionDef { - export: Some( - Script, - ), - name: Identifier { - name: "increment", - span: Some( - 77..86, - ), - }, - params: [], - return_type: Some( - TypeAnnotation { - name: Identifier { - name: "i64", - span: Some( - 92..95, + MainFn( + FunctionDef { + export: Some( + UtxoMain, ), - }, - generics: [], - }, - ), - body: Block { - statements: [ - Spanned { - node: Assignment { - target: Identifier { - name: "counter", - span: Some( - 102..109, - ), - }, - value: Spanned { - node: Binary { - op: Add, - left: Spanned { - node: Identifier( - Identifier { - name: "counter", - span: Some( - 112..119, - ), + name: Identifier { + name: "increment", + span: 109..118, + }, + params: [], + return_type: None, + body: Block { + statements: [ + Spanned { + node: Assignment { + target: Identifier { + name: "counter", + span: 131..138, + }, + value: Spanned { + node: Binary { + op: Add, + left: Spanned { + node: Identifier( + Identifier { + name: "counter", + span: 141..148, + }, + ), + span: 141..149, + }, + right: Spanned { + node: Literal( + Integer( + 1, + ), + ), + span: 151..152, + }, }, - ), - span: 112..120, - }, - right: Spanned { - node: Literal( - Integer( - 1, - ), - ), - span: 122..123, + span: 141..152, + }, }, + span: 131..158, }, - span: 112..123, - }, + ], + tail_expression: None, + span: 121..164, }, - span: 102..129, }, - ], - tail_expression: Some( - Spanned { - node: Identifier( - Identifier { - name: "counter", - span: Some( - 129..136, - ), - }, + ), + MainFn( + FunctionDef { + export: Some( + UtxoMain, ), - span: 129..137, + name: Identifier { + name: "increment_mult", + span: 172..186, + }, + params: [], + return_type: None, + body: Block { + statements: [ + Spanned { + node: Assignment { + target: Identifier { + name: "multiplier", + span: 199..209, + }, + value: Spanned { + node: Binary { + op: Add, + left: Spanned { + node: Identifier( + Identifier { + name: "multiplier", + span: 212..222, + }, + ), + span: 212..223, + }, + right: Spanned { + node: Literal( + Integer( + 1, + ), + ), + span: 225..226, + }, + }, + span: 212..226, + }, + }, + span: 199..232, + }, + ], + tail_expression: None, + span: 189..234, + }, }, ), - span: 96..139, - }, + ], }, ), - span: 67..139, + span: 0..236, }, ], } ==== Inference trace ==== T-Utxo: MyUtxo => - -T-Fn: increment => i64 - T-Assign: {counter: i64} ⊢ counter = counter + 1; ⇒ i64 - T-Bin-Add: {counter: i64} ⊢ counter + 1 ⇒ i64 - T-Var: {counter: i64} ⊢ counter ⇒ i64 - T-Int: {counter: i64} ⊢ 1 ⇒ i64 + T-Fn: increment => () + T-Assign: {counter: i64, multiplier: i64} ⊢ counter = counter + 1; ⇒ i64 + T-Bin-Add: {counter: i64, multiplier: i64} ⊢ counter + 1 ⇒ i64 + T-Var: {counter: i64, multiplier: i64} ⊢ counter ⇒ i64 + T-Int: {counter: i64, multiplier: i64} ⊢ 1 ⇒ i64 + Unify-Const: i64 ~ i64 => {} + Unify-Const: i64 ~ i64 => {} Unify-Const: i64 ~ i64 => {} + T-Fn: increment_mult => () + T-Assign: {counter: i64, multiplier: i64} ⊢ multiplier = multiplier + 1; ⇒ i64 + T-Bin-Add: {counter: i64, multiplier: i64} ⊢ multiplier + 1 ⇒ i64 + T-Var: {counter: i64, multiplier: i64} ⊢ multiplier ⇒ i64 + T-Int: {counter: i64, multiplier: i64} ⊢ 1 ⇒ i64 + Unify-Const: i64 ~ i64 => {} + Unify-Const: i64 ~ i64 => {} Unify-Const: i64 ~ i64 => {} - Unify-Const: i64 ~ i64 => {} - T-ReturnTail: counter => i64 - T-Var: {counter: i64} ⊢ counter ⇒ i64 - Unify-Const: i64 ~ i64 => {} ==== Typed AST ==== TypedProgram { @@ -149,9 +180,7 @@ TypedProgram { TypedUtxoDef { name: Identifier { name: "MyUtxo", - span: Some( - 5..11, - ), + span: 5..11, }, parts: [ Storage( @@ -159,93 +188,134 @@ TypedProgram { TypedUtxoGlobal { name: Identifier { name: "counter", - span: Some( - 44..51, - ), + span: 44..51, + }, + ty: Int, + }, + TypedUtxoGlobal { + name: Identifier { + name: "multiplier", + span: 74..84, }, ty: Int, }, ], ), - ], - }, - ), - Function( - TypedFunctionDef { - export: Some( - Script, - ), - name: Identifier { - name: "increment", - span: Some( - 77..86, - ), - }, - params: [], - return_type: Int, - effect: Pure, - body: TypedBlock { - statements: [ - Assignment { - target: Identifier { - name: "counter", - span: Some( - 102..109, - ), + MainFn( + TypedFunctionDef { + export: Some( + UtxoMain, + ), + name: Identifier { + name: "increment", + span: 109..118, }, - value: Spanned { - node: TypedExpr { - ty: Int, - kind: Binary { - op: Add, - left: Spanned { + params: [], + return_type: Unit, + effect: Pure, + body: TypedBlock { + statements: [ + Assignment { + target: Identifier { + name: "counter", + span: 131..138, + }, + value: Spanned { node: TypedExpr { ty: Int, - kind: Identifier( - Identifier { - name: "counter", - span: Some( - 112..119, - ), + kind: Binary { + op: Add, + left: Spanned { + node: TypedExpr { + ty: Int, + kind: Identifier( + Identifier { + name: "counter", + span: 141..148, + }, + ), + }, + span: 141..149, + }, + right: Spanned { + node: TypedExpr { + ty: Int, + kind: Literal( + Integer( + 1, + ), + ), + }, + span: 151..152, }, - ), + }, }, - span: 112..120, + span: 141..152, }, - right: Spanned { + }, + ], + tail_expression: None, + }, + }, + ), + MainFn( + TypedFunctionDef { + export: Some( + UtxoMain, + ), + name: Identifier { + name: "increment_mult", + span: 172..186, + }, + params: [], + return_type: Unit, + effect: Pure, + body: TypedBlock { + statements: [ + Assignment { + target: Identifier { + name: "multiplier", + span: 199..209, + }, + value: Spanned { node: TypedExpr { ty: Int, - kind: Literal( - Integer( - 1, - ), - ), + kind: Binary { + op: Add, + left: Spanned { + node: TypedExpr { + ty: Int, + kind: Identifier( + Identifier { + name: "multiplier", + span: 212..222, + }, + ), + }, + span: 212..223, + }, + right: Spanned { + node: TypedExpr { + ty: Int, + kind: Literal( + Integer( + 1, + ), + ), + }, + span: 225..226, + }, + }, }, - span: 122..123, + span: 212..226, }, }, - }, - span: 112..123, - }, - }, - ], - tail_expression: Some( - Spanned { - node: TypedExpr { - ty: Int, - kind: Identifier( - Identifier { - name: "counter", - span: Some( - 129..136, - ), - }, - ), + ], + tail_expression: None, }, - span: 129..137, }, ), - }, + ], }, ), ], @@ -254,12 +324,18 @@ TypedProgram { ==== Core WebAssembly ==== (module (type (;0;) (func (param i64 i64) (result i64))) - (type (;1;) (func (result i64))) - (type (;2;) (func (param i64))) + (type (;1;) (func)) + (type (;2;) (func (result i64 i64))) + (type (;3;) (func (result i32))) + (type (;4;) (func (param i64 i64))) + (memory (;0;) 1) (global (;0;) (mut i64) (i64.const 0)) + (global (;1;) (mut i64) (i64.const 0)) (export "increment" (func 1)) - (export "get-storage" (func 2)) - (export "set-storage" (func 3)) + (export "increment-mult" (func 2)) + (export "my-utxo-get-storage" (func 4)) + (export "my-utxo-set-storage" (func 5)) + (export "memory" (memory 0)) (func (;0;) (type 0) (param i64 i64) (result i64) (local i64) (local.tee 2 @@ -283,19 +359,49 @@ TypedProgram { (then (unreachable))) ) - (func (;1;) (type 1) (result i64) + (func (;1;) (type 1) (global.set 0 (call 0 (global.get 0) (i64.const 1))) - (global.get 0) ) - (func (;2;) (type 1) (result i64) + (func (;2;) (type 1) + (global.set 1 + (call 0 + (global.get 1) + (i64.const 1))) + ) + (func (;3;) (type 2) (result i64 i64) (global.get 0) + (global.get 1) + ) + (func (;4;) (type 3) (result i32) + (local i32 i64 i64) + (i32.const 8) + (call 3) + (local.set 2) + (local.set 1) + (local.set 0) + (i64.store + (local.get 0) + (local.get 1)) + (i64.store offset=8 + (local.get 0) + (local.get 2)) + (i32.const 8) ) - (func (;3;) (type 2) (param i64) + (func (;5;) (type 4) (param i64 i64) + (local i64) (global.set 0 - (local.get 0)) + (local.get 0) + (drop + (local.get 1))) + (drop + (local.get 0) + (local.set 2 + (local.get 1))) + (global.set 1 + (local.get 2)) ) (@custom "component-type" (component @@ -304,14 +410,16 @@ TypedProgram { (component (type (;0;) (component - (type (;0;) (func (result s64))) + (type (;0;) (func)) (export (;0;) "increment" (func (type 0))) - (type (;1;) (record (field "counter" s64))) - (import "storage" (type (;2;) (eq 1))) - (type (;3;) (func (result 2))) - (export (;1;) "get-storage" (func (type 3))) - (type (;4;) (func (param "storage" 2))) - (export (;2;) "set-storage" (func (type 4))) + (type (;1;) (func)) + (export (;1;) "increment-mult" (func (type 1))) + (type (;2;) (record (field "counter" s64) (field "multiplier" s64))) + (import "my-utxo" (type (;3;) (eq 2))) + (type (;4;) (func (result 3))) + (export (;2;) "my-utxo-get-storage" (func (type 4))) + (type (;5;) (func (param "storage" 3))) + (export (;3;) "my-utxo-set-storage" (func (type 5))) ) ) (export (;0;) "my-namespace:my-package/my-world" (component (type 0))) @@ -326,11 +434,13 @@ TypedProgram { package root:component; world root { - record storage { + record my-utxo { counter: s64, + multiplier: s64, } - export increment: func() -> s64; - export get-storage: func() -> storage; - export set-storage: func(storage: storage); + export increment: func(); + export increment-mult: func(); + export my-utxo-get-storage: func() -> my-utxo; + export my-utxo-set-storage: func(storage: my-utxo); } diff --git a/starstream-to-wasm/tests/snapshots/inputs@utxo_storage_2.star.snap b/starstream-to-wasm/tests/snapshots/inputs@utxo_storage_2.star.snap deleted file mode 100644 index 6e68fa07..00000000 --- a/starstream-to-wasm/tests/snapshots/inputs@utxo_storage_2.star.snap +++ /dev/null @@ -1,708 +0,0 @@ ---- -source: starstream-to-wasm/tests/snapshots.rs -input_file: starstream-to-wasm/tests/inputs/utxo_storage_2.star ---- -==== AST ==== -Program { - shebang: None, - definitions: [ - Spanned { - node: Utxo( - UtxoDef { - name: Identifier { - name: "MyUtxo", - span: Some( - 5..11, - ), - }, - parts: [ - Storage( - [ - UtxoGlobal { - name: Identifier { - name: "counter", - span: Some( - 44..51, - ), - }, - ty: TypeAnnotation { - name: Identifier { - name: "i64", - span: Some( - 53..56, - ), - }, - generics: [], - }, - }, - UtxoGlobal { - name: Identifier { - name: "multiplier", - span: Some( - 74..84, - ), - }, - ty: TypeAnnotation { - name: Identifier { - name: "i64", - span: Some( - 86..89, - ), - }, - generics: [], - }, - }, - ], - ), - ], - }, - ), - span: 0..100, - }, - Spanned { - node: Function( - FunctionDef { - export: Some( - Script, - ), - name: Identifier { - name: "increment", - span: Some( - 110..119, - ), - }, - params: [], - return_type: Some( - TypeAnnotation { - name: Identifier { - name: "i64", - span: Some( - 125..128, - ), - }, - generics: [], - }, - ), - body: Block { - statements: [ - Spanned { - node: Assignment { - target: Identifier { - name: "counter", - span: Some( - 135..142, - ), - }, - value: Spanned { - node: Binary { - op: Add, - left: Spanned { - node: Identifier( - Identifier { - name: "counter", - span: Some( - 145..152, - ), - }, - ), - span: 145..153, - }, - right: Spanned { - node: Literal( - Integer( - 1, - ), - ), - span: 155..156, - }, - }, - span: 145..156, - }, - }, - span: 135..162, - }, - ], - tail_expression: Some( - Spanned { - node: Binary { - op: Multiply, - left: Spanned { - node: Identifier( - Identifier { - name: "counter", - span: Some( - 162..169, - ), - }, - ), - span: 162..170, - }, - right: Spanned { - node: Identifier( - Identifier { - name: "multiplier", - span: Some( - 172..182, - ), - }, - ), - span: 172..183, - }, - }, - span: 162..183, - }, - ), - span: 129..186, - }, - }, - ), - span: 100..186, - }, - Spanned { - node: Function( - FunctionDef { - export: Some( - Script, - ), - name: Identifier { - name: "increment_mult", - span: Some( - 196..210, - ), - }, - params: [], - return_type: Some( - TypeAnnotation { - name: Identifier { - name: "i64", - span: Some( - 216..219, - ), - }, - generics: [], - }, - ), - body: Block { - statements: [ - Spanned { - node: Assignment { - target: Identifier { - name: "multiplier", - span: Some( - 226..236, - ), - }, - value: Spanned { - node: Binary { - op: Add, - left: Spanned { - node: Identifier( - Identifier { - name: "multiplier", - span: Some( - 239..249, - ), - }, - ), - span: 239..250, - }, - right: Spanned { - node: Literal( - Integer( - 1, - ), - ), - span: 252..253, - }, - }, - span: 239..253, - }, - }, - span: 226..259, - }, - ], - tail_expression: Some( - Spanned { - node: Binary { - op: Multiply, - left: Spanned { - node: Identifier( - Identifier { - name: "counter", - span: Some( - 259..266, - ), - }, - ), - span: 259..267, - }, - right: Spanned { - node: Identifier( - Identifier { - name: "multiplier", - span: Some( - 269..279, - ), - }, - ), - span: 269..280, - }, - }, - span: 259..280, - }, - ), - span: 220..282, - }, - }, - ), - span: 186..282, - }, - ], -} - -==== Inference trace ==== -T-Utxo: MyUtxo => - -T-Fn: increment => i64 - T-Assign: {counter: i64, multiplier: i64} ⊢ counter = counter + 1; ⇒ i64 - T-Bin-Add: {counter: i64, multiplier: i64} ⊢ counter + 1 ⇒ i64 - T-Var: {counter: i64, multiplier: i64} ⊢ counter ⇒ i64 - T-Int: {counter: i64, multiplier: i64} ⊢ 1 ⇒ i64 - Unify-Const: i64 ~ i64 => {} - Unify-Const: i64 ~ i64 => {} - Unify-Const: i64 ~ i64 => {} - T-ReturnTail: counter * multiplier => i64 - T-Bin-Mul: {counter: i64, multiplier: i64} ⊢ counter * multiplier ⇒ i64 - T-Var: {counter: i64, multiplier: i64} ⊢ counter ⇒ i64 - T-Var: {counter: i64, multiplier: i64} ⊢ multiplier ⇒ i64 - Unify-Const: i64 ~ i64 => {} - Unify-Const: i64 ~ i64 => {} - Unify-Const: i64 ~ i64 => {} - -T-Fn: increment_mult => i64 - T-Assign: {counter: i64, multiplier: i64} ⊢ multiplier = multiplier + 1; ⇒ i64 - T-Bin-Add: {counter: i64, multiplier: i64} ⊢ multiplier + 1 ⇒ i64 - T-Var: {counter: i64, multiplier: i64} ⊢ multiplier ⇒ i64 - T-Int: {counter: i64, multiplier: i64} ⊢ 1 ⇒ i64 - Unify-Const: i64 ~ i64 => {} - Unify-Const: i64 ~ i64 => {} - Unify-Const: i64 ~ i64 => {} - T-ReturnTail: counter * multiplier => i64 - T-Bin-Mul: {counter: i64, multiplier: i64} ⊢ counter * multiplier ⇒ i64 - T-Var: {counter: i64, multiplier: i64} ⊢ counter ⇒ i64 - T-Var: {counter: i64, multiplier: i64} ⊢ multiplier ⇒ i64 - Unify-Const: i64 ~ i64 => {} - Unify-Const: i64 ~ i64 => {} - Unify-Const: i64 ~ i64 => {} - -==== Typed AST ==== -TypedProgram { - definitions: [ - Utxo( - TypedUtxoDef { - name: Identifier { - name: "MyUtxo", - span: Some( - 5..11, - ), - }, - parts: [ - Storage( - [ - TypedUtxoGlobal { - name: Identifier { - name: "counter", - span: Some( - 44..51, - ), - }, - ty: Int, - }, - TypedUtxoGlobal { - name: Identifier { - name: "multiplier", - span: Some( - 74..84, - ), - }, - ty: Int, - }, - ], - ), - ], - }, - ), - Function( - TypedFunctionDef { - export: Some( - Script, - ), - name: Identifier { - name: "increment", - span: Some( - 110..119, - ), - }, - params: [], - return_type: Int, - effect: Pure, - body: TypedBlock { - statements: [ - Assignment { - target: Identifier { - name: "counter", - span: Some( - 135..142, - ), - }, - value: Spanned { - node: TypedExpr { - ty: Int, - kind: Binary { - op: Add, - left: Spanned { - node: TypedExpr { - ty: Int, - kind: Identifier( - Identifier { - name: "counter", - span: Some( - 145..152, - ), - }, - ), - }, - span: 145..153, - }, - right: Spanned { - node: TypedExpr { - ty: Int, - kind: Literal( - Integer( - 1, - ), - ), - }, - span: 155..156, - }, - }, - }, - span: 145..156, - }, - }, - ], - tail_expression: Some( - Spanned { - node: TypedExpr { - ty: Int, - kind: Binary { - op: Multiply, - left: Spanned { - node: TypedExpr { - ty: Int, - kind: Identifier( - Identifier { - name: "counter", - span: Some( - 162..169, - ), - }, - ), - }, - span: 162..170, - }, - right: Spanned { - node: TypedExpr { - ty: Int, - kind: Identifier( - Identifier { - name: "multiplier", - span: Some( - 172..182, - ), - }, - ), - }, - span: 172..183, - }, - }, - }, - span: 162..183, - }, - ), - }, - }, - ), - Function( - TypedFunctionDef { - export: Some( - Script, - ), - name: Identifier { - name: "increment_mult", - span: Some( - 196..210, - ), - }, - params: [], - return_type: Int, - effect: Pure, - body: TypedBlock { - statements: [ - Assignment { - target: Identifier { - name: "multiplier", - span: Some( - 226..236, - ), - }, - value: Spanned { - node: TypedExpr { - ty: Int, - kind: Binary { - op: Add, - left: Spanned { - node: TypedExpr { - ty: Int, - kind: Identifier( - Identifier { - name: "multiplier", - span: Some( - 239..249, - ), - }, - ), - }, - span: 239..250, - }, - right: Spanned { - node: TypedExpr { - ty: Int, - kind: Literal( - Integer( - 1, - ), - ), - }, - span: 252..253, - }, - }, - }, - span: 239..253, - }, - }, - ], - tail_expression: Some( - Spanned { - node: TypedExpr { - ty: Int, - kind: Binary { - op: Multiply, - left: Spanned { - node: TypedExpr { - ty: Int, - kind: Identifier( - Identifier { - name: "counter", - span: Some( - 259..266, - ), - }, - ), - }, - span: 259..267, - }, - right: Spanned { - node: TypedExpr { - ty: Int, - kind: Identifier( - Identifier { - name: "multiplier", - span: Some( - 269..279, - ), - }, - ), - }, - span: 269..280, - }, - }, - }, - span: 259..280, - }, - ), - }, - }, - ), - ], -} - -==== Core WebAssembly ==== -(module - (type (;0;) (func (param i64 i64) (result i64))) - (type (;1;) (func (result i64))) - (type (;2;) (func (result i64 i64))) - (type (;3;) (func (result i32))) - (type (;4;) (func (param i64 i64))) - (memory (;0;) 1) - (global (;0;) (mut i64) (i64.const 0)) - (global (;1;) (mut i64) (i64.const 0)) - (export "increment" (func 2)) - (export "increment-mult" (func 3)) - (export "get-storage" (func 5)) - (export "set-storage" (func 6)) - (export "memory" (memory 0)) - (func (;0;) (type 0) (param i64 i64) (result i64) - (local i64) - (local.tee 2 - (i64.add - (local.get 0) - (local.get 1))) - (if ;; label = @1 - (i32.ne - (i32.and - (i64.ge_s - (i64.xor - (local.get 0) - (local.get 1)) - (i64.const 0)) - (i64.lt_s - (i64.xor - (local.get 2) - (local.get 0)) - (i64.const 0))) - (i32.const 0)) - (then - (unreachable))) - ) - (func (;1;) (type 0) (param i64 i64) (result i64) - (local i64 i64 i64) - (local.tee 2 - (i64.mul - (local.tee 3 - (local.get 0)) - (local.tee 4 - (local.get 1)))) - (if ;; label = @1 - (i32.or - (i32.and - (i64.eq - (local.get 3) - (i64.const -9223372036854775808)) - (i64.eq - (local.get 4) - (i64.const -1))) - (i32.and - (i64.eq - (local.get 4) - (i64.const -9223372036854775808)) - (i64.eq - (local.get 3) - (i64.const -1)))) - (then - (unreachable))) - (if ;; label = @1 - (i64.ne - (local.get 4) - (i64.const 0)) - (then - (if ;; label = @2 - (i64.ne - (i64.div_s - (local.get 2) - (local.get 4)) - (local.get 3)) - (then - (unreachable))))) - ) - (func (;2;) (type 1) (result i64) - (global.set 0 - (call 0 - (global.get 0) - (i64.const 1))) - (call 1 - (global.get 0) - (global.get 1)) - ) - (func (;3;) (type 1) (result i64) - (global.set 1 - (call 0 - (global.get 1) - (i64.const 1))) - (call 1 - (global.get 0) - (global.get 1)) - ) - (func (;4;) (type 2) (result i64 i64) - (global.get 0) - (global.get 1) - ) - (func (;5;) (type 3) (result i32) - (local i32 i64 i64) - (i32.const 8) - (call 4) - (local.set 2) - (local.set 1) - (local.set 0) - (i64.store - (local.get 0) - (local.get 1)) - (i64.store offset=8 - (local.get 0) - (local.get 2)) - (i32.const 8) - ) - (func (;6;) (type 4) (param i64 i64) - (local i64) - (global.set 0 - (local.get 0) - (drop - (local.get 1))) - (drop - (local.get 0) - (local.set 2 - (local.get 1))) - (global.set 1 - (local.get 2)) - ) - (@custom "component-type" - (component - (@custom "wit-component-encoding" "\04\00") - (type (;0;) - (component - (type (;0;) - (component - (type (;0;) (func (result s64))) - (export (;0;) "increment" (func (type 0))) - (type (;1;) (func (result s64))) - (export (;1;) "increment-mult" (func (type 1))) - (type (;2;) (record (field "counter" s64) (field "multiplier" s64))) - (import "storage" (type (;3;) (eq 2))) - (type (;4;) (func (result 3))) - (export (;2;) "get-storage" (func (type 4))) - (type (;5;) (func (param "storage" 3))) - (export (;3;) "set-storage" (func (type 5))) - ) - ) - (export (;0;) "my-namespace:my-package/my-world" (component (type 0))) - ) - ) - (export (;1;) "x" (type 0)) - ) - ) -) - -==== WIT ==== -package root:component; - -world root { - record storage { - counter: s64, - multiplier: s64, - } - - export increment: func() -> s64; - export increment-mult: func() -> s64; - export get-storage: func() -> storage; - export set-storage: func(storage: storage); -} diff --git a/starstream-to-wasm/tests/snapshots/inputs@utxo_storage_err.star.snap b/starstream-to-wasm/tests/snapshots/inputs@utxo_storage_err.star.snap new file mode 100644 index 00000000..a3c11bce --- /dev/null +++ b/starstream-to-wasm/tests/snapshots/inputs@utxo_storage_err.star.snap @@ -0,0 +1,155 @@ +--- +source: starstream-to-wasm/tests/snapshots.rs +input_file: starstream-to-wasm/tests/inputs/utxo_storage_err.star +--- +==== AST ==== +Program { + shebang: None, + definitions: [ + Spanned { + node: Utxo( + UtxoDef { + name: Identifier { + name: "MyUtxo", + span: 5..11, + }, + parts: [ + Storage( + [ + UtxoGlobal { + name: Identifier { + name: "counter", + span: 44..51, + }, + ty: TypeAnnotation { + name: Identifier { + name: "i64", + span: 53..56, + }, + generics: [], + }, + }, + ], + ), + ], + }, + ), + span: 0..67, + }, + Spanned { + node: Function( + FunctionDef { + export: Some( + Script, + ), + name: Identifier { + name: "get", + span: 77..80, + }, + params: [], + return_type: Some( + TypeAnnotation { + name: Identifier { + name: "i64", + span: 86..89, + }, + generics: [], + }, + ), + body: Block { + statements: [], + tail_expression: Some( + Spanned { + node: Identifier( + Identifier { + name: "counter", + span: 96..103, + }, + ), + span: 96..104, + }, + ), + span: 90..106, + }, + }, + ), + span: 67..106, + }, + ], +} + +==== Inference trace ==== +T-Utxo: MyUtxo => + +T-Fn: get => i64 + T-ReturnTail: counter => i64 + T-Var: {counter: i64} ⊢ counter ⇒ i64 + Unify-Const: i64 ~ i64 => {} + +==== Typed AST ==== +TypedProgram { + definitions: [ + Utxo( + TypedUtxoDef { + name: Identifier { + name: "MyUtxo", + span: 5..11, + }, + parts: [ + Storage( + [ + TypedUtxoGlobal { + name: Identifier { + name: "counter", + span: 44..51, + }, + ty: Int, + }, + ], + ), + ], + }, + ), + Function( + TypedFunctionDef { + export: Some( + Script, + ), + name: Identifier { + name: "get", + span: 77..80, + }, + params: [], + return_type: Int, + effect: Pure, + body: TypedBlock { + statements: [], + tail_expression: Some( + Spanned { + node: TypedExpr { + ty: Int, + kind: Identifier( + Identifier { + name: "counter", + span: 96..103, + }, + ), + }, + span: 96..104, + }, + ), + }, + }, + ), + ], +} + +==== Core WebAssembly ==== + x unknown name "counter" + ,-[8:5] + 7 | script fn get() -> i64 { + 8 | counter + : ^^^|^^^ + : `-- unknown name "counter" + 9 | } + `---- diff --git a/starstream-to-wasm/tests/snapshots/inputs@while_simple.star.snap b/starstream-to-wasm/tests/snapshots/inputs@while_simple.star.snap index 09492417..a4fc6226 100644 --- a/starstream-to-wasm/tests/snapshots/inputs@while_simple.star.snap +++ b/starstream-to-wasm/tests/snapshots/inputs@while_simple.star.snap @@ -14,9 +14,7 @@ Program { ), name: Identifier { name: "main", - span: Some( - 10..14, - ), + span: 10..14, }, params: [], return_type: None, @@ -27,9 +25,7 @@ Program { mutable: true, name: Identifier { name: "foo", - span: Some( - 31..34, - ), + span: 31..34, }, ty: None, value: Spanned { @@ -52,9 +48,7 @@ Program { node: Identifier( Identifier { name: "foo", - span: Some( - 51..54, - ), + span: 51..54, }, ), span: 51..55, @@ -76,9 +70,7 @@ Program { node: Assignment { target: Identifier { name: "foo", - span: Some( - 71..74, - ), + span: 71..74, }, value: Spanned { node: Binary { @@ -87,9 +79,7 @@ Program { node: Identifier( Identifier { name: "foo", - span: Some( - 77..80, - ), + span: 77..80, }, ), span: 77..81, @@ -156,9 +146,7 @@ TypedProgram { ), name: Identifier { name: "main", - span: Some( - 10..14, - ), + span: 10..14, }, params: [], return_type: Unit, @@ -169,9 +157,7 @@ TypedProgram { mutable: true, name: Identifier { name: "foo", - span: Some( - 31..34, - ), + span: 31..34, }, value: Spanned { node: TypedExpr { @@ -197,9 +183,7 @@ TypedProgram { kind: Identifier( Identifier { name: "foo", - span: Some( - 51..54, - ), + span: 51..54, }, ), }, @@ -225,9 +209,7 @@ TypedProgram { Assignment { target: Identifier { name: "foo", - span: Some( - 71..74, - ), + span: 71..74, }, value: Spanned { node: TypedExpr { @@ -240,9 +222,7 @@ TypedProgram { kind: Identifier( Identifier { name: "foo", - span: Some( - 77..80, - ), + span: 77..80, }, ), }, diff --git a/starstream-types/src/ast.rs b/starstream-types/src/ast.rs index b9a7db53..28945205 100644 --- a/starstream-types/src/ast.rs +++ b/starstream-types/src/ast.rs @@ -9,6 +9,12 @@ use serde::Serialize; pub type Span = SimpleSpan; +pub const DUMMY_SPAN: Span = Span { + start: 0, + end: 0, + context: (), +}; + /// Create a span from start and end offsets. /// /// This is a convenience function that avoids needing to import the chumsky Span trait. @@ -54,7 +60,7 @@ impl Spanned { pub struct Identifier { pub name: String, #[serde(skip)] - pub span: Option, + pub span: Span, } impl Identifier { @@ -62,7 +68,7 @@ impl Identifier { pub fn anon(name: impl Into) -> Self { Self { name: name.into(), - span: None, + span: DUMMY_SPAN, } } @@ -70,13 +76,37 @@ impl Identifier { pub fn new(name: impl Into, span: Span) -> Self { Self { name: name.into(), - span: Some(span), + span, } } + /// Get the identifier's text. pub fn as_str(&self) -> &str { &self.name } + + /// Get the identifier's source span if available, or DUMMY_SPAN if the identifier was hardcoded. + pub fn span(&self) -> Span { + self.span + } + + /// Get the identifier's source span if available, or `default` if the identifier was hardcoded. + pub fn span_or(&self, default: Span) -> Span { + if self.span == DUMMY_SPAN { + default + } else { + self.span + } + } + + /// Get the identifier's source span if available, or `None` if the identifier was hardcoded. + pub fn opt_span(&self) -> Option { + if self.span == DUMMY_SPAN { + None + } else { + Some(self.span) + } + } } impl std::fmt::Display for Identifier {