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
}