Rendering primary constructor in decompiler.

#KT-3168 in progress
This commit is contained in:
Evgeny Gerashchenko
2012-12-18 16:18:23 +04:00
parent 9c15a04291
commit 4c64ea58d5
13 changed files with 43 additions and 10 deletions
@@ -24,6 +24,7 @@ public class DescriptorRendererBuilder {
private boolean modifiers = true;
private boolean startFromName = false;
private boolean debugMode = false;
private boolean classWithPrimaryConstructor = false;
@NotNull
private DescriptorRenderer.ValueParametersHandler valueParametersHandler = new DescriptorRenderer.DefaultValueParameterHandler();
@NotNull
@@ -67,7 +68,13 @@ public class DescriptorRendererBuilder {
return this;
}
public DescriptorRendererBuilder setClassWithPrimaryConstructor(boolean classWithPrimaryConstructor) {
this.classWithPrimaryConstructor = classWithPrimaryConstructor;
return this;
}
public DescriptorRenderer build() {
return new DescriptorRendererImpl(shortNames, withDefinedIn, modifiers, startFromName, debugMode, valueParametersHandler, textFormat);
return new DescriptorRendererImpl(shortNames, withDefinedIn, modifiers, startFromName, debugMode, classWithPrimaryConstructor,
valueParametersHandler, textFormat);
}
}
@@ -50,6 +50,7 @@ public class DescriptorRendererImpl implements DescriptorRenderer {
private final boolean modifiers;
private final boolean startFromName;
private final boolean debugMode;
private final boolean classWithPrimaryConstructor;
@NotNull
private final ValueParametersHandler handler;
@NotNull
@@ -61,6 +62,7 @@ public class DescriptorRendererImpl implements DescriptorRenderer {
boolean modifiers,
boolean startFromName,
boolean debugMode,
boolean classWithPrimaryConstructor,
@NotNull ValueParametersHandler handler,
@NotNull TextFormat textFormat
) {
@@ -69,6 +71,7 @@ public class DescriptorRendererImpl implements DescriptorRenderer {
this.modifiers = modifiers;
this.startFromName = startFromName;
this.handler = handler;
this.classWithPrimaryConstructor = classWithPrimaryConstructor;
this.debugMode = debugMode;
this.textFormat = textFormat;
}
@@ -501,6 +504,12 @@ public class DescriptorRendererImpl implements DescriptorRenderer {
if (isNotClassObject) {
renderName(descriptor, builder);
renderTypeParameters(descriptor.getTypeConstructor().getParameters(), builder);
if (classWithPrimaryConstructor) {
ConstructorDescriptor primaryConstructor = descriptor.getUnsubstitutedPrimaryConstructor();
if (primaryConstructor != null) {
renderValueParameters(primaryConstructor, builder);
}
}
}
if (!descriptor.equals(KotlinBuiltIns.getInstance().getNothing())) {
Collection<JetType> supertypes = descriptor.getTypeConstructor().getSupertypes();
@@ -39,6 +39,7 @@ import org.jetbrains.jet.lang.resolve.java.JvmStdlibNames;
import org.jetbrains.jet.lang.resolve.java.kt.JetClassAnnotation;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.renderer.DescriptorRenderer;
import org.jetbrains.jet.renderer.DescriptorRendererBuilder;
import java.util.*;
@@ -50,6 +51,8 @@ public class DecompiledDataFactory {
private static final String JET_CLASS = JetClass.class.getName();
private static final String JET_METHOD = JetMethod.class.getName();
private static final String DECOMPILED_COMMENT = "/* compiled code */";
private static final DescriptorRenderer DESCRIPTOR_RENDERER =
new DescriptorRendererBuilder().setWithDefinedIn(false).setClassWithPrimaryConstructor(true).build();
private final StringBuilder builder = new StringBuilder();
private final ClsFileImpl clsFile;
@@ -128,7 +131,7 @@ public class DecompiledDataFactory {
private void appendDescriptor(@NotNull DeclarationDescriptor descriptor, String indent) {
int startOffset = builder.length();
String renderedDescriptor = DescriptorRenderer.COMPACT_WITH_MODIFIERS.render(descriptor);
String renderedDescriptor = DESCRIPTOR_RENDERER.render(descriptor);
renderedDescriptor = renderedDescriptor.replace("= ...", "= " + DECOMPILED_COMMENT);
builder.append(renderedDescriptor);
int endOffset = builder.length();
@@ -3,5 +3,5 @@
package testData.libraries
[public abstract class AbstractClass {
[public abstract class AbstractClass() {
}]
@@ -3,7 +3,7 @@
package testData.libraries
[public abstract class ClassWithAbstractAndOpenMembers {
[public abstract class ClassWithAbstractAndOpenMembers() {
[public abstract val abstractVal : jet.String]
[public abstract var abstractVar : jet.String]
@@ -0,0 +1,8 @@
// IntelliJ API Decompiler stub source generated from a class file
// Implementation of methods is not available
package testData.libraries
[public final class ClassWithConstructor(a : jet.String, b : jet.Any) {
[internal final val a : jet.String] /* compiled code */
}]
+1 -1
View File
@@ -3,7 +3,7 @@
package testData.libraries
[public final enum class Color : jet.Enum<testData.libraries.Color> {
[public final enum class Color(rgb : jet.Int, p1 : jet.Int, p2 : jet.Int) : jet.Enum<testData.libraries.Color> {
class object {
[public final val BLUE : testData.libraries.Color] /* compiled code */
@@ -3,5 +3,5 @@
package testData.libraries
[public final class SimpleClass {
[public final class SimpleClass() {
}]
@@ -3,5 +3,5 @@
package testData.libraries
[public final class SimpleTraitImpl : testData.libraries.SimpleTrait {
[public final class SimpleTraitImpl() : testData.libraries.SimpleTrait {
}]
@@ -3,12 +3,12 @@
package testData.libraries
[public final class WithInnerAndObject {
[public final class WithInnerAndObject() {
class object {
[internal final fun foo() : Unit { /* compiled code */ }]
}
[internal final class MyInner {
[internal final class MyInner() {
[internal trait MyInnerInner {
[internal abstract fun innerInnerMethod() : Unit]
}]
@@ -3,7 +3,7 @@
package testData.libraries
[public final class WithTraitClassObject {
[public final class WithTraitClassObject() {
class object : testData.libraries.SimpleTrait {
}
}]
+2
View File
@@ -59,6 +59,8 @@ public abstract class ClassWithAbstractAndOpenMembers {
}
}
public class ClassWithConstructor(val a: String, b: Any)
public fun main(args : Array<String>) {
}
@@ -71,6 +71,10 @@ public class LibrariesWithoutSourcesTest extends AbstractLibrariesTest {
doTest();
}
public void testClassWithConstructor() {
doTest();
}
private void doTest() {
classFile = getClassFile();