Skip to content
Open
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
@@ -1,23 +1,39 @@
/* (c) https://github.com/MontiCore/monticore */
package de.monticore.javalight.cocos;

import de.monticore.javalight.JavaLightMill;
import de.monticore.javalight._ast.ASTConstructorDeclaration;
import de.monticore.javalight._cocos.JavaLightASTConstructorDeclarationCoCo;
import de.monticore.javalight._symboltable.JavaMethodSymbol;
import de.monticore.statements.mccommonstatements._ast.ASTConstantsMCCommonStatements;
import de.monticore.statements.mccommonstatements._ast.ASTJavaModifier;
import de.monticore.statements.mcstatementsbasis._ast.ASTMCModifier;
import de.se_rwth.commons.logging.Log;

public class ConstructorModifiersValid implements JavaLightASTConstructorDeclarationCoCo {

public static final String ERROR_CODE = "0xA0820";

public static final String ERROR_MSG_FORMAT = " Constructor '%s' cannot be declared 'abstract', 'final', 'static' or 'native'.";


public static final String ERROR_MSG_FORMAT =
" Constructor '%s' modifier can only be one of 'public', 'protected', 'private'.";

protected boolean isValidModifier(ASTJavaModifier modifier) {
return modifier.getModifier() == ASTConstantsMCCommonStatements.PUBLIC
|| modifier.getModifier() == ASTConstantsMCCommonStatements.PROTECTED
|| modifier.getModifier() == ASTConstantsMCCommonStatements.PRIVATE;
}

// JLS17 8.8.3-3
@Override
public void check(ASTConstructorDeclaration node) {
JavaMethodSymbol symbol = node.getSymbol();
if (symbol.isIsAbstract() || symbol.isIsFinal() || symbol.isIsStatic() || symbol.isIsNative()) {
Log.error(String.format(ERROR_CODE + ERROR_MSG_FORMAT ,node.getName()),
node.get_SourcePositionStart());
for (ASTMCModifier modifier : node.getMCModifierList()) {
if (JavaLightMill.typeDispatcher().isMCCommonStatementsASTJavaModifier(modifier)) {
ASTJavaModifier javaModifier =
JavaLightMill.typeDispatcher().asMCCommonStatementsASTJavaModifier(modifier);
if (!isValidModifier(javaModifier)) {
Log.error(String.format(ERROR_CODE + ERROR_MSG_FORMAT, node.getName()),
node.get_SourcePositionStart());
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,40 +4,46 @@
import de.monticore.javalight.JavaLightMill;
import de.monticore.javalight._ast.ASTConstructorDeclaration;
import de.monticore.javalight._cocos.JavaLightASTConstructorDeclarationCoCo;
import de.monticore.javalight._symboltable.JavaMethodSymbol;
import de.monticore.statements.mccommonstatements._ast.ASTConstantsMCCommonStatements;
import de.monticore.statements.mccommonstatements._ast.ASTJavaModifier;
import de.monticore.statements.mcstatementsbasis._ast.ASTMCModifier;
import de.se_rwth.commons.logging.Log;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

public class ConstructorNoAccessModifierPair implements JavaLightASTConstructorDeclarationCoCo {

public static final String ERROR_CODE = "0xA0809";

public static final String ERROR_MSG_FORMAT = " Invalid modifiers are mentioned in constructor's '%s' declaration at %s.";

// JLS3 8.8.3-2

public static final String ERROR_MSG_FORMAT =
" Conflicting access modifiers are mentioned in constructor's '%s' declaration at %s.";

protected boolean isAccessModifier(ASTJavaModifier modifier) {
return modifier.getModifier() == ASTConstantsMCCommonStatements.PUBLIC
|| modifier.getModifier() == ASTConstantsMCCommonStatements.PROTECTED
|| modifier.getModifier() == ASTConstantsMCCommonStatements.PRIVATE;
}

// JLS17 8.8.3-2
@Override
public void check(ASTConstructorDeclaration node) {
boolean hasAccessModifier = false;
List<ASTMCModifier> modifiers = node.getMCModifierList();

int mod = 0;


for (ASTMCModifier modifier : modifiers) {
ASTJavaModifier javaModifier = JavaLightMill.typeDispatcher().asMCCommonStatementsASTJavaModifier(modifier);

if (javaModifier.getModifier() >= ASTConstantsMCCommonStatements.PRIVATE
&& javaModifier.getModifier() <= ASTConstantsMCCommonStatements.PUBLIC) {
if(mod != 0 && mod != javaModifier.getModifier()) {
Log.error(String.format(ERROR_CODE+ERROR_MSG_FORMAT, node.getName(),node.get_SourcePositionStart()));
if (JavaLightMill.typeDispatcher().isMCCommonStatementsASTJavaModifier(modifier)) {
ASTJavaModifier javaModifier =
JavaLightMill.typeDispatcher().asMCCommonStatementsASTJavaModifier(modifier);
if (isAccessModifier(javaModifier)) {
if (hasAccessModifier) {
Log.error(String.format(ERROR_CODE + ERROR_MSG_FORMAT, node.getName(),
node.get_SourcePositionStart()));
break;
}
else {
hasAccessModifier = true;
}
}
mod = javaModifier.getModifier();
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,54 +1,36 @@
/* (c) https://github.com/MontiCore/monticore */
package de.monticore.javalight.cocos;

import de.monticore.javalight.JavaLightMill;
import de.monticore.javalight._ast.ASTConstructorDeclaration;
import de.monticore.javalight._cocos.JavaLightASTConstructorDeclarationCoCo;
import de.monticore.javalight._prettyprint.JavaLightFullPrettyPrinter;
import de.monticore.prettyprint.IndentPrinter;
import de.monticore.statements.mcstatementsbasis._ast.ASTMCModifier;
import de.se_rwth.commons.logging.Log;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class ConstructorNoDuplicateModifier implements JavaLightASTConstructorDeclarationCoCo {

public static final String ERROR_CODE = "0xA0808";

public static final String ERROR_MSG_FORMAT = " modifier '%s' is mentioned more than once in the constructor '%s'. ";

protected String prettyprint(ASTMCModifier a) {
JavaLightFullPrettyPrinter printer = new JavaLightFullPrettyPrinter(new IndentPrinter());
a.accept(printer.getTraverser());
return printer.getPrinter().getContent().trim();
}

public Set<String> findDuplicates(List<String> listContainingDuplicates) {
final Set<String> setToReturn = new HashSet<>();
final Set<String> set1 = new HashSet<>();

for (String yourString : listContainingDuplicates) {
if (!set1.add(yourString)) {
setToReturn.add(yourString);
}
}
return setToReturn;
}

// JLS3 8.8.3-1

public static final String ERROR_MSG_FORMAT =
" Modifier '%s' is mentioned more than once in the constructor '%s'. ";

// JLS17 8.8.3-1
@Override
public void check(ASTConstructorDeclaration node) {
//print the modifier -> add to list
List<String> listModifier = new ArrayList<>();
for (ASTMCModifier modifier : node.getMCModifierList()) {
listModifier.add(prettyprint(modifier));
}
Set<String> duplicates = findDuplicates(listModifier);
for (String duplicate : duplicates) {
Log.error(String.format(ERROR_CODE + ERROR_MSG_FORMAT, duplicate, node.getName()),
node.get_SourcePositionStart());
List<ASTMCModifier> modifiers = node.getMCModifierList();
for (int i = 0; i < modifiers.size(); i++) {
ASTMCModifier modifier = modifiers.get(i);
for (int j = i + 1; j < modifiers.size(); j++) {
ASTMCModifier modifier2 = modifiers.get(j);
if (modifier2.deepEquals(modifier)) {
String modifierName = JavaLightMill.prettyPrint(modifier2, false);
Log.error(String.format(ERROR_CODE + ERROR_MSG_FORMAT, modifierName, node.getName()),
node.get_SourcePositionStart());
break;
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,30 +2,49 @@

package de.monticore.javalight.cocos;


import de.monticore.javalight.JavaLightMill;
import de.monticore.javalight._ast.ASTMethodDeclaration;
import de.monticore.javalight._cocos.JavaLightASTMethodDeclarationCoCo;
import de.monticore.javalight._symboltable.JavaMethodSymbol;
import de.monticore.statements.mccommonstatements._ast.ASTConstantsMCCommonStatements;
import de.monticore.statements.mccommonstatements._ast.ASTJavaModifier;
import de.monticore.statements.mcstatementsbasis._ast.ASTMCModifier;
import de.se_rwth.commons.logging.Log;

public class MethodAbstractAndOtherModifiers implements JavaLightASTMethodDeclarationCoCo {

public static final String ERROR_CODE = "0xA0802";

public static final String ERROR_MSG_FORMAT = " The abstract method %s must be public. ";


protected boolean isValidModifier(ASTJavaModifier modifier) {
return modifier.getModifier() == ASTConstantsMCCommonStatements.PUBLIC
|| modifier.getModifier() == ASTConstantsMCCommonStatements.PROTECTED;
}

protected boolean isAbstractModifier(ASTJavaModifier modifier) {
return modifier.getModifier() == ASTConstantsMCCommonStatements.ABSTRACT;
}

//JLS3 8.4.3-3
@Override
public void check(ASTMethodDeclaration node) {
JavaMethodSymbol methodSymbol = node.getSymbol();
if (methodSymbol.isIsAbstract()) {
if (methodSymbol.isIsPrivate() || methodSymbol.isIsStatic() || methodSymbol.isIsFinal() ||
methodSymbol.isIsNative() || methodSymbol.isIsStrictfp() || methodSymbol.isIsSynchronized()) {
Log.error(String.format(ERROR_CODE + ERROR_MSG_FORMAT, node.getName()),
node.get_SourcePositionStart());
boolean isAbstractMethod = false;
for (ASTMCModifier modifier : node.getMCModifierList()) {
if (JavaLightMill.typeDispatcher().isMCCommonStatementsASTJavaModifier(modifier)) {
ASTJavaModifier javaModifier =
JavaLightMill.typeDispatcher().asMCCommonStatementsASTJavaModifier(modifier);
if (!isAbstractMethod && isAbstractModifier(javaModifier)) {
isAbstractMethod = true;
}
else {
if (!isValidModifier(javaModifier)) {
Log.error(String.format(ERROR_CODE + ERROR_MSG_FORMAT, node.getName()),
node.get_SourcePositionStart());
break;
}
}
}
}
}

}

Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
/* (c) https://github.com/MontiCore/monticore */
package de.monticore.javalight.cocos;

import de.monticore.javalight.JavaLightMill;
import de.monticore.javalight._ast.ASTMethodDeclaration;
import de.monticore.javalight._cocos.JavaLightASTMethodDeclarationCoCo;
import de.monticore.statements.mccommonstatements._ast.ASTConstantsMCCommonStatements;
import de.monticore.statements.mccommonstatements._ast.ASTJavaModifier;
import de.monticore.statements.mcstatementsbasis._ast.ASTMCModifier;
import de.se_rwth.commons.logging.Log;

public class MethodModifiersValid implements JavaLightASTMethodDeclarationCoCo {

public static final String ERROR_CODE = "0xA0822";

public static final String ERROR_MSG_FORMAT =
" Method '%s' has modifier %s that must not be used.";

protected boolean isValidModifier(ASTJavaModifier modifier) {
return modifier.getModifier() == ASTConstantsMCCommonStatements.PUBLIC
|| modifier.getModifier() == ASTConstantsMCCommonStatements.PROTECTED
|| modifier.getModifier() == ASTConstantsMCCommonStatements.PRIVATE
|| modifier.getModifier() == ASTConstantsMCCommonStatements.ABSTRACT
|| modifier.getModifier() == ASTConstantsMCCommonStatements.STATIC
|| modifier.getModifier() == ASTConstantsMCCommonStatements.FINAL
|| modifier.getModifier() == ASTConstantsMCCommonStatements.SYNCHRONIZED
|| modifier.getModifier() == ASTConstantsMCCommonStatements.NATIVE
|| modifier.getModifier() == ASTConstantsMCCommonStatements.STRICTFP
|| modifier.getModifier() == ASTConstantsMCCommonStatements.MODIFIER_DEFAULT;
}

// JLS17 8.4.3 (MethodModifier) / 9.4 (InterfaceMethodModifier)
@Override
public void check(ASTMethodDeclaration node) {
for (ASTMCModifier modifier : node.getMCModifierList()) {
if (JavaLightMill.typeDispatcher().isMCCommonStatementsASTJavaModifier(modifier)) {
ASTJavaModifier javaModifier =
JavaLightMill.typeDispatcher().asMCCommonStatementsASTJavaModifier(modifier);
if (!isValidModifier(javaModifier)) {
String modifierName = JavaLightMill.prettyPrint(modifier, false);
Log.error(String.format(ERROR_CODE + ERROR_MSG_FORMAT, node.getName(), modifierName),
node.get_SourcePositionStart());
}
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,55 +1,35 @@
/* (c) https://github.com/MontiCore/monticore */
package de.monticore.javalight.cocos;

import de.monticore.javalight.JavaLightMill;
import de.monticore.javalight._ast.ASTMethodDeclaration;
import de.monticore.javalight._cocos.JavaLightASTMethodDeclarationCoCo;
import de.monticore.prettyprint.IndentPrinter;
import de.monticore.javalight._prettyprint.JavaLightFullPrettyPrinter;
import de.monticore.statements.mcstatementsbasis._ast.ASTMCModifier;
import de.se_rwth.commons.logging.Log;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class MethodNoDuplicateModifier implements JavaLightASTMethodDeclarationCoCo {

public static final String ERROR_CODE = "0xA0818";

public static final String ERROR_MSG_FORMAT = "modifier '%s' is declared more than once in method %s";

protected String prettyprint(ASTMCModifier a) {
JavaLightFullPrettyPrinter printer = new JavaLightFullPrettyPrinter(new IndentPrinter());
a.accept(printer.getTraverser());
return printer.getPrinter().getContent();
}

public Set<String> findDuplicates(List<String> listContainingDuplicates) {
final Set<String> setToReturn = new HashSet<>();
final Set<String> set1 = new HashSet<>();

for (String modifierName : listContainingDuplicates) {
if (!set1.add(modifierName)) {
setToReturn.add(modifierName);
}
}
return setToReturn;
}


public static final String ERROR_MSG_FORMAT =
" Modifier '%s' is declared more than once in method %s";

//JLS3 8.4.3-1
@Override
public void check(ASTMethodDeclaration node) {
//print the modifier -> add to list
List<String> listModifier = new ArrayList<>();
for (ASTMCModifier modifier : node.getMCModifierList()) {
listModifier.add(prettyprint(modifier));
}
Set<String> duplicates = findDuplicates(listModifier);
for (String duplicate : duplicates) {
Log.error(String.format(ERROR_CODE + ERROR_MSG_FORMAT, duplicate, node.getName()),
node.get_SourcePositionStart());
List<ASTMCModifier> modifiers = node.getMCModifierList();
for (int i = 0; i < modifiers.size(); i++) {
ASTMCModifier modifier = modifiers.get(i);
for (int j = i + 1; j < modifiers.size(); j++) {
ASTMCModifier modifier2 = modifiers.get(j);
if (modifier2.deepEquals(modifier)) {
String modifierName = JavaLightMill.prettyPrint(modifier2, false);
Log.error(String.format(ERROR_CODE + ERROR_MSG_FORMAT, modifierName, node.getName()),
node.get_SourcePositionStart());
}
}
}
}

}
Loading
Loading