aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/doc
diff options
context:
space:
mode:
authorDaniel Martí <mvdan@mvdan.cc>2019-03-23 16:20:35 +0000
committerRobert Griesemer <gri@golang.org>2019-04-15 04:12:52 +0000
commit60a8dbf3b4e10627b9f5c3a0a0bf4462247270c8 (patch)
tree19feceeabf39060c5b42150965e4600e9218eb2f /src/cmd/doc
parenta01d108e30a00f9126253e061d679b07d9ff72b7 (diff)
downloadgo-60a8dbf3b4e10627b9f5c3a0a0bf4462247270c8.tar.gz
go-60a8dbf3b4e10627b9f5c3a0a0bf4462247270c8.zip
go/token: add IsIdentifier, IsKeyword, and IsExported
Telling whether a string is a valid Go identifier can seem like an easy task, but it's easy to forget about the edge cases. For example, some implementations out there forget that an empty string or keywords like "func" aren't valid identifiers. Add a simple implementation with proper Unicode support, and start using it in cmd/cover and cmd/doc. Other pieces of the standard library reimplement part of this logic, but don't use a "func(string) bool" signature, so we're leaving them untouched for now. Add some tests too, to ensure that we actually got these edge cases correctly. Since telling whether a string is a valid identifier requires knowing that it's not a valid keyword, add IsKeyword too. The internal map was already accessible via Lookup, but "Lookup(str) != IDENT" isn't as easy to understand as IsKeyword(str). And, as per Josh's suggestion, we could have IsKeyword (and probably Lookup too) use a perfect hash function instead of a global map. Finally, for consistency with these new functions, add IsExported. That makes go/ast.IsExported a bit redundant, so perhaps it can be deprecated in favor of go/token.IsExported in the future. Clarify that token.IsExported doesn't imply token.IsIdentifier, to avoid ambiguity. Fixes #30064. Change-Id: I0e0e49215fd7e47b603ebc2b5a44086c51ba57f7 Reviewed-on: https://go-review.googlesource.com/c/go/+/169018 Run-TryBot: Daniel Martí <mvdan@mvdan.cc> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Robert Griesemer <gri@golang.org> Reviewed-by: Alan Donovan <adonovan@google.com>
Diffstat (limited to 'src/cmd/doc')
-rw-r--r--src/cmd/doc/main.go23
1 files changed, 7 insertions, 16 deletions
diff --git a/src/cmd/doc/main.go b/src/cmd/doc/main.go
index ec15ec5826..9b24c5874f 100644
--- a/src/cmd/doc/main.go
+++ b/src/cmd/doc/main.go
@@ -42,6 +42,7 @@ import (
"flag"
"fmt"
"go/build"
+ "go/token"
"io"
"log"
"os"
@@ -333,28 +334,18 @@ func parseSymbol(str string) (symbol, method string) {
case 1:
case 2:
method = elem[1]
- isIdentifier(method)
+ if !token.IsIdentifier(method) {
+ log.Fatalf("invalid identifier %q", method)
+ }
default:
log.Printf("too many periods in symbol specification")
usage()
}
symbol = elem[0]
- isIdentifier(symbol)
- return
-}
-
-// isIdentifier checks that the name is valid Go identifier, and
-// logs and exits if it is not.
-func isIdentifier(name string) {
- if len(name) == 0 {
- log.Fatal("empty symbol")
- }
- for i, ch := range name {
- if unicode.IsLetter(ch) || ch == '_' || i > 0 && unicode.IsDigit(ch) {
- continue
- }
- log.Fatalf("invalid identifier %q", name)
+ if !token.IsIdentifier(symbol) {
+ log.Fatalf("invalid identifier %q", symbol)
}
+ return
}
// isExported reports whether the name is an exported identifier.