diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/AnnotationCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/AnnotationCodegen.java index 64668dd6376..c51ab301cf1 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/AnnotationCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/AnnotationCodegen.java @@ -99,10 +99,24 @@ public abstract class AnnotationCodegen { private void generateAdditionalAnnotations(@NotNull Annotated annotated, @NotNull Set annotationDescriptorsAlreadyPresent) { if (annotated instanceof CallableDescriptor) { - generateNullabilityAnnotation(((CallableDescriptor) annotated).getReturnType(), annotationDescriptorsAlreadyPresent); + CallableDescriptor descriptor = (CallableDescriptor) annotated; + + // No need to annotate privates, synthetic accessors and their parameters + if (isInvisibleFromTheOutside(descriptor)) return; + if (descriptor instanceof ValueParameterDescriptor && isInvisibleFromTheOutside(descriptor.getContainingDeclaration())) return; + + generateNullabilityAnnotation(descriptor.getReturnType(), annotationDescriptorsAlreadyPresent); } } + private static boolean isInvisibleFromTheOutside(@Nullable DeclarationDescriptor descriptor) { + if (descriptor instanceof CallableMemberDescriptor && JetTypeMapper.isAccessor((CallableMemberDescriptor) descriptor)) return false; + if (descriptor instanceof MemberDescriptor) { + return AsmUtil.getVisibilityAccessFlag((MemberDescriptor) descriptor) == Opcodes.ACC_PRIVATE; + } + return false; + } + private void generateNullabilityAnnotation(@Nullable JetType type, @NotNull Set annotationDescriptorsAlreadyPresent) { if (type == null) return; diff --git a/compiler/testData/asJava/nullabilityAnnotations/PrivateInClass.java b/compiler/testData/asJava/nullabilityAnnotations/PrivateInClass.java new file mode 100644 index 00000000000..529fb9ed599 --- /dev/null +++ b/compiler/testData/asJava/nullabilityAnnotations/PrivateInClass.java @@ -0,0 +1,12 @@ +public final class PrivateInClass implements jet.JetObject { + private final java.lang.String nn = ""; + private final java.lang.String n = ""; + + private final java.lang.String getNn() { /* compiled code */ } + + private final java.lang.String getN() { /* compiled code */ } + + private final java.lang.String bar(@jet.runtime.typeinfo.JetValueParameter(name = "a") java.lang.String p, @jet.runtime.typeinfo.JetValueParameter(name = "b", type = "?") java.lang.String p1) { /* compiled code */ } + + private PrivateInClass(@jet.runtime.typeinfo.JetValueParameter(name = "s", type = "?") java.lang.String p) { /* compiled code */ } +} \ No newline at end of file diff --git a/compiler/testData/asJava/nullabilityAnnotations/PrivateInClass.kt b/compiler/testData/asJava/nullabilityAnnotations/PrivateInClass.kt new file mode 100644 index 00000000000..cc3c783d1eb --- /dev/null +++ b/compiler/testData/asJava/nullabilityAnnotations/PrivateInClass.kt @@ -0,0 +1,5 @@ +class PrivateInClass private (s: String?) { + private val nn: String = "" + private val n: String? = "" + private fun bar(a: String, b: String?): String? = null +} \ No newline at end of file diff --git a/compiler/testData/asJava/nullabilityAnnotations/PrivateInTrait.java b/compiler/testData/asJava/nullabilityAnnotations/PrivateInTrait.java new file mode 100644 index 00000000000..9af3c2a5e95 --- /dev/null +++ b/compiler/testData/asJava/nullabilityAnnotations/PrivateInTrait.java @@ -0,0 +1,10 @@ +public interface PrivateInTrait extends jet.JetObject { + @org.jetbrains.annotations.NotNull + java.lang.String getNn(); + + @org.jetbrains.annotations.Nullable + java.lang.String getN(); + + @org.jetbrains.annotations.Nullable + java.lang.String bar(@org.jetbrains.annotations.NotNull @jet.runtime.typeinfo.JetValueParameter(name = "a") java.lang.String p, @org.jetbrains.annotations.Nullable @jet.runtime.typeinfo.JetValueParameter(name = "b", type = "?") java.lang.String p1); +} \ No newline at end of file diff --git a/compiler/testData/asJava/nullabilityAnnotations/PrivateInTrait.kt b/compiler/testData/asJava/nullabilityAnnotations/PrivateInTrait.kt new file mode 100644 index 00000000000..13d4bb5ce57 --- /dev/null +++ b/compiler/testData/asJava/nullabilityAnnotations/PrivateInTrait.kt @@ -0,0 +1,5 @@ +trait PrivateInTrait { + private val nn: String + private val n: String? + private fun bar(a: String, b: String?): String? +} \ No newline at end of file diff --git a/compiler/testData/asJava/nullabilityAnnotations/Synthetic.java b/compiler/testData/asJava/nullabilityAnnotations/Synthetic.java index 8316c691c26..d1f6a7e46c0 100644 --- a/compiler/testData/asJava/nullabilityAnnotations/Synthetic.java +++ b/compiler/testData/asJava/nullabilityAnnotations/Synthetic.java @@ -1,5 +1,4 @@ public final class Synthetic implements jet.JetObject { - @org.jetbrains.annotations.NotNull private final void foo() { /* compiled code */ } @org.jetbrains.annotations.NotNull diff --git a/compiler/testData/asJava/nullabilityAnnotations/_DefaultPackage.java b/compiler/testData/asJava/nullabilityAnnotations/_DefaultPackage.java index 80bb029cb7e..ff4a60b8720 100644 --- a/compiler/testData/asJava/nullabilityAnnotations/_DefaultPackage.java +++ b/compiler/testData/asJava/nullabilityAnnotations/_DefaultPackage.java @@ -59,4 +59,13 @@ public final class _DefaultPackage { @org.jetbrains.annotations.NotNull public static final void setNullableVarWithGetSet(@org.jetbrains.annotations.Nullable @jet.runtime.typeinfo.JetValueParameter(name = "v", type = "?") java.lang.String p) { /* compiled code */ } + + @org.jetbrains.annotations.NotNull + public static final java.lang.String getPrivateNn() { /* compiled code */ } + + @org.jetbrains.annotations.Nullable + public static final java.lang.String getPrivateN() { /* compiled code */ } + + @org.jetbrains.annotations.Nullable + public static final java.lang.String privateFun(@org.jetbrains.annotations.NotNull @jet.runtime.typeinfo.JetValueParameter(name = "a") java.lang.String p, @org.jetbrains.annotations.Nullable @jet.runtime.typeinfo.JetValueParameter(name = "b", type = "?") java.lang.String p1) { /* compiled code */ } } \ No newline at end of file diff --git a/compiler/testData/asJava/nullabilityAnnotations/_DefaultPackage.kt b/compiler/testData/asJava/nullabilityAnnotations/_DefaultPackage.kt index 5fc0d180c2a..f1138fb5cc1 100644 --- a/compiler/testData/asJava/nullabilityAnnotations/_DefaultPackage.kt +++ b/compiler/testData/asJava/nullabilityAnnotations/_DefaultPackage.kt @@ -27,4 +27,8 @@ val nullableValWithGet: String? var nullableVarWithGetSet: String? [NotNull] get() = "" - [NotNull] set(v) {} \ No newline at end of file + [NotNull] set(v) {} + +private val privateNn: String = "" +private val privateN: String? = "" +private fun privateFun(a: String, b: String?): String? = null \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/asJava/NullabilityAnnotationsTest.java b/compiler/tests/org/jetbrains/jet/asJava/NullabilityAnnotationsTest.java index 0a8b16e9287..7e54a61c918 100644 --- a/compiler/tests/org/jetbrains/jet/asJava/NullabilityAnnotationsTest.java +++ b/compiler/tests/org/jetbrains/jet/asJava/NullabilityAnnotationsTest.java @@ -69,10 +69,18 @@ public class NullabilityAnnotationsTest extends KotlinAsJavaTestBase { doTest(getTestName(false)); } + public void testPrivateInClass() throws Exception { + doTest(getTestName(false)); + } + + public void testPrivateInTrait() throws Exception { + doTest(getTestName(false)); + } + private void doTest(@NotNull String fqName) { PsiClass psiClass = finder.findClass(fqName, GlobalSearchScope.allScope(getProject())); if (!(psiClass instanceof KotlinLightClass)) { - throw new IllegalStateException("Not a light class: " + psiClass); + throw new IllegalStateException("Not a light class: " + psiClass + " (" + fqName + ")"); } PsiClass delegate = ((KotlinLightClass) psiClass).getDelegate();