package org.eclipse.jdt.internal.ui.fix;
import java.util.ArrayList;
import java.util.Map;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.compiler.IProblem;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.manipulation.CleanUpContextCore;
import org.eclipse.jdt.core.manipulation.ICleanUpFixCore;
import org.eclipse.jdt.internal.ui.text.correction.IProblemLocationCore;
import org.eclipse.jdt.internal.ui.text.correction.ProblemLocationCore;
public abstract class AbstractMultiFixCore extends AbstractCleanUpCore implements IMultiFixCore {
protected AbstractMultiFixCore() {
}
protected AbstractMultiFixCore(Map<String, String> settings) {
super(settings);
}
@Override
public final ICleanUpFixCore createFixCore(CleanUpContextCore context) throws CoreException {
CompilationUnit unit= context.getAST();
if (unit == null)
return null;
if (context instanceof MultiFixContext) {
return createFix(unit, ((MultiFixContext)context).getProblemLocations());
} else {
return createFix(unit);
}
}
protected abstract ICleanUpFixCore createFix(CompilationUnit unit) throws CoreException;
protected abstract ICleanUpFixCore createFix(CompilationUnit unit, IProblemLocationCore[] problems) throws CoreException;
@Override
public int computeNumberOfFixes(CompilationUnit compilationUnit) {
return -1;
}
protected static int getNumberOfProblems(IProblem[] problems, int problemId) {
int result= 0;
for (int i= 0; i < problems.length; i++) {
if (problems[i].getID() == problemId)
result++;
}
return result;
}
protected static IProblemLocationCore[] convertProblems(IProblem[] problems) {
IProblemLocationCore[] result= new IProblemLocationCore[problems.length];
for (int i= 0; i < problems.length; i++) {
result[i]= new ProblemLocationCore(problems[i]);
}
return result;
}
protected static IProblemLocationCore[] filter(IProblemLocationCore[] problems, int[] problemIds) {
ArrayList<IProblemLocationCore> result= new ArrayList<>();
for (int i= 0; i < problems.length; i++) {
IProblemLocationCore problem= problems[i];
if (contains(problemIds, problem.getProblemId()) && !contains(result, problem)) {
result.add(problem);
}
}
return result.toArray(new IProblemLocationCore[result.size()]);
}
private static boolean contains(ArrayList<IProblemLocationCore> problems, IProblemLocationCore problem) {
for (int i= 0; i < problems.size(); i++) {
IProblemLocationCore existing= problems.get(i);
if (existing.getProblemId() == problem.getProblemId() && existing.getOffset() == problem.getOffset() && existing.getLength() == problem.getLength()) {
return true;
}
}
return false;
}
private static boolean contains(int[] ids, int id) {
for (int i= 0; i < ids.length; i++) {
if (ids[i] == id)
return true;
}
return false;
}
}