[FIR] Add ability to extract functional type kind from annotation on functional literal type

This commit is contained in:
Dmitriy Novozhilov
2023-01-20 16:04:20 +02:00
committed by Space Team
parent d1b797ed97
commit b48751ec9c
13 changed files with 83 additions and 37 deletions
@@ -9,6 +9,7 @@ import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.analysis.api.symbols.*
import org.jetbrains.kotlin.analysis.api.types.KtType
import org.jetbrains.kotlin.builtins.functions.FunctionalTypeKind
import org.jetbrains.kotlin.config.ApiVersion
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.LanguageVersionSettings
@@ -365,6 +366,7 @@ internal object FirToKtConversionCreator {
ApiVersion::class,
CallableId::class,
ClassKind::class,
FunctionalTypeKind::class,
)
private val KType.kClass: KClass<*>
@@ -1814,6 +1814,15 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
token,
)
}
add(FirErrors.AMBIGUOUS_FUNCTIONAL_TYPE_KIND) { firDiagnostic ->
AmbiguousFunctionalTypeKindImpl(
firDiagnostic.a.map { functionalTypeKind ->
functionalTypeKind
},
firDiagnostic as KtPsiDiagnostic,
token,
)
}
add(FirErrors.NO_CONTEXT_RECEIVER) { firDiagnostic ->
NoContextReceiverImpl(
firSymbolBuilder.typeBuilder.buildKtType(firDiagnostic.a),
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtVariableLikeSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtVariableSymbol
import org.jetbrains.kotlin.analysis.api.types.KtType
import org.jetbrains.kotlin.builtins.functions.FunctionalTypeKind
import org.jetbrains.kotlin.config.ApiVersion
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.LanguageVersionSettings
@@ -1292,6 +1293,11 @@ sealed class KtFirDiagnostic<PSI : PsiElement> : KtDiagnosticWithPsi<PSI> {
abstract val candidates: List<KtSymbol>
}
abstract class AmbiguousFunctionalTypeKind : KtFirDiagnostic<PsiElement>() {
override val diagnosticClass get() = AmbiguousFunctionalTypeKind::class
abstract val kinds: List<FunctionalTypeKind>
}
abstract class NoContextReceiver : KtFirDiagnostic<KtElement>() {
override val diagnosticClass get() = NoContextReceiver::class
abstract val contextReceiverRepresentation: KtType
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtVariableLikeSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtVariableSymbol
import org.jetbrains.kotlin.analysis.api.types.KtType
import org.jetbrains.kotlin.builtins.functions.FunctionalTypeKind
import org.jetbrains.kotlin.config.ApiVersion
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.LanguageVersionSettings
@@ -1552,6 +1553,12 @@ internal class NextAmbiguityImpl(
override val token: KtLifetimeToken,
) : KtFirDiagnostic.NextAmbiguity(), KtAbstractFirDiagnostic<PsiElement>
internal class AmbiguousFunctionalTypeKindImpl(
override val kinds: List<FunctionalTypeKind>,
override val firDiagnostic: KtPsiDiagnostic,
override val token: KtLifetimeToken,
) : KtFirDiagnostic.AmbiguousFunctionalTypeKind(), KtAbstractFirDiagnostic<PsiElement>
internal class NoContextReceiverImpl(
override val contextReceiverRepresentation: KtType,
override val firDiagnostic: KtPsiDiagnostic,