react-source 0.12.0 → 0.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9c3cb0306b64d1c4c5aac71c482cd40b8f24760a
4
- data.tar.gz: 24ff0130464f8f866aac882f3dadf561a4e33fe4
3
+ metadata.gz: aa1a6d2925d5de095fe0d1fcc6702e56ff059d45
4
+ data.tar.gz: 96a3891b4b204b2e38cb50a51734b1d7f1b70d75
5
5
  SHA512:
6
- metadata.gz: a2253b7e87f33d91699d53c2bc13dfa6b3834ce8441f72c62add6e615a7f2399d428f9ee43c6f1cbb4638fa167d0a1ba5f756dc544de31d05d9221cb12cef228
7
- data.tar.gz: 9f74e054136b138c0367ce0a4e77a928794c6842b67f4a1dde5871acf9dd6d3fb0b42f84a840c2179d5fe92786b8daee88c1385dfdb8fcd2432de30c80ae6921
6
+ metadata.gz: cc811dcee07910f37aac51e89f026845a27cc04ceff50004a7be2d01f92c9d08623681c8e581c858315c744cbdb26ef62c799bc7e335306150544277d2916c17
7
+ data.tar.gz: 3e1b96471312ce78666c510cb7bf7138b3be53bb52771193bb2cc4caba986c8f780c9e9a8c4213ac0cd20c7c7a687b03bd976e0946c809d145f5cbee3e6803e6
@@ -1,5 +1,5 @@
1
1
  /**
2
- * JSXTransformer v0.12.0
2
+ * JSXTransformer v0.12.1
3
3
  */
4
4
  !function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.JSXTransformer=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
5
5
  /**
@@ -17,6 +17,7 @@
17
17
 
18
18
  var buffer = _dereq_('buffer');
19
19
  var transform = _dereq_('jstransform').transform;
20
+ var typesSyntax = _dereq_('jstransform/visitors/type-syntax');
20
21
  var visitors = _dereq_('./fbtransform/visitors');
21
22
 
22
23
  var headEl;
@@ -46,6 +47,14 @@ function transformReact(source, options) {
46
47
  visitorList = visitors.transformVisitors.react;
47
48
  }
48
49
 
50
+ if (options.stripTypes) {
51
+ // Stripping types needs to happen before the other transforms
52
+ // unfortunately, due to bad interactions. For example,
53
+ // es6-rest-param-visitors conflict with stripping rest param type
54
+ // annotation
55
+ source = transform(typesSyntax.visitorList, source, options).code;
56
+ }
57
+
49
58
  return transform(visitorList, source, {
50
59
  sourceMap: supportsAccessors && options.sourceMap
51
60
  });
@@ -244,6 +253,9 @@ function loadScripts(scripts) {
244
253
  if (/;harmony=true(;|$)/.test(script.type)) {
245
254
  options.harmony = true
246
255
  }
256
+ if (/;stripTypes=true(;|$)/.test(script.type)) {
257
+ options.stripTypes = true;
258
+ }
247
259
 
248
260
  // script.async is always true for non-javascript script tags
249
261
  var async = script.hasAttribute('async');
@@ -330,7 +342,7 @@ module.exports = {
330
342
  exec: exec
331
343
  };
332
344
 
333
- },{"./fbtransform/visitors":37,"buffer":2,"jstransform":21}],2:[function(_dereq_,module,exports){
345
+ },{"./fbtransform/visitors":37,"buffer":2,"jstransform":21,"jstransform/visitors/type-syntax":33}],2:[function(_dereq_,module,exports){
334
346
  /*!
335
347
  * The buffer module from node.js, for the browser.
336
348
  *
@@ -1170,7 +1182,7 @@ Buffer.prototype.copy = function (target, target_start, start, end) {
1170
1182
 
1171
1183
  var len = end - start
1172
1184
 
1173
- if (len < 100 || !Buffer.TYPED_ARRAY_SUPPORT) {
1185
+ if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {
1174
1186
  for (var i = 0; i < len; i++) {
1175
1187
  target[i + target_start] = this[i + start]
1176
1188
  }
@@ -1239,6 +1251,7 @@ var BP = Buffer.prototype
1239
1251
  * Augment a Uint8Array *instance* (not the Uint8Array class!) with Buffer methods
1240
1252
  */
