From 07a939eba712c16b14afbd10f9ebda4a17db283d Mon Sep 17 00:00:00 2001 From: Dovydas Skauranskas <109866625+DovydasSkauranskas@users.noreply.github.com> Date: Sat, 17 Jan 2026 19:05:41 +0200 Subject: [PATCH 1/6] Obscure-Typen werden erlaubt --- .../sysmlv2/cocos/ConstraintIsBoolean.java | 3 ++- .../cocos/TypeCheckTransitionGuards.java | 7 ++--- .../lang/sysmlv2/types/SilentObscureType.java | 27 +++++++++++++++++++ .../lang/sysmlv2/types/SysMLDeriver.java | 17 +++++++++++- 4 files changed, 49 insertions(+), 5 deletions(-) create mode 100644 language/src/main/java/de/monticore/lang/sysmlv2/types/SilentObscureType.java diff --git a/language/src/main/java/de/monticore/lang/sysmlv2/cocos/ConstraintIsBoolean.java b/language/src/main/java/de/monticore/lang/sysmlv2/cocos/ConstraintIsBoolean.java index da64dfc0..e342ad81 100644 --- a/language/src/main/java/de/monticore/lang/sysmlv2/cocos/ConstraintIsBoolean.java +++ b/language/src/main/java/de/monticore/lang/sysmlv2/cocos/ConstraintIsBoolean.java @@ -22,7 +22,8 @@ public class ConstraintIsBoolean implements SysMLConstraintsASTConstraintUsageCo try { TypeCheckResult type = deriver.deriveType(expr); - if(!type.isPresentResult() || type.getResult().getTypeInfo() == null) { + if(!type.isPresentResult() || type.getResult().isObscureType()) { + } else if(type.getResult().getTypeInfo() == null) { var start = node.get_SourcePositionStart(); var end = constraintEnd(start); Log.error("0x80001 Failed to derive a type!", start, end); diff --git a/language/src/main/java/de/monticore/lang/sysmlv2/cocos/TypeCheckTransitionGuards.java b/language/src/main/java/de/monticore/lang/sysmlv2/cocos/TypeCheckTransitionGuards.java index 15a4f6e5..b322bef1 100644 --- a/language/src/main/java/de/monticore/lang/sysmlv2/cocos/TypeCheckTransitionGuards.java +++ b/language/src/main/java/de/monticore/lang/sysmlv2/cocos/TypeCheckTransitionGuards.java @@ -22,9 +22,10 @@ public void check(ASTSysMLTransition node) { try { TypeCheckResult type = deriver.deriveType(expr); if(!type.isPresentResult() || type.getResult().getTypeInfo() == null) { - Log.error("0x80004 Failed to derive a type!", - expr.get_SourcePositionStart(), - expr.get_SourcePositionEnd()); + // NOTE: Kurzfristig deaktiviert, um Symbole wie 'Eps' und 'Tick' zu erlauben + // Log.error("0x80004 Failed to derive a type!", + // expr.get_SourcePositionStart(), + // expr.get_SourcePositionEnd()); } else if(!type.getResult().printFullName().equals("boolean")) { Log.error("0x80005 The expression type is '" + type.getResult().printFullName() + "' but should be boolean!", diff --git a/language/src/main/java/de/monticore/lang/sysmlv2/types/SilentObscureType.java b/language/src/main/java/de/monticore/lang/sysmlv2/types/SilentObscureType.java new file mode 100644 index 00000000..a3dd806c --- /dev/null +++ b/language/src/main/java/de/monticore/lang/sysmlv2/types/SilentObscureType.java @@ -0,0 +1,27 @@ +/* (c) https://github.com/MontiCore/monticore */ +package de.monticore.lang.sysmlv2.types; + +import de.monticore.symbols.basicsymbols._symboltable.TypeSymbol; +import de.monticore.types.check.SymTypeExpression; +import de.monticore.types.check.SymTypeObscure; + +/** + * Kurzfristige Lösung, damit Symbole wie 'Eps' und 'Tick' keine Fehler werfen + */ +public class SilentObscureType extends SymTypeObscure { + + @Override + public SymTypeExpression deepClone() { + return new SilentObscureType(); + } + + @Override + public TypeSymbol getTypeInfo() { + return null; + } + + @Override + public boolean hasTypeInfo() { + return false; + } +} diff --git a/language/src/main/java/de/monticore/lang/sysmlv2/types/SysMLDeriver.java b/language/src/main/java/de/monticore/lang/sysmlv2/types/SysMLDeriver.java index e59805cf..bfcb602c 100644 --- a/language/src/main/java/de/monticore/lang/sysmlv2/types/SysMLDeriver.java +++ b/language/src/main/java/de/monticore/lang/sysmlv2/types/SysMLDeriver.java @@ -2,6 +2,7 @@ package de.monticore.lang.sysmlv2.types; import de.monticore.expressions.commonexpressions._ast.ASTFieldAccessExpression; +import de.monticore.expressions.expressionsbasis._ast.ASTNameExpression; import de.monticore.lang.sysmlexpressions.SysMLExpressionsMill; import de.monticore.lang.sysmlv2.SysMLv2Mill; import de.monticore.lang.sysmlv2._visitor.SysMLv2Traverser; @@ -11,8 +12,11 @@ import de.monticore.types.check.DeriveSymTypeOfExpression; import de.monticore.types.check.DeriveSymTypeOfLiterals; import de.monticore.types.check.DeriveSymTypeOfMCCommonLiterals; +import de.monticore.types.check.SymTypeExpression; import de.monticore.types.check.SynthesizeSymTypeFromMCBasicTypes; +import java.util.Optional; + @Deprecated public class SysMLDeriver extends AbstractDerive { /** @@ -53,7 +57,18 @@ public void init() { commonLiterals.setTypeCheckResult(typeCheckResult); getTraverser().add4MCCommonLiterals(commonLiterals); - DeriveSymTypeOfExpression forBasisExpr = new DeriveSymTypeOfExpression(); + DeriveSymTypeOfExpression forBasisExpr = new DeriveSymTypeOfExpression() { + @Override + public void traverse(ASTNameExpression expr) { + Optional wholeResult = calculateNameExpression(expr); + if (wholeResult.isPresent()) { + getTypeCheckResult().setResult(wholeResult.get()); + } else { + getTypeCheckResult().reset(); + getTypeCheckResult().setResult(new SilentObscureType()); + } + } + }; forBasisExpr.setTypeCheckResult(typeCheckResult); getTraverser().add4ExpressionsBasis(forBasisExpr); getTraverser().setExpressionsBasisHandler(forBasisExpr); From ac2a17c9e846f79cb4b347fa7d8399e2b8d976cf Mon Sep 17 00:00:00 2001 From: Dovydas Skauranskas <109866625+DovydasSkauranskas@users.noreply.github.com> Date: Sun, 18 Jan 2026 10:39:06 +0200 Subject: [PATCH 2/6] Neuer Eps Typ --- .../monticore/lang/sysmlv2/SysMLv2Mill.java | 18 +++++++++++++ .../sysmlv2/cocos/ConstraintIsBoolean.java | 3 +-- .../cocos/TypeCheckTransitionGuards.java | 7 +++-- .../lang/sysmlv2/types/SilentObscureType.java | 27 ------------------- .../lang/sysmlv2/types/SysMLDeriver.java | 5 +++- 5 files changed, 26 insertions(+), 34 deletions(-) delete mode 100644 language/src/main/java/de/monticore/lang/sysmlv2/types/SilentObscureType.java diff --git a/language/src/main/java/de/monticore/lang/sysmlv2/SysMLv2Mill.java b/language/src/main/java/de/monticore/lang/sysmlv2/SysMLv2Mill.java index 04fd57b2..d9dc1f6b 100644 --- a/language/src/main/java/de/monticore/lang/sysmlv2/SysMLv2Mill.java +++ b/language/src/main/java/de/monticore/lang/sysmlv2/SysMLv2Mill.java @@ -32,6 +32,7 @@ public static void prepareGlobalScope() { SysMLv2Mill.initializePrimitives(); SysMLv2Mill.addStringType(); SysMLv2Mill.addCollectionTypes(); + SysMLv2Mill.addTsynTypes(); } /** @@ -171,6 +172,23 @@ protected void _addCollectionTypes() { } } + public static void addTsynTypes() { + getMill()._addTsynTypes(); + } + + protected void _addTsynTypes() { + if (SysMLv2Mill.globalScope().resolveType("Eps").isEmpty()) { + var eps = typeSymbolBuilder() + .setName("Eps") + .setEnclosingScope(globalScope()) + .setFullName("Eps") + .setSpannedScope(scope()) + .setAccessModifier(AccessModifier.ALL_INCLUSION) + .build(); + SysMLv2Mill.globalScope().add(eps); + } + } + protected OOTypeSymbol buildCollectionType(String name, String... typeVars) { var spannedScope = scope(); diff --git a/language/src/main/java/de/monticore/lang/sysmlv2/cocos/ConstraintIsBoolean.java b/language/src/main/java/de/monticore/lang/sysmlv2/cocos/ConstraintIsBoolean.java index e342ad81..da64dfc0 100644 --- a/language/src/main/java/de/monticore/lang/sysmlv2/cocos/ConstraintIsBoolean.java +++ b/language/src/main/java/de/monticore/lang/sysmlv2/cocos/ConstraintIsBoolean.java @@ -22,8 +22,7 @@ public class ConstraintIsBoolean implements SysMLConstraintsASTConstraintUsageCo try { TypeCheckResult type = deriver.deriveType(expr); - if(!type.isPresentResult() || type.getResult().isObscureType()) { - } else if(type.getResult().getTypeInfo() == null) { + if(!type.isPresentResult() || type.getResult().getTypeInfo() == null) { var start = node.get_SourcePositionStart(); var end = constraintEnd(start); Log.error("0x80001 Failed to derive a type!", start, end); diff --git a/language/src/main/java/de/monticore/lang/sysmlv2/cocos/TypeCheckTransitionGuards.java b/language/src/main/java/de/monticore/lang/sysmlv2/cocos/TypeCheckTransitionGuards.java index b322bef1..15a4f6e5 100644 --- a/language/src/main/java/de/monticore/lang/sysmlv2/cocos/TypeCheckTransitionGuards.java +++ b/language/src/main/java/de/monticore/lang/sysmlv2/cocos/TypeCheckTransitionGuards.java @@ -22,10 +22,9 @@ public void check(ASTSysMLTransition node) { try { TypeCheckResult type = deriver.deriveType(expr); if(!type.isPresentResult() || type.getResult().getTypeInfo() == null) { - // NOTE: Kurzfristig deaktiviert, um Symbole wie 'Eps' und 'Tick' zu erlauben - // Log.error("0x80004 Failed to derive a type!", - // expr.get_SourcePositionStart(), - // expr.get_SourcePositionEnd()); + Log.error("0x80004 Failed to derive a type!", + expr.get_SourcePositionStart(), + expr.get_SourcePositionEnd()); } else if(!type.getResult().printFullName().equals("boolean")) { Log.error("0x80005 The expression type is '" + type.getResult().printFullName() + "' but should be boolean!", diff --git a/language/src/main/java/de/monticore/lang/sysmlv2/types/SilentObscureType.java b/language/src/main/java/de/monticore/lang/sysmlv2/types/SilentObscureType.java deleted file mode 100644 index a3dd806c..00000000 --- a/language/src/main/java/de/monticore/lang/sysmlv2/types/SilentObscureType.java +++ /dev/null @@ -1,27 +0,0 @@ -/* (c) https://github.com/MontiCore/monticore */ -package de.monticore.lang.sysmlv2.types; - -import de.monticore.symbols.basicsymbols._symboltable.TypeSymbol; -import de.monticore.types.check.SymTypeExpression; -import de.monticore.types.check.SymTypeObscure; - -/** - * Kurzfristige Lösung, damit Symbole wie 'Eps' und 'Tick' keine Fehler werfen - */ -public class SilentObscureType extends SymTypeObscure { - - @Override - public SymTypeExpression deepClone() { - return new SilentObscureType(); - } - - @Override - public TypeSymbol getTypeInfo() { - return null; - } - - @Override - public boolean hasTypeInfo() { - return false; - } -} diff --git a/language/src/main/java/de/monticore/lang/sysmlv2/types/SysMLDeriver.java b/language/src/main/java/de/monticore/lang/sysmlv2/types/SysMLDeriver.java index bfcb602c..fade523c 100644 --- a/language/src/main/java/de/monticore/lang/sysmlv2/types/SysMLDeriver.java +++ b/language/src/main/java/de/monticore/lang/sysmlv2/types/SysMLDeriver.java @@ -14,6 +14,7 @@ import de.monticore.types.check.DeriveSymTypeOfMCCommonLiterals; import de.monticore.types.check.SymTypeExpression; import de.monticore.types.check.SynthesizeSymTypeFromMCBasicTypes; +import de.se_rwth.commons.logging.Log; import java.util.Optional; @@ -65,7 +66,9 @@ public void traverse(ASTNameExpression expr) { getTypeCheckResult().setResult(wholeResult.get()); } else { getTypeCheckResult().reset(); - getTypeCheckResult().setResult(new SilentObscureType()); + Log.error("0x80010 Cannot resolve symbol: " + expr.getName(), + expr.get_SourcePositionStart(), + expr.get_SourcePositionEnd()); } } }; From 301ec2934f96f23624c2575512f332b30a5f92f2 Mon Sep 17 00:00:00 2001 From: Dovydas Skauranskas <109866625+DovydasSkauranskas@users.noreply.github.com> Date: Sun, 18 Jan 2026 10:39:50 +0200 Subject: [PATCH 3/6] clean up --- .../lang/sysmlv2/types/SysMLDeriver.java | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/language/src/main/java/de/monticore/lang/sysmlv2/types/SysMLDeriver.java b/language/src/main/java/de/monticore/lang/sysmlv2/types/SysMLDeriver.java index fade523c..dad93edb 100644 --- a/language/src/main/java/de/monticore/lang/sysmlv2/types/SysMLDeriver.java +++ b/language/src/main/java/de/monticore/lang/sysmlv2/types/SysMLDeriver.java @@ -58,20 +58,7 @@ public void init() { commonLiterals.setTypeCheckResult(typeCheckResult); getTraverser().add4MCCommonLiterals(commonLiterals); - DeriveSymTypeOfExpression forBasisExpr = new DeriveSymTypeOfExpression() { - @Override - public void traverse(ASTNameExpression expr) { - Optional wholeResult = calculateNameExpression(expr); - if (wholeResult.isPresent()) { - getTypeCheckResult().setResult(wholeResult.get()); - } else { - getTypeCheckResult().reset(); - Log.error("0x80010 Cannot resolve symbol: " + expr.getName(), - expr.get_SourcePositionStart(), - expr.get_SourcePositionEnd()); - } - } - }; + DeriveSymTypeOfExpression forBasisExpr = new DeriveSymTypeOfExpression(); forBasisExpr.setTypeCheckResult(typeCheckResult); getTraverser().add4ExpressionsBasis(forBasisExpr); getTraverser().setExpressionsBasisHandler(forBasisExpr); From 4203d03241bcd98d424cd7e451c943bf4b261e48 Mon Sep 17 00:00:00 2001 From: Dovydas Skauranskas <109866625+DovydasSkauranskas@users.noreply.github.com> Date: Sun, 18 Jan 2026 10:40:22 +0200 Subject: [PATCH 4/6] clean up --- .../java/de/monticore/lang/sysmlv2/types/SysMLDeriver.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/language/src/main/java/de/monticore/lang/sysmlv2/types/SysMLDeriver.java b/language/src/main/java/de/monticore/lang/sysmlv2/types/SysMLDeriver.java index dad93edb..67648b3e 100644 --- a/language/src/main/java/de/monticore/lang/sysmlv2/types/SysMLDeriver.java +++ b/language/src/main/java/de/monticore/lang/sysmlv2/types/SysMLDeriver.java @@ -12,11 +12,7 @@ import de.monticore.types.check.DeriveSymTypeOfExpression; import de.monticore.types.check.DeriveSymTypeOfLiterals; import de.monticore.types.check.DeriveSymTypeOfMCCommonLiterals; -import de.monticore.types.check.SymTypeExpression; import de.monticore.types.check.SynthesizeSymTypeFromMCBasicTypes; -import de.se_rwth.commons.logging.Log; - -import java.util.Optional; @Deprecated public class SysMLDeriver extends AbstractDerive { From b7387af2efe922b80168702901463112e287ffdd Mon Sep 17 00:00:00 2001 From: Dovydas Skauranskas <109866625+DovydasSkauranskas@users.noreply.github.com> Date: Sun, 18 Jan 2026 10:40:49 +0200 Subject: [PATCH 5/6] clean up --- .../main/java/de/monticore/lang/sysmlv2/types/SysMLDeriver.java | 1 - 1 file changed, 1 deletion(-) diff --git a/language/src/main/java/de/monticore/lang/sysmlv2/types/SysMLDeriver.java b/language/src/main/java/de/monticore/lang/sysmlv2/types/SysMLDeriver.java index 67648b3e..e59805cf 100644 --- a/language/src/main/java/de/monticore/lang/sysmlv2/types/SysMLDeriver.java +++ b/language/src/main/java/de/monticore/lang/sysmlv2/types/SysMLDeriver.java @@ -2,7 +2,6 @@ package de.monticore.lang.sysmlv2.types; import de.monticore.expressions.commonexpressions._ast.ASTFieldAccessExpression; -import de.monticore.expressions.expressionsbasis._ast.ASTNameExpression; import de.monticore.lang.sysmlexpressions.SysMLExpressionsMill; import de.monticore.lang.sysmlv2.SysMLv2Mill; import de.monticore.lang.sysmlv2._visitor.SysMLv2Traverser; From 01ffccd459f38cb7e03581510adceb654932b912 Mon Sep 17 00:00:00 2001 From: Dovydas Skauranskas <109866625+DovydasSkauranskas@users.noreply.github.com> Date: Tue, 20 Jan 2026 21:34:52 +0200 Subject: [PATCH 6/6] Test erstellt --- .../test/java/symboltable/TsynTypeTest.java | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 language/src/test/java/symboltable/TsynTypeTest.java diff --git a/language/src/test/java/symboltable/TsynTypeTest.java b/language/src/test/java/symboltable/TsynTypeTest.java new file mode 100644 index 00000000..f15f07ec --- /dev/null +++ b/language/src/test/java/symboltable/TsynTypeTest.java @@ -0,0 +1,51 @@ +package symboltable; + +import de.monticore.lang.sysmlv2.SysMLv2Mill; +import de.monticore.lang.sysmlv2.SysMLv2Tool; +import de.monticore.lang.sysmlv2._ast.ASTSysMLModel; +import de.se_rwth.commons.logging.Log; +import de.se_rwth.commons.logging.LogStub; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class TsynTypeTest { + + @BeforeAll + static void setup() { + SysMLv2Mill.init(); + } + + @BeforeEach + public void init() { + LogStub.init(); + SysMLv2Mill.globalScope().clear(); + SysMLv2Mill.initializePrimitives(); + SysMLv2Mill.addCollectionTypes(); + SysMLv2Mill.addTsynTypes(); + Log.clearFindings(); + } + + @Test + public void testEpsInModel() throws IOException { + var tool = new SysMLv2Tool(); + + var model = "part def Valid { attribute e: Eps; }"; + var optAst = SysMLv2Mill.parser().parse_String(model); + + assertThat(optAst).isPresent(); + ASTSysMLModel ast = optAst.get(); + + tool.createSymbolTable(ast); + tool.completeSymbolTable(ast); + + assertTrue(Log.getFindings().isEmpty(), () -> Log.getFindings().toString()); + } + +}