From 59fb96503c3be431cf3b0c2a6226e26b2ef39f45 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 18 Mar 2020 13:59:05 +0300 Subject: [PATCH] Introduce FirModifierList --- .../jetbrains/kotlin/fir/FirModifierList.kt | 38 +++++++++++++++++++ .../jetbrains/kotlin/fir/FirSourceElement.kt | 14 ++++++- 2 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirModifierList.kt diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirModifierList.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirModifierList.kt new file mode 100644 index 00000000000..e00dbbcc08e --- /dev/null +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirModifierList.kt @@ -0,0 +1,38 @@ +/* + * Copyright 2010-2020 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.fir + +import com.intellij.lang.ASTNode +import com.intellij.lang.LighterASTNode +import com.intellij.psi.tree.TokenSet +import org.jetbrains.kotlin.lexer.KtModifierKeywordToken +import org.jetbrains.kotlin.lexer.KtTokens +import org.jetbrains.kotlin.psi.KtModifierList + +sealed class FirModifierList { + abstract val modifiers: List> +} + +private val MODIFIER_KEYWORD_SET = TokenSet.orSet(KtTokens.SOFT_KEYWORDS, TokenSet.create(KtTokens.IN_KEYWORD, KtTokens.FUN_KEYWORD)) + +class FirPsiModifierList(val modifierList: KtModifierList) : FirModifierList() { + override val modifiers: List + get() = modifierList.node.getChildren(MODIFIER_KEYWORD_SET).map { node -> + FirPsiModifier(node, node.elementType as KtModifierKeywordToken) + } + +} + +class FirLightModifierList(val modifierList: LighterASTNode) : FirModifierList() { + override val modifiers: List + get() = TODO() +} + +sealed class FirModifier(val node: Node, val token: KtModifierKeywordToken) + +class FirPsiModifier(node: ASTNode, token: KtModifierKeywordToken) : FirModifier(node, token) + +class FirLightModifier(node: LighterASTNode, token: KtModifierKeywordToken) : FirModifier(node, token) \ No newline at end of file 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 099aa5e7087..afdd133433c 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSourceElement.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSourceElement.kt @@ -7,8 +7,10 @@ package org.jetbrains.kotlin.fir import com.intellij.lang.LighterASTNode import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.lexer.KtModifierKeywordToken +import org.jetbrains.kotlin.psi.KtModifierListOwner -abstract class FirSourceElement +sealed class FirSourceElement class FirPsiSourceElement(val psi: PsiElement) : FirSourceElement() class FirLightSourceElement(val element: LighterASTNode) : FirSourceElement() @@ -23,4 +25,12 @@ inline fun PsiElement.toFirSourceElement(): FirPsiSourceElement = FirPsiSourceEl @Suppress("NOTHING_TO_INLINE") inline fun LighterASTNode.toFirSourceElement(): FirLightSourceElement = FirLightSourceElement(this) -val FirSourceElement?.lightNode: LighterASTNode? get() = (this as? FirLightSourceElement)?.element \ No newline at end of file +val FirSourceElement?.lightNode: LighterASTNode? get() = (this as? FirLightSourceElement)?.element + +fun FirSourceElement?.getModifierList(): FirModifierList? { + return when (this) { + is FirPsiSourceElement -> (psi as? KtModifierListOwner)?.modifierList?.let { FirPsiModifierList(it) } + is FirLightSourceElement -> FirLightModifierList(element) + null -> null + } +}