InspectionProjectProfileManager.isInformationLevel used where applicable; StreamToLoopInspection highlights only terminal operation when highlighting is on

This commit is contained in:
Tagir Valeev
2016-11-30 16:35:44 +07:00
parent b225d464dd
commit c00f3ff5b0
3 changed files with 24 additions and 28 deletions
@@ -15,13 +15,14 @@
*/
package com.intellij.codeInspection.streamMigration;
import com.intellij.codeHighlighting.HighlightDisplayLevel;
import com.intellij.codeInsight.ExceptionUtil;
import com.intellij.codeInsight.PsiEquivalenceUtil;
import com.intellij.codeInsight.daemon.GroupNames;
import com.intellij.codeInsight.daemon.HighlightDisplayKey;
import com.intellij.codeInsight.daemon.impl.analysis.HighlightControlFlowUtil;
import com.intellij.codeInspection.*;
import com.intellij.codeInspection.BaseJavaBatchLocalInspectionTool;
import com.intellij.codeInspection.LambdaCanBeMethodReferenceInspection;
import com.intellij.codeInspection.LocalQuickFix;
import com.intellij.codeInspection.ProblemsHolder;
import com.intellij.codeInspection.ui.MultipleCheckboxOptionsPanel;
import com.intellij.codeInspection.util.OptionalUtil;
import com.intellij.openapi.diagnostic.Logger;
@@ -75,8 +76,6 @@ public class StreamApiMigrationInspection extends BaseJavaBatchLocalInspectionTo
public boolean REPLACE_TRIVIAL_FOREACH;
public boolean SUGGEST_FOREACH;
private HighlightDisplayKey myKey;
@Nullable
@Override
public JComponent createOptionsPanel() {
@@ -721,17 +720,7 @@ public class StreamApiMigrationInspection extends BaseJavaBatchLocalInspectionTo
@NotNull
private TextRange getRange(PsiLoopStatement statement) {
boolean wholeStatement = false;
if(myIsOnTheFly) {
if (myKey == null) {
myKey = HighlightDisplayKey.find(getShortName());
}
if (myKey != null) {
InspectionProfile profile = InspectionProjectProfileManager.getInstance(statement.getProject()).getCurrentProfile();
HighlightDisplayLevel level = profile.getErrorLevel(myKey, statement);
wholeStatement = HighlightDisplayLevel.DO_NOT_SHOW.equals(level);
}
}
boolean wholeStatement = myIsOnTheFly && InspectionProjectProfileManager.isInformationLevel(getShortName(), statement);
if(statement instanceof PsiForeachStatement) {
PsiJavaToken rParenth = ((PsiForeachStatement)statement).getRParenth();
if (wholeStatement && rParenth != null) {
@@ -15,6 +15,7 @@
*/
package com.intellij.codeInspection.streamToLoop;
import com.intellij.codeInsight.daemon.HighlightDisplayKey;
import com.intellij.codeInspection.BaseJavaBatchLocalInspectionTool;
import com.intellij.codeInspection.LocalQuickFix;
import com.intellij.codeInspection.ProblemDescriptor;
@@ -23,7 +24,9 @@ import com.intellij.codeInspection.util.OptionalUtil;
import com.intellij.lang.java.lexer.JavaLexer;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.TextRange;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.profile.codeInspection.InspectionProjectProfileManager;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.CodeStyleManager;
import com.intellij.psi.codeStyle.JavaCodeStyleManager;
@@ -48,6 +51,8 @@ import static com.intellij.codeInspection.streamToLoop.Operation.FlatMapOperatio
public class StreamToLoopInspection extends BaseJavaBatchLocalInspectionTool {
private static final Logger LOG = Logger.getInstance(StreamToLoopInspection.class);
private HighlightDisplayKey myKey;
// To quickly filter out most of the non-interesting method calls
private static final Set<String> SUPPORTED_TERMINALS = StreamEx.of("count", "sum", "summaryStatistics", "reduce", "collect",
"findFirst", "findAny", "anyMatch", "allMatch", "noneMatch",
@@ -64,7 +69,8 @@ public class StreamToLoopInspection extends BaseJavaBatchLocalInspectionTool {
public void visitMethodCallExpression(PsiMethodCallExpression call) {
super.visitMethodCallExpression(call);
PsiReferenceExpression expression = call.getMethodExpression();
if (!SUPPORTED_TERMINALS.contains(expression.getReferenceName()) || !isSupportedCodeLocation(call)) return;
PsiElement nameElement = expression.getReferenceNameElement();
if (nameElement == null || !SUPPORTED_TERMINALS.contains(nameElement.getText()) || !isSupportedCodeLocation(call)) return;
PsiMethod method = call.resolveMethod();
if(method == null) return;
PsiClass aClass = method.getContainingClass();
@@ -74,7 +80,13 @@ public class StreamToLoopInspection extends BaseJavaBatchLocalInspectionTool {
Operation op = createOperationFromCall(StreamVariable.STUB, currentCall);
if(op == null) return;
if(op instanceof SourceOperation) {
holder.registerProblem(call, "Replace stream API chain with loop", new ReplaceStreamWithLoopFix());
TextRange range;
if(isOnTheFly && InspectionProjectProfileManager.isInformationLevel(getShortName(), call)) {
range = new TextRange(0, call.getTextLength());
} else {
range = nameElement.getTextRange().shiftRight(-call.getTextOffset());
}
holder.registerProblem(call, range, "Replace stream API chain with loop", new ReplaceStreamWithLoopFix());
return;
}
PsiExpression qualifier = currentCall.getMethodExpression().getQualifierExpression();
@@ -15,9 +15,10 @@
*/
package com.siyeh.ig;
import com.intellij.codeHighlighting.HighlightDisplayLevel;
import com.intellij.codeInsight.daemon.HighlightDisplayKey;
import com.intellij.codeInspection.*;
import com.intellij.codeInspection.LocalQuickFix;
import com.intellij.codeInspection.ProblemDescriptor;
import com.intellij.codeInspection.ProblemHighlightType;
import com.intellij.codeInspection.ProblemsHolder;
import com.intellij.openapi.util.TextRange;
import com.intellij.profile.codeInspection.InspectionProjectProfileManager;
import com.intellij.psi.*;
@@ -245,12 +246,6 @@ public abstract class BaseInspectionVisitor extends JavaElementVisitor {
}
protected boolean isVisibleHighlight(@NotNull PsiElement element) {
if (!isOnTheFly()) {
return true;
}
final HighlightDisplayKey key = HighlightDisplayKey.find(inspection.getShortName());
final InspectionProfile profile = InspectionProjectProfileManager.getInstance(element.getProject()).getCurrentProfile();
final HighlightDisplayLevel errorLevel = profile.getErrorLevel(key, element);
return !HighlightDisplayLevel.DO_NOT_SHOW.equals(errorLevel);
return !isOnTheFly() || !InspectionProjectProfileManager.isInformationLevel(inspection.getShortName(), element);
}
}