From d0ba7c02c9f071160476e4fbd1440f014ff2bcd7 Mon Sep 17 00:00:00 2001 From: Christoph Burgdorf Date: Fri, 3 Jun 2022 15:59:05 +0200 Subject: [PATCH] Parse trait function signatures --- crates/analyzer/src/db/queries/contracts.rs | 4 +- crates/analyzer/src/db/queries/functions.rs | 18 +- crates/analyzer/src/db/queries/structs.rs | 4 +- crates/analyzer/src/namespace/items.rs | 11 +- crates/analyzer/src/namespace/scopes.rs | 1 + crates/mir/src/lower/function.rs | 2 + crates/parser/src/ast.rs | 25 +- crates/parser/src/grammar/functions.rs | 38 ++- crates/parser/src/grammar/types.rs | 13 +- crates/parser/src/lexer/token.rs | 2 +- .../cases__parse_ast__contract_def.snap | 56 ++--- .../snapshots/cases__parse_ast__fn_def.snap | 212 ++++++++-------- .../cases__parse_ast__fn_def_generic.snap | 226 +++++++++--------- .../cases__parse_ast__fn_def_pub.snap | 142 +++++------ .../cases__parse_ast__fn_def_pub_unsafe.snap | 148 ++++++------ .../cases__parse_ast__fn_def_unsafe.snap | 142 +++++------ .../cases__parse_ast__guest_book.snap | 200 ++++++++-------- ...cases__parse_ast__module_level_events.snap | 164 ++++++------- .../cases__parse_ast__module_stmts.snap | 148 ++++++------ .../cases__parse_ast__pub_contract_def.snap | 56 ++--- .../cases__parse_ast__struct_def.snap | 108 +++++---- .../fixtures/features/generic_functions.fe | 5 + 22 files changed, 899 insertions(+), 826 deletions(-) diff --git a/crates/analyzer/src/db/queries/contracts.rs b/crates/analyzer/src/db/queries/contracts.rs index 43ad43ce26..2c6a18dfe3 100644 --- a/crates/analyzer/src/db/queries/contracts.rs +++ b/crates/analyzer/src/db/queries/contracts.rs @@ -53,7 +53,7 @@ pub fn contract_function_map( def_name, &NamedThing::Item(Item::Event(event)), Some(event.name_span(db)), - def.kind.name.span, + def.kind.sig.name.span, ); continue; } @@ -64,7 +64,7 @@ pub fn contract_function_map( def_name, &named_item, named_item.name_span(db), - def.kind.name.span, + def.kind.sig.name.span, ); continue; } diff --git a/crates/analyzer/src/db/queries/functions.rs b/crates/analyzer/src/db/queries/functions.rs index ac7c8906bc..d8f90c3ed1 100644 --- a/crates/analyzer/src/db/queries/functions.rs +++ b/crates/analyzer/src/db/queries/functions.rs @@ -36,7 +36,7 @@ pub fn function_signature( scope.fancy_error( "generic function parameters aren't yet supported in contract functions", vec![Label::primary( - function.data(db).ast.kind.generic_params.span, + function.data(db).ast.kind.sig.generic_params.span, "This can not appear here", )], vec!["Hint: Struct functions can have generic parameters".into()], @@ -44,6 +44,7 @@ pub fn function_signature( } let params = def + .sig .args .iter() .enumerate() @@ -114,9 +115,9 @@ pub fn function_signature( if label.kind != "_"; if let Some(dup_idx) = labels.get(&label.kind); then { - let dup_arg: &Node = &def.args[*dup_idx]; + let dup_arg: &Node = &def.sig.args[*dup_idx]; scope.fancy_error( - &format!("duplicate parameter labels in function `{}`", def.name.kind), + &format!("duplicate parameter labels in function `{}`", def.sig.name.kind), vec![ Label::primary(dup_arg.span, "the label `{}` was first used here"), Label::primary(label.span, "label `{}` used again here"), @@ -138,9 +139,9 @@ pub fn function_signature( ); None } else if let Some(dup_idx) = names.get(®.name.kind) { - let dup_arg: &Node = &def.args[*dup_idx]; + let dup_arg: &Node = &def.sig.args[*dup_idx]; scope.duplicate_name_error( - &format!("duplicate parameter names in function `{}`", def.name.kind), + &format!("duplicate parameter names in function `{}`", def.sig.name.kind), ®.name.kind, dup_arg.span, arg.span, @@ -159,10 +160,11 @@ pub fn function_signature( .collect(); let return_type = def + .sig .return_type .as_ref() .map(|type_node| { - let fn_name = &def.name.kind; + let fn_name = &def.sig.name.kind; if fn_name == "__init__" || fn_name == "__call__" { // `__init__` and `__call__` must not return any type other than `()`. if type_node.kind != ast::TypeDesc::Unit { @@ -254,11 +256,11 @@ pub fn function_body(db: &dyn AnalyzerDb, function: FunctionId) -> Analysis Span { - self.data(db).ast.kind.name.span + self.data(db).ast.kind.sig.name.span } // This should probably be scrapped in favor of `parent(` @@ -1130,6 +1130,7 @@ impl FunctionId { self.data(db) .ast .kind + .sig .args .iter() .find_map(|arg| matches!(arg.kind, ast::FunctionArg::Self_).then(|| arg.span)) @@ -1139,11 +1140,11 @@ impl FunctionId { } pub fn is_generic(&self, db: &dyn AnalyzerDb) -> bool { - !self.data(db).ast.kind.generic_params.kind.is_empty() + !self.data(db).ast.kind.sig.generic_params.kind.is_empty() } pub fn generic_params(&self, db: &dyn AnalyzerDb) -> Vec { - self.data(db).ast.kind.generic_params.kind.clone() + self.data(db).ast.kind.sig.generic_params.kind.clone() } pub fn generic_param(&self, db: &dyn AnalyzerDb, param_name: &str) -> Option { @@ -1164,13 +1165,13 @@ impl FunctionId { self.name(db) == "__init__" } pub fn pub_span(&self, db: &dyn AnalyzerDb) -> Option { - self.data(db).ast.kind.pub_ + self.data(db).ast.kind.sig.pub_ } pub fn is_unsafe(&self, db: &dyn AnalyzerDb) -> bool { self.unsafe_span(db).is_some() } pub fn unsafe_span(&self, db: &dyn AnalyzerDb) -> Option { - self.data(db).ast.kind.unsafe_ + self.data(db).ast.kind.sig.unsafe_ } pub fn signature(&self, db: &dyn AnalyzerDb) -> Rc { db.function_signature(*self).value diff --git a/crates/analyzer/src/namespace/scopes.rs b/crates/analyzer/src/namespace/scopes.rs index 48f03ece9c..30f417da8c 100644 --- a/crates/analyzer/src/namespace/scopes.rs +++ b/crates/analyzer/src/namespace/scopes.rs @@ -309,6 +309,7 @@ impl<'a> AnalyzerContext for FunctionScope<'a> { .data(self.db) .ast .kind + .sig .args .iter() .find_map(|param| (param.name() == name).then(|| param.name_span())) diff --git a/crates/mir/src/lower/function.rs b/crates/mir/src/lower/function.rs index 7562523816..218d8c1a2c 100644 --- a/crates/mir/src/lower/function.rs +++ b/crates/mir/src/lower/function.rs @@ -1191,6 +1191,7 @@ fn self_arg_source(db: &dyn MirDb, func: analyzer_items::FunctionId) -> SourceIn func.data(db.upcast()) .ast .kind + .sig .args .iter() .find(|arg| matches!(arg.kind, ast::FunctionArg::Self_)) @@ -1202,6 +1203,7 @@ fn arg_source(db: &dyn MirDb, func: analyzer_items::FunctionId, arg_name: &str) func.data(db.upcast()) .ast .kind + .sig .args .iter() .find_map(|arg| match &arg.kind { diff --git a/crates/parser/src/ast.rs b/crates/parser/src/ast.rs index cad4a21915..573b1d9e05 100644 --- a/crates/parser/src/ast.rs +++ b/crates/parser/src/ast.rs @@ -92,6 +92,7 @@ pub struct Struct { #[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)] pub struct Trait { pub name: Node, + pub functions: Vec>, pub pub_qual: Option, } @@ -180,7 +181,7 @@ pub struct Event { } #[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)] -pub struct Function { +pub struct FunctionSignature { // qualifier order: `pub unsafe fn` pub pub_: Option, pub unsafe_: Option, @@ -188,6 +189,11 @@ pub struct Function { pub generic_params: Node>, pub args: Vec>, pub return_type: Option>, +} + +#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)] +pub struct Function { + pub sig: FunctionSignature, pub body: Vec>, } @@ -404,7 +410,7 @@ impl Node { impl Node { pub fn name(&self) -> &str { - &self.kind.name.kind + &self.kind.sig.name.kind } } @@ -730,12 +736,15 @@ impl fmt::Display for Node { impl fmt::Display for Function { fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { let Function { - pub_, - unsafe_, - name, - generic_params, - args, - return_type, + sig: + FunctionSignature { + pub_, + unsafe_, + name, + generic_params, + args, + return_type, + }, body, } = self; diff --git a/crates/parser/src/grammar/functions.rs b/crates/parser/src/grammar/functions.rs index e0c872f270..889584270e 100644 --- a/crates/parser/src/grammar/functions.rs +++ b/crates/parser/src/grammar/functions.rs @@ -2,15 +2,18 @@ use super::expressions::{parse_call_args, parse_expr}; use super::types::parse_type_desc; use crate::ast::{ - BinOperator, Expr, FuncStmt, Function, FunctionArg, GenericParameter, RegularFunctionArg, - TypeDesc, VarDeclTarget, + BinOperator, Expr, FuncStmt, Function, FunctionArg, FunctionSignature, GenericParameter, + RegularFunctionArg, TypeDesc, VarDeclTarget, }; use crate::node::{Node, Span}; use crate::{Label, ParseFailed, ParseResult, Parser, TokenKind}; -/// Parse a function definition. The optional `pub` qualifier must be parsed by +/// Parse a function definition without a body. The optional `pub` qualifier must be parsed by /// the caller, and passed in. Next token must be `unsafe` or `fn`. -pub fn parse_fn_def(par: &mut Parser, mut pub_qual: Option) -> ParseResult> { +pub fn parse_fn_sig( + par: &mut Parser, + mut pub_qual: Option, +) -> ParseResult> { let unsafe_qual = par.optional(TokenKind::Unsafe).map(|tok| tok.span); if let Some(pub_) = par.optional(TokenKind::Pub) { let unsafe_span = @@ -84,22 +87,35 @@ pub fn parse_fn_def(par: &mut Parser, mut pub_qual: Option) -> ParseResult None }; - // TODO: allow multi-line return type? `fn f()\n ->\n u8` - par.enter_block(span, "function definition")?; - let body = parse_block_stmts(par)?; - let rbrace = par.expect(TokenKind::BraceClose, "missing `}` in fn definition")?; - Ok(Node::new( - Function { + FunctionSignature { pub_: pub_qual, unsafe_: unsafe_qual, name: name.into(), args, generic_params, return_type, + }, + span, + )) +} + +/// Parse a function definition. The optional `pub` qualifier must be parsed by +/// the caller, and passed in. Next token must be `unsafe` or `fn`. +pub fn parse_fn_def(par: &mut Parser, pub_qual: Option) -> ParseResult> { + let sig = parse_fn_sig(par, pub_qual)?; + + // TODO: allow multi-line return type? `fn f()\n ->\n u8` + par.enter_block(sig.span, "function definition")?; + let body = parse_block_stmts(par)?; + let rbrace = par.expect(TokenKind::BraceClose, "missing `}` in fn definition")?; + + Ok(Node::new( + Function { + sig: sig.kind, body, }, - span + rbrace.span, + sig.span + rbrace.span, )) } diff --git a/crates/parser/src/grammar/types.rs b/crates/parser/src/grammar/types.rs index afcf98e3fe..6f2f39f6c2 100644 --- a/crates/parser/src/grammar/types.rs +++ b/crates/parser/src/grammar/types.rs @@ -1,6 +1,6 @@ use crate::ast::{self, EventField, Field, GenericArg, Impl, Path, Trait, TypeAlias, TypeDesc}; use crate::grammar::expressions::parse_expr; -use crate::grammar::functions::parse_fn_def; +use crate::grammar::functions::{parse_fn_def, parse_fn_sig}; use crate::node::{Node, Span}; use crate::Token; use crate::{ParseFailed, ParseResult, Parser, TokenKind}; @@ -78,12 +78,20 @@ pub fn parse_trait_def(par: &mut Parser, trait_pub_qual: Option) -> ParseR )?; let header_span = trait_tok.span + trait_name.span; + let mut functions = vec![]; par.enter_block(header_span, "trait definition")?; loop { match par.peek_or_err()? { TokenKind::Fn => { - // TODO: parse trait functions + // TODO: Traits should also be allowed to have functions that do contain a body. + functions.push(parse_fn_sig(par, None)?); + par.expect_with_notes( + TokenKind::Semi, + "failed to parse trait definition", + |_| vec!["Note: trait functions must appear without body and followed by a semicolon.".into()], + )?; + par.eat_newlines(); } TokenKind::BraceClose => { par.next()?; @@ -101,6 +109,7 @@ pub fn parse_trait_def(par: &mut Parser, trait_pub_qual: Option) -> ParseR Ok(Node::new( Trait { name: Node::new(trait_name.text.into(), trait_name.span), + functions, pub_qual: trait_pub_qual, }, span, diff --git a/crates/parser/src/lexer/token.rs b/crates/parser/src/lexer/token.rs index 561afda918..92b380f251 100644 --- a/crates/parser/src/lexer/token.rs +++ b/crates/parser/src/lexer/token.rs @@ -261,7 +261,7 @@ impl TokenKind { Colon => "symbol `:`", ColonColon => "symbol `::`", Comma => "symbol `,`", - Semi => "symbol ``", + Semi => "symbol `;`", Plus => "symbol `+`", Minus => "symbol `-`", Star => "symbol `*`", diff --git a/crates/parser/tests/cases/snapshots/cases__parse_ast__contract_def.snap b/crates/parser/tests/cases/snapshots/cases__parse_ast__contract_def.snap index 9155669950..e9e837adab 100644 --- a/crates/parser/tests/cases/snapshots/cases__parse_ast__contract_def.snap +++ b/crates/parser/tests/cases/snapshots/cases__parse_ast__contract_def.snap @@ -1,6 +1,6 @@ --- source: crates/parser/tests/cases/parse_ast.rs -expression: "ast_string(stringify!(contract_def), try_parse_module,\n r#\"contract Foo {\n x: address\n pub y: u8\n pub const z: Map\n\n pub fn foo() -> u8 {\n return 10\n }\n event Bar {\n idx from: address\n }\n}\n\"#)" +expression: "ast_string(stringify!(contract_def), try_parse_module,\n r#\"contract Foo {\n x: address\n pub y: u8\n pub const z: Map\n\n pub fn foo() -> u8 {\n return 10\n }\n event Bar {\n idx from: address\n }\n}\n\"#)" --- Node( @@ -133,35 +133,37 @@ Node( body: [ Function(Node( kind: Function( - pub_: Some(Span( - start: 75, - end: 78, - )), - unsafe_: None, - name: Node( - kind: "foo", - span: Span( - start: 82, - end: 85, + sig: FunctionSignature( + pub_: Some(Span( + start: 75, + end: 78, + )), + unsafe_: None, + name: Node( + kind: "foo", + span: Span( + start: 82, + end: 85, + ), ), - ), - generic_params: Node( - kind: [], - span: Span( - start: 82, - end: 85, + generic_params: Node( + kind: [], + span: Span( + start: 82, + end: 85, + ), ), + args: [], + return_type: Some(Node( + kind: Base( + base: "u8", + ), + span: Span( + start: 91, + end: 93, + ), + )), ), - args: [], - return_type: Some(Node( - kind: Base( - base: "u8", - ), - span: Span( - start: 91, - end: 93, - ), - )), body: [ Node( kind: Return( diff --git a/crates/parser/tests/cases/snapshots/cases__parse_ast__fn_def.snap b/crates/parser/tests/cases/snapshots/cases__parse_ast__fn_def.snap index 9805e19812..df08a262a5 100644 --- a/crates/parser/tests/cases/snapshots/cases__parse_ast__fn_def.snap +++ b/crates/parser/tests/cases/snapshots/cases__parse_ast__fn_def.snap @@ -1,6 +1,6 @@ --- source: crates/parser/tests/cases/parse_ast.rs -expression: "ast_string(stringify!(fn_def), try_parse_module,\n \"fn transfer(from sender: address, to recip: address, _ val: u64) -> bool {\\n false \\n}\")" +expression: "ast_string(stringify!(fn_def), try_parse_module,\n \"fn transfer(from sender: address, to recip: address, _ val: u64) -> bool {\\n false \\n}\")" --- Node( @@ -8,126 +8,128 @@ Node( body: [ Function(Node( kind: Function( - pub_: None, - unsafe_: None, - name: Node( - kind: "transfer", - span: Span( - start: 3, - end: 11, - ), - ), - generic_params: Node( - kind: [], - span: Span( - start: 3, - end: 11, + sig: FunctionSignature( + pub_: None, + unsafe_: None, + name: Node( + kind: "transfer", + span: Span( + start: 3, + end: 11, + ), ), - ), - args: [ - Node( - kind: Regular(RegularFunctionArg( - label: Some(Node( - kind: "from", - span: Span( - start: 12, - end: 16, - ), - )), - name: Node( - kind: "sender", - span: Span( - start: 17, - end: 23, - ), - ), - typ: Node( - kind: Base( - base: "address", - ), - span: Span( - start: 25, - end: 32, - ), - ), - )), + generic_params: Node( + kind: [], span: Span( - start: 17, - end: 32, + start: 3, + end: 11, ), ), - Node( - kind: Regular(RegularFunctionArg( - label: Some(Node( - kind: "to", - span: Span( - start: 34, - end: 36, - ), - )), - name: Node( - kind: "recip", - span: Span( - start: 37, - end: 42, + args: [ + Node( + kind: Regular(RegularFunctionArg( + label: Some(Node( + kind: "from", + span: Span( + start: 12, + end: 16, + ), + )), + name: Node( + kind: "sender", + span: Span( + start: 17, + end: 23, + ), ), - ), - typ: Node( - kind: Base( - base: "address", - ), - span: Span( - start: 44, - end: 51, + typ: Node( + kind: Base( + base: "address", + ), + span: Span( + start: 25, + end: 32, + ), ), + )), + span: Span( + start: 17, + end: 32, ), - )), - span: Span( - start: 37, - end: 51, ), - ), - Node( - kind: Regular(RegularFunctionArg( - label: Some(Node( - kind: "_", - span: Span( - start: 53, - end: 54, + Node( + kind: Regular(RegularFunctionArg( + label: Some(Node( + kind: "to", + span: Span( + start: 34, + end: 36, + ), + )), + name: Node( + kind: "recip", + span: Span( + start: 37, + end: 42, + ), ), - )), - name: Node( - kind: "val", - span: Span( - start: 55, - end: 58, + typ: Node( + kind: Base( + base: "address", + ), + span: Span( + start: 44, + end: 51, + ), ), + )), + span: Span( + start: 37, + end: 51, ), - typ: Node( - kind: Base( - base: "u64", + ), + Node( + kind: Regular(RegularFunctionArg( + label: Some(Node( + kind: "_", + span: Span( + start: 53, + end: 54, + ), + )), + name: Node( + kind: "val", + span: Span( + start: 55, + end: 58, + ), ), - span: Span( - start: 60, - end: 63, + typ: Node( + kind: Base( + base: "u64", + ), + span: Span( + start: 60, + end: 63, + ), ), + )), + span: Span( + start: 55, + end: 63, ), - )), + ), + ], + return_type: Some(Node( + kind: Base( + base: "bool", + ), span: Span( - start: 55, - end: 63, + start: 68, + end: 72, ), - ), - ], - return_type: Some(Node( - kind: Base( - base: "bool", - ), - span: Span( - start: 68, - end: 72, - ), - )), + )), + ), body: [ Node( kind: Expr( diff --git a/crates/parser/tests/cases/snapshots/cases__parse_ast__fn_def_generic.snap b/crates/parser/tests/cases/snapshots/cases__parse_ast__fn_def_generic.snap index 43a5edaf1f..1d677fb141 100644 --- a/crates/parser/tests/cases/snapshots/cases__parse_ast__fn_def_generic.snap +++ b/crates/parser/tests/cases/snapshots/cases__parse_ast__fn_def_generic.snap @@ -8,140 +8,142 @@ Node( body: [ Function(Node( kind: Function( - pub_: None, - unsafe_: None, - name: Node( - kind: "foo", - span: Span( - start: 3, - end: 6, - ), - ), - generic_params: Node( - kind: [ - Unbounded(Node( - kind: "T", - span: Span( - start: 7, - end: 8, - ), - )), - Bounded( - name: Node( - kind: "R", - span: Span( - start: 10, - end: 11, - ), - ), - bound: Node( - kind: Base( - base: "Event", - ), - span: Span( - start: 13, - end: 18, - ), - ), + sig: FunctionSignature( + pub_: None, + unsafe_: None, + name: Node( + kind: "foo", + span: Span( + start: 3, + end: 6, ), - ], - span: Span( - start: 6, - end: 19, ), - ), - args: [ - Node( - kind: Regular(RegularFunctionArg( - label: None, - name: Node( - kind: "this", + generic_params: Node( + kind: [ + Unbounded(Node( + kind: "T", span: Span( - start: 20, - end: 24, + start: 7, + end: 8, ), - ), - typ: Node( - kind: Base( - base: "T", + )), + Bounded( + name: Node( + kind: "R", + span: Span( + start: 10, + end: 11, + ), ), - span: Span( - start: 26, - end: 27, + bound: Node( + kind: Base( + base: "Event", + ), + span: Span( + start: 13, + end: 18, + ), ), ), - )), + ], span: Span( - start: 20, - end: 27, + start: 6, + end: 19, ), ), - Node( - kind: Regular(RegularFunctionArg( - label: None, - name: Node( - kind: "that", - span: Span( - start: 29, - end: 33, + args: [ + Node( + kind: Regular(RegularFunctionArg( + label: None, + name: Node( + kind: "this", + span: Span( + start: 20, + end: 24, + ), ), - ), - typ: Node( - kind: Base( - base: "R", - ), - span: Span( - start: 35, - end: 36, + typ: Node( + kind: Base( + base: "T", + ), + span: Span( + start: 26, + end: 27, + ), ), + )), + span: Span( + start: 20, + end: 27, ), - )), - span: Span( - start: 29, - end: 36, ), - ), - Node( - kind: Regular(RegularFunctionArg( - label: Some(Node( - kind: "_", - span: Span( - start: 38, - end: 39, + Node( + kind: Regular(RegularFunctionArg( + label: None, + name: Node( + kind: "that", + span: Span( + start: 29, + end: 33, + ), ), - )), - name: Node( - kind: "val", - span: Span( - start: 40, - end: 43, + typ: Node( + kind: Base( + base: "R", + ), + span: Span( + start: 35, + end: 36, + ), ), + )), + span: Span( + start: 29, + end: 36, ), - typ: Node( - kind: Base( - base: "u64", + ), + Node( + kind: Regular(RegularFunctionArg( + label: Some(Node( + kind: "_", + span: Span( + start: 38, + end: 39, + ), + )), + name: Node( + kind: "val", + span: Span( + start: 40, + end: 43, + ), ), - span: Span( - start: 45, - end: 48, + typ: Node( + kind: Base( + base: "u64", + ), + span: Span( + start: 45, + end: 48, + ), ), + )), + span: Span( + start: 40, + end: 48, ), - )), + ), + ], + return_type: Some(Node( + kind: Base( + base: "bool", + ), span: Span( - start: 40, - end: 48, + start: 53, + end: 57, ), - ), - ], - return_type: Some(Node( - kind: Base( - base: "bool", - ), - span: Span( - start: 53, - end: 57, - ), - )), + )), + ), body: [ Node( kind: Expr( diff --git a/crates/parser/tests/cases/snapshots/cases__parse_ast__fn_def_pub.snap b/crates/parser/tests/cases/snapshots/cases__parse_ast__fn_def_pub.snap index ce4cf5375b..9b4b4104fb 100644 --- a/crates/parser/tests/cases/snapshots/cases__parse_ast__fn_def_pub.snap +++ b/crates/parser/tests/cases/snapshots/cases__parse_ast__fn_def_pub.snap @@ -1,6 +1,6 @@ --- source: crates/parser/tests/cases/parse_ast.rs -expression: "ast_string(stringify!(fn_def_pub), try_parse_module,\n \"pub fn foo21(x: bool, y: address,) -> bool { x }\")" +expression: "ast_string(stringify!(fn_def_pub), try_parse_module,\n \"pub fn foo21(x: bool, y: address,) -> bool { x }\")" --- Node( @@ -8,86 +8,88 @@ Node( body: [ Function(Node( kind: Function( - pub_: Some(Span( - start: 0, - end: 3, - )), - unsafe_: None, - name: Node( - kind: "foo21", - span: Span( - start: 7, - end: 12, - ), - ), - generic_params: Node( - kind: [], - span: Span( - start: 7, - end: 12, + sig: FunctionSignature( + pub_: Some(Span( + start: 0, + end: 3, + )), + unsafe_: None, + name: Node( + kind: "foo21", + span: Span( + start: 7, + end: 12, + ), ), - ), - args: [ - Node( - kind: Regular(RegularFunctionArg( - label: None, - name: Node( - kind: "x", - span: Span( - start: 13, - end: 14, - ), - ), - typ: Node( - kind: Base( - base: "bool", - ), - span: Span( - start: 16, - end: 20, - ), - ), - )), + generic_params: Node( + kind: [], span: Span( - start: 13, - end: 20, + start: 7, + end: 12, ), ), - Node( - kind: Regular(RegularFunctionArg( - label: None, - name: Node( - kind: "y", - span: Span( - start: 22, - end: 23, + args: [ + Node( + kind: Regular(RegularFunctionArg( + label: None, + name: Node( + kind: "x", + span: Span( + start: 13, + end: 14, + ), + ), + typ: Node( + kind: Base( + base: "bool", + ), + span: Span( + start: 16, + end: 20, + ), ), + )), + span: Span( + start: 13, + end: 20, ), - typ: Node( - kind: Base( - base: "address", + ), + Node( + kind: Regular(RegularFunctionArg( + label: None, + name: Node( + kind: "y", + span: Span( + start: 22, + end: 23, + ), ), - span: Span( - start: 25, - end: 32, + typ: Node( + kind: Base( + base: "address", + ), + span: Span( + start: 25, + end: 32, + ), ), + )), + span: Span( + start: 22, + end: 32, ), - )), + ), + ], + return_type: Some(Node( + kind: Base( + base: "bool", + ), span: Span( - start: 22, - end: 32, + start: 38, + end: 42, ), - ), - ], - return_type: Some(Node( - kind: Base( - base: "bool", - ), - span: Span( - start: 38, - end: 42, - ), - )), + )), + ), body: [ Node( kind: Expr( diff --git a/crates/parser/tests/cases/snapshots/cases__parse_ast__fn_def_pub_unsafe.snap b/crates/parser/tests/cases/snapshots/cases__parse_ast__fn_def_pub_unsafe.snap index 40008a51ad..842979006e 100644 --- a/crates/parser/tests/cases/snapshots/cases__parse_ast__fn_def_pub_unsafe.snap +++ b/crates/parser/tests/cases/snapshots/cases__parse_ast__fn_def_pub_unsafe.snap @@ -1,6 +1,6 @@ --- source: crates/parser/tests/cases/parse_ast.rs -expression: "ast_string(stringify!(fn_def_pub_unsafe), try_parse_module,\n \"pub unsafe fn foo21(x: bool, y: address,) -> bool{x}\")" +expression: "ast_string(stringify!(fn_def_pub_unsafe), try_parse_module,\n \"pub unsafe fn foo21(x: bool, y: address,) -> bool{x}\")" --- Node( @@ -8,89 +8,91 @@ Node( body: [ Function(Node( kind: Function( - pub_: Some(Span( - start: 0, - end: 3, - )), - unsafe_: Some(Span( - start: 4, - end: 10, - )), - name: Node( - kind: "foo21", - span: Span( - start: 14, - end: 19, - ), - ), - generic_params: Node( - kind: [], - span: Span( - start: 14, - end: 19, + sig: FunctionSignature( + pub_: Some(Span( + start: 0, + end: 3, + )), + unsafe_: Some(Span( + start: 4, + end: 10, + )), + name: Node( + kind: "foo21", + span: Span( + start: 14, + end: 19, + ), ), - ), - args: [ - Node( - kind: Regular(RegularFunctionArg( - label: None, - name: Node( - kind: "x", - span: Span( - start: 20, - end: 21, - ), - ), - typ: Node( - kind: Base( - base: "bool", - ), - span: Span( - start: 23, - end: 27, - ), - ), - )), + generic_params: Node( + kind: [], span: Span( - start: 20, - end: 27, + start: 14, + end: 19, ), ), - Node( - kind: Regular(RegularFunctionArg( - label: None, - name: Node( - kind: "y", - span: Span( - start: 29, - end: 30, + args: [ + Node( + kind: Regular(RegularFunctionArg( + label: None, + name: Node( + kind: "x", + span: Span( + start: 20, + end: 21, + ), + ), + typ: Node( + kind: Base( + base: "bool", + ), + span: Span( + start: 23, + end: 27, + ), ), + )), + span: Span( + start: 20, + end: 27, ), - typ: Node( - kind: Base( - base: "address", + ), + Node( + kind: Regular(RegularFunctionArg( + label: None, + name: Node( + kind: "y", + span: Span( + start: 29, + end: 30, + ), ), - span: Span( - start: 32, - end: 39, + typ: Node( + kind: Base( + base: "address", + ), + span: Span( + start: 32, + end: 39, + ), ), + )), + span: Span( + start: 29, + end: 39, ), - )), + ), + ], + return_type: Some(Node( + kind: Base( + base: "bool", + ), span: Span( - start: 29, - end: 39, + start: 45, + end: 49, ), - ), - ], - return_type: Some(Node( - kind: Base( - base: "bool", - ), - span: Span( - start: 45, - end: 49, - ), - )), + )), + ), body: [ Node( kind: Expr( diff --git a/crates/parser/tests/cases/snapshots/cases__parse_ast__fn_def_unsafe.snap b/crates/parser/tests/cases/snapshots/cases__parse_ast__fn_def_unsafe.snap index c381419f85..278a527c99 100644 --- a/crates/parser/tests/cases/snapshots/cases__parse_ast__fn_def_unsafe.snap +++ b/crates/parser/tests/cases/snapshots/cases__parse_ast__fn_def_unsafe.snap @@ -1,6 +1,6 @@ --- source: crates/parser/tests/cases/parse_ast.rs -expression: "ast_string(stringify!(fn_def_unsafe), try_parse_module,\n \"unsafe fn foo21(x: bool, y: address,) -> bool {\\n x\\n}\")" +expression: "ast_string(stringify!(fn_def_unsafe), try_parse_module,\n \"unsafe fn foo21(x: bool, y: address,) -> bool {\\n x\\n}\")" --- Node( @@ -8,86 +8,88 @@ Node( body: [ Function(Node( kind: Function( - pub_: None, - unsafe_: Some(Span( - start: 0, - end: 6, - )), - name: Node( - kind: "foo21", - span: Span( - start: 10, - end: 15, - ), - ), - generic_params: Node( - kind: [], - span: Span( - start: 10, - end: 15, + sig: FunctionSignature( + pub_: None, + unsafe_: Some(Span( + start: 0, + end: 6, + )), + name: Node( + kind: "foo21", + span: Span( + start: 10, + end: 15, + ), ), - ), - args: [ - Node( - kind: Regular(RegularFunctionArg( - label: None, - name: Node( - kind: "x", - span: Span( - start: 16, - end: 17, - ), - ), - typ: Node( - kind: Base( - base: "bool", - ), - span: Span( - start: 19, - end: 23, - ), - ), - )), + generic_params: Node( + kind: [], span: Span( - start: 16, - end: 23, + start: 10, + end: 15, ), ), - Node( - kind: Regular(RegularFunctionArg( - label: None, - name: Node( - kind: "y", - span: Span( - start: 25, - end: 26, + args: [ + Node( + kind: Regular(RegularFunctionArg( + label: None, + name: Node( + kind: "x", + span: Span( + start: 16, + end: 17, + ), + ), + typ: Node( + kind: Base( + base: "bool", + ), + span: Span( + start: 19, + end: 23, + ), ), + )), + span: Span( + start: 16, + end: 23, ), - typ: Node( - kind: Base( - base: "address", + ), + Node( + kind: Regular(RegularFunctionArg( + label: None, + name: Node( + kind: "y", + span: Span( + start: 25, + end: 26, + ), ), - span: Span( - start: 28, - end: 35, + typ: Node( + kind: Base( + base: "address", + ), + span: Span( + start: 28, + end: 35, + ), ), + )), + span: Span( + start: 25, + end: 35, ), - )), + ), + ], + return_type: Some(Node( + kind: Base( + base: "bool", + ), span: Span( - start: 25, - end: 35, + start: 41, + end: 45, ), - ), - ], - return_type: Some(Node( - kind: Base( - base: "bool", - ), - span: Span( - start: 41, - end: 45, - ), - )), + )), + ), body: [ Node( kind: Expr( diff --git a/crates/parser/tests/cases/snapshots/cases__parse_ast__guest_book.snap b/crates/parser/tests/cases/snapshots/cases__parse_ast__guest_book.snap index 268c529205..0e643220fe 100644 --- a/crates/parser/tests/cases/snapshots/cases__parse_ast__guest_book.snap +++ b/crates/parser/tests/cases/snapshots/cases__parse_ast__guest_book.snap @@ -1,6 +1,6 @@ --- source: crates/parser/tests/cases/parse_ast.rs -expression: "ast_string(stringify!(guest_book), try_parse_module,\n r#\"\ntype BookMsg = Array\n\ncontract GuestBook {\n pub guest_book: Map\n\n event Signed {\n idx book_msg: BookMsg\n }\n\n pub fn sign(self, book_msg: BookMsg) {\n self.guest_book[msg.sender] = book_msg\n\n emit Signed(book_msg: book_msg)\n }\n pub fn get_msg(self, addr: address) -> BookMsg {\n return self.guest_book[addr]\n }\n}\"#)" +expression: "ast_string(stringify!(guest_book), try_parse_module,\n r#\"\ntype BookMsg = Array\n\ncontract GuestBook {\n pub guest_book: Map\n\n event Signed {\n idx book_msg: BookMsg\n }\n\n pub fn sign(self, book_msg: BookMsg) {\n self.guest_book[msg.sender] = book_msg\n\n emit Signed(book_msg: book_msg)\n }\n pub fn get_msg(self, addr: address) -> BookMsg {\n return self.guest_book[addr]\n }\n}\"#)" --- Node( @@ -177,60 +177,62 @@ Node( )), Function(Node( kind: Function( - pub_: Some(Span( - start: 159, - end: 162, - )), - unsafe_: None, - name: Node( - kind: "sign", - span: Span( - start: 166, - end: 170, - ), - ), - generic_params: Node( - kind: [], - span: Span( - start: 166, - end: 170, + sig: FunctionSignature( + pub_: Some(Span( + start: 159, + end: 162, + )), + unsafe_: None, + name: Node( + kind: "sign", + span: Span( + start: 166, + end: 170, + ), ), - ), - args: [ - Node( - kind: Self_, + generic_params: Node( + kind: [], span: Span( - start: 171, - end: 175, + start: 166, + end: 170, ), ), - Node( - kind: Regular(RegularFunctionArg( - label: None, - name: Node( - kind: "book_msg", - span: Span( - start: 177, - end: 185, - ), + args: [ + Node( + kind: Self_, + span: Span( + start: 171, + end: 175, ), - typ: Node( - kind: Base( - base: "BookMsg", + ), + Node( + kind: Regular(RegularFunctionArg( + label: None, + name: Node( + kind: "book_msg", + span: Span( + start: 177, + end: 185, + ), ), - span: Span( - start: 187, - end: 194, + typ: Node( + kind: Base( + base: "BookMsg", + ), + span: Span( + start: 187, + end: 194, + ), ), + )), + span: Span( + start: 177, + end: 194, ), - )), - span: Span( - start: 177, - end: 194, ), - ), - ], - return_type: None, + ], + return_type: None, + ), body: [ Node( kind: Assign( @@ -353,68 +355,70 @@ Node( )), Function(Node( kind: Function( - pub_: Some(Span( - start: 296, - end: 299, - )), - unsafe_: None, - name: Node( - kind: "get_msg", - span: Span( - start: 303, - end: 310, - ), - ), - generic_params: Node( - kind: [], - span: Span( - start: 303, - end: 310, + sig: FunctionSignature( + pub_: Some(Span( + start: 296, + end: 299, + )), + unsafe_: None, + name: Node( + kind: "get_msg", + span: Span( + start: 303, + end: 310, + ), ), - ), - args: [ - Node( - kind: Self_, + generic_params: Node( + kind: [], span: Span( - start: 311, - end: 315, + start: 303, + end: 310, ), ), - Node( - kind: Regular(RegularFunctionArg( - label: None, - name: Node( - kind: "addr", - span: Span( - start: 317, - end: 321, - ), + args: [ + Node( + kind: Self_, + span: Span( + start: 311, + end: 315, ), - typ: Node( - kind: Base( - base: "address", + ), + Node( + kind: Regular(RegularFunctionArg( + label: None, + name: Node( + kind: "addr", + span: Span( + start: 317, + end: 321, + ), ), - span: Span( - start: 323, - end: 330, + typ: Node( + kind: Base( + base: "address", + ), + span: Span( + start: 323, + end: 330, + ), ), + )), + span: Span( + start: 317, + end: 330, ), - )), + ), + ], + return_type: Some(Node( + kind: Base( + base: "BookMsg", + ), span: Span( - start: 317, - end: 330, + start: 335, + end: 342, ), - ), - ], - return_type: Some(Node( - kind: Base( - base: "BookMsg", - ), - span: Span( - start: 335, - end: 342, - ), - )), + )), + ), body: [ Node( kind: Return( diff --git a/crates/parser/tests/cases/snapshots/cases__parse_ast__module_level_events.snap b/crates/parser/tests/cases/snapshots/cases__parse_ast__module_level_events.snap index 90e00d2467..252dc90b63 100644 --- a/crates/parser/tests/cases/snapshots/cases__parse_ast__module_level_events.snap +++ b/crates/parser/tests/cases/snapshots/cases__parse_ast__module_level_events.snap @@ -1,6 +1,6 @@ --- source: crates/parser/tests/cases/parse_ast.rs -expression: "ast_string(stringify!(module_level_events), try_parse_module,\n r#\"\nuse std::context::Context\n\nevent Transfer {\n idx sender: address\n idx receiver: address\n value: u256\n}\ncontract Foo {\n fn transfer(ctx: Context, to: address, value: u256) {\n emit Transfer(ctx, sender: msg.sender, receiver: to, value)\n }\n}\n\"#)" +expression: "ast_string(stringify!(module_level_events), try_parse_module,\n r#\"\nuse std::context::Context\n\nevent Transfer {\n idx sender: address\n idx receiver: address\n value: u256\n}\ncontract Foo {\n fn transfer(ctx: Context, to: address, value: u256) {\n emit Transfer(ctx, sender: msg.sender, receiver: to, value)\n }\n}\n\"#)" --- Node( @@ -154,100 +154,102 @@ Node( body: [ Function(Node( kind: Function( - pub_: None, - unsafe_: None, - name: Node( - kind: "transfer", - span: Span( - start: 135, - end: 143, - ), - ), - generic_params: Node( - kind: [], - span: Span( - start: 135, - end: 143, + sig: FunctionSignature( + pub_: None, + unsafe_: None, + name: Node( + kind: "transfer", + span: Span( + start: 135, + end: 143, + ), ), - ), - args: [ - Node( - kind: Regular(RegularFunctionArg( - label: None, - name: Node( - kind: "ctx", - span: Span( - start: 144, - end: 147, - ), - ), - typ: Node( - kind: Base( - base: "Context", - ), - span: Span( - start: 149, - end: 156, - ), - ), - )), + generic_params: Node( + kind: [], span: Span( - start: 144, - end: 156, + start: 135, + end: 143, ), ), - Node( - kind: Regular(RegularFunctionArg( - label: None, - name: Node( - kind: "to", - span: Span( - start: 158, - end: 160, - ), - ), - typ: Node( - kind: Base( - base: "address", + args: [ + Node( + kind: Regular(RegularFunctionArg( + label: None, + name: Node( + kind: "ctx", + span: Span( + start: 144, + end: 147, + ), ), - span: Span( - start: 162, - end: 169, + typ: Node( + kind: Base( + base: "Context", + ), + span: Span( + start: 149, + end: 156, + ), ), + )), + span: Span( + start: 144, + end: 156, ), - )), - span: Span( - start: 158, - end: 169, ), - ), - Node( - kind: Regular(RegularFunctionArg( - label: None, - name: Node( - kind: "value", - span: Span( - start: 171, - end: 176, + Node( + kind: Regular(RegularFunctionArg( + label: None, + name: Node( + kind: "to", + span: Span( + start: 158, + end: 160, + ), + ), + typ: Node( + kind: Base( + base: "address", + ), + span: Span( + start: 162, + end: 169, + ), ), + )), + span: Span( + start: 158, + end: 169, ), - typ: Node( - kind: Base( - base: "u256", + ), + Node( + kind: Regular(RegularFunctionArg( + label: None, + name: Node( + kind: "value", + span: Span( + start: 171, + end: 176, + ), ), - span: Span( - start: 178, - end: 182, + typ: Node( + kind: Base( + base: "u256", + ), + span: Span( + start: 178, + end: 182, + ), ), + )), + span: Span( + start: 171, + end: 182, ), - )), - span: Span( - start: 171, - end: 182, ), - ), - ], - return_type: None, + ], + return_type: None, + ), body: [ Node( kind: Emit( diff --git a/crates/parser/tests/cases/snapshots/cases__parse_ast__module_stmts.snap b/crates/parser/tests/cases/snapshots/cases__parse_ast__module_stmts.snap index 95c9accc16..000e126b8b 100644 --- a/crates/parser/tests/cases/snapshots/cases__parse_ast__module_stmts.snap +++ b/crates/parser/tests/cases/snapshots/cases__parse_ast__module_stmts.snap @@ -1,6 +1,6 @@ --- source: crates/parser/tests/cases/parse_ast.rs -expression: "ast_string(stringify!(module_stmts), try_parse_module,\n r#\"\npragma 0.5.0\n\nuse foo::bar::{\n bing as bong,\n food::*\n}\n\ntype X = Map\n\npub fn double(x: u8) -> u8 {\n return x * 2\n}\n\nfn secret() -> u8 { return 0xBEEF }\n\ncontract A {\n pub const x: u256 = 10\n}\n\ncontract B {\n pub x: X\n}\"#)" +expression: "ast_string(stringify!(module_stmts), try_parse_module,\n r#\"\npragma 0.5.0\n\nuse foo::bar::{\n bing as bong,\n food::*\n}\n\ntype X = Map\n\npub fn double(x: u8) -> u8 {\n return x * 2\n}\n\nfn secret() -> u8 { return 0xBEEF }\n\ncontract A {\n pub const x: u256 = 10\n}\n\ncontract B {\n pub x: X\n}\"#)" --- Node( @@ -161,61 +161,63 @@ Node( )), Function(Node( kind: Function( - pub_: Some(Span( - start: 87, - end: 90, - )), - unsafe_: None, - name: Node( - kind: "double", - span: Span( - start: 94, - end: 100, + sig: FunctionSignature( + pub_: Some(Span( + start: 87, + end: 90, + )), + unsafe_: None, + name: Node( + kind: "double", + span: Span( + start: 94, + end: 100, + ), ), - ), - generic_params: Node( - kind: [], - span: Span( - start: 94, - end: 100, + generic_params: Node( + kind: [], + span: Span( + start: 94, + end: 100, + ), ), - ), - args: [ - Node( - kind: Regular(RegularFunctionArg( - label: None, - name: Node( - kind: "x", - span: Span( - start: 101, - end: 102, - ), - ), - typ: Node( - kind: Base( - base: "u8", + args: [ + Node( + kind: Regular(RegularFunctionArg( + label: None, + name: Node( + kind: "x", + span: Span( + start: 101, + end: 102, + ), ), - span: Span( - start: 104, - end: 106, + typ: Node( + kind: Base( + base: "u8", + ), + span: Span( + start: 104, + end: 106, + ), ), + )), + span: Span( + start: 101, + end: 106, ), - )), + ), + ], + return_type: Some(Node( + kind: Base( + base: "u8", + ), span: Span( - start: 101, - end: 106, + start: 111, + end: 113, ), - ), - ], - return_type: Some(Node( - kind: Base( - base: "u8", - ), - span: Span( - start: 111, - end: 113, - ), - )), + )), + ), body: [ Node( kind: Return( @@ -263,32 +265,34 @@ Node( )), Function(Node( kind: Function( - pub_: None, - unsafe_: None, - name: Node( - kind: "secret", - span: Span( - start: 139, - end: 145, + sig: FunctionSignature( + pub_: None, + unsafe_: None, + name: Node( + kind: "secret", + span: Span( + start: 139, + end: 145, + ), ), - ), - generic_params: Node( - kind: [], - span: Span( - start: 139, - end: 145, + generic_params: Node( + kind: [], + span: Span( + start: 139, + end: 145, + ), ), + args: [], + return_type: Some(Node( + kind: Base( + base: "u8", + ), + span: Span( + start: 151, + end: 153, + ), + )), ), - args: [], - return_type: Some(Node( - kind: Base( - base: "u8", - ), - span: Span( - start: 151, - end: 153, - ), - )), body: [ Node( kind: Return( diff --git a/crates/parser/tests/cases/snapshots/cases__parse_ast__pub_contract_def.snap b/crates/parser/tests/cases/snapshots/cases__parse_ast__pub_contract_def.snap index 21cc0bead1..5f2afbd1cd 100644 --- a/crates/parser/tests/cases/snapshots/cases__parse_ast__pub_contract_def.snap +++ b/crates/parser/tests/cases/snapshots/cases__parse_ast__pub_contract_def.snap @@ -1,6 +1,6 @@ --- source: crates/parser/tests/cases/parse_ast.rs -expression: "ast_string(stringify!(pub_contract_def), try_parse_module,\n r#\"\npub contract Foo {\n pub fn foo() -> u8 {\n return 10\n }\n}\"#)" +expression: "ast_string(stringify!(pub_contract_def), try_parse_module,\n r#\"\npub contract Foo {\n pub fn foo() -> u8 {\n return 10\n }\n}\"#)" --- Node( @@ -19,35 +19,37 @@ Node( body: [ Function(Node( kind: Function( - pub_: Some(Span( - start: 24, - end: 27, - )), - unsafe_: None, - name: Node( - kind: "foo", - span: Span( - start: 31, - end: 34, + sig: FunctionSignature( + pub_: Some(Span( + start: 24, + end: 27, + )), + unsafe_: None, + name: Node( + kind: "foo", + span: Span( + start: 31, + end: 34, + ), ), - ), - generic_params: Node( - kind: [], - span: Span( - start: 31, - end: 34, + generic_params: Node( + kind: [], + span: Span( + start: 31, + end: 34, + ), ), + args: [], + return_type: Some(Node( + kind: Base( + base: "u8", + ), + span: Span( + start: 40, + end: 42, + ), + )), ), - args: [], - return_type: Some(Node( - kind: Base( - base: "u8", - ), - span: Span( - start: 40, - end: 42, - ), - )), body: [ Node( kind: Return( diff --git a/crates/parser/tests/cases/snapshots/cases__parse_ast__struct_def.snap b/crates/parser/tests/cases/snapshots/cases__parse_ast__struct_def.snap index c19c7f19ee..133091f6ae 100644 --- a/crates/parser/tests/cases/snapshots/cases__parse_ast__struct_def.snap +++ b/crates/parser/tests/cases/snapshots/cases__parse_ast__struct_def.snap @@ -1,6 +1,6 @@ --- source: crates/parser/tests/cases/parse_ast.rs -expression: "ast_string(stringify!(struct_def), try_parse_module,\n r#\"struct S {\n x: address\n pub y: u8\n z: u8\n pub a: Map\n\n pub fn foo(self) -> u8 {\n return self.z + self.y\n }\n unsafe fn bar() {}\n}\"#)" +expression: "ast_string(stringify!(struct_def), try_parse_module,\n r#\"struct S {\n x: address\n pub y: u8\n z: u8\n pub a: Map\n\n pub fn foo(self) -> u8 {\n return self.z + self.y\n }\n unsafe fn bar() {}\n}\"#)" --- Node( @@ -160,43 +160,45 @@ Node( functions: [ Node( kind: Function( - pub_: Some(Span( - start: 69, - end: 72, - )), - unsafe_: None, - name: Node( - kind: "foo", - span: Span( - start: 76, - end: 79, - ), - ), - generic_params: Node( - kind: [], - span: Span( - start: 76, - end: 79, - ), - ), - args: [ - Node( - kind: Self_, + sig: FunctionSignature( + pub_: Some(Span( + start: 69, + end: 72, + )), + unsafe_: None, + name: Node( + kind: "foo", span: Span( - start: 80, - end: 84, + start: 76, + end: 79, ), ), - ], - return_type: Some(Node( - kind: Base( - base: "u8", - ), - span: Span( - start: 89, - end: 91, + generic_params: Node( + kind: [], + span: Span( + start: 76, + end: 79, + ), ), - )), + args: [ + Node( + kind: Self_, + span: Span( + start: 80, + end: 84, + ), + ), + ], + return_type: Some(Node( + kind: Base( + base: "u8", + ), + span: Span( + start: 89, + end: 91, + ), + )), + ), body: [ Node( kind: Return( @@ -274,27 +276,29 @@ Node( ), Node( kind: Function( - pub_: None, - unsafe_: Some(Span( - start: 127, - end: 133, - )), - name: Node( - kind: "bar", - span: Span( - start: 137, - end: 140, + sig: FunctionSignature( + pub_: None, + unsafe_: Some(Span( + start: 127, + end: 133, + )), + name: Node( + kind: "bar", + span: Span( + start: 137, + end: 140, + ), ), - ), - generic_params: Node( - kind: [], - span: Span( - start: 137, - end: 140, + generic_params: Node( + kind: [], + span: Span( + start: 137, + end: 140, + ), ), + args: [], + return_type: None, ), - args: [], - return_type: None, body: [], ), span: Span( diff --git a/crates/test-files/fixtures/features/generic_functions.fe b/crates/test-files/fixtures/features/generic_functions.fe index 1e56d96e09..9d9ff0647d 100644 --- a/crates/test-files/fixtures/features/generic_functions.fe +++ b/crates/test-files/fixtures/features/generic_functions.fe @@ -1,5 +1,10 @@ use std::traits::IsNumeric +trait SomeTrait { + fn do_this() -> bool; + fn do_that(); +} + struct Bar { pub fn bar(self, x: T, y: u256) -> bool {