LazyLightClassDataHolder: minor, improve diagnostics

This commit is contained in:
Pavel V. Talanov
2017-03-30 16:14:04 +03:00
parent 8fbd75ce27
commit 922fde9986
@@ -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 : PsiMember> 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")
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 ""