FIR: Attach candidate symbol to the ErrorNamedReference

This allows to restore the referenced candidate in cases when there are
no ambiguity

Also, change rendering of named references to be more accurate, so the
diagnostics tests pass: if reference is FirErrorNamedReference, it is
more important than if it has a not-null `candidateSymbol`
This commit is contained in:
Roman Golyshev
2021-01-19 16:13:42 +03:00
committed by Space
parent 51c59e5634
commit 88e7d1e5ee
5 changed files with 5 additions and 5 deletions
@@ -633,6 +633,7 @@ class FirCallCompletionResultsWriterTransformer(
buildErrorNamedReference {
source = this@toResolvedReference.source
diagnostic = this@toResolvedReference.diagnostic
candidateSymbol = this@toResolvedReference.candidateSymbol
}
} else {
buildResolvedNamedReference {
@@ -23,11 +23,13 @@ import org.jetbrains.kotlin.name.Name
@FirBuilderDsl
class FirErrorNamedReferenceBuilder {
var source: FirSourceElement? = null
var candidateSymbol: AbstractFirBasedSymbol<*>? = null
lateinit var diagnostic: ConeDiagnostic
fun build(): FirErrorNamedReference {
return FirErrorNamedReferenceImpl(
source,
candidateSymbol,
diagnostic,
)
}
@@ -19,10 +19,10 @@ import org.jetbrains.kotlin.fir.visitors.*
internal class FirErrorNamedReferenceImpl(
override val source: FirSourceElement?,
override val candidateSymbol: AbstractFirBasedSymbol<*>?,
override val diagnostic: ConeDiagnostic,
) : FirErrorNamedReference() {
override val name: Name = Name.special("<${diagnostic.reason}>")
override val candidateSymbol: AbstractFirBasedSymbol<*>? get() = null
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {}
@@ -969,10 +969,8 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM
override fun visitNamedReference(namedReference: FirNamedReference) {
val symbol = namedReference.candidateSymbol
when {
symbol != null -> {
print("R?C|${symbol.render()}|")
}
namedReference is FirErrorNamedReference -> print("<${namedReference.diagnostic.reason}>#")
symbol != null -> print("R?C|${symbol.render()}|")
else -> print("${namedReference.name}#")
}
}
@@ -423,7 +423,6 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
impl(errorNamedReference) {
default("name", "Name.special(\"<\${diagnostic.reason}>\")")
defaultNull("candidateSymbol", withGetter = true)
}
impl(typeProjection, "FirTypePlaceholderProjection") {