aboutsummaryrefslogtreecommitdiffhomepage
path: root/vendor/github.com/tdewolff/parse/js/lex.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/tdewolff/parse/js/lex.go')
-rw-r--r--vendor/github.com/tdewolff/parse/js/lex.go67
1 files changed, 42 insertions, 25 deletions
diff --git a/vendor/github.com/tdewolff/parse/js/lex.go b/vendor/github.com/tdewolff/parse/js/lex.go
index 3ee73e7..ce4e1d5 100644
--- a/vendor/github.com/tdewolff/parse/js/lex.go
+++ b/vendor/github.com/tdewolff/parse/js/lex.go
@@ -23,7 +23,8 @@ const (
UnknownToken // extra token when no token can be matched
WhitespaceToken // space \t \v \f
LineTerminatorToken // \r \n \r\n
- CommentToken
+ SingleLineCommentToken
+ MultiLineCommentToken // token for comments with line terminators (not just any /*block*/)
IdentifierToken
PunctuatorToken /* { } ( ) [ ] . ; , < > <= >= == != === !== + - * % ++ -- << >>
>>> & | ^ ! ~ && || ? : = += -= *= %= <<= >>= >>>= &= |= ^= / /= >= */
@@ -68,8 +69,10 @@ func (tt TokenType) String() string {
return "Whitespace"
case LineTerminatorToken:
return "LineTerminator"
- case CommentToken:
- return "Comment"
+ case SingleLineCommentToken:
+ return "SingleLineComment"
+ case MultiLineCommentToken:
+ return "MultiLineComment"
case IdentifierToken:
return "Identifier"
case PunctuatorToken:
@@ -174,15 +177,15 @@ func (l *Lexer) Next() (TokenType, []byte) {
l.r.Move(1)
tt = PunctuatorToken
case '<', '>', '=', '!', '+', '-', '*', '%', '&', '|', '^':
- if (c == '<' || (l.emptyLine && c == '-')) && l.consumeCommentToken() {
- return CommentToken, l.r.Shift()
+ if l.consumeHTMLLikeCommentToken() {
+ return SingleLineCommentToken, l.r.Shift()
} else if l.consumeLongPunctuatorToken() {
l.state = ExprState
tt = PunctuatorToken
}
case '/':
- if l.consumeCommentToken() {
- return CommentToken, l.r.Shift()
+ if tt = l.consumeCommentToken(); tt != UnknownToken {
+ return tt, l.r.Shift()
} else if l.state == ExprState && l.consumeRegexpToken() {
l.state = SubscriptState
tt = RegexpToken
@@ -374,46 +377,54 @@ func (l *Lexer) consumeSingleLineComment() {
////////////////////////////////////////////////////////////////
-func (l *Lexer) consumeCommentToken() bool {
+func (l *Lexer) consumeHTMLLikeCommentToken() bool {
+ c := l.r.Peek(0)
+ if c == '<' && l.r.Peek(1) == '!' && l.r.Peek(2) == '-' && l.r.Peek(3) == '-' {
+ // opening HTML-style single line comment
+ l.r.Move(4)
+ l.consumeSingleLineComment()
+ return true
+ } else if l.emptyLine && c == '-' && l.r.Peek(1) == '-' && l.r.Peek(2) == '>' {
+ // closing HTML-style single line comment
+ // (only if current line didn't contain any meaningful tokens)
+ l.r.Move(3)
+ l.consumeSingleLineComment()
+ return true
+ }
+ return false
+}
+
+func (l *Lexer) consumeCommentToken() TokenType {
c := l.r.Peek(0)
if c == '/' {
c = l.r.Peek(1)
if c == '/' {
- // single line
+ // single line comment
l.r.Move(2)
l.consumeSingleLineComment()
+ return SingleLineCommentToken
} else if c == '*' {
- // multi line
+ // block comment (potentially multiline)
+ tt := SingleLineCommentToken
l.r.Move(2)
for {
c := l.r.Peek(0)
if c == '*' && l.r.Peek(1) == '/' {
l.r.Move(2)
- return true
+ break
} else if c == 0 {
break
} else if l.consumeLineTerminator() {
+ tt = MultiLineCommentToken
l.emptyLine = true
} else {
l.r.Move(1)
}
}
- } else {
- return false
+ return tt
}
- } else if c == '<' && l.r.Peek(1) == '!' && l.r.Peek(2) == '-' && l.r.Peek(3) == '-' {
- // opening HTML-style single line comment
- l.r.Move(4)
- l.consumeSingleLineComment()
- } else if c == '-' && l.r.Peek(1) == '-' && l.r.Peek(2) == '>' {
- // closing HTML-style single line comment
- // (only if current line didn't contain any meaningful tokens)
- l.r.Move(3)
- l.consumeSingleLineComment()
- } else {
- return false
}
- return true
+ return UnknownToken
}
func (l *Lexer) consumeLongPunctuatorToken() bool {
@@ -643,6 +654,12 @@ func (l *Lexer) consumeTemplateToken() bool {
l.state = ExprState
l.r.Move(2)
return true
+ } else if c == '\\' {
+ l.r.Move(1)
+ if c := l.r.Peek(0); c != 0 {
+ l.r.Move(1)
+ }
+ continue
} else if c == 0 {
l.r.Rewind(mark)
return false