jsduck 4.0.1 → 4.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +14 -0
- data/esprima/esprima.js +210 -85
- data/jsduck.gemspec +3 -3
- data/lib/jsduck/accessors.rb +10 -8
- data/lib/jsduck/aggregator.rb +7 -7
- data/lib/jsduck/app.rb +24 -164
- data/lib/jsduck/app_data.rb +2 -4
- data/lib/jsduck/assets.rb +5 -2
- data/lib/jsduck/ast.rb +9 -4
- data/lib/jsduck/batch_formatter.rb +54 -0
- data/lib/jsduck/batch_parser.rb +106 -0
- data/lib/jsduck/categories.rb +5 -6
- data/lib/jsduck/class.rb +77 -239
- data/lib/jsduck/class_doc_expander.rb +0 -5
- data/lib/jsduck/class_formatter.rb +14 -10
- data/lib/jsduck/class_name.rb +23 -0
- data/lib/jsduck/class_writer.rb +9 -8
- data/lib/jsduck/doc_ast.rb +5 -6
- data/lib/jsduck/doc_formatter.rb +61 -272
- data/lib/jsduck/enum.rb +4 -4
- data/lib/jsduck/esprima.rb +10 -4
- data/lib/jsduck/examples.rb +5 -5
- data/lib/jsduck/export_writer.rb +62 -0
- data/lib/jsduck/exporter/app.rb +62 -0
- data/lib/jsduck/exporter/examples.rb +58 -0
- data/lib/jsduck/exporter/full.rb +60 -0
- data/lib/jsduck/file_categories.rb +7 -4
- data/lib/jsduck/function_ast.rb +99 -0
- data/lib/jsduck/grouped_asset.rb +27 -16
- data/lib/jsduck/guide_writer.rb +8 -7
- data/lib/jsduck/guides.rb +31 -29
- data/lib/jsduck/icons.rb +12 -1
- data/lib/jsduck/images.rb +3 -3
- data/lib/jsduck/importer.rb +7 -7
- data/lib/jsduck/index_html.rb +20 -6
- data/lib/jsduck/inherit_doc.rb +9 -12
- data/lib/jsduck/inline/example.rb +42 -0
- data/lib/jsduck/inline/img.rb +55 -0
- data/lib/jsduck/inline/link.rb +227 -0
- data/lib/jsduck/inline/video.rb +67 -0
- data/lib/jsduck/inline_examples.rb +7 -7
- data/lib/jsduck/js_parser.rb +5 -4
- data/lib/jsduck/lint.rb +14 -2
- data/lib/jsduck/logger.rb +5 -6
- data/lib/jsduck/members_index.rb +132 -0
- data/lib/jsduck/merger.rb +3 -9
- data/lib/jsduck/options.rb +39 -41
- data/lib/jsduck/override.rb +3 -7
- data/lib/jsduck/relations.rb +9 -9
- data/lib/jsduck/renderer.rb +3 -3
- data/lib/jsduck/return_values.rb +72 -0
- data/lib/jsduck/search_data.rb +16 -20
- data/lib/jsduck/shortener.rb +58 -0
- data/lib/jsduck/signature_renderer.rb +1 -2
- data/lib/jsduck/source/file.rb +98 -0
- data/lib/jsduck/source/file_parser.rb +72 -0
- data/lib/jsduck/source/writer.rb +89 -0
- data/lib/jsduck/tag/aside.rb +1 -1
- data/lib/jsduck/tag/since.rb +1 -1
- data/lib/jsduck/template_dir.rb +2 -2
- data/lib/jsduck/util/html.rb +27 -0
- data/lib/jsduck/util/io.rb +32 -0
- data/lib/jsduck/util/json.rb +60 -0
- data/lib/jsduck/util/null_object.rb +23 -0
- data/lib/jsduck/util/os.rb +14 -0
- data/lib/jsduck/util/parallel.rb +34 -0
- data/lib/jsduck/util/singleton.rb +35 -0
- data/lib/jsduck/util/stdout.rb +33 -0
- data/lib/jsduck/videos.rb +5 -5
- data/lib/jsduck/web_writer.rb +79 -0
- data/lib/jsduck/welcome.rb +6 -6
- data/spec/class_factory.rb +20 -0
- metadata +32 -20
- data/lib/jsduck/api_exporter.rb +0 -48
- data/lib/jsduck/app_exporter.rb +0 -60
- data/lib/jsduck/examples_exporter.rb +0 -56
- data/lib/jsduck/full_exporter.rb +0 -35
- data/lib/jsduck/html.rb +0 -25
- data/lib/jsduck/inline_img.rb +0 -53
- data/lib/jsduck/inline_video.rb +0 -58
- data/lib/jsduck/io.rb +0 -30
- data/lib/jsduck/json_duck.rb +0 -52
- data/lib/jsduck/lexer.rb +0 -251
- data/lib/jsduck/null_object.rb +0 -19
- data/lib/jsduck/os.rb +0 -11
- data/lib/jsduck/parallel_wrap.rb +0 -32
- data/lib/jsduck/source_file.rb +0 -97
- data/lib/jsduck/source_file_parser.rb +0 -70
- data/lib/jsduck/source_writer.rb +0 -87
- data/lib/jsduck/stats.rb +0 -103
- data/lib/jsduck/stdout.rb +0 -31
data/Rakefile
CHANGED
@@ -14,6 +14,20 @@ RSpec::Core::RakeTask.new(:spec) do |spec|
|
|
14
14
|
spec.pattern = "spec/**/*_spec.rb"
|
15
15
|
end
|
16
16
|
|
17
|
+
desc "Run Jasmine specs for comments backend"
|
18
|
+
task :jasmine do
|
19
|
+
# Initialize database with test data
|
20
|
+
test_db = "comments_test"
|
21
|
+
system("echo 'DROP DATABASE IF EXISTS #{test_db};' | mysql")
|
22
|
+
system("echo 'CREATE DATABASE #{test_db};' | mysql")
|
23
|
+
system("mysql #{test_db} < comments/sql/schema.sql")
|
24
|
+
system("mysql #{test_db} < comments/sql/test_data.sql")
|
25
|
+
system("mysql #{test_db} < comments/sql/update_votes.sql")
|
26
|
+
|
27
|
+
# run jasmine tests against that database
|
28
|
+
system("node comments/node_modules/jasmine-node/lib/jasmine-node/cli.js comments/spec/")
|
29
|
+
end
|
30
|
+
|
17
31
|
def load_sdk_vars
|
18
32
|
if File.exists?("sdk-vars.rb")
|
19
33
|
require "./sdk-vars.rb"
|
data/esprima/esprima.js
CHANGED
@@ -29,7 +29,7 @@
|
|
29
29
|
*/
|
30
30
|
|
31
31
|
/*jslint bitwise:true plusplus:true */
|
32
|
-
/*global esprima:true, exports:true,
|
32
|
+
/*global esprima:true, define:true, exports:true, window: true,
|
33
33
|
throwError: true, createLiteral: true, generateStatement: true,
|
34
34
|
parseAssignmentExpression: true, parseBlock: true, parseExpression: true,
|
35
35
|
parseFunctionDeclaration: true, parseFunctionExpression: true,
|
@@ -37,7 +37,19 @@ parseFunctionSourceElements: true, parseVariableIdentifier: true,
|
|
37
37
|
parseLeftHandSideExpression: true,
|
38
38
|
parseStatement: true, parseSourceElement: true */
|
39
39
|
|
40
|
-
(function (
|
40
|
+
(function (factory) {
|
41
|
+
'use strict';
|
42
|
+
|
43
|
+
// Universal Module Definition (UMD) to support AMD, CommonJS/Node.js,
|
44
|
+
// and plain browser loading,
|
45
|
+
if (typeof define === 'function' && define.amd) {
|
46
|
+
define(['exports'], factory);
|
47
|
+
} else if (typeof exports !== 'undefined') {
|
48
|
+
factory(exports);
|
49
|
+
} else {
|
50
|
+
factory((window.esprima = {}));
|
51
|
+
}
|
52
|
+
}(function (exports) {
|
41
53
|
'use strict';
|
42
54
|
|
43
55
|
var Token,
|
@@ -139,6 +151,7 @@ parseStatement: true, parseSourceElement: true */
|
|
139
151
|
UnterminatedRegExp: 'Invalid regular expression: missing /',
|
140
152
|
InvalidLHSInAssignment: 'Invalid left-hand side in assignment',
|
141
153
|
InvalidLHSInForIn: 'Invalid left-hand side in for-in',
|
154
|
+
MultipleDefaultsInSwitch: 'More than one default clause in switch statement',
|
142
155
|
NoCatchOrFinally: 'Missing catch or finally after try',
|
143
156
|
UnknownLabel: 'Undefined label \'%0\'',
|
144
157
|
Redeclaration: '%0 \'%1\' has already been declared',
|
@@ -948,7 +961,7 @@ parseStatement: true, parseSourceElement: true */
|
|
948
961
|
}
|
949
962
|
|
950
963
|
function scanRegExp() {
|
951
|
-
var str = '', ch, start, pattern, flags, value, classMarker = false, restore;
|
964
|
+
var str = '', ch, start, pattern, flags, value, classMarker = false, restore, terminated = false;
|
952
965
|
|
953
966
|
buffer = null;
|
954
967
|
skipComment();
|
@@ -973,20 +986,18 @@ parseStatement: true, parseSourceElement: true */
|
|
973
986
|
throwError({}, Messages.UnterminatedRegExp);
|
974
987
|
}
|
975
988
|
str += ch;
|
976
|
-
}
|
977
|
-
|
989
|
+
} else if (ch === '/') {
|
990
|
+
terminated = true;
|
978
991
|
break;
|
979
|
-
}
|
980
|
-
else if (ch === '[') {
|
992
|
+
} else if (ch === '[') {
|
981
993
|
classMarker = true;
|
982
|
-
}
|
983
|
-
else if (isLineTerminator(ch)) {
|
994
|
+
} else if (isLineTerminator(ch)) {
|
984
995
|
throwError({}, Messages.UnterminatedRegExp);
|
985
996
|
}
|
986
997
|
}
|
987
998
|
}
|
988
999
|
|
989
|
-
if (
|
1000
|
+
if (!terminated) {
|
990
1001
|
throwError({}, Messages.UnterminatedRegExp);
|
991
1002
|
}
|
992
1003
|
|
@@ -1163,7 +1174,6 @@ parseStatement: true, parseSourceElement: true */
|
|
1163
1174
|
}
|
1164
1175
|
|
1165
1176
|
function throwErrorTolerant() {
|
1166
|
-
var error;
|
1167
1177
|
try {
|
1168
1178
|
throwError.apply(null, arguments);
|
1169
1179
|
} catch (e) {
|
@@ -1179,8 +1189,6 @@ parseStatement: true, parseSourceElement: true */
|
|
1179
1189
|
// Throw an exception because of the token.
|
1180
1190
|
|
1181
1191
|
function throwUnexpected(token) {
|
1182
|
-
var s;
|
1183
|
-
|
1184
1192
|
if (token.type === Token.EOF) {
|
1185
1193
|
throwError(token, Messages.UnexpectedEOS);
|
1186
1194
|
}
|
@@ -1297,31 +1305,20 @@ parseStatement: true, parseSourceElement: true */
|
|
1297
1305
|
// Return true if provided expression is LeftHandSideExpression
|
1298
1306
|
|
1299
1307
|
function isLeftHandSide(expr) {
|
1300
|
-
|
1301
|
-
case 'AssignmentExpression':
|
1302
|
-
case 'BinaryExpression':
|
1303
|
-
case 'ConditionalExpression':
|
1304
|
-
case 'LogicalExpression':
|
1305
|
-
case 'SequenceExpression':
|
1306
|
-
case 'UnaryExpression':
|
1307
|
-
case 'UpdateExpression':
|
1308
|
-
return false;
|
1309
|
-
}
|
1310
|
-
return true;
|
1308
|
+
return expr.type === Syntax.Identifier || expr.type === Syntax.MemberExpression;
|
1311
1309
|
}
|
1312
1310
|
|
1313
1311
|
// 11.1.4 Array Initialiser
|
1314
1312
|
|
1315
1313
|
function parseArrayInitialiser() {
|
1316
|
-
var elements = []
|
1317
|
-
undef;
|
1314
|
+
var elements = [];
|
1318
1315
|
|
1319
1316
|
expect('[');
|
1320
1317
|
|
1321
1318
|
while (!match(']')) {
|
1322
1319
|
if (match(',')) {
|
1323
1320
|
lex();
|
1324
|
-
elements.push(
|
1321
|
+
elements.push(null);
|
1325
1322
|
} else {
|
1326
1323
|
elements.push(parseAssignmentExpression());
|
1327
1324
|
|
@@ -1355,7 +1352,11 @@ parseStatement: true, parseSourceElement: true */
|
|
1355
1352
|
type: Syntax.FunctionExpression,
|
1356
1353
|
id: null,
|
1357
1354
|
params: param,
|
1358
|
-
|
1355
|
+
defaults: [],
|
1356
|
+
body: body,
|
1357
|
+
rest: null,
|
1358
|
+
generator: false,
|
1359
|
+
expression: false
|
1359
1360
|
};
|
1360
1361
|
}
|
1361
1362
|
|
@@ -1438,7 +1439,7 @@ parseStatement: true, parseSourceElement: true */
|
|
1438
1439
|
}
|
1439
1440
|
|
1440
1441
|
function parseObjectInitialiser() {
|
1441
|
-
var
|
1442
|
+
var properties = [], property, name, kind, map = {}, toString = String;
|
1442
1443
|
|
1443
1444
|
expect('{');
|
1444
1445
|
|
@@ -1690,6 +1691,11 @@ parseStatement: true, parseSourceElement: true */
|
|
1690
1691
|
if (strict && expr.type === Syntax.Identifier && isRestrictedWord(expr.name)) {
|
1691
1692
|
throwError({}, Messages.StrictLHSPostfix);
|
1692
1693
|
}
|
1694
|
+
|
1695
|
+
if (!isLeftHandSide(expr)) {
|
1696
|
+
throwError({}, Messages.InvalidLHSInAssignment);
|
1697
|
+
}
|
1698
|
+
|
1693
1699
|
expr = {
|
1694
1700
|
type: Syntax.UpdateExpression,
|
1695
1701
|
operator: lex().value,
|
@@ -1713,6 +1719,11 @@ parseStatement: true, parseSourceElement: true */
|
|
1713
1719
|
if (strict && expr.type === Syntax.Identifier && isRestrictedWord(expr.name)) {
|
1714
1720
|
throwError({}, Messages.StrictLHSPrefix);
|
1715
1721
|
}
|
1722
|
+
|
1723
|
+
if (!isLeftHandSide(expr)) {
|
1724
|
+
throwError({}, Messages.InvalidLHSInAssignment);
|
1725
|
+
}
|
1726
|
+
|
1716
1727
|
expr = {
|
1717
1728
|
type: Syntax.UpdateExpression,
|
1718
1729
|
operator: token.value,
|
@@ -1803,34 +1814,19 @@ parseStatement: true, parseSourceElement: true */
|
|
1803
1814
|
|
1804
1815
|
previousAllowIn = state.allowIn;
|
1805
1816
|
state.allowIn = true;
|
1817
|
+
|
1806
1818
|
expr = parseShiftExpression();
|
1807
|
-
state.allowIn = previousAllowIn;
|
1808
1819
|
|
1809
|
-
|
1820
|
+
while (match('<') || match('>') || match('<=') || match('>=') || (previousAllowIn && matchKeyword('in')) || matchKeyword('instanceof')) {
|
1810
1821
|
expr = {
|
1811
1822
|
type: Syntax.BinaryExpression,
|
1812
1823
|
operator: lex().value,
|
1813
1824
|
left: expr,
|
1814
|
-
right:
|
1815
|
-
};
|
1816
|
-
} else if (state.allowIn && matchKeyword('in')) {
|
1817
|
-
lex();
|
1818
|
-
expr = {
|
1819
|
-
type: Syntax.BinaryExpression,
|
1820
|
-
operator: 'in',
|
1821
|
-
left: expr,
|
1822
|
-
right: parseRelationalExpression()
|
1823
|
-
};
|
1824
|
-
} else if (matchKeyword('instanceof')) {
|
1825
|
-
lex();
|
1826
|
-
expr = {
|
1827
|
-
type: Syntax.BinaryExpression,
|
1828
|
-
operator: 'instanceof',
|
1829
|
-
left: expr,
|
1830
|
-
right: parseRelationalExpression()
|
1825
|
+
right: parseShiftExpression()
|
1831
1826
|
};
|
1832
1827
|
}
|
1833
1828
|
|
1829
|
+
state.allowIn = previousAllowIn;
|
1834
1830
|
return expr;
|
1835
1831
|
}
|
1836
1832
|
|
@@ -1869,14 +1865,14 @@ parseStatement: true, parseSourceElement: true */
|
|
1869
1865
|
return expr;
|
1870
1866
|
}
|
1871
1867
|
|
1872
|
-
function
|
1868
|
+
function parseBitwiseXORExpression() {
|
1873
1869
|
var expr = parseBitwiseANDExpression();
|
1874
1870
|
|
1875
|
-
while (match('
|
1871
|
+
while (match('^')) {
|
1876
1872
|
lex();
|
1877
1873
|
expr = {
|
1878
1874
|
type: Syntax.BinaryExpression,
|
1879
|
-
operator: '
|
1875
|
+
operator: '^',
|
1880
1876
|
left: expr,
|
1881
1877
|
right: parseBitwiseANDExpression()
|
1882
1878
|
};
|
@@ -1885,16 +1881,16 @@ parseStatement: true, parseSourceElement: true */
|
|
1885
1881
|
return expr;
|
1886
1882
|
}
|
1887
1883
|
|
1888
|
-
function
|
1889
|
-
var expr =
|
1884
|
+
function parseBitwiseORExpression() {
|
1885
|
+
var expr = parseBitwiseXORExpression();
|
1890
1886
|
|
1891
|
-
while (match('
|
1887
|
+
while (match('|')) {
|
1892
1888
|
lex();
|
1893
1889
|
expr = {
|
1894
1890
|
type: Syntax.BinaryExpression,
|
1895
|
-
operator: '
|
1891
|
+
operator: '|',
|
1896
1892
|
left: expr,
|
1897
|
-
right:
|
1893
|
+
right: parseBitwiseXORExpression()
|
1898
1894
|
};
|
1899
1895
|
}
|
1900
1896
|
|
@@ -1904,7 +1900,7 @@ parseStatement: true, parseSourceElement: true */
|
|
1904
1900
|
// 11.11 Binary Logical Operators
|
1905
1901
|
|
1906
1902
|
function parseLogicalANDExpression() {
|
1907
|
-
var expr =
|
1903
|
+
var expr = parseBitwiseORExpression();
|
1908
1904
|
|
1909
1905
|
while (match('&&')) {
|
1910
1906
|
lex();
|
@@ -1912,7 +1908,7 @@ parseStatement: true, parseSourceElement: true */
|
|
1912
1908
|
type: Syntax.LogicalExpression,
|
1913
1909
|
operator: '&&',
|
1914
1910
|
left: expr,
|
1915
|
-
right:
|
1911
|
+
right: parseBitwiseORExpression()
|
1916
1912
|
};
|
1917
1913
|
}
|
1918
1914
|
|
@@ -1970,7 +1966,7 @@ parseStatement: true, parseSourceElement: true */
|
|
1970
1966
|
|
1971
1967
|
if (matchAssign()) {
|
1972
1968
|
// LeftHandSideExpression
|
1973
|
-
if (
|
1969
|
+
if (!isLeftHandSide(expr)) {
|
1974
1970
|
throwError({}, Messages.InvalidLHSInAssignment);
|
1975
1971
|
}
|
1976
1972
|
|
@@ -2288,9 +2284,10 @@ parseStatement: true, parseSourceElement: true */
|
|
2288
2284
|
|
2289
2285
|
if (matchKeyword('in')) {
|
2290
2286
|
// LeftHandSideExpression
|
2291
|
-
if (
|
2287
|
+
if (!isLeftHandSide(init)) {
|
2292
2288
|
throwError({}, Messages.InvalidLHSInForIn);
|
2293
2289
|
}
|
2290
|
+
|
2294
2291
|
lex();
|
2295
2292
|
left = init;
|
2296
2293
|
right = parseExpression();
|
@@ -2555,7 +2552,7 @@ parseStatement: true, parseSourceElement: true */
|
|
2555
2552
|
}
|
2556
2553
|
|
2557
2554
|
function parseSwitchStatement() {
|
2558
|
-
var discriminant, cases, oldInSwitch;
|
2555
|
+
var discriminant, cases, clause, oldInSwitch, defaultFound;
|
2559
2556
|
|
2560
2557
|
expectKeyword('switch');
|
2561
2558
|
|
@@ -2579,12 +2576,20 @@ parseStatement: true, parseSourceElement: true */
|
|
2579
2576
|
|
2580
2577
|
oldInSwitch = state.inSwitch;
|
2581
2578
|
state.inSwitch = true;
|
2579
|
+
defaultFound = false;
|
2582
2580
|
|
2583
2581
|
while (index < length) {
|
2584
2582
|
if (match('}')) {
|
2585
2583
|
break;
|
2586
2584
|
}
|
2587
|
-
|
2585
|
+
clause = parseSwitchCase();
|
2586
|
+
if (clause.test === null) {
|
2587
|
+
if (defaultFound) {
|
2588
|
+
throwError({}, Messages.MultipleDefaultsInSwitch);
|
2589
|
+
}
|
2590
|
+
defaultFound = true;
|
2591
|
+
}
|
2592
|
+
cases.push(clause);
|
2588
2593
|
}
|
2589
2594
|
|
2590
2595
|
state.inSwitch = oldInSwitch;
|
@@ -2639,7 +2644,6 @@ parseStatement: true, parseSourceElement: true */
|
|
2639
2644
|
return {
|
2640
2645
|
type: Syntax.CatchClause,
|
2641
2646
|
param: param,
|
2642
|
-
guard: null,
|
2643
2647
|
body: parseBlock()
|
2644
2648
|
};
|
2645
2649
|
}
|
@@ -2667,6 +2671,7 @@ parseStatement: true, parseSourceElement: true */
|
|
2667
2671
|
return {
|
2668
2672
|
type: Syntax.TryStatement,
|
2669
2673
|
block: block,
|
2674
|
+
guardedHandlers: [],
|
2670
2675
|
handlers: handlers,
|
2671
2676
|
finalizer: finalizer
|
2672
2677
|
};
|
@@ -2907,7 +2912,11 @@ parseStatement: true, parseSourceElement: true */
|
|
2907
2912
|
type: Syntax.FunctionDeclaration,
|
2908
2913
|
id: id,
|
2909
2914
|
params: params,
|
2910
|
-
|
2915
|
+
defaults: [],
|
2916
|
+
body: body,
|
2917
|
+
rest: null,
|
2918
|
+
generator: false,
|
2919
|
+
expression: false
|
2911
2920
|
};
|
2912
2921
|
}
|
2913
2922
|
|
@@ -2982,7 +2991,11 @@ parseStatement: true, parseSourceElement: true */
|
|
2982
2991
|
type: Syntax.FunctionExpression,
|
2983
2992
|
id: id,
|
2984
2993
|
params: params,
|
2985
|
-
|
2994
|
+
defaults: [],
|
2995
|
+
body: body,
|
2996
|
+
rest: null,
|
2997
|
+
generator: false,
|
2998
|
+
expression: false
|
2986
2999
|
};
|
2987
3000
|
}
|
2988
3001
|
|
@@ -3059,7 +3072,7 @@ parseStatement: true, parseSourceElement: true */
|
|
3059
3072
|
// The following functions are needed only when the option to preserve
|
3060
3073
|
// the comments is active.
|
3061
3074
|
|
3062
|
-
function addComment(start, end,
|
3075
|
+
function addComment(type, value, start, end, loc) {
|
3063
3076
|
assert(typeof start === 'number', 'Comment must have valid position');
|
3064
3077
|
|
3065
3078
|
// Because the way the actual token is scanned, often the comments
|
@@ -3073,14 +3086,15 @@ parseStatement: true, parseSourceElement: true */
|
|
3073
3086
|
}
|
3074
3087
|
|
3075
3088
|
extra.comments.push({
|
3076
|
-
range: [start, end],
|
3077
3089
|
type: type,
|
3078
|
-
value: value
|
3090
|
+
value: value,
|
3091
|
+
range: [start, end],
|
3092
|
+
loc: loc
|
3079
3093
|
});
|
3080
3094
|
}
|
3081
3095
|
|
3082
3096
|
function scanComment() {
|
3083
|
-
var comment, ch, start, blockComment, lineComment;
|
3097
|
+
var comment, ch, loc, start, blockComment, lineComment;
|
3084
3098
|
|
3085
3099
|
comment = '';
|
3086
3100
|
blockComment = false;
|
@@ -3091,19 +3105,27 @@ parseStatement: true, parseSourceElement: true */
|
|
3091
3105
|
|
3092
3106
|
if (lineComment) {
|
3093
3107
|
ch = nextChar();
|
3094
|
-
if (
|
3095
|
-
|
3096
|
-
|
3097
|
-
|
3098
|
-
|
3108
|
+
if (isLineTerminator(ch)) {
|
3109
|
+
loc.end = {
|
3110
|
+
line: lineNumber,
|
3111
|
+
column: index - lineStart - 1
|
3112
|
+
};
|
3099
3113
|
lineComment = false;
|
3100
|
-
addComment(start, index
|
3114
|
+
addComment('Line', comment, start, index - 1, loc);
|
3101
3115
|
if (ch === '\r' && source[index] === '\n') {
|
3102
3116
|
++index;
|
3103
3117
|
}
|
3104
3118
|
++lineNumber;
|
3105
3119
|
lineStart = index;
|
3106
3120
|
comment = '';
|
3121
|
+
} else if (index >= length) {
|
3122
|
+
lineComment = false;
|
3123
|
+
comment += ch;
|
3124
|
+
loc.end = {
|
3125
|
+
line: lineNumber,
|
3126
|
+
column: length - lineStart
|
3127
|
+
};
|
3128
|
+
addComment('Line', comment, start, length, loc);
|
3107
3129
|
} else {
|
3108
3130
|
comment += ch;
|
3109
3131
|
}
|
@@ -3133,7 +3155,11 @@ parseStatement: true, parseSourceElement: true */
|
|
3133
3155
|
comment = comment.substr(0, comment.length - 1);
|
3134
3156
|
blockComment = false;
|
3135
3157
|
++index;
|
3136
|
-
|
3158
|
+
loc.end = {
|
3159
|
+
line: lineNumber,
|
3160
|
+
column: index - lineStart
|
3161
|
+
};
|
3162
|
+
addComment('Block', comment, start, index, loc);
|
3137
3163
|
comment = '';
|
3138
3164
|
}
|
3139
3165
|
}
|
@@ -3141,13 +3167,33 @@ parseStatement: true, parseSourceElement: true */
|
|
3141
3167
|
} else if (ch === '/') {
|
3142
3168
|
ch = source[index + 1];
|
3143
3169
|
if (ch === '/') {
|
3170
|
+
loc = {
|
3171
|
+
start: {
|
3172
|
+
line: lineNumber,
|
3173
|
+
column: index - lineStart
|
3174
|
+
}
|
3175
|
+
};
|
3144
3176
|
start = index;
|
3145
3177
|
index += 2;
|
3146
3178
|
lineComment = true;
|
3179
|
+
if (index >= length) {
|
3180
|
+
loc.end = {
|
3181
|
+
line: lineNumber,
|
3182
|
+
column: index - lineStart
|
3183
|
+
};
|
3184
|
+
lineComment = false;
|
3185
|
+
addComment('Line', comment, start, index, loc);
|
3186
|
+
}
|
3147
3187
|
} else if (ch === '*') {
|
3148
3188
|
start = index;
|
3149
3189
|
index += 2;
|
3150
3190
|
blockComment = true;
|
3191
|
+
loc = {
|
3192
|
+
start: {
|
3193
|
+
line: lineNumber,
|
3194
|
+
column: index - lineStart - 2
|
3195
|
+
}
|
3196
|
+
};
|
3151
3197
|
if (index >= length) {
|
3152
3198
|
throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
|
3153
3199
|
}
|
@@ -3169,10 +3215,44 @@ parseStatement: true, parseSourceElement: true */
|
|
3169
3215
|
}
|
3170
3216
|
}
|
3171
3217
|
|
3218
|
+
function filterCommentLocation() {
|
3219
|
+
var i, entry, comment, comments = [];
|
3220
|
+
|
3221
|
+
for (i = 0; i < extra.comments.length; ++i) {
|
3222
|
+
entry = extra.comments[i];
|
3223
|
+
comment = {
|
3224
|
+
type: entry.type,
|
3225
|
+
value: entry.value
|
3226
|
+
};
|
3227
|
+
if (extra.range) {
|
3228
|
+
comment.range = entry.range;
|
3229
|
+
}
|
3230
|
+
if (extra.loc) {
|
3231
|
+
comment.loc = entry.loc;
|
3232
|
+
}
|
3233
|
+
comments.push(comment);
|
3234
|
+
}
|
3235
|
+
|
3236
|
+
extra.comments = comments;
|
3237
|
+
}
|
3238
|
+
|
3172
3239
|
function collectToken() {
|
3173
|
-
var token
|
3174
|
-
|
3175
|
-
|
3240
|
+
var start, loc, token, range, value;
|
3241
|
+
|
3242
|
+
skipComment();
|
3243
|
+
start = index;
|
3244
|
+
loc = {
|
3245
|
+
start: {
|
3246
|
+
line: lineNumber,
|
3247
|
+
column: index - lineStart
|
3248
|
+
}
|
3249
|
+
};
|
3250
|
+
|
3251
|
+
token = extra.advance();
|
3252
|
+
loc.end = {
|
3253
|
+
line: lineNumber,
|
3254
|
+
column: index - lineStart
|
3255
|
+
};
|
3176
3256
|
|
3177
3257
|
if (token.type !== Token.EOF) {
|
3178
3258
|
range = [token.range[0], token.range[1]];
|
@@ -3180,7 +3260,8 @@ parseStatement: true, parseSourceElement: true */
|
|
3180
3260
|
extra.tokens.push({
|
3181
3261
|
type: TokenName[token.type],
|
3182
3262
|
value: value,
|
3183
|
-
range: range
|
3263
|
+
range: range,
|
3264
|
+
loc: loc
|
3184
3265
|
});
|
3185
3266
|
}
|
3186
3267
|
|
@@ -3188,12 +3269,23 @@ parseStatement: true, parseSourceElement: true */
|
|
3188
3269
|
}
|
3189
3270
|
|
3190
3271
|
function collectRegex() {
|
3191
|
-
var pos, regex, token;
|
3272
|
+
var pos, loc, regex, token;
|
3192
3273
|
|
3193
3274
|
skipComment();
|
3194
3275
|
|
3195
3276
|
pos = index;
|
3277
|
+
loc = {
|
3278
|
+
start: {
|
3279
|
+
line: lineNumber,
|
3280
|
+
column: index - lineStart
|
3281
|
+
}
|
3282
|
+
};
|
3283
|
+
|
3196
3284
|
regex = extra.scanRegExp();
|
3285
|
+
loc.end = {
|
3286
|
+
line: lineNumber,
|
3287
|
+
column: index - lineStart
|
3288
|
+
};
|
3197
3289
|
|
3198
3290
|
// Pop the previous token, which is likely '/' or '/='
|
3199
3291
|
if (extra.tokens.length > 0) {
|
@@ -3208,12 +3300,34 @@ parseStatement: true, parseSourceElement: true */
|
|
3208
3300
|
extra.tokens.push({
|
3209
3301
|
type: 'RegularExpression',
|
3210
3302
|
value: regex.literal,
|
3211
|
-
range: [pos, index]
|
3303
|
+
range: [pos, index],
|
3304
|
+
loc: loc
|
3212
3305
|
});
|
3213
3306
|
|
3214
3307
|
return regex;
|
3215
3308
|
}
|
3216
3309
|
|
3310
|
+
function filterTokenLocation() {
|
3311
|
+
var i, entry, token, tokens = [];
|
3312
|
+
|
3313
|
+
for (i = 0; i < extra.tokens.length; ++i) {
|
3314
|
+
entry = extra.tokens[i];
|
3315
|
+
token = {
|
3316
|
+
type: entry.type,
|
3317
|
+
value: entry.value
|
3318
|
+
};
|
3319
|
+
if (extra.range) {
|
3320
|
+
token.range = entry.range;
|
3321
|
+
}
|
3322
|
+
if (extra.loc) {
|
3323
|
+
token.loc = entry.loc;
|
3324
|
+
}
|
3325
|
+
tokens.push(token);
|
3326
|
+
}
|
3327
|
+
|
3328
|
+
extra.tokens = tokens;
|
3329
|
+
}
|
3330
|
+
|
3217
3331
|
function createLiteral(token) {
|
3218
3332
|
return {
|
3219
3333
|
type: Syntax.Literal,
|
@@ -3274,12 +3388,12 @@ parseStatement: true, parseSourceElement: true */
|
|
3274
3388
|
node = parseFunction.apply(null, arguments);
|
3275
3389
|
if (typeof node !== 'undefined') {
|
3276
3390
|
|
3277
|
-
if (range) {
|
3391
|
+
if (range && typeof node.range === 'undefined') {
|
3278
3392
|
rangeInfo[1] = index;
|
3279
3393
|
node.range = rangeInfo;
|
3280
3394
|
}
|
3281
3395
|
|
3282
|
-
if (loc) {
|
3396
|
+
if (loc && typeof node.loc === 'undefined') {
|
3283
3397
|
locInfo.end = {
|
3284
3398
|
line: lineNumber,
|
3285
3399
|
column: index - lineStart
|
@@ -3301,6 +3415,15 @@ parseStatement: true, parseSourceElement: true */
|
|
3301
3415
|
node.loc.start = node.object.loc.start;
|
3302
3416
|
}
|
3303
3417
|
}
|
3418
|
+
|
3419
|
+
if (node.type === Syntax.CallExpression) {
|
3420
|
+
if (typeof node.callee.range !== 'undefined') {
|
3421
|
+
node.range[0] = node.callee.range[0];
|
3422
|
+
}
|
3423
|
+
if (typeof node.callee.loc !== 'undefined') {
|
3424
|
+
node.loc.start = node.callee.loc.start;
|
3425
|
+
}
|
3426
|
+
}
|
3304
3427
|
return node;
|
3305
3428
|
}
|
3306
3429
|
};
|
@@ -3533,9 +3656,11 @@ parseStatement: true, parseSourceElement: true */
|
|
3533
3656
|
try {
|
3534
3657
|
program = parseProgram();
|
3535
3658
|
if (typeof extra.comments !== 'undefined') {
|
3659
|
+
filterCommentLocation();
|
3536
3660
|
program.comments = extra.comments;
|
3537
3661
|
}
|
3538
3662
|
if (typeof extra.tokens !== 'undefined') {
|
3663
|
+
filterTokenLocation();
|
3539
3664
|
program.tokens = extra.tokens;
|
3540
3665
|
}
|
3541
3666
|
if (typeof extra.errors !== 'undefined') {
|
@@ -3577,5 +3702,5 @@ parseStatement: true, parseSourceElement: true */
|
|
3577
3702
|
return types;
|
3578
3703
|
}());
|
3579
3704
|
|
3580
|
-
}
|
3705
|
+
}));
|
3581
3706
|
/* vim: set sw=4 ts=4 et tw=80 : */
|