Add additional options to DescriptorRender
1) renderContextNearLocalVariable - if true renderer add fq name for local variables after "@" symbol 2) fullContextForLocalVariable - if true then renderer add all fq names for local variables, else only last one 3) useBaseClassAsReceiver - if true then renderer uses dispatch receiver as extension receiver if the last is null
This commit is contained in:
committed by
Mikhail Glukhikh
parent
1879fd19eb
commit
6fa7435cd4
@@ -246,6 +246,10 @@ interface DescriptorRendererOptions {
|
||||
var parameterNamesInFunctionalTypes: Boolean
|
||||
var renderFunctionContracts: Boolean
|
||||
var presentableUnresolvedTypes: Boolean
|
||||
|
||||
var renderContextNearLocalVariable: Boolean
|
||||
var fullContextForLocalVariable: Boolean
|
||||
var useBaseClassAsReceiver: Boolean
|
||||
}
|
||||
|
||||
object ExcludedTypeAnnotations {
|
||||
|
||||
@@ -106,6 +106,17 @@ internal class DescriptorRendererImpl(
|
||||
|
||||
private fun renderFqName(pathSegments: List<Name>) = escape(org.jetbrains.kotlin.renderer.renderFqName(pathSegments))
|
||||
|
||||
private fun renderFqNameForLocalVariables(fqName: FqNameUnsafe): String =
|
||||
if (fqName.isRoot) {
|
||||
"<root>"
|
||||
} else {
|
||||
if (fullContextForLocalVariable) {
|
||||
renderFqName(fqName)
|
||||
} else {
|
||||
renderFqName(fqName).substringAfterLast(".")
|
||||
}
|
||||
}.replace(".", "/")
|
||||
|
||||
override fun renderClassifierName(klass: ClassifierDescriptor): String = if (ErrorUtils.isError(klass)) {
|
||||
klass.typeConstructor.toString()
|
||||
} else
|
||||
@@ -709,6 +720,8 @@ internal class DescriptorRendererImpl(
|
||||
|
||||
private fun renderReceiver(callableDescriptor: CallableDescriptor, builder: StringBuilder) {
|
||||
val receiver = callableDescriptor.extensionReceiverParameter
|
||||
?: (if (useBaseClassAsReceiver) callableDescriptor.dispatchReceiverParameter else null)
|
||||
val extensionIsNull = callableDescriptor.extensionReceiverParameter == null
|
||||
if (receiver != null) {
|
||||
builder.renderAnnotations(receiver, AnnotationUseSiteTarget.RECEIVER)
|
||||
|
||||
@@ -717,7 +730,8 @@ internal class DescriptorRendererImpl(
|
||||
if (shouldRenderAsPrettyFunctionType(type) && !TypeUtils.isNullableType(type)) {
|
||||
result = "($result)"
|
||||
}
|
||||
builder.append(result).append(".")
|
||||
// @ symbol is used to distinguish extension receiver from dispatch
|
||||
builder.append(result).append(if (extensionIsNull) "@" else ".")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -809,7 +823,7 @@ internal class DescriptorRendererImpl(
|
||||
builder: StringBuilder,
|
||||
topLevel: Boolean
|
||||
) {
|
||||
if (topLevel) {
|
||||
if (topLevel && !renderContextNearLocalVariable) {
|
||||
builder.append(renderKeyword("value-parameter")).append(" ")
|
||||
}
|
||||
|
||||
@@ -862,6 +876,11 @@ internal class DescriptorRendererImpl(
|
||||
|
||||
if (includeName) {
|
||||
renderName(variable, builder, topLevel)
|
||||
if (topLevel && renderContextNearLocalVariable) {
|
||||
val containingDeclaration = variable.containingDeclaration
|
||||
val fqName = DescriptorUtils.getFqName(containingDeclaration)
|
||||
builder.append("@").append(renderFqNameForLocalVariables(fqName))
|
||||
}
|
||||
builder.append(": ")
|
||||
}
|
||||
|
||||
|
||||
@@ -127,4 +127,8 @@ internal class DescriptorRendererOptionsImpl : DescriptorRendererOptions {
|
||||
override var presentableUnresolvedTypes: Boolean by property(false)
|
||||
|
||||
override var boldOnlyForNamesInHtml: Boolean by property(false)
|
||||
|
||||
override var renderContextNearLocalVariable by property(false)
|
||||
override var fullContextForLocalVariable by property(false)
|
||||
override var useBaseClassAsReceiver by property(false)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user