// Init prepares the scanner S to tokenize the text src by setting the // scanner at the beginning of src. The scanner uses the file set file // for position information and it adds line information for each line. // It is ok to re-use the same file when re-scanning the same file as // line information which is already present is ignored. Init causes a // panic if the file size does not match the src size. // // 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, illegal characters, and semicolons are handled. // // Note that Init may call err if there is an error in the first character // of the file. // func (S *Scanner) Init(file *token.File, src []byte, err ErrorHandler, mode uint) { // Explicitly initialize all fields since a scanner may be reused. if file.Size() != len(src) { panic("file size does not match src len") } S.file = file S.dir, _ = filepath.Split(file.Name()) S.src = src S.err = err S.mode = mode S.ch = ' ' S.offset = 0 S.rdOffset = 0 S.lineOffset = 0 S.insertSemi = false S.ErrorCount = 0 S.next() }
func verifyPositions(t *testing.T, fset *token.FileSet, f *token.File, lines []int) { for offs := 0; offs < f.Size(); offs++ { p := f.Pos(offs) offs2 := f.Offset(p) if offs2 != offs { t.Errorf("%s, Offset: expected offset %d; got %d", f.Name(), offs, offs2) } line, col := linecol(lines, offs) msg := fmt.Sprintf("%s (offs = %d, p = %d)", f.Name(), offs, p) checkPos(t, msg, f.Position(f.Pos(offs)), token.Position{f.Name(), offs, line, col}) checkPos(t, msg, fset.Position(p), token.Position{f.Name(), offs, line, col}) } }