From 82ae3f8f10837d779b08043c15bc7095445b34d0 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 10 Apr 2018 14:07:30 +0300 Subject: [PATCH] FIR resolve: add nested companion scope #KT-24095 Fixed --- .../transformers/FirTypeResolveTransformer.kt | 6 +++++ compiler/testData/fir/resolve/companion.kt | 17 ++++++++++++++ compiler/testData/fir/resolve/companion.txt | 23 +++++++++++++++++++ .../fir/FirResolveTestCaseGenerated.java | 6 +++++ 4 files changed, 52 insertions(+) create mode 100644 compiler/testData/fir/resolve/companion.kt create mode 100644 compiler/testData/fir/resolve/companion.txt 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 da62b50f1aa..60b158ec4eb 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 @@ -70,6 +70,12 @@ open class FirTypeResolveTransformer : FirTransformer() { resolveSuperTypesAndExpansions(klass) scope.scopes += FirNestedClassifierScope(classId, klass.session) + val companionObjects = klass.declarations.filterIsInstance().filter { it.isCompanion } + for (companionObject in companionObjects) { + val companionId = ClassId(packageFqName, classLikeName.child(companionObject.name), false) + scope.scopes += FirNestedClassifierScope(companionId, klass.session) + } + val superTypeScopes = lookupSuperTypes(klass).map { FirNestedClassifierScope(it, klass.session) } scope.scopes.addAll(superTypeScopes) val result = super.transformClass(klass, data) diff --git a/compiler/testData/fir/resolve/companion.kt b/compiler/testData/fir/resolve/companion.kt new file mode 100644 index 00000000000..4c6c0c970f1 --- /dev/null +++ b/compiler/testData/fir/resolve/companion.kt @@ -0,0 +1,17 @@ +package test + +abstract class Some { + companion object { + class InCompanion + } + + abstract val x: InCompanion +} + +abstract class Another { + companion object NamedCompanion { + class InCompanion + } + + abstract val x: InCompanion +} \ No newline at end of file diff --git a/compiler/testData/fir/resolve/companion.txt b/compiler/testData/fir/resolve/companion.txt new file mode 100644 index 00000000000..ff4526d342a --- /dev/null +++ b/compiler/testData/fir/resolve/companion.txt @@ -0,0 +1,23 @@ +FILE: companion.kt + public? abstract class Some { + public? final companion object Companion { + public? final class InCompanion { + } + + } + + public? abstract property x(val): R|test/Some.Companion.InCompanion| + public? get(): R|test/Some.Companion.InCompanion| + + } + public? abstract class Another { + public? final companion object NamedCompanion { + public? final class InCompanion { + } + + } + + public? abstract property x(val): R|test/Another.NamedCompanion.InCompanion| + public? get(): R|test/Another.NamedCompanion.InCompanion| + + } diff --git a/compiler/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java b/compiler/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java index ebce5cfe089..067fec1d602 100644 --- a/compiler/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/fir/FirResolveTestCaseGenerated.java @@ -29,6 +29,12 @@ public class FirResolveTestCaseGenerated extends AbstractFirResolveTestCase { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/fir/resolve"), Pattern.compile("^([^.]+)\\.kt$"), TargetBackend.ANY, true, "stdlib"); } + @TestMetadata("companion.kt") + public void testCompanion() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/fir/resolve/companion.kt"); + doTest(fileName); + } + @TestMetadata("derivedClass.kt") public void testDerivedClass() throws Exception { runTest("compiler/testData/fir/resolve/derivedClass.kt");