Simplify FirMemberDeclaration.implicitModality
This commit is contained in:
+13
-11
@@ -12,6 +12,9 @@ import org.jetbrains.kotlin.descriptors.Visibility
|
|||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
import org.jetbrains.kotlin.fir.FirSymbolOwner
|
import org.jetbrains.kotlin.fir.FirSymbolOwner
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.modalityModifier
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.overrideModifier
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.visibilityModifier
|
||||||
import org.jetbrains.kotlin.fir.containingClass
|
import org.jetbrains.kotlin.fir.containingClass
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
|
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
|
||||||
@@ -250,20 +253,21 @@ fun FirMemberDeclaration.implicitModality(context: CheckerContext): Modality {
|
|||||||
}
|
}
|
||||||
|
|
||||||
val klass = context.findClosestClassOrObject() ?: return Modality.FINAL
|
val klass = context.findClosestClassOrObject() ?: return Modality.FINAL
|
||||||
val modifiers = this.modifierListOrNull() ?: return Modality.FINAL
|
val source = source ?: return Modality.FINAL
|
||||||
if (modifiers.contains(KtTokens.OVERRIDE_KEYWORD)) {
|
val tree = source.treeStructure
|
||||||
val klassModifiers = klass.modifierListOrNull()
|
if (tree.overrideModifier(source.lighterASTNode) != null) {
|
||||||
if (klassModifiers != null && klassModifiers.run {
|
val klassModalityTokenType = klass.source?.let { tree.modalityModifier(it.lighterASTNode)?.tokenType }
|
||||||
contains(KtTokens.ABSTRACT_KEYWORD) || contains(KtTokens.OPEN_KEYWORD) || contains(KtTokens.SEALED_KEYWORD)
|
if (klassModalityTokenType == KtTokens.ABSTRACT_KEYWORD ||
|
||||||
}) {
|
klassModalityTokenType == KtTokens.OPEN_KEYWORD ||
|
||||||
|
klassModalityTokenType == KtTokens.SEALED_KEYWORD
|
||||||
|
) {
|
||||||
return Modality.OPEN
|
return Modality.OPEN
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (klass is FirRegularClass
|
||||||
klass is FirRegularClass
|
|
||||||
&& klass.classKind == ClassKind.INTERFACE
|
&& klass.classKind == ClassKind.INTERFACE
|
||||||
&& !modifiers.contains(KtTokens.PRIVATE_KEYWORD)
|
&& tree.visibilityModifier(source.lighterASTNode)?.tokenType != KtTokens.PRIVATE_KEYWORD
|
||||||
) {
|
) {
|
||||||
return if (this.hasBody()) Modality.OPEN else Modality.ABSTRACT
|
return if (this.hasBody()) Modality.OPEN else Modality.ABSTRACT
|
||||||
}
|
}
|
||||||
@@ -271,8 +275,6 @@ fun FirMemberDeclaration.implicitModality(context: CheckerContext): Modality {
|
|||||||
return Modality.FINAL
|
return Modality.FINAL
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun FirDeclaration.modifierListOrNull() = this.source.getModifierList()?.modifiers?.map { it.token }
|
|
||||||
|
|
||||||
private fun FirDeclaration.hasBody(): Boolean = when (this) {
|
private fun FirDeclaration.hasBody(): Boolean = when (this) {
|
||||||
is FirSimpleFunction -> this.body != null && this.body !is FirEmptyExpressionBlock
|
is FirSimpleFunction -> this.body != null && this.body !is FirEmptyExpressionBlock
|
||||||
is FirProperty -> this.setter?.body !is FirEmptyExpressionBlock? || this.getter?.body !is FirEmptyExpressionBlock?
|
is FirProperty -> this.setter?.body !is FirEmptyExpressionBlock? || this.getter?.body !is FirEmptyExpressionBlock?
|
||||||
|
|||||||
+3
@@ -208,6 +208,9 @@ internal fun FlyweightCapableTreeStructure<LighterASTNode>.visibilityModifier(de
|
|||||||
internal fun FlyweightCapableTreeStructure<LighterASTNode>.modalityModifier(declaration: LighterASTNode): LighterASTNode? =
|
internal fun FlyweightCapableTreeStructure<LighterASTNode>.modalityModifier(declaration: LighterASTNode): LighterASTNode? =
|
||||||
modifierList(declaration)?.let { findChildByType(it, MODALITY_MODIFIERS) }
|
modifierList(declaration)?.let { findChildByType(it, MODALITY_MODIFIERS) }
|
||||||
|
|
||||||
|
internal fun FlyweightCapableTreeStructure<LighterASTNode>.overrideModifier(declaration: LighterASTNode): LighterASTNode? =
|
||||||
|
modifierList(declaration)?.let { findChildByType(it, KtTokens.OVERRIDE_KEYWORD) }
|
||||||
|
|
||||||
private fun FlyweightCapableTreeStructure<LighterASTNode>.accessorNamePlaceholder(node: LighterASTNode): LighterASTNode =
|
private fun FlyweightCapableTreeStructure<LighterASTNode>.accessorNamePlaceholder(node: LighterASTNode): LighterASTNode =
|
||||||
findChildByType(node, KtTokens.GET_KEYWORD) ?: findChildByType(node, KtTokens.SET_KEYWORD)!!
|
findChildByType(node, KtTokens.GET_KEYWORD) ?: findChildByType(node, KtTokens.SET_KEYWORD)!!
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user