From 3793d99b000f8d9b82a17d821ec596eeeedd9fee Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 5 Aug 2015 19:27:59 +0300 Subject: [PATCH] Decompiler fix: enum entries are now separated by , and have ; at the end, relevant tests fixed --- .../textBuilder/DecompiledTextFactory.kt | 23 +++++++++++-------- .../decompiledText/Enum.expected.kt | 12 +++++----- .../decompiler/navigation/decompiled/Color.kt | 6 ++--- 3 files changed, 23 insertions(+), 18 deletions(-) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/DecompiledTextFactory.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/DecompiledTextFactory.kt index 6b7eb4efca0..9b09fdf9595 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/DecompiledTextFactory.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/DecompiledTextFactory.kt @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.renderer.DescriptorRendererModifier import org.jetbrains.kotlin.resolve.DescriptorUtils.isEnumEntry +import org.jetbrains.kotlin.resolve.DescriptorUtils.isEnumClass import org.jetbrains.kotlin.resolve.dataClassUtils.isComponentLike import org.jetbrains.kotlin.resolve.descriptorUtil.secondaryConstructors import org.jetbrains.kotlin.types.error.MissingDependencyErrorClass @@ -138,13 +139,13 @@ public fun buildDecompiledText( renderedDescriptorsToRange[descriptorToKey(descriptor)] = TextRange(startOffset, endOffset) } - fun appendDescriptor(descriptor: DeclarationDescriptor, indent: String) { + fun appendDescriptor(descriptor: DeclarationDescriptor, indent: String, lastEnumEntry: Boolean = false) { if (descriptor is MissingDependencyErrorClass) { throw IllegalStateException("${descriptor.javaClass.getSimpleName()} cannot be rendered. FqName: ${descriptor.fullFqName}") } val startOffset = builder.length() val header = if (isEnumEntry(descriptor)) - descriptor.getName().asString() + descriptor.name.asString() + if (lastEnumEntry) ";" else "," else descriptorRenderer.render(descriptor).replace("= ...", DECOMPILED_COMMENT_FOR_PARAMETER) builder.append(header) @@ -169,8 +170,8 @@ public fun buildDecompiledText( endOffset = builder.length() } } - else - if (descriptor is ClassDescriptor && !isEnumEntry(descriptor)) { + else if (descriptor is ClassDescriptor) { + if (!isEnumEntry(descriptor)) { builder.append(" {\n") var firstPassed = false val subindent = indent + " " @@ -185,32 +186,36 @@ public fun buildDecompiledText( firstPassed = true } } + val enumEntryCount = if (isEnumClass(descriptor)) allDescriptors.count { isEnumEntry(it) } else 0 + var enumEntryIndex = 0 for (member in allDescriptors) { - if (member.getContainingDeclaration() != descriptor) { + if (member.containingDeclaration != descriptor) { continue } if (member == companionObject) { continue } - if (companionNeeded && !isEnumEntry(member)) { + val isEnumEntry = isEnumEntry(member) + if (companionNeeded && !isEnumEntry) { companionNeeded = false newlineExceptFirst() builder.append(subindent) appendDescriptor(companionObject!!, subindent) } if (member is CallableMemberDescriptor - && member.getKind() != CallableMemberDescriptor.Kind.DECLARATION + && member.kind != CallableMemberDescriptor.Kind.DECLARATION //TODO: not synthesized and component like - && !isComponentLike(member.getName())) { + && !isComponentLike(member.name)) { continue } newlineExceptFirst() builder.append(subindent) - appendDescriptor(member, subindent) + appendDescriptor(member, subindent, isEnumEntry && ++enumEntryIndex == enumEntryCount) } builder.append(indent).append("}") endOffset = builder.length() } + } builder.append("\n") saveDescriptorToRange(descriptor, startOffset, endOffset) diff --git a/idea/testData/decompiler/decompiledText/Enum.expected.kt b/idea/testData/decompiler/decompiledText/Enum.expected.kt index 79e9661256c..312e5b73251 100644 --- a/idea/testData/decompiler/decompiledText/Enum.expected.kt +++ b/idea/testData/decompiler/decompiledText/Enum.expected.kt @@ -4,17 +4,17 @@ package test internal final enum class Enum private constructor() : kotlin.Enum { - A + A, - B + B, - C + C, - D + D, - E + E, - F + F; public companion object { internal final val c: kotlin.Int /* compiled code */ diff --git a/idea/testData/decompiler/navigation/decompiled/Color.kt b/idea/testData/decompiler/navigation/decompiled/Color.kt index 24866e5819b..47361b7eb3a 100644 --- a/idea/testData/decompiler/navigation/decompiled/Color.kt +++ b/idea/testData/decompiler/navigation/decompiled/Color.kt @@ -4,11 +4,11 @@ package testData.libraries [[public final enum class Color private constructor(rgb: kotlin.Int) : kotlin.Enum { - [[RED]] + [[RED]], - [[GREEN]] + [[GREEN]], - [[BLUE]] + [[BLUE]]; [internal final val rgb: kotlin.Int /* compiled code */] }]] \ No newline at end of file