From cfa06dbf74abce0a2a624223acf901fbb410a68a Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Tue, 11 Apr 2023 11:43:37 +0300 Subject: [PATCH] [FIR] Fix incorrect usages of getClassLikeSymbolByClassId with lookup tag ^KT-57839 Fixed --- ...cCompilerTestFirTestdataTestGenerated.java | 6 +++++ ...osticCompilerFirTestDataTestGenerated.java | 6 +++++ .../LazyBodyIsNotTouchedTestGenerated.java | 5 ++++ .../lambdaWithAnonymousObject.fir.txt | 26 +++++++++++++++++++ .../localClasses/lambdaWithAnonymousObject.kt | 15 +++++++++++ .../FirLightTreeDiagnosticsTestGenerated.java | 6 +++++ .../FirPsiDiagnosticTestGenerated.java | 6 +++++ .../kotlin/fir/java/javaAnnotationsMapping.kt | 3 ++- .../kotlin/fir/resolve/LookupTagUtils.kt | 20 +++++--------- ...rCallCompletionResultsWriterTransformer.kt | 5 +--- 10 files changed, 79 insertions(+), 19 deletions(-) create mode 100644 compiler/fir/analysis-tests/testData/resolve/localClasses/lambdaWithAnonymousObject.fir.txt create mode 100644 compiler/fir/analysis-tests/testData/resolve/localClasses/lambdaWithAnonymousObject.kt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFirTestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFirTestdataTestGenerated.java index 05fbbc8bc2f..a571f381a1f 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFirTestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFirTestdataTestGenerated.java @@ -3535,6 +3535,12 @@ public class DiagnosticCompilerTestFirTestdataTestGenerated extends AbstractDiag runTest("compiler/fir/analysis-tests/testData/resolve/localClasses/implicitInLocalClasses.kt"); } + @Test + @TestMetadata("lambdaWithAnonymousObject.kt") + public void testLambdaWithAnonymousObject() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/localClasses/lambdaWithAnonymousObject.kt"); + } + @Test @TestMetadata("overrideInLocal.kt") public void testOverrideInLocal() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFirTestDataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFirTestDataTestGenerated.java index f98d0fd9247..dd8def67877 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFirTestDataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFirTestDataTestGenerated.java @@ -3535,6 +3535,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFirTestDataTestGenerated runTest("compiler/fir/analysis-tests/testData/resolve/localClasses/implicitInLocalClasses.kt"); } + @Test + @TestMetadata("lambdaWithAnonymousObject.kt") + public void testLambdaWithAnonymousObject() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/localClasses/lambdaWithAnonymousObject.kt"); + } + @Test @TestMetadata("overrideInLocal.kt") public void testOverrideInLocal() throws Exception { diff --git a/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTestGenerated.java b/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTestGenerated.java index 88e3a5559f5..168e80f3e51 100644 --- a/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTestGenerated.java +++ b/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTestGenerated.java @@ -3107,6 +3107,11 @@ public class LazyBodyIsNotTouchedTestGenerated extends AbstractLazyBodyIsNotTouc runTest("compiler/fir/analysis-tests/testData/resolve/localClasses/implicitInLocalClasses.kt"); } + @TestMetadata("lambdaWithAnonymousObject.kt") + public void testLambdaWithAnonymousObject() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/localClasses/lambdaWithAnonymousObject.kt"); + } + @TestMetadata("overrideInLocal.kt") public void testOverrideInLocal() throws Exception { runTest("compiler/fir/analysis-tests/testData/resolve/localClasses/overrideInLocal.kt"); diff --git a/compiler/fir/analysis-tests/testData/resolve/localClasses/lambdaWithAnonymousObject.fir.txt b/compiler/fir/analysis-tests/testData/resolve/localClasses/lambdaWithAnonymousObject.fir.txt new file mode 100644 index 00000000000..2311d2364f2 --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/localClasses/lambdaWithAnonymousObject.fir.txt @@ -0,0 +1,26 @@ +FILE: lambdaWithAnonymousObject.kt + public final fun myRun(block: R|() -> R|): R|R| { + ^myRun R|/block|.R|SubstitutionOverride|() + } + public abstract interface Bar : R|kotlin/Any| { + public abstract val action: R|() -> kotlin/Unit| + public get(): R|() -> kotlin/Unit| + + } + public final val cardModel: R|Bar| = R|/myRun||>( = myRun@fun (): R|| { + ^ object : R|Bar| { + private constructor(): R|| { + super() + } + + public open override val action: R|() -> kotlin/Unit| = myRun@fun (): R|kotlin/Unit| { + ^@myRun Unit + } + + public get(): R|() -> kotlin/Unit| + + } + + } + ) + public get(): R|Bar| diff --git a/compiler/fir/analysis-tests/testData/resolve/localClasses/lambdaWithAnonymousObject.kt b/compiler/fir/analysis-tests/testData/resolve/localClasses/lambdaWithAnonymousObject.kt new file mode 100644 index 00000000000..7977844e643 --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/localClasses/lambdaWithAnonymousObject.kt @@ -0,0 +1,15 @@ +// ISSUE: KT-57839 + +fun myRun(block: () -> R): R { + return block() +} + +interface Bar { + val action: () -> Unit +} + +val cardModel = myRun { + object : Bar { + override val action = {} + } +} diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeDiagnosticsTestGenerated.java index 761f81a1b34..37d19f33d56 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeDiagnosticsTestGenerated.java @@ -3535,6 +3535,12 @@ public class FirLightTreeDiagnosticsTestGenerated extends AbstractFirLightTreeDi runTest("compiler/fir/analysis-tests/testData/resolve/localClasses/implicitInLocalClasses.kt"); } + @Test + @TestMetadata("lambdaWithAnonymousObject.kt") + public void testLambdaWithAnonymousObject() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/localClasses/lambdaWithAnonymousObject.kt"); + } + @Test @TestMetadata("overrideInLocal.kt") public void testOverrideInLocal() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiDiagnosticTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiDiagnosticTestGenerated.java index 57d7d800383..6cb27480e43 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiDiagnosticTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiDiagnosticTestGenerated.java @@ -3535,6 +3535,12 @@ public class FirPsiDiagnosticTestGenerated extends AbstractFirPsiDiagnosticTest runTest("compiler/fir/analysis-tests/testData/resolve/localClasses/implicitInLocalClasses.kt"); } + @Test + @TestMetadata("lambdaWithAnonymousObject.kt") + public void testLambdaWithAnonymousObject() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/localClasses/lambdaWithAnonymousObject.kt"); + } + @Test @TestMetadata("overrideInLocal.kt") public void testOverrideInLocal() throws Exception { diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/javaAnnotationsMapping.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/javaAnnotationsMapping.kt index dbbab706b93..14ffed5aa06 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/javaAnnotationsMapping.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/javaAnnotationsMapping.kt @@ -27,6 +27,7 @@ import org.jetbrains.kotlin.fir.resolve.bindSymbolToLookupTag import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeUnresolvedReferenceError import org.jetbrains.kotlin.fir.resolve.providers.getClassDeclaredPropertySymbols import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider +import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol import org.jetbrains.kotlin.fir.types.* @@ -209,7 +210,7 @@ private fun fillAnnotationArgumentMapping( ) { if (annotationArguments.isEmpty()) return - val annotationClassSymbol = session.symbolProvider.getClassLikeSymbolByClassId(lookupTag.classId).also { + val annotationClassSymbol = lookupTag.toSymbol(session).also { lookupTag.bindSymbolToLookupTag(session, it) } val annotationConstructor = (annotationClassSymbol?.fir as FirRegularClass?) diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/LookupTagUtils.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/LookupTagUtils.kt index b1fe6971397..39e65f1d828 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/LookupTagUtils.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/LookupTagUtils.kt @@ -17,10 +17,7 @@ import org.jetbrains.kotlin.fir.expressions.builder.buildAnnotationArgumentMappi import org.jetbrains.kotlin.fir.expressions.builder.buildConstExpression import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider -import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag -import org.jetbrains.kotlin.fir.symbols.ConeClassifierLookupTag -import org.jetbrains.kotlin.fir.symbols.ConeClassifierLookupTagWithFixedSymbol -import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterLookupTag +import org.jetbrains.kotlin.fir.symbols.* import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef @@ -42,31 +39,26 @@ fun ConeClassLikeLookupTag.toSymbol(useSiteSession: FirSession): FirClassLikeSym if (this is ConeClassLookupTagWithFixedSymbol) { return this.symbol } - val firSymbolProvider = useSiteSession.symbolProvider (this as? ConeClassLikeLookupTagImpl)?.boundSymbol?.takeIf { it.first === useSiteSession }?.let { return it.second } - return firSymbolProvider.getClassLikeSymbolByClassId(classId).also { + return useSiteSession.symbolProvider.getClassLikeSymbolByClassId(classId).also { (this as? ConeClassLikeLookupTagImpl)?.bindSymbolToLookupTag(useSiteSession, it) } } -@OptIn(LookupTagInternals::class) fun ConeClassLikeLookupTag.toSymbolOrError(useSiteSession: FirSession): FirClassLikeSymbol<*> = - toSymbol(useSiteSession) - ?: error("Class symbol with classId $classId was not found") + toSymbol(useSiteSession) ?: error("Class symbol with classId $classId was not found") -@OptIn(LookupTagInternals::class) fun ConeClassLikeLookupTag.toFirRegularClassSymbol(session: FirSession): FirRegularClassSymbol? = - session.symbolProvider.getSymbolByLookupTag(this) as? FirRegularClassSymbol + toSymbol(session) as? FirRegularClassSymbol @OptIn(LookupTagInternals::class) fun ConeClassLikeLookupTagImpl.bindSymbolToLookupTag(session: FirSession, symbol: FirClassLikeSymbol<*>?) { boundSymbol = WeakPair(session, symbol) } -@LookupTagInternals -fun ConeClassLikeLookupTag.toFirRegularClass(session: FirSession): FirRegularClass? = - session.symbolProvider.getSymbolByLookupTag(this)?.fir as? FirRegularClass +@SymbolInternals +fun ConeClassLikeLookupTag.toFirRegularClass(session: FirSession): FirRegularClass? = toFirRegularClassSymbol(session)?.fir fun FirSymbolProvider.getSymbolByLookupTag(lookupTag: ConeClassifierLookupTag): FirClassifierSymbol<*>? { return lookupTag.toSymbol(session) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt index f3fa271ca34..ea07688cbc0 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt @@ -562,10 +562,7 @@ class FirCallCompletionResultsWriterTransformer( expectedArgumentType.isSomeFunctionType(session) -> expectedArgumentType // fun interface (a.k.a. SAM), then unwrap it and build a functional type from that interface function expectedArgumentType is ConeClassLikeType -> { - val firRegularClass = - session.symbolProvider.getClassLikeSymbolByClassId(expectedArgumentType.lookupTag.classId)?.fir as? FirRegularClass - - firRegularClass?.let answer@{ + expectedArgumentType.lookupTag.toFirRegularClass(session)?.let answer@{ firRegularClass -> val functionType = samResolver.getFunctionTypeForPossibleSamType(firRegularClass.defaultType()) ?: return@answer null val kind = functionType.functionTypeKind(session) ?: FunctionTypeKind.Function