[FIR] Don't expand typealiases when checking for DeprecatedSinceKotlin

During serialization, this can lead to a cycle resulting in a Stack
Overflow.

#KT-58356 Fixed
This commit is contained in:
Kirill Rakhman
2023-06-20 11:27:09 +02:00
committed by Space Team
parent da884bd554
commit c867a4b52f
17 changed files with 115 additions and 8 deletions
@@ -18429,6 +18429,12 @@ public class FirLightTreeBlackBoxCodegenTestGenerated extends AbstractFirLightTr
runTest("compiler/testData/codegen/box/fir/delegatedAndDataTogether.kt");
}
@Test
@TestMetadata("deserializedOptInDeprecated.kt")
public void testDeserializedOptInDeprecated() throws Exception {
runTest("compiler/testData/codegen/box/fir/deserializedOptInDeprecated.kt");
}
@Test
@TestMetadata("differentSinceKotlin.kt")
public void testDifferentSinceKotlin() throws Exception {
@@ -18429,6 +18429,12 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo
runTest("compiler/testData/codegen/box/fir/delegatedAndDataTogether.kt");
}
@Test
@TestMetadata("deserializedOptInDeprecated.kt")
public void testDeserializedOptInDeprecated() throws Exception {
runTest("compiler/testData/codegen/box/fir/deserializedOptInDeprecated.kt");
}
@Test
@TestMetadata("differentSinceKotlin.kt")
public void testDifferentSinceKotlin() throws Exception {
@@ -103,7 +103,7 @@ fun FirAnnotationContainer.extractDeprecationInfoPerUseSite(
): DeprecationAnnotationInfoPerUseSiteStorage {
val fromJava = this is FirDeclaration && this.isJavaOrEnhancement
return buildDeprecationAnnotationInfoPerUseSiteStorage {
add((customAnnotations ?: annotations).extractDeprecationAnnotationInfoPerUseSite(session, fromJava))
add((customAnnotations ?: annotations).extractDeprecationAnnotationInfoPerUseSite(fromJava))
if (this@extractDeprecationInfoPerUseSite is FirProperty) {
add(
getDeprecationsAnnotationInfoByUseSiteFromAccessors(
@@ -158,7 +158,7 @@ fun List<FirAnnotation>.getDeprecationsProviderFromAnnotations(
session: FirSession,
fromJava: Boolean
): DeprecationsProvider {
val deprecationAnnotationByUseSite = extractDeprecationAnnotationInfoPerUseSite(session, fromJava)
val deprecationAnnotationByUseSite = extractDeprecationAnnotationInfoPerUseSite(fromJava)
return deprecationAnnotationByUseSite.toDeprecationsProvider(session.firCachesFactory)
}
@@ -199,9 +199,7 @@ val deprecationAnnotationSimpleNames: Set<String> = setOf(
StandardClassIds.Annotations.SinceKotlin.shortClassName.asString(),
)
private fun List<FirAnnotation>.extractDeprecationAnnotationInfoPerUseSite(
session: FirSession, fromJava: Boolean
): DeprecationAnnotationInfoPerUseSiteStorage {
private fun List<FirAnnotation>.extractDeprecationAnnotationInfoPerUseSite(fromJava: Boolean): DeprecationAnnotationInfoPerUseSiteStorage {
// NB: We can't expand typealiases (`toAnnotationClassId`), because it
// requires `lookupTag.tySymbol()`, but we can have cycles in annotations.
// See the commit message for an example.
@@ -228,9 +226,9 @@ private fun List<FirAnnotation>.extractDeprecationAnnotationInfoPerUseSite(
} else {
val deprecationLevel = deprecated.getDeprecationLevel() ?: DeprecationLevelValue.WARNING
val propagatesToOverride = !fromJavaAnnotation && !fromJava
val deprecatedSinceKotlin = getAnnotationsByClassId(
StandardClassIds.Annotations.DeprecatedSinceKotlin, session
).firstOrNull()
val deprecatedSinceKotlin = this@extractDeprecationAnnotationInfoPerUseSite.firstOrNull {
it.unexpandedClassId == StandardClassIds.Annotations.DeprecatedSinceKotlin
}
val message = deprecated.getStringArgument(ParameterNames.deprecatedMessage)
val deprecatedInfo =
@@ -0,0 +1,21 @@
// MODULE: sub
// FILE: sub.kt
package foo
class Base {
@RequiresOptIn
annotation class My
@My
@Deprecated("Yes")
fun test() = "OK"
}
// MODULE: dep(sub)
// FILE: box.kt
package some
import foo.Base
@OptIn(Base.My::class)
fun box() = Base().test()
@@ -17631,6 +17631,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
runTest("compiler/testData/codegen/box/fir/ConstValAccess.kt");
}
@Test
@TestMetadata("deserializedOptInDeprecated.kt")
public void testDeserializedOptInDeprecated() throws Exception {
runTest("compiler/testData/codegen/box/fir/deserializedOptInDeprecated.kt");
}
@Test
@TestMetadata("differentSinceKotlin.kt")
public void testDifferentSinceKotlin() throws Exception {
@@ -18429,6 +18429,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/fir/delegatedAndDataTogether.kt");
}
@Test
@TestMetadata("deserializedOptInDeprecated.kt")
public void testDeserializedOptInDeprecated() throws Exception {
runTest("compiler/testData/codegen/box/fir/deserializedOptInDeprecated.kt");
}
@Test
@TestMetadata("differentSinceKotlin.kt")
public void testDifferentSinceKotlin() throws Exception {
@@ -18429,6 +18429,12 @@ public class IrBlackBoxCodegenWithIrInlinerTestGenerated extends AbstractIrBlack
runTest("compiler/testData/codegen/box/fir/delegatedAndDataTogether.kt");
}
@Test
@TestMetadata("deserializedOptInDeprecated.kt")
public void testDeserializedOptInDeprecated() throws Exception {
runTest("compiler/testData/codegen/box/fir/deserializedOptInDeprecated.kt");
}
@Test
@TestMetadata("differentSinceKotlin.kt")
public void testDifferentSinceKotlin() throws Exception {
@@ -14643,6 +14643,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
runTest("compiler/testData/codegen/box/fir/ConstValAccess.kt");
}
@TestMetadata("deserializedOptInDeprecated.kt")
public void testDeserializedOptInDeprecated() throws Exception {
runTest("compiler/testData/codegen/box/fir/deserializedOptInDeprecated.kt");
}
@TestMetadata("differentSinceKotlin.kt")
public void testDifferentSinceKotlin() throws Exception {
runTest("compiler/testData/codegen/box/fir/differentSinceKotlin.kt");
@@ -13659,6 +13659,12 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/fir/classCanNotBeCastedToVoid.kt");
}
@Test
@TestMetadata("deserializedOptInDeprecated.kt")
public void testDeserializedOptInDeprecated() throws Exception {
runTest("compiler/testData/codegen/box/fir/deserializedOptInDeprecated.kt");
}
@Test
@TestMetadata("falsePositiveBoundSmartcast.kt")
public void testFalsePositiveBoundSmartcast() throws Exception {
@@ -13761,6 +13761,12 @@ public class FirJsCodegenBoxTestGenerated extends AbstractFirJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/fir/classCanNotBeCastedToVoid.kt");
}
@Test
@TestMetadata("deserializedOptInDeprecated.kt")
public void testDeserializedOptInDeprecated() throws Exception {
runTest("compiler/testData/codegen/box/fir/deserializedOptInDeprecated.kt");
}
@Test
@TestMetadata("falsePositiveBoundSmartcast.kt")
public void testFalsePositiveBoundSmartcast() throws Exception {
@@ -13761,6 +13761,12 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/fir/classCanNotBeCastedToVoid.kt");
}
@Test
@TestMetadata("deserializedOptInDeprecated.kt")
public void testDeserializedOptInDeprecated() throws Exception {
runTest("compiler/testData/codegen/box/fir/deserializedOptInDeprecated.kt");
}
@Test
@TestMetadata("falsePositiveBoundSmartcast.kt")
public void testFalsePositiveBoundSmartcast() throws Exception {
@@ -13761,6 +13761,12 @@ public class IrJsES6CodegenBoxTestGenerated extends AbstractIrJsES6CodegenBoxTes
runTest("compiler/testData/codegen/box/fir/classCanNotBeCastedToVoid.kt");
}
@Test
@TestMetadata("deserializedOptInDeprecated.kt")
public void testDeserializedOptInDeprecated() throws Exception {
runTest("compiler/testData/codegen/box/fir/deserializedOptInDeprecated.kt");
}
@Test
@TestMetadata("falsePositiveBoundSmartcast.kt")
public void testFalsePositiveBoundSmartcast() throws Exception {
@@ -14942,6 +14942,12 @@ public class FirNativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTe
runTest("compiler/testData/codegen/box/fir/classCanNotBeCastedToVoid.kt");
}
@Test
@TestMetadata("deserializedOptInDeprecated.kt")
public void testDeserializedOptInDeprecated() throws Exception {
runTest("compiler/testData/codegen/box/fir/deserializedOptInDeprecated.kt");
}
@Test
@TestMetadata("falsePositiveBoundSmartcast.kt")
public void testFalsePositiveBoundSmartcast() throws Exception {
@@ -15292,6 +15292,12 @@ public class FirNativeCodegenBoxTestNoPLGenerated extends AbstractNativeCodegenB
runTest("compiler/testData/codegen/box/fir/classCanNotBeCastedToVoid.kt");
}
@Test
@TestMetadata("deserializedOptInDeprecated.kt")
public void testDeserializedOptInDeprecated() throws Exception {
runTest("compiler/testData/codegen/box/fir/deserializedOptInDeprecated.kt");
}
@Test
@TestMetadata("falsePositiveBoundSmartcast.kt")
public void testFalsePositiveBoundSmartcast() throws Exception {
@@ -14768,6 +14768,12 @@ public class NativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTest
runTest("compiler/testData/codegen/box/fir/classCanNotBeCastedToVoid.kt");
}
@Test
@TestMetadata("deserializedOptInDeprecated.kt")
public void testDeserializedOptInDeprecated() throws Exception {
runTest("compiler/testData/codegen/box/fir/deserializedOptInDeprecated.kt");
}
@Test
@TestMetadata("falsePositiveBoundSmartcast.kt")
public void testFalsePositiveBoundSmartcast() throws Exception {
@@ -14943,6 +14943,12 @@ public class NativeCodegenBoxTestNoPLGenerated extends AbstractNativeCodegenBoxT
runTest("compiler/testData/codegen/box/fir/classCanNotBeCastedToVoid.kt");
}
@Test
@TestMetadata("deserializedOptInDeprecated.kt")
public void testDeserializedOptInDeprecated() throws Exception {
runTest("compiler/testData/codegen/box/fir/deserializedOptInDeprecated.kt");
}
@Test
@TestMetadata("falsePositiveBoundSmartcast.kt")
public void testFalsePositiveBoundSmartcast() throws Exception {
@@ -12208,6 +12208,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest
runTest("compiler/testData/codegen/box/fir/classCanNotBeCastedToVoid.kt");
}
@TestMetadata("deserializedOptInDeprecated.kt")
public void testDeserializedOptInDeprecated() throws Exception {
runTest("compiler/testData/codegen/box/fir/deserializedOptInDeprecated.kt");
}
@TestMetadata("falsePositiveBoundSmartcast.kt")
public void testFalsePositiveBoundSmartcast() throws Exception {
runTest("compiler/testData/codegen/box/fir/falsePositiveBoundSmartcast.kt");