From e1a27929ac961af2256cdae1ce009686edb0de1f Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Fri, 27 Jul 2018 15:44:54 +0200 Subject: [PATCH] Do not throw on using kotlin resolve via light classes in dumb mode Fix an exception when kotlin resolve was invoked when searching for tests while indexing (probably many other cases) Does not actually fix the behaviour, the test will not be found resulting in undesired behaviour Full-blown infrastructure for resolving Kotlin in dumb mode is needed to fix the behaviour #KT-24979 Fixed --- .../IdeLightClassInheritanceHelper.kt | 3 +++ .../caches/resolve/KtFileClassProviderImpl.kt | 6 ++++- .../idea/caches/resolve/util/dumbUtils.kt | 23 +++++++++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/util/dumbUtils.kt diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/lightClasses/IdeLightClassInheritanceHelper.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/lightClasses/IdeLightClassInheritanceHelper.kt index b2d5014cc65..3714177d6f0 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/lightClasses/IdeLightClassInheritanceHelper.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/lightClasses/IdeLightClassInheritanceHelper.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.asJava.ImpreciseResolveResult.* import org.jetbrains.kotlin.asJava.classes.KtLightClass import org.jetbrains.kotlin.asJava.classes.LightClassInheritanceHelper import org.jetbrains.kotlin.asJava.classes.defaultJavaAncestorQualifiedName +import org.jetbrains.kotlin.idea.caches.resolve.util.isInDumbMode import org.jetbrains.kotlin.idea.search.PsiBasedClassResolver import org.jetbrains.kotlin.psi.KtSimpleNameExpression import org.jetbrains.kotlin.psi.KtSuperTypeCallEntry @@ -34,6 +35,8 @@ class IdeLightClassInheritanceHelper : LightClassInheritanceHelper { baseClass: PsiClass, checkDeep: Boolean ): ImpreciseResolveResult { + if (baseClass.project.isInDumbMode()) return NO_MATCH + val classOrObject = lightClass.kotlinOrigin ?: return UNSURE val entries = classOrObject.superTypeListEntries val hasSuperClass = entries.any { it is KtSuperTypeCallEntry } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KtFileClassProviderImpl.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KtFileClassProviderImpl.kt index bc76e3a0926..e2b31af3501 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KtFileClassProviderImpl.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KtFileClassProviderImpl.kt @@ -12,7 +12,7 @@ import org.jetbrains.kotlin.asJava.classes.KtLightClassForFacade import org.jetbrains.kotlin.asJava.toLightClass import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName -import org.jetbrains.kotlin.idea.caches.project.getModuleInfo +import org.jetbrains.kotlin.idea.caches.resolve.util.isInDumbMode import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFileClassProvider @@ -21,6 +21,10 @@ import org.jetbrains.kotlin.psi.analysisContext class KtFileClassProviderImpl(val kotlinAsJavaSupport: KotlinAsJavaSupport) : KtFileClassProvider { override fun getFileClasses(file: KtFile): Array { + if (file.project.isInDumbMode()) { + return PsiClass.EMPTY_ARRAY + } + // TODO We don't currently support finding light classes for scripts if (file.isCompiled || file.isScript()) { return PsiClass.EMPTY_ARRAY diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/util/dumbUtils.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/util/dumbUtils.kt new file mode 100644 index 00000000000..80089c79f61 --- /dev/null +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/util/dumbUtils.kt @@ -0,0 +1,23 @@ +/* + * Copyright 2010-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/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea.caches.resolve.util + +import com.intellij.openapi.diagnostic.Logger +import com.intellij.openapi.project.DumbService +import com.intellij.openapi.project.Project + + +private val LOG = Logger.getInstance("kotlin.resolve.dumb.mode") + +fun Project.isInDumbMode(): Boolean { + val dumbService = DumbService.getInstance(this) + val dumb = dumbService.isDumb + if (dumb && dumbService.isAlternativeResolveEnabled) { + LOG.warn("Kotlin does not support alternative resolve", Throwable("")) + } + return dumb +} +