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 03fa4e8ca..030fd8755 100644 --- a/cdlang/src/main/java/de/monticore/cd4codebasis/cocos/CD4CodeBasisCoCos.java +++ b/cdlang/src/main/java/de/monticore/cd4codebasis/cocos/CD4CodeBasisCoCos.java @@ -5,6 +5,7 @@ import de.monticore.cd4codebasis._cocos.CD4CodeBasisCoCoChecker; import de.monticore.cd4codebasis.cocos.ebnf.CD4CodeEnumConstantParameterMatchConstructorArguments; import de.monticore.cd4codebasis.cocos.ebnf.CDMethodSignatureParameterNamesUnique; +import de.monticore.cdbasis.cocos.ConstructorNameEqualsClassNameCoCo; import de.monticore.types.check.AbstractDerive; public class CD4CodeBasisCoCos extends CoCoParent { @@ -31,6 +32,9 @@ protected void addCheckerForAllCoCos(CD4CodeBasisCoCoChecker checker) { protected void addEbnfCoCos(CD4CodeBasisCoCoChecker checker) { super.addEbnfCoCos(checker); + // CDClass + checker.addCoCo(new ConstructorNameEqualsClassNameCoCo()); + // CDMethodSignature checker.addCoCo(new CDMethodSignatureParameterNamesUnique()); 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 ed1415dc6..91161e150 100644 --- a/cdlang/src/main/java/de/monticore/cdbasis/cocos/CDBasisCoCos.java +++ b/cdlang/src/main/java/de/monticore/cdbasis/cocos/CDBasisCoCos.java @@ -45,6 +45,7 @@ protected void addEbnfCoCos(CDBasisCoCoChecker checker) { checker.addCoCo(new CDClassImplementsOnlyInterfaces()); checker.addCoCo(new CDClassImplementsNotCyclic()); checker.addCoCo(new CDClassNameUpperCase()); + checker.addCoCo(new ConstructorNameEqualsClassNameCoCo()); // CDType checker.addCoCo(new CDTypeNoInitializationOfDerivedAttribute()); diff --git a/cdlang/src/main/java/de/monticore/cdbasis/cocos/ConstructorNameEqualsClassNameCoCo.java b/cdlang/src/main/java/de/monticore/cdbasis/cocos/ConstructorNameEqualsClassNameCoCo.java new file mode 100644 index 000000000..439f0e66c --- /dev/null +++ b/cdlang/src/main/java/de/monticore/cdbasis/cocos/ConstructorNameEqualsClassNameCoCo.java @@ -0,0 +1,31 @@ +/* (c) https://github.com/MontiCore/monticore */ +package de.monticore.cdbasis.cocos; + +import de.monticore.cd4codebasis._ast.ASTCDConstructor; +import de.monticore.cdbasis._ast.ASTCDClass; +import de.monticore.cdbasis._cocos.CDBasisASTCDClassCoCo; +import de.se_rwth.commons.logging.Log; + +/** + * Validates that all constructors of a CD class have the same name as the class. + */ +public class ConstructorNameEqualsClassNameCoCo implements CDBasisASTCDClassCoCo { + + public static final String ERROR_CODE = "0xCDC50"; + public static final String ERROR_MESSAGE = ERROR_CODE + + ": Invalid constructor name '%s' in class '%s'. " + + "Constructors must have the same name as their class."; + + @Override + public void check(ASTCDClass node) { + String className = node.getName(); + + for (ASTCDConstructor constructor : node.getCDConstructorList()) { + if (!constructor.getName().equals(className)) { + Log.error(String.format(ERROR_MESSAGE, constructor.getName(), className), constructor + .get_SourcePositionStart(), constructor.get_SourcePositionEnd()); + } + } + } + +} diff --git a/cdlang/src/test/java/de/monticore/testcd4codebasis/cocos/ConstructorNameEqualsClassNameCoCoTest.java b/cdlang/src/test/java/de/monticore/testcd4codebasis/cocos/ConstructorNameEqualsClassNameCoCoTest.java new file mode 100644 index 000000000..bc3004041 --- /dev/null +++ b/cdlang/src/test/java/de/monticore/testcd4codebasis/cocos/ConstructorNameEqualsClassNameCoCoTest.java @@ -0,0 +1,53 @@ +/* (c) https://github.com/MontiCore/monticore */ +package de.monticore.testcd4codebasis.cocos; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import de.monticore.cdbasis._ast.ASTCDCompilationUnit; +import de.monticore.cdbasis.cocos.ConstructorNameEqualsClassNameCoCo; +import de.monticore.testcd4codebasis.CD4CodeBasisTestBasis; +import de.se_rwth.commons.logging.Log; +import java.io.IOException; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; + +public class ConstructorNameEqualsClassNameCoCoTest extends CD4CodeBasisTestBasis { + + @AfterEach + public void after() { + Log.getFindings().clear(); + } + + @Test + public void testValid() throws IOException { + // Given + coCoChecker.addCoCo(new ConstructorNameEqualsClassNameCoCo()); + + // When + final ASTCDCompilationUnit ast = p.parse(getFilePath( + "cd4codebasis/cocos/ConstructorNameEqualsClassNameValid.cd")).orElseThrow(); + coCoChecker.checkAll(ast); + + // Then + assertTrue(Log.getFindings().isEmpty(), "Valid constructors should not produce errors"); + } + + @Test + public void testInvalid() throws IOException { + // Given + coCoChecker.addCoCo(new ConstructorNameEqualsClassNameCoCo()); + + // When + final ASTCDCompilationUnit ast = p.parse(getFilePath( + "cd4codebasis/cocos/ConstructorNameEqualsClassNameInvalid.cd")).orElseThrow(); + coCoChecker.checkAll(ast); + + // Then + assertEquals(2, Log.getFindings().size(), "Invalid constructors should produce 2 errors"); + assertTrue(Log.getFindings().get(0).getMsg().startsWith("0xCDC50")); + assertTrue(Log.getFindings().get(1).getMsg().startsWith("0xCDC50")); + } + +} diff --git a/cdlang/src/test/resources/de/monticore/cd4codebasis/cocos/ConstructorNameEqualsClassNameInvalid.cd b/cdlang/src/test/resources/de/monticore/cd4codebasis/cocos/ConstructorNameEqualsClassNameInvalid.cd new file mode 100644 index 000000000..cb0ea3919 --- /dev/null +++ b/cdlang/src/test/resources/de/monticore/cd4codebasis/cocos/ConstructorNameEqualsClassNameInvalid.cd @@ -0,0 +1,15 @@ +/* (c) https://github.com/MontiCore/monticore */ + +classdiagram ConstructorNameEqualsClassNameInvalid { + + class Payment { + public pay(); + public Payment(int amount); + } + + class Order { + public Order(); + public create(); + } + +} diff --git a/cdlang/src/test/resources/de/monticore/cd4codebasis/cocos/ConstructorNameEqualsClassNameValid.cd b/cdlang/src/test/resources/de/monticore/cd4codebasis/cocos/ConstructorNameEqualsClassNameValid.cd new file mode 100644 index 000000000..e427337a6 --- /dev/null +++ b/cdlang/src/test/resources/de/monticore/cd4codebasis/cocos/ConstructorNameEqualsClassNameValid.cd @@ -0,0 +1,17 @@ +/* (c) https://github.com/MontiCore/monticore */ + +classdiagram ConstructorNameEqualsClassNameValid { + + class Payment { + public Payment(); + public Payment(int amount); + public void process(); + } + + class Handler { + public void execute(); + } + + class Delivery { } + +}