From 46c6aaddeb5df205bf9059eb67dd720968ae6245 Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Mon, 24 Apr 2017 14:44:36 +0300 Subject: [PATCH] Light classes: do not try to build lighter classes if failed once Avoid multiple exceptions thrown and analysis being unable to complete --- .../lightClasses/IDELightClassContexts.kt | 2 ++ .../lightClasses/LazyLightClassDataHolder.kt | 16 ++++++++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/lightClasses/IDELightClassContexts.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/lightClasses/IDELightClassContexts.kt index 1261df7f797..52db3c828f0 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/lightClasses/IDELightClassContexts.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/lightClasses/IDELightClassContexts.kt @@ -137,6 +137,8 @@ object IDELightClassContexts { } private fun isDummyResolveApplicable(classOrObject: KtClassOrObject): Boolean { + if (classOrObject.hasLightClassMatchingErrors) return false + val hasDelegatedMembers = classOrObject.superTypeListEntries.any { it is KtDelegatedSuperTypeEntry } val dataClassWithGeneratedMembersOverridden = classOrObject.hasModifier(KtTokens.DATA_KEYWORD) && diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/lightClasses/LazyLightClassDataHolder.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/lightClasses/LazyLightClassDataHolder.kt index c163b91392f..df31783953c 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/lightClasses/LazyLightClassDataHolder.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/lightClasses/LazyLightClassDataHolder.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.idea.caches.resolve.lightClasses import com.intellij.openapi.project.Project +import com.intellij.openapi.util.Key import com.intellij.psi.PsiClass import com.intellij.psi.PsiClassType 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.KtClassOrObject import org.jetbrains.kotlin.psi.KtNamedDeclaration +import org.jetbrains.kotlin.psi.NotNullableUserDataProperty typealias ExactLightClassContextProvider = () -> LightClassConstructionContext typealias DummyLightClassContextProvider = (() -> LightClassConstructionContext?)? @@ -173,17 +175,23 @@ private fun anyInternalMembersWithThisName(name: String, project: Project): Bool return result } -private sealed class LazyLightClassMemberMatchingError(message: String) +private sealed class LazyLightClassMemberMatchingError(message: String, containingClass: KtLightClass) : AssertionError(message) { + init { + containingClass.kotlinOrigin?.hasLightClassMatchingErrors = true + } + 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( - "Matched ${dummyMember.debugName} to ${realMember.debugName} in $containingClass" + "Matched ${dummyMember.debugName} to ${realMember.debugName} in $containingClass", containingClass ) } 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) \ No newline at end of file