-
Notifications
You must be signed in to change notification settings - Fork 13
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #17 from shurcooL/go1.9
Add Go 1.9 support.
- Loading branch information
Showing
9 changed files
with
923 additions
and
282 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,4 @@ | ||
// +build go1.6 | ||
// +build go1.6,!go1.9 | ||
|
||
package gotool | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,167 @@ | ||
// Copyright 2012 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 go1.9 | ||
|
||
package load | ||
|
||
import ( | ||
"strings" | ||
"testing" | ||
) | ||
|
||
var matchPatternTests = ` | ||
pattern ... | ||
match foo | ||
pattern net | ||
match net | ||
not net/http | ||
pattern net/http | ||
match net/http | ||
not net | ||
pattern net... | ||
match net net/http netchan | ||
not not/http not/net/http | ||
# Special cases. Quoting docs: | ||
# First, /... at the end of the pattern can match an empty string, | ||
# so that net/... matches both net and packages in its subdirectories, like net/http. | ||
pattern net/... | ||
match net net/http | ||
not not/http not/net/http netchan | ||
# Second, any slash-separted pattern element containing a wildcard never | ||
# participates in a match of the "vendor" element in the path of a vendored | ||
# package, so that ./... does not match packages in subdirectories of | ||
# ./vendor or ./mycode/vendor, but ./vendor/... and ./mycode/vendor/... do. | ||
# Note, however, that a directory named vendor that itself contains code | ||
# is not a vendored package: cmd/vendor would be a command named vendor, | ||
# and the pattern cmd/... matches it. | ||
pattern ./... | ||
match ./vendor ./mycode/vendor | ||
not ./vendor/foo ./mycode/vendor/foo | ||
pattern ./vendor/... | ||
match ./vendor/foo ./vendor/foo/vendor | ||
not ./vendor/foo/vendor/bar | ||
pattern mycode/vendor/... | ||
match mycode/vendor mycode/vendor/foo mycode/vendor/foo/vendor | ||
not mycode/vendor/foo/vendor/bar | ||
pattern x/vendor/y | ||
match x/vendor/y | ||
not x/vendor | ||
pattern x/vendor/y/... | ||
match x/vendor/y x/vendor/y/z x/vendor/y/vendor x/vendor/y/z/vendor | ||
not x/vendor/y/vendor/z | ||
pattern .../vendor/... | ||
match x/vendor/y x/vendor/y/z x/vendor/y/vendor x/vendor/y/z/vendor | ||
` | ||
|
||
func TestMatchPattern(t *testing.T) { | ||
testPatterns(t, "matchPattern", matchPatternTests, func(pattern, name string) bool { | ||
return matchPattern(pattern)(name) | ||
}) | ||
} | ||
|
||
var treeCanMatchPatternTests = ` | ||
pattern ... | ||
match foo | ||
pattern net | ||
match net | ||
not net/http | ||
pattern net/http | ||
match net net/http | ||
pattern net... | ||
match net netchan net/http | ||
not not/http not/net/http | ||
pattern net/... | ||
match net net/http | ||
not not/http netchan | ||
pattern abc.../def | ||
match abcxyz | ||
not xyzabc | ||
pattern x/y/z/... | ||
match x x/y x/y/z x/y/z/w | ||
pattern x/y/z | ||
match x x/y x/y/z | ||
not x/y/z/w | ||
pattern x/.../y/z | ||
match x/a/b/c | ||
not y/x/a/b/c | ||
` | ||
|
||
func TestTreeCanMatchPattern(t *testing.T) { | ||
testPatterns(t, "treeCanMatchPattern", treeCanMatchPatternTests, func(pattern, name string) bool { | ||
return treeCanMatchPattern(pattern)(name) | ||
}) | ||
} | ||
|
||
var hasPathPrefixTests = []stringPairTest{ | ||
{"abc", "a", false}, | ||
{"a/bc", "a", true}, | ||
{"a", "a", true}, | ||
{"a/bc", "a/", true}, | ||
} | ||
|
||
func TestHasPathPrefix(t *testing.T) { | ||
testStringPairs(t, "hasPathPrefix", hasPathPrefixTests, hasPathPrefix) | ||
} | ||
|
||
type stringPairTest struct { | ||
in1 string | ||
in2 string | ||
out bool | ||
} | ||
|
||
func testStringPairs(t *testing.T, name string, tests []stringPairTest, f func(string, string) bool) { | ||
for _, tt := range tests { | ||
if out := f(tt.in1, tt.in2); out != tt.out { | ||
t.Errorf("%s(%q, %q) = %v, want %v", name, tt.in1, tt.in2, out, tt.out) | ||
} | ||
} | ||
} | ||
|
||
func testPatterns(t *testing.T, name, tests string, fn func(string, string) bool) { | ||
var patterns []string | ||
for _, line := range strings.Split(tests, "\n") { | ||
if i := strings.Index(line, "#"); i >= 0 { | ||
line = line[:i] | ||
} | ||
f := strings.Fields(line) | ||
if len(f) == 0 { | ||
continue | ||
} | ||
switch f[0] { | ||
default: | ||
t.Fatalf("unknown directive %q", f[0]) | ||
case "pattern": | ||
patterns = f[1:] | ||
case "match", "not": | ||
want := f[0] == "match" | ||
for _, pattern := range patterns { | ||
for _, in := range f[1:] { | ||
if fn(pattern, in) != want { | ||
t.Errorf("%s(%q, %q) = %v, want %v", name, pattern, in, !want, want) | ||
} | ||
} | ||
} | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
// Copyright 2017 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 go1.9 | ||
|
||
package load | ||
|
||
import ( | ||
"strings" | ||
) | ||
|
||
// hasPathPrefix reports whether the path s begins with the | ||
// elements in prefix. | ||
func hasPathPrefix(s, prefix string) bool { | ||
switch { | ||
default: | ||
return false | ||
case len(s) == len(prefix): | ||
return s == prefix | ||
case len(s) > len(prefix): | ||
if prefix != "" && prefix[len(prefix)-1] == '/' { | ||
return strings.HasPrefix(s, prefix) | ||
} | ||
return s[len(prefix)] == '/' && s[:len(prefix)] == prefix | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
// Copyright 2011 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 go1.9 | ||
|
||
// Package load loads packages. | ||
package load | ||
|
||
import ( | ||
"strings" | ||
) | ||
|
||
// isStandardImportPath reports whether $GOROOT/src/path should be considered | ||
// part of the standard distribution. For historical reasons we allow people to add | ||
// their own code to $GOROOT instead of using $GOPATH, but we assume that | ||
// code will start with a domain name (dot in the first element). | ||
func isStandardImportPath(path string) bool { | ||
i := strings.Index(path, "/") | ||
if i < 0 { | ||
i = len(path) | ||
} | ||
elem := path[:i] | ||
return !strings.Contains(elem, ".") | ||
} |
Oops, something went wrong.