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:
+1
@@ -633,6 +633,7 @@ class FirCallCompletionResultsWriterTransformer(
|
||||
buildErrorNamedReference {
|
||||
source = this@toResolvedReference.source
|
||||
diagnostic = this@toResolvedReference.diagnostic
|
||||
candidateSymbol = this@toResolvedReference.candidateSymbol
|
||||
}
|
||||
} else {
|
||||
buildResolvedNamedReference {
|
||||
|
||||
+2
@@ -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,
|
||||
)
|
||||
}
|
||||
|
||||
+1
-1
@@ -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}#")
|
||||
}
|
||||
}
|
||||
|
||||
-1
@@ -423,7 +423,6 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
|
||||
|
||||
impl(errorNamedReference) {
|
||||
default("name", "Name.special(\"<\${diagnostic.reason}>\")")
|
||||
defaultNull("candidateSymbol", withGetter = true)
|
||||
}
|
||||
|
||||
impl(typeProjection, "FirTypePlaceholderProjection") {
|
||||
|
||||
Reference in New Issue
Block a user