From ee1f1f3d5628425c4e0543fbea8b365ab432e95c Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Thu, 21 Jun 2012 18:48:20 +0400 Subject: [PATCH] Added check for extra and missing upper bounds in alternative signatures. --- .../lang/resolve/java/AlternativeSignatureData.java | 12 ++++++++---- .../kotlinSignature/error/ExtraUpperBound.java | 10 ++++++++++ .../kotlinSignature/error/ExtraUpperBound.kt | 9 +++++++++ .../kotlinSignature/error/ExtraUpperBound.txt | 6 ++++++ .../kotlinSignature/error/MissingUpperBound.java | 10 ++++++++++ .../kotlinSignature/error/MissingUpperBound.kt | 9 +++++++++ .../kotlinSignature/error/MissingUpperBound.txt | 6 ++++++ 7 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 compiler/testData/readJavaBinaryClass/kotlinSignature/error/ExtraUpperBound.java create mode 100644 compiler/testData/readJavaBinaryClass/kotlinSignature/error/ExtraUpperBound.kt create mode 100644 compiler/testData/readJavaBinaryClass/kotlinSignature/error/ExtraUpperBound.txt create mode 100644 compiler/testData/readJavaBinaryClass/kotlinSignature/error/MissingUpperBound.java create mode 100644 compiler/testData/readJavaBinaryClass/kotlinSignature/error/MissingUpperBound.kt create mode 100644 compiler/testData/readJavaBinaryClass/kotlinSignature/error/MissingUpperBound.txt diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/AlternativeSignatureData.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/AlternativeSignatureData.java index 4c7d42e0681..e84ce3b18c9 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/AlternativeSignatureData.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/AlternativeSignatureData.java @@ -296,14 +296,18 @@ class AlternativeSignatureData { else { JetTypeConstraint constraint = findTypeParameterConstraint(altFunDeclaration, pd.getName(), upperBoundIndex); - assert constraint != null; // TODO fail more properly - JetTypeReference boundTypeReference = constraint.getBoundTypeReference(); - assert boundTypeReference != null; - altTypeElement = boundTypeReference.getTypeElement(); + if (constraint == null) { + fail("Upper bound #%d for type parameter %s is missing", upperBoundIndex, pd.getName()); + } + //noinspection ConstantConditions + altTypeElement = constraint.getBoundTypeReference().getTypeElement(); } altParamDescriptor.addUpperBound(computeType(altTypeElement, upperBound)); upperBoundIndex++; } + if (findTypeParameterConstraint(altFunDeclaration, pd.getName(), upperBoundIndex) != null) { + fail("Extra upper bound #%d for type parameter %s", upperBoundIndex, pd.getName()); + } altParamDescriptor.setInitialized(); altTypeParameters.add(altParamDescriptor); diff --git a/compiler/testData/readJavaBinaryClass/kotlinSignature/error/ExtraUpperBound.java b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/ExtraUpperBound.java new file mode 100644 index 00000000000..d9155efb6a0 --- /dev/null +++ b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/ExtraUpperBound.java @@ -0,0 +1,10 @@ +package test; + +import jet.runtime.typeinfo.KotlinSignature; + +public class ExtraUpperBound { + @KotlinSignature("fun foo() : String where A : Cloneable") + public String foo() { + throw new UnsupportedOperationException(); + } +} diff --git a/compiler/testData/readJavaBinaryClass/kotlinSignature/error/ExtraUpperBound.kt b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/ExtraUpperBound.kt new file mode 100644 index 00000000000..f254cca20bd --- /dev/null +++ b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/ExtraUpperBound.kt @@ -0,0 +1,9 @@ +package test + +import java.util.* + +public open class ExtraUpperBound : Object() { + public open fun foo() : String? { + throw UnsupportedOperationException() + } +} diff --git a/compiler/testData/readJavaBinaryClass/kotlinSignature/error/ExtraUpperBound.txt b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/ExtraUpperBound.txt new file mode 100644 index 00000000000..9ab08656259 --- /dev/null +++ b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/ExtraUpperBound.txt @@ -0,0 +1,6 @@ +namespace test + +public open class test.ExtraUpperBound : java.lang.Object { + public final /*constructor*/ fun (): test.ExtraUpperBound + public open fun foo(): jet.String? +} diff --git a/compiler/testData/readJavaBinaryClass/kotlinSignature/error/MissingUpperBound.java b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/MissingUpperBound.java new file mode 100644 index 00000000000..a32c5b2a4f4 --- /dev/null +++ b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/MissingUpperBound.java @@ -0,0 +1,10 @@ +package test; + +import jet.runtime.typeinfo.KotlinSignature; + +public class MissingUpperBound { + @KotlinSignature("fun foo() : String") + public String foo() { + throw new UnsupportedOperationException(); + } +} diff --git a/compiler/testData/readJavaBinaryClass/kotlinSignature/error/MissingUpperBound.kt b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/MissingUpperBound.kt new file mode 100644 index 00000000000..60b9a7b62ab --- /dev/null +++ b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/MissingUpperBound.kt @@ -0,0 +1,9 @@ +package test + +import java.util.* + +public open class MissingUpperBound : Object() { + public open fun foo() : String? where A : Cloneable? { + throw UnsupportedOperationException() + } +} diff --git a/compiler/testData/readJavaBinaryClass/kotlinSignature/error/MissingUpperBound.txt b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/MissingUpperBound.txt new file mode 100644 index 00000000000..9fab2b1afde --- /dev/null +++ b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/MissingUpperBound.txt @@ -0,0 +1,6 @@ +namespace test + +public open class test.MissingUpperBound : java.lang.Object { + public final /*constructor*/ fun (): test.MissingUpperBound + public open fun foo(): jet.String? +}