mirror of
https://codeberg.org/superseriousbusiness/gotosocial.git
synced 2024-12-27 03:18:16 +03:00
633 lines
17 KiB
Go
633 lines
17 KiB
Go
|
// Copyright 2020 The CC Authors. All rights reserved.
|
||
|
// Use of this source code is governed by a BSD-style
|
||
|
// license that can be found in the LICENSE file.
|
||
|
|
||
|
package cc // import "modernc.org/cc/v3"
|
||
|
|
||
|
// Inspect inspects AST node trees.
|
||
|
//
|
||
|
// If n is a non-terminal node, f(n, true) is called first. Next, f is called
|
||
|
// recursively for each of n's non-nil non-terminal children nodes, if any, in
|
||
|
// alphabetical order. Next, all n's terminal nodes, if any, are visited in
|
||
|
// the numeric order of their suffixes (Token, Token2, Token3, ...). Finally,
|
||
|
// f(n, false) is invoked.
|
||
|
//
|
||
|
// If n a terminal node, of type *Token, f(n, <unspecified boolean value> is
|
||
|
// called once.
|
||
|
//
|
||
|
// Inspect stops when any invocation of f returns false.
|
||
|
func Inspect(n Node, f func(Node, bool) bool) {
|
||
|
see(n, f)
|
||
|
}
|
||
|
|
||
|
func see(n Node, f func(Node, bool) bool) bool {
|
||
|
switch x := n.(type) {
|
||
|
case *AbstractDeclarator:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.DirectAbstractDeclarator, f) &&
|
||
|
see(x.Pointer, f) &&
|
||
|
f(x, false)
|
||
|
case *AdditiveExpression:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.AdditiveExpression, f) &&
|
||
|
see(x.MultiplicativeExpression, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
f(x, false)
|
||
|
case *AlignmentSpecifier:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.ConstantExpression, f) &&
|
||
|
see(x.TypeName, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token3, f) &&
|
||
|
f(x, false)
|
||
|
case *AndExpression:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.AndExpression, f) &&
|
||
|
see(x.EqualityExpression, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
f(x, false)
|
||
|
case *ArgumentExpressionList:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.ArgumentExpressionList, f) &&
|
||
|
see(x.AssignmentExpression, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
f(x, false)
|
||
|
case *Asm:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.AsmArgList, f) &&
|
||
|
see(x.AsmQualifierList, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token3, f) &&
|
||
|
see(&x.Token4, f) &&
|
||
|
f(x, false)
|
||
|
case *AsmArgList:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.AsmArgList, f) &&
|
||
|
see(x.AsmExpressionList, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
f(x, false)
|
||
|
case *AsmExpressionList:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.AsmExpressionList, f) &&
|
||
|
see(x.AsmIndex, f) &&
|
||
|
see(x.AssignmentExpression, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
f(x, false)
|
||
|
case *AsmFunctionDefinition:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.AsmStatement, f) &&
|
||
|
see(x.DeclarationSpecifiers, f) &&
|
||
|
see(x.Declarator, f) &&
|
||
|
f(x, false)
|
||
|
case *AsmIndex:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.Expression, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
f(x, false)
|
||
|
case *AsmQualifier:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(&x.Token, f) &&
|
||
|
f(x, false)
|
||
|
case *AsmQualifierList:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.AsmQualifier, f) &&
|
||
|
see(x.AsmQualifierList, f) &&
|
||
|
f(x, false)
|
||
|
case *AsmStatement:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.Asm, f) &&
|
||
|
see(x.AttributeSpecifierList, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
f(x, false)
|
||
|
case *AssignmentExpression:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.AssignmentExpression, f) &&
|
||
|
see(x.ConditionalExpression, f) &&
|
||
|
see(x.UnaryExpression, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
f(x, false)
|
||
|
case *AtomicTypeSpecifier:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.TypeName, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token3, f) &&
|
||
|
f(x, false)
|
||
|
case *AttributeSpecifier:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.AttributeValueList, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token3, f) &&
|
||
|
see(&x.Token4, f) &&
|
||
|
see(&x.Token5, f) &&
|
||
|
f(x, false)
|
||
|
case *AttributeSpecifierList:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.AttributeSpecifier, f) &&
|
||
|
see(x.AttributeSpecifierList, f) &&
|
||
|
f(x, false)
|
||
|
case *AttributeValue:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.ExpressionList, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token3, f) &&
|
||
|
f(x, false)
|
||
|
case *AttributeValueList:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.AttributeValue, f) &&
|
||
|
see(x.AttributeValueList, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
f(x, false)
|
||
|
case *BlockItem:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.CompoundStatement, f) &&
|
||
|
see(x.Declaration, f) &&
|
||
|
see(x.DeclarationSpecifiers, f) &&
|
||
|
see(x.Declarator, f) &&
|
||
|
see(x.LabelDeclaration, f) &&
|
||
|
see(x.PragmaSTDC, f) &&
|
||
|
see(x.Statement, f) &&
|
||
|
f(x, false)
|
||
|
case *BlockItemList:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.BlockItem, f) &&
|
||
|
see(x.BlockItemList, f) &&
|
||
|
f(x, false)
|
||
|
case *CastExpression:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.CastExpression, f) &&
|
||
|
see(x.TypeName, f) &&
|
||
|
see(x.UnaryExpression, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
f(x, false)
|
||
|
case *CompoundStatement:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.BlockItemList, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
f(x, false)
|
||
|
case *ConditionalExpression:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.ConditionalExpression, f) &&
|
||
|
see(x.Expression, f) &&
|
||
|
see(x.LogicalOrExpression, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
f(x, false)
|
||
|
case *ConstantExpression:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.ConditionalExpression, f) &&
|
||
|
f(x, false)
|
||
|
case *Declaration:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.DeclarationSpecifiers, f) &&
|
||
|
see(x.InitDeclaratorList, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
f(x, false)
|
||
|
case *DeclarationList:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.Declaration, f) &&
|
||
|
see(x.DeclarationList, f) &&
|
||
|
f(x, false)
|
||
|
case *DeclarationSpecifiers:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.AlignmentSpecifier, f) &&
|
||
|
see(x.AttributeSpecifier, f) &&
|
||
|
see(x.DeclarationSpecifiers, f) &&
|
||
|
see(x.FunctionSpecifier, f) &&
|
||
|
see(x.StorageClassSpecifier, f) &&
|
||
|
see(x.TypeQualifier, f) &&
|
||
|
see(x.TypeSpecifier, f) &&
|
||
|
f(x, false)
|
||
|
case *Declarator:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.AttributeSpecifierList, f) &&
|
||
|
see(x.DirectDeclarator, f) &&
|
||
|
see(x.Pointer, f) &&
|
||
|
f(x, false)
|
||
|
case *Designation:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.DesignatorList, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
f(x, false)
|
||
|
case *Designator:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.ConstantExpression, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
f(x, false)
|
||
|
case *DesignatorList:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.Designator, f) &&
|
||
|
see(x.DesignatorList, f) &&
|
||
|
f(x, false)
|
||
|
case *DirectAbstractDeclarator:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.AbstractDeclarator, f) &&
|
||
|
see(x.AssignmentExpression, f) &&
|
||
|
see(x.DirectAbstractDeclarator, f) &&
|
||
|
see(x.ParameterTypeList, f) &&
|
||
|
see(x.TypeQualifiers, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token3, f) &&
|
||
|
f(x, false)
|
||
|
case *DirectDeclarator:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.Asm, f) &&
|
||
|
see(x.AssignmentExpression, f) &&
|
||
|
see(x.AttributeSpecifierList, f) &&
|
||
|
see(x.Declarator, f) &&
|
||
|
see(x.DirectDeclarator, f) &&
|
||
|
see(x.IdentifierList, f) &&
|
||
|
see(x.ParameterTypeList, f) &&
|
||
|
see(x.TypeQualifiers, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token3, f) &&
|
||
|
f(x, false)
|
||
|
case *EnumSpecifier:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.AttributeSpecifierList, f) &&
|
||
|
see(x.EnumeratorList, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token3, f) &&
|
||
|
see(&x.Token4, f) &&
|
||
|
see(&x.Token5, f) &&
|
||
|
f(x, false)
|
||
|
case *Enumerator:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.AttributeSpecifierList, f) &&
|
||
|
see(x.ConstantExpression, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
f(x, false)
|
||
|
case *EnumeratorList:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.Enumerator, f) &&
|
||
|
see(x.EnumeratorList, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
f(x, false)
|
||
|
case *EqualityExpression:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.EqualityExpression, f) &&
|
||
|
see(x.RelationalExpression, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
f(x, false)
|
||
|
case *ExclusiveOrExpression:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.AndExpression, f) &&
|
||
|
see(x.ExclusiveOrExpression, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
f(x, false)
|
||
|
case *Expression:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.AssignmentExpression, f) &&
|
||
|
see(x.Expression, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
f(x, false)
|
||
|
case *ExpressionList:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.AssignmentExpression, f) &&
|
||
|
see(x.ExpressionList, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
f(x, false)
|
||
|
case *ExpressionStatement:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.AttributeSpecifierList, f) &&
|
||
|
see(x.Expression, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
f(x, false)
|
||
|
case *ExternalDeclaration:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.AsmFunctionDefinition, f) &&
|
||
|
see(x.AsmStatement, f) &&
|
||
|
see(x.Declaration, f) &&
|
||
|
see(x.FunctionDefinition, f) &&
|
||
|
see(x.PragmaSTDC, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
f(x, false)
|
||
|
case *FunctionDefinition:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.CompoundStatement, f) &&
|
||
|
see(x.DeclarationList, f) &&
|
||
|
see(x.DeclarationSpecifiers, f) &&
|
||
|
see(x.Declarator, f) &&
|
||
|
f(x, false)
|
||
|
case *FunctionSpecifier:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(&x.Token, f) &&
|
||
|
f(x, false)
|
||
|
case *IdentifierList:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.IdentifierList, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
f(x, false)
|
||
|
case *InclusiveOrExpression:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.ExclusiveOrExpression, f) &&
|
||
|
see(x.InclusiveOrExpression, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
f(x, false)
|
||
|
case *InitDeclarator:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.AttributeSpecifierList, f) &&
|
||
|
see(x.Declarator, f) &&
|
||
|
see(x.Initializer, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
f(x, false)
|
||
|
case *InitDeclaratorList:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.AttributeSpecifierList, f) &&
|
||
|
see(x.InitDeclarator, f) &&
|
||
|
see(x.InitDeclaratorList, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
f(x, false)
|
||
|
case *Initializer:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.AssignmentExpression, f) &&
|
||
|
see(x.InitializerList, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token3, f) &&
|
||
|
f(x, false)
|
||
|
case *InitializerList:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.Designation, f) &&
|
||
|
see(x.Initializer, f) &&
|
||
|
see(x.InitializerList, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
f(x, false)
|
||
|
case *IterationStatement:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.Declaration, f) &&
|
||
|
see(x.Expression, f) &&
|
||
|
see(x.Expression2, f) &&
|
||
|
see(x.Expression3, f) &&
|
||
|
see(x.Statement, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token3, f) &&
|
||
|
see(&x.Token4, f) &&
|
||
|
see(&x.Token5, f) &&
|
||
|
f(x, false)
|
||
|
case *JumpStatement:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.Expression, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token3, f) &&
|
||
|
f(x, false)
|
||
|
case *LabelDeclaration:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.IdentifierList, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
f(x, false)
|
||
|
case *LabeledStatement:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.AttributeSpecifierList, f) &&
|
||
|
see(x.ConstantExpression, f) &&
|
||
|
see(x.ConstantExpression2, f) &&
|
||
|
see(x.Statement, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token3, f) &&
|
||
|
f(x, false)
|
||
|
case *LogicalAndExpression:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.InclusiveOrExpression, f) &&
|
||
|
see(x.LogicalAndExpression, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
f(x, false)
|
||
|
case *LogicalOrExpression:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.LogicalAndExpression, f) &&
|
||
|
see(x.LogicalOrExpression, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
f(x, false)
|
||
|
case *MultiplicativeExpression:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.CastExpression, f) &&
|
||
|
see(x.MultiplicativeExpression, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
f(x, false)
|
||
|
case *ParameterDeclaration:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.AbstractDeclarator, f) &&
|
||
|
see(x.AttributeSpecifierList, f) &&
|
||
|
see(x.DeclarationSpecifiers, f) &&
|
||
|
see(x.Declarator, f) &&
|
||
|
f(x, false)
|
||
|
case *ParameterList:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.ParameterDeclaration, f) &&
|
||
|
see(x.ParameterList, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
f(x, false)
|
||
|
case *ParameterTypeList:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.ParameterList, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
f(x, false)
|
||
|
case *Pointer:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.Pointer, f) &&
|
||
|
see(x.TypeQualifiers, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
f(x, false)
|
||
|
case *PostfixExpression:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.ArgumentExpressionList, f) &&
|
||
|
see(x.Expression, f) &&
|
||
|
see(x.InitializerList, f) &&
|
||
|
see(x.PostfixExpression, f) &&
|
||
|
see(x.PrimaryExpression, f) &&
|
||
|
see(x.TypeName, f) &&
|
||
|
see(x.TypeName2, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token3, f) &&
|
||
|
see(&x.Token4, f) &&
|
||
|
see(&x.Token5, f) &&
|
||
|
f(x, false)
|
||
|
case *PragmaSTDC:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(&x.Token, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token3, f) &&
|
||
|
see(&x.Token4, f) &&
|
||
|
f(x, false)
|
||
|
case *PrimaryExpression:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.CompoundStatement, f) &&
|
||
|
see(x.Expression, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
f(x, false)
|
||
|
case *RelationalExpression:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.RelationalExpression, f) &&
|
||
|
see(x.ShiftExpression, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
f(x, false)
|
||
|
case *SelectionStatement:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.Expression, f) &&
|
||
|
see(x.Statement, f) &&
|
||
|
see(x.Statement2, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token3, f) &&
|
||
|
see(&x.Token4, f) &&
|
||
|
f(x, false)
|
||
|
case *ShiftExpression:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.AdditiveExpression, f) &&
|
||
|
see(x.ShiftExpression, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
f(x, false)
|
||
|
case *SpecifierQualifierList:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.AlignmentSpecifier, f) &&
|
||
|
see(x.AttributeSpecifier, f) &&
|
||
|
see(x.SpecifierQualifierList, f) &&
|
||
|
see(x.TypeQualifier, f) &&
|
||
|
see(x.TypeSpecifier, f) &&
|
||
|
f(x, false)
|
||
|
case *Statement:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.AsmStatement, f) &&
|
||
|
see(x.CompoundStatement, f) &&
|
||
|
see(x.ExpressionStatement, f) &&
|
||
|
see(x.IterationStatement, f) &&
|
||
|
see(x.JumpStatement, f) &&
|
||
|
see(x.LabeledStatement, f) &&
|
||
|
see(x.SelectionStatement, f) &&
|
||
|
f(x, false)
|
||
|
case *StorageClassSpecifier:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(&x.Token, f) &&
|
||
|
f(x, false)
|
||
|
case *StructDeclaration:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.SpecifierQualifierList, f) &&
|
||
|
see(x.StructDeclaratorList, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
f(x, false)
|
||
|
case *StructDeclarationList:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.StructDeclaration, f) &&
|
||
|
see(x.StructDeclarationList, f) &&
|
||
|
f(x, false)
|
||
|
case *StructDeclarator:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.AttributeSpecifierList, f) &&
|
||
|
see(x.ConstantExpression, f) &&
|
||
|
see(x.Declarator, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
f(x, false)
|
||
|
case *StructDeclaratorList:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.StructDeclarator, f) &&
|
||
|
see(x.StructDeclaratorList, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
f(x, false)
|
||
|
case *StructOrUnion:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(&x.Token, f) &&
|
||
|
f(x, false)
|
||
|
case *StructOrUnionSpecifier:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.AttributeSpecifierList, f) &&
|
||
|
see(x.StructDeclarationList, f) &&
|
||
|
see(x.StructOrUnion, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token3, f) &&
|
||
|
f(x, false)
|
||
|
case *TranslationUnit:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.ExternalDeclaration, f) &&
|
||
|
see(x.TranslationUnit, f) &&
|
||
|
f(x, false)
|
||
|
case *TypeName:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.AbstractDeclarator, f) &&
|
||
|
see(x.SpecifierQualifierList, f) &&
|
||
|
f(x, false)
|
||
|
case *TypeQualifier:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(&x.Token, f) &&
|
||
|
f(x, false)
|
||
|
case *TypeQualifiers:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.AttributeSpecifier, f) &&
|
||
|
see(x.TypeQualifier, f) &&
|
||
|
see(x.TypeQualifiers, f) &&
|
||
|
f(x, false)
|
||
|
case *TypeSpecifier:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.AtomicTypeSpecifier, f) &&
|
||
|
see(x.EnumSpecifier, f) &&
|
||
|
see(x.Expression, f) &&
|
||
|
see(x.StructOrUnionSpecifier, f) &&
|
||
|
see(x.TypeName, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token3, f) &&
|
||
|
f(x, false)
|
||
|
case *UnaryExpression:
|
||
|
return x == nil || f(x, true) &&
|
||
|
see(x.CastExpression, f) &&
|
||
|
see(x.PostfixExpression, f) &&
|
||
|
see(x.TypeName, f) &&
|
||
|
see(x.UnaryExpression, f) &&
|
||
|
see(&x.Token, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token2, f) &&
|
||
|
see(&x.Token3, f) &&
|
||
|
f(x, false)
|
||
|
case *Token:
|
||
|
return f(x, true)
|
||
|
default:
|
||
|
panic(todo("internal error: %T", x))
|
||
|
}
|
||
|
}
|