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
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 b2d5014..3714177 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.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 @@
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 bc76e3a..e2b31af 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.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 @@
class KtFileClassProviderImpl(val kotlinAsJavaSupport: KotlinAsJavaSupport) :
KtFileClassProvider {
override fun getFileClasses(file: KtFile): Array<PsiClass> {
+ 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 0000000..80089c7
--- /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("<stacktrace>"))
+ }
+ return dumb
+}
+