Merge pull request #11496 (Update webidl2 to v13.0.3)

diff --git a/interfaces/pointerevents-extension.idl b/interfaces/pointerevents-extension.idl
new file mode 100644
index 0000000..63a05a5
--- /dev/null
+++ b/interfaces/pointerevents-extension.idl
@@ -0,0 +1,8 @@
+dictionary PointerEventInit : MouseEventInit {
+    sequence<PointerEvent> coalescedEvents;
+};
+
+[Constructor(DOMString type, optional PointerEventInit eventInitDict)]
+interface PointerEvent : MouseEvent {
+    sequence<PointerEvent> getCoalescedEvents();
+};
diff --git a/pointerevents/extension/idlharness.html b/pointerevents/extension/idlharness.html
index e2835f8..40a441c 100644
--- a/pointerevents/extension/idlharness.html
+++ b/pointerevents/extension/idlharness.html
@@ -35,22 +35,11 @@
 };
 
 </pre>
-
-<pre id='idl'>
-dictionary PointerEventInit : MouseEventInit {
-    sequence<PointerEvent> coalescedEvents;
-};
-
-[Constructor(DOMString type, optional PointerEventInit eventInitDict)]
-interface PointerEvent : MouseEvent {
-    sequence<PointerEvent> getCoalescedEvents();
-};
-
-</pre>
 <script>
 promise_test(async function () {
   const dom = await fetch('/interfaces/dom.idl').then(r => r.text());
   const uievents = await fetch('/interfaces/uievents.idl').then(r => r.text());
+  const idl = await fetch('/interfaces/pointerevents-extension.idl').then(r => r.text());
 
   const idl_array = new IdlArray();
   idl_array.add_untested_idls(dom, { only: ['EventInit'] });
@@ -61,7 +50,7 @@
   });
   idl_array.add_untested_idls(
       document.getElementById("untested_idl").textContent);
-  idl_array.add_idls(document.getElementById("idl").textContent);
+  idl_array.add_idls(idl);
   idl_array.test();
 }, 'pointerevents extension interfaces');
 </script>
diff --git a/resources/test/tests/functional/idlharness/IdlInterface/test_to_json_operation.html b/resources/test/tests/functional/idlharness/IdlInterface/test_to_json_operation.html
index 3d05e9a..ba8cd78 100644
--- a/resources/test/tests/functional/idlharness/IdlInterface/test_to_json_operation.html
+++ b/resources/test/tests/functional/idlharness/IdlInterface/test_to_json_operation.html
@@ -167,7 +167,7 @@
                 "status_string": "FAIL"
             },
             {
-                "message": "assert_true: {\"type\":\"return-type\",\"sequence\":false,\"generic\":null,\"nullable\":false,\"union\":false,\"idlType\":\"DOMException\"} is not an appropriate return value for the toJSON operation of N expected true got false",
+                "message": "assert_true: {\"type\":\"return-type\",\"generic\":null,\"nullable\":false,\"union\":false,\"idlType\":\"DOMException\",\"extAttrs\":[]} is not an appropriate return value for the toJSON operation of N expected true got false",
                 "name": "Test toJSON operation of N",
                 "properties": {},
                 "status_string": "FAIL"
diff --git a/resources/test/tests/unit/basic.html b/resources/test/tests/unit/basic.html
index 7998a2a..7eef4a8 100644
--- a/resources/test/tests/unit/basic.html
+++ b/resources/test/tests/unit/basic.html
@@ -24,7 +24,12 @@
         assert_equals(typeof WebIDL2.parse, "function");
     }, 'WebIDL2 namespace should have a parse method');
     test(function() {
-        assert_throws(new TypeError(), function() {  WebIDL2.parse("I'm a syntax error"); });
+        try {
+            WebIDL2.parse("I'm a syntax error");
+            throw new Error("Web IDL didn't throw");
+        } catch (e) {
+            assert_true(e.constructor.name === "WebIDLParseError");
+        }
     }, 'WebIDL2 parse method should bail on incorrect WebIDL');
     test(function() {
         assert_equals(typeof WebIDL2.parse("interface Foo {};"), "object");
diff --git a/resources/webidl2/.gitmodules b/resources/webidl2/.gitmodules
deleted file mode 100644
index a3f5485..0000000
--- a/resources/webidl2/.gitmodules
+++ /dev/null
@@ -1,3 +0,0 @@
-[submodule "test/widlproc"]
-	path = test/widlproc
-	url = https://github.com/dontcallmedom/widlproc.git
diff --git a/resources/webidl2/CHANGELOG.md b/resources/webidl2/CHANGELOG.md
index 1596d71..91e2227 100644
--- a/resources/webidl2/CHANGELOG.md
+++ b/resources/webidl2/CHANGELOG.md
@@ -1,5 +1,13 @@
 # Change Log
 
+## [v10.2.1](https://github.com/w3c/webidl2.js/tree/v10.2.1) (2018-03-09)
+[Full Changelog](https://github.com/w3c/webidl2.js/compare/v10.2.0...v10.2.1)
+
+**Merged pull requests:**
+
+- Optimise tokenisation and whitespace skipping [\#139](https://github.com/w3c/webidl2.js/pull/139) ([ricea](https://github.com/ricea))
+- refactor: small syntax changes [\#137](https://github.com/w3c/webidl2.js/pull/137) ([saschanaz](https://github.com/saschanaz))
+
 ## [v10.2.0](https://github.com/w3c/webidl2.js/tree/v10.2.0) (2018-01-30)
 [Full Changelog](https://github.com/w3c/webidl2.js/compare/v10.1.0...v10.2.0)
 
diff --git a/resources/webidl2/README.md b/resources/webidl2/README.md
index 8791360..9a8f3f8 100644
--- a/resources/webidl2/README.md
+++ b/resources/webidl2/README.md
@@ -45,23 +45,6 @@
 </script>
 ```
 
-### Advanced Parsing
-
-`parse()` can optionally accept a second parameter, an options object, which can be used to
-modify parsing behavior.
-
-The following options are recognized:
-```JS
-{
-  allowNestedTypedefs: false
-}
-```
-
-And their meanings are as follows:
-
-* `allowNestedTypedefs`: Boolean indicating whether the parser should accept `typedef`s as valid members of `interface`s.
-This is non-standard syntax and therefore the default is `false`.
-
 ### Errors
 
 When there is a syntax error in the WebIDL, it throws an exception object with the following
@@ -93,17 +76,18 @@
 
 ```JS
 {
-  "sequence": false,
+  "type": "attribute-type",
   "generic": null,
-  "idlType": "void",
+  "idlType": "unsigned short",
   "nullable": false,
   "union": false,
+  "extAttrs": [...]
 }
 ```
 
 Where the fields are as follows:
 
-* `sequence`: Boolean indicating if it is a sequence. Same as `generic === "sequence"`.
+* `type`: String indicating where this type is used. Can be `null` if not applicable.
 * `generic`: String indicating the generic type (e.g. "Promise", "sequence"). `null`
   otherwise.
 * `idlType`: Can be different things depending on context. In most cases, this will just
@@ -113,6 +97,7 @@
   description for the type in the sequence, the eventual value of the promise, etc.
 * `nullable`: Boolean indicating whether this is nullable or not.
 * `union`: Boolean indicating whether this is a union type or not.
+* `extAttrs`: A list of [extended attributes](#extended-attributes).
 
 ### Interface
 
@@ -211,11 +196,13 @@
   "type": "callback",
   "name": "AsyncOperationCallback",
   "idlType": {
+    "type": "return-type",
     "sequence": false,
     "generic": null,
     "nullable": false,
     "union": false,
-    "idlType": "void"
+    "idlType": "void",
+    "extAttrs": []
   },
   "arguments": [...],
   "extAttrs": []
@@ -244,11 +231,13 @@
     "name": "fillPattern",
     "required": false,
     "idlType": {
+      "type": "dictionary-type",
       "sequence": false,
       "generic": null,
       "nullable": true,
       "union": false,
-      "idlType": "DOMString"
+      "idlType": "DOMString",
+      "extAttrs": [...]
     },
     "extAttrs": [],
     "default": {
@@ -311,17 +300,21 @@
 {
   "type": "typedef",
   "idlType": {
+    "type": "typedef-type",
     "sequence": true,
     "generic": "sequence",
     "nullable": false,
     "union": false,
     "idlType": {
+      "type": "typedef-type",
       "sequence": false,
       "generic": null,
       "nullable": false,
       "union": false,
-      "idlType": "Point"
-    }
+      "idlType": "Point",
+      "extAttrs": [...]
+    },
+    "extAttrs": [...]
   },
   "name": "PointSequence",
   "extAttrs": []
@@ -388,11 +381,13 @@
   "static": false,
   "stringifier": false,
   "idlType": {
+    "type": "return-type",
     "sequence": false,
     "generic": null,
     "nullable": false,
     "union": false,
-    "idlType": "void"
+    "idlType": "void",
+    "extAttrs": []
   },
   "name": "intersection",
   "arguments": [{
@@ -400,11 +395,13 @@
     "variadic": true,
     "extAttrs": [],
     "idlType": {
+      "type": "argument-type",
       "sequence": false,
       "generic": null,
       "nullable": false,
       "union": false,
-      "idlType": "long"
+      "idlType": "long",
+      "extAttrs": [...]
     },
     "name": "ints"
   }],
@@ -437,11 +434,13 @@
   "inherit": false,
   "readonly": false,
   "idlType": {
+    "type": "attribute-type",
     "sequence": false,
     "generic": null,
     "nullable": false,
     "union": false,
-    "idlType": "RegExp"
+    "idlType": "RegExp",
+    "extAttrs": [...]
   },
   "name": "regexp",
   "extAttrs": []
@@ -467,7 +466,15 @@
 {
   "type": "const",
   "nullable": false,
-  "idlType": "boolean",
+  "idlType": {
+    "type": "const-type",
+    "sequence": false,
+    "generic": null,
+    "nullable": false,
+    "union": false,
+    "idlType": "boolean"
+    "extAttrs": []
+  },
   "name": "DEBUG",
   "value": {
     "type": "boolean",
@@ -481,7 +488,7 @@
 
 * `type`: Always "const".
 * `nullable`: Whether its type is nullable.
-* `idlType`: The type of the constant (a simple type, the type name).
+* `idlType`: An [IDL Type](#idl-type) of the constant that represents a simple type, the type name.
 * `name`: The name of the constant.
 * `value`: The constant value as described by [Const Values](#default-and-const-values)
 * `extAttrs`: A list of [extended attributes](#extended-attributes).
@@ -497,11 +504,13 @@
     "variadic": true,
     "extAttrs": [],
     "idlType": {
+      "type": "argument-type",
       "sequence": false,
       "generic": null,
       "nullable": false,
       "union": false,
-      "idlType": "long"
+      "idlType": "long",
+      "extAttrs": [...]
     },
     "name": "ints"
   }]
@@ -546,8 +555,6 @@
 * `type`: Always `"extended-attribute"`.
 * `rhs`: If there is a right-hand side, this will capture its `type` (which can be
   "identifier" or "identifier-list") and its `value`.
-* `typePair`: If the extended attribute is a `MapClass` this will capture the
-  map's key type and value type respectively.
 
 ### Default and Const Values
 
@@ -587,14 +594,6 @@
 
 ## Testing
 
-In order to run the tests you need to ensure that the widlproc submodule inside `test` is
-initialized and up to date:
-
-```Bash
-git submodule init
-git submodule update
-```
-
 ### Running
 
 The test runs with mocha and expect.js. Normally, running mocha in the root directory
diff --git a/resources/webidl2/checker/index.html b/resources/webidl2/checker/index.html
new file mode 100644
index 0000000..9897d85
--- /dev/null
+++ b/resources/webidl2/checker/index.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>WebIDL 2 Checker</title>
+
+<script src='../lib/webidl2.js'></script>
+<script>
+let parserResult = undefined;
+
+function formatParserOutput() {
+  const outputEl = document.getElementById('webidl-checker-output');
+  if (parserResult) {
+    const prettyPrintEl = document.getElementById('pretty-print');
+    outputEl.innerText = JSON.stringify(parserResult, null, prettyPrintEl.checked ? 2 : null);
+  } else {
+    outputEl.innerText = '';
+  }
+}
+
+function checkWebIDL(textToCheck) {
+  const validation = document.getElementById('webidl-checker-validation');
+  parserResult = null;
+  try {
+    parserResult = WebIDL2.parse(textToCheck);
+    validation.innerText = 'WebIDL parsed successfully!';
+  } catch (e) {
+    validation.innerText = 'Exception while parsing WebIDL. See JavaScript console for more details.\n\n' + e.toString();
+    // Pass it along to the JavaScript console.
+    throw e;
+  } finally {
+    formatParserOutput();
+  }
+}
+</script>
+<style>
+textarea {
+  font-family: monospace;
+}
+</style>
+</head>
+<body>
+<h2>WebIDL Checker</h2>
+<p>This is an online checker for WebIDL built on the <a href="https://github.com/w3c/webidl2.js">webidl2.js</a> project.</p>
+<p>Enter your WebIDL to check below:</p>
+<textarea id='webidl-to-check' rows='20' cols='80'></textarea>
+<br>
+<input type='button' value='Check WebIDL' onclick='checkWebIDL(document.getElementById("webidl-to-check").value)'>
+<p>Validation results:</p>
+<textarea id='webidl-checker-validation' rows='20' cols='80'></textarea>
+<p>Parser output:</p>
+<textarea id='webidl-checker-output' rows='20' cols='80'></textarea>
+<br>
+<input type='checkbox' id='pretty-print' checked='true' onchange='formatParserOutput()'>Pretty Print
+</body>
+</html>
diff --git a/resources/webidl2/lib/webidl2.js b/resources/webidl2/lib/webidl2.js
index a7a61d9..ef519c0 100644
--- a/resources/webidl2/lib/webidl2.js
+++ b/resources/webidl2/lib/webidl2.js
@@ -8,67 +8,132 @@
     // against integers early.
     "float": /-?(?=[0-9]*\.|[0-9]+[eE])(([0-9]+\.[0-9]*|[0-9]*\.[0-9]+)([Ee][-+]?[0-9]+)?|[0-9]+[Ee][-+]?[0-9]+)/y,
     "integer": /-?(0([Xx][0-9A-Fa-f]+|[0-7]*)|[1-9][0-9]*)/y,
-    "identifier": /[A-Z_a-z][0-9A-Z_a-z-]*/y,
+    "identifier": /_?[A-Za-z][0-9A-Z_a-z-]*/y,
     "string": /"[^"]*"/y,
     "whitespace": /[\t\n\r ]+/y,
     "comment": /((\/(\/.*|\*([^*]|\*[^\/])*\*\/)[\t\n\r ]*)+)/y,
-    "other": /[^\t\n\r 0-9A-Z_a-z]/y
+    "other": /[^\t\n\r 0-9A-Za-z]/y
   };
 
-  function attemptTokenMatch(str, type, re, lastIndex, tokens) {
-    re.lastIndex = lastIndex;
-    const result = re.exec(str);
-    if (result) {
-      tokens.push({ type, value: result[0] });
-      return re.lastIndex;
-    }
-    return -1;
-  }
+  const stringTypes = [
+    "ByteString",
+    "DOMString",
+    "USVString"
+  ];
+
+  const argumentNameKeywords = [
+    "attribute",
+    "callback",
+    "const",
+    "deleter",
+    "dictionary",
+    "enum",
+    "getter",
+    "includes",
+    "inherit",
+    "interface",
+    "iterable",
+    "maplike",
+    "namespace",
+    "partial",
+    "required",
+    "setlike",
+    "setter",
+    "static",
+    "stringifier",
+    "typedef",
+    "unrestricted"
+  ];
+
+  const nonRegexTerminals = [
+    "FrozenArray",
+    "Infinity",
+    "NaN",
+    "Promise",
+    "boolean",
+    "byte",
+    "double",
+    "false",
+    "float",
+    "implements",
+    "legacyiterable",
+    "long",
+    "mixin",
+    "null",
+    "octet",
+    "optional",
+    "or",
+    "readonly",
+    "record",
+    "sequence",
+    "short",
+    "true",
+    "unsigned",
+    "void"
+  ].concat(argumentNameKeywords, stringTypes);
+
+  const punctuations = [
+    "(",
+    ")",
+    ",",
+    "-Infinity",
+    "...",
+    ":",
+    ";",
+    "<",
+    "=",
+    ">",
+    "?",
+    "[",
+    "]",
+    "{",
+    "}"
+  ];
 
   function tokenise(str) {
     const tokens = [];
     let lastIndex = 0;
+    let trivia = "";
     while (lastIndex < str.length) {
       const nextChar = str.charAt(lastIndex);
       let result = -1;
-      if (/[-0-9.]/.test(nextChar)) {
-        result = attemptTokenMatch(str, "float", tokenRe.float, lastIndex,
-                                   tokens);
+
+      if (/[\t\n\r ]/.test(nextChar)) {
+        result = attemptTokenMatch("whitespace", { noFlushTrivia: true });
+      } else if (nextChar === '/') {
+        result = attemptTokenMatch("comment", { noFlushTrivia: true });
+      }
+
+      if (result !== -1) {
+        trivia += tokens.pop().value;
+      } else if (/[-0-9.]/.test(nextChar)) {
+        result = attemptTokenMatch("float");
         if (result === -1) {
-          result = attemptTokenMatch(str, "integer", tokenRe.integer, lastIndex,
-                                     tokens);
-        }
-        if (result === -1) {
-          // '-' and '.' can also match "other".
-          result = attemptTokenMatch(str, "other", tokenRe.other,
-                                     lastIndex, tokens);
+          result = attemptTokenMatch("integer");
         }
       } else if (/[A-Z_a-z]/.test(nextChar)) {
-        result = attemptTokenMatch(str, "identifier", tokenRe.identifier,
-                                   lastIndex, tokens);
+        result = attemptTokenMatch("identifier");
+        const token = tokens[tokens.length - 1];
+        if (result !== -1 && nonRegexTerminals.includes(token.value)) {
+          token.type = token.value;
+        }
       } else if (nextChar === '"') {
-        result = attemptTokenMatch(str, "string", tokenRe.string,
-                                   lastIndex, tokens);
-        if (result === -1) {
-          // '"' can also match "other".
-          result = attemptTokenMatch(str, "other", tokenRe.other,
-                                     lastIndex, tokens);
+        result = attemptTokenMatch("string");
+      }
+
+      for (const punctuation of punctuations) {
+        if (str.startsWith(punctuation, lastIndex)) {
+          tokens.push({ type: punctuation, value: punctuation, trivia });
+          trivia = "";
+          lastIndex += punctuation.length;
+          result = lastIndex;
+          break;
         }
-      } else if (/[\t\n\r ]/.test(nextChar)) {
-        result = attemptTokenMatch(str, "whitespace", tokenRe.whitespace,
-                                   lastIndex, tokens);
-      } else if (nextChar === '/') {
-        // The parser expects comments to be labelled as "whitespace".
-        result = attemptTokenMatch(str, "whitespace", tokenRe.comment,
-                                   lastIndex, tokens);
-        if (result === -1) {
-          // '/' can also match "other".
-          result = attemptTokenMatch(str, "other", tokenRe.other,
-                                     lastIndex, tokens);
-        }
-      } else {
-        result = attemptTokenMatch(str, "other", tokenRe.other,
-                                   lastIndex, tokens);
+      }
+
+      // other as the last try
+      if (result === -1) {
+        result = attemptTokenMatch("other");
       }
       if (result === -1) {
         throw new Error("Token stream not progressing");
@@ -76,6 +141,20 @@
       lastIndex = result;
     }
     return tokens;
+
+    function attemptTokenMatch(type, { noFlushTrivia } = {}) {
+      const re = tokenRe[type];
+      re.lastIndex = lastIndex;
+      const result = re.exec(str);
+      if (result) {
+        tokens.push({ type, value: result[0], trivia });
+        if (!noFlushTrivia) {
+          trivia = "";
+        }
+        return re.lastIndex;
+      }
+      return -1;
+    }
   }
 
   class WebIDLParseError {
@@ -87,11 +166,13 @@
     }
 
     toString() {
-      return `${this.message}, line ${this.line} (tokens: '${this.input}')\n${JSON.stringify(this.tokens, null, 4)}`;
+      const escapedInput = JSON.stringify(this.input);
+      const tokens = JSON.stringify(this.tokens, null, 4);
+      return `${this.message}, line ${this.line} (tokens: ${escapedInput})\n${tokens}`;
     }
   }
 
-  function parse(tokens, opt) {
+  function parse(tokens) {
     let line = 1;
     tokens = tokens.slice();
     const names = new Map();
@@ -112,15 +193,24 @@
       stringifier: false
     });
 
+    const EMPTY_IDLTYPE = Object.freeze({
+      generic: null,
+      nullable: false,
+      union: false,
+      idlType: null,
+      extAttrs: []
+    });
+
     function error(str) {
-      let tok = "";
-      let numTokens = 0;
       const maxTokens = 5;
-      while (numTokens < maxTokens && tokens.length > numTokens) {
-        tok += tokens[numTokens].value;
-        numTokens++;
+      const tok = tokens
+        .slice(consume_position, consume_position + maxTokens)
+        .map(t => t.trivia + t.value).join("");
+      // Count newlines preceding the actual erroneous token
+      if (tokens.length) {
+        line += count(tokens[consume_position].trivia, "\n");
       }
-      
+
       let message;
       if (current) {
         message = `Got an error during or right after parsing \`${current.partial ? "partial " : ""}${current.type} ${current.name}\`: ${str}`
@@ -141,15 +231,31 @@
       return name;
     }
 
-    let last_token = null;
+    let consume_position = 0;
 
-    function consume(type, value) {
-      if (!tokens.length || tokens[0].type !== type) return;
-      if (typeof value === "undefined" || tokens[0].value === value) {
-        last_token = tokens.shift();
-        if (type === ID && last_token.value.startsWith('_'))
-          last_token.value = last_token.value.substring(1);
-        return last_token;
+    function probe(type) {
+      return tokens.length > consume_position && tokens[consume_position].type === type;
+    }
+
+    function consume(...candidates) {
+      // TODO: use const when Servo updates its JS engine
+      for (let type of candidates) {
+        if (!probe(type)) continue;
+        const token = tokens[consume_position];
+        consume_position++;
+        line += count(token.trivia, "\n");
+        return token;
+      }
+    }
+
+    function unescape(identifier) {
+      return identifier.startsWith('_') ? identifier.slice(1) : identifier;
+    }
+
+    function unconsume(position) {
+      while (consume_position > position) {
+        consume_position--;
+        line -= count(tokens[consume_position].trivia, "\n");
       }
     }
 
@@ -161,65 +267,13 @@
       return total;
     }
 
-    function ws() {
-      if (!tokens.length) return;
-      if (tokens[0].type === "whitespace") {
-        const t = tokens.shift();
-        line += count(t.value, '\n');
-        return t;
-      }
-    }
-
-    const all_ws_re = {
-      "ws": /([\t\n\r ]+)/y,
-      "line-comment": /\/\/(.*)\r?\n?/y,
-      "multiline-comment": /\/\*((?:[^*]|\*[^/])*)\*\//y
-    };
-    function all_ws(store, pea) { // pea == post extended attribute, tpea = same for types
-      const t = { type: "whitespace", value: "" };
-      while (true) {
-        const w = ws();
-        if (!w) break;
-        t.value += w.value;
-      }
-      if (t.value.length > 0) {
-        if (store) {
-          let w = t.value;
-          let lastIndex = 0;
-          while (lastIndex < w.length) {
-            let matched = false;
-            // Servo doesn't support using "const" in this construction yet.
-            // See https://github.com/servo/servo/issues/20231.
-            // |type| can be made const once Servo supports it.
-            for (let type in all_ws_re) {
-              const re = all_ws_re[type];
-              re.lastIndex = lastIndex;
-              const result = re.exec(w);
-              if (result) {
-                store.push({ type: type + (pea ? ("-" + pea) : ""), value: result[1] });
-                matched = true;
-                lastIndex = re.lastIndex;
-                break;
-              }
-            }
-            if (!matched)
-              throw new Error("Surprising white space construct."); // this shouldn't happen
-          }
-        }
-        return t;
-      }
-    }
-
     function integer_type() {
       let ret = "";
-      all_ws();
-      if (consume(ID, "unsigned")) ret = "unsigned ";
-      all_ws();
-      if (consume(ID, "short")) return ret + "short";
-      if (consume(ID, "long")) {
+      if (consume("unsigned")) ret = "unsigned ";
+      if (consume("short")) return ret + "short";
+      if (consume("long")) {
         ret += "long";
-        all_ws();
-        if (consume(ID, "long")) return ret + " long";
+        if (consume("long")) return ret + " long";
         return ret;
       }
       if (ret) error("Failed to parse integer type");
@@ -227,91 +281,85 @@
 
     function float_type() {
       let ret = "";
-      all_ws();
-      if (consume(ID, "unrestricted")) ret = "unrestricted ";
-      all_ws();
-      if (consume(ID, "float")) return ret + "float";
-      if (consume(ID, "double")) return ret + "double";
+      if (consume("unrestricted")) ret = "unrestricted ";
+      if (consume("float")) return ret + "float";
+      if (consume("double")) return ret + "double";
       if (ret) error("Failed to parse float type");
     }
 
     function primitive_type() {
       const num_type = integer_type() || float_type();
       if (num_type) return num_type;
-      all_ws();
-      if (consume(ID, "boolean")) return "boolean";
-      if (consume(ID, "byte")) return "byte";
-      if (consume(ID, "octet")) return "octet";
+      if (consume("boolean")) return "boolean";
+      if (consume("byte")) return "byte";
+      if (consume("octet")) return "octet";
     }
 
     function const_value() {
-      if (consume(ID, "true")) return { type: "boolean", value: true };
-      if (consume(ID, "false")) return { type: "boolean", value: false };
-      if (consume(ID, "null")) return { type: "null" };
-      if (consume(ID, "Infinity")) return { type: "Infinity", negative: false };
-      if (consume(ID, "NaN")) return { type: "NaN" };
-      const ret = consume(FLOAT) || consume(INT);
+      if (consume("true")) return { type: "boolean", value: true };
+      if (consume("false")) return { type: "boolean", value: false };
+      if (consume("null")) return { type: "null" };
+      if (consume("Infinity")) return { type: "Infinity", negative: false };
+      if (consume("-Infinity")) return { type: "Infinity", negative: true };
+      if (consume("NaN")) return { type: "NaN" };
+      const ret = consume(FLOAT, INT);
       if (ret) return { type: "number", value: ret.value };
-      const tok = consume(OTHER, "-");
-      if (tok) {
-        if (consume(ID, "Infinity")) return { type: "Infinity", negative: true };
-        else tokens.unshift(tok);
-      }
     }
 
     function type_suffix(obj) {
-      while (true) {
-        all_ws();
-        if (consume(OTHER, "?")) {
-          if (obj.nullable) error("Can't nullable more than once");
-          obj.nullable = true;
-        } else return;
+      obj.nullable = !!consume("?");
+      if (probe("?")) error("Can't nullable more than once");
+    }
+
+    function generic_type(typeName) {
+      const name = consume("FrozenArray", "Promise", "sequence", "record");
+      if (!name) {
+        return;
       }
+      const ret = { generic: name.type };
+      consume("<") || error(`No opening bracket after ${name.type}`);
+      switch (name.type) {
+        case "Promise":
+          if (probe("[")) error("Promise type cannot have extended attribute");
+          ret.idlType = return_type(typeName);
+          break;
+        case "sequence":
+        case "FrozenArray":
+          ret.idlType = type_with_extended_attributes(typeName);
+          break;
+        case "record":
+          if (probe("[")) error("Record key cannot have extended attribute");
+          ret.idlType = [];
+          const keyType = consume(...stringTypes);
+          if (!keyType) error(`Record key must be a string type`);
+          ret.idlType.push(Object.assign({ type: typeName }, EMPTY_IDLTYPE, { idlType: keyType.value }));
+          consume(",") || error("Missing comma after record key type");
+          const valueType = type_with_extended_attributes(typeName) || error("Error parsing generic type record");
+          ret.idlType.push(valueType);
+          break;
+      }
+      if (!ret.idlType) error(`Error parsing generic type ${name.type}`);
+      consume(">") || error(`Missing closing bracket after ${name.type}`);
+      if (name.type === "Promise" && probe("?")) {
+        error("Promise type cannot be nullable");
+      }
+      type_suffix(ret);
+      return ret;
     }
 
     function single_type(typeName) {
+      const ret = Object.assign({ type: typeName || null }, EMPTY_IDLTYPE);
+      const generic = generic_type(typeName);
+      if (generic) {
+        return Object.assign(ret, generic);
+      }
       const prim = primitive_type();
-      const ret = { type: typeName || null, sequence: false, generic: null, nullable: false, union: false };
       let name;
-      let value;
       if (prim) {
         ret.idlType = prim;
-      } else if (name = consume(ID)) {
-        value = name.value;
-        all_ws();
-        // Generic types
-        if (consume(OTHER, "<")) {
-          // backwards compat
-          if (value === "sequence") {
-            ret.sequence = true;
-          }
-          ret.generic = value;
-          const types = [];
-          do {
-            all_ws();
-            types.push(type_with_extended_attributes(typeName) || error("Error parsing generic type " + value));
-            all_ws();
-          }
-          while (consume(OTHER, ","));
-          if (value === "sequence") {
-            if (types.length !== 1) error("A sequence must have exactly one subtype");
-          } else if (value === "record") {
-            if (types.length !== 2) error("A record must have exactly two subtypes");
-            if (!/^(DOMString|USVString|ByteString)$/.test(types[0].idlType)) {
-              error("Record key must be DOMString, USVString, or ByteString");
-            }
-            if (types[0].extAttrs) error("Record key cannot have extended attribute");
-          } else if (value === "Promise") {
-            if (types[0].extAttrs) error("Promise type cannot have extended attribute");
-          }
-          ret.idlType = types.length === 1 ? types[0] : types;
-          all_ws();
-          if (!consume(OTHER, ">")) error("Unterminated generic type " + value);
-          type_suffix(ret);
-          return ret;
-        } else {
-          ret.idlType = value;
-        }
+      } else if (name = consume(ID, ...stringTypes)) {
+        ret.idlType = name.value;
+        if (probe("<")) error(`Unsupported generic type ${name.value}`);
       } else {
         return;
       }
@@ -321,18 +369,16 @@
     }
 
     function union_type(typeName) {
-      all_ws();
-      if (!consume(OTHER, "(")) return;
-      const ret = { type: typeName || null, sequence: false, generic: null, nullable: false, union: true, idlType: [] };
-      const fst = type_with_extended_attributes() || error("Union type with no content");
-      ret.idlType.push(fst);
-      while (true) {
-        all_ws();
-        if (!consume(ID, "or")) break;
-        const typ = type_with_extended_attributes() || error("No type after 'or' in union type");
+      if (!consume("(")) return;
+      const ret = Object.assign({ type: typeName || null }, EMPTY_IDLTYPE, { union: true, idlType: [] });
+      do {
+        const typ = type_with_extended_attributes() || error("No type after open parenthesis or 'or' in union type");
         ret.idlType.push(typ);
+      } while (consume("or"));
+      if (ret.idlType.length < 2) {
+        error("At least two types are expected in a union type but found less");
       }
-      if (!consume(OTHER, ")")) error("Unterminated union type");
+      if (!consume(")")) error("Unterminated union type");
       type_suffix(ret);
       return ret;
     }
@@ -348,236 +394,173 @@
       return ret;
     }
 
-    function argument(store) {
-      const ret = { optional: false, variadic: false };
-      ret.extAttrs = extended_attrs(store);
-      all_ws(store, "pea");
-      const opt_token = consume(ID, "optional");
+    function argument() {
+      const start_position = consume_position;
+      const ret = { optional: false, variadic: false, default: null };
+      ret.extAttrs = extended_attrs();
+      const opt_token = consume("optional");
       if (opt_token) {
         ret.optional = true;
-        all_ws();
       }
       ret.idlType = type_with_extended_attributes("argument-type");
       if (!ret.idlType) {
-        if (opt_token) tokens.unshift(opt_token);
+        unconsume(start_position);
         return;
       }
-      const type_token = last_token;
-      if (!ret.optional) {
-        all_ws();
-        if (tokens.length >= 3 &&
-          tokens[0].type === "other" && tokens[0].value === "." &&
-          tokens[1].type === "other" && tokens[1].value === "." &&
-          tokens[2].type === "other" && tokens[2].value === "."
-        ) {
-          tokens.shift();
-          tokens.shift();
-          tokens.shift();
-          ret.variadic = true;
-        }
+      if (!ret.optional && consume("...")) {
+        ret.variadic = true;
       }
-      all_ws();
-      const name = consume(ID);
+      const name = consume(ID, ...argumentNameKeywords);
       if (!name) {
-        if (opt_token) tokens.unshift(opt_token);
-        tokens.unshift(type_token);
+        unconsume(start_position);
         return;
       }
-      ret.name = name.value;
+      ret.name = unescape(name.value);
+      ret.escapedName = name.value;
       if (ret.optional) {
-        all_ws();
-        const dflt = default_();
-        if (typeof dflt !== "undefined") {
-          ret["default"] = dflt;
-        }
+        ret.default = default_() || null;
       }
       return ret;
     }
 
-    function argument_list(store) {
+    function argument_list() {
       const ret = [];
-      const arg = argument(store ? ret : null);
-      if (!arg) return;
+      const arg = argument();
+      if (!arg) return ret;
       ret.push(arg);
       while (true) {
-        all_ws(store ? ret : null);
-        if (!consume(OTHER, ",")) return ret;
-        const nxt = argument(store ? ret : null) || error("Trailing comma in arguments list");
+        if (!consume(",")) return ret;
+        const nxt = argument() || error("Trailing comma in arguments list");
         ret.push(nxt);
       }
     }
 
-    function simple_extended_attr(store) {
-      all_ws();
+    function simple_extended_attr() {
       const name = consume(ID);
       if (!name) return;
       const ret = {
         name: name.value,
-        "arguments": null,
+        arguments: null,
         type: "extended-attribute",
         rhs: null
       };
-      all_ws();
-      const eq = consume(OTHER, "=");
+      const eq = consume("=");
       if (eq) {
-        all_ws();
-        ret.rhs = consume(ID) ||
-          consume(FLOAT) ||
-          consume(INT) ||
-          consume(STR);
-        if (!ret.rhs && consume(OTHER, "(")) {
+        ret.rhs = consume(ID, FLOAT, INT, STR);
+        if (ret.rhs) {
+          // No trivia exposure yet
+          ret.rhs.trivia = undefined;
+        }
+      }
+      if (consume("(")) {
+        if (eq && !ret.rhs) {
           // [Exposed=(Window,Worker)]
-          const rhs_list = [];
-          const id = consume(ID);
-          if (id) {
-            rhs_list.push(id.value);
-          }
-          identifiers(rhs_list);
-          consume(OTHER, ")") || error("Unexpected token in extended attribute argument list or type pair");
           ret.rhs = {
             type: "identifier-list",
-            value: rhs_list
+            value: identifiers()
           };
         }
-        if (!ret.rhs) return error("No right hand side to extended attribute assignment");
-      }
-      all_ws();
-      if (consume(OTHER, "(")) {
-        let args, pair;
-        // [Constructor(DOMString str)]
-        if (args = argument_list(store)) {
-          ret["arguments"] = args;
-        }
-        // [Constructor()]
         else {
-          ret["arguments"] = [];
+          // [NamedConstructor=Audio(DOMString src)] or [Constructor(DOMString str)]
+          ret.arguments = argument_list();
         }
-        all_ws();
-        consume(OTHER, ")") || error("Unexpected token in extended attribute argument list");
+        consume(")") || error("Unexpected token in extended attribute argument list");
       }
+      if (eq && !ret.rhs) error("No right hand side to extended attribute assignment");
       return ret;
     }
 
     // Note: we parse something simpler than the official syntax. It's all that ever
     // seems to be used
-    function extended_attrs(store) {
+    function extended_attrs() {
       const eas = [];
-      all_ws(store);
-      if (!consume(OTHER, "[")) return eas;
-      eas[0] = simple_extended_attr(store) || error("Extended attribute with not content");
-      all_ws();
-      while (consume(OTHER, ",")) {
-        if (eas.length) {
-          eas.push(simple_extended_attr(store));
-        } else {
-          eas.push(simple_extended_attr(store) || error("Trailing comma in extended attribute"));
-        }
+      if (!consume("[")) return eas;
+      eas[0] = simple_extended_attr() || error("Extended attribute with not content");
+      while (consume(",")) {
+        eas.push(simple_extended_attr() || error("Trailing comma in extended attribute"));
       }
-      all_ws();
-      consume(OTHER, "]") || error("No end of extended attribute");
+      consume("]") || error("No end of extended attribute");
       return eas;
     }
 
     function default_() {
-      all_ws();
-      if (consume(OTHER, "=")) {
-        all_ws();
+      if (consume("=")) {
         const def = const_value();
         if (def) {
           return def;
-        } else if (consume(OTHER, "[")) {
-          if (!consume(OTHER, "]")) error("Default sequence value must be empty");
+        } else if (consume("[")) {
+          if (!consume("]")) error("Default sequence value must be empty");
           return { type: "sequence", value: [] };
         } else {
           const str = consume(STR) || error("No value for default");
           str.value = str.value.slice(1, -1);
+          // No trivia exposure yet
+          str.trivia = undefined;
           return str;
         }
       }
     }
 
-    function const_(store) {
-      all_ws(store, "pea");
-      if (!consume(ID, "const")) return;
+    function const_() {
+      if (!consume("const")) return;
       const ret = { type: "const", nullable: false };
-      all_ws();
       let typ = primitive_type();
       if (!typ) {
         typ = consume(ID) || error("No type for const");
         typ = typ.value;
       }
-      ret.idlType = { type: "const-type", idlType: typ };
-      all_ws();
-      if (consume(OTHER, "?")) {
-        ret.nullable = true;
-        all_ws();
-      }
+      ret.idlType = Object.assign({ type: "const-type" }, EMPTY_IDLTYPE, { idlType: typ });
+      type_suffix(ret);
       const name = consume(ID) || error("No name for const");
       ret.name = name.value;
-      all_ws();
-      consume(OTHER, "=") || error("No value assignment for const");
-      all_ws();
+      consume("=") || error("No value assignment for const");
       const cnt = const_value();
       if (cnt) ret.value = cnt;
       else error("No value for const");
-      all_ws();
-      consume(OTHER, ";") || error("Unterminated const");
+      consume(";") || error("Unterminated const");
       return ret;
     }
 
     function inheritance() {
-      all_ws();
-      if (consume(OTHER, ":")) {
-        all_ws();
+      if (consume(":")) {
         const inh = consume(ID) || error("No type in inheritance");
         return inh.value;
       }
     }
 
-    function operation_rest(ret, store) {
-      all_ws();
+    function operation_rest(ret) {
       if (!ret) ret = {};
       const name = consume(ID);
-      ret.name = name ? name.value : null;
-      all_ws();
-      consume(OTHER, "(") || error("Invalid operation");
-      ret["arguments"] = argument_list(store) || [];
-      all_ws();
-      consume(OTHER, ")") || error("Unterminated operation");
-      all_ws();
-      consume(OTHER, ";") || error("Unterminated operation");
+      ret.name = name ? unescape(name.value) : null;
+      ret.escapedName = name ? name.value : null;
+      consume("(") || error("Invalid operation");
+      ret.arguments = argument_list();
+      consume(")") || error("Unterminated operation");
+      consume(";") || error("Unterminated operation");
       return ret;
     }
 
-    function callback(store) {
-      all_ws(store, "pea");
+    function callback() {
       let ret;
-      if (!consume(ID, "callback")) return;
-      all_ws();
-      const tok = consume(ID, "interface");
+      if (!consume("callback")) return;
+      const tok = consume("interface");
       if (tok) {
-        ret = interface_rest(false, store, "callback interface");
+        ret = interface_rest(false, "callback interface");
         return ret;
       }
       const name = consume(ID) || error("No name for callback");
       ret = current = { type: "callback", name: sanitize_name(name.value, "callback") };
-      all_ws();
-      consume(OTHER, "=") || error("No assignment in callback");
-      all_ws();
-      ret.idlType = return_type();
-      all_ws();
-      consume(OTHER, "(") || error("No arguments in callback");
-      ret["arguments"] = argument_list(store) || [];
-      all_ws();
-      consume(OTHER, ")") || error("Unterminated callback");
-      all_ws();
-      consume(OTHER, ";") || error("Unterminated callback");
+      consume("=") || error("No assignment in callback");
+      ret.idlType = return_type() || error("Missing return type");
+      consume("(") || error("No arguments in callback");
+      ret.arguments = argument_list();
+      consume(")") || error("Unterminated callback");
+      consume(";") || error("Unterminated callback");
       return ret;
     }
 
-    function attribute(store) {
-      all_ws(store, "pea");
-      const grabbed = [];
+    function attribute({ noInherit = false, readonly = false } = {}) {
+      const start_position = consume_position;
       const ret = {
         type: "attribute",
         static: false,
@@ -585,137 +568,120 @@
         inherit: false,
         readonly: false
       };
-      const w = all_ws();
-      if (w) grabbed.push(w);
-      if (consume(ID, "inherit")) {
-        if (ret.static || ret.stringifier) error("Cannot have a static or stringifier inherit");
+      if (!noInherit && consume("inherit")) {
         ret.inherit = true;
-        grabbed.push(last_token);
-        const w = all_ws();
-        if (w) grabbed.push(w);
       }
-      if (consume(ID, "readonly")) {
+      if (consume("readonly")) {
         ret.readonly = true;
-        grabbed.push(last_token);
-        const w = all_ws();
-        if (w) grabbed.push(w);
+      } else if (readonly && probe("attribute")) {
+        error("Attributes must be readonly in this context");
       }
       const rest = attribute_rest(ret);
       if (!rest) {
-        tokens = grabbed.concat(tokens);
+        unconsume(start_position);
       }
       return rest;
     }
 
     function attribute_rest(ret) {
-      if (!consume(ID, "attribute")) {
+      if (!consume("attribute")) {
         return;
       }
-      all_ws();
       ret.idlType = type_with_extended_attributes("attribute-type") || error("No type in attribute");
-      if (ret.idlType.sequence) error("Attributes cannot accept sequence types");
+      if (ret.idlType.generic === "sequence") error("Attributes cannot accept sequence types");
       if (ret.idlType.generic === "record") error("Attributes cannot accept record types");
-      all_ws();
-      const name = consume(ID) || error("No name in attribute");
-      ret.name = name.value;
-      all_ws();
-      consume(OTHER, ";") || error("Unterminated attribute");
+      const name = consume(ID, "required") || error("No name in attribute");
+      ret.name = unescape(name.value);
+      ret.escapedName = name.value;
+      consume(";") || error("Unterminated attribute");
       return ret;
     }
 
-    function return_type() {
-      const typ = type("return-type");
-      if (!typ) {
-        if (consume(ID, "void")) {
-          return "void";
-        } else error("No return type");
+    function return_type(typeName) {
+      const typ = type(typeName || "return-type");
+      if (typ) {
+        return typ;
       }
-      return typ;
+      if (consume("void")) {
+        return Object.assign({ type: "return-type" }, EMPTY_IDLTYPE, { idlType: "void" });
+      }
     }
 
-    function operation(store) {
-      all_ws(store, "pea");
+    function operation({ regular = false } = {}) {
       const ret = Object.assign({}, EMPTY_OPERATION);
-      while (true) {
-        all_ws();
-        if (consume(ID, "getter")) ret.getter = true;
-        else if (consume(ID, "setter")) ret.setter = true;
-        else if (consume(ID, "deleter")) ret.deleter = true;
+      while (!regular) {
+        if (consume("getter")) ret.getter = true;
+        else if (consume("setter")) ret.setter = true;
+        else if (consume("deleter")) ret.deleter = true;
         else break;
       }
-      if (ret.getter || ret.setter || ret.deleter) {
-        all_ws();
-        ret.idlType = return_type();
-        operation_rest(ret, store);
-        return ret;
-      }
-      ret.idlType = return_type();
-      all_ws();
-      operation_rest(ret, store);
+      ret.idlType = return_type() || error("Missing return type");
+      operation_rest(ret);
       return ret;
     }
 
-    function static_member(store) {
-      all_ws(store, "pea");
-      if (!consume(ID, "static")) return;
-      all_ws();
-      return noninherited_attribute(store, "static") ||
-        regular_operation(store, "static") ||
+    function static_member() {
+      if (!consume("static")) return;
+      const member = attribute({ noInherit: true }) ||
+        operation({ regular: true }) ||
         error("No body in static member");
+      member.static = true;
+      return member;
     }
 
-    function stringifier(store) {
-      all_ws(store, "pea");
-      if (!consume(ID, "stringifier")) return;
-      all_ws();
-      if (consume(OTHER, ";")) {
+    function stringifier() {
+      if (!consume("stringifier")) return;
+      if (consume(";")) {
         return Object.assign({}, EMPTY_OPERATION, { stringifier: true });
       }
-      return noninherited_attribute(store, "stringifier") ||
-        regular_operation(store, "stringifier") ||
+      const member = attribute({ noInherit: true }) ||
+        operation({ regular: true }) ||
         error("Unterminated stringifier");
+      member.stringifier = true;
+      return member;
     }
 
-    function identifiers(arr) {
+    function identifiers() {
+      const arr = [];
+      const id = consume(ID);
+      if (id) {
+        arr.push(id.value);
+      }
+      else error("Expected identifiers but not found");
       while (true) {
-        all_ws();
-        if (consume(OTHER, ",")) {
-          all_ws();
+        if (consume(",")) {
           const name = consume(ID) || error("Trailing comma in identifiers list");
           arr.push(name.value);
         } else break;
       }
+      return arr;
     }
 
     function iterable_type() {
-      if (consume(ID, "iterable")) return "iterable";
-      else if (consume(ID, "legacyiterable")) return "legacyiterable";
-      else if (consume(ID, "maplike")) return "maplike";
-      else if (consume(ID, "setlike")) return "setlike";
+      if (consume("iterable")) return "iterable";
+      else if (consume("legacyiterable")) return "legacyiterable";
+      else if (consume("maplike")) return "maplike";
+      else if (consume("setlike")) return "setlike";
       else return;
     }
 
     function readonly_iterable_type() {
-      if (consume(ID, "maplike")) return "maplike";
-      else if (consume(ID, "setlike")) return "setlike";
+      if (consume("maplike")) return "maplike";
+      else if (consume("setlike")) return "setlike";
       else return;
     }
 
-    function iterable(store) {
-      all_ws(store, "pea");
-      const grabbed = [];
+    function iterable() {
+      const start_position = consume_position;
       const ret = { type: null, idlType: null, readonly: false };
-      if (consume(ID, "readonly")) {
+      if (consume("readonly")) {
         ret.readonly = true;
-        grabbed.push(last_token);
-        var w = all_ws();
-        if (w) grabbed.push(w);
       }
       const consumeItType = ret.readonly ? readonly_iterable_type : iterable_type;
 
       const ittype = consumeItType();
       if (!ittype) {
-        tokens = grabbed.concat(tokens);
+        unconsume(start_position);
         return;
       }
 
@@ -724,30 +690,24 @@
       ret.type = ittype;
       if (ret.type !== 'maplike' && ret.type !== 'setlike')
         delete ret.readonly;
-      all_ws();
-      if (consume(OTHER, "<")) {
+      if (consume("<")) {
         ret.idlType = [type_with_extended_attributes()] || error(`Error parsing ${ittype} declaration`);
-        all_ws();
         if (secondTypeAllowed) {
-          if (consume(OTHER, ",")) {
-            all_ws();
+          if (consume(",")) {
             ret.idlType.push(type_with_extended_attributes());
-            all_ws();
           }
           else if (secondTypeRequired)
             error(`Missing second type argument in ${ittype} declaration`);
         }
-        if (!consume(OTHER, ">")) error(`Unterminated ${ittype} declaration`);
-        all_ws();
-        if (!consume(OTHER, ";")) error(`Missing semicolon after ${ittype} declaration`);
+        if (!consume(">")) error(`Unterminated ${ittype} declaration`);
+        if (!consume(";")) error(`Missing semicolon after ${ittype} declaration`);
       } else
         error(`Error parsing ${ittype} declaration`);
 
       return ret;
     }
 
-    function interface_rest(isPartial, store, typeName = "interface") {
-      all_ws();
+    function interface_rest(isPartial, typeName = "interface") {
       const name = consume(ID) || error("No name for interface");
       const mems = [];
       const ret = current = {
@@ -757,39 +717,27 @@
         members: mems
       };
       if (!isPartial) ret.inheritance = inheritance() || null;
-      all_ws();
-      consume(OTHER, "{") || error("Bodyless interface");
+      consume("{") || error("Bodyless interface");
       while (true) {
-        all_ws(store ? mems : null);
-        if (consume(OTHER, "}")) {
-          all_ws();
-          consume(OTHER, ";") || error("Missing semicolon after interface");
+        if (consume("}")) {
+          consume(";") || error("Missing semicolon after interface");
           return ret;
         }
-        const ea = extended_attrs(store ? mems : null);
-        all_ws();
-        const cnt = const_(store ? mems : null);
-        if (cnt) {
-          cnt.extAttrs = ea;
-          ret.members.push(cnt);
-          continue;
-        }
-        const mem = (opt.allowNestedTypedefs && typedef(store ? mems : null)) ||
-          static_member(store ? mems : null) ||
-          stringifier(store ? mems : null) ||
-          iterable(store ? mems : null) ||
-          attribute(store ? mems : null) ||
-          operation(store ? mems : null) ||
+        const ea = extended_attrs();
+        const mem = const_() ||
+          static_member() ||
+          stringifier() ||
+          iterable() ||
+          attribute() ||
+          operation() ||
           error("Unknown member");
         mem.extAttrs = ea;
         ret.members.push(mem);
       }
     }
 
-    function mixin_rest(isPartial, store) {
-      all_ws();
-      if (!consume(ID, "mixin")) return;
-      all_ws();
+    function mixin_rest(isPartial) {
+      if (!consume("mixin")) return;
       const name = consume(ID) || error("No name for interface mixin");
       const mems = [];
       const ret = current = {
@@ -798,44 +746,32 @@
         partial: isPartial,
         members: mems
       };
-      all_ws();
-      consume(OTHER, "{") || error("Bodyless interface mixin");
+      consume("{") || error("Bodyless interface mixin");
       while (true) {
-        all_ws(store ? mems : null);
-        if (consume(OTHER, "}")) {
-          all_ws();
-          consume(OTHER, ";") || error("Missing semicolon after interface mixin");
+        if (consume("}")) {
+          consume(";") || error("Missing semicolon after interface mixin");
           return ret;
         }
-        const ea = extended_attrs(store ? mems : null);
-        all_ws();
-        const cnt = const_(store ? mems : null);
-        if (cnt) {
-          cnt.extAttrs = ea;
-          ret.members.push(cnt);
-          continue;
-        }
-        const mem = stringifier(store ? mems : null) ||
-          noninherited_attribute(store ? mems : null) ||
-          regular_operation(store ? mems : null) ||
+        const ea = extended_attrs();
+        const mem = const_() ||
+          stringifier() ||
+          attribute({ noInherit: true }) ||
+          operation({ regular: true }) ||
           error("Unknown member");
         mem.extAttrs = ea;
         ret.members.push(mem);
       }
     }
 
-    function interface_(isPartial, store) {
-      all_ws(isPartial ? null : store, "pea");
-      if (!consume(ID, "interface")) return;
-      return mixin_rest(isPartial, store) ||
-        interface_rest(isPartial, store) ||
+    function interface_(isPartial) {
+      if (!consume("interface")) return;
+      return mixin_rest(isPartial) ||
+        interface_rest(isPartial) ||
         error("Interface has no proper body");
     }
 
-    function namespace(isPartial, store) {
-      all_ws(isPartial ? null : store, "pea");
-      if (!consume(ID, "namespace")) return;
-      all_ws();
+    function namespace(isPartial) {
+      if (!consume("namespace")) return;
       const name = consume(ID) || error("No name for namespace");
       const mems = [];
       const ret = current = {
@@ -844,76 +780,32 @@
         partial: isPartial,
         members: mems
       };
-      all_ws();
-      consume(OTHER, "{") || error("Bodyless namespace");
+      consume("{") || error("Bodyless namespace");
       while (true) {
-        all_ws(store ? mems : null);
-        if (consume(OTHER, "}")) {
-          all_ws();
-          consume(OTHER, ";") || error("Missing semicolon after namespace");
+        if (consume("}")) {
+          consume(";") || error("Missing semicolon after namespace");
           return ret;
         }
-        const ea = extended_attrs(store ? mems : null);
-        all_ws();
-        const mem = noninherited_attribute(store ? mems : null) ||
-          regular_operation(store ? mems : null) ||
+        const ea = extended_attrs();
+        const mem = attribute({ noInherit: true, readonly: true }) ||
+          operation({ regular: true }) ||
           error("Unknown member");
         mem.extAttrs = ea;
         ret.members.push(mem);
       }
     }
 
-    function noninherited_attribute(store, prefix) {
-      const w = all_ws(store, "pea");
-      const grabbed = [];
-      const ret = {
-        type: "attribute",
-        static: false,
-        stringifier: false,
-        inherit: false,
-        readonly: false
-      };
-      if (prefix) {
-        ret[prefix] = true;
-      }
-      if (w) grabbed.push(w);
-      if (consume(ID, "readonly")) {
-        ret.readonly = true;
-        grabbed.push(last_token);
-        const w = all_ws();
-        if (w) grabbed.push(w);
-      }
-      const rest = attribute_rest(ret);
-      if (!rest) {
-        tokens = grabbed.concat(tokens);
-      }
-      return rest;
-    }
-
-    function regular_operation(store, prefix) {
-      all_ws(store, "pea");
-      const ret = Object.assign({}, EMPTY_OPERATION);
-      if (prefix) {
-        ret[prefix] = true;
-      }
-      ret.idlType = return_type();
-      return operation_rest(ret, store);
-    }
-
-    function partial(store) {
-      all_ws(store, "pea");
-      if (!consume(ID, "partial")) return;
-      const thing = dictionary(true, store) ||
-        interface_(true, store) ||
-        namespace(true, store) ||
+    function partial() {
+      if (!consume("partial")) return;
+      const thing = dictionary(true) ||
+        interface_(true) ||
+        namespace(true) ||
         error("Partial doesn't apply to anything");
       return thing;
     }
 
-    function dictionary(isPartial, store) {
-      all_ws(isPartial ? null : store, "pea");
-      if (!consume(ID, "dictionary")) return;
-      all_ws();
+    function dictionary(isPartial) {
+      if (!consume("dictionary")) return;
       const name = consume(ID) || error("No name for dictionary");
       const mems = [];
       const ret = current = {
@@ -923,43 +815,34 @@
         members: mems
       };
       if (!isPartial) ret.inheritance = inheritance() || null;
-      all_ws();
-      consume(OTHER, "{") || error("Bodyless dictionary");
+      consume("{") || error("Bodyless dictionary");
       while (true) {
-        all_ws(store ? mems : null);
-        if (consume(OTHER, "}")) {
-          all_ws();
-          consume(OTHER, ";") || error("Missing semicolon after dictionary");
+        if (consume("}")) {
+          consume(";") || error("Missing semicolon after dictionary");
           return ret;
         }
-        const ea = extended_attrs(store ? mems : null);
-        all_ws(store ? mems : null, "pea");
-        const required = consume(ID, "required");
+        const ea = extended_attrs();
+        const required = consume("required");
         const typ = type_with_extended_attributes("dictionary-type") || error("No type for dictionary member");
-        all_ws();
         const name = consume(ID) || error("No name for dictionary member");
-        const dflt = default_();
+        const dflt = default_() || null;
         if (required && dflt) error("Required member must not have a default");
         const member = {
           type: "field",
-          name: name.value,
+          name: unescape(name.value),
+          escapedName: name.value,
           required: !!required,
           idlType: typ,
-          extAttrs: ea
+          extAttrs: ea,
+          default: dflt
         };
-        if (typeof dflt !== "undefined") {
-          member["default"] = dflt;
-        }
         ret.members.push(member);
-        all_ws();
-        consume(OTHER, ";") || error("Unterminated dictionary member");
+        consume(";") || error("Unterminated dictionary member");
       }
     }
 
-    function enum_(store) {
-      all_ws(store, "pea");
-      if (!consume(ID, "enum")) return;
-      all_ws();
+    function enum_() {
+      if (!consume("enum")) return;
       const name = consume(ID) || error("No name for enum");
       const vals = [];
       const ret = current = {
@@ -967,111 +850,95 @@
         name: sanitize_name(name.value, "enum"),
         values: vals
       };
-      all_ws();
-      consume(OTHER, "{") || error("No curly for enum");
-      let saw_comma = false;
+      consume("{") || error("No curly for enum");
+      let value_expected = true;
       while (true) {
-        all_ws(store ? vals : null);
-        if (consume(OTHER, "}")) {
-          all_ws();
-          consume(OTHER, ";") || error("No semicolon after enum");
+        if (consume("}")) {
+          if (!ret.values.length) error("No value in enum");
+          consume(";") || error("No semicolon after enum");
           return ret;
         }
+        else if (!value_expected) {
+          error("No comma between enum values");
+        }
         const val = consume(STR) || error("Unexpected value in enum");
         val.value = val.value.slice(1, -1);
+        // No trivia exposure yet
+        val.trivia = undefined;
         ret.values.push(val);
-        all_ws(store ? vals : null);
-        if (consume(OTHER, ",")) {
-          if (store) vals.push({ type: "," });
-          all_ws(store ? vals : null);
-          saw_comma = true;
-        } else {
-          saw_comma = false;
-        }
+        value_expected = !!consume(",");
       }
     }
 
-    function typedef(store) {
-      all_ws(store, "pea");
-      if (!consume(ID, "typedef")) return;
+    function typedef() {
+      if (!consume("typedef")) return;
       const ret = {
         type: "typedef"
       };
-      all_ws();
       ret.idlType = type_with_extended_attributes("typedef-type") || error("No type in typedef");
-      all_ws();
       const name = consume(ID) || error("No name in typedef");
       ret.name = sanitize_name(name.value, "typedef");
       current = ret;
-      all_ws();
-      consume(OTHER, ";") || error("Unterminated typedef");
+      consume(";") || error("Unterminated typedef");
       return ret;
     }
 
-    function implements_(store) {
-      all_ws(store, "pea");
+    function implements_() {
+      const start_position = consume_position;
       const target = consume(ID);
       if (!target) return;
-      const w = all_ws();
-      if (consume(ID, "implements")) {
+      if (consume("implements")) {
         const ret = {
           type: "implements",
           target: target.value
         };
-        all_ws();
         const imp = consume(ID) || error("Incomplete implements statement");
-        ret["implements"] = imp.value;
-        all_ws();
-        consume(OTHER, ";") || error("No terminating ; for implements statement");
+        ret.implements = imp.value;
+        consume(";") || error("No terminating ; for implements statement");
         return ret;
       } else {
         // rollback
-        tokens.unshift(w);
-        tokens.unshift(target);
+        unconsume(start_position);
       }
     }
 
-    function includes(store) {
-      all_ws(store, "pea");
+    function includes() {
+      const start_position = consume_position;
       const target = consume(ID);
       if (!target) return;
-      const w = all_ws();
-      if (consume(ID, "includes")) {
+      if (consume("includes")) {
         const ret = {
           type: "includes",
           target: target.value
         };
-        all_ws();
         const imp = consume(ID) || error("Incomplete includes statement");
-        ret["includes"] = imp.value;
-        all_ws();
-        consume(OTHER, ";") || error("No terminating ; for includes statement");
+        ret.includes = imp.value;
+        consume(";") || error("No terminating ; for includes statement");
         return ret;
       } else {
         // rollback
-        tokens.unshift(w);
-        tokens.unshift(target);
+        unconsume(start_position);
       }
     }
 
-    function definition(store) {
-      return callback(store) ||
-        interface_(false, store) ||
-        partial(store) ||
-        dictionary(false, store) ||
-        enum_(store) ||
-        typedef(store) ||
-        implements_(store) ||
-        includes(store) ||
-        namespace(false, store);
+    function definition() {
+      return callback() ||
+        interface_(false) ||
+        partial() ||
+        dictionary(false) ||
+        enum_() ||
+        typedef() ||
+        implements_() ||
+        includes() ||
+        namespace(false);
     }
 
-    function definitions(store) {
+    function definitions() {
       if (!tokens.length) return [];
       const defs = [];
       while (true) {
-        const ea = extended_attrs(store ? defs : null);
-        const def = definition(store ? defs : null);
+        const ea = extended_attrs();
+        const def = definition();
         if (!def) {
           if (ea.length) error("Stray extended attributes");
           break;
@@ -1081,16 +948,15 @@
       }
       return defs;
     }
-    const res = definitions(opt.ws);
-    if (tokens.length) error("Unrecognised tokens");
+    const res = definitions();
+    if (consume_position < tokens.length) error("Unrecognised tokens");
     return res;
   }
 
   const obj = {
-    parse(str, opt) {
-      if (!opt) opt = {};
+    parse(str) {
       const tokens = tokenise(str);
-      return parse(tokens, opt);
+      return parse(tokens);
     }
   };
 
diff --git a/resources/webidl2/lib/writer.js b/resources/webidl2/lib/writer.js
index c00c0dd..b3097a6 100644
--- a/resources/webidl2/lib/writer.js
+++ b/resources/webidl2/lib/writer.js
@@ -2,8 +2,6 @@
 
 (() => {
   function write(ast, opt = {}) {
-    let curPea = "";
-    let curTPea = "";
     const noop = str => str;
     const optNames = "type".split(" ");
     const context = [];
@@ -14,23 +12,9 @@
     function literal(it) {
       return it.value;
     };
-    function wsPea(it) {
-      curPea += it.value;
-      return "";
-    };
-    function wsTPea(it) {
-      curTPea += it.value;
-      return "";
-    };
-    function lineComment(it) {
-      return `//${it.value}\n`;
-    };
-    function multilineComment(it) {
-      return `/*${it.value}*/`;
-    };
     function type(it) {
       if (typeof it === "string") return opt.type(it); // XXX should maintain some context
-      let ret = extended_attributes(it.extAttrs, curPea);
+      let ret = extended_attributes(it.extAttrs);
       if (it.union) ret += `(${it.idlType.map(type).join(" or ")})`;
       else {
         if (it.generic) ret += `${it.generic}<`;
@@ -52,74 +36,56 @@
       else if (tp === "sequence") return "[]";
       else return `"${it.value}"`;
     };
-    function argument(arg, pea) {
-      let ret = extended_attributes(arg.extAttrs, pea);
+    function argument(arg) {
+      let ret = extended_attributes(arg.extAttrs);
       if (arg.optional) ret += "optional ";
       ret += type(arg.idlType);
       if (arg.variadic) ret += "...";
-      ret += ` ${arg.name}`;
-      if (arg["default"]) ret += ` = ${const_value(arg["default"])}`;
+      ret += ` ${arg.escapedName}`;
+      if (arg.default) ret += ` = ${const_value(arg.default)}`;
       return ret;
     };
-    function args(its) {
-      let res = "";
-      let pea = "";
-      for (let i = 0, n = its.length; i < n; i++) {
-        const arg = its[i];
-        if (arg.type === "ws") res += arg.value;
-        else if (arg.type === "ws-pea") pea += arg.value;
-        else {
-          res += argument(arg, pea);
-          if (i < n - 1) res += ",";
-          pea = "";
-        }
-      }
-      return res;
-    };
     function make_ext_at(it) {
       context.unshift(it);
       let ret = it.name;
       if (it.rhs) {
-        if (it.rhs.type === "identifier-list") ret += `=(${it.rhs.value.join(',')})`;
+        if (it.rhs.type === "identifier-list") ret += `=(${it.rhs.value.join(",")})`;
         else ret += `=${it.rhs.value}`;
       }
-      if (it.arguments) ret += `(${it["arguments"].length ? args(it["arguments"]) : ""})`;
+      if (it.arguments) ret += `(${it.arguments.length ? it.arguments.map(argument).join(",") : ""})`;
       context.shift(); // XXX need to add more contexts, but not more than needed for ReSpec
       return ret;
     };
-    function extended_attributes(eats, pea) {
+    function extended_attributes(eats) {
       if (!eats || !eats.length) return "";
-      return `[${eats.map(make_ext_at).join(", ")}]${pea}`;
+      return `[${eats.map(make_ext_at).join(", ")}]`;
     };
 
-    const modifiers = "getter setter creator deleter legacycaller stringifier static".split(" ");
+    const modifiers = "getter setter deleter stringifier static".split(" ");
     function operation(it) {
-      let ret = extended_attributes(it.extAttrs, curPea);
-      curPea = "";
+      let ret = extended_attributes(it.extAttrs);
       if (it.stringifier && !it.idlType) return "stringifier;";
       for (const mod of modifiers) {
         if (it[mod]) ret += mod + " ";
       }
       ret += type(it.idlType) + " ";
-      if (it.name) ret += it.name;
-      ret += `(${args(it["arguments"])});`;
+      if (it.name) ret += it.escapedName;
+      ret += `(${it.arguments.map(argument).join(",")});`;
       return ret;
     };
 
     function attribute(it) {
-      let ret = extended_attributes(it.extAttrs, curPea);
-      curPea = "";
-      if (it["static"]) ret += "static ";
+      let ret = extended_attributes(it.extAttrs);
+      if (it.static) ret += "static ";
       if (it.stringifier) ret += "stringifier ";
-      if (it.readonly) ret += "readonly ";
       if (it.inherit) ret += "inherit ";
-      ret += `attribute ${type(it.idlType)} ${it.name};`;
+      if (it.readonly) ret += "readonly ";
+      ret += `attribute ${type(it.idlType)} ${it.escapedName};`;
       return ret;
     };
 
     function interface_(it) {
-      let ret = extended_attributes(it.extAttrs, curPea);
-      curPea = "";
+      let ret = extended_attributes(it.extAttrs);
       if (it.partial) ret += "partial ";
       ret += `interface ${it.name} `;
       if (it.inheritance) ret += `: ${it.inheritance} `;
@@ -128,8 +94,7 @@
     };
 
     function interface_mixin(it) {
-      let ret = extended_attributes(it.extAttrs, curPea);
-      curPea = "";
+      let ret = extended_attributes(it.extAttrs);
       if (it.partial) ret += "partial ";
       ret += `interface mixin ${it.name} `;
       ret += `{${iterate(it.members)}};`;
@@ -137,8 +102,7 @@
     }
 
     function namespace(it) {
-      let ret = extended_attributes(it.extAttrs, curPea);
-      curPea = "";
+      let ret = extended_attributes(it.extAttrs);
       if (it.partial) ret += "partial ";
       ret += `namespace ${it.name} `;
       ret += `{${iterate(it.members)}};`;
@@ -146,8 +110,7 @@
     }
 
     function dictionary(it) {
-      let ret = extended_attributes(it.extAttrs, curPea);
-      curPea = "";
+      let ret = extended_attributes(it.extAttrs);
       if (it.partial) ret += "partial ";
       ret += `dictionary ${it.name} `;
       if (it.inheritance) ret += `: ${it.inheritance} `;
@@ -155,49 +118,39 @@
       return ret;
     };
     function field(it) {
-      let ret = extended_attributes(it.extAttrs, curPea);
-      curPea = "";
+      let ret = extended_attributes(it.extAttrs);
       if (it.required) ret += "required ";
-      ret += `${type(it.idlType)} ${it.name}`;
-      if (it["default"]) ret += ` = ${const_value(it["default"])}`;
+      ret += `${type(it.idlType)} ${it.escapedName}`;
+      if (it.default) ret += ` = ${const_value(it.default)}`;
       ret += ";";
       return ret;
     };
     function const_(it) {
-      const ret = extended_attributes(it.extAttrs, curPea);
-      curPea = "";
+      const ret = extended_attributes(it.extAttrs);
       return `${ret}const ${type(it.idlType)}${it.nullable ? "?" : ""} ${it.name} = ${const_value(it.value)};`;
     };
     function typedef(it) {
-      let ret = extended_attributes(it.extAttrs, curPea);
-      curPea = "";
-      ret += `typedef ${extended_attributes(it.typeExtAttrs, curTPea)}`;
-      curTPea = "";
+      let ret = extended_attributes(it.extAttrs);
+      ret += `typedef ${extended_attributes(it.typeExtAttrs)}`;
       return `${ret}${type(it.idlType)} ${it.name};`;
     };
     function implements_(it) {
-      const ret = extended_attributes(it.extAttrs, curPea);
-      curPea = "";
-      return `${ret}${it.target} implements ${it["implements"]};`;
+      const ret = extended_attributes(it.extAttrs);
+      return `${ret}${it.target} implements ${it.implements};`;
     };
     function includes(it) {
-      const ret = extended_attributes(it.extAttrs, curPea);
-      curPea = "";
+      const ret = extended_attributes(it.extAttrs);
       return `${ret}${it.target} includes ${it.includes};`;
     };
     function callback(it) {
-      const ret = extended_attributes(it.extAttrs, curPea);
-      curPea = "";
-      return `${ret}callback ${it.name} = ${type(it.idlType)}(${args(it["arguments"])});`;
+      const ret = extended_attributes(it.extAttrs);
+      return `${ret}callback ${it.name} = ${type(it.idlType)}(${it.arguments.map(argument).join(",")});`;
     };
     function enum_(it) {
-      let ret = extended_attributes(it.extAttrs, curPea);
-      curPea = "";
+      let ret = extended_attributes(it.extAttrs);
       ret += `enum ${it.name} {`;
       for (const v of it.values) {
-        if (v.type === "string") ret += `"${v.value}"`;
-        else if (v.type === "ws") ret += v.value;
-        else if (v.type === ",") ret += ",";
+        ret += `"${v.value}",`;
       }
       return ret + "};";
     };
@@ -218,11 +171,6 @@
     };
 
     const table = {
-      ws: literal,
-      "ws-pea": wsPea,
-      "ws-tpea": wsTPea,
-      "line-comment": lineComment,
-      "multiline-comment": multilineComment,
       interface: interface_,
       "interface mixin": interface_mixin,
       namespace,
diff --git a/resources/webidl2/package-lock.json b/resources/webidl2/package-lock.json
index a6f529d..b058103 100644
--- a/resources/webidl2/package-lock.json
+++ b/resources/webidl2/package-lock.json
@@ -1,6 +1,6 @@
 {
   "name": "webidl2",
-  "version": "10.2.1",
+  "version": "13.0.3",
   "lockfileVersion": 1,
   "requires": true,
   "dependencies": {
@@ -19,9 +19,9 @@
       "integrity": "sha512-mOhhTrzieV6VO7odgzFGFapiwRK0ei8RZRhfzHhb6cpX3QM8XXuCLXWjN8qBB7JReDdUR80V3LFfFrGUYevhNg==",
       "dev": true,
       "requires": {
-        "chalk": "2.3.2",
-        "esutils": "2.0.2",
-        "js-tokens": "3.0.2"
+        "chalk": "^2.0.0",
+        "esutils": "^2.0.2",
+        "js-tokens": "^3.0.0"
       }
     },
     "ansi-regex": {
@@ -36,7 +36,7 @@
       "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
       "dev": true,
       "requires": {
-        "color-convert": "1.9.1"
+        "color-convert": "^1.9.0"
       }
     },
     "arr-diff": {
@@ -45,7 +45,7 @@
       "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
       "dev": true,
       "requires": {
-        "arr-flatten": "1.1.0"
+        "arr-flatten": "^1.0.1"
       }
     },
     "arr-flatten": {
@@ -72,7 +72,7 @@
       "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
       "dev": true,
       "requires": {
-        "balanced-match": "1.0.0",
+        "balanced-match": "^1.0.0",
         "concat-map": "0.0.1"
       }
     },
@@ -82,9 +82,9 @@
       "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
       "dev": true,
       "requires": {
-        "expand-range": "1.8.2",
-        "preserve": "0.2.0",
-        "repeat-element": "1.1.2"
+        "expand-range": "^1.8.1",
+        "preserve": "^0.2.0",
+        "repeat-element": "^1.1.2"
       }
     },
     "browser-stdout": {
@@ -99,9 +99,9 @@
       "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==",
       "dev": true,
       "requires": {
-        "ansi-styles": "3.2.1",
-        "escape-string-regexp": "1.0.5",
-        "supports-color": "5.3.0"
+        "ansi-styles": "^3.2.1",
+        "escape-string-regexp": "^1.0.5",
+        "supports-color": "^5.3.0"
       }
     },
     "color-convert": {
@@ -110,7 +110,7 @@
       "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
       "dev": true,
       "requires": {
-        "color-name": "1.1.3"
+        "color-name": "^1.1.1"
       }
     },
     "color-name": {
@@ -170,7 +170,7 @@
       "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
       "dev": true,
       "requires": {
-        "is-posix-bracket": "0.1.1"
+        "is-posix-bracket": "^0.1.0"
       }
     },
     "expand-range": {
@@ -179,7 +179,7 @@
       "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
       "dev": true,
       "requires": {
-        "fill-range": "2.2.3"
+        "fill-range": "^2.1.0"
       }
     },
     "expect": {
@@ -188,12 +188,12 @@
       "integrity": "sha512-Fiy862jT3qc70hwIHwwCBNISmaqBrfWKKrtqyMJ6iwZr+6KXtcnHojZFtd63TPRvRl8EQTJ+YXYy2lK6/6u+Hw==",
       "dev": true,
       "requires": {
-        "ansi-styles": "3.2.1",
-        "jest-diff": "22.4.0",
-        "jest-get-type": "22.1.0",
-        "jest-matcher-utils": "22.4.0",
-        "jest-message-util": "22.4.0",
-        "jest-regex-util": "22.1.0"
+        "ansi-styles": "^3.2.0",
+        "jest-diff": "^22.4.0",
+        "jest-get-type": "^22.1.0",
+        "jest-matcher-utils": "^22.4.0",
+        "jest-message-util": "^22.4.0",
+        "jest-regex-util": "^22.1.0"
       }
     },
     "extglob": {
@@ -202,7 +202,7 @@
       "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
       "dev": true,
       "requires": {
-        "is-extglob": "1.0.0"
+        "is-extglob": "^1.0.0"
       }
     },
     "filename-regex": {
@@ -212,16 +212,16 @@
       "dev": true
     },
     "fill-range": {
-      "version": "2.2.3",
-      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz",
-      "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=",
+      "version": "2.2.4",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz",
+      "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==",
       "dev": true,
       "requires": {
-        "is-number": "2.1.0",
-        "isobject": "2.1.0",
-        "randomatic": "1.1.7",
-        "repeat-element": "1.1.2",
-        "repeat-string": "1.6.1"
+        "is-number": "^2.1.0",
+        "isobject": "^2.0.0",
+        "randomatic": "^3.0.0",
+        "repeat-element": "^1.1.2",
+        "repeat-string": "^1.5.2"
       }
     },
     "for-in": {
@@ -236,7 +236,7 @@
       "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
       "dev": true,
       "requires": {
-        "for-in": "1.0.2"
+        "for-in": "^1.0.1"
       }
     },
     "fs.realpath": {
@@ -251,12 +251,12 @@
       "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
       "dev": true,
       "requires": {
-        "fs.realpath": "1.0.0",
-        "inflight": "1.0.6",
-        "inherits": "2.0.3",
-        "minimatch": "3.0.4",
-        "once": "1.4.0",
-        "path-is-absolute": "1.0.1"
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.0.4",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
       }
     },
     "glob-base": {
@@ -265,8 +265,8 @@
       "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
       "dev": true,
       "requires": {
-        "glob-parent": "2.0.0",
-        "is-glob": "2.0.1"
+        "glob-parent": "^2.0.0",
+        "is-glob": "^2.0.0"
       }
     },
     "glob-parent": {
@@ -275,7 +275,7 @@
       "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
       "dev": true,
       "requires": {
-        "is-glob": "2.0.1"
+        "is-glob": "^2.0.0"
       }
     },
     "growl": {
@@ -302,8 +302,8 @@
       "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
       "dev": true,
       "requires": {
-        "once": "1.4.0",
-        "wrappy": "1.0.2"
+        "once": "^1.3.0",
+        "wrappy": "1"
       }
     },
     "inherits": {
@@ -330,7 +330,7 @@
       "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
       "dev": true,
       "requires": {
-        "is-primitive": "2.0.0"
+        "is-primitive": "^2.0.0"
       }
     },
     "is-extendable": {
@@ -351,7 +351,7 @@
       "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
       "dev": true,
       "requires": {
-        "is-extglob": "1.0.0"
+        "is-extglob": "^1.0.0"
       }
     },
     "is-number": {
@@ -360,7 +360,7 @@
       "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
       "dev": true,
       "requires": {
-        "kind-of": "3.2.2"
+        "kind-of": "^3.0.2"
       }
     },
     "is-posix-bracket": {
@@ -396,10 +396,10 @@
       "integrity": "sha512-+/t20WmnkOkB8MOaGaPziI8zWKxquMvYw4Ub+wOzi7AUhmpFXz43buWSxVoZo4J5RnCozpGbX3/FssjJ5KV9Nw==",
       "dev": true,
       "requires": {
-        "chalk": "2.3.2",
-        "diff": "3.5.0",
-        "jest-get-type": "22.1.0",
-        "pretty-format": "22.4.0"
+        "chalk": "^2.0.1",
+        "diff": "^3.2.0",
+        "jest-get-type": "^22.1.0",
+        "pretty-format": "^22.4.0"
       }
     },
     "jest-get-type": {
@@ -414,9 +414,9 @@
       "integrity": "sha512-03m3issxUXpWMwDYTfmL8hRNewUB0yCRTeXPm+eq058rZxLHD9f5NtSSO98CWHqe4UyISIxd9Ao9iDVjHWd2qg==",
       "dev": true,
       "requires": {
-        "chalk": "2.3.2",
-        "jest-get-type": "22.1.0",
-        "pretty-format": "22.4.0"
+        "chalk": "^2.0.1",
+        "jest-get-type": "^22.1.0",
+        "pretty-format": "^22.4.0"
       }
     },
     "jest-message-util": {
@@ -425,11 +425,11 @@
       "integrity": "sha512-eyCJB0T3hrlpFF2FqQoIB093OulP+1qvATQmD3IOgJgMGqPL6eYw8TbC5P/VCWPqKhGL51xvjIIhow5eZ2wHFw==",
       "dev": true,
       "requires": {
-        "@babel/code-frame": "7.0.0-beta.40",
-        "chalk": "2.3.2",
-        "micromatch": "2.3.11",
-        "slash": "1.0.0",
-        "stack-utils": "1.0.1"
+        "@babel/code-frame": "^7.0.0-beta.35",
+        "chalk": "^2.0.1",
+        "micromatch": "^2.3.11",
+        "slash": "^1.0.0",
+        "stack-utils": "^1.0.1"
       }
     },
     "jest-regex-util": {
@@ -450,8 +450,8 @@
       "integrity": "sha512-v7eaGLDMCHXH+fsIaZhptEUJmS8EJpunq7IM4cc4vIT/kSRAkaZ6ZF4ebiNcyUelL0znbvj6o2B5Gh9v7Og0BQ==",
       "dev": true,
       "requires": {
-        "chalk": "2.3.2",
-        "diff-match-patch": "1.0.0"
+        "chalk": "^2.3.0",
+        "diff-match-patch": "^1.0.0"
       }
     },
     "kind-of": {
@@ -460,28 +460,34 @@
       "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
       "dev": true,
       "requires": {
-        "is-buffer": "1.1.6"
+        "is-buffer": "^1.1.5"
       }
     },
+    "math-random": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz",
+      "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=",
+      "dev": true
+    },
     "micromatch": {
       "version": "2.3.11",
       "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
       "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
       "dev": true,
       "requires": {
-        "arr-diff": "2.0.0",
-        "array-unique": "0.2.1",
-        "braces": "1.8.5",
-        "expand-brackets": "0.1.5",
-        "extglob": "0.3.2",
-        "filename-regex": "2.0.1",
-        "is-extglob": "1.0.0",
-        "is-glob": "2.0.1",
-        "kind-of": "3.2.2",
-        "normalize-path": "2.1.1",
-        "object.omit": "2.0.1",
-        "parse-glob": "3.0.4",
-        "regex-cache": "0.4.4"
+        "arr-diff": "^2.0.0",
+        "array-unique": "^0.2.1",
+        "braces": "^1.8.2",
+        "expand-brackets": "^0.1.4",
+        "extglob": "^0.3.1",
+        "filename-regex": "^2.0.0",
+        "is-extglob": "^1.0.0",
+        "is-glob": "^2.0.1",
+        "kind-of": "^3.0.2",
+        "normalize-path": "^2.0.1",
+        "object.omit": "^2.0.0",
+        "parse-glob": "^3.0.4",
+        "regex-cache": "^0.4.2"
       }
     },
     "minimatch": {
@@ -490,7 +496,7 @@
       "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
       "dev": true,
       "requires": {
-        "brace-expansion": "1.1.11"
+        "brace-expansion": "^1.1.7"
       }
     },
     "minimist": {
@@ -538,7 +544,7 @@
           "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==",
           "dev": true,
           "requires": {
-            "has-flag": "2.0.0"
+            "has-flag": "^2.0.0"
           }
         }
       }
@@ -555,7 +561,7 @@
       "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
       "dev": true,
       "requires": {
-        "remove-trailing-separator": "1.1.0"
+        "remove-trailing-separator": "^1.0.1"
       }
     },
     "object.omit": {
@@ -564,8 +570,8 @@
       "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
       "dev": true,
       "requires": {
-        "for-own": "0.1.5",
-        "is-extendable": "0.1.1"
+        "for-own": "^0.1.4",
+        "is-extendable": "^0.1.1"
       }
     },
     "once": {
@@ -574,7 +580,7 @@
       "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
       "dev": true,
       "requires": {
-        "wrappy": "1.0.2"
+        "wrappy": "1"
       }
     },
     "parse-glob": {
@@ -583,10 +589,10 @@
       "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
       "dev": true,
       "requires": {
-        "glob-base": "0.3.0",
-        "is-dotfile": "1.0.3",
-        "is-extglob": "1.0.0",
-        "is-glob": "2.0.1"
+        "glob-base": "^0.3.0",
+        "is-dotfile": "^1.0.0",
+        "is-extglob": "^1.0.0",
+        "is-glob": "^2.0.0"
       }
     },
     "path-is-absolute": {
@@ -607,48 +613,32 @@
       "integrity": "sha512-pvCxP2iODIIk9adXlo4S3GRj0BrJiil68kByAa1PrgG97c1tClh9dLMgp3Z6cHFZrclaABt0UH8PIhwHuFLqYA==",
       "dev": true,
       "requires": {
-        "ansi-regex": "3.0.0",
-        "ansi-styles": "3.2.1"
+        "ansi-regex": "^3.0.0",
+        "ansi-styles": "^3.2.0"
       }
     },
     "randomatic": {
-      "version": "1.1.7",
-      "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz",
-      "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz",
+      "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==",
       "dev": true,
       "requires": {
-        "is-number": "3.0.0",
-        "kind-of": "4.0.0"
+        "is-number": "^4.0.0",
+        "kind-of": "^6.0.0",
+        "math-random": "^1.0.1"
       },
       "dependencies": {
         "is-number": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
-          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
-          "dev": true,
-          "requires": {
-            "kind-of": "3.2.2"
-          },
-          "dependencies": {
-            "kind-of": {
-              "version": "3.2.2",
-              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-              "dev": true,
-              "requires": {
-                "is-buffer": "1.1.6"
-              }
-            }
-          }
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+          "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+          "dev": true
         },
         "kind-of": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
-          "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
-          "dev": true,
-          "requires": {
-            "is-buffer": "1.1.6"
-          }
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+          "dev": true
         }
       }
     },
@@ -658,7 +648,7 @@
       "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
       "dev": true,
       "requires": {
-        "is-equal-shallow": "0.1.3"
+        "is-equal-shallow": "^0.1.3"
       }
     },
     "remove-trailing-separator": {
@@ -697,7 +687,7 @@
       "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==",
       "dev": true,
       "requires": {
-        "has-flag": "3.0.0"
+        "has-flag": "^3.0.0"
       }
     },
     "wrappy": {
diff --git a/resources/webidl2/package.json b/resources/webidl2/package.json
index ab282d1..92facca 100644
--- a/resources/webidl2/package.json
+++ b/resources/webidl2/package.json
@@ -1,7 +1,7 @@
 {
   "name": "webidl2",
   "description": "A WebIDL Parser",
-  "version": "10.2.1",
+  "version": "13.0.3",
   "contributors": [
     "Robin Berjon <robin@berjon.com> (https://berjon.com)",
     "Marcos Caceres <marcos@marcosc.com> (https://marcosc.com)",
@@ -20,5 +20,8 @@
     "acquire": "node test/util/acquire.js"
   },
   "repository": "git://github.com/w3c/webidl2.js",
-  "main": "index"
+  "main": "index.js",
+  "files": [
+    "lib/*"
+  ]
 }
diff --git a/resources/webidl2/test/invalid/idl/enum-empty.widl b/resources/webidl2/test/invalid/idl/enum-empty.widl
new file mode 100644
index 0000000..7f189eb
--- /dev/null
+++ b/resources/webidl2/test/invalid/idl/enum-empty.widl
@@ -0,0 +1 @@
+enum Empty {};
diff --git a/resources/webidl2/test/invalid/idl/enum-wo-comma.widl b/resources/webidl2/test/invalid/idl/enum-wo-comma.widl
new file mode 100644
index 0000000..ebc5306
--- /dev/null
+++ b/resources/webidl2/test/invalid/idl/enum-wo-comma.widl
@@ -0,0 +1 @@
+enum NoComma { "value1" "value2" };
diff --git a/resources/webidl2/test/invalid/idl/extattr-empty-ids.widl b/resources/webidl2/test/invalid/idl/extattr-empty-ids.widl
new file mode 100644
index 0000000..93c48c3
--- /dev/null
+++ b/resources/webidl2/test/invalid/idl/extattr-empty-ids.widl
@@ -0,0 +1,2 @@
+[Exposed=()]
+interface Unexposed {};
diff --git a/resources/webidl2/test/invalid/idl/id-underscored-number.widl b/resources/webidl2/test/invalid/idl/id-underscored-number.widl
new file mode 100644
index 0000000..d00121f
--- /dev/null
+++ b/resources/webidl2/test/invalid/idl/id-underscored-number.widl
@@ -0,0 +1 @@
+interface _0 {};
diff --git a/resources/webidl2/test/invalid/idl/implements_and_includes_ws.widl b/resources/webidl2/test/invalid/idl/implements_and_includes_ws.widl
new file mode 100644
index 0000000..6666dae
--- /dev/null
+++ b/resources/webidl2/test/invalid/idl/implements_and_includes_ws.widl
@@ -0,0 +1,4 @@
+// This hits the unshifting of whitespace in the "implements" and
+// "includes" productions. If there is a bug in that whitespace
+// rollback, the wrong exception will be produced.
+foobar;
diff --git a/resources/webidl2/test/invalid/idl/namespace-readwrite.widl b/resources/webidl2/test/invalid/idl/namespace-readwrite.widl
new file mode 100644
index 0000000..e184133
--- /dev/null
+++ b/resources/webidl2/test/invalid/idl/namespace-readwrite.widl
@@ -0,0 +1,3 @@
+namespace CSS {
+  attribute object readwrite;
+};
diff --git a/resources/webidl2/test/invalid/idl/nonnullableobjects.widl b/resources/webidl2/test/invalid/idl/nonnullableobjects.widl
index 1deac5a..6c875ff 100644
--- a/resources/webidl2/test/invalid/idl/nonnullableobjects.widl
+++ b/resources/webidl2/test/invalid/idl/nonnullableobjects.widl
@@ -1,5 +1,6 @@
 interface Foo {};
 
 interface NonNullable {
-  attribute Foo?? foo;
-};
\ No newline at end of file
+  attribute Foo??
+    foo;
+};
diff --git a/resources/webidl2/test/invalid/idl/promise-nullable.widl b/resources/webidl2/test/invalid/idl/promise-nullable.widl
new file mode 100644
index 0000000..894d7c0
--- /dev/null
+++ b/resources/webidl2/test/invalid/idl/promise-nullable.widl
@@ -0,0 +1,4 @@
+interface X {
+    attribute Promise<void>?
+        promise;
+};
diff --git a/resources/webidl2/test/invalid/idl/record-single.widl b/resources/webidl2/test/invalid/idl/record-single.widl
new file mode 100644
index 0000000..84db402
--- /dev/null
+++ b/resources/webidl2/test/invalid/idl/record-single.widl
@@ -0,0 +1,3 @@
+interface Foo {
+  void foo(record<DOMString> param);
+};
diff --git a/resources/webidl2/test/invalid/idl/spaced-negative-infinity.widl b/resources/webidl2/test/invalid/idl/spaced-negative-infinity.widl
new file mode 100644
index 0000000..3d71222
--- /dev/null
+++ b/resources/webidl2/test/invalid/idl/spaced-negative-infinity.widl
@@ -0,0 +1,3 @@
+interface X {
+    const float infinity = - Infinity;
+};
diff --git a/resources/webidl2/test/invalid/idl/spaced-variadic.widl b/resources/webidl2/test/invalid/idl/spaced-variadic.widl
new file mode 100644
index 0000000..6d77e18
--- /dev/null
+++ b/resources/webidl2/test/invalid/idl/spaced-variadic.widl
@@ -0,0 +1,3 @@
+interface X {
+    void operation(object . . . args);
+};
diff --git a/resources/webidl2/test/invalid/idl/union-dangling-or.widl b/resources/webidl2/test/invalid/idl/union-dangling-or.widl
new file mode 100644
index 0000000..0aa043e
--- /dev/null
+++ b/resources/webidl2/test/invalid/idl/union-dangling-or.widl
@@ -0,0 +1 @@
+typedef (One or Two or) UnionOr;
diff --git a/resources/webidl2/test/invalid/idl/union-one.widl b/resources/webidl2/test/invalid/idl/union-one.widl
new file mode 100644
index 0000000..86ee96f
--- /dev/null
+++ b/resources/webidl2/test/invalid/idl/union-one.widl
@@ -0,0 +1 @@
+typedef (OnlyOne) UnionOne;
diff --git a/resources/webidl2/test/invalid/idl/union-zero.widl b/resources/webidl2/test/invalid/idl/union-zero.widl
new file mode 100644
index 0000000..177fc4c
--- /dev/null
+++ b/resources/webidl2/test/invalid/idl/union-zero.widl
@@ -0,0 +1 @@
+typedef () UnionZero;
diff --git a/resources/webidl2/test/invalid/idl/unknown-generic.widl b/resources/webidl2/test/invalid/idl/unknown-generic.widl
new file mode 100644
index 0000000..ee4a2db
--- /dev/null
+++ b/resources/webidl2/test/invalid/idl/unknown-generic.widl
@@ -0,0 +1,3 @@
+interface FetchEvent : Event {
+  ResponsePromise<any> default();
+};
diff --git a/resources/webidl2/test/invalid/json/enum-empty.json b/resources/webidl2/test/invalid/json/enum-empty.json
new file mode 100644
index 0000000..734bc67
--- /dev/null
+++ b/resources/webidl2/test/invalid/json/enum-empty.json
@@ -0,0 +1,4 @@
+{
+    "message": "Got an error during or right after parsing `enum Empty`: No value in enum",
+    "line": 1
+}
diff --git a/resources/webidl2/test/invalid/json/enum-wo-comma.json b/resources/webidl2/test/invalid/json/enum-wo-comma.json
new file mode 100644
index 0000000..bfd0b09
--- /dev/null
+++ b/resources/webidl2/test/invalid/json/enum-wo-comma.json
@@ -0,0 +1,4 @@
+{
+    "message": "Got an error during or right after parsing `enum NoComma`: No comma between enum values",
+    "line": 1
+}
diff --git a/resources/webidl2/test/invalid/json/extattr-empty-ids.json b/resources/webidl2/test/invalid/json/extattr-empty-ids.json
new file mode 100644
index 0000000..4337f1e
--- /dev/null
+++ b/resources/webidl2/test/invalid/json/extattr-empty-ids.json
@@ -0,0 +1,4 @@
+{
+    "message": "Got an error before parsing any named definition: Expected identifiers but not found",
+    "line": 1
+}
diff --git a/resources/webidl2/test/invalid/json/id-underscored-number.json b/resources/webidl2/test/invalid/json/id-underscored-number.json
new file mode 100644
index 0000000..419ed94
--- /dev/null
+++ b/resources/webidl2/test/invalid/json/id-underscored-number.json
@@ -0,0 +1,4 @@
+{
+    "message": "Got an error before parsing any named definition: No name for interface",
+    "line": 1
+}
diff --git a/resources/webidl2/test/invalid/json/implements_and_includes_ws.json b/resources/webidl2/test/invalid/json/implements_and_includes_ws.json
new file mode 100644
index 0000000..ad9fac6
--- /dev/null
+++ b/resources/webidl2/test/invalid/json/implements_and_includes_ws.json
@@ -0,0 +1,4 @@
+{
+    "message": "Got an error before parsing any named definition: Unrecognised tokens",
+    "line": 4
+}
diff --git a/resources/webidl2/test/invalid/json/namespace-readwrite.json b/resources/webidl2/test/invalid/json/namespace-readwrite.json
new file mode 100644
index 0000000..d212151
--- /dev/null
+++ b/resources/webidl2/test/invalid/json/namespace-readwrite.json
@@ -0,0 +1,4 @@
+{
+    "message": "Got an error during or right after parsing `namespace CSS`: Attributes must be readonly in this context",
+    "line": 2
+}
diff --git a/resources/webidl2/test/invalid/json/nonnullableobjects.json b/resources/webidl2/test/invalid/json/nonnullableobjects.json
index 52bd8da..d470ec9 100644
--- a/resources/webidl2/test/invalid/json/nonnullableobjects.json
+++ b/resources/webidl2/test/invalid/json/nonnullableobjects.json
@@ -1,4 +1,4 @@
 {
-    "message":  "Got an error during or right after parsing `interface NonNullable`: Can't nullable more than once"
-,   "line":     4
+    "message": "Got an error during or right after parsing `interface NonNullable`: Can't nullable more than once",
+    "line": 4
 }
diff --git a/resources/webidl2/test/invalid/json/promise-nullable.json b/resources/webidl2/test/invalid/json/promise-nullable.json
new file mode 100644
index 0000000..ced51fa
--- /dev/null
+++ b/resources/webidl2/test/invalid/json/promise-nullable.json
@@ -0,0 +1,4 @@
+{
+    "message": "Got an error during or right after parsing `interface X`: Promise type cannot be nullable",
+    "line": 2
+}
diff --git a/resources/webidl2/test/invalid/json/readonly-iterable.json b/resources/webidl2/test/invalid/json/readonly-iterable.json
index 1a09264..a571b22 100644
--- a/resources/webidl2/test/invalid/json/readonly-iterable.json
+++ b/resources/webidl2/test/invalid/json/readonly-iterable.json
@@ -1,4 +1,4 @@
 {
-    "message": "Got an error during or right after parsing `interface ReadonlyIterable`: Invalid operation",
+    "message": "Got an error during or right after parsing `interface ReadonlyIterable`: Missing return type",
     "line": 2
 }
diff --git a/resources/webidl2/test/invalid/json/record-key.json b/resources/webidl2/test/invalid/json/record-key.json
index 179d645..6f1bb99 100644
--- a/resources/webidl2/test/invalid/json/record-key.json
+++ b/resources/webidl2/test/invalid/json/record-key.json
@@ -1,4 +1,4 @@
 {
-    "message": "Got an error during or right after parsing `interface Foo`: Record key must be DOMString, USVString, or ByteString",
+    "message": "Got an error during or right after parsing `interface Foo`: Record key must be a string type",
     "line": 2
 }
diff --git a/resources/webidl2/test/invalid/json/record-single.json b/resources/webidl2/test/invalid/json/record-single.json
new file mode 100644
index 0000000..ece4fb2
--- /dev/null
+++ b/resources/webidl2/test/invalid/json/record-single.json
@@ -0,0 +1,4 @@
+{
+    "message": "Got an error during or right after parsing `interface Foo`: Missing comma after record key type",
+    "line": 2
+}
diff --git a/resources/webidl2/test/invalid/json/spaced-negative-infinity.json b/resources/webidl2/test/invalid/json/spaced-negative-infinity.json
new file mode 100644
index 0000000..9e5d6180
--- /dev/null
+++ b/resources/webidl2/test/invalid/json/spaced-negative-infinity.json
@@ -0,0 +1,4 @@
+{
+    "message": "Got an error during or right after parsing `interface X`: No value for const",
+    "line": 2
+}
diff --git a/resources/webidl2/test/invalid/json/spaced-variadic.json b/resources/webidl2/test/invalid/json/spaced-variadic.json
new file mode 100644
index 0000000..0090abe
--- /dev/null
+++ b/resources/webidl2/test/invalid/json/spaced-variadic.json
@@ -0,0 +1,4 @@
+{
+    "message": "Got an error during or right after parsing `interface X`: Unterminated operation",
+    "line": 2
+}
diff --git a/resources/webidl2/test/invalid/json/stringconstants.json b/resources/webidl2/test/invalid/json/stringconstants.json
index 1eeb31c..745d6e6 100644
--- a/resources/webidl2/test/invalid/json/stringconstants.json
+++ b/resources/webidl2/test/invalid/json/stringconstants.json
@@ -1,4 +1,4 @@
 {
-    "message":  "Got an error during or right after parsing `interface Util`: No value for const"
+    "message":  "Got an error during or right after parsing `interface Util`: No type for const"
 ,   "line":     2
 }
diff --git a/resources/webidl2/test/invalid/json/typedef-nested.json b/resources/webidl2/test/invalid/json/typedef-nested.json
index 8c60814..e1843ce 100644
--- a/resources/webidl2/test/invalid/json/typedef-nested.json
+++ b/resources/webidl2/test/invalid/json/typedef-nested.json
@@ -1,4 +1,4 @@
 {
-    "message":  "Got an error during or right after parsing `interface Widget`: Invalid operation"
+    "message":  "Got an error during or right after parsing `interface Widget`: Missing return type"
 ,   "line":     14
 }
diff --git a/resources/webidl2/test/invalid/json/union-dangling-or.json b/resources/webidl2/test/invalid/json/union-dangling-or.json
new file mode 100644
index 0000000..68dfd8b
--- /dev/null
+++ b/resources/webidl2/test/invalid/json/union-dangling-or.json
@@ -0,0 +1,4 @@
+{
+    "message": "Got an error before parsing any named definition: No type after open parenthesis or 'or' in union type",
+    "line": 1
+}
diff --git a/resources/webidl2/test/invalid/json/union-one.json b/resources/webidl2/test/invalid/json/union-one.json
new file mode 100644
index 0000000..476403d
--- /dev/null
+++ b/resources/webidl2/test/invalid/json/union-one.json
@@ -0,0 +1,4 @@
+{
+    "message": "Got an error before parsing any named definition: At least two types are expected in a union type but found less",
+    "line": 1
+}
diff --git a/resources/webidl2/test/invalid/json/union-zero.json b/resources/webidl2/test/invalid/json/union-zero.json
new file mode 100644
index 0000000..68dfd8b
--- /dev/null
+++ b/resources/webidl2/test/invalid/json/union-zero.json
@@ -0,0 +1,4 @@
+{
+    "message": "Got an error before parsing any named definition: No type after open parenthesis or 'or' in union type",
+    "line": 1
+}
diff --git a/resources/webidl2/test/invalid/json/unknown-generic.json b/resources/webidl2/test/invalid/json/unknown-generic.json
new file mode 100644
index 0000000..3703db3
--- /dev/null
+++ b/resources/webidl2/test/invalid/json/unknown-generic.json
@@ -0,0 +1,4 @@
+{
+    "message": "Got an error during or right after parsing `interface FetchEvent`: Unsupported generic type ResponsePromise",
+    "line": 2
+}
diff --git a/resources/webidl2/test/syntax/idl/attributes.widl b/resources/webidl2/test/syntax/idl/attributes.widl
index 1d3d5c8..f665c1f 100644
--- a/resources/webidl2/test/syntax/idl/attributes.widl
+++ b/resources/webidl2/test/syntax/idl/attributes.widl
@@ -6,4 +6,6 @@
   // short can take.
   attribute unsigned short age;
 
-};
\ No newline at end of file
+  // required is an allowed attribute name
+  attribute any required;
+};
diff --git a/resources/webidl2/test/syntax/idl/generic.widl b/resources/webidl2/test/syntax/idl/generic.widl
index 12a1a3f..693cd32 100644
--- a/resources/webidl2/test/syntax/idl/generic.widl
+++ b/resources/webidl2/test/syntax/idl/generic.widl
@@ -1,5 +1,5 @@
 interface Foo {
-  Promise<ResponsePromise<sequence<DOMString?>>> bar();
+  Promise<Promise<sequence<DOMString?>>> bar();
   readonly attribute Promise<DOMString> baz;
 };
 
@@ -13,5 +13,5 @@
 // Extracted from https://slightlyoff.github.io/ServiceWorker/spec/service_worker/ on 2014-05-13
 
 interface FetchEvent : Event {
-  ResponsePromise<any> default();
+  Promise<any> default();
 };
diff --git a/resources/webidl2/test/syntax/idl/identifier-qualified-names.widl b/resources/webidl2/test/syntax/idl/identifier-qualified-names.widl
index 986d0bf..c39f84b 100644
--- a/resources/webidl2/test/syntax/idl/identifier-qualified-names.widl
+++ b/resources/webidl2/test/syntax/idl/identifier-qualified-names.widl
@@ -27,6 +27,7 @@
       attribute DOMString? _value;
     };
 
-interface Foo {
- void op(object interface);
-};
\ No newline at end of file
+interface FooEventTarget {
+  // Argument names allow some selected keywords
+  void addEventListener(EventListener? callback);
+};
diff --git a/resources/webidl2/test/syntax/idl/inherits-getter.widl b/resources/webidl2/test/syntax/idl/inherits-getter.widl
index 558e811..435b3ab 100644
--- a/resources/webidl2/test/syntax/idl/inherits-getter.widl
+++ b/resources/webidl2/test/syntax/idl/inherits-getter.widl
@@ -13,4 +13,10 @@
   // Its getter behavior is inherited from Animal, and need not be specified
   // the description of Person.
   inherit attribute DOMString name;
-};
\ No newline at end of file
+};
+
+interface Ghost : Person {
+
+  // An attribute that only inherits the getter behavior
+  inherit readonly attribute DOMString name;
+};
diff --git a/resources/webidl2/test/syntax/idl/linecomment.widl b/resources/webidl2/test/syntax/idl/linecomment.widl
deleted file mode 100644
index 5d31bdb..0000000
--- a/resources/webidl2/test/syntax/idl/linecomment.widl
+++ /dev/null
@@ -1,2 +0,0 @@
-/* first */
-// second
diff --git a/resources/webidl2/test/syntax/idl/promise-void.widl b/resources/webidl2/test/syntax/idl/promise-void.widl
new file mode 100644
index 0000000..c4eac3b
--- /dev/null
+++ b/resources/webidl2/test/syntax/idl/promise-void.widl
@@ -0,0 +1,3 @@
+interface Cat {
+    attribute Promise<void> meow;
+};
diff --git a/resources/webidl2/test/syntax/idl/record.widl b/resources/webidl2/test/syntax/idl/record.widl
index c8d9343..dbfad3a 100644
--- a/resources/webidl2/test/syntax/idl/record.widl
+++ b/resources/webidl2/test/syntax/idl/record.widl
@@ -2,9 +2,6 @@
 interface Foo {
   void foo(sequence<record<ByteString, any>> param);
   record<DOMString, (float or DOMString)?> bar();
-
-  // Make sure record can still be registered as a type.
-  record baz();
 };
 
 interface Bar {
diff --git a/resources/webidl2/test/syntax/idl/sequence.widl b/resources/webidl2/test/syntax/idl/sequence.widl
index d31056c..b47c982 100644
--- a/resources/webidl2/test/syntax/idl/sequence.widl
+++ b/resources/webidl2/test/syntax/idl/sequence.widl
@@ -6,11 +6,6 @@
   // ...
 };
 
-// Make sure sequence can still be registered as a type.
-interface Foo {
-  sequence bar();
-};
-
 // Extracted from https://heycam.github.io/webidl/#idl-type-extended-attribute-associated-with on 2017-07-01
 
 interface I {
diff --git a/resources/webidl2/test/syntax/json/allowany.json b/resources/webidl2/test/syntax/json/allowany.json
index cd5c6e0..2a93518 100644
--- a/resources/webidl2/test/syntax/json/allowany.json
+++ b/resources/webidl2/test/syntax/json/allowany.json
@@ -13,13 +13,14 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "void"
+                    "idlType": "void",
+                    "extAttrs": []
                 },
                 "name": "g",
+                "escapedName": "g",
                 "arguments": [],
                 "extAttrs": []
             },
@@ -32,27 +33,30 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "void"
+                    "idlType": "void",
+                    "extAttrs": []
                 },
                 "name": "g",
+                "escapedName": "g",
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "B"
+                            "idlType": "B",
+                            "extAttrs": []
                         },
-                        "name": "b"
+                        "name": "b",
+                        "escapedName": "b"
                     }
                 ],
                 "extAttrs": []
@@ -66,17 +70,19 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "void"
+                    "idlType": "void",
+                    "extAttrs": []
                 },
                 "name": "g",
+                "escapedName": "g",
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [
                             {
                                 "name": "AllowAny",
@@ -87,13 +93,14 @@
                         ],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "DOMString"
+                            "idlType": "DOMString",
+                            "extAttrs": []
                         },
-                        "name": "s"
+                        "name": "s",
+                        "escapedName": "s"
                     }
                 ],
                 "extAttrs": []
diff --git a/resources/webidl2/test/syntax/json/attributes.json b/resources/webidl2/test/syntax/json/attributes.json
index c90c70d..f02cb21 100644
--- a/resources/webidl2/test/syntax/json/attributes.json
+++ b/resources/webidl2/test/syntax/json/attributes.json
@@ -12,13 +12,32 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "unsigned short"
+                    "idlType": "unsigned short",
+                    "extAttrs": []
                 },
                 "name": "age",
+                "escapedName": "age",
+                "extAttrs": []
+            },
+            {
+                "type": "attribute",
+                "static": false,
+                "stringifier": false,
+                "inherit": false,
+                "readonly": false,
+                "idlType": {
+                    "type": "attribute-type",
+                    "generic": null,
+                    "nullable": false,
+                    "union": false,
+                    "idlType": "any",
+                    "extAttrs": []
+                },
+                "name": "required",
+                "escapedName": "required",
                 "extAttrs": []
             }
         ],
diff --git a/resources/webidl2/test/syntax/json/callback.json b/resources/webidl2/test/syntax/json/callback.json
index f31067d..89d63aa 100644
--- a/resources/webidl2/test/syntax/json/callback.json
+++ b/resources/webidl2/test/syntax/json/callback.json
@@ -4,26 +4,28 @@
         "name": "AsyncOperationCallback",
         "idlType": {
             "type": "return-type",
-            "sequence": false,
             "generic": null,
             "nullable": false,
             "union": false,
-            "idlType": "void"
+            "idlType": "void",
+            "extAttrs": []
         },
         "arguments": [
             {
                 "optional": false,
                 "variadic": false,
+                "default": null,
                 "extAttrs": [],
                 "idlType": {
                     "type": "argument-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "DOMString"
+                    "idlType": "DOMString",
+                    "extAttrs": []
                 },
-                "name": "status"
+                "name": "status",
+                "escapedName": "status"
             }
         ],
         "extAttrs": []
@@ -42,27 +44,30 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "void"
+                    "idlType": "void",
+                    "extAttrs": []
                 },
                 "name": "eventOccurred",
+                "escapedName": "eventOccurred",
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "DOMString"
+                            "idlType": "DOMString",
+                            "extAttrs": []
                         },
-                        "name": "details"
+                        "name": "details",
+                        "escapedName": "details"
                     }
                 ],
                 "extAttrs": []
@@ -76,40 +81,44 @@
         "name": "SortCallback",
         "idlType": {
             "type": "return-type",
-            "sequence": false,
             "generic": null,
             "nullable": false,
             "union": false,
-            "idlType": "boolean"
+            "idlType": "boolean",
+            "extAttrs": []
         },
         "arguments": [
             {
                 "optional": false,
                 "variadic": false,
+                "default": null,
                 "extAttrs": [],
                 "idlType": {
                     "type": "argument-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "any"
+                    "idlType": "any",
+                    "extAttrs": []
                 },
-                "name": "a"
+                "name": "a",
+                "escapedName": "a"
             },
             {
                 "optional": false,
                 "variadic": false,
+                "default": null,
                 "extAttrs": [],
                 "idlType": {
                     "type": "argument-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "any"
+                    "idlType": "any",
+                    "extAttrs": []
                 },
-                "name": "b"
+                "name": "b",
+                "escapedName": "b"
             }
         ],
         "extAttrs": []
diff --git a/resources/webidl2/test/syntax/json/constants.json b/resources/webidl2/test/syntax/json/constants.json
index 4b98751..ef2b8c4 100644
--- a/resources/webidl2/test/syntax/json/constants.json
+++ b/resources/webidl2/test/syntax/json/constants.json
@@ -9,7 +9,11 @@
                 "nullable": false,
                 "idlType": {
                     "type": "const-type",
-                    "idlType": "boolean"
+                    "generic": null,
+                    "nullable": false,
+                    "union": false,
+                    "idlType": "boolean",
+                    "extAttrs": []
                 },
                 "name": "DEBUG",
                 "value": {
@@ -23,7 +27,11 @@
                 "nullable": false,
                 "idlType": {
                     "type": "const-type",
-                    "idlType": "short"
+                    "generic": null,
+                    "nullable": false,
+                    "union": false,
+                    "idlType": "short",
+                    "extAttrs": []
                 },
                 "name": "negative",
                 "value": {
@@ -37,7 +45,11 @@
                 "nullable": false,
                 "idlType": {
                     "type": "const-type",
-                    "idlType": "octet"
+                    "generic": null,
+                    "nullable": false,
+                    "union": false,
+                    "idlType": "octet",
+                    "extAttrs": []
                 },
                 "name": "LF",
                 "value": {
@@ -51,7 +63,11 @@
                 "nullable": false,
                 "idlType": {
                     "type": "const-type",
-                    "idlType": "unsigned long"
+                    "generic": null,
+                    "nullable": false,
+                    "union": false,
+                    "idlType": "unsigned long",
+                    "extAttrs": []
                 },
                 "name": "BIT_MASK",
                 "value": {
@@ -65,7 +81,11 @@
                 "nullable": false,
                 "idlType": {
                     "type": "const-type",
-                    "idlType": "float"
+                    "generic": null,
+                    "nullable": false,
+                    "union": false,
+                    "idlType": "float",
+                    "extAttrs": []
                 },
                 "name": "AVOGADRO",
                 "value": {
@@ -79,7 +99,11 @@
                 "nullable": false,
                 "idlType": {
                     "type": "const-type",
-                    "idlType": "unrestricted float"
+                    "generic": null,
+                    "nullable": false,
+                    "union": false,
+                    "idlType": "unrestricted float",
+                    "extAttrs": []
                 },
                 "name": "sobig",
                 "value": {
@@ -93,7 +117,11 @@
                 "nullable": false,
                 "idlType": {
                     "type": "const-type",
-                    "idlType": "unrestricted double"
+                    "generic": null,
+                    "nullable": false,
+                    "union": false,
+                    "idlType": "unrestricted double",
+                    "extAttrs": []
                 },
                 "name": "minusonedividedbyzero",
                 "value": {
@@ -107,7 +135,11 @@
                 "nullable": false,
                 "idlType": {
                     "type": "const-type",
-                    "idlType": "short"
+                    "generic": null,
+                    "nullable": false,
+                    "union": false,
+                    "idlType": "short",
+                    "extAttrs": []
                 },
                 "name": "notanumber",
                 "value": {
diff --git a/resources/webidl2/test/syntax/json/constructor.json b/resources/webidl2/test/syntax/json/constructor.json
index 292236f..efdd1b5 100644
--- a/resources/webidl2/test/syntax/json/constructor.json
+++ b/resources/webidl2/test/syntax/json/constructor.json
@@ -12,13 +12,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "float"
+                    "idlType": "float",
+                    "extAttrs": []
                 },
                 "name": "r",
+                "escapedName": "r",
                 "extAttrs": []
             },
             {
@@ -29,13 +30,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "float"
+                    "idlType": "float",
+                    "extAttrs": []
                 },
                 "name": "cx",
+                "escapedName": "cx",
                 "extAttrs": []
             },
             {
@@ -46,13 +48,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "float"
+                    "idlType": "float",
+                    "extAttrs": []
                 },
                 "name": "cy",
+                "escapedName": "cy",
                 "extAttrs": []
             },
             {
@@ -63,13 +66,14 @@
                 "readonly": true,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "float"
+                    "idlType": "float",
+                    "extAttrs": []
                 },
                 "name": "circumference",
+                "escapedName": "circumference",
                 "extAttrs": []
             }
         ],
@@ -87,16 +91,18 @@
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "float"
+                            "idlType": "float",
+                            "extAttrs": []
                         },
-                        "name": "radius"
+                        "name": "radius",
+                        "escapedName": "radius"
                     }
                 ],
                 "type": "extended-attribute",
diff --git a/resources/webidl2/test/syntax/json/dictionary-inherits.json b/resources/webidl2/test/syntax/json/dictionary-inherits.json
index 9b928f4..595c35c 100644
--- a/resources/webidl2/test/syntax/json/dictionary-inherits.json
+++ b/resources/webidl2/test/syntax/json/dictionary-inherits.json
@@ -7,14 +7,15 @@
             {
                 "type": "field",
                 "name": "fillPattern",
+                "escapedName": "fillPattern",
                 "required": false,
                 "idlType": {
                     "type": "dictionary-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": true,
                     "union": false,
-                    "idlType": "DOMString"
+                    "idlType": "DOMString",
+                    "extAttrs": []
                 },
                 "extAttrs": [],
                 "default": {
@@ -25,14 +26,15 @@
             {
                 "type": "field",
                 "name": "strokePattern",
+                "escapedName": "strokePattern",
                 "required": false,
                 "idlType": {
                     "type": "dictionary-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": true,
                     "union": false,
-                    "idlType": "DOMString"
+                    "idlType": "DOMString",
+                    "extAttrs": []
                 },
                 "extAttrs": [],
                 "default": {
@@ -42,16 +44,18 @@
             {
                 "type": "field",
                 "name": "position",
+                "escapedName": "position",
                 "required": false,
                 "idlType": {
                     "type": "dictionary-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "Point"
+                    "idlType": "Point",
+                    "extAttrs": []
                 },
-                "extAttrs": []
+                "extAttrs": [],
+                "default": null
             }
         ],
         "inheritance": null,
@@ -65,16 +69,18 @@
             {
                 "type": "field",
                 "name": "hydrometry",
+                "escapedName": "hydrometry",
                 "required": false,
                 "idlType": {
                     "type": "dictionary-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "float"
+                    "idlType": "float",
+                    "extAttrs": []
                 },
-                "extAttrs": []
+                "extAttrs": [],
+                "default": null
             }
         ],
         "inheritance": "PaintOptions",
diff --git a/resources/webidl2/test/syntax/json/dictionary.json b/resources/webidl2/test/syntax/json/dictionary.json
index f74fedc..8bbc6b9 100644
--- a/resources/webidl2/test/syntax/json/dictionary.json
+++ b/resources/webidl2/test/syntax/json/dictionary.json
@@ -7,14 +7,15 @@
             {
                 "type": "field",
                 "name": "fillPattern",
+                "escapedName": "fillPattern",
                 "required": false,
                 "idlType": {
                     "type": "dictionary-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": true,
                     "union": false,
-                    "idlType": "DOMString"
+                    "idlType": "DOMString",
+                    "extAttrs": []
                 },
                 "extAttrs": [],
                 "default": {
@@ -25,14 +26,15 @@
             {
                 "type": "field",
                 "name": "strokePattern",
+                "escapedName": "strokePattern",
                 "required": false,
                 "idlType": {
                     "type": "dictionary-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": true,
                     "union": false,
-                    "idlType": "DOMString"
+                    "idlType": "DOMString",
+                    "extAttrs": []
                 },
                 "extAttrs": [],
                 "default": {
@@ -42,35 +44,38 @@
             {
                 "type": "field",
                 "name": "position",
+                "escapedName": "position",
                 "required": false,
                 "idlType": {
                     "type": "dictionary-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "Point"
+                    "idlType": "Point",
+                    "extAttrs": []
                 },
-                "extAttrs": []
+                "extAttrs": [],
+                "default": null
             },
             {
                 "type": "field",
                 "name": "seq",
+                "escapedName": "seq",
                 "required": false,
                 "idlType": {
                     "type": "dictionary-type",
-                    "sequence": true,
                     "generic": "sequence",
                     "nullable": false,
                     "union": false,
                     "idlType": {
                         "type": "dictionary-type",
-                        "sequence": false,
                         "generic": null,
                         "nullable": false,
                         "union": false,
-                        "idlType": "long"
-                    }
+                        "idlType": "long",
+                        "extAttrs": []
+                    },
+                    "extAttrs": []
                 },
                 "extAttrs": [],
                 "default": {
@@ -81,16 +86,18 @@
             {
                 "type": "field",
                 "name": "reqSeq",
+                "escapedName": "reqSeq",
                 "required": true,
                 "idlType": {
                     "type": "dictionary-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "long"
+                    "idlType": "long",
+                    "extAttrs": []
                 },
-                "extAttrs": []
+                "extAttrs": [],
+                "default": null
             }
         ],
         "inheritance": null,
@@ -104,30 +111,34 @@
             {
                 "type": "field",
                 "name": "h",
+                "escapedName": "h",
                 "required": false,
                 "idlType": {
                     "type": "dictionary-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "long"
+                    "idlType": "long",
+                    "extAttrs": []
                 },
-                "extAttrs": []
+                "extAttrs": [],
+                "default": null
             },
             {
                 "type": "field",
                 "name": "d",
+                "escapedName": "d",
                 "required": false,
                 "idlType": {
                     "type": "dictionary-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "long"
+                    "idlType": "long",
+                    "extAttrs": []
                 },
-                "extAttrs": []
+                "extAttrs": [],
+                "default": null
             }
         ],
         "extAttrs": []
diff --git a/resources/webidl2/test/syntax/json/enum.json b/resources/webidl2/test/syntax/json/enum.json
index 29d1c86..11f5d09 100644
--- a/resources/webidl2/test/syntax/json/enum.json
+++ b/resources/webidl2/test/syntax/json/enum.json
@@ -31,13 +31,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "MealType"
+                    "idlType": "MealType",
+                    "extAttrs": []
                 },
                 "name": "type",
+                "escapedName": "type",
                 "extAttrs": []
             },
             {
@@ -48,13 +49,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "float"
+                    "idlType": "float",
+                    "extAttrs": []
                 },
                 "name": "size",
+                "escapedName": "size",
                 "extAttrs": []
             },
             {
@@ -66,41 +68,46 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "void"
+                    "idlType": "void",
+                    "extAttrs": []
                 },
                 "name": "initialize",
+                "escapedName": "initialize",
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "MealType"
+                            "idlType": "MealType",
+                            "extAttrs": []
                         },
-                        "name": "type"
+                        "name": "type",
+                        "escapedName": "type"
                     },
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "float"
+                            "idlType": "float",
+                            "extAttrs": []
                         },
-                        "name": "size"
+                        "name": "size",
+                        "escapedName": "size"
                     }
                 ],
                 "extAttrs": []
diff --git a/resources/webidl2/test/syntax/json/equivalent-decl.json b/resources/webidl2/test/syntax/json/equivalent-decl.json
index de8d4db..ee079a7 100644
--- a/resources/webidl2/test/syntax/json/equivalent-decl.json
+++ b/resources/webidl2/test/syntax/json/equivalent-decl.json
@@ -12,13 +12,14 @@
                 "readonly": true,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "unsigned long"
+                    "idlType": "unsigned long",
+                    "extAttrs": []
                 },
                 "name": "propertyCount",
+                "escapedName": "propertyCount",
                 "extAttrs": []
             },
             {
@@ -30,27 +31,30 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "float"
+                    "idlType": "float",
+                    "extAttrs": []
                 },
                 "name": "getProperty",
+                "escapedName": "getProperty",
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "DOMString"
+                            "idlType": "DOMString",
+                            "extAttrs": []
                         },
-                        "name": "propertyName"
+                        "name": "propertyName",
+                        "escapedName": "propertyName"
                     }
                 ],
                 "extAttrs": []
@@ -64,41 +68,46 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "void"
+                    "idlType": "void",
+                    "extAttrs": []
                 },
                 "name": "setProperty",
+                "escapedName": "setProperty",
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "DOMString"
+                            "idlType": "DOMString",
+                            "extAttrs": []
                         },
-                        "name": "propertyName"
+                        "name": "propertyName",
+                        "escapedName": "propertyName"
                     },
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "float"
+                            "idlType": "float",
+                            "extAttrs": []
                         },
-                        "name": "propertyValue"
+                        "name": "propertyValue",
+                        "escapedName": "propertyValue"
                     }
                 ],
                 "extAttrs": []
@@ -120,13 +129,14 @@
                 "readonly": true,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "unsigned long"
+                    "idlType": "unsigned long",
+                    "extAttrs": []
                 },
                 "name": "propertyCount",
+                "escapedName": "propertyCount",
                 "extAttrs": []
             },
             {
@@ -138,27 +148,30 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "float"
+                    "idlType": "float",
+                    "extAttrs": []
                 },
                 "name": "getProperty",
+                "escapedName": "getProperty",
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "DOMString"
+                            "idlType": "DOMString",
+                            "extAttrs": []
                         },
-                        "name": "propertyName"
+                        "name": "propertyName",
+                        "escapedName": "propertyName"
                     }
                 ],
                 "extAttrs": []
@@ -172,41 +185,46 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "void"
+                    "idlType": "void",
+                    "extAttrs": []
                 },
                 "name": "setProperty",
+                "escapedName": "setProperty",
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "DOMString"
+                            "idlType": "DOMString",
+                            "extAttrs": []
                         },
-                        "name": "propertyName"
+                        "name": "propertyName",
+                        "escapedName": "propertyName"
                     },
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "float"
+                            "idlType": "float",
+                            "extAttrs": []
                         },
-                        "name": "propertyValue"
+                        "name": "propertyValue",
+                        "escapedName": "propertyValue"
                     }
                 ],
                 "extAttrs": []
@@ -220,27 +238,30 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "float"
+                    "idlType": "float",
+                    "extAttrs": []
                 },
                 "name": null,
+                "escapedName": null,
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "DOMString"
+                            "idlType": "DOMString",
+                            "extAttrs": []
                         },
-                        "name": "propertyName"
+                        "name": "propertyName",
+                        "escapedName": "propertyName"
                     }
                 ],
                 "extAttrs": []
@@ -254,41 +275,46 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "void"
+                    "idlType": "void",
+                    "extAttrs": []
                 },
                 "name": null,
+                "escapedName": null,
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "DOMString"
+                            "idlType": "DOMString",
+                            "extAttrs": []
                         },
-                        "name": "propertyName"
+                        "name": "propertyName",
+                        "escapedName": "propertyName"
                     },
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "float"
+                            "idlType": "float",
+                            "extAttrs": []
                         },
-                        "name": "propertyValue"
+                        "name": "propertyValue",
+                        "escapedName": "propertyValue"
                     }
                 ],
                 "extAttrs": []
diff --git a/resources/webidl2/test/syntax/json/extended-attributes.json b/resources/webidl2/test/syntax/json/extended-attributes.json
index e0dc236..25f56f0 100644
--- a/resources/webidl2/test/syntax/json/extended-attributes.json
+++ b/resources/webidl2/test/syntax/json/extended-attributes.json
@@ -78,13 +78,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "double"
+                    "idlType": "double",
+                    "extAttrs": []
                 },
                 "name": "r",
+                "escapedName": "r",
                 "extAttrs": []
             },
             {
@@ -95,13 +96,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "double"
+                    "idlType": "double",
+                    "extAttrs": []
                 },
                 "name": "cx",
+                "escapedName": "cx",
                 "extAttrs": []
             },
             {
@@ -112,13 +114,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "double"
+                    "idlType": "double",
+                    "extAttrs": []
                 },
                 "name": "cy",
+                "escapedName": "cy",
                 "extAttrs": []
             },
             {
@@ -129,13 +132,14 @@
                 "readonly": true,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "double"
+                    "idlType": "double",
+                    "extAttrs": []
                 },
                 "name": "circumference",
+                "escapedName": "circumference",
                 "extAttrs": []
             }
         ],
@@ -153,16 +157,18 @@
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "double"
+                            "idlType": "double",
+                            "extAttrs": []
                         },
-                        "name": "radius"
+                        "name": "radius",
+                        "escapedName": "radius"
                     }
                 ],
                 "type": "extended-attribute",
@@ -183,26 +189,25 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": true,
                     "idlType": [
                         {
                             "type": null,
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "long"
+                            "idlType": "long",
+                            "extAttrs": []
                         },
                         {
                             "type": null,
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "Node"
+                            "idlType": "Node",
+                            "extAttrs": []
                         }
                     ],
                     "extAttrs": [
@@ -215,6 +220,7 @@
                     ]
                 },
                 "name": "attrib",
+                "escapedName": "attrib",
                 "extAttrs": []
             }
         ],
diff --git a/resources/webidl2/test/syntax/json/generic.json b/resources/webidl2/test/syntax/json/generic.json
index 6259385..d3c26ac 100644
--- a/resources/webidl2/test/syntax/json/generic.json
+++ b/resources/webidl2/test/syntax/json/generic.json
@@ -13,34 +13,35 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": "Promise",
                     "nullable": false,
                     "union": false,
                     "idlType": {
                         "type": "return-type",
-                        "sequence": false,
-                        "generic": "ResponsePromise",
+                        "generic": "Promise",
                         "nullable": false,
                         "union": false,
                         "idlType": {
                             "type": "return-type",
-                            "sequence": true,
                             "generic": "sequence",
                             "nullable": false,
                             "union": false,
                             "idlType": {
                                 "type": "return-type",
-                                "sequence": false,
                                 "generic": null,
                                 "nullable": true,
                                 "union": false,
-                                "idlType": "DOMString"
-                            }
-                        }
-                    }
+                                "idlType": "DOMString",
+                                "extAttrs": []
+                            },
+                            "extAttrs": []
+                        },
+                        "extAttrs": []
+                    },
+                    "extAttrs": []
                 },
                 "name": "bar",
+                "escapedName": "bar",
                 "arguments": [],
                 "extAttrs": []
             },
@@ -52,20 +53,21 @@
                 "readonly": true,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": "Promise",
                     "nullable": false,
                     "union": false,
                     "idlType": {
                         "type": "attribute-type",
-                        "sequence": false,
                         "generic": null,
                         "nullable": false,
                         "union": false,
-                        "idlType": "DOMString"
-                    }
+                        "idlType": "DOMString",
+                        "extAttrs": []
+                    },
+                    "extAttrs": []
                 },
                 "name": "baz",
+                "escapedName": "baz",
                 "extAttrs": []
             }
         ],
@@ -86,20 +88,21 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": "Promise",
                     "nullable": false,
                     "union": false,
                     "idlType": {
                         "type": "return-type",
-                        "sequence": false,
                         "generic": null,
                         "nullable": true,
                         "union": false,
-                        "idlType": "Client"
-                    }
+                        "idlType": "Client",
+                        "extAttrs": []
+                    },
+                    "extAttrs": []
                 },
                 "name": "getServiced",
+                "escapedName": "getServiced",
                 "arguments": [],
                 "extAttrs": []
             },
@@ -112,20 +115,21 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": "Promise",
                     "nullable": false,
                     "union": false,
                     "idlType": {
                         "type": "return-type",
-                        "sequence": false,
                         "generic": null,
                         "nullable": false,
                         "union": false,
-                        "idlType": "any"
-                    }
+                        "idlType": "any",
+                        "extAttrs": []
+                    },
+                    "extAttrs": []
                 },
                 "name": "reloadAll",
