@@ -2,15 +2,18 @@ use super::expressions::{parse_call_args, parse_expr};
2
2
use super :: types:: parse_type_desc;
3
3
4
4
use crate :: ast:: {
5
- BinOperator , Expr , FuncStmt , Function , FunctionArg , GenericParameter , RegularFunctionArg ,
6
- TypeDesc , VarDeclTarget ,
5
+ BinOperator , Expr , FuncStmt , Function , FunctionArg , FunctionSignature , GenericParameter ,
6
+ RegularFunctionArg , TypeDesc , VarDeclTarget ,
7
7
} ;
8
8
use crate :: node:: { Node , Span } ;
9
9
use crate :: { Label , ParseFailed , ParseResult , Parser , TokenKind } ;
10
10
11
- /// Parse a function definition. The optional `pub` qualifier must be parsed by
11
+ /// Parse a function definition without a body . The optional `pub` qualifier must be parsed by
12
12
/// the caller, and passed in. Next token must be `unsafe` or `fn`.
13
- pub fn parse_fn_def ( par : & mut Parser , mut pub_qual : Option < Span > ) -> ParseResult < Node < Function > > {
13
+ pub fn parse_fn_sig (
14
+ par : & mut Parser ,
15
+ mut pub_qual : Option < Span > ,
16
+ ) -> ParseResult < Node < FunctionSignature > > {
14
17
let unsafe_qual = par. optional ( TokenKind :: Unsafe ) . map ( |tok| tok. span ) ;
15
18
if let Some ( pub_) = par. optional ( TokenKind :: Pub ) {
16
19
let unsafe_span =
@@ -84,22 +87,35 @@ pub fn parse_fn_def(par: &mut Parser, mut pub_qual: Option<Span>) -> ParseResult
84
87
None
85
88
} ;
86
89
87
- // TODO: allow multi-line return type? `fn f()\n ->\n u8`
88
- par. enter_block ( span, "function definition" ) ?;
89
- let body = parse_block_stmts ( par) ?;
90
- let rbrace = par. expect ( TokenKind :: BraceClose , "missing `}` in fn definition" ) ?;
91
-
92
90
Ok ( Node :: new (
93
- Function {
91
+ FunctionSignature {
94
92
pub_ : pub_qual,
95
93
unsafe_ : unsafe_qual,
96
94
name : name. into ( ) ,
97
95
args,
98
96
generic_params,
99
97
return_type,
98
+ } ,
99
+ span,
100
+ ) )
101
+ }
102
+
103
+ /// Parse a function definition. The optional `pub` qualifier must be parsed by
104
+ /// the caller, and passed in. Next token must be `unsafe` or `fn`.
105
+ pub fn parse_fn_def ( par : & mut Parser , pub_qual : Option < Span > ) -> ParseResult < Node < Function > > {
106
+ let sig = parse_fn_sig ( par, pub_qual) ?;
107
+
108
+ // TODO: allow multi-line return type? `fn f()\n ->\n u8`
109
+ par. enter_block ( sig. span , "function definition" ) ?;
110
+ let body = parse_block_stmts ( par) ?;
111
+ let rbrace = par. expect ( TokenKind :: BraceClose , "missing `}` in fn definition" ) ?;
112
+
113
+ Ok ( Node :: new (
114
+ Function {
115
+ sig : sig. kind ,
100
116
body,
101
117
} ,
102
- span + rbrace. span ,
118
+ sig . span + rbrace. span ,
103
119
) )
104
120
}
105
121
0 commit comments