From bf54dc54535569736683556980bba81aeb8f28b0 Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Tue, 6 Dec 2011 23:25:26 +0400 Subject: [PATCH] test nullable return types are read from .class files --- .../resolve/java/JavaDescriptorResolver.java | 26 ++++++++++++++++++- .../testData/readClass/ReturnTypeNotNull.kt | 3 +++ .../testData/readClass/ReturnTypeNullable.kt | 3 +++ .../org/jetbrains/jet/ReadClassDataTest.java | 5 ++-- 4 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 compiler/testData/readClass/ReturnTypeNotNull.kt create mode 100644 compiler/testData/readClass/ReturnTypeNullable.kt 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 7b581578eb0..4ce838b3069 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 @@ -479,7 +479,7 @@ public class JavaDescriptorResolver { DescriptorUtils.getExpectedThisObjectIfNeeded(classDescriptor), typeParameters, semanticServices.getDescriptorResolver().resolveParameterDescriptors(functionDescriptorImpl, parameters), - semanticServices.getTypeTransformer().transformToType(returnType), + semanticServices.getDescriptorResolver().makeReturnType(returnType, method), Modality.convertFromFlags(method.hasModifierProperty(PsiModifier.ABSTRACT), !method.hasModifierProperty(PsiModifier.FINAL)), resolveVisibilityFromPsiModifiers(method) ); @@ -491,6 +491,30 @@ public class JavaDescriptorResolver { return substitutedFunctionDescriptor; } + private JetType makeReturnType(PsiType returnType, PsiMethod method) { + boolean changeNullable = false; + boolean nullable = true; + + for (PsiAnnotation annotation : method.getModifierList().getAnnotations()) { + if (annotation.getQualifiedName().equals("jet.typeinfo.JetMethod")) { + PsiLiteralExpression nullableExpression = (PsiLiteralExpression) annotation.findAttributeValue("nullableReturnType"); + if (nullableExpression != null) { + nullable = (Boolean) nullableExpression.getValue(); + } else { + // default value of parameter + nullable = false; + changeNullable = true; + } + } + } + JetType transformedType = semanticServices.getTypeTransformer().transformToType(returnType); + if (changeNullable) { + return TypeUtils.makeNullableAsSpecified(transformedType, nullable); + } else { + return transformedType; + } + } + private static Visibility resolveVisibilityFromPsiModifiers(PsiModifierListOwner modifierListOwner) { //TODO report error return modifierListOwner.hasModifierProperty(PsiModifier.PUBLIC) ? Visibility.PUBLIC : diff --git a/compiler/testData/readClass/ReturnTypeNotNull.kt b/compiler/testData/readClass/ReturnTypeNotNull.kt new file mode 100644 index 00000000000..0e025241a22 --- /dev/null +++ b/compiler/testData/readClass/ReturnTypeNotNull.kt @@ -0,0 +1,3 @@ +namespace test + +fun ff(): String = "" diff --git a/compiler/testData/readClass/ReturnTypeNullable.kt b/compiler/testData/readClass/ReturnTypeNullable.kt new file mode 100644 index 00000000000..6b3e33f7136 --- /dev/null +++ b/compiler/testData/readClass/ReturnTypeNullable.kt @@ -0,0 +1,3 @@ +namespace test + +fun ff(): String? = "" diff --git a/compiler/tests/org/jetbrains/jet/ReadClassDataTest.java b/compiler/tests/org/jetbrains/jet/ReadClassDataTest.java index b476555280e..e97ad3202cd 100644 --- a/compiler/tests/org/jetbrains/jet/ReadClassDataTest.java +++ b/compiler/tests/org/jetbrains/jet/ReadClassDataTest.java @@ -105,8 +105,6 @@ public class ReadClassDataTest extends UsefulTestCase { @Override public void runTest() throws Exception { - if (true) return; - createMockCoreEnvironment(); LanguageASTFactory.INSTANCE.addExplicitExtension(JavaLanguage.INSTANCE, new JavaASTFactory()); @@ -184,7 +182,8 @@ public class ReadClassDataTest extends UsefulTestCase { for (int i = 0; i < a.getValueParameters().size(); ++i) { compareAnything(ValueParameterDescriptor.class, a.getValueParameters().get(i), b.getValueParameters().get(i)); } - System.out.println("function " + a.getName()); + Assert.assertEquals(a.getReturnType(), b.getReturnType()); + System.out.println("fun " + a.getName() + "(...): " + a.getReturnType()); } private void compareAnything(Class clazz, T a, T b) {