1241
1253
  Buffer._augment = function (arr) {
1254
+ arr.constructor = Buffer
1242
1255
  arr._isBuffer = true
1243
1256
 
1244
1257
  // save reference to original Uint8Array get/set methods before overwriting
@@ -1942,6 +1955,34 @@ process.chdir = function (dir) {
1942
1955
  };
1943
1956
 
1944
1957
  },{}],8:[function(_dereq_,module,exports){
1958
+ var Base62 = (function (my) {
1959
+ my.chars = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
1960
+
1961
+ my.encode = function(i){
1962
+ if (i === 0) {return '0'}
1963
+ var s = ''
1964
+ while (i > 0) {
1965
+ s = this.chars[i % 62] + s
1966
+ i = Math.floor(i/62)
1967
+ }
1968
+ return s
1969
+ };
1970
+ my.decode = function(a,b,c,d){
1971
+ for (
1972
+ b = c = (
1973
+ a === (/\W|_|^$/.test(a += "") || a)
1974
+ ) - 1;
1975
+ d = a.charCodeAt(c++);
1976
+ )
1977
+ b = b * 62 + d - [, 48, 29, 87][d >> 5];
1978
+ return b
1979
+ };
1980
+
1981
+ return my;
1982
+ }({}));
1983
+
1984
+ module.exports = Base62
1985
+ },{}],9:[function(_dereq_,module,exports){
1945
1986
  /*
1946
1987
  Copyright (C) 2013 Ariya Hidayat <ariya.hidayat@gmail.com>
1947
1988
  Copyright (C) 2013 Thaddee Tyl <thaddee.tyl@gmail.com>
@@ -1979,18 +2020,23 @@ process.chdir = function (dir) {
1979
2020
  throwError: true, generateStatement: true, peek: true,
1980
2021
  parseAssignmentExpression: true, parseBlock: true,
1981
2022
  parseClassExpression: true, parseClassDeclaration: true, parseExpression: true,
2023
+ parseDeclareClass: true, parseDeclareFunction: true,
2024
+ parseDeclareModule: true, parseDeclareVariable: true,
1982
2025
  parseForStatement: true,
1983
2026
  parseFunctionDeclaration: true, parseFunctionExpression: true,
1984
2027
  parseFunctionSourceElements: true, parseVariableIdentifier: true,
1985
- parseImportSpecifier: true,
2028
+ parseImportSpecifier: true, parseInterface: true,
1986
2029
  parseLeftHandSideExpression: true, parseParams: true, validateParam: true,
1987
2030
  parseSpreadOrAssignmentExpression: true,
1988
- parseStatement: true, parseSourceElement: true, parseModuleBlock: true, parseConciseBody: true,
2031
+ parseStatement: true, parseSourceElement: true, parseConciseBody: true,
1989
2032
  advanceXJSChild: true, isXJSIdentifierStart: true, isXJSIdentifierPart: true,
1990
2033
  scanXJSStringLiteral: true, scanXJSIdentifier: true,
1991
2034
  parseXJSAttributeValue: true, parseXJSChild: true, parseXJSElement: true, parseXJSExpressionContainer: true, parseXJSEmptyExpression: true,
1992
- parseTypeAnnotation: true, parseTypeAnnotatableIdentifier: true,
1993
- parseYieldExpression: true
2035
+ parseFunctionTypeParam: true,
2036
+ parsePrimaryType: true,
2037
+ parseTypeAlias: true,
2038
+ parseType: true, parseTypeAnnotatableIdentifier: true, parseTypeAnnotation: true,
2039
+ parseYieldExpression: true, parseAwaitExpression: true
1994
2040
  */
1995
2041
 
1996
2042
  (function (root, factory) {
@@ -2069,24 +2115,32 @@ parseYieldExpression: true
2069
2115
  '<=', '<', '>', '!=', '!=='];
2070
2116
 
2071
2117
  Syntax = {
2118
+ AnyTypeAnnotation: 'AnyTypeAnnotation',
2072
2119
  ArrayExpression: 'ArrayExpression',
2073
2120
  ArrayPattern: 'ArrayPattern',
2121
+ ArrayTypeAnnotation: 'ArrayTypeAnnotation',
2074
2122
  ArrowFunctionExpression: 'ArrowFunctionExpression',
2075
2123
  AssignmentExpression: 'AssignmentExpression',
2076
2124
  BinaryExpression: 'BinaryExpression',
2077
2125
  BlockStatement: 'BlockStatement',
2126
+ BooleanTypeAnnotation: 'BooleanTypeAnnotation',
2078
2127
  BreakStatement: 'BreakStatement',
2079
2128
  CallExpression: 'CallExpression',
2080
2129
  CatchClause: 'CatchClause',
2081
2130
  ClassBody: 'ClassBody',
2082
2131
  ClassDeclaration: 'ClassDeclaration',
2083
2132
  ClassExpression: 'ClassExpression',
2133
+ ClassImplements: 'ClassImplements',
2084
2134
  ClassProperty: 'ClassProperty',
2085
2135
  ComprehensionBlock: 'ComprehensionBlock',
2086
2136
  ComprehensionExpression: 'ComprehensionExpression',
2087
2137
  ConditionalExpression: 'ConditionalExpression',
2088
2138
  ContinueStatement: 'ContinueStatement',
2089
2139
  DebuggerStatement: 'DebuggerStatement',
2140
+ DeclareClass: 'DeclareClass',
2141
+ DeclareFunction: 'DeclareFunction',
2142
+ DeclareModule: 'DeclareModule',
2143
+ DeclareVariable: 'DeclareVariable',
2090
2144
  DoWhileStatement: 'DoWhileStatement',
2091
2145
  EmptyStatement: 'EmptyStatement',
2092
2146
  ExportDeclaration: 'ExportDeclaration',
@@ -2098,29 +2152,42 @@ parseYieldExpression: true
2098
2152
  ForStatement: 'ForStatement',
2099
2153
  FunctionDeclaration: 'FunctionDeclaration',
2100
2154
  FunctionExpression: 'FunctionExpression',
2155
+ FunctionTypeAnnotation: 'FunctionTypeAnnotation',
2156
+ FunctionTypeParam: 'FunctionTypeParam',
2157
+ GenericTypeAnnotation: 'GenericTypeAnnotation',
2101
2158
  Identifier: 'Identifier',
2102
2159
  IfStatement: 'IfStatement',
2103
2160
  ImportDeclaration: 'ImportDeclaration',
2161
+ ImportDefaultSpecifier: 'ImportDefaultSpecifier',
2162
+ ImportNamespaceSpecifier: 'ImportNamespaceSpecifier',
2104
2163
  ImportSpecifier: 'ImportSpecifier',
2164
+ InterfaceDeclaration: 'InterfaceDeclaration',
2165
+ InterfaceExtends: 'InterfaceExtends',
2166
+ IntersectionTypeAnnotation: 'IntersectionTypeAnnotation',
2105
2167
  LabeledStatement: 'LabeledStatement',
2106
2168
  Literal: 'Literal',
2107
2169
  LogicalExpression: 'LogicalExpression',
2108
2170
  MemberExpression: 'MemberExpression',
2109
2171
  MethodDefinition: 'MethodDefinition',
2110
- ModuleDeclaration: 'ModuleDeclaration',
2172
+ ModuleSpecifier: 'ModuleSpecifier',
2111
2173
  NewExpression: 'NewExpression',
2174
+ NullableTypeAnnotation: 'NullableTypeAnnotation',
2175
+ NumberTypeAnnotation: 'NumberTypeAnnotation',
2112
2176
  ObjectExpression: 'ObjectExpression',
2113
2177
  ObjectPattern: 'ObjectPattern',
2114
2178
  ObjectTypeAnnotation: 'ObjectTypeAnnotation',
2115
- OptionalParameter: 'OptionalParameter',
2116
- ParametricTypeAnnotation: 'ParametricTypeAnnotation',
2117
- ParametricallyTypedIdentifier: 'ParametricallyTypedIdentifier',
2179
+ ObjectTypeCallProperty: 'ObjectTypeCallProperty',
2180
+ ObjectTypeIndexer: 'ObjectTypeIndexer',
2181
+ ObjectTypeProperty: 'ObjectTypeProperty',
2118
2182
  Program: 'Program',
2119
2183
  Property: 'Property',
2184
+ QualifiedTypeIdentifier: 'QualifiedTypeIdentifier',
2120
2185
  ReturnStatement: 'ReturnStatement',
2121
2186
  SequenceExpression: 'SequenceExpression',
2122
2187
  SpreadElement: 'SpreadElement',
2123
2188
  SpreadProperty: 'SpreadProperty',
2189
+ StringLiteralTypeAnnotation: 'StringLiteralTypeAnnotation',
2190
+ StringTypeAnnotation: 'StringTypeAnnotation',
2124
2191
  SwitchCase: 'SwitchCase',
2125
2192
  SwitchStatement: 'SwitchStatement',
2126
2193
  TaggedTemplateExpression: 'TaggedTemplateExpression',
@@ -2128,10 +2195,15 @@ parseYieldExpression: true
2128
2195
  TemplateLiteral: 'TemplateLiteral',
2129
2196
  ThisExpression: 'ThisExpression',
2130
2197
  ThrowStatement: 'ThrowStatement',
2198
+ TupleTypeAnnotation: 'TupleTypeAnnotation',
2131
2199
  TryStatement: 'TryStatement',
2132
- TypeAnnotatedIdentifier: 'TypeAnnotatedIdentifier',
2200
+ TypeAlias: 'TypeAlias',
2133
2201
  TypeAnnotation: 'TypeAnnotation',
2202
+ TypeofTypeAnnotation: 'TypeofTypeAnnotation',
2203
+ TypeParameterDeclaration: 'TypeParameterDeclaration',
2204
+ TypeParameterInstantiation: 'TypeParameterInstantiation',
2134
2205
  UnaryExpression: 'UnaryExpression',
2206
+ UnionTypeAnnotation: 'UnionTypeAnnotation',
2135
2207
  UpdateExpression: 'UpdateExpression',
2136
2208
  VariableDeclaration: 'VariableDeclaration',
2137
2209
  VariableDeclarator: 'VariableDeclarator',
@@ -2149,7 +2221,8 @@ parseYieldExpression: true
2149
2221
  XJSAttribute: 'XJSAttribute',
2150
2222
  XJSSpreadAttribute: 'XJSSpreadAttribute',
2151
2223
  XJSText: 'XJSText',
2152
- YieldExpression: 'YieldExpression'
2224
+ YieldExpression: 'YieldExpression',
2225
+ AwaitExpression: 'AwaitExpression'
2153
2226
  };
2154
2227
 
2155
2228
  PropertyKind = {
@@ -2186,7 +2259,6 @@ parseYieldExpression: true
2186
2259
  IllegalBreak: 'Illegal break statement',
2187
2260
  IllegalDuplicateClassProperty: 'Illegal duplicate property in class definition',
2188
2261
  IllegalReturn: 'Illegal return statement',
2189
- IllegalYield: 'Illegal yield expression',
2190
2262
  IllegalSpread: 'Illegal spread element',
2191
2263
  StrictModeWith: 'Strict mode code may not include a with statement',
2192
2264
  StrictCatchVariable: 'Catch variable may not be eval or arguments in strict mode',
@@ -2209,23 +2281,29 @@ parseYieldExpression: true
2209
2281
  StrictLHSPostfix: 'Postfix increment/decrement may not have eval or arguments operand in strict mode',
2210
2282
  StrictLHSPrefix: 'Prefix increment/decrement may not have eval or arguments operand in strict mode',
2211
2283
  StrictReservedWord: 'Use of future reserved word in strict mode',
2212
- NewlineAfterModule: 'Illegal newline after module',
2213
- NoFromAfterImport: 'Missing from after import',
2284
+ MissingFromClause: 'Missing from clause',
2285
+ NoAsAfterImportNamespace: 'Missing as after import *',
2214
2286
  InvalidModuleSpecifier: 'Invalid module specifier',
2215
- NestedModule: 'Module declaration can not be nested',
2216
2287
  NoUnintializedConst: 'Const must be initialized',
2217
2288
  ComprehensionRequiresBlock: 'Comprehension must have at least one block',
2218
2289
  ComprehensionError: 'Comprehension Error',
2219
2290
  EachNotAllowed: 'Each is not supported',
2220
2291
  InvalidXJSAttributeValue: 'XJS value should be either an expression or a quoted XJS text',
2221
2292
  ExpectedXJSClosingTag: 'Expected corresponding XJS closing tag for %0',
2222
- AdjacentXJSElements: 'Adjacent XJS elements must be wrapped in an enclosing tag'
2293
+ AdjacentXJSElements: 'Adjacent XJS elements must be wrapped in an enclosing tag',
2294
+ ConfusedAboutFunctionType: 'Unexpected token =>. It looks like ' +
2295
+ 'you are trying to write a function type, but you ended up ' +
2296
+ 'writing a grouped type followed by an =>, which is a syntax ' +
2297
+ 'error. Remember, function type parameters are named so function ' +
2298
+ 'types look like (name1: type1, name2: type2) => returnType. You ' +
2299
+ 'probably wrote (type1) => returnType'
2223
2300
  };
2224
2301
 
2225
2302
  // See also tools/generate-unicode-regex.py.
2226
2303
  Regex = {
2227
2304
  NonAsciiIdentifierStart: new RegExp('[\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0\u08a2-\u08ac\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097f\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d\u0c58\u0c59\u0c60\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d60\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191c\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19c1-\u19c7\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua697\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa80-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc]'),
2228
- NonAsciiIdentifierPart: new RegExp('[\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0300-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u0483-\u0487\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u05d0-\u05ea\u05f0-\u05f2\u0610-\u061a\u0620-\u0669\u066e-\u06d3\u06d5-\u06dc\u06df-\u06e8\u06ea-\u06fc\u06ff\u0710-\u074a\u074d-\u07b1\u07c0-\u07f5\u07fa\u0800-\u082d\u0840-\u085b\u08a0\u08a2-\u08ac\u08e4-\u08fe\u0900-\u0963\u0966-\u096f\u0971-\u0977\u0979-\u097f\u0981-\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bc-\u09c4\u09c7\u09c8\u09cb-\u09ce\u09d7\u09dc\u09dd\u09df-\u09e3\u09e6-\u09f1\u0a01-\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a59-\u0a5c\u0a5e\u0a66-\u0a75\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abc-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ad0\u0ae0-\u0ae3\u0ae6-\u0aef\u0b01-\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3c-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b5c\u0b5d\u0b5f-\u0b63\u0b66-\u0b6f\u0b71\u0b82\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd0\u0bd7\u0be6-\u0bef\u0c01-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c58\u0c59\u0c60-\u0c63\u0c66-\u0c6f\u0c82\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbc-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0cde\u0ce0-\u0ce3\u0ce6-\u0cef\u0cf1\u0cf2\u0d02\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4e\u0d57\u0d60-\u0d63\u0d66-\u0d6f\u0d7a-\u0d7f\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e01-\u0e3a\u0e40-\u0e4e\u0e50-\u0e59\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ec8-\u0ecd\u0ed0-\u0ed9\u0edc-\u0edf\u0f00\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e-\u0f47\u0f49-\u0f6c\u0f71-\u0f84\u0f86-\u0f97\u0f99-\u0fbc\u0fc6\u1000-\u1049\u1050-\u109d\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u135d-\u135f\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176c\u176e-\u1770\u1772\u1773\u1780-\u17d3\u17d7\u17dc\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u1820-\u1877\u1880-\u18aa\u18b0-\u18f5\u1900-\u191c\u1920-\u192b\u1930-\u193b\u1946-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u19d0-\u19d9\u1a00-\u1a1b\u1a20-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1aa7\u1b00-\u1b4b\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1bf3\u1c00-\u1c37\u1c40-\u1c49\u1c4d-\u1c7d\u1cd0-\u1cd2\u1cd4-\u1cf6\u1d00-\u1de6\u1dfc-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u200c\u200d\u203f\u2040\u2054\u2071\u207f\u2090-\u209c\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d7f-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2de0-\u2dff\u2e2f\u3005-\u3007\u3021-\u302f\u3031-\u3035\u3038-\u303c\u3041-\u3096\u3099\u309a\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua62b\ua640-\ua66f\ua674-\ua67d\ua67f-\ua697\ua69f-\ua6f1\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua827\ua840-\ua873\ua880-\ua8c4\ua8d0-\ua8d9\ua8e0-\ua8f7\ua8fb\ua900-\ua92d\ua930-\ua953\ua960-\ua97c\ua980-\ua9c0\ua9cf-\ua9d9\uaa00-\uaa36\uaa40-\uaa4d\uaa50-\uaa59\uaa60-\uaa76\uaa7a\uaa7b\uaa80-\uaac2\uaadb-\uaadd\uaae0-\uaaef\uaaf2-\uaaf6\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabea\uabec\uabed\uabf0-\uabf9\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe00-\ufe0f\ufe20-\ufe26\ufe33\ufe34\ufe4d-\ufe4f\ufe70-\ufe74\ufe76-\ufefc\uff10-\uff19\uff21-\uff3a\uff3f\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc]')
2305
+ NonAsciiIdentifierPart: new RegExp('[\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0300-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u0483-\u0487\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u05d0-\u05ea\u05f0-\u05f2\u0610-\u061a\u0620-\u0669\u066e-\u06d3\u06d5-\u06dc\u06df-\u06e8\u06ea-\u06fc\u06ff\u0710-\u074a\u074d-\u07b1\u07c0-\u07f5\u07fa\u0800-\u082d\u0840-\u085b\u08a0\u08a2-\u08ac\u08e4-\u08fe\u0900-\u0963\u0966-\u096f\u0971-\u0977\u0979-\u097f\u0981-\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bc-\u09c4\u09c7\u09c8\u09cb-\u09ce\u09d7\u09dc\u09dd\u09df-\u09e3\u09e6-\u09f1\u0a01-\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a59-\u0a5c\u0a5e\u0a66-\u0a75\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abc-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ad0\u0ae0-\u0ae3\u0ae6-\u0aef\u0b01-\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3c-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b5c\u0b5d\u0b5f-\u0b63\u0b66-\u0b6f\u0b71\u0b82\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd0\u0bd7\u0be6-\u0bef\u0c01-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c58\u0c59\u0c60-\u0c63\u0c66-\u0c6f\u0c82\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbc-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0cde\u0ce0-\u0ce3\u0ce6-\u0cef\u0cf1\u0cf2\u0d02\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4e\u0d57\u0d60-\u0d63\u0d66-\u0d6f\u0d7a-\u0d7f\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e01-\u0e3a\u0e40-\u0e4e\u0e50-\u0e59\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ec8-\u0ecd\u0ed0-\u0ed9\u0edc-\u0edf\u0f00\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e-\u0f47\u0f49-\u0f6c\u0f71-\u0f84\u0f86-\u0f97\u0f99-\u0fbc\u0fc6\u1000-\u1049\u1050-\u109d\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u135d-\u135f\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176c\u176e-\u1770\u1772\u1773\u1780-\u17d3\u17d7\u17dc\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u1820-\u1877\u1880-\u18aa\u18b0-\u18f5\u1900-\u191c\u1920-\u192b\u1930-\u193b\u1946-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u19d0-\u19d9\u1a00-\u1a1b\u1a20-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1aa7\u1b00-\u1b4b\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1bf3\u1c00-\u1c37\u1c40-\u1c49\u1c4d-\u1c7d\u1cd0-\u1cd2\u1cd4-\u1cf6\u1d00-\u1de6\u1dfc-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u200c\u200d\u203f\u2040\u2054\u2071\u207f\u2090-\u209c\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d7f-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2de0-\u2dff\u2e2f\u3005-\u3007\u3021-\u302f\u3031-\u3035\u3038-\u303c\u3041-\u3096\u3099\u309a\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua62b\ua640-\ua66f\ua674-\ua67d\ua67f-\ua697\ua69f-\ua6f1\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua827\ua840-\ua873\ua880-\ua8c4\ua8d0-\ua8d9\ua8e0-\ua8f7\ua8fb\ua900-\ua92d\ua930-\ua953\ua960-\ua97c\ua980-\ua9c0\ua9cf-\ua9d9\uaa00-\uaa36\uaa40-\uaa4d\uaa50-\uaa59\uaa60-\uaa76\uaa7a\uaa7b\uaa80-\uaac2\uaadb-\uaadd\uaae0-\uaaef\uaaf2-\uaaf6\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabea\uabec\uabed\uabf0-\uabf9\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe00-\ufe0f\ufe20-\ufe26\ufe33\ufe34\ufe4d-\ufe4f\ufe70-\ufe74\ufe76-\ufefc\uff10-\uff19\uff21-\uff3a\uff3f\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc]'),
2306
+ LeadingZeros: new RegExp('^0+(?!$)')
2229
2307
  };
2230
2308
 
2231
2309
  // Ensure the condition is true, otherwise throw an error.
@@ -2744,7 +2822,9 @@ parseYieldExpression: true
2744
2822
 
2745
2823
  // Other 2-character punctuators: ++ -- << >> && ||
2746
2824
 
2747
- if (ch1 === ch2 && ('+-<>&|'.indexOf(ch1) >= 0)) {
2825
+ // Don't match these tokens if we're in a type, since they never can
2826
+ // occur and can mess up types like Map<string, Array<string>>
2827
+ if (ch1 === ch2 && ('+-<>&|'.indexOf(ch1) >= 0) && !state.inType) {
2748
2828
  index += 2;
2749
2829
  return {
2750
2830
  type: Token.Punctuator,
@@ -3220,7 +3300,7 @@ parseYieldExpression: true
3220
3300
  }
3221
3301
 
3222
3302
  function scanRegExp() {
3223
- var str, ch, start, pattern, flags, value, classMarker = false, restore, terminated = false;
3303
+ var str, ch, start, pattern, flags, value, classMarker = false, restore, terminated = false, tmp;
3224
3304
 
3225
3305
  lookahead = null;
3226
3306
  skipComment();
@@ -3296,19 +3376,43 @@ parseYieldExpression: true
3296
3376
  }
3297
3377
  }
3298
3378
 
3379
+ tmp = pattern;
3380
+ if (flags.indexOf('u') >= 0) {
3381
+ // Replace each astral symbol and every Unicode code point
3382
+ // escape sequence that represents such a symbol with a single
3383
+ // ASCII symbol to avoid throwing on regular expressions that
3384
+ // are only valid in combination with the `/u` flag.
3385
+ tmp = tmp
3386
+ .replace(/\\u\{([0-9a-fA-F]{5,6})\}/g, 'x')
3387
+ .replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g, 'x');
3388
+ }
3389
+
3390
+ // First, detect invalid regular expressions.
3299
3391
  try {
3300
- value = new RegExp(pattern, flags);
3392
+ value = new RegExp(tmp);
3301
3393
  } catch (e) {
3302
3394
  throwError({}, Messages.InvalidRegExp);
3303
3395
  }
3304
3396
 
3305
- peek();
3397
+ // Return a regular expression object for this pattern-flag pair, or
3398
+ // `null` in case the current environment doesn't support the flags it
3399
+ // uses.
3400
+ try {
3401
+ value = new RegExp(pattern, flags);
3402
+ } catch (exception) {
3403
+ value = null;
3404
+ }
3306
3405
 
3406
+ peek();
3307
3407
 
3308
3408
  if (extra.tokenize) {
3309
3409
  return {
3310
3410
  type: Token.RegularExpression,
3311
3411
  value: value,
3412
+ regex: {
3413
+ pattern: pattern,
3414
+ flags: flags
3415
+ },
3312
3416
  lineNumber: lineNumber,
3313
3417
  lineStart: lineStart,
3314
3418
  range: [start, index]
@@ -3317,6 +3421,10 @@ parseYieldExpression: true
3317
3421
  return {
3318
3422
  literal: str,
3319
3423
  value: value,
3424
+ regex: {
3425
+ pattern: pattern,
3426
+ flags: flags
3427
+ },
3320
3428
  range: [start, index]
3321
3429
  };
3322
3430
  }
@@ -3511,6 +3619,13 @@ parseYieldExpression: true
3511
3619
  return result;
3512
3620
  }
3513
3621
 
3622
+ function rewind(token) {
3623
+ index = token.range[0];
3624
+ lineNumber = token.lineNumber;
3625
+ lineStart = token.lineStart;
3626
+ lookahead = token;
3627
+ }
3628
+
3514
3629
  function markerCreate() {
3515
3630
  if (!extra.loc && !extra.range) {
3516
3631
  return undefined;
@@ -3738,8 +3853,8 @@ parseYieldExpression: true
3738
3853
  },
3739
3854
 
3740
3855
  createFunctionDeclaration: function (id, params, defaults, body, rest, generator, expression,
3741
- returnType, parametricType) {
3742
- return {
3856
+ isAsync, returnType, typeParameters) {
3857
+ var funDecl = {
3743
3858
  type: Syntax.FunctionDeclaration,
3744
3859
  id: id,
3745
3860
  params: params,
@@ -3749,13 +3864,19 @@ parseYieldExpression: true
3749
3864
  generator: generator,
3750
3865
  expression: expression,
3751
3866
  returnType: returnType,
3752
- parametricType: parametricType
3867
+ typeParameters: typeParameters
3753
3868
  };
3869
+
3870
+ if (isAsync) {
3871
+ funDecl.async = true;
3872
+ }
3873
+
3874
+ return funDecl;
3754
3875
  },
3755
3876
 
3756
3877
  createFunctionExpression: function (id, params, defaults, body, rest, generator, expression,
3757
- returnType, parametricType) {
3758
- return {
3878
+ isAsync, returnType, typeParameters) {
3879
+ var funExpr = {
3759
3880
  type: Syntax.FunctionExpression,
3760
3881
  id: id,
3761
3882
  params: params,
@@ -3765,8 +3886,14 @@ parseYieldExpression: true
3765
3886
  generator: generator,
3766
3887
  expression: expression,
3767
3888
  returnType: returnType,
3768
- parametricType: parametricType
3889
+ typeParameters: typeParameters
3769
3890
  };
3891
+
3892
+ if (isAsync) {
3893
+ funExpr.async = true;
3894
+ }
3895
+
3896
+ return funExpr;
3770
3897
  },
3771
3898
 
3772
3899
  createIdentifier: function (name) {
@@ -3778,25 +3905,110 @@ parseYieldExpression: true
3778
3905
  // are added later (like 'loc' and 'range'). This just helps
3779
3906
  // keep the shape of Identifier nodes consistent with everything
3780
3907
  // else.
3781
- typeAnnotation: undefined
3908
+ typeAnnotation: undefined,
3909
+ optional: undefined
3782
3910
  };
3783
3911
  },
3784
3912
 
3785
- createTypeAnnotation: function (typeIdentifier, parametricType, params, returnType, nullable) {
3913
+ createTypeAnnotation: function (typeAnnotation) {
3786
3914
  return {
3787
3915
  type: Syntax.TypeAnnotation,
3788
- id: typeIdentifier,
3789
- parametricType: parametricType,
3916
+ typeAnnotation: typeAnnotation
3917
+ };
3918
+ },
3919
+
3920
+ createFunctionTypeAnnotation: function (params, returnType, rest, typeParameters) {
3921
+ return {
3922
+ type: Syntax.FunctionTypeAnnotation,
3790
3923
  params: params,
3791
3924
  returnType: returnType,
3792
- nullable: nullable
3925
+ rest: rest,
3926
+ typeParameters: typeParameters
3927
+ };
3928
+ },
3929
+
3930
+ createFunctionTypeParam: function (name, typeAnnotation, optional) {
3931
+ return {
3932
+ type: Syntax.FunctionTypeParam,
3933
+ name: name,
3934
+ typeAnnotation: typeAnnotation,
3935
+ optional: optional
3793
3936
  };
3794
3937
  },
3795
3938
 
3796
- createParametricTypeAnnotation: function (parametricTypes) {
3939
+ createNullableTypeAnnotation: function (typeAnnotation) {
3797
3940
  return {
3798
- type: Syntax.ParametricTypeAnnotation,
3799
- params: parametricTypes
3941
+ type: Syntax.NullableTypeAnnotation,
3942
+ typeAnnotation: typeAnnotation
3943
+ };
3944
+ },
3945
+
3946
+ createArrayTypeAnnotation: function (elementType) {
3947
+ return {
3948
+ type: Syntax.ArrayTypeAnnotation,
3949
+ elementType: elementType
3950
+ };
3951
+ },
3952
+
3953
+ createGenericTypeAnnotation: function (id, typeParameters) {
3954
+ return {
3955
+ type: Syntax.GenericTypeAnnotation,
3956
+ id: id,
3957
+ typeParameters: typeParameters
3958
+ };
3959
+ },
3960
+
3961
+ createQualifiedTypeIdentifier: function (qualification, id) {
3962
+ return {
3963
+ type: Syntax.QualifiedTypeIdentifier,
3964
+ qualification: qualification,
3965
+ id: id
3966
+ };
3967
+ },
3968
+
3969
+ createTypeParameterDeclaration: function (params) {
3970
+ return {
3971
+ type: Syntax.TypeParameterDeclaration,
3972
+ params: params
3973
+ };
3974
+ },
3975
+
3976
+ createTypeParameterInstantiation: function (params) {
3977
+ return {
3978
+ type: Syntax.TypeParameterInstantiation,
3979
+ params: params
3980
+ };
3981
+ },
3982
+
3983
+ createAnyTypeAnnotation: function () {
3984
+ return {
3985
+ type: Syntax.AnyTypeAnnotation
3986
+ };
3987
+ },
3988
+
3989
+ createBooleanTypeAnnotation: function () {
3990
+ return {
3991
+ type: Syntax.BooleanTypeAnnotation
3992
+ };
3993
+ },
3994
+
3995
+ createNumberTypeAnnotation: function () {
3996
+ return {
3997
+ type: Syntax.NumberTypeAnnotation
3998
+ };
3999
+ },
4000
+
4001
+ createStringTypeAnnotation: function () {
4002
+ return {
4003
+ type: Syntax.StringTypeAnnotation
4004
+ };
4005
+ },
4006
+
4007
+ createStringLiteralTypeAnnotation: function (token) {
4008
+ return {
4009
+ type: Syntax.StringLiteralTypeAnnotation,
4010
+ value: token.value,
4011
+ raw: source.slice(token.range[0], token.range[1])
3800
4012
  };
3801
4013
  },
3802
4014
 
@@ -3806,26 +4018,117 @@ parseYieldExpression: true
3806
4018
  };
3807
4019
  },
3808
4020
 
3809
- createObjectTypeAnnotation: function (properties, nullable) {
4021
+ createTypeofTypeAnnotation: function (argument) {
4022
+ return {
4023
+ type: Syntax.TypeofTypeAnnotation,
4024
+ argument: argument
4025
+ };
4026
+ },
4027
+
4028
+ createTupleTypeAnnotation: function (types) {
4029
+ return {
4030
+ type: Syntax.TupleTypeAnnotation,
4031
+ types: types
4032
+ };
4033
+ },
4034
+
4035
+ createObjectTypeAnnotation: function (properties, indexers, callProperties) {
3810
4036
  return {
3811
4037
  type: Syntax.ObjectTypeAnnotation,
3812
4038
  properties: properties,
3813
- nullable: nullable
4039
+ indexers: indexers,
4040
+ callProperties: callProperties
4041
+ };
4042
+ },
4043
+
4044
+ createObjectTypeIndexer: function (id, key, value, isStatic) {
4045
+ return {
4046
+ type: Syntax.ObjectTypeIndexer,
4047
+ id: id,
4048
+ key: key,
4049
+ value: value,
4050
+ "static": isStatic
4051
+ };
4052
+ },
4053
+
4054
+ createObjectTypeCallProperty: function (value, isStatic) {
4055
+ return {
4056
+ type: Syntax.ObjectTypeCallProperty,
4057
+ value: value,
4058
+ "static": isStatic
3814
4059
  };
3815
4060
  },
3816
4061
 
3817
- createTypeAnnotatedIdentifier: function (identifier, annotation, isOptionalParam) {
4062
+ createObjectTypeProperty: function (key, value, optional, isStatic) {
3818
4063
  return {
3819
- type: Syntax.TypeAnnotatedIdentifier,
3820
- id: identifier,
3821
- annotation: annotation
4064
+ type: Syntax.ObjectTypeProperty,
4065
+ key: key,
4066
+ value: value,
4067
+ optional: optional,
4068
+ "static": isStatic
4069
+ };
4070
+ },
4071
+
4072
+ createUnionTypeAnnotation: function (types) {
4073
+ return {
4074
+ type: Syntax.UnionTypeAnnotation,
4075
+ types: types
4076
+ };
4077
+ },
4078
+
4079
+ createIntersectionTypeAnnotation: function (types) {
4080
+ return {
4081
+ type: Syntax.IntersectionTypeAnnotation,
4082
+ types: types
4083
+ };
4084
+ },
4085
+
4086
+ createTypeAlias: function (id, typeParameters, right) {
4087
+ return {
4088
+ type: Syntax.TypeAlias,
4089
+ id: id,
4090
+ typeParameters: typeParameters,
4091
+ right: right
4092
+ };
4093
+ },
4094
+
4095
+ createInterface: function (id, typeParameters, body, extended) {
4096
+ return {
4097
+ type: Syntax.InterfaceDeclaration,
4098
+ id: id,
4099
+ typeParameters: typeParameters,
4100
+ body: body,
4101
+ "extends": extended
4102
+ };
4103
+ },
4104
+
4105
+ createInterfaceExtends: function (id, typeParameters) {
4106
+ return {
4107
+ type: Syntax.InterfaceExtends,
4108
+ id: id,
4109
+ typeParameters: typeParameters
4110
+ };
4111
+ },
4112
+
4113
+ createDeclareFunction: function (id) {
4114
+ return {
4115
+ type: Syntax.DeclareFunction,
4116
+ id: id
4117
+ };
4118
+ },
4119
+
4120
+ createDeclareVariable: function (id) {
4121
+ return {
4122
+ type: Syntax.DeclareVariable,
4123
+ id: id
3822
4124
  };
3823
4125
  },
3824
4126
 
3825
- createOptionalParameter: function (identifier) {
4127
+ createDeclareModule: function (id, body) {
3826
4128
  return {
3827
- type: Syntax.OptionalParameter,
3828
- id: identifier
4129
+ type: Syntax.DeclareModule,
4130
+ id: id,
4131
+ body: body
3829
4132
  };
3830
4133
  },
3831
4134
 
@@ -3923,11 +4226,15 @@ parseYieldExpression: true
3923
4226
  },
3924
4227
 
3925
4228
  createLiteral: function (token) {
3926
- return {
4229
+ var object = {
3927
4230
  type: Syntax.Literal,
3928
4231
  value: token.value,
3929
4232
  raw: source.slice(token.range[0], token.range[1])
3930
4233
  };
4234
+ if (token.regex) {
4235
+ object.regex = token.regex;
4236
+ }
4237
+ return object;
3931
4238
  },
3932
4239
 
3933
4240
  createMemberExpression: function (accessor, object, property) {
@@ -4122,8 +4429,8 @@ parseYieldExpression: true
4122
4429
  };
4123
4430
  },
4124
4431
 
4125
- createArrowFunctionExpression: function (params, defaults, body, rest, expression) {
4126
- return {
4432
+ createArrowFunctionExpression: function (params, defaults, body, rest, expression, isAsync) {
4433
+ var arrowExpr = {
4127
4434
  type: Syntax.ArrowFunctionExpression,
4128
4435
  id: null,
4129
4436
  params: params,
@@ -4133,6 +4440,12 @@ parseYieldExpression: true
4133
4440
  generator: false,
4134
4441
  expression: expression
4135
4442
  };
4443
+
4444
+ if (isAsync) {
4445
+ arrowExpr.async = true;
4446
+ }
4447
+
4448
+ return arrowExpr;
4136
4449
  },
4137
4450
 
4138
4451
  createMethodDefinition: function (propertyType, kind, key, value) {
@@ -4145,10 +4458,13 @@ parseYieldExpression: true
4145
4458
  };
4146
4459
  },
4147
4460
 
4148
- createClassProperty: function (propertyIdentifier) {
4461
+ createClassProperty: function (key, typeAnnotation, computed, isStatic) {
4149
4462
  return {
4150
4463
  type: Syntax.ClassProperty,
4151
- id: propertyIdentifier
4464
+ key: key,
4465
+ typeAnnotation: typeAnnotation,
4466
+ computed: computed,
4467
+ "static": isStatic
4152
4468
  };
4153
4469
  },
4154
4470
 
@@ -4159,24 +4475,43 @@ parseYieldExpression: true
4159
4475
  };
4160
4476
  },
4161
4477
 
4162
- createClassExpression: function (id, superClass, body, parametricType) {
4478
+ createClassImplements: function (id, typeParameters) {
4479
+ return {
4480
+ type: Syntax.ClassImplements,
4481
+ id: id,
4482
+ typeParameters: typeParameters
4483
+ };
4484
+ },
4485
+
4486
+ createClassExpression: function (id, superClass, body, typeParameters, superTypeParameters, implemented) {
4163
4487
  return {
4164
4488
  type: Syntax.ClassExpression,
4165
4489
  id: id,
4166
4490
  superClass: superClass,
4167
4491
  body: body,
4168
- parametricType: parametricType
4492
+ typeParameters: typeParameters,
4493
+ superTypeParameters: superTypeParameters,
4494
+ "implements": implemented
4169
4495
  };
4170
4496
  },
4171
4497
 
4172
- createClassDeclaration: function (id, superClass, body, parametricType, superParametricType) {
4498
+ createClassDeclaration: function (id, superClass, body, typeParameters, superTypeParameters, implemented) {
4173
4499
  return {
4174
4500
  type: Syntax.ClassDeclaration,
4175
4501
  id: id,
4176
4502
  superClass: superClass,
4177
4503
  body: body,
4178
- parametricType: parametricType,
4179
- superParametricType: superParametricType
4504
+ typeParameters: typeParameters,
4505
+ superTypeParameters: superTypeParameters,
4506
+ "implements": implemented
4507
+ };
4508
+ },
4509
+
4510
+ createModuleSpecifier: function (token) {
4511
+ return {
4512
+ type: Syntax.ModuleSpecifier,
4513
+ value: token.value,
4514
+ raw: source.slice(token.range[0], token.range[1])
4180
4515
  };
4181
4516
  },
4182
4517
 
@@ -4194,9 +4529,24 @@ parseYieldExpression: true
4194
4529
  };
4195
4530
  },
4196
4531
 
4197
- createExportDeclaration: function (declaration, specifiers, source) {
4532
+ createImportDefaultSpecifier: function (id) {
4533
+ return {
4534
+ type: Syntax.ImportDefaultSpecifier,
4535
+ id: id
4536
+ };
4537
+ },
4538
+
4539
+ createImportNamespaceSpecifier: function (id) {
4540
+ return {
4541
+ type: Syntax.ImportNamespaceSpecifier,
4542
+ id: id
4543
+ };
4544
+ },
4545
+
4546
+ createExportDeclaration: function (isDefault, declaration, specifiers, source) {
4198
4547
  return {
4199
4548
  type: Syntax.ExportDeclaration,
4549
+ 'default': !!isDefault,
4200
4550
  declaration: declaration,
4201
4551
  specifiers: specifiers,
4202
4552
  source: source
@@ -4211,11 +4561,10 @@ parseYieldExpression: true
4211
4561
  };
4212
4562
  },
4213
4563
 
4214
- createImportDeclaration: function (specifiers, kind, source) {
4564
+ createImportDeclaration: function (specifiers, source) {
4215
4565
  return {
4216
4566
  type: Syntax.ImportDeclaration,
4217
4567
  specifiers: specifiers,
4218
- kind: kind,
4219
4568
  source: source
4220
4569
  };
4221
4570
  },
@@ -4228,12 +4577,10 @@ parseYieldExpression: true
4228
4577
  };
4229
4578
  },
4230
4579
 
4231
- createModuleDeclaration: function (id, source, body) {
4580
+ createAwaitExpression: function (argument) {
4232
4581
  return {
4233
- type: Syntax.ModuleDeclaration,
4234
- id: id,
4235
- source: source,
4236
- body: body
4582
+ type: Syntax.AwaitExpression,
4583
+ argument: argument
4237
4584
  };
4238
4585
  },
4239
4586
 
@@ -4357,13 +4704,21 @@ parseYieldExpression: true
4357
4704
  // Expect the next token to match the specified keyword.
4358
4705
  // If not, an exception will be thrown.
4359
4706
 
4360
- function expectKeyword(keyword) {
4707
+ function expectKeyword(keyword, contextual) {
4361
4708
  var token = lex();
4362
- if (token.type !== Token.Keyword || token.value !== keyword) {
4709
+ if (token.type !== (contextual ? Token.Identifier : Token.Keyword) ||
4710
+ token.value !== keyword) {
4363
4711
  throwUnexpected(token);
4364
4712
  }
4365
4713
  }
4366
4714
 
4715
+ // Expect the next token to match the specified contextual keyword.
4716
+ // If not, an exception will be thrown.
4717
+
4718
+ function expectContextualKeyword(keyword) {
4719
+ return expectKeyword(keyword, true);
4720
+ }
4721
+
4367
4722
  // Return true if the next token matches the specified punctuator.
4368
4723
 
4369
4724
  function match(value) {
@@ -4372,15 +4727,15 @@ parseYieldExpression: true
4372
4727
 
4373
4728
  // Return true if the next token matches the specified keyword
4374
4729
 
4375
- function matchKeyword(keyword) {
4376
- return lookahead.type === Token.Keyword && lookahead.value === keyword;
4730
+ function matchKeyword(keyword, contextual) {
4731
+ var expectedType = contextual ? Token.Identifier : Token.Keyword;
4732
+ return lookahead.type === expectedType && lookahead.value === keyword;
4377
4733
  }
4378
4734
 
4379
-
4380
4735
  // Return true if the next token matches the specified contextual keyword
4381
4736
 
4382
4737
  function matchContextualKeyword(keyword) {
4383
- return lookahead.type === Token.Identifier && lookahead.value === keyword;
4738
+ return matchKeyword(keyword, true);
4384
4739
  }
4385
4740
 
4386
4741
  // Return true if the next token is an assignment operator
@@ -4406,6 +4761,30 @@ parseYieldExpression: true
4406
4761
  op === '|=';
4407
4762
  }
4408
4763
 
4764
+ // Note that 'yield' is treated as a keyword in strict mode, but a
4765
+ // contextual keyword (identifier) in non-strict mode, so we need to
4766
+ // use matchKeyword('yield', false) and matchKeyword('yield', true)
4767
+ // (i.e. matchContextualKeyword) appropriately.
4768
+ function matchYield() {
4769
+ return state.yieldAllowed && matchKeyword('yield', !strict);
4770
+ }
4771
+
4772
+ function matchAsync() {
4773
+ var backtrackToken = lookahead, matches = false;
4774
+
4775
+ if (matchContextualKeyword('async')) {
4776
+ lex(); // Make sure peekLineTerminator() starts after 'async'.
4777
+ matches = !peekLineTerminator();
4778
+ rewind(backtrackToken); // Revert the lex().
4779
+ }
4780
+
4781
+ return matches;
4782
+ }
4783
+
4784
+ function matchAwait() {
4785
+ return state.awaitAllowed && matchContextualKeyword('await');
4786
+ }
4787
+
4409
4788
  function consumeSemicolon() {
4410
4789
  var line, oldIndex = index, oldLineNumber = lineNumber,
4411
4790
  oldLineStart = lineStart, oldLookahead = lookahead;
@@ -4513,12 +4892,14 @@ parseYieldExpression: true
4513
4892
  // 11.1.5 Object Initialiser
4514
4893
 
4515
4894
  function parsePropertyFunction(options) {
4516
- var previousStrict, previousYieldAllowed, params, defaults, body,
4517
- marker = markerCreate();
4895
+ var previousStrict, previousYieldAllowed, previousAwaitAllowed,
4896
+ params, defaults, body, marker = markerCreate();
4518
4897
 
4519
4898
  previousStrict = strict;
4520
4899
  previousYieldAllowed = state.yieldAllowed;
4521
4900
  state.yieldAllowed = options.generator;
4901
+ previousAwaitAllowed = state.awaitAllowed;
4902
+ state.awaitAllowed = options.async;
4522
4903
  params = options.params || [];
4523
4904
  defaults = options.defaults || [];
4524
4905
 
@@ -4528,6 +4909,7 @@ parseYieldExpression: true
4528
4909
  }
4529
4910
  strict = previousStrict;
4530
4911
  state.yieldAllowed = previousYieldAllowed;
4912
+ state.awaitAllowed = previousAwaitAllowed;
4531
4913
 
4532
4914
  return markerApply(marker, delegate.createFunctionExpression(
4533
4915
  null,
@@ -4537,8 +4919,9 @@ parseYieldExpression: true
4537
4919
  options.rest || null,
4538
4920
  options.generator,
4539
4921
  body.type !== Syntax.BlockStatement,
4922
+ options.async,
4540
4923
  options.returnType,
4541
- options.parametricType
4924
+ options.typeParameters
4542
4925
  ));
4543
4926
  }
4544
4927
 
@@ -4555,14 +4938,14 @@ parseYieldExpression: true
4555
4938
  throwErrorTolerant(tmp.stricted, tmp.message);
4556
4939
  }
4557
4940
 
4558
-
4559
4941
  method = parsePropertyFunction({
4560
4942
  params: tmp.params,
4561
4943
  defaults: tmp.defaults,
4562
4944
  rest: tmp.rest,
4563
4945
  generator: options.generator,
4946
+ async: options.async,
4564
4947
  returnType: tmp.returnType,
4565
- parametricType: options.parametricType
4948
+ typeParameters: options.typeParameters
4566
4949
  });
4567
4950
 
4568
4951
  strict = previousStrict;
@@ -4602,46 +4985,138 @@ parseYieldExpression: true
4602
4985
 
4603
4986
  function parseObjectProperty() {
4604
4987
  var token, key, id, value, param, expr, computed,
4605
- marker = markerCreate();
4988
+ marker = markerCreate(), returnType;
4606
4989
 
4607
4990
  token = lookahead;
4608
4991
  computed = (token.value === '[');
4609
4992
 
4610
- if (token.type === Token.Identifier || computed) {
4611
-
4993
+ if (token.type === Token.Identifier || computed || matchAsync()) {
4612
4994
  id = parseObjectPropertyKey();
4613
4995
 
4996
+ if (match(':')) {
4997
+ lex();
4998
+
4999
+ return markerApply(
5000
+ marker,
5001
+ delegate.createProperty(
5002
+ 'init',
5003
+ id,
5004
+ parseAssignmentExpression(),
5005
+ false,
5006
+ false,
5007
+ computed
5008
+ )
5009
+ );
5010
+ }
5011
+
5012
+ if (match('(')) {
5013
+ return markerApply(
5014
+ marker,
5015
+ delegate.createProperty(
5016
+ 'init',
5017
+ id,
5018
+ parsePropertyMethodFunction({
5019
+ generator: false,
5020
+ async: false
5021
+ }),
5022
+ true,
5023
+ false,
5024
+ computed
5025
+ )
5026
+ );
5027
+ }
5028
+
4614
5029
  // Property Assignment: Getter and Setter.
4615
5030
 
4616
- if (token.value === 'get' && !(match(':') || match('('))) {
5031
+ if (token.value === 'get') {
4617
5032
  computed = (lookahead.value === '[');
4618
5033
  key = parseObjectPropertyKey();
5034
+
4619
5035
  expect('(');
4620
5036
  expect(')');
4621
- return markerApply(marker, delegate.createProperty('get', key, parsePropertyFunction({ generator: false }), false, false, computed));
5037
+ if (match(':')) {
5038
+ returnType = parseTypeAnnotation();
5039
+ }
5040
+
5041
+ return markerApply(
5042
+ marker,
5043
+ delegate.createProperty(
5044
+ 'get',
5045
+ key,
5046
+ parsePropertyFunction({
5047
+ generator: false,
5048
+ async: false,
5049
+ returnType: returnType
5050
+ }),
5051
+ false,
5052
+ false,
5053
+ computed
5054
+ )
5055
+ );
4622
5056
  }
4623
- if (token.value === 'set' && !(match(':') || match('('))) {
5057
+
5058
+ if (token.value === 'set') {
4624
5059
  computed = (lookahead.value === '[');
4625
5060
  key = parseObjectPropertyKey();
5061
+
4626
5062
  expect('(');
4627
5063
  token = lookahead;
4628
5064
  param = [ parseTypeAnnotatableIdentifier() ];
4629
5065
  expect(')');
4630
- return markerApply(marker, delegate.createProperty('set', key, parsePropertyFunction({ params: param, generator: false, name: token }), false, false, computed));
4631
- }
4632
- if (match(':')) {
4633
- lex();
4634
- return markerApply(marker, delegate.createProperty('init', id, parseAssignmentExpression(), false, false, computed));
5066
+ if (match(':')) {
5067
+ returnType = parseTypeAnnotation();
5068
+ }
5069
+
5070
+ return markerApply(
5071
+ marker,
5072
+ delegate.createProperty(
5073
+ 'set',
5074
+ key,
5075
+ parsePropertyFunction({
5076
+ params: param,
5077
+ generator: false,
5078
+ async: false,
5079
+ name: token,
5080
+ returnType: returnType
5081
+ }),
5082
+ false,
5083
+ false,
5084
+ computed
5085
+ )
5086
+ );
4635
5087
  }
4636
- if (match('(')) {
4637
- return markerApply(marker, delegate.createProperty('init', id, parsePropertyMethodFunction({ generator: false }), true, false, computed));
5088
+
5089
+ if (token.value === 'async') {
5090
+ computed = (lookahead.value === '[');
5091
+ key = parseObjectPropertyKey();
5092
+
5093
+ return markerApply(
5094
+ marker,
5095
+ delegate.createProperty(
5096
+ 'init',
5097
+ key,
5098
+ parsePropertyMethodFunction({
5099
+ generator: false,
5100
+ async: true
5101
+ }),
5102
+ true,
5103
+ false,
5104
+ computed
5105
+ )
5106
+ );
4638
5107
  }
5108
+
4639
5109
  if (computed) {
4640
5110
  // Computed properties can only be used with full notation.
4641
5111
  throwUnexpected(lookahead);
4642
5112
  }
4643
- return markerApply(marker, delegate.createProperty('init', id, id, false, true, false));
5113
+
5114
+ return markerApply(
5115
+ marker,
5116
+ delegate.createProperty('init', id, id, false, true, false)
5117
+ );
4644
5118
  }
5119
+
4645
5120
  if (token.type === Token.EOF || token.type === Token.Punctuator) {
4646
5121
  if (!match('*')) {
4647
5122
  throwUnexpected(token);
@@ -4768,6 +5243,18 @@ parseYieldExpression: true
4768
5243
  return expr;
4769
5244
  }
4770
5245
 
5246
+ function matchAsyncFuncExprOrDecl() {
5247
+ var token;
5248
+
5249
+ if (matchAsync()) {
5250
+ token = lookahead2();
5251
+ if (token.type === Token.Keyword && token.value === 'function') {
5252
+ return true;
5253
+ }
5254
+ }
5255
+
5256
+ return false;
5257
+ }
4771
5258
 
4772
5259
  // 11.1 Primary Expressions
4773
5260
 
@@ -5344,13 +5831,15 @@ parseYieldExpression: true
5344
5831
  }
5345
5832
 
5346
5833
  function parseArrowFunctionExpression(options, marker) {
5347
- var previousStrict, previousYieldAllowed, body;
5834
+ var previousStrict, previousYieldAllowed, previousAwaitAllowed, body;
5348
5835
 
5349
5836
  expect('=>');
5350
5837
 
5351
5838
  previousStrict = strict;
5352
5839
  previousYieldAllowed = state.yieldAllowed;
5353
5840
  state.yieldAllowed = false;
5841
+ previousAwaitAllowed = state.awaitAllowed;
5842
+ state.awaitAllowed = !!options.async;
5354
5843
  body = parseConciseBody();
5355
5844
 
5356
5845
  if (strict && options.firstRestricted) {
@@ -5362,30 +5851,47 @@ parseYieldExpression: true
5362
5851
 
5363
5852
  strict = previousStrict;
5364
5853
  state.yieldAllowed = previousYieldAllowed;
5854
+ state.awaitAllowed = previousAwaitAllowed;
5365
5855
 
5366
5856
  return markerApply(marker, delegate.createArrowFunctionExpression(
5367
5857
  options.params,
5368
5858
  options.defaults,
5369
5859
  body,
5370
5860
  options.rest,
5371
- body.type !== Syntax.BlockStatement
5861
+ body.type !== Syntax.BlockStatement,
5862
+ !!options.async
5372
5863
  ));
5373
5864
  }
5374
5865
 
5375
5866
  function parseAssignmentExpression() {
5376
- var marker, expr, token, params, oldParenthesizedCount;
5867
+ var marker, expr, token, params, oldParenthesizedCount,
5868
+ backtrackToken = lookahead, possiblyAsync = false;
5377
5869
 
5378
- // Note that 'yield' is treated as a keyword in strict mode, but a
5379
- // contextual keyword (identifier) in non-strict mode, so we need
5380
- // to use matchKeyword and matchContextualKeyword appropriately.
5381
- if ((state.yieldAllowed && matchContextualKeyword('yield')) || (strict && matchKeyword('yield'))) {
5870
+ if (matchYield()) {
5382
5871
  return parseYieldExpression();
5383
5872
  }
5384
5873
 
5874
+ if (matchAwait()) {
5875
+ return parseAwaitExpression();
5876
+ }
5877
+
5385
5878
  oldParenthesizedCount = state.parenthesizedCount;
5386
5879
 
5387
5880
  marker = markerCreate();
5388
5881
 
5882
+ if (matchAsyncFuncExprOrDecl()) {
5883
+ return parseFunctionExpression();
5884
+ }
5885
+
5886
+ if (matchAsync()) {
5887
+ // We can't be completely sure that this 'async' token is
5888
+ // actually a contextual keyword modifying a function
5889
+ // expression, so we might have to un-lex() it later by
5890
+ // calling rewind(backtrackToken).
5891
+ possiblyAsync = true;
5892
+ lex();
5893
+ }
5894
+
5389
5895
  if (match('(')) {
5390
5896
  token = lookahead2();
5391
5897
  if ((token.type === Token.Punctuator && token.value === ')') || token.value === '...') {
@@ -5393,11 +5899,21 @@ parseYieldExpression: true
5393
5899
  if (!match('=>')) {
5394
5900
  throwUnexpected(lex());
5395
5901
  }
5902
+ params.async = possiblyAsync;
5396
5903
  return parseArrowFunctionExpression(params, marker);
5397
5904
  }
5398
5905
  }
5399
5906
 
5400
5907
  token = lookahead;
5908
+
5909
+ // If the 'async' keyword is not followed by a '(' character or an
5910
+ // identifier, then it can't be an arrow function modifier, and we
5911
+ // should interpret it as a normal identifer.
5912
+ if (possiblyAsync && !match('(') && token.type !== Token.Identifier) {
5913
+ possiblyAsync = false;
5914
+ rewind(backtrackToken);
5915
+ }
5916
+
5401
5917
  expr = parseConditionalExpression();
5402
5918
 
5403
5919
  if (match('=>') &&
@@ -5409,10 +5925,20 @@ parseYieldExpression: true
5409
5925
  params = reinterpretAsCoverFormalsList(expr.expressions);
5410
5926
  }
5411
5927
  if (params) {
5928
+ params.async = possiblyAsync;
5412
5929
  return parseArrowFunctionExpression(params, marker);
5413
5930
  }
5414
5931
  }
5415
5932
 
5933
+ // If we haven't returned by now, then the 'async' keyword was not
5934
+ // a function modifier, and we should rewind and interpret it as a
5935
+ // normal identifier.
5936
+ if (possiblyAsync) {
5937
+ possiblyAsync = false;
5938
+ rewind(backtrackToken);
5939
+ expr = parseConditionalExpression();
5940
+ }
5941
+
5416
5942
  if (matchAssign()) {
5417
5943
  // 11.13.1
5418
5944
  if (strict && expr.type === Syntax.Identifier && isRestrictedWord(expr.name)) {
@@ -5518,118 +6044,446 @@ parseYieldExpression: true
5518
6044
 
5519
6045
  // 12.2 Variable Statement
5520
6046
 
5521
- function parseObjectTypeAnnotation(nullable) {
5522
- var isMethod, marker, properties = [], property, propertyKey,
5523
- propertyTypeAnnotation;
6047
+ function parseTypeParameterDeclaration() {
6048
+ var marker = markerCreate(), paramTypes = [];
6049
+
6050
+ expect('<');
6051
+ while (!match('>')) {
6052
+ paramTypes.push(parseVariableIdentifier());
6053
+ if (!match('>')) {
6054
+ expect(',');
6055
+ }
6056
+ }
6057
+ expect('>');
6058
+
6059
+ return markerApply(marker, delegate.createTypeParameterDeclaration(
6060
+ paramTypes
6061
+ ));
6062
+ }
6063
+
6064
+ function parseTypeParameterInstantiation() {
6065
+ var marker = markerCreate(), oldInType = state.inType, paramTypes = [];
6066
+
6067
+ state.inType = true;
6068
+
6069
+ expect('<');
6070
+ while (!match('>')) {
6071
+ paramTypes.push(parseType());
6072
+ if (!match('>')) {
6073
+ expect(',');
6074
+ }
6075
+ }
6076
+ expect('>');
6077
+
6078
+ state.inType = oldInType;
6079
+
6080
+ return markerApply(marker, delegate.createTypeParameterInstantiation(
6081
+ paramTypes
6082
+ ));
6083
+ }
6084
+
6085
+ function parseObjectTypeIndexer(marker, isStatic) {
6086
+ var id, key, value;
6087
+
6088
+ expect('[');
6089
+ id = parseObjectPropertyKey();
6090
+ expect(':');
6091
+ key = parseType();
6092
+ expect(']');
6093
+ expect(':');
6094
+ value = parseType();
6095
+
6096
+ return markerApply(marker, delegate.createObjectTypeIndexer(
6097
+ id,
6098
+ key,
6099
+ value,
6100
+ isStatic
6101
+ ));
6102
+ }
6103
+
6104
+ function parseObjectTypeMethodish(marker) {
6105
+ var params = [], rest = null, returnType, typeParameters = null;
6106
+ if (match('<')) {
6107
+ typeParameters = parseTypeParameterDeclaration();
6108
+ }
6109
+
6110
+ expect('(');
6111
+ while (lookahead.type === Token.Identifier) {
6112
+ params.push(parseFunctionTypeParam());
6113
+ if (!match(')')) {
6114
+ expect(',');
6115
+ }
6116
+ }
6117
+
6118
+ if (match('...')) {
6119
+ lex();
6120
+ rest = parseFunctionTypeParam();
6121
+ }
6122
+ expect(')');
6123
+ expect(':');
6124
+ returnType = parseType();
6125
+
6126
+ return markerApply(marker, delegate.createFunctionTypeAnnotation(
6127
+ params,
6128
+ returnType,
6129
+ rest,
6130
+ typeParameters
6131
+ ));
6132
+ }
6133
+
6134
+ function parseObjectTypeMethod(marker, isStatic, key) {
6135
+ var optional = false, value;
6136
+ value = parseObjectTypeMethodish(marker);
6137
+
6138
+ return markerApply(marker, delegate.createObjectTypeProperty(
6139
+ key,
6140
+ value,
6141
+ optional,
6142
+ isStatic
6143
+ ));
6144
+ }
6145
+
6146
+ function parseObjectTypeCallProperty(marker, isStatic) {
6147
+ var valueMarker = markerCreate();
6148
+ return markerApply(marker, delegate.createObjectTypeCallProperty(
6149
+ parseObjectTypeMethodish(valueMarker),
6150
+ isStatic
6151
+ ));
6152
+ }
6153
+
6154
+ function parseObjectType(allowStatic) {
6155
+ var callProperties = [], indexers = [], marker, optional = false,
6156
+ properties = [], property, propertyKey, propertyTypeAnnotation,
6157
+ token, isStatic;
5524
6158
 
5525
6159
  expect('{');
5526
6160
 
5527
6161
  while (!match('}')) {
5528
6162
  marker = markerCreate();
5529
- propertyKey = parseObjectPropertyKey();
5530
- isMethod = match('(');
5531
- propertyTypeAnnotation = parseTypeAnnotation();
5532
- properties.push(markerApply(marker, delegate.createProperty(
5533
- 'init',
5534
- propertyKey,
5535
- propertyTypeAnnotation,
5536
- isMethod,
5537
- false
5538
- )));
6163
+ if (allowStatic && matchContextualKeyword('static')) {
6164
+ token = lex();
6165
+ isStatic = true;
6166
+ }
5539
6167
 
5540
- if (!match('}')) {
5541
- if (match(',') || match(';')) {
5542
- lex();
6168
+ if (match('[')) {
6169
+ indexers.push(parseObjectTypeIndexer(marker, isStatic));
6170
+ } else if (match('(') || match('<')) {
6171
+ callProperties.push(parseObjectTypeCallProperty(marker, allowStatic));
6172
+ } else {
6173
+ if (isStatic && match(':')) {
6174
+ propertyKey = markerApply(marker, delegate.createIdentifier(token));
6175
+ throwErrorTolerant(token, Messages.StrictReservedWord);
5543
6176
  } else {
5544
- throwUnexpected(lookahead);
6177
+ propertyKey = parseObjectPropertyKey();
6178
+ }
6179
+ if (match('<') || match('(')) {
6180
+ // This is a method property
6181
+ properties.push(parseObjectTypeMethod(marker, isStatic, propertyKey));
6182
+ } else {
6183
+ if (match('?')) {
6184
+ lex();
6185
+ optional = true;
6186
+ }
6187
+ expect(':');
6188
+ propertyTypeAnnotation = parseType();
6189
+ properties.push(markerApply(marker, delegate.createObjectTypeProperty(
6190
+ propertyKey,
6191
+ propertyTypeAnnotation,
6192
+ optional,
6193
+ isStatic
6194
+ )));
5545
6195
  }
5546
6196
  }
6197
+
6198
+ if (match(';')) {
6199
+ lex();
6200
+ } else if (!match('}')) {
6201
+ throwUnexpected(lookahead);
6202
+ }
5547
6203
  }
5548
6204
 
5549
6205
  expect('}');
5550
6206
 
5551
- return delegate.createObjectTypeAnnotation(properties, nullable);
6207
+ return delegate.createObjectTypeAnnotation(
6208
+ properties,
6209
+ indexers,
6210
+ callProperties
6211
+ );
6212
+ }
6213
+
6214
+ function parseGenericType() {
6215
+ var marker = markerCreate(), returnType = null,
6216
+ typeParameters = null, typeIdentifier,
6217
+ typeIdentifierMarker = markerCreate;
6218
+
6219
+ typeIdentifier = parseVariableIdentifier();
6220
+
6221
+ while (match('.')) {
6222
+ expect('.');
6223
+ typeIdentifier = markerApply(marker, delegate.createQualifiedTypeIdentifier(
6224
+ typeIdentifier,
6225
+ parseVariableIdentifier()
6226
+ ));
6227
+ }
6228
+
6229
+ if (match('<')) {
6230
+ typeParameters = parseTypeParameterInstantiation();
6231
+ }
6232
+
6233
+ return markerApply(marker, delegate.createGenericTypeAnnotation(
6234
+ typeIdentifier,
6235
+ typeParameters
6236
+ ));
5552
6237
  }
5553
6238
 
5554
- function parseVoidTypeAnnotation() {
6239
+ function parseVoidType() {
5555
6240
  var marker = markerCreate();
5556
6241
  expectKeyword('void');
5557
6242
  return markerApply(marker, delegate.createVoidTypeAnnotation());
5558
6243
  }
5559
6244
 
5560
- function parseParametricTypeAnnotation() {
5561
- var marker = markerCreate(), typeIdentifier, paramTypes = [];
6245
+ function parseTypeofType() {
6246
+ var argument, marker = markerCreate();
6247
+ expectKeyword('typeof');
6248
+ argument = parsePrimaryType();
6249
+ return markerApply(marker, delegate.createTypeofTypeAnnotation(
6250
+ argument
6251
+ ));
6252
+ }
6253
+
6254
+ function parseTupleType() {
6255
+ var marker = markerCreate(), types = [];
6256
+ expect('[');
6257
+ // We allow trailing commas
6258
+ while (index < length && !match(']')) {
6259
+ types.push(parseType());
6260
+ if (match(']')) {
6261
+ break;
6262
+ }
6263
+ expect(',');
6264
+ }
6265
+ expect(']');
6266
+ return markerApply(marker, delegate.createTupleTypeAnnotation(
6267
+ types
6268
+ ));
6269
+ }
5562
6270
 
5563
- expect('<');
5564
- while (!match('>')) {
5565
- paramTypes.push(parseVariableIdentifier());
5566
- if (!match('>')) {
6271
+ function parseFunctionTypeParam() {
6272
+ var marker = markerCreate(), name, optional = false, typeAnnotation;
6273
+ name = parseVariableIdentifier();
6274
+ if (match('?')) {
6275
+ lex();
6276
+ optional = true;
6277
+ }
6278
+ expect(':');
6279
+ typeAnnotation = parseType();
6280
+ return markerApply(marker, delegate.createFunctionTypeParam(
6281
+ name,
6282
+ typeAnnotation,
6283
+ optional
6284
+ ));
6285
+ }
6286
+
6287
+ function parseFunctionTypeParams() {
6288
+ var ret = { params: [], rest: null };
6289
+ while (lookahead.type === Token.Identifier) {
6290
+ ret.params.push(parseFunctionTypeParam());
6291
+ if (!match(')')) {
5567
6292
  expect(',');
5568
6293
  }
5569
6294
  }
5570
- expect('>');
5571
6295
 
5572
- return markerApply(marker, delegate.createParametricTypeAnnotation(
5573
- paramTypes
5574
- ));
6296
+ if (match('...')) {
6297
+ lex();
6298
+ ret.rest = parseFunctionTypeParam();
6299
+ }
6300
+ return ret;
5575
6301
  }
5576
6302
 
5577
- function parseTypeAnnotation(dontExpectColon) {
6303
+ // The parsing of types roughly parallels the parsing of expressions, and
6304
+ // primary types are kind of like primary expressions...they're the
6305
+ // primitives with which other types are constructed.
6306
+ function parsePrimaryType() {
5578
6307
  var typeIdentifier = null, params = null, returnType = null,
5579
- nullable = false, marker = markerCreate(), returnTypeMarker = null,
5580
- parametricType, annotation;
6308
+ marker = markerCreate(), rest = null, tmp,
6309
+ typeParameters, token, type, isGroupedType = false;
5581
6310
 
5582
- if (!dontExpectColon) {
5583
- expect(':');
6311
+ switch (lookahead.type) {
6312
+ case Token.Identifier:
6313
+ switch (lookahead.value) {
6314
+ case 'any':
6315
+ lex();
6316
+ return markerApply(marker, delegate.createAnyTypeAnnotation());
6317
+ case 'bool': // fallthrough
6318
+ case 'boolean':
6319
+ lex();
6320
+ return markerApply(marker, delegate.createBooleanTypeAnnotation());
6321
+ case 'number':
6322
+ lex();
6323
+ return markerApply(marker, delegate.createNumberTypeAnnotation());
6324
+ case 'string':
6325
+ lex();
6326
+ return markerApply(marker, delegate.createStringTypeAnnotation());
6327
+ }
6328
+ return markerApply(marker, parseGenericType());
6329
+ case Token.Punctuator:
6330
+ switch (lookahead.value) {
6331
+ case '{':
6332
+ return markerApply(marker, parseObjectType());
6333
+ case '[':
6334
+ return parseTupleType();
6335
+ case '<':
6336
+ typeParameters = parseTypeParameterDeclaration();
6337
+ expect('(');
6338
+ tmp = parseFunctionTypeParams();
6339
+ params = tmp.params;
6340
+ rest = tmp.rest;
6341
+ expect(')');
6342
+
6343
+ expect('=>');
6344
+
6345
+ returnType = parseType();
6346
+
6347
+ return markerApply(marker, delegate.createFunctionTypeAnnotation(
6348
+ params,
6349
+ returnType,
6350
+ rest,
6351
+ typeParameters
6352
+ ));
6353
+ case '(':
6354
+ lex();
6355
+ // Check to see if this is actually a grouped type
6356
+ if (!match(')') && !match('...')) {
6357
+ if (lookahead.type === Token.Identifier) {
6358
+ token = lookahead2();
6359
+ isGroupedType = token.value !== '?' && token.value !== ':';
6360
+ } else {
6361
+ isGroupedType = true;
6362
+ }
6363
+ }
6364
+
6365
+ if (isGroupedType) {
6366
+ type = parseType();
6367
+ expect(')');
6368
+
6369
+ // If we see a => next then someone was probably confused about
6370
+ // function types, so we can provide a better error message
6371
+ if (match('=>')) {
6372
+ throwError({}, Messages.ConfusedAboutFunctionType);
6373
+ }
6374
+
6375
+ return type;
6376
+ }
6377
+
6378
+ tmp = parseFunctionTypeParams();
6379
+ params = tmp.params;
6380
+ rest = tmp.rest;
6381
+
6382
+ expect(')');
6383
+
6384
+ expect('=>');
6385
+
6386
+ returnType = parseType();
6387
+
6388
+ return markerApply(marker, delegate.createFunctionTypeAnnotation(
6389
+ params,
6390
+ returnType,
6391
+ rest,
6392
+ null /* typeParameters */
6393
+ ));
6394
+ }
6395
+ break;
6396
+ case Token.Keyword:
6397
+ switch (lookahead.value) {
6398
+ case 'void':
6399
+ return markerApply(marker, parseVoidType());
6400
+ case 'typeof':
6401
+ return markerApply(marker, parseTypeofType());
6402
+ }
6403
+ break;
6404
+ case Token.StringLiteral:
6405
+ token = lex();
6406
+ if (token.octal) {
6407
+ throwError(token, Messages.StrictOctalLiteral);
6408
+ }
6409
+ return markerApply(marker, delegate.createStringLiteralTypeAnnotation(
6410
+ token
6411
+ ));
5584
6412
  }
5585
6413
 
6414
+ throwUnexpected(lookahead);
6415
+ }
6416
+
6417
+ function parsePostfixType() {
6418
+ var marker = markerCreate(), t = parsePrimaryType();
6419
+ if (match('[')) {
6420
+ expect('[');
6421
+ expect(']');
6422
+ return markerApply(marker, delegate.createArrayTypeAnnotation(t));
6423
+ }
6424
+ return t;
6425
+ }
6426
+
6427
+ function parsePrefixType() {
6428
+ var marker = markerCreate();
5586
6429
  if (match('?')) {
5587
6430
  lex();
5588
- nullable = true;
6431
+ return markerApply(marker, delegate.createNullableTypeAnnotation(
6432
+ parsePrefixType()
6433
+ ));
5589
6434
  }
6435
+ return parsePostfixType();
6436
+ }
5590
6437
 
5591
- if (match('{')) {
5592
- return markerApply(marker, parseObjectTypeAnnotation(nullable));
6438
+
6439
+ function parseIntersectionType() {
6440
+ var marker = markerCreate(), type, types;
6441
+ type = parsePrefixType();
6442
+ types = [type];
6443
+ while (match('&')) {
6444
+ lex();
6445
+ types.push(parsePrefixType());
5593
6446
  }
5594
6447
 
5595
- if (lookahead.type === Token.Identifier) {
5596
- typeIdentifier = parseVariableIdentifier();
5597
- if (match('<')) {
5598
- parametricType = parseParametricTypeAnnotation();
5599
- }
5600
- } else if (match('(')) {
6448
+ return types.length === 1 ?
6449
+ type :
6450
+ markerApply(marker, delegate.createIntersectionTypeAnnotation(
6451
+ types
6452
+ ));
6453
+ }
6454
+
6455
+ function parseUnionType() {
6456
+ var marker = markerCreate(), type, types;
6457
+ type = parseIntersectionType();
6458
+ types = [type];
6459
+ while (match('|')) {
5601
6460
  lex();
5602
- params = [];
5603
- while (lookahead.type === Token.Identifier || match('?')) {
5604
- params.push(parseTypeAnnotatableIdentifier(
5605
- true, /* requireTypeAnnotation */
5606
- true /* canBeOptionalParam */
6461
+ types.push(parseIntersectionType());
6462
+ }
6463
+ return types.length === 1 ?
6464
+ type :
6465
+ markerApply(marker, delegate.createUnionTypeAnnotation(
6466
+ types
5607
6467
  ));
5608
- if (!match(')')) {
5609
- expect(',');
5610
- }
5611
- }
5612
- expect(')');
6468
+ }
5613
6469
 
5614
- returnTypeMarker = markerCreate();
5615
- expect('=>');
6470
+ function parseType() {
6471
+ var oldInType = state.inType, type;
6472
+ state.inType = true;
5616
6473
 
5617
- returnType = parseTypeAnnotation(true);
5618
- } else {
5619
- if (!matchKeyword('void')) {
5620
- throwUnexpected(lookahead);
5621
- } else {
5622
- return markerApply(marker, parseVoidTypeAnnotation());
5623
- }
5624
- }
6474
+ type = parseUnionType();
5625
6475
 
5626
- return markerApply(marker, delegate.createTypeAnnotation(
5627
- typeIdentifier,
5628
- parametricType,
5629
- params,
5630
- returnType,
5631
- nullable
5632
- ));
6476
+ state.inType = oldInType;
6477
+ return type;
6478
+ }
6479
+
6480
+ function parseTypeAnnotation() {
6481
+ var marker = markerCreate(), type;
6482
+
6483
+ expect(':');
6484
+ type = parseType();
6485
+
6486
+ return markerApply(marker, delegate.createTypeAnnotation(type));
5633
6487
  }
5634
6488
 
5635
6489
  function parseVariableIdentifier() {
@@ -5654,14 +6508,13 @@ parseYieldExpression: true
5654
6508
  }
5655
6509
 
5656
6510
  if (requireTypeAnnotation || match(':')) {
5657
- ident = markerApply(marker, delegate.createTypeAnnotatedIdentifier(
5658
- ident,
5659
- parseTypeAnnotation()
5660
- ));
6511
+ ident.typeAnnotation = parseTypeAnnotation();
6512
+ ident = markerApply(marker, ident);
5661
6513
  }
5662
6514
 
5663
6515
  if (isOptionalParam) {
5664
- ident = markerApply(marker, delegate.createOptionalParameter(ident));
6516
+ ident.optional = true;
6517
+ ident = markerApply(marker, ident);
5665
6518
  }
5666
6519
 
5667
6520
  return ident;
@@ -5670,13 +6523,22 @@ parseYieldExpression: true
5670
6523
  function parseVariableDeclaration(kind) {
5671
6524
  var id,
5672
6525
  marker = markerCreate(),
5673
- init = null;
6526
+ init = null,
6527
+ typeAnnotationMarker = markerCreate();
5674
6528
  if (match('{')) {
5675
6529
  id = parseObjectInitialiser();
5676
6530
  reinterpretAsAssignmentBindingPattern(id);
6531
+ if (match(':')) {
6532
+ id.typeAnnotation = parseTypeAnnotation();
6533
+ markerApply(typeAnnotationMarker, id);
6534
+ }
5677
6535
  } else if (match('[')) {
5678
6536
  id = parseArrayInitialiser();
5679
6537
  reinterpretAsAssignmentBindingPattern(id);
6538
+ if (match(':')) {
6539
+ id.typeAnnotation = parseTypeAnnotation();
6540
+ markerApply(typeAnnotationMarker, id);
6541
+ }
5680
6542
  } else {
5681
6543
  id = state.allowKeyword ? parseNonComputedProperty() : parseTypeAnnotatableIdentifier();
5682
6544
  // 12.2.1
@@ -5741,41 +6603,18 @@ parseYieldExpression: true
5741
6603
  return markerApply(marker, delegate.createVariableDeclaration(declarations, kind));
5742
6604
  }
5743
6605
 
5744
- // http://wiki.ecmascript.org/doku.php?id=harmony:modules
5745
-
5746
- function parseModuleDeclaration() {
5747
- var id, src, body, marker = markerCreate();
5748
-
5749
- lex(); // 'module'
5750
-
5751
- if (peekLineTerminator()) {
5752
- throwError({}, Messages.NewlineAfterModule);
5753
- }
5754
-
5755
- switch (lookahead.type) {
6606
+ // people.mozilla.org/~jorendorff/es6-draft.html
5756
6607
 
5757
- case Token.StringLiteral:
5758
- id = parsePrimaryExpression();
5759
- body = parseModuleBlock();
5760
- src = null;
5761
- break;
6608
+ function parseModuleSpecifier() {
6609
+ var marker = markerCreate(),
6610
+ specifier;
5762
6611
 
5763
- case Token.Identifier:
5764
- id = parseVariableIdentifier();
5765
- body = null;
5766
- if (!matchContextualKeyword('from')) {
5767
- throwUnexpected(lex());
5768
- }
5769
- lex();
5770
- src = parsePrimaryExpression();
5771
- if (src.type !== Syntax.Literal) {
5772
- throwError({}, Messages.InvalidModuleSpecifier);
5773
- }
5774
- break;
6612
+ if (lookahead.type !== Token.StringLiteral) {
6613
+ throwError({}, Messages.InvalidModuleSpecifier);
5775
6614
  }
5776
-
5777
- consumeSemicolon();
5778
- return markerApply(marker, delegate.createModuleDeclaration(id, src, body));
6615
+ specifier = delegate.createModuleSpecifier(lookahead);
6616
+ lex();
6617
+ return markerApply(marker, specifier);
5779
6618
  }
5780
6619
 
5781
6620
  function parseExportBatchSpecifier() {
@@ -5785,9 +6624,14 @@ parseYieldExpression: true
5785
6624
  }
5786
6625
 
5787
6626
  function parseExportSpecifier() {
5788
- var id, name = null, marker = markerCreate();
5789
-
5790
- id = parseVariableIdentifier();
6627
+ var id, name = null, marker = markerCreate(), from;
6628
+ if (matchKeyword('default')) {
6629
+ lex();
6630
+ id = markerApply(marker, delegate.createIdentifier('default'));
6631
+ // export {default} from "something";
6632
+ } else {
6633
+ id = parseVariableIdentifier();
6634
+ }
5791
6635
  if (matchContextualKeyword('as')) {
5792
6636
  lex();
5793
6637
  name = parseNonComputedProperty();
@@ -5797,104 +6641,207 @@ parseYieldExpression: true
5797
6641
  }
5798
6642
 
5799
6643
  function parseExportDeclaration() {
5800
- var previousAllowKeyword, decl, def, src, specifiers,
6644
+ var backtrackToken, id, previousAllowKeyword, declaration = null,
6645
+ isExportFromIdentifier,
6646
+ src = null, specifiers = [],
5801
6647
  marker = markerCreate();
5802
6648
 
5803
6649
  expectKeyword('export');
5804
6650
 
6651
+ if (matchKeyword('default')) {
6652
+ // covers:
6653
+ // export default ...
6654
+ lex();
6655
+ if (matchKeyword('function') || matchKeyword('class')) {
6656
+ backtrackToken = lookahead;
6657
+ lex();
6658
+ if (isIdentifierName(lookahead)) {
6659
+ // covers:
6660
+ // export default function foo () {}
6661
+ // export default class foo {}
6662
+ id = parseNonComputedProperty();
6663
+ rewind(backtrackToken);
6664
+ return markerApply(marker, delegate.createExportDeclaration(true, parseSourceElement(), [id], null));
6665
+ }
6666
+ // covers:
6667
+ // export default function () {}
6668
+ // export default class {}
6669
+ rewind(backtrackToken);
6670
+ switch (lookahead.value) {
6671
+ case 'class':
6672
+ return markerApply(marker, delegate.createExportDeclaration(true, parseClassExpression(), [], null));
6673
+ case 'function':
6674
+ return markerApply(marker, delegate.createExportDeclaration(true, parseFunctionExpression(), [], null));
6675
+ }
6676
+ }
6677
+
6678
+ if (matchContextualKeyword('from')) {
6679
+ throwError({}, Messages.UnexpectedToken, lookahead.value);
6680
+ }
6681
+
6682
+ // covers:
6683
+ // export default {};
6684
+ // export default [];
6685
+ if (match('{')) {
6686
+ declaration = parseObjectInitialiser();
6687
+ } else if (match('[')) {
6688
+ declaration = parseArrayInitialiser();
6689
+ } else {
6690
+ declaration = parseAssignmentExpression();
6691
+ }
6692
+ consumeSemicolon();
6693
+ return markerApply(marker, delegate.createExportDeclaration(true, declaration, [], null));
6694
+ }
6695
+
6696
+ // non-default export
5805
6697
  if (lookahead.type === Token.Keyword) {
6698
+ // covers:
6699
+ // export var f = 1;
5806
6700
  switch (lookahead.value) {
5807
6701
  case 'let':
5808
6702
  case 'const':
5809
6703
  case 'var':
5810
6704
  case 'class':
5811
6705
  case 'function':
5812
- return markerApply(marker, delegate.createExportDeclaration(parseSourceElement(), null, null));
6706
+ return markerApply(marker, delegate.createExportDeclaration(false, parseSourceElement(), specifiers, null));
5813
6707
  }
5814
6708
  }
5815
6709
 
5816
- if (isIdentifierName(lookahead)) {
5817
- previousAllowKeyword = state.allowKeyword;
5818
- state.allowKeyword = true;
5819
- decl = parseVariableDeclarationList('let');
5820
- state.allowKeyword = previousAllowKeyword;
5821
- return markerApply(marker, delegate.createExportDeclaration(decl, null, null));
6710
+ if (match('*')) {
6711
+ // covers:
6712
+ // export * from "foo";
6713
+ specifiers.push(parseExportBatchSpecifier());
6714
+
6715
+ if (!matchContextualKeyword('from')) {
6716
+ throwError({}, lookahead.value ?
6717
+ Messages.UnexpectedToken : Messages.MissingFromClause, lookahead.value);
6718
+ }
6719
+ lex();
6720
+ src = parseModuleSpecifier();
6721
+ consumeSemicolon();
6722
+
6723
+ return markerApply(marker, delegate.createExportDeclaration(false, null, specifiers, src));
5822
6724
  }
5823
6725
 
5824
- specifiers = [];
5825
- src = null;
6726
+ expect('{');
6727
+ do {
6728
+ isExportFromIdentifier = isExportFromIdentifier || matchKeyword('default');
6729
+ specifiers.push(parseExportSpecifier());
6730
+ } while (match(',') && lex());
6731
+ expect('}');
5826
6732
 
5827
- if (match('*')) {
5828
- specifiers.push(parseExportBatchSpecifier());
6733
+ if (matchContextualKeyword('from')) {
6734
+ // covering:
6735
+ // export {default} from "foo";
6736
+ // export {foo} from "foo";
6737
+ lex();
6738
+ src = parseModuleSpecifier();
6739
+ consumeSemicolon();
6740
+ } else if (isExportFromIdentifier) {
6741
+ // covering:
6742
+ // export {default}; // missing fromClause
6743
+ throwError({}, lookahead.value ?
6744
+ Messages.UnexpectedToken : Messages.MissingFromClause, lookahead.value);
5829
6745
  } else {
5830
- expect('{');
5831
- do {
5832
- specifiers.push(parseExportSpecifier());
5833
- } while (match(',') && lex());
5834
- expect('}');
6746
+ // cover
6747
+ // export {foo};
6748
+ consumeSemicolon();
5835
6749
  }
6750
+ return markerApply(marker, delegate.createExportDeclaration(false, declaration, specifiers, src));
6751
+ }
5836
6752
 
5837
- if (matchContextualKeyword('from')) {
6753
+
6754
+ function parseImportSpecifier() {
6755
+ // import {<foo as bar>} ...;
6756
+ var id, name = null, marker = markerCreate();
6757
+
6758
+ id = parseNonComputedProperty();
6759
+ if (matchContextualKeyword('as')) {
5838
6760
  lex();
5839
- src = parsePrimaryExpression();
5840
- if (src.type !== Syntax.Literal) {
5841
- throwError({}, Messages.InvalidModuleSpecifier);
5842
- }
6761
+ name = parseVariableIdentifier();
5843
6762
  }
5844
6763
 
5845
- consumeSemicolon();
6764
+ return markerApply(marker, delegate.createImportSpecifier(id, name));
6765
+ }
5846
6766
 
5847
- return markerApply(marker, delegate.createExportDeclaration(null, specifiers, src));
6767
+ function parseNamedImports() {
6768
+ var specifiers = [];
6769
+ // {foo, bar as bas}
6770
+ expect('{');
6771
+ do {
6772
+ specifiers.push(parseImportSpecifier());
6773
+ } while (match(',') && lex());
6774
+ expect('}');
6775
+ return specifiers;
6776
+ }
6777
+
6778
+ function parseImportDefaultSpecifier() {
6779
+ // import <foo> ...;
6780
+ var id, marker = markerCreate();
6781
+
6782
+ id = parseNonComputedProperty();
6783
+
6784
+ return markerApply(marker, delegate.createImportDefaultSpecifier(id));
6785
+ }
6786
+
6787
+ function parseImportNamespaceSpecifier() {
6788
+ // import <* as foo> ...;
6789
+ var id, marker = markerCreate();
6790
+
6791
+ expect('*');
6792
+ if (!matchContextualKeyword('as')) {
6793
+ throwError({}, Messages.NoAsAfterImportNamespace);
6794
+ }
6795
+ lex();
6796
+ id = parseNonComputedProperty();
6797
+
6798
+ return markerApply(marker, delegate.createImportNamespaceSpecifier(id));
5848
6799
  }
5849
6800
 
5850
6801
  function parseImportDeclaration() {
5851
- var specifiers, kind, src, marker = markerCreate();
6802
+ var specifiers, src, marker = markerCreate();
5852
6803
 
5853
6804
  expectKeyword('import');
5854
6805
  specifiers = [];
5855
6806
 
5856
- if (isIdentifierName(lookahead)) {
5857
- kind = 'default';
5858
- specifiers.push(parseImportSpecifier());
6807
+ if (lookahead.type === Token.StringLiteral) {
6808
+ // covers:
6809
+ // import "foo";
6810
+ src = parseModuleSpecifier();
6811
+ consumeSemicolon();
6812
+ return markerApply(marker, delegate.createImportDeclaration(specifiers, src));
6813
+ }
5859
6814
 
5860
- if (!matchContextualKeyword('from')) {
5861
- throwError({}, Messages.NoFromAfterImport);
6815
+ if (!matchKeyword('default') && isIdentifierName(lookahead)) {
6816
+ // covers:
6817
+ // import foo
6818
+ // import foo, ...
6819
+ specifiers.push(parseImportDefaultSpecifier());
6820
+ if (match(',')) {
6821
+ lex();
5862
6822
  }
5863
- lex();
6823
+ }
6824
+ if (match('*')) {
6825
+ // covers:
6826
+ // import foo, * as foo
6827
+ // import * as foo
6828
+ specifiers.push(parseImportNamespaceSpecifier());
5864
6829
  } else if (match('{')) {
5865
- kind = 'named';
5866
- lex();
5867
- do {
5868
- specifiers.push(parseImportSpecifier());
5869
- } while (match(',') && lex());
5870
- expect('}');
5871
-
5872
- if (!matchContextualKeyword('from')) {
5873
- throwError({}, Messages.NoFromAfterImport);
5874
- }
5875
- lex();
6830
+ // covers:
6831
+ // import foo, {bar}
6832
+ // import {bar}
6833
+ specifiers = specifiers.concat(parseNamedImports());
5876
6834
  }
5877
6835
 
5878
- src = parsePrimaryExpression();
5879
- if (src.type !== Syntax.Literal) {
5880
- throwError({}, Messages.InvalidModuleSpecifier);
6836
+ if (!matchContextualKeyword('from')) {
6837
+ throwError({}, lookahead.value ?
6838
+ Messages.UnexpectedToken : Messages.MissingFromClause, lookahead.value);
5881
6839
  }
5882
-
6840
+ lex();
6841
+ src = parseModuleSpecifier();
5883
6842
  consumeSemicolon();
5884
6843
 
5885
- return markerApply(marker, delegate.createImportDeclaration(specifiers, kind, src));
5886
- }
5887
-
5888
- function parseImportSpecifier() {
5889
- var id, name = null, marker = markerCreate();
5890
-
5891
- id = parseNonComputedProperty();
5892
- if (matchContextualKeyword('as')) {
5893
- lex();
5894
- name = parseVariableIdentifier();
5895
- }
5896
-
5897
- return markerApply(marker, delegate.createImportSpecifier(id, name));
6844
+ return markerApply(marker, delegate.createImportDeclaration(specifiers, src));
5898
6845
  }
5899
6846
 
5900
6847
  // 12.3 Empty Statement
@@ -6447,6 +7394,10 @@ parseYieldExpression: true
6447
7394
  }
6448
7395
  }
6449
7396
 
7397
+ if (matchAsyncFuncExprOrDecl()) {
7398
+ return parseFunctionDeclaration();
7399
+ }
7400
+
6450
7401
  marker = markerCreate();
6451
7402
  expr = parseExpression();
6452
7403
 
@@ -6572,7 +7523,7 @@ parseYieldExpression: true
6572
7523
  }
6573
7524
 
6574
7525
  function parseParam(options) {
6575
- var token, rest, param, def;
7526
+ var marker, token, rest, param, def;
6576
7527
 
6577
7528
  token = lookahead;
6578
7529
  if (token.value === '...') {
@@ -6581,19 +7532,31 @@ parseYieldExpression: true
6581
7532
  }
6582
7533
 
6583
7534
  if (match('[')) {
7535
+ marker = markerCreate();
6584
7536
  param = parseArrayInitialiser();
6585
7537
  reinterpretAsDestructuredParameter(options, param);
7538
+ if (match(':')) {
7539
+ param.typeAnnotation = parseTypeAnnotation();
7540
+ markerApply(marker, param);
7541
+ }
6586
7542
  } else if (match('{')) {
7543
+ marker = markerCreate();
6587
7544
  if (rest) {
6588
7545
  throwError({}, Messages.ObjectPatternAsRestParameter);
6589
7546
  }
6590
7547
  param = parseObjectInitialiser();
6591
7548
  reinterpretAsDestructuredParameter(options, param);
7549
+ if (match(':')) {
7550
+ param.typeAnnotation = parseTypeAnnotation();
7551
+ markerApply(marker, param);
7552
+ }
6592
7553
  } else {
6593
- // Typing rest params is awkward, so punting on that for now
6594
7554
  param =
6595
7555
  rest
6596
- ? parseVariableIdentifier()
7556
+ ? parseTypeAnnotatableIdentifier(
7557
+ false, /* requireTypeAnnotation */
7558
+ false /* canBeOptionalParam */
7559
+ )
6597
7560
  : parseTypeAnnotatableIdentifier(
6598
7561
  false, /* requireTypeAnnotation */
6599
7562
  true /* canBeOptionalParam */
@@ -6661,8 +7624,15 @@ parseYieldExpression: true
6661
7624
  }
6662
7625
 
6663
7626
  function parseFunctionDeclaration() {
6664
- var id, body, token, tmp, firstRestricted, message, previousStrict, previousYieldAllowed, generator,
6665
- marker = markerCreate(), parametricType;
7627
+ var id, body, token, tmp, firstRestricted, message, generator, isAsync,
7628
+ previousStrict, previousYieldAllowed, previousAwaitAllowed,
7629
+ marker = markerCreate(), typeParameters;
7630
+
7631
+ isAsync = false;
7632
+ if (matchAsync()) {
7633
+ lex();
7634
+ isAsync = true;
7635
+ }
6666
7636
 
6667
7637
  expectKeyword('function');
6668
7638
 
@@ -6677,7 +7647,7 @@ parseYieldExpression: true
6677
7647
  id = parseVariableIdentifier();
6678
7648
 
6679
7649
  if (match('<')) {
6680
- parametricType = parseParametricTypeAnnotation();
7650
+ typeParameters = parseTypeParameterDeclaration();
6681
7651
  }
6682
7652
 
6683
7653
  if (strict) {
@@ -6703,6 +7673,8 @@ parseYieldExpression: true
6703
7673
  previousStrict = strict;
6704
7674
  previousYieldAllowed = state.yieldAllowed;
6705
7675
  state.yieldAllowed = generator;
7676
+ previousAwaitAllowed = state.awaitAllowed;
7677
+ state.awaitAllowed = isAsync;
6706
7678
 
6707
7679
  body = parseFunctionSourceElements();
6708
7680
 
@@ -6714,14 +7686,35 @@ parseYieldExpression: true
6714
7686
  }
6715
7687
  strict = previousStrict;
6716
7688
  state.yieldAllowed = previousYieldAllowed;
7689
+ state.awaitAllowed = previousAwaitAllowed;
6717
7690
 
6718
- return markerApply(marker, delegate.createFunctionDeclaration(id, tmp.params, tmp.defaults, body, tmp.rest, generator, false,
6719
- tmp.returnType, parametricType));
7691
+ return markerApply(
7692
+ marker,
7693
+ delegate.createFunctionDeclaration(
7694
+ id,
7695
+ tmp.params,
7696
+ tmp.defaults,
7697
+ body,
7698
+ tmp.rest,
7699
+ generator,
7700
+ false,
7701
+ isAsync,
7702
+ tmp.returnType,
7703
+ typeParameters
7704
+ )
7705
+ );
6720
7706
  }
6721
7707
 
6722
7708
  function parseFunctionExpression() {
6723
- var token, id = null, firstRestricted, message, tmp, body, previousStrict, previousYieldAllowed, generator,
6724
- marker = markerCreate(), parametricType;
7709
+ var token, id = null, firstRestricted, message, tmp, body, generator, isAsync,
7710
+ previousStrict, previousYieldAllowed, previousAwaitAllowed,
7711
+ marker = markerCreate(), typeParameters;
7712
+
7713
+ isAsync = false;
7714
+ if (matchAsync()) {
7715
+ lex();
7716
+ isAsync = true;
7717
+ }
6725
7718
 
6726
7719
  expectKeyword('function');
6727
7720
 
@@ -6753,7 +7746,7 @@ parseYieldExpression: true
6753
7746
  }
6754
7747
 
6755
7748
  if (match('<')) {
6756
- parametricType = parseParametricTypeAnnotation();
7749
+ typeParameters = parseTypeParameterDeclaration();
6757
7750
  }
6758
7751
  }
6759
7752
 
@@ -6766,6 +7759,8 @@ parseYieldExpression: true
6766
7759
  previousStrict = strict;
6767
7760
  previousYieldAllowed = state.yieldAllowed;
6768
7761
  state.yieldAllowed = generator;
7762
+ previousAwaitAllowed = state.awaitAllowed;
7763
+ state.awaitAllowed = isAsync;
6769
7764
 
6770
7765
  body = parseFunctionSourceElements();
6771
7766
 
@@ -6777,20 +7772,29 @@ parseYieldExpression: true
6777
7772
  }
6778
7773
  strict = previousStrict;
6779
7774
  state.yieldAllowed = previousYieldAllowed;
7775
+ state.awaitAllowed = previousAwaitAllowed;
6780
7776
 
6781
- return markerApply(marker, delegate.createFunctionExpression(id, tmp.params, tmp.defaults, body, tmp.rest, generator, false,
6782
- tmp.returnType, parametricType));
7777
+ return markerApply(
7778
+ marker,
7779
+ delegate.createFunctionExpression(
7780
+ id,
7781
+ tmp.params,
7782
+ tmp.defaults,
7783
+ body,
7784
+ tmp.rest,
7785
+ generator,
7786
+ false,
7787
+ isAsync,
7788
+ tmp.returnType,
7789
+ typeParameters
7790
+ )
7791
+ );
6783
7792
  }
6784
7793
 
6785
7794
  function parseYieldExpression() {
6786
- var yieldToken, delegateFlag, expr, marker = markerCreate();
6787
-
6788
- yieldToken = lex();
6789
- assert(yieldToken.value === 'yield', 'Called parseYieldExpression with non-yield lookahead.');
7795
+ var delegateFlag, expr, marker = markerCreate();
6790
7796
 
6791
- if (!state.yieldAllowed) {
6792
- throwErrorTolerant({}, Messages.IllegalYield);
6793
- }
7797
+ expectKeyword('yield', !strict);
6794
7798
 
6795
7799
  delegateFlag = false;
6796
7800
  if (match('*')) {
@@ -6803,35 +7807,34 @@ parseYieldExpression: true
6803
7807
  return markerApply(marker, delegate.createYieldExpression(expr, delegateFlag));
6804
7808
  }
6805
7809
 
7810
+ function parseAwaitExpression() {
7811
+ var expr, marker = markerCreate();
7812
+ expectContextualKeyword('await');
7813
+ expr = parseAssignmentExpression();
7814
+ return markerApply(marker, delegate.createAwaitExpression(expr));
7815
+ }
7816
+
6806
7817
  // 14 Classes
6807
7818
 
6808
- function parseMethodDefinition(existingPropNames) {
6809
- var token, key, param, propType, isValidDuplicateProp = false,
6810
- marker = markerCreate(), token2, parametricType,
6811
- parametricTypeMarker, annotationMarker;
7819
+ function parseMethodDefinition(existingPropNames, key, isStatic, generator, computed) {
7820
+ var token, param, propType, isValidDuplicateProp = false,
7821
+ isAsync, typeParameters, tokenValue, returnType,
7822
+ annotationMarker;
6812
7823
 
6813
- if (lookahead.value === 'static') {
6814
- propType = ClassPropertyType["static"];
6815
- lex();
6816
- } else {
6817
- propType = ClassPropertyType.prototype;
6818
- }
7824
+ propType = isStatic ? ClassPropertyType["static"] : ClassPropertyType.prototype;
6819
7825
 
6820
- if (match('*')) {
6821
- lex();
6822
- return markerApply(marker, delegate.createMethodDefinition(
7826
+ if (generator) {
7827
+ return delegate.createMethodDefinition(
6823
7828
  propType,
6824
7829
  '',
6825
- parseObjectPropertyKey(),
7830
+ key,
6826
7831
  parsePropertyMethodFunction({ generator: true })
6827
- ));
7832
+ );
6828
7833
  }
6829
7834
 
6830
- token = lookahead;
6831
- //parametricTypeMarker = markerCreate();
6832
- key = parseObjectPropertyKey();
7835
+ tokenValue = key.type === 'Identifier' && key.name;
6833
7836
 
6834
- if (token.value === 'get' && !match('(')) {
7837
+ if (tokenValue === 'get' && !match('(')) {
6835
7838
  key = parseObjectPropertyKey();
6836
7839
 
6837
7840
  // It is a syntax error if any other properties have a name
@@ -6854,14 +7857,17 @@ parseYieldExpression: true
6854
7857
 
6855
7858
  expect('(');
6856
7859
  expect(')');
6857
- return markerApply(marker, delegate.createMethodDefinition(
7860
+ if (match(':')) {
7861
+ returnType = parseTypeAnnotation();
7862
+ }
7863
+ return delegate.createMethodDefinition(
6858
7864
  propType,
6859
7865
  'get',
6860
7866
  key,
6861
- parsePropertyFunction({ generator: false })
6862
- ));
7867
+ parsePropertyFunction({ generator: false, returnType: returnType })
7868
+ );
6863
7869
  }
6864
- if (token.value === 'set' && !match('(')) {
7870
+ if (tokenValue === 'set' && !match('(')) {
6865
7871
  key = parseObjectPropertyKey();
6866
7872
 
6867
7873
  // It is a syntax error if any other properties have a name
@@ -6886,16 +7892,29 @@ parseYieldExpression: true
6886
7892
  token = lookahead;
6887
7893
  param = [ parseTypeAnnotatableIdentifier() ];
6888
7894
  expect(')');
6889
- return markerApply(marker, delegate.createMethodDefinition(
7895
+ if (match(':')) {
7896
+ returnType = parseTypeAnnotation();
7897
+ }
7898
+ return delegate.createMethodDefinition(
6890
7899
  propType,
6891
7900
  'set',
6892
7901
  key,
6893
- parsePropertyFunction({ params: param, generator: false, name: token })
6894
- ));
7902
+ parsePropertyFunction({
7903
+ params: param,
7904
+ generator: false,
7905
+ name: token,
7906
+ returnType: returnType
7907
+ })
7908
+ );
6895
7909
  }
6896
7910
 
6897
7911
  if (match('<')) {
6898
- parametricType = parseParametricTypeAnnotation();
7912
+ typeParameters = parseTypeParameterDeclaration();
7913
+ }
7914
+
7915
+ isAsync = tokenValue === 'async' && !match('(');
7916
+ if (isAsync) {
7917
+ key = parseObjectPropertyKey();
6899
7918
  }
6900
7919
 
6901
7920
  // It is a syntax error if any other properties have the same name as a
@@ -6907,42 +7926,64 @@ parseYieldExpression: true
6907
7926
  }
6908
7927
  existingPropNames[propType][key.name].data = true;
6909
7928
 
6910
- return markerApply(marker, delegate.createMethodDefinition(
7929
+ return delegate.createMethodDefinition(
6911
7930
  propType,
6912
7931
  '',
6913
7932
  key,
6914
7933
  parsePropertyMethodFunction({
6915
7934
  generator: false,
6916
- parametricType: parametricType
7935
+ async: isAsync,
7936
+ typeParameters: typeParameters
6917
7937
  })
6918
- ));
7938
+ );
6919
7939
  }
6920
7940
 
6921
- function parseClassProperty(existingPropNames) {
6922
- var marker = markerCreate(), propertyIdentifier;
7941
+ function parseClassProperty(existingPropNames, key, computed, isStatic) {
7942
+ var typeAnnotation;
6923
7943
 
6924
- propertyIdentifier = parseTypeAnnotatableIdentifier();
7944
+ typeAnnotation = parseTypeAnnotation();
6925
7945
  expect(';');
6926
7946
 
6927
- return markerApply(marker, delegate.createClassProperty(
6928
- propertyIdentifier
6929
- ));
7947
+ return delegate.createClassProperty(
7948
+ key,
7949
+ typeAnnotation,
7950
+ computed,
7951
+ isStatic
7952
+ );
6930
7953
  }
6931
7954
 
6932
7955
  function parseClassElement(existingProps) {
7956
+ var computed, generator = false, key, marker = markerCreate(),
7957
+ isStatic = false;
6933
7958
  if (match(';')) {
6934
7959
  lex();
6935
7960
  return;
6936
7961
  }
6937
7962
 
6938
- var doubleLookahead = lookahead2();
6939
- if (doubleLookahead.type === Token.Punctuator) {
6940
- if (doubleLookahead.value === ':') {
6941
- return parseClassProperty(existingProps);
6942
- }
7963
+ if (lookahead.value === 'static') {
7964
+ lex();
7965
+ isStatic = true;
6943
7966
  }
6944
7967
 
6945
- return parseMethodDefinition(existingProps);
7968
+ if (match('*')) {
7969
+ lex();
7970
+ generator = true;
7971
+ }
7972
+
7973
+ computed = (lookahead.value === '[');
7974
+ key = parseObjectPropertyKey();
7975
+
7976
+ if (!generator && lookahead.value === ':') {
7977
+ return markerApply(marker, parseClassProperty(existingProps, key, computed, isStatic));
7978
+ }
7979
+
7980
+ return markerApply(marker, parseMethodDefinition(
7981
+ existingProps,
7982
+ key,
7983
+ isStatic,
7984
+ generator,
7985
+ computed
7986
+ ));
6946
7987
  }
6947
7988
 
6948
7989
  function parseClassBody() {
@@ -6969,66 +8010,109 @@ parseYieldExpression: true
6969
8010
  return markerApply(marker, delegate.createClassBody(classElements));
6970
8011
  }
6971
8012
 
8013
+ function parseClassImplements() {
8014
+ var id, implemented = [], marker, typeParameters;
8015
+ expectContextualKeyword('implements');
8016
+ while (index < length) {
8017
+ marker = markerCreate();
8018
+ id = parseVariableIdentifier();
8019
+ if (match('<')) {
8020
+ typeParameters = parseTypeParameterInstantiation();
8021
+ } else {
8022
+ typeParameters = null;
8023
+ }
8024
+ implemented.push(markerApply(marker, delegate.createClassImplements(
8025
+ id,
8026
+ typeParameters
8027
+ )));
8028
+ if (!match(',')) {
8029
+ break;
8030
+ }
8031
+ expect(',');
8032
+ }
8033
+ return implemented;
8034
+ }
8035
+
6972
8036
  function parseClassExpression() {
6973
- var id, previousYieldAllowed, superClass = null, marker = markerCreate(),
6974
- parametricType;
8037
+ var id, implemented, previousYieldAllowed, superClass = null,
8038
+ superTypeParameters, marker = markerCreate(), typeParameters;
6975
8039
 
6976
8040
  expectKeyword('class');
6977
8041
 
6978
- if (!matchKeyword('extends') && !match('{')) {
8042
+ if (!matchKeyword('extends') && !matchContextualKeyword('implements') && !match('{')) {
6979
8043
  id = parseVariableIdentifier();
6980
8044
  }
6981
8045
 
6982
8046
  if (match('<')) {
6983
- parametricType = parseParametricTypeAnnotation();
8047
+ typeParameters = parseTypeParameterDeclaration();
6984
8048
  }
6985
8049
 
6986
8050
  if (matchKeyword('extends')) {
6987
8051
  expectKeyword('extends');
6988
8052
  previousYieldAllowed = state.yieldAllowed;
6989
8053
  state.yieldAllowed = false;
6990
- superClass = parseAssignmentExpression();
8054
+ superClass = parseLeftHandSideExpressionAllowCall();
8055
+ if (match('<')) {
8056
+ superTypeParameters = parseTypeParameterInstantiation();
8057
+ }
6991
8058
  state.yieldAllowed = previousYieldAllowed;
6992
8059
  }
6993
8060
 
6994
- return markerApply(marker, delegate.createClassExpression(id, superClass, parseClassBody(), parametricType));
8061
+ if (matchContextualKeyword('implements')) {
8062
+ implemented = parseClassImplements();
8063
+ }
8064
+
8065
+ return markerApply(marker, delegate.createClassExpression(
8066
+ id,
8067
+ superClass,
8068
+ parseClassBody(),
8069
+ typeParameters,
8070
+ superTypeParameters,
8071
+ implemented
8072
+ ));
6995
8073
  }
6996
8074
 
6997
8075
  function parseClassDeclaration() {
6998
- var id, previousYieldAllowed, superClass = null, marker = markerCreate(),
6999
- parametricType, superParametricType;
8076
+ var id, implemented, previousYieldAllowed, superClass = null,
8077
+ superTypeParameters, marker = markerCreate(), typeParameters;
7000
8078
 
7001
8079
  expectKeyword('class');
7002
8080
 
7003
8081
  id = parseVariableIdentifier();
7004
8082
 
7005
8083
  if (match('<')) {
7006
- parametricType = parseParametricTypeAnnotation();
8084
+ typeParameters = parseTypeParameterDeclaration();
7007
8085
  }
7008
8086
 
7009
8087
  if (matchKeyword('extends')) {
7010
8088
  expectKeyword('extends');
7011
8089
  previousYieldAllowed = state.yieldAllowed;
7012
8090
  state.yieldAllowed = false;
7013
- superClass = parseAssignmentExpression();
8091
+ superClass = parseLeftHandSideExpressionAllowCall();
8092
+ if (match('<')) {
8093
+ superTypeParameters = parseTypeParameterInstantiation();
8094
+ }
7014
8095
  state.yieldAllowed = previousYieldAllowed;
7015
8096
  }
7016
8097
 
7017
- return markerApply(marker, delegate.createClassDeclaration(id, superClass, parseClassBody(), parametricType, superParametricType));
8098
+ if (matchContextualKeyword('implements')) {
8099
+ implemented = parseClassImplements();
8100
+ }
8101
+
8102
+ return markerApply(marker, delegate.createClassDeclaration(
8103
+ id,
8104
+ superClass,
8105
+ parseClassBody(),
8106
+ typeParameters,
8107
+ superTypeParameters,
8108
+ implemented
8109
+ ));
7018
8110
  }
7019
8111
 
7020
8112
  // 15 Program
7021
8113
 
7022
- function matchModuleDeclaration() {
7023
- var id;
7024
- if (matchContextualKeyword('module')) {
7025
- id = lookahead2();
7026
- return id.type === Token.StringLiteral || id.type === Token.Identifier;
7027
- }
7028
- return false;
7029
- }
7030
-
7031
8114
  function parseSourceElement() {
8115
+ var token;
7032
8116
  if (lookahead.type === Token.Keyword) {
7033
8117
  switch (lookahead.value) {
7034
8118
  case 'const':
@@ -7036,17 +8120,36 @@ parseYieldExpression: true
7036
8120
  return parseConstLetDeclaration(lookahead.value);
7037
8121
  case 'function':
7038
8122
  return parseFunctionDeclaration();
7039
- case 'export':
7040
- return parseExportDeclaration();
7041
- case 'import':
7042
- return parseImportDeclaration();
7043
8123
  default:
7044
8124
  return parseStatement();
7045
8125
  }
7046
8126
  }
7047
8127
 
7048
- if (matchModuleDeclaration()) {
7049
- throwError({}, Messages.NestedModule);
8128
+ if (matchContextualKeyword('type')
8129
+ && lookahead2().type === Token.Identifier) {
8130
+ return parseTypeAlias();
8131
+ }
8132
+
8133
+ if (matchContextualKeyword('interface')
8134
+ && lookahead2().type === Token.Identifier) {
8135
+ return parseInterface();
8136
+ }
8137
+
8138
+ if (matchContextualKeyword('declare')) {
8139
+ token = lookahead2();
8140
+ if (token.type === Token.Keyword) {
8141
+ switch (token.value) {
8142
+ case 'class':
8143
+ return parseDeclareClass();
8144
+ case 'function':
8145
+ return parseDeclareFunction();
8146
+ case 'var':
8147
+ return parseDeclareVariable();
8148
+ }
8149
+ } else if (token.type === Token.Identifier
8150
+ && token.value === 'module') {
8151
+ return parseDeclareModule();
8152
+ }
7050
8153
  }
7051
8154
 
7052
8155
  if (lookahead.type !== Token.EOF) {
@@ -7064,10 +8167,6 @@ parseYieldExpression: true
7064
8167
  }
7065
8168
  }
7066
8169
 
7067
- if (matchModuleDeclaration()) {
7068
- return parseModuleDeclaration();
7069
- }
7070
-
7071
8170
  return parseSourceElement();
7072
8171
  }
7073
8172
 
@@ -7109,40 +8208,6 @@ parseYieldExpression: true
7109
8208
  return sourceElements;
7110
8209
  }
7111
8210
 
7112
- function parseModuleElement() {
7113
- return parseSourceElement();
7114
- }
7115
-
7116
- function parseModuleElements() {
7117
- var list = [],
7118
- statement;
7119
-
7120
- while (index < length) {
7121
- if (match('}')) {
7122
- break;
7123
- }
7124
- statement = parseModuleElement();
7125
- if (typeof statement === 'undefined') {
7126
- break;
7127
- }
7128
- list.push(statement);
7129
- }
7130
-
7131
- return list;
7132
- }
7133
-
7134
- function parseModuleBlock() {
7135
- var block, marker = markerCreate();
7136
-
7137
- expect('{');
7138
-
7139
- block = parseModuleElements();
7140
-
7141
- expect('}');
7142
-
7143
- return markerApply(marker, delegate.createBlockStatement(block));
7144
- }
7145
-
7146
8211
  function parseProgram() {
7147
8212
  var body, marker = markerCreate();
7148
8213
  strict = false;
@@ -7613,7 +8678,7 @@ parseYieldExpression: true
7613
8678
  }
7614
8679
 
7615
8680
  function scanXJSEntity() {
7616
- var ch, str = '', count = 0, entity;
8681
+ var ch, str = '', start = index, count = 0, code;
7617
8682
  ch = source[index];
7618
8683
  assert(ch === '&', 'Entity must start with an ampersand');
7619
8684
  index++;
@@ -7625,14 +8690,28 @@ parseYieldExpression: true
7625
8690
  str += ch;
7626
8691
  }
7627
8692
 
7628
- if (str[0] === '#' && str[1] === 'x') {
7629
- entity = String.fromCharCode(parseInt(str.substr(2), 16));
7630
- } else if (str[0] === '#') {
7631
- entity = String.fromCharCode(parseInt(str.substr(1), 10));
7632
- } else {
7633
- entity = XHTMLEntities[str];
8693
+ // Well-formed entity (ending was found).
8694
+ if (ch === ';') {
8695
+ // Numeric entity.
8696
+ if (str[0] === '#') {
8697
+ if (str[1] === 'x') {
8698
+ code = +('0' + str.substr(1));
8699
+ } else {
8700
+ // Removing leading zeros in order to avoid treating as octal in old browsers.
8701
+ code = +str.substr(1).replace(Regex.LeadingZeros, '');
8702
+ }
8703
+
8704
+ if (!isNaN(code)) {
8705
+ return String.fromCharCode(code);
8706
+ }
8707
+ } else if (XHTMLEntities[str]) {
8708
+ return XHTMLEntities[str];
8709
+ }
7634
8710
  }
7635
- return entity;
8711
+
8712
+ // Treat non-entity sequences as regular text.
8713
+ index = start + 1;
8714
+ return '&';
7636
8715
  }
7637
8716
 
7638
8717
  function scanXJSText(stopChars) {
@@ -7959,8 +9038,181 @@ parseYieldExpression: true
7959
9038
  return markerApply(marker, delegate.createXJSElement(openingElement, closingElement, children));
7960
9039
  }
7961
9040
 
9041
+ function parseTypeAlias() {
9042
+ var id, marker = markerCreate(), typeParameters = null, right;
9043
+ expectContextualKeyword('type');
9044
+ id = parseVariableIdentifier();
9045
+ if (match('<')) {
9046
+ typeParameters = parseTypeParameterDeclaration();
9047
+ }
9048
+ expect('=');
9049
+ right = parseType();
9050
+ consumeSemicolon();
9051
+ return markerApply(marker, delegate.createTypeAlias(id, typeParameters, right));
9052
+ }
9053
+
9054
+ function parseInterfaceExtends() {
9055
+ var marker = markerCreate(), id, typeParameters = null;
9056
+
9057
+ id = parseVariableIdentifier();
9058
+ if (match('<')) {
9059
+ typeParameters = parseTypeParameterInstantiation();
9060
+ }
9061
+
9062
+ return markerApply(marker, delegate.createInterfaceExtends(
9063
+ id,
9064
+ typeParameters
9065
+ ));
9066
+ }
9067
+
9068
+ function parseInterfaceish(marker, allowStatic) {
9069
+ var body, bodyMarker, extended = [], id,
9070
+ typeParameters = null;
9071
+
9072
+ id = parseVariableIdentifier();
9073
+ if (match('<')) {
9074
+ typeParameters = parseTypeParameterDeclaration();
9075
+ }
9076
+
9077
+ if (matchKeyword('extends')) {
9078
+ expectKeyword('extends');
9079
+
9080
+ while (index < length) {
9081
+ extended.push(parseInterfaceExtends());
9082
+ if (!match(',')) {
9083
+ break;
9084
+ }
9085
+ expect(',');
9086
+ }
9087
+ }
9088
+
9089
+ bodyMarker = markerCreate();
9090
+ body = markerApply(bodyMarker, parseObjectType(allowStatic));
9091
+
9092
+ return markerApply(marker, delegate.createInterface(
9093
+ id,
9094
+ typeParameters,
9095
+ body,
9096
+ extended
9097
+ ));
9098
+ }
9099
+
9100
+ function parseInterface() {
9101
+ var body, bodyMarker, extended = [], id, marker = markerCreate(),
9102
+ typeParameters = null;
9103
+
9104
+ expectContextualKeyword('interface');
9105
+ return parseInterfaceish(marker, /* allowStatic */false);
9106
+ }
9107
+
9108
+ function parseDeclareClass() {
9109
+ var marker = markerCreate(), ret;
9110
+ expectContextualKeyword('declare');
9111
+ expectKeyword('class');
9112
+
9113
+ ret = parseInterfaceish(marker, /* allowStatic */true);
9114
+ ret.type = Syntax.DeclareClass;
9115
+ return ret;
9116
+ }
9117
+
9118
+ function parseDeclareFunction() {
9119
+ var id, idMarker,
9120
+ marker = markerCreate(), params, returnType, rest, tmp,
9121
+ typeParameters = null, value, valueMarker;
9122
+
9123
+ expectContextualKeyword('declare');
9124
+ expectKeyword('function');
9125
+ idMarker = markerCreate();
9126
+ id = parseVariableIdentifier();
9127
+
9128
+ valueMarker = markerCreate();
9129
+ if (match('<')) {
9130
+ typeParameters = parseTypeParameterDeclaration();
9131
+ }
9132
+ expect('(');
9133
+ tmp = parseFunctionTypeParams();
9134
+ params = tmp.params;
9135
+ rest = tmp.rest;
9136
+ expect(')');
9137
+
9138
+ expect(':');
9139
+ returnType = parseType();
9140
+
9141
+ value = markerApply(valueMarker, delegate.createFunctionTypeAnnotation(
9142
+ params,
9143
+ returnType,
9144
+ rest,
9145
+ typeParameters
9146
+ ));
9147
+
9148
+ id.typeAnnotation = markerApply(valueMarker, delegate.createTypeAnnotation(
9149
+ value
9150
+ ));
9151
+ markerApply(idMarker, id);
9152
+
9153
+ consumeSemicolon();
9154
+
9155
+ return markerApply(marker, delegate.createDeclareFunction(
9156
+ id
9157
+ ));
9158
+ }
9159
+
9160
+ function parseDeclareVariable() {
9161
+ var id, marker = markerCreate();
9162
+ expectContextualKeyword('declare');
9163
+ expectKeyword('var');
9164
+ id = parseTypeAnnotatableIdentifier();
9165
+
9166
+ consumeSemicolon();
9167
+
9168
+ return markerApply(marker, delegate.createDeclareVariable(
9169
+ id
9170
+ ));
9171
+ }
9172
+
9173
+ function parseDeclareModule() {
9174
+ var body = [], bodyMarker, id, idMarker, marker = markerCreate(), token;
9175
+ expectContextualKeyword('declare');
9176
+ expectContextualKeyword('module');
9177
+
9178
+ if (lookahead.type === Token.StringLiteral) {
9179
+ if (strict && lookahead.octal) {
9180
+ throwErrorTolerant(lookahead, Messages.StrictOctalLiteral);
9181
+ }
9182
+ idMarker = markerCreate();
9183
+ id = markerApply(idMarker, delegate.createLiteral(lex()));
9184
+ } else {
9185
+ id = parseVariableIdentifier();
9186
+ }
9187
+
9188
+ bodyMarker = markerCreate();
9189
+ expect('{');
9190
+ while (index < length && !match('}')) {
9191
+ token = lookahead2();
9192
+ switch (token.value) {
9193
+ case 'class':
9194
+ body.push(parseDeclareClass());
9195
+ break;
9196
+ case 'function':
9197
+ body.push(parseDeclareFunction());
9198
+ break;
9199
+ case 'var':
9200
+ body.push(parseDeclareVariable());
9201
+ break;
9202
+ default:
9203
+ throwUnexpected(lookahead);
9204
+ }
9205
+ }
9206
+ expect('}');
9207
+
9208
+ return markerApply(marker, delegate.createDeclareModule(
9209
+ id,
9210
+ markerApply(bodyMarker, delegate.createBlockStatement(body))
9211
+ ));
9212
+ }
9213
+
7962
9214
  function collectToken() {
7963
- var start, loc, token, range, value;
9215
+ var start, loc, token, range, value, entry;
7964
9216
 
7965
9217
  if (!state.inXJSChild) {
7966
9218
  skipComment();
@@ -7983,12 +9235,19 @@ parseYieldExpression: true
7983
9235
  if (token.type !== Token.EOF) {
7984
9236
  range = [token.range[0], token.range[1]];
7985
9237
  value = source.slice(token.range[0], token.range[1]);
7986
- extra.tokens.push({
9238
+ entry = {
7987
9239
  type: TokenName[token.type],
7988
9240
  value: value,
7989
9241
  range: range,
7990
9242
  loc: loc
7991
- });
9243
+ };
9244
+ if (token.regex) {
9245
+ entry.regex = {
9246
+ pattern: token.regex.pattern,
9247
+ flags: token.regex.flags
9248
+ };
9249
+ }
9250
+ extra.tokens.push(entry);
7992
9251
  }
7993
9252
 
7994
9253
  return token;
@@ -8027,6 +9286,7 @@ parseYieldExpression: true
8027
9286
  extra.tokens.push({
8028
9287
  type: 'RegularExpression',
8029
9288
  value: regex.literal,
9289
+ regex: regex.regex,
8030
9290
  range: [pos, index],
8031
9291
  loc: loc
8032
9292
  });
@@ -8044,6 +9304,12 @@ parseYieldExpression: true
8044
9304
  type: entry.type,
8045
9305
  value: entry.value
8046
9306
  };
9307
+ if (entry.regex) {
9308
+ token.regex = {
9309
+ pattern: entry.regex.pattern,
9310
+ flags: entry.regex.flags
9311
+ };
9312
+ }
8047
9313
  if (extra.range) {
8048
9314
  token.range = entry.range;
8049
9315
  }
@@ -8230,8 +9496,10 @@ parseYieldExpression: true
8230
9496
  inSwitch: false,
8231
9497
  inXJSChild: false,
8232
9498
  inXJSTag: false,
9499
+ inType: false,
8233
9500
  lastCommentStart: -1,
8234
- yieldAllowed: false
9501
+ yieldAllowed: false,
9502
+ awaitAllowed: false
8235
9503
  };
8236
9504
 
8237
9505
  extra = {};
@@ -8302,7 +9570,7 @@ parseYieldExpression: true
8302
9570
  }
8303
9571
 
8304
9572
  // Sync with *.json manifests.
8305
- exports.version = '6001.0001.0000-dev-harmony-fb';
9573
+ exports.version = '8001.1001.0-dev-harmony-fb';
8306
9574
 
8307
9575
  exports.tokenize = tokenize;
8308
9576
 
@@ -8332,34 +9600,6 @@ parseYieldExpression: true
8332
9600
  }));
8333
9601
  /* vim: set sw=4 ts=4 et tw=80 : */
8334
9602
 
8335
- },{}],9:[function(_dereq_,module,exports){
8336
- var Base62 = (function (my) {
8337
- my.chars = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
8338
-
8339
- my.encode = function(i){
8340
- if (i === 0) {return '0'}
8341
- var s = ''
8342
- while (i > 0) {
8343
- s = this.chars[i % 62] + s
8344
- i = Math.floor(i/62)
8345
- }
8346
- return s
8347
- };
8348
- my.decode = function(a,b,c,d){
8349
- for (
8350
- b = c = (
8351
- a === (/\W|_|^$/.test(a += "") || a)
8352
- ) - 1;
8353
- d = a.charCodeAt(c++);
8354
- )
8355
- b = b * 62 + d - [, 48, 29, 87][d >> 5];
8356
- return b
8357
- };
8358
-
8359
- return my;
8360
- }({}));
8361
-
8362
- module.exports = Base62
8363
9603
  },{}],10:[function(_dereq_,module,exports){
8364
9604
  /*
8365
9605
  * Copyright 2009-2011 Mozilla Foundation and contributors
@@ -10632,7 +11872,6 @@ function _nodeIsBlockScopeBoundary(node, parentNode) {
10632
11872
 
10633
11873
  /**
10634
11874
  * @param {object} node
10635
- * @param {function} visitor
10636
11875
  * @param {array} path
10637
11876
  * @param {object} state
10638
11877
  */
@@ -10830,7 +12069,7 @@ function transform(visitors, source, options) {
10830
12069
  exports.transform = transform;
10831
12070
  exports.Syntax = Syntax;
10832
12071
 
10833
- },{"./utils":22,"esprima-fb":8,"source-map":10}],22:[function(_dereq_,module,exports){
12072
+ },{"./utils":22,"esprima-fb":9,"source-map":10}],22:[function(_dereq_,module,exports){
10834
12073
  /**
10835
12074
  * Copyright 2013 Facebook, Inc.
10836
12075
  *
@@ -11281,8 +12520,8 @@ function initScopeMetadata(boundaryNode, path, node) {
11281
12520
  function declareIdentInLocalScope(identName, metaData, state) {
11282
12521
  state.localScope.identifiers[identName] = {
11283
12522
  boundaryNode: metaData.boundaryNode,
11284
- path: metaData.path,
11285
- node: metaData.node,
12523
+ path: metaData.bindingPath,
12524
+ node: metaData.bindingNode,
11286
12525
  state: Object.create(state)
11287
12526
  };
11288
12527
  }
@@ -11299,7 +12538,6 @@ function getLexicalBindingMetadata(identName, state) {
11299
12538
  * @param {function} analyzer
11300
12539
  * @param {function} traverser
11301
12540
  * @param {object} node
11302
- * @param {function} visitor
11303
12541
  * @param {array} path
11304
12542
  * @param {object} state
11305
12543
  */
@@ -11376,16 +12614,22 @@ function enqueueNodeWithStartIndex(queue, node) {
11376
12614
  * @param {string} type - node type to lookup.
11377
12615
  */
11378
12616
  function containsChildOfType(node, type) {
12617
+ return containsChildMatching(node, function(node) {
12618
+ return node.type === type;
12619
+ });
12620
+ }
12621
+
12622
+ function containsChildMatching(node, matcher) {
11379
12623
  var foundMatchingChild = false;
11380
12624
  function nodeTypeAnalyzer(node) {
11381
- if (node.type === type) {
12625
+ if (matcher(node) === true) {
11382
12626
  foundMatchingChild = true;
11383
12627
  return false;
11384
12628
  }
11385
12629
  }
11386
12630
  function nodeTypeTraverser(child, path, state) {
11387
12631
  if (!foundMatchingChild) {
11388
- foundMatchingChild = containsChildOfType(child, type);
12632
+ foundMatchingChild = containsChildMatching(child, matcher);
11389
12633
  }
11390
12634
  }
11391
12635
  analyzeAndTraverse(
@@ -11414,11 +12658,20 @@ function getBoundaryNode(path) {
11414
12658
  );
11415
12659
  }
11416
12660
 
12661
+ function getTempVar(tempVarIndex) {
12662
+ return '$__' + tempVarIndex;
12663
+ }
12664
+
12665
+ function getTempVarWithValue(tempVarIndex, tempVarValue) {
12666
+ return getTempVar(tempVarIndex) + '=' + tempVarValue;
12667
+ }
12668
+
11417
12669
  exports.append = append;
11418
12670
  exports.catchup = catchup;
11419
12671
  exports.catchupWhiteOut = catchupWhiteOut;
11420
12672
  exports.catchupWhiteSpace = catchupWhiteSpace;
11421
12673
  exports.catchupNewlines = catchupNewlines;
12674
+ exports.containsChildMatching = containsChildMatching;
11422
12675
  exports.containsChildOfType = containsChildOfType;
11423
12676
  exports.createState = createState;
11424
12677
  exports.declareIdentInLocalScope = declareIdentInLocalScope;
@@ -11436,8 +12689,10 @@ exports.updateState = updateState;
11436
12689
  exports.analyzeAndTraverse = analyzeAndTraverse;
11437
12690
  exports.getOrderedChildren = getOrderedChildren;
11438
12691
  exports.getNodeSourceText = getNodeSourceText;
12692
+ exports.getTempVar = getTempVar;
12693
+ exports.getTempVarWithValue = getTempVarWithValue;
11439
12694
 
11440
- },{"./docblock":20,"esprima-fb":8}],23:[function(_dereq_,module,exports){
12695
+ },{"./docblock":20,"esprima-fb":9}],23:[function(_dereq_,module,exports){
11441
12696
  /**
11442
12697
  * Copyright 2013 Facebook, Inc.
11443
12698
  *
@@ -11512,7 +12767,14 @@ function visitArrowFunction(traverse, node, path, state) {
11512
12767
 
11513
12768
  // Bind the function only if `this` value is used
11514
12769
  // inside it or inside any sub-expression.
11515
- if (utils.containsChildOfType(node.body, Syntax.ThisExpression)) {
12770
+ var containsBindingSyntax =
12771
+ utils.containsChildMatching(node.body, function(node) {
12772
+ return node.type === Syntax.ThisExpression
12773
+ || (node.type === Syntax.Identifier
12774
+ && node.name === "super");
12775
+ });
12776
+
12777
+ if (containsBindingSyntax) {
11516
12778
  utils.append('.bind(this)', state);
11517
12779
  }
11518
12780
 
@@ -11553,7 +12815,7 @@ function renderExpressionBody(traverse, node, path, state) {
11553
12815
  // Special handling of rest param.
11554
12816
  if (node.rest) {
11555
12817
  utils.append(
11556
- restParamVisitors.renderRestParamSetup(node),
12818
+ restParamVisitors.renderRestParamSetup(node, state),
11557
12819
  state
11558
12820
  );
11559
12821
  }
@@ -11590,7 +12852,7 @@ exports.visitorList = [
11590
12852
  ];
11591
12853
 
11592
12854
 
11593
- },{"../src/utils":22,"./es6-destructuring-visitors":25,"./es6-rest-param-visitors":28,"esprima-fb":8}],24:[function(_dereq_,module,exports){
12855
+ },{"../src/utils":22,"./es6-destructuring-visitors":25,"./es6-rest-param-visitors":28,"esprima-fb":9}],24:[function(_dereq_,module,exports){
11594
12856
  /**
11595
12857
  * Copyright 2013 Facebook, Inc.
11596
12858
  *
@@ -11821,7 +13083,7 @@ function visitClassFunctionExpression(traverse, node, path, state) {
11821
13083
 
11822
13084
  var params = node.params;
11823
13085
  if (params.length > 0) {
11824
- utils.move(params[0].range[0], state);
13086
+ utils.catchupNewlines(params[0].range[0], state);
11825
13087
  for (var i = 0; i < params.length; i++) {
11826
13088
  utils.catchup(node.params[i].range[0], state);
11827
13089
  path.unshift(node);
@@ -12159,7 +13421,7 @@ exports.visitorList = [
12159
13421
  visitSuperMemberExpression
12160
13422
  ];
12161
13423
 
12162
- },{"../src/utils":22,"./reserved-words-helper":32,"base62":9,"esprima-fb":8}],25:[function(_dereq_,module,exports){
13424
+ },{"../src/utils":22,"./reserved-words-helper":32,"base62":8,"esprima-fb":9}],25:[function(_dereq_,module,exports){
12163
13425
  /**
12164
13426
  * Copyright 2014 Facebook, Inc.
12165
13427
  *
@@ -12215,7 +13477,7 @@ var restPropertyHelpers = _dereq_('./es7-rest-property-helpers');
12215
13477
 
12216
13478
  function visitStructuredVariable(traverse, node, path, state) {
12217
13479
  // Allocate new temp for the pattern.
12218
- utils.append(getTmpVar(state.localScope.tempVarIndex) + '=', state);
13480
+ utils.append(utils.getTempVar(state.localScope.tempVarIndex) + '=', state);
12219
13481
  // Skip the pattern and assign the init to the temp.
12220
13482
  utils.catchupWhiteSpace(node.init.range[0], state);
12221
13483
  traverse(node.init, path, state);
@@ -12255,14 +13517,14 @@ function getDestructuredComponents(node, state) {
12255
13517
  // and also for function param patterns: [x, ...xs, y]
12256
13518
  components.push(item.argument.name +
12257
13519
  '=Array.prototype.slice.call(' +
12258
- getTmpVar(tmpIndex) + ',' + idx + ')'
13520
+ utils.getTempVar(tmpIndex) + ',' + idx + ')'
12259
13521
  );
12260
13522
  continue;
12261
13523
  }
12262
13524
 
12263
13525
  if (item.type === Syntax.SpreadProperty) {
12264
13526
  var restExpression = restPropertyHelpers.renderRestExpression(
12265
- getTmpVar(tmpIndex),
13527
+ utils.getTempVar(tmpIndex),
12266
13528
  patternItems
12267
13529
  );
12268
13530
  components.push(item.argument.name + '=' + restExpression);
@@ -12281,8 +13543,8 @@ function getDestructuredComponents(node, state) {
12281
13543
  } else {
12282
13544
  // Complex sub-structure.
12283
13545
  components.push(
12284
- getInitialValue(++state.localScope.tempVarIndex, accessor) + ',' +
12285
- getDestructuredComponents(value, state)
13546
+ utils.getTempVarWithValue(++state.localScope.tempVarIndex, accessor) +
13547
+ ',' + getDestructuredComponents(value, state)
12286
13548
  );
12287
13549
  }
12288
13550
  }
@@ -12295,14 +13557,16 @@ function getPatternItems(node) {
12295
13557
  }
12296
13558
 
12297
13559
  function getPatternItemAccessor(node, patternItem, tmpIndex, idx) {
12298
- var tmpName = getTmpVar(tmpIndex);
13560
+ var tmpName = utils.getTempVar(tmpIndex);
12299
13561
  if (node.type === Syntax.ObjectPattern) {
12300
13562
  if (reservedWordsHelper.isReservedWord(patternItem.key.name)) {
12301
13563
  return tmpName + '["' + patternItem.key.name + '"]';
12302
- } else {
13564
+ } else if (patternItem.key.type === Syntax.Literal) {
13565
+ return tmpName + '[' + JSON.stringify(patternItem.key.value) + ']';
13566
+ } else if (patternItem.key.type === Syntax.Identifier) {
12303
13567
  return tmpName + '.' + patternItem.key.name;
12304
13568
  }
12305
- } else {
13569
+ } else if (node.type === Syntax.ArrayPattern) {
12306
13570
  return tmpName + '[' + idx + ']';
12307
13571
  }
12308
13572
  }
@@ -12313,14 +13577,6 @@ function getPatternItemValue(node, patternItem) {
12313
13577
  : patternItem;
12314
13578
  }
12315
13579
 
12316
- function getInitialValue(index, value) {
12317
- return getTmpVar(index) + '=' + value;
12318
- }
12319
-
12320
- function getTmpVar(index) {
12321
- return '$__' + index;
12322
- }
12323
-
12324
13580
  // -------------------------------------------------------
12325
13581
  // 2. Assignment expression.
12326
13582
  //
@@ -12330,14 +13586,14 @@ function getTmpVar(index) {
12330
13586
 
12331
13587
  function visitStructuredAssignment(traverse, node, path, state) {
12332
13588
  var exprNode = node.expression;
12333
- utils.append('var ' + getTmpVar(state.localScope.tempVarIndex) + '=', state);
13589
+ utils.append('var ' + utils.getTempVar(state.localScope.tempVarIndex) + '=', state);
12334
13590
 
12335
13591
  utils.catchupWhiteSpace(exprNode.right.range[0], state);
12336
13592
  traverse(exprNode.right, path, state);
12337
13593
  utils.catchup(exprNode.right.range[1], state);
12338
13594
 
12339
13595
  utils.append(
12340
- ',' + getDestructuredComponents(exprNode.left, state) + ';',
13596
+ ';' + getDestructuredComponents(exprNode.left, state) + ';',
12341
13597
  state
12342
13598
  );
12343
13599
 
@@ -12362,7 +13618,7 @@ visitStructuredAssignment.test = function(node, path, state) {
12362
13618
  // -------------------------------------------------------
12363
13619
 
12364
13620
  function visitStructuredParameter(traverse, node, path, state) {
12365
- utils.append(getTmpVar(getParamIndex(node, path)), state);
13621
+ utils.append(utils.getTempVar(getParamIndex(node, path)), state);
12366
13622
  utils.catchupWhiteSpace(node.range[1], state);
12367
13623
  return true;
12368
13624
  }
@@ -12407,7 +13663,7 @@ function visitFunctionBodyForStructuredParameter(traverse, node, path, state) {
12407
13663
 
12408
13664
  if (funcNode.rest) {
12409
13665
  utils.append(
12410
- restParamVisitors.renderRestParamSetup(funcNode),
13666
+ restParamVisitors.renderRestParamSetup(funcNode, state),
12411
13667
  state
12412
13668
  );
12413
13669
  }
@@ -12447,7 +13703,7 @@ exports.visitorList = [
12447
13703
  exports.renderDestructuredComponents = renderDestructuredComponents;
12448
13704
 
12449
13705
 
12450
- },{"../src/utils":22,"./es6-rest-param-visitors":28,"./es7-rest-property-helpers":30,"./reserved-words-helper":32,"esprima-fb":8}],26:[function(_dereq_,module,exports){
13706
+ },{"../src/utils":22,"./es6-rest-param-visitors":28,"./es7-rest-property-helpers":30,"./reserved-words-helper":32,"esprima-fb":9}],26:[function(_dereq_,module,exports){
12451
13707
  /**
12452
13708
  * Copyright 2013 Facebook, Inc.
12453
13709
  *
@@ -12518,7 +13774,7 @@ exports.visitorList = [
12518
13774
  visitObjectConciseMethod
12519
13775
  ];
12520
13776
 
12521
- },{"../src/utils":22,"./reserved-words-helper":32,"esprima-fb":8}],27:[function(_dereq_,module,exports){
13777
+ },{"../src/utils":22,"./reserved-words-helper":32,"esprima-fb":9}],27:[function(_dereq_,module,exports){
12522
13778
  /**
12523
13779
  * Copyright 2013 Facebook, Inc.
12524
13780
  *
@@ -12545,7 +13801,7 @@ exports.visitorList = [
12545
13801
  * return {x, y}; // {x: x, y: y}
12546
13802
  * };
12547
13803
  *
12548
- * // Destrucruting.
13804
+ * // Destructuring.
12549
13805
  * function init({port, ip, coords: {x, y}}) { ... }
12550
13806
  *
12551
13807
  */
@@ -12573,7 +13829,7 @@ exports.visitorList = [
12573
13829
  ];
12574
13830
 
12575
13831
 
12576
- },{"../src/utils":22,"esprima-fb":8}],28:[function(_dereq_,module,exports){
13832
+ },{"../src/utils":22,"esprima-fb":9}],28:[function(_dereq_,module,exports){
12577
13833
  /**
12578
13834
  * Copyright 2013 Facebook, Inc.
12579
13835
  *
@@ -12593,16 +13849,20 @@ exports.visitorList = [
12593
13849
  /*jslint node:true*/
12594
13850
 
12595
13851
  /**
12596
- * Desugars ES6 rest parameters into ES3 arguments slicing.
13852
+ * Desugars ES6 rest parameters into an ES3 arguments array.
12597
13853
  *
12598
13854
  * function printf(template, ...args) {
12599
13855
  * args.forEach(...);
12600
- * };
13856
+ * }
13857
+ *
13858
+ * We could use `Array.prototype.slice.call`, but that usage of arguments causes
13859
+ * functions to be deoptimized in V8, so instead we use a for-loop.
12601
13860
  *
12602
13861
  * function printf(template) {
12603
- * var args = [].slice.call(arguments, 1);
13862
+ * for (var args = [], $__0 = 1, $__1 = arguments.length; $__0 < $__1; $__0++)
13863
+ * args.push(arguments[$__0]);
12604
13864
  * args.forEach(...);
12605
- * };
13865
+ * }
12606
13866
  *
12607
13867
  */
12608
13868
  var Syntax = _dereq_('esprima-fb').Syntax;
@@ -12647,17 +13907,22 @@ visitFunctionParamsWithRestParam.test = function(node, path, state) {
12647
13907
  return _nodeIsFunctionWithRestParam(node);
12648
13908
  };
12649
13909
 
12650
- function renderRestParamSetup(functionNode) {
12651
- return 'var ' + functionNode.rest.name + '=Array.prototype.slice.call(' +
12652
- 'arguments,' +
12653
- functionNode.params.length +
12654
- ');';
13910
+ function renderRestParamSetup(functionNode, state) {
13911
+ var idx = state.localScope.tempVarIndex++;
13912
+ var len = state.localScope.tempVarIndex++;
13913
+
13914
+ return 'for (var ' + functionNode.rest.name + '=[],' +
13915
+ utils.getTempVarWithValue(idx, functionNode.params.length) + ',' +
13916
+ utils.getTempVarWithValue(len, 'arguments.length') + ';' +
13917
+ utils.getTempVar(idx) + '<' + utils.getTempVar(len) + ';' +
13918
+ utils.getTempVar(idx) + '++) ' +
13919
+ functionNode.rest.name + '.push(arguments[' + utils.getTempVar(idx) + ']);';
12655
13920
  }
12656
13921
 
12657
13922
  function visitFunctionBodyWithRestParam(traverse, node, path, state) {
12658
13923
  utils.catchup(node.range[0] + 1, state);
12659
13924
  var parentNode = path[0];
12660
- utils.append(renderRestParamSetup(parentNode), state);
13925
+ utils.append(renderRestParamSetup(parentNode, state), state);
12661
13926
  return true;
12662
13927
  }
12663
13928
 
@@ -12672,7 +13937,7 @@ exports.visitorList = [
12672
13937
  visitFunctionBodyWithRestParam
12673
13938
  ];
12674
13939
 
12675
- },{"../src/utils":22,"esprima-fb":8}],29:[function(_dereq_,module,exports){
13940
+ },{"../src/utils":22,"esprima-fb":9}],29:[function(_dereq_,module,exports){
12676
13941
  /**
12677
13942
  * Copyright 2013 Facebook, Inc.
12678
13943
  *
@@ -12830,7 +14095,7 @@ exports.visitorList = [
12830
14095
  visitTaggedTemplateExpression
12831
14096
  ];
12832
14097
 
12833
- },{"../src/utils":22,"esprima-fb":8}],30:[function(_dereq_,module,exports){
14098
+ },{"../src/utils":22,"esprima-fb":9}],30:[function(_dereq_,module,exports){
12834
14099
  /**
12835
14100
  * Copyright 2013 Facebook, Inc.
12836
14101
  *
@@ -12913,7 +14178,7 @@ function renderRestExpression(accessorExpression, excludedProperties) {
12913
14178
 
12914
14179
  exports.renderRestExpression = renderRestExpression;
12915
14180
 
12916
- },{"../src/utils":22,"esprima-fb":8}],31:[function(_dereq_,module,exports){
14181
+ },{"../src/utils":22,"esprima-fb":9}],31:[function(_dereq_,module,exports){
12917
14182
  /**
12918
14183
  * Copyright 2004-present Facebook. All Rights Reserved.
12919
14184
  */
@@ -12985,7 +14250,11 @@ function visitObjectLiteralSpread(traverse, node, path, state) {
12985
14250
  }
12986
14251
  }
12987
14252
 
12988
- utils.catchup(node.range[1] - 1, state);
14253
+ // Strip any non-whitespace between the last item and the end.
14254
+ // We only catch up on whitespace so that we ignore any trailing commas which
14255
+ // are stripped out for IE8 support. Unfortunately, this also strips out any
14256
+ // trailing comments.
14257
+ utils.catchupWhiteSpace(node.range[1] - 1, state);
12989
14258
 
12990
14259
  // Skip the trailing }
12991
14260
  utils.move(node.range[1], state);
@@ -13019,7 +14288,7 @@ exports.visitorList = [
13019
14288
  visitObjectLiteralSpread
13020
14289
  ];
13021
14290
 
13022
- },{"../src/utils":22,"esprima-fb":8}],32:[function(_dereq_,module,exports){
14291
+ },{"../src/utils":22,"esprima-fb":9}],32:[function(_dereq_,module,exports){
13023
14292
  /**
13024
14293
  * Copyright 2014 Facebook, Inc.
13025
14294
  *
@@ -13061,7 +14330,7 @@ var RESERVED_WORDS = [].concat(
13061
14330
  LITERALS
13062
14331
  );
13063
14332
 
13064
- var reservedWordsMap = {};
14333
+ var reservedWordsMap = Object.create(null);
13065
14334
  RESERVED_WORDS.forEach(function(k) {
13066
14335
  reservedWordsMap[k] = true;
13067
14336
  });
@@ -13072,7 +14341,7 @@ exports.isReservedWord = function(word) {
13072
14341
 
13073
14342
  },{}],33:[function(_dereq_,module,exports){
13074
14343
  var esprima = _dereq_('esprima-fb');
13075
- var utils = _dereq_('jstransform/src/utils');
14344
+ var utils = _dereq_('../src/utils');
13076
14345
 
13077
14346
  var Syntax = esprima.Syntax;
13078
14347
 
@@ -13083,6 +14352,7 @@ function _isFunctionNode(node) {
13083
14352
  }
13084
14353
 
13085
14354
  function visitClassProperty(traverse, node, path, state) {
14355
+ utils.catchup(node.range[0], state);
13086
14356
  utils.catchupWhiteOut(node.range[1], state);
13087
14357
  return false;
13088
14358
  }
@@ -13090,18 +14360,50 @@ visitClassProperty.test = function(node, path, state) {
13090
14360
  return node.type === Syntax.ClassProperty;
13091
14361
  };
13092
14362
 
14363
+ function visitTypeAlias(traverse, node, path, state) {
14364
+ utils.catchupWhiteOut(node.range[1], state);
14365
+ return false;
14366
+ }
14367
+ visitTypeAlias.test = function(node, path, state) {
14368
+ return node.type === Syntax.TypeAlias;
14369
+ };
14370
+
14371
+ function visitInterfaceDeclaration(traverse, node, path, state) {
14372
+ utils.catchupWhiteOut(node.range[1], state);
14373
+ return false;
14374
+ }
14375
+ visitInterfaceDeclaration.test = function(node, path, state) {
14376
+ return node.type === Syntax.InterfaceDeclaration;
14377
+ };
14378
+
14379
+ function visitDeclare(traverse, node, path, state) {
14380
+ utils.catchupWhiteOut(node.range[1], state);
14381
+ return false;
14382
+ }
14383
+ visitDeclare.test = function(node, path, state) {
14384
+ switch (node.type) {
14385
+ case Syntax.DeclareVariable:
14386
+ case Syntax.DeclareFunction:
14387
+ case Syntax.DeclareClass:
14388
+ case Syntax.DeclareModule: return true
14389
+ }
14390
+ return false;
14391
+ }
14392
+
13093
14393
  function visitFunctionParametricAnnotation(traverse, node, path, state) {
14394
+ utils.catchup(node.range[0], state);
13094
14395
  utils.catchupWhiteOut(node.range[1], state);
13095
14396
  return false;
13096
14397
  }
13097
14398
  visitFunctionParametricAnnotation.test = function(node, path, state) {
13098
- return node.type === Syntax.ParametricTypeAnnotation
14399
+ return node.type === Syntax.TypeParameterDeclaration
13099
14400
  && path[0]
13100
14401
  && _isFunctionNode(path[0])
13101
- && node === path[0].parametricType;
14402
+ && node === path[0].typeParameters;
13102
14403
  };
13103
14404
 
13104
14405
  function visitFunctionReturnAnnotation(traverse, node, path, state) {
14406
+ utils.catchup(node.range[0], state);
13105
14407
  utils.catchupWhiteOut(node.range[1], state);
13106
14408
  return false;
13107
14409
  }
@@ -13110,38 +14412,83 @@ visitFunctionReturnAnnotation.test = function(node, path, state) {
13110
14412
  };
13111
14413
 
13112
14414
  function visitOptionalFunctionParameterAnnotation(traverse, node, path, state) {
13113
- path.unshift(node);
13114
- traverse(node.id, path, state);
13115
- path.shift();
13116
- utils.catchup(node.id.range[1], state);
14415
+ utils.catchup(node.range[0] + node.name.length, state);
13117
14416
  utils.catchupWhiteOut(node.range[1], state);
13118
14417
  return false;
13119
14418
  }
13120
14419
  visitOptionalFunctionParameterAnnotation.test = function(node, path, state) {
13121
- return node.type === Syntax.OptionalParameter
14420
+ return node.type === Syntax.Identifier
14421
+ && node.optional
13122
14422
  && path[0]
13123
14423
  && _isFunctionNode(path[0]);
13124
14424
  };
13125
14425
 
13126
14426
  function visitTypeAnnotatedIdentifier(traverse, node, path, state) {
13127
- traverse(node.id, path, state);
13128
- utils.catchup(node.id.range[1], state);
13129
- utils.catchupWhiteOut(node.range[1], state);
14427
+ utils.catchup(node.typeAnnotation.range[0], state);
14428
+ utils.catchupWhiteOut(node.typeAnnotation.range[1], state);
13130
14429
  return false;
13131
14430
  }
13132
14431
  visitTypeAnnotatedIdentifier.test = function(node, path, state) {
13133
- return node.type === Syntax.TypeAnnotatedIdentifier;
14432
+ return node.type === Syntax.Identifier && node.typeAnnotation;
14433
+ };
14434
+
14435
+ function visitTypeAnnotatedObjectOrArrayPattern(traverse, node, path, state) {
14436
+ utils.catchup(node.typeAnnotation.range[0], state);
14437
+ utils.catchupWhiteOut(node.typeAnnotation.range[1], state);
14438
+ return false;
14439
+ }
14440
+ visitTypeAnnotatedObjectOrArrayPattern.test = function(node, path, state) {
14441
+ var rightType = node.type === Syntax.ObjectPattern
14442
+ || node.type === Syntax.ArrayPattern;
14443
+ return rightType && node.typeAnnotation;
14444
+ };
14445
+
14446
+ /**
14447
+ * Methods cause trouble, since esprima parses them as a key/value pair, where
14448
+ * the location of the value starts at the method body. For example
14449
+ * { bar(x:number,...y:Array<number>):number {} }
14450
+ * is parsed as
14451
+ * { bar: function(x: number, ...y:Array<number>): number {} }
14452
+ * except that the location of the FunctionExpression value is 40-something,
14453
+ * which is the location of the function body. This means that by the time we
14454
+ * visit the params, rest param, and return type organically, we've already
14455
+ * catchup()'d passed them.
14456
+ */
14457
+ function visitMethod(traverse, node, path, state) {
14458
+ path.unshift(node);
14459
+ traverse(node.key, path, state);
14460
+
14461
+ path.unshift(node.value);
14462
+ traverse(node.value.params, path, state);
14463
+ node.value.rest && traverse(node.value.rest, path, state);
14464
+ node.value.returnType && traverse(node.value.returnType, path, state);
14465
+ traverse(node.value.body, path, state);
14466
+
14467
+ path.shift();
14468
+
14469
+ path.shift();
14470
+ return false;
14471
+ }
14472
+
14473
+ visitMethod.test = function(node, path, state) {
14474
+ return (node.type === "Property" && (node.method || node.kind === "set" || node.kind === "get"))
14475
+ || (node.type === "MethodDefinition");
13134
14476
  };
13135
14477
 
13136
14478
  exports.visitorList = [
13137
14479
  visitClassProperty,
14480
+ visitDeclare,
14481
+ visitInterfaceDeclaration,
13138
14482
  visitFunctionParametricAnnotation,
13139
14483
  visitFunctionReturnAnnotation,
14484
+ visitMethod,
13140
14485
  visitOptionalFunctionParameterAnnotation,
13141
- visitTypeAnnotatedIdentifier
14486
+ visitTypeAlias,
14487
+ visitTypeAnnotatedIdentifier,
14488
+ visitTypeAnnotatedObjectOrArrayPattern
13142
14489
  ];
13143
14490
 
13144
- },{"esprima-fb":8,"jstransform/src/utils":22}],34:[function(_dereq_,module,exports){
14491
+ },{"../src/utils":22,"esprima-fb":9}],34:[function(_dereq_,module,exports){
13145
14492
  /**
13146
14493
  * Copyright 2013-2014, Facebook, Inc.
13147
14494
  * All rights reserved.
@@ -13153,7 +14500,7 @@ exports.visitorList = [
13153
14500
  /*global exports:true*/
13154
14501
  "use strict";
13155
14502
 
13156
- var Syntax = _dereq_('esprima-fb').Syntax;
14503
+ var Syntax = _dereq_('jstransform').Syntax;
13157
14504
  var utils = _dereq_('jstransform/src/utils');
13158
14505
 
13159
14506
  var FALLBACK_TAGS = _dereq_('./xjs').knownTags;
@@ -13396,7 +14743,7 @@ exports.visitorList = [
13396
14743
  visitReactTag
13397
14744
  ];
13398
14745
 
13399
- },{"./xjs":36,"esprima-fb":8,"jstransform/src/utils":22}],35:[function(_dereq_,module,exports){
14746
+ },{"./xjs":36,"jstransform":21,"jstransform/src/utils":22}],35:[function(_dereq_,module,exports){
13400
14747
  /**
13401
14748
  * Copyright 2013-2014, Facebook, Inc.
13402
14749
  * All rights reserved.
@@ -13408,7 +14755,7 @@ exports.visitorList = [
13408
14755
  /*global exports:true*/
13409
14756
  "use strict";
13410
14757
 
13411
- var Syntax = _dereq_('esprima-fb').Syntax;
14758
+ var Syntax = _dereq_('jstransform').Syntax;
13412
14759
  var utils = _dereq_('jstransform/src/utils');
13413
14760
 
13414
14761
  function addDisplayName(displayName, object, state) {
@@ -13491,7 +14838,7 @@ exports.visitorList = [
13491
14838
  visitReactDisplayName
13492
14839
  ];
13493
14840
 
13494
- },{"esprima-fb":8,"jstransform/src/utils":22}],36:[function(_dereq_,module,exports){
14841
+ },{"jstransform":21,"jstransform/src/utils":22}],36:[function(_dereq_,module,exports){
13495
14842
  /**
13496
14843
  * Copyright 2013-2014, Facebook, Inc.
13497
14844
  * All rights reserved.
@@ -13502,7 +14849,7 @@ exports.visitorList = [
13502
14849
  */
13503
14850
  /*global exports:true*/
13504
14851
  "use strict";
13505
- var Syntax = _dereq_('esprima-fb').Syntax;
14852
+ var Syntax = _dereq_('jstransform').Syntax;
13506
14853
  var utils = _dereq_('jstransform/src/utils');
13507
14854
 
13508
14855
  var knownTags = {
@@ -13740,7 +15087,7 @@ exports.renderXJSLiteral = renderXJSLiteral;
13740
15087
  exports.quoteAttrName = quoteAttrName;
13741
15088
  exports.trimLeft = trimLeft;
13742
15089
 
13743
- },{"esprima-fb":8,"jstransform/src/utils":22}],37:[function(_dereq_,module,exports){
15090
+ },{"jstransform":21,"jstransform/src/utils":22}],37:[function(_dereq_,module,exports){
13744
15091
  /*global exports:true*/
13745
15092
  var es6ArrowFunctions = _dereq_('jstransform/visitors/es6-arrow-function-visitors');
13746
15093
  var es6Classes = _dereq_('jstransform/visitors/es6-class-visitors');
@@ -13752,7 +15099,6 @@ var es6Templates = _dereq_('jstransform/visitors/es6-template-visitors');
13752
15099
  var es7SpreadProperty = _dereq_('jstransform/visitors/es7-spread-property-visitors');
13753
15100
  var react = _dereq_('./transforms/react');
13754
15101
  var reactDisplayName = _dereq_('./transforms/reactDisplayName');
13755
- var typesSyntax = _dereq_('jstransform/visitors/type-syntax');
13756
15102
 
13757
15103
  /**
13758
15104
  * Map from transformName => orderedListOfVisitors.
@@ -13766,8 +15112,7 @@ var transformVisitors = {
13766
15112
  'es6-rest-params': es6RestParameters.visitorList,
13767
15113
  'es6-templates': es6Templates.visitorList,
13768
15114
  'es7-spread-property': es7SpreadProperty.visitorList,
13769
- 'react': react.visitorList.concat(reactDisplayName.visitorList),
13770
- 'types': typesSyntax.visitorList
15115
+ 'react': react.visitorList.concat(reactDisplayName.visitorList)
13771
15116
  };
13772
15117
 
13773
15118
  var transformSets = {
@@ -13783,9 +15128,6 @@ var transformSets = {
13783
15128
  ],
13784
15129
  'react': [
13785
15130
  'react'
13786
- ],
13787
- 'type-annotations': [
13788
- 'types'
13789
15131
  ]
13790
15132
  };
13791
15133
 
@@ -13793,7 +15135,6 @@ var transformSets = {
13793
15135
  * Specifies the order in which each transform should run.
13794
15136
  */
13795
15137
  var transformRunOrder = [
13796
- 'types',
13797
15138
  'es6-arrow-functions',
13798
15139
  'es6-object-concise-method',
13799
15140
  'es6-object-short-notation',
@@ -13854,5 +15195,5 @@ exports.getVisitorsBySet = getVisitorsBySet;
13854
15195
  exports.getAllVisitors = getAllVisitors;
13855
15196
  exports.transformVisitors = transformVisitors;
13856
15197
 
13857
- },{"./transforms/react":34,"./transforms/reactDisplayName":35,"jstransform/visitors/es6-arrow-function-visitors":23,"jstransform/visitors/es6-class-visitors":24,"jstransform/visitors/es6-destructuring-visitors":25,"jstransform/visitors/es6-object-concise-method-visitors":26,"jstransform/visitors/es6-object-short-notation-visitors":27,"jstransform/visitors/es6-rest-param-visitors":28,"jstransform/visitors/es6-template-visitors":29,"jstransform/visitors/es7-spread-property-visitors":31,"jstransform/visitors/type-syntax":33}]},{},[1])(1)
15198
+ },{"./transforms/react":34,"./transforms/reactDisplayName":35,"jstransform/visitors/es6-arrow-function-visitors":23,"jstransform/visitors/es6-class-visitors":24,"jstransform/visitors/es6-destructuring-visitors":25,"jstransform/visitors/es6-object-concise-method-visitors":26,"jstransform/visitors/es6-object-short-notation-visitors":27,"jstransform/visitors/es6-rest-param-visitors":28,"jstransform/visitors/es6-template-visitors":29,"jstransform/visitors/es7-spread-property-visitors":31}]},{},[1])(1)
13858
15199
  });