Light classes: do not try to build lighter classes if failed once
Avoid multiple exceptions thrown and analysis being unable to complete
This commit is contained in:
+2
@@ -137,6 +137,8 @@ object IDELightClassContexts {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun isDummyResolveApplicable(classOrObject: KtClassOrObject): Boolean {
|
private fun isDummyResolveApplicable(classOrObject: KtClassOrObject): Boolean {
|
||||||
|
if (classOrObject.hasLightClassMatchingErrors) return false
|
||||||
|
|
||||||
val hasDelegatedMembers = classOrObject.superTypeListEntries.any { it is KtDelegatedSuperTypeEntry }
|
val hasDelegatedMembers = classOrObject.superTypeListEntries.any { it is KtDelegatedSuperTypeEntry }
|
||||||
val dataClassWithGeneratedMembersOverridden =
|
val dataClassWithGeneratedMembersOverridden =
|
||||||
classOrObject.hasModifier(KtTokens.DATA_KEYWORD) &&
|
classOrObject.hasModifier(KtTokens.DATA_KEYWORD) &&
|
||||||
|
|||||||
+12
-4
@@ -17,6 +17,7 @@
|
|||||||
package org.jetbrains.kotlin.idea.caches.resolve.lightClasses
|
package org.jetbrains.kotlin.idea.caches.resolve.lightClasses
|
||||||
|
|
||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
|
import com.intellij.openapi.util.Key
|
||||||
import com.intellij.psi.PsiClass
|
import com.intellij.psi.PsiClass
|
||||||
import com.intellij.psi.PsiClassType
|
import com.intellij.psi.PsiClassType
|
||||||
import com.intellij.psi.PsiMember
|
import com.intellij.psi.PsiMember
|
||||||
@@ -37,6 +38,7 @@ import org.jetbrains.kotlin.lexer.KtTokens
|
|||||||
import org.jetbrains.kotlin.psi.KtCallableDeclaration
|
import org.jetbrains.kotlin.psi.KtCallableDeclaration
|
||||||
import org.jetbrains.kotlin.psi.KtClassOrObject
|
import org.jetbrains.kotlin.psi.KtClassOrObject
|
||||||
import org.jetbrains.kotlin.psi.KtNamedDeclaration
|
import org.jetbrains.kotlin.psi.KtNamedDeclaration
|
||||||
|
import org.jetbrains.kotlin.psi.NotNullableUserDataProperty
|
||||||
|
|
||||||
typealias ExactLightClassContextProvider = () -> LightClassConstructionContext
|
typealias ExactLightClassContextProvider = () -> LightClassConstructionContext
|
||||||
typealias DummyLightClassContextProvider = (() -> LightClassConstructionContext?)?
|
typealias DummyLightClassContextProvider = (() -> LightClassConstructionContext?)?
|
||||||
@@ -173,17 +175,23 @@ private fun anyInternalMembersWithThisName(name: String, project: Project): Bool
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
private sealed class LazyLightClassMemberMatchingError(message: String)
|
private sealed class LazyLightClassMemberMatchingError(message: String, containingClass: KtLightClass)
|
||||||
: AssertionError(message) {
|
: AssertionError(message) {
|
||||||
|
|
||||||
|
init {
|
||||||
|
containingClass.kotlinOrigin?.hasLightClassMatchingErrors = true
|
||||||
|
}
|
||||||
|
|
||||||
class NoMatch(dummyMember: PsiMember, containingClass: KtLightClass) : LazyLightClassMemberMatchingError(
|
class NoMatch(dummyMember: PsiMember, containingClass: KtLightClass) : LazyLightClassMemberMatchingError(
|
||||||
"Couldn't match ${dummyMember.debugName} in $containingClass"
|
"Couldn't match ${dummyMember.debugName} in $containingClass", containingClass
|
||||||
)
|
)
|
||||||
|
|
||||||
class WrongMatch(realMember: PsiMember, dummyMember: PsiMember, containingClass: KtLightClass) : LazyLightClassMemberMatchingError(
|
class WrongMatch(realMember: PsiMember, dummyMember: PsiMember, containingClass: KtLightClass) : LazyLightClassMemberMatchingError(
|
||||||
"Matched ${dummyMember.debugName} to ${realMember.debugName} in $containingClass"
|
"Matched ${dummyMember.debugName} to ${realMember.debugName} in $containingClass", containingClass
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private val PsiMember.debugName
|
private val PsiMember.debugName
|
||||||
get() = "${this::class.simpleName}:${this.name} ${this.memberIndex}" + if (this is PsiMethod) " (with ${parameterList.parametersCount} parameters)" else ""
|
get() = "${this::class.java.simpleName}:${this.name} ${this.memberIndex}" + if (this is PsiMethod) " (with ${parameterList.parametersCount} parameters)" else ""
|
||||||
|
|
||||||
|
var KtClassOrObject.hasLightClassMatchingErrors: Boolean by NotNullableUserDataProperty(Key.create("LIGHT_CLASS_MATCHING_ERRORS"), false)
|
||||||
Reference in New Issue
Block a user