Rendering primary constructor in decompiler.
#KT-3168 in progress
This commit is contained in:
@@ -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 */
|
||||
}]
|
||||
@@ -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 {
|
||||
}
|
||||
}]
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user