All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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