diff --git a/packages/babel-core/test/fixtures/parse/output-legacy.json b/packages/babel-core/test/fixtures/parse/output-legacy.json new file mode 100644 index 000000000000..5c48f0e09836 --- /dev/null +++ b/packages/babel-core/test/fixtures/parse/output-legacy.json @@ -0,0 +1,288 @@ +{ + "type": "File", + "start": 0, + "end": 91, + "errors": [], + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 7, + "column": 0 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 91, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 7, + "column": 0 + } + }, + "interpreter": null, + "sourceType": "module", + "body": [ + { + "type": "ClassDeclaration", + "start": 0, + "end": 29, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 2, + "column": 17 + } + }, + "decorators": [ + { + "type": "Decorator", + "start": 0, + "end": 11, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 11 + } + }, + "expression": { + "type": "Identifier", + "start": 1, + "end": 11, + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 11 + }, + "identifierName": "annotation" + }, + "name": "annotation" + } + } + ], + "id": { + "type": "Identifier", + "start": 18, + "end": 25, + "loc": { + "start": { + "line": 2, + "column": 6 + }, + "end": { + "line": 2, + "column": 13 + }, + "identifierName": "MyClass" + }, + "name": "MyClass" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start": 26, + "end": 29, + "loc": { + "start": { + "line": 2, + "column": 14 + }, + "end": { + "line": 2, + "column": 17 + } + }, + "body": [] + } + }, + { + "type": "FunctionDeclaration", + "start": 31, + "end": 90, + "loc": { + "start": { + "line": 4, + "column": 0 + }, + "end": { + "line": 6, + "column": 1 + } + }, + "id": { + "type": "Identifier", + "start": 40, + "end": 50, + "loc": { + "start": { + "line": 4, + "column": 9 + }, + "end": { + "line": 4, + "column": 19 + }, + "identifierName": "annotation" + }, + "name": "annotation" + }, + "generator": false, + "async": false, + "params": [ + { + "type": "Identifier", + "start": 51, + "end": 57, + "loc": { + "start": { + "line": 4, + "column": 20 + }, + "end": { + "line": 4, + "column": 26 + }, + "identifierName": "target" + }, + "name": "target" + } + ], + "body": { + "type": "BlockStatement", + "start": 59, + "end": 90, + "loc": { + "start": { + "line": 4, + "column": 28 + }, + "end": { + "line": 6, + "column": 1 + } + }, + "body": [ + { + "type": "ExpressionStatement", + "start": 64, + "end": 88, + "loc": { + "start": { + "line": 5, + "column": 3 + }, + "end": { + "line": 5, + "column": 27 + } + }, + "expression": { + "type": "AssignmentExpression", + "start": 64, + "end": 87, + "loc": { + "start": { + "line": 5, + "column": 3 + }, + "end": { + "line": 5, + "column": 26 + } + }, + "operator": "=", + "left": { + "type": "MemberExpression", + "start": 64, + "end": 80, + "loc": { + "start": { + "line": 5, + "column": 3 + }, + "end": { + "line": 5, + "column": 19 + } + }, + "object": { + "type": "Identifier", + "start": 64, + "end": 70, + "loc": { + "start": { + "line": 5, + "column": 3 + }, + "end": { + "line": 5, + "column": 9 + }, + "identifierName": "target" + }, + "name": "target" + }, + "property": { + "type": "Identifier", + "start": 71, + "end": 80, + "loc": { + "start": { + "line": 5, + "column": 10 + }, + "end": { + "line": 5, + "column": 19 + }, + "identifierName": "annotated" + }, + "name": "annotated" + }, + "computed": false + }, + "right": { + "type": "BooleanLiteral", + "start": 83, + "end": 87, + "loc": { + "start": { + "line": 5, + "column": 22 + }, + "end": { + "line": 5, + "column": 26 + } + }, + "value": true + } + } + } + ], + "directives": [] + } + } + ], + "directives": [] + }, + "comments": [] +} diff --git a/packages/babel-core/test/fixtures/parse/output.json b/packages/babel-core/test/fixtures/parse/output.json index 5c48f0e09836..686bd85320f2 100644 --- a/packages/babel-core/test/fixtures/parse/output.json +++ b/packages/babel-core/test/fixtures/parse/output.json @@ -49,6 +49,7 @@ "type": "Decorator", "start": 0, "end": 11, + "init": false, "loc": { "start": { "line": 1, diff --git a/packages/babel-core/test/parse.js b/packages/babel-core/test/parse.js index 244b380a339e..eb6b36016499 100644 --- a/packages/babel-core/test/parse.js +++ b/packages/babel-core/test/parse.js @@ -18,7 +18,7 @@ function fixture(...args) { describe("parse", function () { it("should parse using configuration from .babelrc when a filename is provided", function () { const input = fs.readFileSync(fixture("input.js"), "utf8"); - const output = require(fixture("output")); + const output = require(fixture("output-legacy.json")); const result = parse(input, { filename: fixture("input.js"), diff --git a/packages/babel-parser/ast/spec.md b/packages/babel-parser/ast/spec.md index aabdc572c4d9..d9781ead1393 100644 --- a/packages/babel-parser/ast/spec.md +++ b/packages/babel-parser/ast/spec.md @@ -598,6 +598,7 @@ A variable declarator. interface Decorator <: Node { type: "Decorator"; expression: Expression; + init: boolean; } ``` diff --git a/packages/babel-parser/src/parser/error-message.js b/packages/babel-parser/src/parser/error-message.js index 9bcc55e28b07..b3beef9405f2 100644 --- a/packages/babel-parser/src/parser/error-message.js +++ b/packages/babel-parser/src/parser/error-message.js @@ -223,6 +223,8 @@ export const ErrorMessages = makeErrorTemplates( UnsupportedBind: "Binding should be performed on object property.", UnsupportedDecoratorExport: "A decorated export must export a class declaration.", + UnsupportedDecoratorModifier: + "Unsupported decorator modifier. `@init:` is the only modifier currently supported for decorators.", UnsupportedDefaultExport: "Only expressions, functions or classes are allowed as the `default` export.", UnsupportedImport: diff --git a/packages/babel-parser/src/parser/expression.js b/packages/babel-parser/src/parser/expression.js index e4f098484436..251b023d9de1 100644 --- a/packages/babel-parser/src/parser/expression.js +++ b/packages/babel-parser/src/parser/expression.js @@ -32,6 +32,7 @@ import { tokenOperatorPrecedence, tt, type TokenType, + tokenIsDecorator, } from "../tokenizer/types"; import * as N from "../types"; import LValParser from "./lval"; @@ -1143,6 +1144,7 @@ export default class ExpressionParser extends LValParser { return this.parseFunctionOrFunctionSent(); case tt.at: + case tt.atInit: this.parseDecorators(); // fall through case tt._class: @@ -1956,7 +1958,7 @@ export default class ExpressionParser extends LValParser { refExpressionErrors?: ?ExpressionErrors, ): N.ObjectMember | N.SpreadElement { let decorators = []; - if (this.match(tt.at)) { + if (tokenIsDecorator(this.state.type)) { if (this.hasPlugin("decorators")) { this.raise(this.state.start, Errors.UnsupportedPropertyDecorator); } diff --git a/packages/babel-parser/src/parser/lval.js b/packages/babel-parser/src/parser/lval.js index 7cbb35e4c516..44bcd0b44305 100644 --- a/packages/babel-parser/src/parser/lval.js +++ b/packages/babel-parser/src/parser/lval.js @@ -2,7 +2,7 @@ /*:: declare var invariant; */ import * as charCodes from "charcodes"; -import { tt, type TokenType } from "../tokenizer/types"; +import { tt, tokenIsDecorator, type TokenType } from "../tokenizer/types"; import type { TSParameterProperty, Decorator, @@ -390,7 +390,7 @@ export default class LValParser extends NodeUtils { break; } else { const decorators = []; - if (this.match(tt.at) && this.hasPlugin("decorators")) { + if (tokenIsDecorator(this.state.type) && this.hasPlugin("decorators")) { this.raise(this.state.start, Errors.UnsupportedParameterDecorator); } // invariant: hasPlugin("decorators-legacy") diff --git a/packages/babel-parser/src/parser/statement.js b/packages/babel-parser/src/parser/statement.js index c4f4546ba254..44edfd89b411 100644 --- a/packages/babel-parser/src/parser/statement.js +++ b/packages/babel-parser/src/parser/statement.js @@ -7,6 +7,7 @@ import { tt, type TokenType, getExportedToken, + tokenIsDecorator, } from "../tokenizer/types"; import ExpressionParser from "./expression"; import { Errors, SourceTypeModuleErrors } from "./error"; @@ -241,7 +242,7 @@ export default class StatementParser extends ExpressionParser { // ImportDeclaration and ExportDeclaration are also handled here so we can throw recoverable errors // when they are not at the top level parseStatement(context: ?string, topLevel?: boolean): N.Statement { - if (this.match(tt.at)) { + if (tokenIsDecorator(this.state.type)) { this.parseDecorators(true); } return this.parseStatementContent(context, topLevel); @@ -416,7 +417,7 @@ export default class StatementParser extends ExpressionParser { parseDecorators(allowExport?: boolean): void { const currentContextDecorators = this.state.decoratorStack[this.state.decoratorStack.length - 1]; - while (this.match(tt.at)) { + while (tokenIsDecorator(this.state.type)) { const decorator = this.parseDecorator(); currentContextDecorators.push(decorator); } @@ -441,8 +442,10 @@ export default class StatementParser extends ExpressionParser { this.expectOnePlugin(["decorators-legacy", "decorators"]); const node = this.startNode(); + const isAtInit = this.match(tt.atInit); this.next(); + // Spec: https://arai-a.github.io/ecma262-compare/?pr=2417&id=sec-decorators if (this.hasPlugin("decorators")) { // Every time a decorator class expression is evaluated, a new empty array is pushed onto the stack // So that the decorators of any nested class expressions will be dealt with separately @@ -463,10 +466,12 @@ export default class StatementParser extends ExpressionParser { node.object = expr; node.property = this.parseIdentifier(true); node.computed = false; + expr = this.finishNode(node, "MemberExpression"); } } + node.init = isAtInit; node.expression = this.parseMaybeDecoratorArguments(expr); this.state.decoratorStack.pop(); } else { @@ -1327,7 +1332,7 @@ export default class StatementParser extends ExpressionParser { continue; } - if (this.match(tt.at)) { + if (tokenIsDecorator(this.state.type)) { decorators.push(this.parseDecorator()); continue; } @@ -1993,7 +1998,7 @@ export default class StatementParser extends ExpressionParser { ); } else if (this.match(tt._class)) { return this.parseClass(expr, true, true); - } else if (this.match(tt.at)) { + } else if (tokenIsDecorator(this.state.type)) { if ( this.hasPlugin("decorators") && this.getPluginOption("decorators", "decoratorsBeforeExport") @@ -2081,7 +2086,7 @@ export default class StatementParser extends ExpressionParser { shouldParseExportDeclaration(): boolean { const { type } = this.state; - if (type === tt.at) { + if (tokenIsDecorator(type)) { this.expectOnePlugin(["decorators", "decorators-legacy"]); if (this.hasPlugin("decorators")) { if (this.getPluginOption("decorators", "decoratorsBeforeExport")) { diff --git a/packages/babel-parser/src/tokenizer/index.js b/packages/babel-parser/src/tokenizer/index.js index 528cb051978b..c43abfb515ab 100644 --- a/packages/babel-parser/src/tokenizer/index.js +++ b/packages/babel-parser/src/tokenizer/index.js @@ -829,6 +829,50 @@ export default class Tokenizer extends ParserErrors { } } + readToken_at(): void { + // Increase past @ + ++this.state.pos; + const next = this.input.charCodeAt(this.state.pos); + + if (isIdentifierStart(next)) { + // Read the next word with a lookahead state that we'll + // throw away afterwards. Cheaper than doing a full lookahead, + // since we know that we're trying to read a word/identifier. + const old = this.state; + // $FlowIgnore + this.state = this.createLookaheadState(old); + + const word = this.readWord1(next); + const workEndPos = this.state.pos; + const wordNext = this.input.charCodeAt(workEndPos); + const containsEsc = this.state.containsEsc; + + // Replace the previous state + this.state = old; + + if ( + wordNext === charCodes.colon && + // @a::b is a valid decorator when using decorators-legacy and functionBind + this.input.charCodeAt(workEndPos + 1) !== charCodes.colon + ) { + this.expectPlugin("decorators"); + + if (word !== "init") { + this.raise(this.state.pos, Errors.UnsupportedDecoratorModifier); + } else if (containsEsc) { + this.raise(this.state.pos, Errors.InvalidEscapedReservedWord); + } + + // Increase the pos by word.length + `:` + this.state.pos += word.length + 1; + this.finishToken(tt.atInit); + return; + } + } + + this.finishToken(tt.at); + } + getTokenFromCode(code: number): void { switch (code) { // The interpretation of a dot depends on whether it is followed @@ -1009,8 +1053,7 @@ export default class Tokenizer extends ParserErrors { return; case charCodes.atSign: - ++this.state.pos; - this.finishToken(tt.at); + this.readToken_at(); return; case charCodes.numberSign: diff --git a/packages/babel-parser/src/tokenizer/types.js b/packages/babel-parser/src/tokenizer/types.js index 51539b05e077..82d76f0acc51 100644 --- a/packages/babel-parser/src/tokenizer/types.js +++ b/packages/babel-parser/src/tokenizer/types.js @@ -159,6 +159,7 @@ export const tt: { [name: string]: TokenType } = { backQuote: createToken("`", { startsExpr }), dollarBraceL: createToken("${", { beforeExpr, startsExpr }), at: createToken("@"), + atInit: createToken("@init:"), hash: createToken("#", { startsExpr }), // Special hashbang token. @@ -402,6 +403,10 @@ export function tokenIsRightAssociative(token: TokenType): boolean { return token === tt.exponent; } +export function tokenIsDecorator(token: TokenType): boolean { + return token === tt.at || token === tt.atInit; +} + export function getExportedToken(token: TokenType): ExportedTokenType { return tokenTypes[token]; } diff --git a/packages/babel-parser/src/types.js b/packages/babel-parser/src/types.js index a45516782e3b..4008ac2c6221 100644 --- a/packages/babel-parser/src/types.js +++ b/packages/babel-parser/src/types.js @@ -381,6 +381,7 @@ export type ArgumentPlaceholder = NodeBase & { type: "ArgumentPlaceholder" }; export type Decorator = NodeBase & { type: "Decorator", expression: Expression, + init: boolean, arguments?: Array, }; diff --git a/packages/babel-parser/test/fixtures/es2022/class-properties/arguments-in-nested-class-decorator-call-expression/output.json b/packages/babel-parser/test/fixtures/es2022/class-properties/arguments-in-nested-class-decorator-call-expression/output.json index 9cf33d0715eb..a8b5354fa3cb 100644 --- a/packages/babel-parser/test/fixtures/es2022/class-properties/arguments-in-nested-class-decorator-call-expression/output.json +++ b/packages/babel-parser/test/fixtures/es2022/class-properties/arguments-in-nested-class-decorator-call-expression/output.json @@ -68,6 +68,7 @@ { "type": "Decorator", "start":48,"end":63,"loc":{"start":{"line":3,"column":20},"end":{"line":3,"column":35}}, + "init": false, "expression": { "type": "CallExpression", "start":49,"end":63,"loc":{"start":{"line":3,"column":21},"end":{"line":3,"column":35}}, diff --git a/packages/babel-parser/test/fixtures/experimental/_no-plugin/deorators-modifier-with-legacy/input.js b/packages/babel-parser/test/fixtures/experimental/_no-plugin/deorators-modifier-with-legacy/input.js new file mode 100644 index 000000000000..fbe2ab7aa107 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/_no-plugin/deorators-modifier-with-legacy/input.js @@ -0,0 +1,4 @@ +class A { + @init:deco + method() {} +} diff --git a/packages/babel-parser/test/fixtures/experimental/_no-plugin/deorators-modifier-with-legacy/options.json b/packages/babel-parser/test/fixtures/experimental/_no-plugin/deorators-modifier-with-legacy/options.json new file mode 100644 index 000000000000..30c09b6f506f --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/_no-plugin/deorators-modifier-with-legacy/options.json @@ -0,0 +1,4 @@ +{ + "plugins": ["decorators-legacy"], + "throws": "This experimental syntax requires enabling the parser plugin: \"decorators\". (2:2)" +} diff --git a/packages/babel-parser/test/fixtures/experimental/class-static-block/invalid-decorators/output.json b/packages/babel-parser/test/fixtures/experimental/class-static-block/invalid-decorators/output.json index d9414a2148b2..a3f8befbb315 100644 --- a/packages/babel-parser/test/fixtures/experimental/class-static-block/invalid-decorators/output.json +++ b/packages/babel-parser/test/fixtures/experimental/class-static-block/invalid-decorators/output.json @@ -52,6 +52,7 @@ { "type": "Decorator", "start":30,"end":34,"loc":{"start":{"line":3,"column":2},"end":{"line":3,"column":6}}, + "init": false, "expression": { "type": "Identifier", "start":31,"end":34,"loc":{"start":{"line":3,"column":3},"end":{"line":3,"column":6},"identifierName":"dec"}, diff --git a/packages/babel-parser/test/fixtures/experimental/decorators-2/class-decorator-call-expr/output.json b/packages/babel-parser/test/fixtures/experimental/decorators-2/class-decorator-call-expr/output.json index d1e510436a43..9817caf7c2e9 100644 --- a/packages/babel-parser/test/fixtures/experimental/decorators-2/class-decorator-call-expr/output.json +++ b/packages/babel-parser/test/fixtures/experimental/decorators-2/class-decorator-call-expr/output.json @@ -14,6 +14,7 @@ { "type": "Decorator", "start":0,"end":11,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":11}}, + "init": false, "expression": { "type": "CallExpression", "start":1,"end":11,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":11}}, diff --git a/packages/babel-parser/test/fixtures/experimental/decorators-2/class-decorator/output.json b/packages/babel-parser/test/fixtures/experimental/decorators-2/class-decorator/output.json index 1977b5cbd495..a3dbce06063b 100644 --- a/packages/babel-parser/test/fixtures/experimental/decorators-2/class-decorator/output.json +++ b/packages/babel-parser/test/fixtures/experimental/decorators-2/class-decorator/output.json @@ -14,6 +14,7 @@ { "type": "Decorator", "start":0,"end":4,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":4}}, + "init": false, "expression": { "type": "Identifier", "start":1,"end":4,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":4},"identifierName":"abc"}, diff --git a/packages/babel-parser/test/fixtures/experimental/decorators-2/class-expression/output.json b/packages/babel-parser/test/fixtures/experimental/decorators-2/class-expression/output.json index 66302d642b12..3b004033d64c 100644 --- a/packages/babel-parser/test/fixtures/experimental/decorators-2/class-expression/output.json +++ b/packages/babel-parser/test/fixtures/experimental/decorators-2/class-expression/output.json @@ -26,6 +26,7 @@ { "type": "Decorator", "start":10,"end":14,"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":14}}, + "init": false, "expression": { "type": "Identifier", "start":11,"end":14,"loc":{"start":{"line":1,"column":11},"end":{"line":1,"column":14},"identifierName":"dec"}, @@ -50,6 +51,7 @@ { "type": "Decorator", "start":29,"end":33,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":6}}, + "init": false, "expression": { "type": "Identifier", "start":30,"end":33,"loc":{"start":{"line":2,"column":3},"end":{"line":2,"column":6},"identifierName":"baz"}, diff --git a/packages/babel-parser/test/fixtures/experimental/decorators-2/class-generator/output.json b/packages/babel-parser/test/fixtures/experimental/decorators-2/class-generator/output.json index 4da6a4271827..e04b767908f7 100644 --- a/packages/babel-parser/test/fixtures/experimental/decorators-2/class-generator/output.json +++ b/packages/babel-parser/test/fixtures/experimental/decorators-2/class-generator/output.json @@ -27,6 +27,7 @@ { "type": "Decorator", "start":12,"end":16,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":6}}, + "init": false, "expression": { "type": "Identifier", "start":13,"end":16,"loc":{"start":{"line":2,"column":3},"end":{"line":2,"column":6},"identifierName":"dec"}, diff --git a/packages/babel-parser/test/fixtures/experimental/decorators-2/class-property/output.json b/packages/babel-parser/test/fixtures/experimental/decorators-2/class-property/output.json index d3973e7ce798..0777f4e7ce57 100644 --- a/packages/babel-parser/test/fixtures/experimental/decorators-2/class-property/output.json +++ b/packages/babel-parser/test/fixtures/experimental/decorators-2/class-property/output.json @@ -27,6 +27,7 @@ { "type": "Decorator", "start":12,"end":16,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":6}}, + "init": false, "expression": { "type": "Identifier", "start":13,"end":16,"loc":{"start":{"line":2,"column":3},"end":{"line":2,"column":6},"identifierName":"dec"}, diff --git a/packages/babel-parser/test/fixtures/experimental/decorators-2/complex-expr/output.json b/packages/babel-parser/test/fixtures/experimental/decorators-2/complex-expr/output.json index c69d5147cef1..353cf7f8f51c 100644 --- a/packages/babel-parser/test/fixtures/experimental/decorators-2/complex-expr/output.json +++ b/packages/babel-parser/test/fixtures/experimental/decorators-2/complex-expr/output.json @@ -27,6 +27,7 @@ { "type": "Decorator", "start":12,"end":26,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":16}}, + "init": false, "expression": { "type": "CallExpression", "start":13,"end":26,"loc":{"start":{"line":2,"column":3},"end":{"line":2,"column":16}}, diff --git a/packages/babel-parser/test/fixtures/experimental/decorators-2/compued-property/output.json b/packages/babel-parser/test/fixtures/experimental/decorators-2/compued-property/output.json index 19e3e441beb7..d50c02a300c1 100644 --- a/packages/babel-parser/test/fixtures/experimental/decorators-2/compued-property/output.json +++ b/packages/babel-parser/test/fixtures/experimental/decorators-2/compued-property/output.json @@ -27,6 +27,7 @@ { "type": "Decorator", "start":14,"end":18,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":6}}, + "init": false, "expression": { "type": "Identifier", "start":15,"end":18,"loc":{"start":{"line":2,"column":3},"end":{"line":2,"column":6},"identifierName":"bar"}, diff --git a/packages/babel-parser/test/fixtures/experimental/decorators-2/decoratorsBeforeExport-export-default-decorated-expression-with-parens/output.json b/packages/babel-parser/test/fixtures/experimental/decorators-2/decoratorsBeforeExport-export-default-decorated-expression-with-parens/output.json index 65327624c062..89d3a86589ce 100644 --- a/packages/babel-parser/test/fixtures/experimental/decorators-2/decoratorsBeforeExport-export-default-decorated-expression-with-parens/output.json +++ b/packages/babel-parser/test/fixtures/experimental/decorators-2/decoratorsBeforeExport-export-default-decorated-expression-with-parens/output.json @@ -17,6 +17,7 @@ { "type": "Decorator", "start":16,"end":26,"loc":{"start":{"line":1,"column":16},"end":{"line":1,"column":26}}, + "init": false, "expression": { "type": "Identifier", "start":17,"end":26,"loc":{"start":{"line":1,"column":17},"end":{"line":1,"column":26},"identifierName":"decorator"}, diff --git a/packages/babel-parser/test/fixtures/experimental/decorators-2/decoratorsBeforeExport-export-default-decorated-expression-without-parens/output.json b/packages/babel-parser/test/fixtures/experimental/decorators-2/decoratorsBeforeExport-export-default-decorated-expression-without-parens/output.json index ac182855aaa8..3fed8ad8940a 100644 --- a/packages/babel-parser/test/fixtures/experimental/decorators-2/decoratorsBeforeExport-export-default-decorated-expression-without-parens/output.json +++ b/packages/babel-parser/test/fixtures/experimental/decorators-2/decoratorsBeforeExport-export-default-decorated-expression-without-parens/output.json @@ -20,6 +20,7 @@ { "type": "Decorator", "start":15,"end":25,"loc":{"start":{"line":1,"column":15},"end":{"line":1,"column":25}}, + "init": false, "expression": { "type": "Identifier", "start":16,"end":25,"loc":{"start":{"line":1,"column":16},"end":{"line":1,"column":25},"identifierName":"decorator"}, diff --git a/packages/babel-parser/test/fixtures/experimental/decorators-2/decoratorsBeforeExport-export-default/output.json b/packages/babel-parser/test/fixtures/experimental/decorators-2/decoratorsBeforeExport-export-default/output.json index 3213ec7e4c23..3312cf11d768 100644 --- a/packages/babel-parser/test/fixtures/experimental/decorators-2/decoratorsBeforeExport-export-default/output.json +++ b/packages/babel-parser/test/fixtures/experimental/decorators-2/decoratorsBeforeExport-export-default/output.json @@ -17,6 +17,7 @@ { "type": "Decorator", "start":0,"end":10,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":10}}, + "init": false, "expression": { "type": "Identifier", "start":1,"end":10,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":10},"identifierName":"decorator"}, diff --git a/packages/babel-parser/test/fixtures/experimental/decorators-2/decoratorsBeforeExport-export/output.json b/packages/babel-parser/test/fixtures/experimental/decorators-2/decoratorsBeforeExport-export/output.json index 251c4ce6bacc..16357d4ca84c 100644 --- a/packages/babel-parser/test/fixtures/experimental/decorators-2/decoratorsBeforeExport-export/output.json +++ b/packages/babel-parser/test/fixtures/experimental/decorators-2/decoratorsBeforeExport-export/output.json @@ -19,6 +19,7 @@ { "type": "Decorator", "start":0,"end":10,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":10}}, + "init": false, "expression": { "type": "Identifier", "start":1,"end":10,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":10},"identifierName":"decorator"}, diff --git a/packages/babel-parser/test/fixtures/experimental/decorators-2/export-decorated-class/output.json b/packages/babel-parser/test/fixtures/experimental/decorators-2/export-decorated-class/output.json index 77b3d90da307..2a7981deb2fe 100644 --- a/packages/babel-parser/test/fixtures/experimental/decorators-2/export-decorated-class/output.json +++ b/packages/babel-parser/test/fixtures/experimental/decorators-2/export-decorated-class/output.json @@ -19,6 +19,7 @@ { "type": "Decorator", "start":7,"end":11,"loc":{"start":{"line":1,"column":7},"end":{"line":1,"column":11}}, + "init": false, "expression": { "type": "Identifier", "start":8,"end":11,"loc":{"start":{"line":1,"column":8},"end":{"line":1,"column":11},"identifierName":"bar"}, diff --git a/packages/babel-parser/test/fixtures/experimental/decorators-2/export-default-decorated-class/output.json b/packages/babel-parser/test/fixtures/experimental/decorators-2/export-default-decorated-class/output.json index 5e0b3cd9fc43..3fd49c8ae3d8 100644 --- a/packages/babel-parser/test/fixtures/experimental/decorators-2/export-default-decorated-class/output.json +++ b/packages/babel-parser/test/fixtures/experimental/decorators-2/export-default-decorated-class/output.json @@ -17,6 +17,7 @@ { "type": "Decorator", "start":16,"end":20,"loc":{"start":{"line":2,"column":0},"end":{"line":2,"column":4}}, + "init": false, "expression": { "type": "Identifier", "start":17,"end":20,"loc":{"start":{"line":2,"column":1},"end":{"line":2,"column":4},"identifierName":"bar"}, diff --git a/packages/babel-parser/test/fixtures/experimental/decorators-2/get-decorator/output.json b/packages/babel-parser/test/fixtures/experimental/decorators-2/get-decorator/output.json index 30fd19b64705..be592ffb3a4e 100644 --- a/packages/babel-parser/test/fixtures/experimental/decorators-2/get-decorator/output.json +++ b/packages/babel-parser/test/fixtures/experimental/decorators-2/get-decorator/output.json @@ -27,6 +27,7 @@ { "type": "Decorator", "start":12,"end":16,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":6}}, + "init": false, "expression": { "type": "Identifier", "start":13,"end":16,"loc":{"start":{"line":2,"column":3},"end":{"line":2,"column":6},"identifierName":"foo"}, diff --git a/packages/babel-parser/test/fixtures/experimental/decorators-2/init-modifier/input.js b/packages/babel-parser/test/fixtures/experimental/decorators-2/init-modifier/input.js new file mode 100644 index 000000000000..41732ea2d01d --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/decorators-2/init-modifier/input.js @@ -0,0 +1,14 @@ +@init:foo +class A { + @init:foo bar; + + @init:foo baz = 123; + + @init:foo get qux() {} + + @init:foo quux() {} + + @init:(foo) foobar; + + @init:foo.bar barbaz; +} diff --git a/packages/babel-parser/test/fixtures/experimental/decorators-2/init-modifier/output.json b/packages/babel-parser/test/fixtures/experimental/decorators-2/init-modifier/output.json new file mode 100644 index 000000000000..f1287425534c --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/decorators-2/init-modifier/output.json @@ -0,0 +1,223 @@ +{ + "type": "File", + "start":0,"end":159,"loc":{"start":{"line":1,"column":0},"end":{"line":14,"column":1}}, + "program": { + "type": "Program", + "start":0,"end":159,"loc":{"start":{"line":1,"column":0},"end":{"line":14,"column":1}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ClassDeclaration", + "start":0,"end":159,"loc":{"start":{"line":1,"column":0},"end":{"line":14,"column":1}}, + "decorators": [ + { + "type": "Decorator", + "start":0,"end":9,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":9}}, + "init": true, + "expression": { + "type": "Identifier", + "start":6,"end":9,"loc":{"start":{"line":1,"column":6},"end":{"line":1,"column":9},"identifierName":"foo"}, + "name": "foo" + } + } + ], + "id": { + "type": "Identifier", + "start":16,"end":17,"loc":{"start":{"line":2,"column":6},"end":{"line":2,"column":7},"identifierName":"A"}, + "name": "A" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start":18,"end":159,"loc":{"start":{"line":2,"column":8},"end":{"line":14,"column":1}}, + "body": [ + { + "type": "ClassProperty", + "start":22,"end":36,"loc":{"start":{"line":3,"column":2},"end":{"line":3,"column":16}}, + "decorators": [ + { + "type": "Decorator", + "start":22,"end":31,"loc":{"start":{"line":3,"column":2},"end":{"line":3,"column":11}}, + "init": true, + "expression": { + "type": "Identifier", + "start":28,"end":31,"loc":{"start":{"line":3,"column":8},"end":{"line":3,"column":11},"identifierName":"foo"}, + "name": "foo" + } + } + ], + "static": false, + "key": { + "type": "Identifier", + "start":32,"end":35,"loc":{"start":{"line":3,"column":12},"end":{"line":3,"column":15},"identifierName":"bar"}, + "name": "bar" + }, + "computed": false, + "value": null + }, + { + "type": "ClassProperty", + "start":40,"end":60,"loc":{"start":{"line":5,"column":2},"end":{"line":5,"column":22}}, + "decorators": [ + { + "type": "Decorator", + "start":40,"end":49,"loc":{"start":{"line":5,"column":2},"end":{"line":5,"column":11}}, + "init": true, + "expression": { + "type": "Identifier", + "start":46,"end":49,"loc":{"start":{"line":5,"column":8},"end":{"line":5,"column":11},"identifierName":"foo"}, + "name": "foo" + } + } + ], + "static": false, + "key": { + "type": "Identifier", + "start":50,"end":53,"loc":{"start":{"line":5,"column":12},"end":{"line":5,"column":15},"identifierName":"baz"}, + "name": "baz" + }, + "computed": false, + "value": { + "type": "NumericLiteral", + "start":56,"end":59,"loc":{"start":{"line":5,"column":18},"end":{"line":5,"column":21}}, + "extra": { + "rawValue": 123, + "raw": "123" + }, + "value": 123 + } + }, + { + "type": "ClassMethod", + "start":64,"end":86,"loc":{"start":{"line":7,"column":2},"end":{"line":7,"column":24}}, + "decorators": [ + { + "type": "Decorator", + "start":64,"end":73,"loc":{"start":{"line":7,"column":2},"end":{"line":7,"column":11}}, + "init": true, + "expression": { + "type": "Identifier", + "start":70,"end":73,"loc":{"start":{"line":7,"column":8},"end":{"line":7,"column":11},"identifierName":"foo"}, + "name": "foo" + } + } + ], + "static": false, + "key": { + "type": "Identifier", + "start":78,"end":81,"loc":{"start":{"line":7,"column":16},"end":{"line":7,"column":19},"identifierName":"qux"}, + "name": "qux" + }, + "computed": false, + "kind": "get", + "id": null, + "generator": false, + "async": false, + "params": [], + "body": { + "type": "BlockStatement", + "start":84,"end":86,"loc":{"start":{"line":7,"column":22},"end":{"line":7,"column":24}}, + "body": [], + "directives": [] + } + }, + { + "type": "ClassMethod", + "start":90,"end":109,"loc":{"start":{"line":9,"column":2},"end":{"line":9,"column":21}}, + "decorators": [ + { + "type": "Decorator", + "start":90,"end":99,"loc":{"start":{"line":9,"column":2},"end":{"line":9,"column":11}}, + "init": true, + "expression": { + "type": "Identifier", + "start":96,"end":99,"loc":{"start":{"line":9,"column":8},"end":{"line":9,"column":11},"identifierName":"foo"}, + "name": "foo" + } + } + ], + "static": false, + "key": { + "type": "Identifier", + "start":100,"end":104,"loc":{"start":{"line":9,"column":12},"end":{"line":9,"column":16},"identifierName":"quux"}, + "name": "quux" + }, + "computed": false, + "kind": "method", + "id": null, + "generator": false, + "async": false, + "params": [], + "body": { + "type": "BlockStatement", + "start":107,"end":109,"loc":{"start":{"line":9,"column":19},"end":{"line":9,"column":21}}, + "body": [], + "directives": [] + } + }, + { + "type": "ClassProperty", + "start":113,"end":132,"loc":{"start":{"line":11,"column":2},"end":{"line":11,"column":21}}, + "decorators": [ + { + "type": "Decorator", + "start":113,"end":124,"loc":{"start":{"line":11,"column":2},"end":{"line":11,"column":13}}, + "init": true, + "expression": { + "type": "Identifier", + "start":120,"end":123,"loc":{"start":{"line":11,"column":9},"end":{"line":11,"column":12},"identifierName":"foo"}, + "name": "foo" + } + } + ], + "static": false, + "key": { + "type": "Identifier", + "start":125,"end":131,"loc":{"start":{"line":11,"column":14},"end":{"line":11,"column":20},"identifierName":"foobar"}, + "name": "foobar" + }, + "computed": false, + "value": null + }, + { + "type": "ClassProperty", + "start":136,"end":157,"loc":{"start":{"line":13,"column":2},"end":{"line":13,"column":23}}, + "decorators": [ + { + "type": "Decorator", + "start":136,"end":149,"loc":{"start":{"line":13,"column":2},"end":{"line":13,"column":15}}, + "init": true, + "expression": { + "type": "MemberExpression", + "start":142,"end":149,"loc":{"start":{"line":13,"column":8},"end":{"line":13,"column":15}}, + "object": { + "type": "Identifier", + "start":142,"end":145,"loc":{"start":{"line":13,"column":8},"end":{"line":13,"column":11},"identifierName":"foo"}, + "name": "foo" + }, + "property": { + "type": "Identifier", + "start":146,"end":149,"loc":{"start":{"line":13,"column":12},"end":{"line":13,"column":15},"identifierName":"bar"}, + "name": "bar" + }, + "computed": false + } + } + ], + "static": false, + "key": { + "type": "Identifier", + "start":150,"end":156,"loc":{"start":{"line":13,"column":16},"end":{"line":13,"column":22},"identifierName":"barbaz"}, + "name": "barbaz" + }, + "computed": false, + "value": null + } + ] + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/experimental/decorators-2/nested-class-decorator-parameters/output.json b/packages/babel-parser/test/fixtures/experimental/decorators-2/nested-class-decorator-parameters/output.json index c7d7224e9129..5d088b139886 100644 --- a/packages/babel-parser/test/fixtures/experimental/decorators-2/nested-class-decorator-parameters/output.json +++ b/packages/babel-parser/test/fixtures/experimental/decorators-2/nested-class-decorator-parameters/output.json @@ -14,6 +14,7 @@ { "type": "Decorator", "start":0,"end":40,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":2}}, + "init": false, "expression": { "type": "CallExpression", "start":1,"end":40,"loc":{"start":{"line":1,"column":1},"end":{"line":3,"column":2}}, @@ -45,6 +46,7 @@ { "type": "Decorator", "start":18,"end":24,"loc":{"start":{"line":2,"column":9},"end":{"line":2,"column":15}}, + "init": false, "expression": { "type": "Identifier", "start":19,"end":24,"loc":{"start":{"line":2,"column":10},"end":{"line":2,"column":15},"identifierName":"inner"}, diff --git a/packages/babel-parser/test/fixtures/experimental/decorators-2/nested-class-decorator/output.json b/packages/babel-parser/test/fixtures/experimental/decorators-2/nested-class-decorator/output.json index 2987e25cf7e8..5c5011fe7d11 100644 --- a/packages/babel-parser/test/fixtures/experimental/decorators-2/nested-class-decorator/output.json +++ b/packages/babel-parser/test/fixtures/experimental/decorators-2/nested-class-decorator/output.json @@ -14,6 +14,7 @@ { "type": "Decorator", "start":0,"end":35,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":2}}, + "init": false, "expression": { "type": "ObjectExpression", "start":2,"end":34,"loc":{"start":{"line":1,"column":2},"end":{"line":3,"column":1}}, @@ -36,6 +37,7 @@ { "type": "Decorator", "start":13,"end":19,"loc":{"start":{"line":2,"column":9},"end":{"line":2,"column":15}}, + "init": false, "expression": { "type": "Identifier", "start":14,"end":19,"loc":{"start":{"line":2,"column":10},"end":{"line":2,"column":15},"identifierName":"inner"}, diff --git a/packages/babel-parser/test/fixtures/experimental/decorators-2/nested-method-decorator-parameters/output.json b/packages/babel-parser/test/fixtures/experimental/decorators-2/nested-method-decorator-parameters/output.json index 30f31ef3355d..449337de552f 100644 --- a/packages/babel-parser/test/fixtures/experimental/decorators-2/nested-method-decorator-parameters/output.json +++ b/packages/babel-parser/test/fixtures/experimental/decorators-2/nested-method-decorator-parameters/output.json @@ -27,6 +27,7 @@ { "type": "Decorator", "start":13,"end":91,"loc":{"start":{"line":2,"column":2},"end":{"line":7,"column":3}}, + "init": false, "expression": { "type": "CallExpression", "start":14,"end":91,"loc":{"start":{"line":2,"column":3},"end":{"line":7,"column":3}}, @@ -43,6 +44,7 @@ { "type": "Decorator", "start":25,"end":34,"loc":{"start":{"line":3,"column":4},"end":{"line":3,"column":13}}, + "init": false, "expression": { "type": "Identifier", "start":26,"end":34,"loc":{"start":{"line":3,"column":5},"end":{"line":3,"column":13},"identifierName":"classDec"}, @@ -63,6 +65,7 @@ { "type": "Decorator", "start":50,"end":56,"loc":{"start":{"line":4,"column":6},"end":{"line":4,"column":12}}, + "init": false, "expression": { "type": "Identifier", "start":51,"end":56,"loc":{"start":{"line":4,"column":7},"end":{"line":4,"column":12},"identifierName":"inner"}, diff --git a/packages/babel-parser/test/fixtures/experimental/decorators-2/nested-method-decorator/output.json b/packages/babel-parser/test/fixtures/experimental/decorators-2/nested-method-decorator/output.json index 893a938ea525..c8e4d59aeb88 100644 --- a/packages/babel-parser/test/fixtures/experimental/decorators-2/nested-method-decorator/output.json +++ b/packages/babel-parser/test/fixtures/experimental/decorators-2/nested-method-decorator/output.json @@ -27,6 +27,7 @@ { "type": "Decorator", "start":13,"end":86,"loc":{"start":{"line":2,"column":2},"end":{"line":7,"column":3}}, + "init": false, "expression": { "type": "ClassExpression", "start":20,"end":82,"loc":{"start":{"line":3,"column":4},"end":{"line":6,"column":5}}, @@ -34,6 +35,7 @@ { "type": "Decorator", "start":20,"end":29,"loc":{"start":{"line":3,"column":4},"end":{"line":3,"column":13}}, + "init": false, "expression": { "type": "Identifier", "start":21,"end":29,"loc":{"start":{"line":3,"column":5},"end":{"line":3,"column":13},"identifierName":"classDec"}, @@ -54,6 +56,7 @@ { "type": "Decorator", "start":45,"end":51,"loc":{"start":{"line":4,"column":6},"end":{"line":4,"column":12}}, + "init": false, "expression": { "type": "Identifier", "start":46,"end":51,"loc":{"start":{"line":4,"column":7},"end":{"line":4,"column":12},"identifierName":"inner"}, diff --git a/packages/babel-parser/test/fixtures/experimental/decorators-2/no-class-method-parameter/output.json b/packages/babel-parser/test/fixtures/experimental/decorators-2/no-class-method-parameter/output.json index 30ccb90fa3c7..1dada33350f0 100644 --- a/packages/babel-parser/test/fixtures/experimental/decorators-2/no-class-method-parameter/output.json +++ b/packages/babel-parser/test/fixtures/experimental/decorators-2/no-class-method-parameter/output.json @@ -46,6 +46,7 @@ { "type": "Decorator", "start":26,"end":30,"loc":{"start":{"line":2,"column":14},"end":{"line":2,"column":18}}, + "init": false, "expression": { "type": "Identifier", "start":27,"end":30,"loc":{"start":{"line":2,"column":15},"end":{"line":2,"column":18},"identifierName":"foo"}, diff --git a/packages/babel-parser/test/fixtures/experimental/decorators-2/no-constructor-decorators/output.json b/packages/babel-parser/test/fixtures/experimental/decorators-2/no-constructor-decorators/output.json index d1b72ec9914b..1616c021cad0 100644 --- a/packages/babel-parser/test/fixtures/experimental/decorators-2/no-constructor-decorators/output.json +++ b/packages/babel-parser/test/fixtures/experimental/decorators-2/no-constructor-decorators/output.json @@ -30,6 +30,7 @@ { "type": "Decorator", "start":14,"end":18,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":6}}, + "init": false, "expression": { "type": "Identifier", "start":15,"end":18,"loc":{"start":{"line":2,"column":3},"end":{"line":2,"column":6},"identifierName":"abc"}, diff --git a/packages/babel-parser/test/fixtures/experimental/decorators-2/no-export-decorators-on-class/output.json b/packages/babel-parser/test/fixtures/experimental/decorators-2/no-export-decorators-on-class/output.json index 5ede51a7199f..751239966e3c 100644 --- a/packages/babel-parser/test/fixtures/experimental/decorators-2/no-export-decorators-on-class/output.json +++ b/packages/babel-parser/test/fixtures/experimental/decorators-2/no-export-decorators-on-class/output.json @@ -20,6 +20,7 @@ { "type": "Decorator", "start":0,"end":4,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":4}}, + "init": false, "expression": { "type": "Identifier", "start":1,"end":4,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":4},"identifierName":"foo"}, diff --git a/packages/babel-parser/test/fixtures/experimental/decorators-2/no-function-parameters/output.json b/packages/babel-parser/test/fixtures/experimental/decorators-2/no-function-parameters/output.json index 517d01cda9d3..6eaacad6deae 100644 --- a/packages/babel-parser/test/fixtures/experimental/decorators-2/no-function-parameters/output.json +++ b/packages/babel-parser/test/fixtures/experimental/decorators-2/no-function-parameters/output.json @@ -29,6 +29,7 @@ { "type": "Decorator", "start":14,"end":18,"loc":{"start":{"line":1,"column":14},"end":{"line":1,"column":18}}, + "init": false, "expression": { "type": "Identifier", "start":15,"end":18,"loc":{"start":{"line":1,"column":15},"end":{"line":1,"column":18},"identifierName":"foo"}, diff --git a/packages/babel-parser/test/fixtures/experimental/decorators-2/no-object-method-parameters/output.json b/packages/babel-parser/test/fixtures/experimental/decorators-2/no-object-method-parameters/output.json index 6c325f5f3e08..be0e33a94bc6 100644 --- a/packages/babel-parser/test/fixtures/experimental/decorators-2/no-object-method-parameters/output.json +++ b/packages/babel-parser/test/fixtures/experimental/decorators-2/no-object-method-parameters/output.json @@ -49,6 +49,7 @@ { "type": "Decorator", "start":21,"end":25,"loc":{"start":{"line":2,"column":9},"end":{"line":2,"column":13}}, + "init": false, "expression": { "type": "Identifier", "start":22,"end":25,"loc":{"start":{"line":2,"column":10},"end":{"line":2,"column":13},"identifierName":"foo"}, diff --git a/packages/babel-parser/test/fixtures/experimental/decorators-2/no-object-methods/output.json b/packages/babel-parser/test/fixtures/experimental/decorators-2/no-object-methods/output.json index f56e95334661..deb2e8b55c5d 100644 --- a/packages/babel-parser/test/fixtures/experimental/decorators-2/no-object-methods/output.json +++ b/packages/babel-parser/test/fixtures/experimental/decorators-2/no-object-methods/output.json @@ -33,6 +33,7 @@ { "type": "Decorator", "start":12,"end":16,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":6}}, + "init": false, "expression": { "type": "Identifier", "start":13,"end":16,"loc":{"start":{"line":2,"column":3},"end":{"line":2,"column":6},"identifierName":"baz"}, diff --git a/packages/babel-parser/test/fixtures/experimental/decorators-2/on-computed-name-method/output.json b/packages/babel-parser/test/fixtures/experimental/decorators-2/on-computed-name-method/output.json index cc7ff9f301b5..a3a81a65fcbe 100644 --- a/packages/babel-parser/test/fixtures/experimental/decorators-2/on-computed-name-method/output.json +++ b/packages/babel-parser/test/fixtures/experimental/decorators-2/on-computed-name-method/output.json @@ -27,6 +27,7 @@ { "type": "Decorator", "start":12,"end":16,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":6}}, + "init": false, "expression": { "type": "Identifier", "start":13,"end":16,"loc":{"start":{"line":2,"column":3},"end":{"line":2,"column":6},"identifierName":"dec"}, diff --git a/packages/babel-parser/test/fixtures/experimental/decorators-2/parenthesized/output.json b/packages/babel-parser/test/fixtures/experimental/decorators-2/parenthesized/output.json index cf5f51b3cfed..f55041dc8465 100644 --- a/packages/babel-parser/test/fixtures/experimental/decorators-2/parenthesized/output.json +++ b/packages/babel-parser/test/fixtures/experimental/decorators-2/parenthesized/output.json @@ -14,6 +14,7 @@ { "type": "Decorator", "start":0,"end":12,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":12}}, + "init": false, "expression": { "type": "MemberExpression", "start":2,"end":11,"loc":{"start":{"line":1,"column":2},"end":{"line":1,"column":11}}, @@ -53,6 +54,7 @@ { "type": "Decorator", "start":27,"end":48,"loc":{"start":{"line":3,"column":2},"end":{"line":3,"column":23}}, + "init": false, "expression": { "type": "MemberExpression", "start":29,"end":47,"loc":{"start":{"line":3,"column":4},"end":{"line":3,"column":22}}, @@ -96,6 +98,7 @@ { "type": "Decorator", "start":64,"end":76,"loc":{"start":{"line":5,"column":2},"end":{"line":5,"column":14}}, + "init": false, "expression": { "type": "BinaryExpression", "start":66,"end":75,"loc":{"start":{"line":5,"column":4},"end":{"line":5,"column":13}}, diff --git a/packages/babel-parser/test/fixtures/experimental/decorators-2/private-property/output.json b/packages/babel-parser/test/fixtures/experimental/decorators-2/private-property/output.json index 5ffd41290834..889cb13dafe7 100644 --- a/packages/babel-parser/test/fixtures/experimental/decorators-2/private-property/output.json +++ b/packages/babel-parser/test/fixtures/experimental/decorators-2/private-property/output.json @@ -27,6 +27,7 @@ { "type": "Decorator", "start":12,"end":16,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":6}}, + "init": false, "expression": { "type": "Identifier", "start":13,"end":16,"loc":{"start":{"line":2,"column":3},"end":{"line":2,"column":6},"identifierName":"dec"}, diff --git a/packages/babel-parser/test/fixtures/experimental/decorators-2/set-decorator/output.json b/packages/babel-parser/test/fixtures/experimental/decorators-2/set-decorator/output.json index 73939907caaa..8f39ff51f0e9 100644 --- a/packages/babel-parser/test/fixtures/experimental/decorators-2/set-decorator/output.json +++ b/packages/babel-parser/test/fixtures/experimental/decorators-2/set-decorator/output.json @@ -27,6 +27,7 @@ { "type": "Decorator", "start":12,"end":16,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":6}}, + "init": false, "expression": { "type": "Identifier", "start":13,"end":16,"loc":{"start":{"line":2,"column":3},"end":{"line":2,"column":6},"identifierName":"foo"}, diff --git a/packages/babel-parser/test/fixtures/experimental/decorators-2/static-method/output.json b/packages/babel-parser/test/fixtures/experimental/decorators-2/static-method/output.json index 5d13b2af9ce7..efac29164560 100644 --- a/packages/babel-parser/test/fixtures/experimental/decorators-2/static-method/output.json +++ b/packages/babel-parser/test/fixtures/experimental/decorators-2/static-method/output.json @@ -27,6 +27,7 @@ { "type": "Decorator", "start":14,"end":18,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":6}}, + "init": false, "expression": { "type": "Identifier", "start":15,"end":18,"loc":{"start":{"line":2,"column":3},"end":{"line":2,"column":6},"identifierName":"dec"}, diff --git a/packages/babel-parser/test/fixtures/experimental/decorators-2/static-property/output.json b/packages/babel-parser/test/fixtures/experimental/decorators-2/static-property/output.json index eb62fec97a53..ea9548d6977b 100644 --- a/packages/babel-parser/test/fixtures/experimental/decorators-2/static-property/output.json +++ b/packages/babel-parser/test/fixtures/experimental/decorators-2/static-property/output.json @@ -27,6 +27,7 @@ { "type": "Decorator", "start":12,"end":16,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":6}}, + "init": false, "expression": { "type": "Identifier", "start":13,"end":16,"loc":{"start":{"line":2,"column":3},"end":{"line":2,"column":6},"identifierName":"dec"}, diff --git a/packages/babel-parser/test/fixtures/experimental/decorators-2/unknown-modifier/input.js b/packages/babel-parser/test/fixtures/experimental/decorators-2/unknown-modifier/input.js new file mode 100644 index 000000000000..335c855dce8c --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/decorators-2/unknown-modifier/input.js @@ -0,0 +1,3 @@ +@unknown:foo +class A { +} diff --git a/packages/babel-parser/test/fixtures/experimental/decorators-2/unknown-modifier/options.json b/packages/babel-parser/test/fixtures/experimental/decorators-2/unknown-modifier/options.json new file mode 100644 index 000000000000..69639859c25e --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/decorators-2/unknown-modifier/options.json @@ -0,0 +1,10 @@ +{ + "plugins": [ + [ + "decorators", + { + "decoratorsBeforeExport": false + } + ] + ] +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/experimental/decorators-2/unknown-modifier/output.json b/packages/babel-parser/test/fixtures/experimental/decorators-2/unknown-modifier/output.json new file mode 100644 index 000000000000..f44c91eff5ac --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/decorators-2/unknown-modifier/output.json @@ -0,0 +1,43 @@ +{ + "type": "File", + "start":0,"end":24,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, + "errors": [ + "SyntaxError: Unsupported decorator modifier. `@init:` is the only modifier currently supported for decorators. (1:1)" + ], + "program": { + "type": "Program", + "start":0,"end":24,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ClassDeclaration", + "start":0,"end":24,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, + "decorators": [ + { + "type": "Decorator", + "start":0,"end":12,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":12}}, + "init": true, + "expression": { + "type": "Identifier", + "start":9,"end":12,"loc":{"start":{"line":1,"column":9},"end":{"line":1,"column":12},"identifierName":"foo"}, + "name": "foo" + } + } + ], + "id": { + "type": "Identifier", + "start":19,"end":20,"loc":{"start":{"line":2,"column":6},"end":{"line":2,"column":7},"identifierName":"A"}, + "name": "A" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start":21,"end":24,"loc":{"start":{"line":2,"column":8},"end":{"line":3,"column":1}}, + "body": [] + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/experimental/decorators/function-bind/input.js b/packages/babel-parser/test/fixtures/experimental/decorators/function-bind/input.js new file mode 100644 index 000000000000..71e602c8c287 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/decorators/function-bind/input.js @@ -0,0 +1,4 @@ +class A { + @init::x + p +} diff --git a/packages/babel-parser/test/fixtures/experimental/decorators/function-bind/options.json b/packages/babel-parser/test/fixtures/experimental/decorators/function-bind/options.json new file mode 100644 index 000000000000..e65c2bea6394 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/decorators/function-bind/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["decorators-legacy", "functionBind"] +} diff --git a/packages/babel-parser/test/fixtures/experimental/decorators/function-bind/output.json b/packages/babel-parser/test/fixtures/experimental/decorators/function-bind/output.json new file mode 100644 index 000000000000..40a8c6814fa4 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/decorators/function-bind/output.json @@ -0,0 +1,61 @@ +{ + "type": "File", + "start":0,"end":26,"loc":{"start":{"line":1,"column":0},"end":{"line":4,"column":1}}, + "program": { + "type": "Program", + "start":0,"end":26,"loc":{"start":{"line":1,"column":0},"end":{"line":4,"column":1}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ClassDeclaration", + "start":0,"end":26,"loc":{"start":{"line":1,"column":0},"end":{"line":4,"column":1}}, + "id": { + "type": "Identifier", + "start":6,"end":7,"loc":{"start":{"line":1,"column":6},"end":{"line":1,"column":7},"identifierName":"A"}, + "name": "A" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start":8,"end":26,"loc":{"start":{"line":1,"column":8},"end":{"line":4,"column":1}}, + "body": [ + { + "type": "ClassProperty", + "start":12,"end":24,"loc":{"start":{"line":2,"column":2},"end":{"line":3,"column":3}}, + "decorators": [ + { + "type": "Decorator", + "start":12,"end":20,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":10}}, + "expression": { + "type": "BindExpression", + "start":13,"end":20,"loc":{"start":{"line":2,"column":3},"end":{"line":2,"column":10}}, + "object": { + "type": "Identifier", + "start":13,"end":17,"loc":{"start":{"line":2,"column":3},"end":{"line":2,"column":7},"identifierName":"init"}, + "name": "init" + }, + "callee": { + "type": "Identifier", + "start":19,"end":20,"loc":{"start":{"line":2,"column":9},"end":{"line":2,"column":10},"identifierName":"x"}, + "name": "x" + } + } + } + ], + "static": false, + "key": { + "type": "Identifier", + "start":23,"end":24,"loc":{"start":{"line":3,"column":2},"end":{"line":3,"column":3},"identifierName":"p"}, + "name": "p" + }, + "computed": false, + "value": null + } + ] + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/experimental/pipeline-operator/hack-caret-proposal-class-expression-with-decorators/output.json b/packages/babel-parser/test/fixtures/experimental/pipeline-operator/hack-caret-proposal-class-expression-with-decorators/output.json index 5f6fe6d44c55..ddf2a2b1712d 100644 --- a/packages/babel-parser/test/fixtures/experimental/pipeline-operator/hack-caret-proposal-class-expression-with-decorators/output.json +++ b/packages/babel-parser/test/fixtures/experimental/pipeline-operator/hack-caret-proposal-class-expression-with-decorators/output.json @@ -25,14 +25,11 @@ "callee": { "type": "ClassExpression", "start":17,"end":127,"loc":{"start":{"line":2,"column":2},"end":{"line":8,"column":3}}, - "extra": { - "parenthesized": true, - "parenStart": 13 - }, "decorators": [ { "type": "Decorator", "start":17,"end":32,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":17}}, + "init": false, "expression": { "type": "Identifier", "start":18,"end":32,"loc":{"start":{"line":2,"column":3},"end":{"line":2,"column":17},"identifierName":"classDecorator"}, @@ -57,6 +54,7 @@ { "type": "Decorator", "start":53,"end":69,"loc":{"start":{"line":4,"column":4},"end":{"line":4,"column":20}}, + "init": false, "expression": { "type": "Identifier", "start":54,"end":69,"loc":{"start":{"line":4,"column":5},"end":{"line":4,"column":20},"identifierName":"methodDecorator"}, @@ -112,6 +110,10 @@ } } ] + }, + "extra": { + "parenthesized": true, + "parenStart": 13 } }, "arguments": [] diff --git a/packages/babel-parser/test/fixtures/experimental/pipeline-operator/hack-hash-proposal-class-expression-with-decorators/output.json b/packages/babel-parser/test/fixtures/experimental/pipeline-operator/hack-hash-proposal-class-expression-with-decorators/output.json index f43f7b458881..ddf2a2b1712d 100644 --- a/packages/babel-parser/test/fixtures/experimental/pipeline-operator/hack-hash-proposal-class-expression-with-decorators/output.json +++ b/packages/babel-parser/test/fixtures/experimental/pipeline-operator/hack-hash-proposal-class-expression-with-decorators/output.json @@ -29,6 +29,7 @@ { "type": "Decorator", "start":17,"end":32,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":17}}, + "init": false, "expression": { "type": "Identifier", "start":18,"end":32,"loc":{"start":{"line":2,"column":3},"end":{"line":2,"column":17},"identifierName":"classDecorator"}, @@ -53,6 +54,7 @@ { "type": "Decorator", "start":53,"end":69,"loc":{"start":{"line":4,"column":4},"end":{"line":4,"column":20}}, + "init": false, "expression": { "type": "Identifier", "start":54,"end":69,"loc":{"start":{"line":4,"column":5},"end":{"line":4,"column":20},"identifierName":"methodDecorator"}, diff --git a/packages/babel-parser/test/fixtures/experimental/pipeline-operator/hack-percent-proposal-class-expression-with-decorators/output.json b/packages/babel-parser/test/fixtures/experimental/pipeline-operator/hack-percent-proposal-class-expression-with-decorators/output.json index f43f7b458881..ddf2a2b1712d 100644 --- a/packages/babel-parser/test/fixtures/experimental/pipeline-operator/hack-percent-proposal-class-expression-with-decorators/output.json +++ b/packages/babel-parser/test/fixtures/experimental/pipeline-operator/hack-percent-proposal-class-expression-with-decorators/output.json @@ -29,6 +29,7 @@ { "type": "Decorator", "start":17,"end":32,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":17}}, + "init": false, "expression": { "type": "Identifier", "start":18,"end":32,"loc":{"start":{"line":2,"column":3},"end":{"line":2,"column":17},"identifierName":"classDecorator"}, @@ -53,6 +54,7 @@ { "type": "Decorator", "start":53,"end":69,"loc":{"start":{"line":4,"column":4},"end":{"line":4,"column":20}}, + "init": false, "expression": { "type": "Identifier", "start":54,"end":69,"loc":{"start":{"line":4,"column":5},"end":{"line":4,"column":20},"identifierName":"methodDecorator"}, diff --git a/packages/babel-parser/test/fixtures/experimental/pipeline-operator/smart-proposal-class-expression-with-decorators/output.json b/packages/babel-parser/test/fixtures/experimental/pipeline-operator/smart-proposal-class-expression-with-decorators/output.json index 7b69ae0ebf5c..b39666d6a75e 100644 --- a/packages/babel-parser/test/fixtures/experimental/pipeline-operator/smart-proposal-class-expression-with-decorators/output.json +++ b/packages/babel-parser/test/fixtures/experimental/pipeline-operator/smart-proposal-class-expression-with-decorators/output.json @@ -36,6 +36,7 @@ { "type": "Decorator", "start":17,"end":32,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":17}}, + "init": false, "expression": { "type": "Identifier", "start":18,"end":32,"loc":{"start":{"line":2,"column":3},"end":{"line":2,"column":17},"identifierName":"classDecorator"}, @@ -60,6 +61,7 @@ { "type": "Decorator", "start":53,"end":69,"loc":{"start":{"line":4,"column":4},"end":{"line":4,"column":20}}, + "init": false, "expression": { "type": "Identifier", "start":54,"end":69,"loc":{"start":{"line":4,"column":5},"end":{"line":4,"column":20},"identifierName":"methodDecorator"}, diff --git a/packages/babel-parser/test/fixtures/flow/class-properties/declare-after-decorators/output.json b/packages/babel-parser/test/fixtures/flow/class-properties/declare-after-decorators/output.json index db8d95413d43..79a4581b1447 100644 --- a/packages/babel-parser/test/fixtures/flow/class-properties/declare-after-decorators/output.json +++ b/packages/babel-parser/test/fixtures/flow/class-properties/declare-after-decorators/output.json @@ -27,6 +27,7 @@ { "type": "Decorator", "start":12,"end":16,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":6}}, + "init": false, "expression": { "type": "Identifier", "start":13,"end":16,"loc":{"start":{"line":2,"column":3},"end":{"line":2,"column":6},"identifierName":"dec"}, diff --git a/packages/babel-parser/test/fixtures/placeholders/class/decorators/output.json b/packages/babel-parser/test/fixtures/placeholders/class/decorators/output.json index 693f74878aae..34b6e09fdae3 100644 --- a/packages/babel-parser/test/fixtures/placeholders/class/decorators/output.json +++ b/packages/babel-parser/test/fixtures/placeholders/class/decorators/output.json @@ -14,6 +14,7 @@ { "type": "Decorator", "start":0,"end":10,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":10}}, + "init": false, "expression": { "type": "Placeholder", "start":2,"end":9,"loc":{"start":{"line":1,"column":2},"end":{"line":1,"column":9}}, diff --git a/packages/babel-parser/test/fixtures/typescript/decorators/type-arguments/output.json b/packages/babel-parser/test/fixtures/typescript/decorators/type-arguments/output.json index f546aad36972..6a41bb7085ce 100644 --- a/packages/babel-parser/test/fixtures/typescript/decorators/type-arguments/output.json +++ b/packages/babel-parser/test/fixtures/typescript/decorators/type-arguments/output.json @@ -14,6 +14,7 @@ { "type": "Decorator", "start":0,"end":20,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":20}}, + "init": false, "expression": { "type": "CallExpression", "start":1,"end":20,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":20}}, diff --git a/packages/babel-types/src/ast-types/generated/index.ts b/packages/babel-types/src/ast-types/generated/index.ts index 5e6547f5e991..108d90694784 100644 --- a/packages/babel-types/src/ast-types/generated/index.ts +++ b/packages/babel-types/src/ast-types/generated/index.ts @@ -1585,6 +1585,7 @@ export interface ImportAttribute extends BaseNode { export interface Decorator extends BaseNode { type: "Decorator"; expression: Expression; + init?: boolean | null; } export interface DoExpression extends BaseNode { diff --git a/packages/babel-types/src/definitions/experimental.ts b/packages/babel-types/src/definitions/experimental.ts index 1d369549e134..a340163a5705 100644 --- a/packages/babel-types/src/definitions/experimental.ts +++ b/packages/babel-types/src/definitions/experimental.ts @@ -51,6 +51,10 @@ defineType("Decorator", { expression: { validate: assertNodeType("Expression"), }, + init: { + validate: assertValueType("boolean"), + optional: true, + }, }, });