Commit 7e54da80 authored by Nikita Katkov's avatar Nikita Katkov
Browse files

removed caches from inspection

parent 7720a8c4
Branches unavailable Tags unavailable
No related merge requests found
Showing with 14 additions and 45 deletions
+14 -45
// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.codeInspection.blockingCallsDetection;
import org.jetbrains.annotations.ApiStatus;
/**
* Marks extension points {@link BlockingMethodChecker} or {@link NonBlockingContextChecker} that uses externally stored settings
* and due to that can not be used in {@link com.intellij.psi.util.CachedValuesManager}
* <p>
* Likely for internal usage since third party extensions may not have access to inspection settings etc
*/
@ApiStatus.Experimental
public interface PersistentStateChecker {
}
......@@ -2,12 +2,15 @@
package com.intellij.codeInspection.blockingCallsDetection;
import com.intellij.codeInsight.AnnotationUtil;
import com.intellij.psi.*;
import com.intellij.psi.JavaPsiFacade;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiMethod;
import org.jetbrains.annotations.NotNull;
import java.util.List;
public class AnnotationBasedBlockingMethodChecker implements BlockingMethodChecker, PersistentStateChecker {
public class AnnotationBasedBlockingMethodChecker implements BlockingMethodChecker {
private final List<String> myBlockingAnnotations;
......@@ -25,11 +28,6 @@ public class AnnotationBasedBlockingMethodChecker implements BlockingMethodCheck
@Override
public boolean isMethodBlocking(@NotNull PsiMethod method) {
return hasAnnotation(method, myBlockingAnnotations);
}
static boolean hasAnnotation(PsiModifierListOwner owner, List<String> annotationsFQNames) {
// AnnotationUtil#isAnnotated doesn't use caching inside
return AnnotationUtil.findAnnotation(owner, annotationsFQNames, false) != null;
return AnnotationUtil.findAnnotation(method, myBlockingAnnotations, false) != null;
}
}
// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.codeInspection.blockingCallsDetection;
import com.intellij.codeInsight.AnnotationUtil;
import com.intellij.psi.*;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.uast.UCallExpression;
......@@ -10,9 +11,7 @@ import org.jetbrains.uast.UastUtils;
import java.util.List;
import static com.intellij.codeInspection.blockingCallsDetection.AnnotationBasedBlockingMethodChecker.hasAnnotation;
public class AnnotationBasedNonBlockingContextChecker implements NonBlockingContextChecker, PersistentStateChecker {
public class AnnotationBasedNonBlockingContextChecker implements NonBlockingContextChecker {
private final List<String> myNonBlockingAnnotations;
......@@ -37,6 +36,6 @@ public class AnnotationBasedNonBlockingContextChecker implements NonBlockingCont
if (callingMethod == null) return false;
PsiMethod psiCallingMethod = callingMethod.getJavaPsi();
return hasAnnotation(psiCallingMethod, myNonBlockingAnnotations);
return AnnotationUtil.findAnnotation(psiCallingMethod, myNonBlockingAnnotations, false) != null;
}
}
......@@ -17,9 +17,6 @@ import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiElementVisitor;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiMethod;
import com.intellij.psi.util.CachedValueProvider;
import com.intellij.psi.util.CachedValuesManager;
import com.intellij.psi.util.PsiModificationTracker;
import com.intellij.util.SmartList;
import com.intellij.util.containers.ContainerUtil;
import one.util.streamex.StreamEx;
......@@ -32,8 +29,6 @@ import javax.swing.*;
import java.awt.*;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class BlockingMethodInNonBlockingContextInspection extends AbstractBaseUastLocalInspectionTool {
......@@ -130,14 +125,14 @@ public class BlockingMethodInNonBlockingContextInspection extends AbstractBaseUa
private static class BlockingMethodInNonBlockingContextVisitor extends PsiElementVisitor {
private final ProblemsHolder myHolder;
private final Map<Boolean, ? extends List<? extends BlockingMethodChecker>> myBlockingMethodCheckers;
private final List<? extends BlockingMethodChecker> myBlockingMethodCheckers;
private final List<? extends NonBlockingContextChecker> myNonBlockingContextCheckers;
BlockingMethodInNonBlockingContextVisitor(@NotNull ProblemsHolder holder,
List<? extends BlockingMethodChecker> blockingMethodCheckers,
List<? extends NonBlockingContextChecker> nonBlockingContextCheckers) {
myHolder = holder;
this.myBlockingMethodCheckers = blockingMethodCheckers.stream().collect(Collectors.partitioningBy(checker -> checker instanceof PersistentStateChecker));
this.myBlockingMethodCheckers = blockingMethodCheckers;
this.myNonBlockingContextCheckers = nonBlockingContextCheckers;
}
......@@ -152,10 +147,7 @@ public class BlockingMethodInNonBlockingContextInspection extends AbstractBaseUa
PsiMethod referencedMethod = callExpression.resolve();
if (referencedMethod == null) return;
final boolean isBlockingCachedValue = queryCacheIfMethodIsBlocking(referencedMethod, myBlockingMethodCheckers.get(false));
if (!isBlockingCachedValue && !queryProvidersIfMethodIsBlocking(referencedMethod, myBlockingMethodCheckers.get(true))) {
return;
}
if (!isMethodOrSupersBlocking(referencedMethod, myBlockingMethodCheckers)) return;
PsiElement elementToHighLight = AnalysisUastUtil.getMethodIdentifierSourcePsi(callExpression);
if (elementToHighLight == null) return;
......@@ -164,14 +156,8 @@ public class BlockingMethodInNonBlockingContextInspection extends AbstractBaseUa
}
}
private static boolean queryCacheIfMethodIsBlocking(PsiMethod referencedMethod, List<? extends BlockingMethodChecker> myBlockingMethodCheckers) {
return CachedValuesManager.getCachedValue(referencedMethod, () -> CachedValueProvider.Result.create(
queryProvidersIfMethodIsBlocking(referencedMethod, myBlockingMethodCheckers),
PsiModificationTracker.MODIFICATION_COUNT));
}
private static boolean queryProvidersIfMethodIsBlocking(PsiMethod referencedMethod,
List<? extends BlockingMethodChecker> blockingMethodCheckers) {
private static boolean isMethodOrSupersBlocking(PsiMethod referencedMethod,
List<? extends BlockingMethodChecker> blockingMethodCheckers) {
return StreamEx.of(referencedMethod).append(referencedMethod.findDeepestSuperMethods())
.anyMatch(method -> isMethodBlocking(method, blockingMethodCheckers));
}
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment