[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="&#x0026;&">\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: "\"&#x0026;&\"",
++                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