[Pkg-javascript-commits] [node-acorn-jsx] 397/484: Merge branch 'upstream' into jsx2
Bastien Roucariès
rouca at moszumanska.debian.org
Sat Aug 19 14:21:02 UTC 2017
This is an automated email from the git hooks/post-receive script.
rouca pushed a commit to branch master
in repository node-acorn-jsx.
commit d64efe1be42af12abd0de923eb8ad58c92d90e37
Merge: 802c4cd dac747d
Author: Ingvar Stepanyan <me at rreverser.com>
Date: Mon Jan 19 14:12:24 2015 +0000
Merge branch 'upstream' into jsx2
Conflicts:
acorn.js
README.md | 11 +
acorn.js | 140 +-
acorn_loose.js | 51 +-
bin/acorn | 1 +
test/tests-harmony.js | 137 +-
test/tests-jsx.js | 3466 +++++++++++++++++++++++++++++++++++++++++++++++++
test/tests.js | 4 +-
7 files changed, 3683 insertions(+), 127 deletions(-)
diff --cc acorn.js
index 3d952ef,4945981..a5820d6
--- a/acorn.js
+++ b/acorn.js
@@@ -428,10 -421,9 +422,10 @@@
var _braceR = {type: "}"}, _parenL = {type: "(", beforeExpr: true}, _parenR = {type: ")"};
var _comma = {type: ",", beforeExpr: true}, _semi = {type: ";", beforeExpr: true};
var _colon = {type: ":", beforeExpr: true}, _dot = {type: "."}, _question = {type: "?", beforeExpr: true};
- var _arrow = {type: "=>", beforeExpr: true};
- var _template = {type: "template"}, _templateContinued = {type: "templateContinued"};
- var _xjsText = {type: "xjsText"};
+ var _arrow = {type: "=>", beforeExpr: true}, _template = {type: "template"};
var _ellipsis = {type: "...", prefix: true, beforeExpr: true};
+ var _backQuote = {type: "`"}, _dollarBraceL = {type: "${", beforeExpr: true};
++ var _xjsText = {type: "xjsText"};
// Operators. These carry several kinds of properties to help the
// parser use them properly (the presence of these properties is
@@@ -649,13 -634,9 +642,14 @@@
// given point in the program is loosely based on sweet.js' approach.
// See https://github.com/mozilla/sweet.js/wiki/design
- var b_stat = {token: "{", isExpr: false}, b_expr = {token: "{", isExpr: true};
+ 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 q_tmpl = {token: "`", isExpr: true};
+ var j_oTag = {token: "<tag", isExpr: false}, j_cTag = {token: "</tag", isExpr: false}, j_expr = {token: "<tag>...</tag>", isExpr: true};
+
+ function curTokContext() {
+ return tokContext[tokContext.length - 1];
+ }
function braceIsBlock(prevType) {
var parent;
@@@ -703,29 -684,19 +701,38 @@@
tokExprAllowed = false;
} else if (tokExprAllowed && type == _function) {
tokExprAllowed = false;
+ } else if (type === _backQuote) {
+ if (tokContext[tokContext.length - 1] === q_tmpl) {
+ tokContext.pop();
+ } else {
+ tokContext.push(q_tmpl);
+ preserveSpace = true;
+ }
+ tokExprAllowed = false;
++ tokExprAllowed = false;
+ } else if (type === _xjsTagStart) {
+ tokContext.push(j_expr); // treat as beginning of JSX expression
+ tokContext.push(j_oTag); // start opening tag context
+ tokExprAllowed = false;
+ } else if (type === _xjsTagEnd) {
+ var out = tokContext.pop();
+ if (out === j_oTag && prevType === _slash || out === j_cTag) {
+ tokContext.pop();
+ tokExprAllowed = curTokContext() === j_expr;
+ } else {
+ tokExprAllowed = true;
+ }
+ } else if (type === _xjsText) {
+ tokExprAllowed = true;
+ } else if (type === _slash && prevType === _xjsTagStart) {
+ tokContext.length -= 2; // do not consider JSX expr -> JSX open tag -> ... anymore
+ tokContext.push(j_cTag); // reconsider as closing tag context
+ tokExprAllowed = false;
} else {
tokExprAllowed = type.beforeExpr;
}
- if (curTokContext() !== j_expr) skipSpace();
- if (!preserveSpace) skipSpace();
++ if (!preserveSpace && curTokContext() !== j_expr) skipSpace();
}
function skipBlockComment() {
@@@ -994,19 -948,15 +995,23 @@@
if (options.locations) tokStartLoc = curPosition();
if (tokPos >= inputLen) return finishToken(_eof);
+ if (tokContext[tokContext.length - 1] === q_tmpl) {
+ return readTmplToken();
+ }
+
var code = input.charCodeAt(tokPos);
+ var context = curTokContext();
- // Identifier or keyword. '\uXXXX' sequences are allowed in
- // identifiers, so '\' also dispatches to that.
- if (isIdentifierStart(code) || code === 92 /* '\' */) return readWord();
+ if (context === j_oTag || context === j_cTag) {
+ // JSX identifier
+ if (isIdentifierStart(code)) return readJSXWord();
+ } else if (context === j_expr) {
+ return readXJSToken();
+ } else {
+ // Identifier or keyword. '\uXXXX' sequences are allowed in
+ // identifiers, so '\' also dispatches to that.
+ if (isIdentifierStart(code) || code === 92 /* '\' */) return readWord();
+ }
var tok = getTokenFromCode(code);
@@@ -2654,12 -2254,9 +2653,12 @@@
case _new:
return parseNew();
- case _template:
+ case _backQuote:
return parseTemplate();
+ case _xjsTagStart:
+ return parseXJSElement();
+
default:
unexpected();
}
diff --cc test/tests-jsx.js
index 0000000,0000000..186a818
new file mode 100644
--- /dev/null
+++ b/test/tests-jsx.js
@@@ -1,0 -1,0 +1,3466 @@@
++// React JSX tests
++
++var fbTestFixture = {
++ // Taken and adapted from esprima-fb/fbtest.js.
++ 'XJS': {
++ '<a />': {
++ type: "ExpressionStatement",
++ expression: {
++ type: "XJSElement",
++ openingElement: {
++ type: "XJSOpeningElement",
++ name: {
++ type: "XJSIdentifier",
++ 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 }
++ }
++ },
++ '<n:a n:v />': {
++ type: 'ExpressionStatement',
++ expression: {
++ type: 'XJSElement',
++ openingElement: {
++ type: 'XJSOpeningElement',
++ name: {
++ type: 'XJSNamespacedName',
++ namespace: {
++ type: 'XJSIdentifier',
++ name: 'n',
++ range: [1, 2],
++ loc: {
++ start: { line: 1, column: 1 },
++ end: { line: 1, column: 2 }
++ }
++ },
++ name: {
++ type: 'XJSIdentifier',
++ 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: 'XJSAttribute',
++ name: {
++ type: 'XJSNamespacedName',
++ namespace: {
++ type: 'XJSIdentifier',
++ name: 'n',
++ range: [5, 6],
++ loc: {
++ start: { line: 1, column: 5 },
++ end: { line: 1, column: 6 }
++ }
++ },
++ name: {
++ type: 'XJSIdentifier',
++ 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 }
++ }
++ },
++ '<a n:foo="bar"> {value} <b><c /></b></a>': {
++ type: 'ExpressionStatement',
++ expression: {
++ type: 'XJSElement',
++ openingElement: {
++ type: 'XJSOpeningElement',
++ name: {
++ type: 'XJSIdentifier',
++ name: 'a',
++ range: [1, 2],
++ loc: {
++ start: { line: 1, column: 1 },
++ end: { line: 1, column: 2 }
++ }
++ },
++ selfClosing: false,
++ attributes: [{
++ type: 'XJSAttribute',
++ name: {
++ type: 'XJSNamespacedName',
++ namespace: {
++ type: 'XJSIdentifier',
++ name: 'n',
++ range: [3, 4],
++ loc: {
++ start: { line: 1, column: 3 },
++ end: { line: 1, column: 4 }
++ }
++ },
++ name: {
++ type: 'XJSIdentifier',
++ 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: 'XJSClosingElement',
++ name: {
++ type: 'XJSIdentifier',
++ 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: 'XJSExpressionContainer',
++ 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: 'XJSElement',
++ openingElement: {
++ type: 'XJSOpeningElement',
++ name: {
++ type: 'XJSIdentifier',
++ 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: 'XJSClosingElement',
++ name: {
++ type: 'XJSIdentifier',
++ 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: 'XJSElement',
++ openingElement: {
++ type: 'XJSOpeningElement',
++ name: {
++ type: 'XJSIdentifier',
++ 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 }
++ }
++ },
++ '<a b={" "} c=" " d="&" e="&r;" />': {
++ type: "ExpressionStatement",
++ expression: {
++ type: "XJSElement",
++ openingElement: {
++ type: "XJSOpeningElement",
++ name: {
++ type: "XJSIdentifier",
++ name: "a",
++ range: [1, 2]
++ },
++ selfClosing: true,
++ attributes: [
++ {
++ type: "XJSAttribute",
++ name: {
++ type: "XJSIdentifier",
++ name: "b",
++ range: [3, 4]
++ },
++ value: {
++ type: "XJSExpressionContainer",
++ expression: {
++ type: "Literal",
++ value: " ",
++ raw: "\" \"",
++ range: [6, 9]
++ },
++ range: [5, 10]
++ },
++ range: [3, 10]
++ },
++ {
++ type: "XJSAttribute",
++ name: {
++ type: "XJSIdentifier",
++ name: "c",
++ range: [11, 12]
++ },
++ value: {
++ type: "Literal",
++ value: " ",
++ raw: "\" \"",
++ range: [13, 16]
++ },
++ range: [11, 16]
++ },
++ {
++ type: "XJSAttribute",
++ name: {
++ type: "XJSIdentifier",
++ name: "d",
++ range: [17, 18]
++ },
++ value: {
++ type: "Literal",
++ value: "&",
++ raw: "\"&\"",
++ range: [19, 26]
++ },
++ range: [17, 26]
++ },
++ {
++ type: "XJSAttribute",
++ name: {
++ type: "XJSIdentifier",
++ 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]
++ },
++ '<a\n/>': {
++ type: "ExpressionStatement",
++ expression: {
++ type: "XJSElement",
++ openingElement: {
++ type: "XJSOpeningElement",
++ name: {
++ type: "XJSIdentifier",
++ 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: "XJSElement",
++ openingElement: {
++ type: "XJSOpeningElement",
++ name: {
++ type: "XJSIdentifier",
++ 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: "XJSClosingElement",
++ name: {
++ type: "XJSIdentifier",
++ 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
++ }
++ }
++ },
++
++ '<AbC-def\n test="&&">\nbar\nbaz\n</AbC-def>': {
++ type: "ExpressionStatement",
++ expression: {
++ type: "XJSElement",
++ openingElement: {
++ type: "XJSOpeningElement",
++ name: {
++ type: "XJSIdentifier",
++ name: "AbC-def",
++ range: [
++ 1,
++ 8
++ ],
++ loc: {
++ start: {
++ line: 1,
++ column: 1
++ },
++ end: {
++ line: 1,
++ column: 8
++ }
++ }
++ },
++ selfClosing: false,
++ attributes: [
++ {
++ type: "XJSAttribute",
++ name: {
++ type: "XJSIdentifier",
++ 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: "XJSClosingElement",
++ name: {
++ type: "XJSIdentifier",
++ 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
++ }
++ }
++ },
++
++ '<a b={x ? <c /> : <d />} />': {
++ type: "ExpressionStatement",
++ expression: {
++ type: "XJSElement",
++ openingElement: {
++ type: "XJSOpeningElement",
++ name: {
++ type: "XJSIdentifier",
++ name: "a",
++ range: [
++ 1,
++ 2
++ ],
++ loc: {
++ start: {
++ line: 1,
++ column: 1
++ },
++ end: {
++ line: 1,
++ column: 2
++ }
++ }
++ },
++ selfClosing: true,
++ attributes: [
++ {
++ type: "XJSAttribute",
++ name: {
++ type: "XJSIdentifier",
++ name: "b",
++ range: [
++ 3,
++ 4
++ ],
++ loc: {
++ start: {
++ line: 1,
++ column: 3
++ },
++ end: {
++ line: 1,
++ column: 4
++ }
++ }
++ },
++ value: {
++ type: "XJSExpressionContainer",
++ expression: {
++ type: "ConditionalExpression",
++ test: {
++ type: "Identifier",
++ name: "x",
++ range: [
++ 6,
++ 7
++ ],
++ loc: {
++ start: {
++ line: 1,
++ column: 6
++ },
++ end: {
++ line: 1,
++ column: 7
++ }
++ }
++ },
++ consequent: {
++ type: "XJSElement",
++ openingElement: {
++ type: "XJSOpeningElement",
++ name: {
++ type: "XJSIdentifier",
++ 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: "XJSElement",
++ openingElement: {
++ type: "XJSOpeningElement",
++ name: {
++ type: "XJSIdentifier",
++ 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
++ }
++ }
++ },
++
++ '<a>{}</a>': {
++ type: 'ExpressionStatement',
++ expression: {
++ type: 'XJSElement',
++ openingElement: {
++ type: 'XJSOpeningElement',
++ name: {
++ type: 'XJSIdentifier',
++ 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: 'XJSClosingElement',
++ name: {
++ type: 'XJSIdentifier',
++ 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: 'XJSExpressionContainer',
++ expression: {
++ type: 'XJSEmptyExpression',
++ 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 }
++ }
++ },
++
++ '<a>{/* this is a comment */}</a>': {
++ type: 'ExpressionStatement',
++ expression: {
++ type: 'XJSElement',
++ openingElement: {
++ type: 'XJSOpeningElement',
++ name: {
++ type: 'XJSIdentifier',
++ 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: 'XJSClosingElement',
++ name: {
++ type: 'XJSIdentifier',
++ 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: 'XJSExpressionContainer',
++ expression: {
++ type: 'XJSEmptyExpression',
++ 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 }
++ }
++ },
++
++ '<div>@test content</div>': {
++ type: 'ExpressionStatement',
++ expression: {
++ type: 'XJSElement',
++ openingElement: {
++ type: 'XJSOpeningElement',
++ name: {
++ type: 'XJSIdentifier',
++ 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: 'XJSClosingElement',
++ name: {
++ type: 'XJSIdentifier',
++ 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 }
++ }
++ },
++
++ '<div><br />7x invalid-js-identifier</div>': {
++ type: 'ExpressionStatement',
++ expression: {
++ type: 'XJSElement',
++ openingElement: {
++ type: 'XJSOpeningElement',
++ name: {
++ type: 'XJSIdentifier',
++ 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: 'XJSClosingElement',
++ name: {
++ type: 'XJSIdentifier',
++ 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: 'XJSElement',
++ openingElement: {
++ type: 'XJSOpeningElement',
++ name: {
++ type: 'XJSIdentifier',
++ 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
++ }
++ }
++ },
++
++ '<LeftRight left=<a /> right=<b>monkeys /> gorillas</b> />': {
++ "type": "ExpressionStatement",
++ "expression": {
++ "type": "XJSElement",
++ "openingElement": {
++ "type": "XJSOpeningElement",
++ "name": {
++ "type": "XJSIdentifier",
++ "name": "LeftRight",
++ "range": [
++ 1,
++ 10
++ ],
++ "loc": {
++ "start": {
++ "line": 1,
++ "column": 1
++ },
++ "end": {
++ "line": 1,
++ "column": 10
++ }
++ }
++ },
++ "selfClosing": true,
++ "attributes": [
++ {
++ "type": "XJSAttribute",
++ "name": {
++ "type": "XJSIdentifier",
++ "name": "left",
++ "range": [
++ 11,
++ 15
++ ],
++ "loc": {
++ "start": {
++ "line": 1,
++ "column": 11
++ },
++ "end": {
++ "line": 1,
++ "column": 15
++ }
++ }
++ },
++ "value": {
++ "type": "XJSElement",
++ "openingElement": {
++ "type": "XJSOpeningElement",
++ "name": {
++ "type": "XJSIdentifier",
++ "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": "XJSAttribute",
++ "name": {
++ "type": "XJSIdentifier",
++ "name": "right",
++ "range": [
++ 22,
++ 27
++ ],
++ "loc": {
++ "start": {
++ "line": 1,
++ "column": 22
++ },
++ "end": {
++ "line": 1,
++ "column": 27
++ }
++ }
++ },
++ "value": {
++ "type": "XJSElement",
++ "openingElement": {
++ "type": "XJSOpeningElement",
++ "name": {
++ "type": "XJSIdentifier",
++ "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": "XJSClosingElement",
++ "name": {
++ "type": "XJSIdentifier",
++ "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
++ }
++ }
++ },
++
++ '<a.b></a.b>': {
++ type: 'ExpressionStatement',
++ expression: {
++ type: 'XJSElement',
++ openingElement: {
++ type: 'XJSOpeningElement',
++ name: {
++ type: 'XJSMemberExpression',
++ object: {
++ type: 'XJSIdentifier',
++ name: 'a',
++ range: [1, 2],
++ loc: {
++ start: { line: 1, column: 1 },
++ end: { line: 1, column: 2 }
++ }
++ },
++ property: {
++ type: 'XJSIdentifier',
++ 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: 'XJSClosingElement',
++ name: {
++ type: 'XJSMemberExpression',
++ object: {
++ type: 'XJSIdentifier',
++ name: 'a',
++ range: [7, 8],
++ loc: {
++ start: { line: 1, column: 7 },
++ end: { line: 1, column: 8 }
++ }
++ },
++ property: {
++ type: 'XJSIdentifier',
++ 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 }
++ }
++ },
++
++ '<a.b.c></a.b.c>': {
++ type: 'ExpressionStatement',
++ expression: {
++ type: 'XJSElement',
++ openingElement: {
++ type: 'XJSOpeningElement',
++ name: {
++ type: 'XJSMemberExpression',
++ object: {
++ type: 'XJSMemberExpression',
++ object: {
++ type: 'XJSIdentifier',
++ name: 'a',
++ range: [1, 2],
++ loc: {
++ start: { line: 1, column: 1 },
++ end: { line: 1, column: 2 }
++ }
++ },
++ property: {
++ type: 'XJSIdentifier',
++ 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: 'XJSIdentifier',
++ 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: 'XJSClosingElement',
++ name: {
++ type: 'XJSMemberExpression',
++ object: {
++ type: 'XJSMemberExpression',
++ object: {
++ type: 'XJSIdentifier',
++ name: 'a',
++ range: [9, 10],
++ loc: {
++ start: { line: 1, column: 9 },
++ end: { line: 1, column: 10 }
++ }
++ },
++ property: {
++ type: 'XJSIdentifier',
++ 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: 'XJSIdentifier',
++ 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
++ // XJSElement by a less-than symbol. In the rare case that the binary
++ // operator was intended, the tag can be wrapped in parentheses:
++ '(<div />) < x;': {
++ type: 'ExpressionStatement',
++ expression: {
++ type: 'BinaryExpression',
++ operator: '<',
++ left: {
++ type: 'XJSElement',
++ openingElement: {
++ type: 'XJSOpeningElement',
++ name: {
++ type: 'XJSIdentifier',
++ 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 }
++ }
++ },
++
++ '<div {...props} />': {
++ "type": "ExpressionStatement",
++ "expression": {
++ "type": "XJSElement",
++ "openingElement": {
++ "type": "XJSOpeningElement",
++ "name": {
++ "type": "XJSIdentifier",
++ "name": "div",
++ "range": [
++ 1,
++ 4
++ ],
++ "loc": {
++ "start": {
++ "line": 1,
++ "column": 1
++ },
++ "end": {
++ "line": 1,
++ "column": 4
++ }
++ }
++ },
++ "selfClosing": true,
++ "attributes": [
++ {
++ "type": "XJSSpreadAttribute",
++ "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
++ }
++ }
++ },
++
++ '<div {...props} post="attribute" />': {
++ "type": "ExpressionStatement",
++ "expression": {
++ "type": "XJSElement",
++ "openingElement": {
++ "type": "XJSOpeningElement",
++ "name": {
++ "type": "XJSIdentifier",
++ "name": "div",
++ "range": [
++ 1,
++ 4
++ ],
++ "loc": {
++ "start": {
++ "line": 1,
++ "column": 1
++ },
++ "end": {
++ "line": 1,
++ "column": 4
++ }
++ }
++ },
++ "selfClosing": true,
++ "attributes": [
++ {
++ "type": "XJSSpreadAttribute",
++ "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": "XJSAttribute",
++ "name": {
++ "type": "XJSIdentifier",
++ "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
++ }
++ }
++ },
++
++ '<div pre="leading" pre2="attribute" {...props}></div>': {
++ "type": "ExpressionStatement",
++ "expression": {
++ "type": "XJSElement",
++ "openingElement": {
++ "type": "XJSOpeningElement",
++ "name": {
++ "type": "XJSIdentifier",
++ "name": "div",
++ "range": [
++ 1,
++ 4
++ ],
++ "loc": {
++ "start": {
++ "line": 1,
++ "column": 1
++ },
++ "end": {
++ "line": 1,
++ "column": 4
++ }
++ }
++ },
++ "selfClosing": false,
++ "attributes": [
++ {
++ "type": "XJSAttribute",
++ "name": {
++ "type": "XJSIdentifier",
++ "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": "XJSAttribute",
++ "name": {
++ "type": "XJSIdentifier",
++ "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": "XJSSpreadAttribute",
++ "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": "XJSClosingElement",
++ "name": {
++ "type": "XJSIdentifier",
++ "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
++ }
++ }
++ },
++ '<A aa={aa.bb.cc} bb={bb.cc.dd}><div>{aa.b}</div></A>': {
++ "type": "ExpressionStatement",
++ "start": 0,
++ "end": 52,
++ "loc": {
++ "start": {
++ "line": 1,
++ "column": 0
++ },
++ "end": {
++ "line": 1,
++ "column": 52
++ }
++ },
++ "range": [
++ 0,
++ 52
++ ],
++ "expression": {
++ "type": "XJSElement",
++ "start": 0,
++ "end": 52,
++ "loc": {
++ "start": {
++ "line": 1,
++ "column": 0
++ },
++ "end": {
++ "line": 1,
++ "column": 52
++ }
++ },
++ "range": [
++ 0,
++ 52
++ ],
++ "openingElement": {
++ "type": "XJSOpeningElement",
++ "start": 0,
++ "end": 31,
++ "loc": {
++ "start": {
++ "line": 1,
++ "column": 0
++ },
++ "end": {
++ "line": 1,
++ "column": 31
++ }
++ },
++ "range": [
++ 0,
++ 31
++ ],
++ "attributes": [
++ {
++ "type": "XJSAttribute",
++ "start": 3,
++ "end": 16,
++ "loc": {
++ "start": {
++ "line": 1,
++ "column": 3
++ },
++ "end": {
++ "line": 1,
++ "column": 16
++ }
++ },
++ "range": [
++ 3,
++ 16
++ ],
++ "name": {
++ "type": "XJSIdentifier",
++ "start": 3,
++ "end": 5,
++ "loc": {
++ "start": {
++ "line": 1,
++ "column": 3
++ },
++ "end": {
++ "line": 1,
++ "column": 5
++ }
++ },
++ "range": [
++ 3,
++ 5
++ ],
++ "name": "aa"
++ },
++ "value": {
++ "type": "XJSExpressionContainer",
++ "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": "XJSAttribute",
++ "start": 17,
++ "end": 30,
++ "loc": {
++ "start": {
++ "line": 1,
++ "column": 17
++ },
++ "end": {
++ "line": 1,
++ "column": 30
++ }
++ },
++ "range": [
++ 17,
++ 30
++ ],
++ "name": {
++ "type": "XJSIdentifier",
++ "start": 17,
++ "end": 19,
++ "loc": {
++ "start": {
++ "line": 1,
++ "column": 17
++ },
++ "end": {
++ "line": 1,
++ "column": 19
++ }
++ },
++ "range": [
++ 17,
++ 19
++ ],
++ "name": "bb"
++ },
++ "value": {
++ "type": "XJSExpressionContainer",
++ "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": "XJSIdentifier",
++ "start": 1,
++ "end": 2,
++ "loc": {
++ "start": {
++ "line": 1,
++ "column": 1
++ },
++ "end": {
++ "line": 1,
++ "column": 2
++ }
++ },
++ "range": [
++ 1,
++ 2
++ ],
++ "name": "A"
++ },
++ "selfClosing": false
++ },
++ "closingElement": {
++ "type": "XJSClosingElement",
++ "start": 48,
++ "end": 52,
++ "loc": {
++ "start": {
++ "line": 1,
++ "column": 48
++ },
++ "end": {
++ "line": 1,
++ "column": 52
++ }
++ },
++ "range": [
++ 48,
++ 52
++ ],
++ "name": {
++ "type": "XJSIdentifier",
++ "start": 50,
++ "end": 51,
++ "loc": {
++ "start": {
++ "line": 1,
++ "column": 50
++ },
++ "end": {
++ "line": 1,
++ "column": 51
++ }
++ },
++ "range": [
++ 50,
++ 51
++ ],
++ "name": "A"
++ }
++ },
++ "children": [
++ {
++ "type": "XJSElement",
++ "start": 31,
++ "end": 48,
++ "loc": {
++ "start": {
++ "line": 1,
++ "column": 31
++ },
++ "end": {
++ "line": 1,
++ "column": 48
++ }
++ },
++ "range": [
++ 31,
++ 48
++ ],
++ "openingElement": {
++ "type": "XJSOpeningElement",
++ "start": 31,
++ "end": 36,
++ "loc": {
++ "start": {
++ "line": 1,
++ "column": 31
++ },
++ "end": {
++ "line": 1,
++ "column": 36
++ }
++ },
++ "range": [
++ 31,
++ 36
++ ],
++ "attributes": [],
++ "name": {
++ "type": "XJSIdentifier",
++ "start": 32,
++ "end": 35,
++ "loc": {
++ "start": {
++ "line": 1,
++ "column": 32
++ },
++ "end": {
++ "line": 1,
++ "column": 35
++ }
++ },
++ "range": [
++ 32,
++ 35
++ ],
++ "name": "div"
++ },
++ "selfClosing": false
++ },
++ "closingElement": {
++ "type": "XJSClosingElement",
++ "start": 42,
++ "end": 48,
++ "loc": {
++ "start": {
++ "line": 1,
++ "column": 42
++ },
++ "end": {
++ "line": 1,
++ "column": 48
++ }
++ },
++ "range": [
++ 42,
++ 48
++ ],
++ "name": {
++ "type": "XJSIdentifier",
++ "start": 44,
++ "end": 47,
++ "loc": {
++ "start": {
++ "line": 1,
++ "column": 44
++ },
++ "end": {
++ "line": 1,
++ "column": 47
++ }
++ },
++ "range": [
++ 44,
++ 47
++ ],
++ "name": "div"
++ }
++ },
++ "children": [
++ {
++ "type": "XJSExpressionContainer",
++ "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': {
++ '<p>foo <a href="test"> bar</a> baz</p> ;': {
++ type: "ExpressionStatement",
++ start: 0,
++ end: 40,
++ expression: {
++ type: "XJSElement",
++ start: 0,
++ end: 38,
++ openingElement: {
++ type: "XJSOpeningElement",
++ start: 0,
++ end: 3,
++ attributes: [],
++ name: {
++ type: "XJSIdentifier",
++ start: 1,
++ end: 2,
++ name: "p"
++ },
++ selfClosing: false
++ },
++ closingElement: {
++ type: "XJSClosingElement",
++ start: 34,
++ end: 38,
++ name: {
++ type: "XJSIdentifier",
++ start: 36,
++ end: 37,
++ name: "p"
++ }
++ },
++ children: [
++ {
++ type: "Literal",
++ start: 3,
++ end: 7,
++ value: "foo ",
++ raw: "foo "
++ },
++ {
++ type: "XJSElement",
++ start: 7,
++ end: 30,
++ openingElement: {
++ type: "XJSOpeningElement",
++ start: 7,
++ end: 22,
++ attributes: [{
++ type: "XJSAttribute",
++ start: 10,
++ end: 21,
++ name: {
++ type: "XJSIdentifier",
++ start: 10,
++ end: 14,
++ name: "href"
++ },
++ value: {
++ type: "Literal",
++ start: 15,
++ end: 21,
++ value: "test",
++ raw: "\"test\""
++ }
++ }],
++ name: {
++ type: "XJSIdentifier",
++ start: 8,
++ end: 9,
++ name: "a"
++ },
++ selfClosing: false
++ },
++ closingElement: {
++ type: "XJSClosingElement",
++ start: 26,
++ end: 30,
++ name: {
++ type: "XJSIdentifier",
++ 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"
++ }
++ ]
++ }
++ },
++
++ '<div>{<div {...test} />}</div>': {
++ type: 'ExpressionStatement',
++ start: 0,
++ end: 30,
++ expression: {
++ type: 'XJSElement',
++ start: 0,
++ end: 30,
++ openingElement: {
++ type: 'XJSOpeningElement',
++ start: 0,
++ end: 5,
++ attributes: [],
++ name: {
++ type: 'XJSIdentifier',
++ start: 1,
++ end: 4,
++ name: 'div'
++ },
++ selfClosing: false
++ },
++ closingElement: {
++ type: 'XJSClosingElement',
++ start: 24,
++ end: 30,
++ name: {
++ type: 'XJSIdentifier',
++ start: 26,
++ end: 29,
++ name: 'div'
++ }
++ },
++ children: [{
++ type: 'XJSExpressionContainer',
++ start: 5,
++ end: 24,
++ expression: {
++ type: 'XJSElement',
++ start: 6,
++ end: 23,
++ openingElement: {
++ type: 'XJSOpeningElement',
++ start: 6,
++ end: 23,
++ attributes: [
++ {
++ type: 'XJSSpreadAttribute',
++ start: 11,
++ end: 20,
++ argument: {
++ type: 'Identifier',
++ start: 15,
++ end: 19,
++ name: 'test'
++ }
++ }
++ ],
++ name: {
++ type: 'XJSIdentifier',
++ start: 7,
++ end: 10,
++ name: 'div'
++ },
++ selfClosing: true
++ },
++ closingElement: null,
++ children: []
++ }
++ }]
++ }
++ },
++
++ '<div>{ {a} }</div>': {
++ type: "ExpressionStatement",
++ start: 0,
++ end: 18,
++ expression: {
++ type: "XJSElement",
++ start: 0,
++ end: 18,
++ openingElement: {
++ type: "XJSOpeningElement",
++ start: 0,
++ end: 5,
++ attributes: [],
++ name: {
++ type: "XJSIdentifier",
++ start: 1,
++ end: 4,
++ name: "div"
++ },
++ selfClosing: false
++ },
++ closingElement: {
++ type: "XJSClosingElement",
++ start: 12,
++ end: 18,
++ name: {
++ type: "XJSIdentifier",
++ start: 14,
++ end: 17,
++ name: "div"
++ }
++ },
++ children: [{
++ type: "XJSExpressionContainer",
++ 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"
++ }
++ }]
++ }
++ }]
++ }
++ },
++
++ '<div>/text</div>': {
++ type: "ExpressionStatement",
++ start: 0,
++ end: 16,
++ expression: {
++ type: "XJSElement",
++ start: 0,
++ end: 16,
++ openingElement: {
++ type: "XJSOpeningElement",
++ start: 0,
++ end: 5,
++ attributes: [],
++ name: {
++ type: "XJSIdentifier",
++ start: 1,
++ end: 4,
++ name: "div"
++ },
++ selfClosing: false
++ },
++ closingElement: {
++ type: "XJSClosingElement",
++ start: 10,
++ end: 16,
++ name: {
++ type: "XJSIdentifier",
++ start: 12,
++ end: 15,
++ name: "div"
++ }
++ },
++ children: [{
++ type: "Literal",
++ start: 5,
++ end: 10,
++ value: "/text",
++ raw: "/text"
++ }]
++ }
++ }
++ }
++};
++
++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,
++ locations: true,
++ ranges: true,
++ loose: false
++ });
++ }
++}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-javascript/node-acorn-jsx.git
More information about the Pkg-javascript-commits
mailing list