|
import formatError from './format-error'
|
|
import {unclosedTemplateLiteral} from '../messages'
|
|
export const $_ES6_BQ = '`'
|
|
|
|
/**
|
|
* Searches the next backquote that signals the end of the ES6 Template Literal
|
|
* or the "${" sequence that starts a JS expression, skipping any escaped
|
|
* character.
|
|
*
|
|
* @param {string} code - Whole code
|
|
* @param {number} pos - The start position of the template
|
|
* @param {string[]} stack - To save nested ES6 TL count
|
|
* @returns {number} The end of the string (-1 if not found)
|
|
*/
|
|
export default function skipES6TL(code, pos, stack) {
|
|
// we are in the char following the backquote (`),
|
|
// find the next unescaped backquote or the sequence "${"
|
|
const re = /[`$\\]/g
|
|
let c
|
|
while (re.lastIndex = pos, re.exec(code)) {
|
|
pos = re.lastIndex
|
|
c = code[pos - 1]
|
|
if (c === '`') {
|
|
return pos
|
|
}
|
|
if (c === '$' && code[pos++] === '{') {
|
|
stack.push($_ES6_BQ, '}')
|
|
return pos
|
|
}
|
|
// else this is an escaped char
|
|
}
|
|
throw formatError(code, unclosedTemplateLiteral, pos)
|
|
}
|