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
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()
|
|
}
|