[FIR] Accept opt-in annotations on primary ctor params of properties

For backward compatibility with K1.

KT-56177
This commit is contained in:
Kirill Rakhman
2023-02-27 17:09:25 +01:00
committed by Space Team
parent cfc5bb74ef
commit fbc0796ed2
7 changed files with 61 additions and 4 deletions
@@ -38886,6 +38886,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag
runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/overrideInAnonymousObject.kt"); runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/overrideInAnonymousObject.kt");
} }
@Test
@TestMetadata("overrideInPrimaryConstructor.kt")
public void testOverrideInPrimaryConstructor() throws Exception {
runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/overrideInPrimaryConstructor.kt");
}
@Test @Test
@TestMetadata("subClassOptInModality.kt") @TestMetadata("subClassOptInModality.kt")
public void testSubClassOptInModality() throws Exception { public void testSubClassOptInModality() throws Exception {
@@ -38886,6 +38886,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir
runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/overrideInAnonymousObject.kt"); runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/overrideInAnonymousObject.kt");
} }
@Test
@TestMetadata("overrideInPrimaryConstructor.kt")
public void testOverrideInPrimaryConstructor() throws Exception {
runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/overrideInPrimaryConstructor.kt");
}
@Test @Test
@TestMetadata("subClassOptInModality.kt") @TestMetadata("subClassOptInModality.kt")
public void testSubClassOptInModality() throws Exception { public void testSubClassOptInModality() throws Exception {
@@ -38982,6 +38982,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia
runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/overrideInAnonymousObject.kt"); runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/overrideInAnonymousObject.kt");
} }
@Test
@TestMetadata("overrideInPrimaryConstructor.kt")
public void testOverrideInPrimaryConstructor() throws Exception {
runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/overrideInPrimaryConstructor.kt");
}
@Test @Test
@TestMetadata("subClassOptInModality.kt") @TestMetadata("subClassOptInModality.kt")
public void testSubClassOptInModality() throws Exception { public void testSubClassOptInModality() throws Exception {
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.fir.analysis.checkers.*
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.correspondingValueParameterFromPrimaryConstructor
import org.jetbrains.kotlin.fir.expressions.FirConstExpression import org.jetbrains.kotlin.fir.expressions.FirConstExpression
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
import org.jetbrains.kotlin.fir.references.resolved import org.jetbrains.kotlin.fir.references.resolved
@@ -329,8 +330,22 @@ object FirOptInUsageBaseChecker {
annotationClassId: ClassId, annotationClassId: ClassId,
fromSupertype: Boolean fromSupertype: Boolean
): Boolean { ): Boolean {
return getAnnotationByClassId(annotationClassId, session) != null || isAnnotatedWithOptIn(annotationClassId, session) || return getAnnotationByClassId(annotationClassId, session) != null ||
fromSupertype && isAnnotatedWithSubclassOptInRequired(session, annotationClassId) isAnnotatedWithOptIn(annotationClassId, session) ||
fromSupertype && isAnnotatedWithSubclassOptInRequired(session, annotationClassId) ||
// Technically wrong but required for K1 compatibility
primaryConstructorParameterIsExperimentalityAcceptable(session, annotationClassId)
}
@OptIn(SymbolInternals::class)
private fun FirAnnotationContainer.primaryConstructorParameterIsExperimentalityAcceptable(
session: FirSession,
annotationClassId: ClassId
): Boolean {
if (this !is FirProperty) return false
val parameterSymbol = correspondingValueParameterFromPrimaryConstructor ?: return false
return parameterSymbol.fir.isExperimentalityAcceptable(session, annotationClassId, fromSupertype = false)
} }
private fun FirAnnotationContainer.isAnnotatedWithOptIn(annotationClassId: ClassId, session: FirSession): Boolean { private fun FirAnnotationContainer.isAnnotatedWithOptIn(annotationClassId: ClassId, session: FirSession): Boolean {
@@ -120,9 +120,12 @@ fun FirDeclaration.getDanglingTypeConstraintsOrEmpty(): List<DanglingTypeConstra
} }
val FirPropertySymbol.correspondingValueParameterFromPrimaryConstructor: FirValueParameterSymbol? val FirPropertySymbol.correspondingValueParameterFromPrimaryConstructor: FirValueParameterSymbol?
get() = fir.correspondingValueParameterFromPrimaryConstructor
val FirProperty.correspondingValueParameterFromPrimaryConstructor: FirValueParameterSymbol?
get() { get() {
if (!fromPrimaryConstructor) return null if (fromPrimaryConstructor != true) return null
val initializer = resolvedInitializer as? FirPropertyAccessExpression ?: return null val initializer = initializer as? FirPropertyAccessExpression ?: return null
val reference = initializer.calleeReference as? FirPropertyFromParameterResolvedNamedReference ?: return null val reference = initializer.calleeReference as? FirPropertyFromParameterResolvedNamedReference ?: return null
return reference.resolvedSymbol as? FirValueParameterSymbol return reference.resolvedSymbol as? FirValueParameterSymbol
} }
@@ -0,0 +1,15 @@
// SKIP_TXT
// FIR_IDENTICAL
@RequiresOptIn(level = RequiresOptIn.Level.ERROR)
annotation class E
abstract class Foo {
@E
abstract val bar: String
}
class SubFoo(
@OptIn(E::class)
override val bar: String,
) : Foo()
@@ -38982,6 +38982,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/overrideInAnonymousObject.kt"); runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/overrideInAnonymousObject.kt");
} }
@Test
@TestMetadata("overrideInPrimaryConstructor.kt")
public void testOverrideInPrimaryConstructor() throws Exception {
runTest("compiler/testData/diagnostics/testsWithStdLib/experimental/overrideInPrimaryConstructor.kt");
}
@Test @Test
@TestMetadata("subClassOptInModality.kt") @TestMetadata("subClassOptInModality.kt")
public void testSubClassOptInModality() throws Exception { public void testSubClassOptInModality() throws Exception {