diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt index 8d185fe2550..543e4b97bc1 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt @@ -11,8 +11,6 @@ import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirCallableMember import org.jetbrains.kotlin.fir.declarations.FirConstructor import org.jetbrains.kotlin.fir.declarations.FirRegularClass -import org.jetbrains.kotlin.fir.declarations.impl.FirModifiableClass -import org.jetbrains.kotlin.fir.expressions.FirCall import org.jetbrains.kotlin.fir.java.declarations.* import org.jetbrains.kotlin.fir.resolve.AbstractFirSymbolProvider import org.jetbrains.kotlin.fir.resolve.constructType @@ -91,7 +89,6 @@ class JavaSymbolProvider( // TODO: may be we can process fields & methods later. // However, they should be built up to override resolve stage for (javaField in javaClass.fields) { - if (javaField.isStatic) continue // TODO: statics val fieldName = javaField.name val fieldId = CallableId(classId.packageFqName, classId.relativeClassName, fieldName) val fieldSymbol = FirFieldSymbol(fieldId) @@ -100,14 +97,14 @@ class JavaSymbolProvider( session, fieldSymbol, fieldName, javaField.visibility, javaField.modality, returnTypeRef = returnType.toFirJavaTypeRef(session), - isVar = !javaField.isFinal + isVar = !javaField.isFinal, + isStatic = javaField.isStatic ).apply { addAnnotationsFrom(javaField) } declarations += firJavaField } for (javaMethod in javaClass.methods) { - if (javaMethod.isStatic) continue // TODO: statics val methodName = javaMethod.name val methodId = CallableId(classId.packageFqName, classId.relativeClassName, methodName) val methodSymbol = FirFunctionSymbol(methodId) @@ -115,7 +112,8 @@ class JavaSymbolProvider( val firJavaMethod = FirJavaMethod( session, methodSymbol, methodName, javaMethod.visibility, javaMethod.modality, - returnTypeRef = returnType.toFirJavaTypeRef(session) + returnTypeRef = returnType.toFirJavaTypeRef(session), + isStatic = javaMethod.isStatic ).apply { for (typeParameter in javaMethod.typeParameters) { typeParameters += createTypeParameterSymbol(session, typeParameter.name).fir diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaField.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaField.kt index 4fd6de5001e..2fdbf24c55e 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaField.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaField.kt @@ -22,7 +22,8 @@ class FirJavaField( visibility: Visibility, modality: Modality?, returnTypeRef: FirJavaTypeRef, - override val isVar: Boolean + override val isVar: Boolean, + isStatic: Boolean ) : FirAbstractCallableMember( session, psi = null, symbol = symbol, name = name, visibility = visibility, modality = modality, @@ -34,4 +35,8 @@ class FirJavaField( override val initializer: FirExpression? get() = null + + init { + status.isStatic = isStatic + } } \ No newline at end of file diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaMethod.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaMethod.kt index 0bb824ebfe4..86d592db6ac 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaMethod.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaMethod.kt @@ -20,7 +20,8 @@ class FirJavaMethod( name: Name, visibility: Visibility, modality: Modality?, - returnTypeRef: FirJavaTypeRef + returnTypeRef: FirJavaTypeRef, + isStatic: Boolean ) : FirMemberFunctionImpl( session, null, symbol, name, visibility, modality, @@ -29,4 +30,8 @@ class FirJavaMethod( isOperator = true, // All Java methods with name that allows to use it in operator form are considered operators isInfix = false, isInline = false, isTailRec = false, isExternal = false, isSuspend = false, receiverTypeRef = null, returnTypeRef = returnTypeRef -) \ No newline at end of file +) { + init { + status.isStatic = isStatic + } +} \ No newline at end of file diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassEnhancementScope.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassEnhancementScope.kt index 06d29838e59..3941edb0d05 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassEnhancementScope.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassEnhancementScope.kt @@ -94,6 +94,7 @@ class JavaClassEnhancementScope( delegate = null ).apply { annotations += firField.annotations + status.isStatic = firField.isStatic } } return symbol diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt index 7047a1d26b0..fc1050b08e8 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt @@ -148,8 +148,13 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() { if (memberDeclaration.isActual) { print("actual ") } - if (memberDeclaration is FirCallableMember && memberDeclaration.isOverride) { - print("override ") + if (memberDeclaration is FirCallableMember) { + if (memberDeclaration.isOverride) { + print("override ") + } + if (memberDeclaration.isStatic) { + print("static ") + } } if (memberDeclaration is FirRegularClass) { if (memberDeclaration.isInner) { diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirCallableMember.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirCallableMember.kt index 491abd87f77..2dccd9c806c 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirCallableMember.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirCallableMember.kt @@ -16,6 +16,8 @@ interface FirCallableMember : FirTypedDeclaration, FirSymbolOwner { val isOverride: Boolean get() = status.isOverride + val isStatic: Boolean get() = status.isStatic + val receiverTypeRef: FirTypeRef? override fun accept(visitor: FirVisitor, data: D): R = diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirDeclarationStatus.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirDeclarationStatus.kt index baccbe0b338..57f892828b2 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirDeclarationStatus.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirDeclarationStatus.kt @@ -46,6 +46,8 @@ interface FirDeclarationStatus : FirElement { val isSuspend: Boolean + val isStatic: Boolean + override val psi: PsiElement? get() = null diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirDeclarationStatusImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirDeclarationStatusImpl.kt index b37425bbf90..38280b54d3a 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirDeclarationStatusImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirDeclarationStatusImpl.kt @@ -112,6 +112,12 @@ open class FirDeclarationStatusImpl( this[SUSPEND] = value } + override var isStatic: Boolean + get() = this[STATIC] + set(value) { + this[STATIC] = value + } + private enum class Modifier(val mask: Int) { EXPECT(0x1), ACTUAL(0x2), @@ -126,7 +132,8 @@ open class FirDeclarationStatusImpl( INNER(0x400), COMPANION(0x800), DATA(0x1000), - SUSPEND(0x2000) + SUSPEND(0x2000), + STATIC(0x4000) } fun resolved(visibility: Visibility, modality: Modality): FirDeclarationStatus { diff --git a/compiler/testData/loadJava/compiledJava/PrivateMembers.fir.txt b/compiler/testData/loadJava/compiledJava/PrivateMembers.fir.txt index 931bc31d136..a0e498f503b 100644 --- a/compiler/testData/loadJava/compiledJava/PrivateMembers.fir.txt +++ b/compiler/testData/loadJava/compiledJava/PrivateMembers.fir.txt @@ -3,8 +3,14 @@ public open class PrivateMembers : R|java/lang/Object| { private get(): R|kotlin/Int| private set(value: R|kotlin/Int|): kotlin/Unit + private open static property staticField(var): R|kotlin/Int| + private get(): R|kotlin/Int| + private set(value: R|kotlin/Int|): kotlin/Unit + private open operator function method(): R|kotlin/Unit| + private open static operator function staticMethod(): R|kotlin/Unit| + private final function PrivateMembers(): R|test/PrivateMembers| } diff --git a/compiler/testData/loadJava/compiledJava/annotations/AnnotatedEnumEntry.fir.txt b/compiler/testData/loadJava/compiledJava/annotations/AnnotatedEnumEntry.fir.txt index db75ab0704a..868d4c860f8 100644 --- a/compiler/testData/loadJava/compiledJava/annotations/AnnotatedEnumEntry.fir.txt +++ b/compiler/testData/loadJava/compiledJava/annotations/AnnotatedEnumEntry.fir.txt @@ -1,2 +1,11 @@ public final enum class AnnotatedEnumEntry : R|java/lang/Enum| { + @R|test/AnnotatedEnumEntry.Anno|(String(a)) public final static property E1(val): R|ft|! + public get(): R|ft|! + + @R|test/AnnotatedEnumEntry.Anno|(String(b)) @R|test/AnnotatedEnumEntry.Anno2|() public final static property E2(val): R|ft|! + public get(): R|ft|! + + public final static property E3(val): R|ft|! + public get(): R|ft|! + } diff --git a/compiler/testData/loadJava/compiledJava/annotations/AnnotatedField.fir.txt b/compiler/testData/loadJava/compiledJava/annotations/AnnotatedField.fir.txt index 98b4e03eb80..17d6387c19e 100644 --- a/compiler/testData/loadJava/compiledJava/annotations/AnnotatedField.fir.txt +++ b/compiler/testData/loadJava/compiledJava/annotations/AnnotatedField.fir.txt @@ -1,4 +1,7 @@ public open class AnnotatedField : R|java/lang/Object| { + @R|test/AnnotatedField.Anno|(String(static)) public final static property x(val): R|kotlin/Int| + public get(): R|kotlin/Int| + @R|test/AnnotatedField.Anno|(String(member)) public final property y(val): R|kotlin/Int| public get(): R|kotlin/Int| diff --git a/compiler/testData/loadJava/compiledJava/annotations/EnumArgumentWithCustomToString.fir.txt b/compiler/testData/loadJava/compiledJava/annotations/EnumArgumentWithCustomToString.fir.txt index 1d9c7c23c38..d94fa225a8e 100644 --- a/compiler/testData/loadJava/compiledJava/annotations/EnumArgumentWithCustomToString.fir.txt +++ b/compiler/testData/loadJava/compiledJava/annotations/EnumArgumentWithCustomToString.fir.txt @@ -1,4 +1,4 @@ public open class EnumArgumentWithCustomToString : R|java/lang/Object| { - @R|test/EnumArgumentWithCustomToString.EnumAnno|(#()) @R|test/EnumArgumentWithCustomToString.EnumArrayAnno|((#(), #())) public/*package*/ open operator function annotated(): R|kotlin/Unit| + @R|test/EnumArgumentWithCustomToString.EnumAnno|(R|test/EnumArgumentWithCustomToString.E.CAKE|()) @R|test/EnumArgumentWithCustomToString.EnumArrayAnno|((R|test/EnumArgumentWithCustomToString.E.CAKE|(), R|test/EnumArgumentWithCustomToString.E.CAKE|())) public/*package*/ open operator function annotated(): R|kotlin/Unit| } diff --git a/compiler/testData/loadJava/compiledJava/annotations/EnumConstructorParameter.fir.txt b/compiler/testData/loadJava/compiledJava/annotations/EnumConstructorParameter.fir.txt index 7c700b99d34..ddae0ded99c 100644 --- a/compiler/testData/loadJava/compiledJava/annotations/EnumConstructorParameter.fir.txt +++ b/compiler/testData/loadJava/compiledJava/annotations/EnumConstructorParameter.fir.txt @@ -1,4 +1,7 @@ public final enum class EnumConstructorParameter : R|java/lang/Enum| { + public final static property INSTANCE(val): R|ft|! + public get(): R|ft|! + private final function EnumConstructorParameter(@R|test/EnumConstructorParameter.Anno|(String(string)) s: R|ft|!): R|test/EnumConstructorParameter| private final function EnumConstructorParameter(x: R|kotlin/Int|): R|test/EnumConstructorParameter| diff --git a/compiler/testData/loadJava/compiledJava/annotations/NestedEnumArgument.fir.txt b/compiler/testData/loadJava/compiledJava/annotations/NestedEnumArgument.fir.txt index ec04dd46178..80571c569e0 100644 --- a/compiler/testData/loadJava/compiledJava/annotations/NestedEnumArgument.fir.txt +++ b/compiler/testData/loadJava/compiledJava/annotations/NestedEnumArgument.fir.txt @@ -1,4 +1,4 @@ public open class NestedEnumArgument : R|java/lang/Object| { - @R|test/NestedEnumArgument.Anno|(#()) public/*package*/ open operator function foo(): R|kotlin/Unit| + @R|test/NestedEnumArgument.Anno|(R|test/NestedEnumArgument.E.FIRST|()) public/*package*/ open operator function foo(): R|kotlin/Unit| } diff --git a/compiler/testData/loadJava/compiledJava/annotations/StringConstantInParam.fir.txt b/compiler/testData/loadJava/compiledJava/annotations/StringConstantInParam.fir.txt index 0a0791dc419..16d6610dfeb 100644 --- a/compiler/testData/loadJava/compiledJava/annotations/StringConstantInParam.fir.txt +++ b/compiler/testData/loadJava/compiledJava/annotations/StringConstantInParam.fir.txt @@ -1,2 +1,5 @@ public abstract interface StringConstantInParam : R|java/lang/Object| { + public final static property HEL(val): R|ft|! + public get(): R|ft|! + } diff --git a/compiler/testData/loadJava/compiledJava/enum/EnumMembers.fir.txt b/compiler/testData/loadJava/compiledJava/enum/EnumMembers.fir.txt index 0272b05bca5..24ed9c8f925 100644 --- a/compiler/testData/loadJava/compiledJava/enum/EnumMembers.fir.txt +++ b/compiler/testData/loadJava/compiledJava/enum/EnumMembers.fir.txt @@ -1,4 +1,10 @@ public final enum class EnumMembers : R|java/lang/Enum| { + public final static property FIRST(val): R|ft|! + public get(): R|ft|! + + public final static property SECOND(val): R|ft|! + public get(): R|ft|! + public final property isFirst(val): R|kotlin/Boolean| public get(): R|kotlin/Boolean| diff --git a/compiler/testData/loadJava/compiledJava/enum/EnumWithSpecializedEntry.fir.txt b/compiler/testData/loadJava/compiledJava/enum/EnumWithSpecializedEntry.fir.txt index 93b3d3a3b85..c89cfb2bac0 100644 --- a/compiler/testData/loadJava/compiledJava/enum/EnumWithSpecializedEntry.fir.txt +++ b/compiler/testData/loadJava/compiledJava/enum/EnumWithSpecializedEntry.fir.txt @@ -1,2 +1,8 @@ public open enum class EnumWithSpecializedEntry : R|java/lang/Enum| { + public final static property E1(val): R|ft|! + public get(): R|ft|! + + public final static property E2(val): R|ft|! + public get(): R|ft|! + } diff --git a/compiler/testData/loadJava/compiledJava/enum/JavaEnum.fir.txt b/compiler/testData/loadJava/compiledJava/enum/JavaEnum.fir.txt index e13e27f4dac..39dacafe3c5 100644 --- a/compiler/testData/loadJava/compiledJava/enum/JavaEnum.fir.txt +++ b/compiler/testData/loadJava/compiledJava/enum/JavaEnum.fir.txt @@ -1,2 +1,8 @@ public final enum class JavaEnum : R|java/lang/Enum| { + public final static property ENTRY(val): R|ft|! + public get(): R|ft|! + + public final static property ANOTHER(val): R|ft|! + public get(): R|ft|! + } diff --git a/compiler/testData/loadJava/compiledJava/sam/adapters/Basic.fir.txt b/compiler/testData/loadJava/compiledJava/sam/adapters/Basic.fir.txt index b0a75992fcf..48d598471fd 100644 --- a/compiler/testData/loadJava/compiledJava/sam/adapters/Basic.fir.txt +++ b/compiler/testData/loadJava/compiledJava/sam/adapters/Basic.fir.txt @@ -1,4 +1,6 @@ public open class Basic : R|java/lang/Object| { public open operator function foo(r: R|ft|!): R|kotlin/Unit| + public open static operator function bar(r: R|ft|!): R|kotlin/Unit| + } diff --git a/compiler/testData/loadJava/compiledJava/sam/adapters/SeveralSamParameters.fir.txt b/compiler/testData/loadJava/compiledJava/sam/adapters/SeveralSamParameters.fir.txt index 22e1cbc704b..9ef7f3255d3 100644 --- a/compiler/testData/loadJava/compiledJava/sam/adapters/SeveralSamParameters.fir.txt +++ b/compiler/testData/loadJava/compiledJava/sam/adapters/SeveralSamParameters.fir.txt @@ -1,2 +1,4 @@ public open class SeveralSamParameters : R|java/lang/Object| { + public open static operator function findMaxAndInvokeCallback(comparator: R|ft>, java/util/Comparator>?>|!, a: R|ft|!, b: R|ft|!, afterRunnable: R|ft|!): R|ft|! + } diff --git a/compiler/testData/loadJava/compiledJava/sam/adapters/TypeParameterOfMethod.fir.txt b/compiler/testData/loadJava/compiledJava/sam/adapters/TypeParameterOfMethod.fir.txt index 3aab61e5335..87d29d9af2e 100644 --- a/compiler/testData/loadJava/compiledJava/sam/adapters/TypeParameterOfMethod.fir.txt +++ b/compiler/testData/loadJava/compiledJava/sam/adapters/TypeParameterOfMethod.fir.txt @@ -1,2 +1,8 @@ public open class TypeParameterOfMethod : R|java/lang/Object| { + public open static operator function max(comparator: R|ft>, java/util/Comparator>?>|!, value1: R|ft|!, value2: R|ft|!): R|ft|! + + public open static operator function max2(comparator: R|ft>, java/util/Comparator>?>|!, value1: R|ft|!, value2: R|ft|!): R|ft|! + + public open static operator function method(a: R|ft>, java/util/Comparator>?>|!, b: R|ft|!): R|kotlin/Unit| + } diff --git a/compiler/testData/loadJava/compiledJava/static/Enum.fir.txt b/compiler/testData/loadJava/compiledJava/static/Enum.fir.txt index 7a5869031b2..e313c7c5552 100644 --- a/compiler/testData/loadJava/compiledJava/static/Enum.fir.txt +++ b/compiler/testData/loadJava/compiledJava/static/Enum.fir.txt @@ -1,2 +1,11 @@ public final enum class Enum : R|java/lang/Enum| { + public final static property A(val): R|ft|! + public get(): R|ft|! + + public final static property B(val): R|ft|! + public get(): R|ft|! + + public final static property C(val): R|ft|! + public get(): R|ft|! + } diff --git a/compiler/testData/loadJava/compiledJava/static/Simple.fir.txt b/compiler/testData/loadJava/compiledJava/static/Simple.fir.txt index 8eba47f0b44..cdd0b75ad25 100644 --- a/compiler/testData/loadJava/compiledJava/static/Simple.fir.txt +++ b/compiler/testData/loadJava/compiledJava/static/Simple.fir.txt @@ -1,4 +1,6 @@ public open class Simple : R|java/lang/Object| { + public open static operator function bar(): R|kotlin/Unit| + public open operator function foo(): R|kotlin/Unit| } diff --git a/compiler/testData/loadJava/compiledJava/static/StaticFinal.fir.txt b/compiler/testData/loadJava/compiledJava/static/StaticFinal.fir.txt index 2f511b0f65d..a204e82720d 100644 --- a/compiler/testData/loadJava/compiledJava/static/StaticFinal.fir.txt +++ b/compiler/testData/loadJava/compiledJava/static/StaticFinal.fir.txt @@ -1,2 +1,20 @@ public open class StaticFinal : R|java/lang/Object| { + public final static property publicNonNull(val): R|ft|! + public get(): R|ft|! + + public final static property publicNull(val): R|ft|! + public get(): R|ft|! + + public/*package*/ final static property packageNonNull(val): R|ft|! + public/*package*/ get(): R|ft|! + + public/*package*/ final static property packageNull(val): R|ft|! + public/*package*/ get(): R|ft|! + + private final static property privateNonNull(val): R|ft|! + private get(): R|ft|! + + private final static property privateNull(val): R|ft|! + private get(): R|ft|! + } diff --git a/compiler/testData/loadJava/compiledJava/static/StaticMembersInEnum.fir.txt b/compiler/testData/loadJava/compiledJava/static/StaticMembersInEnum.fir.txt index b9e37a3f520..9c70f2a51c1 100644 --- a/compiler/testData/loadJava/compiledJava/static/StaticMembersInEnum.fir.txt +++ b/compiler/testData/loadJava/compiledJava/static/StaticMembersInEnum.fir.txt @@ -1,2 +1,18 @@ public final enum class StaticMembersInEnum : R|java/lang/Enum| { + public final static property ENTRY(val): R|ft|! + public get(): R|ft|! + + public open static property STATIC_FIELD(var): R|kotlin/Int| + public get(): R|kotlin/Int| + public set(value: R|kotlin/Int|): kotlin/Unit + + public final static property CONSTANT(val): R|ft|! + public get(): R|ft|! + + public open static operator function foo(): R|kotlin/Unit| + + public open static operator function values(x: R|kotlin/Int|): R|kotlin/Unit| + + public open static operator function valueOf(x: R|kotlin/Int|): R|kotlin/Unit| + }