From 9adf382a089417cb3309eae0d5ec62619b9b4d2c Mon Sep 17 00:00:00 2001 From: alexwp10 Date: Thu, 13 Aug 2026 10:22:37 +0200 Subject: [PATCH] Use Arguments in SysMLFunctionOperationExpression #355 --- .../de/monticore/lang/SysMLExpressions.mc4 | 2 +- .../test/java/parser/ExpressionParserTest.java | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) 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); + } + }