From 23af5510a652ba5565359f48117768b7a236e6c1 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Tue, 15 Feb 2022 12:09:53 +0300 Subject: [PATCH] [FIR] Render full declaration header in diagnostic messages --- .../callResolver/resolveCall/ambiguous.txt | 2 +- .../resolveCall/ambiguousImplicitInvoke.txt | 2 +- .../ambiguousWithExplicitTypeParameters.txt | 2 +- .../ambiguousWithInferredTypeParameters.txt | 2 +- ...legatedConstructorCall_this_unresolved.txt | 2 +- .../resolveCall/hiddenConstructor.txt | 2 +- .../resolveCall/privateMember.txt | 2 +- .../consecutiveImplicitInvoke1.txt | 4 +-- .../consecutiveImplicitInvoke2.txt | 4 +-- .../consecutiveImplicitInvoke3.txt | 4 +-- .../singleCandidate/hiddenConstructor.txt | 2 +- .../singleCandidate/privateMember.txt | 2 +- .../diagnostics/FirDiagnosticRenderers.kt | 5 ++-- .../org/jetbrains/kotlin/fir/FirRenderer.kt | 29 +++++++++++++++++-- .../firMultiplatformCompilationWithError.out | 5 ++-- 15 files changed, 47 insertions(+), 22 deletions(-) diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/ambiguous.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/ambiguous.txt index 3a6ef49f34f..a940dee20e2 100644 --- a/analysis/analysis-api/testData/components/callResolver/resolveCall/ambiguous.txt +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/ambiguous.txt @@ -70,4 +70,4 @@ KtErrorCallInfo: symbol = c: kotlin.String) } ] - diagnostic = ERROR + diagnostic = ERROR diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/ambiguousImplicitInvoke.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/ambiguousImplicitInvoke.txt index 6fabb39d6df..a1e8c7d0a8e 100644 --- a/analysis/analysis-api/testData/components/callResolver/resolveCall/ambiguousImplicitInvoke.txt +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/ambiguousImplicitInvoke.txt @@ -39,4 +39,4 @@ KtErrorCallInfo: ] argumentMapping = {} ] - diagnostic = ERROR/invoke, /invoke]> \ No newline at end of file + diagnostic = ERROR diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/ambiguousWithExplicitTypeParameters.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/ambiguousWithExplicitTypeParameters.txt index 7f16f5d2264..4dd922560f5 100644 --- a/analysis/analysis-api/testData/components/callResolver/resolveCall/ambiguousWithExplicitTypeParameters.txt +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/ambiguousWithExplicitTypeParameters.txt @@ -85,4 +85,4 @@ KtErrorCallInfo: symbol = v: V) } ] - diagnostic = ERROR \ No newline at end of file + diagnostic = ERROR function(t: R|T|, a: R|kotlin/Char|): R|kotlin/Unit|, public final fun function(u: R|U|, b: R|kotlin/Boolean|): R|kotlin/Unit|, public final fun function(v: R|V|, c: R|kotlin/String|): R|kotlin/Unit|]> diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/ambiguousWithInferredTypeParameters.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/ambiguousWithInferredTypeParameters.txt index 9455042beb7..8edcbf47bc7 100644 --- a/analysis/analysis-api/testData/components/callResolver/resolveCall/ambiguousWithInferredTypeParameters.txt +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/ambiguousWithInferredTypeParameters.txt @@ -85,4 +85,4 @@ KtErrorCallInfo: symbol = v: V) } ] - diagnostic = ERROR + diagnostic = ERROR function(t: R|T|, a: R|kotlin/Char|): R|kotlin/Unit|, public final fun function(u: R|U|, b: R|kotlin/Boolean|): R|kotlin/Unit|, public final fun function(v: R|V|, c: R|kotlin/String|): R|kotlin/Unit|]> diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/delegatedConstructorCall_this_unresolved.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/delegatedConstructorCall_this_unresolved.txt index 56b62096a57..1dbc5f47961 100644 --- a/analysis/analysis-api/testData/components/callResolver/resolveCall/delegatedConstructorCall_this_unresolved.txt +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/delegatedConstructorCall_this_unresolved.txt @@ -40,4 +40,4 @@ KtErrorCallInfo: ] argumentMapping = {} ] - diagnostic = ERROR + diagnostic = ERROR diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/hiddenConstructor.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/hiddenConstructor.txt index 36ab8175484..3cd6a4cc960 100644 --- a/analysis/analysis-api/testData/components/callResolver/resolveCall/hiddenConstructor.txt +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/hiddenConstructor.txt @@ -12,4 +12,4 @@ KtErrorCallInfo: valueParameters = [] argumentMapping = {} ] - diagnostic = ERROR \ No newline at end of file + diagnostic = ERROR diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/privateMember.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/privateMember.txt index 19b5ea45b33..ff6aeeabfe1 100644 --- a/analysis/analysis-api/testData/components/callResolver/resolveCall/privateMember.txt +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/privateMember.txt @@ -14,4 +14,4 @@ KtErrorCallInfo: valueParameters = [] argumentMapping = {} ] - diagnostic = ERROR \ No newline at end of file + diagnostic = ERROR diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/consecutiveImplicitInvoke1.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/consecutiveImplicitInvoke1.txt index 3eab53c92e2..7e078d5609e 100644 --- a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/consecutiveImplicitInvoke1.txt +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/consecutiveImplicitInvoke1.txt @@ -1,5 +1,5 @@ KtInapplicableCallCandidateInfo: - diagnostic = ERROR + diagnostic = ERROR candidate = KtSimpleFunctionCall: isImplicitInvoke = true partiallyAppliedSymbol = KtPartiallyAppliedSymbol: @@ -32,7 +32,7 @@ KtApplicableCallCandidateInfo: isInBestCandidates = true KtInapplicableCallCandidateInfo: - diagnostic = ERROR + diagnostic = ERROR candidate = KtSimpleFunctionCall: isImplicitInvoke = true partiallyAppliedSymbol = KtPartiallyAppliedSymbol: diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/consecutiveImplicitInvoke2.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/consecutiveImplicitInvoke2.txt index 5c47b715e0c..99b4a201be6 100644 --- a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/consecutiveImplicitInvoke2.txt +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/consecutiveImplicitInvoke2.txt @@ -1,5 +1,5 @@ KtInapplicableCallCandidateInfo: - diagnostic = ERROR + diagnostic = ERROR candidate = KtSimpleFunctionCall: isImplicitInvoke = true partiallyAppliedSymbol = KtPartiallyAppliedSymbol: @@ -16,7 +16,7 @@ KtInapplicableCallCandidateInfo: isInBestCandidates = false KtInapplicableCallCandidateInfo: - diagnostic = ERROR + diagnostic = ERROR candidate = KtSimpleFunctionCall: isImplicitInvoke = true partiallyAppliedSymbol = KtPartiallyAppliedSymbol: diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/consecutiveImplicitInvoke3.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/consecutiveImplicitInvoke3.txt index ec7ef410649..8177727d061 100644 --- a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/consecutiveImplicitInvoke3.txt +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/consecutiveImplicitInvoke3.txt @@ -15,7 +15,7 @@ KtApplicableCallCandidateInfo: isInBestCandidates = true KtInapplicableCallCandidateInfo: - diagnostic = ERROR + diagnostic = ERROR candidate = KtSimpleFunctionCall: isImplicitInvoke = true partiallyAppliedSymbol = KtPartiallyAppliedSymbol: @@ -32,7 +32,7 @@ KtInapplicableCallCandidateInfo: isInBestCandidates = false KtInapplicableCallCandidateInfo: - diagnostic = ERROR + diagnostic = ERROR candidate = KtSimpleFunctionCall: isImplicitInvoke = true partiallyAppliedSymbol = KtPartiallyAppliedSymbol: diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/hiddenConstructor.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/hiddenConstructor.txt index 6833a70a5b6..5e39e4587aa 100644 --- a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/hiddenConstructor.txt +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/hiddenConstructor.txt @@ -1,5 +1,5 @@ KtInapplicableCallCandidateInfo: - diagnostic = ERROR + diagnostic = ERROR candidate = KtSimpleFunctionCall: isImplicitInvoke = false partiallyAppliedSymbol = KtPartiallyAppliedSymbol: diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/privateMember.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/privateMember.txt index 2160a7b6fe9..1dea7f18aa4 100644 --- a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/privateMember.txt +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/privateMember.txt @@ -1,5 +1,5 @@ KtInapplicableCallCandidateInfo: - diagnostic = ERROR + diagnostic = ERROR candidate = KtSimpleFunctionCall: isImplicitInvoke = false partiallyAppliedSymbol = KtPartiallyAppliedSymbol: diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticRenderers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticRenderers.kt index b461a58eaae..7810120169e 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticRenderers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticRenderers.kt @@ -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 -> "???" } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt index 7649e1b26ae..53da2257374 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt @@ -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("...") + } } } diff --git a/compiler/testData/cli/jvm/firMultiplatformCompilationWithError.out b/compiler/testData/cli/jvm/firMultiplatformCompilationWithError.out index 2805fee94f1..bddab365a06 100644 --- a/compiler/testData/cli/jvm/firMultiplatformCompilationWithError.out +++ b/compiler/testData/cli/jvm/firMultiplatformCompilationWithError.out @@ -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 ^