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 if (compiledPackageFragment == null) return
for (callable in previouslyCompiledCallables) { for (callable in previouslyCompiledCallables) {
val partFqName = JvmFileClassUtil.getPartFqNameForDeserializedCallable(callable) val partFqName = JvmFileClassUtil.getPartFqNameForDeserialized(callable)
val partType = AsmUtil.asmTypeByFqNameWithoutInnerClasses(partFqName) val partType = AsmUtil.asmTypeByFqNameWithoutInnerClasses(partFqName)
addDelegateGenerationTaskIfNeeded(callable, { generateDelegateToCompiledMember(callable, compiledPackageFragment, partType) }) 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.DescriptorToSourceUtils
import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedCallableMemberDescriptor import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedCallableMemberDescriptor
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedMemberDescriptor
object JvmFileClassUtil { object JvmFileClassUtil {
val JVM_NAME: FqName = FqName("kotlin.jvm.JvmName") val JVM_NAME: FqName = FqName("kotlin.jvm.JvmName")
@@ -55,14 +56,14 @@ object JvmFileClassUtil {
private fun getFacadeFqName(file: KtFile, jvmFileClassAnnotations: ParsedJvmFileClassAnnotations): FqName = private fun getFacadeFqName(file: KtFile, jvmFileClassAnnotations: ParsedJvmFileClassAnnotations): FqName =
file.packageFqName.child(Name.identifier(jvmFileClassAnnotations.name)) file.packageFqName.child(Name.identifier(jvmFileClassAnnotations.name))
@JvmStatic fun getPartFqNameForDeserializedCallable(callable: DeserializedCallableMemberDescriptor): FqName { @JvmStatic fun getPartFqNameForDeserialized(deserializedMemberDescriptor: DeserializedMemberDescriptor): FqName {
val implClassName = getImplClassName(callable) ?: error("No implClassName for $callable") val implClassName = getImplClassName(deserializedMemberDescriptor) ?: error("No implClassName for $deserializedMemberDescriptor")
val packageFqName = (callable.containingDeclaration as PackageFragmentDescriptor).fqName val packageFqName = (deserializedMemberDescriptor.containingDeclaration as PackageFragmentDescriptor).fqName
return packageFqName.child(implClassName) return packageFqName.child(implClassName)
} }
@JvmStatic fun getImplClassName(callable: DeserializedCallableMemberDescriptor): Name? = @JvmStatic fun getImplClassName(deserializedMemberDescriptor: DeserializedMemberDescriptor): Name? =
callable.getImplClassNameForDeserialized() deserializedMemberDescriptor.getImplClassNameForDeserialized()
private fun getHiddenPartFqName(file: KtFile, jvmFileClassAnnotations: ParsedJvmFileClassAnnotations): FqName = private fun getHiddenPartFqName(file: KtFile, jvmFileClassAnnotations: ParsedJvmFileClassAnnotations): FqName =
file.packageFqName.child(Name.identifier(manglePartName(jvmFileClassAnnotations.name, file.name))) 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.getSuperClassNotAny
import org.jetbrains.kotlin.resolve.descriptorUtil.module import org.jetbrains.kotlin.resolve.descriptorUtil.module
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedCallableMemberDescriptor import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedCallableMemberDescriptor
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedMemberDescriptor
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
fun copyValueParameters( fun copyValueParameters(
@@ -67,6 +68,9 @@ fun ClassDescriptor.getParentJavaStaticClassScope(): LazyJavaStaticClassScope? {
return staticScope return staticScope
} }
fun DeserializedCallableMemberDescriptor.getImplClassNameForDeserialized(): Name? { fun DeserializedMemberDescriptor.getImplClassNameForDeserialized(): Name? {
return (containerSource as? JvmPackagePartSource)?.simpleName return (containerSource as? JvmPackagePartSource)?.simpleName
} }
fun DeserializedMemberDescriptor.isFromJvmPackagePart(): Boolean =
containerSource is JvmPackagePartSource
@@ -17,26 +17,27 @@
package org.jetbrains.kotlin.idea.decompiler.textBuilder package org.jetbrains.kotlin.idea.decompiler.textBuilder
import com.intellij.openapi.vfs.VirtualFile 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.ModuleDescriptor
import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil
import org.jetbrains.kotlin.idea.caches.resolve.IDEPackagePartProvider import org.jetbrains.kotlin.idea.caches.resolve.IDEPackagePartProvider
import org.jetbrains.kotlin.idea.decompiler.classFile.buildDecompiledTextForClassFile import org.jetbrains.kotlin.idea.decompiler.classFile.buildDecompiledTextForClassFile
import org.jetbrains.kotlin.idea.test.KotlinWithJdkAndRuntimeLightProjectDescriptor import org.jetbrains.kotlin.idea.test.KotlinWithJdkAndRuntimeLightProjectDescriptor
import org.jetbrains.kotlin.idea.test.PluginTestCaseBase 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.JvmVirtualFileFinder
import org.jetbrains.kotlin.load.kotlin.VirtualFileFinder import org.jetbrains.kotlin.load.kotlin.VirtualFileFinder
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.resolve.BindingTraceContext import org.jetbrains.kotlin.resolve.BindingTraceContext
import org.jetbrains.kotlin.resolve.jvm.TopDownAnalyzerFacadeForJVM 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 import org.jetbrains.kotlin.test.KotlinTestUtils
class DecompiledTextConsistencyTest : TextConsistencyBaseTest() { class DecompiledTextConsistencyTest : TextConsistencyBaseTest() {
override fun getPackages(): List<FqName> = emptyList() 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") 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 getSdk() = PluginTestCaseBase.fullJdk()
} }
override fun isFromFacade(descriptor: CallableMemberDescriptor, facadeFqName: FqName): Boolean = override fun isFromFacade(descriptor: MemberDescriptor, facadeFqName: FqName): Boolean =
descriptor is DeserializedCallableMemberDescriptor && descriptor is DeserializedMemberDescriptor &&
JvmFileClassUtil.getImplClassName(descriptor) != null && descriptor.isFromJvmPackagePart() &&
facadeFqName == JvmFileClassUtil.getPartFqNameForDeserializedCallable(descriptor) facadeFqName == JvmFileClassUtil.getPartFqNameForDeserialized(descriptor)
} }
@@ -17,7 +17,7 @@
package org.jetbrains.kotlin.idea.decompiler.textBuilder package org.jetbrains.kotlin.idea.decompiler.textBuilder
import com.intellij.openapi.vfs.VirtualFile 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.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
import org.jetbrains.kotlin.fileClasses.OldPackageFacadeClassUtils import org.jetbrains.kotlin.fileClasses.OldPackageFacadeClassUtils
@@ -65,7 +65,7 @@ class KotlinJavaScriptDecompiledTextConsistencyTest : TextConsistencyBaseTest()
override fun getProjectDescriptor() = KotlinStdJSProjectDescriptor.instance 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 val containingDeclaration = descriptor.containingDeclaration
return containingDeclaration is PackageFragmentDescriptor && return containingDeclaration is PackageFragmentDescriptor &&
facadeFqName == OldPackageFacadeClassUtils.getPackageClassFqName(containingDeclaration.fqName) facadeFqName == OldPackageFacadeClassUtils.getPackageClassFqName(containingDeclaration.fqName)
@@ -43,7 +43,7 @@ abstract class TextConsistencyBaseTest : KotlinLightCodeInsightFixtureTestCase()
protected abstract fun getModuleDescriptor(): ModuleDescriptor 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() { fun testConsistency() {
getPackages().forEach { doTestPackage(it) } getPackages().forEach { doTestPackage(it) }
@@ -76,7 +76,7 @@ abstract class TextConsistencyBaseTest : KotlinLightCodeInsightFixtureTestCase()
override fun resolveDeclarationsInFacade(facadeFqName: FqName): List<DeclarationDescriptor> = override fun resolveDeclarationsInFacade(facadeFqName: FqName): List<DeclarationDescriptor> =
module.getPackage(facadeFqName.parent()).memberScope.getContributedDescriptors().filter { 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) !KotlinBuiltIns.isBuiltIn(it)
}.sortedWith(MemberComparator.INSTANCE) }.sortedWith(MemberComparator.INSTANCE)
} }