Loading classes with wrong ABI version as Java classes

This commit is contained in:
Andrey Breslav
2014-01-01 16:48:48 +04:00
parent 2e4d166d6f
commit 5a49b6fda5
4 changed files with 25 additions and 10 deletions
@@ -102,7 +102,7 @@ public open class LazyJavaPackageFragmentProvider(
val (jClass, kClass) = c.findClassInJava(fqName)
if (jClass != null) return resolveClass(jClass)
if (kClass != null) return resolveKotlinBinaryClass(kClass)
if (kClass != null) return kClass
return outerContext.javaClassResolver.resolveClassByFqName(fqName)
}
}
@@ -30,7 +30,7 @@ public abstract class LazyJavaPackageFragmentScope(
val fqName = fqName.child(name)
val (jClass, kClass) = c.findClassInJava(fqName)
if (kClass != null)
c.packageFragmentProvider.resolveKotlinBinaryClass(kClass)
kClass
else if (jClass == null)
null
else {
@@ -24,7 +24,8 @@ import org.jetbrains.jet.lang.resolve.java.lazy.descriptors.LazyJavaTypeParamete
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor
import org.jetbrains.jet.lang.resolve.name.FqName
import org.jetbrains.jet.lang.resolve.java.resolver.JavaClassResolver
import org.jetbrains.jet.lang.resolve.kotlin.KotlinJvmBinaryClass
import org.jetbrains.jet.lang.resolve.kotlin.header.KotlinClassHeader
import org.jetbrains.jet.lang.resolve.kotlin.header.KotlinClassHeader.Kind
trait LazyJavaClassResolver {
fun resolveClass(javaClass: JavaClass): ClassDescriptor?
@@ -63,20 +64,34 @@ class LazyJavaTypeParameterResolver(
}
}
fun GlobalJavaResolverContext.findJavaClass(fqName: FqName): JavaClass? = findClassInJava(fqName).jClass
fun LazyJavaResolverContext.findJavaClass(fqName: FqName): JavaClass? = findClassInJava(fqName).jClass
data class JavaClassLookupResult(val jClass: JavaClass? = null, val kClass: KotlinJvmBinaryClass? = null)
data class JavaClassLookupResult(val jClass: JavaClass? = null, val kClass: ClassDescriptor? = null)
fun GlobalJavaResolverContext.findClassInJava(fqName: FqName): JavaClassLookupResult {
fun LazyJavaResolverContext.findClassInJava(fqName: FqName): JavaClassLookupResult {
// TODO: this should be governed by module separation logic
// Do not look for JavaClasses for Kotlin binaries & built-ins
if (JavaClassResolver.getKotlinBuiltinClassDescriptor(fqName) != null) {
return JavaClassLookupResult()
}
// Do not look for Kotlin binary classes
val kotlinClass = kotlinClassFinder.findKotlinClass(fqName)
if (kotlinClass != null) return JavaClassLookupResult(kClass = kotlinClass)
val header = kotlinClass?.getClassHeader()
if (kotlinClass != null && header != null) {
if (header.getKind() == KotlinClassHeader.Kind.CLASS) {
val descriptor = packageFragmentProvider.resolveKotlinBinaryClass(kotlinClass)
if (descriptor != null) {
return JavaClassLookupResult(kClass = descriptor)
}
}
else if (header.getKind() == KotlinClassHeader.Kind.INCOMPATIBLE_ABI_VERSION) {
errorReporter.reportIncompatibleAbiVersion(kotlinClass, header.getVersion())
}
else {
// This is a package or trait-impl or something like that
return JavaClassLookupResult()
}
}
val javaClass = finder.findClass(fqName)
if (javaClass == null) return JavaClassLookupResult()