blob: efab025c5a8806943571e7b94f80dd0fca42b121 [file] [log] [blame]
// ISSUE: KT-44814
// WITH_STDLIB
// DUMP_IR
// DUMP_CFG
// RENDERER_CFG_LEVELS
class FlyweightCapableTreeStructure
sealed class FirSourceElement {
abstract val lighterASTNode: LighterASTNode
abstract val treeStructure: FlyweightCapableTreeStructure
}
class FirPsiSourceElement(
val psi: PsiElement,
override val lighterASTNode: LighterASTNode,
override val treeStructure: FlyweightCapableTreeStructure
) : FirSourceElement()
class FirLightSourceElement(
override val lighterASTNode: LighterASTNode,
override val treeStructure: FlyweightCapableTreeStructure
) : FirSourceElement()
open class PsiElement
class ASTNode
class LighterASTNode(val _children: List<LighterASTNode?> = emptyList()) {
fun getChildren(treeStructure: FlyweightCapableTreeStructure): List<LighterASTNode?> = _children
val tokenType: TokenType = TokenType.MODIFIER_LIST
}
class TokenType {
companion object {
val MODIFIER_LIST = TokenType()
}
}
class KtModifierKeywordToken
class KtModifierList : PsiElement()
class KtModifierListOwner : PsiElement() {
val modifierList: KtModifierList = KtModifierList()
}
internal sealed class FirModifier<Node : Any>(val node: Node, val token: KtModifierKeywordToken) {
class FirPsiModifier(
node: ASTNode,
token: KtModifierKeywordToken
) : FirModifier<ASTNode>(node, token)
class FirLightModifier(
node: LighterASTNode,
token: KtModifierKeywordToken,
val tree: FlyweightCapableTreeStructure
) : FirModifier<LighterASTNode>(node, token)
}
internal sealed class FirModifierList {
val modifiers: List<FirModifier<*>> = emptyList()
class FirPsiModifierList(val modifierList: KtModifierList) : FirModifierList()
class FirLightModifierList(val modifierList: LighterASTNode, val tree: FlyweightCapableTreeStructure) : FirModifierList()
companion object {
fun FirSourceElement?.getModifierList(): FirModifierList? {
return when (this) {
null -> null
is FirPsiSourceElement-> (psi as? KtModifierListOwner)?.modifierList?.let { FirPsiModifierList(it) }
is FirLightSourceElement -> {
val modifierListNode = lighterASTNode.getChildren(treeStructure).find { it?.tokenType == TokenType.MODIFIER_LIST }
?: return null // error is here
FirLightModifierList(modifierListNode, treeStructure)
}
}
}
fun boxImpl(): String {
val sourceElement: FirSourceElement? = FirLightSourceElement(LighterASTNode(listOf(LighterASTNode())), FlyweightCapableTreeStructure())
val result = sourceElement.getModifierList()
return if (result is FirLightModifierList) "OK" else "Fail"
}
}
}
fun box(): String {
return FirModifierList.boxImpl()
}