@@ -465,7 +465,17 @@ impl<'a> Parser<'a> {
465465
466466 #[ tracing:: instrument]
467467 fn parse_function ( & mut self , lex : & mut Lexer < ' a > ) -> Result < ( ) > {
468- let name = lex. expect_identifier ( ) ?. qualify ( self . namespace ) ;
468+ let name = match lex. expect_next ( ) ? {
469+ Token :: FunctionCall ( ident) => ident,
470+ Token :: Identifier ( ident) => {
471+ lex. expect ( & Token :: OpenParent , |span| {
472+ ParsingError :: NoFunctionSignature ( span, ident. literal . to_string ( ) )
473+ } ) ?;
474+ ident
475+ }
476+ _ => return Err ( ParsingError :: ExpectedIdentifier ( lex. span ( ) ) ) ,
477+ }
478+ . qualify ( self . namespace ) ;
469479 let args = self . parse_signature ( lex, & name) ?;
470480 lex. consume ( & Token :: Newline ) ;
471481 let body = self . parse_body ( lex) ?;
@@ -481,9 +491,6 @@ impl<'a> Parser<'a> {
481491 name : & Identifier < ' a > ,
482492 ) -> Result < Vec < ' a , Identifier < ' a > > > {
483493 let mut args = Vec :: new_in ( self . arena ) ;
484- lex. expect ( & Token :: OpenParent , |s| {
485- ParsingError :: NoFunctionSignature ( s, name. to_string ( ) )
486- } ) ?;
487494
488495 if lex. consume ( & Token :: ClosedParent ) {
489496 return Ok ( args) ;
@@ -567,10 +574,7 @@ impl<'a> Parser<'a> {
567574 }
568575 } else {
569576 let next = lex. expect_next ( ) ?;
570- if let Token :: Identifier ( name) = next
571- && lex. peek_is ( & Token :: OpenParent )
572- {
573- // TODO: use spans to check there is no space between ident, (.
577+ if let Token :: FunctionCall ( name) = next {
574578 self . parse_function_call ( lex, name. qualify ( self . namespace ) , lex. span ( ) ) ?
575579 } else {
576580 Expr :: leaf ( self . parse_atom ( lex, next) ?)
@@ -691,10 +695,6 @@ impl<'a> Parser<'a> {
691695 name : Identifier < ' a > ,
692696 span : Span ,
693697 ) -> Result < Expr < ' a > > {
694- lex. expect ( & Token :: OpenParent , ParsingError :: ExpectedOpeningParenthesis ) ?;
695- if lex. span ( ) . start != span. end {
696- return Err ( ParsingError :: FunctionCallSeparatedIdent ( span) ) ;
697- }
698698 let expr = ExprNode :: FunctionCall (
699699 name,
700700 self . parse_arguments ( lex, |t| t == & Token :: ClosedParent ) ?,
@@ -724,9 +724,7 @@ impl<'a> Parser<'a> {
724724 #[ tracing:: instrument]
725725 fn get_place ( & self , lex : & mut Lexer < ' a > , token : Token < ' a > ) -> Option < Variable < ' a > > {
726726 match token {
727- Token :: Identifier ( a) if !lex. peek_is ( & Token :: OpenParent ) => {
728- Some ( a. qualify ( self . namespace ) . into ( ) )
729- }
727+ Token :: Identifier ( a) => Some ( a. qualify ( self . namespace ) . into ( ) ) ,
730728 Token :: NrVariable => Some ( Variable :: Nr ) ,
731729 Token :: NfVariable => Some ( Variable :: Nf ) ,
732730 Token :: FsVariable => Some ( Variable :: Fs ) ,
0 commit comments