From 63fb00fa21a27bed83390ff15a96fe53e624a4ed Mon Sep 17 00:00:00 2001 From: Jinseong Jeon Date: Tue, 17 May 2022 11:21:53 -0700 Subject: [PATCH] FIR LC: revisit when to add fields to companion and/or containing class --- .../classes/FirLightClassForClassOrObjectSymbol.kt | 10 ++++++++-- .../classes/symbol/classes/FirLightClassForSymbol.kt | 5 ++++- .../compilationErrors/TraitClassObjectField.fir.java | 3 +++ .../ideRegression/ImplementingMutableSet.fir.java | 6 +++--- .../nullabilityAnnotations/ClassObjectField.fir.java | 12 ++++++------ .../asJava/ultraLightClasses/jvmField.fir.java | 4 ++++ .../asJava/ultraLightClasses/objects.fir.java | 12 +++++++----- .../asJava/ultraLightClasses/properties.fir.java | 12 ++++++------ 8 files changed, 41 insertions(+), 23 deletions(-) diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightClassForClassOrObjectSymbol.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightClassForClassOrObjectSymbol.kt index f4f815d2f7c..a1ea27ce9ff 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightClassForClassOrObjectSymbol.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightClassForClassOrObjectSymbol.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.psi.KtClassBody import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.debugText.getDebugText import org.jetbrains.kotlin.psi.stubs.KotlinClassOrObjectStub +import org.jetbrains.kotlin.utils.addToStdlib.applyIf import org.jetbrains.kotlin.utils.addToStdlib.ifFalse import org.jetbrains.kotlin.utils.addToStdlib.ifTrue @@ -101,7 +102,9 @@ internal abstract class FirLightClassForClassOrObjectSymbol( analyzeWithSymbolAsContext(this) { getDeclaredMemberScope().getCallableSymbols() .filterIsInstance() - .filter { it.hasJvmFieldAnnotation() || it.hasJvmStaticAnnotation() || it is KtKotlinPropertySymbol && it.isConst } + .applyIf(isInterface) { + filter { it.hasJvmFieldAnnotation() || it.isConst } + } .mapTo(result) { FirLightFieldForPropertySymbol( propertySymbol = it, @@ -109,7 +112,7 @@ internal abstract class FirLightClassForClassOrObjectSymbol( containingClass = this@FirLightClassForClassOrObjectSymbol, lightMemberOrigin = null, isTopLevel = false, - forceStatic = !it.hasJvmStaticAnnotation(), + forceStatic = true, takePropertyVisibility = true ) } @@ -117,6 +120,9 @@ internal abstract class FirLightClassForClassOrObjectSymbol( } } + private val KtPropertySymbol.isConst: Boolean + get() = (this as? KtKotlinPropertySymbol)?.isConst == true + private val _containingFile: PsiFile? by lazyPub { val kotlinOrigin = kotlinOrigin ?: return@lazyPub null diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightClassForSymbol.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightClassForSymbol.kt index dc4f70613f5..b3766fc59cf 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightClassForSymbol.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/FirLightClassForSymbol.kt @@ -246,7 +246,10 @@ internal open class FirLightClassForSymbol( val propertySymbols = classOrObjectSymbol.getDeclaredMemberScope().getCallableSymbols() .filterIsInstance() .applyIf(classOrObjectSymbol.isCompanionObject) { - filterNot { it.hasJvmFieldAnnotation() || it is KtKotlinPropertySymbol && it.isConst } + // All fields for companion object of classes are generated to the containing class + // For interfaces, only @JvmField-annotated properties are generated to the containing class + // Probably, the same should work for const vals but it doesn't at the moment (see KT-28294) + filter { containingClass?.isInterface == true && !it.hasJvmFieldAnnotation() } } val propertyGroups = propertySymbols.groupBy { it.isFromPrimaryConstructor } diff --git a/compiler/testData/asJava/lightClasses/compilationErrors/TraitClassObjectField.fir.java b/compiler/testData/asJava/lightClasses/compilationErrors/TraitClassObjectField.fir.java index 070e7d42a28..0a3b24f1877 100644 --- a/compiler/testData/asJava/lightClasses/compilationErrors/TraitClassObjectField.fir.java +++ b/compiler/testData/asJava/lightClasses/compilationErrors/TraitClassObjectField.fir.java @@ -7,6 +7,9 @@ public abstract interface TraitClassObjectField /* TraitClassObjectField*/ { public static final class Companion /* TraitClassObjectField.Companion*/ { + @org.jetbrains.annotations.Nullable() + private final java.lang.String x = "" /* initializer type: java.lang.String */; + @org.jetbrains.annotations.Nullable() private final java.lang.String y; diff --git a/compiler/testData/asJava/lightClasses/ideRegression/ImplementingMutableSet.fir.java b/compiler/testData/asJava/lightClasses/ideRegression/ImplementingMutableSet.fir.java index f708ef4ee6c..1a57b9fee42 100644 --- a/compiler/testData/asJava/lightClasses/ideRegression/ImplementingMutableSet.fir.java +++ b/compiler/testData/asJava/lightClasses/ideRegression/ImplementingMutableSet.fir.java @@ -7,6 +7,8 @@ public final class SmartSet /* SmartSet*/ extends kotlin.collections.Abstrac private int size; + private static final int ARRAY_THRESHOLD; + @kotlin.jvm.JvmStatic() @org.jetbrains.annotations.NotNull() public static final SmartSet create();// create() @@ -30,8 +32,6 @@ public final class SmartSet /* SmartSet*/ extends kotlin.collections.Abstrac public static final class Companion /* SmartSet.Companion*/ { - private final int ARRAY_THRESHOLD; - @kotlin.jvm.JvmStatic() @org.jetbrains.annotations.NotNull() public final SmartSet create();// create() @@ -42,4 +42,4 @@ public static final class Companion /* SmartSet.Companion*/ { private Companion();// .ctor() -}} +}} \ No newline at end of file diff --git a/compiler/testData/asJava/lightClasses/nullabilityAnnotations/ClassObjectField.fir.java b/compiler/testData/asJava/lightClasses/nullabilityAnnotations/ClassObjectField.fir.java index 65858f2a14f..defa422abbb 100644 --- a/compiler/testData/asJava/lightClasses/nullabilityAnnotations/ClassObjectField.fir.java +++ b/compiler/testData/asJava/lightClasses/nullabilityAnnotations/ClassObjectField.fir.java @@ -2,16 +2,16 @@ public final class ClassObjectField /* ClassObjectField*/ { @org.jetbrains.annotations.NotNull() public static final ClassObjectField.Companion Companion; + @org.jetbrains.annotations.Nullable() + private static final java.lang.String y; + + @org.jetbrains.annotations.Nullable() + public static final java.lang.String x; + public ClassObjectField();// .ctor() public static final class Companion /* ClassObjectField.Companion*/ { - @org.jetbrains.annotations.Nullable() - private final java.lang.String x; - - @org.jetbrains.annotations.Nullable() - private final java.lang.String y; - @org.jetbrains.annotations.Nullable() public final java.lang.String getX();// getX() diff --git a/compiler/testData/asJava/ultraLightClasses/jvmField.fir.java b/compiler/testData/asJava/ultraLightClasses/jvmField.fir.java index 898c6605188..972cbb75298 100644 --- a/compiler/testData/asJava/ultraLightClasses/jvmField.fir.java +++ b/compiler/testData/asJava/ultraLightClasses/jvmField.fir.java @@ -29,6 +29,10 @@ public static final class Companion /* A.Companion*/ { } public abstract interface B /* B*/ { + @kotlin.jvm.JvmField() + @org.jetbrains.annotations.NotNull() + public static final java.util.Collection a; + @org.jetbrains.annotations.NotNull() public static final B.Companion Companion; diff --git a/compiler/testData/asJava/ultraLightClasses/objects.fir.java b/compiler/testData/asJava/ultraLightClasses/objects.fir.java index a9c95af745c..9ef5c97251a 100644 --- a/compiler/testData/asJava/ultraLightClasses/objects.fir.java +++ b/compiler/testData/asJava/ultraLightClasses/objects.fir.java @@ -1,11 +1,17 @@ public final class C /* C*/ { @kotlin.jvm.JvmStatic() @org.jetbrains.annotations.NotNull() - public java.lang.String x; + public static java.lang.String x; @org.jetbrains.annotations.NotNull() public static final C.Companion Companion; + @org.jetbrains.annotations.NotNull() + public static java.lang.String c1; + + @org.jetbrains.annotations.NotNull() + public static java.lang.String c; + @kotlin.jvm.JvmStatic() public static final void foo();// foo() @@ -20,10 +26,6 @@ public final class C /* C*/ { } public static final class Companion /* C.Companion*/ { - @kotlin.jvm.JvmStatic() - @org.jetbrains.annotations.NotNull() - private java.lang.String x; - @kotlin.jvm.JvmStatic() @org.jetbrains.annotations.NotNull() public final java.lang.String getC(I);// getC(I) diff --git a/compiler/testData/asJava/ultraLightClasses/properties.fir.java b/compiler/testData/asJava/ultraLightClasses/properties.fir.java index 1d984dc97ca..700030ab6df 100644 --- a/compiler/testData/asJava/ultraLightClasses/properties.fir.java +++ b/compiler/testData/asJava/ultraLightClasses/properties.fir.java @@ -80,6 +80,12 @@ public final class Foo /* Foo*/ { public java.lang.String internalVarPrivateSet; + public static final int f1; + + public static final int prop3; + + public static int prop7; + @org.jetbrains.annotations.NotNull() protected final java.lang.String getProtectedLateinitVar();// getProtectedLateinitVar() @@ -191,12 +197,6 @@ public final class Foo /* Foo*/ { } public static final class Companion /* Foo.Companion*/ { - private final int f1; - - private final int prop3; - - private int prop7; - private Companion();// .ctor() public final int getF1();// getF1()