// 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 = emptyList()) { fun getChildren(treeStructure: FlyweightCapableTreeStructure): List = _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(val node: Node, val token: KtModifierKeywordToken) { class FirPsiModifier( node: ASTNode, token: KtModifierKeywordToken ) : FirModifier(node, token) class FirLightModifier( node: LighterASTNode, token: KtModifierKeywordToken, val tree: FlyweightCapableTreeStructure ) : FirModifier(node, token) } internal sealed class FirModifierList { val modifiers: List> = 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() }