diff --git a/idea/src/org/jetbrains/jet/plugin/libraries/JetSourceNavigationHelper.java b/idea/src/org/jetbrains/jet/plugin/libraries/JetSourceNavigationHelper.java index 8bb0cdcff9a..944bc351699 100644 --- a/idea/src/org/jetbrains/jet/plugin/libraries/JetSourceNavigationHelper.java +++ b/idea/src/org/jetbrains/jet/plugin/libraries/JetSourceNavigationHelper.java @@ -40,21 +40,33 @@ import gnu.trove.THashSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.TestOnly; +import org.jetbrains.asm4.Type; import org.jetbrains.jet.asJava.LightClassUtil; +import org.jetbrains.jet.codegen.AsmUtil; import org.jetbrains.jet.codegen.binding.PsiCodegenPredictor; import org.jetbrains.jet.lang.DefaultModuleConfiguration; import org.jetbrains.jet.lang.descriptors.CallableDescriptor; +import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.ModuleDescriptor; import org.jetbrains.jet.lang.psi.*; +import org.jetbrains.jet.lang.resolve.BindingContext; +import org.jetbrains.jet.lang.resolve.BindingContextUtils; import org.jetbrains.jet.lang.resolve.java.JvmClassName; -import org.jetbrains.jet.lang.resolve.lazy.declarations.FileBasedDeclarationProviderFactory; +import org.jetbrains.jet.lang.resolve.java.JvmPrimitiveType; +import org.jetbrains.jet.lang.resolve.java.KotlinToJavaTypesMap; import org.jetbrains.jet.lang.resolve.lazy.KotlinCodeAnalyzer; -import org.jetbrains.jet.lang.resolve.lazy.storage.LockBasedStorageManager; import org.jetbrains.jet.lang.resolve.lazy.ResolveSession; +import org.jetbrains.jet.lang.resolve.lazy.declarations.FileBasedDeclarationProviderFactory; +import org.jetbrains.jet.lang.resolve.lazy.storage.LockBasedStorageManager; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; +import org.jetbrains.jet.lang.types.JetType; +import org.jetbrains.jet.lang.types.TypeUtils; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import org.jetbrains.jet.lexer.JetTokens; +import org.jetbrains.jet.plugin.caches.resolve.KotlinCacheManager; +import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache; +import org.jetbrains.jet.plugin.references.BuiltInsReferenceResolver; import org.jetbrains.jet.plugin.stubindex.JetFullClassNameIndex; import org.jetbrains.jet.plugin.stubindex.JetTopLevelFunctionsFqnNameIndex; import org.jetbrains.jet.plugin.stubindex.JetTopLevelPropertiesFqnNameIndex; @@ -342,6 +354,24 @@ public class JetSourceNavigationHelper { if (originalClass != null) { return originalClass; } + if (LightClassUtil.belongsToKotlinBuiltIns((JetFile) classOrObject.getContainingFile())) { + Name className = classOrObject.getNameAsName(); + assert className != null : "Class from BuiltIns should have a name"; + ClassDescriptor classDescriptor = KotlinBuiltIns.getInstance().getBuiltInClassByName(className); + Type javaAnalog = KotlinToJavaTypesMap.getInstance().getJavaAnalog(classDescriptor.getDefaultType()); + if (javaAnalog != null) { + if (AsmUtil.isPrimitive(javaAnalog)) { + javaAnalog = KotlinToJavaTypesMap.getInstance().getJavaAnalog(TypeUtils.makeNullable(classDescriptor.getDefaultType())); + assert javaAnalog != null : "Java analog should exists for primitive nullable type"; + } + if (javaAnalog.getSort() != Type.OBJECT) { + return null; + } + String fqName = JvmClassName.byType(javaAnalog).getFqName().getFqName(); + return JavaPsiFacade.getInstance(classOrObject.getProject()). + findClass(fqName, GlobalSearchScope.allScope(classOrObject.getProject())); + } + } if (!JetPsiUtil.isLocalClass(classOrObject)) { return LightClassUtil.createLightClass(classOrObject); } diff --git a/idea/testData/hierarchy/class/super/JetList/JetList_verification.xml b/idea/testData/hierarchy/class/super/JetList/JetList_verification.xml new file mode 100644 index 00000000000..92dbb2b3f46 --- /dev/null +++ b/idea/testData/hierarchy/class/super/JetList/JetList_verification.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/idea/testData/hierarchy/class/super/JetList/main.kt b/idea/testData/hierarchy/class/super/JetList/main.kt new file mode 100644 index 00000000000..ce1d613c67f --- /dev/null +++ b/idea/testData/hierarchy/class/super/JetList/main.kt @@ -0,0 +1,3 @@ +val a: List + + diff --git a/idea/testData/hierarchy/class/type/JetInt/JetInt_verification.xml b/idea/testData/hierarchy/class/type/JetInt/JetInt_verification.xml new file mode 100644 index 00000000000..3e855378629 --- /dev/null +++ b/idea/testData/hierarchy/class/type/JetInt/JetInt_verification.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/idea/testData/hierarchy/class/type/JetInt/main.kt b/idea/testData/hierarchy/class/type/JetInt/main.kt new file mode 100644 index 00000000000..e64cf594e7b --- /dev/null +++ b/idea/testData/hierarchy/class/type/JetInt/main.kt @@ -0,0 +1,3 @@ +val a: Int + + diff --git a/idea/tests/org/jetbrains/jet/plugin/hierarchy/HierarchyTestGenerated.java b/idea/tests/org/jetbrains/jet/plugin/hierarchy/HierarchyTestGenerated.java index de1332a6c05..ac1c5088ac9 100644 --- a/idea/tests/org/jetbrains/jet/plugin/hierarchy/HierarchyTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/plugin/hierarchy/HierarchyTestGenerated.java @@ -133,6 +133,11 @@ public class HierarchyTestGenerated extends AbstractHierarchyTest { doTypeClassHierarchyTest("idea/testData/hierarchy/class/type/JavaFromKotlinForKotlinClass"); } + @TestMetadata("JetInt") + public void testJetInt() throws Exception { + doTypeClassHierarchyTest("idea/testData/hierarchy/class/type/JetInt"); + } + @TestMetadata("KJKHierarchy") public void testKJKHierarchy() throws Exception { doTypeClassHierarchyTest("idea/testData/hierarchy/class/type/KJKHierarchy"); @@ -161,6 +166,11 @@ public class HierarchyTestGenerated extends AbstractHierarchyTest { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("idea/testData/hierarchy/class/super"), Pattern.compile("^(.+)$"), false); } + @TestMetadata("JetList") + public void testJetList() throws Exception { + doSuperClassHierarchyTest("idea/testData/hierarchy/class/super/JetList"); + } + @TestMetadata("TwoTraits") public void testTwoTraits() throws Exception { doSuperClassHierarchyTest("idea/testData/hierarchy/class/super/TwoTraits");