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
This commit is contained in:
Pavel V. Talanov
2018-07-27 15:44:54 +02:00
parent ea710ce607
commit e1a27929ac
3 changed files with 31 additions and 1 deletions
@@ -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 }
@@ -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<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
@@ -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
}