From 6f31692996fc0bbced137ba9a3da12f647a16e2f Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 18 Nov 2013 14:17:56 +0400 Subject: [PATCH] Import nested classes both from classes and their class objects It seems that this incorrect behaviour was introduced in 726bcb5 --- .../jetbrains/jet/lang/resolve/Importer.java | 16 +++++++------ .../enum/starImportNestedClassAndEntries.kt | 24 +++++++++++++++++++ .../checkers/JetDiagnosticsTestGenerated.java | 5 ++++ 3 files changed, 38 insertions(+), 7 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/enum/starImportNestedClassAndEntries.kt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/Importer.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/Importer.java index 02519abe607..dc620dd96de 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/Importer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/Importer.java @@ -28,6 +28,7 @@ import org.jetbrains.jet.lang.resolve.scopes.FilteringScope; import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.resolve.scopes.WritableScope; +import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -86,20 +87,21 @@ public interface Importer { } protected void importAllUnderDeclaration(@NotNull DeclarationDescriptor descriptor, @NotNull PlatformToKotlinClassMap platformToKotlinClassMap) { - JetScope scopeToImport = null; + List scopesToImport = new ArrayList(2); if (descriptor instanceof NamespaceDescriptor) { - scopeToImport = ((NamespaceDescriptor) descriptor).getMemberScope(); + scopesToImport.add(((NamespaceDescriptor) descriptor).getMemberScope()); } - if (descriptor instanceof ClassDescriptor && ((ClassDescriptor) descriptor).getKind() != ClassKind.OBJECT) { + else if (descriptor instanceof ClassDescriptor && ((ClassDescriptor) descriptor).getKind() != ClassKind.OBJECT) { ClassDescriptor classDescriptor = (ClassDescriptor) descriptor; - scopeToImport = classDescriptor.getUnsubstitutedInnerClassesScope(); + scopesToImport.add(classDescriptor.getUnsubstitutedInnerClassesScope()); ClassDescriptor classObjectDescriptor = classDescriptor.getClassObjectDescriptor(); if (classObjectDescriptor != null) { - scopeToImport = classObjectDescriptor.getUnsubstitutedInnerClassesScope(); + scopesToImport.add(classObjectDescriptor.getUnsubstitutedInnerClassesScope()); } } - if (scopeToImport != null) { - namespaceScope.importScope(createFilteringScope(scopeToImport, descriptor, platformToKotlinClassMap)); + + for (JetScope scope : scopesToImport) { + namespaceScope.importScope(createFilteringScope(scope, descriptor, platformToKotlinClassMap)); } } diff --git a/compiler/testData/diagnostics/tests/enum/starImportNestedClassAndEntries.kt b/compiler/testData/diagnostics/tests/enum/starImportNestedClassAndEntries.kt new file mode 100644 index 00000000000..55850414848 --- /dev/null +++ b/compiler/testData/diagnostics/tests/enum/starImportNestedClassAndEntries.kt @@ -0,0 +1,24 @@ +// FILE: E.kt +package foo + +enum class E { + ENTRY + ANOTHER + + class Nested { + class object { + fun foo() = 42 + } + } +} + +// FILE: main.kt +package bar + +import foo.E.* + +fun f1() = ENTRY +fun f2() = ANOTHER +fun f3() = Nested() +fun f4() = Nested.foo() +fun f5() = values() diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index 992e316f8c5..e564d52e518 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -2597,6 +2597,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage doTest("compiler/testData/diagnostics/tests/enum/kt2834.kt"); } + @TestMetadata("starImportNestedClassAndEntries.kt") + public void testStarImportNestedClassAndEntries() throws Exception { + doTest("compiler/testData/diagnostics/tests/enum/starImportNestedClassAndEntries.kt"); + } + @TestMetadata("compiler/testData/diagnostics/tests/enum/inner") public static class Inner extends AbstractDiagnosticsTestWithEagerResolve { public void testAllFilesPresentInInner() throws Exception {