Drop KotlinClassFinder#findKotlinClass(FqName)
findKotlinClass(ClassId) should be used instead
This commit is contained in:
+2
-7
@@ -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? {
|
||||||
|
|||||||
+7
@@ -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();
|
||||||
|
|||||||
+1
-1
@@ -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
|
||||||
|
|||||||
+8
-7
@@ -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);
|
||||||
|
|||||||
-3
@@ -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;
|
||||||
|
|||||||
+4
-6
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user