fun typeAccepts()

in gdscript/src/main/kotlin/gdscript/psi/utils/GdExprUtil.kt [16:55]


    fun typeAccepts(from: String, into: String, project: Project): Boolean {
        if (from == into) return true
        if (from.isBlank() || into.isBlank()) return true
        if (into == "void") return false

        // left = right
        var left = into
        var right = from

        var arrays = 0
        if (from.startsWith("Array")) arrays++
        if (into.startsWith("Array")) arrays++

        if (arrays > 1) {
            left = left.parseFromSquare()
            right = right.parseFromSquare()
        }

        if (allowedExceptions(left, right, project)) return true

        val classId = GdClassUtil.getClassIdElement(left, project) ?: return true
        val classElement = GdClassUtil.getOwningClassElement(classId)

        // Constructor
        // todo: here it is too permissive, just checks that there is a ctor, which accepts "right" type as a first arg - doesn't make sense to me
        GdClassMemberUtil
            .listClassMemberDeclarations(classElement, constructors = true)
            .constructors()
            .forEach {
                if (it.parameters.firstOrNull()?.value == right) return true
            }

        // Inheritance
        val currentClassId = GdClassUtil.getClassIdElement(right, project) ?: return true
        val currentClassElement = GdClassUtil.getOwningClassElement(currentClassId)

        if (GdInheritanceUtil.isExtending(currentClassElement, left)) return true

        return false
    }