react-source 0.12.0 → 0.12.1

Sign up to get free protection for your applications and to get access to all the features.
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
  });