Don't load Object as a supertype for Java classes

#KT-4890 In Progress
 #KT-5002 Fixed
This commit is contained in:
Alexander Udalov
2014-07-21 17:28:06 +04:00
parent bea740b478
commit a79398fa00
34 changed files with 95 additions and 130 deletions
@@ -44,12 +44,9 @@ import org.jetbrains.jet.lang.descriptors.annotations.Annotations
import org.jetbrains.jet.lang.descriptors.ClassKind
import java.util.ArrayList
import org.jetbrains.jet.lang.types.checker.JetTypeChecker
import org.jetbrains.jet.lang.resolve.java.resolver.DescriptorResolverUtils
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaClassStaticsPackageFragmentDescriptor
import org.jetbrains.jet.lang.types.AbstractClassTypeConstructor
import org.jetbrains.jet.lang.resolve.java.lazy.resolveTopLevelClassInModule
import org.jetbrains.jet.lang.descriptors.impl.EnumClassObjectDescriptor
import org.jetbrains.jet.lang.descriptors.SourceElement
class LazyJavaClassDescriptor(
private val outerC: LazyJavaResolverContextWithTypes,
@@ -174,29 +171,16 @@ class LazyJavaClassDescriptor(
override fun getParameters(): List<TypeParameterDescriptor> = _parameters()
private val _supertypes = c.storageManager.createLazyValue<Collection<JetType>> {
val supertypes = jClass.getSupertypes()
if (supertypes.isEmpty()) {
val objectFqName = DescriptorResolverUtils.OBJECT_FQ_NAME
if (jClass.getFqName() == objectFqName) {
listOf(KotlinBuiltIns.getInstance().getAnyType())
}
else {
val objectType = c.resolveTopLevelClassInModule(objectFqName)?.getDefaultType()
// If java.lang.Object is not found, we simply use Any to recover
listOf(objectType ?: KotlinBuiltIns.getInstance().getAnyType())
}
}
else
supertypes.stream()
.map {
supertype ->
c.typeResolver.transformJavaType(supertype, TypeUsage.SUPERTYPE.toAttributes())
}
.filter { supertype -> !supertype.isError() }
.toList()
.ifEmpty {
listOf(KotlinBuiltIns.getInstance().getAnyType())
}
jClass.getSupertypes().stream()
.map {
supertype ->
c.typeResolver.transformJavaType(supertype, TypeUsage.SUPERTYPE.toAttributes())
}
.filter { supertype -> !supertype.isError() }
.toList()
.ifEmpty {
listOf(KotlinBuiltIns.getInstance().getAnyType())
}
}
override fun getSupertypes(): Collection<JetType> = _supertypes()
@@ -37,8 +37,6 @@ import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
import java.util.*;
public final class DescriptorResolverUtils {
public static final FqName OBJECT_FQ_NAME = new FqName("java.lang.Object");
private DescriptorResolverUtils() {
}
@@ -331,6 +331,8 @@ public class SingleAbstractMethodUtils {
}
private static class OnlyAbstractMethodFinder {
private static final FqName OBJECT_FQ_NAME = new FqName("java.lang.Object");
private JavaMethod foundMethod;
private JavaTypeSubstitutor foundClassSubstitutor;
@@ -342,7 +344,7 @@ public class SingleAbstractMethodUtils {
}
assert classifier instanceof JavaClass : "Classifier should be a class here: " + classifier;
JavaClass javaClass = (JavaClass) classifier;
if (DescriptorResolverUtils.OBJECT_FQ_NAME.equals(javaClass.getFqName())) {
if (OBJECT_FQ_NAME.equals(javaClass.getFqName())) {
return true;
}
for (JavaMethod method : javaClass.getMethods()) {