From 34c739789f46206048282e9338e201b93f237655 Mon Sep 17 00:00:00 2001 From: aleksandrina-streltsova Date: Tue, 14 Mar 2023 11:08:27 +0200 Subject: [PATCH] [AA] Fix rendering for type variable with "Type is not inferred" It is required to show type variable name instead of ERROR in completion ^KTIJ-20913 --- .../kotlin/analysis/api/fir/types/KtFirTypeErrorType.kt | 2 ++ .../analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt | 1 + .../kotlin/fir/resolve/substitution/Substitutors.kt | 3 ++- .../kotlin/fir/diagnostics/ConeSimpleDiagnostic.kt | 6 ++++++ 4 files changed, 11 insertions(+), 1 deletion(-) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/types/KtFirTypeErrorType.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/types/KtFirTypeErrorType.kt index cf7326eb187..c79e73b6cb9 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/types/KtFirTypeErrorType.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/types/KtFirTypeErrorType.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.api.types.KtTypeErrorType import org.jetbrains.kotlin.analysis.api.types.KtTypeNullability import org.jetbrains.kotlin.fir.diagnostics.ConeCannotInferTypeParameterType +import org.jetbrains.kotlin.fir.diagnostics.ConeTypeVariableTypeIsNotInferred import org.jetbrains.kotlin.fir.types.ConeErrorType import org.jetbrains.kotlin.fir.types.renderForDebugging @@ -29,6 +30,7 @@ internal class KtFirTypeErrorType( override fun tryRenderAsNonErrorType(): String? = withValidityAssertion { when (val diagnostic = coneType.diagnostic) { is ConeCannotInferTypeParameterType -> diagnostic.typeParameter.name.asString() + is ConeTypeVariableTypeIsNotInferred -> diagnostic.typeVariableType.lookupTag.debugName else -> null } } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt index 90ca06a0b8d..f78248ab098 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt @@ -110,6 +110,7 @@ private fun ConeDiagnostic.toKtDiagnostic( is ConeDestructuringDeclarationsOnTopLevel -> FirSyntaxErrors.SYNTAX.createOn(source) is ConeCannotInferTypeParameterType -> FirErrors.CANNOT_INFER_PARAMETER_TYPE.createOn(source) is ConeCannotInferValueParameterType -> FirErrors.CANNOT_INFER_PARAMETER_TYPE.createOn(source) + is ConeTypeVariableTypeIsNotInferred -> FirErrors.INFERENCE_ERROR.createOn(qualifiedAccessSource ?: source) is ConeInstanceAccessBeforeSuperCall -> FirErrors.INSTANCE_ACCESS_BEFORE_SUPER_CALL.createOn(source, this.target) is ConeStubDiagnostic -> null is ConeIntermediateDiagnostic -> null diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/substitution/Substitutors.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/substitution/Substitutors.kt index f39e080287f..ae94f6f689b 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/substitution/Substitutors.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/substitution/Substitutors.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.resolve.substitution import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic +import org.jetbrains.kotlin.fir.diagnostics.ConeTypeVariableTypeIsNotInferred import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind import org.jetbrains.kotlin.fir.resolve.fullyExpandedType import org.jetbrains.kotlin.fir.resolve.toFirRegularClassSymbol @@ -320,7 +321,7 @@ class ConeStubAndTypeVariableToErrorTypeSubstitutor( override fun substituteType(type: ConeKotlinType): ConeKotlinType? { return when (type) { is ConeTypeVariableType -> ConeErrorType( - ConeSimpleDiagnostic("Type for ${type.lookupTag.debugName} is not inferred", DiagnosticKind.InferenceError), + ConeTypeVariableTypeIsNotInferred(type), isUninferredParameter = true ) is ConeStubType -> runIf(type.constructor in stubTypesToReplace) { diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/diagnostics/ConeSimpleDiagnostic.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/diagnostics/ConeSimpleDiagnostic.kt index 827432c355e..45423ea105b 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/diagnostics/ConeSimpleDiagnostic.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/diagnostics/ConeSimpleDiagnostic.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.builtins.functions.FunctionTypeKind import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirValueParameterSymbol import org.jetbrains.kotlin.fir.types.ConeKotlinType +import org.jetbrains.kotlin.fir.types.ConeTypeVariableType import org.jetbrains.kotlin.name.Name class ConeSimpleDiagnostic(override val reason: String, val kind: DiagnosticKind = DiagnosticKind.Other) : ConeDiagnostic @@ -34,6 +35,11 @@ class ConeCannotInferValueParameterType( override val reason: String = "Cannot infer type for parameter ${valueParameter.name}" ) : ConeDiagnostic +class ConeTypeVariableTypeIsNotInferred( + val typeVariableType: ConeTypeVariableType, + override val reason: String = "Type for ${typeVariableType.lookupTag.debugName} is not inferred" +) : ConeDiagnostic + class ConeUnderscoreUsageWithoutBackticks(source: KtSourceElement) : ConeDiagnosticWithSource(source) { override val reason: String get() = "Names _, __, ___, ... can be used only in back-ticks (`_`, `__`, `___`, ...)" }