diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/FirLightFieldEnumEntry.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/FirLightFieldEnumEntry.kt index ca085daea67..f3038eeba99 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/FirLightFieldEnumEntry.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/FirLightFieldEnumEntry.kt @@ -22,7 +22,7 @@ internal class FirLightFieldForEnumEntry( ) : FirLightField(containingClass, lightMemberOrigin), PsiEnumConstant { private val _modifierList by lazyPub { - FirLightClassModifierList( + FirLightMemberModifierList( containingDeclaration = this@FirLightFieldForEnumEntry, modifiers = setOf(PsiModifier.STATIC, PsiModifier.FINAL, PsiModifier.PUBLIC), annotations = emptyList() diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/FirLightFieldForObjectSymbol.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/FirLightFieldForObjectSymbol.kt index 171cf768fa7..e98e4902144 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/FirLightFieldForObjectSymbol.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/FirLightFieldForObjectSymbol.kt @@ -27,7 +27,7 @@ internal class FirLightFieldForObjectSymbol( private val _modifierList: PsiModifierList by lazyPub { val modifiers = setOf(objectSymbol.toPsiVisibilityForMember(isTopLevel = false), PsiModifier.STATIC, PsiModifier.FINAL) val notNullAnnotation = FirLightSimpleAnnotation("org.jetbrains.annotations.NotNull", this) - FirLightClassModifierList(this, modifiers, listOf(notNullAnnotation)) + FirLightMemberModifierList(this, modifiers, listOf(notNullAnnotation)) } private val _isDeprecated: Boolean by lazyPub { diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/FirLightFieldForPropertySymbol.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/FirLightFieldForPropertySymbol.kt index 5efad7565e2..58fc96c1b63 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/FirLightFieldForPropertySymbol.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/fields/FirLightFieldForPropertySymbol.kt @@ -92,7 +92,7 @@ internal class FirLightFieldForPropertySymbol( annotationUseSiteTarget = AnnotationUseSiteTarget.FIELD, ) - FirLightClassModifierList(this, modifiers, annotations) + FirLightMemberModifierList(this, modifiers, annotations) } override fun getModifierList(): PsiModifierList = _modifierList diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/FirLightAccessorMethodForSymbol.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/FirLightAccessorMethodForSymbol.kt index f830c2f311d..aae8b269787 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/FirLightAccessorMethodForSymbol.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/FirLightAccessorMethodForSymbol.kt @@ -131,7 +131,7 @@ internal class FirLightAccessorMethodForSymbol( private val _modifierList: PsiModifierList by lazyPub { val modifiers = computeModifiers() val annotations = computeAnnotations(modifiers.contains(PsiModifier.PRIVATE)) - FirLightClassModifierList(this, modifiers, annotations) + FirLightMemberModifierList(this, modifiers, annotations) } override fun getModifierList(): PsiModifierList = _modifierList diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/FirLightConstructorForSymbol.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/FirLightConstructorForSymbol.kt index 92ef6c08e93..f6a8b6d68e0 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/FirLightConstructorForSymbol.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/FirLightConstructorForSymbol.kt @@ -47,7 +47,7 @@ internal class FirLightConstructorForSymbol( } private val _modifierList: PsiModifierList by lazyPub { - FirLightClassModifierList(this, _modifiers, _annotations) + FirLightMemberModifierList(this, _modifiers, _annotations) } override fun getModifierList(): PsiModifierList = _modifierList @@ -63,4 +63,4 @@ internal class FirLightConstructorForSymbol( override fun hashCode(): Int = kotlinOrigin.hashCode() override fun isValid(): Boolean = super.isValid() && constructorSymbol.isValid() -} \ No newline at end of file +} diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/FirLightSimpleMethodForSymbol.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/FirLightSimpleMethodForSymbol.kt index 878f850abab..132e443cc5e 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/FirLightSimpleMethodForSymbol.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/FirLightSimpleMethodForSymbol.kt @@ -115,7 +115,7 @@ internal class FirLightSimpleMethodForSymbol( private val _modifierList: PsiModifierList by lazyPub { val modifiers = computeModifiers() val annotations = computeAnnotations(modifiers.contains(PsiModifier.PRIVATE)) - FirLightClassModifierList(this, modifiers, annotations) + FirLightMemberModifierList(this, modifiers, annotations) } override fun getModifierList(): PsiModifierList = _modifierList diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/modifierLists/FirLightMemberModifierList.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/modifierLists/FirLightMemberModifierList.kt new file mode 100644 index 00000000000..5612e909735 --- /dev/null +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/modifierLists/FirLightMemberModifierList.kt @@ -0,0 +1,49 @@ +/* + * Copyright 2010-2021 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 + +import com.intellij.psi.PsiAnnotation +import com.intellij.psi.PsiModifier +import org.jetbrains.kotlin.asJava.elements.KtLightAbstractAnnotation +import org.jetbrains.kotlin.asJava.elements.KtLightMember +import org.jetbrains.kotlin.psi.psiUtil.hasBody + +internal class FirLightMemberModifierList>( + containingDeclaration: T, + private val modifiers: Set, + private val annotations: List +) : FirLightModifierList(containingDeclaration) { + override fun hasModifierProperty(name: String): Boolean { + return when { + name == PsiModifier.ABSTRACT && isImplementationInInterface() -> false + // Pretend this method behaves like a `default` method + name == PsiModifier.DEFAULT && isImplementationInInterface() -> true + // TODO: FINAL && isPossiblyAffectedByAllOpen + else -> { + name in modifiers + } + } + } + + private fun isImplementationInInterface(): Boolean { + return owner.containingClass.isInterface && owner is FirLightMethod && owner.kotlinOrigin?.hasBody() == true + } + + override fun hasExplicitModifier(name: String): Boolean { + // Kotlin methods can't be truly default atm, that way we can avoid being reported on by diagnostics, namely UAST + return if (name == PsiModifier.DEFAULT) false else super.hasExplicitModifier(name) + } + + override val givenAnnotations: List? + get() = invalidAccess() + + override fun getAnnotations(): Array = annotations.toTypedArray() + override fun findAnnotation(qualifiedName: String) = annotations.firstOrNull { it.qualifiedName == qualifiedName } + + override fun equals(other: Any?): Boolean = this === other + + override fun hashCode(): Int = kotlinOrigin.hashCode() +} diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightMemberImpl.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightMemberImpl.kt index e553931faa1..363610efe5d 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightMemberImpl.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightMemberImpl.kt @@ -107,7 +107,7 @@ private class KtLightMemberModifierList( } override fun hasExplicitModifier(name: String) = - // kotlin methods can't be truly default atm, that way we can avoid being reported on by diagnostics, namely android lint + // Kotlin methods can't be truly default atm, that way we can avoid being reported on by diagnostics, namely UAST if (name == PsiModifier.DEFAULT) false else super.hasExplicitModifier(name) private fun isMethodOverride() = owner is KtLightMethod && owner.kotlinOrigin?.hasModifier(KtTokens.OVERRIDE_KEYWORD) ?: false diff --git a/compiler/testData/asJava/ultraLightClasses/defaultMethodInKotlinWithSettingAll.kt b/compiler/testData/asJava/ultraLightClasses/defaultMethodInKotlinWithSettingAll.kt index 5c5dd75e5b9..1a8efc26089 100644 --- a/compiler/testData/asJava/ultraLightClasses/defaultMethodInKotlinWithSettingAll.kt +++ b/compiler/testData/asJava/ultraLightClasses/defaultMethodInKotlinWithSettingAll.kt @@ -7,4 +7,6 @@ interface KtInterface { } fun withoutBody() -} \ No newline at end of file +} + +// FIR_COMPARISON