Giant blob of minor changes
[dotfiles/.git] / .config / coc / extensions / coc-go-data / tools / pkg / mod / honnef.co / go / tools@v0.0.1-2020.1.5 / pattern / pattern.go
diff --git a/.config/coc/extensions/coc-go-data/tools/pkg/mod/honnef.co/go/tools@v0.0.1-2020.1.5/pattern/pattern.go b/.config/coc/extensions/coc-go-data/tools/pkg/mod/honnef.co/go/tools@v0.0.1-2020.1.5/pattern/pattern.go
new file mode 100644 (file)
index 0000000..d746056
--- /dev/null
@@ -0,0 +1,497 @@
+package pattern
+
+import (
+       "fmt"
+       "go/token"
+       "reflect"
+       "strings"
+)
+
+var (
+       _ Node = Ellipsis{}
+       _ Node = Binding{}
+       _ Node = RangeStmt{}
+       _ Node = AssignStmt{}
+       _ Node = IndexExpr{}
+       _ Node = Ident{}
+       _ Node = Builtin{}
+       _ Node = String("")
+       _ Node = Any{}
+       _ Node = ValueSpec{}
+       _ Node = List{}
+       _ Node = GenDecl{}
+       _ Node = BinaryExpr{}
+       _ Node = ForStmt{}
+       _ Node = ArrayType{}
+       _ Node = DeferStmt{}
+       _ Node = MapType{}
+       _ Node = ReturnStmt{}
+       _ Node = SliceExpr{}
+       _ Node = StarExpr{}
+       _ Node = UnaryExpr{}
+       _ Node = SendStmt{}
+       _ Node = SelectStmt{}
+       _ Node = ImportSpec{}
+       _ Node = IfStmt{}
+       _ Node = GoStmt{}
+       _ Node = Field{}
+       _ Node = SelectorExpr{}
+       _ Node = StructType{}
+       _ Node = KeyValueExpr{}
+       _ Node = FuncType{}
+       _ Node = FuncLit{}
+       _ Node = FuncDecl{}
+       _ Node = Token(0)
+       _ Node = ChanType{}
+       _ Node = CallExpr{}
+       _ Node = CaseClause{}
+       _ Node = CommClause{}
+       _ Node = CompositeLit{}
+       _ Node = EmptyStmt{}
+       _ Node = SwitchStmt{}
+       _ Node = TypeSwitchStmt{}
+       _ Node = TypeAssertExpr{}
+       _ Node = TypeSpec{}
+       _ Node = InterfaceType{}
+       _ Node = BranchStmt{}
+       _ Node = IncDecStmt{}
+       _ Node = BasicLit{}
+       _ Node = Nil{}
+       _ Node = Object{}
+       _ Node = Function{}
+       _ Node = Not{}
+       _ Node = Or{}
+)
+
+type Function struct {
+       Name Node
+}
+
+type Token token.Token
+
+type Nil struct {
+}
+
+type Ellipsis struct {
+       Elt Node
+}
+
+type IncDecStmt struct {
+       X   Node
+       Tok Node
+}
+
+type BranchStmt struct {
+       Tok   Node
+       Label Node
+}
+
+type InterfaceType struct {
+       Methods Node
+}
+
+type TypeSpec struct {
+       Name Node
+       Type Node
+}
+
+type TypeAssertExpr struct {
+       X    Node
+       Type Node
+}
+
+type TypeSwitchStmt struct {
+       Init   Node
+       Assign Node
+       Body   Node
+}
+
+type SwitchStmt struct {
+       Init Node
+       Tag  Node
+       Body Node
+}
+
+type EmptyStmt struct {
+}
+
+type CompositeLit struct {
+       Type Node
+       Elts Node
+}
+
+type CommClause struct {
+       Comm Node
+       Body Node
+}
+
+type CaseClause struct {
+       List Node
+       Body Node
+}
+
+type CallExpr struct {
+       Fun  Node
+       Args Node
+       // XXX handle ellipsis
+}
+
+// TODO(dh): add a ChanDir node, and a way of instantiating it.
+
+type ChanType struct {
+       Dir   Node
+       Value Node
+}
+
+type FuncDecl struct {
+       Recv Node
+       Name Node
+       Type Node
+       Body Node
+}
+
+type FuncLit struct {
+       Type Node
+       Body Node
+}
+
+type FuncType struct {
+       Params  Node
+       Results Node
+}
+
+type KeyValueExpr struct {
+       Key   Node
+       Value Node
+}
+
+type StructType struct {
+       Fields Node
+}
+
+type SelectorExpr struct {
+       X   Node
+       Sel Node
+}
+
+type Field struct {
+       Names Node
+       Type  Node
+       Tag   Node
+}
+
+type GoStmt struct {
+       Call Node
+}
+
+type IfStmt struct {
+       Init Node
+       Cond Node
+       Body Node
+       Else Node
+}
+
+type ImportSpec struct {
+       Name Node
+       Path Node
+}
+
+type SelectStmt struct {
+       Body Node
+}
+
+type ArrayType struct {
+       Len Node
+       Elt Node
+}
+
+type DeferStmt struct {
+       Call Node
+}
+
+type MapType struct {
+       Key   Node
+       Value Node
+}
+
+type ReturnStmt struct {
+       Results Node
+}
+
+type SliceExpr struct {
+       X    Node
+       Low  Node
+       High Node
+       Max  Node
+}
+
+type StarExpr struct {
+       X Node
+}
+
+type UnaryExpr struct {
+       Op Node
+       X  Node
+}
+
+type SendStmt struct {
+       Chan  Node
+       Value Node
+}
+
+type Binding struct {
+       Name string
+       Node Node
+}
+
+type RangeStmt struct {
+       Key   Node
+       Value Node
+       Tok   Node
+       X     Node
+       Body  Node
+}
+
+type AssignStmt struct {
+       Lhs Node
+       Tok Node
+       Rhs Node
+}
+
+type IndexExpr struct {
+       X     Node
+       Index Node
+}
+
+type Node interface {
+       String() string
+       isNode()
+}
+
+type Ident struct {
+       Name Node
+}
+
+type Object struct {
+       Name Node
+}
+
+type Builtin struct {
+       Name Node
+}
+
+type String string
+
+type Any struct{}
+
+type ValueSpec struct {
+       Names  Node
+       Type   Node
+       Values Node
+}
+
+type List struct {
+       Head Node
+       Tail Node
+}
+
+type GenDecl struct {
+       Tok   Node
+       Specs Node
+}
+
+type BasicLit struct {
+       Kind  Node
+       Value Node
+}
+
+type BinaryExpr struct {
+       X  Node
+       Op Node
+       Y  Node
+}
+
+type ForStmt struct {
+       Init Node
+       Cond Node
+       Post Node
+       Body Node
+}
+
+type Or struct {
+       Nodes []Node
+}
+
+type Not struct {
+       Node Node
+}
+
+func stringify(n Node) string {
+       v := reflect.ValueOf(n)
+       var parts []string
+       parts = append(parts, v.Type().Name())
+       for i := 0; i < v.NumField(); i++ {
+               //lint:ignore S1025 false positive in staticcheck 2019.2.3
+               parts = append(parts, fmt.Sprintf("%s", v.Field(i)))
+       }
+       return "(" + strings.Join(parts, " ") + ")"
+}
+
+func (stmt AssignStmt) String() string     { return stringify(stmt) }
+func (expr IndexExpr) String() string      { return stringify(expr) }
+func (id Ident) String() string            { return stringify(id) }
+func (spec ValueSpec) String() string      { return stringify(spec) }
+func (decl GenDecl) String() string        { return stringify(decl) }
+func (lit BasicLit) String() string        { return stringify(lit) }
+func (expr BinaryExpr) String() string     { return stringify(expr) }
+func (stmt ForStmt) String() string        { return stringify(stmt) }
+func (stmt RangeStmt) String() string      { return stringify(stmt) }
+func (typ ArrayType) String() string       { return stringify(typ) }
+func (stmt DeferStmt) String() string      { return stringify(stmt) }
+func (typ MapType) String() string         { return stringify(typ) }
+func (stmt ReturnStmt) String() string     { return stringify(stmt) }
+func (expr SliceExpr) String() string      { return stringify(expr) }
+func (expr StarExpr) String() string       { return stringify(expr) }
+func (expr UnaryExpr) String() string      { return stringify(expr) }
+func (stmt SendStmt) String() string       { return stringify(stmt) }
+func (spec ImportSpec) String() string     { return stringify(spec) }
+func (stmt SelectStmt) String() string     { return stringify(stmt) }
+func (stmt IfStmt) String() string         { return stringify(stmt) }
+func (stmt IncDecStmt) String() string     { return stringify(stmt) }
+func (stmt GoStmt) String() string         { return stringify(stmt) }
+func (field Field) String() string         { return stringify(field) }
+func (expr SelectorExpr) String() string   { return stringify(expr) }
+func (typ StructType) String() string      { return stringify(typ) }
+func (expr KeyValueExpr) String() string   { return stringify(expr) }
+func (typ FuncType) String() string        { return stringify(typ) }
+func (lit FuncLit) String() string         { return stringify(lit) }
+func (decl FuncDecl) String() string       { return stringify(decl) }
+func (stmt BranchStmt) String() string     { return stringify(stmt) }
+func (expr CallExpr) String() string       { return stringify(expr) }
+func (clause CaseClause) String() string   { return stringify(clause) }
+func (typ ChanType) String() string        { return stringify(typ) }
+func (clause CommClause) String() string   { return stringify(clause) }
+func (lit CompositeLit) String() string    { return stringify(lit) }
+func (stmt EmptyStmt) String() string      { return stringify(stmt) }
+func (typ InterfaceType) String() string   { return stringify(typ) }
+func (stmt SwitchStmt) String() string     { return stringify(stmt) }
+func (expr TypeAssertExpr) String() string { return stringify(expr) }
+func (spec TypeSpec) String() string       { return stringify(spec) }
+func (stmt TypeSwitchStmt) String() string { return stringify(stmt) }
+func (nil Nil) String() string             { return "nil" }
+func (builtin Builtin) String() string     { return stringify(builtin) }
+func (obj Object) String() string          { return stringify(obj) }
+func (fn Function) String() string         { return stringify(fn) }
+func (el Ellipsis) String() string         { return stringify(el) }
+func (not Not) String() string             { return stringify(not) }
+
+func (or Or) String() string {
+       s := "(Or"
+       for _, node := range or.Nodes {
+               s += " "
+               s += node.String()
+       }
+       s += ")"
+       return s
+}
+
+func isProperList(l List) bool {
+       if l.Head == nil && l.Tail == nil {
+               return true
+       }
+       switch tail := l.Tail.(type) {
+       case nil:
+               return false
+       case List:
+               return isProperList(tail)
+       default:
+               return false
+       }
+}
+
+func (l List) String() string {
+       if l.Head == nil && l.Tail == nil {
+               return "[]"
+       }
+
+       if isProperList(l) {
+               // pretty-print the list
+               var objs []string
+               for l.Head != nil {
+                       objs = append(objs, l.Head.String())
+                       l = l.Tail.(List)
+               }
+               return fmt.Sprintf("[%s]", strings.Join(objs, " "))
+       }
+
+       return fmt.Sprintf("%s:%s", l.Head, l.Tail)
+}
+
+func (bind Binding) String() string {
+       if bind.Node == nil {
+               return bind.Name
+       }
+       return fmt.Sprintf("%s@%s", bind.Name, bind.Node)
+}
+
+func (s String) String() string { return fmt.Sprintf("%q", string(s)) }
+
+func (tok Token) String() string {
+       return fmt.Sprintf("%q", strings.ToUpper(token.Token(tok).String()))
+}
+
+func (Any) String() string { return "_" }
+
+func (AssignStmt) isNode()     {}
+func (IndexExpr) isNode()      {}
+func (Ident) isNode()          {}
+func (ValueSpec) isNode()      {}
+func (GenDecl) isNode()        {}
+func (BasicLit) isNode()       {}
+func (BinaryExpr) isNode()     {}
+func (ForStmt) isNode()        {}
+func (RangeStmt) isNode()      {}
+func (ArrayType) isNode()      {}
+func (DeferStmt) isNode()      {}
+func (MapType) isNode()        {}
+func (ReturnStmt) isNode()     {}
+func (SliceExpr) isNode()      {}
+func (StarExpr) isNode()       {}
+func (UnaryExpr) isNode()      {}
+func (SendStmt) isNode()       {}
+func (ImportSpec) isNode()     {}
+func (SelectStmt) isNode()     {}
+func (IfStmt) isNode()         {}
+func (IncDecStmt) isNode()     {}
+func (GoStmt) isNode()         {}
+func (Field) isNode()          {}
+func (SelectorExpr) isNode()   {}
+func (StructType) isNode()     {}
+func (KeyValueExpr) isNode()   {}
+func (FuncType) isNode()       {}
+func (FuncLit) isNode()        {}
+func (FuncDecl) isNode()       {}
+func (BranchStmt) isNode()     {}
+func (CallExpr) isNode()       {}
+func (CaseClause) isNode()     {}
+func (ChanType) isNode()       {}
+func (CommClause) isNode()     {}
+func (CompositeLit) isNode()   {}
+func (EmptyStmt) isNode()      {}
+func (InterfaceType) isNode()  {}
+func (SwitchStmt) isNode()     {}
+func (TypeAssertExpr) isNode() {}
+func (TypeSpec) isNode()       {}
+func (TypeSwitchStmt) isNode() {}
+func (Nil) isNode()            {}
+func (Builtin) isNode()        {}
+func (Object) isNode()         {}
+func (Function) isNode()       {}
+func (Ellipsis) isNode()       {}
+func (Or) isNode()             {}
+func (List) isNode()           {}
+func (String) isNode()         {}
+func (Token) isNode()          {}
+func (Any) isNode()            {}
+func (Binding) isNode()        {}
+func (Not) isNode()            {}