Build class hierarchy for classes from BuiltIns

This commit is contained in:
Natalia.Ukhorskaya
2013-03-27 18:32:57 +04:00
parent f4a0808a28
commit 221df82c01
6 changed files with 58 additions and 2 deletions
@@ -40,21 +40,33 @@ import gnu.trove.THashSet;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.TestOnly; import org.jetbrains.annotations.TestOnly;
import org.jetbrains.asm4.Type;
import org.jetbrains.jet.asJava.LightClassUtil; import org.jetbrains.jet.asJava.LightClassUtil;
import org.jetbrains.jet.codegen.AsmUtil;
import org.jetbrains.jet.codegen.binding.PsiCodegenPredictor; import org.jetbrains.jet.codegen.binding.PsiCodegenPredictor;
import org.jetbrains.jet.lang.DefaultModuleConfiguration; import org.jetbrains.jet.lang.DefaultModuleConfiguration;
import org.jetbrains.jet.lang.descriptors.CallableDescriptor; 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.descriptors.ModuleDescriptor;
import org.jetbrains.jet.lang.psi.*; 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.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.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.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.FqName;
import org.jetbrains.jet.lang.resolve.name.Name; 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.lang.types.lang.KotlinBuiltIns;
import org.jetbrains.jet.lexer.JetTokens; 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.JetFullClassNameIndex;
import org.jetbrains.jet.plugin.stubindex.JetTopLevelFunctionsFqnNameIndex; import org.jetbrains.jet.plugin.stubindex.JetTopLevelFunctionsFqnNameIndex;
import org.jetbrains.jet.plugin.stubindex.JetTopLevelPropertiesFqnNameIndex; import org.jetbrains.jet.plugin.stubindex.JetTopLevelPropertiesFqnNameIndex;
@@ -342,6 +354,24 @@ public class JetSourceNavigationHelper {
if (originalClass != null) { if (originalClass != null) {
return originalClass; 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)) { if (!JetPsiUtil.isLocalClass(classOrObject)) {
return LightClassUtil.createLightClass(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"); doTypeClassHierarchyTest("idea/testData/hierarchy/class/type/JavaFromKotlinForKotlinClass");
} }
@TestMetadata("JetInt")
public void testJetInt() throws Exception {
doTypeClassHierarchyTest("idea/testData/hierarchy/class/type/JetInt");
}
@TestMetadata("KJKHierarchy") @TestMetadata("KJKHierarchy")
public void testKJKHierarchy() throws Exception { public void testKJKHierarchy() throws Exception {
doTypeClassHierarchyTest("idea/testData/hierarchy/class/type/KJKHierarchy"); 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); 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") @TestMetadata("TwoTraits")
public void testTwoTraits() throws Exception { public void testTwoTraits() throws Exception {
doSuperClassHierarchyTest("idea/testData/hierarchy/class/super/TwoTraits"); doSuperClassHierarchyTest("idea/testData/hierarchy/class/super/TwoTraits");