From 8981ff5c40b26afdd48b2e21e58c40ab47c15c56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20L=C3=BCpges?= Date: Wed, 30 Sep 2026 09:29:18 +0200 Subject: [PATCH 1/6] Add QualifiedTypeHasNoTypeParameters & fix type param usage of visitors --- .../codegen/decorators/VisitorDecorator.java | 37 +++++++++++++++++++ .../VisitorImplementationDecorator.java | 16 ++++++++ .../monticore/cd4code/cocos/CD4CodeCoCos.java | 3 ++ .../cd/cdgen/VisitorDecoratorTest.java | 1 + 4 files changed, 57 insertions(+) diff --git a/cdlang/src/main/java/de/monticore/cd/codegen/decorators/VisitorDecorator.java b/cdlang/src/main/java/de/monticore/cd/codegen/decorators/VisitorDecorator.java index 988d735ba..0aae0028b 100644 --- a/cdlang/src/main/java/de/monticore/cd/codegen/decorators/VisitorDecorator.java +++ b/cdlang/src/main/java/de/monticore/cd/codegen/decorators/VisitorDecorator.java @@ -8,6 +8,7 @@ import de.monticore.cd.methodtemplates.CD4C; import de.monticore.cd4code.CD4CodeMill; import de.monticore.cd4code._visitor.CD4CodeTraverser; +import de.monticore.cd4codebasis._ast.ASTCDClass; import de.monticore.cd4codebasis._ast.ASTCDInterface; import de.monticore.cd4codebasis._ast.ASTCDMethod; import de.monticore.cd4codebasis._ast.ASTCDParameter; @@ -18,9 +19,14 @@ import de.monticore.types.MCTypeFacade; import de.monticore.types.mcbasictypes._ast.ASTMCQualifiedType; import de.monticore.types.mcbasictypes._ast.ASTMCType; +import de.monticore.types.mccollectiontypes._ast.ASTMCTypeArgument; +import de.monticore.types.mcfullgenerictypes._ast.ASTMCWildcardTypeArgumentBuilder; +import de.monticore.types.typeparameters._ast.ASTTypeParameter; +import de.se_rwth.commons.logging.Log; import javax.annotation.Nullable; import java.util.*; +import java.util.stream.Collectors; import static de.monticore.cd.codegen.CD2JavaTemplates.EMPTY_BODY; @@ -77,6 +83,17 @@ public void endVisit(ASTCDDefinition clazz) { this._interfaceVisitorArtifact = null; } + static ASTMCTypeArgument typeParamToArg(ASTTypeParameter parameter) { + ASTMCWildcardTypeArgumentBuilder wildcardTypeArgumentBuilder = CD4CodeMill + .mCWildcardTypeArgumentBuilder(); + if (!parameter.getMCTypeList().isEmpty()) { + // without extends + Log.error("0xTODO: NYI multiple extends of ASTTypeParameter " + parameter, parameter + .get_SourcePositionStart(), parameter.get_SourcePositionEnd()); + } + return wildcardTypeArgumentBuilder.build(); + } + @Override public void visit(ASTCDType type) { if (decoratorData.shouldDecorate(this.getClass(), type)) { @@ -94,6 +111,26 @@ public void visit(ASTCDType type) { .setMCType(visitorInterfaceQualifiedType).build(); //create a type of the class ASTMCType classType = MCTypeFacade.getInstance().createQualifiedType(type.getName()); + + // Workaround to add type paras + if (type instanceof ASTCDClass typeOfClass) { + if (typeOfClass.isPresentTypeParameters() && !typeOfClass.getTypeParameters() + .getTypeParameterList().isEmpty()) { + classType = CD4CodeMill.mCBasicGenericTypeBuilder().addName(type.getName()) + .addAllMCTypeArguments(typeOfClass.getTypeParameters().getTypeParameterList().stream() + .map(VisitorDecorator::typeParamToArg).collect(Collectors.toList())).build(); + } + } + else if (type instanceof ASTCDInterface typeOfInterface) { + if (typeOfInterface.isPresentTypeParameters() && !typeOfInterface.getTypeParameters() + .getTypeParameterList().isEmpty()) { + classType = CD4CodeMill.mCBasicGenericTypeBuilder().addName(type.getName()) + .addAllMCTypeArguments(typeOfInterface.getTypeParameters().getTypeParameterList() + .stream().map(VisitorDecorator::typeParamToArg).collect(Collectors.toList())) + .build(); + } + } + ASTCDParameter classParameter = CD4CodeMill.cDParameterBuilder().setName("node").setMCType( classType).build(); diff --git a/cdlang/src/main/java/de/monticore/cd/codegen/decorators/VisitorImplementationDecorator.java b/cdlang/src/main/java/de/monticore/cd/codegen/decorators/VisitorImplementationDecorator.java index 9047a11dc..88a1e9a6e 100644 --- a/cdlang/src/main/java/de/monticore/cd/codegen/decorators/VisitorImplementationDecorator.java +++ b/cdlang/src/main/java/de/monticore/cd/codegen/decorators/VisitorImplementationDecorator.java @@ -29,6 +29,7 @@ import java.util.Objects; import java.util.Optional; import java.util.Stack; +import java.util.stream.Collectors; import static de.monticore.cd.codegen.CD2JavaTemplates.EMPTY_BODY; @@ -107,6 +108,15 @@ public void visit(ASTCDClass clazz) { if (decoratorData.shouldDecorate(this.getClass(), clazz)) { ASTCDClass decClazz = decoratorData.getAsDecorated(clazz); ASTMCType classType = MCTypeFacade.getInstance().createQualifiedType(clazz.getName()); + // Workaround to add type paras + if (clazz instanceof de.monticore.cd4codebasis._ast.ASTCDClass typeOfClass) { + if (typeOfClass.isPresentTypeParameters() && !typeOfClass.getTypeParameters() + .getTypeParameterList().isEmpty()) { + classType = CD4CodeMill.mCBasicGenericTypeBuilder().addName(clazz.getName()) + .addAllMCTypeArguments(typeOfClass.getTypeParameters().getTypeParameterList().stream() + .map(VisitorDecorator::typeParamToArg).collect(Collectors.toList())).build(); + } + } ASTCDParameter classParameter = CD4CodeMill.cDParameterBuilder().setName("node").setMCType( classType).build(); @@ -223,6 +233,12 @@ public void endVisit(ASTCDClass clazz) { public void visit(ASTCDInterface cdInterface) { if (decoratorData.shouldDecorate(this.getClass(), cdInterface)) { ASTMCType classType = MCTypeFacade.getInstance().createQualifiedType(cdInterface.getName()); + if (cdInterface.isPresentTypeParameters() && !cdInterface.getTypeParameters() + .getTypeParameterList().isEmpty()) { + classType = CD4CodeMill.mCBasicGenericTypeBuilder().addName(cdInterface.getName()) + .addAllMCTypeArguments(cdInterface.getTypeParameters().getTypeParameterList().stream() + .map(VisitorDecorator::typeParamToArg).collect(Collectors.toList())).build(); + } ASTCDParameter classParameter = CD4CodeMill.cDParameterBuilder().setName("node").setMCType( classType).build(); diff --git a/cdlang/src/main/java/de/monticore/cd4code/cocos/CD4CodeCoCos.java b/cdlang/src/main/java/de/monticore/cd4code/cocos/CD4CodeCoCos.java index b06342fb6..055108496 100644 --- a/cdlang/src/main/java/de/monticore/cd4code/cocos/CD4CodeCoCos.java +++ b/cdlang/src/main/java/de/monticore/cd4code/cocos/CD4CodeCoCos.java @@ -4,6 +4,7 @@ import de.monticore.cd.cocos.CoCoParent; import de.monticore.cd4code._cocos.CD4CodeCoCoChecker; import de.monticore.cdbasis.cocos.ebnf.CDAttributeOverridden; +import de.monticore.types.mcbasictypes.cocos.QualifiedTypeHasNoTypeParameters; import de.monticore.types.typeparameters.cocos.TypeParameterNoCyclicInheritance; import de.monticore.types.typeparameters.cocos.TypeParametersHaveUniqueNames; @@ -31,6 +32,8 @@ public CD4CodeCoCoChecker addCheckerForEbnfCoCos(CD4CodeCoCoChecker checker) { checker.addCoCo(new TypeParametersHaveUniqueNames()); // TypeParameter checker.addCoCo(new TypeParameterNoCyclicInheritance()); + // MCBasicTypes + checker.addCoCo(new QualifiedTypeHasNoTypeParameters()); return checker; } diff --git a/cdlang/src/test/java/de/monticore/cd/cdgen/VisitorDecoratorTest.java b/cdlang/src/test/java/de/monticore/cd/cdgen/VisitorDecoratorTest.java index 234387227..4378be76a 100644 --- a/cdlang/src/test/java/de/monticore/cd/cdgen/VisitorDecoratorTest.java +++ b/cdlang/src/test/java/de/monticore/cd/cdgen/VisitorDecoratorTest.java @@ -48,6 +48,7 @@ public class C5 {} association [0..1] C <-> (optC) C2 [0..1]; association [*] C <-> (manyManyC) C3 [*]; association C <-> (manyC4) C4 [*]; + class WithTO {} }"""); From ed6c9ebcc9172b43bd43fff7d893c73fae9bdcad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20L=C3=BCpges?= Date: Wed, 30 Sep 2026 16:50:28 +0200 Subject: [PATCH 2/6] Fix import.cd --- .../de/monticore/cdbasis/parser/Import.cd | 2 +- .../de/monticore/cdbasis/parser/Simple.cdsym | 154 +++++++++++++++++- .../java/de/monticore/cd/TestBasis.java | 2 + .../monticore/cd4code/CD4CodeTestBasis.java | 2 +- 4 files changed, 157 insertions(+), 3 deletions(-) diff --git a/cdlang/src/test/resources/de/monticore/cdbasis/parser/Import.cd b/cdlang/src/test/resources/de/monticore/cdbasis/parser/Import.cd index 16ae49b3d..5ca163f40 100644 --- a/cdlang/src/test/resources/de/monticore/cdbasis/parser/Import.cd +++ b/cdlang/src/test/resources/de/monticore/cdbasis/parser/Import.cd @@ -1,7 +1,7 @@ /* (c) https://github.com/MontiCore/monticore */ package de.monticore.cdbasis.parser; -import de.monticore.cdbasis.parser.Simple; +import de.monticore.cdbasis.parser.Simple.C; classdiagram Import { diff --git a/cdlang/src/test/resources/de/monticore/cdbasis/parser/Simple.cdsym b/cdlang/src/test/resources/de/monticore/cdbasis/parser/Simple.cdsym index eee9094b5..911378c32 100644 --- a/cdlang/src/test/resources/de/monticore/cdbasis/parser/Simple.cdsym +++ b/cdlang/src/test/resources/de/monticore/cdbasis/parser/Simple.cdsym @@ -1 +1,153 @@ -{"name":"Simple","package":"de.monticore.cdbasis.parser","kindHierarchy":[["de.monticore.cd4code._symboltable.CDRoleSymbol","de.monticore.symbols.oosymbols._symboltable.FieldSymbol"],["de.monticore.cd4code._symboltable.CDTypeSymbol","de.monticore.symbols.oosymbols._symboltable.OOTypeSymbol"],["de.monticore.cd4code._symboltable.FieldSymbol","de.monticore.symbols.basicsymbols._symboltable.VariableSymbol"],["de.monticore.cd4code._symboltable.CDMethodSignatureSymbol","de.monticore.symbols.oosymbols._symboltable.MethodSymbol"],["de.monticore.cd4code._symboltable.OOTypeSymbol","de.monticore.symbols.basicsymbols._symboltable.TypeSymbol"],["de.monticore.cd4code._symboltable.MethodSymbol","de.monticore.symbols.basicsymbols._symboltable.FunctionSymbol"],["de.monticore.cd4code._symboltable.TypeVarSymbol","de.monticore.symbols.basicsymbols._symboltable.TypeSymbol"]],"symbols":[{"kind":"de.monticore.cdbasis._symboltable.CDPackageSymbol","name":"de.monticore.cdbasis.parser","spannedScope":{"isShadowingScope":false,"symbols":[{"kind":"de.monticore.cdbasis._symboltable.CDTypeSymbol","name":"A","isClass":true,"isInterface":false,"isEnum":false,"isAbstract":false,"isPrivate":false,"isProtected":false,"isPublic":false,"isStatic":false,"isFinal":false},{"kind":"de.monticore.cdbasis._symboltable.CDTypeSymbol","name":"B","isClass":true,"isInterface":false,"isEnum":false,"isAbstract":false,"isPrivate":false,"isProtected":false,"isPublic":false,"isStatic":false,"isFinal":false},{"kind":"de.monticore.cdbasis._symboltable.CDTypeSymbol","name":"S","isClass":true,"isInterface":false,"isEnum":false,"isAbstract":false,"isPrivate":false,"isProtected":false,"isPublic":false,"isStatic":false,"isFinal":false},{"kind":"de.monticore.cdbasis._symboltable.CDTypeSymbol","name":"C","superTypes":[{"kind":"de.monticore.types.check.SymTypeOfObject","objName":"de.monticore.cdbasis.parser.A"},{"kind":"de.monticore.types.check.SymTypeOfObject","objName":"de.monticore.cdbasis.parser.B"}],"isClass":true,"isInterface":false,"isEnum":false,"isAbstract":false,"isPrivate":false,"isProtected":false,"isPublic":false,"isStatic":false,"isFinal":false,"spannedScope":{"isShadowingScope":false,"symbols":[{"kind":"de.monticore.symbols.oosymbols._symboltable.FieldSymbol","name":"name","isPrivate":false,"isProtected":false,"isPublic":false,"isStatic":false,"isFinal":false,"type":{"kind":"de.monticore.types.check.SymTypeOfObject","objName":"de.monticore.cdbasis.parser.String"},"isReadOnly":false},{"kind":"de.monticore.symbols.oosymbols._symboltable.FieldSymbol","name":"x","isPrivate":false,"isProtected":false,"isPublic":false,"isStatic":false,"isFinal":false,"type":{"kind":"de.monticore.types.check.SymTypeConstant","constName":"int"},"isReadOnly":false},{"kind":"de.monticore.symbols.oosymbols._symboltable.FieldSymbol","name":"s","isPrivate":false,"isProtected":false,"isPublic":false,"isStatic":false,"isFinal":false,"type":{"kind":"de.monticore.types.check.SymTypeOfObject","objName":"de.monticore.cdbasis.parser.S"},"isReadOnly":false},{"kind":"de.monticore.symbols.basicsymbols._symboltable.VariableSymbol","name":"name","type":{"kind":"de.monticore.types.check.SymTypeOfObject","objName":"de.monticore.cdbasis.parser.String"},"isReadOnly":false},{"kind":"de.monticore.symbols.basicsymbols._symboltable.VariableSymbol","name":"x","type":{"kind":"de.monticore.types.check.SymTypeConstant","constName":"int"},"isReadOnly":false},{"kind":"de.monticore.symbols.basicsymbols._symboltable.VariableSymbol","name":"s","type":{"kind":"de.monticore.types.check.SymTypeOfObject","objName":"de.monticore.cdbasis.parser.S"},"isReadOnly":false}]}},{"kind":"de.monticore.symbols.oosymbols._symboltable.OOTypeSymbol","name":"A","isClass":true,"isInterface":false,"isEnum":false,"isAbstract":false,"isPrivate":false,"isProtected":false,"isPublic":false,"isStatic":false,"isFinal":false},{"kind":"de.monticore.symbols.oosymbols._symboltable.OOTypeSymbol","name":"B","isClass":true,"isInterface":false,"isEnum":false,"isAbstract":false,"isPrivate":false,"isProtected":false,"isPublic":false,"isStatic":false,"isFinal":false},{"kind":"de.monticore.symbols.oosymbols._symboltable.OOTypeSymbol","name":"S","isClass":true,"isInterface":false,"isEnum":false,"isAbstract":false,"isPrivate":false,"isProtected":false,"isPublic":false,"isStatic":false,"isFinal":false},{"kind":"de.monticore.symbols.oosymbols._symboltable.OOTypeSymbol","name":"C","isClass":true,"isInterface":false,"isEnum":false,"isAbstract":false,"isPrivate":false,"isProtected":false,"isPublic":false,"isStatic":false,"isFinal":false,"superTypes":[{"kind":"de.monticore.types.check.SymTypeOfObject","objName":"de.monticore.cdbasis.parser.A"},{"kind":"de.monticore.types.check.SymTypeOfObject","objName":"de.monticore.cdbasis.parser.B"}],"spannedScope":{"isShadowingScope":false,"symbols":[{"kind":"de.monticore.symbols.oosymbols._symboltable.FieldSymbol","name":"name","isPrivate":false,"isProtected":false,"isPublic":false,"isStatic":false,"isFinal":false,"type":{"kind":"de.monticore.types.check.SymTypeOfObject","objName":"de.monticore.cdbasis.parser.String"},"isReadOnly":false},{"kind":"de.monticore.symbols.oosymbols._symboltable.FieldSymbol","name":"x","isPrivate":false,"isProtected":false,"isPublic":false,"isStatic":false,"isFinal":false,"type":{"kind":"de.monticore.types.check.SymTypeConstant","constName":"int"},"isReadOnly":false},{"kind":"de.monticore.symbols.oosymbols._symboltable.FieldSymbol","name":"s","isPrivate":false,"isProtected":false,"isPublic":false,"isStatic":false,"isFinal":false,"type":{"kind":"de.monticore.types.check.SymTypeOfObject","objName":"de.monticore.cdbasis.parser.S"},"isReadOnly":false},{"kind":"de.monticore.symbols.basicsymbols._symboltable.VariableSymbol","name":"name","type":{"kind":"de.monticore.types.check.SymTypeOfObject","objName":"de.monticore.cdbasis.parser.String"},"isReadOnly":false},{"kind":"de.monticore.symbols.basicsymbols._symboltable.VariableSymbol","name":"x","type":{"kind":"de.monticore.types.check.SymTypeConstant","constName":"int"},"isReadOnly":false},{"kind":"de.monticore.symbols.basicsymbols._symboltable.VariableSymbol","name":"s","type":{"kind":"de.monticore.types.check.SymTypeOfObject","objName":"de.monticore.cdbasis.parser.S"},"isReadOnly":false}]}},{"kind":"de.monticore.symbols.basicsymbols._symboltable.TypeSymbol","name":"A"},{"kind":"de.monticore.symbols.basicsymbols._symboltable.TypeSymbol","name":"B"},{"kind":"de.monticore.symbols.basicsymbols._symboltable.TypeSymbol","name":"S"},{"kind":"de.monticore.symbols.basicsymbols._symboltable.TypeSymbol","name":"C","superTypes":[{"kind":"de.monticore.types.check.SymTypeOfObject","objName":"de.monticore.cdbasis.parser.A"},{"kind":"de.monticore.types.check.SymTypeOfObject","objName":"de.monticore.cdbasis.parser.B"}],"spannedScope":{"isShadowingScope":false,"symbols":[{"kind":"de.monticore.symbols.oosymbols._symboltable.FieldSymbol","name":"name","isPrivate":false,"isProtected":false,"isPublic":false,"isStatic":false,"isFinal":false,"type":{"kind":"de.monticore.types.check.SymTypeOfObject","objName":"de.monticore.cdbasis.parser.String"},"isReadOnly":false},{"kind":"de.monticore.symbols.oosymbols._symboltable.FieldSymbol","name":"x","isPrivate":false,"isProtected":false,"isPublic":false,"isStatic":false,"isFinal":false,"type":{"kind":"de.monticore.types.check.SymTypeConstant","constName":"int"},"isReadOnly":false},{"kind":"de.monticore.symbols.oosymbols._symboltable.FieldSymbol","name":"s","isPrivate":false,"isProtected":false,"isPublic":false,"isStatic":false,"isFinal":false,"type":{"kind":"de.monticore.types.check.SymTypeOfObject","objName":"de.monticore.cdbasis.parser.S"},"isReadOnly":false},{"kind":"de.monticore.symbols.basicsymbols._symboltable.VariableSymbol","name":"name","type":{"kind":"de.monticore.types.check.SymTypeOfObject","objName":"de.monticore.cdbasis.parser.String"},"isReadOnly":false},{"kind":"de.monticore.symbols.basicsymbols._symboltable.VariableSymbol","name":"x","type":{"kind":"de.monticore.types.check.SymTypeConstant","constName":"int"},"isReadOnly":false},{"kind":"de.monticore.symbols.basicsymbols._symboltable.VariableSymbol","name":"s","type":{"kind":"de.monticore.types.check.SymTypeOfObject","objName":"de.monticore.cdbasis.parser.S"},"isReadOnly":false}]}}]}}]} +{ + "generated-using": "www.MontiCore.de technology", + "name": "Simple", + "package": "de.monticore.cdbasis.parser", + "symbols": [ + { + "kind": "de.monticore.cdbasis._symboltable.CDTypeSymbol", + "name": "A", + "fullName": "de.monticore.cdbasis.parser.Simple.A", + "packageName": "de.monticore.cdbasis.parser.Simple", + "isClass": true, + "spannedScope": { + "symbols": [ + { + "kind": "de.monticore.cd4codebasis._symboltable.CDMethodSignatureSymbol", + "name": "A", + "fullName": "A", + "type": { + "kind": "de.monticore.types.check.SymTypeOfObject", + "objName": "de.monticore.cdbasis.parser.Simple.A" + }, + "isConstructor": true, + "isPublic": true, + "isStatic": true + } + ] + } + }, + { + "kind": "de.monticore.cdbasis._symboltable.CDTypeSymbol", + "name": "B", + "fullName": "de.monticore.cdbasis.parser.Simple.B", + "packageName": "de.monticore.cdbasis.parser.Simple", + "isClass": true, + "spannedScope": { + "symbols": [ + { + "kind": "de.monticore.cd4codebasis._symboltable.CDMethodSignatureSymbol", + "name": "B", + "fullName": "B", + "type": { + "kind": "de.monticore.types.check.SymTypeOfObject", + "objName": "de.monticore.cdbasis.parser.Simple.B" + }, + "isConstructor": true, + "isPublic": true, + "isStatic": true + } + ] + } + }, + { + "kind": "de.monticore.cdbasis._symboltable.CDTypeSymbol", + "name": "S", + "fullName": "de.monticore.cdbasis.parser.Simple.S", + "packageName": "de.monticore.cdbasis.parser.Simple", + "isClass": true, + "spannedScope": { + "symbols": [ + { + "kind": "de.monticore.cd4codebasis._symboltable.CDMethodSignatureSymbol", + "name": "S", + "fullName": "S", + "type": { + "kind": "de.monticore.types.check.SymTypeOfObject", + "objName": "de.monticore.cdbasis.parser.Simple.S" + }, + "isConstructor": true, + "isPublic": true, + "isStatic": true + } + ] + } + }, + { + "kind": "de.monticore.cdbasis._symboltable.CDTypeSymbol", + "name": "C", + "fullName": "de.monticore.cdbasis.parser.Simple.C", + "packageName": "de.monticore.cdbasis.parser.Simple", + "superTypes": [ + { + "kind": "de.monticore.types.check.SymTypeOfObject", + "objName": "de.monticore.cdbasis.parser.Simple.A" + }, + { + "kind": "de.monticore.types.check.SymTypeOfObject", + "objName": "de.monticore.cdbasis.parser.Simple.B" + } + ], + "isClass": true, + "spannedScope": { + "symbols": [ + { + "kind": "de.monticore.cd4codebasis._symboltable.CDMethodSignatureSymbol", + "name": "C", + "fullName": "C", + "type": { + "kind": "de.monticore.types.check.SymTypeOfObject", + "objName": "de.monticore.cdbasis.parser.Simple.C" + }, + "isConstructor": true, + "isPublic": true, + "isStatic": true + }, + { + "kind": "de.monticore.symbols.oosymbols._symboltable.FieldSymbol", + "name": "name", + "fullName": "de.monticore.cdbasis.parser.Simple.C.name", + "packageName": "de.monticore.cdbasis.parser.Simple", + "type": { + "kind": "de.monticore.types.check.SymTypeOfObject", + "objName": "java.lang.String" + } + }, + { + "kind": "de.monticore.symbols.oosymbols._symboltable.FieldSymbol", + "name": "x", + "fullName": "de.monticore.cdbasis.parser.Simple.C.x", + "packageName": "de.monticore.cdbasis.parser.Simple", + "type": { + "kind": "de.monticore.types.check.SymTypePrimitive", + "primitiveName": "int" + } + }, + { + "kind": "de.monticore.symbols.oosymbols._symboltable.FieldSymbol", + "name": "s", + "fullName": "de.monticore.cdbasis.parser.Simple.C.s", + "packageName": "de.monticore.cdbasis.parser.Simple", + "type": { + "kind": "de.monticore.types.check.SymTypeOfObject", + "objName": "de.monticore.cdbasis.parser.Simple.S" + } + } + ] + } + }, + { + "kind": "de.monticore.symbols.basicsymbols._symboltable.DiagramSymbol", + "name": "Simple", + "fullName": "de.monticore.cdbasis.parser.Simple", + "packageName": "de.monticore.cdbasis.parser" + } + ], + "symbolHierarchy": { + "de.monticore.cdbasis._symboltable.CDTypeSymbol": "de.monticore.symbols.oosymbols._symboltable.OOTypeSymbol", + "de.monticore.symbols.oosymbols._symboltable.MethodSymbol": "de.monticore.symbols.basicsymbols._symboltable.FunctionSymbol", + "de.monticore.symbols.oosymbols._symboltable.OOTypeSymbol": "de.monticore.symbols.basicsymbols._symboltable.TypeSymbol", + "de.monticore.cd4codebasis._symboltable.CDMethodSignatureSymbol": "de.monticore.symbols.oosymbols._symboltable.MethodSymbol", + "de.monticore.symbols.basicsymbols._symboltable.TypeVarSymbol": "de.monticore.symbols.basicsymbols._symboltable.TypeSymbol", + "de.monticore.symbols.oosymbols._symboltable.FieldSymbol": "de.monticore.symbols.basicsymbols._symboltable.VariableSymbol" + } +} diff --git a/cdlang/src/testFixtures/java/de/monticore/cd/TestBasis.java b/cdlang/src/testFixtures/java/de/monticore/cd/TestBasis.java index 90ea4f29f..ceae9ad22 100644 --- a/cdlang/src/testFixtures/java/de/monticore/cd/TestBasis.java +++ b/cdlang/src/testFixtures/java/de/monticore/cd/TestBasis.java @@ -29,6 +29,8 @@ public class TestBasis { public static final String PATH = "src/test/resources/de/monticore/"; + public static final String SYMBOL_PATH = "src/test/resources/"; + /** have a temporary folder for the tests */ @TempDir Path folderPath; diff --git a/cdlang/src/testFixtures/java/de/monticore/cd4code/CD4CodeTestBasis.java b/cdlang/src/testFixtures/java/de/monticore/cd4code/CD4CodeTestBasis.java index 8185547f5..df0c21c76 100644 --- a/cdlang/src/testFixtures/java/de/monticore/cd4code/CD4CodeTestBasis.java +++ b/cdlang/src/testFixtures/java/de/monticore/cd4code/CD4CodeTestBasis.java @@ -42,7 +42,7 @@ public void initObjects() { final ICD4CodeGlobalScope globalScope = CD4CodeMill.globalScope(); globalScope.clear(); - globalScope.setSymbolPath(new MCPath(Paths.get(PATH))); + globalScope.setSymbolPath(new MCPath(Paths.get(SYMBOL_PATH))); BuiltInTypes.addBuiltInTypes(globalScope); cd4CodeCoCos = new CD4CodeCoCos(); From 83133ec5a5a2e1054f2fa4486dc834ea98983b74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20L=C3=BCpges?= Date: Wed, 30 Sep 2026 16:52:51 +0200 Subject: [PATCH 3/6] Run all CD4Code cocos in CoCotests --- .../CD4CodeSymbolTableCreatorDelegatorTest.java | 4 ++-- .../cd4code/cocos/CD4CodeCoCoTest.java | 17 ++++++++++------- .../de/monticore/cdbasis/parser/Complete.cd | 2 +- .../de/monticore/cd4code/CD4CodeTestBasis.java | 15 ++++++++++----- 4 files changed, 23 insertions(+), 15 deletions(-) diff --git a/cdlang/src/test/java/de/monticore/cd4code/_symboltable/CD4CodeSymbolTableCreatorDelegatorTest.java b/cdlang/src/test/java/de/monticore/cd4code/_symboltable/CD4CodeSymbolTableCreatorDelegatorTest.java index 4a6a7e9bc..657e05121 100644 --- a/cdlang/src/test/java/de/monticore/cd4code/_symboltable/CD4CodeSymbolTableCreatorDelegatorTest.java +++ b/cdlang/src/test/java/de/monticore/cd4code/_symboltable/CD4CodeSymbolTableCreatorDelegatorTest.java @@ -1,12 +1,12 @@ /* (c) https://github.com/MontiCore/monticore */ package de.monticore.cd4code._symboltable; -import de.monticore.cd4code.CD4CodeMill; import de.monticore.cd4code.CD4CodeTestBasis; import de.monticore.cd4code.trafo.CD4CodeAfterParseTrafo; import de.monticore.cdbasis._ast.ASTCDCompilationUnit; import java.io.IOException; import java.util.Optional; + import org.junit.jupiter.api.Test; @SuppressWarnings("OptionalGetWithoutIsPresent") @@ -20,7 +20,7 @@ public void completeModel() throws IOException { final ASTCDCompilationUnit node = astcdCompilationUnit.get(); new CD4CodeAfterParseTrafo().transform(node); - CD4CodeMill.scopesGenitorDelegator().createFromAST(node); + prepareST(node); checkLogError(); cd4CodeCoCos.getCheckerForAllCoCos().checkAll(node); diff --git a/cdlang/src/test/java/de/monticore/cd4code/cocos/CD4CodeCoCoTest.java b/cdlang/src/test/java/de/monticore/cd4code/cocos/CD4CodeCoCoTest.java index cdb88430a..193cb7db9 100644 --- a/cdlang/src/test/java/de/monticore/cd4code/cocos/CD4CodeCoCoTest.java +++ b/cdlang/src/test/java/de/monticore/cd4code/cocos/CD4CodeCoCoTest.java @@ -3,27 +3,30 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; -import de.monticore.cd4code.CD4CodeMill; import de.monticore.cd4code.CD4CodeTestBasis; import de.monticore.cd4code._symboltable.ICD4CodeArtifactScope; import de.monticore.cd4code.trafo.CD4CodeAfterParseTrafo; import de.monticore.cdbasis._ast.ASTCDCompilationUnit; import java.io.IOException; import java.util.Optional; + import org.junit.jupiter.api.Test; -@SuppressWarnings("OptionalGetWithoutIsPresent") +/** + * Tests CD4Code (and all super language's) CoCos + */ public class CD4CodeCoCoTest extends CD4CodeTestBasis { @Test public void importModel() throws IOException { + // When this test fails: check, that the Simple.cdsym is correct! final Optional astcdCompilationUnit = p.parse(getFilePath( "cdbasis/parser/Import.cd")); checkNullAndPresence(p, astcdCompilationUnit); - final ASTCDCompilationUnit node = astcdCompilationUnit.get(); + final ASTCDCompilationUnit node = astcdCompilationUnit.orElseThrow(); new CD4CodeAfterParseTrafo().transform(node); - final ICD4CodeArtifactScope scope = CD4CodeMill.scopesGenitorDelegator().createFromAST(node); + final ICD4CodeArtifactScope scope = prepareST(astcdCompilationUnit.orElseThrow()); checkLogError(); assertNotNull(scope.resolveCDType("C")); @@ -36,9 +39,9 @@ public void completeCDBasisModel() throws IOException { final Optional astcdCompilationUnit = p.parse(getFilePath( "cdbasis/parser/Complete.cd")); checkNullAndPresence(p, astcdCompilationUnit); - final ASTCDCompilationUnit node = astcdCompilationUnit.get(); + final ASTCDCompilationUnit node = astcdCompilationUnit.orElseThrow(); - CD4CodeMill.scopesGenitorDelegator().createFromAST(node); + prepareST(astcdCompilationUnit.orElseThrow()); checkLogError(); cd4CodeCoCos.getCheckerForAllCoCos().checkAll(node); @@ -49,7 +52,7 @@ public void completeModel() throws IOException { final Optional astcdCompilationUnit = p.parse(getFilePath( "cd4code/parser/Complete.cd")); checkNullAndPresence(p, astcdCompilationUnit); - final ASTCDCompilationUnit node = astcdCompilationUnit.get(); + final ASTCDCompilationUnit node = astcdCompilationUnit.orElseThrow(); prepareST(node); checkLogError(); diff --git a/cdlang/src/test/resources/de/monticore/cdbasis/parser/Complete.cd b/cdlang/src/test/resources/de/monticore/cdbasis/parser/Complete.cd index 275e3cf00..a6ca5b9b8 100644 --- a/cdlang/src/test/resources/de/monticore/cdbasis/parser/Complete.cd +++ b/cdlang/src/test/resources/de/monticore/cdbasis/parser/Complete.cd @@ -3,7 +3,7 @@ package de.monticore.cdbasis.parser; import de.monticore.cdbasis.parser.Simple.*; -targetimport additional.imports; +targetimport java.util.LinkedList; // an additional import classdiagram Complete { diff --git a/cdlang/src/testFixtures/java/de/monticore/cd4code/CD4CodeTestBasis.java b/cdlang/src/testFixtures/java/de/monticore/cd4code/CD4CodeTestBasis.java index df0c21c76..274468df5 100644 --- a/cdlang/src/testFixtures/java/de/monticore/cd4code/CD4CodeTestBasis.java +++ b/cdlang/src/testFixtures/java/de/monticore/cd4code/CD4CodeTestBasis.java @@ -10,13 +10,15 @@ import de.monticore.cd4code._prettyprint.CD4CodeFullPrettyPrinter; import de.monticore.cd4code._symboltable.CD4CodeSymbolTableCompleter; import de.monticore.cd4code._symboltable.CD4CodeSymbols2Json; +import de.monticore.cd4code._symboltable.ICD4CodeArtifactScope; import de.monticore.cd4code._symboltable.ICD4CodeGlobalScope; import de.monticore.cd4code._visitor.CD4CodeTraverser; -import de.monticore.cd4code.cocos.CD4CodeCoCos; +import de.monticore.cd4code.cocos.CD4CodeCoCosDelegator; import de.monticore.cd4code.trafo.CD4CodeAfterParseTrafo; import de.monticore.cdbasis._ast.ASTCDCompilationUnit; import de.monticore.io.paths.MCPath; import de.monticore.prettyprint.IndentPrinter; +import de.monticore.symboltable.ImportStatement; import de.se_rwth.commons.logging.Log; import de.se_rwth.commons.logging.LogStub; import java.io.IOException; @@ -27,7 +29,7 @@ public class CD4CodeTestBasis extends TestBasis { protected CD4CodeParser p; - protected CD4CodeCoCos cd4CodeCoCos; + protected CD4CodeCoCosDelegator cd4CodeCoCos; protected CD4CodeFullPrettyPrinter printer; protected CD4CodeSymbols2Json symbols2Json; protected CD4CodeCoCoChecker coCoChecker; @@ -45,7 +47,7 @@ public void initObjects() { globalScope.setSymbolPath(new MCPath(Paths.get(SYMBOL_PATH))); BuiltInTypes.addBuiltInTypes(globalScope); - cd4CodeCoCos = new CD4CodeCoCos(); + cd4CodeCoCos = new CD4CodeCoCosDelegator(); printer = new CD4CodeFullPrettyPrinter(new IndentPrinter(), true); symbols2Json = new CD4CodeSymbols2Json(); coCoChecker = new CD4CodeCoCoChecker(); @@ -67,15 +69,18 @@ protected ASTCDCompilationUnit parse(String filePath) { return node; } - protected void prepareST(ASTCDCompilationUnit node) { + protected ICD4CodeArtifactScope prepareST(ASTCDCompilationUnit node) { // First pass for symbol table - CD4CodeMill.scopesGenitorDelegator().createFromAST(node); + ICD4CodeArtifactScope artifactScope = CD4CodeMill.scopesGenitorDelegator().createFromAST(node); checkLogError(); + artifactScope.addImports(new ImportStatement("java.lang", true)); // Second pass for symbol table final CD4CodeTraverser traverser = new CD4CodeSymbolTableCompleter(node).getTraverser(); node.accept(traverser); checkLogError(); + + return artifactScope; } } From 510d746909ff61a75b247c305f2d0b6ccb72015a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20L=C3=BCpges?= Date: Wed, 30 Sep 2026 16:53:04 +0200 Subject: [PATCH 4/6] fix enum constructor coco --- .../CD4CodeEnumConstantParameterMatchConstructorArguments.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cdlang/src/main/java/de/monticore/cd4codebasis/cocos/ebnf/CD4CodeEnumConstantParameterMatchConstructorArguments.java b/cdlang/src/main/java/de/monticore/cd4codebasis/cocos/ebnf/CD4CodeEnumConstantParameterMatchConstructorArguments.java index 5e5ac6b8f..9d60504ea 100644 --- a/cdlang/src/main/java/de/monticore/cd4codebasis/cocos/ebnf/CD4CodeEnumConstantParameterMatchConstructorArguments.java +++ b/cdlang/src/main/java/de/monticore/cd4codebasis/cocos/ebnf/CD4CodeEnumConstantParameterMatchConstructorArguments.java @@ -60,7 +60,7 @@ protected boolean matchConstructor(ArrayList paramTypes, for (ASTCDConstructor constructor : cdConstructorList) { List formalParams = constructor.getSymbol().getParameterList(); if (paramTypes.size() != formalParams.size()) { - return false; + continue; } boolean success = true; for (int i = 0; i < formalParams.size(); i++) { From 240a4b4c0b95fc73acc98c8fa8b4962aa24637a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20L=C3=BCpges?= Date: Wed, 30 Sep 2026 16:54:17 +0200 Subject: [PATCH 5/6] Use TC3 in impl/exts CoCos --- .../cd/cocos/ImplementOnlyInterfaces.java | 68 ++++++++----------- .../cocos/ebnf/CDClassExtendsOnlyClasses.java | 31 ++++++--- 2 files changed, 51 insertions(+), 48 deletions(-) diff --git a/cdlang/src/main/java/de/monticore/cd/cocos/ImplementOnlyInterfaces.java b/cdlang/src/main/java/de/monticore/cd/cocos/ImplementOnlyInterfaces.java index 91371d521..66777e144 100644 --- a/cdlang/src/main/java/de/monticore/cd/cocos/ImplementOnlyInterfaces.java +++ b/cdlang/src/main/java/de/monticore/cd/cocos/ImplementOnlyInterfaces.java @@ -6,16 +6,18 @@ import de.monticore.cdinterfaceandenum._ast.ASTCDEnum; import de.monticore.cdinterfaceandenum._ast.ASTCDInterface; import de.monticore.symbols.oosymbols._symboltable.OOTypeSymbol; +import de.monticore.types.check.SymTypeExpression; import de.monticore.types.mcbasictypes._ast.ASTMCObjectType; -import de.monticore.types.mcbasictypes._ast.ASTMCQualifiedType; -import de.monticore.types.mccollectiontypes._ast.ASTMCGenericType; +import de.monticore.types3.TypeCheck3; import de.se_rwth.commons.logging.Log; -import java.util.List; -import java.util.Optional; /** Checks that only interfaces are implemented. */ public abstract class ImplementOnlyInterfaces { + public static final String CLASS_ERROR_CODE = "0xCDCF4"; + public static final String ENUM_ERROR_CODE = "0xCDCF5"; + public static final String INTERFACE_ERROR_CODE = "0xCDCF6"; + /** * Actual check that the class's interfaces are really interfaces. * @@ -27,32 +29,23 @@ public void check(ASTCDClass node) { if (!node.isPresentCDInterfaceUsage()) { return; } - final List interfaceList = node.getCDInterfaceUsage().getInterfaceList(); - interfaceList.stream().map(s -> symbol.getEnclosingScope().resolveOOType(getObjectName(s))) - .filter(Optional::isPresent).map(Optional::get).filter(e -> !e.isIsInterface()).forEach( - e -> Log.error(String.format( - "0xCDCF4: Class %s cannot implement %s %s. A class may only implement interfaces.", - node.getName(), CDMill.cDTypeKindPrinter().print(e), e.getName()), node - .get_SourcePositionStart())); - } - - protected String getObjectName(ASTMCObjectType type) { - // TODO: This is a fix for the following types: - // class State_Pat implements IState, IElem - // class Opt implements IElem - // interface IElem { } - // -> this tries to resolve "IElem.class", which fails HARD due to illegal chars! - // TODO: Discuss where to place such a thing - if (type instanceof ASTMCQualifiedType qualifiedType) { - return qualifiedType.getMCQualifiedName().getQName(); - } - else if (type instanceof ASTMCGenericType genericType) { - return genericType.printWithoutTypeArguments(); - } - else { - throw new IllegalStateException("Unhandled MCObjectType " + type.getClass() + " of `" + type - .printType() + "` when trying to resolve source"); + for (ASTMCObjectType typeRef : node.getCDInterfaceUsage().getInterfaceList()) { + SymTypeExpression steRef = TypeCheck3.symTypeFromAST(typeRef); + if (steRef.hasTypeInfo()) { + if (!CoCoHelper.isInterface(steRef.getTypeInfo())) + Log.error(String.format( + "%s: Class %s cannot implement %s %s. A class may only implement interfaces.", + CLASS_ERROR_CODE, node.getName(), CDMill.cDTypeKindPrinter().print(steRef + .getTypeInfo()), steRef.getTypeInfo().getName()), node.get_SourcePositionStart()); + + } + else { + Log.error(String.format( + "%s: Class %s cannot implement . A class may only implement interfaces.", + CLASS_ERROR_CODE, node.getName()), node.get_SourcePositionStart()); + + } } } @@ -68,10 +61,10 @@ public void check(ASTCDEnum node) { } symbol.streamSuperTypes().filter(i -> !CoCoHelper.isInterface(i.getTypeInfo())).forEach(e -> Log .error(String.format( - "0xCDCF5: The %s %s cannot implement %s %s. Only interfaces may be implemented.", CDMill - .cDTypeKindPrinter().print(node), symbol.getName(), CDMill.cDTypeKindPrinter() - .print(e.getTypeInfo()), e.getTypeInfo().getName()), node - .get_SourcePositionStart())); + "%s: The %s %s cannot implement %s %s. Only interfaces may be implemented.", + ENUM_ERROR_CODE, CDMill.cDTypeKindPrinter().print(node), symbol.getName(), CDMill + .cDTypeKindPrinter().print(e.getTypeInfo()), e.getTypeInfo().getName()), node + .get_SourcePositionStart())); } /** @@ -85,11 +78,10 @@ public void check(ASTCDInterface node) { return; } symbol.streamSuperTypes().filter(i -> !CoCoHelper.isInterface(i.getTypeInfo())).forEach(e -> Log - .error(String.format( - "0xCDCF6: The %s %s cannot extend %s %s. Only interfaces may be extended.", CDMill - .cDTypeKindPrinter().print(node), symbol.getName(), CDMill.cDTypeKindPrinter() - .print(e.getTypeInfo()), e.getTypeInfo().getName()), node - .get_SourcePositionStart())); + .error(String.format("%s: The %s %s cannot extend %s %s. Only interfaces may be extended.", + INTERFACE_ERROR_CODE, CDMill.cDTypeKindPrinter().print(node), symbol.getName(), CDMill + .cDTypeKindPrinter().print(e.getTypeInfo()), e.getTypeInfo().getName()), node + .get_SourcePositionStart())); } } diff --git a/cdlang/src/main/java/de/monticore/cdinterfaceandenum/cocos/ebnf/CDClassExtendsOnlyClasses.java b/cdlang/src/main/java/de/monticore/cdinterfaceandenum/cocos/ebnf/CDClassExtendsOnlyClasses.java index 1eedd748d..8c9b9416d 100644 --- a/cdlang/src/main/java/de/monticore/cdinterfaceandenum/cocos/ebnf/CDClassExtendsOnlyClasses.java +++ b/cdlang/src/main/java/de/monticore/cdinterfaceandenum/cocos/ebnf/CDClassExtendsOnlyClasses.java @@ -1,14 +1,14 @@ /* (c) https://github.com/MontiCore/monticore */ package de.monticore.cdinterfaceandenum.cocos.ebnf; -import de.monticore.cd.CDMill; +import de.monticore.cd.cocos.CoCoHelper; import de.monticore.cdbasis._ast.ASTCDClass; import de.monticore.cdbasis._cocos.CDBasisASTCDClassCoCo; import de.monticore.symbols.oosymbols._symboltable.OOTypeSymbol; +import de.monticore.types.check.SymTypeExpression; import de.monticore.types.mcbasictypes._ast.ASTMCObjectType; +import de.monticore.types3.TypeCheck3; import de.se_rwth.commons.logging.Log; -import java.util.List; -import java.util.Optional; /** Checks that classes do only extend other classes. */ public class CDClassExtendsOnlyClasses implements CDBasisASTCDClassCoCo { @@ -16,6 +16,8 @@ public class CDClassExtendsOnlyClasses implements CDBasisASTCDClassCoCo { // TODO SVa: provide printer for the types, // so that a user can provide their own printer + public static final String ERROR_CODE = "0xCDC08"; + @Override public void check(ASTCDClass clazz) { OOTypeSymbol symbol = clazz.getSymbol(); @@ -23,13 +25,22 @@ public void check(ASTCDClass clazz) { if (!clazz.isPresentCDExtendUsage()) { return; } - final List superclassList = clazz.getCDExtendUsage().getSuperclassList(); - superclassList.stream().map(s -> symbol.getEnclosingScope().resolveOOType(s.printType())) - .filter(Optional::isPresent).map(Optional::get).filter(e -> !e.isIsClass()).forEach(e -> Log - .error(String.format( - "0xCDC08: Class %s cannot extend %s %s. A class may only extend classes.", clazz - .getName(), CDMill.cDTypeKindPrinter().print(e), e.getName()), clazz - .get_SourcePositionStart())); + + for (ASTMCObjectType typeRef : clazz.getCDExtendUsage().getSuperclassList()) { + SymTypeExpression steRef = TypeCheck3.symTypeFromAST(typeRef); + if (steRef.hasTypeInfo()) { + if (!CoCoHelper.isClass(steRef.getTypeInfo())) + Log.error(String.format( + "%s: Class %s cannot extend %s %s. A class may only extend classes.", ERROR_CODE, + clazz.getName(), steRef.getTypeInfo().getClass().getSimpleName(), steRef.getTypeInfo() + .getName()), clazz.get_SourcePositionStart()); + } + else { + Log.error(String.format( + "%s: Class %s cannot extend . A class may only extend classes.", + ERROR_CODE, clazz.getName()), clazz.get_SourcePositionStart()); + } + } } } From ff0cada15be62178868fa78d0c70f96341b6404e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20L=C3=BCpges?= Date: Wed, 30 Sep 2026 17:21:46 +0200 Subject: [PATCH 6/6] Update ExampleCommandTest TC3 Findings --- .../_symboltable/CDAssociationSymbolTableCompleter.java | 6 +++--- cdtool/src/test/java/de/monticore/ExampleCommandTest.java | 6 +++++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/cdlang/src/main/java/de/monticore/cdassociation/_symboltable/CDAssociationSymbolTableCompleter.java b/cdlang/src/main/java/de/monticore/cdassociation/_symboltable/CDAssociationSymbolTableCompleter.java index c9c63c8e7..35bcc9e20 100644 --- a/cdlang/src/main/java/de/monticore/cdassociation/_symboltable/CDAssociationSymbolTableCompleter.java +++ b/cdlang/src/main/java/de/monticore/cdassociation/_symboltable/CDAssociationSymbolTableCompleter.java @@ -124,8 +124,8 @@ public void endVisit(ASTCDAssociation node) { CDAssociationSymbolTableCompleter.addRoleToTheirType(l.getSymbol(), rType.getTypeInfo()); } else { - Log.error("0xCDCD1 Right type for role symbol " + l.getSymbol().getName() - + " not available."); + Log.error("0xCDCD1: Right type for role symbol " + l.getSymbol().getName() + + " not available.", node.get_SourcePositionStart(), node.get_SourcePositionEnd()); } } if (r.isPresentSymbol()) { @@ -134,7 +134,7 @@ public void endVisit(ASTCDAssociation node) { } else { Log.error("0xCDCD2 Left type for role symbol " + r.getSymbol().getName() - + " not available."); + + " not available.", node.get_SourcePositionStart(), node.get_SourcePositionEnd()); } } } diff --git a/cdtool/src/test/java/de/monticore/ExampleCommandTest.java b/cdtool/src/test/java/de/monticore/ExampleCommandTest.java index a8dc1cc17..e52937d5a 100644 --- a/cdtool/src/test/java/de/monticore/ExampleCommandTest.java +++ b/cdtool/src/test/java/de/monticore/ExampleCommandTest.java @@ -178,11 +178,15 @@ public void testStoringSymbolsPerPathsExample1() { tool.run(new String[] { "-i", fileName }); // Then - assertEquals(4, Log.getFindingsCount(), "Actual findings: " + Log.getFindings().toString()); + assertEquals(5, Log.getFindingsCount(), "Actual findings: " + Log.getFindings().toString()); assertEquals("0xA0324 Cannot find symbol Address", Log.getFindings().get(0).getMsg()); + assertEquals("0xA0324 Cannot find symbol Address", Log.getFindings().get(1).getMsg()); + assertEquals("0xCDCD1: Right type for role symbol student not available.", Log.getFindings() + .get(2).getMsg()); assertEquals( "0xCDC41: Could not resolve import `MyAddress.Address` within the input models or symbol path.", Log.getFindings().get(3).getMsg()); + assertEquals("0xA0324 Cannot find symbol Address", Log.getFindings().get(4).getMsg()); Log.clearFindings(); }