Don't load Object as a supertype for Java classes
#KT-4890 In Progress #KT-5002 Fixed
This commit is contained in:
+10
-26
@@ -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()
|
||||
|
||||
-2
@@ -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() {
|
||||
}
|
||||
|
||||
|
||||
+3
-1
@@ -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()) {
|
||||
|
||||
Reference in New Issue
Block a user