
org.walkmod.sonar.visitors.AvoidDuplicateLiterals Maven / Gradle / Ivy
package org.walkmod.sonar.visitors;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.walkmod.javalang.ast.SymbolDefinition;
import org.walkmod.javalang.ast.body.ClassOrInterfaceDeclaration;
import org.walkmod.javalang.ast.body.FieldDeclaration;
import org.walkmod.javalang.ast.body.ModifierSet;
import org.walkmod.javalang.ast.body.VariableDeclarator;
import org.walkmod.javalang.ast.body.VariableDeclaratorId;
import org.walkmod.javalang.ast.expr.StringLiteralExpr;
import org.walkmod.javalang.ast.type.ClassOrInterfaceType;
import org.walkmod.javalang.compiler.symbols.RequiresSemanticAnalysis;
import org.walkmod.javalang.visitors.VoidVisitorAdapter;
import org.walkmod.walkers.VisitorContext;
@RequiresSemanticAnalysis
public class AvoidDuplicateLiterals extends VoidVisitorAdapter {
private Map> literals = new HashMap>();
private int counter = 1;
@Override
public void visit(StringLiteralExpr n, VisitorContext ctx) {
List instances = literals.get(n.getValue());
if (instances == null) {
instances = new LinkedList();
literals.put(n.getValue(), instances);
}
literals.put(n.getValue(), instances);
}
@Override
public void visit(ClassOrInterfaceDeclaration n, VisitorContext ctx) {
Map> oldLiterals = literals;
literals = new HashMap>();
counter = 1;
super.visit(n, ctx);
Set keys = literals.keySet();
if (!keys.isEmpty()) {
Map vars = n.getVariableDefinitions();
for (String key : keys) {
List instances = literals.get(key);
String varName = "LITERAL_"+counter;
if (instances.size() > 1 && !vars.containsKey(varName)) {
FieldDeclaration fd = new FieldDeclaration(ModifierSet.PRIVATE, new ClassOrInterfaceType("String"),
new VariableDeclarator(new VariableDeclaratorId(varName)));
n.getMembers().add(fd);
}
counter ++;
}
}
literals = oldLiterals;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy