about summary refs log tree commit diff
path: root/pkg/lang/scanner/scanner.go
diff options
context:
space:
mode:
authorMel <einebeere@gmail.com>2022-04-19 23:53:53 +0200
committerMel <einebeere@gmail.com>2022-04-19 23:53:53 +0200
commitd816a9eae2822c1db57efd5de80af926de474611 (patch)
tree52a715c0a996b9232d6122579a216cd9be255f94 /pkg/lang/scanner/scanner.go
parent65fc6afb54190af91f1b66627dfdd097ee9e4fbc (diff)
downloadjinx-d816a9eae2822c1db57efd5de80af926de474611.tar.zst
jinx-d816a9eae2822c1db57efd5de80af926de474611.zip
Emit EOL tokens in scanner
Diffstat (limited to 'pkg/lang/scanner/scanner.go')
-rw-r--r--pkg/lang/scanner/scanner.go23
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 {