From 8307479d466bd9903d7836e6031b21fb85637b73 Mon Sep 17 00:00:00 2001 From: Hendrik7889 <44064629+Hendrik7889@users.noreply.github.com> Date: Mon, 10 Aug 2026 18:59:02 +0200 Subject: [PATCH] add CoCo checker for all import types --- .../monticore/cdbasis/cocos/CDBasisCoCos.java | 7 +++ .../CDOnlyResolvableImportStatements.java | 37 ++++++++++++++ .../CDOnlyResolvableImportStatementsTest.java | 49 +++++++++++++++++++ ...CDUnresolvableMCImportStatementsInvalid.cd | 15 ++++++ ...resolvableTargetImportStatementsInvalid.cd | 15 ++++++ .../de/monticore/cdbasis/cocos/Valid.cd | 1 + 6 files changed, 124 insertions(+) create mode 100644 cdlang/src/main/java/de/monticore/cdbasis/cocos/CDOnlyResolvableImportStatements.java create mode 100644 cdlang/src/test/java/de/monticore/testcdbasis/cocos/CDOnlyResolvableImportStatementsTest.java create mode 100644 cdlang/src/test/resources/de/monticore/cdbasis/cocos/CDUnresolvableMCImportStatementsInvalid.cd create mode 100644 cdlang/src/test/resources/de/monticore/cdbasis/cocos/CDUnresolvableTargetImportStatementsInvalid.cd 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..4253a0daf 100644 --- a/cdlang/src/main/java/de/monticore/cdbasis/cocos/CDBasisCoCos.java +++ b/cdlang/src/main/java/de/monticore/cdbasis/cocos/CDBasisCoCos.java @@ -2,6 +2,7 @@ package de.monticore.cdbasis.cocos; import de.monticore.cd.cocos.CoCoParent; +import de.monticore.cdbasis._cocos.CDBasisASTCDTargetImportStatementCoCo; import de.monticore.cdbasis._cocos.CDBasisCoCoChecker; import de.monticore.cdbasis.cocos.ebnf.*; import de.monticore.cdbasis.cocos.mcg.ModifierNotMultipleVisibilitiesCoCo; @@ -10,6 +11,7 @@ import de.monticore.cdinterfaceandenum.cocos.ebnf.CDClassImplementsNotCyclic; import de.monticore.cdinterfaceandenum.cocos.ebnf.CDClassImplementsOnlyInterfaces; import de.monticore.types.check.AbstractDerive; +import de.monticore.types.mcbasictypes._cocos.MCBasicTypesASTMCImportStatementCoCo; public class CDBasisCoCos extends CoCoParent { @@ -59,6 +61,11 @@ protected void addEbnfCoCos(CDBasisCoCoChecker checker) { // CDPackage checker.addCoCo(new CDPackageNameUnique()); checker.addCoCo(new CDPackageUniqueCDTypeNames()); + + // CDImport Statements + CDOnlyResolvableImportStatements coCo = new CDOnlyResolvableImportStatements(); + checker.addCoCo((CDBasisASTCDTargetImportStatementCoCo) coCo); + checker.addCoCo((MCBasicTypesASTMCImportStatementCoCo) coCo); } @Override diff --git a/cdlang/src/main/java/de/monticore/cdbasis/cocos/CDOnlyResolvableImportStatements.java b/cdlang/src/main/java/de/monticore/cdbasis/cocos/CDOnlyResolvableImportStatements.java new file mode 100644 index 000000000..d224bc5c1 --- /dev/null +++ b/cdlang/src/main/java/de/monticore/cdbasis/cocos/CDOnlyResolvableImportStatements.java @@ -0,0 +1,37 @@ +package de.monticore.cdbasis.cocos; + +import de.monticore.cdbasis.CDBasisMill; +import de.monticore.cdbasis._ast.ASTCDCompilationUnit; +import de.monticore.cdbasis._ast.ASTCDTargetImportStatement; +import de.monticore.cdbasis._cocos.CDBasisASTCDTargetImportStatementCoCo; +import de.monticore.cdbasis._symboltable.ICDBasisScope; +import de.monticore.grammar.MCGrammarSymbolTableHelper; +import de.monticore.symbols.basicsymbols._symboltable.TypeSymbol; +import de.monticore.types.mcbasictypes._ast.ASTMCImportStatement; +import de.monticore.types.mcbasictypes._cocos.MCBasicTypesASTMCImportStatementCoCo; +import de.se_rwth.commons.logging.Log; +import java.util.Optional; + +public class CDOnlyResolvableImportStatements + implements CDBasisASTCDTargetImportStatementCoCo, MCBasicTypesASTMCImportStatementCoCo { + + private Optional resolve(String qName) { + return CDBasisMill.globalScope().resolveType(qName); + } + + @Override + public void check(ASTCDTargetImportStatement node) { + String qName = node.getMCQualifiedName().getQName(); + if (resolve(qName).isEmpty()) { + Log.error("0xCDC40: Unresolved target import statement: " + qName); + } + } + + @Override + public void check(ASTMCImportStatement node) { + String qName = node.getMCQualifiedName().getQName(); + if (resolve(qName).isEmpty()) { + Log.error("0xCDC41: Unresolved mc import statement: " + qName); + } + } +} \ No newline at end of file diff --git a/cdlang/src/test/java/de/monticore/testcdbasis/cocos/CDOnlyResolvableImportStatementsTest.java b/cdlang/src/test/java/de/monticore/testcdbasis/cocos/CDOnlyResolvableImportStatementsTest.java new file mode 100644 index 000000000..741390769 --- /dev/null +++ b/cdlang/src/test/java/de/monticore/testcdbasis/cocos/CDOnlyResolvableImportStatementsTest.java @@ -0,0 +1,49 @@ +package de.monticore.testcdbasis.cocos; + +import de.monticore.cdbasis._cocos.CDBasisASTCDTargetImportStatementCoCo; +import de.monticore.cdbasis.cocos.CDOnlyResolvableImportStatements; +import de.monticore.cdbasis._ast.ASTCDCompilationUnit; +import de.monticore.testcdbasis.CDBasisTestBasis; +import de.monticore.types.mcbasictypes._cocos.MCBasicTypesASTMCImportStatementCoCo; +import de.se_rwth.commons.logging.Log; +import org.junit.jupiter.api.Test; +import java.io.IOException; +import java.util.Optional; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class CDOnlyResolvableImportStatementsTest extends CDBasisTestBasis { + + @Test + public void testInvalidTargetImportStatement() throws IOException { + CDOnlyResolvableImportStatements coCo = new CDOnlyResolvableImportStatements(); + coCoChecker.addCoCo((CDBasisASTCDTargetImportStatementCoCo) coCo); + coCoChecker.addCoCo((MCBasicTypesASTMCImportStatementCoCo) coCo); + final Optional optAST = p.parse(getFilePath( + "cdbasis/cocos/CDUnresolvableTargetImportStatementsInvalid.cd")); + assertTrue(optAST.isPresent()); + final ASTCDCompilationUnit ast = optAST.get(); + Log.getFindings().clear(); + coCoChecker.checkAll(ast); + assertEquals(1, Log.getFindings().size()); + assertTrue(Log.getFindings().get(0).getMsg().startsWith("0xCDC40")); + } + + @Test + public void testInvalidMCImportStatement() throws IOException { + CDOnlyResolvableImportStatements coCo = new CDOnlyResolvableImportStatements(); + coCoChecker.addCoCo((CDBasisASTCDTargetImportStatementCoCo) coCo); + coCoChecker.addCoCo((MCBasicTypesASTMCImportStatementCoCo) coCo); + final Optional optAST = p.parse(getFilePath( + "cdbasis/cocos/CDUnresolvableMCImportStatementsInvalid.cd")); + assertTrue(optAST.isPresent()); + final ASTCDCompilationUnit ast = optAST.get(); + Log.getFindings().clear(); + coCoChecker.checkAll(ast); + assertEquals(1, Log.getFindings().size()); + assertTrue(Log.getFindings().get(0).getMsg().startsWith("0xCDC41")); + } + + @Override + public void after() {} +} diff --git a/cdlang/src/test/resources/de/monticore/cdbasis/cocos/CDUnresolvableMCImportStatementsInvalid.cd b/cdlang/src/test/resources/de/monticore/cdbasis/cocos/CDUnresolvableMCImportStatementsInvalid.cd new file mode 100644 index 000000000..83ef08ec8 --- /dev/null +++ b/cdlang/src/test/resources/de/monticore/cdbasis/cocos/CDUnresolvableMCImportStatementsInvalid.cd @@ -0,0 +1,15 @@ +/* (c) https://github.com/MontiCore/monticore */ +import this.path.doesnt.Exist; + +classdiagram CDUnresolvableImportStatementsInvalid { + + class A { + int number = 1; + } + + class B extends A{ + derived int number = 5; + } + +} + diff --git a/cdlang/src/test/resources/de/monticore/cdbasis/cocos/CDUnresolvableTargetImportStatementsInvalid.cd b/cdlang/src/test/resources/de/monticore/cdbasis/cocos/CDUnresolvableTargetImportStatementsInvalid.cd new file mode 100644 index 000000000..77c9d5384 --- /dev/null +++ b/cdlang/src/test/resources/de/monticore/cdbasis/cocos/CDUnresolvableTargetImportStatementsInvalid.cd @@ -0,0 +1,15 @@ +/* (c) https://github.com/MontiCore/monticore */ +targetimport this.path.doesnt.Exist; + +classdiagram CDUnresolvableTargetImportStatementsInvalid { + + class A { + int number = 1; + } + + class B extends A{ + derived int number = 5; + } + +} + diff --git a/cdlang/src/test/resources/de/monticore/cdbasis/cocos/Valid.cd b/cdlang/src/test/resources/de/monticore/cdbasis/cocos/Valid.cd index 74530f809..659aa460e 100644 --- a/cdlang/src/test/resources/de/monticore/cdbasis/cocos/Valid.cd +++ b/cdlang/src/test/resources/de/monticore/cdbasis/cocos/Valid.cd @@ -1,4 +1,5 @@ /* (c) https://github.com/MontiCore/monticore */ +import java.util.List; classdiagram Valid {