From c76ae118a7db00f6281e6f9ff6fb62c25d7a6962 Mon Sep 17 00:00:00 2001 From: alexwp10 Date: Fri, 7 Aug 2026 17:55:59 +0200 Subject: [PATCH 1/2] Use Arguments in function operations --- .../de/monticore/lang/SysMLExpressions.mc4 | 5 +-- .../java/parser/ExpressionParserTest.java | 31 +++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/language/src/main/grammars/de/monticore/lang/SysMLExpressions.mc4 b/language/src/main/grammars/de/monticore/lang/SysMLExpressions.mc4 index 0968db618..50f02ef55 100644 --- a/language/src/main/grammars/de/monticore/lang/SysMLExpressions.mc4 +++ b/language/src/main/grammars/de/monticore/lang/SysMLExpressions.mc4 @@ -110,8 +110,9 @@ component grammar SysMLExpressions * name of the function to be invoked and an argument list for any remaining arguments (see 7.4.9.4). This is * useful for chaining invocations in an effective data flow */ - SysMLFunctionOperationExpression implements Expression = - Expression "->" Name ("(" (SysMLParameter || ",")* ")")? ("{" SysMLElement* inner:Expression "}")? ; + SysMLFunctionOperationExpression implements Expression <291> = + Expression "->" Name (Arguments)? + ("{" SysMLElement* inner:Expression "}")? ; // Eigentlich ist "^" der Name einer CalcDef aus den Domain Libraries CalcDefPowerExpression implements Expression = diff --git a/language/src/test/java/parser/ExpressionParserTest.java b/language/src/test/java/parser/ExpressionParserTest.java index 393d83340..b7696d9c1 100644 --- a/language/src/test/java/parser/ExpressionParserTest.java +++ b/language/src/test/java/parser/ExpressionParserTest.java @@ -12,6 +12,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import de.monticore.lang.sysmlexpressions._ast.ASTSysMLFunctionOperationExpression; import java.io.IOException; @@ -82,4 +83,34 @@ public void testElementOf() throws IOException { assertThat(ast.get()).isInstanceOf(ASTElementOfExpression.class); } + @Test + public void testSysMLFunctionOperatorExprMinimal() throws IOException { + var ast = parser.parse_StringExpression("x->b()"); + + assertThat(ast).isPresent(); + assertThat(Log.getFindings()).isEmpty(); + assertThat(ast.get()) + .isInstanceOf(ASTSysMLFunctionOperationExpression.class); + } + + @Test + public void testSysMLFunctionOperatorExpr() throws IOException { + var ast = parser.parse_StringExpression("x->excludes(y)"); + + assertThat(ast).isPresent(); + assertThat(Log.getFindings()).isEmpty(); + assertThat(ast.get()) + .isInstanceOf(ASTSysMLFunctionOperationExpression.class); + } + + @Test + public void testSysMLFunctionOperatorExpr2() throws IOException { + var ast = parser.parse_StringExpression("x->excludes(y.z)"); + + assertThat(ast).isPresent(); + assertThat(Log.getFindings()).isEmpty(); + assertThat(ast.get()) + .isInstanceOf(ASTSysMLFunctionOperationExpression.class); + } + } From a66dd5792ffa3613b14df80089fe798c962081f2 Mon Sep 17 00:00:00 2001 From: alexwp10 Date: Mon, 10 Aug 2026 09:56:27 +0200 Subject: [PATCH 2/2] Support qualified names in function operations --- .../de/monticore/lang/SysMLExpressions.mc4 | 2 +- .../java/parser/ExpressionParserTest.java | 31 +++++++++++++++++++ 2 files changed, 32 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 50f02ef55..bb1860b7e 100644 --- a/language/src/main/grammars/de/monticore/lang/SysMLExpressions.mc4 +++ b/language/src/main/grammars/de/monticore/lang/SysMLExpressions.mc4 @@ -111,7 +111,7 @@ component grammar SysMLExpressions * useful for chaining invocations in an effective data flow */ SysMLFunctionOperationExpression implements Expression <291> = - Expression "->" Name (Arguments)? + Expression "->" SysMLQualifiedName (Arguments)? ("{" SysMLElement* inner:Expression "}")? ; // 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 b7696d9c1..fa14a254c 100644 --- a/language/src/test/java/parser/ExpressionParserTest.java +++ b/language/src/test/java/parser/ExpressionParserTest.java @@ -13,6 +13,7 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; import de.monticore.lang.sysmlexpressions._ast.ASTSysMLFunctionOperationExpression; +import de.monticore.expressions.commonexpressions._ast.ASTFieldAccessExpression; import java.io.IOException; @@ -113,4 +114,34 @@ public void testSysMLFunctionOperatorExpr2() throws IOException { .isInstanceOf(ASTSysMLFunctionOperationExpression.class); } + /** + * Checks that qualified names on both sides of a function operation + * are parsed with the correct binding. + */ + @ParameterizedTest + @ValueSource(strings = { + "a.b->c.d", + "a::b->c::d", + "a::b->c.d", + "a.b->c::d" + }) + public void testQualifiedNamesInFunctionOperation(String expr) + throws IOException { + + var ast = parser.parse_StringExpression(expr); + + assertThat(ast).isPresent(); + assertThat(Log.getFindings()).isEmpty(); + assertThat(ast.get()) + .isInstanceOf(ASTSysMLFunctionOperationExpression.class); + + var functionOperation = + (ASTSysMLFunctionOperationExpression) ast.get(); + + assertThat(functionOperation.getExpression()) + .isInstanceOf(ASTFieldAccessExpression.class); + assertThat(functionOperation.getSysMLQualifiedName().getPartsList()) + .containsExactly("c", "d"); + } + }