diff --git a/acorn.js b/acorn.js
index 3169bb3884..53798add98 100644
--- a/acorn.js
+++ b/acorn.js
@@ -789,7 +789,7 @@
// Quotes produce strings.
case 34: case 39: // '"', "'"
- return readString(code);
+ return inXJSTag ? readXJSStringLiteral() : readString(code);
// Operators are parsed inline in tiny state machines. '=' (61) is
// often referred to. `finishOp` simply skips the amount of
@@ -830,6 +830,12 @@
if (options.locations) tokStartLoc = new Position;
if (forceRegexp) return readRegexp();
if (tokPos >= inputLen) return finishToken(_eof);
+ if (inXJSChild) {
+ readXJSText(['<', '{']);
+ if (tokEnd > tokStart) {
+ return;
+ }
+ }
var code = input.charCodeAt(tokPos);
@@ -1051,6 +1057,331 @@
}
}
+ var XHTMLEntities = {
+ quot: '\u0022',
+ amp: '&',
+ apos: '\u0027',
+ lt: '<',
+ gt: '>',
+ nbsp: '\u00A0',
+ iexcl: '\u00A1',
+ cent: '\u00A2',
+ pound: '\u00A3',
+ curren: '\u00A4',
+ yen: '\u00A5',
+ brvbar: '\u00A6',
+ sect: '\u00A7',
+ uml: '\u00A8',
+ copy: '\u00A9',
+ ordf: '\u00AA',
+ laquo: '\u00AB',
+ not: '\u00AC',
+ shy: '\u00AD',
+ reg: '\u00AE',
+ macr: '\u00AF',
+ deg: '\u00B0',
+ plusmn: '\u00B1',
+ sup2: '\u00B2',
+ sup3: '\u00B3',
+ acute: '\u00B4',
+ micro: '\u00B5',
+ para: '\u00B6',
+ middot: '\u00B7',
+ cedil: '\u00B8',
+ sup1: '\u00B9',
+ ordm: '\u00BA',
+ raquo: '\u00BB',
+ frac14: '\u00BC',
+ frac12: '\u00BD',
+ frac34: '\u00BE',
+ iquest: '\u00BF',
+ Agrave: '\u00C0',
+ Aacute: '\u00C1',
+ Acirc: '\u00C2',
+ Atilde: '\u00C3',
+ Auml: '\u00C4',
+ Aring: '\u00C5',
+ AElig: '\u00C6',
+ Ccedil: '\u00C7',
+ Egrave: '\u00C8',
+ Eacute: '\u00C9',
+ Ecirc: '\u00CA',
+ Euml: '\u00CB',
+ Igrave: '\u00CC',
+ Iacute: '\u00CD',
+ Icirc: '\u00CE',
+ Iuml: '\u00CF',
+ ETH: '\u00D0',
+ Ntilde: '\u00D1',
+ Ograve: '\u00D2',
+ Oacute: '\u00D3',
+ Ocirc: '\u00D4',
+ Otilde: '\u00D5',
+ Ouml: '\u00D6',
+ times: '\u00D7',
+ Oslash: '\u00D8',
+ Ugrave: '\u00D9',
+ Uacute: '\u00DA',
+ Ucirc: '\u00DB',
+ Uuml: '\u00DC',
+ Yacute: '\u00DD',
+ THORN: '\u00DE',
+ szlig: '\u00DF',
+ agrave: '\u00E0',
+ aacute: '\u00E1',
+ acirc: '\u00E2',
+ atilde: '\u00E3',
+ auml: '\u00E4',
+ aring: '\u00E5',
+ aelig: '\u00E6',
+ ccedil: '\u00E7',
+ egrave: '\u00E8',
+ eacute: '\u00E9',
+ ecirc: '\u00EA',
+ euml: '\u00EB',
+ igrave: '\u00EC',
+ iacute: '\u00ED',
+ icirc: '\u00EE',
+ iuml: '\u00EF',
+ eth: '\u00F0',
+ ntilde: '\u00F1',
+ ograve: '\u00F2',
+ oacute: '\u00F3',
+ ocirc: '\u00F4',
+ otilde: '\u00F5',
+ ouml: '\u00F6',
+ divide: '\u00F7',
+ oslash: '\u00F8',
+ ugrave: '\u00F9',
+ uacute: '\u00FA',
+ ucirc: '\u00FB',
+ uuml: '\u00FC',
+ yacute: '\u00FD',
+ thorn: '\u00FE',
+ yuml: '\u00FF',
+ OElig: '\u0152',
+ oelig: '\u0153',
+ Scaron: '\u0160',
+ scaron: '\u0161',
+ Yuml: '\u0178',
+ fnof: '\u0192',
+ circ: '\u02C6',
+ tilde: '\u02DC',
+ Alpha: '\u0391',
+ Beta: '\u0392',
+ Gamma: '\u0393',
+ Delta: '\u0394',
+ Epsilon: '\u0395',
+ Zeta: '\u0396',
+ Eta: '\u0397',
+ Theta: '\u0398',
+ Iota: '\u0399',
+ Kappa: '\u039A',
+ Lambda: '\u039B',
+ Mu: '\u039C',
+ Nu: '\u039D',
+ Xi: '\u039E',
+ Omicron: '\u039F',
+ Pi: '\u03A0',
+ Rho: '\u03A1',
+ Sigma: '\u03A3',
+ Tau: '\u03A4',
+ Upsilon: '\u03A5',
+ Phi: '\u03A6',
+ Chi: '\u03A7',
+ Psi: '\u03A8',
+ Omega: '\u03A9',
+ alpha: '\u03B1',
+ beta: '\u03B2',
+ gamma: '\u03B3',
+ delta: '\u03B4',
+ epsilon: '\u03B5',
+ zeta: '\u03B6',
+ eta: '\u03B7',
+ theta: '\u03B8',
+ iota: '\u03B9',
+ kappa: '\u03BA',
+ lambda: '\u03BB',
+ mu: '\u03BC',
+ nu: '\u03BD',
+ xi: '\u03BE',
+ omicron: '\u03BF',
+ pi: '\u03C0',
+ rho: '\u03C1',
+ sigmaf: '\u03C2',
+ sigma: '\u03C3',
+ tau: '\u03C4',
+ upsilon: '\u03C5',
+ phi: '\u03C6',
+ chi: '\u03C7',
+ psi: '\u03C8',
+ omega: '\u03C9',
+ thetasym: '\u03D1',
+ upsih: '\u03D2',
+ piv: '\u03D6',
+ ensp: '\u2002',
+ emsp: '\u2003',
+ thinsp: '\u2009',
+ zwnj: '\u200C',
+ zwj: '\u200D',
+ lrm: '\u200E',
+ rlm: '\u200F',
+ ndash: '\u2013',
+ mdash: '\u2014',
+ lsquo: '\u2018',
+ rsquo: '\u2019',
+ sbquo: '\u201A',
+ ldquo: '\u201C',
+ rdquo: '\u201D',
+ bdquo: '\u201E',
+ dagger: '\u2020',
+ Dagger: '\u2021',
+ bull: '\u2022',
+ hellip: '\u2026',
+ permil: '\u2030',
+ prime: '\u2032',
+ Prime: '\u2033',
+ lsaquo: '\u2039',
+ rsaquo: '\u203A',
+ oline: '\u203E',
+ frasl: '\u2044',
+ euro: '\u20AC',
+ image: '\u2111',
+ weierp: '\u2118',
+ real: '\u211C',
+ trade: '\u2122',
+ alefsym: '\u2135',
+ larr: '\u2190',
+ uarr: '\u2191',
+ rarr: '\u2192',
+ darr: '\u2193',
+ harr: '\u2194',
+ crarr: '\u21B5',
+ lArr: '\u21D0',
+ uArr: '\u21D1',
+ rArr: '\u21D2',
+ dArr: '\u21D3',
+ hArr: '\u21D4',
+ forall: '\u2200',
+ part: '\u2202',
+ exist: '\u2203',
+ empty: '\u2205',
+ nabla: '\u2207',
+ isin: '\u2208',
+ notin: '\u2209',
+ ni: '\u220B',
+ prod: '\u220F',
+ sum: '\u2211',
+ minus: '\u2212',
+ lowast: '\u2217',
+ radic: '\u221A',
+ prop: '\u221D',
+ infin: '\u221E',
+ ang: '\u2220',
+ and: '\u2227',
+ or: '\u2228',
+ cap: '\u2229',
+ cup: '\u222A',
+ 'int': '\u222B',
+ there4: '\u2234',
+ sim: '\u223C',
+ cong: '\u2245',
+ asymp: '\u2248',
+ ne: '\u2260',
+ equiv: '\u2261',
+ le: '\u2264',
+ ge: '\u2265',
+ sub: '\u2282',
+ sup: '\u2283',
+ nsub: '\u2284',
+ sube: '\u2286',
+ supe: '\u2287',
+ oplus: '\u2295',
+ otimes: '\u2297',
+ perp: '\u22A5',
+ sdot: '\u22C5',
+ lceil: '\u2308',
+ rceil: '\u2309',
+ lfloor: '\u230A',
+ rfloor: '\u230B',
+ lang: '\u2329',
+ rang: '\u232A',
+ loz: '\u25CA',
+ spades: '\u2660',
+ clubs: '\u2663',
+ hearts: '\u2665',
+ diams: '\u2666'
+ };
+
+ function readXJSEntity() {
+ var str = '', count = 0, entity;
+ var ch = nextChar();
+ if (ch !== '&') raise(tokPos, "Entity must start with an ampersand");
+ tokPos++;
+ while (tokPos < inputLen && count++ < 10) {
+ ch = input.charAt(tokPos++);
+ if (ch === ';') {
+ break;
+ }
+ str += ch;
+ }
+
+ if (str[0] === '#' && str[1] === 'x') {
+ entity = String.fromCharCode(parseInt(str.substr(2), 16));
+ } else if (str[0] === '#') {
+ entity = String.fromCharCode(parseInt(str.substr(1), 10));
+ } else {
+ entity = XHTMLEntities[str];
+ }
+ return entity;
+ }
+
+ function readXJSText(stopChars) {
+ var str = '';
+ while (tokPos < inputLen) {
+ var ch = nextChar();
+ if (stopChars.indexOf(ch) !== -1) {
+ break;
+ }
+ if (ch === '&') {
+ str += readXJSEntity();
+ } else {
+ ++tokPos;
+ if (ch === '\r' && nextChar() === '\n') {
+ str += ch;
+ ++tokPos;
+ ch = '\n';
+ }
+ if (ch === '\n' && options.locations) {
+ tokLineStart = tokPos;
+ ++tokCurLine;
+ }
+ str += ch;
+ }
+ }
+ return finishToken(_xjsText, str);
+ }
+
+ function readXJSStringLiteral() {
+ var quote = input.charCodeAt(tokPos);
+
+ if (quote !== 34 && quote !== 39) {
+ raise("String literal must starts with a quote");
+ }
+
+ ++tokPos;
+
+ readXJSText([String.fromCharCode(quote)]);
+
+ if (quote !== input.charCodeAt(tokPos)) {
+ unexpected();
+ }
+
+ ++tokPos;
+
+ return finishToken(tokType, tokVal);
+ }
+
// Used to read character escape sequences ('\x', '\u', '\U').
function readHexChar(len) {
@@ -1264,7 +1595,7 @@
// Get following char.
function nextChar() {
- return input[tokPos];
+ return input.charAt(tokPos);
}
// Raise an unexpected token error.
@@ -2636,11 +2967,12 @@
}
} else if (tokVal === '<') {
node = parseXJSElement();
- } else if (tokType === _string) {
+ } else if (tokType === _xjsText) {
node = startNode();
node.value = tokVal;
- finishNode(node, "Literal");
+ node.raw = input.slice(tokStart, tokEnd);
next();
+ finishNode(node, "Literal");
} else {
raise(tokStart, "XJS value should be either an expression or a quoted XJS text");
}
@@ -2690,11 +3022,13 @@
}
function parseXJSChild() {
- if (tokVal === '{') {
+ if (tokType === _braceL) {
return parseXJSExpressionContainer();
} else if (tokType === _xjsText) {
var node = startNode();
node.value = tokVal;
+ node.raw = input.slice(tokStart, tokEnd);
+ next();
return finishNode(node, "Literal");
} else {
return parseXJSElement();
@@ -2755,20 +3089,14 @@
var children = [];
var origInXJSChild = inXJSChild;
- var origInXJSTag = inXJSTag;
var openingElement = parseXJSOpeningElement();
if (!openingElement.selfClosing) {
- while (tokType !== _eof) {
- inXJSChild = false; // Call lookahead2() with inXJSChild = false because should not be considered in the child
- if (tokVal === '<' && nextChar() === '/') {
- break;
- }
- inXJSChild = true;
+ inXJSChild = true;
+ while (tokType !== _eof && !(tokVal === '<' && nextChar() === '/')) {
children.push(parseXJSChild());
}
inXJSChild = origInXJSChild;
- inXJSTag = origInXJSTag;
var closingElement = parseXJSClosingElement();
if (getQualifiedXJSName(closingElement.name) !== getQualifiedXJSName(openingElement.name)) {
raise(
diff --git a/test/tests-jsx.js b/test/tests-jsx.js
index 6f7eaf5eb0..8817d10b97 100644
--- a/test/tests-jsx.js
+++ b/test/tests-jsx.js
@@ -45,6 +45,419 @@ var fbTestFixture = {
end: { line: 1, column: 5 }
}
},
+ '': {
+ 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 }
+ }
+ },
+ 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 }
+ }
+ },
+ 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: '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 }
+ }
+ },
+ 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: "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: "Literal",
+ value: " ",
+ raw: "\" \"",
+ range: [6, 9],
+ loc: {
+ start: { line: 1, column: 6 },
+ end: { line: 1, column: 9 }
+ }
+ },
+ range: [5, 10],
+ loc: {
+ start: { line: 1, column: 5 },
+ end: { line: 1, column: 10 }
+ }
+ },
+ range: [3, 10],
+ loc: {
+ start: { line: 1, column: 3 },
+ end: { line: 1, column: 10 }
+ }
+ },
+ {
+ type: "XJSAttribute",
+ name: {
+ type: "XJSIdentifier",
+ name: "c",
+ range: [11, 12],
+ loc: {
+ start: { line: 1, column: 11 },
+ end: { line: 1, column: 12 }
+ }
+ },
+ value: {
+ type: "Literal",
+ value: " ",
+ raw: "\" \"",
+ range: [13, 16],
+ loc: {
+ start: { line: 1, column: 13 },
+ end: { line: 1, column: 16 }
+ }
+ },
+ range: [11, 16],
+ loc: {
+ start: { line: 1, column: 11 },
+ end: { line: 1, column: 16 }
+ }
+ },
+ {
+ type: "XJSAttribute",
+ name: {
+ type: "XJSIdentifier",
+ name: "d",
+ range: [17, 18],
+ loc: {
+ start: { line: 1, column: 17 },
+ end: { line: 1, column: 18 }
+ }
+ },
+ value: {
+ type: "Literal",
+ value: "&",
+ raw: "\"&\"",
+ range: [19, 26],
+ loc: {
+ start: { line: 1, column: 19 },
+ end: { line: 1, column: 26 }
+ }
+ },
+ range: [17, 26],
+ loc: {
+ start: { line: 1, column: 17 },
+ end: { line: 1, column: 26 }
+ }
+ }
+ ],
+ range: [0, 29],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 29 }
+ }
+ },
+ children: [],
+ range: [0, 29],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 29 }
+ }
+ },
+ range: [0, 29],
+ loc: {
+ start: { line: 1, column: 0 },
+ end: { line: 1, column: 29 }
+ }
+ },
'': {
type: "ExpressionStatement",
expression: {
@@ -223,37 +636,1425 @@ var fbTestFixture = {
column: 11
}
}
+ },
+
+ '\nbar\nbaz\r\n': {
+ 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: [
+ 44,
+ 51
+ ],
+ loc: {
+ start: {
+ line: 5,
+ column: 2
+ },
+ end: {
+ line: 5,
+ column: 9
+ }
+ }
+ },
+ range: [
+ 42,
+ 52
+ ],
+ loc: {
+ start: {
+ line: 5,
+ column: 0
+ },
+ end: {
+ line: 5,
+ column: 10
+ }
+ }
+ },
+ children: [
+ {
+ type: "Literal",
+ value: "\nbar\nbaz\r\n",
+ raw: "\nbar\nbaz\r\n",
+ range: [
+ 32,
+ 42
+ ],
+ loc: {
+ start: {
+ line: 2,
+ column: 23
+ },
+ end: {
+ line: 5,
+ column: 0
+ }
+ }
+ }
+ ],
+ range: [
+ 0,
+ 52
+ ],
+ loc: {
+ start: {
+ line: 1,
+ column: 0
+ },
+ end: {
+ line: 5,
+ column: 10
+ }
+ }
+ },
+ range: [
+ 0,
+ 52
+ ],
+ loc: {
+ start: {
+ line: 1,
+ column: 0
+ },
+ end: {
+ line: 5,
+ column: 10
+ }
+ }
+ },
+
+ ' : } />': {
+ 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
+ }
+ }
+ },
+ 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
+ }
+ }
+ },
+ 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
+ }
+ }
+ },
+ 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: '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 }
+ }
+ },
+
+ '{/* this is a comment */}': {
+ 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 }
+ }
+ },
+
+ '
@test content
': {
+ 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 }
+ }
+ },
+
+ '
7x invalid-js-identifier
': {
+ 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
+ }
+ }
+ },
+ 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": "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
+ }
+ }
+ },
+ "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
+ }
+ }
+ },
+ "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: '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 }
+ }
+ },
+
+ '': {
+ 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:
+ '() < 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 }
+ }
+ },
+ 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 }
+ }
}
}
};
-// patching test data to match acorn-specific format instead of esprima-specific one
-function esprima2acorn(ast, isTopLevel) {
- if ('range' in ast) {
- ast.start = ast.range[0];
- ast.end = ast.range[1];
- delete ast.range;
- }
-
- for (var subPropName in ast) {
- var subProp = ast[subPropName];
- if (typeof subProp === 'object' && subProp !== null) {
- ast[subPropName] = esprima2acorn(subProp);
- }
- }
-
- if (isTopLevel) {
- ast = {
- type: 'Program',
- body: [ast],
- start: ast.start,
- end: ast.end
- };
- }
-
- return ast;
-}
-
for (var code in fbTestFixture.XJS) {
- test(code, esprima2acorn(fbTestFixture.XJS[code], true), {locations: true});
+ test(code, {
+ type: 'Program',
+ body: [fbTestFixture.XJS[code]]
+ }, {locations: true, ranges: true});
}
\ No newline at end of file