From 55adeba011e29d72703e08a5484dfa4c9e18adec Mon Sep 17 00:00:00 2001 From: "Evgeniy.Zhelenskiy" Date: Fri, 26 Jan 2024 00:29:56 +0100 Subject: [PATCH] [FIR] Include anonymous objects in containingDeclarations in FirDeclarationsResolveTransformer.kt K1 and K2 still differ because of KT-58203 #KT-63434 --- ...CompilerTestFE10TestdataTestGenerated.java | 6 +++ ...sticCompilerFE10TestDataTestGenerated.java | 6 +++ ...eeOldFrontendDiagnosticsTestGenerated.java | 6 +++ ...siOldFrontendDiagnosticsTestGenerated.java | 6 +++ .../body/resolve/BodyResolveContext.kt | 18 ++++----- .../FirDeclarationsResolveTransformer.kt | 30 +++++++------- .../tests/visibility/kt63434.fir.kt | 17 ++++++++ .../tests/visibility/kt63434.fir.txt | 40 +++++++++++++++++++ .../diagnostics/tests/visibility/kt63434.kt | 17 ++++++++ .../test/runners/DiagnosticTestGenerated.java | 6 +++ 10 files changed, 129 insertions(+), 23 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/visibility/kt63434.fir.kt create mode 100644 compiler/testData/diagnostics/tests/visibility/kt63434.fir.txt create mode 100644 compiler/testData/diagnostics/tests/visibility/kt63434.kt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java index 0f842988469..67310be021c 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java @@ -40552,6 +40552,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/tests/visibility/kt56283.kt"); } + @Test + @TestMetadata("kt63434.kt") + public void testKt63434() throws Exception { + runTest("compiler/testData/diagnostics/tests/visibility/kt63434.kt"); + } + @Test @TestMetadata("lackOfInvisibleSetterOfJavaClassInSamePackage.kt") public void testLackOfInvisibleSetterOfJavaClassInSamePackage() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java index ba2878ace8a..62b8417071b 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java @@ -40552,6 +40552,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/tests/visibility/kt56283.kt"); } + @Test + @TestMetadata("kt63434.kt") + public void testKt63434() throws Exception { + runTest("compiler/testData/diagnostics/tests/visibility/kt63434.kt"); + } + @Test @TestMetadata("lackOfInvisibleSetterOfJavaClassInSamePackage.kt") public void testLackOfInvisibleSetterOfJavaClassInSamePackage() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java index f1144d860a6..0ecae3f0b0b 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java @@ -38220,6 +38220,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir runTest("compiler/testData/diagnostics/tests/visibility/kt56283.kt"); } + @Test + @TestMetadata("kt63434.kt") + public void testKt63434() throws Exception { + runTest("compiler/testData/diagnostics/tests/visibility/kt63434.kt"); + } + @Test @TestMetadata("lackOfInvisibleSetterOfJavaClassInSamePackage.kt") public void testLackOfInvisibleSetterOfJavaClassInSamePackage() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java index d9a8943dfa8..349ddb386f2 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java @@ -38346,6 +38346,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia runTest("compiler/testData/diagnostics/tests/visibility/kt56283.kt"); } + @Test + @TestMetadata("kt63434.kt") + public void testKt63434() throws Exception { + runTest("compiler/testData/diagnostics/tests/visibility/kt63434.kt"); + } + @Test @TestMetadata("lackOfInvisibleSetterOfJavaClassInSamePackage.kt") public void testLackOfInvisibleSetterOfJavaClassInSamePackage() throws Exception { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/BodyResolveContext.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/BodyResolveContext.kt index 662f7d3f707..3e35f01ef97 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/BodyResolveContext.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/BodyResolveContext.kt @@ -79,7 +79,7 @@ class BodyResolveContext( val whenSubjectImportingScopes: ArrayDeque = ArrayDeque() @set:PrivateForInline - var containingClass: FirRegularClass? = null + var containingRegularClass: FirRegularClass? = null val containerIfAny: FirDeclaration? get() = containers.lastOrNull() @@ -107,7 +107,7 @@ class BodyResolveContext( val anonymousFunctionsAnalyzedInDependentContext: MutableSet> = mutableSetOf() - var containingClassDeclarations: ArrayDeque = ArrayDeque() + var containingClassDeclarations: ArrayDeque = ArrayDeque() @OptIn(PrivateForInline::class) inline fun withTowerDataContexts(newContexts: FirRegularTowerDataContexts, f: () -> T): T { @@ -140,19 +140,19 @@ class BodyResolveContext( } @PrivateForInline - private inline fun withContainerClass(declaration: FirRegularClass, f: () -> T): T { - val oldContainingClass = containingClass + private inline fun withContainerRegularClass(declaration: FirRegularClass, f: () -> T): T { + val oldContainingClass = containingRegularClass containers.add(declaration) - containingClass = declaration + containingRegularClass = declaration return try { f() } finally { containers.removeLast() - containingClass = oldContainingClass + containingRegularClass = oldContainingClass } } - inline fun withContainingClass(declaration: FirRegularClass, f: () -> T): T { + inline fun withContainingClass(declaration: FirClass, f: () -> T): T { containingClassDeclarations.add(declaration) return try { f() @@ -368,7 +368,7 @@ class BodyResolveContext( specialTowerDataContexts.putAll(this@BodyResolveContext.specialTowerDataContexts) containers = this@BodyResolveContext.containers containingClassDeclarations = ArrayDeque(this@BodyResolveContext.containingClassDeclarations) - containingClass = this@BodyResolveContext.containingClass + containingRegularClass = this@BodyResolveContext.containingRegularClass replaceTowerDataContext(this@BodyResolveContext.towerDataContext) anonymousFunctionsAnalyzedInDependentContext.addAll(this@BodyResolveContext.anonymousFunctionsAnalyzedInDependentContext) // Looks like we should copy this session only for builder inference to be able @@ -417,7 +417,7 @@ class BodyResolveContext( } withScopesForClass(regularClass, holder) { - withContainerClass(regularClass, f) + withContainerRegularClass(regularClass, f) } } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt index 5f263893578..25c84b4d617 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt @@ -292,7 +292,7 @@ open class FirDeclarationsResolveTransformer( if (property.returnTypeRef is FirResolvedTypeRef) { val typeArguments = (type.type as ConeClassLikeType).typeArguments val extensionType = property.receiverParameter?.typeRef?.coneType - val dispatchType = context.containingClass?.let { containingClass -> + val dispatchType = context.containingRegularClass?.let { containingClass -> containingClass.symbol.constructStarProjectedType(containingClass.typeParameters.size) } propertyReferenceAccess.replaceConeTypeOrNull( @@ -789,21 +789,23 @@ open class FirDeclarationsResolveTransformer( anonymousObject: FirAnonymousObject, data: ResolutionMode ): FirAnonymousObject = whileAnalysing(session, anonymousObject) { - if (anonymousObject !in context.targetedLocalClasses) { - return anonymousObject.runAllPhasesForLocalClass(components, data, transformer.firResolveContextCollector) - } + context.withContainingClass(anonymousObject) { + if (anonymousObject !in context.targetedLocalClasses) { + return anonymousObject.runAllPhasesForLocalClass(components, data, transformer.firResolveContextCollector) + } - require(anonymousObject.controlFlowGraphReference == null) - val buildGraph = !implicitTypeOnly - dataFlowAnalyzer.enterClass(anonymousObject, buildGraph) - val result = context.withAnonymousObject(anonymousObject, components) { - transformDeclarationContent(anonymousObject, data) as FirAnonymousObject + require(anonymousObject.controlFlowGraphReference == null) + val buildGraph = !implicitTypeOnly + dataFlowAnalyzer.enterClass(anonymousObject, buildGraph) + val result = context.withAnonymousObject(anonymousObject, components) { + transformDeclarationContent(anonymousObject, data) as FirAnonymousObject + } + val graph = dataFlowAnalyzer.exitClass() + if (graph != null) { + result.replaceControlFlowGraphReference(FirControlFlowGraphReferenceImpl(graph)) + } + result } - val graph = dataFlowAnalyzer.exitClass() - if (graph != null) { - result.replaceControlFlowGraphReference(FirControlFlowGraphReferenceImpl(graph)) - } - return result } override fun transformSimpleFunction( diff --git a/compiler/testData/diagnostics/tests/visibility/kt63434.fir.kt b/compiler/testData/diagnostics/tests/visibility/kt63434.fir.kt new file mode 100644 index 00000000000..fd93004c938 --- /dev/null +++ b/compiler/testData/diagnostics/tests/visibility/kt63434.fir.kt @@ -0,0 +1,17 @@ +// SKIP_TXT +// FIR_DUMP + +abstract class InlineCompletionSessionManager { + protected class Proto { + class Some + } +} + +fun checkCannotAccess() { + object : InlineCompletionSessionManager() { + fun chch() { + val b: Proto = Proto() + if (b is Proto.Some) return + } + } +} diff --git a/compiler/testData/diagnostics/tests/visibility/kt63434.fir.txt b/compiler/testData/diagnostics/tests/visibility/kt63434.fir.txt new file mode 100644 index 00000000000..5a6ea9470f3 --- /dev/null +++ b/compiler/testData/diagnostics/tests/visibility/kt63434.fir.txt @@ -0,0 +1,40 @@ +FILE: kt63434.fir.kt + public abstract class InlineCompletionSessionManager : R|kotlin/Any| { + public constructor(): R|InlineCompletionSessionManager| { + super() + } + + protected final class Proto : R|kotlin/Any| { + public constructor(): R|InlineCompletionSessionManager.Proto| { + super() + } + + public final class Some : R|kotlin/Any| { + public constructor(): R|InlineCompletionSessionManager.Proto.Some| { + super() + } + + } + + } + + } + public final fun checkCannotAccess(): R|kotlin/Unit| { + object : R|InlineCompletionSessionManager| { + private constructor(): R|| { + super() + } + + public final fun chch(): R|kotlin/Unit| { + lval b: R|InlineCompletionSessionManager.Proto| = R|/InlineCompletionSessionManager.Proto.Proto|() + when () { + (R|/b| is R|InlineCompletionSessionManager.Proto.Some|) -> { + ^chch Unit + } + } + + } + + } + + } diff --git a/compiler/testData/diagnostics/tests/visibility/kt63434.kt b/compiler/testData/diagnostics/tests/visibility/kt63434.kt new file mode 100644 index 00000000000..a8cbb6f9095 --- /dev/null +++ b/compiler/testData/diagnostics/tests/visibility/kt63434.kt @@ -0,0 +1,17 @@ +// SKIP_TXT +// FIR_DUMP + +abstract class InlineCompletionSessionManager { + protected class Proto { + class Some + } +} + +fun checkCannotAccess() { + object : InlineCompletionSessionManager() { + fun chch() { + val b: Proto = Proto() + if (b is Proto.Some) return + } + } +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index 575467b3717..11208a1f32e 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -40552,6 +40552,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/visibility/kt56283.kt"); } + @Test + @TestMetadata("kt63434.kt") + public void testKt63434() throws Exception { + runTest("compiler/testData/diagnostics/tests/visibility/kt63434.kt"); + } + @Test @TestMetadata("lackOfInvisibleSetterOfJavaClassInSamePackage.kt") public void testLackOfInvisibleSetterOfJavaClassInSamePackage() throws Exception {