1
0
mirror of https://github.com/chylex/IntelliJ-Rainbow-Brackets.git synced 2025-01-30 13:45:59 +01:00

Compare commits

...

3 Commits

Author SHA1 Message Date
74ac5273b9
Release 1.2.0 2024-12-09 13:25:18 +01:00
b732020017
Address several deprecation warnings 2024-12-09 13:19:38 +01:00
93f5911faf
Fix exception when opening certain diff editors
Closes #2
2024-12-09 12:42:22 +01:00
5 changed files with 55 additions and 70 deletions

View File

@ -9,7 +9,7 @@ plugins {
}
group = "com.chylex.intellij.coloredbrackets"
version = "1.1.0"
version = "1.2.0"
allprojects {
apply(plugin = "org.jetbrains.kotlin.jvm")

View File

@ -9,21 +9,27 @@ import com.intellij.icons.AllIcons
import com.intellij.ide.actions.ShowSettingsUtilImpl
import com.intellij.openapi.fileEditor.FileEditor
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.Key
import com.intellij.openapi.util.Ref
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.ui.EditorNotificationPanel
import com.intellij.ui.EditorNotificationProvider
import com.intellij.ui.EditorNotifications
import com.intellij.ui.HyperlinkLabel
import java.util.function.Function
import javax.swing.JComponent
class RainbowifyBanner : EditorNotifications.Provider<EditorNotificationPanel>() {
override fun getKey(): Key<EditorNotificationPanel> = KEY
class RainbowifyBanner : EditorNotificationProvider {
override fun collectNotificationData(project: Project, file: VirtualFile): Function<in FileEditor, out JComponent?> {
return Function { createNotificationPanel(project, file) }
}
override fun createNotificationPanel(file: VirtualFile, fileEditor: FileEditor, project: Project): EditorNotificationPanel? {
private fun createNotificationPanel(project: Project, file: VirtualFile): EditorNotificationPanel? {
val settings = RainbowSettings.instance
if (!settings.isRainbowEnabled) {
if (settings.suppressDisabledCheck) return null
if (settings.suppressDisabledCheck) {
return null
}
return EditorNotificationPanel().apply {
text("Colored Brackets is now disabled")
icon(AllIcons.General.GearPlain)
@ -41,7 +47,9 @@ class RainbowifyBanner : EditorNotifications.Provider<EditorNotificationPanel>()
val psiFile = file.toPsiFile(project)
if (psiFile != null && !checkForBigFile(psiFile)) {
if (settings.suppressBigFileCheck) return null
if (settings.suppressBigFileCheck) {
return null
}
return EditorNotificationPanel().apply {
text("Rainbowify is disabled for files > " + settings.bigFilesLinesThreshold + " lines")
icon(AllIcons.General.InspectionsEye)
@ -61,7 +69,9 @@ class RainbowifyBanner : EditorNotifications.Provider<EditorNotificationPanel>()
settings.languageBlacklist.contains(file.fileType.name) ||
settings.languageBlacklist.contains(memoizedFileExtension(file.name))
) {
if (settings.suppressBlackListCheck) return null
if (settings.suppressBlackListCheck) {
return null
}
return EditorNotificationPanel().apply {
text("Rainbowify is disabled because the language/file extension is in the black list")
icon(AllIcons.General.InspectionsEye)
@ -81,14 +91,10 @@ class RainbowifyBanner : EditorNotifications.Provider<EditorNotificationPanel>()
return null
}
companion object {
private val KEY = Key.create<EditorNotificationPanel>("RainbowifyBanner")
fun EditorNotificationPanel.createComponentActionLabel(labelText: String, callback: (HyperlinkLabel) -> Unit) {
val label: Ref<HyperlinkLabel> = Ref.create()
label.set(createActionLabel(labelText) {
callback(label.get())
})
}
private fun EditorNotificationPanel.createComponentActionLabel(labelText: String, callback: (HyperlinkLabel) -> Unit) {
val label: Ref<HyperlinkLabel> = Ref.create()
label.set(createActionLabel(labelText) {
callback(label.get())
})
}
}

View File

@ -8,7 +8,6 @@ import com.intellij.ide.actions.ToggleZenModeAction
import com.intellij.lang.LanguageParserDefinitions
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.editor.IndentGuideDescriptor
import com.intellij.openapi.editor.ex.EditorEx
import com.intellij.openapi.editor.ex.util.EditorUtil
import com.intellij.openapi.editor.markup.HighlighterTargetArea
import com.intellij.openapi.editor.markup.MarkupModel
@ -23,8 +22,8 @@ import com.intellij.openapi.util.TextRange
import com.intellij.psi.PsiFile
import com.intellij.psi.tree.TokenSet
import com.intellij.util.DocumentUtil
import com.intellij.util.containers.IntStack
import com.intellij.util.text.CharArrayUtil
import it.unimi.dsi.fastutil.ints.IntArrayList
import java.lang.StrictMath.abs
import java.lang.StrictMath.min
import java.util.Collections
@ -35,11 +34,9 @@ import java.util.Collections
* */
class RainbowIndentsPass internal constructor(
project: Project,
editor: Editor,
private val myEditor: Editor,
private val myFile: PsiFile,
) : TextEditorHighlightingPass(project, editor.document, false), DumbAware {
private val myEditor: EditorEx = editor as EditorEx
) : TextEditorHighlightingPass(project, myEditor.document, false), DumbAware {
@Volatile
private var myRanges = emptyList<TextRange>()
@ -151,8 +148,8 @@ class RainbowIndentsPass internal constructor(
calculator.calculate()
val lineIndents = calculator.lineIndents
val lines = IntStack()
val indents = IntStack()
val lines = IntArrayList()
val indents = IntArrayList()
lines.push(0)
indents.push(0)
@ -161,10 +158,10 @@ class RainbowIndentsPass internal constructor(
ProgressManager.checkCanceled()
val curIndent = abs(lineIndents[line])
while (!indents.empty() && curIndent <= indents.peek()) {
while (!indents.isEmpty && curIndent <= indents.peekInt(0)) {
ProgressManager.checkCanceled()
val level = indents.pop()
val startLine = lines.pop()
val level = indents.popInt()
val startLine = lines.popInt()
if (level > 0) {
for (i in startLine until line) {
if (level != abs(lineIndents[i])) {
@ -184,10 +181,10 @@ class RainbowIndentsPass internal constructor(
}
}
while (!indents.empty()) {
while (!indents.isEmpty) {
ProgressManager.checkCanceled()
val level = indents.pop()
val startLine = lines.pop()
val level = indents.popInt()
val startLine = lines.popInt()
if (level > 0) {
descriptors.add(createDescriptor(level, startLine, document.lineCount, lineIndents))
}
@ -207,38 +204,12 @@ class RainbowIndentsPass internal constructor(
return IndentGuideDescriptor(level, sLine, endLine)
}
/*
private fun findCodeConstructStart(startLine: Int): Int? {
val document = myEditor.document
val text = document.immutableCharSequence
val lineStartOffset = document.getLineStartOffset(startLine)
val firstNonWsOffset = CharArrayUtil.shiftForward(text, lineStartOffset, " \t")
val type = PsiUtilBase.getPsiFileAtOffset(myFile, firstNonWsOffset).fileType
val language = PsiUtilCore.getLanguageAtOffset(myFile, firstNonWsOffset)
val braceMatcher = BraceMatchingUtil.getBraceMatcher(type, language)
val iterator = myEditor.highlighter.createIterator(firstNonWsOffset)
return if (braceMatcher.isLBraceToken(iterator, text, type)) {
braceMatcher.getCodeConstructStart(myFile, firstNonWsOffset)
} else null
}
private fun findCodeConstructStartLine(startLine: Int): Int {
val codeConstructStart = findCodeConstructStart(startLine)
return if (codeConstructStart != null) myEditor.document.getLineNumber(codeConstructStart) else startLine
}
*/
private inner class IndentsCalculator {
val myComments: MutableMap<String, TokenSet> = HashMap()
val lineIndents = IntArray(document.lineCount) // negative value means the line is empty (or contains a comment) and indent
// (denoted by absolute value) was deduced from enclosing non-empty lines
val myChars: CharSequence
init {
myChars = document.charsSequence
}
val myChars = document.charsSequence
/**
* Calculates line indents for the [target document][.myDocument].

View File

@ -1,19 +1,22 @@
package com.chylex.intellij.coloredbrackets.indents
import com.intellij.codeHighlighting.Pass
import com.intellij.codeHighlighting.TextEditorHighlightingPass
import com.intellij.codeHighlighting.TextEditorHighlightingPassFactory
import com.intellij.codeHighlighting.TextEditorHighlightingPassFactoryRegistrar
import com.intellij.codeHighlighting.TextEditorHighlightingPassRegistrar
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.editor.impl.ImaginaryEditor
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiFile
class RainbowIndentsPassFactory :
TextEditorHighlightingPassFactoryRegistrar, TextEditorHighlightingPassFactory {
override fun createHighlightingPass(file: PsiFile, editor: Editor): TextEditorHighlightingPass {
return RainbowIndentsPass(file.project, editor, file)
override fun createHighlightingPass(file: PsiFile, editor: Editor): RainbowIndentsPass? {
return when (editor) {
is ImaginaryEditor -> null
else -> RainbowIndentsPass(file.project, editor, file)
}
}
override fun registerHighlightingPassFactory(registrar: TextEditorHighlightingPassRegistrar, project: Project) {

View File

@ -18,18 +18,23 @@
]]></description>
<change-notes><![CDATA[
<b>1.1.0</b>
<b>Version 1.2.0</b>
<ul>
<li>Added support for C++ in Rider and CLion Nova</li>
<li>Fixed broken option to not color parentheses without content in C#</li>
<li>Improved highlighting performance</li>
<li>Increased default setting for maximum line count from 1K to 100K</li>
<li>Fixed not re-highlighting open files after changing settings.</li>
<li>Fixed exception when opening certain diff editors.</li>
</ul>
<b>1.0.0</b>
<b>Version 1.1.0</b>
<ul>
<li>Restored support for CLion and Rider</li>
<li>Added support for Settings Sync</li>
<li>Fixed service initialization warnings reported by IJ 2024.2+</li>
<li>Added support for C++ in Rider and CLion Nova.</li>
<li>Fixed broken option to not color parentheses without content in C#.</li>
<li>Improved highlighting performance.</li>
<li>Increased default setting for maximum line count from 1K to 100K.</li>
</ul>
<b>Version 1.0.0</b>
<ul>
<li>Restored support for CLion and Rider.</li>
<li>Added support for Settings Sync.</li>
<li>Fixed service initialization warnings reported by IJ 2024.2.</li>
</ul>
]]></change-notes>