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:
Ivan Cilcic
2019-08-11 17:28:08 +03:00
committed by Mikhail Glukhikh
parent 1879fd19eb
commit 6fa7435cd4
4 changed files with 108 additions and 20 deletions
@@ -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)
}