You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

74 lines
2.0 KiB

package com.plexworlds.l3
fun String.shouldBeSkippedOnPosition(offset: Int) = checkElementUnderCaret(this, offset) {
afterSemicolon()
|| afterLBrace()
|| afterRBrace()
|| beforeLParenthesis()
|| afterRParenthesis()
|| insideIdentifier()
|| atTheBoundaryOfStringLiteral()
|| atTheBoundaryOfCharLiteral()
|| atTheEndOfDigitalLiteral()
}
private fun Pair<Char, Char>.afterSemicolon(): Boolean {
return first == ';'
}
private fun Pair<Char, Char>.afterLBrace(): Boolean {
return first == '{'
}
private fun Pair<Char, Char>.afterRBrace(): Boolean {
return first == '}'
}
private fun Pair<Char, Char>.beforeLParenthesis(): Boolean {
return second == '('
}
private fun Pair<Char, Char>.afterRParenthesis(): Boolean {
return first == ')'
}
private fun Pair<Char, Char>.insideIdentifier(): Boolean {
return first.isLetterOrDigit() && second.isLetterOrDigit()
}
private fun Pair<Char, Char>.atTheBoundaryOfStringLiteral(): Boolean {
return first == '"' || second == '"'
}
private fun Pair<Char, Char>.atTheBoundaryOfCharLiteral(): Boolean {
return first == '\'' || second == '\''
}
private fun Pair<Char, Char>.atTheEndOfDigitalLiteral(): Boolean {
fun Char.isArithmeticOperator() = this == '+' || this == '-' || this == '*' || this == '/'
fun Char.isLogicalOperator() = this == '&' || this == '|' || this == '!' || this == '=' || this == '<' || this == '>'
return (first.isDigit() || first == 'L' || first == 'f')
&& (second == ';' || second == ' ' || second.isArithmeticOperator() || second.isLogicalOperator())
}
private fun checkElementUnderCaret(
text: String,
offset: Int,
satisfySkippedCriteria: Pair<Char, Char>.() -> Boolean
): Boolean {
val beforeCaretChar = if (offset in 0..text.lastIndex) text[offset] else '\n'
val afterCaretChar = if (offset + 1 in 0..text.lastIndex) text[offset + 1] else '\n'
return (beforeCaretChar to afterCaretChar).satisfySkippedCriteria()
}