From 4c64ea58d5a0ed8af0f55013937124b013576603 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Tue, 18 Dec 2012 16:18:23 +0400 Subject: [PATCH] Rendering primary constructor in decompiler. #KT-3168 in progress --- .../jet/renderer/DescriptorRendererBuilder.java | 9 ++++++++- .../jetbrains/jet/renderer/DescriptorRendererImpl.java | 9 +++++++++ .../jet/plugin/libraries/DecompiledDataFactory.java | 5 ++++- idea/testData/libraries/decompiled/AbstractClass.kt | 2 +- .../decompiled/ClassWithAbstractAndOpenMembers.kt | 2 +- .../libraries/decompiled/ClassWithConstructor.kt | 8 ++++++++ idea/testData/libraries/decompiled/Color.kt | 2 +- idea/testData/libraries/decompiled/SimpleClass.kt | 2 +- idea/testData/libraries/decompiled/SimpleTraitImpl.kt | 2 +- idea/testData/libraries/decompiled/WithInnerAndObject.kt | 4 ++-- .../libraries/decompiled/WithTraitClassObject.kt | 2 +- idea/testData/libraries/library/main.kt | 2 ++ .../plugin/libraries/LibrariesWithoutSourcesTest.java | 4 ++++ 13 files changed, 43 insertions(+), 10 deletions(-) create mode 100644 idea/testData/libraries/decompiled/ClassWithConstructor.kt diff --git a/compiler/frontend/src/org/jetbrains/jet/renderer/DescriptorRendererBuilder.java b/compiler/frontend/src/org/jetbrains/jet/renderer/DescriptorRendererBuilder.java index 90b45984a46..eb5e507afb6 100644 --- a/compiler/frontend/src/org/jetbrains/jet/renderer/DescriptorRendererBuilder.java +++ b/compiler/frontend/src/org/jetbrains/jet/renderer/DescriptorRendererBuilder.java @@ -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); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/renderer/DescriptorRendererImpl.java b/compiler/frontend/src/org/jetbrains/jet/renderer/DescriptorRendererImpl.java index dc7a6d0edb8..5fba99a6bfa 100644 --- a/compiler/frontend/src/org/jetbrains/jet/renderer/DescriptorRendererImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/renderer/DescriptorRendererImpl.java @@ -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 supertypes = descriptor.getTypeConstructor().getSupertypes(); diff --git a/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledDataFactory.java b/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledDataFactory.java index ca6cf49824d..5bc9e0dd1af 100644 --- a/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledDataFactory.java +++ b/idea/src/org/jetbrains/jet/plugin/libraries/DecompiledDataFactory.java @@ -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(); diff --git a/idea/testData/libraries/decompiled/AbstractClass.kt b/idea/testData/libraries/decompiled/AbstractClass.kt index 1bbcdc62a2d..66f03239ca1 100644 --- a/idea/testData/libraries/decompiled/AbstractClass.kt +++ b/idea/testData/libraries/decompiled/AbstractClass.kt @@ -3,5 +3,5 @@ package testData.libraries -[public abstract class AbstractClass { +[public abstract class AbstractClass() { }] \ No newline at end of file diff --git a/idea/testData/libraries/decompiled/ClassWithAbstractAndOpenMembers.kt b/idea/testData/libraries/decompiled/ClassWithAbstractAndOpenMembers.kt index 10a9b0e9a1a..656a5a995eb 100644 --- a/idea/testData/libraries/decompiled/ClassWithAbstractAndOpenMembers.kt +++ b/idea/testData/libraries/decompiled/ClassWithAbstractAndOpenMembers.kt @@ -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] diff --git a/idea/testData/libraries/decompiled/ClassWithConstructor.kt b/idea/testData/libraries/decompiled/ClassWithConstructor.kt new file mode 100644 index 00000000000..03939308da2 --- /dev/null +++ b/idea/testData/libraries/decompiled/ClassWithConstructor.kt @@ -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 */ +}] diff --git a/idea/testData/libraries/decompiled/Color.kt b/idea/testData/libraries/decompiled/Color.kt index 27282ffdf72..5dc83f6c469 100644 --- a/idea/testData/libraries/decompiled/Color.kt +++ b/idea/testData/libraries/decompiled/Color.kt @@ -3,7 +3,7 @@ package testData.libraries -[public final enum class Color : jet.Enum { +[public final enum class Color(rgb : jet.Int, p1 : jet.Int, p2 : jet.Int) : jet.Enum { class object { [public final val BLUE : testData.libraries.Color] /* compiled code */ diff --git a/idea/testData/libraries/decompiled/SimpleClass.kt b/idea/testData/libraries/decompiled/SimpleClass.kt index 2dde8866afb..b100d92c68e 100644 --- a/idea/testData/libraries/decompiled/SimpleClass.kt +++ b/idea/testData/libraries/decompiled/SimpleClass.kt @@ -3,5 +3,5 @@ package testData.libraries -[public final class SimpleClass { +[public final class SimpleClass() { }] diff --git a/idea/testData/libraries/decompiled/SimpleTraitImpl.kt b/idea/testData/libraries/decompiled/SimpleTraitImpl.kt index d091a04d296..0c022f855eb 100644 --- a/idea/testData/libraries/decompiled/SimpleTraitImpl.kt +++ b/idea/testData/libraries/decompiled/SimpleTraitImpl.kt @@ -3,5 +3,5 @@ package testData.libraries -[public final class SimpleTraitImpl : testData.libraries.SimpleTrait { +[public final class SimpleTraitImpl() : testData.libraries.SimpleTrait { }] diff --git a/idea/testData/libraries/decompiled/WithInnerAndObject.kt b/idea/testData/libraries/decompiled/WithInnerAndObject.kt index 8f1686dc1c4..515a91bd6c6 100644 --- a/idea/testData/libraries/decompiled/WithInnerAndObject.kt +++ b/idea/testData/libraries/decompiled/WithInnerAndObject.kt @@ -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] }] diff --git a/idea/testData/libraries/decompiled/WithTraitClassObject.kt b/idea/testData/libraries/decompiled/WithTraitClassObject.kt index ebdbde424a2..ab87fe0b4b6 100644 --- a/idea/testData/libraries/decompiled/WithTraitClassObject.kt +++ b/idea/testData/libraries/decompiled/WithTraitClassObject.kt @@ -3,7 +3,7 @@ package testData.libraries -[public final class WithTraitClassObject { +[public final class WithTraitClassObject() { class object : testData.libraries.SimpleTrait { } }] diff --git a/idea/testData/libraries/library/main.kt b/idea/testData/libraries/library/main.kt index d6c7eb39369..19a6cbff955 100644 --- a/idea/testData/libraries/library/main.kt +++ b/idea/testData/libraries/library/main.kt @@ -59,6 +59,8 @@ public abstract class ClassWithAbstractAndOpenMembers { } } +public class ClassWithConstructor(val a: String, b: Any) + public fun main(args : Array) { } diff --git a/idea/tests/org/jetbrains/jet/plugin/libraries/LibrariesWithoutSourcesTest.java b/idea/tests/org/jetbrains/jet/plugin/libraries/LibrariesWithoutSourcesTest.java index 756c5774225..880f7dfffd6 100644 --- a/idea/tests/org/jetbrains/jet/plugin/libraries/LibrariesWithoutSourcesTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/libraries/LibrariesWithoutSourcesTest.java @@ -71,6 +71,10 @@ public class LibrariesWithoutSourcesTest extends AbstractLibrariesTest { doTest(); } + public void testClassWithConstructor() { + doTest(); + } + private void doTest() { classFile = getClassFile();