Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support for references to color values in Dart #169

Merged
merged 4 commits into from
Sep 13, 2024
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Support for references to color values in Dart
  • Loading branch information
Lootwig committed Sep 5, 2024
commit ede2d0316f0a35e618c6b56f432d0fd7e8dff2cb
4 changes: 4 additions & 0 deletions docs/CHANGELOG.html
Original file line number Diff line number Diff line change
@@ -11,6 +11,10 @@ <h3>Removals</h3>
<h3>Other</h3>

<hr />
<h2>18.1.0</h2>
<h3>Features</h3>
<ul><li>Support colorizing references to <code>Color</code> instances in Dart</li></ul>

<h2>17.0.1</h2>

<h3>Fixes</h3>
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -53,7 +53,7 @@ pluginName=Color Highlighter
pluginSinceBuild=242.0000
pluginUntilBuild=261.*
pluginVerifierIdeVersions=2023.2
pluginVersion=18.0.0
pluginVersion=18.1.0
publishPassword=
publishToken=
publishUsername=Mallowigi
56 changes: 52 additions & 4 deletions src/main/java/com/mallowigi/visitors/DartVisitor.kt
Original file line number Diff line number Diff line change
@@ -29,13 +29,25 @@ package com.mallowigi.visitors
import com.intellij.codeInsight.daemon.impl.HighlightVisitor
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile
import com.intellij.psi.PsiWhiteSpace
import com.intellij.psi.impl.source.tree.LeafPsiElement
import com.intellij.psi.util.PsiUtilCore
import com.intellij.psi.util.childLeafs
import com.intellij.psi.util.firstLeaf
import com.intellij.psi.util.parentOfType
import com.jetbrains.lang.dart.DartTokenTypes
import com.jetbrains.lang.dart.psi.DartRecursiveVisitor
import com.jetbrains.lang.dart.psi.DartReference
import com.jetbrains.lang.dart.psi.DartVarDeclarationList
import com.jetbrains.lang.dart.psi.DartVarInit
import com.mallowigi.search.ColorSearchEngine
import org.rust.lang.core.psi.ext.descendantOfType
import org.toml.lang.psi.ext.elementType
import java.awt.Color

class DartVisitor : ColorVisitor() {

private val allowedTypes = setOf("REGULAR_STRING_PART", "NUMBER")
private val allowedTypes = setOf("REGULAR_STRING_PART", "NUMBER", "REFERENCE_EXPRESSION")

override fun clone(): HighlightVisitor = DartVisitor()

@@ -46,8 +58,44 @@ class DartVisitor : ColorVisitor() {
val type = PsiUtilCore.getElementType(element).toString()
if (type !in allowedTypes) return null

val value = element.text
return ColorSearchEngine.getColor(value, this)
if (element is DartReference) {
if (element.parentOfType<DartReference>()?.resolve() == element.resolve()) return null
return element.readReferencedValue()
} else {
return ColorSearchEngine.getColor(element.text, this)
}
}

}
private fun createVisitor(): ColorInitializer = ColorInitializer(this)

private fun DartReference.readReferencedValue(): Color? {
if (this.firstLeaf().let { it is LeafPsiElement && it.elementType == DartTokenTypes.IDENTIFIER }) {
val visitor = createVisitor()
this.resolve()?.let { visitor.visitElement(it) }
return visitor.result
}
return null
}
}


class ColorInitializer(private val visitor: DartVisitor) : DartRecursiveVisitor() {
var result: Color? = null

override fun visitElement(element: PsiElement) {
result =
element.parentOfType<DartVarDeclarationList>()?.descendantOfType<DartVarInit> { true }?.childLeafs()
?.filter { it !is PsiWhiteSpace && it.elementType != DartTokenTypes.EQ }?.withIndex()
?.filter { (index, value) ->
val elementType = PsiUtilCore.getElementType(value)
index == 0 && elementType == DartTokenTypes.IDENTIFIER ||
index == 2 && elementType == DartTokenTypes.NUMBER
}?.last()?.let {
ColorSearchEngine.getColor(
it.value.descendantOfType<LeafPsiElement> { true }!!.text,
visitor
)
}
if (result == null) element.acceptChildren(this) else return
}
}