diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/AlternativeSignatureParsing.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/AlternativeSignatureParsing.java index 0a88c19e989..62d510bd89f 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/AlternativeSignatureParsing.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/AlternativeSignatureParsing.java @@ -27,11 +27,13 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.AnalyzingUtils; +import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.JetTypeImpl; import org.jetbrains.jet.lang.types.TypeProjection; import org.jetbrains.jet.lang.types.TypeUtils; +import org.jetbrains.jet.lang.types.lang.JetStandardClasses; import org.jetbrains.jet.lang.types.lang.JetStandardLibrary; import org.jetbrains.jet.resolve.DescriptorRenderer; @@ -60,21 +62,39 @@ class AlternativeSignatureParsing { @Override public JetType visitFunctionType(JetFunctionType type, Void data) { - return visitCommonType(type); + return visitCommonType(type.getReceiverTypeRef() == null + ? JetStandardClasses.getFunction(type.getParameters().size()) + : JetStandardClasses.getReceiverFunction(type.getParameters().size()), type); } @Override public JetType visitTupleType(JetTupleType type, Void data) { - return visitCommonType(type); + return visitCommonType(JetStandardClasses.getTuple(type.getComponentTypeRefs().size()), type); } @Override public JetType visitUserType(JetUserType type, Void data) { - return visitCommonType(type); + JetUserType qualifier = type.getQualifier(); + String shortName = type.getReferenceExpression().getReferencedName(); + String longName = (qualifier == null ? "" : qualifier.getText() + ".") + shortName; + if (JetStandardClasses.UNIT_ALIAS.getName().equals(longName)) { + return visitCommonType(JetStandardClasses.getTuple(0), type); + } + return visitCommonType(longName, type); } - private JetType visitCommonType(JetTypeElement type) { + private JetType visitCommonType(@NotNull ClassDescriptor classDescriptor, @NotNull JetTypeElement type) { + return visitCommonType(DescriptorUtils.getFQName(classDescriptor).toSafe().getFqName(), type); + } + + private JetType visitCommonType(@NotNull String expectedFqNamePostfix, @NotNull JetTypeElement type) { try { + String fqName = DescriptorUtils.getFQName(autoType.getConstructor().getDeclarationDescriptor()).toSafe().getFqName(); + if (!fqName.endsWith(expectedFqNamePostfix)) { + throw new AlternativeSignatureMismatchException(String.format( + "Alternative signature type mismatch, expected: %s, actual: %s", expectedFqNamePostfix, fqName)); + } + List arguments = autoType.getArguments(); if (arguments.size() != type.getTypeArgumentsAsTypes().size()) { diff --git a/compiler/testData/readJavaBinaryClass/kotlinSignature/error/WrongTypeName1.java b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/WrongTypeName1.java new file mode 100644 index 00000000000..af4af2283b7 --- /dev/null +++ b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/WrongTypeName1.java @@ -0,0 +1,12 @@ +package test; + +import java.lang.UnsupportedOperationException; +import java.util.*; +import jet.runtime.typeinfo.KotlinSignature; + +public class WrongTypeName1 { + @KotlinSignature("fun foo(a : String) : Unit") + public String foo(String a) { + throw new UnsupportedOperationException(); + } +} diff --git a/compiler/testData/readJavaBinaryClass/kotlinSignature/error/WrongTypeName1.kt b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/WrongTypeName1.kt new file mode 100644 index 00000000000..406116475a0 --- /dev/null +++ b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/WrongTypeName1.kt @@ -0,0 +1,7 @@ +package test + +import java.util.* + +public open class WrongTypeName1 : Object() { + public open fun foo(p0 : String?) : String? = "" +} diff --git a/compiler/testData/readJavaBinaryClass/kotlinSignature/error/WrongTypeName1.txt b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/WrongTypeName1.txt new file mode 100644 index 00000000000..1a4e3bb1cbe --- /dev/null +++ b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/WrongTypeName1.txt @@ -0,0 +1,6 @@ +namespace test + +public open class test.WrongTypeName1 : java.lang.Object { + public final /*constructor*/ fun (): test.WrongTypeName1 + public open fun foo(/*0*/ p0: jet.String?): jet.String? +} diff --git a/compiler/testData/readJavaBinaryClass/kotlinSignature/error/WrongTypeName2.java b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/WrongTypeName2.java new file mode 100644 index 00000000000..6f5fc46618f --- /dev/null +++ b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/WrongTypeName2.java @@ -0,0 +1,12 @@ +package test; + +import java.lang.UnsupportedOperationException; +import java.util.*; +import jet.runtime.typeinfo.KotlinSignature; + +public class WrongTypeName2 { + @KotlinSignature("fun foo(a : Something.String) : String") + public String foo(String a) { + throw new UnsupportedOperationException(); + } +} diff --git a/compiler/testData/readJavaBinaryClass/kotlinSignature/error/WrongTypeName2.kt b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/WrongTypeName2.kt new file mode 100644 index 00000000000..26145a2c22d --- /dev/null +++ b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/WrongTypeName2.kt @@ -0,0 +1,7 @@ +package test + +import java.util.* + +public open class WrongTypeName2 : Object() { + public open fun foo(p0 : String?) : String? = "" +} diff --git a/compiler/testData/readJavaBinaryClass/kotlinSignature/error/WrongTypeName2.txt b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/WrongTypeName2.txt new file mode 100644 index 00000000000..2793baea4b7 --- /dev/null +++ b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/WrongTypeName2.txt @@ -0,0 +1,6 @@ +namespace test + +public open class test.WrongTypeName2 : java.lang.Object { + public final /*constructor*/ fun (): test.WrongTypeName2 + public open fun foo(/*0*/ p0: jet.String?): jet.String? +} diff --git a/compiler/testData/readJavaBinaryClass/kotlinSignature/error/WrongTypeName3.java b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/WrongTypeName3.java new file mode 100644 index 00000000000..d2b90c49e53 --- /dev/null +++ b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/WrongTypeName3.java @@ -0,0 +1,12 @@ +package test; + +import java.lang.UnsupportedOperationException; +import java.util.*; +import jet.runtime.typeinfo.KotlinSignature; + +public class WrongTypeName3 { + @KotlinSignature("fun foo(a : String) : List") + public String foo(String a) { + throw new UnsupportedOperationException(); + } +} diff --git a/compiler/testData/readJavaBinaryClass/kotlinSignature/error/WrongTypeName3.kt b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/WrongTypeName3.kt new file mode 100644 index 00000000000..47a0e4bd364 --- /dev/null +++ b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/WrongTypeName3.kt @@ -0,0 +1,7 @@ +package test + +import java.util.* + +public open class WrongTypeName3 : Object() { + public open fun foo(p0 : String?) : String? = "" +} diff --git a/compiler/testData/readJavaBinaryClass/kotlinSignature/error/WrongTypeName3.txt b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/WrongTypeName3.txt new file mode 100644 index 00000000000..ff087c69b83 --- /dev/null +++ b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/WrongTypeName3.txt @@ -0,0 +1,6 @@ +namespace test + +public open class test.WrongTypeName3 : java.lang.Object { + public final /*constructor*/ fun (): test.WrongTypeName3 + public open fun foo(/*0*/ p0: jet.String?): jet.String? +}