override fun getColorFrom()

in gdscript/src/main/kotlin/gdscript/lineMarker/GdColorProvider.kt [16:70]


    override fun getColorFrom(element: PsiElement): Color? {
        if (element !is GdCallEx) return null

        try {
            val text = element.expr.text
            val parameters = element.argList?.argExprList ?: emptyList()
            parameters.forEach {
                if (it.expr !is GdLiteralEx) return null
            }

            if (text == "Color") {
                // Empty constructor defaults to Color.BLACK Color(0, 0, 0, 1)
                if (parameters.isEmpty()) return Color.BLACK
                if (parameters.first().returnType == GdKeywords.FLOAT) {
                    if (parameters.size <= 2) return null
                    return Color(
                        parameters[0].text.toFloat(),
                        parameters[1].text.toFloat(),
                        parameters[2].text.toFloat(),
                        parameters.getOrNull(3)?.text?.toFloat() ?: 1f,
                    )
                }
            } else if (text == "Color8") {
                if (parameters.size <= 2) return null
                return Color(
                    parameters[0].text.toInt(),
                    parameters[1].text.toInt(),
                    parameters[2].text.toInt(),
                    parameters.getOrNull(3)?.text?.toInt() ?: 255,
                )
            } else if ((text == "html" || text == "html_is_valid" || text == "hex") && GdClassMemberUtil.calledUpon(element)?.text == "Color") {
                var value = parameters.firstOrNull()?.text ?: "000"
                var alpha = "ff"
                if (text.startsWith("html")) {
                    value = value.trim('"').removePrefix("#")
                    if (value.length > 6) {
                        alpha = value.substring(6)
                        value = value.substring(0, 6)
                    }
                } else {
                    value = value.removePrefix("0x")
                    if (value.length > 6) {
                        alpha = value.substring(0, 2)
                        value = value.substring(2)
                    }
                }
                val intVal = Integer.decode("#$value")
                return Color(intVal shr 16 and 0xFF, intVal shr 8 and 0xFF, intVal and 0xFF, Integer.decode("#$alpha") and 0xFF)
            }
        } catch (e: Exception) {
            return null
        }

        return null
    }