override fun setColorTo()

in gdscript/src/main/kotlin/gdscript/lineMarker/GdColorProvider.kt [72:119]


    override fun setColorTo(element: PsiElement, color: Color) {
        if (element !is GdCallEx) return

        val text = element.expr.text
        val toReplace = PsiTreeUtil.getChildOfType(element, GdArgList::class.java)

        val exprValue = when (text) {
            "Color" -> {
                if (color == Color.BLACK) {
                    toReplace?.delete()
                    return
                }

                val alpha = if (color.alpha == 255) "" else ", ${color.alpha / 255f}"
                "Color(${color.red / 255f}, ${color.green / 255f}, ${color.blue / 255f}$alpha)"
            }
            "Color8" -> {
                val alpha = if (color.alpha == 255) "" else ", ${color.alpha}"
                "Color(${color.red}, ${color.green}, ${color.blue}$alpha)"
            }
            "html", "html_is_valid", "hex" -> {
                if (GdClassMemberUtil.calledUpon(element)?.text == "Color") {
                    val value = if (text == "hex") {
                        // Color.hex(0xbbefd2a4)
                        "0x${Integer.toHexString(color.rgb).trimStart('#')}"
                    } else {
                        // Required manually as color.rgb puts alpha at first instead of last
                        var hex = Integer.toHexString((color.red shl 24) + (color.green shl 16) + (color.blue shl 8) + color.alpha)
                        if (hex.length % 2 == 1) hex = "0$hex"
                        "\"#$hex\""
                    }
                    "Color.$text($value)"
                } else null
            }
            else -> null
        } ?: return

        val arguments = PsiTreeUtil.findChildOfType(
            GdElementFactory.callExpr(element.project, exprValue), GdArgList::class.java
        ) ?: return

        if (toReplace != null) {
            toReplace.replace(arguments)
            return
        }

        element.addBefore(arguments, element.lastChild)
    }