Refactored code

This commit is contained in:
Valentin Kipyatkov
2014-10-01 20:48:16 +04:00
parent c2d37805be
commit 7b58d8b1e9
@@ -34,17 +34,15 @@ import com.intellij.codeInsight.editorActions.ExtendWordSelectionHandlerBase
* Originally from IDEA platform: CodeBlockOrInitializerSelectioner * Originally from IDEA platform: CodeBlockOrInitializerSelectioner
*/ */
public class JetCodeBlockSelectioner : BasicSelectioner() { public class JetCodeBlockSelectioner : BasicSelectioner() {
override fun canSelect(e: PsiElement): Boolean { override fun canSelect(e: PsiElement)
return e is JetBlockExpression || e is JetWhenExpression = e is JetBlockExpression || e is JetWhenExpression
}
override fun select(e: PsiElement, editorText: CharSequence, cursorOffset: Int, editor: Editor): List<TextRange> { override fun select(e: PsiElement, editorText: CharSequence, cursorOffset: Int, editor: Editor): List<TextRange> {
val result = ArrayList<TextRange>() val result = ArrayList<TextRange>()
val children = e.getNode()!!.getChildren(null) val node = e.getNode()!!
val start = findBlockContentStart(node)
val start = findOpeningBrace(children) val end = findBlockContentEnd(node, start)
val end = findClosingBrace(children, start)
result.add(e.getTextRange()!!) result.add(e.getTextRange()!!)
result.addAll(ExtendWordSelectionHandlerBase.expandToWholeLine(editorText, TextRange(start, end))) result.addAll(ExtendWordSelectionHandlerBase.expandToWholeLine(editorText, TextRange(start, end)))
@@ -52,39 +50,24 @@ public class JetCodeBlockSelectioner : BasicSelectioner() {
return result return result
} }
class object { private fun findBlockContentStart(parentNode: ASTNode): Int {
public fun findOpeningBrace(children: Array<ASTNode>): Int { val node = parentNode.getChildren(null)
var start = children.last().getTextRange()!!.getStartOffset() .stream()
for ((i, child) in children.withIndices()) { .dropWhile { it.getElementType() != JetTokens.LBRACE } // search for '{'
if (child is LeafPsiElement) { .drop(1) // skip it
if (child.getElementType() == JetTokens.LBRACE) { .dropWhile { it is PsiWhiteSpace } // and skip all whitespaces
var j = i + 1 .firstOrNull() ?: parentNode
while (children[j] is PsiWhiteSpace) { return node.getTextRange()!!.getStartOffset()
j++ }
}
start = children[j].getTextRange()!!.getStartOffset() private fun findBlockContentEnd(parentNode: ASTNode, startOffset: Int): Int {
} val node = parentNode.getChildren(null)
} .reverse()
} .stream()
return start .dropWhile { it.getElementType() != JetTokens.RBRACE } // search for '}'
} .drop(1) // skip it
.dropWhile { it is PsiWhiteSpace && (it: PsiWhiteSpace).getTextRange()!!.getStartOffset() > startOffset } // and skip all whitespaces
public fun findClosingBrace(children: Array<ASTNode>, startOffset: Int): Int { .firstOrNull() ?: parentNode.getLastChildNode()!!
var end = children[children.size - 1].getTextRange()!!.getEndOffset() return node.getTextRange()!!.getEndOffset()
for ((i, child) in children.withIndices()) {
if (child is LeafPsiElement) {
if (child.getElementType() == JetTokens.RBRACE) {
var j = i - 1
while (children[j] is PsiWhiteSpace && children[j].getTextRange()!!.getStartOffset() > startOffset) {
j--
}
end = children[j].getTextRange()!!.getEndOffset()
}
}
}
return end
}
} }
} }