Fix decompiled data for objects and enum entries

Also prettify it for enum entries: output only names
This commit is contained in:
Alexander Udalov
2013-11-14 21:38:51 +04:00
parent ce481b08d8
commit e3fffa6b0b
2 changed files with 20 additions and 37 deletions
@@ -36,6 +36,8 @@ import org.jetbrains.jet.renderer.DescriptorRendererBuilder;
import java.util.*;
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isEnumEntry;
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isSyntheticClassObject;
import static org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule.INCLUDE_KOTLIN_SOURCES;
import static org.jetbrains.jet.plugin.libraries.JetDecompiledData.descriptorToKey;
@@ -85,12 +87,10 @@ public final class DecompiledDataFactory {
NamespaceDescriptor nd = javaDescriptorResolver.resolveNamespace(packageFqName, INCLUDE_KOTLIN_SOURCES);
if (nd != null) {
for (DeclarationDescriptor member : sortDeclarations(nd.getMemberScope().getAllDescriptors())) {
if (member instanceof ClassDescriptor || member instanceof NamespaceDescriptor
|| isNamedObjectProperty(member)) {
continue;
if (!(member instanceof ClassOrNamespaceDescriptor)) {
appendDescriptor(member, "");
builder.append("\n");
}
appendDescriptor(member, "");
builder.append("\n");
}
}
}
@@ -124,11 +124,11 @@ public final class DecompiledDataFactory {
}
private void appendDescriptor(@NotNull DeclarationDescriptor descriptor, String indent) {
// Don't render property for object declaration
int startOffset = builder.length();
String renderedDescriptor = DESCRIPTOR_RENDERER.render(descriptor);
renderedDescriptor = renderedDescriptor.replace("= ...", "= " + DECOMPILED_COMMENT);
builder.append(renderedDescriptor);
String header = isEnumEntry(descriptor)
? descriptor.getName().asString()
: DESCRIPTOR_RENDERER.render(descriptor).replace("= ...", "= " + DECOMPILED_COMMENT);
builder.append(header);
int endOffset = builder.length();
if (descriptor instanceof FunctionDescriptor || descriptor instanceof PropertyDescriptor) {
@@ -138,22 +138,20 @@ public final class DecompiledDataFactory {
endOffset = builder.length();
}
else { // descriptor instanceof PropertyDescriptor
if (((PropertyDescriptor) descriptor).getModality() != Modality.ABSTRACT) {
builder.append(" ").append(DECOMPILED_COMMENT);
}
builder.append(" ").append(DECOMPILED_COMMENT);
}
}
}
else if (descriptor instanceof ClassDescriptor) {
else if (descriptor instanceof ClassDescriptor && !isEnumEntry(descriptor)) {
builder.append(" {\n");
ClassDescriptor classDescriptor = (ClassDescriptor) descriptor;
boolean firstPassed = false;
String subindent = indent + " ";
ClassDescriptor classObjectDescriptor = classDescriptor.getClassObjectDescriptor();
if (classObjectDescriptor != null) {
ClassDescriptor classObject = classDescriptor.getClassObjectDescriptor();
if (classObject != null && !isSyntheticClassObject(classObject)) {
firstPassed = true;
builder.append(subindent);
appendDescriptor(classObjectDescriptor, subindent);
appendDescriptor(classObject, subindent);
}
for (DeclarationDescriptor member : sortDeclarations(classDescriptor.getDefaultType().getMemberScope().getAllDescriptors())) {
if (member.getContainingDeclaration() != descriptor) {
@@ -162,9 +160,6 @@ public final class DecompiledDataFactory {
if (member instanceof CallableMemberDescriptor && ((CallableMemberDescriptor) member).getKind() != CallableMemberDescriptor.Kind.DECLARATION) {
continue;
}
if (isNamedObjectProperty(member)) {
continue;
}
if (firstPassed) {
builder.append("\n");
@@ -193,14 +188,4 @@ public final class DecompiledDataFactory {
private void saveDescriptorToRange(DeclarationDescriptor descriptor, int startOffset, int endOffset) {
renderedDescriptorsToRange.put(descriptorToKey(descriptor), new TextRange(startOffset, endOffset));
}
private static boolean isNamedObjectProperty(@NotNull DeclarationDescriptor descriptor) {
if (descriptor instanceof PropertyDescriptor && descriptor instanceof VariableDescriptorForObject) {
ClassDescriptor objectClass = ((VariableDescriptorForObject) descriptor).getObjectClass();
if (objectClass.getKind() == ClassKind.OBJECT) {
return true;
}
}
return false;
}
}
+6 -8
View File
@@ -4,13 +4,11 @@
package testData.libraries
[[public final enum class Color(rgb: jet.Int) : jet.Enum<testData.libraries.Color> {
[[public class object {
[public final val BLUE: testData.libraries.Color] /* compiled code */
[public final val GREEN: testData.libraries.Color] /* compiled code */
[public final val RED: testData.libraries.Color] /* compiled code */
}]]
[internal final val rgb: jet.Int] /* compiled code */
[[BLUE]]
[[GREEN]]
[[RED]]
}]]