From 15e2afe5ab23664aac65b26414cfc1e5067c9584 Mon Sep 17 00:00:00 2001 From: Vladimir Dolzhenko Date: Mon, 24 Feb 2020 18:06:08 +0100 Subject: [PATCH] Add checkCanceled on common for autocompletion and highlighting resolve path --- .../org/jetbrains/kotlin/resolve/BodyResolver.java | 11 +++++++++++ .../jetbrains/kotlin/resolve/ModifiersChecker.java | 2 ++ .../kotlin/resolve/lazy/ForceResolveUtil.java | 3 +++ .../types/expressions/ExpressionTypingServices.java | 2 ++ .../ExpressionTypingVisitorDispatcher.java | 2 ++ .../kotlin/asJava/classes/ultraLightMembersCreator.kt | 2 ++ .../kotlin/idea/inspections/UnusedSymbolInspection.kt | 3 +++ 7 files changed, 25 insertions(+) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java index 294e7ee72f1..1e71ff9f355 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.resolve; import com.google.common.collect.Maps; +import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; import com.intellij.util.containers.Queue; @@ -196,6 +197,8 @@ public class BodyResolver { Set visitedInCurrentChain = new HashSet<>(); ConstructorDescriptor currentConstructorDescriptor = constructorDescriptor; while (true) { + ProgressManager.checkCanceled(); + visitedInCurrentChain.add(currentConstructorDescriptor); ConstructorDescriptor delegatedConstructorDescriptor = getDelegatedConstructor(currentConstructorDescriptor); if (delegatedConstructorDescriptor == null) break; @@ -267,6 +270,8 @@ public class BodyResolver { @NotNull LexicalScope scopeForConstructorResolution, @NotNull LexicalScope scopeForMemberResolution ) { + ProgressManager.checkCanceled(); + LexicalScope scopeForConstructor = primaryConstructor == null ? null @@ -399,6 +404,8 @@ public class BodyResolver { } for (KtSuperTypeListEntry delegationSpecifier : ktClass.getSuperTypeListEntries()) { + ProgressManager.checkCanceled(); + delegationSpecifier.accept(visitor); } @@ -657,6 +664,8 @@ public class BodyResolver { @NotNull KtAnonymousInitializer anonymousInitializer, @NotNull ClassDescriptorWithResolutionScopes classDescriptor ) { + ProgressManager.checkCanceled(); + LexicalScope scopeForInitializers = classDescriptor.getScopeForInitializerResolution(); KtExpression body = anonymousInitializer.getBody(); if (body != null) { @@ -935,6 +944,8 @@ public class BodyResolver { // Creates wrapper scope for header resolution if necessary (see resolveSecondaryConstructorBody) @Nullable Function1 headerScopeFactory ) { + ProgressManager.checkCanceled(); + PreliminaryDeclarationVisitor.Companion.createForDeclaration(function, trace, languageVersionSettings); LexicalScope innerScope = FunctionDescriptorUtil.getFunctionInnerScope(scope, functionDescriptor, trace, overloadChecker); List valueParameters = function.getValueParameters(); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.java index a41070940fd..aeef55c395e 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ModifiersChecker.java @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.resolve; +import com.intellij.openapi.progress.ProgressManager; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -270,6 +271,7 @@ public class ModifiersChecker { missingSupertypesResolver ); for (DeclarationChecker checker : declarationCheckers) { + ProgressManager.checkCanceled(); checker.check(declaration, descriptor, context); } OperatorModifierChecker.INSTANCE.check(declaration, descriptor, trace, languageVersionSettings); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/ForceResolveUtil.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/ForceResolveUtil.java index 190e479b8f9..f91d8cebe6c 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/ForceResolveUtil.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/ForceResolveUtil.java @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.resolve.lazy; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.progress.ProgressManager; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.descriptors.*; @@ -70,6 +71,8 @@ public class ForceResolveUtil { } private static void doForceResolveAllContents(Object object) { + ProgressManager.checkCanceled(); + if (object instanceof LazyEntity) { LazyEntity lazyEntity = (LazyEntity) object; lazyEntity.forceResolveAllContents(); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingServices.java b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingServices.java index 9da0262a750..e47863a21e8 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingServices.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingServices.java @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.types.expressions; +import com.intellij.openapi.progress.ProgressManager; import com.intellij.psi.tree.IElementType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -303,6 +304,7 @@ public class ExpressionTypingServices { boolean isFirstStatement = true; for (Iterator iterator = block.iterator(); iterator.hasNext(); ) { + ProgressManager.checkCanceled(); // Use filtering trace to keep effect system cache only for one statement AbstractFilteringTrace traceForSingleStatement = new EffectsFilteringTrace(context.trace); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingVisitorDispatcher.java b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingVisitorDispatcher.java index 5eb8ae7ffb1..738d33e8853 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingVisitorDispatcher.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingVisitorDispatcher.java @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.types.expressions; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProcessCanceledException; +import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.IndexNotReadyException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -159,6 +160,7 @@ public abstract class ExpressionTypingVisitorDispatcher extends KtVisitor visitor) { + ProgressManager.checkCanceled(); return typeInfoPerfCounter.time(() -> { try { KotlinTypeInfo recordedTypeInfo = BindingContextUtils.getRecordedTypeInfo(expression, context.trace.getBindingContext()); diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightMembersCreator.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightMembersCreator.kt index b97f08458d4..3d51ce71e2c 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightMembersCreator.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightMembersCreator.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.asJava.classes +import com.intellij.openapi.progress.ProgressManager import com.intellij.psi.* import com.intellij.psi.impl.light.LightMethodBuilder import com.intellij.psi.impl.light.LightModifierList @@ -174,6 +175,7 @@ internal class UltraLightMembersCreator( numberOfDefaultParametersToAdd: Int = -1, methodIndex: Int ): KtLightMethod { + ProgressManager.checkCanceled() val isConstructor = ktFunction is KtConstructor<*> val name = if (isConstructor) containingClass.name diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedSymbolInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedSymbolInspection.kt index 80d90246673..c634785dbfb 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedSymbolInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedSymbolInspection.kt @@ -17,6 +17,7 @@ import com.intellij.codeInspection.ex.EntryPointsManagerBase import com.intellij.codeInspection.ex.EntryPointsManagerImpl import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.application.ModalityState +import com.intellij.openapi.progress.ProgressManager import com.intellij.openapi.project.Project import com.intellij.openapi.util.text.StringUtil import com.intellij.psi.PsiClass @@ -201,6 +202,7 @@ class UnusedSymbolInspection : AbstractKotlinInspection() { override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): PsiElementVisitor { return namedDeclarationVisitor(fun(declaration) { + ProgressManager.checkCanceled() val message = declaration.describe()?.let { "$it is never used" } ?: return if (!ProjectRootsUtil.isInProjectSource(declaration)) return @@ -321,6 +323,7 @@ class UnusedSymbolInspection : AbstractKotlinInspection() { private val KtNamedDeclaration.isObjectOrEnum: Boolean get() = this is KtObjectDeclaration || this is KtClass && isEnum() private fun checkReference(ref: PsiReference, declaration: KtNamedDeclaration, descriptor: DeclarationDescriptor?): Boolean { + ProgressManager.checkCanceled() if (declaration.isAncestor(ref.element)) return true // usages inside element's declaration are not counted if (ref.element.parent is KtValueArgumentName) return true // usage of parameter in form of named argument is not counted