diff options
Diffstat (limited to 'vendor/golang.org/x')
| -rw-r--r-- | vendor/golang.org/x/tools/AUTHORS | 3 | ||||
| -rw-r--r-- | vendor/golang.org/x/tools/CONTRIBUTORS | 3 | ||||
| -rw-r--r-- | vendor/golang.org/x/tools/LICENSE | 27 | ||||
| -rw-r--r-- | vendor/golang.org/x/tools/PATENTS | 22 | ||||
| -rw-r--r-- | vendor/golang.org/x/tools/go/ast/inspector/inspector.go | 186 | ||||
| -rw-r--r-- | vendor/golang.org/x/tools/go/ast/inspector/typeof.go | 216 | 
6 files changed, 457 insertions, 0 deletions
diff --git a/vendor/golang.org/x/tools/AUTHORS b/vendor/golang.org/x/tools/AUTHORS new file mode 100644 index 000000000..15167cd74 --- /dev/null +++ b/vendor/golang.org/x/tools/AUTHORS @@ -0,0 +1,3 @@ +# This source code refers to The Go Authors for copyright purposes. +# The master list of authors is in the main Go distribution, +# visible at http://tip.golang.org/AUTHORS. diff --git a/vendor/golang.org/x/tools/CONTRIBUTORS b/vendor/golang.org/x/tools/CONTRIBUTORS new file mode 100644 index 000000000..1c4577e96 --- /dev/null +++ b/vendor/golang.org/x/tools/CONTRIBUTORS @@ -0,0 +1,3 @@ +# This source code was written by the Go contributors. +# The master list of contributors is in the main Go distribution, +# visible at http://tip.golang.org/CONTRIBUTORS. diff --git a/vendor/golang.org/x/tools/LICENSE b/vendor/golang.org/x/tools/LICENSE new file mode 100644 index 000000000..6a66aea5e --- /dev/null +++ b/vendor/golang.org/x/tools/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +   * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. +   * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. +   * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/golang.org/x/tools/PATENTS b/vendor/golang.org/x/tools/PATENTS new file mode 100644 index 000000000..733099041 --- /dev/null +++ b/vendor/golang.org/x/tools/PATENTS @@ -0,0 +1,22 @@ +Additional IP Rights Grant (Patents) + +"This implementation" means the copyrightable works distributed by +Google as part of the Go project. + +Google hereby grants to You a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable (except as stated in this section) +patent license to make, have made, use, offer to sell, sell, import, +transfer and otherwise run, modify and propagate the contents of this +implementation of Go, where such license applies only to those patent +claims, both currently owned or controlled by Google and acquired in +the future, licensable by Google that are necessarily infringed by this +implementation of Go.  This grant does not include claims that would be +infringed only as a consequence of further modification of this +implementation.  If you or your agent or exclusive licensee institute or +order or agree to the institution of patent litigation against any +entity (including a cross-claim or counterclaim in a lawsuit) alleging +that this implementation of Go or any code incorporated within this +implementation of Go constitutes direct or contributory patent +infringement, or inducement of patent infringement, then any patent +rights granted to you under this License for this implementation of Go +shall terminate as of the date such litigation is filed. diff --git a/vendor/golang.org/x/tools/go/ast/inspector/inspector.go b/vendor/golang.org/x/tools/go/ast/inspector/inspector.go new file mode 100644 index 000000000..af5e17fee --- /dev/null +++ b/vendor/golang.org/x/tools/go/ast/inspector/inspector.go @@ -0,0 +1,186 @@ +// Copyright 2018 The Go 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 inspector provides helper functions for traversal over the +// syntax trees of a package, including node filtering by type, and +// materialization of the traversal stack. +// +// During construction, the inspector does a complete traversal and +// builds a list of push/pop events and their node type. Subsequent +// method calls that request a traversal scan this list, rather than walk +// the AST, and perform type filtering using efficient bit sets. +// +// Experiments suggest the inspector's traversals are about 2.5x faster +// than ast.Inspect, but it may take around 5 traversals for this +// benefit to amortize the inspector's construction cost. +// If efficiency is the primary concern, do not use Inspector for +// one-off traversals. +package inspector + +// There are four orthogonal features in a traversal: +//  1 type filtering +//  2 pruning +//  3 postorder calls to f +//  4 stack +// Rather than offer all of them in the API, +// only a few combinations are exposed: +// - Preorder is the fastest and has fewest features, +//   but is the most commonly needed traversal. +// - Nodes and WithStack both provide pruning and postorder calls, +//   even though few clients need it, because supporting two versions +//   is not justified. +// More combinations could be supported by expressing them as +// wrappers around a more generic traversal, but this was measured +// and found to degrade performance significantly (30%). + +import ( +	"go/ast" +) + +// An Inspector provides methods for inspecting +// (traversing) the syntax trees of a package. +type Inspector struct { +	events []event +} + +// New returns an Inspector for the specified syntax trees. +func New(files []*ast.File) *Inspector { +	return &Inspector{traverse(files)} +} + +// An event represents a push or a pop +// of an ast.Node during a traversal. +type event struct { +	node  ast.Node +	typ   uint64 // typeOf(node) +	index int    // 1 + index of corresponding pop event, or 0 if this is a pop +} + +// Preorder visits all the nodes of the files supplied to New in +// depth-first order. It calls f(n) for each node n before it visits +// n's children. +// +// The types argument, if non-empty, enables type-based filtering of +// events. The function f if is called only for nodes whose type +// matches an element of the types slice. +func (in *Inspector) Preorder(types []ast.Node, f func(ast.Node)) { +	// Because it avoids postorder calls to f, and the pruning +	// check, Preorder is almost twice as fast as Nodes. The two +	// features seem to contribute similar slowdowns (~1.4x each). + +	mask := maskOf(types) +	for i := 0; i < len(in.events); { +		ev := in.events[i] +		if ev.typ&mask != 0 { +			if ev.index > 0 { +				f(ev.node) +			} +		} +		i++ +	} +} + +// Nodes visits the nodes of the files supplied to New in depth-first +// order. It calls f(n, true) for each node n before it visits n's +// children. If f returns true, Nodes invokes f recursively for each +// of the non-nil children of the node, followed by a call of +// f(n, false). +// +// The types argument, if non-empty, enables type-based filtering of +// events. The function f if is called only for nodes whose type +// matches an element of the types slice. +func (in *Inspector) Nodes(types []ast.Node, f func(n ast.Node, push bool) (proceed bool)) { +	mask := maskOf(types) +	for i := 0; i < len(in.events); { +		ev := in.events[i] +		if ev.typ&mask != 0 { +			if ev.index > 0 { +				// push +				if !f(ev.node, true) { +					i = ev.index // jump to corresponding pop + 1 +					continue +				} +			} else { +				// pop +				f(ev.node, false) +			} +		} +		i++ +	} +} + +// WithStack visits nodes in a similar manner to Nodes, but it +// supplies each call to f an additional argument, the current +// traversal stack. The stack's first element is the outermost node, +// an *ast.File; its last is the innermost, n. +func (in *Inspector) WithStack(types []ast.Node, f func(n ast.Node, push bool, stack []ast.Node) (proceed bool)) { +	mask := maskOf(types) +	var stack []ast.Node +	for i := 0; i < len(in.events); { +		ev := in.events[i] +		if ev.index > 0 { +			// push +			stack = append(stack, ev.node) +			if ev.typ&mask != 0 { +				if !f(ev.node, true, stack) { +					i = ev.index +					stack = stack[:len(stack)-1] +					continue +				} +			} +		} else { +			// pop +			if ev.typ&mask != 0 { +				f(ev.node, false, stack) +			} +			stack = stack[:len(stack)-1] +		} +		i++ +	} +} + +// traverse builds the table of events representing a traversal. +func traverse(files []*ast.File) []event { +	// Preallocate approximate number of events +	// based on source file extent. +	// This makes traverse faster by 4x (!). +	var extent int +	for _, f := range files { +		extent += int(f.End() - f.Pos()) +	} +	// This estimate is based on the net/http package. +	capacity := extent * 33 / 100 +	if capacity > 1e6 { +		capacity = 1e6 // impose some reasonable maximum +	} +	events := make([]event, 0, capacity) + +	var stack []event +	for _, f := range files { +		ast.Inspect(f, func(n ast.Node) bool { +			if n != nil { +				// push +				ev := event{ +					node:  n, +					typ:   typeOf(n), +					index: len(events), // push event temporarily holds own index +				} +				stack = append(stack, ev) +				events = append(events, ev) +			} else { +				// pop +				ev := stack[len(stack)-1] +				stack = stack[:len(stack)-1] + +				events[ev.index].index = len(events) + 1 // make push refer to pop + +				ev.index = 0 // turn ev into a pop event +				events = append(events, ev) +			} +			return true +		}) +	} + +	return events +} diff --git a/vendor/golang.org/x/tools/go/ast/inspector/typeof.go b/vendor/golang.org/x/tools/go/ast/inspector/typeof.go new file mode 100644 index 000000000..d61301b13 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ast/inspector/typeof.go @@ -0,0 +1,216 @@ +package inspector + +// This file defines func typeOf(ast.Node) uint64. +// +// The initial map-based implementation was too slow; +// see https://go-review.googlesource.com/c/tools/+/135655/1/go/ast/inspector/inspector.go#196 + +import "go/ast" + +const ( +	nArrayType = iota +	nAssignStmt +	nBadDecl +	nBadExpr +	nBadStmt +	nBasicLit +	nBinaryExpr +	nBlockStmt +	nBranchStmt +	nCallExpr +	nCaseClause +	nChanType +	nCommClause +	nComment +	nCommentGroup +	nCompositeLit +	nDeclStmt +	nDeferStmt +	nEllipsis +	nEmptyStmt +	nExprStmt +	nField +	nFieldList +	nFile +	nForStmt +	nFuncDecl +	nFuncLit +	nFuncType +	nGenDecl +	nGoStmt +	nIdent +	nIfStmt +	nImportSpec +	nIncDecStmt +	nIndexExpr +	nInterfaceType +	nKeyValueExpr +	nLabeledStmt +	nMapType +	nPackage +	nParenExpr +	nRangeStmt +	nReturnStmt +	nSelectStmt +	nSelectorExpr +	nSendStmt +	nSliceExpr +	nStarExpr +	nStructType +	nSwitchStmt +	nTypeAssertExpr +	nTypeSpec +	nTypeSwitchStmt +	nUnaryExpr +	nValueSpec +) + +// typeOf returns a distinct single-bit value that represents the type of n. +// +// Various implementations were benchmarked with BenchmarkNewInspector: +//								GOGC=off +// - type switch				4.9-5.5ms	2.1ms +// - binary search over a sorted list of types  5.5-5.9ms	2.5ms +// - linear scan, frequency-ordered list 	5.9-6.1ms	2.7ms +// - linear scan, unordered list		6.4ms		2.7ms +// - hash table					6.5ms		3.1ms +// A perfect hash seemed like overkill. +// +// The compiler's switch statement is the clear winner +// as it produces a binary tree in code, +// with constant conditions and good branch prediction. +// (Sadly it is the most verbose in source code.) +// Binary search suffered from poor branch prediction. +// +func typeOf(n ast.Node) uint64 { +	// Fast path: nearly half of all nodes are identifiers. +	if _, ok := n.(*ast.Ident); ok { +		return 1 << nIdent +	} + +	// These cases include all nodes encountered by ast.Inspect. +	switch n.(type) { +	case *ast.ArrayType: +		return 1 << nArrayType +	case *ast.AssignStmt: +		return 1 << nAssignStmt +	case *ast.BadDecl: +		return 1 << nBadDecl +	case *ast.BadExpr: +		return 1 << nBadExpr +	case *ast.BadStmt: +		return 1 << nBadStmt +	case *ast.BasicLit: +		return 1 << nBasicLit +	case *ast.BinaryExpr: +		return 1 << nBinaryExpr +	case *ast.BlockStmt: +		return 1 << nBlockStmt +	case *ast.BranchStmt: +		return 1 << nBranchStmt +	case *ast.CallExpr: +		return 1 << nCallExpr +	case *ast.CaseClause: +		return 1 << nCaseClause +	case *ast.ChanType: +		return 1 << nChanType +	case *ast.CommClause: +		return 1 << nCommClause +	case *ast.Comment: +		return 1 << nComment +	case *ast.CommentGroup: +		return 1 << nCommentGroup +	case *ast.CompositeLit: +		return 1 << nCompositeLit +	case *ast.DeclStmt: +		return 1 << nDeclStmt +	case *ast.DeferStmt: +		return 1 << nDeferStmt +	case *ast.Ellipsis: +		return 1 << nEllipsis +	case *ast.EmptyStmt: +		return 1 << nEmptyStmt +	case *ast.ExprStmt: +		return 1 << nExprStmt +	case *ast.Field: +		return 1 << nField +	case *ast.FieldList: +		return 1 << nFieldList +	case *ast.File: +		return 1 << nFile +	case *ast.ForStmt: +		return 1 << nForStmt +	case *ast.FuncDecl: +		return 1 << nFuncDecl +	case *ast.FuncLit: +		return 1 << nFuncLit +	case *ast.FuncType: +		return 1 << nFuncType +	case *ast.GenDecl: +		return 1 << nGenDecl +	case *ast.GoStmt: +		return 1 << nGoStmt +	case *ast.Ident: +		return 1 << nIdent +	case *ast.IfStmt: +		return 1 << nIfStmt +	case *ast.ImportSpec: +		return 1 << nImportSpec +	case *ast.IncDecStmt: +		return 1 << nIncDecStmt +	case *ast.IndexExpr: +		return 1 << nIndexExpr +	case *ast.InterfaceType: +		return 1 << nInterfaceType +	case *ast.KeyValueExpr: +		return 1 << nKeyValueExpr +	case *ast.LabeledStmt: +		return 1 << nLabeledStmt +	case *ast.MapType: +		return 1 << nMapType +	case *ast.Package: +		return 1 << nPackage +	case *ast.ParenExpr: +		return 1 << nParenExpr +	case *ast.RangeStmt: +		return 1 << nRangeStmt +	case *ast.ReturnStmt: +		return 1 << nReturnStmt +	case *ast.SelectStmt: +		return 1 << nSelectStmt +	case *ast.SelectorExpr: +		return 1 << nSelectorExpr +	case *ast.SendStmt: +		return 1 << nSendStmt +	case *ast.SliceExpr: +		return 1 << nSliceExpr +	case *ast.StarExpr: +		return 1 << nStarExpr +	case *ast.StructType: +		return 1 << nStructType +	case *ast.SwitchStmt: +		return 1 << nSwitchStmt +	case *ast.TypeAssertExpr: +		return 1 << nTypeAssertExpr +	case *ast.TypeSpec: +		return 1 << nTypeSpec +	case *ast.TypeSwitchStmt: +		return 1 << nTypeSwitchStmt +	case *ast.UnaryExpr: +		return 1 << nUnaryExpr +	case *ast.ValueSpec: +		return 1 << nValueSpec +	} +	return 0 +} + +func maskOf(nodes []ast.Node) uint64 { +	if nodes == nil { +		return 1<<64 - 1 // match all node types +	} +	var mask uint64 +	for _, n := range nodes { +		mask |= typeOf(n) +	} +	return mask +}  | 