+                "escapedName": "reloadAll",
                 "arguments": [],
                 "extAttrs": []
             }
@@ -147,20 +151,21 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
-                    "generic": "ResponsePromise",
+                    "generic": "Promise",
                     "nullable": false,
                     "union": false,
                     "idlType": {
                         "type": "return-type",
-                        "sequence": false,
                         "generic": null,
                         "nullable": false,
                         "union": false,
-                        "idlType": "any"
-                    }
+                        "idlType": "any",
+                        "extAttrs": []
+                    },
+                    "extAttrs": []
                 },
                 "name": "default",
+                "escapedName": "default",
                 "arguments": [],
                 "extAttrs": []
             }
diff --git a/resources/webidl2/test/syntax/json/getter-setter.json b/resources/webidl2/test/syntax/json/getter-setter.json
index 1213307..6f8196f 100644
--- a/resources/webidl2/test/syntax/json/getter-setter.json
+++ b/resources/webidl2/test/syntax/json/getter-setter.json
@@ -12,13 +12,14 @@
                 "readonly": true,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "unsigned long"
+                    "idlType": "unsigned long",
+                    "extAttrs": []
                 },
                 "name": "propertyCount",
+                "escapedName": "propertyCount",
                 "extAttrs": []
             },
             {
@@ -30,27 +31,30 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "float"
+                    "idlType": "float",
+                    "extAttrs": []
                 },
                 "name": null,
+                "escapedName": null,
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "DOMString"
+                            "idlType": "DOMString",
+                            "extAttrs": []
                         },
-                        "name": "propertyName"
+                        "name": "propertyName",
+                        "escapedName": "propertyName"
                     }
                 ],
                 "extAttrs": []
@@ -64,41 +68,46 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "void"
+                    "idlType": "void",
+                    "extAttrs": []
                 },
                 "name": null,
+                "escapedName": null,
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "DOMString"
+                            "idlType": "DOMString",
+                            "extAttrs": []
                         },
-                        "name": "propertyName"
+                        "name": "propertyName",
+                        "escapedName": "propertyName"
                     },
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "float"
+                            "idlType": "float",
+                            "extAttrs": []
                         },
-                        "name": "propertyValue"
+                        "name": "propertyValue",
+                        "escapedName": "propertyValue"
                     }
                 ],
                 "extAttrs": []
diff --git a/resources/webidl2/test/syntax/json/identifier-qualified-names.json b/resources/webidl2/test/syntax/json/identifier-qualified-names.json
index f4e295a..098cdcb 100644
--- a/resources/webidl2/test/syntax/json/identifier-qualified-names.json
+++ b/resources/webidl2/test/syntax/json/identifier-qualified-names.json
@@ -3,11 +3,11 @@
         "type": "typedef",
         "idlType": {
             "type": "typedef-type",
-            "sequence": false,
             "generic": null,
             "nullable": false,
             "union": false,
-            "idlType": "float"
+            "idlType": "float",
+            "extAttrs": []
         },
         "name": "number",
         "extAttrs": []
@@ -26,27 +26,30 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "object"
+                    "idlType": "object",
+                    "extAttrs": []
                 },
                 "name": "createObject",
+                "escapedName": "createObject",
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "DOMString"
+                            "idlType": "DOMString",
+                            "extAttrs": []
                         },
-                        "name": "interface"
+                        "name": "interface",
+                        "escapedName": "_interface"
                     }
                 ],
                 "extAttrs": []
@@ -60,27 +63,30 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "DOMString"
+                    "idlType": "DOMString",
+                    "extAttrs": []
                 },
                 "name": null,
+                "escapedName": null,
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "DOMString"
+                            "idlType": "DOMString",
+                            "extAttrs": []
                         },
-                        "name": "keyName"
+                        "name": "keyName",
+                        "escapedName": "keyName"
                     }
                 ],
                 "extAttrs": []
@@ -102,13 +108,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "boolean"
+                    "idlType": "boolean",
+                    "extAttrs": []
                 },
                 "name": "const",
+                "escapedName": "_const",
                 "extAttrs": []
             },
             {
@@ -119,13 +126,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": true,
                     "union": false,
-                    "idlType": "DOMString"
+                    "idlType": "DOMString",
+                    "extAttrs": []
                 },
                 "name": "value",
+                "escapedName": "_value",
                 "extAttrs": []
             }
         ],
@@ -134,7 +142,7 @@
     },
     {
         "type": "interface",
-        "name": "Foo",
+        "name": "FooEventTarget",
         "partial": false,
         "members": [
             {
@@ -146,27 +154,30 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "void"
+                    "idlType": "void",
+                    "extAttrs": []
                 },
-                "name": "op",
+                "name": "addEventListener",
+                "escapedName": "addEventListener",
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
-                            "nullable": false,
+                            "nullable": true,
                             "union": false,
-                            "idlType": "object"
+                            "idlType": "EventListener",
+                            "extAttrs": []
                         },
-                        "name": "interface"
+                        "name": "callback",
+                        "escapedName": "callback"
                     }
                 ],
                 "extAttrs": []
diff --git a/resources/webidl2/test/syntax/json/implements.json b/resources/webidl2/test/syntax/json/implements.json
index 69879d9..1736118 100644
--- a/resources/webidl2/test/syntax/json/implements.json
+++ b/resources/webidl2/test/syntax/json/implements.json
@@ -12,13 +12,14 @@
                 "readonly": true,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "unsigned short"
+                    "idlType": "unsigned short",
+                    "extAttrs": []
                 },
                 "name": "nodeType",
+                "escapedName": "nodeType",
                 "extAttrs": []
             }
         ],
@@ -39,55 +40,62 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "void"
+                    "idlType": "void",
+                    "extAttrs": []
                 },
                 "name": "addEventListener",
+                "escapedName": "addEventListener",
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "DOMString"
+                            "idlType": "DOMString",
+                            "extAttrs": []
                         },
-                        "name": "type"
+                        "name": "type",
+                        "escapedName": "type"
                     },
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "EventListener"
+                            "idlType": "EventListener",
+                            "extAttrs": []
                         },
-                        "name": "listener"
+                        "name": "listener",
+                        "escapedName": "listener"
                     },
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "boolean"
+                            "idlType": "boolean",
+                            "extAttrs": []
                         },
-                        "name": "useCapture"
+                        "name": "useCapture",
+                        "escapedName": "useCapture"
                     }
                 ],
                 "extAttrs": []
diff --git a/resources/webidl2/test/syntax/json/indexed-properties.json b/resources/webidl2/test/syntax/json/indexed-properties.json
index 697b595..dccd511 100644
--- a/resources/webidl2/test/syntax/json/indexed-properties.json
+++ b/resources/webidl2/test/syntax/json/indexed-properties.json
@@ -12,13 +12,14 @@
                 "readonly": true,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "unsigned long"
+                    "idlType": "unsigned long",
+                    "extAttrs": []
                 },
                 "name": "size",
+                "escapedName": "size",
                 "extAttrs": []
             },
             {
@@ -30,27 +31,30 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "any"
+                    "idlType": "any",
+                    "extAttrs": []
                 },
                 "name": "getByIndex",
+                "escapedName": "getByIndex",
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "unsigned long"
+                            "idlType": "unsigned long",
+                            "extAttrs": []
                         },
-                        "name": "index"
+                        "name": "index",
+                        "escapedName": "index"
                     }
                 ],
                 "extAttrs": []
@@ -64,41 +68,46 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "void"
+                    "idlType": "void",
+                    "extAttrs": []
                 },
                 "name": "setByIndex",
+                "escapedName": "setByIndex",
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "unsigned long"
+                            "idlType": "unsigned long",
+                            "extAttrs": []
                         },
-                        "name": "index"
+                        "name": "index",
+                        "escapedName": "index"
                     },
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "any"
+                            "idlType": "any",
+                            "extAttrs": []
                         },
-                        "name": "value"
+                        "name": "value",
+                        "escapedName": "value"
                     }
                 ],
                 "extAttrs": []
@@ -112,27 +121,30 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "void"
+                    "idlType": "void",
+                    "extAttrs": []
                 },
                 "name": "removeByIndex",
+                "escapedName": "removeByIndex",
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "unsigned long"
+                            "idlType": "unsigned long",
+                            "extAttrs": []
                         },
-                        "name": "index"
+                        "name": "index",
+                        "escapedName": "index"
                     }
                 ],
                 "extAttrs": []
@@ -146,27 +158,30 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "any"
+                    "idlType": "any",
+                    "extAttrs": []
                 },
                 "name": "get",
+                "escapedName": "get",
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "DOMString"
+                            "idlType": "DOMString",
+                            "extAttrs": []
                         },
-                        "name": "name"
+                        "name": "name",
+                        "escapedName": "name"
                     }
                 ],
                 "extAttrs": []
@@ -180,41 +195,46 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "void"
+                    "idlType": "void",
+                    "extAttrs": []
                 },
                 "name": "set",
+                "escapedName": "set",
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "DOMString"
+                            "idlType": "DOMString",
+                            "extAttrs": []
                         },
-                        "name": "name"
+                        "name": "name",
+                        "escapedName": "name"
                     },
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "any"
+                            "idlType": "any",
+                            "extAttrs": []
                         },
-                        "name": "value"
+                        "name": "value",
+                        "escapedName": "value"
                     }
                 ],
                 "extAttrs": []
@@ -228,27 +248,30 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "void"
+                    "idlType": "void",
+                    "extAttrs": []
                 },
                 "name": "remove",
+                "escapedName": "remove",
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "DOMString"
+                            "idlType": "DOMString",
+                            "extAttrs": []
                         },
-                        "name": "name"
+                        "name": "name",
+                        "escapedName": "name"
                     }
                 ],
                 "extAttrs": []
diff --git a/resources/webidl2/test/syntax/json/inherits-getter.json b/resources/webidl2/test/syntax/json/inherits-getter.json
index 818d8b6..86eb68e 100644
--- a/resources/webidl2/test/syntax/json/inherits-getter.json
+++ b/resources/webidl2/test/syntax/json/inherits-getter.json
@@ -12,13 +12,14 @@
                 "readonly": true,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "DOMString"
+                    "idlType": "DOMString",
+                    "extAttrs": []
                 },
                 "name": "name",
+                "escapedName": "name",
                 "extAttrs": []
             }
         ],
@@ -38,13 +39,14 @@
                 "readonly": true,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "unsigned short"
+                    "idlType": "unsigned short",
+                    "extAttrs": []
                 },
                 "name": "age",
+                "escapedName": "age",
                 "extAttrs": []
             },
             {
@@ -55,17 +57,45 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "DOMString"
+                    "idlType": "DOMString",
+                    "extAttrs": []
                 },
                 "name": "name",
+                "escapedName": "name",
                 "extAttrs": []
             }
         ],
         "inheritance": "Animal",
         "extAttrs": []
+    },
+    {
+        "type": "interface",
+        "name": "Ghost",
+        "partial": false,
+        "members": [
+            {
+                "type": "attribute",
+                "static": false,
+                "stringifier": false,
+                "inherit": true,
+                "readonly": true,
+                "idlType": {
+                    "type": "attribute-type",
+                    "generic": null,
+                    "nullable": false,
+                    "union": false,
+                    "idlType": "DOMString",
+                    "extAttrs": []
+                },
+                "name": "name",
+                "escapedName": "name",
+                "extAttrs": []
+            }
+        ],
+        "inheritance": "Person",
+        "extAttrs": []
     }
 ]
diff --git a/resources/webidl2/test/syntax/json/interface-inherits.json b/resources/webidl2/test/syntax/json/interface-inherits.json
index 74a4c39..02caf35 100644
--- a/resources/webidl2/test/syntax/json/interface-inherits.json
+++ b/resources/webidl2/test/syntax/json/interface-inherits.json
@@ -12,13 +12,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "DOMString"
+                    "idlType": "DOMString",
+                    "extAttrs": []
                 },
                 "name": "name",
+                "escapedName": "name",
                 "extAttrs": []
             }
         ],
@@ -38,13 +39,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "Dog"
+                    "idlType": "Dog",
+                    "extAttrs": []
                 },
                 "name": "pet",
+                "escapedName": "pet",
                 "extAttrs": []
             }
         ],
@@ -64,13 +66,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "Human"
+                    "idlType": "Human",
+                    "extAttrs": []
                 },
                 "name": "owner",
+                "escapedName": "owner",
                 "extAttrs": []
             }
         ],
diff --git a/resources/webidl2/test/syntax/json/iterable.json b/resources/webidl2/test/syntax/json/iterable.json
index 7126a4e..ee906f7 100644
--- a/resources/webidl2/test/syntax/json/iterable.json
+++ b/resources/webidl2/test/syntax/json/iterable.json
@@ -9,11 +9,11 @@
                 "idlType": [
                     {
                         "type": null,
-                        "sequence": false,
                         "generic": null,
                         "nullable": false,
                         "union": false,
-                        "idlType": "long"
+                        "idlType": "long",
+                        "extAttrs": []
                     }
                 ],
                 "extAttrs": []
@@ -32,19 +32,19 @@
                 "idlType": [
                     {
                         "type": null,
-                        "sequence": false,
                         "generic": null,
                         "nullable": false,
                         "union": false,
-                        "idlType": "short"
+                        "idlType": "short",
+                        "extAttrs": []
                     },
                     {
                         "type": null,
-                        "sequence": false,
                         "generic": null,
                         "nullable": true,
                         "union": false,
-                        "idlType": "double"
+                        "idlType": "double",
+                        "extAttrs": []
                     }
                 ],
                 "extAttrs": []
@@ -63,7 +63,6 @@
                 "idlType": [
                     {
                         "type": null,
-                        "sequence": false,
                         "generic": null,
                         "nullable": false,
                         "union": false,
diff --git a/resources/webidl2/test/syntax/json/legacyiterable.json b/resources/webidl2/test/syntax/json/legacyiterable.json
index 5a1e526..80fd000 100644
--- a/resources/webidl2/test/syntax/json/legacyiterable.json
+++ b/resources/webidl2/test/syntax/json/legacyiterable.json
@@ -9,11 +9,11 @@
                 "idlType": [
                     {
                         "type": null,
-                        "sequence": false,
                         "generic": null,
                         "nullable": false,
                         "union": false,
-                        "idlType": "long"
+                        "idlType": "long",
+                        "extAttrs": []
                     }
                 ],
                 "extAttrs": []
diff --git a/resources/webidl2/test/syntax/json/linecomment.json b/resources/webidl2/test/syntax/json/linecomment.json
deleted file mode 100644
index 11fd14f..0000000
--- a/resources/webidl2/test/syntax/json/linecomment.json
+++ /dev/null
@@ -1,14 +0,0 @@
-[
-    {
-        "type": "multiline-comment",
-        "value": " first "
-    },
-    {
-        "type": "ws",
-        "value": "\n"
-    },
-    {
-        "type": "line-comment",
-        "value": " second"
-    }
-]
diff --git a/resources/webidl2/test/syntax/json/maplike.json b/resources/webidl2/test/syntax/json/maplike.json
index b86e104..2cb8c36 100644
--- a/resources/webidl2/test/syntax/json/maplike.json
+++ b/resources/webidl2/test/syntax/json/maplike.json
@@ -9,19 +9,19 @@
                 "idlType": [
                     {
                         "type": null,
-                        "sequence": false,
                         "generic": null,
                         "nullable": false,
                         "union": false,
-                        "idlType": "long"
+                        "idlType": "long",
+                        "extAttrs": []
                     },
                     {
                         "type": null,
-                        "sequence": false,
                         "generic": null,
                         "nullable": false,
                         "union": false,
-                        "idlType": "float"
+                        "idlType": "float",
+                        "extAttrs": []
                     }
                 ],
                 "readonly": false,
@@ -41,19 +41,19 @@
                 "idlType": [
                     {
                         "type": null,
-                        "sequence": false,
                         "generic": null,
                         "nullable": false,
                         "union": false,
-                        "idlType": "long"
+                        "idlType": "long",
+                        "extAttrs": []
                     },
                     {
                         "type": null,
-                        "sequence": false,
                         "generic": null,
                         "nullable": false,
                         "union": false,
-                        "idlType": "float"
+                        "idlType": "float",
+                        "extAttrs": []
                     }
                 ],
                 "readonly": true,
@@ -73,7 +73,6 @@
                 "idlType": [
                     {
                         "type": null,
-                        "sequence": false,
                         "generic": null,
                         "nullable": false,
                         "union": false,
@@ -89,7 +88,6 @@
                     },
                     {
                         "type": null,
-                        "sequence": false,
                         "generic": null,
                         "nullable": false,
                         "union": false,
diff --git a/resources/webidl2/test/syntax/json/mixin.json b/resources/webidl2/test/syntax/json/mixin.json
index f0458e2..b037cb3 100644
--- a/resources/webidl2/test/syntax/json/mixin.json
+++ b/resources/webidl2/test/syntax/json/mixin.json
@@ -12,13 +12,14 @@
                 "readonly": true,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "Crypto"
+                    "idlType": "Crypto",
+                    "extAttrs": []
                 },
                 "name": "crypto",
+                "escapedName": "crypto",
                 "extAttrs": []
             }
         ],
@@ -49,13 +50,14 @@
                 "readonly": true,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "Crypto"
+                    "idlType": "Crypto",
+                    "extAttrs": []
                 },
                 "name": "crypto",
+                "escapedName": "crypto",
                 "extAttrs": []
             }
         ],
diff --git a/resources/webidl2/test/syntax/json/namedconstructor.json b/resources/webidl2/test/syntax/json/namedconstructor.json
index f895461..deb429e 100644
--- a/resources/webidl2/test/syntax/json/namedconstructor.json
+++ b/resources/webidl2/test/syntax/json/namedconstructor.json
@@ -21,16 +21,18 @@
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "DOMString"
+                            "idlType": "DOMString",
+                            "extAttrs": []
                         },
-                        "name": "src"
+                        "name": "src",
+                        "escapedName": "src"
                     }
                 ],
                 "type": "extended-attribute",
diff --git a/resources/webidl2/test/syntax/json/namespace.json b/resources/webidl2/test/syntax/json/namespace.json
index 0611b71..9e37b26 100644
--- a/resources/webidl2/test/syntax/json/namespace.json
+++ b/resources/webidl2/test/syntax/json/namespace.json
@@ -12,13 +12,14 @@
                 "readonly": true,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "Vector"
+                    "idlType": "Vector",
+                    "extAttrs": []
                 },
                 "name": "unit",
+                "escapedName": "unit",
                 "extAttrs": []
             },
             {
@@ -30,41 +31,46 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "double"
+                    "idlType": "double",
+                    "extAttrs": []
                 },
                 "name": "dotProduct",
+                "escapedName": "dotProduct",
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "Vector"
+                            "idlType": "Vector",
+                            "extAttrs": []
                         },
-                        "name": "x"
+                        "name": "x",
+                        "escapedName": "x"
                     },
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "Vector"
+                            "idlType": "Vector",
+                            "extAttrs": []
                         },
-                        "name": "y"
+                        "name": "y",
+                        "escapedName": "y"
                     }
                 ],
                 "extAttrs": []
@@ -78,41 +84,46 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "Vector"
+                    "idlType": "Vector",
+                    "extAttrs": []
                 },
                 "name": "crossProduct",
