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: []
+ }
}
}
};