From 2b84e8e68ff7a359d52aa269d50ac6d1bd6bdd25 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Thu, 25 Nov 2021 13:33:01 +0300 Subject: [PATCH] [FIR] Pass proper containing classes from context to type resolution for local classes --- ...CompilerTestFE10TestdataTestGenerated.java | 6 ++++ ...irOldFrontendDiagnosticsTestGenerated.java | 6 ++++ ...DiagnosticsWithLightTreeTestGenerated.java | 6 ++++ .../transformers/FirTypeResolveTransformer.kt | 18 +++++++--- .../body/resolve/BodyResolveContext.kt | 2 ++ .../body/resolve/LocalClassesResolution.kt | 4 ++- .../privateFromInAnonymousObject.fir.txt | 35 +++++++++++++++++++ .../privateFromInAnonymousObject.kt | 20 +++++++++++ .../privateFromInAnonymousObject.txt | 16 +++++++++ .../test/runners/DiagnosticTestGenerated.java | 6 ++++ 10 files changed, 114 insertions(+), 5 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/visibility/privateFromInAnonymousObject.fir.txt create mode 100644 compiler/testData/diagnostics/tests/visibility/privateFromInAnonymousObject.kt create mode 100644 compiler/testData/diagnostics/tests/visibility/privateFromInAnonymousObject.txt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java index fd28cf8e1e2..c5480109560 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java @@ -32281,6 +32281,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag runTest("compiler/testData/diagnostics/tests/visibility/privateDeclarationInAnotherFile.kt"); } + @Test + @TestMetadata("privateFromInAnonymousObject.kt") + public void testPrivateFromInAnonymousObject() throws Exception { + runTest("compiler/testData/diagnostics/tests/visibility/privateFromInAnonymousObject.kt"); + } + @Test @TestMetadata("protectedInternal.kt") public void testProtectedInternal() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java index 63c2977c1ef..d02ba01cf22 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java @@ -32281,6 +32281,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti runTest("compiler/testData/diagnostics/tests/visibility/privateDeclarationInAnotherFile.kt"); } + @Test + @TestMetadata("privateFromInAnonymousObject.kt") + public void testPrivateFromInAnonymousObject() throws Exception { + runTest("compiler/testData/diagnostics/tests/visibility/privateFromInAnonymousObject.kt"); + } + @Test @TestMetadata("protectedInternal.kt") public void testProtectedInternal() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java index 89020d2ee3e..6c95a6b67ab 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java @@ -32281,6 +32281,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac runTest("compiler/testData/diagnostics/tests/visibility/privateDeclarationInAnotherFile.kt"); } + @Test + @TestMetadata("privateFromInAnonymousObject.kt") + public void testPrivateFromInAnonymousObject() throws Exception { + runTest("compiler/testData/diagnostics/tests/visibility/privateFromInAnonymousObject.kt"); + } + @Test @TestMetadata("protectedInternal.kt") public void testProtectedInternal() throws Exception { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt index 72bf07ceb99..cfb6f519a61 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt @@ -33,8 +33,17 @@ fun F.runTypeResolvePhaseForLocalClass( session: FirSession, scopeSession: ScopeSession, currentScopeList: List, + useSiteFile: FirFile, + containingDeclarations: List, ): F { - val transformer = FirTypeResolveTransformer(session, scopeSession, currentScopeList) + @Suppress("RemoveExplicitTypeArguments") + val transformer = FirTypeResolveTransformer( + session, + scopeSession, + currentScopeList, + initialCurrentFile = useSiteFile, + classDeclarationsStack = containingDeclarations.filterIsInstanceTo>(ArrayDeque()) + ) return this.transform(transformer, null) } @@ -42,9 +51,10 @@ fun F.runTypeResolvePhaseForLocalClass( open class FirTypeResolveTransformer( final override val session: FirSession, private val scopeSession: ScopeSession, - initialScopes: List = emptyList() + initialScopes: List = emptyList(), + initialCurrentFile: FirFile? = null, + private val classDeclarationsStack: ArrayDeque = ArrayDeque() ) : FirAbstractTreeTransformer(FirResolvePhase.TYPES) { - private val classDeclarationsStack = ArrayDeque() private val scopes = mutableListOf() private val towerScope = scopes.asReversed() @@ -53,7 +63,7 @@ open class FirTypeResolveTransformer( } private val typeResolverTransformer: FirSpecificTypeResolverTransformer = FirSpecificTypeResolverTransformer(session) - private var currentFile: FirFile? = null + private var currentFile: FirFile? = initialCurrentFile override fun transformFile(file: FirFile, data: Any?): FirFile { checkSessionConsistency(file) 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 fc802f3f393..bc9cca5b0d4 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 @@ -338,6 +338,8 @@ class BodyResolveContext( towerDataContextForAnonymousFunctions.putAll(this@BodyResolveContext.towerDataContextForAnonymousFunctions) towerDataContextForCallableReferences.putAll(this@BodyResolveContext.towerDataContextForCallableReferences) containers = this@BodyResolveContext.containers + containingClassDeclarations = ArrayDeque(this@BodyResolveContext.containingClassDeclarations) + containingClass = this@BodyResolveContext.containingClass replaceTowerDataContext(this@BodyResolveContext.towerDataContext) anonymousFunctionsAnalyzedInDependentContext.addAll(this@BodyResolveContext.anonymousFunctionsAnalyzedInDependentContext) } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/LocalClassesResolution.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/LocalClassesResolution.kt index 99270b5dd10..c7b497d13f8 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/LocalClassesResolution.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/LocalClassesResolution.kt @@ -44,7 +44,9 @@ fun F.runAllPhasesForLocalClass( runTypeResolvePhaseForLocalClass( components.session, components.scopeSession, - components.createCurrentScopeList() + components.createCurrentScopeList(), + components.file, + components.containingDeclarations ) runStatusResolveForLocalClass( components.session, diff --git a/compiler/testData/diagnostics/tests/visibility/privateFromInAnonymousObject.fir.txt b/compiler/testData/diagnostics/tests/visibility/privateFromInAnonymousObject.fir.txt new file mode 100644 index 00000000000..c98c76c4afb --- /dev/null +++ b/compiler/testData/diagnostics/tests/visibility/privateFromInAnonymousObject.fir.txt @@ -0,0 +1,35 @@ +FILE: privateFromInAnonymousObject.kt + public final class Base : R|kotlin/Any| { + public constructor(): R|Base| { + super() + } + + private final class Private : R|kotlin/Any| { + public constructor(): R|Base.Private| { + super() + } + + } + + public final fun test(): R|kotlin/Unit| { + object : R|kotlin/Any| { + private constructor(): R|| { + super() + } + + public final val x: R|Base.Private| = R|/Base.Private.Private|() + public get(): R|Base.Private| + + init { + lval y: R|Base.Private| = R|/Base.Private.Private|() + } + + public final fun foo(): R|kotlin/Unit| { + lval z: R|Base.Private| = R|/Base.Private.Private|() + } + + } + + } + + } diff --git a/compiler/testData/diagnostics/tests/visibility/privateFromInAnonymousObject.kt b/compiler/testData/diagnostics/tests/visibility/privateFromInAnonymousObject.kt new file mode 100644 index 00000000000..c23b1dca922 --- /dev/null +++ b/compiler/testData/diagnostics/tests/visibility/privateFromInAnonymousObject.kt @@ -0,0 +1,20 @@ +// FIR_IDENTICAL +// FIR_DUMP + +class Base { + private class Private + + fun test() { + object { + val x: Private = Private() + + init { + val y: Private = Private() + } + + fun foo() { + val z: Private = Private() + } + } + } +} diff --git a/compiler/testData/diagnostics/tests/visibility/privateFromInAnonymousObject.txt b/compiler/testData/diagnostics/tests/visibility/privateFromInAnonymousObject.txt new file mode 100644 index 00000000000..e8c21613d08 --- /dev/null +++ b/compiler/testData/diagnostics/tests/visibility/privateFromInAnonymousObject.txt @@ -0,0 +1,16 @@ +package + +public final class Base { + public constructor Base() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public final fun test(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + private final class Private { + public constructor Private() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } +} 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 8eef8d49439..780a271c32c 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 @@ -32377,6 +32377,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/visibility/privateDeclarationInAnotherFile.kt"); } + @Test + @TestMetadata("privateFromInAnonymousObject.kt") + public void testPrivateFromInAnonymousObject() throws Exception { + runTest("compiler/testData/diagnostics/tests/visibility/privateFromInAnonymousObject.kt"); + } + @Test @TestMetadata("protectedInternal.kt") public void testProtectedInternal() throws Exception {