From 922fde9986a8c1242a0b05ac8cacd2d5df0f324f Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Thu, 30 Mar 2017 16:14:04 +0300 Subject: [PATCH] LazyLightClassDataHolder: minor, improve diagnostics --- .../lightClasses/LazyLightClassDataHolder.kt | 34 +++++++++++++++---- 1 file changed, 28 insertions(+), 6 deletions(-) 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 7337d20d0b8..0c308bddc3b 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 @@ -99,8 +99,7 @@ sealed class LazyLightClassDataHolder( val fieldName = dummyField.name!! KtLightFieldImpl.lazy(dummyField, fieldOrigin, containingClass) { - clsDelegate.findFieldByName(fieldName, false)?.apply { assert(this.memberIndex!! == dummyField.memberIndex!!) } - ?: throw LazyLightClassMemberMatchingError(dummyField, containingClass) + clsDelegate.findFieldByName(fieldName, false).assertMatches(dummyField, containingClass) } } } @@ -127,8 +126,7 @@ sealed class LazyLightClassDataHolder( */ val exactDelegateMethod = clsDelegate.findMethodsByName(dummyMethod.name, false).firstOrNull(byMemberIndex) ?: clsDelegate.methods.firstOrNull(byMemberIndex) - exactDelegateMethod?.apply { assert(this.parameterList.parametersCount == dummyMethod.parameterList.parametersCount) } - ?: throw LazyLightClassMemberMatchingError(dummyMethod, containingClass) + exactDelegateMethod.assertMatches(dummyMethod, containingClass) } } } @@ -137,6 +135,18 @@ sealed class LazyLightClassDataHolder( get() = if (relyOnDummySupertypes && dummyDelegate != null) dummyDelegate!!.superTypes else clsDelegate.superTypes } + + private fun T?.assertMatches(dummyMember: T, containingClass: KtLightClass): T { + if (this == null) throw LazyLightClassMemberMatchingError.NoMatch(dummyMember, containingClass) + + val parameterCountMatches = (this as? PsiMethod)?.parameterList?.parametersCount ?: 0 == + (dummyMember as? PsiMethod)?.parameterList?.parametersCount ?: 0 + if (this.memberIndex != dummyMember.memberIndex || !parameterCountMatches) { + throw LazyLightClassMemberMatchingError.WrongMatch(this, dummyMember, containingClass) + } + + return this + } } private fun shouldRollbackOptimization(origin: LightMemberOriginForDeclaration?): Boolean { @@ -162,5 +172,17 @@ private fun anyInternalMembersWithThisName(name: String, project: Project): Bool return result } -private class LazyLightClassMemberMatchingError(dummyMember: PsiMember, containingClass: KtLightClass) - : AssertionError("Error matching ${dummyMember::class.simpleName}:${dummyMember.name} created for $containingClass") \ No newline at end of file +private sealed class LazyLightClassMemberMatchingError(message: String) + : AssertionError(message) { + + class NoMatch(dummyMember: PsiMember, containingClass: KtLightClass) : LazyLightClassMemberMatchingError( + "Couldn't match ${dummyMember.debugName} in $containingClass" + ) + + class WrongMatch(realMember: PsiMember, dummyMember: PsiMember, containingClass: KtLightClass) : LazyLightClassMemberMatchingError( + "Matched ${dummyMember.debugName} to ${realMember.debugName} in $containingClass" + ) +} + +private val PsiMember.debugName + get() = "${this::class.simpleName}:${this.name} ${this.memberIndex}" + if (this is PsiMethod) " (with ${parameterList.parametersCount} parameters)" else ""