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

Fix C# in Rider - only squiggly brackets are rainbowified

(cherry picked from commit 086805155a79d90862ab315a95555b9b6f32cd2e)
This commit is contained in:
张志豪 2021-02-21 22:11:02 +08:00
parent 3c15c62f71
commit 5836e0d4f0
4 changed files with 77 additions and 4 deletions
src/main
kotlin/com/github/izhangzhihao/rainbow/brackets
resources/META-INF

View File

@ -11,7 +11,7 @@ import com.jetbrains.rider.ideaInterop.fileTypes.csharp.lexer.CSharpTokenType.RP
class CSharpBracePairProvider : BracePairProvider {
override fun pairs(): List<BracePair> = listOf(
BracePair(LPARENTH, RPARENTH, false),
//BracePair(LPARENTH, RPARENTH, false),
BracePair(LBRACE, RBRACE, false),
BracePair(LBRACKET, RBRACKET, false)
)

View File

@ -0,0 +1,71 @@
package com.github.izhangzhihao.rainbow.brackets.visitor
import com.github.izhangzhihao.rainbow.brackets.settings.RainbowSettings
import com.intellij.codeInsight.daemon.impl.HighlightVisitor
import com.intellij.lang.BracePair
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile
import com.intellij.psi.impl.source.tree.LeafPsiElement
import com.intellij.psi.tree.IElementType
import com.jetbrains.rider.ideaInterop.fileTypes.csharp.lexer.CSharpTokenType.LPARENTH
import com.jetbrains.rider.ideaInterop.fileTypes.csharp.lexer.CSharpTokenType.RPARENTH
import com.jetbrains.rider.ideaInterop.fileTypes.csharp.psi.CSharpDummyNode
class CSharpRainbowVisitor : RainbowHighlightVisitor() {
override fun suitableForFile(file: PsiFile)
: Boolean = super.suitableForFile(file) &&
RainbowSettings.instance.isEnableRainbowAngleBrackets &&
(file.language.id == "C#" ||
file.viewProvider.allFiles.any { it.language.id == "C#" }
)
override fun clone(): HighlightVisitor = CSharpRainbowVisitor()
override fun visit(element: PsiElement) {
val type = (element as? LeafPsiElement)?.elementType ?: return
if (type == LPARENTH || type == RPARENTH) {
val level = element.getBracketLevel(pair, type)
if (RainbowSettings.instance.isDoNOTRainbowifyTheFirstLevel) {
if (level >= 1) {
rainbowPairs(element, pair, level)
}
} else {
if (level >= 0) {
rainbowPairs(element, pair, level)
}
}
}
}
private fun rainbowPairs(element: LeafPsiElement, pair: BracePair, level: Int) {
val startElement = element.takeIf { it.elementType == pair.leftBraceType }
val endElement = element.takeIf { it.elementType == pair.rightBraceType }
element.setHighlightInfo(element.parent, level, startElement, endElement)
}
companion object {
val pair = BracePair(LPARENTH, RPARENTH, true)
private fun LeafPsiElement.getBracketLevel(pair: BracePair, type: IElementType): Int = iterateBracketParents(this, pair, -1, type)
private tailrec fun iterateBracketParents(element: PsiElement?, pair: BracePair, count: Int, type: IElementType): Int {
if (element == null || element is CSharpDummyNode || element is PsiFile) {
return count
}
var nextCount = count
if (element is LeafPsiElement && element.elementType == type) {
nextCount ++
}
return if (type == LPARENTH) {
iterateBracketParents(element.prevSibling, pair, nextCount, type)
} else {
iterateBracketParents(element.nextSibling, pair, nextCount, type)
}
}
}
}

View File

@ -34,8 +34,6 @@ class DefaultRainbowVisitor : RainbowHighlightVisitor() {
} else {
if (level >= 0) {
rainbowPairs(element, pair, level)
} else if (element.language.id == "C#") {
rainbowPairs(element, pair, 0)
}
}
}
@ -107,7 +105,7 @@ class DefaultRainbowVisitor : RainbowHighlightVisitor() {
return findLeftBracket && findRightBracket
}
private fun PsiElement.elementType(): IElementType? {
fun PsiElement.elementType(): IElementType? {
return (this as? LeafPsiElement)?.elementType
}

View File

@ -3,4 +3,8 @@
<bracePairProvider language="C#"
implementationClass="com.github.izhangzhihao.rainbow.brackets.provider.CSharpBracePairProvider"/>
</extensions>
<extensions defaultExtensionNs="com.intellij">
<highlightVisitor implementation="com.github.izhangzhihao.rainbow.brackets.visitor.CSharpRainbowVisitor"/>
</extensions>
</idea-plugin>