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/7] 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/7] 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/7] 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/7] 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/7] 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/7] 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(); } From a55a86ce21067282f2716253e5d0e1a9cd0c445c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20L=C3=BCpges?= Date: Wed, 30 Sep 2026 19:34:51 +0200 Subject: [PATCH 7/7] s/TC1/TC3 in CoCos --- .../BaseAttributeInTypeCompleter.java | 6 +- cdlang/build.gradle | 1 + .../de/monticore/cd/methodtemplates/CD4C.java | 67 +++++++------------ .../CD4AnalysisSymbolTableCompleter.java | 8 +-- .../cocos/CD4AnalysisCoCosDelegator.java | 8 +-- .../FullDeriveFromCD4Analysis.java | 43 ------------ .../FullSynthesizeFromCD4Analysis.java | 39 ----------- .../CD4CodeSymbolTableCompleter.java | 10 ++- .../cd4code/cocos/CD4CodeCoCosDelegator.java | 14 ++-- .../FullDeriveFromCD4Code.java | 43 ------------ .../FullSynthesizeFromCD4Code.java | 51 -------------- .../CD4CodeBasisSymbolTableCompleter.java | 12 +--- .../cd4codebasis/cocos/CD4CodeBasisCoCos.java | 8 +-- ...antParameterMatchConstructorArguments.java | 21 +++--- .../FullDeriveFromCD4CodeBasis.java | 37 ---------- .../CDAssociationSymbolTableCompleter.java | 12 ---- .../CDBasisSymbolTableCompleter.java | 16 ----- .../monticore/cdbasis/cocos/CDBasisCoCos.java | 9 +-- .../CDAttributeInitialTypeCompatible.java | 38 +++++------ .../FullDeriveFromCDBasis.java | 27 -------- ...DInterfaceAndEnumSymbolTableCompleter.java | 21 ++---- ...TabDefinitionFullSymbolTableCompleter.java | 9 +-- .../cd/methodtemplates/CD4CTest.java | 5 +- .../CD4CodeBasisTestBasis.java | 4 +- .../FullDeriveFromTestCD4CodeBasis.java | 36 ---------- ...arameterMatchConstructorArgumentsTest.java | 7 +- .../CDAttributeInitialTypeCompatibleTest.java | 5 +- .../cdmerge/validation/CDMergeCD4ACoCos.java | 3 +- 28 files changed, 92 insertions(+), 468 deletions(-) delete mode 100644 cdlang/src/main/java/de/monticore/cd4analysis/typescalculator/FullDeriveFromCD4Analysis.java delete mode 100644 cdlang/src/main/java/de/monticore/cd4analysis/typescalculator/FullSynthesizeFromCD4Analysis.java delete mode 100644 cdlang/src/main/java/de/monticore/cd4code/typescalculator/FullDeriveFromCD4Code.java delete mode 100644 cdlang/src/main/java/de/monticore/cd4code/typescalculator/FullSynthesizeFromCD4Code.java delete mode 100644 cdlang/src/main/java/de/monticore/cd4codebasis/typescalculator/FullDeriveFromCD4CodeBasis.java delete mode 100644 cdlang/src/main/java/de/monticore/cdbasis/typescalculator/FullDeriveFromCDBasis.java delete mode 100644 cdlang/src/test/java/de/monticore/testcd4codebasis/FullDeriveFromTestCD4CodeBasis.java diff --git a/cddiff/src/main/java/de/monticore/cdconcretization/type/attribute/BaseAttributeInTypeCompleter.java b/cddiff/src/main/java/de/monticore/cdconcretization/type/attribute/BaseAttributeInTypeCompleter.java index 9f3fcca36..a7fef4672 100644 --- a/cddiff/src/main/java/de/monticore/cdconcretization/type/attribute/BaseAttributeInTypeCompleter.java +++ b/cddiff/src/main/java/de/monticore/cdconcretization/type/attribute/BaseAttributeInTypeCompleter.java @@ -4,7 +4,6 @@ import de.monticore.cd._symboltable.CDSymbolTables; import de.monticore.cd.facade.MCQualifiedNameFacade; import de.monticore.cd4code.CD4CodeMill; -import de.monticore.cd4code.typescalculator.FullSynthesizeFromCD4Code; import de.monticore.cdbasis._ast.ASTCDAttribute; import de.monticore.cdbasis._ast.ASTCDType; import de.monticore.cdconcretization.CompletionException; @@ -14,6 +13,8 @@ import de.monticore.cdconcretization.util.NameUtil; import de.monticore.symbols.basicsymbols._ast.ASTType; import de.monticore.types.check.SymTypeExpression; +import de.monticore.types3.TypeCheck3; + import java.util.List; import java.util.Optional; import java.util.Set; @@ -55,8 +56,7 @@ public void completeAttributeInType(ASTCDType concreteType, ASTCDAttribute refer */ private void createAttributeIncarnations(ASTCDType concreteType, ASTCDAttribute referenceAttribute, TypeCompletionContext context) throws CompletionException { - SymTypeExpression attributeSymType = new FullSynthesizeFromCD4Code().synthesizeType( - referenceAttribute.getMCType()).getResult(); + SymTypeExpression attributeSymType = TypeCheck3.symTypeFromAST(referenceAttribute.getMCType()); // make sure we do not add the 'any' type to the concrete CD if (attributeSymType.getTypeInfo().getFullName().equals(context diff --git a/cdlang/build.gradle b/cdlang/build.gradle index 6606747ca..ab6341344 100644 --- a/cdlang/build.gradle +++ b/cdlang/build.gradle @@ -87,6 +87,7 @@ dependencies { testImplementation testFixtures("de.monticore:monticore-grammar:$mc_version") testFixturesImplementation "org.junit.jupiter:junit-jupiter-api:$junit_version" + testFixturesApi testFixtures("de.monticore:monticore-grammar:$mc_version") //dependencies for trafo if (withDSTLGen) { diff --git a/cdlang/src/main/java/de/monticore/cd/methodtemplates/CD4C.java b/cdlang/src/main/java/de/monticore/cd/methodtemplates/CD4C.java index 68e67350a..d05ac57db 100644 --- a/cdlang/src/main/java/de/monticore/cd/methodtemplates/CD4C.java +++ b/cdlang/src/main/java/de/monticore/cd/methodtemplates/CD4C.java @@ -9,8 +9,6 @@ import de.monticore.cd.codegen.methods.MutatorDecorator; import de.monticore.cd4code.CD4CodeMill; import de.monticore.cd4code._prettyprint.CD4CodeFullPrettyPrinter; -import de.monticore.cd4code.typescalculator.FullSynthesizeFromCD4Code; -import de.monticore.cd4codebasis._ast.ASTCD4CodeBasisNode; import de.monticore.cd4codebasis._ast.ASTCDMethod; import de.monticore.cd4codebasis._ast.ASTCDMethodSignature; import de.monticore.cd4codebasis._cocos.CD4CodeBasisASTCDMethodSignatureCoCo; @@ -24,9 +22,8 @@ import de.monticore.generating.templateengine.StringHookPoint; import de.monticore.generating.templateengine.TemplateController; import de.monticore.generating.templateengine.TemplateHookPoint; -import de.monticore.prettyprint.IndentPrinter; -import de.monticore.types.check.AbstractSynthesize; import de.monticore.types.mcbasictypes._ast.ASTMCImportStatement; +import de.monticore.types3.TypeCheck3; import de.se_rwth.commons.Joiners; import de.se_rwth.commons.logging.Log; import java.util.*; @@ -62,9 +59,6 @@ public class CD4C { protected final Map> importMap = Maps.newHashMap(); protected String emptyBodyTemplate = "de.monticore.cd.methodtemplates.core.EmptyMethod"; - protected CD4CodeFullPrettyPrinter prettyPrinter = new CD4CodeFullPrettyPrinter( - new IndentPrinter(), true); - protected AbstractSynthesize typesCalculator = new FullSynthesizeFromCD4Code(); protected GeneratorSetup config; protected boolean isInitialized; @@ -139,12 +133,6 @@ protected static void checkInitialized() { } public CD4C setPrettyPrinter(CD4CodeFullPrettyPrinter prettyPrinter) { - this.prettyPrinter = prettyPrinter; - return this; - } - - public CD4C setTypesCalculator(AbstractSynthesize typesCalculator) { - this.typesCalculator = typesCalculator; return this; } @@ -217,7 +205,7 @@ public ASTCDMethodSignature addMethod(ASTCDType astcdType, String template, Obje checkInitialized(); Optional method = this.createMethod(astcdType, template, arguments); - if (!method.isPresent()) { + if (method.isEmpty()) { Log.error("0x11010: There was no method created in the template '" + template + "'"); return null; } @@ -601,27 +589,25 @@ public CD4C addDefaultPredicates() { addPredicate((m) -> { final List unknownTypes = m.getCDParameterList().stream().filter(p -> // if parameter types are not valid/exist - !typesCalculator.synthesizeType(p.getMCType()).isPresentResult()).map(p -> prettyPrinter - .prettyprint(p.getMCType())).collect(Collectors.toList()); + TypeCheck3.symTypeFromAST(p.getMCType()).isObscureType()).map(p -> CD4CodeMill.prettyPrint(p + .getMCType(), true)).collect(Collectors.toList()); if (unknownTypes.isEmpty()) { return true; } else { - Log.error("0x110C0: The following types of the method signature (" + prettyPrinter - .prettyprint((ASTCD4CodeBasisNode) m) + ") could not be resolved '" + Joiners.COMMA - .join(unknownTypes) + "'."); + Log.error("0x110C0: The following types of the method signature (" + CD4CodeMill + .prettyPrint(m, true) + ") could not be resolved '" + Joiners.COMMA.join(unknownTypes) + + "'."); return false; } }); // check return type addPredicate((m) -> { - if (m instanceof ASTCDMethod) { - final ASTCDMethod method = (ASTCDMethod) m; - if (!new FullSynthesizeFromCD4Code().synthesizeType(method.getMCReturnType()) - .isPresentResult()) { - Log.error("0x110C1: The return type '" + prettyPrinter.prettyprint(method - .getMCReturnType()) + "' of the method signature (" + prettyPrinter.prettyprint( - (ASTCD4CodeBasisNode) m) + ") could not be resolved."); + if (m instanceof ASTCDMethod method) { + if (TypeCheck3.symTypeFromAST(method.getMCReturnType()).isObscureType()) { + Log.info("0x110C1: The return type '" + CD4CodeMill.prettyPrint(method.getMCReturnType(), + true) + "' of the method signature (" + CD4CodeMill.prettyPrint(m, true) + + ") could not be resolved.", "CD4C"); return false; } } @@ -632,11 +618,12 @@ public CD4C addDefaultPredicates() { // attributes // check type addAttributePredicate((attribute) -> { - if (!new FullSynthesizeFromCD4Code().synthesizeType(attribute.getMCType()) - .isPresentResult()) { - Log.error("0x110C2: The type '" + prettyPrinter.prettyprint(attribute.getMCType()) - + "' of the attribute declaration (" + prettyPrinter.prettyprint(attribute) - + ") could not be resolved."); + if (TypeCheck3.symTypeFromAST(attribute.getMCType()).isObscureType()) { + // The error is already printed by the IDerive visitors, thus we would spam the log if we would log an error + // again. Therefore, we only leave a note in the debug log. + Log.debug("0x110C2: The type '" + CD4CodeMill.prettyPrint(attribute.getMCType(), true) + + "' of the attribute declaration (" + CD4CodeMill.prettyPrint(attribute, true) + + ") could not be resolved.", getClass().getName()); return false; } @@ -675,13 +662,12 @@ public CD4C addClassPredicate(BiPredicate predi public CD4C addDefaultClassPredicates() { // methods addClassPredicate((c, m) -> { - final List parameterTypes = m.getCDParameterList().stream().map(p -> typesCalculator - .synthesizeType(p.getMCType()).getResult().getTypeInfo().getFullName()).collect(Collectors - .toList()); + final List parameterTypes = m.getCDParameterList().stream().map(p -> TypeCheck3 + .symTypeFromAST(p.getMCType()).getTypeInfo().getFullName()).collect(Collectors.toList()); if (c.getCDMethodSignatureList().stream().anyMatch(cm -> { - final List parameter = cm.getCDParameterList().stream().map(p -> typesCalculator - .synthesizeType(p.getMCType()).getResult().getTypeInfo().getFullName()).collect( - Collectors.toList()); + final List parameter = cm.getCDParameterList().stream().map(p -> TypeCheck3 + .symTypeFromAST(p.getMCType()).getTypeInfo().getFullName()).collect(Collectors + .toList()); return m.getName().equals(cm.getName()) && Iterables.elementsEqual(parameterTypes, parameter); })) { @@ -694,10 +680,9 @@ public CD4C addDefaultClassPredicates() { // attributes addAttrClassPredicate((c, a) -> { - final String attrType = typesCalculator.synthesizeType(a.getMCType()).getResult() - .getTypeInfo().getFullName(); - if (c.getCDAttributeList().stream().anyMatch(ca -> attrType.equals(typesCalculator - .synthesizeType(ca.getMCType()).getResult().getTypeInfo().getFullName()))) { + final String attrType = TypeCheck3.symTypeFromAST(a.getMCType()).getTypeInfo().getFullName(); + if (c.getCDAttributeList().stream().anyMatch(ca -> attrType.equals(TypeCheck3.symTypeFromAST( + ca.getMCType()).getTypeInfo().getFullName()))) { Log.error("0x110C9: The class '" + c.getName() + "' already has a attribute named '" + a .getName() + "'"); return false; diff --git a/cdlang/src/main/java/de/monticore/cd4analysis/_symboltable/CD4AnalysisSymbolTableCompleter.java b/cdlang/src/main/java/de/monticore/cd4analysis/_symboltable/CD4AnalysisSymbolTableCompleter.java index 5188b7d9b..3f3d483c8 100644 --- a/cdlang/src/main/java/de/monticore/cd4analysis/_symboltable/CD4AnalysisSymbolTableCompleter.java +++ b/cdlang/src/main/java/de/monticore/cd4analysis/_symboltable/CD4AnalysisSymbolTableCompleter.java @@ -4,7 +4,6 @@ import de.monticore.cd.facade.MCQualifiedNameFacade; import de.monticore.cd4analysis.CD4AnalysisMill; import de.monticore.cd4analysis._visitor.CD4AnalysisTraverser; -import de.monticore.cd4analysis.typescalculator.FullSynthesizeFromCD4Analysis; import de.monticore.cdassociation._symboltable.CDAssociationSymbolTableCompleter; import de.monticore.cdbasis._ast.ASTCDCompilationUnit; import de.monticore.cdbasis._symboltable.CDBasisSymbolTableCompleter; @@ -28,16 +27,15 @@ public CD4AnalysisSymbolTableCompleter(List imports, ASTMCQualifiedName packageDeclaration) { this.traverser = CD4AnalysisMill.inheritanceTraverser(); - final CDBasisSymbolTableCompleter cDBasisVisitor = new CDBasisSymbolTableCompleter( - new FullSynthesizeFromCD4Analysis()); + final CDBasisSymbolTableCompleter cDBasisVisitor = new CDBasisSymbolTableCompleter(); traverser.add4CDBasis(cDBasisVisitor); traverser.add4OOSymbols(cDBasisVisitor); final CDAssociationSymbolTableCompleter cDAssociationVisitor = - new CDAssociationSymbolTableCompleter(new FullSynthesizeFromCD4Analysis()); + new CDAssociationSymbolTableCompleter(); traverser.add4CDAssociation(cDAssociationVisitor); traverser.setCDAssociationHandler(cDAssociationVisitor); final CDInterfaceAndEnumSymbolTableCompleter cdInterfaceAndEnumVisitor = - new CDInterfaceAndEnumSymbolTableCompleter(new FullSynthesizeFromCD4Analysis()); + new CDInterfaceAndEnumSymbolTableCompleter(); traverser.add4CDInterfaceAndEnum(cdInterfaceAndEnumVisitor); } diff --git a/cdlang/src/main/java/de/monticore/cd4analysis/cocos/CD4AnalysisCoCosDelegator.java b/cdlang/src/main/java/de/monticore/cd4analysis/cocos/CD4AnalysisCoCosDelegator.java index 4e1b7d2fe..1f29bb505 100644 --- a/cdlang/src/main/java/de/monticore/cd4analysis/cocos/CD4AnalysisCoCosDelegator.java +++ b/cdlang/src/main/java/de/monticore/cd4analysis/cocos/CD4AnalysisCoCosDelegator.java @@ -3,7 +3,6 @@ import de.monticore.cd.cocos.CoCoParent; import de.monticore.cd4analysis._cocos.CD4AnalysisCoCoChecker; -import de.monticore.cd4analysis.typescalculator.FullDeriveFromCD4Analysis; import de.monticore.cdassociation.cocos.CDAssociationCoCos; import de.monticore.cdbasis.cocos.CDBasisCoCos; import de.monticore.cdinterfaceandenum.cocos.CDInterfaceAndEnumCoCos; @@ -24,7 +23,7 @@ protected void addCheckerForAllCoCos(CD4AnalysisCoCoChecker checker) { @Override protected void addEbnfCoCos(CD4AnalysisCoCoChecker checker) { - checker.addChecker(new CDBasisCoCos(new FullDeriveFromCD4Analysis()).addCheckerForEbnfCoCos()); + checker.addChecker(new CDBasisCoCos().addCheckerForEbnfCoCos()); checker.addChecker(new CDInterfaceAndEnumCoCos().addCheckerForEbnfCoCos()); checker.addChecker(new CDAssociationCoCos().addCheckerForEbnfCoCos()); checker.addChecker(new CD4AnalysisCoCos().addCheckerForEbnfCoCos()); @@ -32,7 +31,7 @@ protected void addEbnfCoCos(CD4AnalysisCoCoChecker checker) { @Override protected void addMcgCoCos(CD4AnalysisCoCoChecker checker) { - checker.addChecker(new CDBasisCoCos(new FullDeriveFromCD4Analysis()).addCheckerForMcgCoCos()); + checker.addChecker(new CDBasisCoCos().addCheckerForMcgCoCos()); checker.addChecker(new CDInterfaceAndEnumCoCos().addCheckerForMcgCoCos()); checker.addChecker(new CDAssociationCoCos().addCheckerForMcgCoCos()); checker.addChecker(new CD4AnalysisCoCos().addCheckerForMcgCoCos()); @@ -40,8 +39,7 @@ protected void addMcgCoCos(CD4AnalysisCoCoChecker checker) { @Override protected void addMcg2EbnfCoCos(CD4AnalysisCoCoChecker checker) { - checker.addChecker(new CDBasisCoCos(new FullDeriveFromCD4Analysis()) - .addCheckerForMcg2EbnfCoCos()); + checker.addChecker(new CDBasisCoCos().addCheckerForMcg2EbnfCoCos()); checker.addChecker(new CDInterfaceAndEnumCoCos().addCheckerForMcg2EbnfCoCos()); checker.addChecker(new CDAssociationCoCos().addCheckerForMcg2EbnfCoCos()); checker.addChecker(new CD4AnalysisCoCos().addCheckerForMcg2EbnfCoCos()); diff --git a/cdlang/src/main/java/de/monticore/cd4analysis/typescalculator/FullDeriveFromCD4Analysis.java b/cdlang/src/main/java/de/monticore/cd4analysis/typescalculator/FullDeriveFromCD4Analysis.java deleted file mode 100644 index 14f6de213..000000000 --- a/cdlang/src/main/java/de/monticore/cd4analysis/typescalculator/FullDeriveFromCD4Analysis.java +++ /dev/null @@ -1,43 +0,0 @@ -/* (c) https://github.com/MontiCore/monticore */ -package de.monticore.cd4analysis.typescalculator; - -import de.monticore.cd4analysis.CD4AnalysisMill; -import de.monticore.cd4analysis._visitor.CD4AnalysisTraverser; -import de.monticore.types.check.*; - -public class FullDeriveFromCD4Analysis extends AbstractDerive { - - public FullDeriveFromCD4Analysis() { - this(CD4AnalysisMill.inheritanceTraverser()); - } - - public FullDeriveFromCD4Analysis(CD4AnalysisTraverser traverser) { - super(traverser); - init(traverser); - } - - public void init(CD4AnalysisTraverser traverser) { - final DeriveSymTypeOfMCCommonLiterals deriveSymTypeOfMCCommonLiterals = - new DeriveSymTypeOfMCCommonLiterals(); - deriveSymTypeOfMCCommonLiterals.setTypeCheckResult(getTypeCheckResult()); - traverser.add4MCCommonLiterals(deriveSymTypeOfMCCommonLiterals); - - final DeriveSymTypeOfExpression deriveSymTypeOfExpression = new DeriveSymTypeOfExpression(); - deriveSymTypeOfExpression.setTypeCheckResult(getTypeCheckResult()); - traverser.add4ExpressionsBasis(deriveSymTypeOfExpression); - traverser.setExpressionsBasisHandler(deriveSymTypeOfExpression); - - final DeriveSymTypeOfCommonExpressions deriveSymTypeOfCommonExpressions = - new DeriveSymTypeOfCommonExpressions(); - deriveSymTypeOfCommonExpressions.setTypeCheckResult(getTypeCheckResult()); - traverser.add4CommonExpressions(deriveSymTypeOfCommonExpressions); - traverser.setCommonExpressionsHandler(deriveSymTypeOfCommonExpressions); - - final DeriveSymTypeOfBitExpressions deriveSymTypeOfBitExpressions = - new DeriveSymTypeOfBitExpressions(); - deriveSymTypeOfBitExpressions.setTypeCheckResult(getTypeCheckResult()); - traverser.add4BitExpressions(deriveSymTypeOfBitExpressions); - traverser.setBitExpressionsHandler(deriveSymTypeOfBitExpressions); - } - -} diff --git a/cdlang/src/main/java/de/monticore/cd4analysis/typescalculator/FullSynthesizeFromCD4Analysis.java b/cdlang/src/main/java/de/monticore/cd4analysis/typescalculator/FullSynthesizeFromCD4Analysis.java deleted file mode 100644 index 7dc552ecd..000000000 --- a/cdlang/src/main/java/de/monticore/cd4analysis/typescalculator/FullSynthesizeFromCD4Analysis.java +++ /dev/null @@ -1,39 +0,0 @@ -/* (c) https://github.com/MontiCore/monticore */ -package de.monticore.cd4analysis.typescalculator; - -import de.monticore.cd4analysis.CD4AnalysisMill; -import de.monticore.cd4analysis._visitor.CD4AnalysisTraverser; -import de.monticore.types.check.*; - -public class FullSynthesizeFromCD4Analysis extends AbstractSynthesize { - - public FullSynthesizeFromCD4Analysis(CD4AnalysisTraverser traverser) { - super(traverser); - init(traverser); - } - - public FullSynthesizeFromCD4Analysis() { - this(CD4AnalysisMill.inheritanceTraverser()); - } - - public void init(CD4AnalysisTraverser traverser) { - final SynthesizeSymTypeFromMCBasicTypes synthesizeSymTypeFromMCBasicTypes = - new SynthesizeSymTypeFromMCBasicTypes(); - synthesizeSymTypeFromMCBasicTypes.setTypeCheckResult(getTypeCheckResult()); - traverser.add4MCBasicTypes(synthesizeSymTypeFromMCBasicTypes); - traverser.setMCBasicTypesHandler(synthesizeSymTypeFromMCBasicTypes); - - final SynthesizeSymTypeFromMCCollectionTypes synthesizeSymTypeFromMCCollectionTypes = - new SynthesizeSymTypeFromMCCollectionTypes(); - synthesizeSymTypeFromMCCollectionTypes.setTypeCheckResult(getTypeCheckResult()); - traverser.add4MCCollectionTypes(synthesizeSymTypeFromMCCollectionTypes); - traverser.setMCCollectionTypesHandler(synthesizeSymTypeFromMCCollectionTypes); - - final SynthesizeSymTypeFromMCArrayTypes synthesizeSymTypeFromMCArrayTypes = - new SynthesizeSymTypeFromMCArrayTypes(); - synthesizeSymTypeFromMCArrayTypes.setTypeCheckResult(getTypeCheckResult()); - traverser.add4MCArrayTypes(synthesizeSymTypeFromMCArrayTypes); - traverser.setMCArrayTypesHandler(synthesizeSymTypeFromMCArrayTypes); - } - -} diff --git a/cdlang/src/main/java/de/monticore/cd4code/_symboltable/CD4CodeSymbolTableCompleter.java b/cdlang/src/main/java/de/monticore/cd4code/_symboltable/CD4CodeSymbolTableCompleter.java index 2e9b0ea0f..1b36530bf 100644 --- a/cdlang/src/main/java/de/monticore/cd4code/_symboltable/CD4CodeSymbolTableCompleter.java +++ b/cdlang/src/main/java/de/monticore/cd4code/_symboltable/CD4CodeSymbolTableCompleter.java @@ -4,7 +4,6 @@ import de.monticore.cd.facade.MCQualifiedNameFacade; import de.monticore.cd4code.CD4CodeMill; import de.monticore.cd4code._visitor.CD4CodeTraverser; -import de.monticore.cd4code.typescalculator.FullSynthesizeFromCD4Code; import de.monticore.cd4codebasis._symboltable.CD4CodeBasisSymbolTableCompleter; import de.monticore.cdassociation._symboltable.CDAssociationSymbolTableCompleter; import de.monticore.cdbasis._ast.ASTCDCompilationUnit; @@ -28,19 +27,18 @@ public CD4CodeSymbolTableCompleter(List imports, ASTMCQualifiedName packageDeclaration) { this.traverser = CD4CodeMill.inheritanceTraverser(); - final CDBasisSymbolTableCompleter cDBasisVisitor = new CDBasisSymbolTableCompleter( - new FullSynthesizeFromCD4Code()); + final CDBasisSymbolTableCompleter cDBasisVisitor = new CDBasisSymbolTableCompleter(); traverser.add4CDBasis(cDBasisVisitor); traverser.add4OOSymbols(cDBasisVisitor); final CDAssociationSymbolTableCompleter cDAssociationVisitor = - new CDAssociationSymbolTableCompleter(new FullSynthesizeFromCD4Code()); + new CDAssociationSymbolTableCompleter(); traverser.add4CDAssociation(cDAssociationVisitor); traverser.setCDAssociationHandler(cDAssociationVisitor); final CDInterfaceAndEnumSymbolTableCompleter cdInterfaceAndEnumVisitor = - new CDInterfaceAndEnumSymbolTableCompleter(new FullSynthesizeFromCD4Code()); + new CDInterfaceAndEnumSymbolTableCompleter(); traverser.add4CDInterfaceAndEnum(cdInterfaceAndEnumVisitor); final CD4CodeBasisSymbolTableCompleter cd4CodeBasisVisitor = - new CD4CodeBasisSymbolTableCompleter(new FullSynthesizeFromCD4Code()); + new CD4CodeBasisSymbolTableCompleter(); traverser.add4CD4CodeBasis(cd4CodeBasisVisitor); traverser.add4CDBasis(cd4CodeBasisVisitor); } diff --git a/cdlang/src/main/java/de/monticore/cd4code/cocos/CD4CodeCoCosDelegator.java b/cdlang/src/main/java/de/monticore/cd4code/cocos/CD4CodeCoCosDelegator.java index afd60c169..500d0ab83 100644 --- a/cdlang/src/main/java/de/monticore/cd4code/cocos/CD4CodeCoCosDelegator.java +++ b/cdlang/src/main/java/de/monticore/cd4code/cocos/CD4CodeCoCosDelegator.java @@ -4,7 +4,6 @@ import de.monticore.cd.cocos.CoCoParent; import de.monticore.cd4analysis.cocos.CD4AnalysisCoCos; import de.monticore.cd4code._cocos.CD4CodeCoCoChecker; -import de.monticore.cd4code.typescalculator.FullDeriveFromCD4Code; import de.monticore.cd4codebasis.cocos.CD4CodeBasisCoCos; import de.monticore.cdassociation.cocos.CDAssociationCoCos; import de.monticore.cdbasis.cocos.CDBasisCoCos; @@ -26,32 +25,31 @@ protected void addCheckerForAllCoCos(CD4CodeCoCoChecker checker) { @Override protected void addEbnfCoCos(CD4CodeCoCoChecker checker) { - checker.addChecker(new CDBasisCoCos(new FullDeriveFromCD4Code()).addCheckerForEbnfCoCos()); + checker.addChecker(new CDBasisCoCos().addCheckerForEbnfCoCos()); checker.addChecker(new CDInterfaceAndEnumCoCos().addCheckerForEbnfCoCos()); checker.addChecker(new CDAssociationCoCos().addCheckerForEbnfCoCos()); checker.addChecker(new CD4AnalysisCoCos().addCheckerForEbnfCoCos()); - checker.addChecker(new CD4CodeBasisCoCos(new FullDeriveFromCD4Code()).addCheckerForEbnfCoCos()); + checker.addChecker(new CD4CodeBasisCoCos().addCheckerForEbnfCoCos()); checker.addChecker(new CD4CodeCoCos().addCheckerForEbnfCoCos()); } @Override protected void addMcgCoCos(CD4CodeCoCoChecker checker) { - checker.addChecker(new CDBasisCoCos(new FullDeriveFromCD4Code()).addCheckerForMcgCoCos()); + checker.addChecker(new CDBasisCoCos().addCheckerForMcgCoCos()); checker.addChecker(new CDInterfaceAndEnumCoCos().addCheckerForMcgCoCos()); checker.addChecker(new CDAssociationCoCos().addCheckerForMcgCoCos()); checker.addChecker(new CD4AnalysisCoCos().addCheckerForMcgCoCos()); - checker.addChecker(new CD4CodeBasisCoCos(new FullDeriveFromCD4Code()).addCheckerForMcgCoCos()); + checker.addChecker(new CD4CodeBasisCoCos().addCheckerForMcgCoCos()); checker.addChecker(new CD4CodeCoCos().addCheckerForMcgCoCos()); } @Override protected void addMcg2EbnfCoCos(CD4CodeCoCoChecker checker) { - checker.addChecker(new CDBasisCoCos(new FullDeriveFromCD4Code()).addCheckerForMcg2EbnfCoCos()); + checker.addChecker(new CDBasisCoCos().addCheckerForMcg2EbnfCoCos()); checker.addChecker(new CDInterfaceAndEnumCoCos().addCheckerForMcg2EbnfCoCos()); checker.addChecker(new CDAssociationCoCos().addCheckerForMcg2EbnfCoCos()); checker.addChecker(new CD4AnalysisCoCos().addCheckerForMcg2EbnfCoCos()); - checker.addChecker(new CD4CodeBasisCoCos(new FullDeriveFromCD4Code()) - .addCheckerForMcg2EbnfCoCos()); + checker.addChecker(new CD4CodeBasisCoCos().addCheckerForMcg2EbnfCoCos()); checker.addChecker(new CD4CodeCoCos().addCheckerForMcg2EbnfCoCos()); } diff --git a/cdlang/src/main/java/de/monticore/cd4code/typescalculator/FullDeriveFromCD4Code.java b/cdlang/src/main/java/de/monticore/cd4code/typescalculator/FullDeriveFromCD4Code.java deleted file mode 100644 index 87b60cedd..000000000 --- a/cdlang/src/main/java/de/monticore/cd4code/typescalculator/FullDeriveFromCD4Code.java +++ /dev/null @@ -1,43 +0,0 @@ -/* (c) https://github.com/MontiCore/monticore */ -package de.monticore.cd4code.typescalculator; - -import de.monticore.cd4code.CD4CodeMill; -import de.monticore.cd4code._visitor.CD4CodeTraverser; -import de.monticore.types.check.*; - -public class FullDeriveFromCD4Code extends AbstractDerive { - - public FullDeriveFromCD4Code() { - this(CD4CodeMill.inheritanceTraverser()); - } - - public FullDeriveFromCD4Code(CD4CodeTraverser traverser) { - super(traverser); - init(traverser); - } - - public void init(CD4CodeTraverser traverser) { - final DeriveSymTypeOfMCCommonLiterals deriveSymTypeOfMCCommonLiterals = - new DeriveSymTypeOfMCCommonLiterals(); - deriveSymTypeOfMCCommonLiterals.setTypeCheckResult(getTypeCheckResult()); - traverser.add4MCCommonLiterals(deriveSymTypeOfMCCommonLiterals); - - final DeriveSymTypeOfExpression deriveSymTypeOfExpression = new DeriveSymTypeOfExpression(); - deriveSymTypeOfExpression.setTypeCheckResult(getTypeCheckResult()); - traverser.add4ExpressionsBasis(deriveSymTypeOfExpression); - traverser.setExpressionsBasisHandler(deriveSymTypeOfExpression); - - final DeriveSymTypeOfCommonExpressions deriveSymTypeOfCommonExpressions = - new DeriveSymTypeOfCommonExpressions(); - deriveSymTypeOfCommonExpressions.setTypeCheckResult(getTypeCheckResult()); - traverser.add4CommonExpressions(deriveSymTypeOfCommonExpressions); - traverser.setCommonExpressionsHandler(deriveSymTypeOfCommonExpressions); - - final DeriveSymTypeOfBitExpressions deriveSymTypeOfBitExpressions = - new DeriveSymTypeOfBitExpressions(); - deriveSymTypeOfBitExpressions.setTypeCheckResult(getTypeCheckResult()); - traverser.add4BitExpressions(deriveSymTypeOfBitExpressions); - traverser.setBitExpressionsHandler(deriveSymTypeOfBitExpressions); - } - -} diff --git a/cdlang/src/main/java/de/monticore/cd4code/typescalculator/FullSynthesizeFromCD4Code.java b/cdlang/src/main/java/de/monticore/cd4code/typescalculator/FullSynthesizeFromCD4Code.java deleted file mode 100644 index dde05f6c0..000000000 --- a/cdlang/src/main/java/de/monticore/cd4code/typescalculator/FullSynthesizeFromCD4Code.java +++ /dev/null @@ -1,51 +0,0 @@ -/* (c) https://github.com/MontiCore/monticore */ -package de.monticore.cd4code.typescalculator; - -import de.monticore.cd4code.CD4CodeMill; -import de.monticore.cd4code._visitor.CD4CodeTraverser; -import de.monticore.types.check.*; - -public class FullSynthesizeFromCD4Code extends AbstractSynthesize { - - public FullSynthesizeFromCD4Code() { - this(CD4CodeMill.inheritanceTraverser()); - } - - public FullSynthesizeFromCD4Code(CD4CodeTraverser traverser) { - super(traverser); - init(traverser); - } - - public void init(CD4CodeTraverser traverser) { - final SynthesizeSymTypeFromMCBasicTypes synthesizeSymTypeFromMCBasicTypes = - new SynthesizeSymTypeFromMCBasicTypes(); - synthesizeSymTypeFromMCBasicTypes.setTypeCheckResult(getTypeCheckResult()); - traverser.add4MCBasicTypes(synthesizeSymTypeFromMCBasicTypes); - traverser.setMCBasicTypesHandler(synthesizeSymTypeFromMCBasicTypes); - - final SynthesizeSymTypeFromMCCollectionTypes synthesizeSymTypeFromMCCollectionTypes = - new SynthesizeSymTypeFromMCCollectionTypes(); - synthesizeSymTypeFromMCCollectionTypes.setTypeCheckResult(getTypeCheckResult()); - traverser.add4MCCollectionTypes(synthesizeSymTypeFromMCCollectionTypes); - traverser.setMCCollectionTypesHandler(synthesizeSymTypeFromMCCollectionTypes); - - final SynthesizeSymTypeFromMCArrayTypes synthesizeSymTypeFromMCArrayTypes = - new SynthesizeSymTypeFromMCArrayTypes(); - synthesizeSymTypeFromMCArrayTypes.setTypeCheckResult(getTypeCheckResult()); - traverser.add4MCArrayTypes(synthesizeSymTypeFromMCArrayTypes); - traverser.setMCArrayTypesHandler(synthesizeSymTypeFromMCArrayTypes); - - final SynthesizeSymTypeFromMCSimpleGenericTypes synthesizeSymTypeFromMCSimpleGenericTypes = - new SynthesizeSymTypeFromMCSimpleGenericTypes(); - synthesizeSymTypeFromMCSimpleGenericTypes.setTypeCheckResult(getTypeCheckResult()); - traverser.add4MCSimpleGenericTypes(synthesizeSymTypeFromMCSimpleGenericTypes); - traverser.setMCSimpleGenericTypesHandler(synthesizeSymTypeFromMCSimpleGenericTypes); - - final SynthesizeSymTypeFromMCFullGenericTypes synthesizeSymTypeFromMCFullGenericTypes = - new SynthesizeSymTypeFromMCFullGenericTypes(); - synthesizeSymTypeFromMCFullGenericTypes.setTypeCheckResult(getTypeCheckResult()); - traverser.add4MCFullGenericTypes(synthesizeSymTypeFromMCFullGenericTypes); - traverser.setMCFullGenericTypesHandler(synthesizeSymTypeFromMCFullGenericTypes); - } - -} diff --git a/cdlang/src/main/java/de/monticore/cd4codebasis/_symboltable/CD4CodeBasisSymbolTableCompleter.java b/cdlang/src/main/java/de/monticore/cd4codebasis/_symboltable/CD4CodeBasisSymbolTableCompleter.java index 53eb11af6..14f06ed24 100644 --- a/cdlang/src/main/java/de/monticore/cd4codebasis/_symboltable/CD4CodeBasisSymbolTableCompleter.java +++ b/cdlang/src/main/java/de/monticore/cd4codebasis/_symboltable/CD4CodeBasisSymbolTableCompleter.java @@ -12,8 +12,6 @@ import de.monticore.cdbasis._visitor.CDBasisVisitor2; import de.monticore.symbols.oosymbols._symboltable.FieldSymbol; import de.monticore.symbols.oosymbols._symboltable.MethodSymbol; -import de.monticore.types.check.FullSynthesizeFromMCCollectionTypes; -import de.monticore.types.check.ISynthesize; import de.monticore.types.check.SymTypeExpression; import de.monticore.types.check.SymTypeExpressionFactory; import de.monticore.types.check.SymTypeOfObject; @@ -24,19 +22,11 @@ public class CD4CodeBasisSymbolTableCompleter implements CD4CodeBasisVisitor2, CDBasisVisitor2 { - //TODO if possible remove ISynthesize from the constructor - protected ISynthesize typeSynthesizer; - - public CD4CodeBasisSymbolTableCompleter(ISynthesize typeSynthesizer) { - this.typeSynthesizer = typeSynthesizer; - } - + @Deprecated(forRemoval = true) public CD4CodeBasisSymbolTableCompleter(int i) { - this.typeSynthesizer = typeSynthesizer; } public CD4CodeBasisSymbolTableCompleter() { - this(new FullSynthesizeFromMCCollectionTypes()); } @Override diff --git a/cdlang/src/main/java/de/monticore/cd4codebasis/cocos/CD4CodeBasisCoCos.java b/cdlang/src/main/java/de/monticore/cd4codebasis/cocos/CD4CodeBasisCoCos.java index b44dc3c7b..3f64b7ab4 100644 --- a/cdlang/src/main/java/de/monticore/cd4codebasis/cocos/CD4CodeBasisCoCos.java +++ b/cdlang/src/main/java/de/monticore/cd4codebasis/cocos/CD4CodeBasisCoCos.java @@ -8,15 +8,11 @@ import de.monticore.cdbasis._cocos.CDBasisASTCDTargetImportStatementCoCo; import de.monticore.cdbasis.cocos.CDOnlyResolvableImportStatements; import de.monticore.cdbasis.cocos.ConstructorNameEqualsClassNameCoCo; -import de.monticore.types.check.AbstractDerive; import de.monticore.types.mcbasictypes._cocos.MCBasicTypesASTMCImportStatementCoCo; public class CD4CodeBasisCoCos extends CoCoParent { - protected final AbstractDerive calculator; - - public CD4CodeBasisCoCos(AbstractDerive calculator) { - this.calculator = calculator; + public CD4CodeBasisCoCos() { } @Override @@ -52,7 +48,7 @@ protected void addEbnfCoCos(CD4CodeBasisCoCoChecker checker) { checker.addCoCo(new CDMethodSignatureParameterNamesUnique()); // CD4CodeEnumConstant - checker.addCoCo(new CD4CodeEnumConstantParameterMatchConstructorArguments(calculator)); + checker.addCoCo(new CD4CodeEnumConstantParameterMatchConstructorArguments()); } } 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 9d60504ea..7b28a29eb 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 @@ -4,15 +4,15 @@ import com.google.common.collect.Lists; import de.monticore.cd4codebasis._ast.ASTCD4CodeEnumConstant; import de.monticore.cd4codebasis._ast.ASTCDConstructor; +import de.monticore.cd4codebasis._ast.ASTCDConstructorTOP; import de.monticore.cdinterfaceandenum._ast.ASTCDEnum; import de.monticore.cdinterfaceandenum._ast.ASTCDEnumConstant; import de.monticore.cdinterfaceandenum._cocos.CDInterfaceAndEnumASTCDEnumCoCo; import de.monticore.expressions.expressionsbasis._ast.ASTExpression; import de.monticore.symbols.basicsymbols._symboltable.VariableSymbol; -import de.monticore.types.check.AbstractDerive; import de.monticore.types.check.SymTypeExpression; -import de.monticore.types.check.TypeCheck; -import de.monticore.types.check.TypeCheckResult; +import de.monticore.types3.SymTypeRelations; +import de.monticore.types3.TypeCheck3; import de.se_rwth.commons.logging.Log; import java.util.ArrayList; import java.util.List; @@ -20,24 +20,19 @@ public class CD4CodeEnumConstantParameterMatchConstructorArguments implements CDInterfaceAndEnumASTCDEnumCoCo { - final AbstractDerive calculator; - - public CD4CodeEnumConstantParameterMatchConstructorArguments(AbstractDerive calculator) { - this.calculator = calculator; + public CD4CodeEnumConstantParameterMatchConstructorArguments() { } @Override public void check(ASTCDEnum node) { boolean hasDefaultConstructor = node.getCDConstructorList().isEmpty() || node - .getCDConstructorList().stream().anyMatch(c -> c.isEmptyCDParameters()); + .getCDConstructorList().stream().anyMatch(ASTCDConstructorTOP::isEmptyCDParameters); for (ASTCDEnumConstant enumConstant : node.getCDEnumConstantList()) { - if (enumConstant instanceof ASTCD4CodeEnumConstant) { - ASTCD4CodeEnumConstant cenumConstant = (ASTCD4CodeEnumConstant) enumConstant; + if (enumConstant instanceof ASTCD4CodeEnumConstant cenumConstant) { ArrayList paramTypes = Lists.newArrayList(); if (cenumConstant.isPresentArguments()) { for (ASTExpression expr : cenumConstant.getArguments().getExpressionList()) { - TypeCheckResult paramType = calculator.deriveType(expr); - paramTypes.add(paramType.getResult()); + paramTypes.add(TypeCheck3.typeOf(expr)); } if (!matchConstructor(paramTypes, node.getCDConstructorList())) { logError(enumConstant, node.getName()); @@ -64,7 +59,7 @@ protected boolean matchConstructor(ArrayList paramTypes, } boolean success = true; for (int i = 0; i < formalParams.size(); i++) { - if (!TypeCheck.compatible(formalParams.get(i).getType(), paramTypes.get(i))) { + if (!SymTypeRelations.isCompatible(formalParams.get(i).getType(), paramTypes.get(i))) { success = false; } } diff --git a/cdlang/src/main/java/de/monticore/cd4codebasis/typescalculator/FullDeriveFromCD4CodeBasis.java b/cdlang/src/main/java/de/monticore/cd4codebasis/typescalculator/FullDeriveFromCD4CodeBasis.java deleted file mode 100644 index 707eaf71b..000000000 --- a/cdlang/src/main/java/de/monticore/cd4codebasis/typescalculator/FullDeriveFromCD4CodeBasis.java +++ /dev/null @@ -1,37 +0,0 @@ -/* (c) https://github.com/MontiCore/monticore */ -package de.monticore.cd4codebasis.typescalculator; - -import de.monticore.cd4codebasis.CD4CodeBasisMill; -import de.monticore.cd4codebasis._visitor.CD4CodeBasisTraverser; -import de.monticore.types.check.*; - -public class FullDeriveFromCD4CodeBasis extends AbstractDerive { - - public FullDeriveFromCD4CodeBasis(CD4CodeBasisTraverser traverser) { - super(traverser); - init(traverser); - } - - public FullDeriveFromCD4CodeBasis() { - this(CD4CodeBasisMill.inheritanceTraverser()); - } - - public void init(CD4CodeBasisTraverser traverser) { - final DeriveSymTypeOfMCCommonLiterals deriveSymTypeOfMCCommonLiterals = - new DeriveSymTypeOfMCCommonLiterals(); - deriveSymTypeOfMCCommonLiterals.setTypeCheckResult(getTypeCheckResult()); - traverser.add4MCCommonLiterals(deriveSymTypeOfMCCommonLiterals); - - final DeriveSymTypeOfExpression deriveSymTypeOfExpression = new DeriveSymTypeOfExpression(); - deriveSymTypeOfExpression.setTypeCheckResult(getTypeCheckResult()); - traverser.add4ExpressionsBasis(deriveSymTypeOfExpression); - traverser.setExpressionsBasisHandler(deriveSymTypeOfExpression); - - final DeriveSymTypeOfCommonExpressions deriveSymTypeOfCommonExpressions = - new DeriveSymTypeOfCommonExpressions(); - deriveSymTypeOfCommonExpressions.setTypeCheckResult(getTypeCheckResult()); - traverser.add4CommonExpressions(deriveSymTypeOfCommonExpressions); - traverser.setCommonExpressionsHandler(deriveSymTypeOfCommonExpressions); - } - -} 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 35bcc9e20..9d04a6c79 100644 --- a/cdlang/src/main/java/de/monticore/cdassociation/_symboltable/CDAssociationSymbolTableCompleter.java +++ b/cdlang/src/main/java/de/monticore/cdassociation/_symboltable/CDAssociationSymbolTableCompleter.java @@ -11,8 +11,6 @@ import de.monticore.cdassociation._visitor.CDAssociationVisitor2; import de.monticore.symbols.basicsymbols._symboltable.TypeSymbol; import de.monticore.symbols.basicsymbols._symboltable.VariableSymbol; -import de.monticore.types.check.FullSynthesizeFromMCBasicTypes; -import de.monticore.types.check.ISynthesize; import de.monticore.types.check.SymTypeExpression; import de.monticore.types3.TypeCheck3; import de.monticore.umlmodifier._ast.ASTModifier; @@ -23,16 +21,6 @@ public class CDAssociationSymbolTableCompleter implements CDAssociationVisitor2, CDAssociationHandler { protected CDAssociationTraverser traverser; - //TODO remove ISynthsize from the constructor if possible - protected ISynthesize typeSynthesizer; - - public CDAssociationSymbolTableCompleter(ISynthesize typeSynthesizer) { - this.typeSynthesizer = typeSynthesizer; - } - - public CDAssociationSymbolTableCompleter() { - this(new FullSynthesizeFromMCBasicTypes()); - } @Override public void handle(ASTCDAssociation node) { diff --git a/cdlang/src/main/java/de/monticore/cdbasis/_symboltable/CDBasisSymbolTableCompleter.java b/cdlang/src/main/java/de/monticore/cdbasis/_symboltable/CDBasisSymbolTableCompleter.java index dbd93dd14..bfac8ff95 100644 --- a/cdlang/src/main/java/de/monticore/cdbasis/_symboltable/CDBasisSymbolTableCompleter.java +++ b/cdlang/src/main/java/de/monticore/cdbasis/_symboltable/CDBasisSymbolTableCompleter.java @@ -6,15 +6,11 @@ import de.monticore.cdbasis._ast.ASTCDAttribute; import de.monticore.cdbasis._ast.ASTCDClass; import de.monticore.cdbasis._ast.ASTCDCompilationUnit; -import de.monticore.cdbasis._prettyprint.CDBasisFullPrettyPrinter; import de.monticore.cdbasis._visitor.CDBasisTraverser; import de.monticore.cdbasis._visitor.CDBasisVisitor2; -import de.monticore.prettyprint.IndentPrinter; import de.monticore.symbols.oosymbols._symboltable.FieldSymbol; import de.monticore.symbols.oosymbols._visitor.OOSymbolsVisitor2; import de.monticore.symboltable.ImportStatement; -import de.monticore.types.check.FullSynthesizeFromMCBasicTypes; -import de.monticore.types.check.ISynthesize; import de.monticore.types.check.SymTypeExpression; import de.monticore.types3.TypeCheck3; import de.monticore.umlmodifier._ast.ASTModifier; @@ -24,18 +20,6 @@ public class CDBasisSymbolTableCompleter implements CDBasisVisitor2, OOSymbolsVisitor2 { protected CDBasisTraverser traverser; - //TODO remove ISynthesize from the constructor if possible - protected ISynthesize typeSynthesizer; - protected CDBasisFullPrettyPrinter prettyPrinter; - - public CDBasisSymbolTableCompleter(ISynthesize typeSynthesizer) { - this.typeSynthesizer = typeSynthesizer; - prettyPrinter = new CDBasisFullPrettyPrinter(new IndentPrinter()); - } - - public CDBasisSymbolTableCompleter() { - this(new FullSynthesizeFromMCBasicTypes()); - } @Override public void visit(ASTCDCompilationUnit node) { diff --git a/cdlang/src/main/java/de/monticore/cdbasis/cocos/CDBasisCoCos.java b/cdlang/src/main/java/de/monticore/cdbasis/cocos/CDBasisCoCos.java index 91161e150..9e52de439 100644 --- a/cdlang/src/main/java/de/monticore/cdbasis/cocos/CDBasisCoCos.java +++ b/cdlang/src/main/java/de/monticore/cdbasis/cocos/CDBasisCoCos.java @@ -9,16 +9,9 @@ import de.monticore.cdinterfaceandenum.cocos.ebnf.CDClassExtendsOnlyClasses; import de.monticore.cdinterfaceandenum.cocos.ebnf.CDClassImplementsNotCyclic; import de.monticore.cdinterfaceandenum.cocos.ebnf.CDClassImplementsOnlyInterfaces; -import de.monticore.types.check.AbstractDerive; public class CDBasisCoCos extends CoCoParent { - private final AbstractDerive calculator; - - public CDBasisCoCos(AbstractDerive calculator) { - this.calculator = calculator; - } - @Override public CDBasisCoCoChecker createNewChecker() { return new CDBasisCoCoChecker(); @@ -36,7 +29,7 @@ protected void addEbnfCoCos(CDBasisCoCoChecker checker) { // CDAttribute checker.addCoCo(new CDAttributeTypeExists()); checker.addCoCo(new CDAttributeNameLowerCaseIfNotStatic()); - checker.addCoCo(new CDAttributeInitialTypeCompatible(calculator)); + checker.addCoCo(new CDAttributeInitialTypeCompatible()); checker.addCoCo(new CDAttributeUniqueInClass()); // CDClass diff --git a/cdlang/src/main/java/de/monticore/cdbasis/cocos/ebnf/CDAttributeInitialTypeCompatible.java b/cdlang/src/main/java/de/monticore/cdbasis/cocos/ebnf/CDAttributeInitialTypeCompatible.java index a4855d45d..308f26fa7 100644 --- a/cdlang/src/main/java/de/monticore/cdbasis/cocos/ebnf/CDAttributeInitialTypeCompatible.java +++ b/cdlang/src/main/java/de/monticore/cdbasis/cocos/ebnf/CDAttributeInitialTypeCompatible.java @@ -3,40 +3,36 @@ import de.monticore.cdbasis._ast.ASTCDAttribute; import de.monticore.cdbasis._cocos.CDBasisASTCDAttributeCoCo; -import de.monticore.types.check.AbstractDerive; -import de.monticore.types.check.TypeCheck; -import de.monticore.types.check.TypeCheckResult; +import de.monticore.types.check.SymTypeExpression; +import de.monticore.types3.SymTypeRelations; +import de.monticore.types3.TypeCheck3; import de.se_rwth.commons.logging.Log; -// todo replace with TypeCheck3 -// base it on VarDeclarationInitializationHasCorrectType? - /** Checks that an attribute assignment is compatible w.r.t. the attribute's type. */ public class CDAttributeInitialTypeCompatible implements CDBasisASTCDAttributeCoCo { - final AbstractDerive calculator; + public static final String ERROR_CODE = "0xCDC02"; - public CDAttributeInitialTypeCompatible(AbstractDerive calculator) { - this.calculator = calculator; - } + public static final String ERROR_MSG_FORMAT = + "The initial value assignment for the attribute `%s` in class `%s` is not compatible to its type `%s`."; @Override public void check(ASTCDAttribute node) { if (node.isPresentInitial()) { String className = node.getSymbol().getEnclosingScope().getName(); - final TypeCheckResult symTypeExpressionOfInitial = calculator.deriveType(node.getInitial()); - if (!symTypeExpressionOfInitial.isPresentResult()) { - Log.error(String.format( - "0xCDC01: The type of the value of the attribute %s in class %s could not be calculated.", - node.getName(), className), node.get_SourcePositionStart()); + final SymTypeExpression symTypeExpressionOfInitial = TypeCheck3.typeOf(node.getInitial()); + if (symTypeExpressionOfInitial.isObscureType()) { + // The error is already printed by the IDerive visitors, thus we would spam the log if we would log an error + // again. Therefore, we only leave a note in the debug log. + Log.debug(String.format( + "0xCDC01: As the initial expression for the value of the attribute '%s' in class %s at %s is invalid, coco '%s' " + + "will not be checked.", node.getName(), className, node.get_SourcePositionStart(), + this.getClass().getSimpleName()), "Cocos"); } - - if (!TypeCheck.isSubtypeOf(symTypeExpressionOfInitial.getResult(), node.getSymbol() + else if (!SymTypeRelations.isSubTypeOf(symTypeExpressionOfInitial, node.getSymbol() .getType())) { - Log.error(String.format( - "0xCDC02: The initial value assignment for the attribute %s in class %s is not compatible to its type %s.", - node.getName(), className, node.getSymbol().getType().print()), node - .get_SourcePositionStart()); + Log.error(ERROR_CODE + " " + String.format(ERROR_MSG_FORMAT, node.getName(), className, node + .getSymbol().getType().print()), node.get_SourcePositionStart()); } } } diff --git a/cdlang/src/main/java/de/monticore/cdbasis/typescalculator/FullDeriveFromCDBasis.java b/cdlang/src/main/java/de/monticore/cdbasis/typescalculator/FullDeriveFromCDBasis.java deleted file mode 100644 index 88efd15d3..000000000 --- a/cdlang/src/main/java/de/monticore/cdbasis/typescalculator/FullDeriveFromCDBasis.java +++ /dev/null @@ -1,27 +0,0 @@ -/* (c) https://github.com/MontiCore/monticore */ -package de.monticore.cdbasis.typescalculator; - -import de.monticore.cdbasis.CDBasisMill; -import de.monticore.cdbasis._visitor.CDBasisTraverser; -import de.monticore.types.check.AbstractDerive; -import de.monticore.types.check.DeriveSymTypeOfExpression; - -public class FullDeriveFromCDBasis extends AbstractDerive { - - public FullDeriveFromCDBasis(CDBasisTraverser traverser) { - super(traverser); - init(traverser); - } - - public FullDeriveFromCDBasis() { - this(CDBasisMill.inheritanceTraverser()); - } - - public void init(CDBasisTraverser traverser) { - final DeriveSymTypeOfExpression deriveSymTypeOfExpression = new DeriveSymTypeOfExpression(); - deriveSymTypeOfExpression.setTypeCheckResult(getTypeCheckResult()); - traverser.add4ExpressionsBasis(deriveSymTypeOfExpression); - traverser.setExpressionsBasisHandler(deriveSymTypeOfExpression); - } - -} diff --git a/cdlang/src/main/java/de/monticore/cdinterfaceandenum/_symboltable/CDInterfaceAndEnumSymbolTableCompleter.java b/cdlang/src/main/java/de/monticore/cdinterfaceandenum/_symboltable/CDInterfaceAndEnumSymbolTableCompleter.java index 8ce9c16fb..bf7da4900 100644 --- a/cdlang/src/main/java/de/monticore/cdinterfaceandenum/_symboltable/CDInterfaceAndEnumSymbolTableCompleter.java +++ b/cdlang/src/main/java/de/monticore/cdinterfaceandenum/_symboltable/CDInterfaceAndEnumSymbolTableCompleter.java @@ -2,7 +2,6 @@ package de.monticore.cdinterfaceandenum._symboltable; import de.monticore.cdbasis._symboltable.CDTypeSymbol; -import de.monticore.cdinterfaceandenum.CDInterfaceAndEnumMill; import de.monticore.cdinterfaceandenum._ast.ASTCDEnum; import de.monticore.cdinterfaceandenum._ast.ASTCDEnumConstant; import de.monticore.cdinterfaceandenum._ast.ASTCDInterface; @@ -16,15 +15,7 @@ public class CDInterfaceAndEnumSymbolTableCompleter implements CDInterfaceAndEnumVisitor2 { - //TODO remove ISynthesize from the constructor if possible - protected ISynthesize typeSynthesizer; - - public CDInterfaceAndEnumSymbolTableCompleter(ISynthesize typeSynthesizer) { - this.typeSynthesizer = typeSynthesizer; - } - public CDInterfaceAndEnumSymbolTableCompleter() { - this(new FullSynthesizeFromMCBasicTypes()); } @Override @@ -51,13 +42,15 @@ protected void initialize_CDInterface(ASTCDInterface ast) { if (ast.isPresentCDExtendUsage()) { symbol.addAllSuperTypes(ast.getCDExtendUsage().streamSuperclass().map(s -> { final SymTypeExpression result = TypeCheck3.symTypeFromAST(s); - if (result == null) { - Log.error(String.format( - "0xCDA30: The type of the extended interfaces (%s) could not be calculated", - CDInterfaceAndEnumMill.prettyPrint(s, false)), s.get_SourcePositionStart()); + if (result.isObscureType()) { + // The error is already printed by the IDerive visitors, thus we would spam the log if we would log an error + // again. Therefore, we only leave a note in the debug log. + Log.debug(String.format( + "0xCDA30: The type of the extended interfaces (%s) could not be calculated", s + .printType()), "STC"); } return result; - }).filter(res -> res != null && !res.isObscureType()).collect(Collectors.toList())); + }).filter(res -> !res.isObscureType()).collect(Collectors.toList())); } } diff --git a/cdlang/src/main/java/de/monticore/symtabdefinition/_symboltable/SymTabDefinitionFullSymbolTableCompleter.java b/cdlang/src/main/java/de/monticore/symtabdefinition/_symboltable/SymTabDefinitionFullSymbolTableCompleter.java index 249bf1763..ef3d6e63f 100644 --- a/cdlang/src/main/java/de/monticore/symtabdefinition/_symboltable/SymTabDefinitionFullSymbolTableCompleter.java +++ b/cdlang/src/main/java/de/monticore/symtabdefinition/_symboltable/SymTabDefinitionFullSymbolTableCompleter.java @@ -1,7 +1,6 @@ /* (c) https://github.com/MontiCore/monticore */ package de.monticore.symtabdefinition._symboltable; -import de.monticore.cd4code.typescalculator.FullSynthesizeFromCD4Code; import de.monticore.cd4codebasis._symboltable.CD4CodeBasisSymbolTableCompleter; import de.monticore.cdbasis._symboltable.CDBasisSymbolTableCompleter; import de.monticore.cdinterfaceandenum._symboltable.CDInterfaceAndEnumSymbolTableCompleter; @@ -15,15 +14,13 @@ public class SymTabDefinitionFullSymbolTableCompleter { public SymTabDefinitionFullSymbolTableCompleter() { this.traverser = SymTabDefinitionMill.inheritanceTraverser(); - CDBasisSymbolTableCompleter cDBasisVisitor = new CDBasisSymbolTableCompleter( - new FullSynthesizeFromCD4Code()); + CDBasisSymbolTableCompleter cDBasisVisitor = new CDBasisSymbolTableCompleter(); traverser.add4CDBasis(cDBasisVisitor); traverser.add4OOSymbols(cDBasisVisitor); CDInterfaceAndEnumSymbolTableCompleter cdInterfaceAndEnumVisitor = - new CDInterfaceAndEnumSymbolTableCompleter(new FullSynthesizeFromCD4Code()); + new CDInterfaceAndEnumSymbolTableCompleter(); traverser.add4CDInterfaceAndEnum(cdInterfaceAndEnumVisitor); - CD4CodeBasisSymbolTableCompleter cd4CodeBasisVisitor = new CD4CodeBasisSymbolTableCompleter( - new FullSynthesizeFromCD4Code()); + CD4CodeBasisSymbolTableCompleter cd4CodeBasisVisitor = new CD4CodeBasisSymbolTableCompleter(); traverser.add4CD4CodeBasis(cd4CodeBasisVisitor); traverser.add4CDBasis(cd4CodeBasisVisitor); SymTabDefinitionSymbolTableCompleter stDefinitionVisitor = diff --git a/cdlang/src/test/java/de/monticore/cd/methodtemplates/CD4CTest.java b/cdlang/src/test/java/de/monticore/cd/methodtemplates/CD4CTest.java index e0984a142..ff4281c26 100644 --- a/cdlang/src/test/java/de/monticore/cd/methodtemplates/CD4CTest.java +++ b/cdlang/src/test/java/de/monticore/cd/methodtemplates/CD4CTest.java @@ -258,12 +258,10 @@ public void testWithUnknownReturnTypePredicates() { CD4C.getInstance().addDefaultPredicates(); - // try to create a method with unkown type + // try to create a method with unknown type CD4C.getInstance().addMethod(clazz, "de.monticore.cd.methodtemplates.UnknownReturnType"); - assertEquals(1, Log.getFindingsCount()); assertEquals("0xA0324 Cannot find symbol UnknownReturnType", Log.getFindings().get(0).getMsg()); - Log.clearFindings(); } @@ -284,7 +282,6 @@ public void testWithUnknownParameterTypePredicates() { // try to create a print method that already exists CD4C.getInstance().addMethod(clazz, "de.monticore.cd.methodtemplates.UnknownParameterType"); - assertEquals(1, Log.getFindingsCount()); assertEquals("0xA0324 Cannot find symbol UnknownParameterType", Log.getFindings().get(0) .getMsg()); diff --git a/cdlang/src/test/java/de/monticore/testcd4codebasis/CD4CodeBasisTestBasis.java b/cdlang/src/test/java/de/monticore/testcd4codebasis/CD4CodeBasisTestBasis.java index e9ae9fe97..e0a869baf 100644 --- a/cdlang/src/test/java/de/monticore/testcd4codebasis/CD4CodeBasisTestBasis.java +++ b/cdlang/src/test/java/de/monticore/testcd4codebasis/CD4CodeBasisTestBasis.java @@ -27,9 +27,7 @@ public void initObjects() { BasicSymbolsMill.initializePrimitives(); p = TestCD4CodeBasisMill.parser(); - // globalScope.setSymbolPath(new MCPath(Paths.get(PATH))); - - cdCD4CodeBasisCoCos = new CD4CodeBasisCoCos(new FullDeriveFromTestCD4CodeBasis()); + cdCD4CodeBasisCoCos = new CD4CodeBasisCoCos(); coCoChecker = new TestCD4CodeBasisCoCoChecker(); } diff --git a/cdlang/src/test/java/de/monticore/testcd4codebasis/FullDeriveFromTestCD4CodeBasis.java b/cdlang/src/test/java/de/monticore/testcd4codebasis/FullDeriveFromTestCD4CodeBasis.java deleted file mode 100644 index ea8fcc8d3..000000000 --- a/cdlang/src/test/java/de/monticore/testcd4codebasis/FullDeriveFromTestCD4CodeBasis.java +++ /dev/null @@ -1,36 +0,0 @@ -/* (c) https://github.com/MontiCore/monticore */ -package de.monticore.testcd4codebasis; - -import de.monticore.testcd4codebasis._visitor.TestCD4CodeBasisTraverser; -import de.monticore.types.check.*; - -public class FullDeriveFromTestCD4CodeBasis extends AbstractDerive { - - public FullDeriveFromTestCD4CodeBasis() { - this(TestCD4CodeBasisMill.inheritanceTraverser()); - } - - public FullDeriveFromTestCD4CodeBasis(TestCD4CodeBasisTraverser traverser) { - super(traverser); - init(traverser); - } - - public void init(TestCD4CodeBasisTraverser traverser) { - final DeriveSymTypeOfMCCommonLiterals deriveSymTypeOfMCCommonLiterals = - new DeriveSymTypeOfMCCommonLiterals(); - deriveSymTypeOfMCCommonLiterals.setTypeCheckResult(getTypeCheckResult()); - traverser.add4MCCommonLiterals(deriveSymTypeOfMCCommonLiterals); - - final DeriveSymTypeOfExpression deriveSymTypeOfExpression = new DeriveSymTypeOfExpression(); - deriveSymTypeOfExpression.setTypeCheckResult(getTypeCheckResult()); - traverser.add4ExpressionsBasis(deriveSymTypeOfExpression); - traverser.setExpressionsBasisHandler(deriveSymTypeOfExpression); - - final DeriveSymTypeOfCommonExpressions deriveSymTypeOfCommonExpressions = - new DeriveSymTypeOfCommonExpressions(); - deriveSymTypeOfCommonExpressions.setTypeCheckResult(getTypeCheckResult()); - traverser.add4CommonExpressions(deriveSymTypeOfCommonExpressions); - traverser.setCommonExpressionsHandler(deriveSymTypeOfCommonExpressions); - } - -} diff --git a/cdlang/src/test/java/de/monticore/testcd4codebasis/cocos/CD4CodeEnumConstantParameterMatchConstructorArgumentsTest.java b/cdlang/src/test/java/de/monticore/testcd4codebasis/cocos/CD4CodeEnumConstantParameterMatchConstructorArgumentsTest.java index 7119fef12..ceffe4668 100644 --- a/cdlang/src/test/java/de/monticore/testcd4codebasis/cocos/CD4CodeEnumConstantParameterMatchConstructorArgumentsTest.java +++ b/cdlang/src/test/java/de/monticore/testcd4codebasis/cocos/CD4CodeEnumConstantParameterMatchConstructorArgumentsTest.java @@ -8,7 +8,6 @@ import de.monticore.cd4codebasis.cocos.ebnf.CD4CodeEnumConstantParameterMatchConstructorArguments; import de.monticore.cdbasis._ast.ASTCDCompilationUnit; import de.monticore.testcd4codebasis.CD4CodeBasisTestBasis; -import de.monticore.testcd4codebasis.FullDeriveFromTestCD4CodeBasis; import de.monticore.testcd4codebasis.TestCD4CodeBasisMill; import de.monticore.testcd4codebasis._symboltable.TestCD4CodeBasisSymbolTableCompleter; import de.se_rwth.commons.logging.Log; @@ -33,8 +32,7 @@ public void testValid() throws IOException { ast.accept(completer.getTraverser()); CD4CodeBasisCoCoChecker coCoChecker = new CD4CodeBasisCoCoChecker(); - coCoChecker.addCoCo(new CD4CodeEnumConstantParameterMatchConstructorArguments( - new FullDeriveFromTestCD4CodeBasis())); + coCoChecker.addCoCo(new CD4CodeEnumConstantParameterMatchConstructorArguments()); // check coco coCoChecker.checkAll(ast); @@ -55,8 +53,7 @@ public void testInvalid() throws IOException { // check coco CD4CodeBasisCoCoChecker coCoChecker = new CD4CodeBasisCoCoChecker(); - coCoChecker.addCoCo(new CD4CodeEnumConstantParameterMatchConstructorArguments( - new FullDeriveFromTestCD4CodeBasis())); + coCoChecker.addCoCo(new CD4CodeEnumConstantParameterMatchConstructorArguments()); coCoChecker.checkAll(ast); assertEquals(2, Log.getFindings().size()); assertTrue(Log.getFindings().get(0).getMsg().startsWith("0xCDCD2")); // for FOO diff --git a/cdlang/src/test/java/de/monticore/testcdbasis/cocos/CDAttributeInitialTypeCompatibleTest.java b/cdlang/src/test/java/de/monticore/testcdbasis/cocos/CDAttributeInitialTypeCompatibleTest.java index 17c3d0555..80ca21337 100644 --- a/cdlang/src/test/java/de/monticore/testcdbasis/cocos/CDAttributeInitialTypeCompatibleTest.java +++ b/cdlang/src/test/java/de/monticore/testcdbasis/cocos/CDAttributeInitialTypeCompatibleTest.java @@ -4,7 +4,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; -import de.monticore.cd4analysis.typescalculator.FullDeriveFromCD4Analysis; import de.monticore.cdbasis._ast.ASTCDCompilationUnit; import de.monticore.cdbasis.cocos.ebnf.CDAttributeInitialTypeCompatible; import de.monticore.testcdbasis.CDBasisTestBasis; @@ -18,7 +17,7 @@ public class CDAttributeInitialTypeCompatibleTest extends CDBasisTestBasis { @Test public void testValid() throws IOException { - coCoChecker.addCoCo(new CDAttributeInitialTypeCompatible(new FullDeriveFromCD4Analysis())); + coCoChecker.addCoCo(new CDAttributeInitialTypeCompatible()); final Optional optAST = p.parse(getFilePath("cdbasis/cocos/Valid.cd")); assertTrue(optAST.isPresent()); final ASTCDCompilationUnit ast = optAST.get(); @@ -31,7 +30,7 @@ public void testValid() throws IOException { @Test public void testInvalid() throws IOException { - coCoChecker.addCoCo(new CDAttributeInitialTypeCompatible(new FullDeriveFromCD4Analysis())); + coCoChecker.addCoCo(new CDAttributeInitialTypeCompatible()); final Optional optAST = p.parse(getFilePath( "cdbasis/cocos/CDAttributeInitialTypeCompatibleInvalid.cd")); assertTrue(optAST.isPresent()); diff --git a/cdmerge/src/main/java/de/monticore/cdmerge/validation/CDMergeCD4ACoCos.java b/cdmerge/src/main/java/de/monticore/cdmerge/validation/CDMergeCD4ACoCos.java index 8a78f7baf..2a6c154ee 100644 --- a/cdmerge/src/main/java/de/monticore/cdmerge/validation/CDMergeCD4ACoCos.java +++ b/cdmerge/src/main/java/de/monticore/cdmerge/validation/CDMergeCD4ACoCos.java @@ -2,7 +2,6 @@ package de.monticore.cdmerge.validation; import de.monticore.cd4code._cocos.CD4CodeCoCoChecker; -import de.monticore.cd4code.typescalculator.FullDeriveFromCD4Code; import de.monticore.cdassociation.cocos.ebnf.*; import de.monticore.cdbasis.cocos.ebnf.*; import de.monticore.cdbasis.cocos.mcg.ModifierNotMultipleVisibilitiesCoCo; @@ -22,7 +21,7 @@ public CD4CodeCoCoChecker getCheckerForMergedCDs() { private void addCoCos(CD4CodeCoCoChecker checker) { // CD Basis - EBNF - checker.addCoCo(new CDAttributeInitialTypeCompatible(new FullDeriveFromCD4Code())); + checker.addCoCo(new CDAttributeInitialTypeCompatible()); checker.addCoCo(new CDAttributeNameLowerCaseIfNotStatic()); checker.addCoCo(new CDAttributeOverridden()); // FIXME disabled for now