diff --git a/crates/stef-build/src/decode.rs b/crates/stef-build/src/decode.rs index a100bbd..b3f671d 100644 --- a/crates/stef-build/src/decode.rs +++ b/crates/stef-build/src/decode.rs @@ -11,7 +11,7 @@ pub fn compile_struct( fields, }: &Struct<'_>, ) -> TokenStream { - let name = Ident::new(name, Span::call_site()); + let name = Ident::new(name.get(), Span::call_site()); let (generics, generics_where) = compile_generics(generics); let field_vars = compile_field_vars(fields); let field_matches = compile_field_matches(fields); @@ -55,7 +55,7 @@ pub fn compile_enum( variants, }: &Enum<'_>, ) -> TokenStream { - let name = Ident::new(name, Span::call_site()); + let name = Ident::new(name.get(), Span::call_site()); let (generics, generics_where) = compile_generics(generics); let variants = variants.iter().map(compile_variant); diff --git a/crates/stef-build/src/definition.rs b/crates/stef-build/src/definition.rs index 0c078b8..c276d80 100644 --- a/crates/stef-build/src/definition.rs +++ b/crates/stef-build/src/definition.rs @@ -59,7 +59,7 @@ fn compile_module( }: &Module<'_>, ) -> TokenStream { let comment = compile_comment(comment); - let name = Ident::new(name, Span::call_site()); + let name = Ident::new(name.get(), Span::call_site()); let definitions = definitions.iter().map(compile_definition); quote! { @@ -83,7 +83,7 @@ fn compile_struct( }: &Struct<'_>, ) -> TokenStream { let comment = compile_comment(comment); - let name = Ident::new(name, Span::call_site()); + let name = Ident::new(name.get(), Span::call_site()); let generics = compile_generics(generics); let fields = compile_fields(fields, true); @@ -105,7 +105,7 @@ fn compile_enum( }: &Enum<'_>, ) -> TokenStream { let comment = compile_comment(comment); - let name = Ident::new(name, Span::call_site()); + let name = Ident::new(name.get(), Span::call_site()); let generics = compile_generics(generics); let variants = variants.iter().map(compile_variant); @@ -165,7 +165,7 @@ fn compile_const( }: &Const<'_>, ) -> TokenStream { let comment = compile_comment(comment); - let name = Ident::new(name, Span::call_site()); + let name = Ident::new(name.get(), Span::call_site()); let ty = compile_const_data_type(ty); let value = compile_literal(value); @@ -185,8 +185,8 @@ fn compile_import(Import { segments, element }: &Import<'_>) -> TokenStream { quote! {#segment} } }); - let element = element.map(|element| { - let element = Ident::new(element, Span::call_site()); + let element = element.as_ref().map(|element| { + let element = Ident::new(element.get(), Span::call_site()); quote! { ::#element} }); diff --git a/crates/stef-build/src/encode.rs b/crates/stef-build/src/encode.rs index c79e61e..f9a6e08 100644 --- a/crates/stef-build/src/encode.rs +++ b/crates/stef-build/src/encode.rs @@ -11,7 +11,7 @@ pub fn compile_struct( fields, }: &Struct<'_>, ) -> TokenStream { - let name = Ident::new(name, Span::call_site()); + let name = Ident::new(name.get(), Span::call_site()); let (generics, generics_where) = compile_generics(generics); let fields = compile_struct_fields(fields); @@ -94,7 +94,7 @@ pub fn compile_enum( variants, }: &Enum<'_>, ) -> TokenStream { - let name = Ident::new(name, Span::call_site()); + let name = Ident::new(name.get(), Span::call_site()); let (generics, generics_where) = compile_generics(generics); let variants = variants.iter().map(compile_variant); diff --git a/crates/stef-compiler/src/lib.rs b/crates/stef-compiler/src/lib.rs index 69af040..60162c0 100644 --- a/crates/stef-compiler/src/lib.rs +++ b/crates/stef-compiler/src/lib.rs @@ -43,12 +43,14 @@ impl From for Error { } pub fn validate_schema(value: &Schema<'_>) -> Result<(), Error> { + names::validate_names_in_module(&value.definitions)?; value.definitions.iter().try_for_each(validate_definition) } fn validate_definition(value: &Definition<'_>) -> Result<(), Error> { match value { Definition::Module(m) => { + names::validate_names_in_module(&m.definitions)?; m.definitions.iter().try_for_each(validate_definition)?; } Definition::Struct(s) => { diff --git a/crates/stef-compiler/src/names.rs b/crates/stef-compiler/src/names.rs index 95f9fc5..5cc23a9 100644 --- a/crates/stef-compiler/src/names.rs +++ b/crates/stef-compiler/src/names.rs @@ -1,7 +1,7 @@ use std::{collections::HashMap, ops::Range}; use miette::Diagnostic; -use stef_parser::{Enum, Fields, Spanned, Struct}; +use stef_parser::{Definition, Enum, Fields, Import, Spanned, Struct}; use thiserror::Error; #[derive(Debug, Diagnostic, Error)] @@ -12,6 +12,9 @@ pub enum DuplicateName { #[error("duplicate name in a field")] #[diagnostic(transparent)] Field(#[from] DuplicateFieldName), + #[error("duplicate name in the scope of a module")] + #[diagnostic(transparent)] + InModule(#[from] DuplicateNameInModule), } #[derive(Debug, Diagnostic, Error)] @@ -36,6 +39,19 @@ pub struct DuplicateFieldName { pub second: Range, } +#[derive(Debug, Diagnostic, Error)] +#[error("duplicate definition name `{name}`")] +#[diagnostic(help( + "the names of each definition must be unique and not collide with other declarations" +))] +pub struct DuplicateNameInModule { + pub name: String, + #[label("first declared here")] + pub first: Range, + #[label("used here again")] + pub second: Range, +} + /// Ensure all field names inside a struct are unique. pub(crate) fn validate_struct_names(value: &Struct<'_>) -> Result<(), DuplicateFieldName> { validate_field_names(&value.fields) @@ -91,3 +107,35 @@ fn validate_field_names(value: &Fields<'_>) -> Result<(), DuplicateFieldName> { Ok(()) } + +pub(crate) fn validate_names_in_module(value: &[Definition<'_>]) -> Result<(), DuplicateName> { + let mut visited = HashMap::with_capacity(value.len()); + value + .iter() + .find_map(|definition| { + let name = match definition { + Definition::Module(m) => &m.name, + Definition::Struct(s) => &s.name, + Definition::Enum(e) => &e.name, + Definition::TypeAlias(_) => { + eprintln!("TODO: implement name check for type aliases"); + return None; + } + Definition::Const(c) => &c.name, + Definition::Import(Import { + element: Some(name), + .. + }) => name, + Definition::Import(_) => return None, + }; + visited.insert(name.get(), name.span()).map(|first| { + DuplicateNameInModule { + name: name.get().to_owned(), + first: first.into(), + second: name.span().into(), + } + .into() + }) + }) + .map_or(Ok(()), Err) +} diff --git a/crates/stef-parser/src/lib.rs b/crates/stef-parser/src/lib.rs index 74a5215..cfae0f2 100644 --- a/crates/stef-parser/src/lib.rs +++ b/crates/stef-parser/src/lib.rs @@ -207,7 +207,7 @@ pub struct Module<'a> { /// Optional module-level comment. pub comment: Comment<'a>, /// Unique name of the module, within the current scope. - pub name: &'a str, + pub name: Name<'a>, /// List of definitions that are scoped within this module. pub definitions: Vec>, } @@ -264,7 +264,7 @@ pub struct Struct<'a> { /// Optional attributes to customize the behavior. pub attributes: Attributes<'a>, /// Unique name for this struct (within its scope). - pub name: &'a str, + pub name: Name<'a>, /// Potential generics. pub generics: Generics<'a>, /// Fields of the struct, if any. @@ -318,7 +318,7 @@ pub struct Enum<'a> { /// Optional attributes to customize the behavior. pub attributes: Attributes<'a>, /// Unique name for this enum, within its current scope. - pub name: &'a str, + pub name: Name<'a>, /// Potential generics. pub generics: Generics<'a>, /// List of possible variants that the enum can represent. @@ -895,7 +895,7 @@ pub struct Const<'a> { /// Optional element-level comment. pub comment: Comment<'a>, /// Unique identifier of this constant. - pub name: &'a str, + pub name: Name<'a>, /// Type of the value. pub ty: DataType<'a>, /// Literal value that this declaration represents. @@ -952,7 +952,7 @@ pub struct Import<'a> { pub segments: Vec<&'a str>, /// Optional final element that allows to fully import the type, making it look as it would be /// defined in the current schema. - pub element: Option<&'a str>, + pub element: Option>, } impl<'a> Print for Import<'a> { diff --git a/crates/stef-parser/src/parser/consts.rs b/crates/stef-parser/src/parser/consts.rs index adbd927..e19d646 100644 --- a/crates/stef-parser/src/parser/consts.rs +++ b/crates/stef-parser/src/parser/consts.rs @@ -11,7 +11,7 @@ use winnow::{ }; use super::{literals, types, Input, ParserExt, Result}; -use crate::{highlight, location, Comment, Const}; +use crate::{highlight, location, Comment, Const, Name}; /// Encountered an invalid `const` declaration. #[derive(Debug, ParserError)] @@ -105,13 +105,18 @@ pub(super) fn parse<'i>(input: &mut Input<'i>) -> Result, ParseError> }) } -pub(super) fn parse_name<'i>(input: &mut Input<'i>) -> Result<&'i str, Cause> { +pub(super) fn parse_name<'i>(input: &mut Input<'i>) -> Result, Cause> { ( one_of('A'..='Z'), take_while(0.., ('A'..='Z', '0'..='9', '_')), ) .recognize() + .with_span() .parse_next(input) + .map(|(value, span)| Name { + value, + span: span.into(), + }) .map_err(|e| { e.map(|()| Cause::InvalidName { at: input.location(), diff --git a/crates/stef-parser/src/parser/enums.rs b/crates/stef-parser/src/parser/enums.rs index 690af1f..11981d0 100644 --- a/crates/stef-parser/src/parser/enums.rs +++ b/crates/stef-parser/src/parser/enums.rs @@ -11,7 +11,7 @@ use winnow::{ }; use super::{comments, fields, generics, ids, ws, Input, ParserExt, Result}; -use crate::{highlight, Attributes, Comment, Enum, Variant}; +use crate::{highlight, Attributes, Comment, Enum, Name, Variant}; /// Encountered an invalid `enum` declaration. #[derive(Debug, ParserError)] @@ -109,10 +109,15 @@ pub(super) fn parse<'i>(input: &mut Input<'i>) -> Result, ParseError> { }) } -pub(super) fn parse_name<'i>(input: &mut Input<'i>) -> Result<&'i str, Cause> { +pub(super) fn parse_name<'i>(input: &mut Input<'i>) -> Result, Cause> { (one_of('A'..='Z'), alphanumeric0) .recognize() + .with_span() .parse_next(input) + .map(|(value, span)| Name { + value, + span: span.into(), + }) .map_err(|e| { e.map(|()| Cause::InvalidName { at: input.location(), diff --git a/crates/stef-parser/src/parser/modules.rs b/crates/stef-parser/src/parser/modules.rs index a57d405..d2410c4 100644 --- a/crates/stef-parser/src/parser/modules.rs +++ b/crates/stef-parser/src/parser/modules.rs @@ -11,7 +11,7 @@ use winnow::{ }; use super::{parse_definition, ws, Input, ParserExt, Result}; -use crate::{error::ParseDefinitionError, highlight, location, Comment, Module}; +use crate::{error::ParseDefinitionError, highlight, location, Comment, Module, Name}; /// Encountered an invalid `mod` declaration. #[derive(Debug, ParserError)] @@ -89,13 +89,18 @@ pub(super) fn parse<'i>(input: &mut Input<'i>) -> Result, ParseError> }) } -fn parse_name<'i>(input: &mut Input<'i>) -> Result<&'i str, Cause> { +fn parse_name<'i>(input: &mut Input<'i>) -> Result, Cause> { ( one_of('a'..='z'), take_while(0.., ('a'..='z', '0'..='9', '_')), ) .recognize() + .with_span() .parse_next(input) + .map(|(value, span)| Name { + value, + span: span.into(), + }) .map_err(|e| { e.map(|()| Cause::InvalidName { at: input.location(), diff --git a/crates/stef-parser/src/parser/structs.rs b/crates/stef-parser/src/parser/structs.rs index 86d84d2..4c8ebfb 100644 --- a/crates/stef-parser/src/parser/structs.rs +++ b/crates/stef-parser/src/parser/structs.rs @@ -11,7 +11,7 @@ use winnow::{ }; use super::{fields, generics, Input, ParserExt, Result}; -use crate::{highlight, location, Attributes, Comment, Struct}; +use crate::{highlight, location, Attributes, Comment, Name, Struct}; /// Encountered an invalid `struct` declaration. #[derive(Debug, ParserError)] @@ -89,10 +89,15 @@ pub(super) fn parse<'i>(input: &mut Input<'i>) -> Result, ParseError> }) } -pub(super) fn parse_name<'i>(input: &mut Input<'i>) -> Result<&'i str, Cause> { +pub(super) fn parse_name<'i>(input: &mut Input<'i>) -> Result, Cause> { (one_of('A'..='Z'), alphanumeric0) .recognize() + .with_span() .parse_next(input) + .map(|(value, span)| Name { + value, + span: span.into(), + }) .map_err(|e| { e.map(|()| Cause::InvalidName { at: input.location(), diff --git a/crates/stef-parser/tests/snapshots/parser__parse@attribute_multi.stef.snap b/crates/stef-parser/tests/snapshots/parser__parse@attribute_multi.stef.snap index 75fde1c..b9e96d8 100644 --- a/crates/stef-parser/tests/snapshots/parser__parse@attribute_multi.stef.snap +++ b/crates/stef-parser/tests/snapshots/parser__parse@attribute_multi.stef.snap @@ -37,7 +37,13 @@ Schema { }, ], ), - name: "Sample", + name: Name { + value: "Sample", + span: Span { + start: 39, + end: 45, + }, + }, generics: Generics( [], ), diff --git a/crates/stef-parser/tests/snapshots/parser__parse@attribute_single.stef.snap b/crates/stef-parser/tests/snapshots/parser__parse@attribute_single.stef.snap index 0043e41..163068d 100644 --- a/crates/stef-parser/tests/snapshots/parser__parse@attribute_single.stef.snap +++ b/crates/stef-parser/tests/snapshots/parser__parse@attribute_single.stef.snap @@ -22,7 +22,13 @@ Schema { }, ], ), - name: "Sample", + name: Name { + value: "Sample", + span: Span { + start: 35, + end: 41, + }, + }, generics: Generics( [], ), diff --git a/crates/stef-parser/tests/snapshots/parser__parse@attribute_unit.stef.snap b/crates/stef-parser/tests/snapshots/parser__parse@attribute_unit.stef.snap index e598242..06a01a2 100644 --- a/crates/stef-parser/tests/snapshots/parser__parse@attribute_unit.stef.snap +++ b/crates/stef-parser/tests/snapshots/parser__parse@attribute_unit.stef.snap @@ -18,7 +18,13 @@ Schema { }, ], ), - name: "Sample", + name: Name { + value: "Sample", + span: Span { + start: 21, + end: 27, + }, + }, generics: Generics( [], ), diff --git a/crates/stef-parser/tests/snapshots/parser__parse@attributes.stef.snap b/crates/stef-parser/tests/snapshots/parser__parse@attributes.stef.snap index 072c2fb..79edbed 100644 --- a/crates/stef-parser/tests/snapshots/parser__parse@attributes.stef.snap +++ b/crates/stef-parser/tests/snapshots/parser__parse@attributes.stef.snap @@ -60,7 +60,13 @@ Schema { }, ], ), - name: "Sample", + name: Name { + value: "Sample", + span: Span { + start: 111, + end: 117, + }, + }, generics: Generics( [], ), diff --git a/crates/stef-parser/tests/snapshots/parser__parse@attributes_min_ws.stef.snap b/crates/stef-parser/tests/snapshots/parser__parse@attributes_min_ws.stef.snap index 435b129..aea5aa6 100644 --- a/crates/stef-parser/tests/snapshots/parser__parse@attributes_min_ws.stef.snap +++ b/crates/stef-parser/tests/snapshots/parser__parse@attributes_min_ws.stef.snap @@ -60,7 +60,13 @@ Schema { }, ], ), - name: "Sample", + name: Name { + value: "Sample", + span: Span { + start: 91, + end: 97, + }, + }, generics: Generics( [], ), diff --git a/crates/stef-parser/tests/snapshots/parser__parse@const_basic.stef.snap b/crates/stef-parser/tests/snapshots/parser__parse@const_basic.stef.snap index 7d78d13..83e9f6b 100644 --- a/crates/stef-parser/tests/snapshots/parser__parse@const_basic.stef.snap +++ b/crates/stef-parser/tests/snapshots/parser__parse@const_basic.stef.snap @@ -10,7 +10,13 @@ Schema { comment: Comment( [], ), - name: "BOOL_TRUE", + name: Name { + value: "BOOL_TRUE", + span: Span { + start: 6, + end: 15, + }, + }, ty: Bool, value: Bool( true, @@ -22,7 +28,13 @@ Schema { comment: Comment( [], ), - name: "BOOL_FALSE", + name: Name { + value: "BOOL_FALSE", + span: Span { + start: 36, + end: 46, + }, + }, ty: Bool, value: Bool( false, @@ -34,7 +46,13 @@ Schema { comment: Comment( [], ), - name: "INT", + name: Name { + value: "INT", + span: Span { + start: 68, + end: 71, + }, + }, ty: U32, value: Int( 100, @@ -46,7 +64,13 @@ Schema { comment: Comment( [], ), - name: "FLOAT", + name: Name { + value: "FLOAT", + span: Span { + start: 90, + end: 95, + }, + }, ty: F64, value: Float( 5.5, @@ -58,7 +82,13 @@ Schema { comment: Comment( [], ), - name: "STRING", + name: Name { + value: "STRING", + span: Span { + start: 114, + end: 120, + }, + }, ty: String, value: String( "value", @@ -70,7 +100,13 @@ Schema { comment: Comment( [], ), - name: "BYTES", + name: Name { + value: "BYTES", + span: Span { + start: 146, + end: 151, + }, + }, ty: Bytes, value: Bytes( [ diff --git a/crates/stef-parser/tests/snapshots/parser__parse@const_string.stef.snap b/crates/stef-parser/tests/snapshots/parser__parse@const_string.stef.snap index 587ebc5..ffe8fd5 100644 --- a/crates/stef-parser/tests/snapshots/parser__parse@const_string.stef.snap +++ b/crates/stef-parser/tests/snapshots/parser__parse@const_string.stef.snap @@ -10,7 +10,13 @@ Schema { comment: Comment( [], ), - name: "SIMPLE", + name: Name { + value: "SIMPLE", + span: Span { + start: 6, + end: 12, + }, + }, ty: String, value: String( "value", @@ -22,7 +28,13 @@ Schema { comment: Comment( [], ), - name: "NEWLINE_ESCAPE", + name: Name { + value: "NEWLINE_ESCAPE", + span: Span { + start: 39, + end: 53, + }, + }, ty: String, value: String( "one two three", @@ -34,7 +46,13 @@ Schema { comment: Comment( [], ), - name: "ESCAPES", + name: Name { + value: "ESCAPES", + span: Span { + start: 102, + end: 109, + }, + }, ty: String, value: String( "escape basics \r\n \t \u{8} \u{c} \\ \"hello\" \nunicode ❤ emoji ❤ ", @@ -46,7 +64,13 @@ Schema { comment: Comment( [], ), - name: "MULTILINE", + name: Name { + value: "MULTILINE", + span: Span { + start: 222, + end: 231, + }, + }, ty: String, value: String( "a\n b\n c\n", diff --git a/crates/stef-parser/tests/snapshots/parser__parse@enum_basic.stef.snap b/crates/stef-parser/tests/snapshots/parser__parse@enum_basic.stef.snap index 65019cd..7ced041 100644 --- a/crates/stef-parser/tests/snapshots/parser__parse@enum_basic.stef.snap +++ b/crates/stef-parser/tests/snapshots/parser__parse@enum_basic.stef.snap @@ -15,7 +15,13 @@ Schema { attributes: Attributes( [], ), - name: "Sample", + name: Name { + value: "Sample", + span: Span { + start: 22, + end: 28, + }, + }, generics: Generics( [], ), diff --git a/crates/stef-parser/tests/snapshots/parser__parse@enum_generics.stef.snap b/crates/stef-parser/tests/snapshots/parser__parse@enum_generics.stef.snap index 6d198e1..3d8f3bd 100644 --- a/crates/stef-parser/tests/snapshots/parser__parse@enum_generics.stef.snap +++ b/crates/stef-parser/tests/snapshots/parser__parse@enum_generics.stef.snap @@ -15,7 +15,13 @@ Schema { attributes: Attributes( [], ), - name: "Sample", + name: Name { + value: "Sample", + span: Span { + start: 29, + end: 35, + }, + }, generics: Generics( [ Name { diff --git a/crates/stef-parser/tests/snapshots/parser__parse@enum_many_ws.stef.snap b/crates/stef-parser/tests/snapshots/parser__parse@enum_many_ws.stef.snap index b14226a..e8de916 100644 --- a/crates/stef-parser/tests/snapshots/parser__parse@enum_many_ws.stef.snap +++ b/crates/stef-parser/tests/snapshots/parser__parse@enum_many_ws.stef.snap @@ -15,7 +15,13 @@ Schema { attributes: Attributes( [], ), - name: "Sample", + name: Name { + value: "Sample", + span: Span { + start: 29, + end: 35, + }, + }, generics: Generics( [], ), diff --git a/crates/stef-parser/tests/snapshots/parser__parse@enum_min_ws.stef.snap b/crates/stef-parser/tests/snapshots/parser__parse@enum_min_ws.stef.snap index e7dc579..8e92508 100644 --- a/crates/stef-parser/tests/snapshots/parser__parse@enum_min_ws.stef.snap +++ b/crates/stef-parser/tests/snapshots/parser__parse@enum_min_ws.stef.snap @@ -13,7 +13,13 @@ Schema { attributes: Attributes( [], ), - name: "Sample", + name: Name { + value: "Sample", + span: Span { + start: 5, + end: 11, + }, + }, generics: Generics( [ Name { diff --git a/crates/stef-parser/tests/snapshots/parser__parse@import_basic.stef.snap b/crates/stef-parser/tests/snapshots/parser__parse@import_basic.stef.snap index 7bddf1d..a297d9f 100644 --- a/crates/stef-parser/tests/snapshots/parser__parse@import_basic.stef.snap +++ b/crates/stef-parser/tests/snapshots/parser__parse@import_basic.stef.snap @@ -12,7 +12,13 @@ Schema { "schema", ], element: Some( - "Sample", + Name { + value: "Sample", + span: Span { + start: 19, + end: 25, + }, + }, ), }, ), diff --git a/crates/stef-parser/tests/snapshots/parser__parse@module_basic.stef.snap b/crates/stef-parser/tests/snapshots/parser__parse@module_basic.stef.snap index 14f1560..3039c5c 100644 --- a/crates/stef-parser/tests/snapshots/parser__parse@module_basic.stef.snap +++ b/crates/stef-parser/tests/snapshots/parser__parse@module_basic.stef.snap @@ -10,7 +10,13 @@ Schema { comment: Comment( [], ), - name: "a", + name: Name { + value: "a", + span: Span { + start: 4, + end: 5, + }, + }, definitions: [ Module( Module { @@ -19,7 +25,13 @@ Schema { "Inner module", ], ), - name: "b", + name: Name { + value: "b", + span: Span { + start: 37, + end: 38, + }, + }, definitions: [ Enum( Enum { @@ -29,7 +41,13 @@ Schema { attributes: Attributes( [], ), - name: "Sample", + name: Name { + value: "Sample", + span: Span { + start: 54, + end: 60, + }, + }, generics: Generics( [], ), @@ -72,7 +90,13 @@ Schema { attributes: Attributes( [], ), - name: "Sample", + name: Name { + value: "Sample", + span: Span { + start: 111, + end: 117, + }, + }, generics: Generics( [], ), diff --git a/crates/stef-parser/tests/snapshots/parser__parse@schema_basic.stef.snap b/crates/stef-parser/tests/snapshots/parser__parse@schema_basic.stef.snap index da6c919..09bd773 100644 --- a/crates/stef-parser/tests/snapshots/parser__parse@schema_basic.stef.snap +++ b/crates/stef-parser/tests/snapshots/parser__parse@schema_basic.stef.snap @@ -15,7 +15,13 @@ Schema { attributes: Attributes( [], ), - name: "SampleStruct", + name: Name { + value: "SampleStruct", + span: Span { + start: 25, + end: 37, + }, + }, generics: Generics( [], ), @@ -83,7 +89,13 @@ Schema { attributes: Attributes( [], ), - name: "SampleEnum", + name: Name { + value: "SampleEnum", + span: Span { + start: 96, + end: 106, + }, + }, generics: Generics( [], ), diff --git a/crates/stef-parser/tests/snapshots/parser__parse@struct_basic.stef.snap b/crates/stef-parser/tests/snapshots/parser__parse@struct_basic.stef.snap index 885acbc..dc0a1c2 100644 --- a/crates/stef-parser/tests/snapshots/parser__parse@struct_basic.stef.snap +++ b/crates/stef-parser/tests/snapshots/parser__parse@struct_basic.stef.snap @@ -15,7 +15,13 @@ Schema { attributes: Attributes( [], ), - name: "Sample", + name: Name { + value: "Sample", + span: Span { + start: 25, + end: 31, + }, + }, generics: Generics( [], ), diff --git a/crates/stef-parser/tests/snapshots/parser__parse@struct_generics.stef.snap b/crates/stef-parser/tests/snapshots/parser__parse@struct_generics.stef.snap index 0687b20..a6860a4 100644 --- a/crates/stef-parser/tests/snapshots/parser__parse@struct_generics.stef.snap +++ b/crates/stef-parser/tests/snapshots/parser__parse@struct_generics.stef.snap @@ -15,7 +15,13 @@ Schema { attributes: Attributes( [], ), - name: "KeyValue", + name: Name { + value: "KeyValue", + span: Span { + start: 35, + end: 43, + }, + }, generics: Generics( [ Name { diff --git a/crates/stef-parser/tests/snapshots/parser__parse@struct_many_ws.stef.snap b/crates/stef-parser/tests/snapshots/parser__parse@struct_many_ws.stef.snap index 857c145..ab24df1 100644 --- a/crates/stef-parser/tests/snapshots/parser__parse@struct_many_ws.stef.snap +++ b/crates/stef-parser/tests/snapshots/parser__parse@struct_many_ws.stef.snap @@ -15,7 +15,13 @@ Schema { attributes: Attributes( [], ), - name: "Sample", + name: Name { + value: "Sample", + span: Span { + start: 38, + end: 44, + }, + }, generics: Generics( [ Name { diff --git a/crates/stef-parser/tests/snapshots/parser__parse@struct_min_ws.stef.snap b/crates/stef-parser/tests/snapshots/parser__parse@struct_min_ws.stef.snap index 61f4d20..4662cbb 100644 --- a/crates/stef-parser/tests/snapshots/parser__parse@struct_min_ws.stef.snap +++ b/crates/stef-parser/tests/snapshots/parser__parse@struct_min_ws.stef.snap @@ -13,7 +13,13 @@ Schema { attributes: Attributes( [], ), - name: "Sample", + name: Name { + value: "Sample", + span: Span { + start: 7, + end: 13, + }, + }, generics: Generics( [ Name { diff --git a/crates/stef-parser/tests/snapshots/parser__parse@struct_tuple.stef.snap b/crates/stef-parser/tests/snapshots/parser__parse@struct_tuple.stef.snap index ee04adb..77c1aac 100644 --- a/crates/stef-parser/tests/snapshots/parser__parse@struct_tuple.stef.snap +++ b/crates/stef-parser/tests/snapshots/parser__parse@struct_tuple.stef.snap @@ -15,7 +15,13 @@ Schema { attributes: Attributes( [], ), - name: "Sample", + name: Name { + value: "Sample", + span: Span { + start: 25, + end: 31, + }, + }, generics: Generics( [], ), diff --git a/crates/stef-parser/tests/snapshots/parser__parse@types_basic.stef.snap b/crates/stef-parser/tests/snapshots/parser__parse@types_basic.stef.snap index ad26b9b..1686dde 100644 --- a/crates/stef-parser/tests/snapshots/parser__parse@types_basic.stef.snap +++ b/crates/stef-parser/tests/snapshots/parser__parse@types_basic.stef.snap @@ -13,7 +13,13 @@ Schema { attributes: Attributes( [], ), - name: "Sample", + name: Name { + value: "Sample", + span: Span { + start: 7, + end: 13, + }, + }, generics: Generics( [], ), diff --git a/crates/stef-parser/tests/snapshots/parser__parse@types_generic.stef.snap b/crates/stef-parser/tests/snapshots/parser__parse@types_generic.stef.snap index 6639a8f..8dfe208 100644 --- a/crates/stef-parser/tests/snapshots/parser__parse@types_generic.stef.snap +++ b/crates/stef-parser/tests/snapshots/parser__parse@types_generic.stef.snap @@ -13,7 +13,13 @@ Schema { attributes: Attributes( [], ), - name: "Sample", + name: Name { + value: "Sample", + span: Span { + start: 7, + end: 13, + }, + }, generics: Generics( [], ), diff --git a/crates/stef-parser/tests/snapshots/parser__parse@types_nested.stef.snap b/crates/stef-parser/tests/snapshots/parser__parse@types_nested.stef.snap index 6851984..e440292 100644 --- a/crates/stef-parser/tests/snapshots/parser__parse@types_nested.stef.snap +++ b/crates/stef-parser/tests/snapshots/parser__parse@types_nested.stef.snap @@ -13,7 +13,13 @@ Schema { attributes: Attributes( [], ), - name: "Sample", + name: Name { + value: "Sample", + span: Span { + start: 7, + end: 13, + }, + }, generics: Generics( [], ), diff --git a/crates/stef-parser/tests/snapshots/parser__parse@types_non_zero.stef.snap b/crates/stef-parser/tests/snapshots/parser__parse@types_non_zero.stef.snap index f4cb3fc..92b1772 100644 --- a/crates/stef-parser/tests/snapshots/parser__parse@types_non_zero.stef.snap +++ b/crates/stef-parser/tests/snapshots/parser__parse@types_non_zero.stef.snap @@ -13,7 +13,13 @@ Schema { attributes: Attributes( [], ), - name: "Sample", + name: Name { + value: "Sample", + span: Span { + start: 7, + end: 13, + }, + }, generics: Generics( [], ), diff --git a/crates/stef-parser/tests/snapshots/parser__parse@types_ref.stef.snap b/crates/stef-parser/tests/snapshots/parser__parse@types_ref.stef.snap index 980319f..416e594 100644 --- a/crates/stef-parser/tests/snapshots/parser__parse@types_ref.stef.snap +++ b/crates/stef-parser/tests/snapshots/parser__parse@types_ref.stef.snap @@ -13,7 +13,13 @@ Schema { attributes: Attributes( [], ), - name: "Sample", + name: Name { + value: "Sample", + span: Span { + start: 7, + end: 13, + }, + }, generics: Generics( [], ), @@ -94,7 +100,13 @@ Schema { attributes: Attributes( [], ), - name: "Test123", + name: Name { + value: "Test123", + span: Span { + start: 90, + end: 97, + }, + }, generics: Generics( [], ), @@ -134,7 +146,13 @@ Schema { attributes: Attributes( [], ), - name: "KeyValue", + name: Name { + value: "KeyValue", + span: Span { + start: 124, + end: 132, + }, + }, generics: Generics( [ Name {