Fix decompiler tests.

This commit is contained in:
Dmitry Petrov
2016-11-22 12:21:23 +03:00
parent 01c21e218a
commit fc2a965d2a
6 changed files with 24 additions and 18 deletions
@@ -284,7 +284,7 @@ class MultifileClassCodegenImpl(
if (compiledPackageFragment == null) return
for (callable in previouslyCompiledCallables) {
val partFqName = JvmFileClassUtil.getPartFqNameForDeserializedCallable(callable)
val partFqName = JvmFileClassUtil.getPartFqNameForDeserialized(callable)
val partType = AsmUtil.asmTypeByFqNameWithoutInnerClasses(partFqName)
addDelegateGenerationTaskIfNeeded(callable, { generateDelegateToCompiledMember(callable, compiledPackageFragment, partType) })
@@ -28,6 +28,7 @@ import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedCallableMemberDescriptor
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedMemberDescriptor
object JvmFileClassUtil {
val JVM_NAME: FqName = FqName("kotlin.jvm.JvmName")
@@ -55,14 +56,14 @@ object JvmFileClassUtil {
private fun getFacadeFqName(file: KtFile, jvmFileClassAnnotations: ParsedJvmFileClassAnnotations): FqName =
file.packageFqName.child(Name.identifier(jvmFileClassAnnotations.name))
@JvmStatic fun getPartFqNameForDeserializedCallable(callable: DeserializedCallableMemberDescriptor): FqName {
val implClassName = getImplClassName(callable) ?: error("No implClassName for $callable")
val packageFqName = (callable.containingDeclaration as PackageFragmentDescriptor).fqName
@JvmStatic fun getPartFqNameForDeserialized(deserializedMemberDescriptor: DeserializedMemberDescriptor): FqName {
val implClassName = getImplClassName(deserializedMemberDescriptor) ?: error("No implClassName for $deserializedMemberDescriptor")
val packageFqName = (deserializedMemberDescriptor.containingDeclaration as PackageFragmentDescriptor).fqName
return packageFqName.child(implClassName)
}
@JvmStatic fun getImplClassName(callable: DeserializedCallableMemberDescriptor): Name? =
callable.getImplClassNameForDeserialized()
@JvmStatic fun getImplClassName(deserializedMemberDescriptor: DeserializedMemberDescriptor): Name? =
deserializedMemberDescriptor.getImplClassNameForDeserialized()
private fun getHiddenPartFqName(file: KtFile, jvmFileClassAnnotations: ParsedJvmFileClassAnnotations): FqName =
file.packageFqName.child(Name.identifier(manglePartName(jvmFileClassAnnotations.name, file.name)))
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassNotAny
import org.jetbrains.kotlin.resolve.descriptorUtil.module
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedCallableMemberDescriptor
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedMemberDescriptor
import org.jetbrains.kotlin.types.KotlinType
fun copyValueParameters(
@@ -67,6 +68,9 @@ fun ClassDescriptor.getParentJavaStaticClassScope(): LazyJavaStaticClassScope? {
return staticScope
}
fun DeserializedCallableMemberDescriptor.getImplClassNameForDeserialized(): Name? {
fun DeserializedMemberDescriptor.getImplClassNameForDeserialized(): Name? {
return (containerSource as? JvmPackagePartSource)?.simpleName
}
fun DeserializedMemberDescriptor.isFromJvmPackagePart(): Boolean =
containerSource is JvmPackagePartSource
@@ -17,26 +17,27 @@
package org.jetbrains.kotlin.idea.decompiler.textBuilder
import com.intellij.openapi.vfs.VirtualFile
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.descriptors.MemberDescriptor
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil
import org.jetbrains.kotlin.idea.caches.resolve.IDEPackagePartProvider
import org.jetbrains.kotlin.idea.decompiler.classFile.buildDecompiledTextForClassFile
import org.jetbrains.kotlin.idea.test.KotlinWithJdkAndRuntimeLightProjectDescriptor
import org.jetbrains.kotlin.idea.test.PluginTestCaseBase
import org.jetbrains.kotlin.load.java.descriptors.isFromJvmPackagePart
import org.jetbrains.kotlin.load.kotlin.JvmVirtualFileFinder
import org.jetbrains.kotlin.load.kotlin.VirtualFileFinder
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.resolve.BindingTraceContext
import org.jetbrains.kotlin.resolve.jvm.TopDownAnalyzerFacadeForJVM
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedCallableMemberDescriptor
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedMemberDescriptor
import org.jetbrains.kotlin.test.KotlinTestUtils
class DecompiledTextConsistencyTest : TextConsistencyBaseTest() {
override fun getPackages(): List<FqName> = emptyList()
override fun getFacades(): List<FqName> = listOf(FqName("kotlin.collections.CollectionsKt"))
override fun getFacades(): List<FqName> = listOf(FqName("kotlin.collections.CollectionsKt"), FqName("kotlin.collections.TypeAliasesKt"))
override fun getTopLevelMembers(): Map<String, String> = mapOf("kotlin.collections.CollectionsKt" to "mutableListOf")
@@ -56,8 +57,8 @@ class DecompiledTextConsistencyTest : TextConsistencyBaseTest() {
override fun getSdk() = PluginTestCaseBase.fullJdk()
}
override fun isFromFacade(descriptor: CallableMemberDescriptor, facadeFqName: FqName): Boolean =
descriptor is DeserializedCallableMemberDescriptor &&
JvmFileClassUtil.getImplClassName(descriptor) != null &&
facadeFqName == JvmFileClassUtil.getPartFqNameForDeserializedCallable(descriptor)
override fun isFromFacade(descriptor: MemberDescriptor, facadeFqName: FqName): Boolean =
descriptor is DeserializedMemberDescriptor &&
descriptor.isFromJvmPackagePart() &&
facadeFqName == JvmFileClassUtil.getPartFqNameForDeserialized(descriptor)
}
@@ -17,7 +17,7 @@
package org.jetbrains.kotlin.idea.decompiler.textBuilder
import com.intellij.openapi.vfs.VirtualFile
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.descriptors.MemberDescriptor
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
import org.jetbrains.kotlin.fileClasses.OldPackageFacadeClassUtils
@@ -65,7 +65,7 @@ class KotlinJavaScriptDecompiledTextConsistencyTest : TextConsistencyBaseTest()
override fun getProjectDescriptor() = KotlinStdJSProjectDescriptor.instance
override fun isFromFacade(descriptor: CallableMemberDescriptor, facadeFqName: FqName): Boolean {
override fun isFromFacade(descriptor: MemberDescriptor, facadeFqName: FqName): Boolean {
val containingDeclaration = descriptor.containingDeclaration
return containingDeclaration is PackageFragmentDescriptor &&
facadeFqName == OldPackageFacadeClassUtils.getPackageClassFqName(containingDeclaration.fqName)
@@ -43,7 +43,7 @@ abstract class TextConsistencyBaseTest : KotlinLightCodeInsightFixtureTestCase()
protected abstract fun getModuleDescriptor(): ModuleDescriptor
protected abstract fun isFromFacade(descriptor: CallableMemberDescriptor, facadeFqName: FqName): Boolean
protected abstract fun isFromFacade(descriptor: MemberDescriptor, facadeFqName: FqName): Boolean
fun testConsistency() {
getPackages().forEach { doTestPackage(it) }
@@ -76,7 +76,7 @@ abstract class TextConsistencyBaseTest : KotlinLightCodeInsightFixtureTestCase()
override fun resolveDeclarationsInFacade(facadeFqName: FqName): List<DeclarationDescriptor> =
module.getPackage(facadeFqName.parent()).memberScope.getContributedDescriptors().filter {
(it is CallableMemberDescriptor && isFromFacade(it, facadeFqName) || it is TypeAliasDescriptor) &&
(it is MemberDescriptor && it !is ClassDescriptor && isFromFacade(it, facadeFqName)) &&
!KotlinBuiltIns.isBuiltIn(it)
}.sortedWith(MemberComparator.INSTANCE)
}