1
0
mirror of https://github.com/chylex/IntelliJ-Rainbow-Brackets.git synced 2025-05-10 18:34:05 +02:00

Using textMatches instead of text to avoid expensive traverses the whole PSI tree & format code

This commit is contained in:
张志豪 2021-08-18 18:51:58 +08:00
parent 277495f165
commit aa511946af
2 changed files with 25 additions and 15 deletions
src/main/kotlin/com/github/izhangzhihao/rainbow/brackets

View File

@ -176,6 +176,9 @@ class RainbowIndentGuideRenderer: CustomHighlighterRenderer {
return rainbowInfo
}
/***
* introduced from https://github.com/izhangzhihao/intellij-rainbow-brackets/commit/d9d40e6910e9c15fbdcba12280df18019ea170b5
*/
private fun checkBoundary(document: Document, element: PsiElement, highlighter: RangeHighlighter): Boolean {
val elementStartLine = document.lineNumber(element.startOffset) ?: return false
val highlighterStartLine = document.lineNumber(highlighter.startOffset) ?: return false

View File

@ -20,11 +20,11 @@ class DefaultRainbowVisitor : RainbowHighlightVisitor() {
val matching = filterPairs(type, element) ?: return
val pair =
if (matching.size == 1) {
matching[0]
} else {
matching.find { element.isValidBracket(it) }
} ?: return
if (matching.size == 1) {
matching[0]
} else {
matching.find { element.isValidBracket(it) }
} ?: return
val level = element.getBracketLevel(pair)
if (RainbowSettings.instance.isDoNOTRainbowifyTheFirstLevel) {
@ -56,12 +56,14 @@ class DefaultRainbowVisitor : RainbowHighlightVisitor() {
var nextCount = count
if (!RainbowSettings.instance.cycleCountOnAllBrackets) {
if (element.haveBrackets({ it.elementType() == pair.leftBraceType },
{ it.elementType() == pair.rightBraceType })) {
{ it.elementType() == pair.rightBraceType })
) {
nextCount++
}
} else {
if (element.haveBrackets({ element.language.braceTypeSet.contains(it.elementType()) },
{ element.language.braceTypeSet.contains(it.elementType()) })) {
{ element.language.braceTypeSet.contains(it.elementType()) })
) {
nextCount++
}
}
@ -69,7 +71,10 @@ class DefaultRainbowVisitor : RainbowHighlightVisitor() {
return iterateBracketParents(element.parent, pair, nextCount)
}
private inline fun PsiElement.haveBrackets(checkLeft: (PsiElement) -> Boolean, checkRight: (PsiElement) -> Boolean): Boolean {
private inline fun PsiElement.haveBrackets(
checkLeft: (PsiElement) -> Boolean,
checkRight: (PsiElement) -> Boolean
): Boolean {
if (this is LeafPsiElement) {
return false
}
@ -99,7 +104,7 @@ class DefaultRainbowVisitor : RainbowHighlightVisitor() {
//For https://github.com/izhangzhihao/intellij-rainbow-brackets/issues/830
if (RainbowSettings.instance.doNOTRainbowifyTemplateString) {
if (left?.prevSibling?.text == "$") return false
if (left?.prevSibling?.textMatches("$") == true) return false
}
return findLeftBracket && findRightBracket
@ -123,10 +128,12 @@ class DefaultRainbowVisitor : RainbowHighlightVisitor() {
}
}
private fun checkBracePair(brace: PsiElement,
start: PsiElement,
type: IElementType,
next: PsiElement.() -> PsiElement?): Boolean {
private fun checkBracePair(
brace: PsiElement,
start: PsiElement,
type: IElementType,
next: PsiElement.() -> PsiElement?
): Boolean {
var element: PsiElement? = start
while (element != null && element != brace) {
if (element is LeafPsiElement && element.elementType == type) {
@ -152,8 +159,8 @@ class DefaultRainbowVisitor : RainbowHighlightVisitor() {
}
RainbowSettings.instance.isDoNOTRainbowifyBracketsWithoutContent -> {
filterBraceType
.filterNot { it.leftBraceType == type && element.nextSibling?.elementType() == it.rightBraceType }
.filterNot { it.rightBraceType == type && element.prevSibling?.elementType() == it.leftBraceType }
.filterNot { it.leftBraceType == type && element.nextSibling?.elementType() == it.rightBraceType }
.filterNot { it.rightBraceType == type && element.prevSibling?.elementType() == it.leftBraceType }
}
else -> {
filterBraceType