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 435f2b405c7..6b51c766c49 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 @@ -156,6 +156,26 @@ class AlternativeSignatureParsing { return result; } + static JetType computeAlternativeReturnType(@NotNull JetType autoType, @Nullable JetTypeReference altReturnTypeRef) + throws AlternativeSignatureMismatchException { + JetType altReturnType; + if (altReturnTypeRef == null) { + if (JetStandardClasses.isUnit(autoType)) { + altReturnType = autoType; + } + else { + throw new AlternativeSignatureMismatchException(String.format( + "Return type in alternative signature is missing, while in real signature it is '%s'", + DescriptorRenderer.TEXT.renderType(autoType))); + } + } + else { + altReturnType = computeAlternativeTypeFromAnnotation(altReturnTypeRef.getTypeElement(), + autoType); + } + return altReturnType; + } + static JavaDescriptorResolver.ValueParameterDescriptors computeAlternativeValueParameters( JavaDescriptorResolver.ValueParameterDescriptors valueParameterDescriptors, JetNamedFunction altFunDeclaration) throws AlternativeSignatureMismatchException { diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java index 1052cfba56c..9f6d24a6486 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java @@ -1400,11 +1400,8 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes ValueParameterDescriptors altValueParameters = AlternativeSignatureParsing .computeAlternativeValueParameters(valueParameterDescriptors, altFunDeclaration); - JetTypeReference returnTypeRef = altFunDeclaration.getReturnTypeRef(); - JetType altReturnType = returnTypeRef != null - ? AlternativeSignatureParsing.computeAlternativeTypeFromAnnotation(returnTypeRef.getTypeElement(), - returnType) - : returnType; + JetType altReturnType = AlternativeSignatureParsing.computeAlternativeReturnType(returnType, + altFunDeclaration.getReturnTypeRef()); List altTypeParameters = AlternativeSignatureParsing .computeAlternativeTypeParameters(methodTypeParameters, altFunDeclaration); // if no exceptions were thrown, save alternative data diff --git a/compiler/testData/readJavaBinaryClass/kotlinSignature/error/ReturnTypeMissing.java b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/ReturnTypeMissing.java new file mode 100644 index 00000000000..35827409244 --- /dev/null +++ b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/ReturnTypeMissing.java @@ -0,0 +1,28 @@ +/* + * Copyright 2010-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package test; + +import jet.runtime.typeinfo.KotlinSignature; + +import java.lang.String; + +public class ReturnTypeMissing { + @KotlinSignature("fun foo(a : String)") + public int foo(String a) { + throw new UnsupportedOperationException(); + } +} diff --git a/compiler/testData/readJavaBinaryClass/kotlinSignature/error/ReturnTypeMissing.kt b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/ReturnTypeMissing.kt new file mode 100644 index 00000000000..493424dfd06 --- /dev/null +++ b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/ReturnTypeMissing.kt @@ -0,0 +1,9 @@ +package test + +import java.util.* + +public open class ReturnTypeMissing : Object() { + public open fun foo(p0 : String?) : Int { + throw UnsupportedOperationException() + } +} diff --git a/compiler/testData/readJavaBinaryClass/kotlinSignature/error/ReturnTypeMissing.txt b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/ReturnTypeMissing.txt new file mode 100644 index 00000000000..3d240c9a4cf --- /dev/null +++ b/compiler/testData/readJavaBinaryClass/kotlinSignature/error/ReturnTypeMissing.txt @@ -0,0 +1,6 @@ +namespace test + +public open class test.ReturnTypeMissing : java.lang.Object { + public final /*constructor*/ fun (): test.ReturnTypeMissing + public open fun foo(/*0*/ p0: jet.String?): jet.Int +}