Decompiler fix: enum entries are now separated by , and have ; at the end, relevant tests fixed

This commit is contained in:
Mikhail Glukhikh
2015-08-05 19:27:59 +03:00
parent 15d69499d0
commit 3793d99b00
3 changed files with 23 additions and 18 deletions
@@ -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)
+6 -6
View File
@@ -4,17 +4,17 @@
package test
internal final enum class Enum private constructor() : kotlin.Enum<test.Enum> {
A
A,
B
B,
C
C,
D
D,
E
E,
F
F;
public companion object {
internal final val c: kotlin.Int /* compiled code */
+3 -3
View File
@@ -4,11 +4,11 @@
package testData.libraries
[[public final enum class Color private constructor(rgb: kotlin.Int) : kotlin.Enum<testData.libraries.Color> {
[[RED]]
[[RED]],
[[GREEN]]
[[GREEN]],
[[BLUE]]
[[BLUE]];
[internal final val rgb: kotlin.Int /* compiled code */]
}]]