diff --git a/acorn.js b/acorn.js index b1c18e8f29..837124103e 100644 --- a/acorn.js +++ b/acorn.js @@ -656,8 +656,8 @@ var b_stat = {token: "{", isExpr: false}, b_expr = {token: "{", isExpr: true}, b_tmpl = {token: "${", isExpr: true}; var p_stat = {token: "(", isExpr: false}, p_expr = {token: "(", isExpr: true}; - var j_oTag = {token: "...", isExpr: true}; var q_tmpl = {token: "`", isExpr: true}, f_expr = {token: "function", isExpr: true}; + var j_oTag = {token: "...", isExpr: true}; function curTokContext() { return tokContext[tokContext.length - 1]; @@ -673,10 +673,6 @@ return true; if (prevType == _braceL) return curTokContext() === b_stat; - if (prevType === _jsxTagEnd || prevType === _jsxText) - return true; - if (prevType === _jsxName) - return false; return !tokExprAllowed; } @@ -696,7 +692,7 @@ if (type === _parenR || type === _braceR) { var out = tokContext.pop(); if (out === b_tmpl) { - preserveSpace = true; + preserveSpace = tokExprAllowed = true; } else if (out === b_stat && curTokContext() === f_expr) { tokContext.pop(); tokExprAllowed = false; @@ -704,7 +700,11 @@ tokExprAllowed = !(out && out.isExpr); } } else if (type === _braceL) { - tokContext.push(braceIsBlock(prevType) ? b_stat : b_expr); + switch (curTokContext()) { + case j_oTag: tokContext.push(b_expr); break; + case j_expr: tokContext.push(b_tmpl); break; + default: tokContext.push(braceIsBlock(prevType) ? b_stat : b_expr); + } tokExprAllowed = true; } else if (type === _dollarBraceL) { tokContext.push(b_tmpl); diff --git a/test/tests-jsx.js b/test/tests-jsx.js index b952a4f680..e5d2999703 100644 --- a/test/tests-jsx.js +++ b/test/tests-jsx.js @@ -40,6 +40,7 @@ var fbTestFixture = { end: { line: 1, column: 5 } } }, + '': { type: 'ExpressionStatement', expression: { @@ -128,6 +129,7 @@ var fbTestFixture = { end: { line: 1, column: 11 } } }, + ' {value} ': { type: 'ExpressionStatement', expression: { @@ -330,6 +332,7 @@ var fbTestFixture = { end: { line: 1, column: 40 } } }, + '': { type: "ExpressionStatement", expression: { @@ -416,6 +419,7 @@ var fbTestFixture = { }, range: [0, 40] }, + '': { type: "ExpressionStatement", expression: { @@ -489,6 +493,7 @@ var fbTestFixture = { } } }, + '<日本語>': { type: "ExpressionStatement", expression: { @@ -2541,6 +2546,7 @@ var fbTestFixture = { } } }, + '
{aa.b}
': { "type": "ExpressionStatement", "start": 0, @@ -3442,6 +3448,145 @@ var fbTestFixture = { raw: "/text" }] } + }, + + '
{a}{b}
': { + type: "ExpressionStatement", + start: 0, + end: 17, + expression: { + type: "JSXElement", + start: 0, + end: 17, + openingElement: { + type: "JSXOpeningElement", + start: 0, + end: 5, + attributes: [], + name: { + type: "JSXIdentifier", + start: 1, + end: 4, + name: "div" + }, + selfClosing: false + }, + closingElement: { + type: "JSXClosingElement", + start: 11, + end: 17, + name: { + type: "JSXIdentifier", + start: 13, + end: 16, + name: "div" + } + }, + children: [{ + type: 'JSXExpressionContainer', + expression: { + type: 'Identifier', + name: 'a', + range: [6, 7], + loc: { + start: { + line: 1, + column: 6 + }, + end: { + line: 1, + column: 7 + } + } + }, + range: [5, 8], + loc: { + start: { + line: 1, + column: 5 + }, + end: { + line: 1, + column: 8 + } + } + }, { + type: 'JSXExpressionContainer', + expression: { + type: 'Identifier', + name: 'b', + range: [9, 10], + loc: { + start: { + line: 1, + column: 9 + }, + end: { + line: 1, + column: 10 + } + } + }, + range: [8, 11], + loc: { + start: { + line: 1, + column: 8 + }, + end: { + line: 1, + column: 11 + } + } + } + ] + } + }, + + '
': { + type: "ExpressionStatement", + range: [0, 32], + expression: { + type: "JSXElement", + range: [0, 32], + openingElement: { + type: "JSXOpeningElement", + range: [0, 32], + attributes: [ + { + type: "JSXAttribute", + range: [5, 18], + name: { + type: "JSXIdentifier", + range: [5, 8], + name: "pre" + }, + value: { + type: "Literal", + range: [9, 18], + value: "leading" + } + }, + { + type: "JSXSpreadAttribute", + range: [19, 29], + argument: { + type: "Identifier", + range: [23, 28], + name: "props" + } + } + ], + name: { + type: "JSXIdentifier", + range: [1, 4], + name: "div" + }, + selfClosing: true + }, + closingElement: null, + children: [] + } } } };