Add KotlinClassFinder#findKotlinClass(ClassId)

Will be used to load nested classes correctly at runtime
This commit is contained in:
Alexander Udalov
2014-08-20 13:01:20 +04:00
parent c854b1d713
commit bc1d59a538
8 changed files with 28 additions and 31 deletions
@@ -34,8 +34,8 @@ import org.jetbrains.jet.lang.resolve.name.Name;
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isClassObject;
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isTrait;
import static org.jetbrains.jet.lang.resolve.kotlin.DescriptorLoadersStorage.MemberSignature;
import static org.jetbrains.jet.lang.resolve.kotlin.DeserializedResolverUtils.kotlinFqNameToJavaFqName;
import static org.jetbrains.jet.lang.resolve.kotlin.DeserializedResolverUtils.naiveKotlinFqName;
import static org.jetbrains.jet.lang.resolve.kotlin.DeserializedResolverUtils.getClassId;
import static org.jetbrains.jet.lang.resolve.kotlin.DeserializedResolverUtils.kotlinClassIdToJavaClassId;
public abstract class BaseDescriptorLoader {
protected KotlinClassFinder kotlinClassFinder;
@@ -150,7 +150,7 @@ public abstract class BaseDescriptorLoader {
@Nullable
protected KotlinJvmBinaryClass findKotlinClassByDescriptor(@NotNull ClassOrPackageFragmentDescriptor descriptor) {
if (descriptor instanceof ClassDescriptor) {
return kotlinClassFinder.findKotlinClass(kotlinFqNameToJavaFqName(naiveKotlinFqName((ClassDescriptor) descriptor)));
return kotlinClassFinder.findKotlinClass(kotlinClassIdToJavaClassId(getClassId((ClassDescriptor) descriptor)));
}
else if (descriptor instanceof PackageFragmentDescriptor) {
return kotlinClassFinder.findKotlinClass(
@@ -17,6 +17,7 @@
package org.jetbrains.jet.lang.resolve.kotlin;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.descriptors.serialization.ClassId;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor;
@@ -45,6 +46,11 @@ public class DeserializedResolverUtils {
return FqName.fromSegments(correctedSegments);
}
@NotNull
public static ClassId kotlinClassIdToJavaClassId(@NotNull ClassId kotlinClassId) {
return new ClassId(kotlinClassId.getPackageFqName(), kotlinFqNameToJavaFqName(kotlinClassId.getRelativeClassName()).toUnsafe());
}
@NotNull
public static FqNameUnsafe javaFqNameToKotlinFqName(@NotNull FqName javaFqName) {
if (javaFqName.isRoot()) {
@@ -63,16 +69,11 @@ public class DeserializedResolverUtils {
}
@NotNull
public static FqNameUnsafe naiveKotlinFqName(@NotNull ClassDescriptor descriptor) {
DeclarationDescriptor containing = descriptor.getContainingDeclaration();
if (containing instanceof ClassDescriptor) {
return naiveKotlinFqName((ClassDescriptor) containing).child(descriptor.getName());
}
else if (containing instanceof PackageFragmentDescriptor) {
return ((PackageFragmentDescriptor) containing).getFqName().child(descriptor.getName()).toUnsafe();
}
else {
throw new IllegalArgumentException("Class doesn't have a FQ name: " + descriptor);
public static ClassId getClassId(@NotNull ClassDescriptor descriptor) {
DeclarationDescriptor owner = descriptor.getContainingDeclaration();
if (owner instanceof PackageFragmentDescriptor) {
return new ClassId(((PackageFragmentDescriptor) owner).getFqName(), FqNameUnsafe.topLevel(descriptor.getName()));
}
return getClassId((ClassDescriptor) owner).createNestedClassId(descriptor.getName());
}
}
@@ -18,7 +18,6 @@ package org.jetbrains.jet.lang.resolve.kotlin
import org.jetbrains.jet.descriptors.serialization.ClassId
import org.jetbrains.jet.descriptors.serialization.ClassDataFinder
import org.jetbrains.jet.lang.resolve.kotlin.DeserializedResolverUtils.kotlinFqNameToJavaFqName
import org.jetbrains.jet.descriptors.serialization.ClassData
import org.jetbrains.jet.descriptors.serialization.JavaProtoBufUtil
import org.jetbrains.jet.lang.resolve.kotlin.header.KotlinClassHeader
@@ -27,9 +26,9 @@ public class JavaClassDataFinder(
private val kotlinClassFinder: KotlinClassFinder,
private val deserializedDescriptorResolver: DeserializedDescriptorResolver
) : ClassDataFinder {
override fun findClassData(classId: ClassId): ClassData? {
val kotlinJvmBinaryClass = kotlinClassFinder.findKotlinClass(kotlinFqNameToJavaFqName(classId.asSingleFqName())) ?: return null
val javaClassId = DeserializedResolverUtils.kotlinClassIdToJavaClassId(classId)
val kotlinJvmBinaryClass = kotlinClassFinder.findKotlinClass(javaClassId) ?: return null
val data = deserializedDescriptorResolver.readData(kotlinJvmBinaryClass, KotlinClassHeader.Kind.CLASS) ?: return null
return JavaProtoBufUtil.readClassDataFrom(data)
}
@@ -16,12 +16,14 @@
package org.jetbrains.jet.lang.resolve.kotlin
import org.jetbrains.annotations.Nullable
import org.jetbrains.jet.lang.resolve.java.structure.JavaClass
import org.jetbrains.jet.lang.resolve.name.FqName
import org.jetbrains.jet.descriptors.serialization.ClassId
public trait KotlinClassFinder {
public fun findKotlinClass(fqName: FqName): KotlinJvmBinaryClass?
public fun findKotlinClass(classId: ClassId): KotlinJvmBinaryClass?
public fun findKotlinClass(javaClass: JavaClass): KotlinJvmBinaryClass?
}