JDR: Use module to resolve special classes

This commit is contained in:
Pavel V. Talanov
2014-06-02 19:53:03 +04:00
parent ccae693ed2
commit b69ab12db7
3 changed files with 15 additions and 5 deletions
@@ -48,6 +48,7 @@ import org.jetbrains.jet.lang.resolve.java.lazy.types.toAttributes
import org.jetbrains.jet.renderer.DescriptorRenderer
import org.jetbrains.jet.lang.resolve.java.mapping.JavaToKotlinClassMap
import org.jetbrains.jet.lang.types.TypeUtils
import org.jetbrains.jet.lang.resolve.java.lazy.resolveTopLevelClassInModule
private object DEPRECATED_IN_JAVA : JavaLiteralAnnotationArgument {
override fun getName(): Name? = null
@@ -159,7 +160,8 @@ class LazyJavaAnnotationDescriptor(
private fun resolveFromJavaClassObjectType(javaType: JavaType): CompileTimeConstant<*>? {
// Class type is never nullable in 'Foo.class' in Java
val `type` = TypeUtils.makeNotNullable(c.typeResolver.transformJavaType(javaType, TypeUsage.MEMBER_SIGNATURE_INVARIANT.toAttributes()))
val jlClass = c.javaClassResolver.resolveClassByFqName(FqName("java.lang.Class"))
val jlClass = c.resolveTopLevelClassInModule(FqName("java.lang.Class"))
if (jlClass == null) return null
val arguments = listOf(TypeProjectionImpl(`type`))
@@ -53,6 +53,7 @@ import org.jetbrains.jet.lang.resolve.java.descriptor.JavaClassStaticsPackageFra
import org.jetbrains.jet.lang.descriptors.impl.MutableClassDescriptor
import org.jetbrains.jet.lang.resolve.name.SpecialNames
import org.jetbrains.jet.lang.types.AbstractClassTypeConstructor
import org.jetbrains.jet.lang.resolve.java.lazy.resolveTopLevelClassInModule
class LazyJavaClassDescriptor(
private val outerC: LazyJavaResolverContextWithTypes,
@@ -203,15 +204,17 @@ class LazyJavaClassDescriptor(
private val _supertypes = c.storageManager.createLazyValue<Collection<JetType>> {
val supertypes = jClass.getSupertypes()
if (supertypes.isEmpty())
if (jClass.getFqName() == DescriptorResolverUtils.OBJECT_FQ_NAME) {
if (supertypes.isEmpty()) {
val objectFqName = DescriptorResolverUtils.OBJECT_FQ_NAME
if (jClass.getFqName() == objectFqName) {
listOf(KotlinBuiltIns.getInstance().getAnyType())
}
else {
val jlObject = c.javaClassResolver.resolveClassByFqName(DescriptorResolverUtils.OBJECT_FQ_NAME)?.getDefaultType()
val objectType = c.resolveTopLevelClassInModule(objectFqName)?.getDefaultType()
// If java.lang.Object is not found, we simply use Any to recover
listOf(jlObject ?: KotlinBuiltIns.getInstance().getAnyType())
listOf(objectType ?: KotlinBuiltIns.getInstance().getAnyType())
}
}
else
supertypes.stream()
.map {
@@ -114,3 +114,8 @@ private fun LazyJavaResolverContext.resolveBinaryClass(kotlinClass: KotlinJvmBin
return null
}
fun LazyJavaResolverContext.resolveTopLevelClassInModule(fqName: FqName): ClassDescriptor? {
return packageFragmentProvider.getModule().getPackage(fqName.parent())
?.getMemberScope()?.getClassifier(fqName.shortName()) as? ClassDescriptor
}