// React JSX tests "use strict"; var fbTestFixture = { // Taken and adapted from esprima-fb/fbtest.js. JSX: { "": { type: "ExpressionStatement", expression: { type: "JSXElement", openingElement: { type: "JSXOpeningElement", name: { type: "JSXIdentifier", name: "a", range: [1, 2], loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 2 } } }, selfClosing: true, attributes: [], range: [0, 5], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 5 } } }, closingElement: null, children: [], range: [0, 5], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 5 } } }, range: [0, 5], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 5 } } }, "": { type: "ExpressionStatement", expression: { type: "JSXElement", openingElement: { type: "JSXOpeningElement", name: { type: "JSXNamespacedName", namespace: { type: "JSXIdentifier", name: "n", range: [1, 2], loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 2 } } }, name: { type: "JSXIdentifier", name: "a", range: [3, 4], loc: { start: { line: 1, column: 3 }, end: { line: 1, column: 4 } } }, range: [1, 4], loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 4 } } }, selfClosing: true, attributes: [{ type: "JSXAttribute", name: { type: "JSXNamespacedName", namespace: { type: "JSXIdentifier", name: "n", range: [5, 6], loc: { start: { line: 1, column: 5 }, end: { line: 1, column: 6 } } }, name: { type: "JSXIdentifier", name: "v", range: [7, 8], loc: { start: { line: 1, column: 7 }, end: { line: 1, column: 8 } } }, range: [5, 8], loc: { start: { line: 1, column: 5 }, end: { line: 1, column: 8 } } }, value: null, range: [5, 8], loc: { start: { line: 1, column: 5 }, end: { line: 1, column: 8 } } }], range: [0, 11], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 11 } } }, closingElement: null, children: [], range: [0, 11], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 11 } } }, range: [0, 11], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 11 } } }, " {value} ": { type: "ExpressionStatement", expression: { type: "JSXElement", openingElement: { type: "JSXOpeningElement", name: { type: "JSXIdentifier", name: "a", range: [1, 2], loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 2 } } }, selfClosing: false, attributes: [{ type: "JSXAttribute", name: { type: "JSXNamespacedName", namespace: { type: "JSXIdentifier", name: "n", range: [3, 4], loc: { start: { line: 1, column: 3 }, end: { line: 1, column: 4 } } }, name: { type: "JSXIdentifier", name: "foo", range: [5, 8], loc: { start: { line: 1, column: 5 }, end: { line: 1, column: 8 } } }, range: [3, 8], loc: { start: { line: 1, column: 3 }, end: { line: 1, column: 8 } } }, value: { type: "Literal", value: "bar", raw: "\"bar\"", range: [9, 14], loc: { start: { line: 1, column: 9 }, end: { line: 1, column: 14 } } }, range: [3, 14], loc: { start: { line: 1, column: 3 }, end: { line: 1, column: 14 } } }], range: [0, 15], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 15 } } }, closingElement: { type: "JSXClosingElement", name: { type: "JSXIdentifier", name: "a", range: [38, 39], loc: { start: { line: 1, column: 38 }, end: { line: 1, column: 39 } } }, range: [36, 40], loc: { start: { line: 1, column: 36 }, end: { line: 1, column: 40 } } }, children: [{ type: "Literal", value: " ", raw: " ", range: [15, 16], loc: { start: { line: 1, column: 15 }, end: { line: 1, column: 16 } } }, { type: "JSXExpressionContainer", expression: { type: "Identifier", name: "value", range: [17, 22], loc: { start: { line: 1, column: 17 }, end: { line: 1, column: 22 } } }, range: [16, 23], loc: { start: { line: 1, column: 16 }, end: { line: 1, column: 23 } } }, { type: "Literal", value: " ", raw: " ", range: [23, 24], loc: { start: { line: 1, column: 23 }, end: { line: 1, column: 24 } } }, { type: "JSXElement", openingElement: { type: "JSXOpeningElement", name: { type: "JSXIdentifier", name: "b", range: [25, 26], loc: { start: { line: 1, column: 25 }, end: { line: 1, column: 26 } } }, selfClosing: false, attributes: [], range: [24, 27], loc: { start: { line: 1, column: 24 }, end: { line: 1, column: 27 } } }, closingElement: { type: "JSXClosingElement", name: { type: "JSXIdentifier", name: "b", range: [34, 35], loc: { start: { line: 1, column: 34 }, end: { line: 1, column: 35 } } }, range: [32, 36], loc: { start: { line: 1, column: 32 }, end: { line: 1, column: 36 } } }, children: [{ type: "JSXElement", openingElement: { type: "JSXOpeningElement", name: { type: "JSXIdentifier", name: "c", range: [28, 29], loc: { start: { line: 1, column: 28 }, end: { line: 1, column: 29 } } }, selfClosing: true, attributes: [], range: [27, 32], loc: { start: { line: 1, column: 27 }, end: { line: 1, column: 32 } } }, closingElement: null, children: [], range: [27, 32], loc: { start: { line: 1, column: 27 }, end: { line: 1, column: 32 } } }], range: [24, 36], loc: { start: { line: 1, column: 24 }, end: { line: 1, column: 36 } } }], range: [0, 40], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 40 } } }, range: [0, 40], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 40 } } }, "": { type: "ExpressionStatement", expression: { type: "JSXElement", openingElement: { type: "JSXOpeningElement", name: { type: "JSXIdentifier", name: "a", range: [1, 2] }, selfClosing: true, attributes: [{ type: "JSXAttribute", name: { type: "JSXIdentifier", name: "b", range: [3, 4] }, value: { type: "JSXExpressionContainer", expression: { type: "Literal", value: " ", raw: "\" \"", range: [6, 9] }, range: [5, 10] }, range: [3, 10] }, { type: "JSXAttribute", name: { type: "JSXIdentifier", name: "c", range: [11, 12] }, value: { type: "Literal", value: " ", raw: "\" \"", range: [13, 16] }, range: [11, 16] }, { type: "JSXAttribute", name: { type: "JSXIdentifier", name: "d", range: [17, 18] }, value: { type: "Literal", value: "&", raw: "\"&\"", range: [19, 26] }, range: [17, 26] }, { type: "JSXAttribute", name: { type: "JSXIdentifier", name: "e", range: [27, 28] }, value: { type: "Literal", value: "&r;", raw: "\"&r;\"", range: [29, 37] }, range: [27, 37] }], range: [0, 40] }, closingElement: null, children: [], range: [0, 40] }, range: [0, 40] }, "": { type: "ExpressionStatement", expression: { type: "JSXElement", openingElement: { type: "JSXOpeningElement", name: { type: "JSXIdentifier", name: "a", range: [1, 2], loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 2 } } }, selfClosing: true, attributes: [], range: [0, 5], loc: { start: { line: 1, column: 0 }, end: { line: 2, column: 2 } } }, closingElement: null, children: [], range: [0, 5], loc: { start: { line: 1, column: 0 }, end: { line: 2, column: 2 } } }, range: [0, 5], loc: { start: { line: 1, column: 0 }, end: { line: 2, column: 2 } } }, "<日本語>": { type: "ExpressionStatement", expression: { type: "JSXElement", openingElement: { type: "JSXOpeningElement", name: { type: "JSXIdentifier", name: "日本語", range: [1, 4], loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 4 } } }, selfClosing: false, attributes: [], range: [0, 5], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 5 } } }, closingElement: { type: "JSXClosingElement", name: { type: "JSXIdentifier", name: "日本語", range: [7, 10], loc: { start: { line: 1, column: 7 }, end: { line: 1, column: 10 } } }, range: [5, 11], loc: { start: { line: 1, column: 5 }, end: { line: 1, column: 11 } } }, children: [], range: [0, 11], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 11 } } }, range: [0, 11], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 11 } } }, "\nbar\nbaz\n": { type: "ExpressionStatement", expression: { type: "JSXElement", openingElement: { type: "JSXOpeningElement", name: { type: "JSXIdentifier", name: "AbC-def", range: [1, 8], loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 8 } } }, selfClosing: false, attributes: [{ type: "JSXAttribute", name: { type: "JSXIdentifier", name: "test", range: [11, 15], loc: { start: { line: 2, column: 2 }, end: { line: 2, column: 6 } } }, value: { type: "Literal", value: "&&", raw: "\"&&\"", range: [16, 31], loc: { start: { line: 2, column: 7 }, end: { line: 2, column: 22 } } }, range: [11, 31], loc: { start: { line: 2, column: 2 }, end: { line: 2, column: 22 } } }], range: [0, 32], loc: { start: { line: 1, column: 0 }, end: { line: 2, column: 23 } } }, closingElement: { type: "JSXClosingElement", name: { type: "JSXIdentifier", name: "AbC-def", range: [43, 50], loc: { start: { line: 5, column: 2 }, end: { line: 5, column: 9 } } }, range: [41, 51], loc: { start: { line: 5, column: 0 }, end: { line: 5, column: 10 } } }, children: [{ type: "Literal", value: "\nbar\nbaz\n", raw: "\nbar\nbaz\n", range: [32, 41], loc: { start: { line: 2, column: 23 }, end: { line: 5, column: 0 } } }], range: [0, 51], loc: { start: { line: 1, column: 0 }, end: { line: 5, column: 10 } } }, range: [0, 51], loc: { start: { line: 1, column: 0 }, end: { line: 5, column: 10 } } }, " : } />": { type: "ExpressionStatement", expression: { type: "JSXElement", openingElement: { type: "JSXOpeningElement", name: { type: "JSXIdentifier", name: "a", range: [1, 2], loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 2 } } }, selfClosing: true, attributes: [{ type: "JSXAttribute", name: { type: "JSXIdentifier", name: "b", range: [3, 4], loc: { start: { line: 1, column: 3 }, end: { line: 1, column: 4 } } }, value: { type: "JSXExpressionContainer", expression: { type: "ConditionalExpression", test: { type: "Identifier", name: "x", range: [6, 7], loc: { start: { line: 1, column: 6 }, end: { line: 1, column: 7 } } }, consequent: { type: "JSXElement", openingElement: { type: "JSXOpeningElement", name: { type: "JSXIdentifier", name: "c", range: [11, 12], loc: { start: { line: 1, column: 11 }, end: { line: 1, column: 12 } } }, selfClosing: true, attributes: [], range: [10, 15], loc: { start: { line: 1, column: 10 }, end: { line: 1, column: 15 } } }, closingElement: null, children: [], range: [10, 15], loc: { start: { line: 1, column: 10 }, end: { line: 1, column: 15 } } }, alternate: { type: "JSXElement", openingElement: { type: "JSXOpeningElement", name: { type: "JSXIdentifier", name: "d", range: [19, 20], loc: { start: { line: 1, column: 19 }, end: { line: 1, column: 20 } } }, selfClosing: true, attributes: [], range: [18, 23], loc: { start: { line: 1, column: 18 }, end: { line: 1, column: 23 } } }, closingElement: null, children: [], range: [18, 23], loc: { start: { line: 1, column: 18 }, end: { line: 1, column: 23 } } }, range: [6, 23], loc: { start: { line: 1, column: 6 }, end: { line: 1, column: 23 } } }, range: [5, 24], loc: { start: { line: 1, column: 5 }, end: { line: 1, column: 24 } } }, range: [3, 24], loc: { start: { line: 1, column: 3 }, end: { line: 1, column: 24 } } }], range: [0, 27], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 27 } } }, closingElement: null, children: [], range: [0, 27], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 27 } } }, range: [0, 27], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 27 } } }, "{}": { type: "ExpressionStatement", expression: { type: "JSXElement", openingElement: { type: "JSXOpeningElement", name: { type: "JSXIdentifier", name: "a", range: [1, 2], loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 2 } } }, selfClosing: false, attributes: [], range: [0, 3], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 3 } } }, closingElement: { type: "JSXClosingElement", name: { type: "JSXIdentifier", name: "a", range: [7, 8], loc: { start: { line: 1, column: 7 }, end: { line: 1, column: 8 } } }, range: [5, 9], loc: { start: { line: 1, column: 5 }, end: { line: 1, column: 9 } } }, children: [{ type: "JSXExpressionContainer", expression: { type: "JSXEmptyExpression", range: [4, 4], loc: { start: { line: 1, column: 4 }, end: { line: 1, column: 4 } } }, range: [3, 5], loc: { start: { line: 1, column: 3 }, end: { line: 1, column: 5 } } }], range: [0, 9], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 9 } } }, range: [0, 9], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 9 } } }, "{/* this is a comment */}": { type: "ExpressionStatement", expression: { type: "JSXElement", openingElement: { type: "JSXOpeningElement", name: { type: "JSXIdentifier", name: "a", range: [1, 2], loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 2 } } }, selfClosing: false, attributes: [], range: [0, 3], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 3 } } }, closingElement: { type: "JSXClosingElement", name: { type: "JSXIdentifier", name: "a", range: [30, 31], loc: { start: { line: 1, column: 30 }, end: { line: 1, column: 31 } } }, range: [28, 32], loc: { start: { line: 1, column: 28 }, end: { line: 1, column: 32 } } }, children: [{ type: "JSXExpressionContainer", expression: { type: "JSXEmptyExpression", range: [4, 27], loc: { start: { line: 1, column: 4 }, end: { line: 1, column: 27 } } }, range: [3, 28], loc: { start: { line: 1, column: 3 }, end: { line: 1, column: 28 } } }], range: [0, 32], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 32 } } }, range: [0, 32], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 32 } } }, "
@test content
": { type: "ExpressionStatement", expression: { type: "JSXElement", openingElement: { type: "JSXOpeningElement", name: { type: "JSXIdentifier", name: "div", range: [1, 4], loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 4 } } }, selfClosing: false, attributes: [], range: [0, 5], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 5 } } }, closingElement: { type: "JSXClosingElement", name: { type: "JSXIdentifier", name: "div", range: [20, 23], loc: { start: { line: 1, column: 20 }, end: { line: 1, column: 23 } } }, range: [18, 24], loc: { start: { line: 1, column: 18 }, end: { line: 1, column: 24 } } }, children: [{ type: "Literal", value: "@test content", raw: "@test content", range: [5, 18], loc: { start: { line: 1, column: 5 }, end: { line: 1, column: 18 } } }], range: [0, 24], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 24 } } }, range: [0, 24], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 24 } } }, "

