Build class hierarchy for classes from BuiltIns
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
<node text="List (java.util)" base="true">
|
||||
<node text="Collection (java.util)">
|
||||
<node text="Iterable (java.lang)"/>
|
||||
</node>
|
||||
</node>
|
||||
@@ -0,0 +1,3 @@
|
||||
val a: List<caret><String>
|
||||
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
<node text="Object (java.lang)">
|
||||
<node text="Number (java.lang)">
|
||||
<node text="Integer (java.lang)" base="true"/>
|
||||
</node>
|
||||
</node>
|
||||
@@ -0,0 +1,3 @@
|
||||
val a: Int<caret>
|
||||
|
||||
|
||||
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user