From 1d76bce3dda73b916cdcc3cc3f0502c60dee6cbd Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Fri, 18 Nov 2022 16:10:44 +0100 Subject: [PATCH] K2: fix outerClassSymbol behavior for local classes #KT-55018 Fixed --- .../fir/analysis/checkers/FirHelpers.kt | 3 +- .../expression/FirOptInUsageBaseChecker.kt | 2 +- .../runners/ir/Fir2IrTextTestGenerated.java | 6 +++ .../ir/LightTreeFir2IrTextTestGenerated.java | 6 +++ .../irText/firProblems/localCompanion.ir.txt | 48 +++++++++++++++++++ .../ir/irText/firProblems/localCompanion.kt | 10 ++++ .../irText/firProblems/localCompanion.kt.txt | 25 ++++++++++ .../test/runners/ir/IrTextTestGenerated.java | 6 +++ .../klib/KlibTextTestCaseGenerated.java | 5 ++ 9 files changed, 108 insertions(+), 3 deletions(-) create mode 100644 compiler/testData/ir/irText/firProblems/localCompanion.ir.txt create mode 100644 compiler/testData/ir/irText/firProblems/localCompanion.kt create mode 100644 compiler/testData/ir/irText/firProblems/localCompanion.kt.txt diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt index f9d2f98691f..3f737713010 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt @@ -116,8 +116,7 @@ fun FirBasedSymbol<*>.getContainingClassSymbol(session: FirSession): FirClassLik fun FirClassLikeSymbol<*>.outerClassSymbol(context: CheckerContext): FirClassLikeSymbol<*>? { if (this !is FirClassSymbol<*>) return null - val outerClassId = classId.outerClassId ?: return null - return context.session.symbolProvider.getClassLikeSymbolByClassId(outerClassId) + return getContainingDeclarationSymbol(context.session) } @OptIn(SymbolInternals::class) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirOptInUsageBaseChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirOptInUsageBaseChecker.kt index c576fb3a295..743cd90468d 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirOptInUsageBaseChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirOptInUsageBaseChecker.kt @@ -192,7 +192,7 @@ object FirOptInUsageBaseChecker { context, result, visited, fromSetter = false, dispatchReceiverType, fromSupertype = false ) } - } else if (this is FirRegularClassSymbol && fir is FirRegularClass && !fir.isLocal) { + } else if (this is FirRegularClassSymbol && fir is FirRegularClass) { val parentClassSymbol = outerClassSymbol(context) parentClassSymbol?.loadExperimentalities( context, result, visited, fromSetter = false, dispatchReceiverType = null, fromSupertype = false diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/Fir2IrTextTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/Fir2IrTextTestGenerated.java index 73b4ce9a0cd..d436f0899ad 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/Fir2IrTextTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/Fir2IrTextTestGenerated.java @@ -2666,6 +2666,12 @@ public class Fir2IrTextTestGenerated extends AbstractFir2IrTextTest { runTest("compiler/testData/ir/irText/firProblems/localClassUsedBeforeDeclaration.kt"); } + @Test + @TestMetadata("localCompanion.kt") + public void testLocalCompanion() throws Exception { + runTest("compiler/testData/ir/irText/firProblems/localCompanion.kt"); + } + @Test @TestMetadata("Modality.kt") public void testModality() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/LightTreeFir2IrTextTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/LightTreeFir2IrTextTestGenerated.java index 2b84bfb13e6..4441f89195a 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/LightTreeFir2IrTextTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/LightTreeFir2IrTextTestGenerated.java @@ -2666,6 +2666,12 @@ public class LightTreeFir2IrTextTestGenerated extends AbstractLightTreeFir2IrTex runTest("compiler/testData/ir/irText/firProblems/localClassUsedBeforeDeclaration.kt"); } + @Test + @TestMetadata("localCompanion.kt") + public void testLocalCompanion() throws Exception { + runTest("compiler/testData/ir/irText/firProblems/localCompanion.kt"); + } + @Test @TestMetadata("Modality.kt") public void testModality() throws Exception { diff --git a/compiler/testData/ir/irText/firProblems/localCompanion.ir.txt b/compiler/testData/ir/irText/firProblems/localCompanion.ir.txt new file mode 100644 index 00000000000..070c8550fbd --- /dev/null +++ b/compiler/testData/ir/irText/firProblems/localCompanion.ir.txt @@ -0,0 +1,48 @@ +FILE fqName: fileName:/localCompanion.kt + FUN name:main visibility:public modality:FINAL <> () returnType:kotlin.Unit + BLOCK_BODY + CLASS CLASS name:Foo modality:FINAL visibility:local superTypes:[kotlin.Any] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.main.Foo + CONSTRUCTOR visibility:public <> () returnType:.main.Foo [primary] + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in kotlin.Any' + INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:Foo modality:FINAL visibility:local superTypes:[kotlin.Any]' + CLASS OBJECT name:Companion modality:FINAL visibility:local [companion] superTypes:[kotlin.Any] + annotations: + Suppress(names = ['WRONG_MODIFIER_CONTAINING_DECLARATION']) + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.main.Foo.Companion + CONSTRUCTOR visibility:private <> () returnType:.main.Foo.Companion [primary] + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in kotlin.Any' + INSTANCE_INITIALIZER_CALL classDescriptor='CLASS OBJECT name:Companion modality:FINAL visibility:local [companion] superTypes:[kotlin.Any]' + FUN name:bar visibility:public modality:FINAL <> ($this:.main.Foo.Companion) returnType:kotlin.Unit + $this: VALUE_PARAMETER name: type:.main.Foo.Companion + BLOCK_BODY + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + VALUE_PARAMETER name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + VALUE_PARAMETER name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + CALL 'public final fun bar (): kotlin.Unit declared in .main.Foo.Companion' type=kotlin.Unit origin=null + $this: GET_OBJECT 'CLASS OBJECT name:Companion modality:FINAL visibility:local [companion] superTypes:[kotlin.Any]' type=.main.Foo.Companion diff --git a/compiler/testData/ir/irText/firProblems/localCompanion.kt b/compiler/testData/ir/irText/firProblems/localCompanion.kt new file mode 100644 index 00000000000..9852a6cb296 --- /dev/null +++ b/compiler/testData/ir/irText/firProblems/localCompanion.kt @@ -0,0 +1,10 @@ +// FIR_IDENTICAL +fun main() { + class Foo { + @Suppress("WRONG_MODIFIER_CONTAINING_DECLARATION") + companion object { + fun bar() {} + } + } + Foo.Companion.bar() +} diff --git a/compiler/testData/ir/irText/firProblems/localCompanion.kt.txt b/compiler/testData/ir/irText/firProblems/localCompanion.kt.txt new file mode 100644 index 00000000000..edff7a62f7e --- /dev/null +++ b/compiler/testData/ir/irText/firProblems/localCompanion.kt.txt @@ -0,0 +1,25 @@ +fun main() { + local class Foo { + constructor() /* primary */ { + super/*Any*/() + /* () */ + + } + + @Suppress(names = ["WRONG_MODIFIER_CONTAINING_DECLARATION"]) + local companion object Companion { + private constructor() /* primary */ { + super/*Any*/() + /* () */ + + } + + fun bar() { + } + + } + + } + + Companion.bar() +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/IrTextTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/IrTextTestGenerated.java index 1f457c8dfb0..0554f9d0a20 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/IrTextTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/IrTextTestGenerated.java @@ -2666,6 +2666,12 @@ public class IrTextTestGenerated extends AbstractIrTextTest { runTest("compiler/testData/ir/irText/firProblems/localClassUsedBeforeDeclaration.kt"); } + @Test + @TestMetadata("localCompanion.kt") + public void testLocalCompanion() throws Exception { + runTest("compiler/testData/ir/irText/firProblems/localCompanion.kt"); + } + @Test @TestMetadata("Modality.kt") public void testModality() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/klib/KlibTextTestCaseGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/klib/KlibTextTestCaseGenerated.java index 60919259058..89eed1fbfae 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/klib/KlibTextTestCaseGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/klib/KlibTextTestCaseGenerated.java @@ -1950,6 +1950,11 @@ public class KlibTextTestCaseGenerated extends AbstractKlibTextTestCase { runTest("compiler/testData/ir/irText/firProblems/localClassUsedBeforeDeclaration.kt"); } + @TestMetadata("localCompanion.kt") + public void testLocalCompanion() throws Exception { + runTest("compiler/testData/ir/irText/firProblems/localCompanion.kt"); + } + @TestMetadata("readWriteProperty.kt") public void testReadWriteProperty() throws Exception { runTest("compiler/testData/ir/irText/firProblems/readWriteProperty.kt");