7x invalid-js-identifier
": { type: "ExpressionStatement", expression: { type: "JSXElement", openingElement: { type: "JSXOpeningElement", name: { type: "JSXIdentifier", name: "div", range: [1, 4], loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 4 } } }, selfClosing: false, attributes: [], range: [0, 5], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 5 } } }, closingElement: { type: "JSXClosingElement", name: { type: "JSXIdentifier", name: "div", range: [37, 40], loc: { start: { line: 1, column: 37 }, end: { line: 1, column: 40 } } }, range: [35, 41], loc: { start: { line: 1, column: 35 }, end: { line: 1, column: 41 } } }, children: [{ type: "JSXElement", openingElement: { type: "JSXOpeningElement", name: { type: "JSXIdentifier", name: "br", range: [6, 8], loc: { start: { line: 1, column: 6 }, end: { line: 1, column: 8 } } }, selfClosing: true, attributes: [], range: [5, 11], loc: { start: { line: 1, column: 5 }, end: { line: 1, column: 11 } } }, closingElement: null, children: [], range: [5, 11], loc: { start: { line: 1, column: 5 }, end: { line: 1, column: 11 } } }, { type: "Literal", value: "7x invalid-js-identifier", raw: "7x invalid-js-identifier", range: [11, 35], loc: { start: { line: 1, column: 11 }, end: { line: 1, column: 35 } } }], range: [0, 41], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 41 } } }, range: [0, 41], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 41 } } }, " right=monkeys /> gorillas />": { type: "ExpressionStatement", expression: { type: "JSXElement", openingElement: { type: "JSXOpeningElement", name: { type: "JSXIdentifier", name: "LeftRight", range: [1, 10], loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 10 } } }, selfClosing: true, attributes: [{ type: "JSXAttribute", name: { type: "JSXIdentifier", name: "left", range: [11, 15], loc: { start: { line: 1, column: 11 }, end: { line: 1, column: 15 } } }, value: { type: "JSXElement", openingElement: { type: "JSXOpeningElement", name: { type: "JSXIdentifier", name: "a", range: [17, 18], loc: { start: { line: 1, column: 17 }, end: { line: 1, column: 18 } } }, selfClosing: true, attributes: [], range: [16, 21], loc: { start: { line: 1, column: 16 }, end: { line: 1, column: 21 } } }, closingElement: null, children: [], range: [16, 21], loc: { start: { line: 1, column: 16 }, end: { line: 1, column: 21 } } }, range: [11, 21], loc: { start: { line: 1, column: 11 }, end: { line: 1, column: 21 } } }, { type: "JSXAttribute", name: { type: "JSXIdentifier", name: "right", range: [22, 27], loc: { start: { line: 1, column: 22 }, end: { line: 1, column: 27 } } }, value: { type: "JSXElement", openingElement: { type: "JSXOpeningElement", name: { type: "JSXIdentifier", name: "b", range: [29, 30], loc: { start: { line: 1, column: 29 }, end: { line: 1, column: 30 } } }, selfClosing: false, attributes: [], range: [28, 31], loc: { start: { line: 1, column: 28 }, end: { line: 1, column: 31 } } }, closingElement: { type: "JSXClosingElement", name: { type: "JSXIdentifier", name: "b", range: [52, 53], loc: { start: { line: 1, column: 52 }, end: { line: 1, column: 53 } } }, range: [50, 54], loc: { start: { line: 1, column: 50 }, end: { line: 1, column: 54 } } }, children: [{ type: "Literal", value: "monkeys /> gorillas", raw: "monkeys /> gorillas", range: [31, 50], loc: { start: { line: 1, column: 31 }, end: { line: 1, column: 50 } } }], range: [28, 54], loc: { start: { line: 1, column: 28 }, end: { line: 1, column: 54 } } }, range: [22, 54], loc: { start: { line: 1, column: 22 }, end: { line: 1, column: 54 } } }], range: [0, 57], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 57 } } }, closingElement: null, children: [], range: [0, 57], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 57 } } }, range: [0, 57], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 57 } } }, "": { type: "ExpressionStatement", expression: { type: "JSXElement", openingElement: { type: "JSXOpeningElement", name: { type: "JSXMemberExpression", object: { type: "JSXIdentifier", name: "a", range: [1, 2], loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 2 } } }, property: { type: "JSXIdentifier", name: "b", range: [3, 4], loc: { start: { line: 1, column: 3 }, end: { line: 1, column: 4 } } }, range: [1, 4], loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 4 } } }, selfClosing: false, attributes: [], range: [0, 5], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 5 } } }, closingElement: { type: "JSXClosingElement", name: { type: "JSXMemberExpression", object: { type: "JSXIdentifier", name: "a", range: [7, 8], loc: { start: { line: 1, column: 7 }, end: { line: 1, column: 8 } } }, property: { type: "JSXIdentifier", name: "b", range: [9, 10], loc: { start: { line: 1, column: 9 }, end: { line: 1, column: 10 } } }, range: [7, 10], loc: { start: { line: 1, column: 7 }, end: { line: 1, column: 10 } } }, range: [5, 11], loc: { start: { line: 1, column: 5 }, end: { line: 1, column: 11 } } }, children: [], range: [0, 11], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 11 } } }, range: [0, 11], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 11 } } }, "": { type: "ExpressionStatement", expression: { type: "JSXElement", openingElement: { type: "JSXOpeningElement", name: { type: "JSXMemberExpression", object: { type: "JSXMemberExpression", object: { type: "JSXIdentifier", name: "a", range: [1, 2], loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 2 } } }, property: { type: "JSXIdentifier", name: "b", range: [3, 4], loc: { start: { line: 1, column: 3 }, end: { line: 1, column: 4 } } }, range: [1, 4], loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 4 } } }, property: { type: "JSXIdentifier", name: "c", range: [5, 6], loc: { start: { line: 1, column: 5 }, end: { line: 1, column: 6 } } }, range: [1, 6], loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 6 } } }, selfClosing: false, attributes: [], range: [0, 7], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 7 } } }, closingElement: { type: "JSXClosingElement", name: { type: "JSXMemberExpression", object: { type: "JSXMemberExpression", object: { type: "JSXIdentifier", name: "a", range: [9, 10], loc: { start: { line: 1, column: 9 }, end: { line: 1, column: 10 } } }, property: { type: "JSXIdentifier", name: "b", range: [11, 12], loc: { start: { line: 1, column: 11 }, end: { line: 1, column: 12 } } }, range: [9, 12], loc: { start: { line: 1, column: 9 }, end: { line: 1, column: 12 } } }, property: { type: "JSXIdentifier", name: "c", range: [13, 14], loc: { start: { line: 1, column: 13 }, end: { line: 1, column: 14 } } }, range: [9, 14], loc: { start: { line: 1, column: 9 }, end: { line: 1, column: 14 } } }, range: [7, 15], loc: { start: { line: 1, column: 7 }, end: { line: 1, column: 15 } } }, children: [], range: [0, 15], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 15 } } }, range: [0, 15], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 15 } } }, // In order to more useful parse errors, we disallow following an // JSXElement by a less-than symbol. In the rare case that the binary // operator was intended, the tag can be wrapped in parentheses: "(
) < x;": { type: "ExpressionStatement", expression: { type: "BinaryExpression", operator: "<", left: { type: "JSXElement", openingElement: { type: "JSXOpeningElement", name: { type: "JSXIdentifier", name: "div", range: [2, 5], loc: { start: { line: 1, column: 2 }, end: { line: 1, column: 5 } } }, selfClosing: true, attributes: [], range: [1, 8], loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 8 } } }, closingElement: null, children: [], range: [1, 8], loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 8 } } }, right: { type: "Identifier", name: "x", range: [12, 13], loc: { start: { line: 1, column: 12 }, end: { line: 1, column: 13 } } }, range: [0, 13], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 13 } } }, range: [0, 14], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 14 } } }, "
": { type: "ExpressionStatement", expression: { type: "JSXElement", openingElement: { type: "JSXOpeningElement", name: { type: "JSXIdentifier", name: "div", range: [1, 4], loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 4 } } }, selfClosing: true, attributes: [{ type: "JSXSpreadAttribute", argument: { type: "Identifier", name: "props", range: [9, 14], loc: { start: { line: 1, column: 9 }, end: { line: 1, column: 14 } } }, range: [5, 15], loc: { start: { line: 1, column: 5 }, end: { line: 1, column: 15 } } }], range: [0, 18], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 18 } } }, closingElement: null, children: [], range: [0, 18], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 18 } } }, range: [0, 18], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 18 } } }, "
": { type: "ExpressionStatement", expression: { type: "JSXElement", openingElement: { type: "JSXOpeningElement", name: { type: "JSXIdentifier", name: "div", range: [1, 4], loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 4 } } }, selfClosing: true, attributes: [{ type: "JSXSpreadAttribute", argument: { type: "Identifier", name: "props", range: [9, 14], loc: { start: { line: 1, column: 9 }, end: { line: 1, column: 14 } } }, range: [5, 15], loc: { start: { line: 1, column: 5 }, end: { line: 1, column: 15 } } }, { type: "JSXAttribute", name: { type: "JSXIdentifier", name: "post", range: [16, 20], loc: { start: { line: 1, column: 16 }, end: { line: 1, column: 20 } } }, value: { type: "Literal", value: "attribute", raw: "\"attribute\"", range: [21, 32], loc: { start: { line: 1, column: 21 }, end: { line: 1, column: 32 } } }, range: [16, 32], loc: { start: { line: 1, column: 16 }, end: { line: 1, column: 32 } } }], range: [0, 35], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 35 } } }, closingElement: null, children: [], range: [0, 35], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 35 } } }, range: [0, 35], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 35 } } }, "
": { type: "ExpressionStatement", expression: { type: "JSXElement", openingElement: { type: "JSXOpeningElement", name: { type: "JSXIdentifier", name: "div", range: [1, 4], loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 4 } } }, selfClosing: false, attributes: [{ type: "JSXAttribute", name: { type: "JSXIdentifier", name: "pre", range: [5, 8], loc: { start: { line: 1, column: 5 }, end: { line: 1, column: 8 } } }, value: { type: "Literal", value: "leading", raw: "\"leading\"", range: [9, 18], loc: { start: { line: 1, column: 9 }, end: { line: 1, column: 18 } } }, range: [5, 18], loc: { start: { line: 1, column: 5 }, end: { line: 1, column: 18 } } }, { type: "JSXAttribute", name: { type: "JSXIdentifier", name: "pre2", range: [19, 23], loc: { start: { line: 1, column: 19 }, end: { line: 1, column: 23 } } }, value: { type: "Literal", value: "attribute", raw: "\"attribute\"", range: [24, 35], loc: { start: { line: 1, column: 24 }, end: { line: 1, column: 35 } } }, range: [19, 35], loc: { start: { line: 1, column: 19 }, end: { line: 1, column: 35 } } }, { type: "JSXSpreadAttribute", argument: { type: "Identifier", name: "props", range: [40, 45], loc: { start: { line: 1, column: 40 }, end: { line: 1, column: 45 } } }, range: [36, 46], loc: { start: { line: 1, column: 36 }, end: { line: 1, column: 46 } } }], range: [0, 47], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 47 } } }, closingElement: { type: "JSXClosingElement", name: { type: "JSXIdentifier", name: "div", range: [49, 52], loc: { start: { line: 1, column: 49 }, end: { line: 1, column: 52 } } }, range: [47, 53], loc: { start: { line: 1, column: 47 }, end: { line: 1, column: 53 } } }, children: [], range: [0, 53], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 53 } } }, range: [0, 53], loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 53 } } }, "
{aa.b}
": { type: "ExpressionStatement", start: 0, end: 52, loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 52 } }, range: [0, 52], expression: { type: "JSXElement", start: 0, end: 52, loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 52 } }, range: [0, 52], openingElement: { type: "JSXOpeningElement", start: 0, end: 31, loc: { start: { line: 1, column: 0 }, end: { line: 1, column: 31 } }, range: [0, 31], attributes: [{ type: "JSXAttribute", start: 3, end: 16, loc: { start: { line: 1, column: 3 }, end: { line: 1, column: 16 } }, range: [3, 16], name: { type: "JSXIdentifier", start: 3, end: 5, loc: { start: { line: 1, column: 3 }, end: { line: 1, column: 5 } }, range: [3, 5], name: "aa" }, value: { type: "JSXExpressionContainer", start: 6, end: 16, loc: { start: { line: 1, column: 6 }, end: { line: 1, column: 16 } }, range: [6, 16], expression: { type: "MemberExpression", start: 7, end: 15, loc: { start: { line: 1, column: 7 }, end: { line: 1, column: 15 } }, range: [7, 15], object: { type: "MemberExpression", start: 7, end: 12, loc: { start: { line: 1, column: 7 }, end: { line: 1, column: 12 } }, range: [7, 12], object: { type: "Identifier", start: 7, end: 9, loc: { start: { line: 1, column: 7 }, end: { line: 1, column: 9 } }, range: [7, 9], name: "aa" }, property: { type: "Identifier", start: 10, end: 12, loc: { start: { line: 1, column: 10 }, end: { line: 1, column: 12 } }, range: [10, 12], name: "bb" }, computed: false }, property: { type: "Identifier", start: 13, end: 15, loc: { start: { line: 1, column: 13 }, end: { line: 1, column: 15 } }, range: [13, 15], name: "cc" }, computed: false } } }, { type: "JSXAttribute", start: 17, end: 30, loc: { start: { line: 1, column: 17 }, end: { line: 1, column: 30 } }, range: [17, 30], name: { type: "JSXIdentifier", start: 17, end: 19, loc: { start: { line: 1, column: 17 }, end: { line: 1, column: 19 } }, range: [17, 19], name: "bb" }, value: { type: "JSXExpressionContainer", start: 20, end: 30, loc: { start: { line: 1, column: 20 }, end: { line: 1, column: 30 } }, range: [20, 30], expression: { type: "MemberExpression", start: 21, end: 29, loc: { start: { line: 1, column: 21 }, end: { line: 1, column: 29 } }, range: [21, 29], object: { type: "MemberExpression", start: 21, end: 26, loc: { start: { line: 1, column: 21 }, end: { line: 1, column: 26 } }, range: [21, 26], object: { type: "Identifier", start: 21, end: 23, loc: { start: { line: 1, column: 21 }, end: { line: 1, column: 23 } }, range: [21, 23], name: "bb" }, property: { type: "Identifier", start: 24, end: 26, loc: { start: { line: 1, column: 24 }, end: { line: 1, column: 26 } }, range: [24, 26], name: "cc" }, computed: false }, property: { type: "Identifier", start: 27, end: 29, loc: { start: { line: 1, column: 27 }, end: { line: 1, column: 29 } }, range: [27, 29], name: "dd" }, computed: false } } }], name: { type: "JSXIdentifier", start: 1, end: 2, loc: { start: { line: 1, column: 1 }, end: { line: 1, column: 2 } }, range: [1, 2], name: "A" }, selfClosing: false }, closingElement: { type: "JSXClosingElement", start: 48, end: 52, loc: { start: { line: 1, column: 48 }, end: { line: 1, column: 52 } }, range: [48, 52], name: { type: "JSXIdentifier", start: 50, end: 51, loc: { start: { line: 1, column: 50 }, end: { line: 1, column: 51 } }, range: [50, 51], name: "A" } }, children: [{ type: "JSXElement", start: 31, end: 48, loc: { start: { line: 1, column: 31 }, end: { line: 1, column: 48 } }, range: [31, 48], openingElement: { type: "JSXOpeningElement", start: 31, end: 36, loc: { start: { line: 1, column: 31 }, end: { line: 1, column: 36 } }, range: [31, 36], attributes: [], name: { type: "JSXIdentifier", start: 32, end: 35, loc: { start: { line: 1, column: 32 }, end: { line: 1, column: 35 } }, range: [32, 35], name: "div" }, selfClosing: false }, closingElement: { type: "JSXClosingElement", start: 42, end: 48, loc: { start: { line: 1, column: 42 }, end: { line: 1, column: 48 } }, range: [42, 48], name: { type: "JSXIdentifier", start: 44, end: 47, loc: { start: { line: 1, column: 44 }, end: { line: 1, column: 47 } }, range: [44, 47], name: "div" } }, children: [{ type: "JSXExpressionContainer", start: 36, end: 42, loc: { start: { line: 1, column: 36 }, end: { line: 1, column: 42 } }, range: [36, 42], expression: { type: "MemberExpression", start: 37, end: 41, loc: { start: { line: 1, column: 37 }, end: { line: 1, column: 41 } }, range: [37, 41], object: { type: "Identifier", start: 37, end: 39, loc: { start: { line: 1, column: 37 }, end: { line: 1, column: 39 } }, range: [37, 39], name: "aa" }, property: { type: "Identifier", start: 40, end: 41, loc: { start: { line: 1, column: 40 }, end: { line: 1, column: 41 } }, range: [40, 41], name: "b" }, computed: false } }] }] } } }, Regression: { "

