requirejs-rails 0.9.8 → 0.9.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/Gemfile.lock +1 -1
- data/README.md +2 -2
- data/bin/r.js +2026 -448
- data/lib/requirejs/rails/version.rb +2 -2
- data/lib/tasks/requirejs-rails_tasks.rake +18 -12
- data/vendor/assets/javascripts/require.js +16 -9
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 164acbc04d1af8d41a62781a38bd12a79938d8af
|
4
|
+
data.tar.gz: bcd19769e40757d0d68d8d5fcd8ce9f8c0592cd0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 946512c5a0e1b7e3c7c53ab9d5881e47f2f3ed73617d8a7205ff5f5cca644b3e5c12d55027d6213b6d1fce48bb0d2217a0705fbba662f8443ec1057f5a33bc53
|
7
|
+
data.tar.gz: 3b6f1499207ecdbbf413f621c6b8fbeabea3a327fd3db4d49d092927a87cd022fb5d715c0c0d7d8ff9dcd2297c8f83456bf4ece6e53e5d4161dd4c4b87f82403
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -148,7 +148,7 @@ wrap: true
|
|
148
148
|
The `requirejs-rails` build process uses the Asset Pipeline to assemble assets
|
149
149
|
for the `r.js` build. By default, assets ending in `.js`, `.html`, and `.txt`
|
150
150
|
will be made available to the build. If you have other asset suffixes to
|
151
|
-
include, use the `
|
151
|
+
include, use the `logical_path_patterns` config setting to add them.
|
152
152
|
|
153
153
|
For example, if your templates all end in `.templ` like so...
|
154
154
|
|
@@ -164,7 +164,7 @@ define(function (require) {
|
|
164
164
|
|
165
165
|
```ruby
|
166
166
|
# in config/application.rb
|
167
|
-
config.requirejs.
|
167
|
+
config.requirejs.logical_path_patterns += [/\.templ$/]
|
168
168
|
```
|
169
169
|
|
170
170
|
## Advanced features
|
data/bin/r.js
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license r.js 2.1.
|
2
|
+
* @license r.js 2.1.19 Copyright (c) 2010-2015, The Dojo Foundation All Rights Reserved.
|
3
3
|
* Available via the MIT or new BSD license.
|
4
4
|
* see: http://github.com/jrburke/requirejs for details
|
5
5
|
*/
|
@@ -20,7 +20,7 @@ var requirejs, require, define, xpcUtil;
|
|
20
20
|
(function (console, args, readFileFunc) {
|
21
21
|
var fileName, env, fs, vm, path, exec, rhinoContext, dir, nodeRequire,
|
22
22
|
nodeDefine, exists, reqMain, loadedOptimizedLib, existsForNode, Cc, Ci,
|
23
|
-
version = '2.1.
|
23
|
+
version = '2.1.19',
|
24
24
|
jsSuffixRegExp = /\.js$/,
|
25
25
|
commandOption = '',
|
26
26
|
useLibLoaded = {},
|
@@ -249,7 +249,7 @@ var requirejs, require, define, xpcUtil;
|
|
249
249
|
}
|
250
250
|
|
251
251
|
/** vim: et:ts=4:sw=4:sts=4
|
252
|
-
* @license RequireJS 2.1.
|
252
|
+
* @license RequireJS 2.1.19 Copyright (c) 2010-2015, The Dojo Foundation All Rights Reserved.
|
253
253
|
* Available via the MIT or new BSD license.
|
254
254
|
* see: http://github.com/jrburke/requirejs for details
|
255
255
|
*/
|
@@ -262,7 +262,7 @@ var requirejs, require, define, xpcUtil;
|
|
262
262
|
(function (global) {
|
263
263
|
var req, s, head, baseElement, dataMain, src,
|
264
264
|
interactiveScript, currentlyAddingScript, mainScript, subPath,
|
265
|
-
version = '2.1.
|
265
|
+
version = '2.1.19',
|
266
266
|
commentRegExp = /(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg,
|
267
267
|
cjsRequireRegExp = /[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g,
|
268
268
|
jsSuffixRegExp = /\.js$/,
|
@@ -839,7 +839,7 @@ var requirejs, require, define, xpcUtil;
|
|
839
839
|
id: mod.map.id,
|
840
840
|
uri: mod.map.url,
|
841
841
|
config: function () {
|
842
|
-
return
|
842
|
+
return getOwn(config.config, mod.map.id) || {};
|
843
843
|
},
|
844
844
|
exports: mod.exports || (mod.exports = {})
|
845
845
|
});
|
@@ -1367,6 +1367,9 @@ var requirejs, require, define, xpcUtil;
|
|
1367
1367
|
this.depCount += 1;
|
1368
1368
|
|
1369
1369
|
on(depMap, 'defined', bind(this, function (depExports) {
|
1370
|
+
if (this.undefed) {
|
1371
|
+
return;
|
1372
|
+
}
|
1370
1373
|
this.defineDep(i, depExports);
|
1371
1374
|
this.check();
|
1372
1375
|
}));
|
@@ -1483,7 +1486,8 @@ var requirejs, require, define, xpcUtil;
|
|
1483
1486
|
while (defQueue.length) {
|
1484
1487
|
args = defQueue.shift();
|
1485
1488
|
if (args[0] === null) {
|
1486
|
-
return onError(makeError('mismatch', 'Mismatched anonymous define() module: ' +
|
1489
|
+
return onError(makeError('mismatch', 'Mismatched anonymous define() module: ' +
|
1490
|
+
args[args.length - 1]));
|
1487
1491
|
} else {
|
1488
1492
|
//args are id, deps, factory. Should be normalized by the
|
1489
1493
|
//define() function.
|
@@ -1570,7 +1574,7 @@ var requirejs, require, define, xpcUtil;
|
|
1570
1574
|
each(cfg.packages, function (pkgObj) {
|
1571
1575
|
var location, name;
|
1572
1576
|
|
1573
|
-
pkgObj = typeof pkgObj === 'string' ? {
|
1577
|
+
pkgObj = typeof pkgObj === 'string' ? {name: pkgObj} : pkgObj;
|
1574
1578
|
|
1575
1579
|
name = pkgObj.name;
|
1576
1580
|
location = pkgObj.location;
|
@@ -1597,7 +1601,7 @@ var requirejs, require, define, xpcUtil;
|
|
1597
1601
|
//late to modify them, and ignore unnormalized ones
|
1598
1602
|
//since they are transient.
|
1599
1603
|
if (!mod.inited && !mod.map.unnormalized) {
|
1600
|
-
mod.map = makeModuleMap(id);
|
1604
|
+
mod.map = makeModuleMap(id, null, true);
|
1601
1605
|
}
|
1602
1606
|
});
|
1603
1607
|
|
@@ -1733,6 +1737,7 @@ var requirejs, require, define, xpcUtil;
|
|
1733
1737
|
var map = makeModuleMap(id, relMap, true),
|
1734
1738
|
mod = getOwn(registry, id);
|
1735
1739
|
|
1740
|
+
mod.undefed = true;
|
1736
1741
|
removeScript(id);
|
1737
1742
|
|
1738
1743
|
delete defined[id];
|
@@ -1743,7 +1748,7 @@ var requirejs, require, define, xpcUtil;
|
|
1743
1748
|
//in array so that the splices do not
|
1744
1749
|
//mess up the iteration.
|
1745
1750
|
eachReverse(defQueue, function(args, i) {
|
1746
|
-
if(args[0] === id) {
|
1751
|
+
if (args[0] === id) {
|
1747
1752
|
defQueue.splice(i, 1);
|
1748
1753
|
}
|
1749
1754
|
});
|
@@ -2102,6 +2107,9 @@ var requirejs, require, define, xpcUtil;
|
|
2102
2107
|
if (isBrowser) {
|
2103
2108
|
//In the browser so use a script tag
|
2104
2109
|
node = req.createNode(config, moduleName, url);
|
2110
|
+
if (config.onNodeCreated) {
|
2111
|
+
config.onNodeCreated(node, config, moduleName, url);
|
2112
|
+
}
|
2105
2113
|
|
2106
2114
|
node.setAttribute('data-requirecontext', context.contextName);
|
2107
2115
|
node.setAttribute('data-requiremodule', moduleName);
|
@@ -2230,7 +2238,7 @@ var requirejs, require, define, xpcUtil;
|
|
2230
2238
|
//like a module name.
|
2231
2239
|
mainScript = mainScript.replace(jsSuffixRegExp, '');
|
2232
2240
|
|
2233
|
-
|
2241
|
+
//If mainScript is still a path, fall back to dataMain
|
2234
2242
|
if (req.jsExtRegExp.test(mainScript)) {
|
2235
2243
|
mainScript = dataMain;
|
2236
2244
|
}
|
@@ -2316,7 +2324,6 @@ var requirejs, require, define, xpcUtil;
|
|
2316
2324
|
jQuery: true
|
2317
2325
|
};
|
2318
2326
|
|
2319
|
-
|
2320
2327
|
/**
|
2321
2328
|
* Executes the text. Normally just uses eval, but can be modified
|
2322
2329
|
* to use a better, environment-specific call. Only used for transpiling
|
@@ -2929,7 +2936,8 @@ var prim;
|
|
2929
2936
|
function check(p) {
|
2930
2937
|
if (hasProp(p, 'e') || hasProp(p, 'v')) {
|
2931
2938
|
if (!prim.hideResolutionConflict) {
|
2932
|
-
throw new Error('
|
2939
|
+
throw new Error('Prim promise already resolved: ' +
|
2940
|
+
JSON.stringify(p));
|
2933
2941
|
}
|
2934
2942
|
return false;
|
2935
2943
|
}
|
@@ -4555,16 +4563,7 @@ define('logger', ['env!env/print'], function (print) {
|
|
4555
4563
|
//like Node's fs and path.
|
4556
4564
|
|
4557
4565
|
/*
|
4558
|
-
Copyright (
|
4559
|
-
Copyright (C) 2013 Thaddee Tyl <thaddee.tyl@gmail.com>
|
4560
|
-
Copyright (C) 2013 Mathias Bynens <mathias@qiwi.be>
|
4561
|
-
Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>
|
4562
|
-
Copyright (C) 2012 Mathias Bynens <mathias@qiwi.be>
|
4563
|
-
Copyright (C) 2012 Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>
|
4564
|
-
Copyright (C) 2012 Kris Kowal <kris.kowal@cixar.com>
|
4565
|
-
Copyright (C) 2012 Yusuke Suzuki <utatane.tea@gmail.com>
|
4566
|
-
Copyright (C) 2012 Arpad Borsos <arpad.borsos@googlemail.com>
|
4567
|
-
Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>
|
4566
|
+
Copyright (c) jQuery Foundation, Inc. and Contributors, All Rights Reserved.
|
4568
4567
|
|
4569
4568
|
Redistribution and use in source and binary forms, with or without
|
4570
4569
|
modification, are permitted provided that the following conditions are met:
|
@@ -4613,6 +4612,7 @@ define('logger', ['env!env/print'], function (print) {
|
|
4613
4612
|
Regex,
|
4614
4613
|
source,
|
4615
4614
|
strict,
|
4615
|
+
sourceType,
|
4616
4616
|
index,
|
4617
4617
|
lineNumber,
|
4618
4618
|
lineStart,
|
@@ -4627,7 +4627,10 @@ define('logger', ['env!env/print'], function (print) {
|
|
4627
4627
|
length,
|
4628
4628
|
lookahead,
|
4629
4629
|
state,
|
4630
|
-
extra
|
4630
|
+
extra,
|
4631
|
+
isBindingElement,
|
4632
|
+
isAssignmentTarget,
|
4633
|
+
firstCoverInitializedNameError;
|
4631
4634
|
|
4632
4635
|
Token = {
|
4633
4636
|
BooleanLiteral: 1,
|
@@ -4638,7 +4641,8 @@ define('logger', ['env!env/print'], function (print) {
|
|
4638
4641
|
NumericLiteral: 6,
|
4639
4642
|
Punctuator: 7,
|
4640
4643
|
StringLiteral: 8,
|
4641
|
-
RegularExpression: 9
|
4644
|
+
RegularExpression: 9,
|
4645
|
+
Template: 10
|
4642
4646
|
};
|
4643
4647
|
|
4644
4648
|
TokenName = {};
|
@@ -4651,6 +4655,7 @@ define('logger', ['env!env/print'], function (print) {
|
|
4651
4655
|
TokenName[Token.Punctuator] = 'Punctuator';
|
4652
4656
|
TokenName[Token.StringLiteral] = 'String';
|
4653
4657
|
TokenName[Token.RegularExpression] = 'RegularExpression';
|
4658
|
+
TokenName[Token.Template] = 'Template';
|
4654
4659
|
|
4655
4660
|
// A function following one of those tokens is an expression.
|
4656
4661
|
FnExprTokens = ['(', '{', '[', 'in', 'typeof', 'instanceof', 'new',
|
@@ -4665,7 +4670,9 @@ define('logger', ['env!env/print'], function (print) {
|
|
4665
4670
|
|
4666
4671
|
Syntax = {
|
4667
4672
|
AssignmentExpression: 'AssignmentExpression',
|
4673
|
+
AssignmentPattern: 'AssignmentPattern',
|
4668
4674
|
ArrayExpression: 'ArrayExpression',
|
4675
|
+
ArrayPattern: 'ArrayPattern',
|
4669
4676
|
ArrowFunctionExpression: 'ArrowFunctionExpression',
|
4670
4677
|
BlockStatement: 'BlockStatement',
|
4671
4678
|
BinaryExpression: 'BinaryExpression',
|
@@ -4680,13 +4687,22 @@ define('logger', ['env!env/print'], function (print) {
|
|
4680
4687
|
DoWhileStatement: 'DoWhileStatement',
|
4681
4688
|
DebuggerStatement: 'DebuggerStatement',
|
4682
4689
|
EmptyStatement: 'EmptyStatement',
|
4690
|
+
ExportAllDeclaration: 'ExportAllDeclaration',
|
4691
|
+
ExportDefaultDeclaration: 'ExportDefaultDeclaration',
|
4692
|
+
ExportNamedDeclaration: 'ExportNamedDeclaration',
|
4693
|
+
ExportSpecifier: 'ExportSpecifier',
|
4683
4694
|
ExpressionStatement: 'ExpressionStatement',
|
4684
4695
|
ForStatement: 'ForStatement',
|
4696
|
+
ForOfStatement: 'ForOfStatement',
|
4685
4697
|
ForInStatement: 'ForInStatement',
|
4686
4698
|
FunctionDeclaration: 'FunctionDeclaration',
|
4687
4699
|
FunctionExpression: 'FunctionExpression',
|
4688
4700
|
Identifier: 'Identifier',
|
4689
4701
|
IfStatement: 'IfStatement',
|
4702
|
+
ImportDeclaration: 'ImportDeclaration',
|
4703
|
+
ImportDefaultSpecifier: 'ImportDefaultSpecifier',
|
4704
|
+
ImportNamespaceSpecifier: 'ImportNamespaceSpecifier',
|
4705
|
+
ImportSpecifier: 'ImportSpecifier',
|
4690
4706
|
Literal: 'Literal',
|
4691
4707
|
LabeledStatement: 'LabeledStatement',
|
4692
4708
|
LogicalExpression: 'LogicalExpression',
|
@@ -4694,13 +4710,19 @@ define('logger', ['env!env/print'], function (print) {
|
|
4694
4710
|
MethodDefinition: 'MethodDefinition',
|
4695
4711
|
NewExpression: 'NewExpression',
|
4696
4712
|
ObjectExpression: 'ObjectExpression',
|
4713
|
+
ObjectPattern: 'ObjectPattern',
|
4697
4714
|
Program: 'Program',
|
4698
4715
|
Property: 'Property',
|
4699
4716
|
RestElement: 'RestElement',
|
4700
4717
|
ReturnStatement: 'ReturnStatement',
|
4701
4718
|
SequenceExpression: 'SequenceExpression',
|
4702
|
-
|
4719
|
+
SpreadElement: 'SpreadElement',
|
4720
|
+
Super: 'Super',
|
4703
4721
|
SwitchCase: 'SwitchCase',
|
4722
|
+
SwitchStatement: 'SwitchStatement',
|
4723
|
+
TaggedTemplateExpression: 'TaggedTemplateExpression',
|
4724
|
+
TemplateElement: 'TemplateElement',
|
4725
|
+
TemplateLiteral: 'TemplateLiteral',
|
4704
4726
|
ThisExpression: 'ThisExpression',
|
4705
4727
|
ThrowStatement: 'ThrowStatement',
|
4706
4728
|
TryStatement: 'TryStatement',
|
@@ -4709,7 +4731,8 @@ define('logger', ['env!env/print'], function (print) {
|
|
4709
4731
|
VariableDeclaration: 'VariableDeclaration',
|
4710
4732
|
VariableDeclarator: 'VariableDeclarator',
|
4711
4733
|
WhileStatement: 'WhileStatement',
|
4712
|
-
WithStatement: 'WithStatement'
|
4734
|
+
WithStatement: 'WithStatement',
|
4735
|
+
YieldExpression: 'YieldExpression'
|
4713
4736
|
};
|
4714
4737
|
|
4715
4738
|
PlaceHolders = {
|
@@ -4723,12 +4746,14 @@ define('logger', ['env!env/print'], function (print) {
|
|
4723
4746
|
UnexpectedString: 'Unexpected string',
|
4724
4747
|
UnexpectedIdentifier: 'Unexpected identifier',
|
4725
4748
|
UnexpectedReserved: 'Unexpected reserved word',
|
4749
|
+
UnexpectedTemplate: 'Unexpected quasi %0',
|
4726
4750
|
UnexpectedEOS: 'Unexpected end of input',
|
4727
4751
|
NewlineAfterThrow: 'Illegal newline after throw',
|
4728
4752
|
InvalidRegExp: 'Invalid regular expression',
|
4729
4753
|
UnterminatedRegExp: 'Invalid regular expression: missing /',
|
4730
4754
|
InvalidLHSInAssignment: 'Invalid left-hand side in assignment',
|
4731
4755
|
InvalidLHSInForIn: 'Invalid left-hand side in for-in',
|
4756
|
+
InvalidLHSInForLoop: 'Invalid left-hand side in for-loop',
|
4732
4757
|
MultipleDefaultsInSwitch: 'More than one default clause in switch statement',
|
4733
4758
|
NoCatchOrFinally: 'Missing catch or finally after try',
|
4734
4759
|
UnknownLabel: 'Undefined label \'%0\'',
|
@@ -4736,6 +4761,7 @@ define('logger', ['env!env/print'], function (print) {
|
|
4736
4761
|
IllegalContinue: 'Illegal continue statement',
|
4737
4762
|
IllegalBreak: 'Illegal break statement',
|
4738
4763
|
IllegalReturn: 'Illegal return statement',
|
4764
|
+
IllegalYield: 'Unexpected token yield',
|
4739
4765
|
StrictModeWith: 'Strict mode code may not include a with statement',
|
4740
4766
|
StrictCatchVariable: 'Catch variable may not be eval or arguments in strict mode',
|
4741
4767
|
StrictVarName: 'Variable name may not be eval or arguments in strict mode',
|
@@ -4748,13 +4774,20 @@ define('logger', ['env!env/print'], function (print) {
|
|
4748
4774
|
StrictLHSPostfix: 'Postfix increment/decrement may not have eval or arguments operand in strict mode',
|
4749
4775
|
StrictLHSPrefix: 'Prefix increment/decrement may not have eval or arguments operand in strict mode',
|
4750
4776
|
StrictReservedWord: 'Use of future reserved word in strict mode',
|
4777
|
+
TemplateOctalLiteral: 'Octal literals are not allowed in template strings.',
|
4751
4778
|
ParameterAfterRestParameter: 'Rest parameter must be last formal parameter',
|
4752
4779
|
DefaultRestParameter: 'Unexpected token =',
|
4753
4780
|
ObjectPatternAsRestParameter: 'Unexpected token {',
|
4754
4781
|
DuplicateProtoProperty: 'Duplicate __proto__ fields are not allowed in object literals',
|
4755
4782
|
ConstructorSpecialMethod: 'Class constructor may not be an accessor',
|
4756
4783
|
DuplicateConstructor: 'A class may only have one constructor',
|
4757
|
-
StaticPrototype: 'Classes may not have static property named prototype'
|
4784
|
+
StaticPrototype: 'Classes may not have static property named prototype',
|
4785
|
+
MissingFromClause: 'Unexpected token',
|
4786
|
+
NoAsAfterImportNamespace: 'Unexpected token',
|
4787
|
+
InvalidModuleSpecifier: 'Unexpected token',
|
4788
|
+
IllegalImportDeclaration: 'Unexpected token',
|
4789
|
+
IllegalExportDeclaration: 'Unexpected token',
|
4790
|
+
DuplicateBinding: 'Duplicate binding %0'
|
4758
4791
|
};
|
4759
4792
|
|
4760
4793
|
// See also tools/generate-unicode-regex.py.
|
@@ -4787,6 +4820,28 @@ define('logger', ['env!env/print'], function (print) {
|
|
4787
4820
|
return '01234567'.indexOf(ch) >= 0;
|
4788
4821
|
}
|
4789
4822
|
|
4823
|
+
function octalToDecimal(ch) {
|
4824
|
+
// \0 is not octal escape sequence
|
4825
|
+
var octal = (ch !== '0'), code = '01234567'.indexOf(ch);
|
4826
|
+
|
4827
|
+
if (index < length && isOctalDigit(source[index])) {
|
4828
|
+
octal = true;
|
4829
|
+
code = code * 8 + '01234567'.indexOf(source[index++]);
|
4830
|
+
|
4831
|
+
// 3 digits are only allowed when string starts
|
4832
|
+
// with 0, 1, 2, 3
|
4833
|
+
if ('0123'.indexOf(ch) >= 0 &&
|
4834
|
+
index < length &&
|
4835
|
+
isOctalDigit(source[index])) {
|
4836
|
+
code = code * 8 + '01234567'.indexOf(source[index++]);
|
4837
|
+
}
|
4838
|
+
}
|
4839
|
+
|
4840
|
+
return {
|
4841
|
+
code: code,
|
4842
|
+
octal: octal
|
4843
|
+
};
|
4844
|
+
}
|
4790
4845
|
|
4791
4846
|
// 7.2 White Space
|
4792
4847
|
|
@@ -4860,9 +4915,6 @@ define('logger', ['env!env/print'], function (print) {
|
|
4860
4915
|
// 7.6.1.1 Keywords
|
4861
4916
|
|
4862
4917
|
function isKeyword(id) {
|
4863
|
-
if (strict && isStrictModeReservedWord(id)) {
|
4864
|
-
return true;
|
4865
|
-
}
|
4866
4918
|
|
4867
4919
|
// 'const' is specialized as Keyword in V8.
|
4868
4920
|
// 'yield' and 'let' are for compatibility with SpiderMonkey and ES.next.
|
@@ -5008,20 +5060,16 @@ define('logger', ['env!env/print'], function (print) {
|
|
5008
5060
|
}
|
5009
5061
|
}
|
5010
5062
|
|
5011
|
-
|
5012
|
-
|
5013
|
-
|
5014
|
-
|
5015
|
-
|
5016
|
-
|
5017
|
-
|
5018
|
-
|
5019
|
-
addComment('Block', comment, start, index, loc);
|
5020
|
-
}
|
5021
|
-
tolerateUnexpectedToken();
|
5022
|
-
} else {
|
5023
|
-
throwUnexpectedToken();
|
5063
|
+
// Ran off the end of the file - the whole thing is a comment
|
5064
|
+
if (extra.comments) {
|
5065
|
+
loc.end = {
|
5066
|
+
line: lineNumber,
|
5067
|
+
column: index - lineStart
|
5068
|
+
};
|
5069
|
+
comment = source.slice(start + 2, index);
|
5070
|
+
addComment('Block', comment, start, index, loc);
|
5024
5071
|
}
|
5072
|
+
tolerateUnexpectedToken();
|
5025
5073
|
}
|
5026
5074
|
|
5027
5075
|
function skipComment() {
|
@@ -5257,6 +5305,7 @@ define('logger', ['env!env/print'], function (print) {
|
|
5257
5305
|
if (extra.tokenize) {
|
5258
5306
|
extra.openCurlyToken = extra.tokens.length;
|
5259
5307
|
}
|
5308
|
+
state.curlyStack.push('{');
|
5260
5309
|
++index;
|
5261
5310
|
break;
|
5262
5311
|
|
@@ -5269,10 +5318,13 @@ define('logger', ['env!env/print'], function (print) {
|
|
5269
5318
|
}
|
5270
5319
|
break;
|
5271
5320
|
|
5321
|
+
case '}':
|
5322
|
+
++index;
|
5323
|
+
state.curlyStack.pop();
|
5324
|
+
break;
|
5272
5325
|
case ')':
|
5273
5326
|
case ';':
|
5274
5327
|
case ',':
|
5275
|
-
case '}':
|
5276
5328
|
case '[':
|
5277
5329
|
case ']':
|
5278
5330
|
case ':':
|
@@ -5531,7 +5583,7 @@ define('logger', ['env!env/print'], function (print) {
|
|
5531
5583
|
// 7.8.4 String Literals
|
5532
5584
|
|
5533
5585
|
function scanStringLiteral() {
|
5534
|
-
var str = '', quote, start, ch,
|
5586
|
+
var str = '', quote, start, ch, unescaped, octToDec, octal = false;
|
5535
5587
|
|
5536
5588
|
quote = source[index];
|
5537
5589
|
assert((quote === '\'' || quote === '"'),
|
@@ -5556,14 +5608,11 @@ define('logger', ['env!env/print'], function (print) {
|
|
5556
5608
|
++index;
|
5557
5609
|
str += scanUnicodeCodePointEscape();
|
5558
5610
|
} else {
|
5559
|
-
restore = index;
|
5560
5611
|
unescaped = scanHexEscape(ch);
|
5561
|
-
if (unescaped) {
|
5562
|
-
|
5563
|
-
} else {
|
5564
|
-
index = restore;
|
5565
|
-
str += ch;
|
5612
|
+
if (!unescaped) {
|
5613
|
+
throw throwUnexpectedToken();
|
5566
5614
|
}
|
5615
|
+
str += unescaped;
|
5567
5616
|
}
|
5568
5617
|
break;
|
5569
5618
|
case 'n':
|
@@ -5584,29 +5633,16 @@ define('logger', ['env!env/print'], function (print) {
|
|
5584
5633
|
case 'v':
|
5585
5634
|
str += '\x0B';
|
5586
5635
|
break;
|
5636
|
+
case '8':
|
5637
|
+
case '9':
|
5638
|
+
throw throwUnexpectedToken();
|
5587
5639
|
|
5588
5640
|
default:
|
5589
5641
|
if (isOctalDigit(ch)) {
|
5590
|
-
|
5591
|
-
|
5592
|
-
// \0 is not octal escape sequence
|
5593
|
-
if (code !== 0) {
|
5594
|
-
octal = true;
|
5595
|
-
}
|
5642
|
+
octToDec = octalToDecimal(ch);
|
5596
5643
|
|
5597
|
-
|
5598
|
-
|
5599
|
-
code = code * 8 + '01234567'.indexOf(source[index++]);
|
5600
|
-
|
5601
|
-
// 3 digits are only allowed when string starts
|
5602
|
-
// with 0, 1, 2, 3
|
5603
|
-
if ('0123'.indexOf(ch) >= 0 &&
|
5604
|
-
index < length &&
|
5605
|
-
isOctalDigit(source[index])) {
|
5606
|
-
code = code * 8 + '01234567'.indexOf(source[index++]);
|
5607
|
-
}
|
5608
|
-
}
|
5609
|
-
str += String.fromCharCode(code);
|
5644
|
+
octal = octToDec.octal || octal;
|
5645
|
+
str += String.fromCharCode(octToDec.code);
|
5610
5646
|
} else {
|
5611
5647
|
str += ch;
|
5612
5648
|
}
|
@@ -5641,26 +5677,161 @@ define('logger', ['env!env/print'], function (print) {
|
|
5641
5677
|
};
|
5642
5678
|
}
|
5643
5679
|
|
5680
|
+
function scanTemplate() {
|
5681
|
+
var cooked = '', ch, start, rawOffset, terminated, head, tail, restore, unescaped;
|
5682
|
+
|
5683
|
+
terminated = false;
|
5684
|
+
tail = false;
|
5685
|
+
start = index;
|
5686
|
+
head = (source[index] === '`');
|
5687
|
+
rawOffset = 2;
|
5688
|
+
|
5689
|
+
++index;
|
5690
|
+
|
5691
|
+
while (index < length) {
|
5692
|
+
ch = source[index++];
|
5693
|
+
if (ch === '`') {
|
5694
|
+
rawOffset = 1;
|
5695
|
+
tail = true;
|
5696
|
+
terminated = true;
|
5697
|
+
break;
|
5698
|
+
} else if (ch === '$') {
|
5699
|
+
if (source[index] === '{') {
|
5700
|
+
state.curlyStack.push('${');
|
5701
|
+
++index;
|
5702
|
+
terminated = true;
|
5703
|
+
break;
|
5704
|
+
}
|
5705
|
+
cooked += ch;
|
5706
|
+
} else if (ch === '\\') {
|
5707
|
+
ch = source[index++];
|
5708
|
+
if (!isLineTerminator(ch.charCodeAt(0))) {
|
5709
|
+
switch (ch) {
|
5710
|
+
case 'n':
|
5711
|
+
cooked += '\n';
|
5712
|
+
break;
|
5713
|
+
case 'r':
|
5714
|
+
cooked += '\r';
|
5715
|
+
break;
|
5716
|
+
case 't':
|
5717
|
+
cooked += '\t';
|
5718
|
+
break;
|
5719
|
+
case 'u':
|
5720
|
+
case 'x':
|
5721
|
+
if (source[index] === '{') {
|
5722
|
+
++index;
|
5723
|
+
cooked += scanUnicodeCodePointEscape();
|
5724
|
+
} else {
|
5725
|
+
restore = index;
|
5726
|
+
unescaped = scanHexEscape(ch);
|
5727
|
+
if (unescaped) {
|
5728
|
+
cooked += unescaped;
|
5729
|
+
} else {
|
5730
|
+
index = restore;
|
5731
|
+
cooked += ch;
|
5732
|
+
}
|
5733
|
+
}
|
5734
|
+
break;
|
5735
|
+
case 'b':
|
5736
|
+
cooked += '\b';
|
5737
|
+
break;
|
5738
|
+
case 'f':
|
5739
|
+
cooked += '\f';
|
5740
|
+
break;
|
5741
|
+
case 'v':
|
5742
|
+
cooked += '\v';
|
5743
|
+
break;
|
5744
|
+
|
5745
|
+
default:
|
5746
|
+
if (ch === '0') {
|
5747
|
+
if (isDecimalDigit(source.charCodeAt(index))) {
|
5748
|
+
// Illegal: \01 \02 and so on
|
5749
|
+
throwError(Messages.TemplateOctalLiteral);
|
5750
|
+
}
|
5751
|
+
cooked += '\0';
|
5752
|
+
} else if (isOctalDigit(ch)) {
|
5753
|
+
// Illegal: \1 \2
|
5754
|
+
throwError(Messages.TemplateOctalLiteral);
|
5755
|
+
} else {
|
5756
|
+
cooked += ch;
|
5757
|
+
}
|
5758
|
+
break;
|
5759
|
+
}
|
5760
|
+
} else {
|
5761
|
+
++lineNumber;
|
5762
|
+
if (ch === '\r' && source[index] === '\n') {
|
5763
|
+
++index;
|
5764
|
+
}
|
5765
|
+
lineStart = index;
|
5766
|
+
}
|
5767
|
+
} else if (isLineTerminator(ch.charCodeAt(0))) {
|
5768
|
+
++lineNumber;
|
5769
|
+
if (ch === '\r' && source[index] === '\n') {
|
5770
|
+
++index;
|
5771
|
+
}
|
5772
|
+
lineStart = index;
|
5773
|
+
cooked += '\n';
|
5774
|
+
} else {
|
5775
|
+
cooked += ch;
|
5776
|
+
}
|
5777
|
+
}
|
5778
|
+
|
5779
|
+
if (!terminated) {
|
5780
|
+
throwUnexpectedToken();
|
5781
|
+
}
|
5782
|
+
|
5783
|
+
if (!head) {
|
5784
|
+
state.curlyStack.pop();
|
5785
|
+
}
|
5786
|
+
|
5787
|
+
return {
|
5788
|
+
type: Token.Template,
|
5789
|
+
value: {
|
5790
|
+
cooked: cooked,
|
5791
|
+
raw: source.slice(start + 1, index - rawOffset)
|
5792
|
+
},
|
5793
|
+
head: head,
|
5794
|
+
tail: tail,
|
5795
|
+
lineNumber: lineNumber,
|
5796
|
+
lineStart: lineStart,
|
5797
|
+
start: start,
|
5798
|
+
end: index
|
5799
|
+
};
|
5800
|
+
}
|
5801
|
+
|
5644
5802
|
function testRegExp(pattern, flags) {
|
5645
|
-
|
5803
|
+
// The BMP character to use as a replacement for astral symbols when
|
5804
|
+
// translating an ES6 "u"-flagged pattern to an ES5-compatible
|
5805
|
+
// approximation.
|
5806
|
+
// Note: replacing with '\uFFFF' enables false positives in unlikely
|
5807
|
+
// scenarios. For example, `[\u{1044f}-\u{10440}]` is an invalid
|
5808
|
+
// pattern that would not be detected by this substitution.
|
5809
|
+
var astralSubstitute = '\uFFFF',
|
5810
|
+
tmp = pattern;
|
5646
5811
|
|
5647
5812
|
if (flags.indexOf('u') >= 0) {
|
5648
|
-
// Replace each astral symbol and every Unicode code point
|
5649
|
-
// escape sequence with a single ASCII symbol to avoid throwing on
|
5650
|
-
// regular expressions that are only valid in combination with the
|
5651
|
-
// `/u` flag.
|
5652
|
-
// Note: replacing with the ASCII symbol `x` might cause false
|
5653
|
-
// negatives in unlikely scenarios. For example, `[\u{61}-b]` is a
|
5654
|
-
// perfectly valid pattern that is equivalent to `[a-b]`, but it
|
5655
|
-
// would be replaced by `[x-b]` which throws an error.
|
5656
5813
|
tmp = tmp
|
5657
|
-
|
5658
|
-
|
5659
|
-
|
5814
|
+
// Replace every Unicode escape sequence with the equivalent
|
5815
|
+
// BMP character or a constant ASCII code point in the case of
|
5816
|
+
// astral symbols. (See the above note on `astralSubstitute`
|
5817
|
+
// for more information.)
|
5818
|
+
.replace(/\\u\{([0-9a-fA-F]+)\}|\\u([a-fA-F0-9]{4})/g, function ($0, $1, $2) {
|
5819
|
+
var codePoint = parseInt($1 || $2, 16);
|
5820
|
+
if (codePoint > 0x10FFFF) {
|
5821
|
+
throwUnexpectedToken(null, Messages.InvalidRegExp);
|
5660
5822
|
}
|
5661
|
-
|
5823
|
+
if (codePoint <= 0xFFFF) {
|
5824
|
+
return String.fromCharCode(codePoint);
|
5825
|
+
}
|
5826
|
+
return astralSubstitute;
|
5662
5827
|
})
|
5663
|
-
|
5828
|
+
// Replace each paired surrogate with a single ASCII symbol to
|
5829
|
+
// avoid throwing on regular expressions that are only valid in
|
5830
|
+
// combination with the "u" flag.
|
5831
|
+
.replace(
|
5832
|
+
/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,
|
5833
|
+
astralSubstitute
|
5834
|
+
);
|
5664
5835
|
}
|
5665
5836
|
|
5666
5837
|
// First, detect invalid regular expressions.
|
@@ -5926,7 +6097,7 @@ define('logger', ['env!env/print'], function (print) {
|
|
5926
6097
|
}
|
5927
6098
|
|
5928
6099
|
function advance() {
|
5929
|
-
var ch;
|
6100
|
+
var ch, token;
|
5930
6101
|
|
5931
6102
|
if (index >= length) {
|
5932
6103
|
return {
|
@@ -5941,7 +6112,11 @@ define('logger', ['env!env/print'], function (print) {
|
|
5941
6112
|
ch = source.charCodeAt(index);
|
5942
6113
|
|
5943
6114
|
if (isIdentifierStart(ch)) {
|
5944
|
-
|
6115
|
+
token = scanIdentifier();
|
6116
|
+
if (strict && isStrictModeReservedWord(token.value)) {
|
6117
|
+
token.type = Token.Keyword;
|
6118
|
+
}
|
6119
|
+
return token;
|
5945
6120
|
}
|
5946
6121
|
|
5947
6122
|
// Very common: ( and ) and ;
|
@@ -5954,7 +6129,6 @@ define('logger', ['env!env/print'], function (print) {
|
|
5954
6129
|
return scanStringLiteral();
|
5955
6130
|
}
|
5956
6131
|
|
5957
|
-
|
5958
6132
|
// Dot (.) U+002E can also start a floating-point number, hence the need
|
5959
6133
|
// to check the next character.
|
5960
6134
|
if (ch === 0x2E) {
|
@@ -5973,6 +6147,12 @@ define('logger', ['env!env/print'], function (print) {
|
|
5973
6147
|
return advanceSlash();
|
5974
6148
|
}
|
5975
6149
|
|
6150
|
+
// Template literals start with ` (U+0060) for template head
|
6151
|
+
// or } (U+007D) for template middle or template tail.
|
6152
|
+
if (ch === 0x60 || (ch === 0x7D && state.curlyStack[state.curlyStack.length - 1] === '${')) {
|
6153
|
+
return scanTemplate();
|
6154
|
+
}
|
6155
|
+
|
5976
6156
|
return scanPunctuator();
|
5977
6157
|
}
|
5978
6158
|
|
@@ -6121,17 +6301,25 @@ define('logger', ['env!env/print'], function (print) {
|
|
6121
6301
|
}
|
6122
6302
|
|
6123
6303
|
// Eating the stack.
|
6124
|
-
|
6125
|
-
|
6126
|
-
|
6127
|
-
last = bottomRight.pop();
|
6128
|
-
}
|
6304
|
+
while (last && last.range[0] >= this.range[0]) {
|
6305
|
+
lastChild = bottomRight.pop();
|
6306
|
+
last = bottomRight[bottomRight.length - 1];
|
6129
6307
|
}
|
6130
6308
|
|
6131
6309
|
if (lastChild) {
|
6132
|
-
if (lastChild.leadingComments
|
6133
|
-
|
6134
|
-
lastChild.leadingComments
|
6310
|
+
if (lastChild.leadingComments) {
|
6311
|
+
leadingComments = [];
|
6312
|
+
for (i = lastChild.leadingComments.length - 1; i >= 0; --i) {
|
6313
|
+
comment = lastChild.leadingComments[i];
|
6314
|
+
if (comment.range[1] <= this.range[0]) {
|
6315
|
+
leadingComments.unshift(comment);
|
6316
|
+
lastChild.leadingComments.splice(i, 1);
|
6317
|
+
}
|
6318
|
+
}
|
6319
|
+
|
6320
|
+
if (!lastChild.leadingComments.length) {
|
6321
|
+
lastChild.leadingComments = undefined;
|
6322
|
+
}
|
6135
6323
|
}
|
6136
6324
|
} else if (extra.leadingComments.length > 0) {
|
6137
6325
|
leadingComments = [];
|
@@ -6181,6 +6369,13 @@ define('logger', ['env!env/print'], function (print) {
|
|
6181
6369
|
return this;
|
6182
6370
|
},
|
6183
6371
|
|
6372
|
+
finishArrayPattern: function (elements) {
|
6373
|
+
this.type = Syntax.ArrayPattern;
|
6374
|
+
this.elements = elements;
|
6375
|
+
this.finish();
|
6376
|
+
return this;
|
6377
|
+
},
|
6378
|
+
|
6184
6379
|
finishArrowFunctionExpression: function (params, defaults, body, expression) {
|
6185
6380
|
this.type = Syntax.ArrowFunctionExpression;
|
6186
6381
|
this.id = null;
|
@@ -6202,6 +6397,14 @@ define('logger', ['env!env/print'], function (print) {
|
|
6202
6397
|
return this;
|
6203
6398
|
},
|
6204
6399
|
|
6400
|
+
finishAssignmentPattern: function (left, right) {
|
6401
|
+
this.type = Syntax.AssignmentPattern;
|
6402
|
+
this.left = left;
|
6403
|
+
this.right = right;
|
6404
|
+
this.finish();
|
6405
|
+
return this;
|
6406
|
+
},
|
6407
|
+
|
6205
6408
|
finishBinaryExpression: function (operator, left, right) {
|
6206
6409
|
this.type = (operator === '||' || operator === '&&') ? Syntax.LogicalExpression : Syntax.BinaryExpression;
|
6207
6410
|
this.operator = operator;
|
@@ -6319,6 +6522,15 @@ define('logger', ['env!env/print'], function (print) {
|
|
6319
6522
|
return this;
|
6320
6523
|
},
|
6321
6524
|
|
6525
|
+
finishForOfStatement: function (left, right, body) {
|
6526
|
+
this.type = Syntax.ForOfStatement;
|
6527
|
+
this.left = left;
|
6528
|
+
this.right = right;
|
6529
|
+
this.body = body;
|
6530
|
+
this.finish();
|
6531
|
+
return this;
|
6532
|
+
},
|
6533
|
+
|
6322
6534
|
finishForInStatement: function (left, right, body) {
|
6323
6535
|
this.type = Syntax.ForInStatement;
|
6324
6536
|
this.left = left;
|
@@ -6329,25 +6541,25 @@ define('logger', ['env!env/print'], function (print) {
|
|
6329
6541
|
return this;
|
6330
6542
|
},
|
6331
6543
|
|
6332
|
-
finishFunctionDeclaration: function (id, params, defaults, body) {
|
6544
|
+
finishFunctionDeclaration: function (id, params, defaults, body, generator) {
|
6333
6545
|
this.type = Syntax.FunctionDeclaration;
|
6334
6546
|
this.id = id;
|
6335
6547
|
this.params = params;
|
6336
6548
|
this.defaults = defaults;
|
6337
6549
|
this.body = body;
|
6338
|
-
this.generator =
|
6550
|
+
this.generator = generator;
|
6339
6551
|
this.expression = false;
|
6340
6552
|
this.finish();
|
6341
6553
|
return this;
|
6342
6554
|
},
|
6343
6555
|
|
6344
|
-
finishFunctionExpression: function (id, params, defaults, body) {
|
6556
|
+
finishFunctionExpression: function (id, params, defaults, body, generator) {
|
6345
6557
|
this.type = Syntax.FunctionExpression;
|
6346
6558
|
this.id = id;
|
6347
6559
|
this.params = params;
|
6348
6560
|
this.defaults = defaults;
|
6349
6561
|
this.body = body;
|
6350
|
-
this.generator =
|
6562
|
+
this.generator = generator;
|
6351
6563
|
this.expression = false;
|
6352
6564
|
this.finish();
|
6353
6565
|
return this;
|
@@ -6412,6 +6624,13 @@ define('logger', ['env!env/print'], function (print) {
|
|
6412
6624
|
return this;
|
6413
6625
|
},
|
6414
6626
|
|
6627
|
+
finishObjectPattern: function (properties) {
|
6628
|
+
this.type = Syntax.ObjectPattern;
|
6629
|
+
this.properties = properties;
|
6630
|
+
this.finish();
|
6631
|
+
return this;
|
6632
|
+
},
|
6633
|
+
|
6415
6634
|
finishPostfixExpression: function (operator, argument) {
|
6416
6635
|
this.type = Syntax.UpdateExpression;
|
6417
6636
|
this.operator = operator;
|
@@ -6424,6 +6643,10 @@ define('logger', ['env!env/print'], function (print) {
|
|
6424
6643
|
finishProgram: function (body) {
|
6425
6644
|
this.type = Syntax.Program;
|
6426
6645
|
this.body = body;
|
6646
|
+
if (sourceType === 'module') {
|
6647
|
+
// very restrictive for now
|
6648
|
+
this.sourceType = sourceType;
|
6649
|
+
}
|
6427
6650
|
this.finish();
|
6428
6651
|
return this;
|
6429
6652
|
},
|
@@ -6461,6 +6684,13 @@ define('logger', ['env!env/print'], function (print) {
|
|
6461
6684
|
return this;
|
6462
6685
|
},
|
6463
6686
|
|
6687
|
+
finishSpreadElement: function (argument) {
|
6688
|
+
this.type = Syntax.SpreadElement;
|
6689
|
+
this.argument = argument;
|
6690
|
+
this.finish();
|
6691
|
+
return this;
|
6692
|
+
},
|
6693
|
+
|
6464
6694
|
finishSwitchCase: function (test, consequent) {
|
6465
6695
|
this.type = Syntax.SwitchCase;
|
6466
6696
|
this.test = test;
|
@@ -6469,6 +6699,12 @@ define('logger', ['env!env/print'], function (print) {
|
|
6469
6699
|
return this;
|
6470
6700
|
},
|
6471
6701
|
|
6702
|
+
finishSuper: function () {
|
6703
|
+
this.type = Syntax.Super;
|
6704
|
+
this.finish();
|
6705
|
+
return this;
|
6706
|
+
},
|
6707
|
+
|
6472
6708
|
finishSwitchStatement: function (discriminant, cases) {
|
6473
6709
|
this.type = Syntax.SwitchStatement;
|
6474
6710
|
this.discriminant = discriminant;
|
@@ -6477,6 +6713,30 @@ define('logger', ['env!env/print'], function (print) {
|
|
6477
6713
|
return this;
|
6478
6714
|
},
|
6479
6715
|
|
6716
|
+
finishTaggedTemplateExpression: function (tag, quasi) {
|
6717
|
+
this.type = Syntax.TaggedTemplateExpression;
|
6718
|
+
this.tag = tag;
|
6719
|
+
this.quasi = quasi;
|
6720
|
+
this.finish();
|
6721
|
+
return this;
|
6722
|
+
},
|
6723
|
+
|
6724
|
+
finishTemplateElement: function (value, tail) {
|
6725
|
+
this.type = Syntax.TemplateElement;
|
6726
|
+
this.value = value;
|
6727
|
+
this.tail = tail;
|
6728
|
+
this.finish();
|
6729
|
+
return this;
|
6730
|
+
},
|
6731
|
+
|
6732
|
+
finishTemplateLiteral: function (quasis, expressions) {
|
6733
|
+
this.type = Syntax.TemplateLiteral;
|
6734
|
+
this.quasis = quasis;
|
6735
|
+
this.expressions = expressions;
|
6736
|
+
this.finish();
|
6737
|
+
return this;
|
6738
|
+
},
|
6739
|
+
|
6480
6740
|
finishThisExpression: function () {
|
6481
6741
|
this.type = Syntax.ThisExpression;
|
6482
6742
|
this.finish();
|
@@ -6548,6 +6808,75 @@ define('logger', ['env!env/print'], function (print) {
|
|
6548
6808
|
this.body = body;
|
6549
6809
|
this.finish();
|
6550
6810
|
return this;
|
6811
|
+
},
|
6812
|
+
|
6813
|
+
finishExportSpecifier: function (local, exported) {
|
6814
|
+
this.type = Syntax.ExportSpecifier;
|
6815
|
+
this.exported = exported || local;
|
6816
|
+
this.local = local;
|
6817
|
+
this.finish();
|
6818
|
+
return this;
|
6819
|
+
},
|
6820
|
+
|
6821
|
+
finishImportDefaultSpecifier: function (local) {
|
6822
|
+
this.type = Syntax.ImportDefaultSpecifier;
|
6823
|
+
this.local = local;
|
6824
|
+
this.finish();
|
6825
|
+
return this;
|
6826
|
+
},
|
6827
|
+
|
6828
|
+
finishImportNamespaceSpecifier: function (local) {
|
6829
|
+
this.type = Syntax.ImportNamespaceSpecifier;
|
6830
|
+
this.local = local;
|
6831
|
+
this.finish();
|
6832
|
+
return this;
|
6833
|
+
},
|
6834
|
+
|
6835
|
+
finishExportNamedDeclaration: function (declaration, specifiers, src) {
|
6836
|
+
this.type = Syntax.ExportNamedDeclaration;
|
6837
|
+
this.declaration = declaration;
|
6838
|
+
this.specifiers = specifiers;
|
6839
|
+
this.source = src;
|
6840
|
+
this.finish();
|
6841
|
+
return this;
|
6842
|
+
},
|
6843
|
+
|
6844
|
+
finishExportDefaultDeclaration: function (declaration) {
|
6845
|
+
this.type = Syntax.ExportDefaultDeclaration;
|
6846
|
+
this.declaration = declaration;
|
6847
|
+
this.finish();
|
6848
|
+
return this;
|
6849
|
+
},
|
6850
|
+
|
6851
|
+
finishExportAllDeclaration: function (src) {
|
6852
|
+
this.type = Syntax.ExportAllDeclaration;
|
6853
|
+
this.source = src;
|
6854
|
+
this.finish();
|
6855
|
+
return this;
|
6856
|
+
},
|
6857
|
+
|
6858
|
+
finishImportSpecifier: function (local, imported) {
|
6859
|
+
this.type = Syntax.ImportSpecifier;
|
6860
|
+
this.local = local || imported;
|
6861
|
+
this.imported = imported;
|
6862
|
+
this.finish();
|
6863
|
+
return this;
|
6864
|
+
},
|
6865
|
+
|
6866
|
+
finishImportDeclaration: function (specifiers, src) {
|
6867
|
+
this.type = Syntax.ImportDeclaration;
|
6868
|
+
this.specifiers = specifiers;
|
6869
|
+
this.source = src;
|
6870
|
+
this.finish();
|
6871
|
+
return this;
|
6872
|
+
},
|
6873
|
+
|
6874
|
+
finishYieldExpression: function (argument, delegate) {
|
6875
|
+
this.type = Syntax.YieldExpression;
|
6876
|
+
this.argument = argument;
|
6877
|
+
this.delegate = delegate;
|
6878
|
+
this.finish();
|
6879
|
+
return this;
|
6551
6880
|
}
|
6552
6881
|
};
|
6553
6882
|
|
@@ -6615,25 +6944,32 @@ define('logger', ['env!env/print'], function (print) {
|
|
6615
6944
|
// Throw an exception because of the token.
|
6616
6945
|
|
6617
6946
|
function unexpectedTokenError(token, message) {
|
6618
|
-
var msg = message || Messages.UnexpectedToken;
|
6619
|
-
|
6620
|
-
if (token
|
6621
|
-
|
6622
|
-
(token.type === Token.
|
6623
|
-
|
6624
|
-
|
6625
|
-
|
6626
|
-
|
6627
|
-
|
6628
|
-
|
6629
|
-
|
6630
|
-
|
6631
|
-
|
6947
|
+
var value, msg = message || Messages.UnexpectedToken;
|
6948
|
+
|
6949
|
+
if (token) {
|
6950
|
+
if (!message) {
|
6951
|
+
msg = (token.type === Token.EOF) ? Messages.UnexpectedEOS :
|
6952
|
+
(token.type === Token.Identifier) ? Messages.UnexpectedIdentifier :
|
6953
|
+
(token.type === Token.NumericLiteral) ? Messages.UnexpectedNumber :
|
6954
|
+
(token.type === Token.StringLiteral) ? Messages.UnexpectedString :
|
6955
|
+
(token.type === Token.Template) ? Messages.UnexpectedTemplate :
|
6956
|
+
Messages.UnexpectedToken;
|
6957
|
+
|
6958
|
+
if (token.type === Token.Keyword) {
|
6959
|
+
if (isFutureReservedWord(token.value)) {
|
6960
|
+
msg = Messages.UnexpectedReserved;
|
6961
|
+
} else if (strict && isStrictModeReservedWord(token.value)) {
|
6962
|
+
msg = Messages.StrictReservedWord;
|
6963
|
+
}
|
6632
6964
|
}
|
6633
6965
|
}
|
6966
|
+
|
6967
|
+
value = (token.type === Token.Template) ? token.value.raw : token.value;
|
6968
|
+
} else {
|
6969
|
+
value = 'ILLEGAL';
|
6634
6970
|
}
|
6635
6971
|
|
6636
|
-
msg = msg.replace('%0',
|
6972
|
+
msg = msg.replace('%0', value);
|
6637
6973
|
|
6638
6974
|
return (token && typeof token.lineNumber === 'number') ?
|
6639
6975
|
createError(token.lineNumber, token.start, msg) :
|
@@ -6709,6 +7045,13 @@ define('logger', ['env!env/print'], function (print) {
|
|
6709
7045
|
return lookahead.type === Token.Keyword && lookahead.value === keyword;
|
6710
7046
|
}
|
6711
7047
|
|
7048
|
+
// Return true if the next token matches the specified contextual keyword
|
7049
|
+
// (where an identifier is sometimes a keyword depending on the context)
|
7050
|
+
|
7051
|
+
function matchContextualKeyword(keyword) {
|
7052
|
+
return lookahead.type === Token.Identifier && lookahead.value === keyword;
|
7053
|
+
}
|
7054
|
+
|
6712
7055
|
// Return true if the next token is an assignment operator
|
6713
7056
|
|
6714
7057
|
function matchAssign() {
|
@@ -6753,17 +7096,72 @@ define('logger', ['env!env/print'], function (print) {
|
|
6753
7096
|
}
|
6754
7097
|
}
|
6755
7098
|
|
6756
|
-
//
|
6757
|
-
|
6758
|
-
|
6759
|
-
|
7099
|
+
// Cover grammar support.
|
7100
|
+
//
|
7101
|
+
// When an assignment expression position starts with an left parenthesis, the determination of the type
|
7102
|
+
// of the syntax is to be deferred arbitrarily long until the end of the parentheses pair (plus a lookahead)
|
7103
|
+
// or the first comma. This situation also defers the determination of all the expressions nested in the pair.
|
7104
|
+
//
|
7105
|
+
// There are three productions that can be parsed in a parentheses pair that needs to be determined
|
7106
|
+
// after the outermost pair is closed. They are:
|
7107
|
+
//
|
7108
|
+
// 1. AssignmentExpression
|
7109
|
+
// 2. BindingElements
|
7110
|
+
// 3. AssignmentTargets
|
7111
|
+
//
|
7112
|
+
// In order to avoid exponential backtracking, we use two flags to denote if the production can be
|
7113
|
+
// binding element or assignment target.
|
7114
|
+
//
|
7115
|
+
// The three productions have the relationship:
|
7116
|
+
//
|
7117
|
+
// BindingElements ⊆ AssignmentTargets ⊆ AssignmentExpression
|
7118
|
+
//
|
7119
|
+
// with a single exception that CoverInitializedName when used directly in an Expression, generates
|
7120
|
+
// an early error. Therefore, we need the third state, firstCoverInitializedNameError, to track the
|
7121
|
+
// first usage of CoverInitializedName and report it when we reached the end of the parentheses pair.
|
7122
|
+
//
|
7123
|
+
// isolateCoverGrammar function runs the given parser function with a new cover grammar context, and it does not
|
7124
|
+
// effect the current flags. This means the production the parser parses is only used as an expression. Therefore
|
7125
|
+
// the CoverInitializedName check is conducted.
|
7126
|
+
//
|
7127
|
+
// inheritCoverGrammar function runs the given parse function with a new cover grammar context, and it propagates
|
7128
|
+
// the flags outside of the parser. This means the production the parser parses is used as a part of a potential
|
7129
|
+
// pattern. The CoverInitializedName check is deferred.
|
7130
|
+
function isolateCoverGrammar(parser) {
|
7131
|
+
var oldIsBindingElement = isBindingElement,
|
7132
|
+
oldIsAssignmentTarget = isAssignmentTarget,
|
7133
|
+
oldFirstCoverInitializedNameError = firstCoverInitializedNameError,
|
7134
|
+
result;
|
7135
|
+
isBindingElement = true;
|
7136
|
+
isAssignmentTarget = true;
|
7137
|
+
firstCoverInitializedNameError = null;
|
7138
|
+
result = parser();
|
7139
|
+
if (firstCoverInitializedNameError !== null) {
|
7140
|
+
throwUnexpectedToken(firstCoverInitializedNameError);
|
7141
|
+
}
|
7142
|
+
isBindingElement = oldIsBindingElement;
|
7143
|
+
isAssignmentTarget = oldIsAssignmentTarget;
|
7144
|
+
firstCoverInitializedNameError = oldFirstCoverInitializedNameError;
|
7145
|
+
return result;
|
6760
7146
|
}
|
6761
7147
|
|
6762
|
-
|
6763
|
-
|
6764
|
-
|
6765
|
-
|
7148
|
+
function inheritCoverGrammar(parser) {
|
7149
|
+
var oldIsBindingElement = isBindingElement,
|
7150
|
+
oldIsAssignmentTarget = isAssignmentTarget,
|
7151
|
+
oldFirstCoverInitializedNameError = firstCoverInitializedNameError,
|
7152
|
+
result;
|
7153
|
+
isBindingElement = true;
|
7154
|
+
isAssignmentTarget = true;
|
7155
|
+
firstCoverInitializedNameError = null;
|
7156
|
+
result = parser();
|
7157
|
+
isBindingElement = isBindingElement && oldIsBindingElement;
|
7158
|
+
isAssignmentTarget = isAssignmentTarget && oldIsAssignmentTarget;
|
7159
|
+
firstCoverInitializedNameError = oldFirstCoverInitializedNameError || firstCoverInitializedNameError;
|
7160
|
+
return result;
|
7161
|
+
}
|
6766
7162
|
|
7163
|
+
function parseArrayPattern(params) {
|
7164
|
+
var node = new Node(), elements = [], rest, restNode;
|
6767
7165
|
expect('[');
|
6768
7166
|
|
6769
7167
|
while (!match(']')) {
|
@@ -6771,26 +7169,139 @@ define('logger', ['env!env/print'], function (print) {
|
|
6771
7169
|
lex();
|
6772
7170
|
elements.push(null);
|
6773
7171
|
} else {
|
6774
|
-
|
6775
|
-
|
7172
|
+
if (match('...')) {
|
7173
|
+
restNode = new Node();
|
7174
|
+
lex();
|
7175
|
+
params.push(lookahead);
|
7176
|
+
rest = parseVariableIdentifier(params);
|
7177
|
+
elements.push(restNode.finishRestElement(rest));
|
7178
|
+
break;
|
7179
|
+
} else {
|
7180
|
+
elements.push(parsePatternWithDefault(params));
|
7181
|
+
}
|
6776
7182
|
if (!match(']')) {
|
6777
7183
|
expect(',');
|
6778
7184
|
}
|
6779
7185
|
}
|
7186
|
+
|
6780
7187
|
}
|
6781
7188
|
|
6782
|
-
|
7189
|
+
expect(']');
|
6783
7190
|
|
6784
|
-
return node.
|
7191
|
+
return node.finishArrayPattern(elements);
|
6785
7192
|
}
|
6786
7193
|
|
6787
|
-
|
6788
|
-
|
6789
|
-
|
6790
|
-
|
7194
|
+
function parsePropertyPattern(params) {
|
7195
|
+
var node = new Node(), key, keyToken, computed = match('['), init;
|
7196
|
+
if (lookahead.type === Token.Identifier) {
|
7197
|
+
keyToken = lookahead;
|
7198
|
+
key = parseVariableIdentifier();
|
7199
|
+
if (match('=')) {
|
7200
|
+
params.push(keyToken);
|
7201
|
+
lex();
|
7202
|
+
init = parseAssignmentExpression();
|
7203
|
+
|
7204
|
+
return node.finishProperty(
|
7205
|
+
'init', key, false,
|
7206
|
+
new WrappingNode(keyToken).finishAssignmentPattern(key, init), false, false);
|
7207
|
+
} else if (!match(':')) {
|
7208
|
+
params.push(keyToken);
|
7209
|
+
return node.finishProperty('init', key, false, key, false, true);
|
7210
|
+
}
|
7211
|
+
} else {
|
7212
|
+
key = parseObjectPropertyKey(params);
|
7213
|
+
}
|
7214
|
+
expect(':');
|
7215
|
+
init = parsePatternWithDefault(params);
|
7216
|
+
return node.finishProperty('init', key, computed, init, false, false);
|
7217
|
+
}
|
7218
|
+
|
7219
|
+
function parseObjectPattern(params) {
|
7220
|
+
var node = new Node(), properties = [];
|
7221
|
+
|
7222
|
+
expect('{');
|
7223
|
+
|
7224
|
+
while (!match('}')) {
|
7225
|
+
properties.push(parsePropertyPattern(params));
|
7226
|
+
if (!match('}')) {
|
7227
|
+
expect(',');
|
7228
|
+
}
|
7229
|
+
}
|
7230
|
+
|
7231
|
+
lex();
|
7232
|
+
|
7233
|
+
return node.finishObjectPattern(properties);
|
7234
|
+
}
|
7235
|
+
|
7236
|
+
function parsePattern(params) {
|
7237
|
+
var identifier;
|
7238
|
+
if (lookahead.type === Token.Identifier) {
|
7239
|
+
params.push(lookahead);
|
7240
|
+
identifier = parseVariableIdentifier();
|
7241
|
+
return identifier;
|
7242
|
+
} else if (match('[')) {
|
7243
|
+
return parseArrayPattern(params);
|
7244
|
+
} else if (match('{')) {
|
7245
|
+
return parseObjectPattern(params);
|
7246
|
+
}
|
7247
|
+
throwUnexpectedToken(lookahead);
|
7248
|
+
}
|
7249
|
+
|
7250
|
+
function parsePatternWithDefault(params) {
|
7251
|
+
var startToken = lookahead, pattern, right;
|
7252
|
+
pattern = parsePattern(params);
|
7253
|
+
if (match('=')) {
|
7254
|
+
lex();
|
7255
|
+
right = isolateCoverGrammar(parseAssignmentExpression);
|
7256
|
+
pattern = new WrappingNode(startToken).finishAssignmentPattern(pattern, right);
|
7257
|
+
}
|
7258
|
+
return pattern;
|
7259
|
+
}
|
7260
|
+
|
7261
|
+
// 11.1.4 Array Initialiser
|
7262
|
+
|
7263
|
+
function parseArrayInitialiser() {
|
7264
|
+
var elements = [], node = new Node(), restSpread;
|
7265
|
+
|
7266
|
+
expect('[');
|
7267
|
+
|
7268
|
+
while (!match(']')) {
|
7269
|
+
if (match(',')) {
|
7270
|
+
lex();
|
7271
|
+
elements.push(null);
|
7272
|
+
} else if (match('...')) {
|
7273
|
+
restSpread = new Node();
|
7274
|
+
lex();
|
7275
|
+
restSpread.finishSpreadElement(inheritCoverGrammar(parseAssignmentExpression));
|
7276
|
+
|
7277
|
+
if (!match(']')) {
|
7278
|
+
isAssignmentTarget = isBindingElement = false;
|
7279
|
+
expect(',');
|
7280
|
+
}
|
7281
|
+
elements.push(restSpread);
|
7282
|
+
} else {
|
7283
|
+
elements.push(inheritCoverGrammar(parseAssignmentExpression));
|
7284
|
+
|
7285
|
+
if (!match(']')) {
|
7286
|
+
expect(',');
|
7287
|
+
}
|
7288
|
+
}
|
7289
|
+
}
|
7290
|
+
|
7291
|
+
lex();
|
7292
|
+
|
7293
|
+
return node.finishArrayExpression(elements);
|
7294
|
+
}
|
7295
|
+
|
7296
|
+
// 11.1.5 Object Initialiser
|
7297
|
+
|
7298
|
+
function parsePropertyFunction(node, paramInfo, isGenerator) {
|
7299
|
+
var previousStrict, body;
|
7300
|
+
|
7301
|
+
isAssignmentTarget = isBindingElement = false;
|
6791
7302
|
|
6792
7303
|
previousStrict = strict;
|
6793
|
-
body = parseFunctionSourceElements
|
7304
|
+
body = isolateCoverGrammar(parseFunctionSourceElements);
|
6794
7305
|
|
6795
7306
|
if (strict && paramInfo.firstRestricted) {
|
6796
7307
|
tolerateUnexpectedToken(paramInfo.firstRestricted, paramInfo.message);
|
@@ -6800,20 +7311,24 @@ define('logger', ['env!env/print'], function (print) {
|
|
6800
7311
|
}
|
6801
7312
|
|
6802
7313
|
strict = previousStrict;
|
6803
|
-
return node.finishFunctionExpression(null, paramInfo.params, paramInfo.defaults, body);
|
7314
|
+
return node.finishFunctionExpression(null, paramInfo.params, paramInfo.defaults, body, isGenerator);
|
6804
7315
|
}
|
6805
7316
|
|
6806
7317
|
function parsePropertyMethodFunction() {
|
6807
|
-
var params, method, node = new Node()
|
7318
|
+
var params, method, node = new Node(),
|
7319
|
+
previousAllowYield = state.allowYield;
|
6808
7320
|
|
7321
|
+
state.allowYield = false;
|
6809
7322
|
params = parseParams();
|
6810
|
-
|
7323
|
+
state.allowYield = previousAllowYield;
|
7324
|
+
|
7325
|
+
state.allowYield = false;
|
7326
|
+
method = parsePropertyFunction(node, params, false);
|
7327
|
+
state.allowYield = previousAllowYield;
|
6811
7328
|
|
6812
7329
|
return method;
|
6813
7330
|
}
|
6814
7331
|
|
6815
|
-
// This function returns a tuple `[PropertyName, boolean]` where the PropertyName is the key being consumed and the second
|
6816
|
-
// element indicate whether its a computed PropertyName or a static PropertyName.
|
6817
7332
|
function parseObjectPropertyKey() {
|
6818
7333
|
var token, node = new Node(), expr;
|
6819
7334
|
|
@@ -6836,7 +7351,7 @@ define('logger', ['env!env/print'], function (print) {
|
|
6836
7351
|
return node.finishIdentifier(token.value);
|
6837
7352
|
case Token.Punctuator:
|
6838
7353
|
if (token.value === '[') {
|
6839
|
-
expr = parseAssignmentExpression
|
7354
|
+
expr = isolateCoverGrammar(parseAssignmentExpression);
|
6840
7355
|
expect(']');
|
6841
7356
|
return expr;
|
6842
7357
|
}
|
@@ -6867,7 +7382,8 @@ define('logger', ['env!env/print'], function (print) {
|
|
6867
7382
|
// In order to avoid back tracking, it returns `null` if the position is not a MethodDefinition and the caller
|
6868
7383
|
// is responsible to visit other options.
|
6869
7384
|
function tryParseMethodDefinition(token, key, computed, node) {
|
6870
|
-
var value, options, methodNode
|
7385
|
+
var value, options, methodNode, params,
|
7386
|
+
previousAllowYield = state.allowYield;
|
6871
7387
|
|
6872
7388
|
if (token.type === Token.Identifier) {
|
6873
7389
|
// check for `get` and `set`;
|
@@ -6878,13 +7394,17 @@ define('logger', ['env!env/print'], function (print) {
|
|
6878
7394
|
methodNode = new Node();
|
6879
7395
|
expect('(');
|
6880
7396
|
expect(')');
|
7397
|
+
|
7398
|
+
state.allowYield = false;
|
6881
7399
|
value = parsePropertyFunction(methodNode, {
|
6882
7400
|
params: [],
|
6883
7401
|
defaults: [],
|
6884
7402
|
stricted: null,
|
6885
7403
|
firstRestricted: null,
|
6886
7404
|
message: null
|
6887
|
-
});
|
7405
|
+
}, false);
|
7406
|
+
state.allowYield = previousAllowYield;
|
7407
|
+
|
6888
7408
|
return node.finishProperty('get', key, computed, value, false, false);
|
6889
7409
|
} else if (token.value === 'set' && lookaheadPropertyName()) {
|
6890
7410
|
computed = match('[');
|
@@ -6902,19 +7422,38 @@ define('logger', ['env!env/print'], function (print) {
|
|
6902
7422
|
if (match(')')) {
|
6903
7423
|
tolerateUnexpectedToken(lookahead);
|
6904
7424
|
} else {
|
7425
|
+
state.allowYield = false;
|
6905
7426
|
parseParam(options);
|
7427
|
+
state.allowYield = previousAllowYield;
|
6906
7428
|
if (options.defaultCount === 0) {
|
6907
7429
|
options.defaults = [];
|
6908
7430
|
}
|
6909
7431
|
}
|
6910
7432
|
expect(')');
|
6911
7433
|
|
6912
|
-
|
7434
|
+
state.allowYield = false;
|
7435
|
+
value = parsePropertyFunction(methodNode, options, false);
|
7436
|
+
state.allowYield = previousAllowYield;
|
7437
|
+
|
6913
7438
|
return node.finishProperty('set', key, computed, value, false, false);
|
6914
7439
|
}
|
7440
|
+
} else if (token.type === Token.Punctuator && token.value === '*' && lookaheadPropertyName()) {
|
7441
|
+
computed = match('[');
|
7442
|
+
key = parseObjectPropertyKey();
|
7443
|
+
methodNode = new Node();
|
7444
|
+
|
7445
|
+
state.allowYield = false;
|
7446
|
+
params = parseParams();
|
7447
|
+
state.allowYield = previousAllowYield;
|
7448
|
+
|
7449
|
+
state.allowYield = true;
|
7450
|
+
value = parsePropertyFunction(methodNode, params, true);
|
7451
|
+
state.allowYield = previousAllowYield;
|
7452
|
+
|
7453
|
+
return node.finishProperty('init', key, computed, value, true, false);
|
6915
7454
|
}
|
6916
7455
|
|
6917
|
-
if (match('(')) {
|
7456
|
+
if (key && match('(')) {
|
6918
7457
|
value = parsePropertyMethodFunction();
|
6919
7458
|
return node.finishProperty('init', key, computed, value, true, false);
|
6920
7459
|
}
|
@@ -6938,7 +7477,11 @@ define('logger', ['env!env/print'], function (print) {
|
|
6938
7477
|
var token = lookahead, node = new Node(), computed, key, maybeMethod, value;
|
6939
7478
|
|
6940
7479
|
computed = match('[');
|
6941
|
-
|
7480
|
+
if (match('*')) {
|
7481
|
+
lex();
|
7482
|
+
} else {
|
7483
|
+
key = parseObjectPropertyKey();
|
7484
|
+
}
|
6942
7485
|
maybeMethod = tryParseMethodDefinition(token, key, computed, node);
|
6943
7486
|
|
6944
7487
|
if (maybeMethod) {
|
@@ -6947,16 +7490,27 @@ define('logger', ['env!env/print'], function (print) {
|
|
6947
7490
|
return maybeMethod;
|
6948
7491
|
}
|
6949
7492
|
|
7493
|
+
if (!key) {
|
7494
|
+
throwUnexpectedToken(lookahead);
|
7495
|
+
}
|
7496
|
+
|
6950
7497
|
// init property or short hand property.
|
6951
7498
|
checkProto(key, computed, hasProto);
|
6952
7499
|
|
6953
7500
|
if (match(':')) {
|
6954
7501
|
lex();
|
6955
|
-
value = parseAssignmentExpression
|
7502
|
+
value = inheritCoverGrammar(parseAssignmentExpression);
|
6956
7503
|
return node.finishProperty('init', key, computed, value, false, false);
|
6957
7504
|
}
|
6958
7505
|
|
6959
7506
|
if (token.type === Token.Identifier) {
|
7507
|
+
if (match('=')) {
|
7508
|
+
firstCoverInitializedNameError = lookahead;
|
7509
|
+
lex();
|
7510
|
+
value = isolateCoverGrammar(parseAssignmentExpression);
|
7511
|
+
return node.finishProperty('init', key, computed,
|
7512
|
+
new WrappingNode(token).finishAssignmentPattern(key, value), false, true);
|
7513
|
+
}
|
6960
7514
|
return node.finishProperty('init', key, computed, key, false, true);
|
6961
7515
|
}
|
6962
7516
|
|
@@ -6981,10 +7535,75 @@ define('logger', ['env!env/print'], function (print) {
|
|
6981
7535
|
return node.finishObjectExpression(properties);
|
6982
7536
|
}
|
6983
7537
|
|
7538
|
+
function reinterpretExpressionAsPattern(expr) {
|
7539
|
+
var i;
|
7540
|
+
switch (expr.type) {
|
7541
|
+
case Syntax.Identifier:
|
7542
|
+
case Syntax.MemberExpression:
|
7543
|
+
case Syntax.RestElement:
|
7544
|
+
case Syntax.AssignmentPattern:
|
7545
|
+
break;
|
7546
|
+
case Syntax.SpreadElement:
|
7547
|
+
expr.type = Syntax.RestElement;
|
7548
|
+
reinterpretExpressionAsPattern(expr.argument);
|
7549
|
+
break;
|
7550
|
+
case Syntax.ArrayExpression:
|
7551
|
+
expr.type = Syntax.ArrayPattern;
|
7552
|
+
for (i = 0; i < expr.elements.length; i++) {
|
7553
|
+
if (expr.elements[i] !== null) {
|
7554
|
+
reinterpretExpressionAsPattern(expr.elements[i]);
|
7555
|
+
}
|
7556
|
+
}
|
7557
|
+
break;
|
7558
|
+
case Syntax.ObjectExpression:
|
7559
|
+
expr.type = Syntax.ObjectPattern;
|
7560
|
+
for (i = 0; i < expr.properties.length; i++) {
|
7561
|
+
reinterpretExpressionAsPattern(expr.properties[i].value);
|
7562
|
+
}
|
7563
|
+
break;
|
7564
|
+
case Syntax.AssignmentExpression:
|
7565
|
+
expr.type = Syntax.AssignmentPattern;
|
7566
|
+
reinterpretExpressionAsPattern(expr.left);
|
7567
|
+
break;
|
7568
|
+
default:
|
7569
|
+
// Allow other node type for tolerant parsing.
|
7570
|
+
break;
|
7571
|
+
}
|
7572
|
+
}
|
7573
|
+
|
7574
|
+
function parseTemplateElement(option) {
|
7575
|
+
var node, token;
|
7576
|
+
|
7577
|
+
if (lookahead.type !== Token.Template || (option.head && !lookahead.head)) {
|
7578
|
+
throwUnexpectedToken();
|
7579
|
+
}
|
7580
|
+
|
7581
|
+
node = new Node();
|
7582
|
+
token = lex();
|
7583
|
+
|
7584
|
+
return node.finishTemplateElement({ raw: token.value.raw, cooked: token.value.cooked }, token.tail);
|
7585
|
+
}
|
7586
|
+
|
7587
|
+
function parseTemplateLiteral() {
|
7588
|
+
var quasi, quasis, expressions, node = new Node();
|
7589
|
+
|
7590
|
+
quasi = parseTemplateElement({ head: true });
|
7591
|
+
quasis = [ quasi ];
|
7592
|
+
expressions = [];
|
7593
|
+
|
7594
|
+
while (!quasi.tail) {
|
7595
|
+
expressions.push(parseExpression());
|
7596
|
+
quasi = parseTemplateElement({ head: false });
|
7597
|
+
quasis.push(quasi);
|
7598
|
+
}
|
7599
|
+
|
7600
|
+
return node.finishTemplateLiteral(quasis, expressions);
|
7601
|
+
}
|
7602
|
+
|
6984
7603
|
// 11.1.6 The Grouping Operator
|
6985
7604
|
|
6986
7605
|
function parseGroupExpression() {
|
6987
|
-
var expr, expressions, startToken,
|
7606
|
+
var expr, expressions, startToken, i, params = [];
|
6988
7607
|
|
6989
7608
|
expect('(');
|
6990
7609
|
|
@@ -6995,13 +7614,14 @@ define('logger', ['env!env/print'], function (print) {
|
|
6995
7614
|
}
|
6996
7615
|
return {
|
6997
7616
|
type: PlaceHolders.ArrowParameterPlaceHolder,
|
6998
|
-
params: []
|
7617
|
+
params: [],
|
7618
|
+
rawParams: []
|
6999
7619
|
};
|
7000
7620
|
}
|
7001
7621
|
|
7002
7622
|
startToken = lookahead;
|
7003
7623
|
if (match('...')) {
|
7004
|
-
expr = parseRestElement();
|
7624
|
+
expr = parseRestElement(params);
|
7005
7625
|
expect(')');
|
7006
7626
|
if (!match('=>')) {
|
7007
7627
|
expect('=>');
|
@@ -7012,13 +7632,11 @@ define('logger', ['env!env/print'], function (print) {
|
|
7012
7632
|
};
|
7013
7633
|
}
|
7014
7634
|
|
7015
|
-
|
7016
|
-
|
7017
|
-
}
|
7018
|
-
|
7019
|
-
expr = parseAssignmentExpression();
|
7635
|
+
isBindingElement = true;
|
7636
|
+
expr = inheritCoverGrammar(parseAssignmentExpression);
|
7020
7637
|
|
7021
7638
|
if (match(',')) {
|
7639
|
+
isAssignmentTarget = false;
|
7022
7640
|
expressions = [expr];
|
7023
7641
|
|
7024
7642
|
while (startIndex < length) {
|
@@ -7028,23 +7646,25 @@ define('logger', ['env!env/print'], function (print) {
|
|
7028
7646
|
lex();
|
7029
7647
|
|
7030
7648
|
if (match('...')) {
|
7031
|
-
if (!
|
7649
|
+
if (!isBindingElement) {
|
7032
7650
|
throwUnexpectedToken(lookahead);
|
7033
7651
|
}
|
7034
|
-
expressions.push(parseRestElement());
|
7652
|
+
expressions.push(parseRestElement(params));
|
7035
7653
|
expect(')');
|
7036
7654
|
if (!match('=>')) {
|
7037
7655
|
expect('=>');
|
7038
7656
|
}
|
7657
|
+
isBindingElement = false;
|
7658
|
+
for (i = 0; i < expressions.length; i++) {
|
7659
|
+
reinterpretExpressionAsPattern(expressions[i]);
|
7660
|
+
}
|
7039
7661
|
return {
|
7040
7662
|
type: PlaceHolders.ArrowParameterPlaceHolder,
|
7041
7663
|
params: expressions
|
7042
7664
|
};
|
7043
|
-
} else if (match('(')) {
|
7044
|
-
isValidArrowParameter = false;
|
7045
7665
|
}
|
7046
7666
|
|
7047
|
-
expressions.push(parseAssignmentExpression
|
7667
|
+
expressions.push(inheritCoverGrammar(parseAssignmentExpression));
|
7048
7668
|
}
|
7049
7669
|
|
7050
7670
|
expr = new WrappingNode(startToken).finishSequenceExpression(expressions);
|
@@ -7053,10 +7673,25 @@ define('logger', ['env!env/print'], function (print) {
|
|
7053
7673
|
|
7054
7674
|
expect(')');
|
7055
7675
|
|
7056
|
-
if (match('=>')
|
7057
|
-
|
7058
|
-
|
7676
|
+
if (match('=>')) {
|
7677
|
+
if (!isBindingElement) {
|
7678
|
+
throwUnexpectedToken(lookahead);
|
7679
|
+
}
|
7059
7680
|
|
7681
|
+
if (expr.type === Syntax.SequenceExpression) {
|
7682
|
+
for (i = 0; i < expr.expressions.length; i++) {
|
7683
|
+
reinterpretExpressionAsPattern(expr.expressions[i]);
|
7684
|
+
}
|
7685
|
+
} else {
|
7686
|
+
reinterpretExpressionAsPattern(expr);
|
7687
|
+
}
|
7688
|
+
|
7689
|
+
expr = {
|
7690
|
+
type: PlaceHolders.ArrowParameterPlaceHolder,
|
7691
|
+
params: expr.type === Syntax.SequenceExpression ? expr.expressions : [expr]
|
7692
|
+
};
|
7693
|
+
}
|
7694
|
+
isBindingElement = false;
|
7060
7695
|
return expr;
|
7061
7696
|
}
|
7062
7697
|
|
@@ -7067,15 +7702,16 @@ define('logger', ['env!env/print'], function (print) {
|
|
7067
7702
|
var type, token, expr, node;
|
7068
7703
|
|
7069
7704
|
if (match('(')) {
|
7070
|
-
|
7705
|
+
isBindingElement = false;
|
7706
|
+
return inheritCoverGrammar(parseGroupExpression);
|
7071
7707
|
}
|
7072
7708
|
|
7073
7709
|
if (match('[')) {
|
7074
|
-
return parseArrayInitialiser
|
7710
|
+
return inheritCoverGrammar(parseArrayInitialiser);
|
7075
7711
|
}
|
7076
7712
|
|
7077
7713
|
if (match('{')) {
|
7078
|
-
return parseObjectInitialiser
|
7714
|
+
return inheritCoverGrammar(parseObjectInitialiser);
|
7079
7715
|
}
|
7080
7716
|
|
7081
7717
|
type = lookahead.type;
|
@@ -7084,11 +7720,13 @@ define('logger', ['env!env/print'], function (print) {
|
|
7084
7720
|
if (type === Token.Identifier) {
|
7085
7721
|
expr = node.finishIdentifier(lex().value);
|
7086
7722
|
} else if (type === Token.StringLiteral || type === Token.NumericLiteral) {
|
7723
|
+
isAssignmentTarget = isBindingElement = false;
|
7087
7724
|
if (strict && lookahead.octal) {
|
7088
7725
|
tolerateUnexpectedToken(lookahead, Messages.StrictOctalLiteral);
|
7089
7726
|
}
|
7090
7727
|
expr = node.finishLiteral(lex());
|
7091
7728
|
} else if (type === Token.Keyword) {
|
7729
|
+
isAssignmentTarget = isBindingElement = false;
|
7092
7730
|
if (matchKeyword('function')) {
|
7093
7731
|
return parseFunctionExpression();
|
7094
7732
|
}
|
@@ -7101,14 +7739,17 @@ define('logger', ['env!env/print'], function (print) {
|
|
7101
7739
|
}
|
7102
7740
|
throwUnexpectedToken(lex());
|
7103
7741
|
} else if (type === Token.BooleanLiteral) {
|
7742
|
+
isAssignmentTarget = isBindingElement = false;
|
7104
7743
|
token = lex();
|
7105
7744
|
token.value = (token.value === 'true');
|
7106
7745
|
expr = node.finishLiteral(token);
|
7107
7746
|
} else if (type === Token.NullLiteral) {
|
7747
|
+
isAssignmentTarget = isBindingElement = false;
|
7108
7748
|
token = lex();
|
7109
7749
|
token.value = null;
|
7110
7750
|
expr = node.finishLiteral(token);
|
7111
7751
|
} else if (match('/') || match('/=')) {
|
7752
|
+
isAssignmentTarget = isBindingElement = false;
|
7112
7753
|
index = startIndex;
|
7113
7754
|
|
7114
7755
|
if (typeof extra.tokens !== 'undefined') {
|
@@ -7118,6 +7759,8 @@ define('logger', ['env!env/print'], function (print) {
|
|
7118
7759
|
}
|
7119
7760
|
lex();
|
7120
7761
|
expr = node.finishLiteral(token);
|
7762
|
+
} else if (type === Token.Template) {
|
7763
|
+
expr = parseTemplateLiteral();
|
7121
7764
|
} else {
|
7122
7765
|
throwUnexpectedToken(lex());
|
7123
7766
|
}
|
@@ -7128,13 +7771,20 @@ define('logger', ['env!env/print'], function (print) {
|
|
7128
7771
|
// 11.2 Left-Hand-Side Expressions
|
7129
7772
|
|
7130
7773
|
function parseArguments() {
|
7131
|
-
var args = [];
|
7774
|
+
var args = [], expr;
|
7132
7775
|
|
7133
7776
|
expect('(');
|
7134
7777
|
|
7135
7778
|
if (!match(')')) {
|
7136
7779
|
while (startIndex < length) {
|
7137
|
-
|
7780
|
+
if (match('...')) {
|
7781
|
+
expr = new Node();
|
7782
|
+
lex();
|
7783
|
+
expr.finishSpreadElement(isolateCoverGrammar(parseAssignmentExpression));
|
7784
|
+
} else {
|
7785
|
+
expr = isolateCoverGrammar(parseAssignmentExpression);
|
7786
|
+
}
|
7787
|
+
args.push(expr);
|
7138
7788
|
if (match(')')) {
|
7139
7789
|
break;
|
7140
7790
|
}
|
@@ -7170,7 +7820,7 @@ define('logger', ['env!env/print'], function (print) {
|
|
7170
7820
|
|
7171
7821
|
expect('[');
|
7172
7822
|
|
7173
|
-
expr = parseExpression
|
7823
|
+
expr = isolateCoverGrammar(parseExpression);
|
7174
7824
|
|
7175
7825
|
expect(']');
|
7176
7826
|
|
@@ -7181,29 +7831,50 @@ define('logger', ['env!env/print'], function (print) {
|
|
7181
7831
|
var callee, args, node = new Node();
|
7182
7832
|
|
7183
7833
|
expectKeyword('new');
|
7184
|
-
callee = parseLeftHandSideExpression
|
7834
|
+
callee = isolateCoverGrammar(parseLeftHandSideExpression);
|
7185
7835
|
args = match('(') ? parseArguments() : [];
|
7186
7836
|
|
7837
|
+
isAssignmentTarget = isBindingElement = false;
|
7838
|
+
|
7187
7839
|
return node.finishNewExpression(callee, args);
|
7188
7840
|
}
|
7189
7841
|
|
7190
7842
|
function parseLeftHandSideExpressionAllowCall() {
|
7191
|
-
var expr, args, property, startToken, previousAllowIn = state.allowIn;
|
7843
|
+
var quasi, expr, args, property, startToken, previousAllowIn = state.allowIn;
|
7192
7844
|
|
7193
7845
|
startToken = lookahead;
|
7194
7846
|
state.allowIn = true;
|
7195
|
-
|
7847
|
+
|
7848
|
+
if (matchKeyword('super') && state.inFunctionBody) {
|
7849
|
+
expr = new Node();
|
7850
|
+
lex();
|
7851
|
+
expr = expr.finishSuper();
|
7852
|
+
if (!match('(') && !match('.') && !match('[')) {
|
7853
|
+
throwUnexpectedToken(lookahead);
|
7854
|
+
}
|
7855
|
+
} else {
|
7856
|
+
expr = inheritCoverGrammar(matchKeyword('new') ? parseNewExpression : parsePrimaryExpression);
|
7857
|
+
}
|
7196
7858
|
|
7197
7859
|
for (;;) {
|
7198
7860
|
if (match('.')) {
|
7861
|
+
isBindingElement = false;
|
7862
|
+
isAssignmentTarget = true;
|
7199
7863
|
property = parseNonComputedMember();
|
7200
7864
|
expr = new WrappingNode(startToken).finishMemberExpression('.', expr, property);
|
7201
7865
|
} else if (match('(')) {
|
7866
|
+
isBindingElement = false;
|
7867
|
+
isAssignmentTarget = false;
|
7202
7868
|
args = parseArguments();
|
7203
7869
|
expr = new WrappingNode(startToken).finishCallExpression(expr, args);
|
7204
7870
|
} else if (match('[')) {
|
7871
|
+
isBindingElement = false;
|
7872
|
+
isAssignmentTarget = true;
|
7205
7873
|
property = parseComputedMember();
|
7206
7874
|
expr = new WrappingNode(startToken).finishMemberExpression('[', expr, property);
|
7875
|
+
} else if (lookahead.type === Token.Template && lookahead.head) {
|
7876
|
+
quasi = parseTemplateLiteral();
|
7877
|
+
expr = new WrappingNode(startToken).finishTaggedTemplateExpression(expr, quasi);
|
7207
7878
|
} else {
|
7208
7879
|
break;
|
7209
7880
|
}
|
@@ -7214,20 +7885,36 @@ define('logger', ['env!env/print'], function (print) {
|
|
7214
7885
|
}
|
7215
7886
|
|
7216
7887
|
function parseLeftHandSideExpression() {
|
7217
|
-
var expr, property, startToken;
|
7888
|
+
var quasi, expr, property, startToken;
|
7218
7889
|
assert(state.allowIn, 'callee of new expression always allow in keyword.');
|
7219
7890
|
|
7220
7891
|
startToken = lookahead;
|
7221
7892
|
|
7222
|
-
|
7893
|
+
if (matchKeyword('super') && state.inFunctionBody) {
|
7894
|
+
expr = new Node();
|
7895
|
+
lex();
|
7896
|
+
expr = expr.finishSuper();
|
7897
|
+
if (!match('[') && !match('.')) {
|
7898
|
+
throwUnexpectedToken(lookahead);
|
7899
|
+
}
|
7900
|
+
} else {
|
7901
|
+
expr = inheritCoverGrammar(matchKeyword('new') ? parseNewExpression : parsePrimaryExpression);
|
7902
|
+
}
|
7223
7903
|
|
7224
7904
|
for (;;) {
|
7225
7905
|
if (match('[')) {
|
7906
|
+
isBindingElement = false;
|
7907
|
+
isAssignmentTarget = true;
|
7226
7908
|
property = parseComputedMember();
|
7227
7909
|
expr = new WrappingNode(startToken).finishMemberExpression('[', expr, property);
|
7228
7910
|
} else if (match('.')) {
|
7911
|
+
isBindingElement = false;
|
7912
|
+
isAssignmentTarget = true;
|
7229
7913
|
property = parseNonComputedMember();
|
7230
7914
|
expr = new WrappingNode(startToken).finishMemberExpression('.', expr, property);
|
7915
|
+
} else if (lookahead.type === Token.Template && lookahead.head) {
|
7916
|
+
quasi = parseTemplateLiteral();
|
7917
|
+
expr = new WrappingNode(startToken).finishTaggedTemplateExpression(expr, quasi);
|
7231
7918
|
} else {
|
7232
7919
|
break;
|
7233
7920
|
}
|
@@ -7240,7 +7927,7 @@ define('logger', ['env!env/print'], function (print) {
|
|
7240
7927
|
function parsePostfixExpression() {
|
7241
7928
|
var expr, token, startToken = lookahead;
|
7242
7929
|
|
7243
|
-
expr = parseLeftHandSideExpressionAllowCall
|
7930
|
+
expr = inheritCoverGrammar(parseLeftHandSideExpressionAllowCall);
|
7244
7931
|
|
7245
7932
|
if (!hasLineTerminator && lookahead.type === Token.Punctuator) {
|
7246
7933
|
if (match('++') || match('--')) {
|
@@ -7249,10 +7936,12 @@ define('logger', ['env!env/print'], function (print) {
|
|
7249
7936
|
tolerateError(Messages.StrictLHSPostfix);
|
7250
7937
|
}
|
7251
7938
|
|
7252
|
-
if (!
|
7939
|
+
if (!isAssignmentTarget) {
|
7253
7940
|
tolerateError(Messages.InvalidLHSInAssignment);
|
7254
7941
|
}
|
7255
7942
|
|
7943
|
+
isAssignmentTarget = isBindingElement = false;
|
7944
|
+
|
7256
7945
|
token = lex();
|
7257
7946
|
expr = new WrappingNode(startToken).finishPostfixExpression(token.value, expr);
|
7258
7947
|
}
|
@@ -7271,30 +7960,32 @@ define('logger', ['env!env/print'], function (print) {
|
|
7271
7960
|
} else if (match('++') || match('--')) {
|
7272
7961
|
startToken = lookahead;
|
7273
7962
|
token = lex();
|
7274
|
-
expr = parseUnaryExpression
|
7963
|
+
expr = inheritCoverGrammar(parseUnaryExpression);
|
7275
7964
|
// 11.4.4, 11.4.5
|
7276
7965
|
if (strict && expr.type === Syntax.Identifier && isRestrictedWord(expr.name)) {
|
7277
7966
|
tolerateError(Messages.StrictLHSPrefix);
|
7278
7967
|
}
|
7279
7968
|
|
7280
|
-
if (!
|
7969
|
+
if (!isAssignmentTarget) {
|
7281
7970
|
tolerateError(Messages.InvalidLHSInAssignment);
|
7282
7971
|
}
|
7283
|
-
|
7284
7972
|
expr = new WrappingNode(startToken).finishUnaryExpression(token.value, expr);
|
7973
|
+
isAssignmentTarget = isBindingElement = false;
|
7285
7974
|
} else if (match('+') || match('-') || match('~') || match('!')) {
|
7286
7975
|
startToken = lookahead;
|
7287
7976
|
token = lex();
|
7288
|
-
expr = parseUnaryExpression
|
7977
|
+
expr = inheritCoverGrammar(parseUnaryExpression);
|
7289
7978
|
expr = new WrappingNode(startToken).finishUnaryExpression(token.value, expr);
|
7979
|
+
isAssignmentTarget = isBindingElement = false;
|
7290
7980
|
} else if (matchKeyword('delete') || matchKeyword('void') || matchKeyword('typeof')) {
|
7291
7981
|
startToken = lookahead;
|
7292
7982
|
token = lex();
|
7293
|
-
expr = parseUnaryExpression
|
7983
|
+
expr = inheritCoverGrammar(parseUnaryExpression);
|
7294
7984
|
expr = new WrappingNode(startToken).finishUnaryExpression(token.value, expr);
|
7295
7985
|
if (strict && expr.operator === 'delete' && expr.argument.type === Syntax.Identifier) {
|
7296
7986
|
tolerateError(Messages.StrictDelete);
|
7297
7987
|
}
|
7988
|
+
isAssignmentTarget = isBindingElement = false;
|
7298
7989
|
} else {
|
7299
7990
|
expr = parsePostfixExpression();
|
7300
7991
|
}
|
@@ -7385,18 +8076,19 @@ define('logger', ['env!env/print'], function (print) {
|
|
7385
8076
|
var marker, markers, expr, token, prec, stack, right, operator, left, i;
|
7386
8077
|
|
7387
8078
|
marker = lookahead;
|
7388
|
-
left = parseUnaryExpression
|
8079
|
+
left = inheritCoverGrammar(parseUnaryExpression);
|
7389
8080
|
|
7390
8081
|
token = lookahead;
|
7391
8082
|
prec = binaryPrecedence(token, state.allowIn);
|
7392
8083
|
if (prec === 0) {
|
7393
8084
|
return left;
|
7394
8085
|
}
|
8086
|
+
isAssignmentTarget = isBindingElement = false;
|
7395
8087
|
token.prec = prec;
|
7396
8088
|
lex();
|
7397
8089
|
|
7398
8090
|
markers = [marker, lookahead];
|
7399
|
-
right = parseUnaryExpression
|
8091
|
+
right = isolateCoverGrammar(parseUnaryExpression);
|
7400
8092
|
|
7401
8093
|
stack = [left, token, right];
|
7402
8094
|
|
@@ -7417,7 +8109,7 @@ define('logger', ['env!env/print'], function (print) {
|
|
7417
8109
|
token.prec = prec;
|
7418
8110
|
stack.push(token);
|
7419
8111
|
markers.push(lookahead);
|
7420
|
-
expr = parseUnaryExpression
|
8112
|
+
expr = isolateCoverGrammar(parseUnaryExpression);
|
7421
8113
|
stack.push(expr);
|
7422
8114
|
}
|
7423
8115
|
|
@@ -7441,17 +8133,18 @@ define('logger', ['env!env/print'], function (print) {
|
|
7441
8133
|
|
7442
8134
|
startToken = lookahead;
|
7443
8135
|
|
7444
|
-
expr = parseBinaryExpression
|
8136
|
+
expr = inheritCoverGrammar(parseBinaryExpression);
|
7445
8137
|
if (match('?')) {
|
7446
8138
|
lex();
|
7447
8139
|
previousAllowIn = state.allowIn;
|
7448
8140
|
state.allowIn = true;
|
7449
|
-
consequent = parseAssignmentExpression
|
8141
|
+
consequent = isolateCoverGrammar(parseAssignmentExpression);
|
7450
8142
|
state.allowIn = previousAllowIn;
|
7451
8143
|
expect(':');
|
7452
|
-
alternate = parseAssignmentExpression
|
8144
|
+
alternate = isolateCoverGrammar(parseAssignmentExpression);
|
7453
8145
|
|
7454
8146
|
expr = new WrappingNode(startToken).finishConditionalExpression(expr, consequent, alternate);
|
8147
|
+
isAssignmentTarget = isBindingElement = false;
|
7455
8148
|
}
|
7456
8149
|
|
7457
8150
|
return expr;
|
@@ -7463,9 +8156,36 @@ define('logger', ['env!env/print'], function (print) {
|
|
7463
8156
|
if (match('{')) {
|
7464
8157
|
return parseFunctionSourceElements();
|
7465
8158
|
}
|
7466
|
-
return parseAssignmentExpression
|
8159
|
+
return isolateCoverGrammar(parseAssignmentExpression);
|
7467
8160
|
}
|
7468
8161
|
|
8162
|
+
function checkPatternParam(options, param) {
|
8163
|
+
var i;
|
8164
|
+
switch (param.type) {
|
8165
|
+
case Syntax.Identifier:
|
8166
|
+
validateParam(options, param, param.name);
|
8167
|
+
break;
|
8168
|
+
case Syntax.RestElement:
|
8169
|
+
checkPatternParam(options, param.argument);
|
8170
|
+
break;
|
8171
|
+
case Syntax.AssignmentPattern:
|
8172
|
+
checkPatternParam(options, param.left);
|
8173
|
+
break;
|
8174
|
+
case Syntax.ArrayPattern:
|
8175
|
+
for (i = 0; i < param.elements.length; i++) {
|
8176
|
+
if (param.elements[i] !== null) {
|
8177
|
+
checkPatternParam(options, param.elements[i]);
|
8178
|
+
}
|
8179
|
+
}
|
8180
|
+
break;
|
8181
|
+
default:
|
8182
|
+
assert(param.type === Syntax.ObjectPattern, 'Invalid type');
|
8183
|
+
for (i = 0; i < param.properties.length; i++) {
|
8184
|
+
checkPatternParam(options, param.properties[i].value);
|
8185
|
+
}
|
8186
|
+
break;
|
8187
|
+
}
|
8188
|
+
}
|
7469
8189
|
function reinterpretAsCoverFormalsList(expr) {
|
7470
8190
|
var i, len, param, params, defaults, defaultCount, options, token;
|
7471
8191
|
|
@@ -7475,10 +8195,6 @@ define('logger', ['env!env/print'], function (print) {
|
|
7475
8195
|
|
7476
8196
|
switch (expr.type) {
|
7477
8197
|
case Syntax.Identifier:
|
7478
|
-
case Syntax.AssignmentExpression:
|
7479
|
-
break;
|
7480
|
-
case Syntax.SequenceExpression:
|
7481
|
-
params = expr.expressions;
|
7482
8198
|
break;
|
7483
8199
|
case PlaceHolders.ArrowParameterPlaceHolder:
|
7484
8200
|
params = expr.params;
|
@@ -7493,21 +8209,18 @@ define('logger', ['env!env/print'], function (print) {
|
|
7493
8209
|
|
7494
8210
|
for (i = 0, len = params.length; i < len; i += 1) {
|
7495
8211
|
param = params[i];
|
7496
|
-
|
7497
|
-
|
7498
|
-
defaults.push(null);
|
7499
|
-
validateParam(options, param, param.name);
|
7500
|
-
} else if (param.type === Syntax.RestElement) {
|
7501
|
-
params[i] = param;
|
7502
|
-
defaults.push(null);
|
7503
|
-
validateParam(options, param.argument, param.argument.name);
|
7504
|
-
} else if (param.type === Syntax.AssignmentExpression) {
|
8212
|
+
switch (param.type) {
|
8213
|
+
case Syntax.AssignmentPattern:
|
7505
8214
|
params[i] = param.left;
|
7506
8215
|
defaults.push(param.right);
|
7507
8216
|
++defaultCount;
|
7508
|
-
|
7509
|
-
|
7510
|
-
|
8217
|
+
checkPatternParam(options, param.left);
|
8218
|
+
break;
|
8219
|
+
default:
|
8220
|
+
checkPatternParam(options, param);
|
8221
|
+
params[i] = param;
|
8222
|
+
defaults.push(null);
|
8223
|
+
break;
|
7511
8224
|
}
|
7512
8225
|
}
|
7513
8226
|
|
@@ -7532,6 +8245,9 @@ define('logger', ['env!env/print'], function (print) {
|
|
7532
8245
|
function parseArrowFunctionExpression(options, node) {
|
7533
8246
|
var previousStrict, body;
|
7534
8247
|
|
8248
|
+
if (hasLineTerminator) {
|
8249
|
+
tolerateUnexpectedToken(lookahead);
|
8250
|
+
}
|
7535
8251
|
expect('=>');
|
7536
8252
|
previousStrict = strict;
|
7537
8253
|
|
@@ -7549,6 +8265,34 @@ define('logger', ['env!env/print'], function (print) {
|
|
7549
8265
|
return node.finishArrowFunctionExpression(options.params, options.defaults, body, body.type !== Syntax.BlockStatement);
|
7550
8266
|
}
|
7551
8267
|
|
8268
|
+
// [ES6] 14.4 Yield expression
|
8269
|
+
|
8270
|
+
function parseYieldExpression() {
|
8271
|
+
var argument, expr, delegate;
|
8272
|
+
|
8273
|
+
expr = new Node();
|
8274
|
+
|
8275
|
+
if (!state.allowYield) {
|
8276
|
+
tolerateUnexpectedToken(lookahead, Messages.IllegalYield);
|
8277
|
+
}
|
8278
|
+
|
8279
|
+
expectKeyword('yield');
|
8280
|
+
|
8281
|
+
if (!hasLineTerminator) {
|
8282
|
+
delegate = match('*');
|
8283
|
+
if (delegate) {
|
8284
|
+
lex();
|
8285
|
+
argument = parseExpression();
|
8286
|
+
} else {
|
8287
|
+
if (!match(';') && !match('}') && lookahead.type !== Token.EOF) {
|
8288
|
+
argument = parseExpression();
|
8289
|
+
}
|
8290
|
+
}
|
8291
|
+
}
|
8292
|
+
|
8293
|
+
return expr.finishYieldExpression(argument, delegate);
|
8294
|
+
}
|
8295
|
+
|
7552
8296
|
// 11.13 Assignment Operators
|
7553
8297
|
|
7554
8298
|
function parseAssignmentExpression() {
|
@@ -7557,19 +8301,26 @@ define('logger', ['env!env/print'], function (print) {
|
|
7557
8301
|
startToken = lookahead;
|
7558
8302
|
token = lookahead;
|
7559
8303
|
|
8304
|
+
if (matchKeyword('yield')) {
|
8305
|
+
return parseYieldExpression();
|
8306
|
+
}
|
8307
|
+
|
7560
8308
|
expr = parseConditionalExpression();
|
7561
8309
|
|
7562
8310
|
if (expr.type === PlaceHolders.ArrowParameterPlaceHolder || match('=>')) {
|
8311
|
+
isAssignmentTarget = isBindingElement = false;
|
7563
8312
|
list = reinterpretAsCoverFormalsList(expr);
|
7564
8313
|
|
7565
8314
|
if (list) {
|
8315
|
+
firstCoverInitializedNameError = null;
|
7566
8316
|
return parseArrowFunctionExpression(list, new WrappingNode(startToken));
|
7567
8317
|
}
|
8318
|
+
|
8319
|
+
return expr;
|
7568
8320
|
}
|
7569
8321
|
|
7570
8322
|
if (matchAssign()) {
|
7571
|
-
|
7572
|
-
if (!isLeftHandSide(expr)) {
|
8323
|
+
if (!isAssignmentTarget) {
|
7573
8324
|
tolerateError(Messages.InvalidLHSInAssignment);
|
7574
8325
|
}
|
7575
8326
|
|
@@ -7578,9 +8329,16 @@ define('logger', ['env!env/print'], function (print) {
|
|
7578
8329
|
tolerateUnexpectedToken(token, Messages.StrictLHSAssignment);
|
7579
8330
|
}
|
7580
8331
|
|
8332
|
+
if (!match('=')) {
|
8333
|
+
isAssignmentTarget = isBindingElement = false;
|
8334
|
+
} else {
|
8335
|
+
reinterpretExpressionAsPattern(expr);
|
8336
|
+
}
|
8337
|
+
|
7581
8338
|
token = lex();
|
7582
|
-
right = parseAssignmentExpression
|
8339
|
+
right = isolateCoverGrammar(parseAssignmentExpression);
|
7583
8340
|
expr = new WrappingNode(startToken).finishAssignmentExpression(token.value, expr, right);
|
8341
|
+
firstCoverInitializedNameError = null;
|
7584
8342
|
}
|
7585
8343
|
|
7586
8344
|
return expr;
|
@@ -7591,7 +8349,7 @@ define('logger', ['env!env/print'], function (print) {
|
|
7591
8349
|
function parseExpression() {
|
7592
8350
|
var expr, startToken = lookahead, expressions;
|
7593
8351
|
|
7594
|
-
expr = parseAssignmentExpression
|
8352
|
+
expr = isolateCoverGrammar(parseAssignmentExpression);
|
7595
8353
|
|
7596
8354
|
if (match(',')) {
|
7597
8355
|
expressions = [expr];
|
@@ -7601,7 +8359,7 @@ define('logger', ['env!env/print'], function (print) {
|
|
7601
8359
|
break;
|
7602
8360
|
}
|
7603
8361
|
lex();
|
7604
|
-
expressions.push(parseAssignmentExpression
|
8362
|
+
expressions.push(isolateCoverGrammar(parseAssignmentExpression));
|
7605
8363
|
}
|
7606
8364
|
|
7607
8365
|
expr = new WrappingNode(startToken).finishSequenceExpression(expressions);
|
@@ -7615,9 +8373,19 @@ define('logger', ['env!env/print'], function (print) {
|
|
7615
8373
|
function parseStatementListItem() {
|
7616
8374
|
if (lookahead.type === Token.Keyword) {
|
7617
8375
|
switch (lookahead.value) {
|
8376
|
+
case 'export':
|
8377
|
+
if (sourceType !== 'module') {
|
8378
|
+
tolerateUnexpectedToken(lookahead, Messages.IllegalExportDeclaration);
|
8379
|
+
}
|
8380
|
+
return parseExportDeclaration();
|
8381
|
+
case 'import':
|
8382
|
+
if (sourceType !== 'module') {
|
8383
|
+
tolerateUnexpectedToken(lookahead, Messages.IllegalImportDeclaration);
|
8384
|
+
}
|
8385
|
+
return parseImportDeclaration();
|
7618
8386
|
case 'const':
|
7619
8387
|
case 'let':
|
7620
|
-
return parseLexicalDeclaration();
|
8388
|
+
return parseLexicalDeclaration({inFor: false});
|
7621
8389
|
case 'function':
|
7622
8390
|
return parseFunctionDeclaration(new Node());
|
7623
8391
|
case 'class':
|
@@ -7671,9 +8439,9 @@ define('logger', ['env!env/print'], function (print) {
|
|
7671
8439
|
}
|
7672
8440
|
|
7673
8441
|
function parseVariableDeclaration() {
|
7674
|
-
var init = null, id, node = new Node();
|
8442
|
+
var init = null, id, node = new Node(), params = [];
|
7675
8443
|
|
7676
|
-
id =
|
8444
|
+
id = parsePattern(params);
|
7677
8445
|
|
7678
8446
|
// 12.2.1
|
7679
8447
|
if (strict && isRestrictedWord(id.name)) {
|
@@ -7682,7 +8450,9 @@ define('logger', ['env!env/print'], function (print) {
|
|
7682
8450
|
|
7683
8451
|
if (match('=')) {
|
7684
8452
|
lex();
|
7685
|
-
init = parseAssignmentExpression
|
8453
|
+
init = isolateCoverGrammar(parseAssignmentExpression);
|
8454
|
+
} else if (id.type !== Syntax.Identifier) {
|
8455
|
+
expect('=');
|
7686
8456
|
}
|
7687
8457
|
|
7688
8458
|
return node.finishVariableDeclarator(id, init);
|
@@ -7714,34 +8484,34 @@ define('logger', ['env!env/print'], function (print) {
|
|
7714
8484
|
return node.finishVariableDeclaration(declarations);
|
7715
8485
|
}
|
7716
8486
|
|
7717
|
-
function parseLexicalBinding(kind) {
|
7718
|
-
var init = null, id, node = new Node();
|
8487
|
+
function parseLexicalBinding(kind, options) {
|
8488
|
+
var init = null, id, node = new Node(), params = [];
|
7719
8489
|
|
7720
|
-
id =
|
8490
|
+
id = parsePattern(params);
|
7721
8491
|
|
7722
8492
|
// 12.2.1
|
7723
|
-
if (strict && isRestrictedWord(id.name)) {
|
8493
|
+
if (strict && id.type === Syntax.Identifier && isRestrictedWord(id.name)) {
|
7724
8494
|
tolerateError(Messages.StrictVarName);
|
7725
8495
|
}
|
7726
8496
|
|
7727
8497
|
if (kind === 'const') {
|
7728
|
-
if (!matchKeyword('in')) {
|
8498
|
+
if (!matchKeyword('in') && !matchContextualKeyword('of')) {
|
7729
8499
|
expect('=');
|
7730
|
-
init = parseAssignmentExpression
|
8500
|
+
init = isolateCoverGrammar(parseAssignmentExpression);
|
7731
8501
|
}
|
7732
|
-
} else if (match('=')) {
|
7733
|
-
|
7734
|
-
init = parseAssignmentExpression
|
8502
|
+
} else if ((!options.inFor && id.type !== Syntax.Identifier) || match('=')) {
|
8503
|
+
expect('=');
|
8504
|
+
init = isolateCoverGrammar(parseAssignmentExpression);
|
7735
8505
|
}
|
7736
8506
|
|
7737
8507
|
return node.finishVariableDeclarator(id, init);
|
7738
8508
|
}
|
7739
8509
|
|
7740
|
-
function parseBindingList(kind) {
|
8510
|
+
function parseBindingList(kind, options) {
|
7741
8511
|
var list = [];
|
7742
8512
|
|
7743
8513
|
do {
|
7744
|
-
list.push(parseLexicalBinding(kind));
|
8514
|
+
list.push(parseLexicalBinding(kind, options));
|
7745
8515
|
if (!match(',')) {
|
7746
8516
|
break;
|
7747
8517
|
}
|
@@ -7751,20 +8521,20 @@ define('logger', ['env!env/print'], function (print) {
|
|
7751
8521
|
return list;
|
7752
8522
|
}
|
7753
8523
|
|
7754
|
-
function parseLexicalDeclaration() {
|
8524
|
+
function parseLexicalDeclaration(options) {
|
7755
8525
|
var kind, declarations, node = new Node();
|
7756
8526
|
|
7757
8527
|
kind = lex().value;
|
7758
8528
|
assert(kind === 'let' || kind === 'const', 'Lexical declaration must be either let or const');
|
7759
8529
|
|
7760
|
-
declarations = parseBindingList(kind);
|
8530
|
+
declarations = parseBindingList(kind, options);
|
7761
8531
|
|
7762
8532
|
consumeSemicolon();
|
7763
8533
|
|
7764
8534
|
return node.finishLexicalDeclaration(declarations, kind);
|
7765
8535
|
}
|
7766
8536
|
|
7767
|
-
function parseRestElement() {
|
8537
|
+
function parseRestElement(params) {
|
7768
8538
|
var param, node = new Node();
|
7769
8539
|
|
7770
8540
|
lex();
|
@@ -7773,6 +8543,8 @@ define('logger', ['env!env/print'], function (print) {
|
|
7773
8543
|
throwError(Messages.ObjectPatternAsRestParameter);
|
7774
8544
|
}
|
7775
8545
|
|
8546
|
+
params.push(lookahead);
|
8547
|
+
|
7776
8548
|
param = parseVariableIdentifier();
|
7777
8549
|
|
7778
8550
|
if (match('=')) {
|
@@ -7877,10 +8649,11 @@ define('logger', ['env!env/print'], function (print) {
|
|
7877
8649
|
}
|
7878
8650
|
|
7879
8651
|
function parseForStatement(node) {
|
7880
|
-
var init, test, update, left, right, kind, declarations,
|
8652
|
+
var init, forIn, initSeq, initStartToken, test, update, left, right, kind, declarations,
|
7881
8653
|
body, oldInIteration, previousAllowIn = state.allowIn;
|
7882
8654
|
|
7883
8655
|
init = test = update = null;
|
8656
|
+
forIn = true;
|
7884
8657
|
|
7885
8658
|
expectKeyword('for');
|
7886
8659
|
|
@@ -7902,6 +8675,12 @@ define('logger', ['env!env/print'], function (print) {
|
|
7902
8675
|
left = init;
|
7903
8676
|
right = parseExpression();
|
7904
8677
|
init = null;
|
8678
|
+
} else if (init.declarations.length === 1 && init.declarations[0].init === null && matchContextualKeyword('of')) {
|
8679
|
+
lex();
|
8680
|
+
left = init;
|
8681
|
+
right = parseAssignmentExpression();
|
8682
|
+
init = null;
|
8683
|
+
forIn = false;
|
7905
8684
|
} else {
|
7906
8685
|
expect(';');
|
7907
8686
|
}
|
@@ -7910,7 +8689,7 @@ define('logger', ['env!env/print'], function (print) {
|
|
7910
8689
|
kind = lex().value;
|
7911
8690
|
|
7912
8691
|
state.allowIn = false;
|
7913
|
-
declarations = parseBindingList(kind);
|
8692
|
+
declarations = parseBindingList(kind, {inFor: true});
|
7914
8693
|
state.allowIn = previousAllowIn;
|
7915
8694
|
|
7916
8695
|
if (declarations.length === 1 && declarations[0].init === null && matchKeyword('in')) {
|
@@ -7919,26 +8698,53 @@ define('logger', ['env!env/print'], function (print) {
|
|
7919
8698
|
left = init;
|
7920
8699
|
right = parseExpression();
|
7921
8700
|
init = null;
|
8701
|
+
} else if (declarations.length === 1 && declarations[0].init === null && matchContextualKeyword('of')) {
|
8702
|
+
init = init.finishLexicalDeclaration(declarations, kind);
|
8703
|
+
lex();
|
8704
|
+
left = init;
|
8705
|
+
right = parseAssignmentExpression();
|
8706
|
+
init = null;
|
8707
|
+
forIn = false;
|
7922
8708
|
} else {
|
7923
8709
|
consumeSemicolon();
|
7924
8710
|
init = init.finishLexicalDeclaration(declarations, kind);
|
7925
8711
|
}
|
7926
8712
|
} else {
|
8713
|
+
initStartToken = lookahead;
|
7927
8714
|
state.allowIn = false;
|
7928
|
-
init =
|
8715
|
+
init = inheritCoverGrammar(parseAssignmentExpression);
|
7929
8716
|
state.allowIn = previousAllowIn;
|
7930
8717
|
|
7931
8718
|
if (matchKeyword('in')) {
|
7932
|
-
|
7933
|
-
if (!isLeftHandSide(init)) {
|
8719
|
+
if (!isAssignmentTarget) {
|
7934
8720
|
tolerateError(Messages.InvalidLHSInForIn);
|
7935
8721
|
}
|
7936
8722
|
|
7937
8723
|
lex();
|
8724
|
+
reinterpretExpressionAsPattern(init);
|
7938
8725
|
left = init;
|
7939
8726
|
right = parseExpression();
|
7940
8727
|
init = null;
|
8728
|
+
} else if (matchContextualKeyword('of')) {
|
8729
|
+
if (!isAssignmentTarget) {
|
8730
|
+
tolerateError(Messages.InvalidLHSInForLoop);
|
8731
|
+
}
|
8732
|
+
|
8733
|
+
lex();
|
8734
|
+
reinterpretExpressionAsPattern(init);
|
8735
|
+
left = init;
|
8736
|
+
right = parseAssignmentExpression();
|
8737
|
+
init = null;
|
8738
|
+
forIn = false;
|
7941
8739
|
} else {
|
8740
|
+
if (match(',')) {
|
8741
|
+
initSeq = [init];
|
8742
|
+
while (match(',')) {
|
8743
|
+
lex();
|
8744
|
+
initSeq.push(isolateCoverGrammar(parseAssignmentExpression));
|
8745
|
+
}
|
8746
|
+
init = new WrappingNode(initStartToken).finishSequenceExpression(initSeq);
|
8747
|
+
}
|
7942
8748
|
expect(';');
|
7943
8749
|
}
|
7944
8750
|
}
|
@@ -7961,13 +8767,14 @@ define('logger', ['env!env/print'], function (print) {
|
|
7961
8767
|
oldInIteration = state.inIteration;
|
7962
8768
|
state.inIteration = true;
|
7963
8769
|
|
7964
|
-
body = parseStatement
|
8770
|
+
body = isolateCoverGrammar(parseStatement);
|
7965
8771
|
|
7966
8772
|
state.inIteration = oldInIteration;
|
7967
8773
|
|
7968
8774
|
return (typeof left === 'undefined') ?
|
7969
8775
|
node.finishForStatement(init, test, update, body) :
|
7970
|
-
node.finishForInStatement(left, right, body)
|
8776
|
+
forIn ? node.finishForInStatement(left, right, body) :
|
8777
|
+
node.finishForOfStatement(left, right, body);
|
7971
8778
|
}
|
7972
8779
|
|
7973
8780
|
// 12.7 The continue statement
|
@@ -8207,7 +9014,7 @@ define('logger', ['env!env/print'], function (print) {
|
|
8207
9014
|
// 12.14 The try statement
|
8208
9015
|
|
8209
9016
|
function parseCatchClause() {
|
8210
|
-
var param, body, node = new Node();
|
9017
|
+
var param, params = [], paramMap = {}, key, i, body, node = new Node();
|
8211
9018
|
|
8212
9019
|
expectKeyword('catch');
|
8213
9020
|
|
@@ -8216,7 +9023,15 @@ define('logger', ['env!env/print'], function (print) {
|
|
8216
9023
|
throwUnexpectedToken(lookahead);
|
8217
9024
|
}
|
8218
9025
|
|
8219
|
-
param =
|
9026
|
+
param = parsePattern(params);
|
9027
|
+
for (i = 0; i < params.length; i++) {
|
9028
|
+
key = '$' + params[i].value;
|
9029
|
+
if (Object.prototype.hasOwnProperty.call(paramMap, key)) {
|
9030
|
+
tolerateError(Messages.DuplicateBinding, params[i].value);
|
9031
|
+
}
|
9032
|
+
paramMap[key] = true;
|
9033
|
+
}
|
9034
|
+
|
8220
9035
|
// 12.14.1
|
8221
9036
|
if (strict && isRestrictedWord(param.name)) {
|
8222
9037
|
tolerateError(Messages.StrictCatchVariable);
|
@@ -8276,7 +9091,7 @@ define('logger', ['env!env/print'], function (print) {
|
|
8276
9091
|
if (type === Token.Punctuator && lookahead.value === '{') {
|
8277
9092
|
return parseBlock();
|
8278
9093
|
}
|
8279
|
-
|
9094
|
+
isAssignmentTarget = isBindingElement = true;
|
8280
9095
|
node = new Node();
|
8281
9096
|
|
8282
9097
|
if (type === Token.Punctuator) {
|
@@ -8428,7 +9243,7 @@ define('logger', ['env!env/print'], function (print) {
|
|
8428
9243
|
options.firstRestricted = param;
|
8429
9244
|
options.message = Messages.StrictReservedWord;
|
8430
9245
|
} else if (Object.prototype.hasOwnProperty.call(options.paramSet, key)) {
|
8431
|
-
options.
|
9246
|
+
options.stricted = param;
|
8432
9247
|
options.message = Messages.StrictParamDupe;
|
8433
9248
|
}
|
8434
9249
|
}
|
@@ -8436,23 +9251,25 @@ define('logger', ['env!env/print'], function (print) {
|
|
8436
9251
|
}
|
8437
9252
|
|
8438
9253
|
function parseParam(options) {
|
8439
|
-
var token, param, def;
|
9254
|
+
var token, param, params = [], i, def;
|
8440
9255
|
|
8441
9256
|
token = lookahead;
|
8442
9257
|
if (token.value === '...') {
|
8443
|
-
param = parseRestElement();
|
9258
|
+
param = parseRestElement(params);
|
8444
9259
|
validateParam(options, param.argument, param.argument.name);
|
8445
9260
|
options.params.push(param);
|
8446
9261
|
options.defaults.push(null);
|
8447
9262
|
return false;
|
8448
9263
|
}
|
8449
9264
|
|
8450
|
-
param =
|
8451
|
-
|
9265
|
+
param = parsePatternWithDefault(params);
|
9266
|
+
for (i = 0; i < params.length; i++) {
|
9267
|
+
validateParam(options, params[i], params[i].value);
|
9268
|
+
}
|
8452
9269
|
|
8453
|
-
if (
|
8454
|
-
|
8455
|
-
|
9270
|
+
if (param.type === Syntax.AssignmentPattern) {
|
9271
|
+
def = param.right;
|
9272
|
+
param = param.left;
|
8456
9273
|
++options.defaultCount;
|
8457
9274
|
}
|
8458
9275
|
|
@@ -8499,27 +9316,40 @@ define('logger', ['env!env/print'], function (print) {
|
|
8499
9316
|
};
|
8500
9317
|
}
|
8501
9318
|
|
8502
|
-
function parseFunctionDeclaration(node) {
|
8503
|
-
var id, params = [], defaults = [], body, token, stricted, tmp, firstRestricted, message, previousStrict
|
9319
|
+
function parseFunctionDeclaration(node, identifierIsOptional) {
|
9320
|
+
var id = null, params = [], defaults = [], body, token, stricted, tmp, firstRestricted, message, previousStrict,
|
9321
|
+
isGenerator, previousAllowYield;
|
8504
9322
|
|
8505
9323
|
expectKeyword('function');
|
8506
|
-
|
8507
|
-
|
8508
|
-
if (
|
8509
|
-
|
8510
|
-
|
8511
|
-
|
8512
|
-
|
8513
|
-
|
8514
|
-
|
8515
|
-
|
8516
|
-
|
8517
|
-
|
8518
|
-
|
9324
|
+
|
9325
|
+
isGenerator = match('*');
|
9326
|
+
if (isGenerator) {
|
9327
|
+
lex();
|
9328
|
+
}
|
9329
|
+
|
9330
|
+
if (!identifierIsOptional || !match('(')) {
|
9331
|
+
token = lookahead;
|
9332
|
+
id = parseVariableIdentifier();
|
9333
|
+
if (strict) {
|
9334
|
+
if (isRestrictedWord(token.value)) {
|
9335
|
+
tolerateUnexpectedToken(token, Messages.StrictFunctionName);
|
9336
|
+
}
|
9337
|
+
} else {
|
9338
|
+
if (isRestrictedWord(token.value)) {
|
9339
|
+
firstRestricted = token;
|
9340
|
+
message = Messages.StrictFunctionName;
|
9341
|
+
} else if (isStrictModeReservedWord(token.value)) {
|
9342
|
+
firstRestricted = token;
|
9343
|
+
message = Messages.StrictReservedWord;
|
9344
|
+
}
|
8519
9345
|
}
|
8520
9346
|
}
|
8521
9347
|
|
9348
|
+
previousAllowYield = state.allowYield;
|
9349
|
+
state.allowYield = false;
|
8522
9350
|
tmp = parseParams(firstRestricted);
|
9351
|
+
state.allowYield = previousAllowYield;
|
9352
|
+
|
8523
9353
|
params = tmp.params;
|
8524
9354
|
defaults = tmp.defaults;
|
8525
9355
|
stricted = tmp.stricted;
|
@@ -8528,7 +9358,9 @@ define('logger', ['env!env/print'], function (print) {
|
|
8528
9358
|
message = tmp.message;
|
8529
9359
|
}
|
8530
9360
|
|
9361
|
+
previousAllowYield = state.allowYield;
|
8531
9362
|
previousStrict = strict;
|
9363
|
+
state.allowYield = isGenerator;
|
8532
9364
|
body = parseFunctionSourceElements();
|
8533
9365
|
if (strict && firstRestricted) {
|
8534
9366
|
throwUnexpectedToken(firstRestricted, message);
|
@@ -8537,16 +9369,23 @@ define('logger', ['env!env/print'], function (print) {
|
|
8537
9369
|
tolerateUnexpectedToken(stricted, message);
|
8538
9370
|
}
|
8539
9371
|
strict = previousStrict;
|
9372
|
+
state.allowYield = previousAllowYield;
|
8540
9373
|
|
8541
|
-
return node.finishFunctionDeclaration(id, params, defaults, body);
|
9374
|
+
return node.finishFunctionDeclaration(id, params, defaults, body, isGenerator);
|
8542
9375
|
}
|
8543
9376
|
|
8544
9377
|
function parseFunctionExpression() {
|
8545
9378
|
var token, id = null, stricted, firstRestricted, message, tmp,
|
8546
|
-
params = [], defaults = [], body, previousStrict, node = new Node()
|
9379
|
+
params = [], defaults = [], body, previousStrict, node = new Node(),
|
9380
|
+
isGenerator, previousAllowYield;
|
8547
9381
|
|
8548
9382
|
expectKeyword('function');
|
8549
9383
|
|
9384
|
+
isGenerator = match('*');
|
9385
|
+
if (isGenerator) {
|
9386
|
+
lex();
|
9387
|
+
}
|
9388
|
+
|
8550
9389
|
if (!match('(')) {
|
8551
9390
|
token = lookahead;
|
8552
9391
|
id = parseVariableIdentifier();
|
@@ -8565,7 +9404,11 @@ define('logger', ['env!env/print'], function (print) {
|
|
8565
9404
|
}
|
8566
9405
|
}
|
8567
9406
|
|
9407
|
+
previousAllowYield = state.allowYield;
|
9408
|
+
state.allowYield = false;
|
8568
9409
|
tmp = parseParams(firstRestricted);
|
9410
|
+
state.allowYield = previousAllowYield;
|
9411
|
+
|
8569
9412
|
params = tmp.params;
|
8570
9413
|
defaults = tmp.defaults;
|
8571
9414
|
stricted = tmp.stricted;
|
@@ -8575,7 +9418,10 @@ define('logger', ['env!env/print'], function (print) {
|
|
8575
9418
|
}
|
8576
9419
|
|
8577
9420
|
previousStrict = strict;
|
9421
|
+
previousAllowYield = state.allowYield;
|
9422
|
+
state.allowYield = isGenerator;
|
8578
9423
|
body = parseFunctionSourceElements();
|
9424
|
+
|
8579
9425
|
if (strict && firstRestricted) {
|
8580
9426
|
throwUnexpectedToken(firstRestricted, message);
|
8581
9427
|
}
|
@@ -8583,8 +9429,9 @@ define('logger', ['env!env/print'], function (print) {
|
|
8583
9429
|
tolerateUnexpectedToken(stricted, message);
|
8584
9430
|
}
|
8585
9431
|
strict = previousStrict;
|
9432
|
+
state.allowYield = previousAllowYield;
|
8586
9433
|
|
8587
|
-
return node.finishFunctionExpression(id, params, defaults, body);
|
9434
|
+
return node.finishFunctionExpression(id, params, defaults, body, isGenerator);
|
8588
9435
|
}
|
8589
9436
|
|
8590
9437
|
|
@@ -8603,16 +9450,24 @@ define('logger', ['env!env/print'], function (print) {
|
|
8603
9450
|
token = lookahead;
|
8604
9451
|
isStatic = false;
|
8605
9452
|
computed = match('[');
|
8606
|
-
|
8607
|
-
|
8608
|
-
|
8609
|
-
isStatic = true;
|
8610
|
-
computed = match('[');
|
9453
|
+
if (match('*')) {
|
9454
|
+
lex();
|
9455
|
+
} else {
|
8611
9456
|
key = parseObjectPropertyKey();
|
9457
|
+
if (key.name === 'static' && (lookaheadPropertyName() || match('*'))) {
|
9458
|
+
token = lookahead;
|
9459
|
+
isStatic = true;
|
9460
|
+
computed = match('[');
|
9461
|
+
if (match('*')) {
|
9462
|
+
lex();
|
9463
|
+
} else {
|
9464
|
+
key = parseObjectPropertyKey();
|
9465
|
+
}
|
9466
|
+
}
|
8612
9467
|
}
|
8613
9468
|
method = tryParseMethodDefinition(token, key, computed, method);
|
8614
9469
|
if (method) {
|
8615
|
-
method
|
9470
|
+
method['static'] = isStatic;
|
8616
9471
|
if (method.kind === 'init') {
|
8617
9472
|
method.kind = 'method';
|
8618
9473
|
}
|
@@ -8646,17 +9501,19 @@ define('logger', ['env!env/print'], function (print) {
|
|
8646
9501
|
return classBody.finishClassBody(body);
|
8647
9502
|
}
|
8648
9503
|
|
8649
|
-
function parseClassDeclaration() {
|
9504
|
+
function parseClassDeclaration(identifierIsOptional) {
|
8650
9505
|
var id = null, superClass = null, classNode = new Node(), classBody, previousStrict = strict;
|
8651
9506
|
strict = true;
|
8652
9507
|
|
8653
9508
|
expectKeyword('class');
|
8654
9509
|
|
8655
|
-
|
9510
|
+
if (!identifierIsOptional || lookahead.type === Token.Identifier) {
|
9511
|
+
id = parseVariableIdentifier();
|
9512
|
+
}
|
8656
9513
|
|
8657
9514
|
if (matchKeyword('extends')) {
|
8658
9515
|
lex();
|
8659
|
-
superClass = parseLeftHandSideExpressionAllowCall
|
9516
|
+
superClass = isolateCoverGrammar(parseLeftHandSideExpressionAllowCall);
|
8660
9517
|
}
|
8661
9518
|
classBody = parseClassBody();
|
8662
9519
|
strict = previousStrict;
|
@@ -8676,7 +9533,7 @@ define('logger', ['env!env/print'], function (print) {
|
|
8676
9533
|
|
8677
9534
|
if (matchKeyword('extends')) {
|
8678
9535
|
lex();
|
8679
|
-
superClass = parseLeftHandSideExpressionAllowCall
|
9536
|
+
superClass = isolateCoverGrammar(parseLeftHandSideExpressionAllowCall);
|
8680
9537
|
}
|
8681
9538
|
classBody = parseClassBody();
|
8682
9539
|
strict = previousStrict;
|
@@ -8684,6 +9541,256 @@ define('logger', ['env!env/print'], function (print) {
|
|
8684
9541
|
return classNode.finishClassExpression(id, superClass, classBody);
|
8685
9542
|
}
|
8686
9543
|
|
9544
|
+
// Modules grammar from:
|
9545
|
+
// people.mozilla.org/~jorendorff/es6-draft.html
|
9546
|
+
|
9547
|
+
function parseModuleSpecifier() {
|
9548
|
+
var node = new Node();
|
9549
|
+
|
9550
|
+
if (lookahead.type !== Token.StringLiteral) {
|
9551
|
+
throwError(Messages.InvalidModuleSpecifier);
|
9552
|
+
}
|
9553
|
+
return node.finishLiteral(lex());
|
9554
|
+
}
|
9555
|
+
|
9556
|
+
function parseExportSpecifier() {
|
9557
|
+
var exported, local, node = new Node(), def;
|
9558
|
+
if (matchKeyword('default')) {
|
9559
|
+
// export {default} from 'something';
|
9560
|
+
def = new Node();
|
9561
|
+
lex();
|
9562
|
+
local = def.finishIdentifier('default');
|
9563
|
+
} else {
|
9564
|
+
local = parseVariableIdentifier();
|
9565
|
+
}
|
9566
|
+
if (matchContextualKeyword('as')) {
|
9567
|
+
lex();
|
9568
|
+
exported = parseNonComputedProperty();
|
9569
|
+
}
|
9570
|
+
return node.finishExportSpecifier(local, exported);
|
9571
|
+
}
|
9572
|
+
|
9573
|
+
function parseExportNamedDeclaration(node) {
|
9574
|
+
var declaration = null,
|
9575
|
+
isExportFromIdentifier,
|
9576
|
+
src = null, specifiers = [];
|
9577
|
+
|
9578
|
+
// non-default export
|
9579
|
+
if (lookahead.type === Token.Keyword) {
|
9580
|
+
// covers:
|
9581
|
+
// export var f = 1;
|
9582
|
+
switch (lookahead.value) {
|
9583
|
+
case 'let':
|
9584
|
+
case 'const':
|
9585
|
+
case 'var':
|
9586
|
+
case 'class':
|
9587
|
+
case 'function':
|
9588
|
+
declaration = parseStatementListItem();
|
9589
|
+
return node.finishExportNamedDeclaration(declaration, specifiers, null);
|
9590
|
+
}
|
9591
|
+
}
|
9592
|
+
|
9593
|
+
expect('{');
|
9594
|
+
if (!match('}')) {
|
9595
|
+
do {
|
9596
|
+
isExportFromIdentifier = isExportFromIdentifier || matchKeyword('default');
|
9597
|
+
specifiers.push(parseExportSpecifier());
|
9598
|
+
} while (match(',') && lex());
|
9599
|
+
}
|
9600
|
+
expect('}');
|
9601
|
+
|
9602
|
+
if (matchContextualKeyword('from')) {
|
9603
|
+
// covering:
|
9604
|
+
// export {default} from 'foo';
|
9605
|
+
// export {foo} from 'foo';
|
9606
|
+
lex();
|
9607
|
+
src = parseModuleSpecifier();
|
9608
|
+
consumeSemicolon();
|
9609
|
+
} else if (isExportFromIdentifier) {
|
9610
|
+
// covering:
|
9611
|
+
// export {default}; // missing fromClause
|
9612
|
+
throwError(lookahead.value ?
|
9613
|
+
Messages.UnexpectedToken : Messages.MissingFromClause, lookahead.value);
|
9614
|
+
} else {
|
9615
|
+
// cover
|
9616
|
+
// export {foo};
|
9617
|
+
consumeSemicolon();
|
9618
|
+
}
|
9619
|
+
return node.finishExportNamedDeclaration(declaration, specifiers, src);
|
9620
|
+
}
|
9621
|
+
|
9622
|
+
function parseExportDefaultDeclaration(node) {
|
9623
|
+
var declaration = null,
|
9624
|
+
expression = null;
|
9625
|
+
|
9626
|
+
// covers:
|
9627
|
+
// export default ...
|
9628
|
+
expectKeyword('default');
|
9629
|
+
|
9630
|
+
if (matchKeyword('function')) {
|
9631
|
+
// covers:
|
9632
|
+
// export default function foo () {}
|
9633
|
+
// export default function () {}
|
9634
|
+
declaration = parseFunctionDeclaration(new Node(), true);
|
9635
|
+
return node.finishExportDefaultDeclaration(declaration);
|
9636
|
+
}
|
9637
|
+
if (matchKeyword('class')) {
|
9638
|
+
declaration = parseClassDeclaration(true);
|
9639
|
+
return node.finishExportDefaultDeclaration(declaration);
|
9640
|
+
}
|
9641
|
+
|
9642
|
+
if (matchContextualKeyword('from')) {
|
9643
|
+
throwError(Messages.UnexpectedToken, lookahead.value);
|
9644
|
+
}
|
9645
|
+
|
9646
|
+
// covers:
|
9647
|
+
// export default {};
|
9648
|
+
// export default [];
|
9649
|
+
// export default (1 + 2);
|
9650
|
+
if (match('{')) {
|
9651
|
+
expression = parseObjectInitialiser();
|
9652
|
+
} else if (match('[')) {
|
9653
|
+
expression = parseArrayInitialiser();
|
9654
|
+
} else {
|
9655
|
+
expression = parseAssignmentExpression();
|
9656
|
+
}
|
9657
|
+
consumeSemicolon();
|
9658
|
+
return node.finishExportDefaultDeclaration(expression);
|
9659
|
+
}
|
9660
|
+
|
9661
|
+
function parseExportAllDeclaration(node) {
|
9662
|
+
var src;
|
9663
|
+
|
9664
|
+
// covers:
|
9665
|
+
// export * from 'foo';
|
9666
|
+
expect('*');
|
9667
|
+
if (!matchContextualKeyword('from')) {
|
9668
|
+
throwError(lookahead.value ?
|
9669
|
+
Messages.UnexpectedToken : Messages.MissingFromClause, lookahead.value);
|
9670
|
+
}
|
9671
|
+
lex();
|
9672
|
+
src = parseModuleSpecifier();
|
9673
|
+
consumeSemicolon();
|
9674
|
+
|
9675
|
+
return node.finishExportAllDeclaration(src);
|
9676
|
+
}
|
9677
|
+
|
9678
|
+
function parseExportDeclaration() {
|
9679
|
+
var node = new Node();
|
9680
|
+
if (state.inFunctionBody) {
|
9681
|
+
throwError(Messages.IllegalExportDeclaration);
|
9682
|
+
}
|
9683
|
+
|
9684
|
+
expectKeyword('export');
|
9685
|
+
|
9686
|
+
if (matchKeyword('default')) {
|
9687
|
+
return parseExportDefaultDeclaration(node);
|
9688
|
+
}
|
9689
|
+
if (match('*')) {
|
9690
|
+
return parseExportAllDeclaration(node);
|
9691
|
+
}
|
9692
|
+
return parseExportNamedDeclaration(node);
|
9693
|
+
}
|
9694
|
+
|
9695
|
+
function parseImportSpecifier() {
|
9696
|
+
// import {<foo as bar>} ...;
|
9697
|
+
var local, imported, node = new Node();
|
9698
|
+
|
9699
|
+
imported = parseNonComputedProperty();
|
9700
|
+
if (matchContextualKeyword('as')) {
|
9701
|
+
lex();
|
9702
|
+
local = parseVariableIdentifier();
|
9703
|
+
}
|
9704
|
+
|
9705
|
+
return node.finishImportSpecifier(local, imported);
|
9706
|
+
}
|
9707
|
+
|
9708
|
+
function parseNamedImports() {
|
9709
|
+
var specifiers = [];
|
9710
|
+
// {foo, bar as bas}
|
9711
|
+
expect('{');
|
9712
|
+
if (!match('}')) {
|
9713
|
+
do {
|
9714
|
+
specifiers.push(parseImportSpecifier());
|
9715
|
+
} while (match(',') && lex());
|
9716
|
+
}
|
9717
|
+
expect('}');
|
9718
|
+
return specifiers;
|
9719
|
+
}
|
9720
|
+
|
9721
|
+
function parseImportDefaultSpecifier() {
|
9722
|
+
// import <foo> ...;
|
9723
|
+
var local, node = new Node();
|
9724
|
+
|
9725
|
+
local = parseNonComputedProperty();
|
9726
|
+
|
9727
|
+
return node.finishImportDefaultSpecifier(local);
|
9728
|
+
}
|
9729
|
+
|
9730
|
+
function parseImportNamespaceSpecifier() {
|
9731
|
+
// import <* as foo> ...;
|
9732
|
+
var local, node = new Node();
|
9733
|
+
|
9734
|
+
expect('*');
|
9735
|
+
if (!matchContextualKeyword('as')) {
|
9736
|
+
throwError(Messages.NoAsAfterImportNamespace);
|
9737
|
+
}
|
9738
|
+
lex();
|
9739
|
+
local = parseNonComputedProperty();
|
9740
|
+
|
9741
|
+
return node.finishImportNamespaceSpecifier(local);
|
9742
|
+
}
|
9743
|
+
|
9744
|
+
function parseImportDeclaration() {
|
9745
|
+
var specifiers, src, node = new Node();
|
9746
|
+
|
9747
|
+
if (state.inFunctionBody) {
|
9748
|
+
throwError(Messages.IllegalImportDeclaration);
|
9749
|
+
}
|
9750
|
+
|
9751
|
+
expectKeyword('import');
|
9752
|
+
specifiers = [];
|
9753
|
+
|
9754
|
+
if (lookahead.type === Token.StringLiteral) {
|
9755
|
+
// covers:
|
9756
|
+
// import 'foo';
|
9757
|
+
src = parseModuleSpecifier();
|
9758
|
+
consumeSemicolon();
|
9759
|
+
return node.finishImportDeclaration(specifiers, src);
|
9760
|
+
}
|
9761
|
+
|
9762
|
+
if (!matchKeyword('default') && isIdentifierName(lookahead)) {
|
9763
|
+
// covers:
|
9764
|
+
// import foo
|
9765
|
+
// import foo, ...
|
9766
|
+
specifiers.push(parseImportDefaultSpecifier());
|
9767
|
+
if (match(',')) {
|
9768
|
+
lex();
|
9769
|
+
}
|
9770
|
+
}
|
9771
|
+
if (match('*')) {
|
9772
|
+
// covers:
|
9773
|
+
// import foo, * as foo
|
9774
|
+
// import * as foo
|
9775
|
+
specifiers.push(parseImportNamespaceSpecifier());
|
9776
|
+
} else if (match('{')) {
|
9777
|
+
// covers:
|
9778
|
+
// import foo, {bar}
|
9779
|
+
// import {bar}
|
9780
|
+
specifiers = specifiers.concat(parseNamedImports());
|
9781
|
+
}
|
9782
|
+
|
9783
|
+
if (!matchContextualKeyword('from')) {
|
9784
|
+
throwError(lookahead.value ?
|
9785
|
+
Messages.UnexpectedToken : Messages.MissingFromClause, lookahead.value);
|
9786
|
+
}
|
9787
|
+
lex();
|
9788
|
+
src = parseModuleSpecifier();
|
9789
|
+
consumeSemicolon();
|
9790
|
+
|
9791
|
+
return node.finishImportDeclaration(specifiers, src);
|
9792
|
+
}
|
9793
|
+
|
8687
9794
|
// 14 Program
|
8688
9795
|
|
8689
9796
|
function parseScriptBody() {
|
@@ -8730,7 +9837,6 @@ define('logger', ['env!env/print'], function (print) {
|
|
8730
9837
|
|
8731
9838
|
peek();
|
8732
9839
|
node = new Node();
|
8733
|
-
strict = false;
|
8734
9840
|
|
8735
9841
|
body = parseScriptBody();
|
8736
9842
|
return node.finishProgram(body);
|
@@ -8783,11 +9889,13 @@ define('logger', ['env!env/print'], function (print) {
|
|
8783
9889
|
lookahead = null;
|
8784
9890
|
state = {
|
8785
9891
|
allowIn: true,
|
9892
|
+
allowYield: false,
|
8786
9893
|
labelSet: {},
|
8787
9894
|
inFunctionBody: false,
|
8788
9895
|
inIteration: false,
|
8789
9896
|
inSwitch: false,
|
8790
|
-
lastCommentStart: -1
|
9897
|
+
lastCommentStart: -1,
|
9898
|
+
curlyStack: []
|
8791
9899
|
};
|
8792
9900
|
|
8793
9901
|
extra = {};
|
@@ -8870,12 +9978,16 @@ define('logger', ['env!env/print'], function (print) {
|
|
8870
9978
|
lookahead = null;
|
8871
9979
|
state = {
|
8872
9980
|
allowIn: true,
|
9981
|
+
allowYield: false,
|
8873
9982
|
labelSet: {},
|
8874
9983
|
inFunctionBody: false,
|
8875
9984
|
inIteration: false,
|
8876
9985
|
inSwitch: false,
|
8877
|
-
lastCommentStart: -1
|
9986
|
+
lastCommentStart: -1,
|
9987
|
+
curlyStack: []
|
8878
9988
|
};
|
9989
|
+
sourceType = 'script';
|
9990
|
+
strict = false;
|
8879
9991
|
|
8880
9992
|
extra = {};
|
8881
9993
|
if (typeof options !== 'undefined') {
|
@@ -8903,6 +10015,11 @@ define('logger', ['env!env/print'], function (print) {
|
|
8903
10015
|
extra.trailingComments = [];
|
8904
10016
|
extra.leadingComments = [];
|
8905
10017
|
}
|
10018
|
+
if (options.sourceType === 'module') {
|
10019
|
+
// very restrictive condition for now
|
10020
|
+
sourceType = options.sourceType;
|
10021
|
+
strict = true;
|
10022
|
+
}
|
8906
10023
|
}
|
8907
10024
|
|
8908
10025
|
try {
|
@@ -8927,14 +10044,14 @@ define('logger', ['env!env/print'], function (print) {
|
|
8927
10044
|
}
|
8928
10045
|
|
8929
10046
|
// Sync with *.json manifests.
|
8930
|
-
exports.version = '2.1
|
10047
|
+
exports.version = '2.4.1';
|
8931
10048
|
|
8932
10049
|
exports.tokenize = tokenize;
|
8933
10050
|
|
8934
10051
|
exports.parse = parse;
|
8935
10052
|
|
8936
10053
|
// Deep copy.
|
8937
|
-
|
10054
|
+
/* istanbul ignore next */
|
8938
10055
|
exports.Syntax = (function () {
|
8939
10056
|
var name, types = {};
|
8940
10057
|
|
@@ -15840,10 +16957,12 @@ function defaults(args, defs, croak) {
|
|
15840
16957
|
};
|
15841
16958
|
|
15842
16959
|
function merge(obj, ext) {
|
16960
|
+
var count = 0;
|
15843
16961
|
for (var i in ext) if (ext.hasOwnProperty(i)) {
|
15844
16962
|
obj[i] = ext[i];
|
16963
|
+
count++;
|
15845
16964
|
}
|
15846
|
-
return
|
16965
|
+
return count;
|
15847
16966
|
};
|
15848
16967
|
|
15849
16968
|
function noop() {};
|
@@ -16032,7 +17151,13 @@ Dictionary.prototype = {
|
|
16032
17151
|
for (var i in this._values)
|
16033
17152
|
ret.push(f(this._values[i], i.substr(1)));
|
16034
17153
|
return ret;
|
16035
|
-
}
|
17154
|
+
},
|
17155
|
+
toObject: function() { return this._values }
|
17156
|
+
};
|
17157
|
+
Dictionary.fromObject = function(obj) {
|
17158
|
+
var dict = new Dictionary();
|
17159
|
+
dict._size = merge(dict._values, obj);
|
17160
|
+
return dict;
|
16036
17161
|
};
|
16037
17162
|
|
16038
17163
|
/***********************************************************************
|
@@ -16121,7 +17246,7 @@ function DEFNODE(type, props, methods, base) {
|
|
16121
17246
|
return ctor;
|
16122
17247
|
};
|
16123
17248
|
|
16124
|
-
var AST_Token = DEFNODE("Token", "type value line col pos endpos nlb comments_before file", {
|
17249
|
+
var AST_Token = DEFNODE("Token", "type value line col pos endline endcol endpos nlb comments_before file", {
|
16125
17250
|
}, null);
|
16126
17251
|
|
16127
17252
|
var AST_Node = DEFNODE("Node", "start end", {
|
@@ -16157,11 +17282,12 @@ var AST_Debugger = DEFNODE("Debugger", null, {
|
|
16157
17282
|
$documentation: "Represents a debugger statement",
|
16158
17283
|
}, AST_Statement);
|
16159
17284
|
|
16160
|
-
var AST_Directive = DEFNODE("Directive", "value scope", {
|
17285
|
+
var AST_Directive = DEFNODE("Directive", "value scope quote", {
|
16161
17286
|
$documentation: "Represents a directive, like \"use strict\";",
|
16162
17287
|
$propdoc: {
|
16163
17288
|
value: "[string] The value of this directive as a plain string (it's not an AST_String!)",
|
16164
|
-
scope: "[AST_Scope/S] The scope that this directive affects"
|
17289
|
+
scope: "[AST_Scope/S] The scope that this directive affects",
|
17290
|
+
quote: "[string] the original quote character"
|
16165
17291
|
},
|
16166
17292
|
}, AST_Statement);
|
16167
17293
|
|
@@ -16242,21 +17368,27 @@ var AST_DWLoop = DEFNODE("DWLoop", "condition", {
|
|
16242
17368
|
$documentation: "Base class for do/while statements",
|
16243
17369
|
$propdoc: {
|
16244
17370
|
condition: "[AST_Node] the loop condition. Should not be instanceof AST_Statement"
|
16245
|
-
},
|
16246
|
-
_walk: function(visitor) {
|
16247
|
-
return visitor._visit(this, function(){
|
16248
|
-
this.condition._walk(visitor);
|
16249
|
-
this.body._walk(visitor);
|
16250
|
-
});
|
16251
17371
|
}
|
16252
17372
|
}, AST_IterationStatement);
|
16253
17373
|
|
16254
17374
|
var AST_Do = DEFNODE("Do", null, {
|
16255
17375
|
$documentation: "A `do` statement",
|
17376
|
+
_walk: function(visitor) {
|
17377
|
+
return visitor._visit(this, function(){
|
17378
|
+
this.body._walk(visitor);
|
17379
|
+
this.condition._walk(visitor);
|
17380
|
+
});
|
17381
|
+
}
|
16256
17382
|
}, AST_DWLoop);
|
16257
17383
|
|
16258
17384
|
var AST_While = DEFNODE("While", null, {
|
16259
17385
|
$documentation: "A `while` statement",
|
17386
|
+
_walk: function(visitor) {
|
17387
|
+
return visitor._visit(this, function(){
|
17388
|
+
this.condition._walk(visitor);
|
17389
|
+
this.body._walk(visitor);
|
17390
|
+
});
|
17391
|
+
}
|
16260
17392
|
}, AST_DWLoop);
|
16261
17393
|
|
16262
17394
|
var AST_For = DEFNODE("For", "init condition step", {
|
@@ -16797,8 +17929,11 @@ var AST_ObjectProperty = DEFNODE("ObjectProperty", "key value", {
|
|
16797
17929
|
}
|
16798
17930
|
});
|
16799
17931
|
|
16800
|
-
var AST_ObjectKeyVal = DEFNODE("ObjectKeyVal",
|
17932
|
+
var AST_ObjectKeyVal = DEFNODE("ObjectKeyVal", "quote", {
|
16801
17933
|
$documentation: "A key: value object property",
|
17934
|
+
$propdoc: {
|
17935
|
+
quote: "[string] the original quote character"
|
17936
|
+
}
|
16802
17937
|
}, AST_ObjectProperty);
|
16803
17938
|
|
16804
17939
|
var AST_ObjectSetter = DEFNODE("ObjectSetter", null, {
|
@@ -16883,10 +18018,11 @@ var AST_Constant = DEFNODE("Constant", null, {
|
|
16883
18018
|
}
|
16884
18019
|
});
|
16885
18020
|
|
16886
|
-
var AST_String = DEFNODE("String", "value", {
|
18021
|
+
var AST_String = DEFNODE("String", "value quote", {
|
16887
18022
|
$documentation: "A string literal",
|
16888
18023
|
$propdoc: {
|
16889
|
-
value: "[string] the contents of this string"
|
18024
|
+
value: "[string] the contents of this string",
|
18025
|
+
quote: "[string] the original quote character"
|
16890
18026
|
}
|
16891
18027
|
}, AST_Constant);
|
16892
18028
|
|
@@ -17130,7 +18266,7 @@ var OPERATORS = makePredicate([
|
|
17130
18266
|
"||"
|
17131
18267
|
]);
|
17132
18268
|
|
17133
|
-
var WHITESPACE_CHARS = makePredicate(characters(" \u00a0\n\r\t\f\u000b\u200b\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000"));
|
18269
|
+
var WHITESPACE_CHARS = makePredicate(characters(" \u00a0\n\r\t\f\u000b\u200b\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\uFEFF"));
|
17134
18270
|
|
17135
18271
|
var PUNC_BEFORE_EXPRESSION = makePredicate(characters("[{(,.;:"));
|
17136
18272
|
|
@@ -17142,7 +18278,8 @@ var REGEXP_MODIFIERS = makePredicate(characters("gmsiy"));
|
|
17142
18278
|
|
17143
18279
|
// regexps adapted from http://xregexp.com/plugins/#unicode
|
17144
18280
|
var UNICODE = {
|
17145
|
-
letter: new RegExp("[\\u0041-\\u005A\\u0061-\\u007A\\u00AA\\u00B5\\u00BA\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\
|
18281
|
+
letter: new RegExp("[\\u0041-\\u005A\\u0061-\\u007A\\u00AA\\u00B5\\u00BA\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\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-\\u08B2\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\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-\\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-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\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-\\uA69D\\uA6A0-\\uA6EF\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA78E\\uA790-\\uA7AD\\uA7B0\\uA7B1\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB5F\\uAB64\\uAB65\\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]"),
|
18282
|
+
digit: new RegExp("[\\u0030-\\u0039\\u0660-\\u0669\\u06F0-\\u06F9\\u07C0-\\u07C9\\u0966-\\u096F\\u09E6-\\u09EF\\u0A66-\\u0A6F\\u0AE6-\\u0AEF\\u0B66-\\u0B6F\\u0BE6-\\u0BEF\\u0C66-\\u0C6F\\u0CE6-\\u0CEF\\u0D66-\\u0D6F\\u0DE6-\\u0DEF\\u0E50-\\u0E59\\u0ED0-\\u0ED9\\u0F20-\\u0F29\\u1040-\\u1049\\u1090-\\u1099\\u17E0-\\u17E9\\u1810-\\u1819\\u1946-\\u194F\\u19D0-\\u19D9\\u1A80-\\u1A89\\u1A90-\\u1A99\\u1B50-\\u1B59\\u1BB0-\\u1BB9\\u1C40-\\u1C49\\u1C50-\\u1C59\\uA620-\\uA629\\uA8D0-\\uA8D9\\uA900-\\uA909\\uA9D0-\\uA9D9\\uA9F0-\\uA9F9\\uAA50-\\uAA59\\uABF0-\\uABF9\\uFF10-\\uFF19]"),
|
17146
18283
|
non_spacing_mark: new RegExp("[\\u0300-\\u036F\\u0483-\\u0487\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065E\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0900-\\u0902\\u093C\\u0941-\\u0948\\u094D\\u0951-\\u0955\\u0962\\u0963\\u0981\\u09BC\\u09C1-\\u09C4\\u09CD\\u09E2\\u09E3\\u0A01\\u0A02\\u0A3C\\u0A41\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81\\u0A82\\u0ABC\\u0AC1-\\u0AC5\\u0AC7\\u0AC8\\u0ACD\\u0AE2\\u0AE3\\u0B01\\u0B3C\\u0B3F\\u0B41-\\u0B44\\u0B4D\\u0B56\\u0B62\\u0B63\\u0B82\\u0BC0\\u0BCD\\u0C3E-\\u0C40\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0CBC\\u0CBF\\u0CC6\\u0CCC\\u0CCD\\u0CE2\\u0CE3\\u0D41-\\u0D44\\u0D4D\\u0D62\\u0D63\\u0DCA\\u0DD2-\\u0DD4\\u0DD6\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F71-\\u0F7E\\u0F80-\\u0F84\\u0F86\\u0F87\\u0F90-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102D-\\u1030\\u1032-\\u1037\\u1039\\u103A\\u103D\\u103E\\u1058\\u1059\\u105E-\\u1060\\u1071-\\u1074\\u1082\\u1085\\u1086\\u108D\\u109D\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B7-\\u17BD\\u17C6\\u17C9-\\u17D3\\u17DD\\u180B-\\u180D\\u18A9\\u1920-\\u1922\\u1927\\u1928\\u1932\\u1939-\\u193B\\u1A17\\u1A18\\u1A56\\u1A58-\\u1A5E\\u1A60\\u1A62\\u1A65-\\u1A6C\\u1A73-\\u1A7C\\u1A7F\\u1B00-\\u1B03\\u1B34\\u1B36-\\u1B3A\\u1B3C\\u1B42\\u1B6B-\\u1B73\\u1B80\\u1B81\\u1BA2-\\u1BA5\\u1BA8\\u1BA9\\u1C2C-\\u1C33\\u1C36\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE0\\u1CE2-\\u1CE8\\u1CED\\u1DC0-\\u1DE6\\u1DFD-\\u1DFF\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2CEF-\\u2CF1\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F\\uA67C\\uA67D\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA825\\uA826\\uA8C4\\uA8E0-\\uA8F1\\uA926-\\uA92D\\uA947-\\uA951\\uA980-\\uA982\\uA9B3\\uA9B6-\\uA9B9\\uA9BC\\uAA29-\\uAA2E\\uAA31\\uAA32\\uAA35\\uAA36\\uAA43\\uAA4C\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uABE5\\uABE8\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE26]"),
|
17147
18284
|
space_combining_mark: new RegExp("[\\u0903\\u093E-\\u0940\\u0949-\\u094C\\u094E\\u0982\\u0983\\u09BE-\\u09C0\\u09C7\\u09C8\\u09CB\\u09CC\\u09D7\\u0A03\\u0A3E-\\u0A40\\u0A83\\u0ABE-\\u0AC0\\u0AC9\\u0ACB\\u0ACC\\u0B02\\u0B03\\u0B3E\\u0B40\\u0B47\\u0B48\\u0B4B\\u0B4C\\u0B57\\u0BBE\\u0BBF\\u0BC1\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCC\\u0BD7\\u0C01-\\u0C03\\u0C41-\\u0C44\\u0C82\\u0C83\\u0CBE\\u0CC0-\\u0CC4\\u0CC7\\u0CC8\\u0CCA\\u0CCB\\u0CD5\\u0CD6\\u0D02\\u0D03\\u0D3E-\\u0D40\\u0D46-\\u0D48\\u0D4A-\\u0D4C\\u0D57\\u0D82\\u0D83\\u0DCF-\\u0DD1\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0F3E\\u0F3F\\u0F7F\\u102B\\u102C\\u1031\\u1038\\u103B\\u103C\\u1056\\u1057\\u1062-\\u1064\\u1067-\\u106D\\u1083\\u1084\\u1087-\\u108C\\u108F\\u109A-\\u109C\\u17B6\\u17BE-\\u17C5\\u17C7\\u17C8\\u1923-\\u1926\\u1929-\\u192B\\u1930\\u1931\\u1933-\\u1938\\u19B0-\\u19C0\\u19C8\\u19C9\\u1A19-\\u1A1B\\u1A55\\u1A57\\u1A61\\u1A63\\u1A64\\u1A6D-\\u1A72\\u1B04\\u1B35\\u1B3B\\u1B3D-\\u1B41\\u1B43\\u1B44\\u1B82\\u1BA1\\u1BA6\\u1BA7\\u1BAA\\u1C24-\\u1C2B\\u1C34\\u1C35\\u1CE1\\u1CF2\\uA823\\uA824\\uA827\\uA880\\uA881\\uA8B4-\\uA8C3\\uA952\\uA953\\uA983\\uA9B4\\uA9B5\\uA9BA\\uA9BB\\uA9BD-\\uA9C0\\uAA2F\\uAA30\\uAA33\\uAA34\\uAA4D\\uAA7B\\uABE3\\uABE4\\uABE6\\uABE7\\uABE9\\uABEA\\uABEC]"),
|
17148
18285
|
connector_punctuation: new RegExp("[\\u005F\\u203F\\u2040\\u2054\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFF3F]")
|
@@ -17155,13 +18292,17 @@ function is_letter(code) {
|
|
17155
18292
|
};
|
17156
18293
|
|
17157
18294
|
function is_digit(code) {
|
17158
|
-
return code >= 48 && code <= 57;
|
18295
|
+
return code >= 48 && code <= 57;
|
17159
18296
|
};
|
17160
18297
|
|
17161
18298
|
function is_alphanumeric_char(code) {
|
17162
18299
|
return is_digit(code) || is_letter(code);
|
17163
18300
|
};
|
17164
18301
|
|
18302
|
+
function is_unicode_digit(code) {
|
18303
|
+
return UNICODE.digit.test(String.fromCharCode(code));
|
18304
|
+
}
|
18305
|
+
|
17165
18306
|
function is_unicode_combining_mark(ch) {
|
17166
18307
|
return UNICODE.non_spacing_mark.test(ch) || UNICODE.space_combining_mark.test(ch);
|
17167
18308
|
};
|
@@ -17186,6 +18327,7 @@ function is_identifier_char(ch) {
|
|
17186
18327
|
|| code == 8205 // \u200d: zero-width joiner <ZWJ> (in my ECMA-262 PDF, this is also 200c)
|
17187
18328
|
|| is_unicode_combining_mark(ch)
|
17188
18329
|
|| is_unicode_connector_punctuation(ch)
|
18330
|
+
|| is_unicode_digit(code)
|
17189
18331
|
;
|
17190
18332
|
};
|
17191
18333
|
|
@@ -17203,8 +18345,9 @@ function parse_js_number(num) {
|
|
17203
18345
|
}
|
17204
18346
|
};
|
17205
18347
|
|
17206
|
-
function JS_Parse_Error(message, line, col, pos) {
|
18348
|
+
function JS_Parse_Error(message, filename, line, col, pos) {
|
17207
18349
|
this.message = message;
|
18350
|
+
this.filename = filename;
|
17208
18351
|
this.line = line;
|
17209
18352
|
this.col = col;
|
17210
18353
|
this.pos = pos;
|
@@ -17216,7 +18359,7 @@ JS_Parse_Error.prototype.toString = function() {
|
|
17216
18359
|
};
|
17217
18360
|
|
17218
18361
|
function js_error(message, filename, line, col, pos) {
|
17219
|
-
throw new JS_Parse_Error(message, line, col, pos);
|
18362
|
+
throw new JS_Parse_Error(message, filename, line, col, pos);
|
17220
18363
|
};
|
17221
18364
|
|
17222
18365
|
function is_token(token, type, val) {
|
@@ -17228,7 +18371,7 @@ var EX_EOF = {};
|
|
17228
18371
|
function tokenizer($TEXT, filename, html5_comments) {
|
17229
18372
|
|
17230
18373
|
var S = {
|
17231
|
-
text : $TEXT
|
18374
|
+
text : $TEXT,
|
17232
18375
|
filename : filename,
|
17233
18376
|
pos : 0,
|
17234
18377
|
tokpos : 0,
|
@@ -17247,10 +18390,15 @@ function tokenizer($TEXT, filename, html5_comments) {
|
|
17247
18390
|
var ch = S.text.charAt(S.pos++);
|
17248
18391
|
if (signal_eof && !ch)
|
17249
18392
|
throw EX_EOF;
|
17250
|
-
if (
|
18393
|
+
if ("\r\n\u2028\u2029".indexOf(ch) >= 0) {
|
17251
18394
|
S.newline_before = S.newline_before || !in_string;
|
17252
18395
|
++S.line;
|
17253
18396
|
S.col = 0;
|
18397
|
+
if (!in_string && ch == "\r" && peek() == "\n") {
|
18398
|
+
// treat a \r\n sequence as a single \n
|
18399
|
+
++S.pos;
|
18400
|
+
ch = "\n";
|
18401
|
+
}
|
17254
18402
|
} else {
|
17255
18403
|
++S.col;
|
17256
18404
|
}
|
@@ -17284,14 +18432,16 @@ function tokenizer($TEXT, filename, html5_comments) {
|
|
17284
18432
|
(type == "punc" && PUNC_BEFORE_EXPRESSION(value)));
|
17285
18433
|
prev_was_dot = (type == "punc" && value == ".");
|
17286
18434
|
var ret = {
|
17287
|
-
type
|
17288
|
-
value
|
17289
|
-
line
|
17290
|
-
col
|
17291
|
-
pos
|
17292
|
-
|
17293
|
-
|
17294
|
-
|
18435
|
+
type : type,
|
18436
|
+
value : value,
|
18437
|
+
line : S.tokline,
|
18438
|
+
col : S.tokcol,
|
18439
|
+
pos : S.tokpos,
|
18440
|
+
endline : S.line,
|
18441
|
+
endcol : S.col,
|
18442
|
+
endpos : S.pos,
|
18443
|
+
nlb : S.newline_before,
|
18444
|
+
file : filename
|
17295
18445
|
};
|
17296
18446
|
if (!is_comment) {
|
17297
18447
|
ret.comments_before = S.comments_before;
|
@@ -17306,7 +18456,8 @@ function tokenizer($TEXT, filename, html5_comments) {
|
|
17306
18456
|
};
|
17307
18457
|
|
17308
18458
|
function skip_whitespace() {
|
17309
|
-
|
18459
|
+
var ch;
|
18460
|
+
while (WHITESPACE_CHARS(ch = peek()) || ch == "\u2028" || ch == "\u2029")
|
17310
18461
|
next();
|
17311
18462
|
};
|
17312
18463
|
|
@@ -17361,8 +18512,13 @@ function tokenizer($TEXT, filename, html5_comments) {
|
|
17361
18512
|
case 120 : return String.fromCharCode(hex_bytes(2)); // \x
|
17362
18513
|
case 117 : return String.fromCharCode(hex_bytes(4)); // \u
|
17363
18514
|
case 10 : return ""; // newline
|
17364
|
-
|
18515
|
+
case 13 : // \r
|
18516
|
+
if (peek() == "\n") { // DOS newline
|
18517
|
+
next(true, in_string);
|
18518
|
+
return "";
|
18519
|
+
}
|
17365
18520
|
}
|
18521
|
+
return ch;
|
17366
18522
|
};
|
17367
18523
|
|
17368
18524
|
function hex_bytes(n) {
|
@@ -17376,10 +18532,10 @@ function tokenizer($TEXT, filename, html5_comments) {
|
|
17376
18532
|
return num;
|
17377
18533
|
};
|
17378
18534
|
|
17379
|
-
var read_string = with_eof_error("Unterminated string constant", function(){
|
18535
|
+
var read_string = with_eof_error("Unterminated string constant", function(quote_char){
|
17380
18536
|
var quote = next(), ret = "";
|
17381
18537
|
for (;;) {
|
17382
|
-
var ch = next(true);
|
18538
|
+
var ch = next(true, true);
|
17383
18539
|
if (ch == "\\") {
|
17384
18540
|
// read OctalEscapeSequence (XXX: deprecated if "strict mode")
|
17385
18541
|
// https://github.com/mishoo/UglifyJS/issues/178
|
@@ -17401,7 +18557,9 @@ function tokenizer($TEXT, filename, html5_comments) {
|
|
17401
18557
|
else if (ch == quote) break;
|
17402
18558
|
ret += ch;
|
17403
18559
|
}
|
17404
|
-
|
18560
|
+
var tok = token("string", ret);
|
18561
|
+
tok.quote = quote_char;
|
18562
|
+
return tok;
|
17405
18563
|
});
|
17406
18564
|
|
17407
18565
|
function skip_line_comment(type) {
|
@@ -17414,6 +18572,7 @@ function tokenizer($TEXT, filename, html5_comments) {
|
|
17414
18572
|
ret = S.text.substring(S.pos, i);
|
17415
18573
|
S.pos = i;
|
17416
18574
|
}
|
18575
|
+
S.col = S.tokcol + (S.pos - S.tokpos);
|
17417
18576
|
S.comments_before.push(token(type, ret, true));
|
17418
18577
|
S.regex_allowed = regex_allowed;
|
17419
18578
|
return next_token();
|
@@ -17555,7 +18714,7 @@ function tokenizer($TEXT, filename, html5_comments) {
|
|
17555
18714
|
if (!ch) return token("eof");
|
17556
18715
|
var code = ch.charCodeAt(0);
|
17557
18716
|
switch (code) {
|
17558
|
-
case 34: case 39: return read_string();
|
18717
|
+
case 34: case 39: return read_string(ch);
|
17559
18718
|
case 46: return handle_dot();
|
17560
18719
|
case 47: return handle_slash();
|
17561
18720
|
}
|
@@ -17745,8 +18904,14 @@ function parse($TEXT, options) {
|
|
17745
18904
|
case "string":
|
17746
18905
|
var dir = S.in_directives, stat = simple_statement();
|
17747
18906
|
// XXXv2: decide how to fix directives
|
17748
|
-
if (dir && stat.body instanceof AST_String && !is("punc", ","))
|
17749
|
-
return new AST_Directive({
|
18907
|
+
if (dir && stat.body instanceof AST_String && !is("punc", ",")) {
|
18908
|
+
return new AST_Directive({
|
18909
|
+
start : stat.body.start,
|
18910
|
+
end : stat.body.end,
|
18911
|
+
quote : stat.body.quote,
|
18912
|
+
value : stat.body.value,
|
18913
|
+
});
|
18914
|
+
}
|
17750
18915
|
return stat;
|
17751
18916
|
case "num":
|
17752
18917
|
case "regexp":
|
@@ -18132,7 +19297,12 @@ function parse($TEXT, options) {
|
|
18132
19297
|
ret = new AST_Number({ start: tok, end: tok, value: tok.value });
|
18133
19298
|
break;
|
18134
19299
|
case "string":
|
18135
|
-
ret = new AST_String({
|
19300
|
+
ret = new AST_String({
|
19301
|
+
start : tok,
|
19302
|
+
end : tok,
|
19303
|
+
value : tok.value,
|
19304
|
+
quote : tok.quote
|
19305
|
+
});
|
18136
19306
|
break;
|
18137
19307
|
case "regexp":
|
18138
19308
|
ret = new AST_RegExp({ start: tok, end: tok, value: tok.value });
|
@@ -18245,6 +19415,7 @@ function parse($TEXT, options) {
|
|
18245
19415
|
expect(":");
|
18246
19416
|
a.push(new AST_ObjectKeyVal({
|
18247
19417
|
start : start,
|
19418
|
+
quote : start.quote,
|
18248
19419
|
key : name,
|
18249
19420
|
value : expression(false),
|
18250
19421
|
end : prev()
|
@@ -18750,23 +19921,36 @@ function SymbolDef(scope, index, orig) {
|
|
18750
19921
|
|
18751
19922
|
SymbolDef.prototype = {
|
18752
19923
|
unmangleable: function(options) {
|
18753
|
-
|
19924
|
+
if (!options) options = {};
|
19925
|
+
|
19926
|
+
return (this.global && !options.toplevel)
|
18754
19927
|
|| this.undeclared
|
18755
|
-
|| (!
|
19928
|
+
|| (!options.eval && (this.scope.uses_eval || this.scope.uses_with))
|
19929
|
+
|| (options.keep_fnames
|
19930
|
+
&& (this.orig[0] instanceof AST_SymbolLambda
|
19931
|
+
|| this.orig[0] instanceof AST_SymbolDefun));
|
18756
19932
|
},
|
18757
19933
|
mangle: function(options) {
|
18758
|
-
|
19934
|
+
var cache = options.cache && options.cache.props;
|
19935
|
+
if (this.global && cache && cache.has(this.name)) {
|
19936
|
+
this.mangled_name = cache.get(this.name);
|
19937
|
+
}
|
19938
|
+
else if (!this.mangled_name && !this.unmangleable(options)) {
|
18759
19939
|
var s = this.scope;
|
18760
19940
|
if (!options.screw_ie8 && this.orig[0] instanceof AST_SymbolLambda)
|
18761
19941
|
s = s.parent_scope;
|
18762
19942
|
this.mangled_name = s.next_mangled(options, this);
|
19943
|
+
if (this.global && cache) {
|
19944
|
+
cache.set(this.name, this.mangled_name);
|
19945
|
+
}
|
18763
19946
|
}
|
18764
19947
|
}
|
18765
19948
|
};
|
18766
19949
|
|
18767
19950
|
AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
|
18768
19951
|
options = defaults(options, {
|
18769
|
-
screw_ie8: false
|
19952
|
+
screw_ie8: false,
|
19953
|
+
cache: null
|
18770
19954
|
});
|
18771
19955
|
|
18772
19956
|
// pass 1: setup scope chaining and handle definitions
|
@@ -18871,6 +20055,10 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
|
|
18871
20055
|
}
|
18872
20056
|
});
|
18873
20057
|
self.walk(tw);
|
20058
|
+
|
20059
|
+
if (options.cache) {
|
20060
|
+
this.cname = options.cache.cname;
|
20061
|
+
}
|
18874
20062
|
});
|
18875
20063
|
|
18876
20064
|
AST_Scope.DEFMETHOD("init_scope_vars", function(nesting){
|
@@ -19015,11 +20203,12 @@ AST_Symbol.DEFMETHOD("global", function(){
|
|
19015
20203
|
|
19016
20204
|
AST_Toplevel.DEFMETHOD("_default_mangler_options", function(options){
|
19017
20205
|
return defaults(options, {
|
19018
|
-
except
|
19019
|
-
eval
|
19020
|
-
sort
|
19021
|
-
toplevel
|
19022
|
-
screw_ie8
|
20206
|
+
except : [],
|
20207
|
+
eval : false,
|
20208
|
+
sort : false,
|
20209
|
+
toplevel : false,
|
20210
|
+
screw_ie8 : false,
|
20211
|
+
keep_fnames : false
|
19023
20212
|
});
|
19024
20213
|
});
|
19025
20214
|
|
@@ -19031,6 +20220,15 @@ AST_Toplevel.DEFMETHOD("mangle_names", function(options){
|
|
19031
20220
|
// the AST_SymbolDeclaration that it points to).
|
19032
20221
|
var lname = -1;
|
19033
20222
|
var to_mangle = [];
|
20223
|
+
|
20224
|
+
if (options.cache) {
|
20225
|
+
this.globals.each(function(symbol){
|
20226
|
+
if (options.except.indexOf(symbol.name) < 0) {
|
20227
|
+
to_mangle.push(symbol);
|
20228
|
+
}
|
20229
|
+
});
|
20230
|
+
}
|
20231
|
+
|
19034
20232
|
var tw = new TreeWalker(function(node, descend){
|
19035
20233
|
if (node instanceof AST_LabeledStatement) {
|
19036
20234
|
// lname is incremented when we get to the AST_Label
|
@@ -19065,6 +20263,10 @@ AST_Toplevel.DEFMETHOD("mangle_names", function(options){
|
|
19065
20263
|
});
|
19066
20264
|
this.walk(tw);
|
19067
20265
|
to_mangle.forEach(function(def){ def.mangle(options) });
|
20266
|
+
|
20267
|
+
if (options.cache) {
|
20268
|
+
options.cache.cname = this.cname;
|
20269
|
+
}
|
19068
20270
|
});
|
19069
20271
|
|
19070
20272
|
AST_Toplevel.DEFMETHOD("compute_char_frequency", function(options){
|
@@ -19164,7 +20366,9 @@ var base54 = (function() {
|
|
19164
20366
|
base54.freq = function(){ return frequency };
|
19165
20367
|
function base54(num) {
|
19166
20368
|
var ret = "", base = 54;
|
20369
|
+
num++;
|
19167
20370
|
do {
|
20371
|
+
num--;
|
19168
20372
|
ret += String.fromCharCode(chars[num % base]);
|
19169
20373
|
num = Math.floor(num / base);
|
19170
20374
|
base = 64;
|
@@ -19325,6 +20529,7 @@ function OutputStream(options) {
|
|
19325
20529
|
preserve_line : false,
|
19326
20530
|
screw_ie8 : false,
|
19327
20531
|
preamble : null,
|
20532
|
+
quote_style : 0
|
19328
20533
|
}, true);
|
19329
20534
|
|
19330
20535
|
var indentation = 0;
|
@@ -19346,9 +20551,9 @@ function OutputStream(options) {
|
|
19346
20551
|
});
|
19347
20552
|
};
|
19348
20553
|
|
19349
|
-
function make_string(str) {
|
20554
|
+
function make_string(str, quote) {
|
19350
20555
|
var dq = 0, sq = 0;
|
19351
|
-
str = str.replace(/[\\\b\f\n\r\t\x22\x27\u2028\u2029\0]/g, function(s){
|
20556
|
+
str = str.replace(/[\\\b\f\n\r\t\x22\x27\u2028\u2029\0\ufeff]/g, function(s){
|
19352
20557
|
switch (s) {
|
19353
20558
|
case "\\": return "\\\\";
|
19354
20559
|
case "\b": return "\\b";
|
@@ -19360,16 +20565,31 @@ function OutputStream(options) {
|
|
19360
20565
|
case '"': ++dq; return '"';
|
19361
20566
|
case "'": ++sq; return "'";
|
19362
20567
|
case "\0": return "\\x00";
|
20568
|
+
case "\ufeff": return "\\ufeff";
|
19363
20569
|
}
|
19364
20570
|
return s;
|
19365
20571
|
});
|
20572
|
+
function quote_single() {
|
20573
|
+
return "'" + str.replace(/\x27/g, "\\'") + "'";
|
20574
|
+
}
|
20575
|
+
function quote_double() {
|
20576
|
+
return '"' + str.replace(/\x22/g, '\\"') + '"';
|
20577
|
+
}
|
19366
20578
|
if (options.ascii_only) str = to_ascii(str);
|
19367
|
-
|
19368
|
-
|
20579
|
+
switch (options.quote_style) {
|
20580
|
+
case 1:
|
20581
|
+
return quote_single();
|
20582
|
+
case 2:
|
20583
|
+
return quote_double();
|
20584
|
+
case 3:
|
20585
|
+
return quote == "'" ? quote_single() : quote_double();
|
20586
|
+
default:
|
20587
|
+
return dq > sq ? quote_single() : quote_double();
|
20588
|
+
}
|
19369
20589
|
};
|
19370
20590
|
|
19371
|
-
function encode_string(str) {
|
19372
|
-
var ret = make_string(str);
|
20591
|
+
function encode_string(str, quote) {
|
20592
|
+
var ret = make_string(str, quote);
|
19373
20593
|
if (options.inline_script)
|
19374
20594
|
ret = ret.replace(/<\x2fscript([>\/\t\n\f\r ])/gi, "<\\/script$1");
|
19375
20595
|
return ret;
|
@@ -19422,7 +20642,6 @@ function OutputStream(options) {
|
|
19422
20642
|
might_need_space = false;
|
19423
20643
|
}
|
19424
20644
|
might_need_semicolon = false;
|
19425
|
-
maybe_newline();
|
19426
20645
|
}
|
19427
20646
|
|
19428
20647
|
if (!options.beautify && options.preserve_line && stack[stack.length - 1]) {
|
@@ -19483,7 +20702,7 @@ function OutputStream(options) {
|
|
19483
20702
|
|
19484
20703
|
var newline = options.beautify ? function() {
|
19485
20704
|
print("\n");
|
19486
|
-
} :
|
20705
|
+
} : maybe_newline;
|
19487
20706
|
|
19488
20707
|
var semicolon = options.beautify ? function() {
|
19489
20708
|
print(";");
|
@@ -19585,7 +20804,7 @@ function OutputStream(options) {
|
|
19585
20804
|
force_semicolon : force_semicolon,
|
19586
20805
|
to_ascii : to_ascii,
|
19587
20806
|
print_name : function(name) { print(make_name(name)) },
|
19588
|
-
print_string : function(str) { print(encode_string(str)) },
|
20807
|
+
print_string : function(str, quote) { print(encode_string(str, quote)) },
|
19589
20808
|
next_indent : next_indent,
|
19590
20809
|
with_indent : with_indent,
|
19591
20810
|
with_block : with_block,
|
@@ -19674,6 +20893,15 @@ function OutputStream(options) {
|
|
19674
20893
|
return c(self, comment);
|
19675
20894
|
});
|
19676
20895
|
}
|
20896
|
+
|
20897
|
+
// Keep single line comments after nlb, after nlb
|
20898
|
+
if (!output.option("beautify") && comments.length > 0 &&
|
20899
|
+
/comment[134]/.test(comments[0].type) &&
|
20900
|
+
output.col() !== 0 && comments[0].nlb)
|
20901
|
+
{
|
20902
|
+
output.print("\n");
|
20903
|
+
}
|
20904
|
+
|
19677
20905
|
comments.forEach(function(c){
|
19678
20906
|
if (/comment[134]/.test(c.type)) {
|
19679
20907
|
output.print("//" + c.value + "\n");
|
@@ -19811,12 +21039,6 @@ function OutputStream(options) {
|
|
19811
21039
|
return true;
|
19812
21040
|
});
|
19813
21041
|
|
19814
|
-
PARENS(AST_NaN, function(output){
|
19815
|
-
var p = output.parent();
|
19816
|
-
if (p instanceof AST_PropAccess && p.expression === this)
|
19817
|
-
return true;
|
19818
|
-
});
|
19819
|
-
|
19820
21042
|
PARENS([ AST_Assign, AST_Conditional ], function (output){
|
19821
21043
|
var p = output.parent();
|
19822
21044
|
// !(a = false) → true
|
@@ -19839,7 +21061,7 @@ function OutputStream(options) {
|
|
19839
21061
|
/* -----[ PRINTERS ]----- */
|
19840
21062
|
|
19841
21063
|
DEFPRINT(AST_Directive, function(self, output){
|
19842
|
-
output.print_string(self.value);
|
21064
|
+
output.print_string(self.value, self.quote);
|
19843
21065
|
output.semicolon();
|
19844
21066
|
});
|
19845
21067
|
DEFPRINT(AST_Debugger, function(self, output){
|
@@ -20335,6 +21557,7 @@ function OutputStream(options) {
|
|
20335
21557
|
});
|
20336
21558
|
DEFPRINT(AST_ObjectKeyVal, function(self, output){
|
20337
21559
|
var key = self.key;
|
21560
|
+
var quote = self.quote;
|
20338
21561
|
if (output.option("quote_keys")) {
|
20339
21562
|
output.print_string(key + "");
|
20340
21563
|
} else if ((typeof key == "number"
|
@@ -20345,7 +21568,7 @@ function OutputStream(options) {
|
|
20345
21568
|
} else if (RESERVED_WORDS(key) ? output.option("screw_ie8") : is_identifier_string(key)) {
|
20346
21569
|
output.print_name(key);
|
20347
21570
|
} else {
|
20348
|
-
output.print_string(key);
|
21571
|
+
output.print_string(key, quote);
|
20349
21572
|
}
|
20350
21573
|
output.colon();
|
20351
21574
|
self.value.print(output);
|
@@ -20371,10 +21594,10 @@ function OutputStream(options) {
|
|
20371
21594
|
});
|
20372
21595
|
DEFPRINT(AST_Hole, noop);
|
20373
21596
|
DEFPRINT(AST_Infinity, function(self, output){
|
20374
|
-
output.print("
|
21597
|
+
output.print("Infinity");
|
20375
21598
|
});
|
20376
21599
|
DEFPRINT(AST_NaN, function(self, output){
|
20377
|
-
output.print("
|
21600
|
+
output.print("NaN");
|
20378
21601
|
});
|
20379
21602
|
DEFPRINT(AST_This, function(self, output){
|
20380
21603
|
output.print("this");
|
@@ -20383,7 +21606,7 @@ function OutputStream(options) {
|
|
20383
21606
|
output.print(self.getValue());
|
20384
21607
|
});
|
20385
21608
|
DEFPRINT(AST_String, function(self, output){
|
20386
|
-
output.print_string(self.getValue());
|
21609
|
+
output.print_string(self.getValue(), self.quote);
|
20387
21610
|
});
|
20388
21611
|
DEFPRINT(AST_Number, function(self, output){
|
20389
21612
|
output.print(make_num(self.getValue()));
|
@@ -20632,6 +21855,7 @@ function Compressor(options, false_by_default) {
|
|
20632
21855
|
unused : !false_by_default,
|
20633
21856
|
hoist_funs : !false_by_default,
|
20634
21857
|
keep_fargs : false,
|
21858
|
+
keep_fnames : false,
|
20635
21859
|
hoist_vars : false,
|
20636
21860
|
if_return : !false_by_default,
|
20637
21861
|
join_vars : !false_by_default,
|
@@ -20732,10 +21956,10 @@ merge(Compressor.prototype, {
|
|
20732
21956
|
return make_node(AST_Undefined, orig).optimize(compressor);
|
20733
21957
|
default:
|
20734
21958
|
if (val === null) {
|
20735
|
-
return make_node(AST_Null, orig).optimize(compressor);
|
21959
|
+
return make_node(AST_Null, orig, { value: null }).optimize(compressor);
|
20736
21960
|
}
|
20737
21961
|
if (val instanceof RegExp) {
|
20738
|
-
return make_node(AST_RegExp, orig).optimize(compressor);
|
21962
|
+
return make_node(AST_RegExp, orig, { value: val }).optimize(compressor);
|
20739
21963
|
}
|
20740
21964
|
throw new Error(string_template("Can't handle constant of type: {type}", {
|
20741
21965
|
type: typeof val
|
@@ -20795,6 +22019,17 @@ merge(Compressor.prototype, {
|
|
20795
22019
|
return statements;
|
20796
22020
|
|
20797
22021
|
function process_for_angular(statements) {
|
22022
|
+
function has_inject(comment) {
|
22023
|
+
return /@ngInject/.test(comment.value);
|
22024
|
+
}
|
22025
|
+
function make_arguments_names_list(func) {
|
22026
|
+
return func.argnames.map(function(sym){
|
22027
|
+
return make_node(AST_String, sym, { value: sym.name });
|
22028
|
+
});
|
22029
|
+
}
|
22030
|
+
function make_array(orig, elements) {
|
22031
|
+
return make_node(AST_Array, orig, { elements: elements });
|
22032
|
+
}
|
20798
22033
|
function make_injector(func, name) {
|
20799
22034
|
return make_node(AST_SimpleStatement, func, {
|
20800
22035
|
body: make_node(AST_Assign, func, {
|
@@ -20803,37 +22038,56 @@ merge(Compressor.prototype, {
|
|
20803
22038
|
expression: make_node(AST_SymbolRef, name, name),
|
20804
22039
|
property: "$inject"
|
20805
22040
|
}),
|
20806
|
-
right:
|
20807
|
-
elements: func.argnames.map(function(sym){
|
20808
|
-
return make_node(AST_String, sym, { value: sym.name });
|
20809
|
-
})
|
20810
|
-
})
|
22041
|
+
right: make_array(func, make_arguments_names_list(func))
|
20811
22042
|
})
|
20812
22043
|
});
|
20813
22044
|
}
|
22045
|
+
function check_expression(body) {
|
22046
|
+
if (body && body.args) {
|
22047
|
+
// if this is a function call check all of arguments passed
|
22048
|
+
body.args.forEach(function(argument, index, array) {
|
22049
|
+
var comments = argument.start.comments_before;
|
22050
|
+
// if the argument is function preceded by @ngInject
|
22051
|
+
if (argument instanceof AST_Lambda && comments.length && has_inject(comments[0])) {
|
22052
|
+
// replace the function with an array of names of its parameters and function at the end
|
22053
|
+
array[index] = make_array(argument, make_arguments_names_list(argument).concat(argument));
|
22054
|
+
}
|
22055
|
+
});
|
22056
|
+
// if this is chained call check previous one recursively
|
22057
|
+
if (body.expression && body.expression.expression) {
|
22058
|
+
check_expression(body.expression.expression);
|
22059
|
+
}
|
22060
|
+
}
|
22061
|
+
}
|
20814
22062
|
return statements.reduce(function(a, stat){
|
20815
22063
|
a.push(stat);
|
20816
|
-
|
20817
|
-
|
20818
|
-
|
20819
|
-
|
20820
|
-
|
20821
|
-
|
20822
|
-
|
20823
|
-
|
20824
|
-
|
20825
|
-
|
20826
|
-
stat
|
20827
|
-
|
20828
|
-
|
20829
|
-
|
20830
|
-
|
20831
|
-
|
20832
|
-
|
20833
|
-
|
22064
|
+
|
22065
|
+
if (stat.body && stat.body.args) {
|
22066
|
+
check_expression(stat.body);
|
22067
|
+
} else {
|
22068
|
+
var token = stat.start;
|
22069
|
+
var comments = token.comments_before;
|
22070
|
+
if (comments && comments.length > 0) {
|
22071
|
+
var last = comments.pop();
|
22072
|
+
if (has_inject(last)) {
|
22073
|
+
// case 1: defun
|
22074
|
+
if (stat instanceof AST_Defun) {
|
22075
|
+
a.push(make_injector(stat, stat.name));
|
22076
|
+
}
|
22077
|
+
else if (stat instanceof AST_Definitions) {
|
22078
|
+
stat.definitions.forEach(function(def) {
|
22079
|
+
if (def.value && def.value instanceof AST_Lambda) {
|
22080
|
+
a.push(make_injector(def.value, def.name));
|
22081
|
+
}
|
22082
|
+
});
|
22083
|
+
}
|
22084
|
+
else {
|
22085
|
+
compressor.warn("Unknown statement marked with @ngInject [{file}:{line},{col}]", token);
|
22086
|
+
}
|
20834
22087
|
}
|
20835
22088
|
}
|
20836
22089
|
}
|
22090
|
+
|
20837
22091
|
return a;
|
20838
22092
|
}, []);
|
20839
22093
|
}
|
@@ -21028,7 +22282,7 @@ merge(Compressor.prototype, {
|
|
21028
22282
|
seq = [];
|
21029
22283
|
};
|
21030
22284
|
statements.forEach(function(stat){
|
21031
|
-
if (stat instanceof AST_SimpleStatement) seq.push(stat.body);
|
22285
|
+
if (stat instanceof AST_SimpleStatement && seq.length < 2000) seq.push(stat.body);
|
21032
22286
|
else push_seq(), ret.push(stat);
|
21033
22287
|
});
|
21034
22288
|
push_seq();
|
@@ -21519,7 +22773,7 @@ merge(Compressor.prototype, {
|
|
21519
22773
|
def(AST_BlockStatement, block_aborts);
|
21520
22774
|
def(AST_SwitchBranch, block_aborts);
|
21521
22775
|
def(AST_If, function(){
|
21522
|
-
return this.alternative && aborts(this.body) && aborts(this.alternative);
|
22776
|
+
return this.alternative && aborts(this.body) && aborts(this.alternative) && this;
|
21523
22777
|
});
|
21524
22778
|
})(function(node, func){
|
21525
22779
|
node.DEFMETHOD("aborts", func);
|
@@ -21625,7 +22879,7 @@ merge(Compressor.prototype, {
|
|
21625
22879
|
var tt = new TreeTransformer(
|
21626
22880
|
function before(node, descend, in_list) {
|
21627
22881
|
if (node instanceof AST_Lambda && !(node instanceof AST_Accessor)) {
|
21628
|
-
if (!compressor.option("keep_fargs")) {
|
22882
|
+
if (compressor.option("unsafe") && !compressor.option("keep_fargs")) {
|
21629
22883
|
for (var a = node.argnames, i = a.length; --i >= 0;) {
|
21630
22884
|
var sym = a[i];
|
21631
22885
|
if (sym.unreferenced()) {
|
@@ -21707,12 +22961,12 @@ merge(Compressor.prototype, {
|
|
21707
22961
|
return make_node(AST_EmptyStatement, node);
|
21708
22962
|
}
|
21709
22963
|
if (def.length == 0) {
|
21710
|
-
return side_effects;
|
22964
|
+
return in_list ? MAP.splice(side_effects.body) : side_effects;
|
21711
22965
|
}
|
21712
22966
|
node.definitions = def;
|
21713
22967
|
if (side_effects) {
|
21714
22968
|
side_effects.body.unshift(node);
|
21715
|
-
|
22969
|
+
return in_list ? MAP.splice(side_effects.body) : side_effects;
|
21716
22970
|
}
|
21717
22971
|
return node;
|
21718
22972
|
}
|
@@ -22236,7 +23490,7 @@ merge(Compressor.prototype, {
|
|
22236
23490
|
|
22237
23491
|
OPT(AST_Function, function(self, compressor){
|
22238
23492
|
self = AST_Lambda.prototype.optimize.call(self, compressor);
|
22239
|
-
if (compressor.option("unused")) {
|
23493
|
+
if (compressor.option("unused") && !compressor.option("keep_fnames")) {
|
22240
23494
|
if (self.name && self.name.unreferenced()) {
|
22241
23495
|
self.name = null;
|
22242
23496
|
}
|
@@ -22292,6 +23546,11 @@ merge(Compressor.prototype, {
|
|
22292
23546
|
}).transform(compressor);
|
22293
23547
|
break;
|
22294
23548
|
case "Function":
|
23549
|
+
// new Function() => function(){}
|
23550
|
+
if (self.args.length == 0) return make_node(AST_Function, self, {
|
23551
|
+
argnames: [],
|
23552
|
+
body: []
|
23553
|
+
});
|
22295
23554
|
if (all(self.args, function(x){ return x instanceof AST_String })) {
|
22296
23555
|
// quite a corner-case, but we can handle it:
|
22297
23556
|
// https://github.com/mishoo/UglifyJS2/issues/203
|
@@ -22407,11 +23666,16 @@ merge(Compressor.prototype, {
|
|
22407
23666
|
}
|
22408
23667
|
}
|
22409
23668
|
if (compressor.option("drop_console")) {
|
22410
|
-
if (self.expression instanceof AST_PropAccess
|
22411
|
-
self.expression.expression
|
22412
|
-
|
22413
|
-
|
22414
|
-
|
23669
|
+
if (self.expression instanceof AST_PropAccess) {
|
23670
|
+
var name = self.expression.expression;
|
23671
|
+
while (name.expression) {
|
23672
|
+
name = name.expression;
|
23673
|
+
}
|
23674
|
+
if (name instanceof AST_SymbolRef
|
23675
|
+
&& name.name == "console"
|
23676
|
+
&& name.undeclared()) {
|
23677
|
+
return make_node(AST_Undefined, self).transform(compressor);
|
23678
|
+
}
|
22415
23679
|
}
|
22416
23680
|
}
|
22417
23681
|
return self.evaluate(compressor)[0];
|
@@ -22471,7 +23735,7 @@ merge(Compressor.prototype, {
|
|
22471
23735
|
if (self.cdr instanceof AST_UnaryPrefix
|
22472
23736
|
&& self.cdr.operator == "void"
|
22473
23737
|
&& !self.cdr.expression.has_side_effects(compressor)) {
|
22474
|
-
self.cdr.
|
23738
|
+
self.cdr.expression = self.car;
|
22475
23739
|
return self.cdr;
|
22476
23740
|
}
|
22477
23741
|
if (self.cdr instanceof AST_Undefined) {
|
@@ -22639,6 +23903,12 @@ merge(Compressor.prototype, {
|
|
22639
23903
|
var rr = self.right.evaluate(compressor);
|
22640
23904
|
if ((ll.length > 1 && !ll[1]) || (rr.length > 1 && !rr[1])) {
|
22641
23905
|
compressor.warn("Boolean && always false [{file}:{line},{col}]", self.start);
|
23906
|
+
if (self.left.has_side_effects(compressor)) {
|
23907
|
+
return make_node(AST_Seq, self, {
|
23908
|
+
car: self.left,
|
23909
|
+
cdr: make_node(AST_False)
|
23910
|
+
}).optimize(compressor);
|
23911
|
+
}
|
22642
23912
|
return make_node(AST_False, self);
|
22643
23913
|
}
|
22644
23914
|
if (ll.length > 1 && ll[1]) {
|
@@ -22653,6 +23923,12 @@ merge(Compressor.prototype, {
|
|
22653
23923
|
var rr = self.right.evaluate(compressor);
|
22654
23924
|
if ((ll.length > 1 && ll[1]) || (rr.length > 1 && rr[1])) {
|
22655
23925
|
compressor.warn("Boolean || always true [{file}:{line},{col}]", self.start);
|
23926
|
+
if (self.left.has_side_effects(compressor)) {
|
23927
|
+
return make_node(AST_Seq, self, {
|
23928
|
+
car: self.left,
|
23929
|
+
cdr: make_node(AST_True)
|
23930
|
+
}).optimize(compressor);
|
23931
|
+
}
|
22656
23932
|
return make_node(AST_True, self);
|
22657
23933
|
}
|
22658
23934
|
if (ll.length > 1 && !ll[1]) {
|
@@ -22773,14 +24049,22 @@ merge(Compressor.prototype, {
|
|
22773
24049
|
case "undefined":
|
22774
24050
|
return make_node(AST_Undefined, self);
|
22775
24051
|
case "NaN":
|
22776
|
-
return make_node(AST_NaN, self);
|
24052
|
+
return make_node(AST_NaN, self).transform(compressor);
|
22777
24053
|
case "Infinity":
|
22778
|
-
return make_node(AST_Infinity, self);
|
24054
|
+
return make_node(AST_Infinity, self).transform(compressor);
|
22779
24055
|
}
|
22780
24056
|
}
|
22781
24057
|
return self;
|
22782
24058
|
});
|
22783
24059
|
|
24060
|
+
OPT(AST_Infinity, function (self, compressor) {
|
24061
|
+
return make_node(AST_Binary, self, {
|
24062
|
+
operator : '/',
|
24063
|
+
left : make_node(AST_Number, self, {value: 1}),
|
24064
|
+
right : make_node(AST_Number, self, {value: 0})
|
24065
|
+
});
|
24066
|
+
});
|
24067
|
+
|
22784
24068
|
OPT(AST_Undefined, function(self, compressor){
|
22785
24069
|
if (compressor.option("unsafe")) {
|
22786
24070
|
var scope = compressor.find_parent(AST_Scope);
|
@@ -22844,6 +24128,7 @@ merge(Compressor.prototype, {
|
|
22844
24128
|
&& alternative instanceof AST_Assign
|
22845
24129
|
&& consequent.operator == alternative.operator
|
22846
24130
|
&& consequent.left.equivalent_to(alternative.left)
|
24131
|
+
&& !consequent.left.has_side_effects(compressor)
|
22847
24132
|
) {
|
22848
24133
|
/*
|
22849
24134
|
* Stuff like this:
|
@@ -22864,6 +24149,7 @@ merge(Compressor.prototype, {
|
|
22864
24149
|
if (consequent instanceof AST_Call
|
22865
24150
|
&& alternative.TYPE === consequent.TYPE
|
22866
24151
|
&& consequent.args.length == alternative.args.length
|
24152
|
+
&& !consequent.expression.has_side_effects(compressor)
|
22867
24153
|
&& consequent.expression.equivalent_to(alternative.expression)) {
|
22868
24154
|
if (consequent.args.length == 0) {
|
22869
24155
|
return make_node(AST_Seq, self, {
|
@@ -22904,6 +24190,20 @@ merge(Compressor.prototype, {
|
|
22904
24190
|
|
22905
24191
|
}
|
22906
24192
|
}
|
24193
|
+
// x=y?true:false --> x=!!y
|
24194
|
+
if (consequent instanceof AST_True
|
24195
|
+
&& alternative instanceof AST_False) {
|
24196
|
+
self.condition = self.condition.negate(compressor);
|
24197
|
+
return make_node(AST_UnaryPrefix, self.condition, {
|
24198
|
+
operator: "!",
|
24199
|
+
expression: self.condition
|
24200
|
+
});
|
24201
|
+
}
|
24202
|
+
// x=y?false:true --> x=!y
|
24203
|
+
if (consequent instanceof AST_False
|
24204
|
+
&& alternative instanceof AST_True) {
|
24205
|
+
return self.condition.negate(compressor)
|
24206
|
+
}
|
22907
24207
|
return self;
|
22908
24208
|
});
|
22909
24209
|
|
@@ -22967,7 +24267,7 @@ merge(Compressor.prototype, {
|
|
22967
24267
|
});
|
22968
24268
|
|
22969
24269
|
function literals_in_boolean_context(self, compressor) {
|
22970
|
-
if (compressor.option("booleans") && compressor.in_boolean_context()) {
|
24270
|
+
if (compressor.option("booleans") && compressor.in_boolean_context() && !self.has_side_effects(compressor)) {
|
22971
24271
|
return make_node(AST_True, self);
|
22972
24272
|
}
|
22973
24273
|
return self;
|
@@ -23033,11 +24333,16 @@ function SourceMap(options) {
|
|
23033
24333
|
orig_line_diff : 0,
|
23034
24334
|
dest_line_diff : 0,
|
23035
24335
|
});
|
23036
|
-
var generator = new MOZ_SourceMap.SourceMapGenerator({
|
23037
|
-
file : options.file,
|
23038
|
-
sourceRoot : options.root
|
23039
|
-
});
|
23040
24336
|
var orig_map = options.orig && new MOZ_SourceMap.SourceMapConsumer(options.orig);
|
24337
|
+
var generator;
|
24338
|
+
if (orig_map) {
|
24339
|
+
generator = MOZ_SourceMap.SourceMapGenerator.fromSourceMap(orig_map);
|
24340
|
+
} else {
|
24341
|
+
generator = new MOZ_SourceMap.SourceMapGenerator({
|
24342
|
+
file : options.file,
|
24343
|
+
sourceRoot : options.root
|
24344
|
+
});
|
24345
|
+
}
|
23041
24346
|
function add(source, gen_line, gen_col, orig_line, orig_col, name) {
|
23042
24347
|
if (orig_map) {
|
23043
24348
|
var info = orig_map.originalPositionFor({
|
@@ -23058,11 +24363,11 @@ function SourceMap(options) {
|
|
23058
24363
|
source : source,
|
23059
24364
|
name : name
|
23060
24365
|
});
|
23061
|
-
}
|
24366
|
+
}
|
23062
24367
|
return {
|
23063
24368
|
add : add,
|
23064
24369
|
get : function() { return generator },
|
23065
|
-
toString : function() { return generator.
|
24370
|
+
toString : function() { return JSON.stringify(generator.toJSON()); }
|
23066
24371
|
};
|
23067
24372
|
};
|
23068
24373
|
|
@@ -23438,26 +24743,30 @@ function SourceMap(options) {
|
|
23438
24743
|
/* -----[ tools ]----- */
|
23439
24744
|
|
23440
24745
|
function my_start_token(moznode) {
|
23441
|
-
var loc = moznode.loc;
|
24746
|
+
var loc = moznode.loc, start = loc && loc.start;
|
23442
24747
|
var range = moznode.range;
|
23443
24748
|
return new AST_Token({
|
23444
|
-
file
|
23445
|
-
line
|
23446
|
-
col
|
23447
|
-
pos
|
23448
|
-
|
24749
|
+
file : loc && loc.source,
|
24750
|
+
line : start && start.line,
|
24751
|
+
col : start && start.column,
|
24752
|
+
pos : range ? range[0] : moznode.start,
|
24753
|
+
endline : start && start.line,
|
24754
|
+
endcol : start && start.column,
|
24755
|
+
endpos : range ? range[0] : moznode.start
|
23449
24756
|
});
|
23450
24757
|
};
|
23451
24758
|
|
23452
24759
|
function my_end_token(moznode) {
|
23453
|
-
var loc = moznode.loc;
|
24760
|
+
var loc = moznode.loc, end = loc && loc.end;
|
23454
24761
|
var range = moznode.range;
|
23455
24762
|
return new AST_Token({
|
23456
|
-
file
|
23457
|
-
line
|
23458
|
-
col
|
23459
|
-
pos
|
23460
|
-
|
24763
|
+
file : loc && loc.source,
|
24764
|
+
line : end && end.line,
|
24765
|
+
col : end && end.column,
|
24766
|
+
pos : range ? range[1] : moznode.end,
|
24767
|
+
endline : end && end.line,
|
24768
|
+
endcol : end && end.column,
|
24769
|
+
endpos : range ? range[1] : moznode.end
|
23461
24770
|
});
|
23462
24771
|
};
|
23463
24772
|
|
@@ -23533,23 +24842,16 @@ function SourceMap(options) {
|
|
23533
24842
|
return ast;
|
23534
24843
|
};
|
23535
24844
|
|
23536
|
-
function
|
23537
|
-
return token.line ? {
|
23538
|
-
line: token.line,
|
23539
|
-
column: token.col
|
23540
|
-
} : null;
|
23541
|
-
};
|
23542
|
-
|
23543
|
-
function set_moz_loc(mynode, moznode) {
|
24845
|
+
function set_moz_loc(mynode, moznode, myparent) {
|
23544
24846
|
var start = mynode.start;
|
23545
24847
|
var end = mynode.end;
|
23546
|
-
if (start.pos != null && end.
|
23547
|
-
moznode.range = [start.pos, end.
|
24848
|
+
if (start.pos != null && end.endpos != null) {
|
24849
|
+
moznode.range = [start.pos, end.endpos];
|
23548
24850
|
}
|
23549
24851
|
if (start.line) {
|
23550
24852
|
moznode.loc = {
|
23551
|
-
start:
|
23552
|
-
end:
|
24853
|
+
start: {line: start.line, column: start.col},
|
24854
|
+
end: end.endline ? {line: end.endline, column: end.endcol} : null
|
23553
24855
|
};
|
23554
24856
|
if (start.file) {
|
23555
24857
|
moznode.loc.source = start.file;
|
@@ -23577,6 +24879,224 @@ function SourceMap(options) {
|
|
23577
24879
|
|
23578
24880
|
})();
|
23579
24881
|
|
24882
|
+
/***********************************************************************
|
24883
|
+
|
24884
|
+
A JavaScript tokenizer / parser / beautifier / compressor.
|
24885
|
+
https://github.com/mishoo/UglifyJS2
|
24886
|
+
|
24887
|
+
-------------------------------- (C) ---------------------------------
|
24888
|
+
|
24889
|
+
Author: Mihai Bazon
|
24890
|
+
<mihai.bazon@gmail.com>
|
24891
|
+
http://mihai.bazon.net/blog
|
24892
|
+
|
24893
|
+
Distributed under the BSD license:
|
24894
|
+
|
24895
|
+
Copyright 2012 (c) Mihai Bazon <mihai.bazon@gmail.com>
|
24896
|
+
|
24897
|
+
Redistribution and use in source and binary forms, with or without
|
24898
|
+
modification, are permitted provided that the following conditions
|
24899
|
+
are met:
|
24900
|
+
|
24901
|
+
* Redistributions of source code must retain the above
|
24902
|
+
copyright notice, this list of conditions and the following
|
24903
|
+
disclaimer.
|
24904
|
+
|
24905
|
+
* Redistributions in binary form must reproduce the above
|
24906
|
+
copyright notice, this list of conditions and the following
|
24907
|
+
disclaimer in the documentation and/or other materials
|
24908
|
+
provided with the distribution.
|
24909
|
+
|
24910
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY
|
24911
|
+
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
24912
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
24913
|
+
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
|
24914
|
+
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
24915
|
+
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
24916
|
+
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
24917
|
+
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
24918
|
+
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
|
24919
|
+
TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
24920
|
+
THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
24921
|
+
SUCH DAMAGE.
|
24922
|
+
|
24923
|
+
***********************************************************************/
|
24924
|
+
|
24925
|
+
"use strict";
|
24926
|
+
|
24927
|
+
function find_builtins() {
|
24928
|
+
var a = [];
|
24929
|
+
[ Object, Array, Function, Number,
|
24930
|
+
String, Boolean, Error, Math,
|
24931
|
+
Date, RegExp
|
24932
|
+
].forEach(function(ctor){
|
24933
|
+
Object.getOwnPropertyNames(ctor).map(add);
|
24934
|
+
if (ctor.prototype) {
|
24935
|
+
Object.getOwnPropertyNames(ctor.prototype).map(add);
|
24936
|
+
}
|
24937
|
+
});
|
24938
|
+
function add(name) {
|
24939
|
+
push_uniq(a, name);
|
24940
|
+
}
|
24941
|
+
return a;
|
24942
|
+
}
|
24943
|
+
|
24944
|
+
function mangle_properties(ast, options) {
|
24945
|
+
options = defaults(options, {
|
24946
|
+
reserved : null,
|
24947
|
+
cache : null,
|
24948
|
+
only_cache : false
|
24949
|
+
});
|
24950
|
+
|
24951
|
+
var reserved = options.reserved;
|
24952
|
+
if (reserved == null)
|
24953
|
+
reserved = find_builtins();
|
24954
|
+
|
24955
|
+
var cache = options.cache;
|
24956
|
+
if (cache == null) {
|
24957
|
+
cache = {
|
24958
|
+
cname: -1,
|
24959
|
+
props: new Dictionary()
|
24960
|
+
};
|
24961
|
+
}
|
24962
|
+
|
24963
|
+
var names_to_mangle = [];
|
24964
|
+
|
24965
|
+
// step 1: find candidates to mangle
|
24966
|
+
ast.walk(new TreeWalker(function(node){
|
24967
|
+
if (node instanceof AST_ObjectKeyVal) {
|
24968
|
+
add(node.key);
|
24969
|
+
}
|
24970
|
+
else if (node instanceof AST_ObjectProperty) {
|
24971
|
+
// setter or getter, since KeyVal is handled above
|
24972
|
+
add(node.key.name);
|
24973
|
+
}
|
24974
|
+
else if (node instanceof AST_Dot) {
|
24975
|
+
if (this.parent() instanceof AST_Assign) {
|
24976
|
+
add(node.property);
|
24977
|
+
}
|
24978
|
+
}
|
24979
|
+
else if (node instanceof AST_Sub) {
|
24980
|
+
if (this.parent() instanceof AST_Assign) {
|
24981
|
+
addStrings(node.property);
|
24982
|
+
}
|
24983
|
+
}
|
24984
|
+
}));
|
24985
|
+
|
24986
|
+
// step 2: transform the tree, renaming properties
|
24987
|
+
return ast.transform(new TreeTransformer(function(node){
|
24988
|
+
if (node instanceof AST_ObjectKeyVal) {
|
24989
|
+
if (should_mangle(node.key)) {
|
24990
|
+
node.key = mangle(node.key);
|
24991
|
+
}
|
24992
|
+
}
|
24993
|
+
else if (node instanceof AST_ObjectProperty) {
|
24994
|
+
// setter or getter
|
24995
|
+
if (should_mangle(node.key.name)) {
|
24996
|
+
node.key.name = mangle(node.key.name);
|
24997
|
+
}
|
24998
|
+
}
|
24999
|
+
else if (node instanceof AST_Dot) {
|
25000
|
+
if (should_mangle(node.property)) {
|
25001
|
+
node.property = mangle(node.property);
|
25002
|
+
}
|
25003
|
+
}
|
25004
|
+
else if (node instanceof AST_Sub) {
|
25005
|
+
node.property = mangleStrings(node.property);
|
25006
|
+
}
|
25007
|
+
// else if (node instanceof AST_String) {
|
25008
|
+
// if (should_mangle(node.value)) {
|
25009
|
+
// AST_Node.warn(
|
25010
|
+
// "Found \"{prop}\" property candidate for mangling in an arbitrary string [{file}:{line},{col}]", {
|
25011
|
+
// file : node.start.file,
|
25012
|
+
// line : node.start.line,
|
25013
|
+
// col : node.start.col,
|
25014
|
+
// prop : node.value
|
25015
|
+
// }
|
25016
|
+
// );
|
25017
|
+
// }
|
25018
|
+
// }
|
25019
|
+
}));
|
25020
|
+
|
25021
|
+
// only function declarations after this line
|
25022
|
+
|
25023
|
+
function can_mangle(name) {
|
25024
|
+
if (reserved.indexOf(name) >= 0) return false;
|
25025
|
+
if (options.only_cache) {
|
25026
|
+
return cache.props.has(name);
|
25027
|
+
}
|
25028
|
+
if (/^[0-9.]+$/.test(name)) return false;
|
25029
|
+
return true;
|
25030
|
+
}
|
25031
|
+
|
25032
|
+
function should_mangle(name) {
|
25033
|
+
if (reserved.indexOf(name) >= 0) return false;
|
25034
|
+
return cache.props.has(name)
|
25035
|
+
|| names_to_mangle.indexOf(name) >= 0;
|
25036
|
+
}
|
25037
|
+
|
25038
|
+
function add(name) {
|
25039
|
+
if (can_mangle(name))
|
25040
|
+
push_uniq(names_to_mangle, name);
|
25041
|
+
}
|
25042
|
+
|
25043
|
+
function mangle(name) {
|
25044
|
+
var mangled = cache.props.get(name);
|
25045
|
+
if (!mangled) {
|
25046
|
+
do {
|
25047
|
+
mangled = base54(++cache.cname);
|
25048
|
+
} while (!can_mangle(mangled));
|
25049
|
+
cache.props.set(name, mangled);
|
25050
|
+
}
|
25051
|
+
return mangled;
|
25052
|
+
}
|
25053
|
+
|
25054
|
+
function addStrings(node) {
|
25055
|
+
var out = {};
|
25056
|
+
try {
|
25057
|
+
(function walk(node){
|
25058
|
+
node.walk(new TreeWalker(function(node){
|
25059
|
+
if (node instanceof AST_Seq) {
|
25060
|
+
walk(node.cdr);
|
25061
|
+
return true;
|
25062
|
+
}
|
25063
|
+
if (node instanceof AST_String) {
|
25064
|
+
add(node.value);
|
25065
|
+
return true;
|
25066
|
+
}
|
25067
|
+
if (node instanceof AST_Conditional) {
|
25068
|
+
walk(node.consequent);
|
25069
|
+
walk(node.alternative);
|
25070
|
+
return true;
|
25071
|
+
}
|
25072
|
+
throw out;
|
25073
|
+
}));
|
25074
|
+
})(node);
|
25075
|
+
} catch(ex) {
|
25076
|
+
if (ex !== out) throw ex;
|
25077
|
+
}
|
25078
|
+
}
|
25079
|
+
|
25080
|
+
function mangleStrings(node) {
|
25081
|
+
return node.transform(new TreeTransformer(function(node){
|
25082
|
+
if (node instanceof AST_Seq) {
|
25083
|
+
node.cdr = mangleStrings(node.cdr);
|
25084
|
+
}
|
25085
|
+
else if (node instanceof AST_String) {
|
25086
|
+
if (should_mangle(node.value)) {
|
25087
|
+
node.value = mangle(node.value);
|
25088
|
+
}
|
25089
|
+
}
|
25090
|
+
else if (node instanceof AST_Conditional) {
|
25091
|
+
node.consequent = mangleStrings(node.consequent);
|
25092
|
+
node.alternative = mangleStrings(node.alternative);
|
25093
|
+
}
|
25094
|
+
return node;
|
25095
|
+
}));
|
25096
|
+
}
|
25097
|
+
|
25098
|
+
}
|
25099
|
+
|
23580
25100
|
AST_Node.warn_function = function(txt) { logger.error("uglifyjs2 WARN: " + txt); };
|
23581
25101
|
exports.minify = function(files, options, name) {
|
23582
25102
|
options = defaults(options, {
|
@@ -23624,8 +25144,8 @@ exports.minify = function(files, options, name) {
|
|
23624
25144
|
|
23625
25145
|
// 3. mangle
|
23626
25146
|
if (options.mangle) {
|
23627
|
-
toplevel.figure_out_scope();
|
23628
|
-
toplevel.compute_char_frequency();
|
25147
|
+
toplevel.figure_out_scope(options.mangle);
|
25148
|
+
toplevel.compute_char_frequency(options.mangle);
|
23629
25149
|
toplevel.mangle_names(options.mangle);
|
23630
25150
|
}
|
23631
25151
|
|
@@ -23660,9 +25180,14 @@ exports.minify = function(files, options, name) {
|
|
23660
25180
|
stream += "\n//# sourceMappingURL=" + options.outSourceMap;
|
23661
25181
|
}
|
23662
25182
|
|
25183
|
+
var source_map = output.source_map;
|
25184
|
+
if (source_map) {
|
25185
|
+
source_map = source_map + "";
|
25186
|
+
}
|
25187
|
+
|
23663
25188
|
return {
|
23664
25189
|
code : stream + "",
|
23665
|
-
map :
|
25190
|
+
map : source_map
|
23666
25191
|
};
|
23667
25192
|
};
|
23668
25193
|
|
@@ -23715,7 +25240,6 @@ exports.describe_ast = function() {
|
|
23715
25240
|
return out + "";
|
23716
25241
|
};
|
23717
25242
|
|
23718
|
-
|
23719
25243
|
});
|
23720
25244
|
/**
|
23721
25245
|
* @license Copyright (c) 2010-2014, The Dojo Foundation All Rights Reserved.
|
@@ -24026,18 +25550,56 @@ define('parse', ['./esprimaAdapter', 'lang'], function (esprima, lang) {
|
|
24026
25550
|
* @returns {Boolean}
|
24027
25551
|
*/
|
24028
25552
|
parse.definesRequire = function (fileName, fileContents) {
|
24029
|
-
var
|
25553
|
+
var foundDefine = false,
|
25554
|
+
foundDefineAmd = false;
|
24030
25555
|
|
24031
25556
|
traverse(esprima.parse(fileContents), function (node) {
|
24032
|
-
|
24033
|
-
|
25557
|
+
// Look for a top level declaration of a define, like
|
25558
|
+
// var requirejs, require, define, off Program body.
|
25559
|
+
if (node.type === 'Program' && node.body && node.body.length) {
|
25560
|
+
foundDefine = node.body.some(function(bodyNode) {
|
25561
|
+
// var define
|
25562
|
+
if (bodyNode.type === 'VariableDeclaration') {
|
25563
|
+
var decls = bodyNode.declarations;
|
25564
|
+
if (decls) {
|
25565
|
+
var hasVarDefine = decls.some(function(declNode) {
|
25566
|
+
return (declNode.type === 'VariableDeclarator' &&
|
25567
|
+
declNode.id &&
|
25568
|
+
declNode.id.type === 'Identifier' &&
|
25569
|
+
declNode.id.name === 'define');
|
25570
|
+
});
|
25571
|
+
if (hasVarDefine) {
|
25572
|
+
return true;
|
25573
|
+
}
|
25574
|
+
}
|
25575
|
+
}
|
25576
|
+
|
25577
|
+
// function define() {}
|
25578
|
+
if (bodyNode.type === 'FunctionDeclaration' &&
|
25579
|
+
bodyNode.id &&
|
25580
|
+
bodyNode.id.type === 'Identifier' &&
|
25581
|
+
bodyNode.id.name === 'define') {
|
25582
|
+
return true;
|
25583
|
+
}
|
25584
|
+
|
25585
|
+
|
25586
|
+
|
25587
|
+
|
25588
|
+
|
25589
|
+
|
25590
|
+
});
|
25591
|
+
}
|
25592
|
+
|
25593
|
+
// Need define variable found first, before detecting define.amd.
|
25594
|
+
if (foundDefine && parse.hasDefineAmd(node)) {
|
25595
|
+
foundDefineAmd = true;
|
24034
25596
|
|
24035
25597
|
//Stop traversal
|
24036
25598
|
return false;
|
24037
25599
|
}
|
24038
25600
|
});
|
24039
25601
|
|
24040
|
-
return
|
25602
|
+
return foundDefine && foundDefineAmd;
|
24041
25603
|
};
|
24042
25604
|
|
24043
25605
|
/**
|
@@ -24542,9 +26104,17 @@ define('parse', ['./esprimaAdapter', 'lang'], function (esprima, lang) {
|
|
24542
26104
|
} else if (deps.type === 'ObjectExpression') {
|
24543
26105
|
//deps is object literal, null out
|
24544
26106
|
deps = factory = null;
|
24545
|
-
} else if (deps.type === 'Identifier'
|
24546
|
-
|
24547
|
-
|
26107
|
+
} else if (deps.type === 'Identifier') {
|
26108
|
+
if (args.length === 2) {
|
26109
|
+
//define('id', factory)
|
26110
|
+
deps = factory = null;
|
26111
|
+
} else if (args.length === 3 && isFnExpression(factory)) {
|
26112
|
+
//define('id', depsIdentifier, factory)
|
26113
|
+
//Since identifier, cannot know the deps, but do not
|
26114
|
+
//error out, assume they are taken care of outside of
|
26115
|
+
//static parsing.
|
26116
|
+
deps = null;
|
26117
|
+
}
|
24548
26118
|
}
|
24549
26119
|
}
|
24550
26120
|
|
@@ -25196,7 +26766,7 @@ define('pragma', ['parse', 'logger'], function (parse, logger) {
|
|
25196
26766
|
configRegExp: /(^|[^\.])(requirejs|require)(\.config)\s*\(/g,
|
25197
26767
|
nsWrapRegExp: /\/\*requirejs namespace: true \*\//,
|
25198
26768
|
apiDefRegExp: /var requirejs,\s*require,\s*define;/,
|
25199
|
-
defineCheckRegExp: /typeof\s
|
26769
|
+
defineCheckRegExp: /typeof(\s+|\s*\(\s*)define(\s*\))?\s*===?\s*["']function["']\s*&&\s*define\s*\.\s*amd/g,
|
25200
26770
|
defineStringCheckRegExp: /typeof\s+define\s*===?\s*["']function["']\s*&&\s*define\s*\[\s*["']amd["']\s*\]/g,
|
25201
26771
|
defineTypeFirstCheckRegExp: /\s*["']function["']\s*==(=?)\s*typeof\s+define\s*&&\s*define\s*\.\s*amd/g,
|
25202
26772
|
defineJQueryRegExp: /typeof\s+define\s*===?\s*["']function["']\s*&&\s*define\s*\.\s*amd\s*&&\s*define\s*\.\s*amd\s*\.\s*jQuery/g,
|
@@ -25505,7 +27075,13 @@ define('rhino/optimize', ['logger', 'env!env/file'], function (logger, file) {
|
|
25505
27075
|
try {
|
25506
27076
|
// Try for newer closure compiler that needs Java 7+
|
25507
27077
|
JSSourceFilefromCode = java.lang.Class.forName('com.google.javascript.jscomp.SourceFile').getMethod('fromCode', [java.lang.String, java.lang.String]);
|
25508
|
-
} catch (e) {
|
27078
|
+
} catch (e) {
|
27079
|
+
try {
|
27080
|
+
// Try Nashorn style
|
27081
|
+
var stringClass = Java.type("java.lang.String").class;
|
27082
|
+
JSSourceFilefromCode = Java.type("com.google.javascript.jscomp.SourceFile").class.getMethod("fromCode", [stringClass, stringClass]);
|
27083
|
+
} catch (e) {}
|
27084
|
+
}
|
25509
27085
|
}
|
25510
27086
|
|
25511
27087
|
//Helper for closure compiler, because of weird Java-JavaScript interactions.
|
@@ -26092,7 +27668,7 @@ function (lang, logger, envOptimize, file, parse,
|
|
26092
27668
|
uconfig.fromString = true;
|
26093
27669
|
|
26094
27670
|
if (config.generateSourceMaps && (outFileName || config._buildSourceMap)) {
|
26095
|
-
uconfig.outSourceMap = baseName;
|
27671
|
+
uconfig.outSourceMap = baseName + '.map';
|
26096
27672
|
|
26097
27673
|
if (config._buildSourceMap) {
|
26098
27674
|
existingMap = JSON.parse(config._buildSourceMap);
|
@@ -26110,12 +27686,7 @@ function (lang, logger, envOptimize, file, parse,
|
|
26110
27686
|
result = uglify2.minify(fileContents, uconfig, baseName + '.src.js');
|
26111
27687
|
if (uconfig.outSourceMap && result.map) {
|
26112
27688
|
resultMap = result.map;
|
26113
|
-
if (existingMap) {
|
26114
|
-
resultMap = JSON.parse(resultMap);
|
26115
|
-
finalMap = SourceMapGenerator.fromSourceMap(new SourceMapConsumer(resultMap));
|
26116
|
-
finalMap.applySourceMap(new SourceMapConsumer(existingMap));
|
26117
|
-
resultMap = finalMap.toString();
|
26118
|
-
} else if (!config._buildSourceMap) {
|
27689
|
+
if (!existingMap && !config._buildSourceMap) {
|
26119
27690
|
file.saveFile(outFileName + '.src.js', fileContents);
|
26120
27691
|
}
|
26121
27692
|
|
@@ -26125,7 +27696,6 @@ function (lang, logger, envOptimize, file, parse,
|
|
26125
27696
|
config._buildSourceMap = resultMap;
|
26126
27697
|
} else {
|
26127
27698
|
file.saveFile(outFileName + '.map', resultMap);
|
26128
|
-
fileContents += "\n//# sourceMappingURL=" + baseName + ".map";
|
26129
27699
|
}
|
26130
27700
|
} else {
|
26131
27701
|
fileContents = result.code;
|
@@ -27121,7 +28691,8 @@ define('build', function (require) {
|
|
27121
28691
|
//would result in modifying source. This condition can happen
|
27122
28692
|
//with some more tricky paths: config and appDir/baseUrl
|
27123
28693
|
//setting, which is a sign of incorrect config.
|
27124
|
-
if (module._buildPath === module._sourcePath
|
28694
|
+
if (module._buildPath === module._sourcePath &&
|
28695
|
+
!config.allowSourceOverwrites) {
|
27125
28696
|
throw new Error('Module ID \'' + module.name +
|
27126
28697
|
'\' has a source path that is same as output path: ' +
|
27127
28698
|
module._sourcePath +
|
@@ -28285,7 +29856,7 @@ define('build', function (require) {
|
|
28285
29856
|
var hasError = false;
|
28286
29857
|
if (syncChecks[env.get()]) {
|
28287
29858
|
try {
|
28288
|
-
build.checkForErrors(context);
|
29859
|
+
build.checkForErrors(context, layer);
|
28289
29860
|
} catch (e) {
|
28290
29861
|
hasError = true;
|
28291
29862
|
deferred.reject(e);
|
@@ -28305,7 +29876,7 @@ define('build', function (require) {
|
|
28305
29876
|
// issue, the require never completes, need to check for errors
|
28306
29877
|
// here.
|
28307
29878
|
if (syncChecks[env.get()]) {
|
28308
|
-
build.checkForErrors(context);
|
29879
|
+
build.checkForErrors(context, layer);
|
28309
29880
|
}
|
28310
29881
|
|
28311
29882
|
return deferred.promise.then(function () {
|
@@ -28314,13 +29885,13 @@ define('build', function (require) {
|
|
28314
29885
|
require(lang.deeplikeCopy(baseLoaderConfig));
|
28315
29886
|
}
|
28316
29887
|
|
28317
|
-
build.checkForErrors(context);
|
29888
|
+
build.checkForErrors(context, layer);
|
28318
29889
|
|
28319
29890
|
return layer;
|
28320
29891
|
});
|
28321
29892
|
};
|
28322
29893
|
|
28323
|
-
build.checkForErrors = function (context) {
|
29894
|
+
build.checkForErrors = function (context, layer) {
|
28324
29895
|
//Check to see if it all loaded. If not, then throw, and give
|
28325
29896
|
//a message on what is left.
|
28326
29897
|
var id, prop, mod, idParts, pluginId, pluginResources,
|
@@ -28372,8 +29943,9 @@ define('build', function (require) {
|
|
28372
29943
|
}
|
28373
29944
|
|
28374
29945
|
//Look for plugins that did not call load()
|
28375
|
-
|
28376
|
-
|
29946
|
+
//But skip plugin IDs that were already inlined and called
|
29947
|
+
//define() with a name.
|
29948
|
+
if (!hasProp(layer.modulesWithNames, id) && idParts.length > 1) {
|
28377
29949
|
if (falseProp(failedPluginMap, pluginId)) {
|
28378
29950
|
failedPluginIds.push(pluginId);
|
28379
29951
|
}
|
@@ -28504,9 +30076,13 @@ define('build', function (require) {
|
|
28504
30076
|
|
28505
30077
|
if (config.generateSourceMaps) {
|
28506
30078
|
sourceMapBase = config.dir || config.baseUrl;
|
28507
|
-
|
28508
|
-
|
28509
|
-
|
30079
|
+
if (module._buildPath === 'FUNCTION') {
|
30080
|
+
fileForSourceMap = (module.name || module.include[0] || 'FUNCTION') + '.build.js';
|
30081
|
+
} else if (config.out) {
|
30082
|
+
fileForSourceMap = module._buildPath.split('/').pop();
|
30083
|
+
} else {
|
30084
|
+
fileForSourceMap = module._buildPath.replace(sourceMapBase, '');
|
30085
|
+
}
|
28510
30086
|
sourceMapGenerator = new SourceMapGenerator.SourceMapGenerator({
|
28511
30087
|
file: fileForSourceMap
|
28512
30088
|
});
|
@@ -28621,7 +30197,7 @@ define('build', function (require) {
|
|
28621
30197
|
});
|
28622
30198
|
}
|
28623
30199
|
}).then(function () {
|
28624
|
-
var refPath, pluginId, resourcePath,
|
30200
|
+
var refPath, pluginId, resourcePath, shimDeps,
|
28625
30201
|
sourceMapPath, sourceMapLineNumber,
|
28626
30202
|
shortPath = path.replace(config.dir, "");
|
28627
30203
|
|
@@ -28635,11 +30211,13 @@ define('build', function (require) {
|
|
28635
30211
|
if (moduleName && falseProp(layer.modulesWithNames, moduleName) && !config.skipModuleInsertion) {
|
28636
30212
|
shim = config.shim && (getOwn(config.shim, moduleName) || (packageName && getOwn(config.shim, packageName)));
|
28637
30213
|
if (shim) {
|
30214
|
+
shimDeps = lang.isArray(shim) ? shim : shim.deps;
|
28638
30215
|
if (config.wrapShim) {
|
30216
|
+
|
28639
30217
|
singleContents = '(function(root) {\n' +
|
28640
30218
|
namespaceWithDot + 'define("' + moduleName + '", ' +
|
28641
|
-
(
|
28642
|
-
build.makeJsArrayString(
|
30219
|
+
(shimDeps && shimDeps.length ?
|
30220
|
+
build.makeJsArrayString(shimDeps) + ', ' : '[], ') +
|
28643
30221
|
'function() {\n' +
|
28644
30222
|
' return (function() {\n' +
|
28645
30223
|
singleContents +
|
@@ -28652,8 +30230,8 @@ define('build', function (require) {
|
|
28652
30230
|
'}(this));\n';
|
28653
30231
|
} else {
|
28654
30232
|
singleContents += '\n' + namespaceWithDot + 'define("' + moduleName + '", ' +
|
28655
|
-
(
|
28656
|
-
build.makeJsArrayString(
|
30233
|
+
(shimDeps && shimDeps.length ?
|
30234
|
+
build.makeJsArrayString(shimDeps) + ', ' : '') +
|
28657
30235
|
(shim.exportsFn ? shim.exportsFn() : 'function(){}') +
|
28658
30236
|
');\n';
|
28659
30237
|
}
|
@@ -28960,7 +30538,7 @@ function (args, quit, logger, build) {
|
|
28960
30538
|
} else if (commandOption === 'v') {
|
28961
30539
|
console.log('r.js: ' + version +
|
28962
30540
|
', RequireJS: ' + this.requirejsVars.require.version +
|
28963
|
-
', UglifyJS2: 2.4.
|
30541
|
+
', UglifyJS2: 2.4.23, UglifyJS: 1.3.4');
|
28964
30542
|
} else if (commandOption === 'convert') {
|
28965
30543
|
loadLib();
|
28966
30544
|
|