From 6c9a481e836ac789e487827d891ea240b076c9c6 Mon Sep 17 00:00:00 2001 From: Zen <843968788@qq.com> Date: Sun, 10 Jan 2021 23:21:39 +0800 Subject: [PATCH] @babel/preset-typescript: fix tsx assigment issue (#12599) --- .../src/plugins/typescript/index.js | 5 +- .../input.ts | 3 + .../options.json | 3 + .../output.json | 163 ++++++++++++++++++ scripts/parser-tests/typescript/allowlist.txt | 1 - 5 files changed, 173 insertions(+), 2 deletions(-) create mode 100644 packages/babel-parser/test/fixtures/typescript/tsx/assignment-in-conditional-expression/input.ts create mode 100644 packages/babel-parser/test/fixtures/typescript/tsx/assignment-in-conditional-expression/options.json create mode 100644 packages/babel-parser/test/fixtures/typescript/tsx/assignment-in-conditional-expression/output.json diff --git a/packages/babel-parser/src/plugins/typescript/index.js b/packages/babel-parser/src/plugins/typescript/index.js index 8e2bcf0f5801..744152339e9c 100644 --- a/packages/babel-parser/src/plugins/typescript/index.js +++ b/packages/babel-parser/src/plugins/typescript/index.js @@ -2450,7 +2450,10 @@ export default (superClass: Class): Class => let jsx; let typeCast; - if (this.match(tt.jsxTagStart)) { + if ( + this.hasPlugin("jsx") && + (this.match(tt.jsxTagStart) || this.isRelational("<")) + ) { // Prefer to parse JSX if possible. But may be an arrow fn. state = this.state.clone(); diff --git a/packages/babel-parser/test/fixtures/typescript/tsx/assignment-in-conditional-expression/input.ts b/packages/babel-parser/test/fixtures/typescript/tsx/assignment-in-conditional-expression/input.ts new file mode 100644 index 000000000000..fd3f331e6e2f --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/tsx/assignment-in-conditional-expression/input.ts @@ -0,0 +1,3 @@ +let a = 2 + +a == 3 ? (a =

123

) : (a =

abc

) \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/typescript/tsx/assignment-in-conditional-expression/options.json b/packages/babel-parser/test/fixtures/typescript/tsx/assignment-in-conditional-expression/options.json new file mode 100644 index 000000000000..aa8780ac5180 --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/tsx/assignment-in-conditional-expression/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["jsx", "typescript"] +} diff --git a/packages/babel-parser/test/fixtures/typescript/tsx/assignment-in-conditional-expression/output.json b/packages/babel-parser/test/fixtures/typescript/tsx/assignment-in-conditional-expression/output.json new file mode 100644 index 000000000000..3780c8015b76 --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/tsx/assignment-in-conditional-expression/output.json @@ -0,0 +1,163 @@ +{ + "type": "File", + "start":0,"end":59,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":48}}, + "program": { + "type": "Program", + "start":0,"end":59,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":48}}, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "VariableDeclaration", + "start":0,"end":9,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":9}}, + "declarations": [ + { + "type": "VariableDeclarator", + "start":4,"end":9,"loc":{"start":{"line":1,"column":4},"end":{"line":1,"column":9}}, + "id": { + "type": "Identifier", + "start":4,"end":5,"loc":{"start":{"line":1,"column":4},"end":{"line":1,"column":5},"identifierName":"a"}, + "name": "a" + }, + "init": { + "type": "NumericLiteral", + "start":8,"end":9,"loc":{"start":{"line":1,"column":8},"end":{"line":1,"column":9}}, + "extra": { + "rawValue": 2, + "raw": "2" + }, + "value": 2 + } + } + ], + "kind": "let" + }, + { + "type": "ExpressionStatement", + "start":11,"end":59,"loc":{"start":{"line":3,"column":0},"end":{"line":3,"column":48}}, + "expression": { + "type": "ConditionalExpression", + "start":11,"end":59,"loc":{"start":{"line":3,"column":0},"end":{"line":3,"column":48}}, + "test": { + "type": "BinaryExpression", + "start":11,"end":17,"loc":{"start":{"line":3,"column":0},"end":{"line":3,"column":6}}, + "left": { + "type": "Identifier", + "start":11,"end":12,"loc":{"start":{"line":3,"column":0},"end":{"line":3,"column":1},"identifierName":"a"}, + "name": "a" + }, + "operator": "==", + "right": { + "type": "NumericLiteral", + "start":16,"end":17,"loc":{"start":{"line":3,"column":5},"end":{"line":3,"column":6}}, + "extra": { + "rawValue": 3, + "raw": "3" + }, + "value": 3 + } + }, + "consequent": { + "type": "AssignmentExpression", + "start":21,"end":37,"loc":{"start":{"line":3,"column":10},"end":{"line":3,"column":26}}, + "extra": { + "parenthesized": true, + "parenStart": 20 + }, + "operator": "=", + "left": { + "type": "Identifier", + "start":21,"end":22,"loc":{"start":{"line":3,"column":10},"end":{"line":3,"column":11},"identifierName":"a"}, + "name": "a" + }, + "right": { + "type": "JSXElement", + "start":25,"end":37,"loc":{"start":{"line":3,"column":14},"end":{"line":3,"column":26}}, + "openingElement": { + "type": "JSXOpeningElement", + "start":25,"end":29,"loc":{"start":{"line":3,"column":14},"end":{"line":3,"column":18}}, + "name": { + "type": "JSXIdentifier", + "start":26,"end":28,"loc":{"start":{"line":3,"column":15},"end":{"line":3,"column":17}}, + "name": "h1" + }, + "attributes": [], + "selfClosing": false + }, + "closingElement": { + "type": "JSXClosingElement", + "start":32,"end":37,"loc":{"start":{"line":3,"column":21},"end":{"line":3,"column":26}}, + "name": { + "type": "JSXIdentifier", + "start":34,"end":36,"loc":{"start":{"line":3,"column":23},"end":{"line":3,"column":25}}, + "name": "h1" + } + }, + "children": [ + { + "type": "JSXText", + "start":29,"end":32,"loc":{"start":{"line":3,"column":18},"end":{"line":3,"column":21}}, + "extra": { + "rawValue": "123", + "raw": "123" + }, + "value": "123" + } + ] + } + }, + "alternate": { + "type": "AssignmentExpression", + "start":42,"end":58,"loc":{"start":{"line":3,"column":31},"end":{"line":3,"column":47}}, + "extra": { + "parenthesized": true, + "parenStart": 41 + }, + "operator": "=", + "left": { + "type": "Identifier", + "start":42,"end":43,"loc":{"start":{"line":3,"column":31},"end":{"line":3,"column":32},"identifierName":"a"}, + "name": "a" + }, + "right": { + "type": "JSXElement", + "start":46,"end":58,"loc":{"start":{"line":3,"column":35},"end":{"line":3,"column":47}}, + "openingElement": { + "type": "JSXOpeningElement", + "start":46,"end":50,"loc":{"start":{"line":3,"column":35},"end":{"line":3,"column":39}}, + "name": { + "type": "JSXIdentifier", + "start":47,"end":49,"loc":{"start":{"line":3,"column":36},"end":{"line":3,"column":38}}, + "name": "h1" + }, + "attributes": [], + "selfClosing": false + }, + "closingElement": { + "type": "JSXClosingElement", + "start":53,"end":58,"loc":{"start":{"line":3,"column":42},"end":{"line":3,"column":47}}, + "name": { + "type": "JSXIdentifier", + "start":55,"end":57,"loc":{"start":{"line":3,"column":44},"end":{"line":3,"column":46}}, + "name": "h1" + } + }, + "children": [ + { + "type": "JSXText", + "start":50,"end":53,"loc":{"start":{"line":3,"column":39},"end":{"line":3,"column":42}}, + "extra": { + "rawValue": "abc", + "raw": "abc" + }, + "value": "abc" + } + ] + } + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/scripts/parser-tests/typescript/allowlist.txt b/scripts/parser-tests/typescript/allowlist.txt index 19d7b5c76619..fd1355febf0d 100644 --- a/scripts/parser-tests/typescript/allowlist.txt +++ b/scripts/parser-tests/typescript/allowlist.txt @@ -281,7 +281,6 @@ jsNoImplicitAnyNoCascadingReferenceErrors.ts jsdocAccessEnumType.ts jsdocPropertyTagInvalid.ts jsxAttributeWithoutExpressionReact.tsx -jsxIntrinsicElementsExtendsRecord.tsx letAndVarRedeclaration.ts letAsIdentifier.ts letAsIdentifierInStrictMode.ts