From d96863da9327e7016cb31bd627ce828ec807da7b Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Fri, 16 Sep 2016 18:17:17 +0300 Subject: [PATCH] Fix severe freezes because of long lint checks on large files (KT-13071) - Run lint analyze under indicator with write action priority. Otherwise ProgressManager.checkCanceled() checks doesn't work - Move ProgressManager.checkCanceled() up or they are not called in large files without lint warnings #KT-13071 Fixed --- .../klint/AndroidLintExternalAnnotator.java | 12 +++++++++--- .../src/org/jetbrains/uast/check/UastChecker.kt | 9 +++------ 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/plugins/lint/lint-idea/src/org/jetbrains/android/inspections/klint/AndroidLintExternalAnnotator.java b/plugins/lint/lint-idea/src/org/jetbrains/android/inspections/klint/AndroidLintExternalAnnotator.java index be8c57a7110..231e8ac7405 100644 --- a/plugins/lint/lint-idea/src/org/jetbrains/android/inspections/klint/AndroidLintExternalAnnotator.java +++ b/plugins/lint/lint-idea/src/org/jetbrains/android/inspections/klint/AndroidLintExternalAnnotator.java @@ -30,6 +30,7 @@ import com.intellij.openapi.keymap.KeymapManager; import com.intellij.openapi.keymap.KeymapUtil; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleUtilCore; +import com.intellij.openapi.progress.util.ProgressIndicatorUtils; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.*; import com.intellij.openapi.vfs.VirtualFile; @@ -150,11 +151,16 @@ public class AndroidLintExternalAnnotator extends ExternalAnnotator files = Collections.singletonList(mainFile); - LintRequest request = new IntellijLintRequest(client, project, files, - Collections.singletonList(state.getModule()), true /* incremental */); + final LintRequest request = new IntellijLintRequest( + client, project, files, Collections.singletonList(state.getModule()), true /* incremental */); request.setScope(scope); - lint.analyze(request); + ProgressIndicatorUtils.runInReadActionWithWriteActionPriority(new Runnable() { + @Override + public void run() { + lint.analyze(request); + } + }); } finally { Disposer.dispose(client); diff --git a/plugins/lint/uast-android/src/org/jetbrains/uast/check/UastChecker.kt b/plugins/lint/uast-android/src/org/jetbrains/uast/check/UastChecker.kt index 85671fed926..4aeebe67372 100644 --- a/plugins/lint/uast-android/src/org/jetbrains/uast/check/UastChecker.kt +++ b/plugins/lint/uast-android/src/org/jetbrains/uast/check/UastChecker.kt @@ -18,7 +18,6 @@ package org.jetbrains.uast.check import com.android.tools.klint.detector.api.Issue import com.android.tools.klint.detector.api.JavaContext import com.android.tools.klint.detector.api.Location -import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.progress.ProgressManager import com.intellij.openapi.project.DumbService import com.intellij.openapi.project.Project @@ -84,9 +83,9 @@ object UastChecker { val visitor = object : AbstractUastVisitor() { override fun visitCallExpression(node: UCallExpression): Boolean { + ProgressManager.checkCanceled() if (applicableFunctionNames.isNotEmpty()) { if (node.kind == FUNCTION_CALL && node.functionName in applicableFunctionNames) { - ProgressManager.checkCanceled() scanner.visitCall(context, node) } } @@ -95,7 +94,6 @@ object UastChecker { if (node.kind == CONSTRUCTOR_CALL) { node.resolve(context)?.let { constructor -> if (constructor.getContainingClass()?.fqName in applicableConstructorTypes) { - ProgressManager.checkCanceled() scanner.visitConstructor(context, node, constructor) } } @@ -106,9 +104,9 @@ object UastChecker { } override fun visitClass(node: UClass): Boolean { + ProgressManager.checkCanceled() if (applicableSuperClasses.isNotEmpty()) { if (applicableSuperClasses.any { node.isSubclassOf(it) }) { - ProgressManager.checkCanceled() scanner.visitClass(context, node) } } @@ -117,9 +115,8 @@ object UastChecker { } override fun visitQualifiedExpression(node: UQualifiedExpression): Boolean { + ProgressManager.checkCanceled() if (appliesToResourcesRefs && node.receiver is UQualifiedExpression) { - ProgressManager.checkCanceled() - val parentQualifiedExpr = node.receiver as UQualifiedExpression val resourceName = node.selector val resourceType = parentQualifiedExpr.selector