Don't allow JSXNamespacedName to chain (#10366)
Eg, `namespace:foo.bar` used to parse but is invalid in the [spec](https://facebook.github.io/jsx/). Also, allow `JSXNamespacedName` in the `JSXOpeningElement`/`JSXClosingElement` builders.
This commit is contained in:
parent
a2bf68981f
commit
1664cce681
@ -250,10 +250,16 @@ export default (superClass: Class<Parser>): Class<Parser> =>
|
|||||||
// Parses element name in any form - namespaced, member
|
// Parses element name in any form - namespaced, member
|
||||||
// or single identifier.
|
// or single identifier.
|
||||||
|
|
||||||
jsxParseElementName(): N.JSXNamespacedName | N.JSXMemberExpression {
|
jsxParseElementName():
|
||||||
|
| N.JSXIdentifier
|
||||||
|
| N.JSXNamespacedName
|
||||||
|
| N.JSXMemberExpression {
|
||||||
const startPos = this.state.start;
|
const startPos = this.state.start;
|
||||||
const startLoc = this.state.startLoc;
|
const startLoc = this.state.startLoc;
|
||||||
let node = this.jsxParseNamespacedName();
|
let node = this.jsxParseNamespacedName();
|
||||||
|
if (node.type === "JSXNamespacedName") {
|
||||||
|
return node;
|
||||||
|
}
|
||||||
while (this.eat(tt.dot)) {
|
while (this.eat(tt.dot)) {
|
||||||
const newNode = this.startNodeAt(startPos, startLoc);
|
const newNode = this.startNodeAt(startPos, startLoc);
|
||||||
newNode.object = node;
|
newNode.object = node;
|
||||||
|
|||||||
1
packages/babel-parser/test/fixtures/jsx/errors/member-in-namespace-1/input.js
vendored
Normal file
1
packages/babel-parser/test/fixtures/jsx/errors/member-in-namespace-1/input.js
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
<a.b:c />
|
||||||
3
packages/babel-parser/test/fixtures/jsx/errors/member-in-namespace-1/options.json
vendored
Normal file
3
packages/babel-parser/test/fixtures/jsx/errors/member-in-namespace-1/options.json
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"throws": "Unexpected token (1:4)"
|
||||||
|
}
|
||||||
1
packages/babel-parser/test/fixtures/jsx/errors/member-in-namespace-2/input.js
vendored
Normal file
1
packages/babel-parser/test/fixtures/jsx/errors/member-in-namespace-2/input.js
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
<a:b.c />
|
||||||
3
packages/babel-parser/test/fixtures/jsx/errors/member-in-namespace-2/options.json
vendored
Normal file
3
packages/babel-parser/test/fixtures/jsx/errors/member-in-namespace-2/options.json
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"throws": "Unexpected token (1:4)"
|
||||||
|
}
|
||||||
@ -30,7 +30,11 @@ defineType("JSXClosingElement", {
|
|||||||
aliases: ["JSX", "Immutable"],
|
aliases: ["JSX", "Immutable"],
|
||||||
fields: {
|
fields: {
|
||||||
name: {
|
name: {
|
||||||
validate: assertNodeType("JSXIdentifier", "JSXMemberExpression"),
|
validate: assertNodeType(
|
||||||
|
"JSXIdentifier",
|
||||||
|
"JSXMemberExpression",
|
||||||
|
"JSXNamespacedName",
|
||||||
|
),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
@ -130,7 +134,11 @@ defineType("JSXOpeningElement", {
|
|||||||
aliases: ["JSX", "Immutable"],
|
aliases: ["JSX", "Immutable"],
|
||||||
fields: {
|
fields: {
|
||||||
name: {
|
name: {
|
||||||
validate: assertNodeType("JSXIdentifier", "JSXMemberExpression"),
|
validate: assertNodeType(
|
||||||
|
"JSXIdentifier",
|
||||||
|
"JSXMemberExpression",
|
||||||
|
"JSXNamespacedName",
|
||||||
|
),
|
||||||
},
|
},
|
||||||
selfClosing: {
|
selfClosing: {
|
||||||
default: false,
|
default: false,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user