DecompiledTextFactory: new implementation of buildDecompiledTextFromJsMetadata

This commit is contained in:
Michael Nedzelsky
2015-04-06 11:26:33 +03:00
parent 18afa8f2d5
commit ea9d7ed49a
@@ -19,7 +19,7 @@ package org.jetbrains.kotlin.idea.decompiler.textBuilder
import com.intellij.openapi.util.TextRange import com.intellij.openapi.util.TextRange
import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFile
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.idea.decompiler.navigation.JsMetaFileVirtualFileHolder import org.jetbrains.kotlin.idea.decompiler.navigation.JsMetaFileUtils
import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.load.java.JvmAbi
import org.jetbrains.kotlin.load.kotlin.KotlinBinaryClassCache import org.jetbrains.kotlin.load.kotlin.KotlinBinaryClassCache
import org.jetbrains.kotlin.load.kotlin.header.isCompatibleClassKind import org.jetbrains.kotlin.load.kotlin.header.isCompatibleClassKind
@@ -74,16 +74,19 @@ public fun buildDecompiledText(
} }
public fun buildDecompiledTextFromJsMetadata( public fun buildDecompiledTextFromJsMetadata(
classFile: VirtualFile classFile: VirtualFile,
resolver: ResolverForDecompiler = KotlinJavaScriptDeserializerForDecompiler(classFile)
): DecompiledText { ): DecompiledText {
val module = classFile.getUserData(JsMetaFileVirtualFileHolder.MODULE_DESCRIPTOR_KEY) val packageFqName = JsMetaFileUtils.getPackageFqName(classFile)
assert(module != null) val isPackageHeader = JsMetaFileUtils.isPackageHeader(classFile)
val packageFqName = classFile.getUserData(JsMetaFileVirtualFileHolder.PACKAGE_FQNAME_KEY) if (isPackageHeader) {
assert (packageFqName != null) return buildDecompiledText(packageFqName, ArrayList(resolver.resolveDeclarationsInPackage(packageFqName)), descriptorRendererForKotlinJavascriptDecompiler)
}
val descriptors = module.getPackage(packageFqName)?.getMemberScope()?.getAllDescriptors()?.toList().orEmpty() else {
return buildDecompiledText(packageFqName, descriptors) val classId = JsMetaFileUtils.getClassId(classFile)
return buildDecompiledText(packageFqName, listOf(resolver.resolveTopLevelClass(classId)).filterNotNull(), descriptorRendererForKotlinJavascriptDecompiler)
}
} }
private val DECOMPILED_CODE_COMMENT = "/* compiled code */" private val DECOMPILED_CODE_COMMENT = "/* compiled code */"
@@ -104,6 +107,13 @@ private val descriptorRendererForDecompiler = DescriptorRendererBuilder()
.setSecondaryConstructorsAsPrimary(false) .setSecondaryConstructorsAsPrimary(false)
.build() .build()
private val descriptorRendererForKotlinJavascriptDecompiler = DescriptorRendererBuilder()
.setWithDefinedIn(false)
.setClassWithPrimaryConstructor(true)
.setSecondaryConstructorsAsPrimary(false)
.build()
private val descriptorRendererForKeys = DescriptorRenderer.COMPACT_WITH_MODIFIERS private val descriptorRendererForKeys = DescriptorRenderer.COMPACT_WITH_MODIFIERS
public fun descriptorToKey(descriptor: DeclarationDescriptor): String { public fun descriptorToKey(descriptor: DeclarationDescriptor): String {
@@ -112,7 +122,11 @@ public fun descriptorToKey(descriptor: DeclarationDescriptor): String {
public data class DecompiledText(public val text: String, public val renderedDescriptorsToRange: Map<String, TextRange>) public data class DecompiledText(public val text: String, public val renderedDescriptorsToRange: Map<String, TextRange>)
private fun buildDecompiledText(packageFqName: FqName, descriptors: List<DeclarationDescriptor>): DecompiledText { public fun buildDecompiledText(
packageFqName: FqName,
descriptors: List<DeclarationDescriptor>,
descriptorRenderer: DescriptorRenderer = descriptorRendererForDecompiler
): DecompiledText {
val builder = StringBuilder() val builder = StringBuilder()
val renderedDescriptorsToRange = HashMap<String, TextRange>() val renderedDescriptorsToRange = HashMap<String, TextRange>()
@@ -136,7 +150,7 @@ private fun buildDecompiledText(packageFqName: FqName, descriptors: List<Declara
val header = if (isEnumEntry(descriptor)) val header = if (isEnumEntry(descriptor))
descriptor.getName().asString() descriptor.getName().asString()
else else
descriptorRendererForDecompiler.render(descriptor).replace("= ...", DECOMPILED_COMMENT_FOR_PARAMETER) descriptorRenderer.render(descriptor).replace("= ...", DECOMPILED_COMMENT_FOR_PARAMETER)
builder.append(header) builder.append(header)
var endOffset = builder.length() var endOffset = builder.length()