1
0
mirror of https://github.com/golang/go synced 2024-11-25 07:07:57 -07:00

go/scanner: remove (exported) InsertSemis mode

This is a relic from the times when we switched
to automatic semicolon insertion. It's still use-
ful to have a non-exported switch for testing.

R=golang-dev, r, rsc
CC=golang-dev
https://golang.org/cl/5528077
This commit is contained in:
Robert Griesemer 2012-01-11 10:06:44 -08:00
parent c7fdbeb6c1
commit 276f177b9c
5 changed files with 23 additions and 17 deletions

View File

@ -231,7 +231,7 @@ func commentSelection(src []byte) Selection {
var s scanner.Scanner
fset := token.NewFileSet()
file := fset.AddFile("", fset.Base(), len(src))
s.Init(file, src, nil, scanner.ScanComments+scanner.InsertSemis)
s.Init(file, src, nil, scanner.ScanComments)
return func() (seg []int) {
for {
pos, tok, lit := s.Scan()

View File

@ -111,7 +111,7 @@ func expectedErrors(t *testing.T, testname string, files map[string]*ast.File) m
// set otherwise the position information returned here will
// not match the position information collected by the parser
s.Init(getFile(filename), src, nil, scanner.ScanComments)
var prev token.Pos // position of last non-comment token
var prev token.Pos // position of last non-comment, non-semicolon token
scanFile:
for {
@ -124,6 +124,12 @@ func expectedErrors(t *testing.T, testname string, files map[string]*ast.File) m
if len(s) == 2 {
errors[prev] = string(s[1])
}
case token.SEMICOLON:
// ignore automatically inserted semicolon
if lit == "\n" {
break
}
fallthrough
default:
prev = pos
}

View File

@ -67,7 +67,7 @@ type parser struct {
// scannerMode returns the scanner mode bits given the parser's mode bits.
func scannerMode(mode uint) uint {
var m uint = scanner.InsertSemis
var m uint
if mode&ParseComments != 0 {
m |= scanner.ScanComments
}

View File

@ -90,8 +90,8 @@ func (S *Scanner) next() {
// They control scanner behavior.
//
const (
ScanComments = 1 << iota // return comments as COMMENT tokens
InsertSemis // automatically insert semicolons
ScanComments = 1 << iota // return comments as COMMENT tokens
dontInsertSemis // do not automatically insert semicolons - for testing only
)
// Init prepares the scanner S to tokenize the text src by setting the
@ -104,7 +104,7 @@ const (
// Calls to Scan will use the error handler err if they encounter a
// syntax error and err is not nil. Also, for each error encountered,
// the Scanner field ErrorCount is incremented by one. The mode parameter
// determines how comments and semicolons are handled.
// determines how comments are handled.
//
// Note that Init may call err if there is an error in the first character
// of the file.
@ -673,7 +673,7 @@ scanAgain:
}
}
if S.mode&InsertSemis != 0 {
if S.mode&dontInsertSemis == 0 {
S.insertSemi = insertSemi
}

View File

@ -223,7 +223,7 @@ func TestScan(t *testing.T) {
// verify scan
var s Scanner
s.Init(fset.AddFile("", fset.Base(), len(src)), []byte(src), &testErrorHandler{t}, ScanComments)
s.Init(fset.AddFile("", fset.Base(), len(src)), []byte(src), &testErrorHandler{t}, ScanComments|dontInsertSemis)
index := 0
epos := token.Position{"", 0, 1, 1} // expected position
for {
@ -430,14 +430,14 @@ var lines = []string{
func TestSemis(t *testing.T) {
for _, line := range lines {
checkSemi(t, line, InsertSemis)
checkSemi(t, line, InsertSemis|ScanComments)
checkSemi(t, line, 0)
checkSemi(t, line, ScanComments)
// if the input ended in newlines, the input must tokenize the
// same with or without those newlines
for i := len(line) - 1; i >= 0 && line[i] == '\n'; i-- {
checkSemi(t, line[0:i], InsertSemis)
checkSemi(t, line[0:i], InsertSemis|ScanComments)
checkSemi(t, line[0:i], 0)
checkSemi(t, line[0:i], ScanComments)
}
}
}
@ -492,7 +492,7 @@ func TestLineComments(t *testing.T) {
// verify scan
var S Scanner
file := fset.AddFile(filepath.Join("dir", "TestLineComments"), fset.Base(), len(src))
S.Init(file, []byte(src), nil, 0)
S.Init(file, []byte(src), nil, dontInsertSemis)
for _, s := range segs {
p, _, lit := S.Scan()
pos := file.Position(p)
@ -511,7 +511,7 @@ func TestInit(t *testing.T) {
// 1st init
src1 := "if true { }"
f1 := fset.AddFile("src1", fset.Base(), len(src1))
s.Init(f1, []byte(src1), nil, 0)
s.Init(f1, []byte(src1), nil, dontInsertSemis)
if f1.Size() != len(src1) {
t.Errorf("bad file size: got %d, expected %d", f1.Size(), len(src1))
}
@ -525,7 +525,7 @@ func TestInit(t *testing.T) {
// 2nd init
src2 := "go true { ]"
f2 := fset.AddFile("src2", fset.Base(), len(src2))
s.Init(f2, []byte(src2), nil, 0)
s.Init(f2, []byte(src2), nil, dontInsertSemis)
if f2.Size() != len(src2) {
t.Errorf("bad file size: got %d, expected %d", f2.Size(), len(src2))
}
@ -551,7 +551,7 @@ func TestStdErrorHander(t *testing.T) {
v := new(ErrorVector)
var s Scanner
s.Init(fset.AddFile("File1", fset.Base(), len(src)), []byte(src), v, 0)
s.Init(fset.AddFile("File1", fset.Base(), len(src)), []byte(src), v, dontInsertSemis)
for {
if _, tok, _ := s.Scan(); tok == token.EOF {
break
@ -596,7 +596,7 @@ func (h *errorCollector) Error(pos token.Position, msg string) {
func checkError(t *testing.T, src string, tok token.Token, pos int, err string) {
var s Scanner
var h errorCollector
s.Init(fset.AddFile("", fset.Base(), len(src)), []byte(src), &h, ScanComments)
s.Init(fset.AddFile("", fset.Base(), len(src)), []byte(src), &h, ScanComments|dontInsertSemis)
_, tok0, _ := s.Scan()
_, tok1, _ := s.Scan()
if tok0 != tok {