From 5a49b6fda5d2f40bdb97e6f569e7ced5ee8b39ac Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Wed, 1 Jan 2014 16:48:48 +0400 Subject: [PATCH] Loading classes with wrong ABI version as Java classes --- compiler/testData/cli/jvm/wrongAbiVersion.out | 4 +-- .../lazy/LazyJavaPackageFragmentProvider.kt | 2 +- .../LazyJavaPackageFragmentScope.kt | 2 +- .../jet/lang/resolve/java/lazy/resolvers.kt | 27 ++++++++++++++----- 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/compiler/testData/cli/jvm/wrongAbiVersion.out b/compiler/testData/cli/jvm/wrongAbiVersion.out index 3cb5d7d9b91..abf50508ee9 100644 --- a/compiler/testData/cli/jvm/wrongAbiVersion.out +++ b/compiler/testData/cli/jvm/wrongAbiVersion.out @@ -1,5 +1,5 @@ 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$/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 -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 \ No newline at end of file diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/LazyJavaPackageFragmentProvider.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/LazyJavaPackageFragmentProvider.kt index 465a2c976e9..1d285d88ae9 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/LazyJavaPackageFragmentProvider.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/LazyJavaPackageFragmentProvider.kt @@ -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) } } diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaPackageFragmentScope.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaPackageFragmentScope.kt index 0596469faa0..055e5a0b8a5 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaPackageFragmentScope.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaPackageFragmentScope.kt @@ -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 { diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/resolvers.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/resolvers.kt index 3c7c616cb08..04f5bde6cc1 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/resolvers.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/resolvers.kt @@ -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()