@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.asJava.classes.KtUltraLightClass
1515import org.jetbrains.kotlin.asJava.classes.KtUltraLightClassForFacade
1616import org.jetbrains.kotlin.asJava.elements.KtLightMethod
1717import org.jetbrains.kotlin.asJava.elements.KtLightMethodImpl
18+ import org.jetbrains.kotlin.descriptors.Modality
1819import org.jetbrains.kotlin.idea.search.declarationsSearch.forEachOverridingMethod
1920import org.jetbrains.kotlin.name.Name
2021import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOriginKind
@@ -60,20 +61,20 @@ class JvmBlockingBridgePsiAugmentProvider : PsiAugmentProvider() {
6061
6162internal fun PsiExtensibleClass.generateAugmentElements (): List <PsiElement > {
6263 return this .ownMethods.asSequence()
63- .filter { it.isCompanionedWithBlockingBrideInThisOrSuper () }
64+ .filter { it.canHaveBridgeFunctions () }
6465 .filterIsInstance<KtLightMethod >()
6566 .map { it.generateLightMethod() }
6667 .toList()
6768}
6869
69- internal fun PsiMethod.isCompanionedWithBlockingBrideInThisOrSuper (): Boolean {
70+ internal fun PsiMethod.canHaveBridgeFunctions (): Boolean {
7071 return if (isSuspend()
7172 && Name .isValidIdentifier(this .name)
7273 && this .hasAnnotation(JvmBlockingBridge ::class .qualifiedName!! )
7374 ) {
7475 true
7576 } else {
76- return findOverrides()?.any { it.isCompanionedWithBlockingBrideInThisOrSuper () } == true
77+ return findOverrides()?.any { it.canHaveBridgeFunctions () } == true
7778 }
7879}
7980
@@ -138,14 +139,24 @@ internal fun KtLightMethod.generateLightMethod(): PsiMethod {
138139 for (it in originMethod.parameterList.parameters.dropLast(1 )) {
139140 addParameter(it)
140141 }
141- if (isJvmStatic()) {
142+
143+ if (isJvmStatic() || originMethod.parent is KtUltraLightClassForFacade ) {
142144 addModifier(PsiModifier .STATIC )
143145 }
144146
145- PsiModifier . MODIFIERS
147+ VISIBILITIES_MODIFIERS
146148 .filter { originMethod.hasModifierProperty(it) }
147149 .forEach { addModifier(it) }
148150
151+ addModifier(
152+ if (containingClass?.isInterface == true ) {
153+ PsiModifier .OPEN
154+ } else when (containingClass?.modality) {
155+ Modality .OPEN , Modality .ABSTRACT , Modality .SEALED -> PsiModifier .OPEN
156+ else -> PsiModifier .FINAL
157+ }
158+ )
159+
149160 for (typeParameter in originMethod.typeParameters) {
150161 addTypeParameter(typeParameter)
151162 }
@@ -196,4 +207,26 @@ class BlockingBridgeStubMethod(manager: PsiManager, language: Language, name: St
196207 return _body ? : super .getBody()
197208 }
198209
199- }
210+ }
211+
212+ internal val VISIBILITIES_MODIFIERS = arrayOf(
213+ PsiModifier .PUBLIC ,
214+ PsiModifier .PACKAGE_LOCAL ,
215+ PsiModifier .PRIVATE ,
216+ PsiModifier .PROTECTED ,
217+ )
218+
219+ internal val PsiModifierListOwner .modality: Modality
220+ get() {
221+ if (this is PsiMember && this .containingClass?.isInterface == true ) {
222+ return Modality .OPEN //
223+ }
224+
225+ return when {
226+ this .hasModifierProperty(PsiModifier .OPEN ) -> Modality .OPEN
227+ this .hasModifierProperty(PsiModifier .FINAL ) -> Modality .FINAL
228+ this .hasModifierProperty(PsiModifier .ABSTRACT ) -> Modality .ABSTRACT
229+ this .hasModifierProperty(" sealed" ) -> Modality .ABSTRACT
230+ else -> Modality .FINAL
231+ }
232+ }
0 commit comments