/*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2015 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
-import java.util.ConcurrentModificationException;
import java.util.List;
/**
private final InspectionManager myManager;
private final PsiFile myFile;
private final boolean myOnTheFly;
- private MyList<ProblemDescriptor> myProblems = new MyList<ProblemDescriptor>();
+ private final List<ProblemDescriptor> myProblems = new ArrayList<ProblemDescriptor>();
public ProblemsHolder(@NotNull InspectionManager manager, @NotNull PsiFile file, boolean onTheFly) {
myManager = manager;
ProblemHighlightType highlightType,
String descriptionTemplate,
LocalQuickFix... fixes) {
- registerProblem(myManager.createProblemDescriptor(reference.getElement(), reference.getRangeInElement(), descriptionTemplate, highlightType,
- myOnTheFly, fixes));
+ ProblemDescriptor descriptor = myManager.createProblemDescriptor(reference.getElement(), reference.getRangeInElement(), descriptionTemplate, highlightType,
+ myOnTheFly, fixes);
+ registerProblem(descriptor);
}
public void registerProblem(@NotNull PsiReference reference) {
@NotNull
public List<ProblemDescriptor> getResults() {
- MyList<ProblemDescriptor> problems = myProblems;
- problems.allowModifications(false);
- myProblems = new MyList<ProblemDescriptor>();
- return problems;
+ return myProblems;
}
@NotNull
public final Project getProject() {
return myManager.getProject();
}
-
- private static class MyList<T> extends ArrayList<T> {
- private volatile boolean readOnly;
- @Override
- public boolean add(T o) {
- if (readOnly) throw new ConcurrentModificationException();
- return super.add(o);
- }
-
- private void allowModifications(boolean v) {
- readOnly = !v;
- }
- }
}
PsiElementVisitor visitor = InspectionEngine.createVisitorAndAcceptElements(tool, holder, isOnTheFly, session, elements, languages);
synchronized (init) {
- init.add(new InspectionContext(toolWrapper, holder, visitor, languages));
+ init.add(new InspectionContext(toolWrapper, holder, holder.getResultCount(), visitor, languages));
}
advanceProgress(1);
context.tool.getTool().inspectionFinished(session, context.holder);
if (context.holder.hasResults()) {
- appendDescriptors(myFile, context.holder.getResults(), context.tool);
+ List<ProblemDescriptor> allProblems = context.holder.getResults();
+ List<ProblemDescriptor> restProblems = allProblems.subList(context.problemsSize, allProblems.size());
+ appendDescriptors(myFile, restProblems, context.tool);
}
return true;
}
private static class InspectionContext {
private InspectionContext(@NotNull LocalInspectionToolWrapper tool,
@NotNull ProblemsHolder holder,
+ int problemsSize, // need this to diff between found problems in visible part and the rest
@NotNull PsiElementVisitor visitor,
@Nullable Collection<String> languageIds) {
this.tool = tool;
this.holder = holder;
+ this.problemsSize = problemsSize;
this.visitor = visitor;
this.languageIds = languageIds;
}
@NotNull private final LocalInspectionToolWrapper tool;
@NotNull private final ProblemsHolder holder;
+ private final int problemsSize;
@NotNull private final PsiElementVisitor visitor;
@Nullable private final Collection<String> languageIds;
}