Skip to content

Commit

Permalink
added external rules to parse inline body's (ie blocks)
Browse files Browse the repository at this point in the history
Still fails to parse the following:

    var p = func(): if true: pass else: pass
  • Loading branch information
PrestonKnopp committed Feb 8, 2023
1 parent 86e8d44 commit 6f615af
Show file tree
Hide file tree
Showing 5 changed files with 370 additions and 37 deletions.
251 changes: 227 additions & 24 deletions corpus/source.txt
Original file line number Diff line number Diff line change
Expand Up @@ -583,14 +583,6 @@ var x = func():

var x = func hello(): pass

func hello(p = func(): pass):
pass

hello(func(): pass)
hello(func():
pass
)

---

(source
Expand All @@ -613,34 +605,204 @@ hello(func():
(name)
(parameters)
(body
(pass_statement))))
(function_definition
(name)
(pass_statement)))))

=====================================
Functions Anonymous as a Parameter
=====================================

func hello(
p = func(): pass,
p = func name(a, b): a + b):
pass

func hello(a, p = func(a: int, b: int) -> int: a + b):
pass

---
(source
(function_definition (name)
(parameters
(default_parameter
(identifier)
(function_definition (parameters)
(body (pass_statement))))
(default_parameter
(identifier)
(function_definition (name)
(parameters (identifier) (identifier))
(body
(expression_statement
(binary_operator (identifier) (identifier)))))))
(body (pass_statement)))
(function_definition (name)
(parameters
(identifier)
(default_parameter
(identifier)
(function_definition
(parameters)
(parameters
(typed_parameter (identifier) (type))
(typed_parameter (identifier) (type)))
(return_type (type))
(body
(pass_statement)))))
(expression_statement
(binary_operator (identifier) (identifier)))))))
(body (pass_statement))))

=====================================
Functions Anonymous as only Arg
=====================================

hello(func(): pass)
hello(func():
pass
)

---

(source
(expression_statement
(call (identifier)
(argument_list
(function_definition (parameters)
(body (pass_statement))))))
(expression_statement
(call (identifier)
(argument_list
(function_definition (parameters)
(body (pass_statement)))))))

=====================================
Functions Anonymous as Arg
=====================================

hello(func(): var x = 1; x + 1, "")
hello(func():
return true,
"")

---

(source
(expression_statement
(call (identifier)
(argument_list
(function_definition (parameters)
(body
(variable_statement
(name)
(integer))
(expression_statement
(binary_operator
(identifier)
(integer)))))
(string))))
(expression_statement
(call (identifier)
(argument_list
(function_definition (parameters)
(body
(return_statement (true))))
(string)))))


=====================================
Functions Body
=====================================

func hello(): return
func hello(): return null
func hello(): x += 1; return x
func hello(): var x: int = 0; x += 1; return x;

---

(source
(function_definition
(name)
(parameters)
(body
(pass_statement)))
(return_statement)))
(function_definition
(name)
(parameters)
(body
(return_statement (null))))
(function_definition
(name)
(parameters)
(body
(expression_statement
(augmented_assignment
(identifier)
(integer)))
(return_statement (identifier))))
(function_definition
(name)
(parameters)
(body
(variable_statement
(name)
(type)
(integer))
(expression_statement
(augmented_assignment
(identifier)
(integer)))
(return_statement (identifier)))))

=====================================
Functions Body Indent
=====================================

take(func name() -> T:
1 + 1; pass
, "")

take(func name():
1 + 1; pass, "")

take(func name():
1 + 1
return 1
pass
,
""
)

---

(source
(expression_statement
(call
(identifier)
(call (identifier)
(argument_list
(function_definition
(parameters)
(function_definition (name) (parameters) (return_type (type))
(body
(pass_statement))))))
(expression_statement
(binary_operator (integer) (integer)))
(pass_statement)))
(string))))
(expression_statement
(call
(identifier)
(call (identifier)
(argument_list
(function_definition
(parameters)
(function_definition (name) (parameters)
(body
(pass_statement)))))))
(expression_statement
(binary_operator (integer) (integer)))
(pass_statement)))
(string))))
(expression_statement
(call (identifier)
(argument_list
(function_definition (name) (parameters)
(body
(expression_statement
(binary_operator (integer) (integer)))
(return_statement (integer))
(pass_statement)))
(string)))))

=====================================
Constructor Definitions
=====================================
Expand Down Expand Up @@ -733,6 +895,47 @@ x['s'].y.z[0]
(expression_statement (attribute (subscript (identifier) (string)) (identifier) (attribute_subscript (identifier) (integer))))
)

=====================================
If Statements
=====================================

if (func lambda(): pass):
pass; pass
return true
elif true: var x = 1; x + 1; x += 2; return (func(): x)
else: pass; pass

---

(source
(if_statement
(parenthesized_expression
(function_definition (name) (parameters)
(body
(pass_statement))))
(body
(pass_statement)
(pass_statement)
(return_statement (true)))
(elif_clause
(true)
(body
(variable_statement (name) (integer))
(expression_statement
(binary_operator (identifier) (integer)))
(expression_statement
(augmented_assignment (identifier) (integer)))
(return_statement
(parenthesized_expression
(function_definition (parameters)
(body
(expression_statement
(identifier))))))))
(else_clause
(body
(pass_statement)
(pass_statement)))))

=====================================
Match Statements
=====================================
Expand Down
18 changes: 18 additions & 0 deletions examples/indent.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
take(func name():
print('hello')
return 1
pass
1 + 1
,
""
)

take(func name():
1 + 1; pass
, "")

take(func name():
pass
pass, "")

take(func name(): "")
62 changes: 62 additions & 0 deletions examples/lambda.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
# Verified with v4.0.beta17.official [c40020513]

# FIXME: tree-sitter-gdscript can't parse this yet.
var p = func(): if true: pass else: pass
# If stmts can be inline. (They do not eval to their last expr.)
t(func(): if true: 'string' else: 100)



# GDScript v2 cannot parse this:
#if true: print(1); print(2) else: print(3); print(4)

# But, can parse this:
# prints:
# 1
# 2
var p = func(): if true: print(1); print(2) else: print(3); print(4)

# prints:
# outer 3
#var c = func(): if true: if false: print('inner 1'); print('inner 2') else: print('outer 3') else: print(4)

# some whitespace handling between statement groups.
# returns: 2
var x = func hello(): var b = 2; return b;

if true: print('a') ; print('b');
else: print('c'); var a: int = 0; a + 1; return a
# prints:
# a
# b

# func bodies end at a comma. remaining args can follow.
# no newline needed.
take(func(): var a = 2; return x, 1)
take(func():
print("hello world")
pass, "")

# func bodies also end at a paren.
t(func():
print('hello')
1 + 1)

# These are valid.
t(func():
pass
)

t(
func(): pass,
func():
pass
)

# types can be specified
var d = func(hello: int, string: String) -> int:
return string.length() + hello

t(func name(a: int, b: int) -> int: return a + b)
t(func name(a: int, b: int) -> int:
return a + b, "last argument")
Loading

0 comments on commit 6f615af

Please sign in to comment.