Merge pull request #80085 from vnen/gdscript-pattern-guards
GDScript: Implement pattern guards for match statement
This commit is contained in:
@@ -0,0 +1,4 @@
|
||||
func test():
|
||||
match 0:
|
||||
_ when a == 0:
|
||||
print("a does not exist")
|
||||
@@ -0,0 +1,2 @@
|
||||
GDTEST_ANALYZER_ERROR
|
||||
Identifier "a" not declared in the current scope.
|
||||
@@ -0,0 +1,5 @@
|
||||
func test():
|
||||
var a = 0
|
||||
match a:
|
||||
0 when a = 1:
|
||||
print("assignment not allowed on pattern guard")
|
||||
@@ -0,0 +1,2 @@
|
||||
GDTEST_PARSER_ERROR
|
||||
Assignment is not allowed inside an expression.
|
||||
@@ -14,3 +14,7 @@ func test():
|
||||
|
||||
var TAU = "TAU"
|
||||
print(TAU)
|
||||
|
||||
# New keyword for pattern guards.
|
||||
var when = "when"
|
||||
print(when)
|
||||
|
||||
@@ -4,3 +4,4 @@ PI
|
||||
INF
|
||||
NAN
|
||||
TAU
|
||||
when
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
var global := 0
|
||||
|
||||
func test():
|
||||
var a = 0
|
||||
var b = 1
|
||||
|
||||
match a:
|
||||
0 when b == 0:
|
||||
print("does not run" if true else "")
|
||||
0 when b == 1:
|
||||
print("guards work")
|
||||
_:
|
||||
print("does not run")
|
||||
|
||||
match a:
|
||||
var a_bind when b == 0:
|
||||
prints("a is", a_bind, "and b is 0")
|
||||
var a_bind when b == 1:
|
||||
prints("a is", a_bind, "and b is 1")
|
||||
_:
|
||||
print("does not run")
|
||||
|
||||
match a:
|
||||
var a_bind when a_bind < 0:
|
||||
print("a is less than zero")
|
||||
var a_bind when a_bind == 0:
|
||||
print("a is equal to zero")
|
||||
_:
|
||||
print("a is more than zero")
|
||||
|
||||
match [1, 2, 3]:
|
||||
[1, 2, var element] when element == 0:
|
||||
print("does not run")
|
||||
[1, 2, var element] when element == 3:
|
||||
print("3rd element is 3")
|
||||
|
||||
match a:
|
||||
_ when b == 0:
|
||||
print("does not run")
|
||||
_ when b == 1:
|
||||
print("works with wildcard too.")
|
||||
_:
|
||||
print("does not run")
|
||||
|
||||
match a:
|
||||
0, 1 when b == 0:
|
||||
print("does not run")
|
||||
0, 1 when b == 1:
|
||||
print("guard with multiple patterns")
|
||||
_:
|
||||
print("does not run")
|
||||
|
||||
match a:
|
||||
0 when b == 0:
|
||||
print("does not run")
|
||||
0:
|
||||
print("regular pattern after guard mismatch")
|
||||
|
||||
match a:
|
||||
1 when side_effect():
|
||||
print("should not run the side effect call")
|
||||
0 when side_effect():
|
||||
print("will run the side effect call, but not this")
|
||||
_:
|
||||
assert(global == 1)
|
||||
print("side effect only ran once")
|
||||
|
||||
func side_effect():
|
||||
print("side effect")
|
||||
global += 1
|
||||
return false
|
||||
@@ -0,0 +1,10 @@
|
||||
GDTEST_OK
|
||||
guards work
|
||||
a is 0 and b is 1
|
||||
a is equal to zero
|
||||
3rd element is 3
|
||||
works with wildcard too.
|
||||
guard with multiple patterns
|
||||
regular pattern after guard mismatch
|
||||
side effect
|
||||
side effect only ran once
|
||||
Reference in New Issue
Block a user