Drop KotlinClassFinder#findKotlinClass(FqName)

findKotlinClass(ClassId) should be used instead
This commit is contained in:
Alexander Udalov
2014-09-12 17:37:44 +04:00
parent 422e922c36
commit a8c5f1bb3a
7 changed files with 26 additions and 24 deletions
@@ -18,18 +18,13 @@ package org.jetbrains.jet.lang.resolve.kotlin
import org.jetbrains.jet.lang.resolve.java.structure.JavaClass import org.jetbrains.jet.lang.resolve.java.structure.JavaClass
import org.jetbrains.jet.lang.resolve.java.structure.impl.JavaClassImpl import org.jetbrains.jet.lang.resolve.java.structure.impl.JavaClassImpl
import org.jetbrains.jet.lang.resolve.name.FqName
import org.jetbrains.kotlin.util.sure import org.jetbrains.kotlin.util.sure
import org.jetbrains.jet.descriptors.serialization.ClassId import org.jetbrains.jet.descriptors.serialization.ClassId
public abstract class VirtualFileKotlinClassFinder : VirtualFileFinder { public abstract class VirtualFileKotlinClassFinder : VirtualFileFinder {
override fun findKotlinClass(fqName: FqName): KotlinJvmBinaryClass? {
val file = findVirtualFileWithHeader(fqName) ?: return null
return KotlinBinaryClassCache.getKotlinBinaryClass(file)
}
override fun findKotlinClass(classId: ClassId): KotlinJvmBinaryClass? { override fun findKotlinClass(classId: ClassId): KotlinJvmBinaryClass? {
return findKotlinClass(classId.asSingleFqName().toSafe()) val file = findVirtualFileWithHeader(classId.asSingleFqName().toSafe()) ?: return null
return KotlinBinaryClassCache.getKotlinBinaryClass(file)
} }
override fun findKotlinClass(javaClass: JavaClass): KotlinJvmBinaryClass? { override fun findKotlinClass(javaClass: JavaClass): KotlinJvmBinaryClass? {
@@ -17,7 +17,9 @@
package org.jetbrains.jet.lang.resolve.java; package org.jetbrains.jet.lang.resolve.java;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.descriptors.serialization.ClassId;
import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
public final class PackageClassUtils { public final class PackageClassUtils {
@@ -46,6 +48,11 @@ public final class PackageClassUtils {
return packageFQN.child(Name.identifier(getPackageClassName(packageFQN))); return packageFQN.child(Name.identifier(getPackageClassName(packageFQN)));
} }
@NotNull
public static ClassId getPackageClassId(@NotNull FqName packageFQN) {
return new ClassId(packageFQN, FqNameUnsafe.topLevel(Name.identifier(getPackageClassName(packageFQN))));
}
@NotNull @NotNull
public static String getPackageClassInternalName(@NotNull FqName packageFQN) { public static String getPackageClassInternalName(@NotNull FqName packageFQN) {
return JvmClassName.byFqNameWithoutInnerClasses(getPackageClassFqName(packageFQN)).getInternalName(); return JvmClassName.byFqNameWithoutInnerClasses(getPackageClassFqName(packageFQN)).getInternalName();
@@ -81,7 +81,7 @@ public class LazyPackageFragmentScopeForJavaPackage(
// TODO: Storing references is a temporary hack until modules infrastructure is implemented. // TODO: Storing references is a temporary hack until modules infrastructure is implemented.
// See JetTypeMapperWithOutDirectories for details // See JetTypeMapperWithOutDirectories for details
public val kotlinBinaryClass: KotlinJvmBinaryClass? public val kotlinBinaryClass: KotlinJvmBinaryClass?
= c.kotlinClassFinder.findKotlinClass(PackageClassUtils.getPackageClassFqName(packageFragment.fqName)) = c.kotlinClassFinder.findKotlinClass(PackageClassUtils.getPackageClassId(packageFragment.fqName))
private val deserializedPackageScope = c.storageManager.createLazyValue { private val deserializedPackageScope = c.storageManager.createLazyValue {
val kotlinBinaryClass = kotlinBinaryClass val kotlinBinaryClass = kotlinBinaryClass
@@ -18,6 +18,7 @@ package org.jetbrains.jet.lang.resolve.kotlin;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.descriptors.serialization.ClassId;
import org.jetbrains.jet.descriptors.serialization.JavaProtoBuf; import org.jetbrains.jet.descriptors.serialization.JavaProtoBuf;
import org.jetbrains.jet.descriptors.serialization.NameResolver; import org.jetbrains.jet.descriptors.serialization.NameResolver;
import org.jetbrains.jet.descriptors.serialization.ProtoBuf; import org.jetbrains.jet.descriptors.serialization.ProtoBuf;
@@ -27,12 +28,12 @@ import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.ClassOrPackageFragmentDescriptor; import org.jetbrains.jet.lang.descriptors.ClassOrPackageFragmentDescriptor;
import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor; import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor;
import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.java.PackageClassUtils;
import org.jetbrains.jet.lang.resolve.java.resolver.ErrorReporter; import org.jetbrains.jet.lang.resolve.java.resolver.ErrorReporter;
import org.jetbrains.jet.lang.resolve.name.Name; 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.isClassObject;
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isTrait; import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isTrait;
import static org.jetbrains.jet.lang.resolve.java.PackageClassUtils.getPackageClassId;
import static org.jetbrains.jet.lang.resolve.kotlin.DescriptorLoadersStorage.MemberSignature; import static org.jetbrains.jet.lang.resolve.kotlin.DescriptorLoadersStorage.MemberSignature;
import static org.jetbrains.jet.lang.resolve.kotlin.DeserializedResolverUtils.getClassId; import static org.jetbrains.jet.lang.resolve.kotlin.DeserializedResolverUtils.getClassId;
import static org.jetbrains.jet.lang.resolve.kotlin.DeserializedResolverUtils.kotlinClassIdToJavaClassId; import static org.jetbrains.jet.lang.resolve.kotlin.DeserializedResolverUtils.kotlinClassIdToJavaClassId;
@@ -99,7 +100,7 @@ public abstract class BaseDescriptorLoader {
@NotNull AnnotatedCallableKind kind @NotNull AnnotatedCallableKind kind
) { ) {
if (container instanceof PackageFragmentDescriptor) { if (container instanceof PackageFragmentDescriptor) {
return getPackagePartClassFqNameSafe((PackageFragmentDescriptor) container, proto, nameResolver); return findPackagePartClass((PackageFragmentDescriptor) container, proto, nameResolver);
} }
else if (isClassObject(container) && isStaticFieldInOuter(proto)) { else if (isClassObject(container) && isStaticFieldInOuter(proto)) {
// Backing fields of properties of a class object are generated in the outer class // Backing fields of properties of a class object are generated in the outer class
@@ -111,7 +112,8 @@ public abstract class BaseDescriptorLoader {
if (proto.hasExtension(JavaProtoBuf.implClassName)) { if (proto.hasExtension(JavaProtoBuf.implClassName)) {
Name tImplName = nameResolver.getName(proto.getExtension(JavaProtoBuf.implClassName)); Name tImplName = nameResolver.getName(proto.getExtension(JavaProtoBuf.implClassName));
return kotlinClassFinder.findKotlinClass(containingPackage.getFqName().child(tImplName)); // TODO: store accurate name for nested traits
return kotlinClassFinder.findKotlinClass(new ClassId(containingPackage.getFqName(), tImplName));
} }
return null; return null;
} }
@@ -120,13 +122,13 @@ public abstract class BaseDescriptorLoader {
} }
@Nullable @Nullable
private KotlinJvmBinaryClass getPackagePartClassFqNameSafe( private KotlinJvmBinaryClass findPackagePartClass(
@NotNull PackageFragmentDescriptor container, @NotNull PackageFragmentDescriptor container,
@NotNull ProtoBuf.Callable proto, @NotNull ProtoBuf.Callable proto,
@NotNull NameResolver nameResolver @NotNull NameResolver nameResolver
) { ) {
if (proto.hasExtension(JavaProtoBuf.implClassName)) { if (proto.hasExtension(JavaProtoBuf.implClassName)) {
return kotlinClassFinder.findKotlinClass(container.getFqName().child(getPackagePartClassName(proto, nameResolver))); return kotlinClassFinder.findKotlinClass(new ClassId(container.getFqName(), getPackagePartClassName(proto, nameResolver)));
} }
return null; return null;
} }
@@ -153,8 +155,7 @@ public abstract class BaseDescriptorLoader {
return kotlinClassFinder.findKotlinClass(kotlinClassIdToJavaClassId(getClassId((ClassDescriptor) descriptor))); return kotlinClassFinder.findKotlinClass(kotlinClassIdToJavaClassId(getClassId((ClassDescriptor) descriptor)));
} }
else if (descriptor instanceof PackageFragmentDescriptor) { else if (descriptor instanceof PackageFragmentDescriptor) {
return kotlinClassFinder.findKotlinClass( return kotlinClassFinder.findKotlinClass(getPackageClassId(((PackageFragmentDescriptor) descriptor).getFqName()));
PackageClassUtils.getPackageClassFqName(((PackageFragmentDescriptor) descriptor).getFqName()));
} }
else { else {
throw new IllegalStateException("Unrecognized descriptor: " + descriptor); throw new IllegalStateException("Unrecognized descriptor: " + descriptor);
@@ -17,12 +17,9 @@
package org.jetbrains.jet.lang.resolve.kotlin package org.jetbrains.jet.lang.resolve.kotlin
import org.jetbrains.jet.lang.resolve.java.structure.JavaClass import org.jetbrains.jet.lang.resolve.java.structure.JavaClass
import org.jetbrains.jet.lang.resolve.name.FqName
import org.jetbrains.jet.descriptors.serialization.ClassId import org.jetbrains.jet.descriptors.serialization.ClassId
public trait KotlinClassFinder { public trait KotlinClassFinder {
public fun findKotlinClass(fqName: FqName): KotlinJvmBinaryClass?
public fun findKotlinClass(classId: ClassId): KotlinJvmBinaryClass? public fun findKotlinClass(classId: ClassId): KotlinJvmBinaryClass?
public fun findKotlinClass(javaClass: JavaClass): KotlinJvmBinaryClass? public fun findKotlinClass(javaClass: JavaClass): KotlinJvmBinaryClass?
@@ -37,6 +37,10 @@ public final class ClassId {
this.relativeClassName = relativeClassName; this.relativeClassName = relativeClassName;
} }
public ClassId(@NotNull FqName packageFqName, @NotNull Name topLevelName) {
this(packageFqName, FqNameUnsafe.topLevel(topLevelName));
}
@NotNull @NotNull
public FqName getPackageFqName() { public FqName getPackageFqName() {
return packageFqName; return packageFqName;
@@ -64,8 +64,7 @@ public class DeserializerForDecompiler(val packageDirectory: VirtualFile, val di
override fun resolveDeclarationsInPackage(packageFqName: FqName): Collection<DeclarationDescriptor> { override fun resolveDeclarationsInPackage(packageFqName: FqName): Collection<DeclarationDescriptor> {
assert(packageFqName == directoryPackageFqName, "Was called for $packageFqName but only $directoryPackageFqName is expected.") assert(packageFqName == directoryPackageFqName, "Was called for $packageFqName but only $directoryPackageFqName is expected.")
val packageClassFqName = PackageClassUtils.getPackageClassFqName(packageFqName) val binaryClassForPackageClass = localClassFinder.findKotlinClass(PackageClassUtils.getPackageClassId(packageFqName))
val binaryClassForPackageClass = localClassFinder.findKotlinClass(packageClassFqName)
val annotationData = binaryClassForPackageClass?.getClassHeader()?.annotationData val annotationData = binaryClassForPackageClass?.getClassHeader()?.annotationData
if (annotationData == null) { if (annotationData == null) {
LOG.error("Could not read annotation data for $packageFqName from ${binaryClassForPackageClass?.getClassName()}") LOG.error("Could not read annotation data for $packageFqName from ${binaryClassForPackageClass?.getClassName()}")
@@ -79,16 +78,15 @@ public class DeserializerForDecompiler(val packageDirectory: VirtualFile, val di
return membersScope.getAllDescriptors() return membersScope.getAllDescriptors()
} }
private val localClassFinder = object: KotlinClassFinder { private val localClassFinder = object : KotlinClassFinder {
override fun findKotlinClass(fqName: FqName) = findKotlinClass(fqName.toClassId()) override fun findKotlinClass(javaClass: JavaClass) = findKotlinClass(javaClass.getFqName()!!.toClassId())
override fun findKotlinClass(javaClass: JavaClass) = findKotlinClass(javaClass.getFqName()!!)
override fun findKotlinClass(classId: ClassId): KotlinJvmBinaryClass? { override fun findKotlinClass(classId: ClassId): KotlinJvmBinaryClass? {
if (classId.getPackageFqName() != directoryPackageFqName) { if (classId.getPackageFqName() != directoryPackageFqName) {
return null return null
} }
val segments = DeserializedResolverUtils.kotlinFqNameToJavaFqName(classId.getRelativeClassName()).pathSegments() val segments = DeserializedResolverUtils.kotlinFqNameToJavaFqName(classId.getRelativeClassName()).pathSegments()
val targetName = segments.makeString("$", postfix = ".class") val targetName = segments.joinToString("$", postfix = ".class")
val virtualFile = packageDirectory.findChild(targetName) val virtualFile = packageDirectory.findChild(targetName)
if (virtualFile != null && isKotlinCompiledFile(virtualFile)) { if (virtualFile != null && isKotlinCompiledFile(virtualFile)) {
return KotlinBinaryClassCache.getKotlinBinaryClass(virtualFile) return KotlinBinaryClassCache.getKotlinBinaryClass(virtualFile)