Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
G
Geth-Modification
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
张蕾
Geth-Modification
Commits
5ed3960b
Commit
5ed3960b
authored
6 years ago
by
Jeremy Schlatter
Committed by
Felix Lange
6 years ago
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
accounts/abi/bind: stop using goimports in the binding generator (#17768)
parent
5b0c9c8a
Changes
15
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
153 additions
and
11418 deletions
+153
-11418
bind.go
accounts/abi/bind/bind.go
+3
-3
bind_test.go
accounts/abi/bind/bind_test.go
+126
-16
template.go
accounts/abi/bind/template.go
+24
-0
fastwalk.go
vendor/golang.org/x/tools/imports/fastwalk.go
+0
-172
fastwalk_dirent_fileno.go
vendor/golang.org/x/tools/imports/fastwalk_dirent_fileno.go
+0
-13
fastwalk_dirent_ino.go
vendor/golang.org/x/tools/imports/fastwalk_dirent_ino.go
+0
-13
fastwalk_portable.go
vendor/golang.org/x/tools/imports/fastwalk_portable.go
+0
-29
fastwalk_unix.go
vendor/golang.org/x/tools/imports/fastwalk_unix.go
+0
-122
fix.go
vendor/golang.org/x/tools/imports/fix.go
+0
-978
imports.go
vendor/golang.org/x/tools/imports/imports.go
+0
-289
mkindex.go
vendor/golang.org/x/tools/imports/mkindex.go
+0
-173
mkstdlib.go
vendor/golang.org/x/tools/imports/mkstdlib.go
+0
-103
sortimports.go
vendor/golang.org/x/tools/imports/sortimports.go
+0
-212
zstdlib.go
vendor/golang.org/x/tools/imports/zstdlib.go
+0
-9289
vendor.json
vendor/vendor.json
+0
-6
No files found.
accounts/abi/bind/bind.go
View file @
5ed3960b
...
...
@@ -23,13 +23,13 @@ package bind
import
(
"bytes"
"fmt"
"go/format"
"regexp"
"strings"
"text/template"
"unicode"
"github.com/ethereum/go-ethereum/accounts/abi"
"golang.org/x/tools/imports"
)
// Lang is a target programming language selector to generate bindings for.
...
...
@@ -145,9 +145,9 @@ func Bind(types []string, abis []string, bytecodes []string, pkg string, lang La
if
err
:=
tmpl
.
Execute
(
buffer
,
data
);
err
!=
nil
{
return
""
,
err
}
// For Go bindings pass the code through go
imports to clean it up and double check
// For Go bindings pass the code through go
fmt to clean it up
if
lang
==
LangGo
{
code
,
err
:=
imports
.
Process
(
"."
,
buffer
.
Bytes
(),
nil
)
code
,
err
:=
format
.
Source
(
buffer
.
Bytes
()
)
if
err
!=
nil
{
return
""
,
fmt
.
Errorf
(
"%v
\n
%s"
,
err
,
buffer
)
}
...
...
This diff is collapsed.
Click to expand it.
accounts/abi/bind/bind_test.go
View file @
5ed3960b
This diff is collapsed.
Click to expand it.
accounts/abi/bind/template.go
View file @
5ed3960b
...
...
@@ -64,6 +64,30 @@ const tmplSourceGo = `
package {{.Package}}
import (
"math/big"
"strings"
ethereum "github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/accounts/abi"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/event"
)
// Reference imports to suppress errors if they are not otherwise used.
var (
_ = big.NewInt
_ = strings.NewReader
_ = ethereum.NotFound
_ = abi.U256
_ = bind.Bind
_ = common.Big1
_ = types.BloomLookup
_ = event.NewSubscription
)
{{range $contract := .Contracts}}
// {{.Type}}ABI is the input ABI used to generate the binding from.
const {{.Type}}ABI = "{{.InputABI}}"
...
...
This diff is collapsed.
Click to expand it.
vendor/golang.org/x/tools/imports/fastwalk.go
deleted
100644 → 0
View file @
5b0c9c8a
// Copyright 2016 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.
// A faster implementation of filepath.Walk.
//
// filepath.Walk's design necessarily calls os.Lstat on each file,
// even if the caller needs less info. And goimports only need to know
// the type of each file. The kernel interface provides the type in
// the Readdir call but the standard library ignored it.
// fastwalk_unix.go contains a fork of the syscall routines.
//
// See golang.org/issue/16399
package
imports
import
(
"errors"
"os"
"path/filepath"
"runtime"
)
// traverseLink is a sentinel error for fastWalk, similar to filepath.SkipDir.
var
traverseLink
=
errors
.
New
(
"traverse symlink, assuming target is a directory"
)
// fastWalk walks the file tree rooted at root, calling walkFn for
// each file or directory in the tree, including root.
//
// If fastWalk returns filepath.SkipDir, the directory is skipped.
//
// Unlike filepath.Walk:
// * file stat calls must be done by the user.
// The only provided metadata is the file type, which does not include
// any permission bits.
// * multiple goroutines stat the filesystem concurrently. The provided
// walkFn must be safe for concurrent use.
// * fastWalk can follow symlinks if walkFn returns the traverseLink
// sentinel error. It is the walkFn's responsibility to prevent
// fastWalk from going into symlink cycles.
func
fastWalk
(
root
string
,
walkFn
func
(
path
string
,
typ
os
.
FileMode
)
error
)
error
{
// TODO(bradfitz): make numWorkers configurable? We used a
// minimum of 4 to give the kernel more info about multiple
// things we want, in hopes its I/O scheduling can take
// advantage of that. Hopefully most are in cache. Maybe 4 is
// even too low of a minimum. Profile more.
numWorkers
:=
4
if
n
:=
runtime
.
NumCPU
();
n
>
numWorkers
{
numWorkers
=
n
}
w
:=
&
walker
{
fn
:
walkFn
,
enqueuec
:
make
(
chan
walkItem
,
numWorkers
),
// buffered for performance
workc
:
make
(
chan
walkItem
,
numWorkers
),
// buffered for performance
donec
:
make
(
chan
struct
{}),
// buffered for correctness & not leaking goroutines:
resc
:
make
(
chan
error
,
numWorkers
),
}
defer
close
(
w
.
donec
)
// TODO(bradfitz): start the workers as needed? maybe not worth it.
for
i
:=
0
;
i
<
numWorkers
;
i
++
{
go
w
.
doWork
()
}
todo
:=
[]
walkItem
{{
dir
:
root
}}
out
:=
0
for
{
workc
:=
w
.
workc
var
workItem
walkItem
if
len
(
todo
)
==
0
{
workc
=
nil
}
else
{
workItem
=
todo
[
len
(
todo
)
-
1
]
}
select
{
case
workc
<-
workItem
:
todo
=
todo
[
:
len
(
todo
)
-
1
]
out
++
case
it
:=
<-
w
.
enqueuec
:
todo
=
append
(
todo
,
it
)
case
err
:=
<-
w
.
resc
:
out
--
if
err
!=
nil
{
return
err
}
if
out
==
0
&&
len
(
todo
)
==
0
{
// It's safe to quit here, as long as the buffered
// enqueue channel isn't also readable, which might
// happen if the worker sends both another unit of
// work and its result before the other select was
// scheduled and both w.resc and w.enqueuec were
// readable.
select
{
case
it
:=
<-
w
.
enqueuec
:
todo
=
append
(
todo
,
it
)
default
:
return
nil
}
}
}
}
}
// doWork reads directories as instructed (via workc) and runs the
// user's callback function.
func
(
w
*
walker
)
doWork
()
{
for
{
select
{
case
<-
w
.
donec
:
return
case
it
:=
<-
w
.
workc
:
w
.
resc
<-
w
.
walk
(
it
.
dir
,
!
it
.
callbackDone
)
}
}
}
type
walker
struct
{
fn
func
(
path
string
,
typ
os
.
FileMode
)
error
donec
chan
struct
{}
// closed on fastWalk's return
workc
chan
walkItem
// to workers
enqueuec
chan
walkItem
// from workers
resc
chan
error
// from workers
}
type
walkItem
struct
{
dir
string
callbackDone
bool
// callback already called; don't do it again
}
func
(
w
*
walker
)
enqueue
(
it
walkItem
)
{
select
{
case
w
.
enqueuec
<-
it
:
case
<-
w
.
donec
:
}
}
func
(
w
*
walker
)
onDirEnt
(
dirName
,
baseName
string
,
typ
os
.
FileMode
)
error
{
joined
:=
dirName
+
string
(
os
.
PathSeparator
)
+
baseName
if
typ
==
os
.
ModeDir
{
w
.
enqueue
(
walkItem
{
dir
:
joined
})
return
nil
}
err
:=
w
.
fn
(
joined
,
typ
)
if
typ
==
os
.
ModeSymlink
{
if
err
==
traverseLink
{
// Set callbackDone so we don't call it twice for both the
// symlink-as-symlink and the symlink-as-directory later:
w
.
enqueue
(
walkItem
{
dir
:
joined
,
callbackDone
:
true
})
return
nil
}
if
err
==
filepath
.
SkipDir
{
// Permit SkipDir on symlinks too.
return
nil
}
}
return
err
}
func
(
w
*
walker
)
walk
(
root
string
,
runUserCallback
bool
)
error
{
if
runUserCallback
{
err
:=
w
.
fn
(
root
,
os
.
ModeDir
)
if
err
==
filepath
.
SkipDir
{
return
nil
}
if
err
!=
nil
{
return
err
}
}
return
readDir
(
root
,
w
.
onDirEnt
)
}
This diff is collapsed.
Click to expand it.
vendor/golang.org/x/tools/imports/fastwalk_dirent_fileno.go
deleted
100644 → 0
View file @
5b0c9c8a
// Copyright 2016 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.
// +build freebsd openbsd netbsd
package
imports
import
"syscall"
func
direntInode
(
dirent
*
syscall
.
Dirent
)
uint64
{
return
uint64
(
dirent
.
Fileno
)
}
This diff is collapsed.
Click to expand it.
vendor/golang.org/x/tools/imports/fastwalk_dirent_ino.go
deleted
100644 → 0
View file @
5b0c9c8a
// Copyright 2016 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.
// +build linux,!appengine darwin
package
imports
import
"syscall"
func
direntInode
(
dirent
*
syscall
.
Dirent
)
uint64
{
return
uint64
(
dirent
.
Ino
)
}
This diff is collapsed.
Click to expand it.
vendor/golang.org/x/tools/imports/fastwalk_portable.go
deleted
100644 → 0
View file @
5b0c9c8a
// Copyright 2016 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.
// +build appengine !linux,!darwin,!freebsd,!openbsd,!netbsd
package
imports
import
(
"io/ioutil"
"os"
)
// readDir calls fn for each directory entry in dirName.
// It does not descend into directories or follow symlinks.
// If fn returns a non-nil error, readDir returns with that error
// immediately.
func
readDir
(
dirName
string
,
fn
func
(
dirName
,
entName
string
,
typ
os
.
FileMode
)
error
)
error
{
fis
,
err
:=
ioutil
.
ReadDir
(
dirName
)
if
err
!=
nil
{
return
err
}
for
_
,
fi
:=
range
fis
{
if
err
:=
fn
(
dirName
,
fi
.
Name
(),
fi
.
Mode
()
&
os
.
ModeType
);
err
!=
nil
{
return
err
}
}
return
nil
}
This diff is collapsed.
Click to expand it.
vendor/golang.org/x/tools/imports/fastwalk_unix.go
deleted
100644 → 0
View file @
5b0c9c8a
// Copyright 2016 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.
// +build linux,!appengine darwin freebsd openbsd netbsd
package
imports
import
(
"bytes"
"fmt"
"os"
"syscall"
"unsafe"
)
const
blockSize
=
8
<<
10
// unknownFileMode is a sentinel (and bogus) os.FileMode
// value used to represent a syscall.DT_UNKNOWN Dirent.Type.
const
unknownFileMode
os
.
FileMode
=
os
.
ModeNamedPipe
|
os
.
ModeSocket
|
os
.
ModeDevice
func
readDir
(
dirName
string
,
fn
func
(
dirName
,
entName
string
,
typ
os
.
FileMode
)
error
)
error
{
fd
,
err
:=
syscall
.
Open
(
dirName
,
0
,
0
)
if
err
!=
nil
{
return
err
}
defer
syscall
.
Close
(
fd
)
// The buffer must be at least a block long.
buf
:=
make
([]
byte
,
blockSize
)
// stack-allocated; doesn't escape
bufp
:=
0
// starting read position in buf
nbuf
:=
0
// end valid data in buf
for
{
if
bufp
>=
nbuf
{
bufp
=
0
nbuf
,
err
=
syscall
.
ReadDirent
(
fd
,
buf
)
if
err
!=
nil
{
return
os
.
NewSyscallError
(
"readdirent"
,
err
)
}
if
nbuf
<=
0
{
return
nil
}
}
consumed
,
name
,
typ
:=
parseDirEnt
(
buf
[
bufp
:
nbuf
])
bufp
+=
consumed
if
name
==
""
||
name
==
"."
||
name
==
".."
{
continue
}
// Fallback for filesystems (like old XFS) that don't
// support Dirent.Type and have DT_UNKNOWN (0) there
// instead.
if
typ
==
unknownFileMode
{
fi
,
err
:=
os
.
Lstat
(
dirName
+
"/"
+
name
)
if
err
!=
nil
{
// It got deleted in the meantime.
if
os
.
IsNotExist
(
err
)
{
continue
}
return
err
}
typ
=
fi
.
Mode
()
&
os
.
ModeType
}
if
err
:=
fn
(
dirName
,
name
,
typ
);
err
!=
nil
{
return
err
}
}
}
func
parseDirEnt
(
buf
[]
byte
)
(
consumed
int
,
name
string
,
typ
os
.
FileMode
)
{
// golang.org/issue/15653
dirent
:=
(
*
syscall
.
Dirent
)(
unsafe
.
Pointer
(
&
buf
[
0
]))
if
v
:=
unsafe
.
Offsetof
(
dirent
.
Reclen
)
+
unsafe
.
Sizeof
(
dirent
.
Reclen
);
uintptr
(
len
(
buf
))
<
v
{
panic
(
fmt
.
Sprintf
(
"buf size of %d smaller than dirent header size %d"
,
len
(
buf
),
v
))
}
if
len
(
buf
)
<
int
(
dirent
.
Reclen
)
{
panic
(
fmt
.
Sprintf
(
"buf size %d < record length %d"
,
len
(
buf
),
dirent
.
Reclen
))
}
consumed
=
int
(
dirent
.
Reclen
)
if
direntInode
(
dirent
)
==
0
{
// File absent in directory.
return
}
switch
dirent
.
Type
{
case
syscall
.
DT_REG
:
typ
=
0
case
syscall
.
DT_DIR
:
typ
=
os
.
ModeDir
case
syscall
.
DT_LNK
:
typ
=
os
.
ModeSymlink
case
syscall
.
DT_BLK
:
typ
=
os
.
ModeDevice
case
syscall
.
DT_FIFO
:
typ
=
os
.
ModeNamedPipe
case
syscall
.
DT_SOCK
:
typ
=
os
.
ModeSocket
case
syscall
.
DT_UNKNOWN
:
typ
=
unknownFileMode
default
:
// Skip weird things.
// It's probably a DT_WHT (http://lwn.net/Articles/325369/)
// or something. Revisit if/when this package is moved outside
// of goimports. goimports only cares about regular files,
// symlinks, and directories.
return
}
nameBuf
:=
(
*
[
unsafe
.
Sizeof
(
dirent
.
Name
)]
byte
)(
unsafe
.
Pointer
(
&
dirent
.
Name
[
0
]))
nameLen
:=
bytes
.
IndexByte
(
nameBuf
[
:
],
0
)
if
nameLen
<
0
{
panic
(
"failed to find terminating 0 byte in dirent"
)
}
// Special cases for common things:
if
nameLen
==
1
&&
nameBuf
[
0
]
==
'.'
{
name
=
"."
}
else
if
nameLen
==
2
&&
nameBuf
[
0
]
==
'.'
&&
nameBuf
[
1
]
==
'.'
{
name
=
".."
}
else
{
name
=
string
(
nameBuf
[
:
nameLen
])
}
return
}
This diff is collapsed.
Click to expand it.
vendor/golang.org/x/tools/imports/fix.go
deleted
100644 → 0
View file @
5b0c9c8a
This diff is collapsed.
Click to expand it.
vendor/golang.org/x/tools/imports/imports.go
deleted
100644 → 0
View file @
5b0c9c8a
// Copyright 2013 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.
//go:generate go run mkstdlib.go
// Package imports implements a Go pretty-printer (like package "go/format")
// that also adds or removes import statements as necessary.
package
imports
// import "golang.org/x/tools/imports"
import
(
"bufio"
"bytes"
"fmt"
"go/ast"
"go/format"
"go/parser"
"go/printer"
"go/token"
"io"
"regexp"
"strconv"
"strings"
"golang.org/x/tools/go/ast/astutil"
)
// Options specifies options for processing files.
type
Options
struct
{
Fragment
bool
// Accept fragment of a source file (no package statement)
AllErrors
bool
// Report all errors (not just the first 10 on different lines)
Comments
bool
// Print comments (true if nil *Options provided)
TabIndent
bool
// Use tabs for indent (true if nil *Options provided)
TabWidth
int
// Tab width (8 if nil *Options provided)
FormatOnly
bool
// Disable the insertion and deletion of imports
}
// Process formats and adjusts imports for the provided file.
// If opt is nil the defaults are used.
//
// Note that filename's directory influences which imports can be chosen,
// so it is important that filename be accurate.
// To process data ``as if'' it were in filename, pass the data as a non-nil src.
func
Process
(
filename
string
,
src
[]
byte
,
opt
*
Options
)
([]
byte
,
error
)
{
if
opt
==
nil
{
opt
=
&
Options
{
Comments
:
true
,
TabIndent
:
true
,
TabWidth
:
8
}
}
fileSet
:=
token
.
NewFileSet
()
file
,
adjust
,
err
:=
parse
(
fileSet
,
filename
,
src
,
opt
)
if
err
!=
nil
{
return
nil
,
err
}
if
!
opt
.
FormatOnly
{
_
,
err
=
fixImports
(
fileSet
,
file
,
filename
)
if
err
!=
nil
{
return
nil
,
err
}
}
sortImports
(
fileSet
,
file
)
imps
:=
astutil
.
Imports
(
fileSet
,
file
)
var
spacesBefore
[]
string
// import paths we need spaces before
for
_
,
impSection
:=
range
imps
{
// Within each block of contiguous imports, see if any
// import lines are in different group numbers. If so,
// we'll need to put a space between them so it's
// compatible with gofmt.
lastGroup
:=
-
1
for
_
,
importSpec
:=
range
impSection
{
importPath
,
_
:=
strconv
.
Unquote
(
importSpec
.
Path
.
Value
)
groupNum
:=
importGroup
(
importPath
)
if
groupNum
!=
lastGroup
&&
lastGroup
!=
-
1
{
spacesBefore
=
append
(
spacesBefore
,
importPath
)
}
lastGroup
=
groupNum
}
}
printerMode
:=
printer
.
UseSpaces
if
opt
.
TabIndent
{
printerMode
|=
printer
.
TabIndent
}
printConfig
:=
&
printer
.
Config
{
Mode
:
printerMode
,
Tabwidth
:
opt
.
TabWidth
}
var
buf
bytes
.
Buffer
err
=
printConfig
.
Fprint
(
&
buf
,
fileSet
,
file
)
if
err
!=
nil
{
return
nil
,
err
}
out
:=
buf
.
Bytes
()
if
adjust
!=
nil
{
out
=
adjust
(
src
,
out
)
}
if
len
(
spacesBefore
)
>
0
{
out
=
addImportSpaces
(
bytes
.
NewReader
(
out
),
spacesBefore
)
}
out
,
err
=
format
.
Source
(
out
)
if
err
!=
nil
{
return
nil
,
err
}
return
out
,
nil
}
// parse parses src, which was read from filename,
// as a Go source file or statement list.
func
parse
(
fset
*
token
.
FileSet
,
filename
string
,
src
[]
byte
,
opt
*
Options
)
(
*
ast
.
File
,
func
(
orig
,
src
[]
byte
)
[]
byte
,
error
)
{
parserMode
:=
parser
.
Mode
(
0
)
if
opt
.
Comments
{
parserMode
|=
parser
.
ParseComments
}
if
opt
.
AllErrors
{
parserMode
|=
parser
.
AllErrors
}
// Try as whole source file.
file
,
err
:=
parser
.
ParseFile
(
fset
,
filename
,
src
,
parserMode
)
if
err
==
nil
{
return
file
,
nil
,
nil
}
// If the error is that the source file didn't begin with a
// package line and we accept fragmented input, fall through to
// try as a source fragment. Stop and return on any other error.
if
!
opt
.
Fragment
||
!
strings
.
Contains
(
err
.
Error
(),
"expected 'package'"
)
{
return
nil
,
nil
,
err
}
// If this is a declaration list, make it a source file
// by inserting a package clause.
// Insert using a ;, not a newline, so that the line numbers
// in psrc match the ones in src.
psrc
:=
append
([]
byte
(
"package main;"
),
src
...
)
file
,
err
=
parser
.
ParseFile
(
fset
,
filename
,
psrc
,
parserMode
)
if
err
==
nil
{
// If a main function exists, we will assume this is a main
// package and leave the file.
if
containsMainFunc
(
file
)
{
return
file
,
nil
,
nil
}
adjust
:=
func
(
orig
,
src
[]
byte
)
[]
byte
{
// Remove the package clause.
// Gofmt has turned the ; into a \n.
src
=
src
[
len
(
"package main
\n
"
)
:
]
return
matchSpace
(
orig
,
src
)
}
return
file
,
adjust
,
nil
}
// If the error is that the source file didn't begin with a
// declaration, fall through to try as a statement list.
// Stop and return on any other error.
if
!
strings
.
Contains
(
err
.
Error
(),
"expected declaration"
)
{
return
nil
,
nil
,
err
}
// If this is a statement list, make it a source file
// by inserting a package clause and turning the list
// into a function body. This handles expressions too.
// Insert using a ;, not a newline, so that the line numbers
// in fsrc match the ones in src.
fsrc
:=
append
(
append
([]
byte
(
"package p; func _() {"
),
src
...
),
'}'
)
file
,
err
=
parser
.
ParseFile
(
fset
,
filename
,
fsrc
,
parserMode
)
if
err
==
nil
{
adjust
:=
func
(
orig
,
src
[]
byte
)
[]
byte
{
// Remove the wrapping.
// Gofmt has turned the ; into a \n\n.
src
=
src
[
len
(
"package p
\n\n
func _() {"
)
:
]
src
=
src
[
:
len
(
src
)
-
len
(
"}
\n
"
)]
// Gofmt has also indented the function body one level.
// Remove that indent.
src
=
bytes
.
Replace
(
src
,
[]
byte
(
"
\n\t
"
),
[]
byte
(
"
\n
"
),
-
1
)
return
matchSpace
(
orig
,
src
)
}
return
file
,
adjust
,
nil
}
// Failed, and out of options.
return
nil
,
nil
,
err
}
// containsMainFunc checks if a file contains a function declaration with the
// function signature 'func main()'
func
containsMainFunc
(
file
*
ast
.
File
)
bool
{
for
_
,
decl
:=
range
file
.
Decls
{
if
f
,
ok
:=
decl
.
(
*
ast
.
FuncDecl
);
ok
{
if
f
.
Name
.
Name
!=
"main"
{
continue
}
if
len
(
f
.
Type
.
Params
.
List
)
!=
0
{
continue
}
if
f
.
Type
.
Results
!=
nil
&&
len
(
f
.
Type
.
Results
.
List
)
!=
0
{
continue
}
return
true
}
}
return
false
}
func
cutSpace
(
b
[]
byte
)
(
before
,
middle
,
after
[]
byte
)
{
i
:=
0
for
i
<
len
(
b
)
&&
(
b
[
i
]
==
' '
||
b
[
i
]
==
'\t'
||
b
[
i
]
==
'\n'
)
{
i
++
}
j
:=
len
(
b
)
for
j
>
0
&&
(
b
[
j
-
1
]
==
' '
||
b
[
j
-
1
]
==
'\t'
||
b
[
j
-
1
]
==
'\n'
)
{
j
--
}
if
i
<=
j
{
return
b
[
:
i
],
b
[
i
:
j
],
b
[
j
:
]
}
return
nil
,
nil
,
b
[
j
:
]
}
// matchSpace reformats src to use the same space context as orig.
// 1) If orig begins with blank lines, matchSpace inserts them at the beginning of src.
// 2) matchSpace copies the indentation of the first non-blank line in orig
// to every non-blank line in src.
// 3) matchSpace copies the trailing space from orig and uses it in place
// of src's trailing space.
func
matchSpace
(
orig
[]
byte
,
src
[]
byte
)
[]
byte
{
before
,
_
,
after
:=
cutSpace
(
orig
)
i
:=
bytes
.
LastIndex
(
before
,
[]
byte
{
'\n'
})
before
,
indent
:=
before
[
:
i
+
1
],
before
[
i
+
1
:
]
_
,
src
,
_
=
cutSpace
(
src
)
var
b
bytes
.
Buffer
b
.
Write
(
before
)
for
len
(
src
)
>
0
{
line
:=
src
if
i
:=
bytes
.
IndexByte
(
line
,
'\n'
);
i
>=
0
{
line
,
src
=
line
[
:
i
+
1
],
line
[
i
+
1
:
]
}
else
{
src
=
nil
}
if
len
(
line
)
>
0
&&
line
[
0
]
!=
'\n'
{
// not blank
b
.
Write
(
indent
)
}
b
.
Write
(
line
)
}
b
.
Write
(
after
)
return
b
.
Bytes
()
}
var
impLine
=
regexp
.
MustCompile
(
`^\s+(?:[\w\.]+\s+)?"(.+)"`
)
func
addImportSpaces
(
r
io
.
Reader
,
breaks
[]
string
)
[]
byte
{
var
out
bytes
.
Buffer
sc
:=
bufio
.
NewScanner
(
r
)
inImports
:=
false
done
:=
false
for
sc
.
Scan
()
{
s
:=
sc
.
Text
()
if
!
inImports
&&
!
done
&&
strings
.
HasPrefix
(
s
,
"import"
)
{
inImports
=
true
}
if
inImports
&&
(
strings
.
HasPrefix
(
s
,
"var"
)
||
strings
.
HasPrefix
(
s
,
"func"
)
||
strings
.
HasPrefix
(
s
,
"const"
)
||
strings
.
HasPrefix
(
s
,
"type"
))
{
done
=
true
inImports
=
false
}
if
inImports
&&
len
(
breaks
)
>
0
{
if
m
:=
impLine
.
FindStringSubmatch
(
s
);
m
!=
nil
{
if
m
[
1
]
==
breaks
[
0
]
{
out
.
WriteByte
(
'\n'
)
breaks
=
breaks
[
1
:
]
}
}
}
fmt
.
Fprintln
(
&
out
,
s
)
}
return
out
.
Bytes
()
}
This diff is collapsed.
Click to expand it.
vendor/golang.org/x/tools/imports/mkindex.go
deleted
100644 → 0
View file @
5b0c9c8a
// +build ignore
// Copyright 2013 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.
// Command mkindex creates the file "pkgindex.go" containing an index of the Go
// standard library. The file is intended to be built as part of the imports
// package, so that the package may be used in environments where a GOROOT is
// not available (such as App Engine).
package
main
import
(
"bytes"
"fmt"
"go/ast"
"go/build"
"go/format"
"go/parser"
"go/token"
"io/ioutil"
"log"
"os"
"path"
"path/filepath"
"strings"
)
var
(
pkgIndex
=
make
(
map
[
string
][]
pkg
)
exports
=
make
(
map
[
string
]
map
[
string
]
bool
)
)
func
main
()
{
// Don't use GOPATH.
ctx
:=
build
.
Default
ctx
.
GOPATH
=
""
// Populate pkgIndex global from GOROOT.
for
_
,
path
:=
range
ctx
.
SrcDirs
()
{
f
,
err
:=
os
.
Open
(
path
)
if
err
!=
nil
{
log
.
Print
(
err
)
continue
}
children
,
err
:=
f
.
Readdir
(
-
1
)
f
.
Close
()
if
err
!=
nil
{
log
.
Print
(
err
)
continue
}
for
_
,
child
:=
range
children
{
if
child
.
IsDir
()
{
loadPkg
(
path
,
child
.
Name
())
}
}
}
// Populate exports global.
for
_
,
ps
:=
range
pkgIndex
{
for
_
,
p
:=
range
ps
{
e
:=
loadExports
(
p
.
dir
)
if
e
!=
nil
{
exports
[
p
.
dir
]
=
e
}
}
}
// Construct source file.
var
buf
bytes
.
Buffer
fmt
.
Fprint
(
&
buf
,
pkgIndexHead
)
fmt
.
Fprintf
(
&
buf
,
"var pkgIndexMaster = %#v
\n
"
,
pkgIndex
)
fmt
.
Fprintf
(
&
buf
,
"var exportsMaster = %#v
\n
"
,
exports
)
src
:=
buf
.
Bytes
()
// Replace main.pkg type name with pkg.
src
=
bytes
.
Replace
(
src
,
[]
byte
(
"main.pkg"
),
[]
byte
(
"pkg"
),
-
1
)
// Replace actual GOROOT with "/go".
src
=
bytes
.
Replace
(
src
,
[]
byte
(
ctx
.
GOROOT
),
[]
byte
(
"/go"
),
-
1
)
// Add some line wrapping.
src
=
bytes
.
Replace
(
src
,
[]
byte
(
"}, "
),
[]
byte
(
"},
\n
"
),
-
1
)
src
=
bytes
.
Replace
(
src
,
[]
byte
(
"true, "
),
[]
byte
(
"true,
\n
"
),
-
1
)
var
err
error
src
,
err
=
format
.
Source
(
src
)
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
// Write out source file.
err
=
ioutil
.
WriteFile
(
"pkgindex.go"
,
src
,
0644
)
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
}
const
pkgIndexHead
=
`package imports
func init() {
pkgIndexOnce.Do(func() {
pkgIndex.m = pkgIndexMaster
})
loadExports = func(dir string) map[string]bool {
return exportsMaster[dir]
}
}
`
type
pkg
struct
{
importpath
string
// full pkg import path, e.g. "net/http"
dir
string
// absolute file path to pkg directory e.g. "/usr/lib/go/src/fmt"
}
var
fset
=
token
.
NewFileSet
()
func
loadPkg
(
root
,
importpath
string
)
{
shortName
:=
path
.
Base
(
importpath
)
if
shortName
==
"testdata"
{
return
}
dir
:=
filepath
.
Join
(
root
,
importpath
)
pkgIndex
[
shortName
]
=
append
(
pkgIndex
[
shortName
],
pkg
{
importpath
:
importpath
,
dir
:
dir
,
})
pkgDir
,
err
:=
os
.
Open
(
dir
)
if
err
!=
nil
{
return
}
children
,
err
:=
pkgDir
.
Readdir
(
-
1
)
pkgDir
.
Close
()
if
err
!=
nil
{
return
}
for
_
,
child
:=
range
children
{
name
:=
child
.
Name
()
if
name
==
""
{
continue
}
if
c
:=
name
[
0
];
c
==
'.'
||
(
'0'
<=
c
&&
c
<=
'9'
)
{
continue
}
if
child
.
IsDir
()
{
loadPkg
(
root
,
filepath
.
Join
(
importpath
,
name
))
}
}
}
func
loadExports
(
dir
string
)
map
[
string
]
bool
{
exports
:=
make
(
map
[
string
]
bool
)
buildPkg
,
err
:=
build
.
ImportDir
(
dir
,
0
)
if
err
!=
nil
{
if
strings
.
Contains
(
err
.
Error
(),
"no buildable Go source files in"
)
{
return
nil
}
log
.
Printf
(
"could not import %q: %v"
,
dir
,
err
)
return
nil
}
for
_
,
file
:=
range
buildPkg
.
GoFiles
{
f
,
err
:=
parser
.
ParseFile
(
fset
,
filepath
.
Join
(
dir
,
file
),
nil
,
0
)
if
err
!=
nil
{
log
.
Printf
(
"could not parse %q: %v"
,
file
,
err
)
continue
}
for
name
:=
range
f
.
Scope
.
Objects
{
if
ast
.
IsExported
(
name
)
{
exports
[
name
]
=
true
}
}
}
return
exports
}
This diff is collapsed.
Click to expand it.
vendor/golang.org/x/tools/imports/mkstdlib.go
deleted
100644 → 0
View file @
5b0c9c8a
// +build ignore
// mkstdlib generates the zstdlib.go file, containing the Go standard
// library API symbols. It's baked into the binary to avoid scanning
// GOPATH in the common case.
package
main
import
(
"bufio"
"bytes"
"fmt"
"go/format"
"io"
"io/ioutil"
"log"
"os"
"path"
"path/filepath"
"regexp"
"sort"
"strings"
)
func
mustOpen
(
name
string
)
io
.
Reader
{
f
,
err
:=
os
.
Open
(
name
)
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
return
f
}
func
api
(
base
string
)
string
{
return
filepath
.
Join
(
os
.
Getenv
(
"GOROOT"
),
"api"
,
base
)
}
var
sym
=
regexp
.
MustCompile
(
`^pkg (\S+).*?, (?:var|func|type|const) ([A-Z]\w*)`
)
func
main
()
{
var
buf
bytes
.
Buffer
outf
:=
func
(
format
string
,
args
...
interface
{})
{
fmt
.
Fprintf
(
&
buf
,
format
,
args
...
)
}
outf
(
"// AUTO-GENERATED BY mkstdlib.go
\n\n
"
)
outf
(
"package imports
\n
"
)
outf
(
"var stdlib = map[string]string{
\n
"
)
f
:=
io
.
MultiReader
(
mustOpen
(
api
(
"go1.txt"
)),
mustOpen
(
api
(
"go1.1.txt"
)),
mustOpen
(
api
(
"go1.2.txt"
)),
mustOpen
(
api
(
"go1.3.txt"
)),
mustOpen
(
api
(
"go1.4.txt"
)),
mustOpen
(
api
(
"go1.5.txt"
)),
mustOpen
(
api
(
"go1.6.txt"
)),
mustOpen
(
api
(
"go1.7.txt"
)),
)
sc
:=
bufio
.
NewScanner
(
f
)
fullImport
:=
map
[
string
]
string
{}
// "zip.NewReader" => "archive/zip"
ambiguous
:=
map
[
string
]
bool
{}
var
keys
[]
string
for
sc
.
Scan
()
{
l
:=
sc
.
Text
()
has
:=
func
(
v
string
)
bool
{
return
strings
.
Contains
(
l
,
v
)
}
if
has
(
"struct, "
)
||
has
(
"interface, "
)
||
has
(
", method ("
)
{
continue
}
if
m
:=
sym
.
FindStringSubmatch
(
l
);
m
!=
nil
{
full
:=
m
[
1
]
key
:=
path
.
Base
(
full
)
+
"."
+
m
[
2
]
if
exist
,
ok
:=
fullImport
[
key
];
ok
{
if
exist
!=
full
{
ambiguous
[
key
]
=
true
}
}
else
{
fullImport
[
key
]
=
full
keys
=
append
(
keys
,
key
)
}
}
}
if
err
:=
sc
.
Err
();
err
!=
nil
{
log
.
Fatal
(
err
)
}
sort
.
Strings
(
keys
)
for
_
,
key
:=
range
keys
{
if
ambiguous
[
key
]
{
outf
(
"
\t
// %q is ambiguous
\n
"
,
key
)
}
else
{
outf
(
"
\t
%q: %q,
\n
"
,
key
,
fullImport
[
key
])
}
}
outf
(
"
\n
"
)
for
_
,
sym
:=
range
[
...
]
string
{
"Alignof"
,
"ArbitraryType"
,
"Offsetof"
,
"Pointer"
,
"Sizeof"
}
{
outf
(
"
\t
%q: %q,
\n
"
,
"unsafe."
+
sym
,
"unsafe"
)
}
outf
(
"}
\n
"
)
fmtbuf
,
err
:=
format
.
Source
(
buf
.
Bytes
())
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
err
=
ioutil
.
WriteFile
(
"zstdlib.go"
,
fmtbuf
,
0666
)
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
}
This diff is collapsed.
Click to expand it.
vendor/golang.org/x/tools/imports/sortimports.go
deleted
100644 → 0
View file @
5b0c9c8a
// Copyright 2013 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.
// Hacked up copy of go/ast/import.go
package
imports
import
(
"go/ast"
"go/token"
"sort"
"strconv"
)
// sortImports sorts runs of consecutive import lines in import blocks in f.
// It also removes duplicate imports when it is possible to do so without data loss.
func
sortImports
(
fset
*
token
.
FileSet
,
f
*
ast
.
File
)
{
for
i
,
d
:=
range
f
.
Decls
{
d
,
ok
:=
d
.
(
*
ast
.
GenDecl
)
if
!
ok
||
d
.
Tok
!=
token
.
IMPORT
{
// Not an import declaration, so we're done.
// Imports are always first.
break
}
if
len
(
d
.
Specs
)
==
0
{
// Empty import block, remove it.
f
.
Decls
=
append
(
f
.
Decls
[
:
i
],
f
.
Decls
[
i
+
1
:
]
...
)
}
if
!
d
.
Lparen
.
IsValid
()
{
// Not a block: sorted by default.
continue
}
// Identify and sort runs of specs on successive lines.
i
:=
0
specs
:=
d
.
Specs
[
:
0
]
for
j
,
s
:=
range
d
.
Specs
{
if
j
>
i
&&
fset
.
Position
(
s
.
Pos
())
.
Line
>
1
+
fset
.
Position
(
d
.
Specs
[
j
-
1
]
.
End
())
.
Line
{
// j begins a new run. End this one.
specs
=
append
(
specs
,
sortSpecs
(
fset
,
f
,
d
.
Specs
[
i
:
j
])
...
)
i
=
j
}
}
specs
=
append
(
specs
,
sortSpecs
(
fset
,
f
,
d
.
Specs
[
i
:
])
...
)
d
.
Specs
=
specs
// Deduping can leave a blank line before the rparen; clean that up.
if
len
(
d
.
Specs
)
>
0
{
lastSpec
:=
d
.
Specs
[
len
(
d
.
Specs
)
-
1
]
lastLine
:=
fset
.
Position
(
lastSpec
.
Pos
())
.
Line
if
rParenLine
:=
fset
.
Position
(
d
.
Rparen
)
.
Line
;
rParenLine
>
lastLine
+
1
{
fset
.
File
(
d
.
Rparen
)
.
MergeLine
(
rParenLine
-
1
)
}
}
}
}
func
importPath
(
s
ast
.
Spec
)
string
{
t
,
err
:=
strconv
.
Unquote
(
s
.
(
*
ast
.
ImportSpec
)
.
Path
.
Value
)
if
err
==
nil
{
return
t
}
return
""
}
func
importName
(
s
ast
.
Spec
)
string
{
n
:=
s
.
(
*
ast
.
ImportSpec
)
.
Name
if
n
==
nil
{
return
""
}
return
n
.
Name
}
func
importComment
(
s
ast
.
Spec
)
string
{
c
:=
s
.
(
*
ast
.
ImportSpec
)
.
Comment
if
c
==
nil
{
return
""
}
return
c
.
Text
()
}
// collapse indicates whether prev may be removed, leaving only next.
func
collapse
(
prev
,
next
ast
.
Spec
)
bool
{
if
importPath
(
next
)
!=
importPath
(
prev
)
||
importName
(
next
)
!=
importName
(
prev
)
{
return
false
}
return
prev
.
(
*
ast
.
ImportSpec
)
.
Comment
==
nil
}
type
posSpan
struct
{
Start
token
.
Pos
End
token
.
Pos
}
func
sortSpecs
(
fset
*
token
.
FileSet
,
f
*
ast
.
File
,
specs
[]
ast
.
Spec
)
[]
ast
.
Spec
{
// Can't short-circuit here even if specs are already sorted,
// since they might yet need deduplication.
// A lone import, however, may be safely ignored.
if
len
(
specs
)
<=
1
{
return
specs
}
// Record positions for specs.
pos
:=
make
([]
posSpan
,
len
(
specs
))
for
i
,
s
:=
range
specs
{
pos
[
i
]
=
posSpan
{
s
.
Pos
(),
s
.
End
()}
}
// Identify comments in this range.
// Any comment from pos[0].Start to the final line counts.
lastLine
:=
fset
.
Position
(
pos
[
len
(
pos
)
-
1
]
.
End
)
.
Line
cstart
:=
len
(
f
.
Comments
)
cend
:=
len
(
f
.
Comments
)
for
i
,
g
:=
range
f
.
Comments
{
if
g
.
Pos
()
<
pos
[
0
]
.
Start
{
continue
}
if
i
<
cstart
{
cstart
=
i
}
if
fset
.
Position
(
g
.
End
())
.
Line
>
lastLine
{
cend
=
i
break
}
}
comments
:=
f
.
Comments
[
cstart
:
cend
]
// Assign each comment to the import spec preceding it.
importComment
:=
map
[
*
ast
.
ImportSpec
][]
*
ast
.
CommentGroup
{}
specIndex
:=
0
for
_
,
g
:=
range
comments
{
for
specIndex
+
1
<
len
(
specs
)
&&
pos
[
specIndex
+
1
]
.
Start
<=
g
.
Pos
()
{
specIndex
++
}
s
:=
specs
[
specIndex
]
.
(
*
ast
.
ImportSpec
)
importComment
[
s
]
=
append
(
importComment
[
s
],
g
)
}
// Sort the import specs by import path.
// Remove duplicates, when possible without data loss.
// Reassign the import paths to have the same position sequence.
// Reassign each comment to abut the end of its spec.
// Sort the comments by new position.
sort
.
Sort
(
byImportSpec
(
specs
))
// Dedup. Thanks to our sorting, we can just consider
// adjacent pairs of imports.
deduped
:=
specs
[
:
0
]
for
i
,
s
:=
range
specs
{
if
i
==
len
(
specs
)
-
1
||
!
collapse
(
s
,
specs
[
i
+
1
])
{
deduped
=
append
(
deduped
,
s
)
}
else
{
p
:=
s
.
Pos
()
fset
.
File
(
p
)
.
MergeLine
(
fset
.
Position
(
p
)
.
Line
)
}
}
specs
=
deduped
// Fix up comment positions
for
i
,
s
:=
range
specs
{
s
:=
s
.
(
*
ast
.
ImportSpec
)
if
s
.
Name
!=
nil
{
s
.
Name
.
NamePos
=
pos
[
i
]
.
Start
}
s
.
Path
.
ValuePos
=
pos
[
i
]
.
Start
s
.
EndPos
=
pos
[
i
]
.
End
for
_
,
g
:=
range
importComment
[
s
]
{
for
_
,
c
:=
range
g
.
List
{
c
.
Slash
=
pos
[
i
]
.
End
}
}
}
sort
.
Sort
(
byCommentPos
(
comments
))
return
specs
}
type
byImportSpec
[]
ast
.
Spec
// slice of *ast.ImportSpec
func
(
x
byImportSpec
)
Len
()
int
{
return
len
(
x
)
}
func
(
x
byImportSpec
)
Swap
(
i
,
j
int
)
{
x
[
i
],
x
[
j
]
=
x
[
j
],
x
[
i
]
}
func
(
x
byImportSpec
)
Less
(
i
,
j
int
)
bool
{
ipath
:=
importPath
(
x
[
i
])
jpath
:=
importPath
(
x
[
j
])
igroup
:=
importGroup
(
ipath
)
jgroup
:=
importGroup
(
jpath
)
if
igroup
!=
jgroup
{
return
igroup
<
jgroup
}
if
ipath
!=
jpath
{
return
ipath
<
jpath
}
iname
:=
importName
(
x
[
i
])
jname
:=
importName
(
x
[
j
])
if
iname
!=
jname
{
return
iname
<
jname
}
return
importComment
(
x
[
i
])
<
importComment
(
x
[
j
])
}
type
byCommentPos
[]
*
ast
.
CommentGroup
func
(
x
byCommentPos
)
Len
()
int
{
return
len
(
x
)
}
func
(
x
byCommentPos
)
Swap
(
i
,
j
int
)
{
x
[
i
],
x
[
j
]
=
x
[
j
],
x
[
i
]
}
func
(
x
byCommentPos
)
Less
(
i
,
j
int
)
bool
{
return
x
[
i
]
.
Pos
()
<
x
[
j
]
.
Pos
()
}
This diff is collapsed.
Click to expand it.
vendor/golang.org/x/tools/imports/zstdlib.go
deleted
100644 → 0
View file @
5b0c9c8a
This diff is collapsed.
Click to expand it.
vendor/vendor.json
View file @
5ed3960b
...
...
@@ -880,12 +880,6 @@
"revision"
:
"be0fcc31ae2332374e800dfff29b721c585b35df"
,
"revisionTime"
:
"2016-11-04T18:56:24Z"
},
{
"checksumSHA1"
:
"2ko3hvt1vrfwG+p7SLW+zqDEeV4="
,
"path"
:
"golang.org/x/tools/imports"
,
"revision"
:
"be0fcc31ae2332374e800dfff29b721c585b35df"
,
"revisionTime"
:
"2016-11-04T18:56:24Z"
},
{
"checksumSHA1"
:
"CEFTYXtWmgSh+3Ik1NmDaJcz4E0="
,
"path"
:
"gopkg.in/check.v1"
,
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment