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.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");