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 modifiers = true;
|
||||||
private boolean startFromName = false;
|
private boolean startFromName = false;
|
||||||
private boolean debugMode = false;
|
private boolean debugMode = false;
|
||||||
|
private boolean classWithPrimaryConstructor = false;
|
||||||
@NotNull
|
@NotNull
|
||||||
private DescriptorRenderer.ValueParametersHandler valueParametersHandler = new DescriptorRenderer.DefaultValueParameterHandler();
|
private DescriptorRenderer.ValueParametersHandler valueParametersHandler = new DescriptorRenderer.DefaultValueParameterHandler();
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -67,7 +68,13 @@ public class DescriptorRendererBuilder {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public DescriptorRendererBuilder setClassWithPrimaryConstructor(boolean classWithPrimaryConstructor) {
|
||||||
|
this.classWithPrimaryConstructor = classWithPrimaryConstructor;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public DescriptorRenderer build() {
|
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 modifiers;
|
||||||
private final boolean startFromName;
|
private final boolean startFromName;
|
||||||
private final boolean debugMode;
|
private final boolean debugMode;
|
||||||
|
private final boolean classWithPrimaryConstructor;
|
||||||
@NotNull
|
@NotNull
|
||||||
private final ValueParametersHandler handler;
|
private final ValueParametersHandler handler;
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -61,6 +62,7 @@ public class DescriptorRendererImpl implements DescriptorRenderer {
|
|||||||
boolean modifiers,
|
boolean modifiers,
|
||||||
boolean startFromName,
|
boolean startFromName,
|
||||||
boolean debugMode,
|
boolean debugMode,
|
||||||
|
boolean classWithPrimaryConstructor,
|
||||||
@NotNull ValueParametersHandler handler,
|
@NotNull ValueParametersHandler handler,
|
||||||
@NotNull TextFormat textFormat
|
@NotNull TextFormat textFormat
|
||||||
) {
|
) {
|
||||||
@@ -69,6 +71,7 @@ public class DescriptorRendererImpl implements DescriptorRenderer {
|
|||||||
this.modifiers = modifiers;
|
this.modifiers = modifiers;
|
||||||
this.startFromName = startFromName;
|
this.startFromName = startFromName;
|
||||||
this.handler = handler;
|
this.handler = handler;
|
||||||
|
this.classWithPrimaryConstructor = classWithPrimaryConstructor;
|
||||||
this.debugMode = debugMode;
|
this.debugMode = debugMode;
|
||||||
this.textFormat = textFormat;
|
this.textFormat = textFormat;
|
||||||
}
|
}
|
||||||
@@ -501,6 +504,12 @@ public class DescriptorRendererImpl implements DescriptorRenderer {
|
|||||||
if (isNotClassObject) {
|
if (isNotClassObject) {
|
||||||
renderName(descriptor, builder);
|
renderName(descriptor, builder);
|
||||||
renderTypeParameters(descriptor.getTypeConstructor().getParameters(), builder);
|
renderTypeParameters(descriptor.getTypeConstructor().getParameters(), builder);
|
||||||
|
if (classWithPrimaryConstructor) {
|
||||||
|
ConstructorDescriptor primaryConstructor = descriptor.getUnsubstitutedPrimaryConstructor();
|
||||||
|
if (primaryConstructor != null) {
|
||||||
|
renderValueParameters(primaryConstructor, builder);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (!descriptor.equals(KotlinBuiltIns.getInstance().getNothing())) {
|
if (!descriptor.equals(KotlinBuiltIns.getInstance().getNothing())) {
|
||||||
Collection<JetType> supertypes = descriptor.getTypeConstructor().getSupertypes();
|
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.java.kt.JetClassAnnotation;
|
||||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||||
import org.jetbrains.jet.renderer.DescriptorRenderer;
|
import org.jetbrains.jet.renderer.DescriptorRenderer;
|
||||||
|
import org.jetbrains.jet.renderer.DescriptorRendererBuilder;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
@@ -50,6 +51,8 @@ public class DecompiledDataFactory {
|
|||||||
private static final String JET_CLASS = JetClass.class.getName();
|
private static final String JET_CLASS = JetClass.class.getName();
|
||||||
private static final String JET_METHOD = JetMethod.class.getName();
|
private static final String JET_METHOD = JetMethod.class.getName();
|
||||||
private static final String DECOMPILED_COMMENT = "/* compiled code */";
|
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 StringBuilder builder = new StringBuilder();
|
||||||
private final ClsFileImpl clsFile;
|
private final ClsFileImpl clsFile;
|
||||||
@@ -128,7 +131,7 @@ public class DecompiledDataFactory {
|
|||||||
|
|
||||||
private void appendDescriptor(@NotNull DeclarationDescriptor descriptor, String indent) {
|
private void appendDescriptor(@NotNull DeclarationDescriptor descriptor, String indent) {
|
||||||
int startOffset = builder.length();
|
int startOffset = builder.length();
|
||||||
String renderedDescriptor = DescriptorRenderer.COMPACT_WITH_MODIFIERS.render(descriptor);
|
String renderedDescriptor = DESCRIPTOR_RENDERER.render(descriptor);
|
||||||
renderedDescriptor = renderedDescriptor.replace("= ...", "= " + DECOMPILED_COMMENT);
|
renderedDescriptor = renderedDescriptor.replace("= ...", "= " + DECOMPILED_COMMENT);
|
||||||
builder.append(renderedDescriptor);
|
builder.append(renderedDescriptor);
|
||||||
int endOffset = builder.length();
|
int endOffset = builder.length();
|
||||||
|
|||||||
@@ -3,5 +3,5 @@
|
|||||||
|
|
||||||
package testData.libraries
|
package testData.libraries
|
||||||
|
|
||||||
[public abstract class AbstractClass {
|
[public abstract class AbstractClass() {
|
||||||
}]
|
}]
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
package testData.libraries
|
package testData.libraries
|
||||||
|
|
||||||
[public abstract class ClassWithAbstractAndOpenMembers {
|
[public abstract class ClassWithAbstractAndOpenMembers() {
|
||||||
[public abstract val abstractVal : jet.String]
|
[public abstract val abstractVal : jet.String]
|
||||||
|
|
||||||
[public abstract var abstractVar : 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
|
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 {
|
class object {
|
||||||
[public final val BLUE : testData.libraries.Color] /* compiled code */
|
[public final val BLUE : testData.libraries.Color] /* compiled code */
|
||||||
|
|
||||||
|
|||||||
@@ -3,5 +3,5 @@
|
|||||||
|
|
||||||
package testData.libraries
|
package testData.libraries
|
||||||
|
|
||||||
[public final class SimpleClass {
|
[public final class SimpleClass() {
|
||||||
}]
|
}]
|
||||||
|
|||||||
@@ -3,5 +3,5 @@
|
|||||||
|
|
||||||
package testData.libraries
|
package testData.libraries
|
||||||
|
|
||||||
[public final class SimpleTraitImpl : testData.libraries.SimpleTrait {
|
[public final class SimpleTraitImpl() : testData.libraries.SimpleTrait {
|
||||||
}]
|
}]
|
||||||
|
|||||||
@@ -3,12 +3,12 @@
|
|||||||
|
|
||||||
package testData.libraries
|
package testData.libraries
|
||||||
|
|
||||||
[public final class WithInnerAndObject {
|
[public final class WithInnerAndObject() {
|
||||||
class object {
|
class object {
|
||||||
[internal final fun foo() : Unit { /* compiled code */ }]
|
[internal final fun foo() : Unit { /* compiled code */ }]
|
||||||
}
|
}
|
||||||
|
|
||||||
[internal final class MyInner {
|
[internal final class MyInner() {
|
||||||
[internal trait MyInnerInner {
|
[internal trait MyInnerInner {
|
||||||
[internal abstract fun innerInnerMethod() : Unit]
|
[internal abstract fun innerInnerMethod() : Unit]
|
||||||
}]
|
}]
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
package testData.libraries
|
package testData.libraries
|
||||||
|
|
||||||
[public final class WithTraitClassObject {
|
[public final class WithTraitClassObject() {
|
||||||
class object : testData.libraries.SimpleTrait {
|
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>) {
|
public fun main(args : Array<String>) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -71,6 +71,10 @@ public class LibrariesWithoutSourcesTest extends AbstractLibrariesTest {
|
|||||||
doTest();
|
doTest();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testClassWithConstructor() {
|
||||||
|
doTest();
|
||||||
|
}
|
||||||
|
|
||||||
private void doTest() {
|
private void doTest() {
|
||||||
classFile = getClassFile();
|
classFile = getClassFile();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user