diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirModifierList.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirModifierList.kt similarity index 78% rename from compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirModifierList.kt rename to compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirModifierList.kt index c9e42fd1d38..56b49588641 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirModifierList.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirModifierList.kt @@ -3,7 +3,7 @@ * 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.fir +package org.jetbrains.kotlin.fir.analysis.checkers import com.intellij.lang.ASTNode import com.intellij.lang.LighterASTNode @@ -11,14 +11,30 @@ import com.intellij.openapi.util.Ref import com.intellij.psi.PsiElement import com.intellij.psi.tree.TokenSet import com.intellij.util.diff.FlyweightCapableTreeStructure +import org.jetbrains.kotlin.KtNodeTypes +import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.lexer.KtModifierKeywordToken import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtModifierList +import org.jetbrains.kotlin.psi.KtModifierListOwner sealed class FirModifierList { abstract val modifiers: List> } +fun FirSourceElement?.getModifierList(): FirModifierList? { + return when (this) { + null -> null + is FirPsiSourceElement<*> -> (psi as? KtModifierListOwner)?.modifierList?.let { FirPsiModifierList(it) } + is FirLightSourceElement -> { + val kidsRef = Ref>() + tree.getChildren(element, kidsRef) + val modifierListNode = kidsRef.get().find { it?.tokenType == KtNodeTypes.MODIFIER_LIST } ?: return null + FirLightModifierList(modifierListNode, tree) + } + } +} + private val MODIFIER_KEYWORD_SET = TokenSet.orSet(KtTokens.SOFT_KEYWORDS, TokenSet.create(KtTokens.IN_KEYWORD, KtTokens.FUN_KEYWORD)) class FirPsiModifierList(val modifierList: KtModifierList) : FirModifierList() { @@ -67,4 +83,4 @@ val FirModifier<*>.source: FirSourceElement? val endOffset = tree.getEndOffset(node) node.toFirLightSourceElement(startOffset, endOffset, tree) } - } \ No newline at end of file + } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirModifierChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirModifierChecker.kt index 0c278237b24..6df15a0805c 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirModifierChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirModifierChecker.kt @@ -6,11 +6,18 @@ package org.jetbrains.kotlin.fir.analysis.checkers.declaration import org.jetbrains.kotlin.KtNodeTypes -import org.jetbrains.kotlin.fir.* +import org.jetbrains.kotlin.fir.FirSourceElement +import org.jetbrains.kotlin.fir.analysis.checkers.FirModifier +import org.jetbrains.kotlin.fir.analysis.checkers.FirModifierList import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.analysis.checkers.getModifierList +import org.jetbrains.kotlin.fir.analysis.checkers.source import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors -import org.jetbrains.kotlin.fir.declarations.* +import org.jetbrains.kotlin.fir.declarations.FirClass +import org.jetbrains.kotlin.fir.declarations.FirDeclaration +import org.jetbrains.kotlin.fir.declarations.FirProperty +import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor import org.jetbrains.kotlin.lexer.KtModifierKeywordToken import org.jetbrains.kotlin.lexer.KtTokens.* @@ -195,5 +202,4 @@ object FirModifierChecker : FirDeclarationChecker() { val source = modifier.source source?.let { report(FirErrors.INCOMPATIBLE_MODIFIERS.on(it, firstKeyword, secondKeyword)) } } - -} \ No newline at end of file +} diff --git a/compiler/fir/tree/build.gradle.kts b/compiler/fir/tree/build.gradle.kts index 2f6f6a580ba..43aa2ee46dc 100644 --- a/compiler/fir/tree/build.gradle.kts +++ b/compiler/fir/tree/build.gradle.kts @@ -6,7 +6,6 @@ plugins { } dependencies { - compile(project(":compiler:psi")) compile(project(":compiler:frontend.common")) compile(project(":core:descriptors")) compile(project(":compiler:fir:cones")) diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSourceElement.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSourceElement.kt index bc44b0ed2de..760094f48f0 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSourceElement.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSourceElement.kt @@ -6,14 +6,9 @@ package org.jetbrains.kotlin.fir import com.intellij.lang.LighterASTNode -import com.intellij.openapi.util.Ref import com.intellij.psi.PsiElement import com.intellij.psi.tree.IElementType import com.intellij.util.diff.FlyweightCapableTreeStructure -import org.jetbrains.kotlin.KtNodeTypes -import org.jetbrains.kotlin.psi.KtModifierListOwner -import org.jetbrains.kotlin.psi.psiUtil.endOffset -import org.jetbrains.kotlin.psi.psiUtil.startOffset sealed class FirSourceElement { abstract val elementType: IElementType @@ -26,10 +21,10 @@ class FirPsiSourceElement

(val psi: P) : FirSourceElement() { get() = psi.node.elementType override val startOffset: Int - get() = psi.startOffset + get() = psi.textRange.startOffset override val endOffset: Int - get() = psi.endOffset + get() = psi.textRange.endOffset } class FirLightSourceElement( @@ -56,16 +51,3 @@ inline fun LighterASTNode.toFirLightSourceElement( ): FirLightSourceElement = FirLightSourceElement(this, startOffset, endOffset, tree) val FirSourceElement?.lightNode: LighterASTNode? get() = (this as? FirLightSourceElement)?.element - -fun FirSourceElement?.getModifierList(): FirModifierList? { - return when (this) { - null -> null - is FirPsiSourceElement<*> -> (psi as? KtModifierListOwner)?.modifierList?.let { FirPsiModifierList(it) } - is FirLightSourceElement -> { - val kidsRef = Ref>() - tree.getChildren(element, kidsRef) - val modifierListNode = kidsRef.get().find { it?.tokenType == KtNodeTypes.MODIFIER_LIST } ?: return null - FirLightModifierList(modifierListNode, tree) - } - } -}