diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/symbolLightMethodUtils.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/symbolLightMethodUtils.kt index d9bfa2fe196..f5bad6ec691 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/symbolLightMethodUtils.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/symbolLightMethodUtils.kt @@ -13,5 +13,5 @@ import org.jetbrains.kotlin.light.classes.symbol.classes.SymbolLightClassBase context(KtAnalysisSession) internal fun String.isSuppressedFinalModifier(containingClass: SymbolLightClassBase, symbol: KtCallableSymbol): Boolean { - return this == PsiModifier.FINAL && containingClass.isEnum && symbol.origin == KtSymbolOrigin.SOURCE_MEMBER_GENERATED + return this == PsiModifier.FINAL && (containingClass.isEnum && symbol.origin == KtSymbolOrigin.SOURCE_MEMBER_GENERATED || containingClass.isInterface) } diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/modifierLists/SymbolLightMemberModifierList.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/modifierLists/SymbolLightMemberModifierList.kt index 1aace0f7c83..fcac00d1719 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/modifierLists/SymbolLightMemberModifierList.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/modifierLists/SymbolLightMemberModifierList.kt @@ -23,7 +23,7 @@ internal class SymbolLightMemberModifierList>( override fun hasModifierProperty(name: String): Boolean = when { name == PsiModifier.ABSTRACT && isImplementationInInterface() -> false // Pretend this method behaves like a `default` method - name == PsiModifier.DEFAULT && isImplementationInInterface() -> true + name == PsiModifier.DEFAULT && isImplementationInInterface() && !hasModifierProperty(PsiModifier.STATIC) -> true // TODO: FINAL && isPossiblyAffectedByAllOpen else -> super.hasModifierProperty(name) } diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightMethods.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightMethods.kt index ff7ea79038f..f9eb60c4964 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightMethods.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightMethods.kt @@ -39,10 +39,10 @@ private class KtUltraLightMethodModifierList( owner: KtUltraLightMethod, val delegate: PsiMethod, ) : KtUltraLightModifierList(owner, support) { - override fun hasModifierProperty(name: String) = when { + override fun hasModifierProperty(name: String): Boolean = when { name == PsiModifier.ABSTRACT && isImplementationInInterface() -> false // pretend this method behaves like a default method - name == PsiModifier.DEFAULT && isImplementationInInterface() -> true + name == PsiModifier.DEFAULT && isImplementationInInterface() && !hasModifierProperty(PsiModifier.STATIC) -> true name == PsiModifier.FINAL && (owner.containingClass.safeAs()?.isPossiblyAffectedByAllOpen() == true) -> delegate.hasModifierProperty(name) diff --git a/compiler/testData/asJava/lightClasses/lightClassByFqName/JvmStatic.java b/compiler/testData/asJava/lightClasses/lightClassByFqName/JvmStatic.java index 85296b2204e..d076c4392d6 100644 --- a/compiler/testData/asJava/lightClasses/lightClassByFqName/JvmStatic.java +++ b/compiler/testData/asJava/lightClasses/lightClassByFqName/JvmStatic.java @@ -7,6 +7,31 @@ public final class A /* A*/ { public A();// .ctor() + public static abstract interface I /* A.I*/ { + @org.jetbrains.annotations.NotNull() + public static final A.I.Companion Companion; + + @kotlin.jvm.JvmStatic() + public static void h();// h() + + public static final class C /* A.I.C*/ { + @org.jetbrains.annotations.NotNull() + public static final A.I.C INSTANCE; + + @kotlin.jvm.JvmStatic() + public static final void i();// i() + + private C();// .ctor() + } + + public static final class Companion /* A.I.Companion*/ { + @kotlin.jvm.JvmStatic() + public final void h();// h() + + private Companion();// .ctor() + } + } + public static final class B /* A.B*/ { @org.jetbrains.annotations.NotNull() public static final A.B INSTANCE; @@ -23,4 +48,4 @@ public final class A /* A*/ { private Companion();// .ctor() } -} +} \ No newline at end of file diff --git a/compiler/testData/asJava/lightClasses/lightClassByFqName/JvmStatic.kt b/compiler/testData/asJava/lightClasses/lightClassByFqName/JvmStatic.kt index 135651643e1..4466488e20e 100644 --- a/compiler/testData/asJava/lightClasses/lightClassByFqName/JvmStatic.kt +++ b/compiler/testData/asJava/lightClasses/lightClassByFqName/JvmStatic.kt @@ -3,15 +3,21 @@ class A { companion object { - @JvmStatic fun f() { - - } + @JvmStatic fun f() { } } object B { - @JvmStatic - fun g() { + @JvmStatic fun g() { } + } + interface I { + companion object { + @JvmStatic fun h() { } + } + + object C { + @JvmStatic + fun i() { } } } }