[FIR] Render full declaration header in diagnostic messages

This commit is contained in:
Dmitriy Novozhilov
2022-02-15 12:09:53 +03:00
committed by teamcity
parent 2fa6425965
commit 23af5510a6
15 changed files with 47 additions and 22 deletions
@@ -23,10 +23,11 @@ import org.jetbrains.kotlin.fir.types.render
import org.jetbrains.kotlin.name.CallableId
object FirDiagnosticRenderers {
@OptIn(SymbolInternals::class)
val SYMBOL = Renderer { symbol: FirBasedSymbol<*> ->
when (symbol) {
is FirClassLikeSymbol<*> -> symbol.classId.asString()
is FirCallableSymbol<*> -> symbol.callableId.toString()
is FirClassLikeSymbol<*>,
is FirCallableSymbol<*> -> symbol.fir.render(FirRenderer.RenderMode.DeclarationHeader)
is FirTypeParameterSymbol -> symbol.name.asString()
else -> "???"
}
@@ -64,6 +64,8 @@ open class FirRenderer(builder: StringBuilder, protected val mode: RenderMode =
val renderDeclarationAttributes: Boolean = false,
val renderDeclarationOrigin: Boolean = false,
val renderPackageDirective: Boolean = false,
val renderNestedDeclarations: Boolean = true,
val renderDefaultParameterValues: Boolean = true,
) {
companion object {
val Normal = RenderMode(
@@ -109,6 +111,21 @@ open class FirRenderer(builder: StringBuilder, protected val mode: RenderMode =
renderPropertyAccessors = false,
)
val DeclarationHeader = RenderMode(
renderLambdaBodies = false,
renderCallArguments = false,
renderCallableFqNames = false,
renderDeclarationResolvePhase = false,
renderAnnotation = true,
renderBodies = false,
renderPropertyAccessors = false,
renderDeclarationAttributes = false,
renderDeclarationOrigin = false,
renderPackageDirective = false,
renderNestedDeclarations = false,
renderDefaultParameterValues = false,
)
val WithDeclarationAttributes = RenderMode(
renderLambdaBodies = true,
renderCallArguments = true,
@@ -477,7 +494,9 @@ open class FirRenderer(builder: StringBuilder, protected val mode: RenderMode =
}
protected open fun renderClassDeclarations(regularClass: FirRegularClass) {
regularClass.declarations.renderDeclarations()
if (mode.renderNestedDeclarations) {
regularClass.declarations.renderDeclarations()
}
}
override fun visitEnumEntry(enumEntry: FirEnumEntry) {
@@ -584,7 +603,7 @@ open class FirRenderer(builder: StringBuilder, protected val mode: RenderMode =
constructor.returnTypeRef.accept(this)
val body = constructor.body
val delegatedConstructor = constructor.delegatedConstructor
if (body == null) {
if (body == null && mode.renderBodies) {
if (delegatedConstructor != null) {
renderInBraces {
delegatedConstructor.accept(this)
@@ -740,7 +759,11 @@ open class FirRenderer(builder: StringBuilder, protected val mode: RenderMode =
valueParameter.returnTypeRef.accept(this)
valueParameter.defaultValue?.let {
print(" = ")
it.accept(this)
if (mode.renderDefaultParameterValues) {
it.accept(this)
} else {
print("...")
}
}
}
@@ -11,9 +11,10 @@ compiler or generated code. Use it at your own risk!
warning: ATTENTION!
This build uses in-dev FIR:
-Xuse-fir
compiler/testData/cli/jvm/firMultiplatformCompilationWithError/jvm.kt:1:18: error: actual class 'A' has no corresponding members for expected class members:
compiler/testData/cli/jvm/firMultiplatformCompilationWithError/jvm.kt:1:18: error: actual class 'public abstract actual interface A : R|kotlin/Any|' has no corresponding members for expected class members:
public abstract expect fun foo(): R|kotlin/Unit|
/A.foo
actual interface A
^