diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/kotlin/VirtualFileKotlinClassFinder.kt b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/kotlin/VirtualFileKotlinClassFinder.kt index 99ae8d02bc1..6a71d24d27a 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/kotlin/VirtualFileKotlinClassFinder.kt +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/kotlin/VirtualFileKotlinClassFinder.kt @@ -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.impl.JavaClassImpl -import org.jetbrains.jet.lang.resolve.name.FqName import org.jetbrains.kotlin.util.sure import org.jetbrains.jet.descriptors.serialization.ClassId 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? { - return findKotlinClass(classId.asSingleFqName().toSafe()) + val file = findVirtualFileWithHeader(classId.asSingleFqName().toSafe()) ?: return null + return KotlinBinaryClassCache.getKotlinBinaryClass(file) } override fun findKotlinClass(javaClass: JavaClass): KotlinJvmBinaryClass? { diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/PackageClassUtils.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/PackageClassUtils.java index bfa1a3b6ed2..f5a4d98b12a 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/PackageClassUtils.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/PackageClassUtils.java @@ -17,7 +17,9 @@ package org.jetbrains.jet.lang.resolve.java; 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.FqNameUnsafe; import org.jetbrains.jet.lang.resolve.name.Name; public final class PackageClassUtils { @@ -46,6 +48,11 @@ public final class PackageClassUtils { 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 public static String getPackageClassInternalName(@NotNull FqName packageFQN) { return JvmClassName.byFqNameWithoutInnerClasses(getPackageClassFqName(packageFQN)).getInternalName(); diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaStaticScope.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaStaticScope.kt index 8ae55fa6d58..633911980b0 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaStaticScope.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaStaticScope.kt @@ -81,7 +81,7 @@ 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.getPackageClassFqName(packageFragment.fqName)) + = c.kotlinClassFinder.findKotlinClass(PackageClassUtils.getPackageClassId(packageFragment.fqName)) private val deserializedPackageScope = c.storageManager.createLazyValue { val kotlinBinaryClass = kotlinBinaryClass diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/BaseDescriptorLoader.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/BaseDescriptorLoader.java index 0a74f511d74..e748f4c8b01 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/BaseDescriptorLoader.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/BaseDescriptorLoader.java @@ -18,6 +18,7 @@ package org.jetbrains.jet.lang.resolve.kotlin; import org.jetbrains.annotations.NotNull; 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.NameResolver; 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.PackageFragmentDescriptor; 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.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.java.PackageClassUtils.getPackageClassId; 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.kotlinClassIdToJavaClassId; @@ -99,7 +100,7 @@ public abstract class BaseDescriptorLoader { @NotNull AnnotatedCallableKind kind ) { if (container instanceof PackageFragmentDescriptor) { - return getPackagePartClassFqNameSafe((PackageFragmentDescriptor) container, proto, nameResolver); + return findPackagePartClass((PackageFragmentDescriptor) container, proto, nameResolver); } else if (isClassObject(container) && isStaticFieldInOuter(proto)) { // 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)) { 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; } @@ -120,13 +122,13 @@ public abstract class BaseDescriptorLoader { } @Nullable - private KotlinJvmBinaryClass getPackagePartClassFqNameSafe( + private KotlinJvmBinaryClass findPackagePartClass( @NotNull PackageFragmentDescriptor container, @NotNull ProtoBuf.Callable proto, @NotNull NameResolver nameResolver ) { 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; } @@ -153,8 +155,7 @@ public abstract class BaseDescriptorLoader { return kotlinClassFinder.findKotlinClass(kotlinClassIdToJavaClassId(getClassId((ClassDescriptor) descriptor))); } else if (descriptor instanceof PackageFragmentDescriptor) { - return kotlinClassFinder.findKotlinClass( - PackageClassUtils.getPackageClassFqName(((PackageFragmentDescriptor) descriptor).getFqName())); + return kotlinClassFinder.findKotlinClass(getPackageClassId(((PackageFragmentDescriptor) descriptor).getFqName())); } else { throw new IllegalStateException("Unrecognized descriptor: " + descriptor); diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/KotlinClassFinder.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/KotlinClassFinder.kt index 495ab943af5..f3225b3f207 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/KotlinClassFinder.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/KotlinClassFinder.kt @@ -17,12 +17,9 @@ package org.jetbrains.jet.lang.resolve.kotlin 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? diff --git a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/ClassId.java b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/ClassId.java index c0efac5d2cd..811e717d3a0 100644 --- a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/ClassId.java +++ b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/ClassId.java @@ -37,6 +37,10 @@ public final class ClassId { this.relativeClassName = relativeClassName; } + public ClassId(@NotNull FqName packageFqName, @NotNull Name topLevelName) { + this(packageFqName, FqNameUnsafe.topLevel(topLevelName)); + } + @NotNull public FqName getPackageFqName() { return packageFqName; diff --git a/idea/idea-analysis/src/org/jetbrains/jet/plugin/libraries/DeserializerForDecompiler.kt b/idea/idea-analysis/src/org/jetbrains/jet/plugin/libraries/DeserializerForDecompiler.kt index e08a81c0456..5e8c2f9db8c 100644 --- a/idea/idea-analysis/src/org/jetbrains/jet/plugin/libraries/DeserializerForDecompiler.kt +++ b/idea/idea-analysis/src/org/jetbrains/jet/plugin/libraries/DeserializerForDecompiler.kt @@ -64,8 +64,7 @@ public class DeserializerForDecompiler(val packageDirectory: VirtualFile, val di override fun resolveDeclarationsInPackage(packageFqName: FqName): Collection { assert(packageFqName == directoryPackageFqName, "Was called for $packageFqName but only $directoryPackageFqName is expected.") - val packageClassFqName = PackageClassUtils.getPackageClassFqName(packageFqName) - val binaryClassForPackageClass = localClassFinder.findKotlinClass(packageClassFqName) + val binaryClassForPackageClass = localClassFinder.findKotlinClass(PackageClassUtils.getPackageClassId(packageFqName)) val annotationData = binaryClassForPackageClass?.getClassHeader()?.annotationData if (annotationData == null) { 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() } - private val localClassFinder = object: KotlinClassFinder { - override fun findKotlinClass(fqName: FqName) = findKotlinClass(fqName.toClassId()) - override fun findKotlinClass(javaClass: JavaClass) = findKotlinClass(javaClass.getFqName()!!) + private val localClassFinder = object : KotlinClassFinder { + override fun findKotlinClass(javaClass: JavaClass) = findKotlinClass(javaClass.getFqName()!!.toClassId()) override fun findKotlinClass(classId: ClassId): KotlinJvmBinaryClass? { if (classId.getPackageFqName() != directoryPackageFqName) { return null } val segments = DeserializedResolverUtils.kotlinFqNameToJavaFqName(classId.getRelativeClassName()).pathSegments() - val targetName = segments.makeString("$", postfix = ".class") + val targetName = segments.joinToString("$", postfix = ".class") val virtualFile = packageDirectory.findChild(targetName) if (virtualFile != null && isKotlinCompiledFile(virtualFile)) { return KotlinBinaryClassCache.getKotlinBinaryClass(virtualFile)