diff options
Diffstat (limited to 'pkg/lang/scanner/scanner.go')
| -rw-r--r-- | pkg/lang/scanner/scanner.go | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/pkg/lang/scanner/scanner.go b/pkg/lang/scanner/scanner.go index 5a1c92a..19e3462 100644 --- a/pkg/lang/scanner/scanner.go +++ b/pkg/lang/scanner/scanner.go @@ -53,10 +53,15 @@ func (s *Scanner) scanToken() (token.Token, error) { return token.Token{}, ErrScannerFinished } - if err := s.skipWhitespace(); err != nil { + hadNewline, firstNewline, err := s.skipWhitespace() + if err != nil { return token.Token{}, err } + if hadNewline { + return token.New(token.EOL, firstNewline, nil), nil + } + c, eof, err := s.peek() if err != nil { return token.Token{}, err @@ -294,11 +299,19 @@ func (s *Scanner) scanNumber() (token.Token, error) { return token.New(token.Int, loc, num), nil } -func (s *Scanner) skipWhitespace() error { +func (s *Scanner) skipWhitespace() (bool, token.Loc, error) { + hadNewline := false + firstNewline := token.Loc{} + for { c, eof, err := s.peek() if err != nil { - return err + return false, token.Loc{}, err + } + + if c == '\n' && !hadNewline { + firstNewline = s.loc() + hadNewline = true } if eof || !unicode.IsSpace(c) { @@ -306,11 +319,11 @@ func (s *Scanner) skipWhitespace() error { } if _, _, err = s.next(); err != nil { - return err + return false, token.Loc{}, err } } - return nil + return hadNewline, firstNewline, nil } func (s *Scanner) loc() token.Loc { |
