diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightAccessorMethod.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightAccessorMethod.kt index 16c004a6c95..f00c475c8f9 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightAccessorMethod.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightAccessorMethod.kt @@ -165,30 +165,33 @@ internal class SymbolLightAccessorMethod private constructor( annotationsFromProperty + annotationsFromAccessor } - private fun computeModifiers(modifier: String): Map? { - return when (modifier) { - in LazyModifiersBox.VISIBILITY_MODIFIERS -> LazyModifiersBox.computeVisibilityForMember(ktModule, propertyAccessorSymbolPointer) + private fun computeModifiers(modifier: String): Map? = when (modifier) { + in LazyModifiersBox.VISIBILITY_MODIFIERS -> LazyModifiersBox.computeVisibilityForMember(ktModule, propertyAccessorSymbolPointer) - in LazyModifiersBox.MODALITY_MODIFIERS -> { - if (containingClass.isInterface) { - return LazyModifiersBox.MODALITY_MODIFIERS_MAP.with(PsiModifier.ABSTRACT) + in LazyModifiersBox.MODALITY_MODIFIERS -> { + val modality = if (containingClass.isInterface) { + PsiModifier.ABSTRACT + } else { + analyzeForLightClasses(ktModule) { + val propertySymbol = propertySymbol() + propertySymbol.computeSimpleModality()?.takeUnless { it.isSuppressedFinalModifier(containingClass, propertySymbol) } } - - LazyModifiersBox.computeSimpleModality(ktModule, containingPropertySymbolPointer) } - PsiModifier.STATIC -> { - val isStatic = if (suppressStatic) { - false - } else { - isTopLevel || isStatic() - } - - mapOf(modifier to isStatic) - } - - else -> null + LazyModifiersBox.MODALITY_MODIFIERS_MAP.with(modality) } + + PsiModifier.STATIC -> { + val isStatic = if (suppressStatic) { + false + } else { + isTopLevel || isStatic() + } + + mapOf(modifier to isStatic) + } + + else -> null } private fun isStatic(): Boolean = analyzeForLightClasses(ktModule) { diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightSimpleMethod.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightSimpleMethod.kt index 85c498f3650..986d866d179 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightSimpleMethod.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightSimpleMethod.kt @@ -93,7 +93,14 @@ internal class SymbolLightSimpleMethod( private fun computeModifiers(modifier: String): Map? = when (modifier) { in LazyModifiersBox.MODALITY_MODIFIERS -> { ifInlineOnly { return modifiersForInlineOnlyCase() } - val modality = if (isTopLevel) PsiModifier.FINAL else withFunctionSymbol { it.computeSimpleModality() } + val modality = if (isTopLevel) { + PsiModifier.FINAL + } else { + withFunctionSymbol { functionSymbol -> + functionSymbol.computeSimpleModality()?.takeUnless { it.isSuppressedFinalModifier(containingClass, functionSymbol) } + } + } + LazyModifiersBox.MODALITY_MODIFIERS_MAP.with(modality) } 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 new file mode 100644 index 00000000000..8c95397ac14 --- /dev/null +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/symbolLightMethodUtils.kt @@ -0,0 +1,17 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.light.classes.symbol.methods + +import com.intellij.psi.PsiModifier +import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin +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 +} diff --git a/compiler/testData/asJava/lightClasses/AnnotatedParameterInEnumConstructor.fir.java b/compiler/testData/asJava/lightClasses/AnnotatedParameterInEnumConstructor.fir.java index b482bf351c4..56f1cb90e37 100644 --- a/compiler/testData/asJava/lightClasses/AnnotatedParameterInEnumConstructor.fir.java +++ b/compiler/testData/asJava/lightClasses/AnnotatedParameterInEnumConstructor.fir.java @@ -2,13 +2,13 @@ public enum AnnotatedParameterInEnumConstructor /* test.AnnotatedParameterInEnum A; @org.jetbrains.annotations.NotNull() - public static final kotlin.enums.EnumEntries getEntries();// getEntries() + public static kotlin.enums.EnumEntries getEntries();// getEntries() @org.jetbrains.annotations.NotNull() - public static final test.AnnotatedParameterInEnumConstructor valueOf(java.lang.String) throws java.lang.IllegalArgumentException, java.lang.NullPointerException;// valueOf(java.lang.String) + public static test.AnnotatedParameterInEnumConstructor valueOf(java.lang.String) throws java.lang.IllegalArgumentException, java.lang.NullPointerException;// valueOf(java.lang.String) @org.jetbrains.annotations.NotNull() - public static final test.AnnotatedParameterInEnumConstructor[] values();// values() + public static test.AnnotatedParameterInEnumConstructor[] values();// values() private AnnotatedParameterInEnumConstructor(@test.Anno(x = "a") java.lang.String, @test.Anno(x = "b") java.lang.String);// .ctor(java.lang.String, java.lang.String) diff --git a/compiler/testData/asJava/lightClasses/DeprecatedEnumEntry.fir.java b/compiler/testData/asJava/lightClasses/DeprecatedEnumEntry.fir.java index cee289585d1..79decf63bdd 100644 --- a/compiler/testData/asJava/lightClasses/DeprecatedEnumEntry.fir.java +++ b/compiler/testData/asJava/lightClasses/DeprecatedEnumEntry.fir.java @@ -4,13 +4,13 @@ public enum E /* p.E*/ { @kotlin.Deprecated(message = "b") Entry3; @org.jetbrains.annotations.NotNull() - public static final kotlin.enums.EnumEntries getEntries();// getEntries() + public static kotlin.enums.EnumEntries getEntries();// getEntries() @org.jetbrains.annotations.NotNull() - public static final p.E valueOf(java.lang.String) throws java.lang.IllegalArgumentException, java.lang.NullPointerException;// valueOf(java.lang.String) + public static p.E valueOf(java.lang.String) throws java.lang.IllegalArgumentException, java.lang.NullPointerException;// valueOf(java.lang.String) @org.jetbrains.annotations.NotNull() - public static final p.E[] values();// values() + public static p.E[] values();// values() private E();// .ctor() diff --git a/compiler/testData/asJava/lightClasses/EnumClass.fir.java b/compiler/testData/asJava/lightClasses/EnumClass.fir.java index 1be88e0e8c7..a75b02708cd 100644 --- a/compiler/testData/asJava/lightClasses/EnumClass.fir.java +++ b/compiler/testData/asJava/lightClasses/EnumClass.fir.java @@ -2,13 +2,13 @@ public enum MyEnumClass /* one.MyEnumClass*/ { Entry; @org.jetbrains.annotations.NotNull() - public static final kotlin.enums.EnumEntries getEntries();// getEntries() + public static kotlin.enums.EnumEntries getEntries();// getEntries() @org.jetbrains.annotations.NotNull() - public static final one.MyEnumClass valueOf(java.lang.String) throws java.lang.IllegalArgumentException, java.lang.NullPointerException;// valueOf(java.lang.String) + public static one.MyEnumClass valueOf(java.lang.String) throws java.lang.IllegalArgumentException, java.lang.NullPointerException;// valueOf(java.lang.String) @org.jetbrains.annotations.NotNull() - public static final one.MyEnumClass[] values();// values() + public static one.MyEnumClass[] values();// values() private MyEnumClass();// .ctor() diff --git a/compiler/testData/asJava/lightClasses/EnumClassWithEnumEntries.fir.java b/compiler/testData/asJava/lightClasses/EnumClassWithEnumEntries.fir.java index 824a68c08b0..6de553cf51a 100644 --- a/compiler/testData/asJava/lightClasses/EnumClassWithEnumEntries.fir.java +++ b/compiler/testData/asJava/lightClasses/EnumClassWithEnumEntries.fir.java @@ -2,13 +2,13 @@ public enum MyEnumClass /* one.MyEnumClass*/ { Entry; @org.jetbrains.annotations.NotNull() - public static final kotlin.enums.EnumEntries getEntries();// getEntries() + public static kotlin.enums.EnumEntries getEntries();// getEntries() @org.jetbrains.annotations.NotNull() - public static final one.MyEnumClass valueOf(java.lang.String) throws java.lang.IllegalArgumentException, java.lang.NullPointerException;// valueOf(java.lang.String) + public static one.MyEnumClass valueOf(java.lang.String) throws java.lang.IllegalArgumentException, java.lang.NullPointerException;// valueOf(java.lang.String) @org.jetbrains.annotations.NotNull() - public static final one.MyEnumClass[] values();// values() + public static one.MyEnumClass[] values();// values() private MyEnumClass();// .ctor() diff --git a/compiler/testData/asJava/lightClasses/compilationErrors/EnumNameOverride.fir.java b/compiler/testData/asJava/lightClasses/compilationErrors/EnumNameOverride.fir.java index 1554002e949..26d35f6245c 100644 --- a/compiler/testData/asJava/lightClasses/compilationErrors/EnumNameOverride.fir.java +++ b/compiler/testData/asJava/lightClasses/compilationErrors/EnumNameOverride.fir.java @@ -2,13 +2,13 @@ public enum EnumNameOverride /* EnumNameOverride*/ implements Bar { ; @org.jetbrains.annotations.NotNull() - public static final EnumNameOverride valueOf(java.lang.String) throws java.lang.IllegalArgumentException, java.lang.NullPointerException;// valueOf(java.lang.String) + public static EnumNameOverride valueOf(java.lang.String) throws java.lang.IllegalArgumentException, java.lang.NullPointerException;// valueOf(java.lang.String) @org.jetbrains.annotations.NotNull() - public static final EnumNameOverride[] values();// values() + public static EnumNameOverride[] values();// values() @org.jetbrains.annotations.NotNull() - public static final kotlin.enums.EnumEntries getEntries();// getEntries() + public static kotlin.enums.EnumEntries getEntries();// getEntries() private EnumNameOverride();// .ctor()