Add separate method to render special functions
Specials functions are elvis (?:) and exclexcl (!!)
This commit is contained in:
committed by
Mikhail Glukhikh
parent
e94417e27b
commit
d0e1234434
+27
-6
@@ -15,7 +15,9 @@ import org.jetbrains.kotlin.renderer.ClassifierNamePolicy
|
|||||||
import org.jetbrains.kotlin.renderer.DescriptorRenderer
|
import org.jetbrains.kotlin.renderer.DescriptorRenderer
|
||||||
import org.jetbrains.kotlin.renderer.ParameterNameRenderingPolicy
|
import org.jetbrains.kotlin.renderer.ParameterNameRenderingPolicy
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext.*
|
import org.jetbrains.kotlin.resolve.BindingContext.*
|
||||||
|
import org.jetbrains.kotlin.resolve.bindingContextUtil.getAbbreviatedTypeOrType
|
||||||
import org.jetbrains.kotlin.resolve.calls.callUtil.getCall
|
import org.jetbrains.kotlin.resolve.calls.callUtil.getCall
|
||||||
|
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
|
||||||
import org.jetbrains.kotlin.types.*
|
import org.jetbrains.kotlin.types.*
|
||||||
|
|
||||||
class PsiRenderer(private val file: KtFile, analysisResult: AnalysisResult) : BaseRenderer {
|
class PsiRenderer(private val file: KtFile, analysisResult: AnalysisResult) : BaseRenderer {
|
||||||
@@ -39,7 +41,7 @@ class PsiRenderer(private val file: KtFile, analysisResult: AnalysisResult) : Ba
|
|||||||
|
|
||||||
private val unnecessaryData = mapOf(
|
private val unnecessaryData = mapOf(
|
||||||
"kotlin." to "",
|
"kotlin." to "",
|
||||||
"kotlin.collections." to ""
|
"collections." to ""
|
||||||
)
|
)
|
||||||
|
|
||||||
private fun addAnnotation(annotationText: String, element: PsiElement) {
|
private fun addAnnotation(annotationText: String, element: PsiElement) {
|
||||||
@@ -49,7 +51,7 @@ class PsiRenderer(private val file: KtFile, analysisResult: AnalysisResult) : Ba
|
|||||||
for ((key, value) in unnecessaryData) {
|
for ((key, value) in unnecessaryData) {
|
||||||
textWithOutUnnecessaryData = textWithOutUnnecessaryData.replace(key, value)
|
textWithOutUnnecessaryData = textWithOutUnnecessaryData.replace(key, value)
|
||||||
}
|
}
|
||||||
if (textWithOutUnnecessaryData != element.text) {
|
if (textWithOutUnnecessaryData != element.text && textWithOutUnnecessaryData.isNotEmpty()) {
|
||||||
annotations.add(Annotator.AnnotationInfo(textWithOutUnnecessaryData, element.textRange))
|
annotations.add(Annotator.AnnotationInfo(textWithOutUnnecessaryData, element.textRange))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -93,7 +95,7 @@ class PsiRenderer(private val file: KtFile, analysisResult: AnalysisResult) : Ba
|
|||||||
renderVariableType(multiDeclarationEntry)
|
renderVariableType(multiDeclarationEntry)
|
||||||
|
|
||||||
override fun visitTypeReference(typeReference: KtTypeReference) {
|
override fun visitTypeReference(typeReference: KtTypeReference) {
|
||||||
val type = bindingContext[TYPE, typeReference]
|
val type = typeReference.getAbbreviatedTypeOrType(bindingContext)
|
||||||
addAnnotation(renderType(type), typeReference)
|
addAnnotation(renderType(type), typeReference)
|
||||||
super.visitTypeReference(typeReference)
|
super.visitTypeReference(typeReference)
|
||||||
}
|
}
|
||||||
@@ -106,14 +108,33 @@ class PsiRenderer(private val file: KtFile, analysisResult: AnalysisResult) : Ba
|
|||||||
val resolvedCall = bindingContext[RESOLVED_CALL, call] ?: return "[ERROR: not resolved]"
|
val resolvedCall = bindingContext[RESOLVED_CALL, call] ?: return "[ERROR: not resolved]"
|
||||||
|
|
||||||
val descriptor = resolvedCall.resultingDescriptor
|
val descriptor = resolvedCall.resultingDescriptor
|
||||||
var annotation = descriptorRenderer.render(descriptor)
|
var annotation =
|
||||||
if (descriptor.name.asString() == "<init>") annotation = annotation.replace("(", "<init>(")
|
if (descriptor.isSpecial()) descriptorRenderer.renderSpecialFunction(descriptor)
|
||||||
|
else descriptorRenderer.render(descriptor)
|
||||||
|
if (descriptor is ClassConstructorDescriptor) annotation = annotation.replace("(", "<init>(")
|
||||||
|
|
||||||
resolvedCall.typeArguments.forEach { (type, value) ->
|
resolvedCall.typeArguments.forEach { (type, value) ->
|
||||||
annotation = annotation.replaceFirst(type.name.toString(), "$value")
|
val newValue = if (value is ErrorType) "???" else "$value"
|
||||||
|
annotation = annotation.replaceFirst(type.name.toString(), newValue)
|
||||||
}
|
}
|
||||||
return annotation
|
return annotation
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun CallableDescriptor.isSpecial(): Boolean {
|
||||||
|
return this.name.asString().contains("SPECIAL-FUNCTION")
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun DescriptorRenderer.renderSpecialFunction(descriptor: CallableDescriptor): String {
|
||||||
|
val descriptorName = descriptor.name.asString()
|
||||||
|
val name = when {
|
||||||
|
descriptorName.contains("ELVIS") -> "?:"
|
||||||
|
descriptorName.contains("EXCLEXCL") -> "!!"
|
||||||
|
else -> "UNKNOWN"
|
||||||
|
}
|
||||||
|
return "fun $name " + this.renderValueParameters(descriptor.valueParameters, false) +
|
||||||
|
": " + renderType(descriptor)
|
||||||
|
}
|
||||||
|
|
||||||
override fun visitSimpleNameExpression(expression: KtSimpleNameExpression) {
|
override fun visitSimpleNameExpression(expression: KtSimpleNameExpression) {
|
||||||
val call = expression.getCall(bindingContext)
|
val call = expression.getCall(bindingContext)
|
||||||
if (call != null) {
|
if (call != null) {
|
||||||
|
|||||||
Reference in New Issue
Block a user