fun findFenceRoots()

in src/org/jetbrains/r/rmarkdown/RMarkdownPsiUtil.kt [56:88]


  fun findFenceRoots(node: ASTNode, fenceRange: TextRange): List<ASTNode>? {
    if (node.textRange == fenceRange) {
      return listOf(node)
    }
    var child: ASTNode? = node.firstChildNode
    while (child != null) {
      when {
        child.textRange.contains(fenceRange) -> return findFenceRoots(child, fenceRange)

        fenceRange.startOffset == child.textRange.startOffset || (isSpace(child) && child.textRange.contains(fenceRange.startOffset)) -> {
          val result = ArrayList<ASTNode>()
          while (child != null) {
            if (!isSpace(child)) {
              result.add(child)
            }
            if (fenceRange.endOffset == child.textRange.endOffset || (isSpace(child) && child.textRange.contains(fenceRange.endOffset))) {
              return if (result.isNotEmpty()) result else null
            }
            if (child.textRange.contains(fenceRange.endOffset)) {
              return null
            }
            child = child.treeNext
          }
          return null
        }

        child.textRange.contains(fenceRange.startOffset) -> return null

        else -> child = child.treeNext
      }
    }
    return null
  }