blob: dcf38dbc537670c32d17abff0de1c5d17982825a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2019 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
* Red Hat Inc. - modified to use UnusedCodeFixCore
*******************************************************************************/
package org.eclipse.jdt.internal.corext.fix;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import org.eclipse.jdt.core.compiler.IProblem;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.CastExpression;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.IBinding;
import org.eclipse.jdt.core.dom.ImportDeclaration;
import org.eclipse.jdt.core.dom.SimpleName;
import org.eclipse.jdt.core.manipulation.ICleanUpFixCore;
import org.eclipse.jdt.internal.corext.dom.ASTNodes;
import org.eclipse.jdt.internal.corext.fix.UnusedCodeFixCore.RemoveCastOperation;
import org.eclipse.jdt.internal.corext.fix.UnusedCodeFixCore.RemoveUnusedMemberOperation;
import org.eclipse.jdt.ui.cleanup.CleanUpOptions;
import org.eclipse.jdt.ui.cleanup.ICleanUpFix;
import org.eclipse.jdt.ui.text.java.IProblemLocation;
import org.eclipse.jdt.internal.ui.fix.CleanUpFixWrapper;
import org.eclipse.jdt.internal.ui.fix.UnusedCodeCleanUp;
import org.eclipse.jdt.internal.ui.text.correction.IProblemLocationCore;
import org.eclipse.jdt.internal.ui.text.correction.ProblemLocation;
/**
* Fix which removes unused code.
*/
public class UnusedCodeFix extends CompilationUnitRewriteOperationsFix {
public static UnusedCodeFix createRemoveUnusedImportFix(CompilationUnit compilationUnit, IProblemLocation problem) {
if (isUnusedImport(problem)) {
IProblemLocationCore problemCore= (ProblemLocation)problem;
ImportDeclaration node= UnusedCodeFixCore.getImportDeclaration(problemCore, compilationUnit);
if (node != null) {
String label= FixMessages.UnusedCodeFix_RemoveImport_description;
UnusedCodeFixCore.RemoveImportOperation operation= new UnusedCodeFixCore.RemoveImportOperation(node);
Map<String, String> options= new Hashtable<>();
options.put(CleanUpConstants.REMOVE_UNUSED_CODE_IMPORTS, CleanUpOptions.TRUE);
return new UnusedCodeFix(label, compilationUnit, new CompilationUnitRewriteOperationsFixCore.CompilationUnitRewriteOperation[] {operation}, options);
}
}
return null;
}
public static boolean isUnusedImport(IProblemLocation problem) {
IProblemLocationCore problemCore= (ProblemLocation)problem;
return UnusedCodeFixCore.isUnusedImport(problemCore);
}
public static UnusedCodeFix createUnusedMemberFix(CompilationUnit compilationUnit, IProblemLocation problem, boolean removeAllAssignements) {
if (isUnusedMember(problem)) {
IProblemLocationCore problemCore= (ProblemLocation)problem;
SimpleName name= UnusedCodeFixCore.getUnusedName(compilationUnit, problemCore);
if (name != null) {
IBinding binding= name.resolveBinding();
if (binding != null) {
if (UnusedCodeFixCore.isFormalParameterInEnhancedForStatement(name))
return null;
String label= UnusedCodeFixCore.getDisplayString(name, binding, removeAllAssignements);
UnusedCodeFixCore.RemoveUnusedMemberOperation operation= new RemoveUnusedMemberOperation(new SimpleName[] { name }, removeAllAssignements);
return new UnusedCodeFix(label, compilationUnit,
new CompilationUnitRewriteOperationsFixCore.CompilationUnitRewriteOperation[] { operation }, UnusedCodeFixCore.getCleanUpOptions(binding, removeAllAssignements));
}
}
}
return null;
}
public static UnusedCodeFix createUnusedTypeParameterFix(CompilationUnit compilationUnit, IProblemLocation problemLoc) {
if (problemLoc.getProblemId() == IProblem.UnusedTypeParameter) {
IProblemLocationCore problemLocCore= (ProblemLocation)problemLoc;
SimpleName name= UnusedCodeFixCore.getUnusedName(compilationUnit, problemLocCore);
if (name != null) {
IBinding binding= name.resolveBinding();
if (binding != null) {
String label= FixMessages.UnusedCodeFix_RemoveUnusedTypeParameter_description;
UnusedCodeFixCore.RemoveUnusedTypeParameterOperation operation= new UnusedCodeFixCore.RemoveUnusedTypeParameterOperation(name);
return new UnusedCodeFix(label, compilationUnit,
new CompilationUnitRewriteOperationsFixCore.CompilationUnitRewriteOperation[] { operation }, UnusedCodeFixCore.getCleanUpOptions(binding, false));
}
}
}
return null;
}
public static boolean isUnusedMember(IProblemLocation problem) {
IProblemLocationCore problemCore= (ProblemLocation)problem;
return UnusedCodeFixCore.isUnusedMember(problemCore);
}
public static UnusedCodeFix createRemoveUnusedCastFix(CompilationUnit compilationUnit, IProblemLocation problem) {
if (problem.getProblemId() != IProblem.UnnecessaryCast)
return null;
ASTNode selectedNode= ASTNodes.getUnparenthesedExpression(problem.getCoveringNode(compilationUnit));
if (!(selectedNode instanceof CastExpression))
return null;
return new UnusedCodeFix(FixMessages.UnusedCodeFix_RemoveCast_description, compilationUnit,
new CompilationUnitRewriteOperationsFixCore.CompilationUnitRewriteOperation[] {new RemoveCastOperation((CastExpression)selectedNode)});
}
public static ICleanUpFix createCleanUp(CompilationUnit compilationUnit,
boolean removeUnusedPrivateMethods,
boolean removeUnusedPrivateConstructors,
boolean removeUnusedPrivateFields,
boolean removeUnusedPrivateTypes,
boolean removeUnusedLocalVariables,
boolean removeUnusedImports,
boolean removeUnusedCast) {
ICleanUpFixCore fix= UnusedCodeFixCore.createCleanUp(compilationUnit, removeUnusedPrivateMethods, removeUnusedPrivateConstructors,
removeUnusedPrivateFields, removeUnusedPrivateTypes, removeUnusedLocalVariables, removeUnusedImports, removeUnusedCast);
return fix == null ? null : new CleanUpFixWrapper(fix);
}
public static ICleanUpFix createCleanUp(CompilationUnit compilationUnit, IProblemLocation[] problems,
boolean removeUnusedPrivateMethods,
boolean removeUnusedPrivateConstructors,
boolean removeUnusedPrivateFields,
boolean removeUnusedPrivateTypes,
boolean removeUnusedLocalVariables,
boolean removeUnusedImports,
boolean removeUnusedCast) {
IProblemLocationCore[] problemsCore= null;
if (problems != null) {
List<IProblemLocationCore> problemList= new ArrayList<>();
for (IProblemLocation problem : problems) {
problemList.add((ProblemLocation)problem);
}
problemsCore= problemList.toArray(new IProblemLocationCore[0]);
}
ICleanUpFixCore fix= UnusedCodeFixCore.createCleanUp(compilationUnit, problemsCore, removeUnusedPrivateMethods,
removeUnusedPrivateConstructors, removeUnusedPrivateFields, removeUnusedPrivateTypes, removeUnusedLocalVariables, removeUnusedImports, removeUnusedCast);
return fix == null ? null : new CleanUpFixWrapper(fix);
}
private final Map<String, String> fCleanUpOptions;
private UnusedCodeFix(String name, CompilationUnit compilationUnit, CompilationUnitRewriteOperationsFixCore.CompilationUnitRewriteOperation[] fixRewriteOperations) {
this(name, compilationUnit, fixRewriteOperations, null);
}
private UnusedCodeFix(String name, CompilationUnit compilationUnit, CompilationUnitRewriteOperationsFixCore.CompilationUnitRewriteOperation[] fixRewriteOperations, Map<String, String> options) {
super(name, compilationUnit, fixRewriteOperations);
fCleanUpOptions= options;
}
public UnusedCodeCleanUp getCleanUp() {
if (fCleanUpOptions == null)
return null;
return new UnusedCodeCleanUp(fCleanUpOptions);
}
}