Loading classes with wrong ABI version as Java classes
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
WARNING: $TESTDATA_DIR$/wrongAbiVersion.kt: (3, 9) Parameter 'x' is never used
|
WARNING: $TESTDATA_DIR$/wrongAbiVersion.kt: (3, 9) Parameter 'x' is never used
|
||||||
ERROR: $TESTDATA_DIR$/wrongAbiVersion.kt: (4, 3) Unresolved reference: bar
|
ERROR: $TESTDATA_DIR$/wrongAbiVersion.kt: (4, 3) Unresolved reference: bar
|
||||||
ERROR: $TESTDATA_DIR$/wrongAbiVersionLib/wrong/WrongPackage.class: (0, 0) Class 'wrong/WrongPackage' was compiled with an incompatible version of Kotlin. Its ABI version is -1, expected ABI version is 13
|
|
||||||
ERROR: $TESTDATA_DIR$/wrongAbiVersionLib/ClassWithWrongAbiVersion.class: (0, 0) Class 'ClassWithWrongAbiVersion' was compiled with an incompatible version of Kotlin. Its ABI version is -1, expected ABI version is 13
|
ERROR: $TESTDATA_DIR$/wrongAbiVersionLib/ClassWithWrongAbiVersion.class: (0, 0) Class 'ClassWithWrongAbiVersion' was compiled with an incompatible version of Kotlin. Its ABI version is -1, expected ABI version is 13
|
||||||
COMPILATION_ERROR
|
ERROR: $TESTDATA_DIR$/wrongAbiVersionLib/wrong/WrongPackage.class: (0, 0) Class 'wrong/WrongPackage' was compiled with an incompatible version of Kotlin. Its ABI version is -1, expected ABI version is 13
|
||||||
|
COMPILATION_ERROR
|
||||||
+1
-1
@@ -102,7 +102,7 @@ public open class LazyJavaPackageFragmentProvider(
|
|||||||
|
|
||||||
val (jClass, kClass) = c.findClassInJava(fqName)
|
val (jClass, kClass) = c.findClassInJava(fqName)
|
||||||
if (jClass != null) return resolveClass(jClass)
|
if (jClass != null) return resolveClass(jClass)
|
||||||
if (kClass != null) return resolveKotlinBinaryClass(kClass)
|
if (kClass != null) return kClass
|
||||||
return outerContext.javaClassResolver.resolveClassByFqName(fqName)
|
return outerContext.javaClassResolver.resolveClassByFqName(fqName)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -30,7 +30,7 @@ public abstract class LazyJavaPackageFragmentScope(
|
|||||||
val fqName = fqName.child(name)
|
val fqName = fqName.child(name)
|
||||||
val (jClass, kClass) = c.findClassInJava(fqName)
|
val (jClass, kClass) = c.findClassInJava(fqName)
|
||||||
if (kClass != null)
|
if (kClass != null)
|
||||||
c.packageFragmentProvider.resolveKotlinBinaryClass(kClass)
|
kClass
|
||||||
else if (jClass == null)
|
else if (jClass == null)
|
||||||
null
|
null
|
||||||
else {
|
else {
|
||||||
|
|||||||
+21
-6
@@ -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.descriptors.DeclarationDescriptor
|
||||||
import org.jetbrains.jet.lang.resolve.name.FqName
|
import org.jetbrains.jet.lang.resolve.name.FqName
|
||||||
import org.jetbrains.jet.lang.resolve.java.resolver.JavaClassResolver
|
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 {
|
trait LazyJavaClassResolver {
|
||||||
fun resolveClass(javaClass: JavaClass): ClassDescriptor?
|
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
|
// TODO: this should be governed by module separation logic
|
||||||
// Do not look for JavaClasses for Kotlin binaries & built-ins
|
// Do not look for JavaClasses for Kotlin binaries & built-ins
|
||||||
if (JavaClassResolver.getKotlinBuiltinClassDescriptor(fqName) != null) {
|
if (JavaClassResolver.getKotlinBuiltinClassDescriptor(fqName) != null) {
|
||||||
return JavaClassLookupResult()
|
return JavaClassLookupResult()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Do not look for Kotlin binary classes
|
|
||||||
val kotlinClass = kotlinClassFinder.findKotlinClass(fqName)
|
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)
|
val javaClass = finder.findClass(fqName)
|
||||||
if (javaClass == null) return JavaClassLookupResult()
|
if (javaClass == null) return JavaClassLookupResult()
|
||||||
|
|||||||
Reference in New Issue
Block a user