[FIR IDE] Prettify DebugSymbolRenderer, unify its behavior

This commit is contained in:
Yan Zhulanow
2021-11-02 00:33:50 +09:00
parent fac10881ea
commit bba53aa967
6 changed files with 225 additions and 119 deletions
@@ -28,11 +28,11 @@ abstract class AbstractFileScopeTest(configurator: FrontendApiTestConfiguratorSe
val classifierNames = scope.getPossibleClassifierNames() val classifierNames = scope.getPossibleClassifierNames()
val renderedClassifiers = scope.getClassifierSymbols().map { renderExtra(it) } val renderedClassifiers = scope.getClassifierSymbols().map { renderExtra(it) }
"FILE SYMBOL:\n" + renderedSymbol + "FILE SYMBOL:\n" + renderedSymbol + "\n" +
"\nCALLABLE NAMES:\n" + callableNames.joinToString(prefix = "[", postfix = "]\n", separator = ", ") + "\nCALLABLE NAMES:\n" + callableNames.joinToString(prefix = "[", postfix = "]\n", separator = ", ") +
"\nCALLABLE SYMBOLS:\n" + renderedCallables.joinToString(separator = "\n") + "\nCALLABLE SYMBOLS:\n" + renderedCallables.joinToString(separator = "\n\n", postfix = "\n") +
"\nCLASSIFIER NAMES:\n" + classifierNames.joinToString(prefix = "[", postfix = "]\n", separator = ", ") + "\nCLASSIFIER NAMES:\n" + classifierNames.joinToString(prefix = "[", postfix = "]\n", separator = ", ") +
"\nCLASSIFIER SYMBOLS:\n" + renderedClassifiers.joinToString(separator = "\n") "\nCLASSIFIER SYMBOLS:\n" + renderedClassifiers.joinToString(separator = "\n\n")
} }
} }
} }
@@ -55,7 +55,7 @@ abstract class AbstractSymbolTest(configurator: FrontendApiTestConfiguratorServi
pointersWithRendered: List<PointerWithRenderedSymbol>, pointersWithRendered: List<PointerWithRenderedSymbol>,
testServices: TestServices, testServices: TestServices,
) { ) {
val actual = pointersWithRendered.joinToString(separator = "\n") { it.rendered } val actual = pointersWithRendered.joinToString(separator = "\n\n") { it.rendered }
testServices.assertions.assertEqualsToTestDataFileSibling(actual) testServices.assertions.assertEqualsToTestDataFileSibling(actual)
} }
@@ -71,7 +71,7 @@ abstract class AbstractSymbolTest(configurator: FrontendApiTestConfiguratorServi
with(DebugSymbolRenderer) { renderExtra(restored) } with(DebugSymbolRenderer) { renderExtra(restored) }
} }
} }
val actual = restored.joinToString(separator = "\n") val actual = restored.joinToString(separator = "\n\n")
testServices.assertions.assertEqualsToTestDataFileSibling(actual) testServices.assertions.assertEqualsToTestDataFileSibling(actual)
} }
} }
@@ -11,112 +11,178 @@ import org.jetbrains.kotlin.analysis.api.components.KtSymbolInfoProviderMixIn
import org.jetbrains.kotlin.analysis.api.symbols.markers.* import org.jetbrains.kotlin.analysis.api.symbols.markers.*
import org.jetbrains.kotlin.analysis.api.types.KtClassErrorType import org.jetbrains.kotlin.analysis.api.types.KtClassErrorType
import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.analysis.api.types.KtType
import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.*
import org.jetbrains.kotlin.name.FqName import java.lang.Appendable
import org.jetbrains.kotlin.name.Name
import java.lang.reflect.InvocationTargetException import java.lang.reflect.InvocationTargetException
import kotlin.reflect.KClass import kotlin.reflect.KClass
import kotlin.reflect.KProperty import kotlin.reflect.KProperty
import kotlin.reflect.KProperty2
import kotlin.reflect.full.declaredMemberExtensionProperties import kotlin.reflect.full.declaredMemberExtensionProperties
import kotlin.reflect.jvm.javaGetter import kotlin.reflect.full.extensionReceiverParameter
public object DebugSymbolRenderer { public object DebugSymbolRenderer {
private fun StringBuilder.appendLine(indent: Int, line: String) { public fun render(symbol: KtSymbol): String = Block().apply {
appendLine(line.prependIndent(" ".repeat(indent))) renderSymbol(symbol)
}.toString()
public fun KtAnalysisSession.renderExtra(symbol: KtSymbol): String = Block().apply {
renderSymbol(symbol)
withIndent {
KtSymbolInfoProviderMixIn::class.declaredMemberExtensionProperties
.asSequence()
.filter { (it.extensionReceiverParameter?.type?.classifier as? KClass<*>)?.isInstance(symbol) == true }
.forEach { renderProperty(it, this@renderExtra, symbol) }
}
}.toString()
private fun Block.renderProperty(property: KProperty<*>, vararg args: Any) {
try {
appendLine().append(property.name).append(": ")
renderValue(property.getter.call(*args))
} catch (e: InvocationTargetException) {
append("Could not render due to ").appendLine(e.cause.toString())
}
} }
private fun StringBuilder.append(indent: Int, value: String) { private fun Block.renderSymbol(symbol: KtSymbol) {
append(value.prependIndent(" ".repeat(indent))) val apiClass = getSymbolApiClass(symbol)
append(apiClass.simpleName).append(':')
withIndent {
apiClass.members
.asSequence()
.filterIsInstance<KProperty<*>>()
.filter { it.name !in ignoredPropertyNames }
.sortedBy { it.name }
.forEach { renderProperty(it, symbol) }
}
} }
public fun render(symbol: KtSymbol): String = buildString { private fun Block.renderList(values: List<*>) {
renderImpl(symbol) if (values.isEmpty()) {
} append("[]")
return
}
public fun KtAnalysisSession.renderExtra(symbol: KtSymbol): String = buildString { append('[')
renderImpl(symbol) withIndent {
KtSymbolInfoProviderMixIn::class.declaredMemberExtensionProperties.forEach { prop -> for (value in values) {
val symbolClass = prop.parameters[1].type.classifier as? KClass<*> ?: return@forEach appendLine()
if (symbolClass.isInstance(symbol)) { renderValue(value)
@Suppress("UNCHECKED_CAST")
val value = (prop as KProperty2<KtSymbolInfoProviderMixIn, KtSymbol, Any?>).invoke(this@renderExtra, symbol)
val stringValue = renderValue(value)
appendLine(INDENT, "${prop.name}: $stringValue")
} }
} }
appendLine().append(']')
} }
private fun StringBuilder.renderImpl(symbol: KtSymbol) { private fun Block.renderSymbolTag(symbol: KtSymbol) {
val klass = getSymbolClass(symbol) fun renderId(id: Any?, symbol: KtSymbol) {
appendLine("${klass.simpleName}:") if (id != null) {
klass.members.filterIsInstance<KProperty<*>>().sortedBy { it.name }.forEach { property -> renderValue(id)
if (property.name in ignoredPropertyNames) return@forEach } else {
val getter = property.javaGetter ?: return@forEach val outerName = (symbol as? KtPossiblyNamedSymbol)?.name ?: SpecialNames.NO_NAME_PROVIDED
val value = try { append("<local>/" + outerName.asString())
getter.invoke(symbol)
} catch (e: InvocationTargetException) {
"Could not render due to ${e.cause}"
} }
val stringValue = renderValue(value) }
appendLine(INDENT, "${property.name}: $stringValue")
append(getSymbolApiClass(symbol).simpleName)
append("(")
when (symbol) {
is KtClassLikeSymbol -> renderId(symbol.classIdIfNonLocal, symbol)
is KtValueParameterSymbol -> renderValue(symbol.name)
is KtPropertyGetterSymbol -> append("<getter>")
is KtPropertySetterSymbol -> append("<setter>")
is KtCallableSymbol -> renderId(symbol.callableIdIfNonLocal, symbol)
is KtNamedSymbol -> renderValue(symbol.name)
else -> error("Unsupported symbol ${symbol::class.java.name}")
}
append(")")
}
private fun Block.renderConstantValue(value: KtConstantValue) {
when (value) {
is KtLiteralConstantValue<*> -> renderValue(value.value)
is KtEnumEntryConstantValue -> {
append(KtEnumEntryConstantValue::class.java.simpleName)
append("(")
renderValue(value.callableId)
append(")")
}
else -> append(value::class.java.simpleName)
} }
} }
private fun renderValue(value: Any?): String = when (value) { private fun Block.renderNamedConstantValue(value: KtNamedConstantValue) {
null -> "null" append(value.name).append(" = ")
is String -> value renderValue(value.expression)
is Boolean -> value.toString()
is Number -> value.toString()
is UByte -> value.toString()
is UShort -> value.toString()
is UInt -> value.toString()
is ULong -> value.toString()
is Name -> value.asString()
is FqName -> value.asString()
is ClassId -> value.asString()
is CallableId -> value.toString()
is Enum<*> -> value.name
is List<*> -> if (value.isEmpty()) "[]" else buildString {
appendLine("[")
value.forEach {
appendLine(INDENT, renderValue(it))
}
append("]")
}
is KtClassErrorType -> "ERROR_TYPE"
is KtType -> value.asStringForDebugging()
is KtSymbol -> {
val symbolTag = when (value) {
is KtClassLikeSymbol -> renderValue(value.classIdIfNonLocal ?: "<local>/${value.name}")
is KtFunctionSymbol -> renderValue(value.callableIdIfNonLocal ?: "<local>/${value.name}")
is KtSamConstructorSymbol -> renderValue(value.callableIdIfNonLocal ?: "<local>/${value.name}")
is KtConstructorSymbol -> "<constructor>"
is KtEnumEntrySymbol -> renderValue(value.callableIdIfNonLocal ?: "<local>/${value.name}")
is KtNamedSymbol -> renderValue(value.name)
is KtPropertyGetterSymbol -> "<getter>"
is KtPropertySetterSymbol -> "<setter>"
else -> TODO(value::class.toString())
}
val symbolKind = getSymbolClass(value).simpleName!!
"$symbolKind($symbolTag)"
}
is KtLiteralConstantValue<*> -> renderValue(value.value)
is KtEnumEntryConstantValue -> "KtEnumEntryConstantValue(${renderValue(value.callableId)})"
is KtNamedConstantValue -> "${renderValue(value.name)} = ${renderValue(value.expression)}"
is KtAnnotationCall -> buildString {
append(renderValue(value.classId))
appendLine(value.arguments.joinToString(prefix = "(", postfix = ")") { renderValue(it) })
// TODO: perhaps we want to render `psi` for all other cases as well.
append(INDENT, "psi: ${renderValue(value.psi)}")
}
is KtTypeAndAnnotations -> "${renderValue(value.annotations)} ${renderValue(value.type)}"
is DeprecationInfo -> value.toString()
else -> value::class.simpleName!!
} }
private fun getSymbolClass(symbol: KtSymbol): KClass<*> { private fun Block.renderType(type: KtType) {
when (type) {
is KtClassErrorType -> append("ERROR_TYPE")
else -> append(type.asStringForDebugging())
}
}
private fun Block.renderTypeAndAnnotations(type: KtTypeAndAnnotations) {
renderList(type.annotations)
append(' ')
renderType(type.type)
}
private fun Block.renderAnnotationCall(call: KtAnnotationCall) {
renderValue(call.classId)
append('(')
call.arguments.sortedBy { it.name }.forEachIndexed { index, value ->
if (index > 0) {
append(", ")
}
renderValue(value)
}
append(')')
withIndent {
appendLine().append("psi: ")
renderValue(call.psi?.javaClass?.simpleName)
}
}
private fun Block.renderDeprecationInfo(info: DeprecationInfo) {
append("DeprecationInfo(")
append("deprecationLevel=${info.deprecationLevel}, ")
append("propagatesToOverrides=${info.propagatesToOverrides}, ")
append("message=${info.message}")
append(")")
}
private fun Block.renderValue(value: Any?) {
when (value) {
// Symbol-related values
is KtSymbol -> renderSymbolTag(value)
is KtType -> renderType(value)
is KtTypeAndAnnotations -> renderTypeAndAnnotations(value)
is KtConstantValue -> renderConstantValue(value)
is KtNamedConstantValue -> renderNamedConstantValue(value)
is KtAnnotationCall -> renderAnnotationCall(value)
// Other custom values
is Name -> append(value.asString())
is FqName -> append(value.asString())
is ClassId -> append(value.asString())
is DeprecationInfo -> renderDeprecationInfo(value)
is Visibility -> append(value::class.java.simpleName)
// Unsigned integers
is UByte -> append(value.toString())
is UShort -> append(value.toString())
is UInt -> append(value.toString())
is ULong -> append(value.toString())
// Java values
is Enum<*> -> append(value.name)
is List<*> -> renderList(value)
else -> append(value.toString())
}
}
private fun getSymbolApiClass(symbol: KtSymbol): KClass<*> {
var current: Class<in KtSymbol> = symbol.javaClass var current: Class<in KtSymbol> = symbol.javaClass
while (true) { while (true) {
@@ -134,6 +200,46 @@ public object DebugSymbolRenderer {
"org.jetbrains.kotlin.analysis.api.fir", "org.jetbrains.kotlin.analysis.api.fir",
"org.jetbrains.kotlin.analysis.api.descriptors", "org.jetbrains.kotlin.analysis.api.descriptors",
) )
private const val INDENT = 2
} }
private class Block : Appendable {
private val builder = StringBuilder()
private var indent = 0
override fun append(seq: CharSequence): Appendable = apply {
seq.split('\n').forEachIndexed { index, line ->
if (index > 0) {
builder.append('\n')
}
appendIndentIfNeeded()
builder.append(line)
}
}
override fun append(seq: CharSequence, start: Int, end: Int): Appendable = apply {
append(seq.subSequence(start, end))
}
override fun append(c: Char): Appendable = apply {
if (c != '\n') {
appendIndentIfNeeded()
}
builder.append(c)
}
private fun appendIndentIfNeeded() {
if (builder.isEmpty() || builder[builder.lastIndex] == '\n') {
builder.append(" ".repeat(2 * indent))
}
}
fun withIndent(block: Block.() -> Unit) {
indent += 1
block(this)
indent -= 1
}
override fun toString(): String {
return builder.toString()
}
}
@@ -323,7 +323,7 @@ KtFunctionSymbol:
KtValueParameterSymbol(p3) KtValueParameterSymbol(p3)
] ]
visibility: Public visibility: Public
deprecationStatus: SimpleDeprecationInfo(deprecationLevel=WARNING, propagatesToOverrides=false, message=Deprecated in Java) deprecationStatus: DeprecationInfo(deprecationLevel=WARNING, propagatesToOverrides=false, message=Deprecated in Java)
KtFunctionSymbol: KtFunctionSymbol:
annotatedType: [] ft<kotlin/ByteArray, kotlin/ByteArray?> annotatedType: [] ft<kotlin/ByteArray, kotlin/ByteArray?>
@@ -1724,7 +1724,7 @@ KtConstructorSymbol:
KtValueParameterSymbol(p3) KtValueParameterSymbol(p3)
] ]
visibility: Public visibility: Public
deprecationStatus: SimpleDeprecationInfo(deprecationLevel=WARNING, propagatesToOverrides=false, message=Deprecated in Java) deprecationStatus: DeprecationInfo(deprecationLevel=WARNING, propagatesToOverrides=false, message=Deprecated in Java)
KtConstructorSymbol: KtConstructorSymbol:
annotatedType: [] java/lang/String annotatedType: [] java/lang/String
@@ -1750,7 +1750,7 @@ KtConstructorSymbol:
KtValueParameterSymbol(p1) KtValueParameterSymbol(p1)
] ]
visibility: Public visibility: Public
deprecationStatus: SimpleDeprecationInfo(deprecationLevel=WARNING, propagatesToOverrides=false, message=Deprecated in Java) deprecationStatus: DeprecationInfo(deprecationLevel=WARNING, propagatesToOverrides=false, message=Deprecated in Java)
KtConstructorSymbol: KtConstructorSymbol:
annotatedType: [] java/lang/String annotatedType: [] java/lang/String
@@ -1968,4 +1968,4 @@ KtConstructorSymbol:
KtValueParameterSymbol(p2) KtValueParameterSymbol(p2)
] ]
visibility: PackageVisibility visibility: PackageVisibility
deprecationStatus: SimpleDeprecationInfo(deprecationLevel=WARNING, propagatesToOverrides=false, message=Deprecated in Java) deprecationStatus: DeprecationInfo(deprecationLevel=WARNING, propagatesToOverrides=false, message=Deprecated in Java)
@@ -29,11 +29,11 @@ KtKotlinPropertySymbol:
setter: null setter: null
symbolKind: TOP_LEVEL symbolKind: TOP_LEVEL
visibility: Public visibility: Public
deprecationStatus: SimpleDeprecationInfo(deprecationLevel=WARNING, propagatesToOverrides=true, message=don't use i) deprecationStatus: DeprecationInfo(deprecationLevel=WARNING, propagatesToOverrides=true, message=don't use i)
getterDeprecationStatus: SimpleDeprecationInfo(deprecationLevel=WARNING, propagatesToOverrides=true, message=don't use i) getterDeprecationStatus: DeprecationInfo(deprecationLevel=WARNING, propagatesToOverrides=true, message=don't use i)
javaGetterName: getI javaGetterName: getI
javaSetterName: null javaSetterName: null
setterDeprecationStatus: SimpleDeprecationInfo(deprecationLevel=WARNING, propagatesToOverrides=true, message=don't use i) setterDeprecationStatus: DeprecationInfo(deprecationLevel=WARNING, propagatesToOverrides=true, message=don't use i)
KtKotlinPropertySymbol: KtKotlinPropertySymbol:
annotatedType: [] kotlin/Int annotatedType: [] kotlin/Int
@@ -62,7 +62,7 @@ KtKotlinPropertySymbol:
symbolKind: TOP_LEVEL symbolKind: TOP_LEVEL
visibility: Public visibility: Public
deprecationStatus: null deprecationStatus: null
getterDeprecationStatus: SimpleDeprecationInfo(deprecationLevel=WARNING, propagatesToOverrides=true, message=don't use getter of i2) getterDeprecationStatus: DeprecationInfo(deprecationLevel=WARNING, propagatesToOverrides=true, message=don't use getter of i2)
javaGetterName: getI2 javaGetterName: getI2
javaSetterName: null javaSetterName: null
setterDeprecationStatus: null setterDeprecationStatus: null
@@ -97,7 +97,7 @@ KtKotlinPropertySymbol:
getterDeprecationStatus: null getterDeprecationStatus: null
javaGetterName: getI3 javaGetterName: getI3
javaSetterName: setI3 javaSetterName: setI3
setterDeprecationStatus: SimpleDeprecationInfo(deprecationLevel=WARNING, propagatesToOverrides=true, message=don't use getter of i3) setterDeprecationStatus: DeprecationInfo(deprecationLevel=WARNING, propagatesToOverrides=true, message=don't use getter of i3)
KtKotlinPropertySymbol: KtKotlinPropertySymbol:
annotatedType: [] kotlin/Int annotatedType: [] kotlin/Int
@@ -126,10 +126,10 @@ KtKotlinPropertySymbol:
symbolKind: TOP_LEVEL symbolKind: TOP_LEVEL
visibility: Public visibility: Public
deprecationStatus: null deprecationStatus: null
getterDeprecationStatus: SimpleDeprecationInfo(deprecationLevel=WARNING, propagatesToOverrides=true, message=don't use getter of i4) getterDeprecationStatus: DeprecationInfo(deprecationLevel=WARNING, propagatesToOverrides=true, message=don't use getter of i4)
javaGetterName: getI4 javaGetterName: getI4
javaSetterName: setI4 javaSetterName: setI4
setterDeprecationStatus: SimpleDeprecationInfo(deprecationLevel=WARNING, propagatesToOverrides=true, message=don't use getter of i4) setterDeprecationStatus: DeprecationInfo(deprecationLevel=WARNING, propagatesToOverrides=true, message=don't use getter of i4)
KtFunctionSymbol: KtFunctionSymbol:
annotatedType: [] kotlin/Int annotatedType: [] kotlin/Int
@@ -159,7 +159,7 @@ KtFunctionSymbol:
typeParameters: [] typeParameters: []
valueParameters: [] valueParameters: []
visibility: Public visibility: Public
deprecationStatus: SimpleDeprecationInfo(deprecationLevel=WARNING, propagatesToOverrides=true, message=don't use f) deprecationStatus: DeprecationInfo(deprecationLevel=WARNING, propagatesToOverrides=true, message=don't use f)
KtNamedClassOrObjectSymbol: KtNamedClassOrObjectSymbol:
annotationClassIds: [ annotationClassIds: [
@@ -186,7 +186,7 @@ KtNamedClassOrObjectSymbol:
symbolKind: TOP_LEVEL symbolKind: TOP_LEVEL
typeParameters: [] typeParameters: []
visibility: Public visibility: Public
deprecationStatus: SimpleDeprecationInfo(deprecationLevel=WARNING, propagatesToOverrides=true, message=don't use MyClass) deprecationStatus: DeprecationInfo(deprecationLevel=WARNING, propagatesToOverrides=true, message=don't use MyClass)
KtKotlinPropertySymbol: KtKotlinPropertySymbol:
annotatedType: [] kotlin/Int annotatedType: [] kotlin/Int
@@ -219,11 +219,11 @@ KtKotlinPropertySymbol:
setter: null setter: null
symbolKind: CLASS_MEMBER symbolKind: CLASS_MEMBER
visibility: Public visibility: Public
deprecationStatus: SimpleDeprecationInfo(deprecationLevel=WARNING, propagatesToOverrides=true, message=don't use i2) deprecationStatus: DeprecationInfo(deprecationLevel=WARNING, propagatesToOverrides=true, message=don't use i2)
getterDeprecationStatus: SimpleDeprecationInfo(deprecationLevel=WARNING, propagatesToOverrides=true, message=don't use i2) getterDeprecationStatus: DeprecationInfo(deprecationLevel=WARNING, propagatesToOverrides=true, message=don't use i2)
javaGetterName: getI2 javaGetterName: getI2
javaSetterName: null javaSetterName: null
setterDeprecationStatus: SimpleDeprecationInfo(deprecationLevel=WARNING, propagatesToOverrides=true, message=don't use i2) setterDeprecationStatus: DeprecationInfo(deprecationLevel=WARNING, propagatesToOverrides=true, message=don't use i2)
KtFunctionSymbol: KtFunctionSymbol:
annotatedType: [] kotlin/Int annotatedType: [] kotlin/Int
@@ -253,7 +253,7 @@ KtFunctionSymbol:
typeParameters: [] typeParameters: []
valueParameters: [] valueParameters: []
visibility: Public visibility: Public
deprecationStatus: SimpleDeprecationInfo(deprecationLevel=WARNING, propagatesToOverrides=true, message=don't use f2) deprecationStatus: DeprecationInfo(deprecationLevel=WARNING, propagatesToOverrides=true, message=don't use f2)
KtNamedClassOrObjectSymbol: KtNamedClassOrObjectSymbol:
annotationClassIds: [] annotationClassIds: []
@@ -308,11 +308,11 @@ KtKotlinPropertySymbol:
setter: null setter: null
symbolKind: TOP_LEVEL symbolKind: TOP_LEVEL
visibility: Public visibility: Public
deprecationStatus: SimpleDeprecationInfo(deprecationLevel=ERROR, propagatesToOverrides=true, message=null) deprecationStatus: DeprecationInfo(deprecationLevel=ERROR, propagatesToOverrides=true, message=null)
getterDeprecationStatus: SimpleDeprecationInfo(deprecationLevel=ERROR, propagatesToOverrides=true, message=null) getterDeprecationStatus: DeprecationInfo(deprecationLevel=ERROR, propagatesToOverrides=true, message=null)
javaGetterName: getJ javaGetterName: getJ
javaSetterName: null javaSetterName: null
setterDeprecationStatus: SimpleDeprecationInfo(deprecationLevel=ERROR, propagatesToOverrides=true, message=null) setterDeprecationStatus: DeprecationInfo(deprecationLevel=ERROR, propagatesToOverrides=true, message=null)
KtKotlinPropertySymbol: KtKotlinPropertySymbol:
annotatedType: [] kotlin/Int annotatedType: [] kotlin/Int
@@ -345,11 +345,11 @@ KtKotlinPropertySymbol:
setter: null setter: null
symbolKind: TOP_LEVEL symbolKind: TOP_LEVEL
visibility: Public visibility: Public
deprecationStatus: SimpleDeprecationInfo(deprecationLevel=HIDDEN, propagatesToOverrides=true, message=null) deprecationStatus: DeprecationInfo(deprecationLevel=HIDDEN, propagatesToOverrides=true, message=null)
getterDeprecationStatus: SimpleDeprecationInfo(deprecationLevel=HIDDEN, propagatesToOverrides=true, message=null) getterDeprecationStatus: DeprecationInfo(deprecationLevel=HIDDEN, propagatesToOverrides=true, message=null)
javaGetterName: getJ2 javaGetterName: getJ2
javaSetterName: null javaSetterName: null
setterDeprecationStatus: SimpleDeprecationInfo(deprecationLevel=HIDDEN, propagatesToOverrides=true, message=null) setterDeprecationStatus: DeprecationInfo(deprecationLevel=HIDDEN, propagatesToOverrides=true, message=null)
KtKotlinPropertySymbol: KtKotlinPropertySymbol:
annotatedType: [] kotlin/Int annotatedType: [] kotlin/Int
@@ -382,8 +382,8 @@ KtKotlinPropertySymbol:
setter: null setter: null
symbolKind: TOP_LEVEL symbolKind: TOP_LEVEL
visibility: Public visibility: Public
deprecationStatus: SimpleDeprecationInfo(deprecationLevel=WARNING, propagatesToOverrides=false, message=null) deprecationStatus: DeprecationInfo(deprecationLevel=WARNING, propagatesToOverrides=false, message=null)
getterDeprecationStatus: SimpleDeprecationInfo(deprecationLevel=WARNING, propagatesToOverrides=false, message=null) getterDeprecationStatus: DeprecationInfo(deprecationLevel=WARNING, propagatesToOverrides=false, message=null)
javaGetterName: getJ2 javaGetterName: getJ2
javaSetterName: null javaSetterName: null
setterDeprecationStatus: SimpleDeprecationInfo(deprecationLevel=WARNING, propagatesToOverrides=false, message=null) setterDeprecationStatus: DeprecationInfo(deprecationLevel=WARNING, propagatesToOverrides=false, message=null)
@@ -4,7 +4,7 @@ KtBackingFieldSymbol:
isExtension: false isExtension: false
name: field name: field
origin: PROPERTY_BACKING_FIELD origin: PROPERTY_BACKING_FIELD
owningProperty: KtKotlinPropertySymbol(x) owningProperty: KtKotlinPropertySymbol(/x)
receiverType: null receiverType: null
symbolKind: LOCAL symbolKind: LOCAL
deprecationStatus: null deprecationStatus: null