aboutsummaryrefslogtreecommitdiff
path: root/tools/tree-sitter/test
diff options
context:
space:
mode:
Diffstat (limited to 'tools/tree-sitter/test')
-rw-r--r--tools/tree-sitter/test/corpus/aliased_type_constant.txt50
-rw-r--r--tools/tree-sitter/test/corpus/assign_record_to_base.txt61
-rw-r--r--tools/tree-sitter/test/corpus/compile_time_array_length.txt39
-rw-r--r--tools/tree-sitter/test/corpus/const_alias.txt45
-rw-r--r--tools/tree-sitter/test/corpus/const_element_array.txt47
-rw-r--r--tools/tree-sitter/test/corpus/const_extern.txt21
-rw-r--r--tools/tree-sitter/test/corpus/const_negation.txt49
-rw-r--r--tools/tree-sitter/test/corpus/const_var_chain.txt37
-rw-r--r--tools/tree-sitter/test/corpus/double_literals.txt56
-rw-r--r--tools/tree-sitter/test/corpus/empty_proc.txt21
-rw-r--r--tools/tree-sitter/test/corpus/empty_proc_type_expression.txt21
-rw-r--r--tools/tree-sitter/test/corpus/empty_statements_in_a_row.txt24
-rw-r--r--tools/tree-sitter/test/corpus/generic_alias.txt132
-rw-r--r--tools/tree-sitter/test/corpus/generic_arguments.txt167
-rw-r--r--tools/tree-sitter/test/corpus/generic_base_chain.txt144
-rw-r--r--tools/tree-sitter/test/corpus/generic_const_inference.txt204
-rw-r--r--tools/tree-sitter/test/corpus/generic_inference.txt157
-rw-r--r--tools/tree-sitter/test/corpus/generic_pointee.txt71
-rw-r--r--tools/tree-sitter/test/corpus/noreturn_procedure.txt23
-rw-r--r--tools/tree-sitter/test/corpus/opaque_type.txt65
-rw-r--r--tools/tree-sitter/test/corpus/pointer_cast.txt38
-rw-r--r--tools/tree-sitter/test/corpus/pointer_const_conversion.txt32
-rw-r--r--tools/tree-sitter/test/corpus/pointer_subtraction.txt32
-rw-r--r--tools/tree-sitter/test/corpus/procedure_forward_reference.txt40
-rw-r--r--tools/tree-sitter/test/corpus/record_const_base.txt76
-rw-r--r--tools/tree-sitter/test/corpus/self-referencing-record.txt27
-rw-r--r--tools/tree-sitter/test/corpus/semicolon_parameter_separator.txt29
-rw-r--r--tools/tree-sitter/test/corpus/single_literals.txt56
-rw-r--r--tools/tree-sitter/test/corpus/slice_index.txt58
-rw-r--r--tools/tree-sitter/test/corpus/take_const_address.txt35
-rw-r--r--tools/tree-sitter/test/corpus/trailing_text.txt16
-rw-r--r--tools/tree-sitter/test/corpus/traits_size.txt93
32 files changed, 1966 insertions, 0 deletions
diff --git a/tools/tree-sitter/test/corpus/aliased_type_constant.txt b/tools/tree-sitter/test/corpus/aliased_type_constant.txt
new file mode 100644
index 0000000..589c756
--- /dev/null
+++ b/tools/tree-sitter/test/corpus/aliased_type_constant.txt
@@ -0,0 +1,50 @@
+==================
+aliased_type_constant
+==================
+
+module
+
+type
+ Handle = Int
+
+var
+ limit: const Int := 1
+
+proc check()
+begin
+ assert(limit = 1)
+return
+
+end.
+
+---
+
+(source_file
+ (module_declaration
+ (type_section
+ (type_declaration
+ (identifier_definition
+ (identifier))
+ (identifier)))
+ (var_section
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (const_type
+ (identifier))
+ (literal
+ (integer))))
+ (procedure_declaration
+ (identifier_definition
+ (identifier))
+ (parameter_list)
+ (procedure_body
+ (block
+ (call_expression
+ (identifier)
+ (argument_list
+ (binary_expression
+ (identifier)
+ (literal
+ (integer))))))
+ (return_clause)))))
diff --git a/tools/tree-sitter/test/corpus/assign_record_to_base.txt b/tools/tree-sitter/test/corpus/assign_record_to_base.txt
new file mode 100644
index 0000000..6488889
--- /dev/null
+++ b/tools/tree-sitter/test/corpus/assign_record_to_base.txt
@@ -0,0 +1,61 @@
+==================
+assign_record_to_base
+==================
+
+program()
+type
+ B = record
+ x: Int
+ end
+ R = record(B)
+ y: Int
+ end
+
+var
+ x: ^B := nil
+ y: ^R := nil
+
+begin
+ x := y
+end.
+
+---
+
+(source_file
+ (program_declaration
+ (type_section
+ (type_declaration
+ (identifier_definition
+ (identifier))
+ (record_type
+ (field_declaration
+ (identifier_definition
+ (identifier))
+ (identifier))))
+ (type_declaration
+ (identifier_definition
+ (identifier))
+ (record_type
+ (identifier)
+ (field_declaration
+ (identifier_definition
+ (identifier))
+ (identifier)))))
+ (var_section
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (pointer_type
+ (identifier))
+ (literal
+ (nil)))
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (pointer_type
+ (identifier))
+ (literal
+ (nil))))
+ (assignment_statement
+ (identifier)
+ (identifier))))
diff --git a/tools/tree-sitter/test/corpus/compile_time_array_length.txt b/tools/tree-sitter/test/corpus/compile_time_array_length.txt
new file mode 100644
index 0000000..0e250f2
--- /dev/null
+++ b/tools/tree-sitter/test/corpus/compile_time_array_length.txt
@@ -0,0 +1,39 @@
+==================
+compile_time_array_length
+==================
+
+module
+
+var
+ source: const [3]Int := [1, 2, 3]
+ target: Word := source.length
+
+end.
+
+---
+
+(source_file
+ (module_declaration
+ (var_section
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (const_type
+ (array_type
+ (literal
+ (integer))
+ (identifier)))
+ (array_constructor
+ (literal
+ (integer))
+ (literal
+ (integer))
+ (literal
+ (integer))))
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (identifier)
+ (field_expression
+ (identifier)
+ (identifier))))))
diff --git a/tools/tree-sitter/test/corpus/const_alias.txt b/tools/tree-sitter/test/corpus/const_alias.txt
new file mode 100644
index 0000000..ae19588
--- /dev/null
+++ b/tools/tree-sitter/test/corpus/const_alias.txt
@@ -0,0 +1,45 @@
+==================
+const_alias
+==================
+
+module
+
+type
+ CI = const Int
+ CCI = const CI
+
+var
+ x: CCI := 8
+ y: const CI := 9
+
+end.
+
+---
+
+(source_file
+ (module_declaration
+ (type_section
+ (type_declaration
+ (identifier_definition
+ (identifier))
+ (const_type
+ (identifier)))
+ (type_declaration
+ (identifier_definition
+ (identifier))
+ (const_type
+ (identifier))))
+ (var_section
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (identifier)
+ (literal
+ (integer)))
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (const_type
+ (identifier))
+ (literal
+ (integer))))))
diff --git a/tools/tree-sitter/test/corpus/const_element_array.txt b/tools/tree-sitter/test/corpus/const_element_array.txt
new file mode 100644
index 0000000..e43c2f1
--- /dev/null
+++ b/tools/tree-sitter/test/corpus/const_element_array.txt
@@ -0,0 +1,47 @@
+==================
+const_element_array
+==================
+
+module
+
+type
+ CI = const Int
+
+var
+ a: [3]CI := [1, 2, 3]
+ b: [3]CI
+
+end.
+
+---
+
+(source_file
+ (module_declaration
+ (type_section
+ (type_declaration
+ (identifier_definition
+ (identifier))
+ (const_type
+ (identifier))))
+ (var_section
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (array_type
+ (literal
+ (integer))
+ (identifier))
+ (array_constructor
+ (literal
+ (integer))
+ (literal
+ (integer))
+ (literal
+ (integer))))
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (array_type
+ (literal
+ (integer))
+ (identifier))))))
diff --git a/tools/tree-sitter/test/corpus/const_extern.txt b/tools/tree-sitter/test/corpus/const_extern.txt
new file mode 100644
index 0000000..0fb71bc
--- /dev/null
+++ b/tools/tree-sitter/test/corpus/const_extern.txt
@@ -0,0 +1,21 @@
+==================
+const_extern
+==================
+
+module
+
+var
+ errno_like: const Int := extern
+
+end.
+
+---
+
+(source_file
+ (module_declaration
+ (var_section
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (const_type
+ (identifier))))))
diff --git a/tools/tree-sitter/test/corpus/const_negation.txt b/tools/tree-sitter/test/corpus/const_negation.txt
new file mode 100644
index 0000000..89e801c
--- /dev/null
+++ b/tools/tree-sitter/test/corpus/const_negation.txt
@@ -0,0 +1,49 @@
+==================
+const_negation
+==================
+
+program()
+var
+ x: const Int := -5
+ y: const Int := -x
+
+begin
+ assert(x = -5);
+ assert(y = 5);
+end.
+
+---
+
+(source_file
+ (program_declaration
+ (var_section
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (const_type
+ (identifier))
+ (unary_expression
+ (literal
+ (integer))))
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (const_type
+ (identifier))
+ (unary_expression
+ (identifier))))
+ (call_expression
+ (identifier)
+ (argument_list
+ (binary_expression
+ (identifier)
+ (unary_expression
+ (literal
+ (integer))))))
+ (call_expression
+ (identifier)
+ (argument_list
+ (binary_expression
+ (identifier)
+ (literal
+ (integer)))))))
diff --git a/tools/tree-sitter/test/corpus/const_var_chain.txt b/tools/tree-sitter/test/corpus/const_var_chain.txt
new file mode 100644
index 0000000..fca40c9
--- /dev/null
+++ b/tools/tree-sitter/test/corpus/const_var_chain.txt
@@ -0,0 +1,37 @@
+==================
+const_var_chain
+==================
+
+program()
+var
+ x: const Int := 42
+ y: Int := x
+
+begin
+ assert(y = 42)
+end.
+
+---
+
+(source_file
+ (program_declaration
+ (var_section
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (const_type
+ (identifier))
+ (literal
+ (integer)))
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (identifier)
+ (identifier)))
+ (call_expression
+ (identifier)
+ (argument_list
+ (binary_expression
+ (identifier)
+ (literal
+ (integer)))))))
diff --git a/tools/tree-sitter/test/corpus/double_literals.txt b/tools/tree-sitter/test/corpus/double_literals.txt
new file mode 100644
index 0000000..9dc7cc1
--- /dev/null
+++ b/tools/tree-sitter/test/corpus/double_literals.txt
@@ -0,0 +1,56 @@
+==================
+double_literals
+==================
+
+module
+
+proc f()
+var
+ x: const Double := 3.14
+ y: const Double := 1e10
+ z: const Double := 4.567e8
+ t: const Double := 2.5E-3
+return
+
+end.
+
+---
+
+(source_file
+ (module_declaration
+ (procedure_declaration
+ (identifier_definition
+ (identifier))
+ (parameter_list)
+ (procedure_body
+ (block
+ (var_section
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (const_type
+ (identifier))
+ (literal
+ (float)))
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (const_type
+ (identifier))
+ (literal
+ (float)))
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (const_type
+ (identifier))
+ (literal
+ (float)))
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (const_type
+ (identifier))
+ (literal
+ (float)))))
+ (return_clause)))))
diff --git a/tools/tree-sitter/test/corpus/empty_proc.txt b/tools/tree-sitter/test/corpus/empty_proc.txt
new file mode 100644
index 0000000..338c2fb
--- /dev/null
+++ b/tools/tree-sitter/test/corpus/empty_proc.txt
@@ -0,0 +1,21 @@
+==================
+empty_proc
+==================
+
+module
+
+proc f()
+return
+
+end.
+
+---
+
+(source_file
+ (module_declaration
+ (procedure_declaration
+ (identifier_definition
+ (identifier))
+ (parameter_list)
+ (procedure_body
+ (return_clause)))))
diff --git a/tools/tree-sitter/test/corpus/empty_proc_type_expression.txt b/tools/tree-sitter/test/corpus/empty_proc_type_expression.txt
new file mode 100644
index 0000000..3d259a4
--- /dev/null
+++ b/tools/tree-sitter/test/corpus/empty_proc_type_expression.txt
@@ -0,0 +1,21 @@
+==================
+empty_proc_type_expression
+==================
+
+module
+
+type
+ P = proc()
+
+end.
+
+---
+
+(source_file
+ (module_declaration
+ (type_section
+ (type_declaration
+ (identifier_definition
+ (identifier))
+ (procedure_type
+ (parameter_list))))))
diff --git a/tools/tree-sitter/test/corpus/empty_statements_in_a_row.txt b/tools/tree-sitter/test/corpus/empty_statements_in_a_row.txt
new file mode 100644
index 0000000..98700ae
--- /dev/null
+++ b/tools/tree-sitter/test/corpus/empty_statements_in_a_row.txt
@@ -0,0 +1,24 @@
+==================
+empty_statements_in_a_row
+==================
+
+module
+
+proc f()
+begin
+ ;
+return
+
+end.
+
+---
+
+(source_file
+ (module_declaration
+ (procedure_declaration
+ (identifier_definition
+ (identifier))
+ (parameter_list)
+ (procedure_body
+ (block)
+ (return_clause)))))
diff --git a/tools/tree-sitter/test/corpus/generic_alias.txt b/tools/tree-sitter/test/corpus/generic_alias.txt
new file mode 100644
index 0000000..54a8ea2
--- /dev/null
+++ b/tools/tree-sitter/test/corpus/generic_alias.txt
@@ -0,0 +1,132 @@
+==================
+generic_alias
+==================
+
+program()
+type
+ File = record
+ fd: Int
+ end
+
+ Node#[T] = record
+ next: ^Node#[T];
+ value: ^T
+ end
+
+ Ref#[T] = ^T
+
+ Boxed#[V] = record
+ inner: ^Node#[V]
+ end
+
+var
+ chain: Node#[File]
+ aliased: Ref#[File]
+ raw: ^File
+ boxed: Boxed#[File]
+
+begin
+ chain.next := nil;
+ aliased := raw;
+ raw := aliased;
+ boxed.inner := @chain
+end.
+
+---
+
+(source_file
+ (program_declaration
+ (type_section
+ (type_declaration
+ (identifier_definition
+ (identifier))
+ (record_type
+ (field_declaration
+ (identifier_definition
+ (identifier))
+ (identifier))))
+ (type_declaration
+ (identifier_definition
+ (identifier))
+ (type_parameters
+ (identifier))
+ (record_type
+ (field_declaration
+ (identifier_definition
+ (identifier))
+ (pointer_type
+ (generic_type
+ (identifier)
+ (type_arguments
+ (identifier)))))
+ (field_declaration
+ (identifier_definition
+ (identifier))
+ (pointer_type
+ (identifier)))))
+ (type_declaration
+ (identifier_definition
+ (identifier))
+ (type_parameters
+ (identifier))
+ (pointer_type
+ (identifier)))
+ (type_declaration
+ (identifier_definition
+ (identifier))
+ (type_parameters
+ (identifier))
+ (record_type
+ (field_declaration
+ (identifier_definition
+ (identifier))
+ (pointer_type
+ (generic_type
+ (identifier)
+ (type_arguments
+ (identifier))))))))
+ (var_section
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (generic_type
+ (identifier)
+ (type_arguments
+ (identifier))))
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (generic_type
+ (identifier)
+ (type_arguments
+ (identifier))))
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (pointer_type
+ (identifier)))
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (generic_type
+ (identifier)
+ (type_arguments
+ (identifier)))))
+ (assignment_statement
+ (field_expression
+ (identifier)
+ (identifier))
+ (literal
+ (nil)))
+ (assignment_statement
+ (identifier)
+ (identifier))
+ (assignment_statement
+ (identifier)
+ (identifier))
+ (assignment_statement
+ (field_expression
+ (identifier)
+ (identifier))
+ (unary_expression
+ (identifier)))))
diff --git a/tools/tree-sitter/test/corpus/generic_arguments.txt b/tools/tree-sitter/test/corpus/generic_arguments.txt
new file mode 100644
index 0000000..3f325de
--- /dev/null
+++ b/tools/tree-sitter/test/corpus/generic_arguments.txt
@@ -0,0 +1,167 @@
+==================
+generic_arguments
+==================
+
+program()
+type
+ File = record
+ fd: Int
+ end
+
+ Pair#[K, V] = record
+ key: ^K;
+ value: ^V
+ end
+
+var
+ entry: Pair#[File, Word8]
+
+proc allocate#[T](size: Word) -> ^T
+extern
+
+proc first#[K, V](entry_ptr: ^Pair#[K, V]) -> ^K
+return entry_ptr^.key
+
+begin
+ entry.key := allocate#[File](#size(File));
+ assert(#size(Pair#[File, Word8]) = #size(Pointer) * 2u);
+ assert(#offset(Pair#[File, Word8], value) = #size(Pointer));
+ assert(first#[File, Word8](@entry) = entry.key)
+end.
+
+---
+
+(source_file
+ (program_declaration
+ (type_section
+ (type_declaration
+ (identifier_definition
+ (identifier))
+ (record_type
+ (field_declaration
+ (identifier_definition
+ (identifier))
+ (identifier))))
+ (type_declaration
+ (identifier_definition
+ (identifier))
+ (type_parameters
+ (identifier)
+ (identifier))
+ (record_type
+ (field_declaration
+ (identifier_definition
+ (identifier))
+ (pointer_type
+ (identifier)))
+ (field_declaration
+ (identifier_definition
+ (identifier))
+ (pointer_type
+ (identifier))))))
+ (var_section
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (generic_type
+ (identifier)
+ (type_arguments
+ (identifier)
+ (identifier)))))
+ (procedure_declaration
+ (identifier_definition
+ (identifier))
+ (type_parameters
+ (identifier))
+ (parameter_list
+ (field_declaration
+ (identifier_definition
+ (identifier))
+ (identifier)))
+ (pointer_type
+ (identifier)))
+ (procedure_declaration
+ (identifier_definition
+ (identifier))
+ (type_parameters
+ (identifier)
+ (identifier))
+ (parameter_list
+ (field_declaration
+ (identifier_definition
+ (identifier))
+ (pointer_type
+ (generic_type
+ (identifier)
+ (type_arguments
+ (identifier)
+ (identifier))))))
+ (pointer_type
+ (identifier))
+ (procedure_body
+ (return_clause
+ (field_expression
+ (dereference_expression
+ (identifier))
+ (identifier)))))
+ (assignment_statement
+ (field_expression
+ (identifier)
+ (identifier))
+ (call_expression
+ (generic_type
+ (identifier)
+ (type_arguments
+ (identifier)))
+ (argument_list
+ (traits_expression
+ (trait)
+ (identifier)))))
+ (call_expression
+ (identifier)
+ (argument_list
+ (binary_expression
+ (traits_expression
+ (trait)
+ (generic_type
+ (identifier)
+ (type_arguments
+ (identifier)
+ (identifier))))
+ (binary_expression
+ (traits_expression
+ (trait)
+ (identifier))
+ (literal
+ (integer))))))
+ (call_expression
+ (identifier)
+ (argument_list
+ (binary_expression
+ (traits_expression
+ (trait)
+ (generic_type
+ (identifier)
+ (type_arguments
+ (identifier)
+ (identifier)))
+ (identifier))
+ (traits_expression
+ (trait)
+ (identifier)))))
+ (call_expression
+ (identifier)
+ (argument_list
+ (binary_expression
+ (call_expression
+ (generic_type
+ (identifier)
+ (type_arguments
+ (identifier)
+ (identifier)))
+ (argument_list
+ (unary_expression
+ (identifier))))
+ (field_expression
+ (identifier)
+ (identifier)))))))
diff --git a/tools/tree-sitter/test/corpus/generic_base_chain.txt b/tools/tree-sitter/test/corpus/generic_base_chain.txt
new file mode 100644
index 0000000..770b7db
--- /dev/null
+++ b/tools/tree-sitter/test/corpus/generic_base_chain.txt
@@ -0,0 +1,144 @@
+==================
+generic_base_chain
+==================
+
+program()
+type
+ File = record
+ fd: Int
+ end
+
+ Map#[K, V] = record
+ key: ^K;
+ value: ^V
+ end
+
+ Cache#[K, V] = record(Map#[Word8, V])
+ newest: ^K
+ end
+
+var
+ store: Cache#[Int, File]
+ byte_key: ^Word8
+ upcast: ^Map#[Word8, File]
+
+proc put#[K2, V2](target: ^Map#[K2, V2]; key: ^K2)
+begin
+ target^.key := key
+return
+
+begin
+ upcast := @store;
+ put(@store, byte_key)
+end.
+
+---
+
+(source_file
+ (program_declaration
+ (type_section
+ (type_declaration
+ (identifier_definition
+ (identifier))
+ (record_type
+ (field_declaration
+ (identifier_definition
+ (identifier))
+ (identifier))))
+ (type_declaration
+ (identifier_definition
+ (identifier))
+ (type_parameters
+ (identifier)
+ (identifier))
+ (record_type
+ (field_declaration
+ (identifier_definition
+ (identifier))
+ (pointer_type
+ (identifier)))
+ (field_declaration
+ (identifier_definition
+ (identifier))
+ (pointer_type
+ (identifier)))))
+ (type_declaration
+ (identifier_definition
+ (identifier))
+ (type_parameters
+ (identifier)
+ (identifier))
+ (record_type
+ (generic_type
+ (identifier)
+ (type_arguments
+ (identifier)
+ (identifier)))
+ (field_declaration
+ (identifier_definition
+ (identifier))
+ (pointer_type
+ (identifier))))))
+ (var_section
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (generic_type
+ (identifier)
+ (type_arguments
+ (identifier)
+ (identifier))))
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (pointer_type
+ (identifier)))
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (pointer_type
+ (generic_type
+ (identifier)
+ (type_arguments
+ (identifier)
+ (identifier))))))
+ (procedure_declaration
+ (identifier_definition
+ (identifier))
+ (type_parameters
+ (identifier)
+ (identifier))
+ (parameter_list
+ (field_declaration
+ (identifier_definition
+ (identifier))
+ (pointer_type
+ (generic_type
+ (identifier)
+ (type_arguments
+ (identifier)
+ (identifier)))))
+ (field_declaration
+ (identifier_definition
+ (identifier))
+ (pointer_type
+ (identifier))))
+ (procedure_body
+ (block
+ (assignment_statement
+ (field_expression
+ (dereference_expression
+ (identifier))
+ (identifier))
+ (identifier)))
+ (return_clause)))
+ (assignment_statement
+ (identifier)
+ (unary_expression
+ (identifier)))
+ (call_expression
+ (identifier)
+ (argument_list
+ (unary_expression
+ (identifier))
+ (identifier)))))
diff --git a/tools/tree-sitter/test/corpus/generic_const_inference.txt b/tools/tree-sitter/test/corpus/generic_const_inference.txt
new file mode 100644
index 0000000..e4b5bf9
--- /dev/null
+++ b/tools/tree-sitter/test/corpus/generic_const_inference.txt
@@ -0,0 +1,204 @@
+==================
+generic_const_inference
+==================
+
+program()
+type
+ ConstAlias = const ^Word8
+ BasePtr = ^Word8
+ NestedConst = const BasePtr
+
+var
+ slice: []const Word8
+ aliased: ConstAlias := nil
+ nested: NestedConst := nil
+ direct_const: const ^Word8 := nil
+
+proc write#[T](fd: Int; buf: ^T; count: Int) -> Int
+return 0
+
+proc write_const#[T](fd: Int; buf: ^const T; count: Int) -> Int
+return 0
+
+begin
+ write(1, slice.ptr, cast(slice.length: Int));
+ write(1, aliased, 0);
+ write(1, nested, 0);
+ write(1, direct_const, 0);
+ write_const(1, slice.ptr, cast(slice.length: Int));
+ write_const(1, aliased, 0);
+ write_const(1, nested, 0);
+ write_const(1, direct_const, 0)
+end.
+
+---
+
+(source_file
+ (program_declaration
+ (type_section
+ (type_declaration
+ (identifier_definition
+ (identifier))
+ (const_type
+ (pointer_type
+ (identifier))))
+ (type_declaration
+ (identifier_definition
+ (identifier))
+ (pointer_type
+ (identifier)))
+ (type_declaration
+ (identifier_definition
+ (identifier))
+ (const_type
+ (identifier))))
+ (var_section
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (slice_type
+ (const_type
+ (identifier))))
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (identifier)
+ (literal
+ (nil)))
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (identifier)
+ (literal
+ (nil)))
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (const_type
+ (pointer_type
+ (identifier)))
+ (literal
+ (nil))))
+ (procedure_declaration
+ (identifier_definition
+ (identifier))
+ (type_parameters
+ (identifier))
+ (parameter_list
+ (field_declaration
+ (identifier_definition
+ (identifier))
+ (identifier))
+ (field_declaration
+ (identifier_definition
+ (identifier))
+ (pointer_type
+ (identifier)))
+ (field_declaration
+ (identifier_definition
+ (identifier))
+ (identifier)))
+ (identifier)
+ (procedure_body
+ (return_clause
+ (literal
+ (integer)))))
+ (procedure_declaration
+ (identifier_definition
+ (identifier))
+ (type_parameters
+ (identifier))
+ (parameter_list
+ (field_declaration
+ (identifier_definition
+ (identifier))
+ (identifier))
+ (field_declaration
+ (identifier_definition
+ (identifier))
+ (pointer_type
+ (const_type
+ (identifier))))
+ (field_declaration
+ (identifier_definition
+ (identifier))
+ (identifier)))
+ (identifier)
+ (procedure_body
+ (return_clause
+ (literal
+ (integer)))))
+ (call_expression
+ (identifier)
+ (argument_list
+ (literal
+ (integer))
+ (field_expression
+ (identifier)
+ (identifier))
+ (cast_expression
+ (field_expression
+ (identifier)
+ (identifier))
+ (identifier))))
+ (call_expression
+ (identifier)
+ (argument_list
+ (literal
+ (integer))
+ (identifier)
+ (literal
+ (integer))))
+ (call_expression
+ (identifier)
+ (argument_list
+ (literal
+ (integer))
+ (identifier)
+ (literal
+ (integer))))
+ (call_expression
+ (identifier)
+ (argument_list
+ (literal
+ (integer))
+ (identifier)
+ (literal
+ (integer))))
+ (call_expression
+ (identifier)
+ (argument_list
+ (literal
+ (integer))
+ (field_expression
+ (identifier)
+ (identifier))
+ (cast_expression
+ (field_expression
+ (identifier)
+ (identifier))
+ (identifier))))
+ (call_expression
+ (identifier)
+ (argument_list
+ (literal
+ (integer))
+ (identifier)
+ (literal
+ (integer))))
+ (call_expression
+ (identifier)
+ (argument_list
+ (literal
+ (integer))
+ (identifier)
+ (literal
+ (integer))))
+ (call_expression
+ (identifier)
+ (argument_list
+ (literal
+ (integer))
+ (identifier)
+ (literal
+ (integer))))))
diff --git a/tools/tree-sitter/test/corpus/generic_inference.txt b/tools/tree-sitter/test/corpus/generic_inference.txt
new file mode 100644
index 0000000..ccac55c
--- /dev/null
+++ b/tools/tree-sitter/test/corpus/generic_inference.txt
@@ -0,0 +1,157 @@
+==================
+generic_inference
+==================
+
+program()
+type
+ File = record
+ fd: Int
+ end
+
+ Cell#[T] = record
+ held: ^T
+ end
+
+var
+ files: Cell#[File]
+ bytes: Cell#[Word8]
+ f: File
+ b: Word8
+
+proc store#[T](target: ^Cell#[T]; value: ^T)
+ target^.held := value
+return
+
+proc relay#[T](target: ^Cell#[T]; value: ^T)
+ store(target, value)
+return
+
+begin
+ store(@files, @f);
+ relay(@bytes, @b);
+ store(@files, nil)
+end.
+
+---
+
+(source_file
+ (program_declaration
+ (type_section
+ (type_declaration
+ (identifier_definition
+ (identifier))
+ (record_type
+ (field_declaration
+ (identifier_definition
+ (identifier))
+ (identifier))))
+ (type_declaration
+ (identifier_definition
+ (identifier))
+ (type_parameters
+ (identifier))
+ (record_type
+ (field_declaration
+ (identifier_definition
+ (identifier))
+ (pointer_type
+ (identifier))))))
+ (var_section
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (generic_type
+ (identifier)
+ (type_arguments
+ (identifier))))
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (generic_type
+ (identifier)
+ (type_arguments
+ (identifier))))
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (identifier))
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (identifier)))
+ (procedure_declaration
+ (identifier_definition
+ (identifier))
+ (type_parameters
+ (identifier))
+ (parameter_list
+ (field_declaration
+ (identifier_definition
+ (identifier))
+ (pointer_type
+ (generic_type
+ (identifier)
+ (type_arguments
+ (identifier)))))
+ (field_declaration
+ (identifier_definition
+ (identifier))
+ (pointer_type
+ (identifier))))
+ (procedure_body
+ (block
+ (assignment_statement
+ (field_expression
+ (dereference_expression
+ (identifier))
+ (identifier))
+ (identifier)))
+ (return_clause)))
+ (procedure_declaration
+ (identifier_definition
+ (identifier))
+ (type_parameters
+ (identifier))
+ (parameter_list
+ (field_declaration
+ (identifier_definition
+ (identifier))
+ (pointer_type
+ (generic_type
+ (identifier)
+ (type_arguments
+ (identifier)))))
+ (field_declaration
+ (identifier_definition
+ (identifier))
+ (pointer_type
+ (identifier))))
+ (procedure_body
+ (block
+ (call_expression
+ (identifier)
+ (argument_list
+ (identifier)
+ (identifier))))
+ (return_clause)))
+ (call_expression
+ (identifier)
+ (argument_list
+ (unary_expression
+ (identifier))
+ (unary_expression
+ (identifier))))
+ (call_expression
+ (identifier)
+ (argument_list
+ (unary_expression
+ (identifier))
+ (unary_expression
+ (identifier))))
+ (call_expression
+ (identifier)
+ (argument_list
+ (unary_expression
+ (identifier))
+ (literal
+ (nil))))))
diff --git a/tools/tree-sitter/test/corpus/generic_pointee.txt b/tools/tree-sitter/test/corpus/generic_pointee.txt
new file mode 100644
index 0000000..55f5a1a
--- /dev/null
+++ b/tools/tree-sitter/test/corpus/generic_pointee.txt
@@ -0,0 +1,71 @@
+==================
+generic_pointee
+==================
+
+program()
+
+type
+ File = record
+ fd: Int
+ end
+
+proc allocate#[T](size: Word) -> ^T
+extern
+
+var
+ f: ^File
+
+begin
+ f := allocate#[File](#size(File));
+ assert(f = nil)
+end.
+
+---
+
+(source_file
+ (program_declaration
+ (type_section
+ (type_declaration
+ (identifier_definition
+ (identifier))
+ (record_type
+ (field_declaration
+ (identifier_definition
+ (identifier))
+ (identifier)))))
+ (procedure_declaration
+ (identifier_definition
+ (identifier))
+ (type_parameters
+ (identifier))
+ (parameter_list
+ (field_declaration
+ (identifier_definition
+ (identifier))
+ (identifier)))
+ (pointer_type
+ (identifier)))
+ (var_section
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (pointer_type
+ (identifier))))
+ (assignment_statement
+ (identifier)
+ (call_expression
+ (generic_type
+ (identifier)
+ (type_arguments
+ (identifier)))
+ (argument_list
+ (traits_expression
+ (trait)
+ (identifier)))))
+ (call_expression
+ (identifier)
+ (argument_list
+ (binary_expression
+ (identifier)
+ (literal
+ (nil)))))))
diff --git a/tools/tree-sitter/test/corpus/noreturn_procedure.txt b/tools/tree-sitter/test/corpus/noreturn_procedure.txt
new file mode 100644
index 0000000..8f8466b
--- /dev/null
+++ b/tools/tree-sitter/test/corpus/noreturn_procedure.txt
@@ -0,0 +1,23 @@
+==================
+noreturn_procedure
+==================
+
+module
+
+proc exit() #{noreturn}
+return
+
+end.
+
+---
+
+(source_file
+ (module_declaration
+ (procedure_declaration
+ (identifier_definition
+ (identifier))
+ (parameter_list)
+ (attribute
+ (identifier))
+ (procedure_body
+ (return_clause)))))
diff --git a/tools/tree-sitter/test/corpus/opaque_type.txt b/tools/tree-sitter/test/corpus/opaque_type.txt
new file mode 100644
index 0000000..7182bb9
--- /dev/null
+++ b/tools/tree-sitter/test/corpus/opaque_type.txt
@@ -0,0 +1,65 @@
+==================
+opaque_type
+==================
+
+program()
+type
+ Handle = extern
+ Alias = Handle
+
+var
+ handle: ^Handle := nil
+ alias: ^Alias
+
+proc take(h: ^Handle) -> ^Handle
+return h
+
+begin
+ alias := take(handle)
+end.
+
+---
+
+(source_file
+ (program_declaration
+ (type_section
+ (type_declaration
+ (identifier_definition
+ (identifier)))
+ (type_declaration
+ (identifier_definition
+ (identifier))
+ (identifier)))
+ (var_section
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (pointer_type
+ (identifier))
+ (literal
+ (nil)))
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (pointer_type
+ (identifier))))
+ (procedure_declaration
+ (identifier_definition
+ (identifier))
+ (parameter_list
+ (field_declaration
+ (identifier_definition
+ (identifier))
+ (pointer_type
+ (identifier))))
+ (pointer_type
+ (identifier))
+ (procedure_body
+ (return_clause
+ (identifier))))
+ (assignment_statement
+ (identifier)
+ (call_expression
+ (identifier)
+ (argument_list
+ (identifier))))))
diff --git a/tools/tree-sitter/test/corpus/pointer_cast.txt b/tools/tree-sitter/test/corpus/pointer_cast.txt
new file mode 100644
index 0000000..63a28ab
--- /dev/null
+++ b/tools/tree-sitter/test/corpus/pointer_cast.txt
@@ -0,0 +1,38 @@
+==================
+pointer_cast
+==================
+
+program()
+var
+ c: ^Char := nil
+ p: Pointer := nil
+
+begin
+ p := c;
+ c := p
+end.
+
+---
+
+(source_file
+ (program_declaration
+ (var_section
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (pointer_type
+ (identifier))
+ (literal
+ (nil)))
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (identifier)
+ (literal
+ (nil))))
+ (assignment_statement
+ (identifier)
+ (identifier))
+ (assignment_statement
+ (identifier)
+ (identifier))))
diff --git a/tools/tree-sitter/test/corpus/pointer_const_conversion.txt b/tools/tree-sitter/test/corpus/pointer_const_conversion.txt
new file mode 100644
index 0000000..f134f00
--- /dev/null
+++ b/tools/tree-sitter/test/corpus/pointer_const_conversion.txt
@@ -0,0 +1,32 @@
+==================
+pointer_const_conversion
+==================
+
+program()
+var
+ x: Int
+ p: ^const Int
+
+begin
+ p := @x
+end.
+
+---
+
+(source_file
+ (program_declaration
+ (var_section
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (identifier))
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (pointer_type
+ (const_type
+ (identifier)))))
+ (assignment_statement
+ (identifier)
+ (unary_expression
+ (identifier)))))
diff --git a/tools/tree-sitter/test/corpus/pointer_subtraction.txt b/tools/tree-sitter/test/corpus/pointer_subtraction.txt
new file mode 100644
index 0000000..3e28de8
--- /dev/null
+++ b/tools/tree-sitter/test/corpus/pointer_subtraction.txt
@@ -0,0 +1,32 @@
+==================
+pointer_subtraction
+==================
+
+module
+
+proc test(a, b: ^Char) -> Int
+return a - b
+
+end.
+
+---
+
+(source_file
+ (module_declaration
+ (procedure_declaration
+ (identifier_definition
+ (identifier))
+ (parameter_list
+ (field_declaration
+ (identifier_definition
+ (identifier))
+ (identifier_definition
+ (identifier))
+ (pointer_type
+ (identifier))))
+ (identifier)
+ (procedure_body
+ (return_clause
+ (binary_expression
+ (identifier)
+ (identifier)))))))
diff --git a/tools/tree-sitter/test/corpus/procedure_forward_reference.txt b/tools/tree-sitter/test/corpus/procedure_forward_reference.txt
new file mode 100644
index 0000000..2b8627f
--- /dev/null
+++ b/tools/tree-sitter/test/corpus/procedure_forward_reference.txt
@@ -0,0 +1,40 @@
+==================
+procedure_forward_reference
+==================
+
+module
+
+proc first() -> Int
+return second() + 1
+
+proc second() -> Int
+return 41
+
+end.
+
+---
+
+(source_file
+ (module_declaration
+ (procedure_declaration
+ (identifier_definition
+ (identifier))
+ (parameter_list)
+ (identifier)
+ (procedure_body
+ (return_clause
+ (binary_expression
+ (call_expression
+ (identifier)
+ (argument_list))
+ (literal
+ (integer))))))
+ (procedure_declaration
+ (identifier_definition
+ (identifier))
+ (parameter_list)
+ (identifier)
+ (procedure_body
+ (return_clause
+ (literal
+ (integer)))))))
diff --git a/tools/tree-sitter/test/corpus/record_const_base.txt b/tools/tree-sitter/test/corpus/record_const_base.txt
new file mode 100644
index 0000000..e6f7cc6
--- /dev/null
+++ b/tools/tree-sitter/test/corpus/record_const_base.txt
@@ -0,0 +1,76 @@
+==================
+record_const_base
+==================
+
+module
+
+type
+ B = record
+ x: Int
+ end
+ CB = const B
+ D = record(CB)
+ y: Int
+ end
+
+proc f()
+var
+ d: D
+begin
+ d.x := 1;
+ d.y := 2
+return
+
+end.
+
+---
+
+(source_file
+ (module_declaration
+ (type_section
+ (type_declaration
+ (identifier_definition
+ (identifier))
+ (record_type
+ (field_declaration
+ (identifier_definition
+ (identifier))
+ (identifier))))
+ (type_declaration
+ (identifier_definition
+ (identifier))
+ (const_type
+ (identifier)))
+ (type_declaration
+ (identifier_definition
+ (identifier))
+ (record_type
+ (identifier)
+ (field_declaration
+ (identifier_definition
+ (identifier))
+ (identifier)))))
+ (procedure_declaration
+ (identifier_definition
+ (identifier))
+ (parameter_list)
+ (procedure_body
+ (block
+ (var_section
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (identifier)))
+ (assignment_statement
+ (field_expression
+ (identifier)
+ (identifier))
+ (literal
+ (integer)))
+ (assignment_statement
+ (field_expression
+ (identifier)
+ (identifier))
+ (literal
+ (integer))))
+ (return_clause)))))
diff --git a/tools/tree-sitter/test/corpus/self-referencing-record.txt b/tools/tree-sitter/test/corpus/self-referencing-record.txt
new file mode 100644
index 0000000..02948f3
--- /dev/null
+++ b/tools/tree-sitter/test/corpus/self-referencing-record.txt
@@ -0,0 +1,27 @@
+==================
+self-referencing-record
+==================
+
+module
+
+type
+ R = record
+ field: ^R
+ end
+
+end.
+
+---
+
+(source_file
+ (module_declaration
+ (type_section
+ (type_declaration
+ (identifier_definition
+ (identifier))
+ (record_type
+ (field_declaration
+ (identifier_definition
+ (identifier))
+ (pointer_type
+ (identifier))))))))
diff --git a/tools/tree-sitter/test/corpus/semicolon_parameter_separator.txt b/tools/tree-sitter/test/corpus/semicolon_parameter_separator.txt
new file mode 100644
index 0000000..f9c1f14
--- /dev/null
+++ b/tools/tree-sitter/test/corpus/semicolon_parameter_separator.txt
@@ -0,0 +1,29 @@
+==================
+semicolon_parameter_separator
+==================
+
+module
+
+proc f(a: Int; b: Word)
+return
+
+end.
+
+---
+
+(source_file
+ (module_declaration
+ (procedure_declaration
+ (identifier_definition
+ (identifier))
+ (parameter_list
+ (field_declaration
+ (identifier_definition
+ (identifier))
+ (identifier))
+ (field_declaration
+ (identifier_definition
+ (identifier))
+ (identifier)))
+ (procedure_body
+ (return_clause)))))
diff --git a/tools/tree-sitter/test/corpus/single_literals.txt b/tools/tree-sitter/test/corpus/single_literals.txt
new file mode 100644
index 0000000..0c7faab
--- /dev/null
+++ b/tools/tree-sitter/test/corpus/single_literals.txt
@@ -0,0 +1,56 @@
+==================
+single_literals
+==================
+
+module
+
+proc f()
+var
+ x: const Single := 3.14f
+ y: const Single := 1e10f
+ z: const Single := 4.567e8f
+ t: const Single := 2.5E-3f
+return
+
+end.
+
+---
+
+(source_file
+ (module_declaration
+ (procedure_declaration
+ (identifier_definition
+ (identifier))
+ (parameter_list)
+ (procedure_body
+ (block
+ (var_section
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (const_type
+ (identifier))
+ (literal
+ (float)))
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (const_type
+ (identifier))
+ (literal
+ (float)))
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (const_type
+ (identifier))
+ (literal
+ (float)))
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (const_type
+ (identifier))
+ (literal
+ (float)))))
+ (return_clause)))))
diff --git a/tools/tree-sitter/test/corpus/slice_index.txt b/tools/tree-sitter/test/corpus/slice_index.txt
new file mode 100644
index 0000000..5480038
--- /dev/null
+++ b/tools/tree-sitter/test/corpus/slice_index.txt
@@ -0,0 +1,58 @@
+==================
+slice_index
+==================
+
+module
+
+proc f()
+var
+ a: []Int
+ x: Int
+ p: ^Int
+begin
+ x := a[1];
+ a := p[1u to 10u]
+return
+
+end.
+
+---
+
+(source_file
+ (module_declaration
+ (procedure_declaration
+ (identifier_definition
+ (identifier))
+ (parameter_list)
+ (procedure_body
+ (block
+ (var_section
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (slice_type
+ (identifier)))
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (identifier))
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (pointer_type
+ (identifier))))
+ (assignment_statement
+ (identifier)
+ (index_expression
+ (identifier)
+ (literal
+ (integer))))
+ (assignment_statement
+ (identifier)
+ (slice_expression
+ (identifier)
+ (literal
+ (integer))
+ (literal
+ (integer)))))
+ (return_clause)))))
diff --git a/tools/tree-sitter/test/corpus/take_const_address.txt b/tools/tree-sitter/test/corpus/take_const_address.txt
new file mode 100644
index 0000000..d84e20f
--- /dev/null
+++ b/tools/tree-sitter/test/corpus/take_const_address.txt
@@ -0,0 +1,35 @@
+==================
+take_const_address
+==================
+
+program()
+var
+ x: ^const Int
+ y: const Int := 1
+
+begin
+ x := @y
+end.
+
+---
+
+(source_file
+ (program_declaration
+ (var_section
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (pointer_type
+ (const_type
+ (identifier))))
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (const_type
+ (identifier))
+ (literal
+ (integer))))
+ (assignment_statement
+ (identifier)
+ (unary_expression
+ (identifier)))))
diff --git a/tools/tree-sitter/test/corpus/trailing_text.txt b/tools/tree-sitter/test/corpus/trailing_text.txt
new file mode 100644
index 0000000..bb39c86
--- /dev/null
+++ b/tools/tree-sitter/test/corpus/trailing_text.txt
@@ -0,0 +1,16 @@
+==================
+trailing_text
+==================
+
+module
+
+end.
+
+Everything after the module terminator is ignored and is never scanned, so it
+does not have to be Elna: proc 1 2 3 "unterminated
+
+---
+
+(source_file
+ (module_declaration)
+ (trailing_content))
diff --git a/tools/tree-sitter/test/corpus/traits_size.txt b/tools/tree-sitter/test/corpus/traits_size.txt
new file mode 100644
index 0000000..f566e0c
--- /dev/null
+++ b/tools/tree-sitter/test/corpus/traits_size.txt
@@ -0,0 +1,93 @@
+==================
+traits_size
+==================
+
+program()
+var
+ i: Int := 1
+ s: Int := cast(#size(Int): Int)
+ a: [10]Int
+ as: Int := cast(#size([10]Int): Int)
+ p: Int := cast(#size(Pointer): Int)
+
+begin
+ assert(s > 0);
+ assert(as = 10 * cast(#size(Int): Int));
+ assert(p > 0)
+end.
+
+---
+
+(source_file
+ (program_declaration
+ (var_section
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (identifier)
+ (literal
+ (integer)))
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (identifier)
+ (cast_expression
+ (traits_expression
+ (trait)
+ (identifier))
+ (identifier)))
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (array_type
+ (literal
+ (integer))
+ (identifier)))
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (identifier)
+ (cast_expression
+ (traits_expression
+ (trait)
+ (array_type
+ (literal
+ (integer))
+ (identifier)))
+ (identifier)))
+ (variable_declaration
+ (identifier_definition
+ (identifier))
+ (identifier)
+ (cast_expression
+ (traits_expression
+ (trait)
+ (identifier))
+ (identifier))))
+ (call_expression
+ (identifier)
+ (argument_list
+ (binary_expression
+ (identifier)
+ (literal
+ (integer)))))
+ (call_expression
+ (identifier)
+ (argument_list
+ (binary_expression
+ (identifier)
+ (binary_expression
+ (literal
+ (integer))
+ (cast_expression
+ (traits_expression
+ (trait)
+ (identifier))
+ (identifier))))))
+ (call_expression
+ (identifier)
+ (argument_list
+ (binary_expression
+ (identifier)
+ (literal
+ (integer)))))))