JVM: Generate object and companion object INSTANCE fields as @NotNull

This commit is contained in:
Dmitry Petrov
2020-06-17 15:30:18 +03:00
parent 558dfc6d9a
commit e9231b5624
41 changed files with 84 additions and 44 deletions
@@ -771,10 +771,12 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
if (isNonCompanionObject(descriptor)) {
StackValue.Field field = StackValue.createSingletonViaInstance(descriptor, typeMapper, INSTANCE_FIELD);
v.newField(JvmDeclarationOriginKt.OtherOriginFromPure(myClass),
ACC_PUBLIC | ACC_STATIC | ACC_FINAL,
field.name, field.type.getDescriptor(), null, null);
FieldVisitor fv = v.newField(
JvmDeclarationOriginKt.OtherOriginFromPure(myClass),
ACC_PUBLIC | ACC_STATIC | ACC_FINAL,
field.name, field.type.getDescriptor(), null, null
);
AnnotationCodegen.forField(fv, this, state).visitAnnotation(Type.getDescriptor(NotNull.class), false).visitEnd();
return;
}
@@ -816,10 +818,13 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
fieldAccessFlags |= ACC_SYNTHETIC;
}
StackValue.Field field = StackValue.singleton(companionObjectDescriptor, typeMapper);
FieldVisitor fv = v.newField(JvmDeclarationOriginKt.OtherOrigin(companionObject == null ? myClass.getPsiOrParent() : companionObject),
fieldAccessFlags, field.name, field.type.getDescriptor(), null, null);
FieldVisitor fv = v.newField(
JvmDeclarationOriginKt.OtherOrigin(companionObject == null ? myClass.getPsiOrParent() : companionObject),
fieldAccessFlags, field.name, field.type.getDescriptor(), null, null
);
AnnotationCodegen.forField(fv, this, state).visitAnnotation(Type.getDescriptor(NotNull.class), false).visitEnd();
if (fieldShouldBeDeprecated) {
AnnotationCodegen.forField(fv, this, state).visitAnnotation("Ljava/lang/Deprecated;", true).visitEnd();
AnnotationCodegen.forField(fv, this, state).visitAnnotation(Type.getDescriptor(Deprecated.class), true).visitEnd();
}
}
@@ -10,18 +10,19 @@ import com.intellij.psi.*
import com.intellij.psi.impl.light.LightFieldBuilder
import com.intellij.psi.util.TypeConversionUtil
import org.jetbrains.annotations.NonNls
import org.jetbrains.annotations.NotNull
import org.jetbrains.kotlin.asJava.LightClassGenerationSupport
import org.jetbrains.kotlin.asJava.builder.LightMemberOriginForDeclaration
import org.jetbrains.kotlin.asJava.elements.*
import org.jetbrains.kotlin.asJava.elements.KtLightElement
import org.jetbrains.kotlin.asJava.elements.KtLightField
import org.jetbrains.kotlin.asJava.elements.KtLightFieldForSourceDeclarationSupport
import org.jetbrains.kotlin.asJava.elements.KtUltraLightSimpleModifierList
import org.jetbrains.kotlin.codegen.PropertyCodegen
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.descriptors.VariableDescriptor
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.idea.KotlinLanguage
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.lexer.KtTokens.VAL_KEYWORD
import org.jetbrains.kotlin.load.kotlin.TypeMappingMode
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.*
@@ -76,7 +77,8 @@ internal open class KtUltraLightFieldImpl protected constructor(
KtUltraLightSimpleModifierListField(support, declaration, this, modifiers)
}
override fun isEquivalentTo(another: PsiElement?): Boolean = kotlinOrigin == another || (another as? KtLightField)?.kotlinOrigin == kotlinOrigin
override fun isEquivalentTo(another: PsiElement?): Boolean =
kotlinOrigin == another || (another as? KtLightField)?.kotlinOrigin == kotlinOrigin
override fun getModifierList(): PsiModifierList = modifierList
@@ -105,11 +107,12 @@ internal open class KtUltraLightFieldImpl protected constructor(
}
override val qualifiedNameForNullabilityAnnotation: String?
get() {
// We don't generate nullability annotations for non-backing fields in backend
val typeForAnnotation = kotlinType?.takeUnless { declaration is KtEnumEntry || declaration is KtObjectDeclaration }
return computeQualifiedNameForNullabilityAnnotation(typeForAnnotation)
}
get() =
when (declaration) {
is KtObjectDeclaration -> NotNull::class.java.name
is KtEnumEntry -> null
else -> computeQualifiedNameForNullabilityAnnotation(kotlinType)
}
override val psiTypeForNullabilityAnnotation: PsiType?
get() = type
@@ -309,6 +309,9 @@ open class KtLightNullabilityAnnotation<D : KtLightElement<*, PsiModifierListOwn
// all data-class generated members are not-null
if (annotatedElement is KtClass && annotatedElement.isData()) return NotNull::class.java.name
// objects and companion objects are not null
if (annotatedElement is KtObjectDeclaration) return NotNull::class.java.name
if (annotatedElement is KtParameter) {
if (annotatedElement.containingClassOrObject?.isAnnotation() == true) return null
}
+2
View File
@@ -1,4 +1,5 @@
public final class A {
@org.jetbrains.annotations.NotNull
public static final A.Companion Companion;
public A() { /* compiled code */ }
@@ -7,6 +8,7 @@ public final class A {
public static final void f() { /* compiled code */ }
public static final class B {
@org.jetbrains.annotations.NotNull
public static final A.B INSTANCE;
@kotlin.jvm.JvmStatic
@@ -5,12 +5,14 @@ public final class A {
public B() { /* compiled code */ }
public static final class I {
@org.jetbrains.annotations.NotNull
public static final A.B.I INSTANCE;
private I() { /* compiled code */ }
}
public static final class II {
@org.jetbrains.annotations.NotNull
public static final A.B.II INSTANCE;
private II() { /* compiled code */ }
@@ -18,16 +20,19 @@ public final class A {
}
public static final class C {
@org.jetbrains.annotations.NotNull
public static final A.C INSTANCE;
private C() { /* compiled code */ }
public static final class D {
@org.jetbrains.annotations.NotNull
public static final A.C.D INSTANCE;
private D() { /* compiled code */ }
public static final class G {
@org.jetbrains.annotations.NotNull
public static final A.C.D.G INSTANCE;
private G() { /* compiled code */ }
@@ -1,4 +1,5 @@
public interface TraitClassObjectField {
@org.jetbrains.annotations.NotNull
TraitClassObjectField.Companion Companion;
@org.jetbrains.annotations.Nullable
java.lang.String x = "";
@@ -1,4 +1,5 @@
public final class A {
@org.jetbrains.annotations.NotNull
public static final A.Companion Companion;
public A() { /* compiled code */ }
@@ -2,6 +2,7 @@ public final class ClassObjectField {
@org.jetbrains.annotations.Nullable
private static final java.lang.String x;
private static final java.lang.String y;
@org.jetbrains.annotations.NotNull
public static final ClassObjectField.Companion Companion;
public ClassObjectField() { /* compiled code */ }
@@ -5,6 +5,7 @@ public final class A {
public static final int cc = 1;
@org.jetbrains.annotations.NotNull
public static final java.lang.String cv = "A";
@org.jetbrains.annotations.NotNull
public static final pack.A INSTANCE;
public final int getC() { /* compiled code */ }
@@ -2,6 +2,7 @@ public final class C {
@kotlin.jvm.JvmField
@org.jetbrains.annotations.NotNull
public static final java.lang.String foo;
@org.jetbrains.annotations.NotNull
public static final C.Companion Companion;
public C() { /* compiled code */ }
@@ -375,7 +375,7 @@ public final class SourceCrossinline$Factory {
@kotlin.Metadata
public interface SourceCrossinline {
public final static field Factory: SourceCrossinline$Factory
public final static @org.jetbrains.annotations.NotNull field Factory: SourceCrossinline$Factory
inner class SourceCrossinline$Factory
static method <clinit>(): void
public abstract @org.jetbrains.annotations.Nullable method consume(@org.jetbrains.annotations.NotNull p0: Sink, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): java.lang.Object
@@ -386,7 +386,7 @@ public final class SourceCrossinline$Factory {
@kotlin.Metadata
public interface SourceCrossinline {
public final static field Factory: SourceCrossinline$Factory
public final static @org.jetbrains.annotations.NotNull field Factory: SourceCrossinline$Factory
inner class SourceCrossinline$Factory
static method <clinit>(): void
public abstract @org.jetbrains.annotations.Nullable method consume(@org.jetbrains.annotations.NotNull p0: Sink, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.experimental.Continuation): java.lang.Object
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
class Foo private constructor(s: String) {
private fun foo(s: String) {}
@@ -8,7 +8,7 @@ public final class Foo$Companion {
@kotlin.Metadata
public final class Foo {
public final static field Companion: Foo$Companion
public final static @org.jetbrains.annotations.NotNull field Companion: Foo$Companion
inner class Foo$Companion
static method <clinit>(): void
private method <init>(p0: java.lang.String): void
@@ -12,7 +12,7 @@ public final class Foo$Companion {
@kotlin.Metadata
public final class Foo {
public final static field Companion: Foo$Companion
public final static @org.jetbrains.annotations.NotNull field Companion: Foo$Companion
inner class Foo$Companion
static method <clinit>(): void
private @Ann method <init>(@Ann p0: java.lang.String): void
@@ -7,7 +7,7 @@ public final class TestInternalCompanionInClass$Companion {
@kotlin.Metadata
public final class TestInternalCompanionInClass {
public final static field Companion: TestInternalCompanionInClass$Companion
public final static @org.jetbrains.annotations.NotNull field Companion: TestInternalCompanionInClass$Companion
inner class TestInternalCompanionInClass$Companion
static method <clinit>(): void
public method <init>(): void
@@ -22,7 +22,7 @@ final class TestPrivateCompanionInClass$Companion {
@kotlin.Metadata
public final class TestPrivateCompanionInClass {
private final static field Companion: TestPrivateCompanionInClass$Companion
private final static @org.jetbrains.annotations.NotNull field Companion: TestPrivateCompanionInClass$Companion
inner class TestPrivateCompanionInClass$Companion
static method <clinit>(): void
public method <init>(): void
@@ -38,7 +38,7 @@ final class TestPrivateCompanionInInterface$Companion {
@kotlin.Metadata
public interface TestPrivateCompanionInInterface {
public synthetic final static field Companion: TestPrivateCompanionInInterface$Companion
public synthetic final static @org.jetbrains.annotations.NotNull field Companion: TestPrivateCompanionInInterface$Companion
inner class TestPrivateCompanionInInterface$Companion
static method <clinit>(): void
}
@@ -52,7 +52,7 @@ public final class TestProtectedCompanionInClass$Companion {
@kotlin.Metadata
public class TestProtectedCompanionInClass {
protected final static field Companion: TestProtectedCompanionInClass$Companion
protected final static @org.jetbrains.annotations.NotNull field Companion: TestProtectedCompanionInClass$Companion
inner class TestProtectedCompanionInClass$Companion
static method <clinit>(): void
public method <init>(): void
@@ -7,7 +7,7 @@ public final class TestInternalCompanionInClass$Companion {
@kotlin.Metadata
public final class TestInternalCompanionInClass {
public final static field Companion: TestInternalCompanionInClass$Companion
public final static @org.jetbrains.annotations.NotNull field Companion: TestInternalCompanionInClass$Companion
inner class TestInternalCompanionInClass$Companion
static method <clinit>(): void
public method <init>(): void
@@ -22,7 +22,7 @@ final class TestPrivateCompanionInClass$Companion {
@kotlin.Metadata
public final class TestPrivateCompanionInClass {
public deprecated final static @java.lang.Deprecated field Companion: TestPrivateCompanionInClass$Companion
public deprecated final static @java.lang.Deprecated @org.jetbrains.annotations.NotNull field Companion: TestPrivateCompanionInClass$Companion
inner class TestPrivateCompanionInClass$Companion
static method <clinit>(): void
public method <init>(): void
@@ -38,7 +38,7 @@ final class TestPrivateCompanionInInterface$Companion {
@kotlin.Metadata
public interface TestPrivateCompanionInInterface {
public deprecated final static @java.lang.Deprecated field Companion: TestPrivateCompanionInInterface$Companion
public deprecated final static @java.lang.Deprecated @org.jetbrains.annotations.NotNull field Companion: TestPrivateCompanionInInterface$Companion
inner class TestPrivateCompanionInInterface$Companion
static method <clinit>(): void
}
@@ -52,7 +52,7 @@ public final class TestProtectedCompanionInClass$Companion {
@kotlin.Metadata
public class TestProtectedCompanionInClass {
public deprecated final static @java.lang.Deprecated field Companion: TestProtectedCompanionInClass$Companion
public deprecated final static @java.lang.Deprecated @org.jetbrains.annotations.NotNull field Companion: TestProtectedCompanionInClass$Companion
inner class TestProtectedCompanionInClass$Companion
static method <clinit>(): void
public method <init>(): void
@@ -8,7 +8,7 @@ public final class Foo$Companion {
@kotlin.Metadata
public final class Foo {
public final static field Companion: Foo$Companion
public final static @org.jetbrains.annotations.NotNull field Companion: Foo$Companion
private final static field constValInCompanion: int
private final field x: int
inner class Foo$Companion
@@ -19,7 +19,7 @@ public final class ASimpleClass {
@kotlin.Metadata
public final class BSimpleObject {
public final static field INSTANCE: BSimpleObject
public final static @org.jetbrains.annotations.NotNull field INSTANCE: BSimpleObject
static method <clinit>(): void
private method <init>(): void
public synthetic static method showSnackbar$default(p0: java.lang.String, p1: int, p2: int, p3: int, p4: java.lang.Object): void
@@ -61,7 +61,7 @@ public final class CClassWithCompanion$Companion {
@kotlin.Metadata
public final class CClassWithCompanion {
public final static field Companion: CClassWithCompanion$Companion
public final static @org.jetbrains.annotations.NotNull field Companion: CClassWithCompanion$Companion
inner class CClassWithCompanion$Companion
static method <clinit>(): void
public method <init>(): void
@@ -1,6 +1,6 @@
@kotlin.Metadata
public final class AnObject {
public final static field INSTANCE: AnObject
public final static @org.jetbrains.annotations.NotNull field INSTANCE: AnObject
static method <clinit>(): void
private method <init>(): void
public synthetic static method foo$default(p0: int, p1: int, p2: java.lang.Object): void
@@ -18,7 +18,7 @@ public final class WithCompanion$Companion {
@kotlin.Metadata
public final class WithCompanion {
public final static field Companion: WithCompanion$Companion
public final static @org.jetbrains.annotations.NotNull field Companion: WithCompanion$Companion
inner class WithCompanion$Companion
static method <clinit>(): void
public method <init>(): void
+2 -2
View File
@@ -14,7 +14,7 @@ public interface test/TopLevel$InnerInterface {
@kotlin.Metadata
public final class test/TopLevel$InnerObject {
public final static field INSTANCE: test.TopLevel$InnerObject
public final static @org.jetbrains.annotations.NotNull field INSTANCE: test.TopLevel$InnerObject
inner class test/TopLevel$InnerObject
private method <init>(): void
}
@@ -36,7 +36,7 @@ public final class test/TopLevel$NestedClass {
@kotlin.Metadata
public final class test/TopLevel {
public final static field Companion: test.TopLevel$Companion
public final static @org.jetbrains.annotations.NotNull field Companion: test.TopLevel$Companion
private final static @org.jetbrains.annotations.NotNull field q: java.lang.String
private final @org.jetbrains.annotations.NotNull field x: java.lang.String
private final field y: int
@@ -1,9 +1,9 @@
================ Step #1 =================
Cleaning output files:
out/production/module/B.class
out/production/module/META-INF/module.kotlin_module
out/production/module/test/B.class
out/production/module/test/UseKt.class
out/production/module/UseKt.class
End of files
Compiling files:
src/B.kt
@@ -29,7 +29,7 @@ public final class MyClass {
@AllOpen
@kotlin.Metadata
public final class Obj {
public final static field INSTANCE: Obj
public final static @org.jetbrains.annotations.NotNull field INSTANCE: Obj
static method <clinit>(): void
private method <init>(): void
}
@@ -26,7 +26,7 @@ public abstract class Base_ShouldBeOpen {
@kotlin.Metadata
public final class Intf$DefaultImpls {
inner class Intf$DefaultImpls
public static method intfMethod(p0: Intf): void
public static method intfMethod(@org.jetbrains.annotations.NotNull p0: Intf): void
}
@AllOpen
@@ -47,4 +47,4 @@ public class IntfImpl {
public class IntfImpl2_ShouldBeOpen {
public method <init>(): void
public method intfImpl2Method_ShouldBeOpen(): void
}
}
+1 -1
View File
@@ -5,7 +5,7 @@ public final class test/BaseClass$Companion {
}
@kotlin.Metadata
public class test/BaseClass {
public final static field Companion: test.BaseClass$Companion
public final static @org.jetbrains.annotations.NotNull field Companion: test.BaseClass$Companion
public final static field basePublicConst: int
inner class test/BaseClass$Companion
public method <init>(): void
@@ -15,6 +15,7 @@ public enum E {
@kotlin.Metadata()
public static final class Obj {
@org.jetbrains.annotations.NotNull()
public static final E.Obj INSTANCE = null;
private Obj() {
@@ -15,6 +15,7 @@ import java.lang.System;
@kotlin.Metadata()
public final class BParceler implements Parceler<B> {
@org.jetbrains.annotations.NotNull()
public static final BParceler INSTANCE = null;
private BParceler() {
@@ -42,6 +43,7 @@ import java.lang.System;
@kotlin.Metadata()
public final class CParceler implements Parceler<C> {
@org.jetbrains.annotations.NotNull()
public static final CParceler INSTANCE = null;
private CParceler() {
@@ -34,6 +34,7 @@ import java.lang.System;
*/
@kotlin.Metadata()
public final class Obj {
@org.jetbrains.annotations.NotNull()
public static final Obj INSTANCE = null;
private Obj() {
@@ -2,6 +2,7 @@ import java.lang.System;
@kotlin.Metadata()
public abstract interface Intf {
@org.jetbrains.annotations.NotNull()
public static final Intf.Companion Companion = null;
public static final int WHITE = 2;
@@ -7,6 +7,7 @@ public final class JvmStaticTest {
private static final int one = 1;
public static final int two = 2;
public static final char c = 'C';
@org.jetbrains.annotations.NotNull()
public static final JvmStaticTest.Companion Companion = null;
public JvmStaticTest() {
@@ -4,6 +4,7 @@ import java.lang.System;
public final class Test {
@org.jetbrains.annotations.NotNull()
private static final java.lang.String test = "";
@org.jetbrains.annotations.NotNull()
public static final Test.A A = null;
public Test() {
@@ -91,6 +91,7 @@ import java.lang.System;
public final class JJ {
@org.jetbrains.annotations.NotNull()
private static final java.lang.String b = null;
@org.jetbrains.annotations.NotNull()
public static final app.JJ INSTANCE = null;
@org.jetbrains.annotations.NotNull()
@@ -38,6 +38,7 @@ public final class A {
@kotlin.Metadata()
public static final class C {
@org.jetbrains.annotations.NotNull()
public static final A.C INSTANCE = null;
private C() {
@@ -150,6 +151,7 @@ public final class Test {
@kotlin.Metadata()
public static final class NestedObject {
@org.jetbrains.annotations.NotNull()
public static final Test.NestedObject INSTANCE = null;
private NestedObject() {
@@ -135,6 +135,7 @@ public final class Foo {
@kotlin.Metadata()
public static final class Zoo {
@org.jetbrains.annotations.NotNull()
public static final Foo.Bar.Zoo INSTANCE = null;
private Zoo() {
@@ -139,6 +139,7 @@ public final class Foo {
@kotlin.Metadata()
public static final class Zoo {
@org.jetbrains.annotations.NotNull()
public static final test.Foo.Bar.Zoo INSTANCE = null;
private Zoo() {
@@ -11,6 +11,7 @@ public final class NonExistentType {
private static final Function1<ABCDEF, kotlin.Unit> c = null;
@org.jetbrains.annotations.Nullable()
private static final ABCDEF<java.lang.String, Function1<java.util.List<ABCDEF>, kotlin.Unit>> d = null;
@org.jetbrains.annotations.NotNull()
public static final NonExistentType INSTANCE = null;
@org.jetbrains.annotations.Nullable()
@@ -32,6 +32,7 @@ public final class NonExistentType {
public static error.NonExistentClass coocoo3;
@org.jetbrains.annotations.NotNull()
public static error.NonExistentClass coocoo31;
@org.jetbrains.annotations.NotNull()
public static final NonExistentType INSTANCE = null;
@org.jetbrains.annotations.Nullable()
@@ -36,6 +36,7 @@ public final class PrimitiveTypes {
public static final java.lang.String stringQuotes = "quotes \" \'\'quotes";
@org.jetbrains.annotations.NotNull()
public static final java.lang.String stringRN = "\r\n";
@org.jetbrains.annotations.NotNull()
public static final PrimitiveTypes INSTANCE = null;
public final float getFloatMaxValue() {
@@ -4,6 +4,7 @@ import java.lang.System;
public final class Boo {
@org.jetbrains.annotations.NotNull()
private static final java.lang.String z = null;
@org.jetbrains.annotations.NotNull()
public static final Boo INSTANCE = null;
@org.jetbrains.annotations.NotNull()
@@ -49,6 +50,7 @@ public final class Foo {
private static final java.lang.String j = null;
@org.jetbrains.annotations.NotNull()
private static final java.lang.String k = null;
@org.jetbrains.annotations.NotNull()
public static final Foo INSTANCE = null;
@org.jetbrains.annotations.NotNull()
@@ -22,6 +22,7 @@ import java.lang.System;
@kotlin.Metadata()
public final class Simple {
@org.jetbrains.annotations.NotNull()
public static final test.Simple.Companion Companion = null;
@MyAnnotation()
@@ -31,7 +31,7 @@ public annotation class NoArg
@NoArg
@kotlin.Metadata
public final class Obj {
public final static field INSTANCE: Obj
public final static @org.jetbrains.annotations.NotNull field INSTANCE: Obj
static method <clinit>(): void
private method <init>(): void
}