+                "escapedName": "crossProduct",
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "Vector"
+                            "idlType": "Vector",
+                            "extAttrs": []
                         },
-                        "name": "x"
+                        "name": "x",
+                        "escapedName": "x"
                     },
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "Vector"
+                            "idlType": "Vector",
+                            "extAttrs": []
                         },
-                        "name": "y"
+                        "name": "y",
+                        "escapedName": "y"
                     }
                 ],
                 "extAttrs": []
diff --git a/resources/webidl2/test/syntax/json/nointerfaceobject.json b/resources/webidl2/test/syntax/json/nointerfaceobject.json
index 03bb994..cafb5e0 100644
--- a/resources/webidl2/test/syntax/json/nointerfaceobject.json
+++ b/resources/webidl2/test/syntax/json/nointerfaceobject.json
@@ -13,27 +13,30 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "any"
+                    "idlType": "any",
+                    "extAttrs": []
                 },
                 "name": "lookupEntry",
+                "escapedName": "lookupEntry",
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "unsigned long"
+                            "idlType": "unsigned long",
+                            "extAttrs": []
                         },
-                        "name": "key"
+                        "name": "key",
+                        "escapedName": "key"
                     }
                 ],
                 "extAttrs": []
diff --git a/resources/webidl2/test/syntax/json/nullable.json b/resources/webidl2/test/syntax/json/nullable.json
index ae4d2aa..f325e2e 100644
--- a/resources/webidl2/test/syntax/json/nullable.json
+++ b/resources/webidl2/test/syntax/json/nullable.json
@@ -9,7 +9,11 @@
                 "nullable": true,
                 "idlType": {
                     "type": "const-type",
-                    "idlType": "boolean"
+                    "generic": null,
+                    "nullable": false,
+                    "union": false,
+                    "idlType": "boolean",
+                    "extAttrs": []
                 },
                 "name": "ARE_WE_THERE_YET",
                 "value": {
@@ -35,13 +39,14 @@
                 "readonly": true,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": true,
                     "union": false,
-                    "idlType": "DOMString"
+                    "idlType": "DOMString",
+                    "extAttrs": []
                 },
                 "name": "namespaceURI",
+                "escapedName": "namespaceURI",
                 "extAttrs": []
             }
         ],
diff --git a/resources/webidl2/test/syntax/json/nullableobjects.json b/resources/webidl2/test/syntax/json/nullableobjects.json
index 29d1314..27ecd25 100644
--- a/resources/webidl2/test/syntax/json/nullableobjects.json
+++ b/resources/webidl2/test/syntax/json/nullableobjects.json
@@ -29,27 +29,30 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "void"
+                    "idlType": "void",
+                    "extAttrs": []
                 },
                 "name": "f",
+                "escapedName": "f",
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": true,
                             "union": false,
-                            "idlType": "A"
+                            "idlType": "A",
+                            "extAttrs": []
                         },
-                        "name": "x"
+                        "name": "x",
+                        "escapedName": "x"
                     }
                 ],
                 "extAttrs": []
@@ -63,27 +66,30 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "void"
+                    "idlType": "void",
+                    "extAttrs": []
                 },
                 "name": "f",
+                "escapedName": "f",
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": true,
                             "union": false,
-                            "idlType": "B"
+                            "idlType": "B",
+                            "extAttrs": []
                         },
-                        "name": "x"
+                        "name": "x",
+                        "escapedName": "x"
                     }
                 ],
                 "extAttrs": []
diff --git a/resources/webidl2/test/syntax/json/operation-optional-arg.json b/resources/webidl2/test/syntax/json/operation-optional-arg.json
index 44c3a16..4b7436b 100644
--- a/resources/webidl2/test/syntax/json/operation-optional-arg.json
+++ b/resources/webidl2/test/syntax/json/operation-optional-arg.json
@@ -13,73 +13,81 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "object"
+                    "idlType": "object",
+                    "extAttrs": []
                 },
                 "name": "createColor",
+                "escapedName": "createColor",
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "float"
+                            "idlType": "float",
+                            "extAttrs": []
                         },
-                        "name": "v1"
+                        "name": "v1",
+                        "escapedName": "v1"
                     },
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "float"
+                            "idlType": "float",
+                            "extAttrs": []
                         },
-                        "name": "v2"
+                        "name": "v2",
+                        "escapedName": "v2"
                     },
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "float"
+                            "idlType": "float",
+                            "extAttrs": []
                         },
-                        "name": "v3"
+                        "name": "v3",
+                        "escapedName": "v3"
                     },
                     {
                         "optional": true,
                         "variadic": false,
-                        "extAttrs": [],
-                        "idlType": {
-                            "type": "argument-type",
-                            "sequence": false,
-                            "generic": null,
-                            "nullable": false,
-                            "union": false,
-                            "idlType": "float"
-                        },
-                        "name": "alpha",
                         "default": {
                             "type": "number",
                             "value": "3.5"
-                        }
+                        },
+                        "extAttrs": [],
+                        "idlType": {
+                            "type": "argument-type",
+                            "generic": null,
+                            "nullable": false,
+                            "union": false,
+                            "idlType": "float",
+                            "extAttrs": []
+                        },
+                        "name": "alpha",
+                        "escapedName": "alpha"
                     }
                 ],
                 "extAttrs": []
diff --git a/resources/webidl2/test/syntax/json/overloading.json b/resources/webidl2/test/syntax/json/overloading.json
index 87169e9..bf7aca6 100644
--- a/resources/webidl2/test/syntax/json/overloading.json
+++ b/resources/webidl2/test/syntax/json/overloading.json
@@ -29,27 +29,30 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "void"
+                    "idlType": "void",
+                    "extAttrs": []
                 },
                 "name": "f",
+                "escapedName": "f",
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "A"
+                            "idlType": "A",
+                            "extAttrs": []
                         },
-                        "name": "x"
+                        "name": "x",
+                        "escapedName": "x"
                     }
                 ],
                 "extAttrs": []
@@ -63,27 +66,30 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "void"
+                    "idlType": "void",
+                    "extAttrs": []
                 },
                 "name": "f",
+                "escapedName": "f",
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "B"
+                            "idlType": "B",
+                            "extAttrs": []
                         },
-                        "name": "x"
+                        "name": "x",
+                        "escapedName": "x"
                     }
                 ],
                 "extAttrs": []
@@ -106,27 +112,30 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "void"
+                    "idlType": "void",
+                    "extAttrs": []
                 },
                 "name": "f",
+                "escapedName": "f",
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "DOMString"
+                            "idlType": "DOMString",
+                            "extAttrs": []
                         },
-                        "name": "a"
+                        "name": "a",
+                        "escapedName": "a"
                     }
                 ],
                 "extAttrs": []
@@ -140,17 +149,19 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "void"
+                    "idlType": "void",
+                    "extAttrs": []
                 },
                 "name": "f",
+                "escapedName": "f",
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [
                             {
                                 "name": "AllowAny",
@@ -161,41 +172,46 @@
                         ],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "DOMString"
+                            "idlType": "DOMString",
+                            "extAttrs": []
                         },
-                        "name": "a"
+                        "name": "a",
+                        "escapedName": "a"
                     },
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "DOMString"
+                            "idlType": "DOMString",
+                            "extAttrs": []
                         },
-                        "name": "b"
+                        "name": "b",
+                        "escapedName": "b"
                     },
                     {
                         "optional": false,
                         "variadic": true,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "float"
+                            "idlType": "float",
+                            "extAttrs": []
                         },
-                        "name": "c"
+                        "name": "c",
+                        "escapedName": "c"
                     }
                 ],
                 "extAttrs": []
@@ -209,13 +225,14 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "void"
+                    "idlType": "void",
+                    "extAttrs": []
                 },
                 "name": "f",
+                "escapedName": "f",
                 "arguments": [],
                 "extAttrs": []
             },
@@ -228,69 +245,78 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "void"
+                    "idlType": "void",
+                    "extAttrs": []
                 },
                 "name": "f",
+                "escapedName": "f",
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "long"
+                            "idlType": "long",
+                            "extAttrs": []
                         },
-                        "name": "a"
+                        "name": "a",
+                        "escapedName": "a"
                     },
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "DOMString"
+                            "idlType": "DOMString",
+                            "extAttrs": []
                         },
-                        "name": "b"
+                        "name": "b",
+                        "escapedName": "b"
                     },
                     {
                         "optional": true,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "DOMString"
+                            "idlType": "DOMString",
+                            "extAttrs": []
                         },
-                        "name": "c"
+                        "name": "c",
+                        "escapedName": "c"
                     },
                     {
                         "optional": false,
                         "variadic": true,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "float"
+                            "idlType": "float",
+                            "extAttrs": []
                         },
-                        "name": "d"
+                        "name": "d",
+                        "escapedName": "d"
                     }
                 ],
                 "extAttrs": []
diff --git a/resources/webidl2/test/syntax/json/overridebuiltins.json b/resources/webidl2/test/syntax/json/overridebuiltins.json
index d63f8f7..e54a468 100644
--- a/resources/webidl2/test/syntax/json/overridebuiltins.json
+++ b/resources/webidl2/test/syntax/json/overridebuiltins.json
@@ -12,13 +12,14 @@
                 "readonly": true,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "unsigned long"
+                    "idlType": "unsigned long",
+                    "extAttrs": []
                 },
                 "name": "length",
+                "escapedName": "length",
                 "extAttrs": []
             },
             {
@@ -30,27 +31,30 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "DOMString"
+                    "idlType": "DOMString",
+                    "extAttrs": []
                 },
                 "name": "lookup",
+                "escapedName": "lookup",
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "DOMString"
+                            "idlType": "DOMString",
+                            "extAttrs": []
                         },
-                        "name": "key"
+                        "name": "key",
+                        "escapedName": "key"
                     }
                 ],
                 "extAttrs": []
diff --git a/resources/webidl2/test/syntax/json/partial-interface.json b/resources/webidl2/test/syntax/json/partial-interface.json
index c16c64d..d791262 100644
--- a/resources/webidl2/test/syntax/json/partial-interface.json
+++ b/resources/webidl2/test/syntax/json/partial-interface.json
@@ -12,13 +12,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "DOMString"
+                    "idlType": "DOMString",
+                    "extAttrs": []
                 },
                 "name": "bar",
+                "escapedName": "bar",
                 "extAttrs": []
             }
         ],
@@ -38,13 +39,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "DOMString"
+                    "idlType": "DOMString",
+                    "extAttrs": []
                 },
                 "name": "quux",
+                "escapedName": "quux",
                 "extAttrs": []
             }
         ],
diff --git a/resources/webidl2/test/syntax/json/primitives.json b/resources/webidl2/test/syntax/json/primitives.json
index cf96539..a216221 100644
--- a/resources/webidl2/test/syntax/json/primitives.json
+++ b/resources/webidl2/test/syntax/json/primitives.json
@@ -12,13 +12,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "boolean"
+                    "idlType": "boolean",
+                    "extAttrs": []
                 },
                 "name": "truth",
+                "escapedName": "truth",
                 "extAttrs": []
             },
             {
@@ -29,13 +30,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "byte"
+                    "idlType": "byte",
+                    "extAttrs": []
                 },
                 "name": "character",
+                "escapedName": "character",
                 "extAttrs": []
             },
             {
@@ -46,13 +48,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "octet"
+                    "idlType": "octet",
+                    "extAttrs": []
                 },
                 "name": "value",
+                "escapedName": "value",
                 "extAttrs": []
             },
             {
@@ -63,13 +66,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "short"
+                    "idlType": "short",
+                    "extAttrs": []
                 },
                 "name": "number",
+                "escapedName": "number",
                 "extAttrs": []
             },
             {
@@ -80,13 +84,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "unsigned short"
+                    "idlType": "unsigned short",
+                    "extAttrs": []
                 },
                 "name": "positive",
+                "escapedName": "positive",
                 "extAttrs": []
             },
             {
@@ -97,13 +102,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "long"
+                    "idlType": "long",
+                    "extAttrs": []
                 },
                 "name": "big",
+                "escapedName": "big",
                 "extAttrs": []
             },
             {
@@ -114,13 +120,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "unsigned long"
+                    "idlType": "unsigned long",
+                    "extAttrs": []
                 },
                 "name": "bigpositive",
+                "escapedName": "bigpositive",
                 "extAttrs": []
             },
             {
@@ -131,13 +138,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "long long"
+                    "idlType": "long long",
+                    "extAttrs": []
                 },
                 "name": "bigbig",
+                "escapedName": "bigbig",
                 "extAttrs": []
             },
             {
@@ -148,13 +156,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "unsigned long long"
+                    "idlType": "unsigned long long",
+                    "extAttrs": []
                 },
                 "name": "bigbigpositive",
+                "escapedName": "bigbigpositive",
                 "extAttrs": []
             },
             {
@@ -165,13 +174,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "float"
+                    "idlType": "float",
+                    "extAttrs": []
                 },
                 "name": "real",
+                "escapedName": "real",
                 "extAttrs": []
             },
             {
@@ -182,13 +192,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "double"
+                    "idlType": "double",
+                    "extAttrs": []
                 },
                 "name": "bigreal",
+                "escapedName": "bigreal",
                 "extAttrs": []
             },
             {
@@ -199,13 +210,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "unrestricted float"
+                    "idlType": "unrestricted float",
+                    "extAttrs": []
                 },
                 "name": "realwithinfinity",
+                "escapedName": "realwithinfinity",
                 "extAttrs": []
             },
             {
@@ -216,13 +228,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "unrestricted double"
+                    "idlType": "unrestricted double",
+                    "extAttrs": []
                 },
                 "name": "bigrealwithinfinity",
+                "escapedName": "bigrealwithinfinity",
                 "extAttrs": []
             },
             {
@@ -233,13 +246,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "DOMString"
+                    "idlType": "DOMString",
+                    "extAttrs": []
                 },
                 "name": "string",
+                "escapedName": "string",
                 "extAttrs": []
             },
             {
@@ -250,13 +264,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "ByteString"
+                    "idlType": "ByteString",
+                    "extAttrs": []
                 },
                 "name": "bytes",
+                "escapedName": "bytes",
                 "extAttrs": []
             },
             {
@@ -267,13 +282,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "Date"
+                    "idlType": "Date",
+                    "extAttrs": []
                 },
                 "name": "date",
+                "escapedName": "date",
                 "extAttrs": []
             },
             {
@@ -284,13 +300,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "RegExp"
+                    "idlType": "RegExp",
+                    "extAttrs": []
                 },
                 "name": "regexp",
+                "escapedName": "regexp",
                 "extAttrs": []
             }
         ],
diff --git a/resources/webidl2/test/syntax/json/promise-void.json b/resources/webidl2/test/syntax/json/promise-void.json
new file mode 100644
index 0000000..7676838
--- /dev/null
+++ b/resources/webidl2/test/syntax/json/promise-void.json
@@ -0,0 +1,36 @@
+[
+    {
+        "type": "interface",
+        "name": "Cat",
+        "partial": false,
+        "members": [
+            {
+                "type": "attribute",
+                "static": false,
+                "stringifier": false,
+                "inherit": false,
+                "readonly": false,
+                "idlType": {
+                    "type": "attribute-type",
+                    "generic": "Promise",
+                    "nullable": false,
+                    "union": false,
+                    "idlType": {
+                        "type": "return-type",
+                        "generic": null,
+                        "nullable": false,
+                        "union": false,
+                        "idlType": "void",
+                        "extAttrs": []
+                    },
+                    "extAttrs": []
+                },
+                "name": "meow",
+                "escapedName": "meow",
+                "extAttrs": []
+            }
+        ],
+        "inheritance": null,
+        "extAttrs": []
+    }
+]
diff --git a/resources/webidl2/test/syntax/json/prototyperoot.json b/resources/webidl2/test/syntax/json/prototyperoot.json
index eda7f14..cec79ff 100644
--- a/resources/webidl2/test/syntax/json/prototyperoot.json
+++ b/resources/webidl2/test/syntax/json/prototyperoot.json
@@ -12,13 +12,14 @@
                 "readonly": true,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "unsigned short"
+                    "idlType": "unsigned short",
+                    "extAttrs": []
                 },
                 "name": "nodeType",
+                "escapedName": "nodeType",
                 "extAttrs": []
             }
         ],
diff --git a/resources/webidl2/test/syntax/json/putforwards.json b/resources/webidl2/test/syntax/json/putforwards.json
index 4b809d2..951b3ef 100644
--- a/resources/webidl2/test/syntax/json/putforwards.json
+++ b/resources/webidl2/test/syntax/json/putforwards.json
@@ -12,13 +12,14 @@
                 "readonly": true,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "Name"
+                    "idlType": "Name",
+                    "extAttrs": []
                 },
                 "name": "name",
+                "escapedName": "name",
                 "extAttrs": [
                     {
                         "name": "PutForwards",
@@ -39,13 +40,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "unsigned short"
+                    "idlType": "unsigned short",
+                    "extAttrs": []
                 },
                 "name": "age",
+                "escapedName": "age",
                 "extAttrs": []
             }
         ],
diff --git a/resources/webidl2/test/syntax/json/record.json b/resources/webidl2/test/syntax/json/record.json
index dd00b5d..1be5427 100644
--- a/resources/webidl2/test/syntax/json/record.json
+++ b/resources/webidl2/test/syntax/json/record.json
@@ -13,51 +13,54 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "void"
+                    "idlType": "void",
+                    "extAttrs": []
                 },
                 "name": "foo",
+                "escapedName": "foo",
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": true,
                             "generic": "sequence",
                             "nullable": false,
                             "union": false,
                             "idlType": {
                                 "type": "argument-type",
-                                "sequence": false,
                                 "generic": "record",
                                 "nullable": false,
                                 "union": false,
                                 "idlType": [
                                     {
                                         "type": "argument-type",
-                                        "sequence": false,
                                         "generic": null,
                                         "nullable": false,
                                         "union": false,
-                                        "idlType": "ByteString"
+                                        "idlType": "ByteString",
+                                        "extAttrs": []
                                     },
                                     {
                                         "type": "argument-type",
-                                        "sequence": false,
                                         "generic": null,
                                         "nullable": false,
                                         "union": false,
-                                        "idlType": "any"
+                                        "idlType": "any",
+                                        "extAttrs": []
                                     }
-                                ]
-                            }
+                                ],
+                                "extAttrs": []
+                            },
+                            "extAttrs": []
                         },
-                        "name": "param"
+                        "name": "param",
+                        "escapedName": "param"
                     }
                 ],
                 "extAttrs": []
@@ -71,66 +74,48 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": "record",
                     "nullable": false,
                     "union": false,
                     "idlType": [
                         {
                             "type": "return-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "DOMString"
+                            "idlType": "DOMString",
+                            "extAttrs": []
                         },
                         {
                             "type": "return-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": true,
                             "union": true,
                             "idlType": [
                                 {
                                     "type": null,
-                                    "sequence": false,
                                     "generic": null,
                                     "nullable": false,
                                     "union": false,
-                                    "idlType": "float"
+                                    "idlType": "float",
+                                    "extAttrs": []
                                 },
                                 {
                                     "type": null,
-                                    "sequence": false,
                                     "generic": null,
                                     "nullable": false,
                                     "union": false,
-                                    "idlType": "DOMString"
+                                    "idlType": "DOMString",
+                                    "extAttrs": []
                                 }
-                            ]
+                            ],
+                            "extAttrs": []
                         }
-                    ]
+                    ],
+                    "extAttrs": []
                 },
                 "name": "bar",
-                "arguments": [],
-                "extAttrs": []
-            },
-            {
-                "type": "operation",
-                "getter": false,
-                "setter": false,
-                "deleter": false,
-                "static": false,
-                "stringifier": false,
-                "idlType": {
-                    "type": "return-type",
-                    "sequence": false,
-                    "generic": null,
-                    "nullable": false,
-                    "union": false,
-                    "idlType": "record"
-                },
-                "name": "baz",
+                "escapedName": "bar",
                 "arguments": [],
                 "extAttrs": []
             }
@@ -143,33 +128,35 @@
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": "record",
                             "nullable": false,
                             "union": false,
                             "idlType": [
                                 {
                                     "type": "argument-type",
-                                    "sequence": false,
                                     "generic": null,
                                     "nullable": false,
                                     "union": false,
-                                    "idlType": "USVString"
+                                    "idlType": "USVString",
+                                    "extAttrs": []
                                 },
                                 {
                                     "type": "argument-type",
-                                    "sequence": false,
                                     "generic": null,
                                     "nullable": false,
                                     "union": false,
-                                    "idlType": "USVString"
+                                    "idlType": "USVString",
+                                    "extAttrs": []
                                 }
-                            ]
+                            ],
+                            "extAttrs": []
                         },
-                        "name": "init"
+                        "name": "init",
+                        "escapedName": "init"
                     }
                 ],
                 "type": "extended-attribute",
@@ -191,22 +178,20 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": "record",
                     "nullable": false,
                     "union": false,
                     "idlType": [
                         {
                             "type": "return-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "DOMString"
+                            "idlType": "DOMString",
+                            "extAttrs": []
                         },
                         {
                             "type": "return-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
@@ -220,9 +205,11 @@
                                 }
                             ]
                         }
-                    ]
+                    ],
+                    "extAttrs": []
                 },
                 "name": "bar",
+                "escapedName": "bar",
                 "arguments": [],
                 "extAttrs": []
             }
diff --git a/resources/webidl2/test/syntax/json/reg-operations.json b/resources/webidl2/test/syntax/json/reg-operations.json
index d696e90..8795c59 100644
--- a/resources/webidl2/test/syntax/json/reg-operations.json
+++ b/resources/webidl2/test/syntax/json/reg-operations.json
@@ -12,13 +12,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "unsigned long"
+                    "idlType": "unsigned long",
+                    "extAttrs": []
                 },
                 "name": "width",
+                "escapedName": "width",
                 "extAttrs": []
             },
             {
@@ -29,13 +30,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "unsigned long"
+                    "idlType": "unsigned long",
+                    "extAttrs": []
                 },
                 "name": "height",
+                "escapedName": "height",
                 "extAttrs": []
             }
         ],
@@ -56,13 +58,14 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "boolean"
+                    "idlType": "boolean",
+                    "extAttrs": []
                 },
                 "name": "isMouseOver",
+                "escapedName": "isMouseOver",
                 "arguments": [],
                 "extAttrs": []
             },
@@ -75,27 +78,30 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "void"
+                    "idlType": "void",
+                    "extAttrs": []
                 },
                 "name": "setDimensions",
+                "escapedName": "setDimensions",
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "Dimensions"
+                            "idlType": "Dimensions",
+                            "extAttrs": []
                         },
-                        "name": "size"
+                        "name": "size",
+                        "escapedName": "size"
                     }
                 ],
                 "extAttrs": []
@@ -109,41 +115,46 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "void"
+                    "idlType": "void",
+                    "extAttrs": []
                 },
                 "name": "setDimensions",
+                "escapedName": "setDimensions",
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "unsigned long"
+                            "idlType": "unsigned long",
+                            "extAttrs": []
                         },
-                        "name": "width"
+                        "name": "width",
+                        "escapedName": "width"
                     },
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "unsigned long"
+                            "idlType": "unsigned long",
+                            "extAttrs": []
                         },
-                        "name": "height"
+                        "name": "height",
+                        "escapedName": "height"
                     }
                 ],
                 "extAttrs": []
diff --git a/resources/webidl2/test/syntax/json/replaceable.json b/resources/webidl2/test/syntax/json/replaceable.json
index a10b0bf..133891d 100644
--- a/resources/webidl2/test/syntax/json/replaceable.json
+++ b/resources/webidl2/test/syntax/json/replaceable.json
@@ -12,13 +12,14 @@
                 "readonly": true,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "unsigned long"
+                    "idlType": "unsigned long",
+                    "extAttrs": []
                 },
                 "name": "value",
+                "escapedName": "value",
                 "extAttrs": [
                     {
                         "name": "Replaceable",
@@ -37,13 +38,14 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "void"
+                    "idlType": "void",
+                    "extAttrs": []
                 },
                 "name": "increment",
+                "escapedName": "increment",
                 "arguments": [],
                 "extAttrs": []
             }
diff --git a/resources/webidl2/test/syntax/json/sequence.json b/resources/webidl2/test/syntax/json/sequence.json
index c2d1765..ead0cdd 100644
--- a/resources/webidl2/test/syntax/json/sequence.json
+++ b/resources/webidl2/test/syntax/json/sequence.json
@@ -13,34 +13,37 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "void"
+                    "idlType": "void",
+                    "extAttrs": []
                 },
                 "name": "drawPolygon",
+                "escapedName": "drawPolygon",
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": true,
                             "generic": "sequence",
                             "nullable": false,
                             "union": false,
                             "idlType": {
                                 "type": "argument-type",
-                                "sequence": false,
                                 "generic": null,
                                 "nullable": false,
                                 "union": false,
-                                "idlType": "float"
-                            }
+                                "idlType": "float",
+                                "extAttrs": []
+                            },
+                            "extAttrs": []
                         },
