mirror of
https://github.com/godotengine/godot.git
synced 2025-02-05 21:41:47 +08:00
GDScript: Allow boolean operators between any types
To make consistent with previous behavior. Mostly to be used in conditions for `if` and `while`.
This commit is contained in:
parent
a1e3ef919c
commit
d76b3f2a4c
@ -4846,6 +4846,17 @@ GDScriptParser::DataType GDScriptAnalyzer::get_operation_type(Variant::Operator
|
||||
}
|
||||
|
||||
GDScriptParser::DataType GDScriptAnalyzer::get_operation_type(Variant::Operator p_operation, const GDScriptParser::DataType &p_a, const GDScriptParser::DataType &p_b, bool &r_valid, const GDScriptParser::Node *p_source) {
|
||||
if (p_operation == Variant::OP_AND || p_operation == Variant::OP_OR) {
|
||||
// Those work for any type of argument and always return a boolean.
|
||||
// They don't use the Variant operator since they have short-circuit semantics.
|
||||
r_valid = true;
|
||||
GDScriptParser::DataType result;
|
||||
result.type_source = GDScriptParser::DataType::ANNOTATED_INFERRED;
|
||||
result.kind = GDScriptParser::DataType::BUILTIN;
|
||||
result.builtin_type = Variant::BOOL;
|
||||
return result;
|
||||
}
|
||||
|
||||
Variant::Type a_type = p_a.builtin_type;
|
||||
Variant::Type b_type = p_b.builtin_type;
|
||||
|
||||
|
@ -0,0 +1,347 @@
|
||||
extends Resource
|
||||
|
||||
signal foo
|
||||
|
||||
func test():
|
||||
var x
|
||||
# TYPE_NIL
|
||||
x = null
|
||||
prints("TYPE_NIL")
|
||||
prints(not x)
|
||||
prints(x and false)
|
||||
prints(x and true)
|
||||
prints(x or false)
|
||||
prints(x or true)
|
||||
|
||||
# TYPE_BOOL
|
||||
x = true
|
||||
prints("TYPE_BOOL")
|
||||
prints(not x)
|
||||
prints(x and false)
|
||||
prints(x and true)
|
||||
prints(x or false)
|
||||
prints(x or true)
|
||||
|
||||
# TYPE_INT
|
||||
x = 1
|
||||
prints("TYPE_INT")
|
||||
prints(not x)
|
||||
prints(x and false)
|
||||
prints(x and true)
|
||||
prints(x or false)
|
||||
prints(x or true)
|
||||
|
||||
# TYPE_FLOAT
|
||||
x = 1.1
|
||||
prints("TYPE_FLOAT")
|
||||
prints(not x)
|
||||
prints(x and false)
|
||||
prints(x and true)
|
||||
prints(x or false)
|
||||
prints(x or true)
|
||||
|
||||
# TYPE_STRING
|
||||
x = "foo"
|
||||
prints("TYPE_STRING")
|
||||
prints(not x)
|
||||
prints(x and false)
|
||||
prints(x and true)
|
||||
prints(x or false)
|
||||
prints(x or true)
|
||||
|
||||
# TYPE_VECTOR2
|
||||
x = Vector2(1, 1)
|
||||
prints("TYPE_VECTOR2")
|
||||
prints(not x)
|
||||
prints(x and false)
|
||||
prints(x and true)
|
||||
prints(x or false)
|
||||
prints(x or true)
|
||||
|
||||
# TYPE_VECTOR2I
|
||||
x = Vector2i(1, 1)
|
||||
prints("TYPE_VECTOR2I")
|
||||
prints(not x)
|
||||
prints(x and false)
|
||||
prints(x and true)
|
||||
prints(x or false)
|
||||
prints(x or true)
|
||||
|
||||
# TYPE_RECT2
|
||||
x = Rect2(1, 1, 1, 1)
|
||||
prints("TYPE_RECT2")
|
||||
prints(not x)
|
||||
prints(x and false)
|
||||
prints(x and true)
|
||||
prints(x or false)
|
||||
prints(x or true)
|
||||
|
||||
# TYPE_RECT2I
|
||||
x = Rect2i(1, 1, 1, 1)
|
||||
prints("TYPE_RECT2I")
|
||||
prints(not x)
|
||||
prints(x and false)
|
||||
prints(x and true)
|
||||
prints(x or false)
|
||||
prints(x or true)
|
||||
|
||||
# TYPE_VECTOR3
|
||||
x = Vector3(1, 1, 1)
|
||||
prints("TYPE_VECTOR3")
|
||||
prints(not x)
|
||||
prints(x and false)
|
||||
prints(x and true)
|
||||
prints(x or false)
|
||||
prints(x or true)
|
||||
|
||||
# TYPE_VECTOR3I
|
||||
x = Vector3i(1, 1, 1)
|
||||
prints("TYPE_VECTOR3I")
|
||||
prints(not x)
|
||||
prints(x and false)
|
||||
prints(x and true)
|
||||
prints(x or false)
|
||||
prints(x or true)
|
||||
|
||||
# TYPE_TRANSFORM2D
|
||||
x = Transform2D.IDENTITY
|
||||
prints("TYPE_TRANSFORM2D")
|
||||
prints(not x)
|
||||
prints(x and false)
|
||||
prints(x and true)
|
||||
prints(x or false)
|
||||
prints(x or true)
|
||||
|
||||
# TYPE_VECTOR4
|
||||
x = Vector4(1, 1, 1, 1)
|
||||
prints("TYPE_VECTOR4")
|
||||
prints(not x)
|
||||
prints(x and false)
|
||||
prints(x and true)
|
||||
prints(x or false)
|
||||
prints(x or true)
|
||||
|
||||
# TYPE_VECTOR4I
|
||||
x = Vector4i(1, 1, 1, 1)
|
||||
prints("TYPE_VECTOR4I")
|
||||
prints(not x)
|
||||
prints(x and false)
|
||||
prints(x and true)
|
||||
prints(x or false)
|
||||
prints(x or true)
|
||||
|
||||
# TYPE_PLANE
|
||||
x = Plane.PLANE_XY
|
||||
prints("TYPE_PLANE")
|
||||
prints(not x)
|
||||
prints(x and false)
|
||||
prints(x and true)
|
||||
prints(x or false)
|
||||
prints(x or true)
|
||||
|
||||
# TYPE_QUATERNION
|
||||
x = Quaternion.IDENTITY
|
||||
prints("TYPE_QUATERNION")
|
||||
prints(not x)
|
||||
prints(x and false)
|
||||
prints(x and true)
|
||||
prints(x or false)
|
||||
prints(x or true)
|
||||
|
||||
# TYPE_AABB
|
||||
x = AABB(Vector3.ONE, Vector3.ONE)
|
||||
prints("TYPE_AABB")
|
||||
prints(not x)
|
||||
prints(x and false)
|
||||
prints(x and true)
|
||||
prints(x or false)
|
||||
prints(x or true)
|
||||
|
||||
# TYPE_BASIS
|
||||
x = Basis.IDENTITY
|
||||
prints("TYPE_BASIS")
|
||||
prints(not x)
|
||||
prints(x and false)
|
||||
prints(x and true)
|
||||
prints(x or false)
|
||||
prints(x or true)
|
||||
|
||||
# TYPE_TRANSFORM3D
|
||||
x = Transform3D.IDENTITY
|
||||
prints("TYPE_TRANSFORM3D")
|
||||
prints(not x)
|
||||
prints(x and false)
|
||||
prints(x and true)
|
||||
prints(x or false)
|
||||
prints(x or true)
|
||||
|
||||
# TYPE_PROJECTION
|
||||
x = Projection.IDENTITY
|
||||
prints("TYPE_PROJECTION")
|
||||
prints(not x)
|
||||
prints(x and false)
|
||||
prints(x and true)
|
||||
prints(x or false)
|
||||
prints(x or true)
|
||||
|
||||
# TYPE_COLOR
|
||||
x = Color.WHITE
|
||||
prints("TYPE_COLOR")
|
||||
prints(not x)
|
||||
prints(x and false)
|
||||
prints(x and true)
|
||||
prints(x or false)
|
||||
prints(x or true)
|
||||
|
||||
# TYPE_STRING_NAME
|
||||
x = &"name"
|
||||
prints("TYPE_STRING_NAME")
|
||||
prints(not x)
|
||||
prints(x and false)
|
||||
prints(x and true)
|
||||
prints(x or false)
|
||||
prints(x or true)
|
||||
|
||||
# TYPE_NODE_PATH
|
||||
x = ^"path"
|
||||
prints("TYPE_NODE_PATH")
|
||||
prints(not x)
|
||||
prints(x and false)
|
||||
prints(x and true)
|
||||
prints(x or false)
|
||||
prints(x or true)
|
||||
|
||||
# TYPE_RID
|
||||
x = get_rid()
|
||||
prints("TYPE_RID")
|
||||
prints(not x)
|
||||
prints(x and false)
|
||||
prints(x and true)
|
||||
prints(x or false)
|
||||
prints(x or true)
|
||||
|
||||
# TYPE_OBJECT
|
||||
x = self
|
||||
prints("TYPE_OBJECT")
|
||||
prints(not x)
|
||||
prints(x and false)
|
||||
prints(x and true)
|
||||
prints(x or false)
|
||||
prints(x or true)
|
||||
|
||||
# TYPE_CALLABLE
|
||||
x = test
|
||||
prints("TYPE_CALLABLE")
|
||||
prints(not x)
|
||||
prints(x and false)
|
||||
prints(x and true)
|
||||
prints(x or false)
|
||||
prints(x or true)
|
||||
|
||||
# TYPE_SIGNAL
|
||||
x = foo
|
||||
prints("TYPE_SIGNAL")
|
||||
prints(not x)
|
||||
prints(x and false)
|
||||
prints(x and true)
|
||||
prints(x or false)
|
||||
prints(x or true)
|
||||
|
||||
# TYPE_DICTIONARY
|
||||
x = { a = 1}
|
||||
prints("TYPE_DICTIONARY")
|
||||
prints(not x)
|
||||
prints(x and false)
|
||||
prints(x and true)
|
||||
prints(x or false)
|
||||
prints(x or true)
|
||||
|
||||
# TYPE_ARRAY
|
||||
x = [1]
|
||||
prints("TYPE_ARRAY")
|
||||
prints(not x)
|
||||
prints(x and false)
|
||||
prints(x and true)
|
||||
prints(x or false)
|
||||
prints(x or true)
|
||||
|
||||
# TYPE_PACKED_BYTE_ARRAY
|
||||
x = PackedByteArray([1])
|
||||
prints("TYPE_PACKED_BYTE_ARRAY")
|
||||
prints(not x)
|
||||
prints(x and false)
|
||||
prints(x and true)
|
||||
prints(x or false)
|
||||
prints(x or true)
|
||||
|
||||
# TYPE_PACKED_INT32_ARRAY
|
||||
x = PackedInt32Array([1])
|
||||
prints("TYPE_PACKED_INT32_ARRAY")
|
||||
prints(not x)
|
||||
prints(x and false)
|
||||
prints(x and true)
|
||||
prints(x or false)
|
||||
prints(x or true)
|
||||
|
||||
# TYPE_PACKED_INT64_ARRAY
|
||||
x = PackedInt64Array([1])
|
||||
prints("TYPE_PACKED_INT64_ARRAY")
|
||||
prints(not x)
|
||||
prints(x and false)
|
||||
prints(x and true)
|
||||
prints(x or false)
|
||||
prints(x or true)
|
||||
|
||||
# TYPE_PACKED_FLOAT32_ARRAY
|
||||
x = PackedFloat32Array([1])
|
||||
prints("TYPE_PACKED_FLOAT32_ARRAY")
|
||||
prints(not x)
|
||||
prints(x and false)
|
||||
prints(x and true)
|
||||
prints(x or false)
|
||||
prints(x or true)
|
||||
|
||||
# TYPE_PACKED_FLOAT64_ARRAY
|
||||
x = PackedFloat64Array([1])
|
||||
prints("TYPE_PACKED_FLOAT64_ARRAY")
|
||||
prints(not x)
|
||||
prints(x and false)
|
||||
prints(x and true)
|
||||
prints(x or false)
|
||||
prints(x or true)
|
||||
|
||||
# TYPE_PACKED_STRING_ARRAY
|
||||
x = PackedStringArray(["1"])
|
||||
prints("TYPE_PACKED_STRING_ARRAY")
|
||||
prints(not x)
|
||||
prints(x and false)
|
||||
prints(x and true)
|
||||
prints(x or false)
|
||||
prints(x or true)
|
||||
|
||||
# TYPE_PACKED_VECTOR2_ARRAY
|
||||
x = PackedVector2Array([Vector2.ONE])
|
||||
prints("TYPE_PACKED_VECTOR2_ARRAY")
|
||||
prints(not x)
|
||||
prints(x and false)
|
||||
prints(x and true)
|
||||
prints(x or false)
|
||||
prints(x or true)
|
||||
|
||||
# TYPE_PACKED_VECTOR3_ARRAY
|
||||
x = PackedVector3Array([Vector3.ONE])
|
||||
prints("TYPE_PACKED_VECTOR3_ARRAY")
|
||||
prints(not x)
|
||||
prints(x and false)
|
||||
prints(x and true)
|
||||
prints(x or false)
|
||||
prints(x or true)
|
||||
|
||||
# TYPE_PACKED_COLOR_ARRAY
|
||||
x = PackedColorArray([Color.WHITE])
|
||||
prints("TYPE_PACKED_COLOR_ARRAY")
|
||||
prints(not x)
|
||||
prints(x and false)
|
||||
prints(x and true)
|
||||
prints(x or false)
|
||||
prints(x or true)
|
@ -0,0 +1,229 @@
|
||||
GDTEST_OK
|
||||
TYPE_NIL
|
||||
true
|
||||
false
|
||||
false
|
||||
false
|
||||
true
|
||||
TYPE_BOOL
|
||||
false
|
||||
false
|
||||
true
|
||||
true
|
||||
true
|
||||
TYPE_INT
|
||||
false
|
||||
false
|
||||
true
|
||||
true
|
||||
true
|
||||
TYPE_FLOAT
|
||||
false
|
||||
false
|
||||
true
|
||||
true
|
||||
true
|
||||
TYPE_STRING
|
||||
false
|
||||
false
|
||||
true
|
||||
true
|
||||
true
|
||||
TYPE_VECTOR2
|
||||
false
|
||||
false
|
||||
true
|
||||
true
|
||||
true
|
||||
TYPE_VECTOR2I
|
||||
false
|
||||
false
|
||||
true
|
||||
true
|
||||
true
|
||||
TYPE_RECT2
|
||||
false
|
||||
false
|
||||
true
|
||||
true
|
||||
true
|
||||
TYPE_RECT2I
|
||||
false
|
||||
false
|
||||
true
|
||||
true
|
||||
true
|
||||
TYPE_VECTOR3
|
||||
false
|
||||
false
|
||||
true
|
||||
true
|
||||
true
|
||||
TYPE_VECTOR3I
|
||||
false
|
||||
false
|
||||
true
|
||||
true
|
||||
true
|
||||
TYPE_TRANSFORM2D
|
||||
true
|
||||
false
|
||||
false
|
||||
false
|
||||
true
|
||||
TYPE_VECTOR4
|
||||
false
|
||||
false
|
||||
true
|
||||
true
|
||||
true
|
||||
TYPE_VECTOR4I
|
||||
false
|
||||
false
|
||||
true
|
||||
true
|
||||
true
|
||||
TYPE_PLANE
|
||||
false
|
||||
false
|
||||
true
|
||||
true
|
||||
true
|
||||
TYPE_QUATERNION
|
||||
true
|
||||
false
|
||||
false
|
||||
false
|
||||
true
|
||||
TYPE_AABB
|
||||
false
|
||||
false
|
||||
true
|
||||
true
|
||||
true
|
||||
TYPE_BASIS
|
||||
true
|
||||
false
|
||||
false
|
||||
false
|
||||
true
|
||||
TYPE_TRANSFORM3D
|
||||
true
|
||||
false
|
||||
false
|
||||
false
|
||||
true
|
||||
TYPE_PROJECTION
|
||||
true
|
||||
false
|
||||
false
|
||||
false
|
||||
true
|
||||
TYPE_COLOR
|
||||
false
|
||||
false
|
||||
true
|
||||
true
|
||||
true
|
||||
TYPE_STRING_NAME
|
||||
false
|
||||
false
|
||||
true
|
||||
true
|
||||
true
|
||||
TYPE_NODE_PATH
|
||||
false
|
||||
false
|
||||
true
|
||||
true
|
||||
true
|
||||
TYPE_RID
|
||||
true
|
||||
false
|
||||
false
|
||||
false
|
||||
true
|
||||
TYPE_OBJECT
|
||||
false
|
||||
false
|
||||
true
|
||||
true
|
||||
true
|
||||
TYPE_CALLABLE
|
||||
false
|
||||
false
|
||||
true
|
||||
true
|
||||
true
|
||||
TYPE_SIGNAL
|
||||
false
|
||||
false
|
||||
true
|
||||
true
|
||||
true
|
||||
TYPE_DICTIONARY
|
||||
false
|
||||
false
|
||||
true
|
||||
true
|
||||
true
|
||||
TYPE_ARRAY
|
||||
false
|
||||
false
|
||||
true
|
||||
true
|
||||
true
|
||||
TYPE_PACKED_BYTE_ARRAY
|
||||
false
|
||||
false
|
||||
true
|
||||
true
|
||||
true
|
||||
TYPE_PACKED_INT32_ARRAY
|
||||
false
|
||||
false
|
||||
true
|
||||
true
|
||||
true
|
||||
TYPE_PACKED_INT64_ARRAY
|
||||
false
|
||||
false
|
||||
true
|
||||
true
|
||||
true
|
||||
TYPE_PACKED_FLOAT32_ARRAY
|
||||
false
|
||||
false
|
||||
true
|
||||
true
|
||||
true
|
||||
TYPE_PACKED_FLOAT64_ARRAY
|
||||
false
|
||||
false
|
||||
true
|
||||
true
|
||||
true
|
||||
TYPE_PACKED_STRING_ARRAY
|
||||
false
|
||||
false
|
||||
true
|
||||
true
|
||||
true
|
||||
TYPE_PACKED_VECTOR2_ARRAY
|
||||
false
|
||||
false
|
||||
true
|
||||
true
|
||||
true
|
||||
TYPE_PACKED_VECTOR3_ARRAY
|
||||
false
|
||||
false
|
||||
true
|
||||
true
|
||||
true
|
||||
TYPE_PACKED_COLOR_ARRAY
|
||||
false
|
||||
false
|
||||
true
|
||||
true
|
||||
true
|
Loading…
Reference in New Issue
Block a user