Skip to content
← Back

src/syntax/trees/statements/list.ghul

1
namespace Syntax.Trees.Statements is
2
3
use Source;
4
5
use Logging;
6
7
class LIST: Trees.Statements.Statement, Collections.Iterable[Statement] is
8
_statements: Collections.List[Statement];
9
statements: Collections.Iterable[Statement] => _statements;
10
is_tuple_literal: bool =>
11
let l = last in
12
13
if l? then
14
l.is_tuple_literal
15
else
16
false
17
fi;
18
19
// Disposal bookkeeping recorded by compile-expressions, read by
20
// IL generation; contents owned by that pass.
21
dispose_state: Syntax.Process.LIST_DISPOSAL_STATE field;
22
23
variables_to_dispose: Collections.List[Semantic.Symbols.Variable] => dispose_state.variables_to_dispose!;
24
25
want_dispose: bool => dispose_state.want_dispose;
26
provides_value: bool => true;
27
28
init(location: LOCATION, statements: Collections.List[Statement]) is
29
super.init(location);
30
31
_statements = statements;
32
si
33
34
iterator: Collections.Iterator[Statement] => _statements.iterator;
35
36
is_empty: bool => _statements.count == 0;
37
38
last: Statement? =>
39
if _statements.count == 0 then
40
null
41
else
42
_statements[_statements.count - 1]
43
fi;
44
45
set_expected_type(expected_type: Semantic.Types.Type?, error_message: string?) =>
46
let l = last in
47
48
if l? then
49
l.set_expected_type(expected_type, error_message);
50
fi;
51
52
clear_expected_type() =>
53
let l = last in
54
55
if l? then
56
l.clear_expected_type();
57
fi;
58
59
add_variable_to_dispose(v: Semantic.Symbols.Variable) is
60
dispose_state.add(v);
61
si
62
63
clear() is
64
super.clear();
65
dispose_state.clear();
66
si
67
68
// In-place replacement of the underlying statements.
69
replace_all(new_statements: Collections.Iterable[Statement]) is
70
_statements = Collections.LIST[Statement](new_statements);
71
si
72
73
accept(visitor: Visitor) is
74
visitor.visit(self);
75
si
76
77
walk(visitor: Visitor) is
78
if !visitor.pre(self) then
79
for s in statements do
80
visitor.enter_node(s);
81
try
82
s.walk(visitor);
83
finally
84
visitor.leave_node(s);
85
yrt
86
od
87
fi
88
89
accept(visitor);
90
si
91
si
92
si