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 {
|
buildErrorNamedReference {
|
||||||
source = this@toResolvedReference.source
|
source = this@toResolvedReference.source
|
||||||
diagnostic = this@toResolvedReference.diagnostic
|
diagnostic = this@toResolvedReference.diagnostic
|
||||||
|
candidateSymbol = this@toResolvedReference.candidateSymbol
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
buildResolvedNamedReference {
|
buildResolvedNamedReference {
|
||||||
|
|||||||
+2
@@ -23,11 +23,13 @@ import org.jetbrains.kotlin.name.Name
|
|||||||
@FirBuilderDsl
|
@FirBuilderDsl
|
||||||
class FirErrorNamedReferenceBuilder {
|
class FirErrorNamedReferenceBuilder {
|
||||||
var source: FirSourceElement? = null
|
var source: FirSourceElement? = null
|
||||||
|
var candidateSymbol: AbstractFirBasedSymbol<*>? = null
|
||||||
lateinit var diagnostic: ConeDiagnostic
|
lateinit var diagnostic: ConeDiagnostic
|
||||||
|
|
||||||
fun build(): FirErrorNamedReference {
|
fun build(): FirErrorNamedReference {
|
||||||
return FirErrorNamedReferenceImpl(
|
return FirErrorNamedReferenceImpl(
|
||||||
source,
|
source,
|
||||||
|
candidateSymbol,
|
||||||
diagnostic,
|
diagnostic,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -19,10 +19,10 @@ import org.jetbrains.kotlin.fir.visitors.*
|
|||||||
|
|
||||||
internal class FirErrorNamedReferenceImpl(
|
internal class FirErrorNamedReferenceImpl(
|
||||||
override val source: FirSourceElement?,
|
override val source: FirSourceElement?,
|
||||||
|
override val candidateSymbol: AbstractFirBasedSymbol<*>?,
|
||||||
override val diagnostic: ConeDiagnostic,
|
override val diagnostic: ConeDiagnostic,
|
||||||
) : FirErrorNamedReference() {
|
) : FirErrorNamedReference() {
|
||||||
override val name: Name = Name.special("<${diagnostic.reason}>")
|
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) {}
|
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) {
|
override fun visitNamedReference(namedReference: FirNamedReference) {
|
||||||
val symbol = namedReference.candidateSymbol
|
val symbol = namedReference.candidateSymbol
|
||||||
when {
|
when {
|
||||||
symbol != null -> {
|
|
||||||
print("R?C|${symbol.render()}|")
|
|
||||||
}
|
|
||||||
namedReference is FirErrorNamedReference -> print("<${namedReference.diagnostic.reason}>#")
|
namedReference is FirErrorNamedReference -> print("<${namedReference.diagnostic.reason}>#")
|
||||||
|
symbol != null -> print("R?C|${symbol.render()}|")
|
||||||
else -> print("${namedReference.name}#")
|
else -> print("${namedReference.name}#")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
-1
@@ -423,7 +423,6 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
|
|||||||
|
|
||||||
impl(errorNamedReference) {
|
impl(errorNamedReference) {
|
||||||
default("name", "Name.special(\"<\${diagnostic.reason}>\")")
|
default("name", "Name.special(\"<\${diagnostic.reason}>\")")
|
||||||
defaultNull("candidateSymbol", withGetter = true)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl(typeProjection, "FirTypePlaceholderProjection") {
|
impl(typeProjection, "FirTypePlaceholderProjection") {
|
||||||
|
|||||||
Reference in New Issue
Block a user