Skip to content

Commit

Permalink
fix(lexer): improved template scanning
Browse files Browse the repository at this point in the history
  • Loading branch information
KFlash committed Aug 28, 2019
1 parent ce89217 commit a2af86f
Showing 1 changed file with 13 additions and 13 deletions.
26 changes: 13 additions & 13 deletions src/lexer/template.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,15 @@ import { report, Errors } from '../errors';
*/
export function scanTemplate(parser: ParserState, context: Context): Token {
const { index: start } = parser;
let tail = 1;
let token: Token = Token.TemplateSpan;
let ret: string | void = '';

let char = advanceChar(parser);

while (char !== Chars.Backtick) {
if (char === Chars.Dollar && parser.source.charCodeAt(parser.index + 1) === Chars.LeftBrace) {
advanceChar(parser); // Skip: '}'
tail = 0;
token = Token.TemplateContinuation;
break;
} else if ((char & 8) === 8 && char === Chars.Backslash) {
char = advanceChar(parser);
Expand All @@ -31,7 +31,7 @@ export function scanTemplate(parser: ParserState, context: Context): Token {
} else if (code !== Escape.Empty && context & Context.TaggedTemplate) {
ret = undefined;
char = scanBadTemplate(parser, char);
if (char < 0) tail = 0;
if (char < 0) token = Token.TemplateContinuation;
break;
} else {
handleStringError(parser, code as Escape, /* isTemplate */ 1);
Expand Down Expand Up @@ -59,20 +59,20 @@ export function scanTemplate(parser: ParserState, context: Context): Token {

advanceChar(parser); // Consume the quote or opening brace
parser.tokenValue = ret;
if (tail) {
parser.tokenRaw = parser.source.slice(start + 1, parser.index - 1);
return Token.TemplateSpan;
} else {
parser.tokenRaw = parser.source.slice(start + 1, parser.index - 2);
return Token.TemplateContinuation;
}

parser.tokenRaw = parser.source.slice(start + 1, parser.index - (token === Token.TemplateSpan ? 1 : 2));

return token;
}

// Fallback for looser template segment validation (no actual parsing).
// It returns `ch` as negative iff the segment ends with `${`
/**
* Scans looser template segment
*
* @param parser Parser state
* @param ch Code point
*/
function scanBadTemplate(parser: ParserState, ch: number): number {
while (ch !== Chars.Backtick) {
// Break after a literal `${` (thus the dedicated code path).
switch (ch) {
case Chars.Dollar: {
const index = parser.index + 1;
Expand Down

0 comments on commit a2af86f

Please sign in to comment.