diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index 1f8e9f4cc70..ecdcb0143ad 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -322,7 +322,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { signatureVisitor.writeSupersEnd(); - return new JvmClassSignature(jvmName(), superClassAsmType.getInternalName(), superInterfaces, signatureVisitor.makeJavaString(), + return new JvmClassSignature(jvmName(), superClassAsmType.getInternalName(), superInterfaces, signatureVisitor.makeJavaGenericSignature(), signatureVisitor.makeKotlinClassSignature()); } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/signature/BothSignatureWriter.java b/compiler/backend/src/org/jetbrains/jet/codegen/signature/BothSignatureWriter.java index f99e349d6da..da6c78cdb60 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/signature/BothSignatureWriter.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/signature/BothSignatureWriter.java @@ -346,7 +346,18 @@ public class BothSignatureWriter { public void writeParameterType(JvmMethodParameterKind parameterKind) { transitionState(State.PARAMETERS, State.PARAMETER); - push(signatureVisitor().visitParameterType()); + // This magic mimics the behavior of javac that enum constructor have these synthetic parameters in erased signature, but doesn't + // have them in generic signature. IDEA relies on this behavior. + if (parameterKind == JvmMethodParameterKind.ENUM_NAME || parameterKind == JvmMethodParameterKind.ENUM_ORDINAL) { + generic = true; + + // pushing dummy visitor, because we don't want these parameters to appear in generic JVM signature + push(new SignatureWriter()); + } + else { + push(signatureVisitor().visitParameterType()); + } + jetSignatureWriter = new JetSignatureWriter(); if (jvmCurrentType != null || jvmCurrentTypeArrayLevel != 0) { throw new IllegalStateException(); @@ -476,7 +487,7 @@ public class BothSignatureWriter { } @Nullable - public String makeJavaString() { + public String makeJavaGenericSignature() { if (state != State.METHOD_END && state != State.CLASS_END) { throw new IllegalStateException(); } @@ -519,7 +530,7 @@ public class BothSignatureWriter { if (needGenerics) { return new JvmMethodSignature( makeAsmMethod(name), - makeJavaString(), + makeJavaGenericSignature(), makeKotlinMethodTypeParameters(), makeKotlinParameterTypes(), makeKotlinReturnTypeSignature() @@ -530,3 +541,4 @@ public class BothSignatureWriter { } } } + diff --git a/compiler/testData/loadKotlin/class/EnumWithGenericConstructorParameter.kt b/compiler/testData/loadKotlin/class/EnumWithGenericConstructorParameter.kt new file mode 100644 index 00000000000..9621398cb00 --- /dev/null +++ b/compiler/testData/loadKotlin/class/EnumWithGenericConstructorParameter.kt @@ -0,0 +1,4 @@ +package test + +enum class EnumWithGenericConstructorParameter(list: List?) { +} diff --git a/compiler/testData/loadKotlin/class/EnumWithGenericConstructorParameter.txt b/compiler/testData/loadKotlin/class/EnumWithGenericConstructorParameter.txt new file mode 100644 index 00000000000..67d8557387c --- /dev/null +++ b/compiler/testData/loadKotlin/class/EnumWithGenericConstructorParameter.txt @@ -0,0 +1,12 @@ +namespace test + +internal final enum class test.EnumWithGenericConstructorParameter : jet.Enum { + private final /*primary constructor*/ fun (/*0*/ list: jet.List?): test.EnumWithGenericConstructorParameter + public final override /*1*/ /*fake_override*/ fun name(): jet.String + public final override /*1*/ /*fake_override*/ fun ordinal(): jet.Int + internal final class object test.EnumWithGenericConstructorParameter. { + private final /*constructor*/ fun (): test.EnumWithGenericConstructorParameter. + public final fun valueOf(/*0*/ value: jet.String): test.EnumWithGenericConstructorParameter + public final fun values(): jet.Array + } +} diff --git a/compiler/testData/loadKotlin/class/EnumWithPrimitiveConstructorParameter.kt b/compiler/testData/loadKotlin/class/EnumWithPrimitiveConstructorParameter.kt new file mode 100644 index 00000000000..2d00b6961a8 --- /dev/null +++ b/compiler/testData/loadKotlin/class/EnumWithPrimitiveConstructorParameter.kt @@ -0,0 +1,4 @@ +package test + +enum class EnumWithPrimitiveConstructorParameter(b: Boolean) { +} diff --git a/compiler/testData/loadKotlin/class/EnumWithPrimitiveConstructorParameter.txt b/compiler/testData/loadKotlin/class/EnumWithPrimitiveConstructorParameter.txt new file mode 100644 index 00000000000..56ec7aa836f --- /dev/null +++ b/compiler/testData/loadKotlin/class/EnumWithPrimitiveConstructorParameter.txt @@ -0,0 +1,12 @@ +namespace test + +internal final enum class test.EnumWithPrimitiveConstructorParameter : jet.Enum { + private final /*primary constructor*/ fun (/*0*/ b: jet.Boolean): test.EnumWithPrimitiveConstructorParameter + public final override /*1*/ /*fake_override*/ fun name(): jet.String + public final override /*1*/ /*fake_override*/ fun ordinal(): jet.Int + internal final class object test.EnumWithPrimitiveConstructorParameter. { + private final /*constructor*/ fun (): test.EnumWithPrimitiveConstructorParameter. + public final fun valueOf(/*0*/ value: jet.String): test.EnumWithPrimitiveConstructorParameter + public final fun values(): jet.Array + } +} diff --git a/compiler/testData/loadKotlinCustom/enum/enumVisibilityBinary.txt b/compiler/testData/loadKotlinCustom/enum/enumVisibilityBinary.txt index 7e33aa397b7..321d198665e 100644 --- a/compiler/testData/loadKotlinCustom/enum/enumVisibilityBinary.txt +++ b/compiler/testData/loadKotlinCustom/enum/enumVisibilityBinary.txt @@ -1,7 +1,7 @@ namespace test internal final enum class test.In : jet.Enum { - private final /*constructor*/ fun (/*0*/ p0: jet.String?, /*1*/ p1: jet.Int): test.In + private final /*constructor*/ fun (): test.In public final override /*1*/ /*fake_override*/ fun name(): jet.String public final override /*1*/ /*fake_override*/ fun ordinal(): jet.Int internal final class object test.In. { @@ -12,7 +12,7 @@ internal final enum class test.In : jet.Enum { } } private final enum class test.Pr : jet.Enum { - private final /*constructor*/ fun (/*0*/ p0: jet.String?, /*1*/ p1: jet.Int): test.Pr + private final /*constructor*/ fun (): test.Pr public final override /*1*/ /*fake_override*/ fun name(): jet.String public final override /*1*/ /*fake_override*/ fun ordinal(): jet.Int private final class object test.Pr. { @@ -23,7 +23,7 @@ private final enum class test.Pr : jet.Enum { } } public final enum class test.Pu : jet.Enum { - private final /*constructor*/ fun (/*0*/ p0: jet.String?, /*1*/ p1: jet.Int): test.Pu + private final /*constructor*/ fun (): test.Pu public final override /*1*/ /*fake_override*/ fun name(): jet.String public final override /*1*/ /*fake_override*/ fun ordinal(): jet.Int public final class object test.Pu. { diff --git a/compiler/testData/loadKotlinCustom/enum/innerEnumBinary.txt b/compiler/testData/loadKotlinCustom/enum/innerEnumBinary.txt index ced1db8fa84..562c82fa64e 100644 --- a/compiler/testData/loadKotlinCustom/enum/innerEnumBinary.txt +++ b/compiler/testData/loadKotlinCustom/enum/innerEnumBinary.txt @@ -5,7 +5,7 @@ internal final class test.A : jet.Any { internal final class object test.A. { private final /*constructor*/ fun (): test.A. internal final enum class test.A..E : jet.Enum.E> { - private final /*constructor*/ fun (/*0*/ p0: jet.String?, /*1*/ p1: jet.Int): test.A..E + private final /*constructor*/ fun (): test.A..E public final override /*1*/ /*fake_override*/ fun name(): jet.String public final override /*1*/ /*fake_override*/ fun ordinal(): jet.Int internal final class object test.A..E. { diff --git a/compiler/testData/loadKotlinCustom/enum/innerEnumExistingClassObjectBinary.txt b/compiler/testData/loadKotlinCustom/enum/innerEnumExistingClassObjectBinary.txt index ced1db8fa84..562c82fa64e 100644 --- a/compiler/testData/loadKotlinCustom/enum/innerEnumExistingClassObjectBinary.txt +++ b/compiler/testData/loadKotlinCustom/enum/innerEnumExistingClassObjectBinary.txt @@ -5,7 +5,7 @@ internal final class test.A : jet.Any { internal final class object test.A. { private final /*constructor*/ fun (): test.A. internal final enum class test.A..E : jet.Enum.E> { - private final /*constructor*/ fun (/*0*/ p0: jet.String?, /*1*/ p1: jet.Int): test.A..E + private final /*constructor*/ fun (): test.A..E public final override /*1*/ /*fake_override*/ fun name(): jet.String public final override /*1*/ /*fake_override*/ fun ordinal(): jet.Int internal final class object test.A..E. { diff --git a/compiler/testData/loadKotlinCustom/enum/simpleEnumBinary.txt b/compiler/testData/loadKotlinCustom/enum/simpleEnumBinary.txt index a0544ffb622..08e3457b5ed 100644 --- a/compiler/testData/loadKotlinCustom/enum/simpleEnumBinary.txt +++ b/compiler/testData/loadKotlinCustom/enum/simpleEnumBinary.txt @@ -1,7 +1,7 @@ namespace test internal final enum class test.MyEnum : jet.Enum { - private final /*constructor*/ fun (/*0*/ p0: jet.String?, /*1*/ p1: jet.Int): test.MyEnum + private final /*constructor*/ fun (): test.MyEnum public final override /*1*/ /*fake_override*/ fun name(): jet.String public final override /*1*/ /*fake_override*/ fun ordinal(): jet.Int internal final class object test.MyEnum. { diff --git a/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadCompiledKotlinTestGenerated.java b/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadCompiledKotlinTestGenerated.java index 6518b099279..24dee60bc97 100644 --- a/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadCompiledKotlinTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadCompiledKotlinTestGenerated.java @@ -110,6 +110,16 @@ public class LoadCompiledKotlinTestGenerated extends AbstractLoadCompiledKotlinT doTest("compiler/testData/loadKotlin/class/ClassTwoParams2.kt"); } + @TestMetadata("EnumWithGenericConstructorParameter.kt") + public void testEnumWithGenericConstructorParameter() throws Exception { + doTest("compiler/testData/loadKotlin/class/EnumWithGenericConstructorParameter.kt"); + } + + @TestMetadata("EnumWithPrimitiveConstructorParameter.kt") + public void testEnumWithPrimitiveConstructorParameter() throws Exception { + doTest("compiler/testData/loadKotlin/class/EnumWithPrimitiveConstructorParameter.kt"); + } + @TestMetadata("InheritClassSimple.kt") public void testInheritClassSimple() throws Exception { doTest("compiler/testData/loadKotlin/class/InheritClassSimple.kt"); diff --git a/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveNamespaceComparingTestGenerated.java b/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveNamespaceComparingTestGenerated.java index a82ea72c965..61bc4bc40a5 100644 --- a/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveNamespaceComparingTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveNamespaceComparingTestGenerated.java @@ -112,6 +112,16 @@ public class LazyResolveNamespaceComparingTestGenerated extends AbstractLazyReso doTestCheckingPrimaryConstructors("compiler/testData/loadKotlin/class/ClassTwoParams2.kt"); } + @TestMetadata("EnumWithGenericConstructorParameter.kt") + public void testEnumWithGenericConstructorParameter() throws Exception { + doTestCheckingPrimaryConstructors("compiler/testData/loadKotlin/class/EnumWithGenericConstructorParameter.kt"); + } + + @TestMetadata("EnumWithPrimitiveConstructorParameter.kt") + public void testEnumWithPrimitiveConstructorParameter() throws Exception { + doTestCheckingPrimaryConstructors("compiler/testData/loadKotlin/class/EnumWithPrimitiveConstructorParameter.kt"); + } + @TestMetadata("InheritClassSimple.kt") public void testInheritClassSimple() throws Exception { doTestCheckingPrimaryConstructors("compiler/testData/loadKotlin/class/InheritClassSimple.kt"); diff --git a/idea/testData/libraries/decompiled/Color.kt b/idea/testData/libraries/decompiled/Color.kt index 4611bf681c0..424888c3e06 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(rgb : jet.Int, p1 : jet.Int, p2 : jet.Int) : jet.Enum { +[[public final enum class Color(rgb : jet.Int) : jet.Enum { class object { [public final val BLUE : testData.libraries.Color] /* compiled code */