From d3d0cbde97b4a8b6f1dc4e881a5d2b13a481741f Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 30 Jul 2015 16:01:13 +0300 Subject: [PATCH] Refactor KotlinClassLookupResult, make it sealed --- .../lazy/LazyJavaPackageFragmentProvider.kt | 7 +++- .../LazyPackageFragmentScopeForJavaPackage.kt | 29 ++++++++------- .../kotlin/load/java/lazy/resolvers.kt | 37 +++++++++---------- 3 files changed, 38 insertions(+), 35 deletions(-) diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/LazyJavaPackageFragmentProvider.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/LazyJavaPackageFragmentProvider.kt index 2b4ad5cd3b6..ddf63f2b04f 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/LazyJavaPackageFragmentProvider.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/LazyJavaPackageFragmentProvider.kt @@ -77,8 +77,11 @@ public class LazyJavaPackageFragmentProvider( } val outerClass = javaClass.getOuterClass() if (outerClass == null) { - return c.resolveBinaryClass(c.kotlinClassFinder.findKotlinClass(javaClass))?.descriptor - ?: topLevelClasses(javaClass) + val kotlinResult = c.resolveKotlinBinaryClass(c.kotlinClassFinder.findKotlinClass(javaClass)) + return when (kotlinResult) { + is KotlinClassLookupResult.Found -> kotlinResult.descriptor + else -> topLevelClasses(javaClass) + } } val outerClassScope = resolveClass(outerClass)?.getUnsubstitutedInnerClassesScope() return outerClassScope?.getClassifier(javaClass.getName()) as? ClassDescriptor diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyPackageFragmentScopeForJavaPackage.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyPackageFragmentScopeForJavaPackage.kt index 16d3f58fb58..b05b0385cbf 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyPackageFragmentScopeForJavaPackage.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyPackageFragmentScopeForJavaPackage.kt @@ -21,8 +21,9 @@ import org.jetbrains.kotlin.descriptors.ClassifierDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor import org.jetbrains.kotlin.load.java.descriptors.SamConstructorDescriptorKindExclude +import org.jetbrains.kotlin.load.java.lazy.KotlinClassLookupResult import org.jetbrains.kotlin.load.java.lazy.LazyJavaResolverContext -import org.jetbrains.kotlin.load.java.lazy.resolveBinaryClass +import org.jetbrains.kotlin.load.java.lazy.resolveKotlinBinaryClass import org.jetbrains.kotlin.load.java.structure.JavaClass import org.jetbrains.kotlin.load.java.structure.JavaPackage import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinaryClass @@ -44,14 +45,14 @@ public class LazyPackageFragmentScopeForJavaPackage( // TODO: Storing references is a temporary hack until modules infrastructure is implemented. // See JetTypeMapperWithOutDirectories for details public val kotlinBinaryClass: KotlinJvmBinaryClass? - = c.kotlinClassFinder.findKotlinClass(PackageClassUtils.getPackageClassId(this.packageFragment.fqName)) + = c.kotlinClassFinder.findKotlinClass(PackageClassUtils.getPackageClassId(packageFragment.fqName)) private val deserializedPackageScope = c.storageManager.createLazyValue { val kotlinBinaryClass = kotlinBinaryClass if (kotlinBinaryClass == null) JetScope.Empty else - c.deserializedDescriptorResolver.createKotlinPackageScope(this.packageFragment, kotlinBinaryClass) ?: JetScope.Empty + c.deserializedDescriptorResolver.createKotlinPackageScope(packageFragment, kotlinBinaryClass) ?: JetScope.Empty } private val packageFragment: LazyJavaPackageFragment get() = getContainingDeclaration() as LazyJavaPackageFragment @@ -63,19 +64,19 @@ public class LazyPackageFragmentScopeForJavaPackage( val classId = ClassId(packageFragment.fqName, name) - val kotlinClass = c.resolveBinaryClass(c.kotlinClassFinder.findKotlinClass(classId)) - if (kotlinClass != null) return kotlinClass.descriptor - - val javaClass = c.finder.findClass(classId) - if (javaClass != null) { - val classDescriptor = c.javaClassResolver.resolveClass(javaClass) - assert(classDescriptor == null || classDescriptor.containingDeclaration == packageFragment) { - "Wrong package fragment for $classDescriptor, expected $packageFragment" + val kotlinResult = c.resolveKotlinBinaryClass(c.kotlinClassFinder.findKotlinClass(classId)) + return when (kotlinResult) { + is KotlinClassLookupResult.Found -> kotlinResult.descriptor + is KotlinClassLookupResult.SyntheticClass -> null + is KotlinClassLookupResult.NotFound -> { + val javaClass = c.finder.findClass(classId) ?: return null + val classDescriptor = c.javaClassResolver.resolveClass(javaClass) + assert(classDescriptor == null || classDescriptor.containingDeclaration == packageFragment) { + "Wrong package fragment for $classDescriptor, expected $packageFragment" + } + return classDescriptor } - return classDescriptor } - - return null } override fun getClassifier(name: Name, location: UsageLocation): ClassifierDescriptor? = classes(name) diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/resolvers.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/resolvers.kt index d866873b814..5852a1f832d 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/resolvers.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/resolvers.kt @@ -59,29 +59,28 @@ class LazyJavaTypeParameterResolver( } } -data class KotlinClassLookupResult(val descriptor: ClassDescriptor?) { - companion object { - val EMPTY = KotlinClassLookupResult(null) - } +sealed class KotlinClassLookupResult { + class Found(val descriptor: ClassDescriptor): KotlinClassLookupResult() + object NotFound : KotlinClassLookupResult() + object SyntheticClass : KotlinClassLookupResult() } -fun LazyJavaResolverContext.resolveBinaryClass(kotlinClass: KotlinJvmBinaryClass?): KotlinClassLookupResult? { - if (kotlinClass == null) return null +fun LazyJavaResolverContext.resolveKotlinBinaryClass(kotlinClass: KotlinJvmBinaryClass?): KotlinClassLookupResult { + if (kotlinClass == null) return KotlinClassLookupResult.NotFound val header = kotlinClass.classHeader - if (!header.isCompatibleAbiVersion) { - errorReporter.reportIncompatibleAbiVersion(kotlinClass.classId, kotlinClass.location, header.version) - } - else if (header.kind == KotlinClassHeader.Kind.CLASS) { - val descriptor = deserializedDescriptorResolver.resolveClass(kotlinClass) - if (descriptor != null) { - return KotlinClassLookupResult(descriptor) + return when { + !header.isCompatibleAbiVersion -> { + errorReporter.reportIncompatibleAbiVersion(kotlinClass.classId, kotlinClass.location, header.version) + KotlinClassLookupResult.NotFound + } + header.kind == KotlinClassHeader.Kind.CLASS -> { + val descriptor = deserializedDescriptorResolver.resolveClass(kotlinClass) + if (descriptor != null) KotlinClassLookupResult.Found(descriptor) else KotlinClassLookupResult.NotFound + } + else -> { + // This is a package or trait-impl or something like that + KotlinClassLookupResult.SyntheticClass } } - else { - // This is a package or trait-impl or something like that - return KotlinClassLookupResult.EMPTY - } - - return null }