FIR Preserve nullability of ConeErrorType when possible

This commit is contained in:
Pavel Mikhailovskii
2023-06-16 08:09:04 +00:00
committed by Space Team
parent 217550d10e
commit 16644c1a3b
3 changed files with 11 additions and 2 deletions
@@ -9,6 +9,10 @@ interface ConeDiagnostic {
val reason: String val reason: String
} }
interface ConeDiagnosticWithNullability : ConeDiagnostic {
val isNullable: Boolean
}
class ConeStubDiagnostic(val original: ConeDiagnostic) : ConeDiagnostic { class ConeStubDiagnostic(val original: ConeDiagnostic) : ConeDiagnostic {
override val reason: String get() = original.reason override val reason: String get() = original.reason
} }
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.fir.types package org.jetbrains.kotlin.fir.types
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnosticWithNullability
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
import org.jetbrains.kotlin.fir.symbols.ConeClassifierLookupTag import org.jetbrains.kotlin.fir.symbols.ConeClassifierLookupTag
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
@@ -50,7 +51,9 @@ class ConeErrorType(
get() = ConeClassLikeErrorLookupTag(ClassId.fromString("<error>")) get() = ConeClassLikeErrorLookupTag(ClassId.fromString("<error>"))
override val nullability: ConeNullability override val nullability: ConeNullability
get() = ConeNullability.UNKNOWN get() = if (diagnostic is ConeDiagnosticWithNullability) {
if (diagnostic.isNullable) ConeNullability.NULLABLE else ConeNullability.NOT_NULL
} else ConeNullability.UNKNOWN
override fun equals(other: Any?) = this === other override fun equals(other: Any?) = this === other
override fun hashCode(): Int = System.identityHashCode(this) override fun hashCode(): Int = System.identityHashCode(this)
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.contracts.description.ConeContractDescriptionElement import org.jetbrains.kotlin.fir.contracts.description.ConeContractDescriptionElement
import org.jetbrains.kotlin.fir.declarations.FirVariable import org.jetbrains.kotlin.fir.declarations.FirVariable
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnosticWithNullability
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnosticWithSource import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnosticWithSource
import org.jetbrains.kotlin.fir.expressions.FirConstExpression import org.jetbrains.kotlin.fir.expressions.FirConstExpression
import org.jetbrains.kotlin.fir.expressions.FirOperation import org.jetbrains.kotlin.fir.expressions.FirOperation
@@ -58,7 +59,8 @@ class ConeUnresolvedSymbolError(val classId: ClassId) : ConeUnresolvedError {
override val reason: String get() = "Symbol not found for $classId" override val reason: String get() = "Symbol not found for $classId"
} }
class ConeUnresolvedTypeQualifierError(val qualifiers: List<FirQualifierPart>, val isNullable: Boolean) : ConeUnresolvedError { class ConeUnresolvedTypeQualifierError(val qualifiers: List<FirQualifierPart>, override val isNullable: Boolean)
: ConeUnresolvedError, ConeDiagnosticWithNullability {
override val qualifier: String get() = qualifiers.joinToString(separator = ".") { it.name.asString() } override val qualifier: String get() = qualifiers.joinToString(separator = ".") { it.name.asString() }
override val reason: String get() = "Symbol not found for $qualifier${if (isNullable) "?" else ""}" override val reason: String get() = "Symbol not found for $qualifier${if (isNullable) "?" else ""}"
} }