source: code/trunk/vendor/modernc.org/cc/v3/inspect.go@ 822

Last change on this file since 822 was 822, checked in by yakumo.izuru, 22 months ago

Prefer immortal.run over runit and rc.d, use vendored modules
for convenience.

Signed-off-by: Izuru Yakumo <yakumo.izuru@…>

File size: 16.9 KB
Line 
1// Copyright 2020 The CC Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package cc // import "modernc.org/cc/v3"
6
7// Inspect inspects AST node trees.
8//
9// If n is a non-terminal node, f(n, true) is called first. Next, f is called
10// recursively for each of n's non-nil non-terminal children nodes, if any, in
11// alphabetical order. Next, all n's terminal nodes, if any, are visited in
12// the numeric order of their suffixes (Token, Token2, Token3, ...). Finally,
13// f(n, false) is invoked.
14//
15// If n a terminal node, of type *Token, f(n, <unspecified boolean value> is
16// called once.
17//
18// Inspect stops when any invocation of f returns false.
19func Inspect(n Node, f func(Node, bool) bool) {
20 see(n, f)
21}
22
23func see(n Node, f func(Node, bool) bool) bool {
24 switch x := n.(type) {
25 case *AbstractDeclarator:
26 return x == nil || f(x, true) &&
27 see(x.DirectAbstractDeclarator, f) &&
28 see(x.Pointer, f) &&
29 f(x, false)
30 case *AdditiveExpression:
31 return x == nil || f(x, true) &&
32 see(x.AdditiveExpression, f) &&
33 see(x.MultiplicativeExpression, f) &&
34 see(&x.Token, f) &&
35 f(x, false)
36 case *AlignmentSpecifier:
37 return x == nil || f(x, true) &&
38 see(x.ConstantExpression, f) &&
39 see(x.TypeName, f) &&
40 see(&x.Token, f) &&
41 see(&x.Token2, f) &&
42 see(&x.Token2, f) &&
43 see(&x.Token3, f) &&
44 f(x, false)
45 case *AndExpression:
46 return x == nil || f(x, true) &&
47 see(x.AndExpression, f) &&
48 see(x.EqualityExpression, f) &&
49 see(&x.Token, f) &&
50 f(x, false)
51 case *ArgumentExpressionList:
52 return x == nil || f(x, true) &&
53 see(x.ArgumentExpressionList, f) &&
54 see(x.AssignmentExpression, f) &&
55 see(&x.Token, f) &&
56 f(x, false)
57 case *Asm:
58 return x == nil || f(x, true) &&
59 see(x.AsmArgList, f) &&
60 see(x.AsmQualifierList, f) &&
61 see(&x.Token, f) &&
62 see(&x.Token2, f) &&
63 see(&x.Token2, f) &&
64 see(&x.Token3, f) &&
65 see(&x.Token4, f) &&
66 f(x, false)
67 case *AsmArgList:
68 return x == nil || f(x, true) &&
69 see(x.AsmArgList, f) &&
70 see(x.AsmExpressionList, f) &&
71 see(&x.Token, f) &&
72 f(x, false)
73 case *AsmExpressionList:
74 return x == nil || f(x, true) &&
75 see(x.AsmExpressionList, f) &&
76 see(x.AsmIndex, f) &&
77 see(x.AssignmentExpression, f) &&
78 see(&x.Token, f) &&
79 f(x, false)
80 case *AsmFunctionDefinition:
81 return x == nil || f(x, true) &&
82 see(x.AsmStatement, f) &&
83 see(x.DeclarationSpecifiers, f) &&
84 see(x.Declarator, f) &&
85 f(x, false)
86 case *AsmIndex:
87 return x == nil || f(x, true) &&
88 see(x.Expression, f) &&
89 see(&x.Token, f) &&
90 see(&x.Token2, f) &&
91 see(&x.Token2, f) &&
92 f(x, false)
93 case *AsmQualifier:
94 return x == nil || f(x, true) &&
95 see(&x.Token, f) &&
96 f(x, false)
97 case *AsmQualifierList:
98 return x == nil || f(x, true) &&
99 see(x.AsmQualifier, f) &&
100 see(x.AsmQualifierList, f) &&
101 f(x, false)
102 case *AsmStatement:
103 return x == nil || f(x, true) &&
104 see(x.Asm, f) &&
105 see(x.AttributeSpecifierList, f) &&
106 see(&x.Token, f) &&
107 f(x, false)
108 case *AssignmentExpression:
109 return x == nil || f(x, true) &&
110 see(x.AssignmentExpression, f) &&
111 see(x.ConditionalExpression, f) &&
112 see(x.UnaryExpression, f) &&
113 see(&x.Token, f) &&
114 f(x, false)
115 case *AtomicTypeSpecifier:
116 return x == nil || f(x, true) &&
117 see(x.TypeName, f) &&
118 see(&x.Token, f) &&
119 see(&x.Token2, f) &&
120 see(&x.Token2, f) &&
121 see(&x.Token3, f) &&
122 f(x, false)
123 case *AttributeSpecifier:
124 return x == nil || f(x, true) &&
125 see(x.AttributeValueList, f) &&
126 see(&x.Token, f) &&
127 see(&x.Token2, f) &&
128 see(&x.Token2, f) &&
129 see(&x.Token3, f) &&
130 see(&x.Token4, f) &&
131 see(&x.Token5, f) &&
132 f(x, false)
133 case *AttributeSpecifierList:
134 return x == nil || f(x, true) &&
135 see(x.AttributeSpecifier, f) &&
136 see(x.AttributeSpecifierList, f) &&
137 f(x, false)
138 case *AttributeValue:
139 return x == nil || f(x, true) &&
140 see(x.ExpressionList, f) &&
141 see(&x.Token, f) &&
142 see(&x.Token2, f) &&
143 see(&x.Token2, f) &&
144 see(&x.Token3, f) &&
145 f(x, false)
146 case *AttributeValueList:
147 return x == nil || f(x, true) &&
148 see(x.AttributeValue, f) &&
149 see(x.AttributeValueList, f) &&
150 see(&x.Token, f) &&
151 f(x, false)
152 case *BlockItem:
153 return x == nil || f(x, true) &&
154 see(x.CompoundStatement, f) &&
155 see(x.Declaration, f) &&
156 see(x.DeclarationSpecifiers, f) &&
157 see(x.Declarator, f) &&
158 see(x.LabelDeclaration, f) &&
159 see(x.PragmaSTDC, f) &&
160 see(x.Statement, f) &&
161 f(x, false)
162 case *BlockItemList:
163 return x == nil || f(x, true) &&
164 see(x.BlockItem, f) &&
165 see(x.BlockItemList, f) &&
166 f(x, false)
167 case *CastExpression:
168 return x == nil || f(x, true) &&
169 see(x.CastExpression, f) &&
170 see(x.TypeName, f) &&
171 see(x.UnaryExpression, f) &&
172 see(&x.Token, f) &&
173 see(&x.Token2, f) &&
174 see(&x.Token2, f) &&
175 f(x, false)
176 case *CompoundStatement:
177 return x == nil || f(x, true) &&
178 see(x.BlockItemList, f) &&
179 see(&x.Token, f) &&
180 see(&x.Token2, f) &&
181 see(&x.Token2, f) &&
182 f(x, false)
183 case *ConditionalExpression:
184 return x == nil || f(x, true) &&
185 see(x.ConditionalExpression, f) &&
186 see(x.Expression, f) &&
187 see(x.LogicalOrExpression, f) &&
188 see(&x.Token, f) &&
189 see(&x.Token2, f) &&
190 see(&x.Token2, f) &&
191 f(x, false)
192 case *ConstantExpression:
193 return x == nil || f(x, true) &&
194 see(x.ConditionalExpression, f) &&
195 f(x, false)
196 case *Declaration:
197 return x == nil || f(x, true) &&
198 see(x.DeclarationSpecifiers, f) &&
199 see(x.InitDeclaratorList, f) &&
200 see(&x.Token, f) &&
201 f(x, false)
202 case *DeclarationList:
203 return x == nil || f(x, true) &&
204 see(x.Declaration, f) &&
205 see(x.DeclarationList, f) &&
206 f(x, false)
207 case *DeclarationSpecifiers:
208 return x == nil || f(x, true) &&
209 see(x.AlignmentSpecifier, f) &&
210 see(x.AttributeSpecifier, f) &&
211 see(x.DeclarationSpecifiers, f) &&
212 see(x.FunctionSpecifier, f) &&
213 see(x.StorageClassSpecifier, f) &&
214 see(x.TypeQualifier, f) &&
215 see(x.TypeSpecifier, f) &&
216 f(x, false)
217 case *Declarator:
218 return x == nil || f(x, true) &&
219 see(x.AttributeSpecifierList, f) &&
220 see(x.DirectDeclarator, f) &&
221 see(x.Pointer, f) &&
222 f(x, false)
223 case *Designation:
224 return x == nil || f(x, true) &&
225 see(x.DesignatorList, f) &&
226 see(&x.Token, f) &&
227 f(x, false)
228 case *Designator:
229 return x == nil || f(x, true) &&
230 see(x.ConstantExpression, f) &&
231 see(&x.Token, f) &&
232 see(&x.Token2, f) &&
233 see(&x.Token2, f) &&
234 f(x, false)
235 case *DesignatorList:
236 return x == nil || f(x, true) &&
237 see(x.Designator, f) &&
238 see(x.DesignatorList, f) &&
239 f(x, false)
240 case *DirectAbstractDeclarator:
241 return x == nil || f(x, true) &&
242 see(x.AbstractDeclarator, f) &&
243 see(x.AssignmentExpression, f) &&
244 see(x.DirectAbstractDeclarator, f) &&
245 see(x.ParameterTypeList, f) &&
246 see(x.TypeQualifiers, f) &&
247 see(&x.Token, f) &&
248 see(&x.Token2, f) &&
249 see(&x.Token2, f) &&
250 see(&x.Token3, f) &&
251 f(x, false)
252 case *DirectDeclarator:
253 return x == nil || f(x, true) &&
254 see(x.Asm, f) &&
255 see(x.AssignmentExpression, f) &&
256 see(x.AttributeSpecifierList, f) &&
257 see(x.Declarator, f) &&
258 see(x.DirectDeclarator, f) &&
259 see(x.IdentifierList, f) &&
260 see(x.ParameterTypeList, f) &&
261 see(x.TypeQualifiers, f) &&
262 see(&x.Token, f) &&
263 see(&x.Token2, f) &&
264 see(&x.Token2, f) &&
265 see(&x.Token3, f) &&
266 f(x, false)
267 case *EnumSpecifier:
268 return x == nil || f(x, true) &&
269 see(x.AttributeSpecifierList, f) &&
270 see(x.EnumeratorList, f) &&
271 see(&x.Token, f) &&
272 see(&x.Token2, f) &&
273 see(&x.Token2, f) &&
274 see(&x.Token3, f) &&
275 see(&x.Token4, f) &&
276 see(&x.Token5, f) &&
277 f(x, false)
278 case *Enumerator:
279 return x == nil || f(x, true) &&
280 see(x.AttributeSpecifierList, f) &&
281 see(x.ConstantExpression, f) &&
282 see(&x.Token, f) &&
283 see(&x.Token2, f) &&
284 see(&x.Token2, f) &&
285 f(x, false)
286 case *EnumeratorList:
287 return x == nil || f(x, true) &&
288 see(x.Enumerator, f) &&
289 see(x.EnumeratorList, f) &&
290 see(&x.Token, f) &&
291 f(x, false)
292 case *EqualityExpression:
293 return x == nil || f(x, true) &&
294 see(x.EqualityExpression, f) &&
295 see(x.RelationalExpression, f) &&
296 see(&x.Token, f) &&
297 f(x, false)
298 case *ExclusiveOrExpression:
299 return x == nil || f(x, true) &&
300 see(x.AndExpression, f) &&
301 see(x.ExclusiveOrExpression, f) &&
302 see(&x.Token, f) &&
303 f(x, false)
304 case *Expression:
305 return x == nil || f(x, true) &&
306 see(x.AssignmentExpression, f) &&
307 see(x.Expression, f) &&
308 see(&x.Token, f) &&
309 f(x, false)
310 case *ExpressionList:
311 return x == nil || f(x, true) &&
312 see(x.AssignmentExpression, f) &&
313 see(x.ExpressionList, f) &&
314 see(&x.Token, f) &&
315 f(x, false)
316 case *ExpressionStatement:
317 return x == nil || f(x, true) &&
318 see(x.AttributeSpecifierList, f) &&
319 see(x.Expression, f) &&
320 see(&x.Token, f) &&
321 f(x, false)
322 case *ExternalDeclaration:
323 return x == nil || f(x, true) &&
324 see(x.AsmFunctionDefinition, f) &&
325 see(x.AsmStatement, f) &&
326 see(x.Declaration, f) &&
327 see(x.FunctionDefinition, f) &&
328 see(x.PragmaSTDC, f) &&
329 see(&x.Token, f) &&
330 f(x, false)
331 case *FunctionDefinition:
332 return x == nil || f(x, true) &&
333 see(x.CompoundStatement, f) &&
334 see(x.DeclarationList, f) &&
335 see(x.DeclarationSpecifiers, f) &&
336 see(x.Declarator, f) &&
337 f(x, false)
338 case *FunctionSpecifier:
339 return x == nil || f(x, true) &&
340 see(&x.Token, f) &&
341 f(x, false)
342 case *IdentifierList:
343 return x == nil || f(x, true) &&
344 see(x.IdentifierList, f) &&
345 see(&x.Token, f) &&
346 see(&x.Token2, f) &&
347 see(&x.Token2, f) &&
348 f(x, false)
349 case *InclusiveOrExpression:
350 return x == nil || f(x, true) &&
351 see(x.ExclusiveOrExpression, f) &&
352 see(x.InclusiveOrExpression, f) &&
353 see(&x.Token, f) &&
354 f(x, false)
355 case *InitDeclarator:
356 return x == nil || f(x, true) &&
357 see(x.AttributeSpecifierList, f) &&
358 see(x.Declarator, f) &&
359 see(x.Initializer, f) &&
360 see(&x.Token, f) &&
361 f(x, false)
362 case *InitDeclaratorList:
363 return x == nil || f(x, true) &&
364 see(x.AttributeSpecifierList, f) &&
365 see(x.InitDeclarator, f) &&
366 see(x.InitDeclaratorList, f) &&
367 see(&x.Token, f) &&
368 f(x, false)
369 case *Initializer:
370 return x == nil || f(x, true) &&
371 see(x.AssignmentExpression, f) &&
372 see(x.InitializerList, f) &&
373 see(&x.Token, f) &&
374 see(&x.Token2, f) &&
375 see(&x.Token2, f) &&
376 see(&x.Token3, f) &&
377 f(x, false)
378 case *InitializerList:
379 return x == nil || f(x, true) &&
380 see(x.Designation, f) &&
381 see(x.Initializer, f) &&
382 see(x.InitializerList, f) &&
383 see(&x.Token, f) &&
384 f(x, false)
385 case *IterationStatement:
386 return x == nil || f(x, true) &&
387 see(x.Declaration, f) &&
388 see(x.Expression, f) &&
389 see(x.Expression2, f) &&
390 see(x.Expression3, f) &&
391 see(x.Statement, f) &&
392 see(&x.Token, f) &&
393 see(&x.Token2, f) &&
394 see(&x.Token2, f) &&
395 see(&x.Token3, f) &&
396 see(&x.Token4, f) &&
397 see(&x.Token5, f) &&
398 f(x, false)
399 case *JumpStatement:
400 return x == nil || f(x, true) &&
401 see(x.Expression, f) &&
402 see(&x.Token, f) &&
403 see(&x.Token2, f) &&
404 see(&x.Token2, f) &&
405 see(&x.Token3, f) &&
406 f(x, false)
407 case *LabelDeclaration:
408 return x == nil || f(x, true) &&
409 see(x.IdentifierList, f) &&
410 see(&x.Token, f) &&
411 see(&x.Token2, f) &&
412 see(&x.Token2, f) &&
413 f(x, false)
414 case *LabeledStatement:
415 return x == nil || f(x, true) &&
416 see(x.AttributeSpecifierList, f) &&
417 see(x.ConstantExpression, f) &&
418 see(x.ConstantExpression2, f) &&
419 see(x.Statement, f) &&
420 see(&x.Token, f) &&
421 see(&x.Token2, f) &&
422 see(&x.Token2, f) &&
423 see(&x.Token3, f) &&
424 f(x, false)
425 case *LogicalAndExpression:
426 return x == nil || f(x, true) &&
427 see(x.InclusiveOrExpression, f) &&
428 see(x.LogicalAndExpression, f) &&
429 see(&x.Token, f) &&
430 f(x, false)
431 case *LogicalOrExpression:
432 return x == nil || f(x, true) &&
433 see(x.LogicalAndExpression, f) &&
434 see(x.LogicalOrExpression, f) &&
435 see(&x.Token, f) &&
436 f(x, false)
437 case *MultiplicativeExpression:
438 return x == nil || f(x, true) &&
439 see(x.CastExpression, f) &&
440 see(x.MultiplicativeExpression, f) &&
441 see(&x.Token, f) &&
442 f(x, false)
443 case *ParameterDeclaration:
444 return x == nil || f(x, true) &&
445 see(x.AbstractDeclarator, f) &&
446 see(x.AttributeSpecifierList, f) &&
447 see(x.DeclarationSpecifiers, f) &&
448 see(x.Declarator, f) &&
449 f(x, false)
450 case *ParameterList:
451 return x == nil || f(x, true) &&
452 see(x.ParameterDeclaration, f) &&
453 see(x.ParameterList, f) &&
454 see(&x.Token, f) &&
455 f(x, false)
456 case *ParameterTypeList:
457 return x == nil || f(x, true) &&
458 see(x.ParameterList, f) &&
459 see(&x.Token, f) &&
460 see(&x.Token2, f) &&
461 see(&x.Token2, f) &&
462 f(x, false)
463 case *Pointer:
464 return x == nil || f(x, true) &&
465 see(x.Pointer, f) &&
466 see(x.TypeQualifiers, f) &&
467 see(&x.Token, f) &&
468 f(x, false)
469 case *PostfixExpression:
470 return x == nil || f(x, true) &&
471 see(x.ArgumentExpressionList, f) &&
472 see(x.Expression, f) &&
473 see(x.InitializerList, f) &&
474 see(x.PostfixExpression, f) &&
475 see(x.PrimaryExpression, f) &&
476 see(x.TypeName, f) &&
477 see(x.TypeName2, f) &&
478 see(&x.Token, f) &&
479 see(&x.Token2, f) &&
480 see(&x.Token2, f) &&
481 see(&x.Token3, f) &&
482 see(&x.Token4, f) &&
483 see(&x.Token5, f) &&
484 f(x, false)
485 case *PragmaSTDC:
486 return x == nil || f(x, true) &&
487 see(&x.Token, f) &&
488 see(&x.Token2, f) &&
489 see(&x.Token2, f) &&
490 see(&x.Token3, f) &&
491 see(&x.Token4, f) &&
492 f(x, false)
493 case *PrimaryExpression:
494 return x == nil || f(x, true) &&
495 see(x.CompoundStatement, f) &&
496 see(x.Expression, f) &&
497 see(&x.Token, f) &&
498 see(&x.Token2, f) &&
499 see(&x.Token2, f) &&
500 f(x, false)
501 case *RelationalExpression:
502 return x == nil || f(x, true) &&
503 see(x.RelationalExpression, f) &&
504 see(x.ShiftExpression, f) &&
505 see(&x.Token, f) &&
506 f(x, false)
507 case *SelectionStatement:
508 return x == nil || f(x, true) &&
509 see(x.Expression, f) &&
510 see(x.Statement, f) &&
511 see(x.Statement2, f) &&
512 see(&x.Token, f) &&
513 see(&x.Token2, f) &&
514 see(&x.Token2, f) &&
515 see(&x.Token3, f) &&
516 see(&x.Token4, f) &&
517 f(x, false)
518 case *ShiftExpression:
519 return x == nil || f(x, true) &&
520 see(x.AdditiveExpression, f) &&
521 see(x.ShiftExpression, f) &&
522 see(&x.Token, f) &&
523 f(x, false)
524 case *SpecifierQualifierList:
525 return x == nil || f(x, true) &&
526 see(x.AlignmentSpecifier, f) &&
527 see(x.AttributeSpecifier, f) &&
528 see(x.SpecifierQualifierList, f) &&
529 see(x.TypeQualifier, f) &&
530 see(x.TypeSpecifier, f) &&
531 f(x, false)
532 case *Statement:
533 return x == nil || f(x, true) &&
534 see(x.AsmStatement, f) &&
535 see(x.CompoundStatement, f) &&
536 see(x.ExpressionStatement, f) &&
537 see(x.IterationStatement, f) &&
538 see(x.JumpStatement, f) &&
539 see(x.LabeledStatement, f) &&
540 see(x.SelectionStatement, f) &&
541 f(x, false)
542 case *StorageClassSpecifier:
543 return x == nil || f(x, true) &&
544 see(&x.Token, f) &&
545 f(x, false)
546 case *StructDeclaration:
547 return x == nil || f(x, true) &&
548 see(x.SpecifierQualifierList, f) &&
549 see(x.StructDeclaratorList, f) &&
550 see(&x.Token, f) &&
551 f(x, false)
552 case *StructDeclarationList:
553 return x == nil || f(x, true) &&
554 see(x.StructDeclaration, f) &&
555 see(x.StructDeclarationList, f) &&
556 f(x, false)
557 case *StructDeclarator:
558 return x == nil || f(x, true) &&
559 see(x.AttributeSpecifierList, f) &&
560 see(x.ConstantExpression, f) &&
561 see(x.Declarator, f) &&
562 see(&x.Token, f) &&
563 f(x, false)
564 case *StructDeclaratorList:
565 return x == nil || f(x, true) &&
566 see(x.StructDeclarator, f) &&
567 see(x.StructDeclaratorList, f) &&
568 see(&x.Token, f) &&
569 f(x, false)
570 case *StructOrUnion:
571 return x == nil || f(x, true) &&
572 see(&x.Token, f) &&
573 f(x, false)
574 case *StructOrUnionSpecifier:
575 return x == nil || f(x, true) &&
576 see(x.AttributeSpecifierList, f) &&
577 see(x.StructDeclarationList, f) &&
578 see(x.StructOrUnion, f) &&
579 see(&x.Token, f) &&
580 see(&x.Token2, f) &&
581 see(&x.Token2, f) &&
582 see(&x.Token3, f) &&
583 f(x, false)
584 case *TranslationUnit:
585 return x == nil || f(x, true) &&
586 see(x.ExternalDeclaration, f) &&
587 see(x.TranslationUnit, f) &&
588 f(x, false)
589 case *TypeName:
590 return x == nil || f(x, true) &&
591 see(x.AbstractDeclarator, f) &&
592 see(x.SpecifierQualifierList, f) &&
593 f(x, false)
594 case *TypeQualifier:
595 return x == nil || f(x, true) &&
596 see(&x.Token, f) &&
597 f(x, false)
598 case *TypeQualifiers:
599 return x == nil || f(x, true) &&
600 see(x.AttributeSpecifier, f) &&
601 see(x.TypeQualifier, f) &&
602 see(x.TypeQualifiers, f) &&
603 f(x, false)
604 case *TypeSpecifier:
605 return x == nil || f(x, true) &&
606 see(x.AtomicTypeSpecifier, f) &&
607 see(x.EnumSpecifier, f) &&
608 see(x.Expression, f) &&
609 see(x.StructOrUnionSpecifier, f) &&
610 see(x.TypeName, f) &&
611 see(&x.Token, f) &&
612 see(&x.Token2, f) &&
613 see(&x.Token2, f) &&
614 see(&x.Token3, f) &&
615 f(x, false)
616 case *UnaryExpression:
617 return x == nil || f(x, true) &&
618 see(x.CastExpression, f) &&
619 see(x.PostfixExpression, f) &&
620 see(x.TypeName, f) &&
621 see(x.UnaryExpression, f) &&
622 see(&x.Token, f) &&
623 see(&x.Token2, f) &&
624 see(&x.Token2, f) &&
625 see(&x.Token3, f) &&
626 f(x, false)
627 case *Token:
628 return f(x, true)
629 default:
630 panic(todo("internal error: %T", x))
631 }
632}
Note: See TracBrowser for help on using the repository browser.