Decompiler fix: enum entries are now separated by , and have ; at the end, relevant tests fixed
This commit is contained in:
+14
-9
@@ -28,6 +28,7 @@ import org.jetbrains.kotlin.name.FqName
|
|||||||
import org.jetbrains.kotlin.renderer.DescriptorRenderer
|
import org.jetbrains.kotlin.renderer.DescriptorRenderer
|
||||||
import org.jetbrains.kotlin.renderer.DescriptorRendererModifier
|
import org.jetbrains.kotlin.renderer.DescriptorRendererModifier
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorUtils.isEnumEntry
|
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.dataClassUtils.isComponentLike
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.secondaryConstructors
|
import org.jetbrains.kotlin.resolve.descriptorUtil.secondaryConstructors
|
||||||
import org.jetbrains.kotlin.types.error.MissingDependencyErrorClass
|
import org.jetbrains.kotlin.types.error.MissingDependencyErrorClass
|
||||||
@@ -138,13 +139,13 @@ public fun buildDecompiledText(
|
|||||||
renderedDescriptorsToRange[descriptorToKey(descriptor)] = TextRange(startOffset, endOffset)
|
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) {
|
if (descriptor is MissingDependencyErrorClass) {
|
||||||
throw IllegalStateException("${descriptor.javaClass.getSimpleName()} cannot be rendered. FqName: ${descriptor.fullFqName}")
|
throw IllegalStateException("${descriptor.javaClass.getSimpleName()} cannot be rendered. FqName: ${descriptor.fullFqName}")
|
||||||
}
|
}
|
||||||
val startOffset = builder.length()
|
val startOffset = builder.length()
|
||||||
val header = if (isEnumEntry(descriptor))
|
val header = if (isEnumEntry(descriptor))
|
||||||
descriptor.getName().asString()
|
descriptor.name.asString() + if (lastEnumEntry) ";" else ","
|
||||||
else
|
else
|
||||||
descriptorRenderer.render(descriptor).replace("= ...", DECOMPILED_COMMENT_FOR_PARAMETER)
|
descriptorRenderer.render(descriptor).replace("= ...", DECOMPILED_COMMENT_FOR_PARAMETER)
|
||||||
builder.append(header)
|
builder.append(header)
|
||||||
@@ -169,8 +170,8 @@ public fun buildDecompiledText(
|
|||||||
endOffset = builder.length()
|
endOffset = builder.length()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else if (descriptor is ClassDescriptor) {
|
||||||
if (descriptor is ClassDescriptor && !isEnumEntry(descriptor)) {
|
if (!isEnumEntry(descriptor)) {
|
||||||
builder.append(" {\n")
|
builder.append(" {\n")
|
||||||
var firstPassed = false
|
var firstPassed = false
|
||||||
val subindent = indent + " "
|
val subindent = indent + " "
|
||||||
@@ -185,32 +186,36 @@ public fun buildDecompiledText(
|
|||||||
firstPassed = true
|
firstPassed = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
val enumEntryCount = if (isEnumClass(descriptor)) allDescriptors.count { isEnumEntry(it) } else 0
|
||||||
|
var enumEntryIndex = 0
|
||||||
for (member in allDescriptors) {
|
for (member in allDescriptors) {
|
||||||
if (member.getContainingDeclaration() != descriptor) {
|
if (member.containingDeclaration != descriptor) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if (member == companionObject) {
|
if (member == companionObject) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if (companionNeeded && !isEnumEntry(member)) {
|
val isEnumEntry = isEnumEntry(member)
|
||||||
|
if (companionNeeded && !isEnumEntry) {
|
||||||
companionNeeded = false
|
companionNeeded = false
|
||||||
newlineExceptFirst()
|
newlineExceptFirst()
|
||||||
builder.append(subindent)
|
builder.append(subindent)
|
||||||
appendDescriptor(companionObject!!, subindent)
|
appendDescriptor(companionObject!!, subindent)
|
||||||
}
|
}
|
||||||
if (member is CallableMemberDescriptor
|
if (member is CallableMemberDescriptor
|
||||||
&& member.getKind() != CallableMemberDescriptor.Kind.DECLARATION
|
&& member.kind != CallableMemberDescriptor.Kind.DECLARATION
|
||||||
//TODO: not synthesized and component like
|
//TODO: not synthesized and component like
|
||||||
&& !isComponentLike(member.getName())) {
|
&& !isComponentLike(member.name)) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
newlineExceptFirst()
|
newlineExceptFirst()
|
||||||
builder.append(subindent)
|
builder.append(subindent)
|
||||||
appendDescriptor(member, subindent)
|
appendDescriptor(member, subindent, isEnumEntry && ++enumEntryIndex == enumEntryCount)
|
||||||
}
|
}
|
||||||
builder.append(indent).append("}")
|
builder.append(indent).append("}")
|
||||||
endOffset = builder.length()
|
endOffset = builder.length()
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
builder.append("\n")
|
builder.append("\n")
|
||||||
saveDescriptorToRange(descriptor, startOffset, endOffset)
|
saveDescriptorToRange(descriptor, startOffset, endOffset)
|
||||||
|
|||||||
@@ -4,17 +4,17 @@
|
|||||||
package test
|
package test
|
||||||
|
|
||||||
internal final enum class Enum private constructor() : kotlin.Enum<test.Enum> {
|
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 {
|
public companion object {
|
||||||
internal final val c: kotlin.Int /* compiled code */
|
internal final val c: kotlin.Int /* compiled code */
|
||||||
|
|||||||
+3
-3
@@ -4,11 +4,11 @@
|
|||||||
package testData.libraries
|
package testData.libraries
|
||||||
|
|
||||||
[[public final enum class Color private constructor(rgb: kotlin.Int) : kotlin.Enum<testData.libraries.Color> {
|
[[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 */]
|
[internal final val rgb: kotlin.Int /* compiled code */]
|
||||||
}]]
|
}]]
|
||||||
Reference in New Issue
Block a user