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.KtLightClass
import org.jetbrains.kotlin.asJava.classes.LightClassInheritanceHelper import org.jetbrains.kotlin.asJava.classes.LightClassInheritanceHelper
import org.jetbrains.kotlin.asJava.classes.defaultJavaAncestorQualifiedName 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.idea.search.PsiBasedClassResolver
import org.jetbrains.kotlin.psi.KtSimpleNameExpression import org.jetbrains.kotlin.psi.KtSimpleNameExpression
import org.jetbrains.kotlin.psi.KtSuperTypeCallEntry import org.jetbrains.kotlin.psi.KtSuperTypeCallEntry
@@ -34,6 +35,8 @@ class IdeLightClassInheritanceHelper : LightClassInheritanceHelper {
baseClass: PsiClass, baseClass: PsiClass,
checkDeep: Boolean checkDeep: Boolean
): ImpreciseResolveResult { ): ImpreciseResolveResult {
if (baseClass.project.isInDumbMode()) return NO_MATCH
val classOrObject = lightClass.kotlinOrigin ?: return UNSURE val classOrObject = lightClass.kotlinOrigin ?: return UNSURE
val entries = classOrObject.superTypeListEntries val entries = classOrObject.superTypeListEntries
val hasSuperClass = entries.any { it is KtSuperTypeCallEntry } 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.asJava.toLightClass
import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil
import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName 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.KtClassOrObject
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtFileClassProvider import org.jetbrains.kotlin.psi.KtFileClassProvider
@@ -21,6 +21,10 @@ import org.jetbrains.kotlin.psi.analysisContext
class KtFileClassProviderImpl(val kotlinAsJavaSupport: KotlinAsJavaSupport) : class KtFileClassProviderImpl(val kotlinAsJavaSupport: KotlinAsJavaSupport) :
KtFileClassProvider { KtFileClassProvider {
override fun getFileClasses(file: KtFile): Array<PsiClass> { 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 // TODO We don't currently support finding light classes for scripts
if (file.isCompiled || file.isScript()) { if (file.isCompiled || file.isScript()) {
return PsiClass.EMPTY_ARRAY 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
}