-                        "name": "coordinates"
+                        "name": "coordinates",
+                        "escapedName": "coordinates"
                     }
                 ],
                 "extAttrs": []
@@ -54,48 +57,21 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": true,
                     "generic": "sequence",
                     "nullable": false,
                     "union": false,
                     "idlType": {
                         "type": "return-type",
-                        "sequence": false,
                         "generic": null,
                         "nullable": false,
                         "union": false,
-                        "idlType": "float"
-                    }
+                        "idlType": "float",
+                        "extAttrs": []
+                    },
+                    "extAttrs": []
                 },
                 "name": "getInflectionPoints",
-                "arguments": [],
-                "extAttrs": []
-            }
-        ],
-        "inheritance": null,
-        "extAttrs": []
-    },
-    {
-        "type": "interface",
-        "name": "Foo",
-        "partial": false,
-        "members": [
-            {
-                "type": "operation",
-                "getter": false,
-                "setter": false,
-                "deleter": false,
-                "static": false,
-                "stringifier": false,
-                "idlType": {
-                    "type": "return-type",
-                    "sequence": false,
-                    "generic": null,
-                    "nullable": false,
-                    "union": false,
-                    "idlType": "sequence"
-                },
-                "name": "bar",
+                "escapedName": "getInflectionPoints",
                 "arguments": [],
                 "extAttrs": []
             }
@@ -117,27 +93,27 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "void"
+                    "idlType": "void",
+                    "extAttrs": []
                 },
                 "name": "f1",
+                "escapedName": "f1",
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": true,
                             "generic": "sequence",
                             "nullable": false,
                             "union": false,
                             "idlType": {
                                 "type": "argument-type",
-                                "sequence": false,
                                 "generic": null,
                                 "nullable": false,
                                 "union": false,
@@ -150,9 +126,11 @@
                                         "rhs": null
                                     }
                                 ]
-                            }
+                            },
+                            "extAttrs": []
                         },
-                        "name": "arg"
+                        "name": "arg",
+                        "escapedName": "arg"
                     }
                 ],
                 "extAttrs": []
diff --git a/resources/webidl2/test/syntax/json/setlike.json b/resources/webidl2/test/syntax/json/setlike.json
index 12299a7..d858353 100644
--- a/resources/webidl2/test/syntax/json/setlike.json
+++ b/resources/webidl2/test/syntax/json/setlike.json
@@ -9,11 +9,11 @@
                 "idlType": [
                     {
                         "type": null,
-                        "sequence": false,
                         "generic": null,
                         "nullable": false,
                         "union": false,
-                        "idlType": "long"
+                        "idlType": "long",
+                        "extAttrs": []
                     }
                 ],
                 "readonly": false,
@@ -33,11 +33,11 @@
                 "idlType": [
                     {
                         "type": null,
-                        "sequence": false,
                         "generic": null,
                         "nullable": false,
                         "union": false,
-                        "idlType": "long"
+                        "idlType": "long",
+                        "extAttrs": []
                     }
                 ],
                 "readonly": true,
@@ -57,7 +57,6 @@
                 "idlType": [
                     {
                         "type": null,
-                        "sequence": false,
                         "generic": null,
                         "nullable": false,
                         "union": false,
diff --git a/resources/webidl2/test/syntax/json/static.json b/resources/webidl2/test/syntax/json/static.json
index 0951b2a..d0ddf35 100644
--- a/resources/webidl2/test/syntax/json/static.json
+++ b/resources/webidl2/test/syntax/json/static.json
@@ -20,13 +20,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "float"
+                    "idlType": "float",
+                    "extAttrs": []
                 },
                 "name": "cx",
+                "escapedName": "cx",
                 "extAttrs": []
             },
             {
@@ -37,13 +38,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "float"
+                    "idlType": "float",
+                    "extAttrs": []
                 },
                 "name": "cy",
+                "escapedName": "cy",
                 "extAttrs": []
             },
             {
@@ -54,13 +56,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "float"
+                    "idlType": "float",
+                    "extAttrs": []
                 },
                 "name": "radius",
+                "escapedName": "radius",
                 "extAttrs": []
             },
             {
@@ -71,13 +74,14 @@
                 "readonly": true,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "long"
+                    "idlType": "long",
+                    "extAttrs": []
                 },
                 "name": "triangulationCount",
+                "escapedName": "triangulationCount",
                 "extAttrs": []
             },
             {
@@ -89,55 +93,62 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "Point"
+                    "idlType": "Point",
+                    "extAttrs": []
                 },
                 "name": "triangulate",
+                "escapedName": "triangulate",
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "Circle"
+                            "idlType": "Circle",
+                            "extAttrs": []
                         },
-                        "name": "c1"
+                        "name": "c1",
+                        "escapedName": "c1"
                     },
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "Circle"
+                            "idlType": "Circle",
+                            "extAttrs": []
                         },
-                        "name": "c2"
+                        "name": "c2",
+                        "escapedName": "c2"
                     },
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "Circle"
+                            "idlType": "Circle",
+                            "extAttrs": []
                         },
-                        "name": "c3"
+                        "name": "c3",
+                        "escapedName": "c3"
                     }
                 ],
                 "extAttrs": []
diff --git a/resources/webidl2/test/syntax/json/stringifier-attribute.json b/resources/webidl2/test/syntax/json/stringifier-attribute.json
index 36e2b6d..dbca7f1 100644
--- a/resources/webidl2/test/syntax/json/stringifier-attribute.json
+++ b/resources/webidl2/test/syntax/json/stringifier-attribute.json
@@ -12,13 +12,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "unsigned long"
+                    "idlType": "unsigned long",
+                    "extAttrs": []
                 },
                 "name": "id",
+                "escapedName": "id",
                 "extAttrs": []
             },
             {
@@ -29,13 +30,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "DOMString"
+                    "idlType": "DOMString",
+                    "extAttrs": []
                 },
                 "name": "name",
+                "escapedName": "name",
                 "extAttrs": []
             }
         ],
diff --git a/resources/webidl2/test/syntax/json/stringifier-custom.json b/resources/webidl2/test/syntax/json/stringifier-custom.json
index 3dc3ac1..c13df6e 100644
--- a/resources/webidl2/test/syntax/json/stringifier-custom.json
+++ b/resources/webidl2/test/syntax/json/stringifier-custom.json
@@ -12,13 +12,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "unsigned long"
+                    "idlType": "unsigned long",
+                    "extAttrs": []
                 },
                 "name": "id",
+                "escapedName": "id",
                 "extAttrs": []
             },
             {
@@ -29,13 +30,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": true,
                     "union": false,
-                    "idlType": "DOMString"
+                    "idlType": "DOMString",
+                    "extAttrs": []
                 },
                 "name": "familyName",
+                "escapedName": "familyName",
                 "extAttrs": []
             },
             {
@@ -46,13 +48,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "DOMString"
+                    "idlType": "DOMString",
+                    "extAttrs": []
                 },
                 "name": "givenName",
+                "escapedName": "givenName",
                 "extAttrs": []
             },
             {
@@ -64,13 +67,14 @@
                 "stringifier": true,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "DOMString"
+                    "idlType": "DOMString",
+                    "extAttrs": []
                 },
                 "name": null,
+                "escapedName": null,
                 "arguments": [],
                 "extAttrs": []
             }
diff --git a/resources/webidl2/test/syntax/json/stringifier.json b/resources/webidl2/test/syntax/json/stringifier.json
index 1a70276..a4f23e0 100644
--- a/resources/webidl2/test/syntax/json/stringifier.json
+++ b/resources/webidl2/test/syntax/json/stringifier.json
@@ -13,13 +13,14 @@
                 "stringifier": true,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "DOMString"
+                    "idlType": "DOMString",
+                    "extAttrs": []
                 },
                 "name": null,
+                "escapedName": null,
                 "arguments": [],
                 "extAttrs": []
             }
diff --git a/resources/webidl2/test/syntax/json/treatasnull.json b/resources/webidl2/test/syntax/json/treatasnull.json
index 611d974..d5156bc 100644
--- a/resources/webidl2/test/syntax/json/treatasnull.json
+++ b/resources/webidl2/test/syntax/json/treatasnull.json
@@ -12,13 +12,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "DOMString"
+                    "idlType": "DOMString",
+                    "extAttrs": []
                 },
                 "name": "name",
+                "escapedName": "name",
                 "extAttrs": []
             },
             {
@@ -29,13 +30,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "DOMString"
+                    "idlType": "DOMString",
+                    "extAttrs": []
                 },
                 "name": "owner",
+                "escapedName": "owner",
                 "extAttrs": []
             },
             {
@@ -47,17 +49,19 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "boolean"
+                    "idlType": "boolean",
+                    "extAttrs": []
                 },
                 "name": "isMemberOfBreed",
+                "escapedName": "isMemberOfBreed",
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [
                             {
                                 "name": "TreatNullAs",
@@ -71,13 +75,14 @@
                         ],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "DOMString"
+                            "idlType": "DOMString",
+                            "extAttrs": []
                         },
-                        "name": "breedName"
+                        "name": "breedName",
+                        "escapedName": "breedName"
                     }
                 ],
                 "extAttrs": []
diff --git a/resources/webidl2/test/syntax/json/treatasundefined.json b/resources/webidl2/test/syntax/json/treatasundefined.json
index 258acda..1e98315 100644
--- a/resources/webidl2/test/syntax/json/treatasundefined.json
+++ b/resources/webidl2/test/syntax/json/treatasundefined.json
@@ -12,13 +12,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "DOMString"
+                    "idlType": "DOMString",
+                    "extAttrs": []
                 },
                 "name": "name",
+                "escapedName": "name",
                 "extAttrs": []
             },
             {
@@ -29,13 +30,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "DOMString"
+                    "idlType": "DOMString",
+                    "extAttrs": []
                 },
                 "name": "owner",
+                "escapedName": "owner",
                 "extAttrs": []
             },
             {
@@ -47,17 +49,19 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "boolean"
+                    "idlType": "boolean",
+                    "extAttrs": []
                 },
                 "name": "isMemberOfBreed",
+                "escapedName": "isMemberOfBreed",
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [
                             {
                                 "name": "TreatUndefinedAs",
@@ -71,13 +75,14 @@
                         ],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "DOMString"
+                            "idlType": "DOMString",
+                            "extAttrs": []
                         },
-                        "name": "breedName"
+                        "name": "breedName",
+                        "escapedName": "breedName"
                     }
                 ],
                 "extAttrs": []
diff --git a/resources/webidl2/test/syntax/json/typedef-union.json b/resources/webidl2/test/syntax/json/typedef-union.json
index 06735a8..31e2419 100644
--- a/resources/webidl2/test/syntax/json/typedef-union.json
+++ b/resources/webidl2/test/syntax/json/typedef-union.json
@@ -3,44 +3,44 @@
         "type": "typedef",
         "idlType": {
             "type": "typedef-type",
-            "sequence": false,
             "generic": null,
             "nullable": false,
             "union": true,
             "idlType": [
                 {
                     "type": null,
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "ImageData"
+                    "idlType": "ImageData",
+                    "extAttrs": []
                 },
                 {
                     "type": null,
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "HTMLImageElement"
+                    "idlType": "HTMLImageElement",
+                    "extAttrs": []
                 },
                 {
                     "type": null,
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "HTMLCanvasElement"
+                    "idlType": "HTMLCanvasElement",
+                    "extAttrs": []
                 },
                 {
                     "type": null,
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "HTMLVideoElement"
+                    "idlType": "HTMLVideoElement",
+                    "extAttrs": []
                 }
-            ]
+            ],
+            "extAttrs": []
         },
         "name": "TexImageSource",
         "extAttrs": []
diff --git a/resources/webidl2/test/syntax/json/typedef.json b/resources/webidl2/test/syntax/json/typedef.json
index 5e9715d..35f988e 100644
--- a/resources/webidl2/test/syntax/json/typedef.json
+++ b/resources/webidl2/test/syntax/json/typedef.json
@@ -12,13 +12,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "float"
+                    "idlType": "float",
+                    "extAttrs": []
                 },
                 "name": "x",
+                "escapedName": "x",
                 "extAttrs": []
             },
             {
@@ -29,13 +30,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "float"
+                    "idlType": "float",
+                    "extAttrs": []
                 },
                 "name": "y",
+                "escapedName": "y",
                 "extAttrs": []
             }
         ],
@@ -46,18 +48,18 @@
         "type": "typedef",
         "idlType": {
             "type": "typedef-type",
-            "sequence": true,
             "generic": "sequence",
             "nullable": false,
             "union": false,
             "idlType": {
                 "type": "typedef-type",
-                "sequence": false,
                 "generic": null,
                 "nullable": false,
                 "union": false,
-                "idlType": "Point"
-            }
+                "idlType": "Point",
+                "extAttrs": []
+            },
+            "extAttrs": []
         },
         "name": "PointSequence",
         "extAttrs": []
@@ -75,13 +77,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "Point"
+                    "idlType": "Point",
+                    "extAttrs": []
                 },
                 "name": "topleft",
+                "escapedName": "topleft",
                 "extAttrs": []
             },
             {
@@ -92,13 +95,14 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "Point"
+                    "idlType": "Point",
+                    "extAttrs": []
                 },
                 "name": "bottomright",
+                "escapedName": "bottomright",
                 "extAttrs": []
             }
         ],
@@ -118,13 +122,14 @@
                 "readonly": true,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "Rect"
+                    "idlType": "Rect",
+                    "extAttrs": []
                 },
                 "name": "bounds",
+                "escapedName": "bounds",
                 "extAttrs": []
             },
             {
@@ -136,27 +141,30 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "boolean"
+                    "idlType": "boolean",
+                    "extAttrs": []
                 },
                 "name": "pointWithinBounds",
+                "escapedName": "pointWithinBounds",
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "Point"
+                            "idlType": "Point",
+                            "extAttrs": []
                         },
-                        "name": "p"
+                        "name": "p",
+                        "escapedName": "p"
                     }
                 ],
                 "extAttrs": []
@@ -170,27 +178,30 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "boolean"
+                    "idlType": "boolean",
+                    "extAttrs": []
                 },
                 "name": "allPointsWithinBounds",
+                "escapedName": "allPointsWithinBounds",
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "PointSequence"
+                            "idlType": "PointSequence",
+                            "extAttrs": []
                         },
-                        "name": "ps"
+                        "name": "ps",
+                        "escapedName": "ps"
                     }
                 ],
                 "extAttrs": []
@@ -203,7 +214,6 @@
         "type": "typedef",
         "idlType": {
             "type": "typedef-type",
-            "sequence": false,
             "generic": null,
             "nullable": false,
             "union": false,
diff --git a/resources/webidl2/test/syntax/json/typesuffixes.json b/resources/webidl2/test/syntax/json/typesuffixes.json
index be0b1f2..52870c2 100644
--- a/resources/webidl2/test/syntax/json/typesuffixes.json
+++ b/resources/webidl2/test/syntax/json/typesuffixes.json
@@ -13,34 +13,37 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "void"
+                    "idlType": "void",
+                    "extAttrs": []
                 },
                 "name": "test",
+                "escapedName": "test",
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": false,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": true,
                             "generic": "sequence",
                             "nullable": true,
                             "union": false,
                             "idlType": {
                                 "type": "argument-type",
-                                "sequence": false,
                                 "generic": null,
                                 "nullable": true,
                                 "union": false,
-                                "idlType": "DOMString"
-                            }
+                                "idlType": "DOMString",
+                                "extAttrs": []
+                            },
+                            "extAttrs": []
                         },
-                        "name": "foo"
+                        "name": "foo",
+                        "escapedName": "foo"
                     }
                 ],
                 "extAttrs": []
diff --git a/resources/webidl2/test/syntax/json/uniontype.json b/resources/webidl2/test/syntax/json/uniontype.json
index 87735c7..90eb074 100644
--- a/resources/webidl2/test/syntax/json/uniontype.json
+++ b/resources/webidl2/test/syntax/json/uniontype.json
@@ -12,72 +12,73 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": true,
                     "idlType": [
                         {
                             "type": null,
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "float"
+                            "idlType": "float",
+                            "extAttrs": []
                         },
                         {
                             "type": null,
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": true,
                             "idlType": [
                                 {
                                     "type": null,
-                                    "sequence": false,
                                     "generic": null,
                                     "nullable": false,
                                     "union": false,
-                                    "idlType": "Date"
+                                    "idlType": "Date",
+                                    "extAttrs": []
                                 },
                                 {
                                     "type": null,
-                                    "sequence": false,
                                     "generic": null,
                                     "nullable": false,
                                     "union": false,
-                                    "idlType": "Event"
+                                    "idlType": "Event",
+                                    "extAttrs": []
                                 }
-                            ]
+                            ],
+                            "extAttrs": []
                         },
                         {
                             "type": null,
-                            "sequence": false,
                             "generic": null,
                             "nullable": true,
                             "union": true,
                             "idlType": [
                                 {
                                     "type": null,
-                                    "sequence": false,
                                     "generic": null,
                                     "nullable": false,
                                     "union": false,
-                                    "idlType": "Node"
+                                    "idlType": "Node",
+                                    "extAttrs": []
                                 },
                                 {
                                     "type": null,
-                                    "sequence": false,
                                     "generic": null,
                                     "nullable": false,
                                     "union": false,
-                                    "idlType": "DOMString"
+                                    "idlType": "DOMString",
+                                    "extAttrs": []
                                 }
-                            ]
+                            ],
+                            "extAttrs": []
                         }
-                    ]
+                    ],
+                    "extAttrs": []
                 },
                 "name": "test",
+                "escapedName": "test",
                 "extAttrs": []
             },
             {
@@ -88,14 +89,12 @@
                 "readonly": false,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": true,
                     "idlType": [
                         {
                             "type": null,
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
@@ -111,15 +110,17 @@
                         },
                         {
                             "type": null,
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "Date"
+                            "idlType": "Date",
+                            "extAttrs": []
                         }
-                    ]
+                    ],
+                    "extAttrs": []
                 },
                 "name": "test2",
+                "escapedName": "test2",
                 "extAttrs": []
             }
         ],
diff --git a/resources/webidl2/test/syntax/json/variadic-operations.json b/resources/webidl2/test/syntax/json/variadic-operations.json
index 53b02df..3280b7b 100644
--- a/resources/webidl2/test/syntax/json/variadic-operations.json
+++ b/resources/webidl2/test/syntax/json/variadic-operations.json
@@ -12,13 +12,14 @@
                 "readonly": true,
                 "idlType": {
                     "type": "attribute-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "unsigned long"
+                    "idlType": "unsigned long",
+                    "extAttrs": []
                 },
                 "name": "cardinality",
+                "escapedName": "cardinality",
                 "extAttrs": []
             },
             {
@@ -30,27 +31,30 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "void"
+                    "idlType": "void",
+                    "extAttrs": []
                 },
                 "name": "union",
+                "escapedName": "union",
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": true,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "long"
+                            "idlType": "long",
+                            "extAttrs": []
                         },
-                        "name": "ints"
+                        "name": "ints",
+                        "escapedName": "ints"
                     }
                 ],
                 "extAttrs": []
@@ -64,27 +68,30 @@
                 "stringifier": false,
                 "idlType": {
                     "type": "return-type",
-                    "sequence": false,
                     "generic": null,
                     "nullable": false,
                     "union": false,
-                    "idlType": "void"
+                    "idlType": "void",
+                    "extAttrs": []
                 },
                 "name": "intersection",
+                "escapedName": "intersection",
                 "arguments": [
                     {
                         "optional": false,
                         "variadic": true,
+                        "default": null,
                         "extAttrs": [],
                         "idlType": {
                             "type": "argument-type",
-                            "sequence": false,
                             "generic": null,
                             "nullable": false,
                             "union": false,
-                            "idlType": "long"
+                            "idlType": "long",
+                            "extAttrs": []
                         },
-                        "name": "ints"
+                        "name": "ints",
+                        "escapedName": "ints"
                     }
                 ],
                 "extAttrs": []
diff --git a/resources/webidl2/test/syntax/opt/linecomment.json b/resources/webidl2/test/syntax/opt/linecomment.json
deleted file mode 100644
index fbcdbf4..0000000
--- a/resources/webidl2/test/syntax/opt/linecomment.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-    "ws": true
-}
diff --git a/resources/webidl2/test/syntax/opt/typedef-nested.json b/resources/webidl2/test/syntax/opt/typedef-nested.json
deleted file mode 100644
index f0794e7..0000000
--- a/resources/webidl2/test/syntax/opt/typedef-nested.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-    "allowNestedTypedefs": true
-}
\ No newline at end of file
diff --git a/resources/webidl2/test/widlproc b/resources/webidl2/test/widlproc
deleted file mode 160000
index 4ef8dde..0000000
--- a/resources/webidl2/test/widlproc
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 4ef8dde69c0ba3d0167bccfa2775eea7f0d6c7fe
diff --git a/webaudio/the-audio-api/the-audiobuffer-interface/idl-test.html b/webaudio/the-audio-api/the-audiobuffer-interface/idl-test.html
index 49f375c..9f5e2de 100644
--- a/webaudio/the-audio-api/the-audiobuffer-interface/idl-test.html
+++ b/webaudio/the-audio-api/the-audiobuffer-interface/idl-test.html
@@ -40,10 +40,10 @@
     readonly        attribute AudioListener        listener;
     readonly        attribute AudioContextState    state;
     readonly        attribute double               baseLatency;
-    Promise<void>          resume ();
+    Promise&lt;void&gt;          resume ();
                     attribute EventHandler         onstatechange;
     AudioBuffer            createBuffer (unsigned long numberOfChannels, unsigned long length, float sampleRate);
-    Promise<AudioBuffer>   decodeAudioData (ArrayBuffer audioData, optional DecodeSuccessCallback successCallback, optional DecodeErrorCallback errorCallback);
+    Promise&lt;AudioBuffer&gt;   decodeAudioData (ArrayBuffer audioData, optional DecodeSuccessCallback successCallback, optional DecodeErrorCallback errorCallback);
     AudioBufferSourceNode  createBufferSource ();
     ConstantSourceNode     createConstantSource ();
     ScriptProcessorNode    createScriptProcessor (optional unsigned long bufferSize = 0
@@ -54,7 +54,7 @@
     GainNode               createGain ();
     DelayNode              createDelay (optional double maxDelayTime);
     BiquadFilterNode       createBiquadFilter ();
-    IIRFilterNode          createIIRFilter (sequence<double> feedforward, sequence<double> feedback);
+    IIRFilterNode          createIIRFilter (sequence&lt;double&gt; feedforward, sequence&lt;double&gt; feedback);
     WaveShaperNode         createWaveShaper ();
     PannerNode             createPanner ();
     StereoPannerNode       createStereoPanner ();
diff --git a/webaudio/the-audio-api/the-audiodestinationnode-interface/idl-test.html b/webaudio/the-audio-api/the-audiodestinationnode-interface/idl-test.html
index 9c7fca1..2769611 100644
--- a/webaudio/the-audio-api/the-audiodestinationnode-interface/idl-test.html
+++ b/webaudio/the-audio-api/the-audiodestinationnode-interface/idl-test.html
@@ -42,10 +42,10 @@
     readonly        attribute AudioListener        listener;
     readonly        attribute AudioContextState    state;
     readonly        attribute double               baseLatency;
-    Promise<void>          resume ();
+    Promise&lt;void&gt;          resume ();
                     attribute EventHandler         onstatechange;
     AudioBuffer            createBuffer (unsigned long numberOfChannels, unsigned long length, float sampleRate);
-    Promise<AudioBuffer>   decodeAudioData (ArrayBuffer audioData, optional DecodeSuccessCallback successCallback, optional DecodeErrorCallback errorCallback);
+    Promise&lt;AudioBuffer&gt;   decodeAudioData (ArrayBuffer audioData, optional DecodeSuccessCallback successCallback, optional DecodeErrorCallback errorCallback);
     AudioBufferSourceNode  createBufferSource ();
     ConstantSourceNode     createConstantSource ();
     ScriptProcessorNode    createScriptProcessor (optional unsigned long bufferSize = 0
@@ -56,7 +56,7 @@
     GainNode               createGain ();
     DelayNode              createDelay (optional double maxDelayTime);
     BiquadFilterNode       createBiquadFilter ();
-    IIRFilterNode          createIIRFilter (sequence<double> feedforward, sequence<double> feedback);
+    IIRFilterNode          createIIRFilter (sequence&lt;double&gt; feedforward, sequence&lt;double&gt; feedback);
     WaveShaperNode         createWaveShaper ();
     PannerNode             createPanner ();
     StereoPannerNode       createStereoPanner ();