[go: nahoru, domu]

Skip to content

Commit

Permalink
Merge pull request #48 from izhangzhihao/performance-improve
Browse files Browse the repository at this point in the history
improve performance when using `BracePair`
  • Loading branch information
YiiGuxing committed May 2, 2018
2 parents 569a98e + 2136fad commit a9b531f
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 50 deletions.
Original file line number Diff line number Diff line change
@@ -1,8 +1,3 @@
/*
* BracePairs
*
* Created by Yii.Guxing on 2018/01/25
*/
package com.github.izhangzhihao.rainbow.brackets

import com.github.izhangzhihao.rainbow.brackets.provider.PairedBraceProvider
Expand Down Expand Up @@ -34,13 +29,18 @@ object BracePairs {

val pairsList = providers.forLanguage(language)?.pairs?.let {
if (pairs != null && pairs.isNotEmpty()) {
it.toMutableSet().apply { addAll(pairs) }.toList()
it.toMutableSet().apply { addAll(pairs) }
} else {
it
}
} ?: pairs?.toList()

language to pairsList
val braceMap = pairsList
?.map { listOf(Pair(it.leftBraceType.toString(), it), Pair(it.rightBraceType.toString(), it)) }
?.flatten()
?.toMap()

language to braceMap
}
.toMap()
}
Expand All @@ -49,5 +49,5 @@ object BracePairs {

}

inline val Language.bracePairs: List<BracePair>?
inline val Language.bracePairs: Map<String, BracePair>?
get() = BracePairs.getBracePairs(this)
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package com.github.izhangzhihao.rainbow.brackets.visitor

import com.github.izhangzhihao.rainbow.brackets.RainbowHighlighter.isDoNOTRainbowifyBracketsWithoutContent
import com.github.izhangzhihao.rainbow.brackets.bracePairs
import com.github.izhangzhihao.rainbow.brackets.visitor.DefaultRainbowVisitor.Companion.filterPairs
import com.intellij.codeInsight.daemon.impl.HighlightVisitor
import com.intellij.lang.BracePair
import com.intellij.psi.PsiElement
Expand All @@ -21,15 +20,10 @@ class DefaultRainbowVisitor : RainbowHighlightVisitor() {

override fun visit(element: PsiElement) {
val type = (element as? LeafPsiElement)?.elementType ?: return
val pairs = element.language.bracePairs ?: return

val matching = filterPairs(pairs, type, element)
if (matching.isEmpty()) {
return
}
val matching = filterPairs(type, element) ?: return

val pair = matching.find { element.isValidBracket(it) } ?: return
val level = element.getBracketLevel(pair)
val level = element.getBracketLevel(matching)
if (level >= 0) {
element.setHighlightInfo(level)
}
Expand Down Expand Up @@ -88,44 +82,15 @@ class DefaultRainbowVisitor : RainbowHighlightVisitor() {
return (this as? LeafPsiElement)?.elementType
}

private fun LeafPsiElement.isValidBracket(pair: BracePair): Boolean {
val pairType = when (elementType) {
pair.leftBraceType -> pair.rightBraceType
pair.rightBraceType -> pair.leftBraceType
else -> return false
}

return if (pairType == pair.leftBraceType) {
checkBracePair(this, parent.firstChild, pairType, PsiElement::getNextSibling)
} else {
checkBracePair(this, parent.lastChild, pairType, PsiElement::getPrevSibling)
}
}

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) {
return true
}

element = element.next()
}

return false
}

private fun filterPairs(pairs: List<BracePair>, type: IElementType, element: LeafPsiElement): List<BracePair> {
val filterBraceType = pairs.filter { it.leftBraceType == type || it.rightBraceType == type }
private fun filterPairs(type: IElementType, element: LeafPsiElement): BracePair? {
val pairs = element.language.bracePairs ?: return null
val filterBraceType = pairs[type.toString()] ?: return null
return if (!isDoNOTRainbowifyBracketsWithoutContent) {
filterBraceType
} else {
filterBraceType
.filterNot { it.leftBraceType == type && element.nextSibling?.elementType() == it.rightBraceType }
.filterNot { it.rightBraceType == type && element.prevSibling?.elementType() == it.leftBraceType }
.takeUnless { it.leftBraceType == type && element.nextSibling?.elementType() == it.rightBraceType }
.takeUnless { it?.rightBraceType == type && element.prevSibling?.elementType() == it.leftBraceType }
}
}
}
Expand Down

0 comments on commit a9b531f

Please sign in to comment.