diff --git a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinLightFieldForDeclaration.kt b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinLightFieldForDeclaration.kt index 6ea7e55231a..b093d0d04da 100644 --- a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinLightFieldForDeclaration.kt +++ b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinLightFieldForDeclaration.kt @@ -17,13 +17,13 @@ package org.jetbrains.jet.asJava import com.intellij.psi.* -import org.jetbrains.jet.lang.psi.JetProperty +import org.jetbrains.jet.lang.psi.JetDeclaration class KotlinLightFieldForDeclaration( manager: PsiManager, - origin: JetProperty, + origin: JetDeclaration, field: PsiField, containingClass: PsiClass -) : KotlinLightField(manager, origin, field, containingClass) { +) : KotlinLightField(manager, origin, field, containingClass) { override fun copy() = KotlinLightFieldForDeclaration(getManager()!!, getOrigin(), getDelegate(), getContainingClass()!!) } diff --git a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinWrappingLightClass.java b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinWrappingLightClass.java index 44562a9bbca..b3770aca16c 100644 --- a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinWrappingLightClass.java +++ b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinWrappingLightClass.java @@ -117,8 +117,8 @@ public abstract class KotlinWrappingLightClass extends AbstractLightClass implem return new KotlinLightEnumConstant(myManager, (JetEnumEntry) declaration, ((PsiEnumConstant) field), KotlinWrappingLightClass.this); } - if (declaration instanceof JetProperty) { - return new KotlinLightFieldForDeclaration(myManager, (JetProperty) declaration, field, KotlinWrappingLightClass.this); + if (declaration != null) { + return new KotlinLightFieldForDeclaration(myManager, declaration, field, KotlinWrappingLightClass.this); } return new LightField(myManager, field, KotlinWrappingLightClass.this); } diff --git a/idea/testData/resolve/referenceInJava/ClassObjectField.java b/idea/testData/resolve/referenceInJava/ClassObjectField.java new file mode 100644 index 00000000000..fa8a730dae7 --- /dev/null +++ b/idea/testData/resolve/referenceInJava/ClassObjectField.java @@ -0,0 +1,7 @@ +public class ClassObjectField { + public static void foo() { + k.ClassWithClassObject.OBJECT$.f(); + } +} + +// REF: class object of (k).ClassWithClassObject diff --git a/idea/testData/resolve/referenceInJava/ObjectInstance.java b/idea/testData/resolve/referenceInJava/ObjectInstance.java new file mode 100644 index 00000000000..75d94e06485 --- /dev/null +++ b/idea/testData/resolve/referenceInJava/ObjectInstance.java @@ -0,0 +1,7 @@ +public class ObjectInstance { + public static void foo() { + k.KotlinObject.INSTANCE$.f(); + } +} + +// REF: (k).KotlinObject diff --git a/idea/testData/resolve/referenceInJava/dependencies.kt b/idea/testData/resolve/referenceInJava/dependencies.kt index e49a2907925..a0c7d3716f1 100644 --- a/idea/testData/resolve/referenceInJava/dependencies.kt +++ b/idea/testData/resolve/referenceInJava/dependencies.kt @@ -11,4 +11,14 @@ public enum class EnumClass { public fun topLevelFun() { +} + +public class ClassWithClassObject { + class object { + fun f() = 1 + } +} + +public object KotlinObject { + fun f() = 1 } \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/resolve/ReferenceResolveInJavaTestGenerated.java b/idea/tests/org/jetbrains/jet/resolve/ReferenceResolveInJavaTestGenerated.java index 043a5ce0a53..086b014132c 100644 --- a/idea/tests/org/jetbrains/jet/resolve/ReferenceResolveInJavaTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/resolve/ReferenceResolveInJavaTestGenerated.java @@ -44,6 +44,12 @@ public class ReferenceResolveInJavaTestGenerated extends AbstractReferenceResolv doTest(fileName); } + @TestMetadata("ClassObjectField.java") + public void testClassObjectField() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/resolve/referenceInJava/ClassObjectField.java"); + doTest(fileName); + } + @TestMetadata("Constructor.java") public void testConstructor() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/resolve/referenceInJava/Constructor.java"); @@ -68,6 +74,12 @@ public class ReferenceResolveInJavaTestGenerated extends AbstractReferenceResolv doTest(fileName); } + @TestMetadata("ObjectInstance.java") + public void testObjectInstance() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/resolve/referenceInJava/ObjectInstance.java"); + doTest(fileName); + } + @TestMetadata("PackageFacade.java") public void testPackageFacade() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/resolve/referenceInJava/PackageFacade.java"); diff --git a/idea/tests/org/jetbrains/jet/testing/ReferenceUtils.java b/idea/tests/org/jetbrains/jet/testing/ReferenceUtils.java index 451bdb92a56..784ba908bb7 100644 --- a/idea/tests/org/jetbrains/jet/testing/ReferenceUtils.java +++ b/idea/tests/org/jetbrains/jet/testing/ReferenceUtils.java @@ -20,11 +20,14 @@ import com.intellij.navigation.ItemPresentation; import com.intellij.navigation.NavigationItem; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiPackage; +import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.PathUtil; import kotlin.Function1; import kotlin.KotlinPackage; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.InTextDirectivesUtils; +import org.jetbrains.jet.lang.psi.JetClass; +import org.jetbrains.jet.lang.psi.JetObjectDeclaration; import org.jetbrains.jet.plugin.PluginTestCaseBase; import org.junit.Assert; @@ -36,6 +39,14 @@ public final class ReferenceUtils { public static String renderAsGotoImplementation(@NotNull PsiElement element) { PsiElement navigationElement = element.getNavigationElement(); + + if (navigationElement instanceof JetObjectDeclaration && ((JetObjectDeclaration) navigationElement).isClassObject()) { + //default presenter return null for class object + JetClass containingClass = PsiTreeUtil.getParentOfType(navigationElement, JetClass.class); + assert containingClass != null; + return "class object of " + renderAsGotoImplementation(containingClass); + } + Assert.assertTrue(navigationElement instanceof NavigationItem); ItemPresentation presentation = ((NavigationItem) navigationElement).getPresentation(); diff --git a/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.kt b/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.kt index d176afc09ac..020b526a8f7 100644 --- a/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.kt +++ b/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.kt @@ -31,12 +31,12 @@ import org.jetbrains.jet.lang.psi.JetClassOrObject import org.jetbrains.jet.lang.psi.psiUtil.getParentByType import org.jetbrains.jet.lang.psi.psiUtil.isExtensionDeclaration import org.jetbrains.jet.lang.psi.JetPropertyAccessor -import com.intellij.psi.impl.light.LightField -import org.jetbrains.jet.lang.resolve.java.JvmAbi import org.jetbrains.jet.lang.psi.JetParameter import org.jetbrains.jet.lang.psi.JetNamedDeclaration import org.jetbrains.jet.lang.resolve.java.JvmPrimitiveType import org.jetbrains.jet.lang.resolve.name.FqName +import org.jetbrains.jet.asJava.KotlinLightField +import org.jetbrains.jet.lang.psi.JetObjectDeclaration open class ExpressionVisitor(private val converter: Converter) : JavaElementVisitor() { private val typeConverter = converter.typeConverter @@ -339,11 +339,9 @@ open class ExpressionVisitor(private val converter: Converter) : JavaElementVisi identifier = Identifier("size", isNullable).assignNoPrototype() } else if (qualifier != null) { - if (referenceName == JvmAbi.CLASS_OBJECT_FIELD || referenceName == JvmAbi.INSTANCE_FIELD) { - if (target is LightField) { //TODO: should be KotlinLightField with check of origin here, see KT-5188 - result = converter.convertExpression(qualifier) - return - } + if (target is KotlinLightField<*, *> && target.getOrigin() is JetObjectDeclaration) { + result = converter.convertExpression(qualifier) + return } } else {