if S.offset < len(S.src) {
S.pos.Offset = S.offset
S.pos.Column++
+ if S.ch == '\n' {
+ // next character starts a new line
+ S.pos.Line++
+ S.pos.Column = 1
+ }
r, w := int(S.src[S.offset]), 1
switch {
case r == 0:
S.error(S.pos, "illegal character NUL")
- case r == '\n':
- S.pos.Line++
- S.pos.Column = 0
case r >= 0x80:
// not ASCII
r, w = utf8.DecodeRune(S.src[S.offset:])
// valid //line filename:line comment;
// update scanner position
S.pos.Filename = string(text[len(prefix):i])
- S.pos.Line = line
+ S.pos.Line = line - 1 // -1 since the '\n' has not been consumed yet
}
}
}
newline = true
break
}
- S.skipWhitespace()
+ S.skipWhitespace() // S.insertSemi is set
if S.ch == '\n' {
newline = true
break
case -1:
tok = token.EOF
case '\n':
- // we only reach here of S.insertSemi was
+ // we only reach here if S.insertSemi was
// set in the first place and exited early
// from S.skipWhitespace()
S.insertSemi = false // newline consumed
for _, e := range tokens {
src += e.lit + whitespace
}
+ src_linecount := newlineCount(src)
whitespace_linecount := newlineCount(whitespace)
// verify scan
index := 0
- epos := token.Position{"", 0, 1, 1}
+ epos := token.Position{"", 0, 1, 1} // expected position
nerrors := Tokenize("", []byte(src), &testErrorHandler{t}, ScanComments,
func(pos token.Position, tok token.Token, litb []byte) bool {
e := elt{token.EOF, "", special}
lit := string(litb)
if tok == token.EOF {
lit = "<EOF>"
- epos.Column = 0
+ epos.Line = src_linecount
+ epos.Column = 1
}
checkPos(t, lit, pos, epos)
if tok != e.tok {