From 5b1993f62a88e48b4b542ac4394e01df39978bf8 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 9 Sep 2014 14:11:07 +0400 Subject: [PATCH] Resolve "values" and "valueOf" in enum class object Import enum class's static scope into its class object's member scope --- .../impl/MutableClassDescriptor.java | 4 +++- .../lazy/descriptors/LazyClassDescriptor.java | 4 +++- .../valuesValueOfAndEntriesAccessibility.kt | 18 ++++++++++++++++++ .../checkers/JetDiagnosticsTestGenerated.java | 5 +++++ idea/testData/checker/ClassObjectInEnum.kt | 7 +++++++ 5 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/enum/valuesValueOfAndEntriesAccessibility.kt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/impl/MutableClassDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/impl/MutableClassDescriptor.java index 8b496a0331a..6fa6484dea8 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/impl/MutableClassDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/impl/MutableClassDescriptor.java @@ -81,10 +81,12 @@ public class MutableClassDescriptor extends ClassDescriptorBase implements Class .changeLockLevel(WritableScope.LockLevel.BOTH); this.scopeForMemberResolution = new WritableScopeImpl(scopeForSupertypeResolution, this, redeclarationHandler, "MemberResolution") .changeLockLevel(WritableScope.LockLevel.BOTH); - if (getKind() == ClassKind.TRAIT) { + + if (kind == ClassKind.TRAIT) { setUpScopeForInitializers(this); } + scopeForMemberResolution.importScope(staticScope); scopeForMemberResolution.addLabeledDeclaration(this); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassDescriptor.java index c53addf5d8f..607df3a3b05 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassDescriptor.java @@ -255,7 +255,9 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes thisScope, getScopeForMemberLookup(), getScopeForClassHeaderResolution(), - classObjectAdapterScope); + classObjectAdapterScope, + getStaticScope() + ); } @Override diff --git a/compiler/testData/diagnostics/tests/enum/valuesValueOfAndEntriesAccessibility.kt b/compiler/testData/diagnostics/tests/enum/valuesValueOfAndEntriesAccessibility.kt new file mode 100644 index 00000000000..3d5dcbae0c5 --- /dev/null +++ b/compiler/testData/diagnostics/tests/enum/valuesValueOfAndEntriesAccessibility.kt @@ -0,0 +1,18 @@ +enum class E { + ENTRY + + class object { + fun foo(): E = ENTRY + fun bar(): Array = values() + fun baz(): E = valueOf("ENTRY") + val valuez = values() + } + + fun oof(): E = ENTRY + fun rab(): Array = values() + fun zab(): E = valueOf("ENTRY") +} + +fun foo() = E.ENTRY +fun bar() = E.values() +fun baz() = E.valueOf("ENTRY") diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index c0c09416ade..42c81e400be 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -3826,6 +3826,11 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("valuesValueOfAndEntriesAccessibility.kt") + public void testValuesValueOfAndEntriesAccessibility() throws Exception { + doTest("compiler/testData/diagnostics/tests/enum/valuesValueOfAndEntriesAccessibility.kt"); + } + @TestMetadata("compiler/testData/diagnostics/tests/enum/inner") @TestDataPath("$PROJECT_ROOT") @RunWith(org.jetbrains.jet.JUnit3RunnerWithInners.class) diff --git a/idea/testData/checker/ClassObjectInEnum.kt b/idea/testData/checker/ClassObjectInEnum.kt index 661e9a6c272..3d5dcbae0c5 100644 --- a/idea/testData/checker/ClassObjectInEnum.kt +++ b/idea/testData/checker/ClassObjectInEnum.kt @@ -3,7 +3,14 @@ enum class E { class object { fun foo(): E = ENTRY + fun bar(): Array = values() + fun baz(): E = valueOf("ENTRY") + val valuez = values() } + + fun oof(): E = ENTRY + fun rab(): Array = values() + fun zab(): E = valueOf("ENTRY") } fun foo() = E.ENTRY