@@ -42,6 +42,11 @@ inline constexpr auto Pointer = nth::debug::MakeProperty<"pointer">(
42
42
inline constexpr auto Statement = nth::debug::MakeProperty<" statement" >(
43
43
[](auto const &value) { return value.kind == ParseNode::Kind::Statement; });
44
44
45
+ inline constexpr auto FunctionStart =
46
+ nth::debug::MakeProperty<" function-start" >([](auto const &value) {
47
+ return value.kind == ParseNode::Kind::FunctionStart;
48
+ });
49
+
45
50
inline constexpr auto ScopeStart =
46
51
nth::debug::MakeProperty<" scope-start" >([](auto const &value) {
47
52
return value.kind == ParseNode::Kind::ScopeStart;
@@ -99,7 +104,7 @@ NTH_TEST("parser/empty", std::string_view content) {
99
104
diag::NullConsumer d;
100
105
TokenBuffer buffer = lex::Lex (content, d);
101
106
auto tree = Parse (buffer, d).parse_tree ;
102
- NTH_EXPECT (tree.nodes () >>= ElementsAreSequentially ());
107
+ NTH_EXPECT (tree.nodes () >>= ElementsAreSequentially (FunctionStart () ));
103
108
}
104
109
105
110
NTH_INVOKE_TEST (" parser/empty" ) {
@@ -114,7 +119,7 @@ NTH_TEST("parser/declaration/integer") {
114
119
TokenBuffer buffer = lex::Lex (" let x ::= 3" , d);
115
120
auto tree = Parse (buffer, d).parse_tree ;
116
121
NTH_EXPECT (tree.nodes () >>= ElementsAreSequentially (
117
- ScopeStart (), Let (),
122
+ FunctionStart (), ScopeStart (), Let (),
118
123
DeclaredIdentifier () and IdentifierToken (" x" ),
119
124
ColonColonEqual (), HasToken (HasImmediateIntegerValue (3 )),
120
125
HasSubtreeSize (5 ), HasSubtreeSize (6 )));
@@ -125,7 +130,7 @@ NTH_TEST("parser/declaration/bool") {
125
130
TokenBuffer buffer = lex::Lex (" let x := true" , d);
126
131
auto tree = Parse (buffer, d).parse_tree ;
127
132
NTH_EXPECT (tree.nodes () >>= ElementsAreSequentially (
128
- ScopeStart (), Let (),
133
+ FunctionStart (), ScopeStart (), Let (),
129
134
DeclaredIdentifier () and IdentifierToken (" x" ), ColonEqual (),
130
135
HasToken (HasBooleanValue (true )), HasSubtreeSize (5 ),
131
136
HasSubtreeSize (6 )));
@@ -136,7 +141,7 @@ NTH_TEST("parser/comment") {
136
141
TokenBuffer buffer = lex::Lex (" let x ::= true // comment!" , d);
137
142
auto tree = Parse (buffer, d).parse_tree ;
138
143
NTH_EXPECT (tree.nodes () >>= ElementsAreSequentially (
139
- ScopeStart (), Let (),
144
+ FunctionStart (), ScopeStart (), Let (),
140
145
DeclaredIdentifier () and IdentifierToken (" x" ),
141
146
ColonColonEqual (), HasToken (HasBooleanValue (true )),
142
147
HasSubtreeSize (5 ), HasSubtreeSize (6 )));
@@ -151,7 +156,7 @@ NTH_TEST("parser/multiple-declarations-with-newlines") {
151
156
d);
152
157
auto tree = Parse (buffer, d).parse_tree ;
153
158
NTH_EXPECT (tree.nodes () >>= ElementsAreSequentially (
154
- ScopeStart (), Let (),
159
+ FunctionStart (), ScopeStart (), Let (),
155
160
DeclaredIdentifier () and IdentifierToken (" x" ),
156
161
ColonColonEqual (), HasToken (HasImmediateIntegerValue (3 )),
157
162
HasSubtreeSize (5 ), Var (),
@@ -165,7 +170,7 @@ NTH_TEST("parser/operator-precedence/plus-times") {
165
170
TokenBuffer buffer = lex::Lex (R"( x + y * z)" , d);
166
171
auto tree = Parse (buffer, d).parse_tree ;
167
172
NTH_EXPECT (tree.nodes () >>= ElementsAreSequentially (
168
- ScopeStart (), IdentifierToken (" x" ),
173
+ FunctionStart (), ScopeStart (), IdentifierToken (" x" ),
169
174
InfixOperator (Token::Kind::Plus), IdentifierToken (" y" ),
170
175
InfixOperator (Token::Kind::Star), IdentifierToken (" z" ),
171
176
ExpressionPrecedenceGroup () and HasSubtreeSize (4 ),
@@ -178,7 +183,7 @@ NTH_TEST("parser/operator-precedence/times-plus") {
178
183
TokenBuffer buffer = lex::Lex (R"( x * y + z)" , d);
179
184
auto tree = Parse (buffer, d).parse_tree ;
180
185
NTH_EXPECT (tree.nodes () >>= ElementsAreSequentially (
181
- ScopeStart (), IdentifierToken (" x" ),
186
+ FunctionStart (), ScopeStart (), IdentifierToken (" x" ),
182
187
InfixOperator (Token::Kind::Star), IdentifierToken (" y" ),
183
188
ExpressionPrecedenceGroup () and HasSubtreeSize (4 ),
184
189
InfixOperator (Token::Kind::Plus), IdentifierToken (" z" ),
@@ -191,7 +196,7 @@ NTH_TEST("parser/operator-precedence/plus-plus") {
191
196
TokenBuffer buffer = lex::Lex (R"( x + y + z)" , d);
192
197
auto tree = Parse (buffer, d).parse_tree ;
193
198
NTH_EXPECT (tree.nodes () >>= ElementsAreSequentially (
194
- ScopeStart (), IdentifierToken (" x" ),
199
+ FunctionStart (), ScopeStart (), IdentifierToken (" x" ),
195
200
InfixOperator (Token::Kind::Plus), IdentifierToken (" y" ),
196
201
InfixOperator (Token::Kind::Plus), IdentifierToken (" z" ),
197
202
ExpressionPrecedenceGroup () and HasSubtreeSize (6 ),
@@ -204,7 +209,7 @@ NTH_TEST("parser/access/basic") {
204
209
auto tree = Parse (buffer, d).parse_tree ;
205
210
NTH_EXPECT (
206
211
tree.nodes () >>= ElementsAreSequentially (
207
- ScopeStart (), IdentifierToken (" a" ),
212
+ FunctionStart (), ScopeStart (), IdentifierToken (" a" ),
208
213
MemberExpression () and IdentifierToken (" b" ) and HasSubtreeSize (2 ),
209
214
Statement () and HasSubtreeSize (3 ), HasSubtreeSize (4 )));
210
215
}
@@ -215,7 +220,7 @@ NTH_TEST("parser/access/nested") {
215
220
auto tree = Parse (buffer, d).parse_tree ;
216
221
NTH_EXPECT (
217
222
tree.nodes () >>= ElementsAreSequentially (
218
- ScopeStart (), IdentifierToken (" a" ),
223
+ FunctionStart (), ScopeStart (), IdentifierToken (" a" ),
219
224
MemberExpression () and IdentifierToken (" b" ) and HasSubtreeSize (2 ),
220
225
MemberExpression () and IdentifierToken (" c" ) and HasSubtreeSize (3 ),
221
226
Statement () and HasSubtreeSize (4 ), HasSubtreeSize (5 )));
@@ -227,7 +232,7 @@ NTH_TEST("parser/access/precedence") {
227
232
auto tree = Parse (buffer, d).parse_tree ;
228
233
NTH_EXPECT (
229
234
tree.nodes () >>= ElementsAreSequentially (
230
- ScopeStart (), IdentifierToken (" a" ),
235
+ FunctionStart (), ScopeStart (), IdentifierToken (" a" ),
231
236
MemberExpression () and IdentifierToken (" b" ) and HasSubtreeSize (2 ),
232
237
InfixOperator (Token::Kind::Star), IdentifierToken (" c" ),
233
238
MemberExpression () and IdentifierToken (" d" ) and HasSubtreeSize (2 ),
@@ -240,7 +245,8 @@ NTH_TEST("parser/invoke/empty") {
240
245
TokenBuffer buffer = lex::Lex (R"( f())" , d);
241
246
auto tree = Parse (buffer, d).parse_tree ;
242
247
NTH_EXPECT (tree.nodes () >>= ElementsAreSequentially (
243
- ScopeStart (), IdentifierToken (" f" ), InvocationArgumentStart (),
248
+ FunctionStart (), ScopeStart (), IdentifierToken (" f" ),
249
+ InvocationArgumentStart (),
244
250
CallExpression () and HasSubtreeSize (3 ),
245
251
Statement () and HasSubtreeSize (4 ), HasSubtreeSize (5 )));
246
252
}
@@ -251,7 +257,7 @@ NTH_TEST("parser/invoke/empty-member-call") {
251
257
auto tree = Parse (buffer, d).parse_tree ;
252
258
NTH_EXPECT (
253
259
tree.nodes () >>= ElementsAreSequentially (
254
- ScopeStart (), IdentifierToken (" a" ),
260
+ FunctionStart (), ScopeStart (), IdentifierToken (" a" ),
255
261
MemberExpression () and IdentifierToken (" b" ) and HasSubtreeSize (2 ),
256
262
InvocationArgumentStart (), CallExpression () and HasSubtreeSize (4 ),
257
263
Statement () and HasSubtreeSize (5 ), HasSubtreeSize (6 )));
@@ -263,7 +269,7 @@ NTH_TEST("parser/invoke/double-call") {
263
269
auto tree = Parse (buffer, d).parse_tree ;
264
270
NTH_EXPECT (
265
271
tree.nodes () >>= ElementsAreSequentially (
266
- ScopeStart (), IdentifierToken (" a" ),
272
+ FunctionStart (), ScopeStart (), IdentifierToken (" a" ),
267
273
IdentifierToken (" b" ) and MemberExpression () and HasSubtreeSize (2 ),
268
274
InvocationArgumentStart (), CallExpression () and HasSubtreeSize (4 ),
269
275
InvocationArgumentStart (), CallExpression () and HasSubtreeSize (6 ),
@@ -275,8 +281,9 @@ NTH_TEST("parser/invoke/one-positional") {
275
281
TokenBuffer buffer = lex::Lex (R"( a(b))" , d);
276
282
auto tree = Parse (buffer, d).parse_tree ;
277
283
NTH_EXPECT (tree.nodes () >>= ElementsAreSequentially (
278
- ScopeStart (), IdentifierToken (" a" ), InvocationArgumentStart (),
279
- IdentifierToken (" b" ), CallExpression () and HasSubtreeSize (4 ),
284
+ FunctionStart (), ScopeStart (), IdentifierToken (" a" ),
285
+ InvocationArgumentStart (), IdentifierToken (" b" ),
286
+ CallExpression () and HasSubtreeSize (4 ),
280
287
Statement () and HasSubtreeSize (5 ), HasSubtreeSize (6 )));
281
288
}
282
289
@@ -288,8 +295,9 @@ NTH_TEST("parser/invoke/one-positional-newline") {
288
295
d);
289
296
auto tree = Parse (buffer, d).parse_tree ;
290
297
NTH_EXPECT (tree.nodes () >>= ElementsAreSequentially (
291
- ScopeStart (), IdentifierToken (" a" ), InvocationArgumentStart (),
292
- IdentifierToken (" b" ), CallExpression () and HasSubtreeSize (4 ),
298
+ FunctionStart (), ScopeStart (), IdentifierToken (" a" ),
299
+ InvocationArgumentStart (), IdentifierToken (" b" ),
300
+ CallExpression () and HasSubtreeSize (4 ),
293
301
Statement () and HasSubtreeSize (5 ), HasSubtreeSize (6 )));
294
302
}
295
303
@@ -298,9 +306,10 @@ NTH_TEST("parser/invoke/multiple-positional") {
298
306
TokenBuffer buffer = lex::Lex (R"( a(b, c, d))" , d);
299
307
auto tree = Parse (buffer, d).parse_tree ;
300
308
NTH_EXPECT (tree.nodes () >>= ElementsAreSequentially (
301
- ScopeStart (), IdentifierToken (" a" ), InvocationArgumentStart (),
302
- IdentifierToken (" b" ), IdentifierToken (" c" ),
303
- IdentifierToken (" d" ), CallExpression () and HasSubtreeSize (6 ),
309
+ FunctionStart (), ScopeStart (), IdentifierToken (" a" ),
310
+ InvocationArgumentStart (), IdentifierToken (" b" ),
311
+ IdentifierToken (" c" ), IdentifierToken (" d" ),
312
+ CallExpression () and HasSubtreeSize (6 ),
304
313
Statement () and HasSubtreeSize (7 ), HasSubtreeSize (8 )));
305
314
}
306
315
@@ -312,9 +321,10 @@ NTH_TEST("parser/invoke/multiple-positional-newline") {
312
321
d);
313
322
auto tree = Parse (buffer, d).parse_tree ;
314
323
NTH_EXPECT (tree.nodes () >>= ElementsAreSequentially (
315
- ScopeStart (), IdentifierToken (" a" ), InvocationArgumentStart (),
316
- IdentifierToken (" b" ), IdentifierToken (" c" ),
317
- IdentifierToken (" d" ), CallExpression () and HasSubtreeSize (6 ),
324
+ FunctionStart (), ScopeStart (), IdentifierToken (" a" ),
325
+ InvocationArgumentStart (), IdentifierToken (" b" ),
326
+ IdentifierToken (" c" ), IdentifierToken (" d" ),
327
+ CallExpression () and HasSubtreeSize (6 ),
318
328
Statement () and HasSubtreeSize (7 ), HasSubtreeSize (8 )));
319
329
}
320
330
@@ -323,7 +333,7 @@ NTH_TEST("parser/invoke/access-call") {
323
333
TokenBuffer buffer = lex::Lex (R"( a.b(c.d))" , d);
324
334
auto tree = Parse (buffer, d).parse_tree ;
325
335
NTH_EXPECT (tree.nodes () >>= ElementsAreSequentially (
326
- ScopeStart (), IdentifierToken (" a" ),
336
+ FunctionStart (), ScopeStart (), IdentifierToken (" a" ),
327
337
MemberExpression () and HasSubtreeSize (2 ),
328
338
InvocationArgumentStart (), IdentifierToken (" c" ),
329
339
MemberExpression () and HasSubtreeSize (2 ),
@@ -336,7 +346,7 @@ NTH_TEST("parser/invoke/pointer") {
336
346
TokenBuffer buffer = lex::Lex (R"( *a)" , d);
337
347
auto tree = Parse (buffer, d).parse_tree ;
338
348
NTH_EXPECT (tree.nodes () >>= ElementsAreSequentially (
339
- ScopeStart (), IdentifierToken (" a" ),
349
+ FunctionStart (), ScopeStart (), IdentifierToken (" a" ),
340
350
Pointer () and HasSubtreeSize (2 ),
341
351
Statement () and HasSubtreeSize (3 ), HasSubtreeSize (4 )));
342
352
}
@@ -346,7 +356,7 @@ NTH_TEST("parser/invoke/pointer-access") {
346
356
TokenBuffer buffer = lex::Lex (R"( *a.b)" , d);
347
357
auto tree = Parse (buffer, d).parse_tree ;
348
358
NTH_EXPECT (tree.nodes () >>= ElementsAreSequentially (
349
- ScopeStart (), IdentifierToken (" a" ),
359
+ FunctionStart (), ScopeStart (), IdentifierToken (" a" ),
350
360
MemberExpression () and HasSubtreeSize (2 ),
351
361
Pointer () and HasSubtreeSize (3 ),
352
362
Statement () and HasSubtreeSize (4 ), HasSubtreeSize (5 )));
@@ -357,7 +367,7 @@ NTH_TEST("parser/invoke/pointer-function") {
357
367
TokenBuffer buffer = lex::Lex (R"( *a -> b)" , d);
358
368
auto tree = Parse (buffer, d).parse_tree ;
359
369
NTH_EXPECT (tree.nodes () >>= ElementsAreSequentially (
360
- ScopeStart (), IdentifierToken (" a" ),
370
+ FunctionStart (), ScopeStart (), IdentifierToken (" a" ),
361
371
Pointer () and HasSubtreeSize (2 ),
362
372
InfixOperator (Token::Kind::MinusGreater), IdentifierToken (" b" ),
363
373
ExpressionPrecedenceGroup () and HasSubtreeSize (5 ),
@@ -369,7 +379,7 @@ NTH_TEST("parser/invoke/buffer-pointer") {
369
379
TokenBuffer buffer = lex::Lex (R"( [*]a)" , d);
370
380
auto tree = Parse (buffer, d).parse_tree ;
371
381
NTH_EXPECT (tree.nodes () >>= ElementsAreSequentially (
372
- ScopeStart (), IdentifierToken (" a" ),
382
+ FunctionStart (), ScopeStart (), IdentifierToken (" a" ),
373
383
BufferPointer () and HasSubtreeSize (2 ),
374
384
Statement () and HasSubtreeSize (3 ), HasSubtreeSize (4 )));
375
385
}
@@ -379,7 +389,7 @@ NTH_TEST("parser/invoke/buffer-pointer-access") {
379
389
TokenBuffer buffer = lex::Lex (R"( [*]a.b)" , d);
380
390
auto tree = Parse (buffer, d).parse_tree ;
381
391
NTH_EXPECT (tree.nodes () >>= ElementsAreSequentially (
382
- ScopeStart (), IdentifierToken (" a" ),
392
+ FunctionStart (), ScopeStart (), IdentifierToken (" a" ),
383
393
MemberExpression () and HasSubtreeSize (2 ),
384
394
BufferPointer () and HasSubtreeSize (3 ),
385
395
Statement () and HasSubtreeSize (4 ), HasSubtreeSize (5 )));
@@ -390,7 +400,7 @@ NTH_TEST("parser/invoke/buffer-pointer-function") {
390
400
TokenBuffer buffer = lex::Lex (R"( [*]a -> b)" , d);
391
401
auto tree = Parse (buffer, d).parse_tree ;
392
402
NTH_EXPECT (tree.nodes () >>= ElementsAreSequentially (
393
- ScopeStart (), IdentifierToken (" a" ),
403
+ FunctionStart (), ScopeStart (), IdentifierToken (" a" ),
394
404
BufferPointer () and HasSubtreeSize (2 ),
395
405
InfixOperator (Token::Kind::MinusGreater), IdentifierToken (" b" ),
396
406
ExpressionPrecedenceGroup () and HasSubtreeSize (5 ),
0 commit comments