fcee603081
Previously if the only names defined by _test packages were examples, the gotest script would emit an incorrect _testmain.go file. I worked around that by marking the example_test.go files +build ignored. This CL changes the gotest script to handle this case correctly, and removes the now-unnecessary build tags. Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/214039 From-SVN: r280085
141 lines
2.7 KiB
Go
141 lines
2.7 KiB
Go
// 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 scanner_test
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
"text/scanner"
|
|
"unicode"
|
|
)
|
|
|
|
func Example() {
|
|
const src = `
|
|
// This is scanned code.
|
|
if a > 10 {
|
|
someParsable = text
|
|
}`
|
|
|
|
var s scanner.Scanner
|
|
s.Init(strings.NewReader(src))
|
|
s.Filename = "example"
|
|
for tok := s.Scan(); tok != scanner.EOF; tok = s.Scan() {
|
|
fmt.Printf("%s: %s\n", s.Position, s.TokenText())
|
|
}
|
|
|
|
// Output:
|
|
// example:3:1: if
|
|
// example:3:4: a
|
|
// example:3:6: >
|
|
// example:3:8: 10
|
|
// example:3:11: {
|
|
// example:4:2: someParsable
|
|
// example:4:15: =
|
|
// example:4:17: text
|
|
// example:5:1: }
|
|
}
|
|
|
|
func Example_isIdentRune() {
|
|
const src = "%var1 var2%"
|
|
|
|
var s scanner.Scanner
|
|
s.Init(strings.NewReader(src))
|
|
s.Filename = "default"
|
|
|
|
for tok := s.Scan(); tok != scanner.EOF; tok = s.Scan() {
|
|
fmt.Printf("%s: %s\n", s.Position, s.TokenText())
|
|
}
|
|
|
|
fmt.Println()
|
|
s.Init(strings.NewReader(src))
|
|
s.Filename = "percent"
|
|
|
|
// treat leading '%' as part of an identifier
|
|
s.IsIdentRune = func(ch rune, i int) bool {
|
|
return ch == '%' && i == 0 || unicode.IsLetter(ch) || unicode.IsDigit(ch) && i > 0
|
|
}
|
|
|
|
for tok := s.Scan(); tok != scanner.EOF; tok = s.Scan() {
|
|
fmt.Printf("%s: %s\n", s.Position, s.TokenText())
|
|
}
|
|
|
|
// Output:
|
|
// default:1:1: %
|
|
// default:1:2: var1
|
|
// default:1:7: var2
|
|
// default:1:11: %
|
|
//
|
|
// percent:1:1: %var1
|
|
// percent:1:7: var2
|
|
// percent:1:11: %
|
|
}
|
|
|
|
func Example_mode() {
|
|
const src = `
|
|
// Comment begins at column 5.
|
|
|
|
This line should not be included in the output.
|
|
|
|
/*
|
|
This multiline comment
|
|
should be extracted in
|
|
its entirety.
|
|
*/
|
|
`
|
|
|
|
var s scanner.Scanner
|
|
s.Init(strings.NewReader(src))
|
|
s.Filename = "comments"
|
|
s.Mode ^= scanner.SkipComments // don't skip comments
|
|
|
|
for tok := s.Scan(); tok != scanner.EOF; tok = s.Scan() {
|
|
txt := s.TokenText()
|
|
if strings.HasPrefix(txt, "//") || strings.HasPrefix(txt, "/*") {
|
|
fmt.Printf("%s: %s\n", s.Position, txt)
|
|
}
|
|
}
|
|
|
|
// Output:
|
|
// comments:2:5: // Comment begins at column 5.
|
|
// comments:6:1: /*
|
|
// This multiline comment
|
|
// should be extracted in
|
|
// its entirety.
|
|
// */
|
|
}
|
|
|
|
func Example_whitespace() {
|
|
// tab-separated values
|
|
const src = `aa ab ac ad
|
|
ba bb bc bd
|
|
ca cb cc cd
|
|
da db dc dd`
|
|
|
|
var (
|
|
col, row int
|
|
s scanner.Scanner
|
|
tsv [4][4]string // large enough for example above
|
|
)
|
|
s.Init(strings.NewReader(src))
|
|
s.Whitespace ^= 1<<'\t' | 1<<'\n' // don't skip tabs and new lines
|
|
|
|
for tok := s.Scan(); tok != scanner.EOF; tok = s.Scan() {
|
|
switch tok {
|
|
case '\n':
|
|
row++
|
|
col = 0
|
|
case '\t':
|
|
col++
|
|
default:
|
|
tsv[row][col] = s.TokenText()
|
|
}
|
|
}
|
|
|
|
fmt.Print(tsv)
|
|
|
|
// Output:
|
|
// [[aa ab ac ad] [ba bb bc bd] [ca cb cc cd] [da db dc dd]]
|
|
}
|