From c37ee83791cee8fe966d84fd2cf329e9cb500bab Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Wed, 15 Feb 2023 15:53:06 +0100 Subject: [PATCH] [Analysis API] add more debug info to "pointer already disposed" error --- .../api/symbols/pointers/KtSymbolPointer.kt | 3 ++ .../analysis-internal-utils/build.gradle.kts | 1 + .../utils/relfection/toStringDataClassLike.kt | 30 +++++++++++++++++++ .../light/classes/symbol/symbolLightUtils.kt | 6 +++- 4 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 analysis/analysis-internal-utils/src/org/jetbrains/kotlin/analysis/utils/relfection/toStringDataClassLike.kt diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/pointers/KtSymbolPointer.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/pointers/KtSymbolPointer.kt index 17bbce0d8ea..2b5800997f5 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/pointers/KtSymbolPointer.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/pointers/KtSymbolPointer.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.analysis.api.symbols.pointers import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol +import org.jetbrains.kotlin.analysis.utils.relfection.renderAsDataClassToString /** * `KtSymbol` is valid only during read action it was created in @@ -36,6 +37,8 @@ public abstract class KtSymbolPointer { * @return **true** if [other] pointer can be restored to the same symbol. The operation is symmetric and transitive. */ public open fun pointsToTheSameSymbolAs(other: KtSymbolPointer): Boolean = this === other + + override fun toString(): String = renderAsDataClassToString() } public inline fun symbolPointer(crossinline getSymbol: (KtAnalysisSession) -> S?): KtSymbolPointer = diff --git a/analysis/analysis-internal-utils/build.gradle.kts b/analysis/analysis-internal-utils/build.gradle.kts index 26d7b99e265..57a5cc875bf 100644 --- a/analysis/analysis-internal-utils/build.gradle.kts +++ b/analysis/analysis-internal-utils/build.gradle.kts @@ -6,6 +6,7 @@ plugins { dependencies { implementation(project(":compiler:psi")) implementation(kotlinxCollectionsImmutable()) + implementation(commonDependency("org.jetbrains.kotlin:kotlin-reflect")) { isTransitive = false } implementation(intellijCore()) } diff --git a/analysis/analysis-internal-utils/src/org/jetbrains/kotlin/analysis/utils/relfection/toStringDataClassLike.kt b/analysis/analysis-internal-utils/src/org/jetbrains/kotlin/analysis/utils/relfection/toStringDataClassLike.kt new file mode 100644 index 00000000000..4f4ec9dd4a8 --- /dev/null +++ b/analysis/analysis-internal-utils/src/org/jetbrains/kotlin/analysis/utils/relfection/toStringDataClassLike.kt @@ -0,0 +1,30 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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.analysis.utils.relfection + +import java.lang.reflect.InvocationTargetException +import kotlin.reflect.full.declaredMemberProperties +import org.jetbrains.kotlin.analysis.utils.printer.prettyPrint +import kotlin.reflect.jvm.isAccessible + +public fun Any.renderAsDataClassToString(): String = prettyPrint { + append(this@renderAsDataClassToString::class.qualifiedName) + append("(") + printCollection(this@renderAsDataClassToString::class.declaredMemberProperties) { property -> + append(property.name) + append(": ") + val getter = property.getter + try { + getter.isAccessible = true + append(getter.call(this@renderAsDataClassToString).toString()) + } catch (e: InvocationTargetException) { + append("ERROR_RENDERING_FIELD") + } catch (_: Exception) { + println("") + } + } + append(")") +} \ No newline at end of file diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/symbolLightUtils.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/symbolLightUtils.kt index f4008710723..a0232ca4da0 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/symbolLightUtils.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/symbolLightUtils.kt @@ -32,6 +32,7 @@ import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.SpecialNames import org.jetbrains.kotlin.psi.KtTypeParameterListOwner import java.util.* +import org.jetbrains.kotlin.analysis.utils.errors.buildErrorWithAttachment internal fun L.invalidAccess(): Nothing = error("Cls delegate shouldn't be accessed for symbol light classes! Qualified name: ${javaClass.name}") @@ -245,7 +246,10 @@ internal fun BitSet.copy(): BitSet = clone() as BitSet context(KtAnalysisSession) internal fun KtSymbolPointer.restoreSymbolOrThrowIfDisposed(): T = - restoreSymbol() ?: error("${this::class} pointer already disposed") + restoreSymbol() + ?: buildErrorWithAttachment("${this::class} pointer already disposed") { + withEntry("pointer", this@restoreSymbolOrThrowIfDisposed) { it.toString() } + } internal fun hasTypeParameters( ktModule: KtModule,