V8intrinsic syntax plugin (#10148)
* feat: v8intrinsic syntax plugin Implement V8 Intrinsic Syntax Extension. Here we check the execution branch inside the parseSubscript to make sure the V8IntrinsicIdentifier is immediately followed by a call expression. * feat: disable combining placeholders and v8intrisic per https://github.com/babel/babel/issues/10104#issuecomment-506950969 * test: add more error cases * refactor: parse v8 intrinsic in parseExprAtom This approach is identical to V8’s implementation. Move the test cases as the behaviour changes. * fix: plugin-name typo * test: add yield-expression test case * feat: require startsExpr on modulo for v8intrinsic * perf: skip eof and braceR check as they must return false * Print V8IntrinsicIdentifier * feat: add v8intrinsic to parser typings * Add generated type helpers * fix: incorrect type definition * fix: allow V8IntrinsicIdentifier to be callee
This commit is contained in:
parent
b02e35c19a
commit
da0af5fd99
@ -264,3 +264,8 @@ export function PrivateName(node: Object) {
|
||||
this.token("#");
|
||||
this.print(node.id, node);
|
||||
}
|
||||
|
||||
export function V8IntrinsicIdentifier(node: Object) {
|
||||
this.token("%");
|
||||
this.word(node.name);
|
||||
}
|
||||
|
||||
1
packages/babel-generator/test/fixtures/misc/V8IntrinsicIdentifier/input.js
vendored
Normal file
1
packages/babel-generator/test/fixtures/misc/V8IntrinsicIdentifier/input.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
%DebugPrint(foo);
|
||||
3
packages/babel-generator/test/fixtures/misc/V8IntrinsicIdentifier/options.json
vendored
Normal file
3
packages/babel-generator/test/fixtures/misc/V8IntrinsicIdentifier/options.json
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"plugins": ["v8intrinsic"]
|
||||
}
|
||||
1
packages/babel-generator/test/fixtures/misc/V8IntrinsicIdentifier/output.js
vendored
Normal file
1
packages/babel-generator/test/fixtures/misc/V8IntrinsicIdentifier/output.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
%DebugPrint(foo);
|
||||
@ -2191,7 +2191,7 @@ export default class ExpressionParser extends LValParser {
|
||||
if (
|
||||
this.match(tt.semi) ||
|
||||
(!this.match(tt.star) && !this.state.type.startsExpr) ||
|
||||
this.canInsertSemicolon()
|
||||
this.hasPrecedingLineBreak()
|
||||
) {
|
||||
node.delegate = false;
|
||||
node.argument = null;
|
||||
|
||||
@ -69,6 +69,10 @@ export function validatePlugins(plugins: PluginList) {
|
||||
throw new Error("Cannot combine flow and typescript plugins.");
|
||||
}
|
||||
|
||||
if (hasPlugin(plugins, "placeholders") && hasPlugin(plugins, "v8intrinsic")) {
|
||||
throw new Error("Cannot combine placeholders and v8intrinsic plugins.");
|
||||
}
|
||||
|
||||
if (
|
||||
hasPlugin(plugins, "pipelineOperator") &&
|
||||
!PIPELINE_PROPOSALS.includes(
|
||||
@ -89,6 +93,7 @@ import flow from "./plugins/flow";
|
||||
import jsx from "./plugins/jsx";
|
||||
import typescript from "./plugins/typescript";
|
||||
import placeholders from "./plugins/placeholders";
|
||||
import v8intrinsic from "./plugins/v8intrinsic";
|
||||
|
||||
// NOTE: order is important. estree must come first; placeholders must come last.
|
||||
export const mixinPlugins: { [name: string]: MixinPlugin } = {
|
||||
@ -96,6 +101,7 @@ export const mixinPlugins: { [name: string]: MixinPlugin } = {
|
||||
jsx,
|
||||
flow,
|
||||
typescript,
|
||||
v8intrinsic,
|
||||
placeholders,
|
||||
};
|
||||
|
||||
|
||||
32
packages/babel-parser/src/plugins/v8intrinsic.js
Normal file
32
packages/babel-parser/src/plugins/v8intrinsic.js
Normal file
@ -0,0 +1,32 @@
|
||||
import type Parser from "../parser";
|
||||
import { types as tt } from "../tokenizer/types";
|
||||
import * as N from "../types";
|
||||
|
||||
export default (superClass: Class<Parser>): Class<Parser> =>
|
||||
class extends superClass {
|
||||
parseV8Intrinsic(): N.Expression {
|
||||
if (this.match(tt.modulo)) {
|
||||
const v8IntrinsicStart = this.state.start;
|
||||
// let the `loc` of Identifier starts from `%`
|
||||
const node = this.startNode();
|
||||
this.eat(tt.modulo);
|
||||
if (this.match(tt.name)) {
|
||||
const name = this.parseIdentifierName(this.state.start);
|
||||
const identifier = this.createIdentifier(node, name);
|
||||
identifier.type = "V8IntrinsicIdentifier";
|
||||
if (this.match(tt.parenL)) {
|
||||
return identifier;
|
||||
}
|
||||
}
|
||||
this.unexpected(v8IntrinsicStart);
|
||||
}
|
||||
}
|
||||
|
||||
/* ============================================================ *
|
||||
* parser/expression.js *
|
||||
* ============================================================ */
|
||||
|
||||
parseExprAtom(): N.Expression {
|
||||
return this.parseV8Intrinsic() || super.parseExprAtom(...arguments);
|
||||
}
|
||||
};
|
||||
@ -148,7 +148,8 @@ export const types: { [name: string]: TokenType } = {
|
||||
relational: createBinop("</>/<=/>=", 8),
|
||||
bitShift: createBinop("<</>>/>>>", 9),
|
||||
plusMin: new TokenType("+/-", { beforeExpr, binop: 10, prefix, startsExpr }),
|
||||
modulo: createBinop("%", 11),
|
||||
// startsExpr: required by v8intrinsic plugin
|
||||
modulo: new TokenType("%", { beforeExpr, binop: 11, startsExpr }),
|
||||
star: createBinop("*", 11),
|
||||
slash: createBinop("/", 11),
|
||||
exponent: new TokenType("**", {
|
||||
|
||||
1
packages/babel-parser/test/fixtures/v8intrinsic/_errors/in-bind-expression/input.js
vendored
Normal file
1
packages/babel-parser/test/fixtures/v8intrinsic/_errors/in-bind-expression/input.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
::%DebugPrint(null)
|
||||
6
packages/babel-parser/test/fixtures/v8intrinsic/_errors/in-bind-expression/options.json
vendored
Normal file
6
packages/babel-parser/test/fixtures/v8intrinsic/_errors/in-bind-expression/options.json
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"plugins": [
|
||||
"v8intrinsic"
|
||||
],
|
||||
"throws": "Unexpected token (1:0)"
|
||||
}
|
||||
1
packages/babel-parser/test/fixtures/v8intrinsic/_errors/in-member-expression/input.js
vendored
Normal file
1
packages/babel-parser/test/fixtures/v8intrinsic/_errors/in-member-expression/input.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
a.%DebugPrint();
|
||||
6
packages/babel-parser/test/fixtures/v8intrinsic/_errors/in-member-expression/options.json
vendored
Normal file
6
packages/babel-parser/test/fixtures/v8intrinsic/_errors/in-member-expression/options.json
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"plugins": [
|
||||
"v8intrinsic"
|
||||
],
|
||||
"throws": "Unexpected token (1:2)"
|
||||
}
|
||||
1
packages/babel-parser/test/fixtures/v8intrinsic/_errors/no-plugin/input.js
vendored
Normal file
1
packages/babel-parser/test/fixtures/v8intrinsic/_errors/no-plugin/input.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
%DebugPrint(foo)
|
||||
4
packages/babel-parser/test/fixtures/v8intrinsic/_errors/no-plugin/options.json
vendored
Normal file
4
packages/babel-parser/test/fixtures/v8intrinsic/_errors/no-plugin/options.json
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
{
|
||||
"plugins": [],
|
||||
"throws": "Unexpected token (1:0)"
|
||||
}
|
||||
2
packages/babel-parser/test/fixtures/v8intrinsic/_errors/not-in-call-expression/input.js
vendored
Normal file
2
packages/babel-parser/test/fixtures/v8intrinsic/_errors/not-in-call-expression/input.js
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
const i = %DebugPrint;
|
||||
i(foo);
|
||||
4
packages/babel-parser/test/fixtures/v8intrinsic/_errors/not-in-call-expression/options.json
vendored
Normal file
4
packages/babel-parser/test/fixtures/v8intrinsic/_errors/not-in-call-expression/options.json
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
{
|
||||
"plugins": ["v8intrinsic"],
|
||||
"throws": "Unexpected token (1:10)"
|
||||
}
|
||||
1
packages/babel-parser/test/fixtures/v8intrinsic/_errors/optional-call-expression/input.js
vendored
Normal file
1
packages/babel-parser/test/fixtures/v8intrinsic/_errors/optional-call-expression/input.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
%DebugPrint?.(null)
|
||||
@ -0,0 +1,7 @@
|
||||
{
|
||||
"plugins": [
|
||||
"optionalChaining",
|
||||
"v8intrinsic"
|
||||
],
|
||||
"throws": "Unexpected token (1:0)"
|
||||
}
|
||||
1
packages/babel-parser/test/fixtures/v8intrinsic/expression/await-expression/input.js
vendored
Normal file
1
packages/babel-parser/test/fixtures/v8intrinsic/expression/await-expression/input.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
async () => { await %StringParseInt("42", 10) }
|
||||
191
packages/babel-parser/test/fixtures/v8intrinsic/expression/await-expression/output.json
vendored
Normal file
191
packages/babel-parser/test/fixtures/v8intrinsic/expression/await-expression/output.json
vendored
Normal file
@ -0,0 +1,191 @@
|
||||
{
|
||||
"type": "File",
|
||||
"start": 0,
|
||||
"end": 47,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 0
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 47
|
||||
}
|
||||
},
|
||||
"program": {
|
||||
"type": "Program",
|
||||
"start": 0,
|
||||
"end": 47,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 0
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 47
|
||||
}
|
||||
},
|
||||
"sourceType": "script",
|
||||
"interpreter": null,
|
||||
"body": [
|
||||
{
|
||||
"type": "ExpressionStatement",
|
||||
"start": 0,
|
||||
"end": 47,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 0
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 47
|
||||
}
|
||||
},
|
||||
"expression": {
|
||||
"type": "ArrowFunctionExpression",
|
||||
"start": 0,
|
||||
"end": 47,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 0
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 47
|
||||
}
|
||||
},
|
||||
"id": null,
|
||||
"generator": false,
|
||||
"async": true,
|
||||
"params": [],
|
||||
"body": {
|
||||
"type": "BlockStatement",
|
||||
"start": 12,
|
||||
"end": 47,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 12
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 47
|
||||
}
|
||||
},
|
||||
"body": [
|
||||
{
|
||||
"type": "ExpressionStatement",
|
||||
"start": 14,
|
||||
"end": 45,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 14
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 45
|
||||
}
|
||||
},
|
||||
"expression": {
|
||||
"type": "AwaitExpression",
|
||||
"start": 14,
|
||||
"end": 45,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 14
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 45
|
||||
}
|
||||
},
|
||||
"argument": {
|
||||
"type": "CallExpression",
|
||||
"start": 20,
|
||||
"end": 45,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 20
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 45
|
||||
}
|
||||
},
|
||||
"callee": {
|
||||
"type": "V8IntrinsicIdentifier",
|
||||
"start": 20,
|
||||
"end": 35,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 20
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 35
|
||||
},
|
||||
"identifierName": "StringParseInt"
|
||||
},
|
||||
"name": "StringParseInt"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
"type": "StringLiteral",
|
||||
"start": 36,
|
||||
"end": 40,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 36
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 40
|
||||
}
|
||||
},
|
||||
"extra": {
|
||||
"rawValue": "42",
|
||||
"raw": "\"42\""
|
||||
},
|
||||
"value": "42"
|
||||
},
|
||||
{
|
||||
"type": "NumericLiteral",
|
||||
"start": 42,
|
||||
"end": 44,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 42
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 44
|
||||
}
|
||||
},
|
||||
"extra": {
|
||||
"rawValue": 10,
|
||||
"raw": "10"
|
||||
},
|
||||
"value": 10
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"directives": []
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"directives": []
|
||||
}
|
||||
}
|
||||
1
packages/babel-parser/test/fixtures/v8intrinsic/expression/call-expression/input.js
vendored
Normal file
1
packages/babel-parser/test/fixtures/v8intrinsic/expression/call-expression/input.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
%DebugPrint(foo)
|
||||
101
packages/babel-parser/test/fixtures/v8intrinsic/expression/call-expression/output.json
vendored
Normal file
101
packages/babel-parser/test/fixtures/v8intrinsic/expression/call-expression/output.json
vendored
Normal file
@ -0,0 +1,101 @@
|
||||
{
|
||||
"type": "File",
|
||||
"start": 0,
|
||||
"end": 16,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 0
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 16
|
||||
}
|
||||
},
|
||||
"program": {
|
||||
"type": "Program",
|
||||
"start": 0,
|
||||
"end": 16,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 0
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 16
|
||||
}
|
||||
},
|
||||
"sourceType": "script",
|
||||
"interpreter": null,
|
||||
"body": [
|
||||
{
|
||||
"type": "ExpressionStatement",
|
||||
"start": 0,
|
||||
"end": 16,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 0
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 16
|
||||
}
|
||||
},
|
||||
"expression": {
|
||||
"type": "CallExpression",
|
||||
"start": 0,
|
||||
"end": 16,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 0
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 16
|
||||
}
|
||||
},
|
||||
"callee": {
|
||||
"type": "V8IntrinsicIdentifier",
|
||||
"start": 0,
|
||||
"end": 11,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 0
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 11
|
||||
},
|
||||
"identifierName": "DebugPrint"
|
||||
},
|
||||
"name": "DebugPrint"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
"type": "Identifier",
|
||||
"start": 12,
|
||||
"end": 15,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 12
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 15
|
||||
},
|
||||
"identifierName": "foo"
|
||||
},
|
||||
"name": "foo"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"directives": []
|
||||
}
|
||||
}
|
||||
1
packages/babel-parser/test/fixtures/v8intrinsic/expression/in-new-expression/input.js
vendored
Normal file
1
packages/babel-parser/test/fixtures/v8intrinsic/expression/in-new-expression/input.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
new %DebugPrint(null);
|
||||
99
packages/babel-parser/test/fixtures/v8intrinsic/expression/in-new-expression/output.json
vendored
Normal file
99
packages/babel-parser/test/fixtures/v8intrinsic/expression/in-new-expression/output.json
vendored
Normal file
@ -0,0 +1,99 @@
|
||||
{
|
||||
"type": "File",
|
||||
"start": 0,
|
||||
"end": 22,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 0
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 22
|
||||
}
|
||||
},
|
||||
"program": {
|
||||
"type": "Program",
|
||||
"start": 0,
|
||||
"end": 22,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 0
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 22
|
||||
}
|
||||
},
|
||||
"sourceType": "script",
|
||||
"interpreter": null,
|
||||
"body": [
|
||||
{
|
||||
"type": "ExpressionStatement",
|
||||
"start": 0,
|
||||
"end": 22,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 0
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 22
|
||||
}
|
||||
},
|
||||
"expression": {
|
||||
"type": "NewExpression",
|
||||
"start": 0,
|
||||
"end": 21,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 0
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 21
|
||||
}
|
||||
},
|
||||
"callee": {
|
||||
"type": "V8IntrinsicIdentifier",
|
||||
"start": 4,
|
||||
"end": 15,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 4
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 15
|
||||
},
|
||||
"identifierName": "DebugPrint"
|
||||
},
|
||||
"name": "DebugPrint"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
"type": "NullLiteral",
|
||||
"start": 16,
|
||||
"end": 20,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 16
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 20
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"directives": []
|
||||
}
|
||||
}
|
||||
1
packages/babel-parser/test/fixtures/v8intrinsic/expression/multiple-arguments/input.js
vendored
Normal file
1
packages/babel-parser/test/fixtures/v8intrinsic/expression/multiple-arguments/input.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
%StringParseInt("42", 10);
|
||||
124
packages/babel-parser/test/fixtures/v8intrinsic/expression/multiple-arguments/output.json
vendored
Normal file
124
packages/babel-parser/test/fixtures/v8intrinsic/expression/multiple-arguments/output.json
vendored
Normal file
@ -0,0 +1,124 @@
|
||||
{
|
||||
"type": "File",
|
||||
"start": 0,
|
||||
"end": 26,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 0
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 26
|
||||
}
|
||||
},
|
||||
"program": {
|
||||
"type": "Program",
|
||||
"start": 0,
|
||||
"end": 26,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 0
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 26
|
||||
}
|
||||
},
|
||||
"sourceType": "script",
|
||||
"interpreter": null,
|
||||
"body": [
|
||||
{
|
||||
"type": "ExpressionStatement",
|
||||
"start": 0,
|
||||
"end": 26,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 0
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 26
|
||||
}
|
||||
},
|
||||
"expression": {
|
||||
"type": "CallExpression",
|
||||
"start": 0,
|
||||
"end": 25,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 0
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 25
|
||||
}
|
||||
},
|
||||
"callee": {
|
||||
"type": "V8IntrinsicIdentifier",
|
||||
"start": 0,
|
||||
"end": 15,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 0
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 15
|
||||
},
|
||||
"identifierName": "StringParseInt"
|
||||
},
|
||||
"name": "StringParseInt"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
"type": "StringLiteral",
|
||||
"start": 16,
|
||||
"end": 20,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 16
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 20
|
||||
}
|
||||
},
|
||||
"extra": {
|
||||
"rawValue": "42",
|
||||
"raw": "\"42\""
|
||||
},
|
||||
"value": "42"
|
||||
},
|
||||
{
|
||||
"type": "NumericLiteral",
|
||||
"start": 22,
|
||||
"end": 24,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 22
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 24
|
||||
}
|
||||
},
|
||||
"extra": {
|
||||
"rawValue": 10,
|
||||
"raw": "10"
|
||||
},
|
||||
"value": 10
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"directives": []
|
||||
}
|
||||
}
|
||||
3
packages/babel-parser/test/fixtures/v8intrinsic/expression/yield-expression/input.js
vendored
Normal file
3
packages/babel-parser/test/fixtures/v8intrinsic/expression/yield-expression/input.js
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
function *foo() {
|
||||
yield %StringParseInt("42", 10)
|
||||
}
|
||||
193
packages/babel-parser/test/fixtures/v8intrinsic/expression/yield-expression/output.json
vendored
Normal file
193
packages/babel-parser/test/fixtures/v8intrinsic/expression/yield-expression/output.json
vendored
Normal file
@ -0,0 +1,193 @@
|
||||
{
|
||||
"type": "File",
|
||||
"start": 0,
|
||||
"end": 53,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 0
|
||||
},
|
||||
"end": {
|
||||
"line": 3,
|
||||
"column": 1
|
||||
}
|
||||
},
|
||||
"program": {
|
||||
"type": "Program",
|
||||
"start": 0,
|
||||
"end": 53,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 0
|
||||
},
|
||||
"end": {
|
||||
"line": 3,
|
||||
"column": 1
|
||||
}
|
||||
},
|
||||
"sourceType": "script",
|
||||
"interpreter": null,
|
||||
"body": [
|
||||
{
|
||||
"type": "FunctionDeclaration",
|
||||
"start": 0,
|
||||
"end": 53,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 0
|
||||
},
|
||||
"end": {
|
||||
"line": 3,
|
||||
"column": 1
|
||||
}
|
||||
},
|
||||
"id": {
|
||||
"type": "Identifier",
|
||||
"start": 10,
|
||||
"end": 13,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 10
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 13
|
||||
},
|
||||
"identifierName": "foo"
|
||||
},
|
||||
"name": "foo"
|
||||
},
|
||||
"generator": true,
|
||||
"async": false,
|
||||
"params": [],
|
||||
"body": {
|
||||
"type": "BlockStatement",
|
||||
"start": 16,
|
||||
"end": 53,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 16
|
||||
},
|
||||
"end": {
|
||||
"line": 3,
|
||||
"column": 1
|
||||
}
|
||||
},
|
||||
"body": [
|
||||
{
|
||||
"type": "ExpressionStatement",
|
||||
"start": 20,
|
||||
"end": 51,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 2,
|
||||
"column": 2
|
||||
},
|
||||
"end": {
|
||||
"line": 2,
|
||||
"column": 33
|
||||
}
|
||||
},
|
||||
"expression": {
|
||||
"type": "YieldExpression",
|
||||
"start": 20,
|
||||
"end": 51,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 2,
|
||||
"column": 2
|
||||
},
|
||||
"end": {
|
||||
"line": 2,
|
||||
"column": 33
|
||||
}
|
||||
},
|
||||
"delegate": false,
|
||||
"argument": {
|
||||
"type": "CallExpression",
|
||||
"start": 26,
|
||||
"end": 51,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 2,
|
||||
"column": 8
|
||||
},
|
||||
"end": {
|
||||
"line": 2,
|
||||
"column": 33
|
||||
}
|
||||
},
|
||||
"callee": {
|
||||
"type": "V8IntrinsicIdentifier",
|
||||
"start": 26,
|
||||
"end": 41,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 2,
|
||||
"column": 8
|
||||
},
|
||||
"end": {
|
||||
"line": 2,
|
||||
"column": 23
|
||||
},
|
||||
"identifierName": "StringParseInt"
|
||||
},
|
||||
"name": "StringParseInt"
|
||||
},
|
||||
"arguments": [
|
||||
{
|
||||
"type": "StringLiteral",
|
||||
"start": 42,
|
||||
"end": 46,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 2,
|
||||
"column": 24
|
||||
},
|
||||
"end": {
|
||||
"line": 2,
|
||||
"column": 28
|
||||
}
|
||||
},
|
||||
"extra": {
|
||||
"rawValue": "42",
|
||||
"raw": "\"42\""
|
||||
},
|
||||
"value": "42"
|
||||
},
|
||||
{
|
||||
"type": "NumericLiteral",
|
||||
"start": 48,
|
||||
"end": 50,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 2,
|
||||
"column": 30
|
||||
},
|
||||
"end": {
|
||||
"line": 2,
|
||||
"column": 32
|
||||
}
|
||||
},
|
||||
"extra": {
|
||||
"rawValue": 10,
|
||||
"raw": "10"
|
||||
},
|
||||
"value": 10
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"directives": []
|
||||
}
|
||||
}
|
||||
],
|
||||
"directives": []
|
||||
}
|
||||
}
|
||||
1
packages/babel-parser/test/fixtures/v8intrinsic/modulo/01/input.js
vendored
Normal file
1
packages/babel-parser/test/fixtures/v8intrinsic/modulo/01/input.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
foo%bar()
|
||||
116
packages/babel-parser/test/fixtures/v8intrinsic/modulo/01/output.json
vendored
Normal file
116
packages/babel-parser/test/fixtures/v8intrinsic/modulo/01/output.json
vendored
Normal file
@ -0,0 +1,116 @@
|
||||
{
|
||||
"type": "File",
|
||||
"start": 0,
|
||||
"end": 9,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 0
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 9
|
||||
}
|
||||
},
|
||||
"program": {
|
||||
"type": "Program",
|
||||
"start": 0,
|
||||
"end": 9,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 0
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 9
|
||||
}
|
||||
},
|
||||
"sourceType": "script",
|
||||
"interpreter": null,
|
||||
"body": [
|
||||
{
|
||||
"type": "ExpressionStatement",
|
||||
"start": 0,
|
||||
"end": 9,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 0
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 9
|
||||
}
|
||||
},
|
||||
"expression": {
|
||||
"type": "BinaryExpression",
|
||||
"start": 0,
|
||||
"end": 9,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 0
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 9
|
||||
}
|
||||
},
|
||||
"left": {
|
||||
"type": "Identifier",
|
||||
"start": 0,
|
||||
"end": 3,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 0
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 3
|
||||
},
|
||||
"identifierName": "foo"
|
||||
},
|
||||
"name": "foo"
|
||||
},
|
||||
"operator": "%",
|
||||
"right": {
|
||||
"type": "CallExpression",
|
||||
"start": 4,
|
||||
"end": 9,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 4
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 9
|
||||
}
|
||||
},
|
||||
"callee": {
|
||||
"type": "Identifier",
|
||||
"start": 4,
|
||||
"end": 7,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 4
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 7
|
||||
},
|
||||
"identifierName": "bar"
|
||||
},
|
||||
"name": "bar"
|
||||
},
|
||||
"arguments": []
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"directives": []
|
||||
}
|
||||
}
|
||||
3
packages/babel-parser/test/fixtures/v8intrinsic/options.json
vendored
Normal file
3
packages/babel-parser/test/fixtures/v8intrinsic/options.json
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"plugins": ["v8intrinsic"]
|
||||
}
|
||||
@ -124,6 +124,7 @@ export type ParserPlugin =
|
||||
'placeholders' |
|
||||
'throwExpressions' |
|
||||
'typescript' |
|
||||
'v8intrinsic' |
|
||||
ParserPluginWithOptions;
|
||||
|
||||
export type ParserPluginWithOptions =
|
||||
|
||||
@ -5,5 +5,6 @@ const toLowerCase = Function.call.bind("".toLowerCase);
|
||||
module.exports = function formatBuilderName(type) {
|
||||
// FunctionExpression -> functionExpression
|
||||
// JSXIdentifier -> jsxIdentifier
|
||||
return type.replace(/^([A-Z](?=[a-z])|[A-Z]+(?=[A-Z]))/, toLowerCase);
|
||||
// V8IntrinsicIdentifier -> v8IntrinsicIdentifier
|
||||
return type.replace(/^([A-Z](?=[a-z0-9])|[A-Z]+(?=[A-Z]))/, toLowerCase);
|
||||
};
|
||||
|
||||
@ -662,6 +662,12 @@ export function assertNoop(node: Object, opts?: Object = {}): void {
|
||||
export function assertPlaceholder(node: Object, opts?: Object = {}): void {
|
||||
assert("Placeholder", node, opts);
|
||||
}
|
||||
export function assertV8IntrinsicIdentifier(
|
||||
node: Object,
|
||||
opts?: Object = {},
|
||||
): void {
|
||||
assert("V8IntrinsicIdentifier", node, opts);
|
||||
}
|
||||
export function assertArgumentPlaceholder(
|
||||
node: Object,
|
||||
opts?: Object = {},
|
||||
|
||||
@ -600,6 +600,10 @@ export function Placeholder(...args: Array<any>): Object {
|
||||
return builder("Placeholder", ...args);
|
||||
}
|
||||
export { Placeholder as placeholder };
|
||||
export function V8IntrinsicIdentifier(...args: Array<any>): Object {
|
||||
return builder("V8IntrinsicIdentifier", ...args);
|
||||
}
|
||||
export { V8IntrinsicIdentifier as v8IntrinsicIdentifier };
|
||||
export function ArgumentPlaceholder(...args: Array<any>): Object {
|
||||
return builder("ArgumentPlaceholder", ...args);
|
||||
}
|
||||
|
||||
@ -132,7 +132,7 @@ defineType("CallExpression", {
|
||||
aliases: ["Expression"],
|
||||
fields: {
|
||||
callee: {
|
||||
validate: assertNodeType("Expression"),
|
||||
validate: assertNodeType("Expression", "V8IntrinsicIdentifier"),
|
||||
},
|
||||
arguments: {
|
||||
validate: chain(
|
||||
|
||||
@ -1,5 +1,9 @@
|
||||
// @flow
|
||||
import defineType, { assertNodeType, assertOneOf } from "./utils";
|
||||
import defineType, {
|
||||
assertNodeType,
|
||||
assertOneOf,
|
||||
assertValueType,
|
||||
} from "./utils";
|
||||
import { PLACEHOLDERS } from "./placeholders";
|
||||
|
||||
defineType("Noop", {
|
||||
@ -19,3 +23,12 @@ defineType("Placeholder", {
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
defineType("V8IntrinsicIdentifier", {
|
||||
builder: ["name"],
|
||||
fields: {
|
||||
name: {
|
||||
validate: assertValueType("string"),
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
@ -2107,6 +2107,20 @@ export function isPlaceholder(node: ?Object, opts?: Object): boolean {
|
||||
|
||||
return false;
|
||||
}
|
||||
export function isV8IntrinsicIdentifier(node: ?Object, opts?: Object): boolean {
|
||||
if (!node) return false;
|
||||
|
||||
const nodeType = node.type;
|
||||
if (nodeType === "V8IntrinsicIdentifier") {
|
||||
if (typeof opts === "undefined") {
|
||||
return true;
|
||||
} else {
|
||||
return shallowEqual(node, opts);
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
export function isArgumentPlaceholder(node: ?Object, opts?: Object): boolean {
|
||||
if (!node) return false;
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user