add additional regex property to regex literals containing pattern and flags
This commit is contained in:
parent
0258dafa8a
commit
397d87fd11
32
acorn.js
32
acorn.js
@ -934,18 +934,36 @@
|
|||||||
// Need to use `readWord1` because '\uXXXX' sequences are allowed
|
// Need to use `readWord1` because '\uXXXX' sequences are allowed
|
||||||
// here (don't ask).
|
// here (don't ask).
|
||||||
var mods = readWord1();
|
var mods = readWord1();
|
||||||
|
var tmp = content;
|
||||||
if (mods) {
|
if (mods) {
|
||||||
var validFlags = /^[gmsiy]*$/;
|
var validFlags = /^[gmsiy]*$/;
|
||||||
if (options.ecmaVersion >= 6) validFlags = /^[gmsiyu]*$/;
|
if (options.ecmaVersion >= 6) validFlags = /^[gmsiyu]*$/;
|
||||||
if (!validFlags.test(mods)) raise(start, "Invalid regular expression flag");
|
if (!validFlags.test(mods)) raise(start, "Invalid regular expression flag");
|
||||||
|
if (mods.indexOf('u') >= 0) {
|
||||||
|
// Replace each astral symbol and every Unicode code point
|
||||||
|
// escape sequence that represents such a symbol with a single
|
||||||
|
// ASCII symbol to avoid throwing on regular expressions that
|
||||||
|
// are only valid in combination with the `/u` flag.
|
||||||
|
tmp = tmp
|
||||||
|
.replace(/\\u\{([0-9a-fA-F]{5,6})\}/g, 'x')
|
||||||
|
.replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g, 'x');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
// Detect invalid regular expressions.
|
||||||
try {
|
try {
|
||||||
var value = new RegExp(content, mods);
|
new RegExp(tmp);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (e instanceof SyntaxError) raise(start, "Error parsing regular expression: " + e.message);
|
if (e instanceof SyntaxError) raise(start, "Error parsing regular expression: " + e.message);
|
||||||
raise(e);
|
raise(e);
|
||||||
}
|
}
|
||||||
return finishToken(_regexp, value);
|
// Get a regular expression object for this pattern-flag pair, or `null` in
|
||||||
|
// case the current environment doesn't support the flags it uses.
|
||||||
|
try {
|
||||||
|
var value = new RegExp(content, mods);
|
||||||
|
} catch (err) {
|
||||||
|
value = null;
|
||||||
|
}
|
||||||
|
return finishToken(_regexp, {pattern: content, flags: mods, value: value});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read an integer in the given radix. Return null if zero digits
|
// Read an integer in the given radix. Return null if zero digits
|
||||||
@ -2010,7 +2028,15 @@
|
|||||||
}
|
}
|
||||||
return id;
|
return id;
|
||||||
|
|
||||||
case _num: case _string: case _regexp:
|
case _regexp:
|
||||||
|
var node = startNode();
|
||||||
|
node.regex = {pattern: tokVal.pattern, flags: tokVal.flags};
|
||||||
|
node.value = tokVal.value;
|
||||||
|
node.raw = input.slice(tokStart, tokEnd);
|
||||||
|
next();
|
||||||
|
return finishNode(node, "Literal");
|
||||||
|
|
||||||
|
case _num: case _string:
|
||||||
var node = startNode();
|
var node = startNode();
|
||||||
node.value = tokVal;
|
node.value = tokVal;
|
||||||
node.raw = input.slice(tokStart, tokEnd);
|
node.raw = input.slice(tokStart, tokEnd);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user