diff --git a/language/src/main/grammars/de/monticore/lang/SysMLExpressions.mc4 b/language/src/main/grammars/de/monticore/lang/SysMLExpressions.mc4 index a8142047..5a707fc5 100644 --- a/language/src/main/grammars/de/monticore/lang/SysMLExpressions.mc4 +++ b/language/src/main/grammars/de/monticore/lang/SysMLExpressions.mc4 @@ -119,7 +119,7 @@ component grammar SysMLExpressions SysMLFunctionOperationExpression implements Expression <291> = Expression "->" Name - ("(" (SysMLParameter || ",")* ")")? + (Arguments)? (body:SysMLBodyExpression)? ; // Eigentlich ist "^" der Name einer CalcDef aus den Domain Libraries diff --git a/language/src/test/java/parser/ExpressionParserTest.java b/language/src/test/java/parser/ExpressionParserTest.java index fe1cddc8..64089dfc 100644 --- a/language/src/test/java/parser/ExpressionParserTest.java +++ b/language/src/test/java/parser/ExpressionParserTest.java @@ -101,4 +101,22 @@ public void testFunctionOperationAfterFieldAccess() throws IOException { assertThat(functionOperation.getName()).isEqualTo("c"); } + /** + * Checks that a function operation with arguments is parsed directly as + * ASTSysMLFunctionOperationExpression, not wrapped in an ASTCallExpression. + */ + @Test + public void testFunctionOperationWithArguments() throws IOException { + var ast = parser.parse_StringExpression("x->b(y)"); + + assertThat(ast).isPresent(); + assertThat(Log.getFindings()).isEmpty(); + assertThat(ast.get()).isInstanceOf(ASTSysMLFunctionOperationExpression.class); + assertThat(ast.get()).isNotInstanceOf(ASTCallExpression.class); + + var functionOperation = (ASTSysMLFunctionOperationExpression) ast.get(); + assertThat(functionOperation.getName()).isEqualTo("b"); + assertThat(functionOperation.getArguments().getExpressionList()).hasSize(1); + } + }