Fix not generating KotlinLightField for OBJECT$ and INSTANCE$ fields
Fix navigation from Java to such fields Fix TODO in converter
This commit is contained in:
+3
-3
@@ -17,13 +17,13 @@
|
|||||||
package org.jetbrains.jet.asJava
|
package org.jetbrains.jet.asJava
|
||||||
|
|
||||||
import com.intellij.psi.*
|
import com.intellij.psi.*
|
||||||
import org.jetbrains.jet.lang.psi.JetProperty
|
import org.jetbrains.jet.lang.psi.JetDeclaration
|
||||||
|
|
||||||
class KotlinLightFieldForDeclaration(
|
class KotlinLightFieldForDeclaration(
|
||||||
manager: PsiManager,
|
manager: PsiManager,
|
||||||
origin: JetProperty,
|
origin: JetDeclaration,
|
||||||
field: PsiField,
|
field: PsiField,
|
||||||
containingClass: PsiClass
|
containingClass: PsiClass
|
||||||
) : KotlinLightField<JetProperty, PsiField>(manager, origin, field, containingClass) {
|
) : KotlinLightField<JetDeclaration, PsiField>(manager, origin, field, containingClass) {
|
||||||
override fun copy() = KotlinLightFieldForDeclaration(getManager()!!, getOrigin(), getDelegate(), getContainingClass()!!)
|
override fun copy() = KotlinLightFieldForDeclaration(getManager()!!, getOrigin(), getDelegate(), getContainingClass()!!)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -117,8 +117,8 @@ public abstract class KotlinWrappingLightClass extends AbstractLightClass implem
|
|||||||
return new KotlinLightEnumConstant(myManager, (JetEnumEntry) declaration, ((PsiEnumConstant) field),
|
return new KotlinLightEnumConstant(myManager, (JetEnumEntry) declaration, ((PsiEnumConstant) field),
|
||||||
KotlinWrappingLightClass.this);
|
KotlinWrappingLightClass.this);
|
||||||
}
|
}
|
||||||
if (declaration instanceof JetProperty) {
|
if (declaration != null) {
|
||||||
return new KotlinLightFieldForDeclaration(myManager, (JetProperty) declaration, field, KotlinWrappingLightClass.this);
|
return new KotlinLightFieldForDeclaration(myManager, declaration, field, KotlinWrappingLightClass.this);
|
||||||
}
|
}
|
||||||
return new LightField(myManager, field, KotlinWrappingLightClass.this);
|
return new LightField(myManager, field, KotlinWrappingLightClass.this);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
public class ClassObjectField {
|
||||||
|
public static void foo() {
|
||||||
|
k.ClassWithClassObject.OB<caret>JECT$.f();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// REF: class object of (k).ClassWithClassObject
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
public class ObjectInstance {
|
||||||
|
public static void foo() {
|
||||||
|
k.KotlinObject.INSTANCE<caret>$.f();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// REF: (k).KotlinObject
|
||||||
@@ -11,4 +11,14 @@ public enum class EnumClass {
|
|||||||
|
|
||||||
|
|
||||||
public fun topLevelFun() {
|
public fun topLevelFun() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ClassWithClassObject {
|
||||||
|
class object {
|
||||||
|
fun f() = 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public object KotlinObject {
|
||||||
|
fun f() = 1
|
||||||
}
|
}
|
||||||
@@ -44,6 +44,12 @@ public class ReferenceResolveInJavaTestGenerated extends AbstractReferenceResolv
|
|||||||
doTest(fileName);
|
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")
|
@TestMetadata("Constructor.java")
|
||||||
public void testConstructor() throws Exception {
|
public void testConstructor() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/resolve/referenceInJava/Constructor.java");
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/resolve/referenceInJava/Constructor.java");
|
||||||
@@ -68,6 +74,12 @@ public class ReferenceResolveInJavaTestGenerated extends AbstractReferenceResolv
|
|||||||
doTest(fileName);
|
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")
|
@TestMetadata("PackageFacade.java")
|
||||||
public void testPackageFacade() throws Exception {
|
public void testPackageFacade() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/resolve/referenceInJava/PackageFacade.java");
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/resolve/referenceInJava/PackageFacade.java");
|
||||||
|
|||||||
@@ -20,11 +20,14 @@ import com.intellij.navigation.ItemPresentation;
|
|||||||
import com.intellij.navigation.NavigationItem;
|
import com.intellij.navigation.NavigationItem;
|
||||||
import com.intellij.psi.PsiElement;
|
import com.intellij.psi.PsiElement;
|
||||||
import com.intellij.psi.PsiPackage;
|
import com.intellij.psi.PsiPackage;
|
||||||
|
import com.intellij.psi.util.PsiTreeUtil;
|
||||||
import com.intellij.util.PathUtil;
|
import com.intellij.util.PathUtil;
|
||||||
import kotlin.Function1;
|
import kotlin.Function1;
|
||||||
import kotlin.KotlinPackage;
|
import kotlin.KotlinPackage;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.jet.InTextDirectivesUtils;
|
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.jetbrains.jet.plugin.PluginTestCaseBase;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
|
|
||||||
@@ -36,6 +39,14 @@ public final class ReferenceUtils {
|
|||||||
|
|
||||||
public static String renderAsGotoImplementation(@NotNull PsiElement element) {
|
public static String renderAsGotoImplementation(@NotNull PsiElement element) {
|
||||||
PsiElement navigationElement = element.getNavigationElement();
|
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);
|
Assert.assertTrue(navigationElement instanceof NavigationItem);
|
||||||
ItemPresentation presentation = ((NavigationItem) navigationElement).getPresentation();
|
ItemPresentation presentation = ((NavigationItem) navigationElement).getPresentation();
|
||||||
|
|
||||||
|
|||||||
@@ -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.getParentByType
|
||||||
import org.jetbrains.jet.lang.psi.psiUtil.isExtensionDeclaration
|
import org.jetbrains.jet.lang.psi.psiUtil.isExtensionDeclaration
|
||||||
import org.jetbrains.jet.lang.psi.JetPropertyAccessor
|
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.JetParameter
|
||||||
import org.jetbrains.jet.lang.psi.JetNamedDeclaration
|
import org.jetbrains.jet.lang.psi.JetNamedDeclaration
|
||||||
import org.jetbrains.jet.lang.resolve.java.JvmPrimitiveType
|
import org.jetbrains.jet.lang.resolve.java.JvmPrimitiveType
|
||||||
import org.jetbrains.jet.lang.resolve.name.FqName
|
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() {
|
open class ExpressionVisitor(private val converter: Converter) : JavaElementVisitor() {
|
||||||
private val typeConverter = converter.typeConverter
|
private val typeConverter = converter.typeConverter
|
||||||
@@ -339,11 +339,9 @@ open class ExpressionVisitor(private val converter: Converter) : JavaElementVisi
|
|||||||
identifier = Identifier("size", isNullable).assignNoPrototype()
|
identifier = Identifier("size", isNullable).assignNoPrototype()
|
||||||
}
|
}
|
||||||
else if (qualifier != null) {
|
else if (qualifier != null) {
|
||||||
if (referenceName == JvmAbi.CLASS_OBJECT_FIELD || referenceName == JvmAbi.INSTANCE_FIELD) {
|
if (target is KotlinLightField<*, *> && target.getOrigin() is JetObjectDeclaration) {
|
||||||
if (target is LightField) { //TODO: should be KotlinLightField with check of origin here, see KT-5188
|
result = converter.convertExpression(qualifier)
|
||||||
result = converter.convertExpression(qualifier)
|
return
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|||||||
Reference in New Issue
Block a user