From 0d15bf5c3d77d6a0c2f05c667986992d4d11bc5d Mon Sep 17 00:00:00 2001 From: MKZaito <127297267+MKZaito@users.noreply.github.com> Date: Wed, 12 Aug 2026 20:04:33 +0200 Subject: [PATCH 1/5] add new SysMLExpressionBasisTypeVisitor --- .../SysMLExpressionBasisTypeVisitor.java | 50 +++++++++++++++++++ .../lang/sysmlv2/types3/SysMLTypeCheck3.java | 2 +- 2 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 language/src/main/java/de/monticore/lang/sysmlv2/types3/SysMLExpressionBasisTypeVisitor.java diff --git a/language/src/main/java/de/monticore/lang/sysmlv2/types3/SysMLExpressionBasisTypeVisitor.java b/language/src/main/java/de/monticore/lang/sysmlv2/types3/SysMLExpressionBasisTypeVisitor.java new file mode 100644 index 000000000..c3020e646 --- /dev/null +++ b/language/src/main/java/de/monticore/lang/sysmlv2/types3/SysMLExpressionBasisTypeVisitor.java @@ -0,0 +1,50 @@ +package de.monticore.lang.sysmlv2.types3; + +import de.monticore.expressions.expressionsbasis._ast.ASTNameExpression; +import de.monticore.expressions.expressionsbasis.types3.ExpressionBasisTypeVisitor; +import de.monticore.lang.sysmlv2._symboltable.ISysMLv2Scope; +import de.monticore.symbols.basicsymbols._symboltable.IBasicSymbolsScope; +import de.monticore.symbols.basicsymbols._symboltable.TypeSymbol; +import de.monticore.types.check.SymTypeExpression; +import de.monticore.types.check.SymTypeExpressionFactory; +import de.monticore.types3.util.WithinScopeBasicSymbolsResolver; +import de.se_rwth.commons.logging.Log; + +import java.util.Optional; + +public class SysMLExpressionBasisTypeVisitor extends ExpressionBasisTypeVisitor { + + @Override + protected Optional calculateNameExpression(ASTNameExpression expr) { + + if (expr.getEnclosingScope() == null) { + Log.error("0x10AAA internal error: " + + "enclosing scope of expression expected", + expr.get_SourcePositionStart(), + expr.get_SourcePositionEnd() + ); + return Optional.empty(); + } + + final String name = expr.getName(); + IBasicSymbolsScope enclosingScope = getAsBasicSymbolsScope(expr.getEnclosingScope()); + + Optional varResult = + WithinScopeBasicSymbolsResolver.resolveNameAsExpr(enclosingScope, name); + + if (varResult.isPresent()) { + return varResult; + } + + if (enclosingScope instanceof ISysMLv2Scope) { + ISysMLv2Scope sysmlScope = (ISysMLv2Scope) enclosingScope; + Optional typeSymbol = sysmlScope.resolveType(name); + + if (typeSymbol.isPresent()) { + return Optional.of(SymTypeExpressionFactory.createTypeObject(typeSymbol.get())); + } + } + + return Optional.empty(); + } +} diff --git a/language/src/main/java/de/monticore/lang/sysmlv2/types3/SysMLTypeCheck3.java b/language/src/main/java/de/monticore/lang/sysmlv2/types3/SysMLTypeCheck3.java index 642921ac1..6ff5f0a2c 100644 --- a/language/src/main/java/de/monticore/lang/sysmlv2/types3/SysMLTypeCheck3.java +++ b/language/src/main/java/de/monticore/lang/sysmlv2/types3/SysMLTypeCheck3.java @@ -50,7 +50,7 @@ protected static void initTC3Delegate() { Type4Ast type4Ast = new Type4Ast(); // Expressions - var forBasis = new ExpressionBasisTypeVisitor(); + var forBasis = new SysMLExpressionBasisTypeVisitor(); forBasis.setType4Ast(type4Ast); typeTraverser.add4ExpressionsBasis(forBasis); From 1265f5252a6e01a63d2e71ee3f838052434916f4 Mon Sep 17 00:00:00 2001 From: MKZaito <127297267+MKZaito@users.noreply.github.com> Date: Thu, 13 Aug 2026 14:39:14 +0200 Subject: [PATCH 2/5] version bumb to 7.8.79 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index febaa061a..ddd15d5ed 100644 --- a/gradle.properties +++ b/gradle.properties @@ -25,4 +25,4 @@ assertj_version = 3.21.0 junit_version = 5.8.2 # Version of published artifacts -version = 7.8.78 +version = 7.8.79 From e393e14d5ab75e5718ded71051f169afcba5fdbb Mon Sep 17 00:00:00 2001 From: MKZaito <127297267+MKZaito@users.noreply.github.com> Date: Thu, 13 Aug 2026 20:10:56 +0200 Subject: [PATCH 3/5] Transformer Fails without new Visitor Emulate TypeCheck on Enum in Transformer --- .../cocos/UsingCtrlEnumTypeCheckTest.java | 79 +++++++++++++++++++ .../resources/dluf/models/UsingCtrlEnum.sysml | 15 ++++ 2 files changed, 94 insertions(+) create mode 100644 language/src/test/java/cocos/UsingCtrlEnumTypeCheckTest.java create mode 100644 language/src/test/resources/dluf/models/UsingCtrlEnum.sysml diff --git a/language/src/test/java/cocos/UsingCtrlEnumTypeCheckTest.java b/language/src/test/java/cocos/UsingCtrlEnumTypeCheckTest.java new file mode 100644 index 000000000..55c03da4d --- /dev/null +++ b/language/src/test/java/cocos/UsingCtrlEnumTypeCheckTest.java @@ -0,0 +1,79 @@ +package cocos; + +import de.monticore.expressions.commonexpressions._ast.ASTFieldAccessExpression; +import de.monticore.expressions.commonexpressions._visitor.CommonExpressionsVisitor2; +import de.monticore.expressions.expressionsbasis._ast.ASTNameExpression; +import de.monticore.lang.sysmlv2.SysMLv2Mill; +import de.monticore.lang.sysmlv2.SysMLv2Tool; +import de.monticore.lang.sysmlv2._ast.ASTSysMLModel; +import de.monticore.types3.TypeCheck3; +import de.se_rwth.commons.logging.Finding; +import de.se_rwth.commons.logging.Log; +import de.se_rwth.commons.logging.LogStub; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.concurrent.atomic.AtomicReference; + +import static org.assertj.core.api.Assertions.assertThat; + +public class UsingCtrlEnumTypeCheckTest { + + @BeforeEach + public void setup() { + LogStub.init(); + Log.enableFailQuick(false); + Log.clearFindings(); + SysMLv2Mill.reset(); + } + + @Test + public void tryTypeCheckingCtrlEnumName() throws IOException { + SysMLv2Tool tool = new SysMLv2Tool(); + tool.init(); + + ASTSysMLModel ast = tool.parse( + Path.of("src/test/resources/dluf/models/UsingCtrlEnum.sysml").toString() + ); + + tool.createSymbolTable(ast); + tool.completeSymbolTable(ast); + tool.finalizeSymbolTable(ast); + + ASTNameExpression ctrlEnum = findCtrlEnumNameExpression(ast); + + var type = TypeCheck3.typeOf(ctrlEnum); + + assertThat(type.isObscureType()).isFalse(); + assertThat(type.hasTypeInfo()).isTrue(); + assertThat(type.getTypeInfo().getFullName()).isEqualTo("CtrlEnum"); + + assertThat(Log.getFindings()) + .filteredOn(Finding::isError) + .isEmpty(); + } + + private ASTNameExpression findCtrlEnumNameExpression(ASTSysMLModel ast) { + AtomicReference result = new AtomicReference<>(); + + var traverser = SysMLv2Mill.inheritanceTraverser(); + traverser.add4CommonExpressions(new CommonExpressionsVisitor2() { + @Override + public void visit(ASTFieldAccessExpression node) { + if ("NAK".equals(node.getName()) + && node.getExpression() instanceof ASTNameExpression + && "CtrlEnum".equals(((ASTNameExpression) node.getExpression()).getName())) { + result.set((ASTNameExpression) node.getExpression()); + } + } + }); + + ast.accept(traverser); + + assertThat(result.get()).isNotNull(); + + return result.get(); + } +} diff --git a/language/src/test/resources/dluf/models/UsingCtrlEnum.sysml b/language/src/test/resources/dluf/models/UsingCtrlEnum.sysml new file mode 100644 index 000000000..cad3c8ef8 --- /dev/null +++ b/language/src/test/resources/dluf/models/UsingCtrlEnum.sysml @@ -0,0 +1,15 @@ +enum def CtrlEnum { + enum ACK; + enum NAK; +} +port def Ctrl { + out attribute data: CtrlEnum; +} +part def UsingCtrlEnum { + + port control: ~Ctrl; + + require constraint constraintWithCtrlEnum { + CtrlEnum.NAK == CtrlEnum.ACK + } +} From 9ce20e9095a84cfc4870c7acf546c40185d010ef Mon Sep 17 00:00:00 2001 From: MKZaito <127297267+MKZaito@users.noreply.github.com> Date: Fri, 14 Aug 2026 14:04:27 +0200 Subject: [PATCH 4/5] version bumb to 7.8.80 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index ddd15d5ed..729ff3c57 100644 --- a/gradle.properties +++ b/gradle.properties @@ -25,4 +25,4 @@ assertj_version = 3.21.0 junit_version = 5.8.2 # Version of published artifacts -version = 7.8.79 +version = 7.8.80 From e672405e41c84c7b9c1bd8d344dc766432947a7a Mon Sep 17 00:00:00 2001 From: MKZaito <127297267+MKZaito@users.noreply.github.com> Date: Fri, 14 Aug 2026 19:04:13 +0200 Subject: [PATCH 5/5] apply Suggestions --- .../SysMLExpressionBasisTypeVisitor.java | 13 +++++-- .../cocos/UsingCtrlEnumTypeCheckTest.java | 36 +++++-------------- .../resources/dluf/models/UsingCtrlEnum.sysml | 15 -------- 3 files changed, 18 insertions(+), 46 deletions(-) delete mode 100644 language/src/test/resources/dluf/models/UsingCtrlEnum.sysml diff --git a/language/src/main/java/de/monticore/lang/sysmlv2/types3/SysMLExpressionBasisTypeVisitor.java b/language/src/main/java/de/monticore/lang/sysmlv2/types3/SysMLExpressionBasisTypeVisitor.java index c3020e646..d862140a6 100644 --- a/language/src/main/java/de/monticore/lang/sysmlv2/types3/SysMLExpressionBasisTypeVisitor.java +++ b/language/src/main/java/de/monticore/lang/sysmlv2/types3/SysMLExpressionBasisTypeVisitor.java @@ -12,6 +12,10 @@ import java.util.Optional; +/** + * SysML-spezifische Erweiterung des Typechecks für NameExpressions, einer + * Produktion aus der ExpressionBasis.mc4-Grammatik + */ public class SysMLExpressionBasisTypeVisitor extends ExpressionBasisTypeVisitor { @Override @@ -36,12 +40,15 @@ protected Optional calculateNameExpression(ASTNameExpression return varResult; } + + // Dieser If-Block wurde zum vordefinierten calculateNameExpression hinzugefügt if (enclosingScope instanceof ISysMLv2Scope) { - ISysMLv2Scope sysmlScope = (ISysMLv2Scope) enclosingScope; - Optional typeSymbol = sysmlScope.resolveType(name); + Optional typeSymbol = enclosingScope.resolveType(name); if (typeSymbol.isPresent()) { - return Optional.of(SymTypeExpressionFactory.createTypeObject(typeSymbol.get())); + return Optional.of( + SymTypeExpressionFactory.createTypeObject(typeSymbol.get()) + ); } } diff --git a/language/src/test/java/cocos/UsingCtrlEnumTypeCheckTest.java b/language/src/test/java/cocos/UsingCtrlEnumTypeCheckTest.java index 55c03da4d..8d9c04114 100644 --- a/language/src/test/java/cocos/UsingCtrlEnumTypeCheckTest.java +++ b/language/src/test/java/cocos/UsingCtrlEnumTypeCheckTest.java @@ -3,6 +3,7 @@ import de.monticore.expressions.commonexpressions._ast.ASTFieldAccessExpression; import de.monticore.expressions.commonexpressions._visitor.CommonExpressionsVisitor2; import de.monticore.expressions.expressionsbasis._ast.ASTNameExpression; +import de.monticore.lang.sysmlconstraints._ast.ASTConstraintUsage; import de.monticore.lang.sysmlv2.SysMLv2Mill; import de.monticore.lang.sysmlv2.SysMLv2Tool; import de.monticore.lang.sysmlv2._ast.ASTSysMLModel; @@ -34,46 +35,25 @@ public void tryTypeCheckingCtrlEnumName() throws IOException { SysMLv2Tool tool = new SysMLv2Tool(); tool.init(); - ASTSysMLModel ast = tool.parse( - Path.of("src/test/resources/dluf/models/UsingCtrlEnum.sysml").toString() - ); + var model = "enum def E { enum e; } constraint { E::e }"; + var ast = SysMLv2Mill.parser().parse_String(model).get(); tool.createSymbolTable(ast); tool.completeSymbolTable(ast); tool.finalizeSymbolTable(ast); - ASTNameExpression ctrlEnum = findCtrlEnumNameExpression(ast); + // extrahiere das "E" aus "enum def ...; constraint { E::e }" im Model + var expr = ((ASTConstraintUsage) ast.getSysMLElement(1)).getExpression(); + var E = ((ASTFieldAccessExpression)expr).getExpression(); - var type = TypeCheck3.typeOf(ctrlEnum); + var type = TypeCheck3.typeOf(E); assertThat(type.isObscureType()).isFalse(); assertThat(type.hasTypeInfo()).isTrue(); - assertThat(type.getTypeInfo().getFullName()).isEqualTo("CtrlEnum"); + assertThat(type.getTypeInfo().getFullName()).isEqualTo("E"); assertThat(Log.getFindings()) .filteredOn(Finding::isError) .isEmpty(); } - - private ASTNameExpression findCtrlEnumNameExpression(ASTSysMLModel ast) { - AtomicReference result = new AtomicReference<>(); - - var traverser = SysMLv2Mill.inheritanceTraverser(); - traverser.add4CommonExpressions(new CommonExpressionsVisitor2() { - @Override - public void visit(ASTFieldAccessExpression node) { - if ("NAK".equals(node.getName()) - && node.getExpression() instanceof ASTNameExpression - && "CtrlEnum".equals(((ASTNameExpression) node.getExpression()).getName())) { - result.set((ASTNameExpression) node.getExpression()); - } - } - }); - - ast.accept(traverser); - - assertThat(result.get()).isNotNull(); - - return result.get(); - } } diff --git a/language/src/test/resources/dluf/models/UsingCtrlEnum.sysml b/language/src/test/resources/dluf/models/UsingCtrlEnum.sysml deleted file mode 100644 index cad3c8ef8..000000000 --- a/language/src/test/resources/dluf/models/UsingCtrlEnum.sysml +++ /dev/null @@ -1,15 +0,0 @@ -enum def CtrlEnum { - enum ACK; - enum NAK; -} -port def Ctrl { - out attribute data: CtrlEnum; -} -part def UsingCtrlEnum { - - port control: ~Ctrl; - - require constraint constraintWithCtrlEnum { - CtrlEnum.NAK == CtrlEnum.ACK - } -}