[FIR] KT-54410: Report API_NOT_AVAILABLE for classifiers

Callable symbols with SinceKotlin are filtered out by a
resolution stage, but in K1 classifiers and property accessors
report API_NOT_AVAILABLE. K2 filters out properties with
unavailable accessors, but does nothing for classifiers.
This change fixes it.

^KT-54410 Fixed
This commit is contained in:
Nikolay Lunyak
2023-01-18 19:13:42 +02:00
committed by Space Team
parent fd52cc4224
commit 9be819087a
22 changed files with 144 additions and 12 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.config.ApiVersion
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.contracts.description.EventOccurrencesRange
@@ -361,6 +362,7 @@ internal object FirToKtConversionCreator {
FirModuleData::class,
ExpectActualCompatibility.Incompatible::class,
DeprecationInfo::class,
ApiVersion::class,
CallableId::class,
ClassKind::class,
)
@@ -313,6 +313,14 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
token,
)
}
add(FirErrors.API_NOT_AVAILABLE) { firDiagnostic ->
ApiNotAvailableImpl(
firDiagnostic.a,
firDiagnostic.b,
firDiagnostic as KtPsiDiagnostic,
token,
)
}
add(FirErrors.UNRESOLVED_REFERENCE_WRONG_RECEIVER) { firDiagnostic ->
UnresolvedReferenceWrongReceiverImpl(
firDiagnostic.a.map { firBasedSymbol ->
@@ -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.config.ApiVersion
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.contracts.description.EventOccurrencesRange
@@ -256,6 +257,12 @@ sealed class KtFirDiagnostic<PSI : PsiElement> : KtDiagnosticWithPsi<PSI> {
abstract val message: String
}
abstract class ApiNotAvailable : KtFirDiagnostic<PsiElement>() {
override val diagnosticClass get() = ApiNotAvailable::class
abstract val sinceKotlinVersion: ApiVersion
abstract val currentVersion: ApiVersion
}
abstract class UnresolvedReferenceWrongReceiver : KtFirDiagnostic<PsiElement>() {
override val diagnosticClass get() = UnresolvedReferenceWrongReceiver::class
abstract val candidates: List<KtSymbol>
@@ -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.config.ApiVersion
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.contracts.description.EventOccurrencesRange
@@ -294,6 +295,13 @@ internal class DeprecationImpl(
override val token: KtLifetimeToken,
) : KtFirDiagnostic.Deprecation(), KtAbstractFirDiagnostic<PsiElement>
internal class ApiNotAvailableImpl(
override val sinceKotlinVersion: ApiVersion,
override val currentVersion: ApiVersion,
override val firDiagnostic: KtPsiDiagnostic,
override val token: KtLifetimeToken,
) : KtFirDiagnostic.ApiNotAvailable(), KtAbstractFirDiagnostic<PsiElement>
internal class UnresolvedReferenceWrongReceiverImpl(
override val candidates: List<KtSymbol>,
override val firDiagnostic: KtPsiDiagnostic,
@@ -35349,6 +35349,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag
runTest("compiler/testData/diagnostics/testsWithStdLib/jvmFieldAndJavaGetter.kt");
}
@Test
@TestMetadata("kt54410.kt")
public void testKt54410() throws Exception {
runTest("compiler/testData/diagnostics/testsWithStdLib/kt54410.kt");
}
@Test
@TestMetadata("kt8050.kt")
public void testKt8050() throws Exception {