diff options
Diffstat (limited to 'vendor/modernc.org/cc/v3/inspect.go')
-rw-r--r-- | vendor/modernc.org/cc/v3/inspect.go | 632 |
1 files changed, 632 insertions, 0 deletions
diff --git a/vendor/modernc.org/cc/v3/inspect.go b/vendor/modernc.org/cc/v3/inspect.go new file mode 100644 index 00000000..31d44302 --- /dev/null +++ b/vendor/modernc.org/cc/v3/inspect.go @@ -0,0 +1,632 @@ +// 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)) + } +} |