From 2b6f688a520eb10f3d198e35053d340323ded22f Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Mon, 11 Nov 2013 14:35:21 +0400 Subject: [PATCH] Annotate fields from traits' class object properties --- .../jet/codegen/ImplementationBodyCodegen.java | 11 +++++------ .../ClassObjectField.java | 18 ++++++++++++++++++ .../nullabilityAnnotations/ClassObjectField.kt | 6 ++++++ .../TraitClassObjectField.java | 18 ++++++++++++++++++ .../TraitClassObjectField.kt | 6 ++++++ .../jet/asJava/NullabilityAnnotationsTest.java | 8 ++++++++ 6 files changed, 61 insertions(+), 6 deletions(-) create mode 100644 compiler/testData/asJava/nullabilityAnnotations/ClassObjectField.java create mode 100644 compiler/testData/asJava/nullabilityAnnotations/ClassObjectField.kt create mode 100644 compiler/testData/asJava/nullabilityAnnotations/TraitClassObjectField.java create mode 100644 compiler/testData/asJava/nullabilityAnnotations/TraitClassObjectField.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index 27d71186619..9bbdefd3f9a 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -24,10 +24,7 @@ import com.intellij.psi.PsiElement; import com.intellij.util.ArrayUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.asm4.AnnotationVisitor; -import org.jetbrains.asm4.Label; -import org.jetbrains.asm4.MethodVisitor; -import org.jetbrains.asm4.Type; +import org.jetbrains.asm4.*; import org.jetbrains.asm4.commons.InstructionAdapter; import org.jetbrains.asm4.commons.Method; import org.jetbrains.jet.codegen.binding.CalculatedClosure; @@ -1072,8 +1069,10 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { for (PropertyAndDefaultValue propertyInfo : classObjectPropertiesToCopy) { PropertyDescriptor propertyDescriptor = propertyInfo.propertyDescriptor; - v.newField(null, ACC_STATIC | ACC_FINAL | ACC_PUBLIC, context.getFieldName(propertyDescriptor), - typeMapper.mapType(propertyDescriptor).getDescriptor(), null, propertyInfo.defaultValue); + FieldVisitor fv = v.newField(null, ACC_STATIC | ACC_FINAL | ACC_PUBLIC, context.getFieldName(propertyDescriptor), + typeMapper.mapType(propertyDescriptor).getDescriptor(), null, propertyInfo.defaultValue); + + AnnotationCodegen.forField(fv, typeMapper).genAnnotations(propertyDescriptor); //This field are always static and final so if it has constant initializer don't do anything in clinit, //field would be initialized via default value in v.newField(...) - see JVM SPEC Ch.4 diff --git a/compiler/testData/asJava/nullabilityAnnotations/ClassObjectField.java b/compiler/testData/asJava/nullabilityAnnotations/ClassObjectField.java new file mode 100644 index 00000000000..26b3180727f --- /dev/null +++ b/compiler/testData/asJava/nullabilityAnnotations/ClassObjectField.java @@ -0,0 +1,18 @@ +public final class ClassObjectField implements jet.JetObject { + @org.jetbrains.annotations.Nullable + public static final java.lang.String x = ""; + private static final java.lang.String y = ""; + public static final ClassObjectField.object object$; + + @org.jetbrains.annotations.NotNull + public ClassObjectField() { /* compiled code */ } + + public static final class object implements jet.JetObject { + @org.jetbrains.annotations.Nullable + public final java.lang.String getX() { /* compiled code */ } + + private final java.lang.String getY() { /* compiled code */ } + + private object() { /* compiled code */ } + } +} \ No newline at end of file diff --git a/compiler/testData/asJava/nullabilityAnnotations/ClassObjectField.kt b/compiler/testData/asJava/nullabilityAnnotations/ClassObjectField.kt new file mode 100644 index 00000000000..351c5d8864d --- /dev/null +++ b/compiler/testData/asJava/nullabilityAnnotations/ClassObjectField.kt @@ -0,0 +1,6 @@ +class ClassObjectField { + class object { + val x: String? = "" + private val y: String? = "" + } +} \ No newline at end of file diff --git a/compiler/testData/asJava/nullabilityAnnotations/TraitClassObjectField.java b/compiler/testData/asJava/nullabilityAnnotations/TraitClassObjectField.java new file mode 100644 index 00000000000..77923e6da3a --- /dev/null +++ b/compiler/testData/asJava/nullabilityAnnotations/TraitClassObjectField.java @@ -0,0 +1,18 @@ +public interface TraitClassObjectField extends jet.JetObject { + TraitClassObjectField.object object$; + @org.jetbrains.annotations.Nullable + java.lang.String x = ""; + + static final class object implements jet.JetObject { + @org.jetbrains.annotations.Nullable + private final java.lang.String x = ""; + private final java.lang.String y = ""; + + @org.jetbrains.annotations.Nullable + public final java.lang.String getX() { /* compiled code */ } + + private final java.lang.String getY() { /* compiled code */ } + + private object() { /* compiled code */ } + } +} \ No newline at end of file diff --git a/compiler/testData/asJava/nullabilityAnnotations/TraitClassObjectField.kt b/compiler/testData/asJava/nullabilityAnnotations/TraitClassObjectField.kt new file mode 100644 index 00000000000..f98073e92ad --- /dev/null +++ b/compiler/testData/asJava/nullabilityAnnotations/TraitClassObjectField.kt @@ -0,0 +1,6 @@ +trait TraitClassObjectField { + class object { + val x: String? = "" + private val y: String? = "" + } +} \ 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 7e54a61c918..cf7392e3275 100644 --- a/compiler/tests/org/jetbrains/jet/asJava/NullabilityAnnotationsTest.java +++ b/compiler/tests/org/jetbrains/jet/asJava/NullabilityAnnotationsTest.java @@ -77,6 +77,14 @@ public class NullabilityAnnotationsTest extends KotlinAsJavaTestBase { doTest(getTestName(false)); } + public void testClassObjectField() throws Exception { + doTest(getTestName(false)); + } + + public void testTraitClassObjectField() throws Exception { + doTest(getTestName(false)); + } + private void doTest(@NotNull String fqName) { PsiClass psiClass = finder.findClass(fqName, GlobalSearchScope.allScope(getProject())); if (!(psiClass instanceof KotlinLightClass)) {