Refactor KotlinClassLookupResult, make it sealed

This commit is contained in:
Alexander Udalov
2015-07-30 16:01:13 +03:00
parent bd3b5690a2
commit d3d0cbde97
3 changed files with 38 additions and 35 deletions
@@ -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
@@ -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)
@@ -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
}