Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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<CD4CodeBasisCoCoChecker> {
Expand All @@ -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());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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());
Expand Down
Original file line number Diff line number Diff line change
@@ -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'. "
Comment thread
TomBursch marked this conversation as resolved.
+ "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());
}
}
}

}
Original file line number Diff line number Diff line change
@@ -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 {
Comment thread
TomBursch marked this conversation as resolved.
// 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"));
}

}
Original file line number Diff line number Diff line change
@@ -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();
}

}
Original file line number Diff line number Diff line change
@@ -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 { }

}
Loading