From a26c37419e107a8d7e11ce78ce9fcb667d2a4e8a Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Fri, 27 Dec 2013 12:31:49 +0400 Subject: [PATCH] Synthetic classes created for enum entries --- .../annotations/RetentionInJava.java | 6 ++++++ .../annotations/RetentionInJava.kt | 8 ++++++++ .../BlackBoxWithJavaCodegenTestGenerated.java | 5 +++++ .../descriptors/LazyJavaClassMemberScope.kt | 20 ++++++++++++++++--- .../lazy/descriptors/LazyJavaMemberScope.kt | 2 +- 5 files changed, 37 insertions(+), 4 deletions(-) create mode 100644 compiler/testData/codegen/boxWithJava/annotations/RetentionInJava.java create mode 100644 compiler/testData/codegen/boxWithJava/annotations/RetentionInJava.kt diff --git a/compiler/testData/codegen/boxWithJava/annotations/RetentionInJava.java b/compiler/testData/codegen/boxWithJava/annotations/RetentionInJava.java new file mode 100644 index 00000000000..d8eaa2f2ad5 --- /dev/null +++ b/compiler/testData/codegen/boxWithJava/annotations/RetentionInJava.java @@ -0,0 +1,6 @@ +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.CLASS) +@interface Foo { +} \ No newline at end of file diff --git a/compiler/testData/codegen/boxWithJava/annotations/RetentionInJava.kt b/compiler/testData/codegen/boxWithJava/annotations/RetentionInJava.kt new file mode 100644 index 00000000000..afef366eeae --- /dev/null +++ b/compiler/testData/codegen/boxWithJava/annotations/RetentionInJava.kt @@ -0,0 +1,8 @@ +import java.lang.annotation.* + +Foo class Bar + +fun box(): String { + Bar() + return "OK" +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithJavaCodegenTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithJavaCodegenTestGenerated.java index b3a7f372212..281d1f0884b 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithJavaCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithJavaCodegenTestGenerated.java @@ -68,6 +68,11 @@ public class BlackBoxWithJavaCodegenTestGenerated extends AbstractBlackBoxCodege doTestWithJava("compiler/testData/codegen/boxWithJava/annotations/javaPropertyWithIntInitializer.kt"); } + @TestMetadata("RetentionInJava.kt") + public void testRetentionInJava() throws Exception { + doTestWithJava("compiler/testData/codegen/boxWithJava/annotations/RetentionInJava.kt"); + } + } @TestMetadata("compiler/testData/codegen/boxWithJava/callableReference") diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaClassMemberScope.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaClassMemberScope.kt index 0843b5e966d..316b846ea0a 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaClassMemberScope.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaClassMemberScope.kt @@ -34,6 +34,8 @@ import org.jetbrains.jet.lang.resolve.java.lazy.types.toAttributes import org.jetbrains.jet.lang.resolve.java.resolver.DescriptorResolverUtils import org.jetbrains.jet.lang.resolve.java.structure.JavaMember import org.jetbrains.jet.lang.resolve.DescriptorUtils +import org.jetbrains.jet.lang.descriptors.impl.EnumEntrySyntheticClassDescriptor +import org.jetbrains.jet.storage.get public class LazyJavaClassMemberScope( c: LazyJavaResolverContextWithTypes, @@ -146,11 +148,23 @@ public class LazyJavaClassMemberScope( jClass.getInnerClasses().valuesToMap { c -> c.getName() } } + private val enumEntryIndex = c.storageManager.createLazyValue { + jClass.getFields().filter { it.isEnumEntry() }.valuesToMap { f -> f.getName() } + } + private val nestedClasses = c.storageManager.createMemoizedFunctionWithNullableValues { (name: Name) -> val jNestedClass = nestedClassIndex()[name] - if (jNestedClass == null) - null + if (jNestedClass == null) { + val field = enumEntryIndex()[name] + if (field != null) { + EnumEntrySyntheticClassDescriptor.create(c.storageManager, getContainingDeclaration(), name, + c.storageManager.createLazyValue { + memberIndex().getAllFieldNames() + memberIndex().getAllMetodNames() + }) + } + else null + } else { // TODO: this caching is a temporary workaround, should be replaced with properly caching the whole LazyJavaSubModule val alreadyResolved = c.javaResolverCache.getClass(jNestedClass) @@ -164,7 +178,7 @@ public class LazyJavaClassMemberScope( } override fun getClassifier(name: Name): ClassifierDescriptor? = if (enumClassObject) null else nestedClasses(name) - override fun getAllClassNames(): Collection = nestedClassIndex().keySet() + override fun getAllClassNames(): Collection = nestedClassIndex().keySet() + enumEntryIndex().keySet() // TODO override fun getImplicitReceiversHierarchy(): List = listOf() diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaMemberScope.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaMemberScope.kt index 1137596bd5c..5eea25f3b7d 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaMemberScope.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaMemberScope.kt @@ -59,7 +59,7 @@ public abstract class LazyJavaMemberScope( override fun getContainingDeclaration() = _containingDeclaration - private val memberIndex = c.storageManager.createLazyValue { + protected val memberIndex: NotNullLazyValue = c.storageManager.createLazyValue { computeMemberIndex() }