PageRenderTime 127ms CodeModel.GetById 13ms RepoModel.GetById 1ms app.codeStats 0ms

/lib/coffee-script/grammar.js

http://github.com/jashkenas/coffee-script
JavaScript | 685 lines | 675 code | 9 blank | 1 comment | 10 complexity | df69a6828a8c1423beb64a34227c4c0e MD5 | raw file
  1. // Generated by CoffeeScript 1.10.0
  2. (function() {
  3. var Parser, alt, alternatives, grammar, name, o, operators, token, tokens, unwrap;
  4. Parser = require('jison').Parser;
  5. unwrap = /^function\s*\(\)\s*\{\s*return\s*([\s\S]*);\s*\}/;
  6. o = function(patternString, action, options) {
  7. var addLocationDataFn, match, patternCount;
  8. patternString = patternString.replace(/\s{2,}/g, ' ');
  9. patternCount = patternString.split(' ').length;
  10. if (!action) {
  11. return [patternString, '$$ = $1;', options];
  12. }
  13. action = (match = unwrap.exec(action)) ? match[1] : "(" + action + "())";
  14. action = action.replace(/\bnew /g, '$&yy.');
  15. action = action.replace(/\b(?:Block\.wrap|extend)\b/g, 'yy.$&');
  16. addLocationDataFn = function(first, last) {
  17. if (!last) {
  18. return "yy.addLocationDataFn(@" + first + ")";
  19. } else {
  20. return "yy.addLocationDataFn(@" + first + ", @" + last + ")";
  21. }
  22. };
  23. action = action.replace(/LOC\(([0-9]*)\)/g, addLocationDataFn('$1'));
  24. action = action.replace(/LOC\(([0-9]*),\s*([0-9]*)\)/g, addLocationDataFn('$1', '$2'));
  25. return [patternString, "$$ = " + (addLocationDataFn(1, patternCount)) + "(" + action + ");", options];
  26. };
  27. grammar = {
  28. Root: [
  29. o('', function() {
  30. return new Block;
  31. }), o('Body')
  32. ],
  33. Body: [
  34. o('Line', function() {
  35. return Block.wrap([$1]);
  36. }), o('Body TERMINATOR Line', function() {
  37. return $1.push($3);
  38. }), o('Body TERMINATOR')
  39. ],
  40. Line: [o('Expression'), o('Statement'), o('YieldReturn')],
  41. Statement: [
  42. o('Return'), o('Comment'), o('STATEMENT', function() {
  43. return new StatementLiteral($1);
  44. })
  45. ],
  46. Expression: [o('Value'), o('Invocation'), o('Code'), o('Operation'), o('Assign'), o('If'), o('Try'), o('While'), o('For'), o('Switch'), o('Class'), o('Throw'), o('Yield')],
  47. Yield: [
  48. o('YIELD', function() {
  49. return new Op($1, new Value(new Literal('')));
  50. }), o('YIELD Expression', function() {
  51. return new Op($1, $2);
  52. }), o('YIELD FROM Expression', function() {
  53. return new Op($1.concat($2), $3);
  54. })
  55. ],
  56. Block: [
  57. o('INDENT OUTDENT', function() {
  58. return new Block;
  59. }), o('INDENT Body OUTDENT', function() {
  60. return $2;
  61. })
  62. ],
  63. Identifier: [
  64. o('IDENTIFIER', function() {
  65. return new IdentifierLiteral($1);
  66. })
  67. ],
  68. Property: [
  69. o('PROPERTY', function() {
  70. return new PropertyName($1);
  71. })
  72. ],
  73. AlphaNumeric: [
  74. o('NUMBER', function() {
  75. return new NumberLiteral($1);
  76. }), o('String')
  77. ],
  78. String: [
  79. o('STRING', function() {
  80. return new StringLiteral($1);
  81. }), o('STRING_START Body STRING_END', function() {
  82. return new StringWithInterpolations($2);
  83. })
  84. ],
  85. Regex: [
  86. o('REGEX', function() {
  87. return new RegexLiteral($1);
  88. }), o('REGEX_START Invocation REGEX_END', function() {
  89. return new RegexWithInterpolations($2.args);
  90. })
  91. ],
  92. Literal: [
  93. o('AlphaNumeric'), o('JS', function() {
  94. return new PassthroughLiteral($1);
  95. }), o('Regex'), o('UNDEFINED', function() {
  96. return new UndefinedLiteral;
  97. }), o('NULL', function() {
  98. return new NullLiteral;
  99. }), o('BOOL', function() {
  100. return new BooleanLiteral($1);
  101. }), o('INFINITY', function() {
  102. return new InfinityLiteral($1);
  103. }), o('NAN', function() {
  104. return new NaNLiteral;
  105. })
  106. ],
  107. Assign: [
  108. o('Assignable = Expression', function() {
  109. return new Assign($1, $3);
  110. }), o('Assignable = TERMINATOR Expression', function() {
  111. return new Assign($1, $4);
  112. }), o('Assignable = INDENT Expression OUTDENT', function() {
  113. return new Assign($1, $4);
  114. })
  115. ],
  116. AssignObj: [
  117. o('ObjAssignable', function() {
  118. return new Value($1);
  119. }), o('ObjAssignable : Expression', function() {
  120. return new Assign(LOC(1)(new Value($1)), $3, 'object', {
  121. operatorToken: LOC(2)(new Literal($2))
  122. });
  123. }), o('ObjAssignable : INDENT Expression OUTDENT', function() {
  124. return new Assign(LOC(1)(new Value($1)), $4, 'object', {
  125. operatorToken: LOC(2)(new Literal($2))
  126. });
  127. }), o('SimpleObjAssignable = Expression', function() {
  128. return new Assign(LOC(1)(new Value($1)), $3, null, {
  129. operatorToken: LOC(2)(new Literal($2))
  130. });
  131. }), o('SimpleObjAssignable = INDENT Expression OUTDENT', function() {
  132. return new Assign(LOC(1)(new Value($1)), $4, null, {
  133. operatorToken: LOC(2)(new Literal($2))
  134. });
  135. }), o('Comment')
  136. ],
  137. SimpleObjAssignable: [o('Identifier'), o('Property'), o('ThisProperty')],
  138. ObjAssignable: [o('SimpleObjAssignable'), o('AlphaNumeric')],
  139. Return: [
  140. o('RETURN Expression', function() {
  141. return new Return($2);
  142. }), o('RETURN', function() {
  143. return new Return;
  144. })
  145. ],
  146. YieldReturn: [
  147. o('YIELD RETURN Expression', function() {
  148. return new YieldReturn($3);
  149. }), o('YIELD RETURN', function() {
  150. return new YieldReturn;
  151. })
  152. ],
  153. Comment: [
  154. o('HERECOMMENT', function() {
  155. return new Comment($1);
  156. })
  157. ],
  158. Code: [
  159. o('PARAM_START ParamList PARAM_END FuncGlyph Block', function() {
  160. return new Code($2, $5, $4);
  161. }), o('FuncGlyph Block', function() {
  162. return new Code([], $2, $1);
  163. })
  164. ],
  165. FuncGlyph: [
  166. o('->', function() {
  167. return 'func';
  168. }), o('=>', function() {
  169. return 'boundfunc';
  170. })
  171. ],
  172. OptComma: [o(''), o(',')],
  173. ParamList: [
  174. o('', function() {
  175. return [];
  176. }), o('Param', function() {
  177. return [$1];
  178. }), o('ParamList , Param', function() {
  179. return $1.concat($3);
  180. }), o('ParamList OptComma TERMINATOR Param', function() {
  181. return $1.concat($4);
  182. }), o('ParamList OptComma INDENT ParamList OptComma OUTDENT', function() {
  183. return $1.concat($4);
  184. })
  185. ],
  186. Param: [
  187. o('ParamVar', function() {
  188. return new Param($1);
  189. }), o('ParamVar ...', function() {
  190. return new Param($1, null, true);
  191. }), o('ParamVar = Expression', function() {
  192. return new Param($1, $3);
  193. }), o('...', function() {
  194. return new Expansion;
  195. })
  196. ],
  197. ParamVar: [o('Identifier'), o('ThisProperty'), o('Array'), o('Object')],
  198. Splat: [
  199. o('Expression ...', function() {
  200. return new Splat($1);
  201. })
  202. ],
  203. SimpleAssignable: [
  204. o('Identifier', function() {
  205. return new Value($1);
  206. }), o('Value Accessor', function() {
  207. return $1.add($2);
  208. }), o('Invocation Accessor', function() {
  209. return new Value($1, [].concat($2));
  210. }), o('ThisProperty')
  211. ],
  212. Assignable: [
  213. o('SimpleAssignable'), o('Array', function() {
  214. return new Value($1);
  215. }), o('Object', function() {
  216. return new Value($1);
  217. })
  218. ],
  219. Value: [
  220. o('Assignable'), o('Literal', function() {
  221. return new Value($1);
  222. }), o('Parenthetical', function() {
  223. return new Value($1);
  224. }), o('Range', function() {
  225. return new Value($1);
  226. }), o('This')
  227. ],
  228. Accessor: [
  229. o('. Property', function() {
  230. return new Access($2);
  231. }), o('?. Property', function() {
  232. return new Access($2, 'soak');
  233. }), o(':: Property', function() {
  234. return [LOC(1)(new Access(new PropertyName('prototype'))), LOC(2)(new Access($2))];
  235. }), o('?:: Property', function() {
  236. return [LOC(1)(new Access(new PropertyName('prototype'), 'soak')), LOC(2)(new Access($2))];
  237. }), o('::', function() {
  238. return new Access(new PropertyName('prototype'));
  239. }), o('Index')
  240. ],
  241. Index: [
  242. o('INDEX_START IndexValue INDEX_END', function() {
  243. return $2;
  244. }), o('INDEX_SOAK Index', function() {
  245. return extend($2, {
  246. soak: true
  247. });
  248. })
  249. ],
  250. IndexValue: [
  251. o('Expression', function() {
  252. return new Index($1);
  253. }), o('Slice', function() {
  254. return new Slice($1);
  255. })
  256. ],
  257. Object: [
  258. o('{ AssignList OptComma }', function() {
  259. return new Obj($2, $1.generated);
  260. })
  261. ],
  262. AssignList: [
  263. o('', function() {
  264. return [];
  265. }), o('AssignObj', function() {
  266. return [$1];
  267. }), o('AssignList , AssignObj', function() {
  268. return $1.concat($3);
  269. }), o('AssignList OptComma TERMINATOR AssignObj', function() {
  270. return $1.concat($4);
  271. }), o('AssignList OptComma INDENT AssignList OptComma OUTDENT', function() {
  272. return $1.concat($4);
  273. })
  274. ],
  275. Class: [
  276. o('CLASS', function() {
  277. return new Class;
  278. }), o('CLASS Block', function() {
  279. return new Class(null, null, $2);
  280. }), o('CLASS EXTENDS Expression', function() {
  281. return new Class(null, $3);
  282. }), o('CLASS EXTENDS Expression Block', function() {
  283. return new Class(null, $3, $4);
  284. }), o('CLASS SimpleAssignable', function() {
  285. return new Class($2);
  286. }), o('CLASS SimpleAssignable Block', function() {
  287. return new Class($2, null, $3);
  288. }), o('CLASS SimpleAssignable EXTENDS Expression', function() {
  289. return new Class($2, $4);
  290. }), o('CLASS SimpleAssignable EXTENDS Expression Block', function() {
  291. return new Class($2, $4, $5);
  292. })
  293. ],
  294. Invocation: [
  295. o('Value OptFuncExist Arguments', function() {
  296. return new Call($1, $3, $2);
  297. }), o('Invocation OptFuncExist Arguments', function() {
  298. return new Call($1, $3, $2);
  299. }), o('Super')
  300. ],
  301. Super: [
  302. o('SUPER', function() {
  303. return new SuperCall;
  304. }), o('SUPER Arguments', function() {
  305. return new SuperCall($2);
  306. })
  307. ],
  308. OptFuncExist: [
  309. o('', function() {
  310. return false;
  311. }), o('FUNC_EXIST', function() {
  312. return true;
  313. })
  314. ],
  315. Arguments: [
  316. o('CALL_START CALL_END', function() {
  317. return [];
  318. }), o('CALL_START ArgList OptComma CALL_END', function() {
  319. return $2;
  320. })
  321. ],
  322. This: [
  323. o('THIS', function() {
  324. return new Value(new ThisLiteral);
  325. }), o('@', function() {
  326. return new Value(new ThisLiteral);
  327. })
  328. ],
  329. ThisProperty: [
  330. o('@ Property', function() {
  331. return new Value(LOC(1)(new ThisLiteral), [LOC(2)(new Access($2))], 'this');
  332. })
  333. ],
  334. Array: [
  335. o('[ ]', function() {
  336. return new Arr([]);
  337. }), o('[ ArgList OptComma ]', function() {
  338. return new Arr($2);
  339. })
  340. ],
  341. RangeDots: [
  342. o('..', function() {
  343. return 'inclusive';
  344. }), o('...', function() {
  345. return 'exclusive';
  346. })
  347. ],
  348. Range: [
  349. o('[ Expression RangeDots Expression ]', function() {
  350. return new Range($2, $4, $3);
  351. })
  352. ],
  353. Slice: [
  354. o('Expression RangeDots Expression', function() {
  355. return new Range($1, $3, $2);
  356. }), o('Expression RangeDots', function() {
  357. return new Range($1, null, $2);
  358. }), o('RangeDots Expression', function() {
  359. return new Range(null, $2, $1);
  360. }), o('RangeDots', function() {
  361. return new Range(null, null, $1);
  362. })
  363. ],
  364. ArgList: [
  365. o('Arg', function() {
  366. return [$1];
  367. }), o('ArgList , Arg', function() {
  368. return $1.concat($3);
  369. }), o('ArgList OptComma TERMINATOR Arg', function() {
  370. return $1.concat($4);
  371. }), o('INDENT ArgList OptComma OUTDENT', function() {
  372. return $2;
  373. }), o('ArgList OptComma INDENT ArgList OptComma OUTDENT', function() {
  374. return $1.concat($4);
  375. })
  376. ],
  377. Arg: [
  378. o('Expression'), o('Splat'), o('...', function() {
  379. return new Expansion;
  380. })
  381. ],
  382. SimpleArgs: [
  383. o('Expression'), o('SimpleArgs , Expression', function() {
  384. return [].concat($1, $3);
  385. })
  386. ],
  387. Try: [
  388. o('TRY Block', function() {
  389. return new Try($2);
  390. }), o('TRY Block Catch', function() {
  391. return new Try($2, $3[0], $3[1]);
  392. }), o('TRY Block FINALLY Block', function() {
  393. return new Try($2, null, null, $4);
  394. }), o('TRY Block Catch FINALLY Block', function() {
  395. return new Try($2, $3[0], $3[1], $5);
  396. })
  397. ],
  398. Catch: [
  399. o('CATCH Identifier Block', function() {
  400. return [$2, $3];
  401. }), o('CATCH Object Block', function() {
  402. return [LOC(2)(new Value($2)), $3];
  403. }), o('CATCH Block', function() {
  404. return [null, $2];
  405. })
  406. ],
  407. Throw: [
  408. o('THROW Expression', function() {
  409. return new Throw($2);
  410. })
  411. ],
  412. Parenthetical: [
  413. o('( Body )', function() {
  414. return new Parens($2);
  415. }), o('( INDENT Body OUTDENT )', function() {
  416. return new Parens($3);
  417. })
  418. ],
  419. WhileSource: [
  420. o('WHILE Expression', function() {
  421. return new While($2);
  422. }), o('WHILE Expression WHEN Expression', function() {
  423. return new While($2, {
  424. guard: $4
  425. });
  426. }), o('UNTIL Expression', function() {
  427. return new While($2, {
  428. invert: true
  429. });
  430. }), o('UNTIL Expression WHEN Expression', function() {
  431. return new While($2, {
  432. invert: true,
  433. guard: $4
  434. });
  435. })
  436. ],
  437. While: [
  438. o('WhileSource Block', function() {
  439. return $1.addBody($2);
  440. }), o('Statement WhileSource', function() {
  441. return $2.addBody(LOC(1)(Block.wrap([$1])));
  442. }), o('Expression WhileSource', function() {
  443. return $2.addBody(LOC(1)(Block.wrap([$1])));
  444. }), o('Loop', function() {
  445. return $1;
  446. })
  447. ],
  448. Loop: [
  449. o('LOOP Block', function() {
  450. return new While(LOC(1)(new BooleanLiteral('true'))).addBody($2);
  451. }), o('LOOP Expression', function() {
  452. return new While(LOC(1)(new BooleanLiteral('true'))).addBody(LOC(2)(Block.wrap([$2])));
  453. })
  454. ],
  455. For: [
  456. o('Statement ForBody', function() {
  457. return new For($1, $2);
  458. }), o('Expression ForBody', function() {
  459. return new For($1, $2);
  460. }), o('ForBody Block', function() {
  461. return new For($2, $1);
  462. })
  463. ],
  464. ForBody: [
  465. o('FOR Range', function() {
  466. return {
  467. source: LOC(2)(new Value($2))
  468. };
  469. }), o('FOR Range BY Expression', function() {
  470. return {
  471. source: LOC(2)(new Value($2)),
  472. step: $4
  473. };
  474. }), o('ForStart ForSource', function() {
  475. $2.own = $1.own;
  476. $2.name = $1[0];
  477. $2.index = $1[1];
  478. return $2;
  479. })
  480. ],
  481. ForStart: [
  482. o('FOR ForVariables', function() {
  483. return $2;
  484. }), o('FOR OWN ForVariables', function() {
  485. $3.own = true;
  486. return $3;
  487. })
  488. ],
  489. ForValue: [
  490. o('Identifier'), o('ThisProperty'), o('Array', function() {
  491. return new Value($1);
  492. }), o('Object', function() {
  493. return new Value($1);
  494. })
  495. ],
  496. ForVariables: [
  497. o('ForValue', function() {
  498. return [$1];
  499. }), o('ForValue , ForValue', function() {
  500. return [$1, $3];
  501. })
  502. ],
  503. ForSource: [
  504. o('FORIN Expression', function() {
  505. return {
  506. source: $2
  507. };
  508. }), o('FOROF Expression', function() {
  509. return {
  510. source: $2,
  511. object: true
  512. };
  513. }), o('FORIN Expression WHEN Expression', function() {
  514. return {
  515. source: $2,
  516. guard: $4
  517. };
  518. }), o('FOROF Expression WHEN Expression', function() {
  519. return {
  520. source: $2,
  521. guard: $4,
  522. object: true
  523. };
  524. }), o('FORIN Expression BY Expression', function() {
  525. return {
  526. source: $2,
  527. step: $4
  528. };
  529. }), o('FORIN Expression WHEN Expression BY Expression', function() {
  530. return {
  531. source: $2,
  532. guard: $4,
  533. step: $6
  534. };
  535. }), o('FORIN Expression BY Expression WHEN Expression', function() {
  536. return {
  537. source: $2,
  538. step: $4,
  539. guard: $6
  540. };
  541. })
  542. ],
  543. Switch: [
  544. o('SWITCH Expression INDENT Whens OUTDENT', function() {
  545. return new Switch($2, $4);
  546. }), o('SWITCH Expression INDENT Whens ELSE Block OUTDENT', function() {
  547. return new Switch($2, $4, $6);
  548. }), o('SWITCH INDENT Whens OUTDENT', function() {
  549. return new Switch(null, $3);
  550. }), o('SWITCH INDENT Whens ELSE Block OUTDENT', function() {
  551. return new Switch(null, $3, $5);
  552. })
  553. ],
  554. Whens: [
  555. o('When'), o('Whens When', function() {
  556. return $1.concat($2);
  557. })
  558. ],
  559. When: [
  560. o('LEADING_WHEN SimpleArgs Block', function() {
  561. return [[$2, $3]];
  562. }), o('LEADING_WHEN SimpleArgs Block TERMINATOR', function() {
  563. return [[$2, $3]];
  564. })
  565. ],
  566. IfBlock: [
  567. o('IF Expression Block', function() {
  568. return new If($2, $3, {
  569. type: $1
  570. });
  571. }), o('IfBlock ELSE IF Expression Block', function() {
  572. return $1.addElse(LOC(3, 5)(new If($4, $5, {
  573. type: $3
  574. })));
  575. })
  576. ],
  577. If: [
  578. o('IfBlock'), o('IfBlock ELSE Block', function() {
  579. return $1.addElse($3);
  580. }), o('Statement POST_IF Expression', function() {
  581. return new If($3, LOC(1)(Block.wrap([$1])), {
  582. type: $2,
  583. statement: true
  584. });
  585. }), o('Expression POST_IF Expression', function() {
  586. return new If($3, LOC(1)(Block.wrap([$1])), {
  587. type: $2,
  588. statement: true
  589. });
  590. })
  591. ],
  592. Operation: [
  593. o('UNARY Expression', function() {
  594. return new Op($1, $2);
  595. }), o('UNARY_MATH Expression', function() {
  596. return new Op($1, $2);
  597. }), o('- Expression', (function() {
  598. return new Op('-', $2);
  599. }), {
  600. prec: 'UNARY_MATH'
  601. }), o('+ Expression', (function() {
  602. return new Op('+', $2);
  603. }), {
  604. prec: 'UNARY_MATH'
  605. }), o('-- SimpleAssignable', function() {
  606. return new Op('--', $2);
  607. }), o('++ SimpleAssignable', function() {
  608. return new Op('++', $2);
  609. }), o('SimpleAssignable --', function() {
  610. return new Op('--', $1, null, true);
  611. }), o('SimpleAssignable ++', function() {
  612. return new Op('++', $1, null, true);
  613. }), o('Expression ?', function() {
  614. return new Existence($1);
  615. }), o('Expression + Expression', function() {
  616. return new Op('+', $1, $3);
  617. }), o('Expression - Expression', function() {
  618. return new Op('-', $1, $3);
  619. }), o('Expression MATH Expression', function() {
  620. return new Op($2, $1, $3);
  621. }), o('Expression ** Expression', function() {
  622. return new Op($2, $1, $3);
  623. }), o('Expression SHIFT Expression', function() {
  624. return new Op($2, $1, $3);
  625. }), o('Expression COMPARE Expression', function() {
  626. return new Op($2, $1, $3);
  627. }), o('Expression LOGIC Expression', function() {
  628. return new Op($2, $1, $3);
  629. }), o('Expression RELATION Expression', function() {
  630. if ($2.charAt(0) === '!') {
  631. return new Op($2.slice(1), $1, $3).invert();
  632. } else {
  633. return new Op($2, $1, $3);
  634. }
  635. }), o('SimpleAssignable COMPOUND_ASSIGN Expression', function() {
  636. return new Assign($1, $3, $2);
  637. }), o('SimpleAssignable COMPOUND_ASSIGN INDENT Expression OUTDENT', function() {
  638. return new Assign($1, $4, $2);
  639. }), o('SimpleAssignable COMPOUND_ASSIGN TERMINATOR Expression', function() {
  640. return new Assign($1, $4, $2);
  641. }), o('SimpleAssignable EXTENDS Expression', function() {
  642. return new Extends($1, $3);
  643. })
  644. ]
  645. };
  646. operators = [['left', '.', '?.', '::', '?::'], ['left', 'CALL_START', 'CALL_END'], ['nonassoc', '++', '--'], ['left', '?'], ['right', 'UNARY'], ['right', '**'], ['right', 'UNARY_MATH'], ['left', 'MATH'], ['left', '+', '-'], ['left', 'SHIFT'], ['left', 'RELATION'], ['left', 'COMPARE'], ['left', 'LOGIC'], ['nonassoc', 'INDENT', 'OUTDENT'], ['right', 'YIELD'], ['right', '=', ':', 'COMPOUND_ASSIGN', 'RETURN', 'THROW', 'EXTENDS'], ['right', 'FORIN', 'FOROF', 'BY', 'WHEN'], ['right', 'IF', 'ELSE', 'FOR', 'WHILE', 'UNTIL', 'LOOP', 'SUPER', 'CLASS'], ['left', 'POST_IF']];
  647. tokens = [];
  648. for (name in grammar) {
  649. alternatives = grammar[name];
  650. grammar[name] = (function() {
  651. var i, j, len, len1, ref, results;
  652. results = [];
  653. for (i = 0, len = alternatives.length; i < len; i++) {
  654. alt = alternatives[i];
  655. ref = alt[0].split(' ');
  656. for (j = 0, len1 = ref.length; j < len1; j++) {
  657. token = ref[j];
  658. if (!grammar[token]) {
  659. tokens.push(token);
  660. }
  661. }
  662. if (name === 'Root') {
  663. alt[1] = "return " + alt[1];
  664. }
  665. results.push(alt);
  666. }
  667. return results;
  668. })();
  669. }
  670. exports.parser = new Parser({
  671. tokens: tokens.join(' '),
  672. bnf: grammar,
  673. operators: operators.reverse(),
  674. startSymbol: 'Root'
  675. });
  676. }).call(this);