From 53b2bbad68da0b773581474e435be7734c75880d Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Mon, 11 Feb 2013 16:08:20 +0400 Subject: [PATCH] Discover class objects for light class generation in the compiler #KT-3337 In Progress LightClasses: class object's property getter unresolved in Java, but compiles OK --- .../CliLightClassGenerationSupport.java | 24 ++++++++++++++++--- .../jet/lang/resolve/java/JvmAbi.java | 8 +++++++ .../asJava/lightClasses/ClassObject.kt | 6 +++++ .../asJava/KotlinLightClassCoherenceTest.java | 9 +++++-- 4 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 compiler/testData/asJava/lightClasses/ClassObject.kt diff --git a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/CliLightClassGenerationSupport.java b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/CliLightClassGenerationSupport.java index a8b5fb028fd..7e711909d20 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/CliLightClassGenerationSupport.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/CliLightClassGenerationSupport.java @@ -33,10 +33,9 @@ import org.jetbrains.jet.asJava.LightClassGenerationSupport; import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; -import org.jetbrains.jet.lang.psi.JetClassOrObject; -import org.jetbrains.jet.lang.psi.JetDeclaration; -import org.jetbrains.jet.lang.psi.JetFile; +import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.*; +import org.jetbrains.jet.lang.resolve.java.JvmAbi; import org.jetbrains.jet.lang.resolve.name.FqName; import java.util.Collection; @@ -95,6 +94,25 @@ public class CliLightClassGenerationSupport extends LightClassGenerationSupport return Collections.singletonList((JetClassOrObject) element); } } + + if (JvmAbi.isClassObjectFqName(fqName)) { + Collection parentClasses = findClassOrObjectDeclarations(fqName.parent(), searchScope); + return ContainerUtil.mapNotNull(parentClasses, + new Function() { + @Override + public JetClassOrObject fun(JetClassOrObject classOrObject) { + if (classOrObject instanceof JetClass) { + JetClass jetClass = (JetClass) classOrObject; + JetClassObject classObject = jetClass.getClassObject(); + if (classObject != null) { + return classObject.getObjectDeclaration(); + } + } + return null; + } + }); + } + return Collections.emptyList(); } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmAbi.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmAbi.java index 62eb07c5570..2decd146c20 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmAbi.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmAbi.java @@ -16,6 +16,10 @@ package org.jetbrains.jet.lang.resolve.java; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.resolve.name.FqName; +import org.jetbrains.jet.lang.resolve.name.Name; + public class JvmAbi { /** * This constant is used to identify binary format (class file) versions @@ -39,6 +43,10 @@ public class JvmAbi { public static final JvmClassName JETBRAINS_NOT_NULL_ANNOTATION = JvmClassName.byFqNameWithoutInnerClasses("org.jetbrains.annotations.NotNull"); + public static boolean isClassObjectFqName(@NotNull FqName fqName) { + return fqName.lastSegmentIs(Name.identifier(CLASS_OBJECT_CLASS_NAME)); + } + private JvmAbi() { } } diff --git a/compiler/testData/asJava/lightClasses/ClassObject.kt b/compiler/testData/asJava/lightClasses/ClassObject.kt new file mode 100644 index 00000000000..5d4fb2787c8 --- /dev/null +++ b/compiler/testData/asJava/lightClasses/ClassObject.kt @@ -0,0 +1,6 @@ +package test + +class WithClassObject { + class object { + } +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/asJava/KotlinLightClassCoherenceTest.java b/compiler/tests/org/jetbrains/jet/asJava/KotlinLightClassCoherenceTest.java index 7124b97c987..1e014000a6c 100644 --- a/compiler/tests/org/jetbrains/jet/asJava/KotlinLightClassCoherenceTest.java +++ b/compiler/tests/org/jetbrains/jet/asJava/KotlinLightClassCoherenceTest.java @@ -36,7 +36,8 @@ public class KotlinLightClassCoherenceTest extends KotlinAsJavaTestBase { protected List getKotlinSourceRoots() { return Lists.newArrayList( new File("compiler/testData/asJava/lightClasses/Declared.kt"), - new File("compiler/testData/asJava/lightClasses/Package.kt") + new File("compiler/testData/asJava/lightClasses/Package.kt"), + new File("compiler/testData/asJava/lightClasses/ClassObject.kt") ); } @@ -48,7 +49,7 @@ public class KotlinLightClassCoherenceTest extends KotlinAsJavaTestBase { @NotNull protected PsiClass doTest(String qualifiedName) { KotlinLightClass psiClass = (KotlinLightClass) finder.findClass(qualifiedName, GlobalSearchScope.allScope(getProject())); - assertNotNull(psiClass); + assertNotNull("Class not found: " + qualifiedName, psiClass); Asserter asserter = new Asserter(); @@ -203,4 +204,8 @@ public class KotlinLightClassCoherenceTest extends KotlinAsJavaTestBase { public void testDeprecatedWithBracketsFQNSpaces() throws Exception { doTest(); } + + public void testClassObject() throws Exception { + doTest("test.WithClassObject.object"); + } }