Create simple renderer for old frontend
It uses DescriptorRendererImpl that isn't quite good.
This commit is contained in:
committed by
Mikhail Glukhikh
parent
e69e6a1eeb
commit
1879fd19eb
+10
@@ -0,0 +1,10 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2019 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.compiler.visualizer
|
||||||
|
|
||||||
|
interface BaseRenderer {
|
||||||
|
fun render(): String
|
||||||
|
}
|
||||||
+73
@@ -0,0 +1,73 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2019 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.compiler.visualizer
|
||||||
|
|
||||||
|
import com.intellij.psi.PsiElement
|
||||||
|
import org.jetbrains.kotlin.analyzer.AnalysisResult
|
||||||
|
import org.jetbrains.kotlin.compiler.visualizer.Annotator.annotate
|
||||||
|
import org.jetbrains.kotlin.descriptors.VariableDescriptor
|
||||||
|
import org.jetbrains.kotlin.psi.*
|
||||||
|
import org.jetbrains.kotlin.renderer.ClassifierNamePolicy
|
||||||
|
import org.jetbrains.kotlin.renderer.DescriptorRenderer
|
||||||
|
import org.jetbrains.kotlin.renderer.render
|
||||||
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
|
import org.jetbrains.kotlin.resolve.BindingContext.*
|
||||||
|
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||||
|
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
|
||||||
|
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe
|
||||||
|
|
||||||
|
class PsiRenderer(private val file: KtFile, analysisResult: AnalysisResult): BaseRenderer {
|
||||||
|
val bindingContext = analysisResult.bindingContext
|
||||||
|
private val annotations = mutableListOf<Annotator.AnnotationInfo>()
|
||||||
|
|
||||||
|
val descriptorRenderer: DescriptorRenderer = DescriptorRenderer.withOptions {
|
||||||
|
withDefinedIn = false
|
||||||
|
modifiers = emptySet()
|
||||||
|
receiverAfterName = false
|
||||||
|
startFromName = false
|
||||||
|
withSourceFileForTopLevel = false
|
||||||
|
renderConstructorKeyword = false
|
||||||
|
classifierNamePolicy = ClassifierNamePolicy.SOURCE_CODE_QUALIFIED
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun render(): String {
|
||||||
|
file.accept(Renderer())
|
||||||
|
return annotate(file.text, annotations).joinToString("\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
inner class Renderer : KtVisitorVoid() {
|
||||||
|
override fun visitElement(element: PsiElement) {
|
||||||
|
element.acceptChildren(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun visitKtElement(element: KtElement) {
|
||||||
|
element.acceptChildren(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun visitProperty(property: KtProperty) {
|
||||||
|
val descriptor = bindingContext[VARIABLE, property]
|
||||||
|
annotations.add(Annotator.AnnotationInfo(descriptor?.returnType.toString(), property.nameIdentifier!!.textRange))
|
||||||
|
super.visitProperty(property)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun visitConstantExpression(expression: KtConstantExpression) {
|
||||||
|
val type = bindingContext.getType(expression)
|
||||||
|
annotations.add(Annotator.AnnotationInfo(type.toString(), expression.textRange))
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun visitSimpleNameExpression(expression: KtSimpleNameExpression) {
|
||||||
|
val resolvedCall = bindingContext[RESOLVED_CALL, bindingContext[CALL, expression]]
|
||||||
|
if (resolvedCall == null || resolvedCall.resultingDescriptor == null) {
|
||||||
|
super.visitSimpleNameExpression(expression)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
val annotation = descriptorRenderer.render(resolvedCall.resultingDescriptor)
|
||||||
|
val fqName = DescriptorUtils.getFqName(resolvedCall.resultingDescriptor.containingDeclaration)
|
||||||
|
annotations.add(Annotator.AnnotationInfo("$fqName.$annotation", expression.textRange))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user