foo bar baz

;": { type: "ExpressionStatement", start: 0, end: 40, expression: { type: "JSXElement", start: 0, end: 38, openingElement: { type: "JSXOpeningElement", start: 0, end: 3, attributes: [], name: { type: "JSXIdentifier", start: 1, end: 2, name: "p" }, selfClosing: false }, closingElement: { type: "JSXClosingElement", start: 34, end: 38, name: { type: "JSXIdentifier", start: 36, end: 37, name: "p" } }, children: [{ type: "Literal", start: 3, end: 7, value: "foo ", raw: "foo " }, { type: "JSXElement", start: 7, end: 30, openingElement: { type: "JSXOpeningElement", start: 7, end: 22, attributes: [{ type: "JSXAttribute", start: 10, end: 21, name: { type: "JSXIdentifier", start: 10, end: 14, name: "href" }, value: { type: "Literal", start: 15, end: 21, value: "test", raw: "\"test\"" } }], name: { type: "JSXIdentifier", start: 8, end: 9, name: "a" }, selfClosing: false }, closingElement: { type: "JSXClosingElement", start: 26, end: 30, name: { type: "JSXIdentifier", start: 28, end: 29, name: "a" } }, children: [{ type: "Literal", start: 22, end: 26, value: " bar", raw: " bar" }] }, { type: "Literal", start: 30, end: 34, value: " baz", raw: " baz" }] } }, "
{
}
": { type: "ExpressionStatement", start: 0, end: 30, expression: { type: "JSXElement", start: 0, end: 30, openingElement: { type: "JSXOpeningElement", start: 0, end: 5, attributes: [], name: { type: "JSXIdentifier", start: 1, end: 4, name: "div" }, selfClosing: false }, closingElement: { type: "JSXClosingElement", start: 24, end: 30, name: { type: "JSXIdentifier", start: 26, end: 29, name: "div" } }, children: [{ type: "JSXExpressionContainer", start: 5, end: 24, expression: { type: "JSXElement", start: 6, end: 23, openingElement: { type: "JSXOpeningElement", start: 6, end: 23, attributes: [{ type: "JSXSpreadAttribute", start: 11, end: 20, argument: { type: "Identifier", start: 15, end: 19, name: "test" } }], name: { type: "JSXIdentifier", start: 7, end: 10, name: "div" }, selfClosing: true }, closingElement: null, children: [] } }] } }, "
{ {a} }
": { type: "ExpressionStatement", start: 0, end: 18, expression: { type: "JSXElement", start: 0, end: 18, openingElement: { type: "JSXOpeningElement", start: 0, end: 5, attributes: [], name: { type: "JSXIdentifier", start: 1, end: 4, name: "div" }, selfClosing: false }, closingElement: { type: "JSXClosingElement", start: 12, end: 18, name: { type: "JSXIdentifier", start: 14, end: 17, name: "div" } }, children: [{ type: "JSXExpressionContainer", start: 5, end: 12, expression: { type: "ObjectExpression", start: 7, end: 10, properties: [{ type: "Property", start: 8, end: 9, method: false, shorthand: true, computed: false, key: { type: "Identifier", start: 8, end: 9, name: "a" }, kind: "init", value: { type: "Identifier", start: 8, end: 9, name: "a" } }] } }] } }, "
/text
": { type: "ExpressionStatement", start: 0, end: 16, expression: { type: "JSXElement", start: 0, end: 16, openingElement: { type: "JSXOpeningElement", start: 0, end: 5, attributes: [], name: { type: "JSXIdentifier", start: 1, end: 4, name: "div" }, selfClosing: false }, closingElement: { type: "JSXClosingElement", start: 10, end: 16, name: { type: "JSXIdentifier", start: 12, end: 15, name: "div" } }, children: [{ type: "Literal", start: 5, end: 10, value: "/text", 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: [] } }, "": { type: "ExpressionStatement", expression: { type: "JSXElement", range: [0, 64], openingElement: { type: "JSXOpeningElement", range: [0, 64], attributes: [{ type: "JSXAttribute", range: [6, 62], name: { type: "JSXIdentifier", range: [6, 7], name: "d" }, value: { type: "Literal", range: [8, 62], value: "M230 80\n\t\tA 45 45, 0, 1, 0, 275 125 \r\n L 275 80 Z", raw: "\"M230 80\n\t\tA 45 45, 0, 1, 0, 275 125 \r\n L 275 80 Z\"" } }], name: { type: "JSXIdentifier", range: [1, 5], name: "path" }, selfClosing: true }, closingElement: null, children: [] } } } }; if (typeof exports !== "undefined") { var test = require("./driver.js").test; } for (var ns in fbTestFixture) { ns = fbTestFixture[ns]; for (var code in ns) { test(code, { type: "Program", body: [ns[code]] }, { ecmaVersion: 6, plugins: { jsx: true }, locations: true, ranges: true }); } }