From e74272803f06f75fbcc7a36cdcf26cf4ec4b3872 Mon Sep 17 00:00:00 2001 From: Filippo Conti Date: Wed, 15 Aug 2018 21:50:16 +0200 Subject: [PATCH 1/2] Added docs and publish command Added documentation --- .babelrc | 5 - .codeclimate.yml | 8 - .coveralls.yml | 1 - .eslintignore | 4 - .eslintrc.js | 21 - .gitignore | 7 - .istanbul.yml | 53 - .jsdoc.json | 29 - .npmignore | 15 - .travis.yml | 23 - AST.html | 606 + Array.html | 514 + Assign.html | 517 + Bin.html | 517 + Block.html | 459 + Boolean.html | 401 + Break.html | 465 + CODE_OF_CONDUCT.md | 46 - CONTRIBUTING.md | 3 - Call.html | 500 + Case.html | 500 + Cast.html | 488 + Catch.html | 528 + Class.html | 765 ++ ClassConstant.html | 643 + Clone.html | 459 + Closure.html | 639 + Comment.html | 459 + CommentBlock.html | 401 + CommentLine.html | 401 + ConstRef.html | 465 + Constant.html | 620 + Continue.html | 465 + Declaration.html | 605 + Declare.html | 499 + Do.html | 488 + Echo.html | 459 + Empty.html | 401 + Encapsed.html | 494 + Entry.html | 494 + Error.html | 558 + Eval.html | 459 + Exit.html | 494 + Expression.html | 402 + For.html | 586 + Foreach.html | 592 + Function.html | 736 + Global_.html | 459 + Goto.html | 470 + Halt.html | 470 + Identifier.html | 488 + If.html | 558 + Include.html | 517 + Inline.html | 401 + Interface.html | 643 + Isset.html | 401 + LICENSE | 27 - Label.html | 459 + List.html | 459 + Literal.html | 512 + Location.html | 353 + Lookup.html | 488 + Magic.html | 401 + Method.html | 701 + Namespace.html | 488 + New.html | 500 + Node.html | 706 + Number.html | 401 + OffsetLookup.html | 401 + Operation.html | 401 + Parameter.html | 742 + Parenthesis.html | 459 + Position.html | 347 + Post.html | 488 + Pre.html | 488 + Print.html | 401 + Program.html | 541 + Property.html | 707 + PropertyLookup.html | 401 + README.md | 122 - RELEASE.md | 101 - RetIf.html | 517 + Return.html | 465 + Silent.html | 459 + Statement.html | 401 + Static.html | 465 + StaticLookup.html | 401 + String.html | 917 ++ Switch.html | 517 + Sys.html | 459 + Throw.html | 459 + Trait.html | 678 + TraitAlias.html | 564 + TraitPrecedence.html | 523 + TraitUse.html | 494 + Try.html | 517 + Unary.html | 488 + Unset.html | 401 + UseGroup.html | 544 + UseItem.html | 544 + Variable.html | 538 + While.html | 517 + Yield.html | 511 + YieldFrom.html | 470 + ast.js.html | 497 + ast_array.js.html | 153 + ast_assign.js.html | 143 + ast_bin.js.html | 136 + ast_block.js.html | 133 + ast_boolean.js.html | 131 + ast_break.js.html | 133 + ast_call.js.html | 135 + ast_case.js.html | 135 + ast_cast.js.html | 135 + ast_catch.js.html | 144 + ast_class.js.html | 150 + ast_classconstant.js.html | 141 + ast_clone.js.html | 133 + ast_closure.js.html | 154 + ast_comment.js.html | 132 + ast_commentblock.js.html | 135 + ast_commentline.js.html | 135 + ast_constant.js.html | 138 + ast_constref.js.html | 133 + ast_continue.js.html | 133 + ast_declaration.js.html | 165 + ast_declare.js.html | 181 + ast_do.js.html | 135 + ast_echo.js.html | 133 + ast_empty.js.html | 131 + ast_encapsed.js.html | 183 + ast_entry.js.html | 135 + ast_error.js.html | 146 + ast_eval.js.html | 133 + ast_exit.js.html | 135 + ast_expression.js.html | 132 + ast_for.js.html | 150 + ast_foreach.js.html | 150 + ast_function.js.html | 148 + ast_global.js.html | 133 + ast_goto.js.html | 134 + ast_halt.js.html | 134 + ast_identifier.js.html | 171 + ast_if.js.html | 146 + ast_include.js.html | 143 + ast_inline.js.html | 131 + ast_interface.js.html | 141 + ast_isset.js.html | 131 + ast_label.js.html | 133 + ast_list.js.html | 133 + ast_literal.js.html | 143 + ast_location.js.html | 132 + ast_lookup.js.html | 141 + ast_magic.js.html | 131 + ast_method.js.html | 136 + ast_namespace.js.html | 141 + ast_new.js.html | 135 + ast_node.js.html | 170 + ast_nowdoc.js.html | 143 + ast_number.js.html | 131 + ast_offsetlookup.js.html | 136 + ast_operation.js.html | 131 + ast_parameter.js.html | 150 + ast_parenthesis.js.html | 137 + ast_position.js.html | 132 + ast_post.js.html | 135 + ast_pre.js.html | 135 + ast_print.js.html | 131 + ast_program.js.html | 148 + ast_property.js.html | 143 + ast_propertylookup.js.html | 136 + ast_retif.js.html | 143 + ast_return.js.html | 133 + ast_silent.js.html | 133 + ast_statement.js.html | 131 + ast_static.js.html | 133 + ast_staticlookup.js.html | 136 + ast_string.js.html | 143 + ast_switch.js.html | 143 + ast_sys.js.html | 133 + ast_throw.js.html | 133 + ast_trait.js.html | 144 + ast_traitalias.js.html | 160 + ast_traitprecedence.js.html | 143 + ast_traituse.js.html | 140 + ast_try.js.html | 143 + ast_unary.js.html | 135 + ast_unset.js.html | 131 + ast_usegroup.js.html | 145 + ast_useitem.js.html | 156 + ast_variable.js.html | 154 + ast_variadic.js.html | 134 + ast_while.js.html | 143 + ast_yield.js.html | 136 + ast_yieldfrom.js.html | 134 + dist/php-parser.js | 11138 ---------------- dist/php-parser.min.js | 23 - engine.html | 937 ++ fonts/OpenSans-Bold-webfont.eot | Bin 0 -> 19544 bytes fonts/OpenSans-Bold-webfont.svg | 1830 +++ fonts/OpenSans-Bold-webfont.woff | Bin 0 -> 22432 bytes fonts/OpenSans-BoldItalic-webfont.eot | Bin 0 -> 20133 bytes fonts/OpenSans-BoldItalic-webfont.svg | 1830 +++ fonts/OpenSans-BoldItalic-webfont.woff | Bin 0 -> 23048 bytes fonts/OpenSans-Italic-webfont.eot | Bin 0 -> 20265 bytes fonts/OpenSans-Italic-webfont.svg | 1830 +++ fonts/OpenSans-Italic-webfont.woff | Bin 0 -> 23188 bytes fonts/OpenSans-Light-webfont.eot | Bin 0 -> 19514 bytes fonts/OpenSans-Light-webfont.svg | 1831 +++ fonts/OpenSans-Light-webfont.woff | Bin 0 -> 22248 bytes fonts/OpenSans-LightItalic-webfont.eot | Bin 0 -> 20535 bytes fonts/OpenSans-LightItalic-webfont.svg | 1835 +++ fonts/OpenSans-LightItalic-webfont.woff | Bin 0 -> 23400 bytes fonts/OpenSans-Regular-webfont.eot | Bin 0 -> 19836 bytes fonts/OpenSans-Regular-webfont.svg | 1831 +++ fonts/OpenSans-Regular-webfont.woff | Bin 0 -> 22660 bytes fonts/OpenSans-Semibold-webfont.eot | Bin 0 -> 20028 bytes fonts/OpenSans-Semibold-webfont.svg | 1830 +++ fonts/OpenSans-Semibold-webfont.ttf | Bin 0 -> 39476 bytes fonts/OpenSans-Semibold-webfont.woff | Bin 0 -> 22908 bytes fonts/OpenSans-SemiboldItalic-webfont.eot | Bin 0 -> 20962 bytes fonts/OpenSans-SemiboldItalic-webfont.svg | 1830 +++ fonts/OpenSans-SemiboldItalic-webfont.ttf | Bin 0 -> 40252 bytes fonts/OpenSans-SemiboldItalic-webfont.woff | Bin 0 -> 23764 bytes global.html | 1308 ++ icons/home.svg | 4 + icons/search.svg | 4 + index.d.ts | 364 - index.html | 209 + index.js.html | 327 + lexer.html | 952 ++ lexer.js.html | 572 + lexer_comments.js.html | 174 + lexer_strings.js.html | 528 + package-lock.json | 9623 ------------- package.json | 64 - parser.html | 1562 +++ parser.js.html | 676 + parser_array.js.html | 216 + parser_class.js.html | 572 + parser_comment.js.html | 159 + parser_expr.js.html | 625 + parser_function.js.html | 368 + parser_if.js.html | 209 + parser_loops.js.html | 275 + parser_main.js.html | 132 + parser_namespace.js.html | 283 + parser_scalar.js.html | 418 + parser_statement.js.html | 514 + parser_switch.js.html | 202 + parser_try.js.html | 151 + parser_utils.js.html | 227 + parser_variable.js.html | 452 + scripts/linenumber.js | 24 + scripts/pagelocation.js | 89 + src/ast.js | 386 - src/ast/array.js | 42 - src/ast/assign.js | 32 - src/ast/bin.js | 25 - src/ast/block.js | 22 - src/ast/boolean.js | 20 - src/ast/break.js | 22 - src/ast/call.js | 24 - src/ast/case.js | 24 - src/ast/cast.js | 24 - src/ast/catch.js | 33 - src/ast/class.js | 39 - src/ast/classconstant.js | 30 - src/ast/clone.js | 22 - src/ast/closure.js | 43 - src/ast/comment.js | 21 - src/ast/commentblock.js | 24 - src/ast/commentline.js | 24 - src/ast/constant.js | 27 - src/ast/constref.js | 22 - src/ast/continue.js | 22 - src/ast/declaration.js | 54 - src/ast/declare.js | 70 - src/ast/do.js | 24 - src/ast/echo.js | 22 - src/ast/empty.js | 20 - src/ast/encapsed.js | 72 - src/ast/entry.js | 24 - src/ast/error.js | 35 - src/ast/eval.js | 22 - src/ast/exit.js | 24 - src/ast/expression.js | 21 - src/ast/for.js | 39 - src/ast/foreach.js | 39 - src/ast/function.js | 37 - src/ast/global.js | 22 - src/ast/goto.js | 23 - src/ast/halt.js | 23 - src/ast/identifier.js | 60 - src/ast/if.js | 35 - src/ast/include.js | 32 - src/ast/inline.js | 20 - src/ast/interface.js | 30 - src/ast/isset.js | 20 - src/ast/label.js | 22 - src/ast/list.js | 22 - src/ast/literal.js | 32 - src/ast/location.js | 21 - src/ast/lookup.js | 30 - src/ast/magic.js | 20 - src/ast/method.js | 25 - src/ast/namespace.js | 30 - src/ast/new.js | 24 - src/ast/node.js | 59 - src/ast/nowdoc.js | 32 - src/ast/number.js | 20 - src/ast/offsetlookup.js | 25 - src/ast/operation.js | 20 - src/ast/parameter.js | 39 - src/ast/parenthesis.js | 26 - src/ast/position.js | 21 - src/ast/post.js | 24 - src/ast/pre.js | 24 - src/ast/print.js | 20 - src/ast/program.js | 37 - src/ast/property.js | 32 - src/ast/propertylookup.js | 25 - src/ast/retif.js | 32 - src/ast/return.js | 22 - src/ast/silent.js | 22 - src/ast/statement.js | 20 - src/ast/static.js | 22 - src/ast/staticlookup.js | 25 - src/ast/string.js | 32 - src/ast/switch.js | 32 - src/ast/sys.js | 22 - src/ast/throw.js | 22 - src/ast/trait.js | 33 - src/ast/traitalias.js | 49 - src/ast/traitprecedence.js | 32 - src/ast/traituse.js | 29 - src/ast/try.js | 32 - src/ast/unary.js | 24 - src/ast/unset.js | 20 - src/ast/usegroup.js | 34 - src/ast/useitem.js | 45 - src/ast/variable.js | 43 - src/ast/variadic.js | 23 - src/ast/while.js | 32 - src/ast/yield.js | 25 - src/ast/yieldfrom.js | 23 - src/index.js | 216 - src/lexer.js | 461 - src/lexer/comments.js | 63 - src/lexer/initial.js | 70 - src/lexer/numbers.js | 120 - src/lexer/property.js | 94 - src/lexer/scripting.js | 108 - src/lexer/strings.js | 417 - src/lexer/tokens.js | 271 - src/lexer/utils.js | 82 - src/parser.js | 565 - src/parser/array.js | 105 - src/parser/class.js | 461 - src/parser/comment.js | 48 - src/parser/expr.js | 514 - src/parser/function.js | 257 - src/parser/if.js | 98 - src/parser/loops.js | 164 - src/parser/main.js | 21 - src/parser/namespace.js | 172 - src/parser/scalar.js | 307 - src/parser/statement.js | 403 - src/parser/switch.js | 91 - src/parser/try.js | 40 - src/parser/utils.js | 116 - src/parser/variable.js | 341 - src/tokens.js | 283 - styles/jsdoc-default.css | 957 ++ styles/prettify-jsdoc.css | 111 + styles/prettify-tomorrow.css | 138 + test/location.test.js | 140 - test/main.js | 11 - test/perf.test.js | 117 - test/precedence.test.js | 121 - test/snapshot/__snapshots__/acid.test.js.snap | 7429 ----------- .../snapshot/__snapshots__/array.test.js.snap | 422 - test/snapshot/__snapshots__/ast.test.js.snap | 455 - .../__snapshots__/buffer.test.js.snap | 23 - .../snapshot/__snapshots__/class.test.js.snap | 833 -- .../__snapshots__/comment.test.js.snap | 850 -- test/snapshot/__snapshots__/expr.test.js.snap | 1488 --- .../__snapshots__/function.test.js.snap | 302 - .../__snapshots__/graceful.test.js.snap | 414 - test/snapshot/__snapshots__/if.test.js.snap | 601 - .../snapshot/__snapshots__/lexer.test.js.snap | 230 - test/snapshot/__snapshots__/list.test.js.snap | 886 -- .../__snapshots__/location.test.js.snap | 223 - test/snapshot/__snapshots__/loop.test.js.snap | 618 - .../__snapshots__/namespace.test.js.snap | 1222 -- .../__snapshots__/number.test.js.snap | 302 - test/snapshot/__snapshots__/php5.test.js.snap | 141 - .../__snapshots__/scalar.test.js.snap | 213 - .../__snapshots__/statement.test.js.snap | 554 - .../__snapshots__/string.test.js.snap | 2076 --- .../__snapshots__/switch.test.js.snap | 356 - .../snapshot/__snapshots__/token.test.js.snap | 78 - .../__snapshots__/variable.test.js.snap | 778 -- test/snapshot/acid.test.js | 172 - test/snapshot/array.test.js | 57 - test/snapshot/ast.test.js | 99 - test/snapshot/buffer.test.js | 8 - test/snapshot/class.test.js | 94 - test/snapshot/comment.test.js | 151 - test/snapshot/expr.test.js | 207 - test/snapshot/function.test.js | 39 - test/snapshot/graceful.test.js | 50 - test/snapshot/if.test.js | 120 - test/snapshot/lexer.test.js | 73 - test/snapshot/list.test.js | 34 - test/snapshot/location.test.js | 28 - test/snapshot/loop.test.js | 76 - test/snapshot/namespace.test.js | 140 - test/snapshot/number.test.js | 32 - test/snapshot/php5.test.js | 14 - test/snapshot/scalar.test.js | 16 - test/snapshot/statement.test.js | 111 - test/snapshot/string.test.js | 317 - test/snapshot/switch.test.js | 46 - test/snapshot/token.test.js | 13 - test/snapshot/variable.test.js | 98 - tokens.js.html | 394 + tutorial-AST_.html | 256 + tutorial-Engine_.html | 180 + tutorial-Options.html | 146 + tutorial-Parser_.html | 414 + tutorials/AST.md | 135 - tutorials/Engine.md | 97 - tutorials/Options.md | 41 - tutorials/Parser.md | 749 -- variadic.html | 476 + webpack.config.js | 66 - 437 files changed, 88189 insertions(+), 54552 deletions(-) delete mode 100644 .babelrc delete mode 100644 .codeclimate.yml delete mode 100644 .coveralls.yml delete mode 100644 .eslintignore delete mode 100644 .eslintrc.js delete mode 100644 .gitignore delete mode 100644 .istanbul.yml delete mode 100644 .jsdoc.json delete mode 100644 .npmignore delete mode 100644 .travis.yml create mode 100644 AST.html create mode 100644 Array.html create mode 100644 Assign.html create mode 100644 Bin.html create mode 100644 Block.html create mode 100644 Boolean.html create mode 100644 Break.html delete mode 100644 CODE_OF_CONDUCT.md delete mode 100644 CONTRIBUTING.md create mode 100644 Call.html create mode 100644 Case.html create mode 100644 Cast.html create mode 100644 Catch.html create mode 100644 Class.html create mode 100644 ClassConstant.html create mode 100644 Clone.html create mode 100644 Closure.html create mode 100644 Comment.html create mode 100644 CommentBlock.html create mode 100644 CommentLine.html create mode 100644 ConstRef.html create mode 100644 Constant.html create mode 100644 Continue.html create mode 100644 Declaration.html create mode 100644 Declare.html create mode 100644 Do.html create mode 100644 Echo.html create mode 100644 Empty.html create mode 100644 Encapsed.html create mode 100644 Entry.html create mode 100644 Error.html create mode 100644 Eval.html create mode 100644 Exit.html create mode 100644 Expression.html create mode 100644 For.html create mode 100644 Foreach.html create mode 100644 Function.html create mode 100644 Global_.html create mode 100644 Goto.html create mode 100644 Halt.html create mode 100644 Identifier.html create mode 100644 If.html create mode 100644 Include.html create mode 100644 Inline.html create mode 100644 Interface.html create mode 100644 Isset.html delete mode 100644 LICENSE create mode 100644 Label.html create mode 100644 List.html create mode 100644 Literal.html create mode 100644 Location.html create mode 100644 Lookup.html create mode 100644 Magic.html create mode 100644 Method.html create mode 100644 Namespace.html create mode 100644 New.html create mode 100644 Node.html create mode 100644 Number.html create mode 100644 OffsetLookup.html create mode 100644 Operation.html create mode 100644 Parameter.html create mode 100644 Parenthesis.html create mode 100644 Position.html create mode 100644 Post.html create mode 100644 Pre.html create mode 100644 Print.html create mode 100644 Program.html create mode 100644 Property.html create mode 100644 PropertyLookup.html delete mode 100644 README.md delete mode 100644 RELEASE.md create mode 100644 RetIf.html create mode 100644 Return.html create mode 100644 Silent.html create mode 100644 Statement.html create mode 100644 Static.html create mode 100644 StaticLookup.html create mode 100644 String.html create mode 100644 Switch.html create mode 100644 Sys.html create mode 100644 Throw.html create mode 100644 Trait.html create mode 100644 TraitAlias.html create mode 100644 TraitPrecedence.html create mode 100644 TraitUse.html create mode 100644 Try.html create mode 100644 Unary.html create mode 100644 Unset.html create mode 100644 UseGroup.html create mode 100644 UseItem.html create mode 100644 Variable.html create mode 100644 While.html create mode 100644 Yield.html create mode 100644 YieldFrom.html create mode 100644 ast.js.html create mode 100644 ast_array.js.html create mode 100644 ast_assign.js.html create mode 100644 ast_bin.js.html create mode 100644 ast_block.js.html create mode 100644 ast_boolean.js.html create mode 100644 ast_break.js.html create mode 100644 ast_call.js.html create mode 100644 ast_case.js.html create mode 100644 ast_cast.js.html create mode 100644 ast_catch.js.html create mode 100644 ast_class.js.html create mode 100644 ast_classconstant.js.html create mode 100644 ast_clone.js.html create mode 100644 ast_closure.js.html create mode 100644 ast_comment.js.html create mode 100644 ast_commentblock.js.html create mode 100644 ast_commentline.js.html create mode 100644 ast_constant.js.html create mode 100644 ast_constref.js.html create mode 100644 ast_continue.js.html create mode 100644 ast_declaration.js.html create mode 100644 ast_declare.js.html create mode 100644 ast_do.js.html create mode 100644 ast_echo.js.html create mode 100644 ast_empty.js.html create mode 100644 ast_encapsed.js.html create mode 100644 ast_entry.js.html create mode 100644 ast_error.js.html create mode 100644 ast_eval.js.html create mode 100644 ast_exit.js.html create mode 100644 ast_expression.js.html create mode 100644 ast_for.js.html create mode 100644 ast_foreach.js.html create mode 100644 ast_function.js.html create mode 100644 ast_global.js.html create mode 100644 ast_goto.js.html create mode 100644 ast_halt.js.html create mode 100644 ast_identifier.js.html create mode 100644 ast_if.js.html create mode 100644 ast_include.js.html create mode 100644 ast_inline.js.html create mode 100644 ast_interface.js.html create mode 100644 ast_isset.js.html create mode 100644 ast_label.js.html create mode 100644 ast_list.js.html create mode 100644 ast_literal.js.html create mode 100644 ast_location.js.html create mode 100644 ast_lookup.js.html create mode 100644 ast_magic.js.html create mode 100644 ast_method.js.html create mode 100644 ast_namespace.js.html create mode 100644 ast_new.js.html create mode 100644 ast_node.js.html create mode 100644 ast_nowdoc.js.html create mode 100644 ast_number.js.html create mode 100644 ast_offsetlookup.js.html create mode 100644 ast_operation.js.html create mode 100644 ast_parameter.js.html create mode 100644 ast_parenthesis.js.html create mode 100644 ast_position.js.html create mode 100644 ast_post.js.html create mode 100644 ast_pre.js.html create mode 100644 ast_print.js.html create mode 100644 ast_program.js.html create mode 100644 ast_property.js.html create mode 100644 ast_propertylookup.js.html create mode 100644 ast_retif.js.html create mode 100644 ast_return.js.html create mode 100644 ast_silent.js.html create mode 100644 ast_statement.js.html create mode 100644 ast_static.js.html create mode 100644 ast_staticlookup.js.html create mode 100644 ast_string.js.html create mode 100644 ast_switch.js.html create mode 100644 ast_sys.js.html create mode 100644 ast_throw.js.html create mode 100644 ast_trait.js.html create mode 100644 ast_traitalias.js.html create mode 100644 ast_traitprecedence.js.html create mode 100644 ast_traituse.js.html create mode 100644 ast_try.js.html create mode 100644 ast_unary.js.html create mode 100644 ast_unset.js.html create mode 100644 ast_usegroup.js.html create mode 100644 ast_useitem.js.html create mode 100644 ast_variable.js.html create mode 100644 ast_variadic.js.html create mode 100644 ast_while.js.html create mode 100644 ast_yield.js.html create mode 100644 ast_yieldfrom.js.html delete mode 100644 dist/php-parser.js delete mode 100644 dist/php-parser.min.js create mode 100644 engine.html create mode 100644 fonts/OpenSans-Bold-webfont.eot create mode 100644 fonts/OpenSans-Bold-webfont.svg create mode 100644 fonts/OpenSans-Bold-webfont.woff create mode 100644 fonts/OpenSans-BoldItalic-webfont.eot create mode 100644 fonts/OpenSans-BoldItalic-webfont.svg create mode 100644 fonts/OpenSans-BoldItalic-webfont.woff create mode 100644 fonts/OpenSans-Italic-webfont.eot create mode 100644 fonts/OpenSans-Italic-webfont.svg create mode 100644 fonts/OpenSans-Italic-webfont.woff create mode 100644 fonts/OpenSans-Light-webfont.eot create mode 100644 fonts/OpenSans-Light-webfont.svg create mode 100644 fonts/OpenSans-Light-webfont.woff create mode 100644 fonts/OpenSans-LightItalic-webfont.eot create mode 100644 fonts/OpenSans-LightItalic-webfont.svg create mode 100644 fonts/OpenSans-LightItalic-webfont.woff create mode 100644 fonts/OpenSans-Regular-webfont.eot create mode 100644 fonts/OpenSans-Regular-webfont.svg create mode 100644 fonts/OpenSans-Regular-webfont.woff create mode 100644 fonts/OpenSans-Semibold-webfont.eot create mode 100644 fonts/OpenSans-Semibold-webfont.svg create mode 100644 fonts/OpenSans-Semibold-webfont.ttf create mode 100644 fonts/OpenSans-Semibold-webfont.woff create mode 100644 fonts/OpenSans-SemiboldItalic-webfont.eot create mode 100644 fonts/OpenSans-SemiboldItalic-webfont.svg create mode 100644 fonts/OpenSans-SemiboldItalic-webfont.ttf create mode 100644 fonts/OpenSans-SemiboldItalic-webfont.woff create mode 100644 global.html create mode 100644 icons/home.svg create mode 100644 icons/search.svg delete mode 100644 index.d.ts create mode 100644 index.html create mode 100644 index.js.html create mode 100644 lexer.html create mode 100644 lexer.js.html create mode 100644 lexer_comments.js.html create mode 100644 lexer_strings.js.html delete mode 100644 package-lock.json delete mode 100644 package.json create mode 100644 parser.html create mode 100644 parser.js.html create mode 100644 parser_array.js.html create mode 100644 parser_class.js.html create mode 100644 parser_comment.js.html create mode 100644 parser_expr.js.html create mode 100644 parser_function.js.html create mode 100644 parser_if.js.html create mode 100644 parser_loops.js.html create mode 100644 parser_main.js.html create mode 100644 parser_namespace.js.html create mode 100644 parser_scalar.js.html create mode 100644 parser_statement.js.html create mode 100644 parser_switch.js.html create mode 100644 parser_try.js.html create mode 100644 parser_utils.js.html create mode 100644 parser_variable.js.html create mode 100644 scripts/linenumber.js create mode 100644 scripts/pagelocation.js delete mode 100644 src/ast.js delete mode 100644 src/ast/array.js delete mode 100644 src/ast/assign.js delete mode 100644 src/ast/bin.js delete mode 100644 src/ast/block.js delete mode 100644 src/ast/boolean.js delete mode 100644 src/ast/break.js delete mode 100644 src/ast/call.js delete mode 100644 src/ast/case.js delete mode 100644 src/ast/cast.js delete mode 100644 src/ast/catch.js delete mode 100644 src/ast/class.js delete mode 100644 src/ast/classconstant.js delete mode 100644 src/ast/clone.js delete mode 100644 src/ast/closure.js delete mode 100644 src/ast/comment.js delete mode 100644 src/ast/commentblock.js delete mode 100644 src/ast/commentline.js delete mode 100644 src/ast/constant.js delete mode 100644 src/ast/constref.js delete mode 100644 src/ast/continue.js delete mode 100644 src/ast/declaration.js delete mode 100644 src/ast/declare.js delete mode 100644 src/ast/do.js delete mode 100644 src/ast/echo.js delete mode 100644 src/ast/empty.js delete mode 100644 src/ast/encapsed.js delete mode 100644 src/ast/entry.js delete mode 100644 src/ast/error.js delete mode 100644 src/ast/eval.js delete mode 100644 src/ast/exit.js delete mode 100644 src/ast/expression.js delete mode 100644 src/ast/for.js delete mode 100644 src/ast/foreach.js delete mode 100644 src/ast/function.js delete mode 100644 src/ast/global.js delete mode 100644 src/ast/goto.js delete mode 100644 src/ast/halt.js delete mode 100644 src/ast/identifier.js delete mode 100644 src/ast/if.js delete mode 100644 src/ast/include.js delete mode 100644 src/ast/inline.js delete mode 100644 src/ast/interface.js delete mode 100644 src/ast/isset.js delete mode 100644 src/ast/label.js delete mode 100644 src/ast/list.js delete mode 100644 src/ast/literal.js delete mode 100644 src/ast/location.js delete mode 100644 src/ast/lookup.js delete mode 100644 src/ast/magic.js delete mode 100644 src/ast/method.js delete mode 100644 src/ast/namespace.js delete mode 100644 src/ast/new.js delete mode 100644 src/ast/node.js delete mode 100644 src/ast/nowdoc.js delete mode 100644 src/ast/number.js delete mode 100644 src/ast/offsetlookup.js delete mode 100644 src/ast/operation.js delete mode 100644 src/ast/parameter.js delete mode 100644 src/ast/parenthesis.js delete mode 100644 src/ast/position.js delete mode 100644 src/ast/post.js delete mode 100644 src/ast/pre.js delete mode 100644 src/ast/print.js delete mode 100644 src/ast/program.js delete mode 100644 src/ast/property.js delete mode 100644 src/ast/propertylookup.js delete mode 100644 src/ast/retif.js delete mode 100644 src/ast/return.js delete mode 100644 src/ast/silent.js delete mode 100644 src/ast/statement.js delete mode 100644 src/ast/static.js delete mode 100644 src/ast/staticlookup.js delete mode 100644 src/ast/string.js delete mode 100644 src/ast/switch.js delete mode 100644 src/ast/sys.js delete mode 100644 src/ast/throw.js delete mode 100644 src/ast/trait.js delete mode 100644 src/ast/traitalias.js delete mode 100644 src/ast/traitprecedence.js delete mode 100644 src/ast/traituse.js delete mode 100644 src/ast/try.js delete mode 100644 src/ast/unary.js delete mode 100644 src/ast/unset.js delete mode 100644 src/ast/usegroup.js delete mode 100644 src/ast/useitem.js delete mode 100644 src/ast/variable.js delete mode 100644 src/ast/variadic.js delete mode 100644 src/ast/while.js delete mode 100644 src/ast/yield.js delete mode 100644 src/ast/yieldfrom.js delete mode 100644 src/index.js delete mode 100644 src/lexer.js delete mode 100644 src/lexer/comments.js delete mode 100644 src/lexer/initial.js delete mode 100644 src/lexer/numbers.js delete mode 100644 src/lexer/property.js delete mode 100644 src/lexer/scripting.js delete mode 100644 src/lexer/strings.js delete mode 100644 src/lexer/tokens.js delete mode 100644 src/lexer/utils.js delete mode 100644 src/parser.js delete mode 100644 src/parser/array.js delete mode 100644 src/parser/class.js delete mode 100644 src/parser/comment.js delete mode 100644 src/parser/expr.js delete mode 100644 src/parser/function.js delete mode 100644 src/parser/if.js delete mode 100644 src/parser/loops.js delete mode 100644 src/parser/main.js delete mode 100644 src/parser/namespace.js delete mode 100644 src/parser/scalar.js delete mode 100644 src/parser/statement.js delete mode 100644 src/parser/switch.js delete mode 100644 src/parser/try.js delete mode 100644 src/parser/utils.js delete mode 100644 src/parser/variable.js delete mode 100644 src/tokens.js create mode 100644 styles/jsdoc-default.css create mode 100644 styles/prettify-jsdoc.css create mode 100644 styles/prettify-tomorrow.css delete mode 100644 test/location.test.js delete mode 100644 test/main.js delete mode 100644 test/perf.test.js delete mode 100644 test/precedence.test.js delete mode 100644 test/snapshot/__snapshots__/acid.test.js.snap delete mode 100644 test/snapshot/__snapshots__/array.test.js.snap delete mode 100644 test/snapshot/__snapshots__/ast.test.js.snap delete mode 100644 test/snapshot/__snapshots__/buffer.test.js.snap delete mode 100644 test/snapshot/__snapshots__/class.test.js.snap delete mode 100644 test/snapshot/__snapshots__/comment.test.js.snap delete mode 100644 test/snapshot/__snapshots__/expr.test.js.snap delete mode 100644 test/snapshot/__snapshots__/function.test.js.snap delete mode 100644 test/snapshot/__snapshots__/graceful.test.js.snap delete mode 100644 test/snapshot/__snapshots__/if.test.js.snap delete mode 100644 test/snapshot/__snapshots__/lexer.test.js.snap delete mode 100644 test/snapshot/__snapshots__/list.test.js.snap delete mode 100644 test/snapshot/__snapshots__/location.test.js.snap delete mode 100644 test/snapshot/__snapshots__/loop.test.js.snap delete mode 100644 test/snapshot/__snapshots__/namespace.test.js.snap delete mode 100644 test/snapshot/__snapshots__/number.test.js.snap delete mode 100644 test/snapshot/__snapshots__/php5.test.js.snap delete mode 100644 test/snapshot/__snapshots__/scalar.test.js.snap delete mode 100644 test/snapshot/__snapshots__/statement.test.js.snap delete mode 100644 test/snapshot/__snapshots__/string.test.js.snap delete mode 100644 test/snapshot/__snapshots__/switch.test.js.snap delete mode 100644 test/snapshot/__snapshots__/token.test.js.snap delete mode 100644 test/snapshot/__snapshots__/variable.test.js.snap delete mode 100644 test/snapshot/acid.test.js delete mode 100644 test/snapshot/array.test.js delete mode 100644 test/snapshot/ast.test.js delete mode 100644 test/snapshot/buffer.test.js delete mode 100644 test/snapshot/class.test.js delete mode 100644 test/snapshot/comment.test.js delete mode 100644 test/snapshot/expr.test.js delete mode 100644 test/snapshot/function.test.js delete mode 100644 test/snapshot/graceful.test.js delete mode 100644 test/snapshot/if.test.js delete mode 100644 test/snapshot/lexer.test.js delete mode 100644 test/snapshot/list.test.js delete mode 100644 test/snapshot/location.test.js delete mode 100644 test/snapshot/loop.test.js delete mode 100644 test/snapshot/namespace.test.js delete mode 100644 test/snapshot/number.test.js delete mode 100644 test/snapshot/php5.test.js delete mode 100644 test/snapshot/scalar.test.js delete mode 100644 test/snapshot/statement.test.js delete mode 100644 test/snapshot/string.test.js delete mode 100644 test/snapshot/switch.test.js delete mode 100644 test/snapshot/token.test.js delete mode 100644 test/snapshot/variable.test.js create mode 100644 tokens.js.html create mode 100644 tutorial-AST_.html create mode 100644 tutorial-Engine_.html create mode 100644 tutorial-Options.html create mode 100644 tutorial-Parser_.html delete mode 100644 tutorials/AST.md delete mode 100644 tutorials/Engine.md delete mode 100644 tutorials/Options.md delete mode 100644 tutorials/Parser.md create mode 100644 variadic.html delete mode 100644 webpack.config.js diff --git a/.babelrc b/.babelrc deleted file mode 100644 index 3c078e9f9..000000000 --- a/.babelrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "presets": [ - "es2015" - ] -} diff --git a/.codeclimate.yml b/.codeclimate.yml deleted file mode 100644 index 4e0fb5920..000000000 --- a/.codeclimate.yml +++ /dev/null @@ -1,8 +0,0 @@ -exclude_patterns: -- "coverage/" -- "node_modules/" -- "test/" -- "tutorials/" -- "docs/" -- "dist/" -- "example/" diff --git a/.coveralls.yml b/.coveralls.yml deleted file mode 100644 index 2c5b2a4bf..000000000 --- a/.coveralls.yml +++ /dev/null @@ -1 +0,0 @@ -repo_token: de6RJbSSDNAPxIegg5fAEjIPHRrVhxRiF \ No newline at end of file diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 7e119d954..000000000 --- a/.eslintignore +++ /dev/null @@ -1,4 +0,0 @@ -/dist -/docs -/example -/tutorials diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 21a45027a..000000000 --- a/.eslintrc.js +++ /dev/null @@ -1,21 +0,0 @@ -module.exports = { - root: true, - parserOptions: { - ecmaVersion: 2017, - sourceType: "module" - }, - plugins: ["prettier"], - extends: ["eslint:recommended", "prettier"], - env: { - browser: true, - node: true, - mocha: true, - jest: true, - es6: true - }, - rules: { - "prefer-const": "error", - "no-var": "error", - "prettier/prettier": "error" - } -}; diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 5ba3c1599..000000000 --- a/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -/node_modules -/.project -/npm-debug.log -/nbproject -/coverage -/docs -*.swp diff --git a/.istanbul.yml b/.istanbul.yml deleted file mode 100644 index c2fa0db84..000000000 --- a/.istanbul.yml +++ /dev/null @@ -1,53 +0,0 @@ -verbose: false -instrumentation: - root: . - extensions: - - .js - default-excludes: true - excludes: [] - embed-source: false - variable: __coverage__ - compact: true - preserve-comments: false - complete-copy: false - save-baseline: false - baseline-file: ./coverage/coverage-baseline.json - include-all-sources: false - include-pid: false -reporting: - print: summary - reports: - - lcov - dir: ./coverage - watermarks: - statements: [50, 80] - lines: [50, 80] - functions: [50, 80] - branches: [50, 80] - report-config: - clover: {file: clover.xml} - cobertura: {file: cobertura-coverage.xml} - json: {file: coverage-final.json} - json-summary: {file: coverage-summary.json} - lcovonly: {file: lcov.info} - teamcity: {file: null, blockName: Code Coverage Summary} - text: {file: null, maxCols: 0} - text-lcov: {file: lcov.info} - text-summary: {file: null} -hooks: - hook-run-in-context: false - post-require-hook: null - handle-sigint: false -check: - global: - statements: 0 - lines: 0 - branches: 0 - functions: 0 - excludes: [] - each: - statements: 0 - lines: 0 - branches: 0 - functions: 0 - excludes: [] \ No newline at end of file diff --git a/.jsdoc.json b/.jsdoc.json deleted file mode 100644 index 6ee8ce1c1..000000000 --- a/.jsdoc.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "tags": { - "allowUnknownTags": true - }, - "source": { - "include": ["src"], - "includePattern": ".+\\.js(doc|x)?$", - "excludePattern": "(^|\\/|\\\\)_" - }, - "plugins": ["plugins/markdown"], - "markdown": { - "idInHeadings": true - }, - "templates": { - "referenceTitle": "php-parser", - "cleverLinks": true, - "monospaceLinks": true, - "default": { - "outputSourceFiles": true - } - }, - "opts": { - "template": "node_modules/jsdoc-template", - "tutorials": "tutorials", - "destination": "docs", - "readme": "README.md", - "recurse": true - } -} diff --git a/.npmignore b/.npmignore deleted file mode 100644 index 5ea9b176d..000000000 --- a/.npmignore +++ /dev/null @@ -1,15 +0,0 @@ -/docs/ -/test/ -/example/ -/tutorials/ -/coverage/ -/.vscode/ -/.babelrc -/.codeclimate.yml -/.coveralls.yml -/.eslintrc.js -/.eslintignore -/.jsdoc.json -/.istanbul.yml -/.travis.yml -/webpack.config.js \ No newline at end of file diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index c80fc0b4d..000000000 --- a/.travis.yml +++ /dev/null @@ -1,23 +0,0 @@ -language: node_js -node_js: - - '6' -cache: - bundler: true - directories: - - node_modules # NPM package -before_script: - - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter - - chmod +x ./cc-test-reporter - - ./cc-test-reporter before-build -notifications: - email: false - webhooks: - urls: - - https://webhooks.gitter.im/e/f1d48355795bf25a8f9a - on_success: change - on_failure: always - on_start: never -script: npm run lint && npm run cover -after_success: cat /home/travis/build/glayzzle/php-parser/coverage/lcov.info | /home/travis/build/glayzzle/php-parser/node_modules/coveralls/bin/coveralls.js -after_script: - - ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT diff --git a/AST.html b/AST.html new file mode 100644 index 000000000..6c873a4da --- /dev/null +++ b/AST.html @@ -0,0 +1,606 @@ + + + + + + + + + AST - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ AST +

+ + + + +
+
+ +

+ + AST + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new AST() +

+
+ + + + + +
+

The AST builder class

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
withPositions + + + + Boolean + + + + + + + +

Should locate any node (by default false)

+
withSource + + + + Boolean + + + + + + + +

Should extract the node original code (by default false)

+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + +
Tutorials:
+
+
    + +
  • + AST +
  • + +
+
+ + + + + +
+ + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ prepare(kind, parser) → {function} +

+
+ + + + + +
+

Prepares an AST node

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
kind + + + + String + + + | + + + null + + + + + + + +

Defines the node type +(if null, the kind must be passed at the function call)

+ +
parser + + + + Parser + + + + + + + +

The parser instance (use for extracting locations)

+ +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+ resolvePrecedence() +

+
+ + + + + +
+

Check and fix precence, by default using right

+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Array.html b/Array.html new file mode 100644 index 000000000..62a38f05c --- /dev/null +++ b/Array.html @@ -0,0 +1,514 @@ + + + + + + + + + Array - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Array +

+ + + + +
+
+ +

+ + Array + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Array() +

+
+ + + + + +
+

Defines an array structure

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
items + + + + Entry + + + | + + + Expr + + + | + + + Variable + + + + + + + +

List of array items

+
shortForm + + + + boolean + + + + + + + +

Indicate if the short array syntax is used, ex [] instead array()

+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
+ + + + + +
Example
+ + +
// PHP code :
[1, 'foo' => 'bar', 3]

// AST structure :
{
 "kind": "array",
 "shortForm": true
 "items": [
   {"kind": "number", "value": "1"},
   {
     "kind": "entry",
     "key": {"kind": "string", "value": "foo", "isDoubleQuote": false},
     "value": {"kind": "string", "value": "bar", "isDoubleQuote": false}
   },
   {"kind": "number", "value": "3"}
 ]
}
+ + +
+ + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Assign.html b/Assign.html new file mode 100644 index 000000000..0c08e7023 --- /dev/null +++ b/Assign.html @@ -0,0 +1,517 @@ + + + + + + + + + Assign - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Assign +

+ + + + +
+
+ +

+ + Assign + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Assign() +

+
+ + + + + +
+

Assigns a value to the specified target

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
left + + + + Expression + + + + + + + + +
right + + + + Expression + + + + + + + + +
operator + + + + String + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Bin.html b/Bin.html new file mode 100644 index 000000000..f64d8de05 --- /dev/null +++ b/Bin.html @@ -0,0 +1,517 @@ + + + + + + + + + Bin - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Bin +

+ + + + +
+
+ +

+ + Bin + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Bin() +

+
+ + + + + +
+

Binary operations

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
type + + + + String + + + + + + + + +
left + + + + Expression + + + + + + + + +
right + + + + Expression + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Block.html b/Block.html new file mode 100644 index 000000000..07a5adb6e --- /dev/null +++ b/Block.html @@ -0,0 +1,459 @@ + + + + + + + + + Block - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Block +

+ + + + +
+
+ +

+ + Block + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Block() +

+
+ + + + + +
+

A block statement, i.e., a sequence of statements surrounded by braces.

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
children + + + + Array.<Node> + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Boolean.html b/Boolean.html new file mode 100644 index 000000000..481248c53 --- /dev/null +++ b/Boolean.html @@ -0,0 +1,401 @@ + + + + + + + + + Boolean - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Boolean +

+ + + + +
+
+ +

+ + Boolean + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Boolean() +

+
+ + + + + +
+

Defines a boolean value (true/false)

+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Break.html b/Break.html new file mode 100644 index 000000000..3561a458f --- /dev/null +++ b/Break.html @@ -0,0 +1,465 @@ + + + + + + + + + Break - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Break +

+ + + + +
+
+ +

+ + Break + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Break() +

+
+ + + + + +
+

A break statement

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
level + + + + Number + + + | + + + Null + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md deleted file mode 100644 index 8d4ec213d..000000000 --- a/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,46 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. - -## Our Standards - -Examples of behavior that contributes to creating a positive environment include: - -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery and unwelcome sexual attention or advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a professional setting - -## Our Responsibilities - -Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. - -Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. - -## Scope - -This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at i.chiriac@yahoo.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. - -Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] - -[homepage]: http://contributor-covenant.org -[version]: http://contributor-covenant.org/version/1/4/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index c24acde54..000000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,3 +0,0 @@ -Everyone is welcome to contribute, just use the same coding style, and cover with tests your code. - -Any PR is welcomed :) diff --git a/Call.html b/Call.html new file mode 100644 index 000000000..e29875ed9 --- /dev/null +++ b/Call.html @@ -0,0 +1,500 @@ + + + + + + + + + Call - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Call +

+ + + + +
+
+ +

+ + Call + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Call() +

+
+ + + + + +
+

Executes a call statement

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
what + + + + Identifier + + + | + + + Variable + + + | + + + ? + + + + + + + + +
arguments + + + + Array.<Arguments> + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Case.html b/Case.html new file mode 100644 index 000000000..d4996fd29 --- /dev/null +++ b/Case.html @@ -0,0 +1,500 @@ + + + + + + + + + Case - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Case +

+ + + + +
+
+ +

+ + Case + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Case() +

+
+ + + + + +
+

A switch case statement

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
test + + + + Expression + + + | + + + null + + + + + + + +

if null, means that the default case

+
body + + + + Block + + + | + + + null + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Cast.html b/Cast.html new file mode 100644 index 000000000..dc79d43f9 --- /dev/null +++ b/Cast.html @@ -0,0 +1,488 @@ + + + + + + + + + Cast - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Cast +

+ + + + +
+
+ +

+ + Cast + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Cast() +

+
+ + + + + +
+

Binary operations

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
type + + + + String + + + + + + + + +
what + + + + Expression + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Catch.html b/Catch.html new file mode 100644 index 000000000..71e361cfc --- /dev/null +++ b/Catch.html @@ -0,0 +1,528 @@ + + + + + + + + + Catch - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Catch +

+ + + + +
+
+ +

+ + Catch + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Catch() +

+
+ + + + + +
+

Defines a catch statement

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
what + + + + Array.<Identifier> + + + + + + + + +
variable + + + + Variable + + + + + + + + +
body + + + + Statement + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + +
See:
+
+ +
+ + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Class.html b/Class.html new file mode 100644 index 000000000..8d15ae348 --- /dev/null +++ b/Class.html @@ -0,0 +1,765 @@ + + + + + + + + + Class - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Class +

+ + + + +
+
+ +

+ + Class + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Class() +

+
+ + + + + +
+

A class definition

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
extends + + + + Identifier + + + | + + + null + + + + + + + + +
implements + + + + Array.<Identifier> + + + + + + + + +
body + + + + Array.<Declaration> + + + + + + + + +
isAnonymous + + + + boolean + + + + + + + + +
isAbstract + + + + boolean + + + + + + + + +
isFinal + + + + boolean + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+ parseFlags(flags) → {void} +

+
+ + + + + +
+

Generic flags parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
flags + + + + Array.<Integer> + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/ClassConstant.html b/ClassConstant.html new file mode 100644 index 000000000..42f086052 --- /dev/null +++ b/ClassConstant.html @@ -0,0 +1,643 @@ + + + + + + + + + ClassConstant - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ClassConstant +

+ + + + +
+
+ +

+ + ClassConstant + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new ClassConstant() +

+
+ + + + + +
+

Defines a class/interface/trait constant

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
isStatic + + + + boolean + + + + + + + + +
visibility + + + + string + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+ parseFlags(flags) → {void} +

+
+ + + + + +
+

Generic flags parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
flags + + + + Array.<Integer> + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Clone.html b/Clone.html new file mode 100644 index 000000000..c134bb185 --- /dev/null +++ b/Clone.html @@ -0,0 +1,459 @@ + + + + + + + + + Clone - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Clone +

+ + + + +
+
+ +

+ + Clone + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Clone() +

+
+ + + + + +
+

Defines a clone call

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
what + + + + Expression + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Closure.html b/Closure.html new file mode 100644 index 000000000..327bebd51 --- /dev/null +++ b/Closure.html @@ -0,0 +1,639 @@ + + + + + + + + + Closure - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Closure +

+ + + + +
+
+ +

+ + Closure + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Closure() +

+
+ + + + + +
+

Defines a closure

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
arguments + + + + Array.<Parameter> + + + + + + + + +
uses + + + + Array.<Variable> + + + + + + + + +
type + + + + Identifier + + + + + + + + +
byref + + + + boolean + + + + + + + + +
nullable + + + + boolean + + + + + + + + +
body + + + + Block + + + | + + + null + + + + + + + + +
isStatic + + + + boolean + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Comment.html b/Comment.html new file mode 100644 index 000000000..ae8d85f89 --- /dev/null +++ b/Comment.html @@ -0,0 +1,459 @@ + + + + + + + + + Comment - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Comment +

+ + + + +
+
+ +

+ + Comment + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Comment() +

+
+ + + + + +
+

Abstract documentation node (ComentLine or CommentBlock)

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
value + + + + String + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/CommentBlock.html b/CommentBlock.html new file mode 100644 index 000000000..b2ced6248 --- /dev/null +++ b/CommentBlock.html @@ -0,0 +1,401 @@ + + + + + + + + + CommentBlock - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ CommentBlock +

+ + + + +
+
+ +

+ + CommentBlock + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new CommentBlock() +

+
+ + + + + +
+

A comment block (multiline)

+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/CommentLine.html b/CommentLine.html new file mode 100644 index 000000000..7795ce993 --- /dev/null +++ b/CommentLine.html @@ -0,0 +1,401 @@ + + + + + + + + + CommentLine - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ CommentLine +

+ + + + +
+
+ +

+ + CommentLine + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new CommentLine() +

+
+ + + + + +
+

A single line comment

+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/ConstRef.html b/ConstRef.html new file mode 100644 index 000000000..d2691c960 --- /dev/null +++ b/ConstRef.html @@ -0,0 +1,465 @@ + + + + + + + + + ConstRef - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ConstRef +

+ + + + +
+
+ +

+ + ConstRef + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new ConstRef() +

+
+ + + + + +
+

A constant reference

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
name + + + + String + + + | + + + Node + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Constant.html b/Constant.html new file mode 100644 index 000000000..ae282f9fc --- /dev/null +++ b/Constant.html @@ -0,0 +1,620 @@ + + + + + + + + + Constant - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Constant +

+ + + + +
+
+ +

+ + Constant + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Constant() +

+
+ + + + + +
+

Defines a namespace constant

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
value + + + + Node + + + | + + + null + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+ parseFlags(flags) → {void} +

+
+ + + + + +
+

Generic flags parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
flags + + + + Array.<Integer> + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Continue.html b/Continue.html new file mode 100644 index 000000000..114a9c7c2 --- /dev/null +++ b/Continue.html @@ -0,0 +1,465 @@ + + + + + + + + + Continue - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Continue +

+ + + + +
+
+ +

+ + Continue + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Continue() +

+
+ + + + + +
+

A continue statement

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
level + + + + Number + + + | + + + Null + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Declaration.html b/Declaration.html new file mode 100644 index 000000000..056629681 --- /dev/null +++ b/Declaration.html @@ -0,0 +1,605 @@ + + + + + + + + + Declaration - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Declaration +

+ + + + +
+
+ +

+ + Declaration + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Declaration() +

+
+ + + + + +
+

A declaration statement (function, class, interface...)

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
name + + + + string + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+ parseFlags(flags) → {void} +

+
+ + + + + +
+

Generic flags parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
flags + + + + Array.<Integer> + + + + + + + + + +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Declare.html b/Declare.html new file mode 100644 index 000000000..33620a36a --- /dev/null +++ b/Declare.html @@ -0,0 +1,499 @@ + + + + + + + + + Declare - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Declare +

+ + + + +
+
+ +

+ + Declare + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Declare() +

+
+ + + + + +
+

The declare construct is used to set execution directives for a block of code

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
what + + + + Array.<Expression> + + + + + + + + +
mode + + + + String + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + +
See:
+
+ +
+ + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Do.html b/Do.html new file mode 100644 index 000000000..ee33e0cd4 --- /dev/null +++ b/Do.html @@ -0,0 +1,488 @@ + + + + + + + + + Do - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Do +

+ + + + +
+
+ +

+ + Do + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Do() +

+
+ + + + + +
+

Defines a do/while statement

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
test + + + + Expression + + + + + + + + +
body + + + + Statement + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Echo.html b/Echo.html new file mode 100644 index 000000000..930dafe6e --- /dev/null +++ b/Echo.html @@ -0,0 +1,459 @@ + + + + + + + + + Echo - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Echo +

+ + + + +
+
+ +

+ + Echo + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Echo() +

+
+ + + + + +
+

Defines system based call

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
shortForm + + + + boolean + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Empty.html b/Empty.html new file mode 100644 index 000000000..c1fb54bac --- /dev/null +++ b/Empty.html @@ -0,0 +1,401 @@ + + + + + + + + + Empty - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Empty +

+ + + + +
+
+ +

+ + Empty + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Empty() +

+
+ + + + + +
+

Defines an empty check call

+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Encapsed.html b/Encapsed.html new file mode 100644 index 000000000..a619d1f65 --- /dev/null +++ b/Encapsed.html @@ -0,0 +1,494 @@ + + + + + + + + + Encapsed - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Encapsed +

+ + + + +
+
+ +

+ + Encapsed + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Encapsed() +

+
+ + + + + +
+

Defines an encapsed string (contains expressions)

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
type + + + + String + + + + + + + +

Defines the type of encapsed string (shell, heredoc, string)

+
label + + + + String + + + | + + + Null + + + + + + + +

The heredoc label, defined only when the type is heredoc

+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Entry.html b/Entry.html new file mode 100644 index 000000000..3132a944a --- /dev/null +++ b/Entry.html @@ -0,0 +1,494 @@ + + + + + + + + + Entry - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Entry +

+ + + + +
+
+ +

+ + Entry + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Entry() +

+
+ + + + + +
+

An array entry - see Array

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + + + Node + + + | + + + null + + + + + + + +

The entry key/offset

+
value + + + + Node + + + + + + + +

The entry value

+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Error.html b/Error.html new file mode 100644 index 000000000..17846093f --- /dev/null +++ b/Error.html @@ -0,0 +1,558 @@ + + + + + + + + + Error - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Error +

+ + + + +
+
+ +

+ + Error + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Error() +

+
+ + + + + +
+

Defines an error node (used only on silentMode)

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
message + + + + string + + + + + + + + +
line + + + + number + + + + + + + + +
token + + + + number + + + | + + + string + + + + + + + + +
expected + + + + string + + + | + + + array + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Eval.html b/Eval.html new file mode 100644 index 000000000..a39e5839e --- /dev/null +++ b/Eval.html @@ -0,0 +1,459 @@ + + + + + + + + + Eval - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Eval +

+ + + + +
+
+ +

+ + Eval + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Eval() +

+
+ + + + + +
+

Defines an eval statement

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
source + + + + Node + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Exit.html b/Exit.html new file mode 100644 index 000000000..7d34d0682 --- /dev/null +++ b/Exit.html @@ -0,0 +1,494 @@ + + + + + + + + + Exit - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Exit +

+ + + + +
+
+ +

+ + Exit + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Exit() +

+
+ + + + + +
+

Defines an exit / die call

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
status + + + + Node + + + | + + + null + + + + + + + + +
useDie + + + + Boolean + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Expression.html b/Expression.html new file mode 100644 index 000000000..042bf6703 --- /dev/null +++ b/Expression.html @@ -0,0 +1,402 @@ + + + + + + + + + Expression - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Expression +

+ + + + +
+
+ +

+ + Expression + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Expression() +

+
+ + + + + +
+

Any expression node. Since the left-hand side of an assignment may +be any expression in general, an expression can also be a pattern.

+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/For.html b/For.html new file mode 100644 index 000000000..9858409bf --- /dev/null +++ b/For.html @@ -0,0 +1,586 @@ + + + + + + + + + For - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ For +

+ + + + +
+
+ +

+ + For + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new For() +

+
+ + + + + +
+

Defines a for iterator

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
init + + + + Array.<Expression> + + + + + + + + +
test + + + + Array.<Expression> + + + + + + + + +
increment + + + + Array.<Expression> + + + + + + + + +
body + + + + Statement + + + + + + + + +
shortForm + + + + boolean + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + +
See:
+
+ +
+ + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Foreach.html b/Foreach.html new file mode 100644 index 000000000..49c3fbbb2 --- /dev/null +++ b/Foreach.html @@ -0,0 +1,592 @@ + + + + + + + + + Foreach - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Foreach +

+ + + + +
+
+ +

+ + Foreach + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Foreach() +

+
+ + + + + +
+

Defines a foreach iterator

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
source + + + + Expression + + + + + + + + +
key + + + + Expression + + + | + + + null + + + + + + + + +
value + + + + Expression + + + + + + + + +
body + + + + Statement + + + + + + + + +
shortForm + + + + boolean + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + +
See:
+
+ +
+ + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Function.html b/Function.html new file mode 100644 index 000000000..6feb4188e --- /dev/null +++ b/Function.html @@ -0,0 +1,736 @@ + + + + + + + + + Function - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Function +

+ + + + +
+
+ +

+ + Function + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Function() +

+
+ + + + + +
+

Defines a classic function

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
arguments + + + + Array.<Parameter> + + + + + + + + +
type + + + + Identifier + + + + + + + + +
byref + + + + boolean + + + + + + + + +
nullable + + + + boolean + + + + + + + + +
body + + + + Block + + + | + + + null + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+ parseFlags(flags) → {void} +

+
+ + + + + +
+

Generic flags parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
flags + + + + Array.<Integer> + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Global_.html b/Global_.html new file mode 100644 index 000000000..2134acd47 --- /dev/null +++ b/Global_.html @@ -0,0 +1,459 @@ + + + + + + + + + Global - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Global +

+ + + + +
+
+ +

+ + Global + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Global() +

+
+ + + + + +
+

Imports a variable from the global scope

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
items + + + + Array.<Variable> + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Goto.html b/Goto.html new file mode 100644 index 000000000..f44008a19 --- /dev/null +++ b/Goto.html @@ -0,0 +1,470 @@ + + + + + + + + + Goto - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Goto +

+ + + + +
+
+ +

+ + Goto + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Goto() +

+
+ + + + + +
+

Defines goto statement

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
label + + + + String + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + +
See:
+
+ +
+ + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Halt.html b/Halt.html new file mode 100644 index 000000000..9b6dda487 --- /dev/null +++ b/Halt.html @@ -0,0 +1,470 @@ + + + + + + + + + Halt - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Halt +

+ + + + +
+
+ +

+ + Halt + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Halt() +

+
+ + + + + +
+

Halts the compiler execution

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
after + + + + String + + + + + + + +

String after the halt statement

+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + +
See:
+
+ +
+ + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Identifier.html b/Identifier.html new file mode 100644 index 000000000..c0bcf65c7 --- /dev/null +++ b/Identifier.html @@ -0,0 +1,488 @@ + + + + + + + + + Identifier - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Identifier +

+ + + + +
+
+ +

+ + Identifier + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Identifier() +

+
+ + + + + +
+

Defines an identifier node

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
name + + + + string + + + + + + + + +
resolution + + + + string + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/If.html b/If.html new file mode 100644 index 000000000..0adedc2d3 --- /dev/null +++ b/If.html @@ -0,0 +1,558 @@ + + + + + + + + + If - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ If +

+ + + + +
+
+ +

+ + If + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new If() +

+
+ + + + + +
+

Defines a if statement

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
test + + + + Expression + + + + + + + + +
body + + + + Block + + + + + + + + +
alternate + + + + Block + + + | + + + If + + + | + + + null + + + + + + + + +
shortForm + + + + boolean + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Include.html b/Include.html new file mode 100644 index 000000000..9a89a6409 --- /dev/null +++ b/Include.html @@ -0,0 +1,517 @@ + + + + + + + + + Include - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Include +

+ + + + +
+
+ +

+ + Include + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Include() +

+
+ + + + + +
+

Defines system include call

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
target + + + + Node + + + + + + + + +
once + + + + boolean + + + + + + + + +
require + + + + boolean + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Inline.html b/Inline.html new file mode 100644 index 000000000..3419f4488 --- /dev/null +++ b/Inline.html @@ -0,0 +1,401 @@ + + + + + + + + + Inline - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Inline +

+ + + + +
+
+ +

+ + Inline + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Inline() +

+
+ + + + + +
+

Defines inline html output (treated as echo output)

+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Interface.html b/Interface.html new file mode 100644 index 000000000..d02edcf9f --- /dev/null +++ b/Interface.html @@ -0,0 +1,643 @@ + + + + + + + + + Interface - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Interface +

+ + + + +
+
+ +

+ + Interface + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Interface() +

+
+ + + + + +
+

An interface definition

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
extends + + + + Array.<Identifier> + + + + + + + + +
body + + + + Array.<Declaration> + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+ parseFlags(flags) → {void} +

+
+ + + + + +
+

Generic flags parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
flags + + + + Array.<Integer> + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Isset.html b/Isset.html new file mode 100644 index 000000000..528761948 --- /dev/null +++ b/Isset.html @@ -0,0 +1,401 @@ + + + + + + + + + Isset - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Isset +

+ + + + +
+
+ +

+ + Isset + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Isset() +

+
+ + + + + +
+

Defines an isset call

+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 66f0c9a88..000000000 --- a/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2014, Glayzzle -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of test-bsd nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/Label.html b/Label.html new file mode 100644 index 000000000..42ac6449a --- /dev/null +++ b/Label.html @@ -0,0 +1,459 @@ + + + + + + + + + Label - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Label +

+ + + + +
+
+ +

+ + Label + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Label() +

+
+ + + + + +
+

A label statement (referenced by goto)

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
name + + + + String + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/List.html b/List.html new file mode 100644 index 000000000..919228ab0 --- /dev/null +++ b/List.html @@ -0,0 +1,459 @@ + + + + + + + + + List - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ List +

+ + + + +
+
+ +

+ + List + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new List() +

+
+ + + + + +
+

Defines list assignment

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
shortForm + + + + boolean + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Literal.html b/Literal.html new file mode 100644 index 000000000..e00cf8f19 --- /dev/null +++ b/Literal.html @@ -0,0 +1,512 @@ + + + + + + + + + Literal - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Literal +

+ + + + +
+
+ +

+ + Literal + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Literal() +

+
+ + + + + +
+

Defines an array structure

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
raw + + + + string + + + + + + + + +
value + + + + Node + + + | + + + string + + + | + + + number + + + | + + + boolean + + + | + + + null + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Location.html b/Location.html new file mode 100644 index 000000000..eb5ec84bc --- /dev/null +++ b/Location.html @@ -0,0 +1,353 @@ + + + + + + + + + Location - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Location +

+ + + + +
+
+ +

+ + Location + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Location() +

+
+ + + + + +
+

Defines the location of the node (with it's source contents as string)

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
source + + + + String + + + | + + + null + + + + + + + + +
start + + + + Position + + + + + + + + +
end + + + + Position + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Lookup.html b/Lookup.html new file mode 100644 index 000000000..4b4f541d9 --- /dev/null +++ b/Lookup.html @@ -0,0 +1,488 @@ + + + + + + + + + Lookup - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Lookup +

+ + + + +
+
+ +

+ + Lookup + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Lookup() +

+
+ + + + + +
+

Lookup on an offset in the specified object

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
what + + + + Expression + + + + + + + + +
offset + + + + Expression + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Magic.html b/Magic.html new file mode 100644 index 000000000..72a1d644b --- /dev/null +++ b/Magic.html @@ -0,0 +1,401 @@ + + + + + + + + + Magic - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Magic +

+ + + + +
+
+ +

+ + Magic + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Magic() +

+
+ + + + + +
+

Defines magic constant

+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Method.html b/Method.html new file mode 100644 index 000000000..7b83c56fe --- /dev/null +++ b/Method.html @@ -0,0 +1,701 @@ + + + + + + + + + Method - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Method +

+ + + + +
+
+ +

+ + Method + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Method() +

+
+ + + + + +
+

Defines a class/interface/trait method

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
isAbstract + + + + boolean + + + + + + + + +
isFinal + + + + boolean + + + + + + + + +
isStatic + + + + boolean + + + + + + + + +
visibility + + + + string + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+ parseFlags(flags) → {void} +

+
+ + + + + +
+

Generic flags parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
flags + + + + Array.<Integer> + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Namespace.html b/Namespace.html new file mode 100644 index 000000000..b7a5380c7 --- /dev/null +++ b/Namespace.html @@ -0,0 +1,488 @@ + + + + + + + + + Namespace - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Namespace +

+ + + + +
+
+ +

+ + Namespace + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Namespace() +

+
+ + + + + +
+

The main program node

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
name + + + + String + + + + + + + + +
withBrackets + + + + Boolean + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/New.html b/New.html new file mode 100644 index 000000000..3bc358095 --- /dev/null +++ b/New.html @@ -0,0 +1,500 @@ + + + + + + + + + New - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ New +

+ + + + +
+
+ +

+ + New + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new New() +

+
+ + + + + +
+

Creates a new instance of the specified class

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
what + + + + Identifier + + + | + + + Variable + + + | + + + Class + + + + + + + + +
arguments + + + + Array.<Arguments> + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Node.html b/Node.html new file mode 100644 index 000000000..e8392149b --- /dev/null +++ b/Node.html @@ -0,0 +1,706 @@ + + + + + + + + + Node - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Node +

+ + + + +
+
+ +

+ + Node + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Node() +

+
+ + + + + +
+

A generic AST node

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDescription
loc + + + + Location + + + | + + + null + + + + + + + + + + + + +
leadingComments + + + + Array.<Comment> + + + + + + + + + + + + +
trailingComments + + + + Array.<Comment> + + + + + + + + + + + <nullable>
+ +
+ +
kind + + + + String + + + + + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ (static) extends(constructor) → {function} +

+
+ + + + + +
+

Helper for extending the Node class

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
constructor + + + + function + + + + + + + + + +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Number.html b/Number.html new file mode 100644 index 000000000..aa0a2d254 --- /dev/null +++ b/Number.html @@ -0,0 +1,401 @@ + + + + + + + + + Number - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Number +

+ + + + +
+
+ +

+ + Number + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Number() +

+
+ + + + + +
+

Defines a numeric value

+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/OffsetLookup.html b/OffsetLookup.html new file mode 100644 index 000000000..717ec4aa6 --- /dev/null +++ b/OffsetLookup.html @@ -0,0 +1,401 @@ + + + + + + + + + OffsetLookup - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ OffsetLookup +

+ + + + +
+
+ +

+ + OffsetLookup + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new OffsetLookup() +

+
+ + + + + +
+

Lookup on an offset in an array

+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Operation.html b/Operation.html new file mode 100644 index 000000000..14bec1bcd --- /dev/null +++ b/Operation.html @@ -0,0 +1,401 @@ + + + + + + + + + Operation - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Operation +

+ + + + +
+
+ +

+ + Operation + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Operation() +

+
+ + + + + +
+

Defines binary operations

+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Parameter.html b/Parameter.html new file mode 100644 index 000000000..786aff552 --- /dev/null +++ b/Parameter.html @@ -0,0 +1,742 @@ + + + + + + + + + Parameter - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Parameter +

+ + + + +
+
+ +

+ + Parameter + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Parameter() +

+
+ + + + + +
+

Defines a function parameter

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
type + + + + Identifier + + + | + + + null + + + + + + + + +
value + + + + Node + + + | + + + null + + + + + + + + +
byref + + + + boolean + + + + + + + + +
variadic + + + + boolean + + + + + + + + +
nullable + + + + boolean + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+ parseFlags(flags) → {void} +

+
+ + + + + +
+

Generic flags parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
flags + + + + Array.<Integer> + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Parenthesis.html b/Parenthesis.html new file mode 100644 index 000000000..98302c9e4 --- /dev/null +++ b/Parenthesis.html @@ -0,0 +1,459 @@ + + + + + + + + + Parenthesis - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Parenthesis +

+ + + + +
+
+ +

+ + Parenthesis + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Parenthesis() +

+
+ + + + + +
+

Parenthesis encapsulation (... expr ...)

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
inner + + + + Expression + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Position.html b/Position.html new file mode 100644 index 000000000..65c7a3eea --- /dev/null +++ b/Position.html @@ -0,0 +1,347 @@ + + + + + + + + + Position - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Position +

+ + + + +
+
+ +

+ + Position + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Position() +

+
+ + + + + +
+

Each Position object consists of a line number (1-indexed) and a column number (0-indexed):

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
line + + + + Number + + + + + + + + +
column + + + + Number + + + + + + + + +
offset + + + + Number + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Post.html b/Post.html new file mode 100644 index 000000000..4de185dc7 --- /dev/null +++ b/Post.html @@ -0,0 +1,488 @@ + + + + + + + + + Post - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Post +

+ + + + +
+
+ +

+ + Post + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Post() +

+
+ + + + + +
+

Defines a post operation $i++ or $i--

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
type + + + + String + + + + + + + + +
what + + + + Variable + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Pre.html b/Pre.html new file mode 100644 index 000000000..ccb15ff71 --- /dev/null +++ b/Pre.html @@ -0,0 +1,488 @@ + + + + + + + + + Pre - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Pre +

+ + + + +
+
+ +

+ + Pre + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Pre() +

+
+ + + + + +
+

Defines a pre operation ++$i or --$i

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
type + + + + String + + + + + + + + +
what + + + + Variable + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Print.html b/Print.html new file mode 100644 index 000000000..0709ea7ba --- /dev/null +++ b/Print.html @@ -0,0 +1,401 @@ + + + + + + + + + Print - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Print +

+ + + + +
+
+ +

+ + Print + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Print() +

+
+ + + + + +
+

Outputs

+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Program.html b/Program.html new file mode 100644 index 000000000..9f79095d4 --- /dev/null +++ b/Program.html @@ -0,0 +1,541 @@ + + + + + + + + + Program - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Program +

+ + + + +
+
+ +

+ + Program + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Program() +

+
+ + + + + +
+

The main program node

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeAttributesDescription
errors + + + + Array.<Error> + + + + + + + + + + + + +
comments + + + + Array.<Doc> + + + + + + + + + + + <nullable>
+ +
+ +
tokens + + + + Array.<String> + + + + + + + + + + + <nullable>
+ +
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Property.html b/Property.html new file mode 100644 index 000000000..96bab4689 --- /dev/null +++ b/Property.html @@ -0,0 +1,707 @@ + + + + + + + + + Property - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Property +

+ + + + +
+
+ +

+ + Property + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Property() +

+
+ + + + + +
+

Defines a class property

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
isFinal + + + + boolean + + + + + + + + +
isStatic + + + + boolean + + + + + + + + +
visibility + + + + string + + + + + + + + +
value + + + + Node + + + | + + + null + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+ parseFlags(flags) → {void} +

+
+ + + + + +
+

Generic flags parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
flags + + + + Array.<Integer> + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/PropertyLookup.html b/PropertyLookup.html new file mode 100644 index 000000000..c2e8d7062 --- /dev/null +++ b/PropertyLookup.html @@ -0,0 +1,401 @@ + + + + + + + + + PropertyLookup - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ PropertyLookup +

+ + + + +
+
+ +

+ + PropertyLookup + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new PropertyLookup() +

+
+ + + + + +
+

Lookup to an object property

+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index 103fccc05..000000000 --- a/README.md +++ /dev/null @@ -1,122 +0,0 @@ -

php-parser

-

- -Coverage Status - - - - -

-

This javascript library parses PHP code and convert it to AST.

- -Installation ------------- - -This library is distributed with [npm](https://www.npmjs.com/package/php-parser) : - -```sh -npm install php-parser --save -``` - -Usage ------ - -```js -// initialize the php parser factory class -var fs = require('fs'); -var path = require('path'); -var engine = require('php-parser'); - -// initialize a new parser instance -var parser = new engine({ - // some options : - parser: { - extractDoc: true, - php7: true - }, - ast: { - withPositions: true - } -}); - -// Retrieve the AST from the specified source -var eval = parser.parseEval('echo "Hello World";'); - -// Retrieve an array of tokens (same as php function token_get_all) -var tokens = parser.tokenGetAll(' You can add here your own project by opening an issue request. - -## License - -This library is released under BSD-3 license clause. - -[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fglayzzle%2Fphp-parser.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fglayzzle%2Fphp-parser?ref=badge_large) diff --git a/RELEASE.md b/RELEASE.md deleted file mode 100644 index 1d53d32db..000000000 --- a/RELEASE.md +++ /dev/null @@ -1,101 +0,0 @@ -# Releases - -## 3.0.0-alpha3 : (2018-08-15) - - fix #168 : End location of `if` without semicolon - - impl #147 : Node informations about Binary and unicode strings - - impl #83 : Adding full support for PHP 7.2 - - fix #122 : Detect foreach bad syntax - - impl #152 : Improve tests with JEST - - fix #164 : Fixing some location issues (partial) - -## 3.0.0-alpha2 : (2018-04-14) - - fix #137 : Bug with parsing `list` - - fix #149 : Binary cast: isDoubleQuote incorrect - - fix #150 : strange ast with list - - fix #151 : Declare inside if - -## 3.0.0-alpha1 : (2018-04-11) - - https://github.com/glayzzle/php-parser/milestone/10 - - many fixes - - changed the way comments are handled - - add a new `raw` property on some nodes - -## 2.2.0 : (2017-12-27) -- Impl #108 : add an option to disable PHP7 support -- Fix #107 : fix T_DOUBLE_COLON handler -- Fix #106 : infinite loops from lexer (unput) -- Fix #105 : T_DOLLAR_OPEN_CURLY_BRACES handles now expressions -- PR #102 : Normalize the way type casts are defined -- Fix #103 : Fix critical cast to null confusion - -## 2.1.0 : (2017-11-01) -- Impl #91 & #92 : Functions support reserved names (PHP7) -- Fix #89 : parsing methods can use Buffers or Strings - -## 2.0.7 : (2017-09-03) -- Fix #86 : bug on Object properties usage in PHP like `__proto__`, or `constructor` -- Fix #84 : remove null statements from bodies - -## 2.0.6 : (2017-07-16) - -- Fix precedence between bin, retif, unary -- Fix precedence with assign - -## 2.0.4 : (2017-07-09) - -- Fix AST errors on suppressErrors -- Add curly boolean on variable node (for `${bar}` syntax) -- Implement the static closure flag, ex: `$c = static function() {};` - -## 2.0.0 : (2017-03-04) - -- Update AST for operators, unify bin/bool/coalesce nodes -- Fix nested block usage on function bodies -- Avoid initial $ on variables -- Shell nodes are now exposed by encapsed nodes only -- Typescript definition file -- Avoid identifier nodes on namespaces & use statements -- Fix precedence on bin, unary, retif nodes -- Fix ending position on functions/methods/closures -- Fix lexer unput at the end of the file (infinite loops) -- Add encapsed node (type=offset) on dynamic offsets -- Implement annonymous class arguments -- Fix missing first char on encapsed T_STRING_VARNAME - -## 1.0.0 : (2017-01-03) - -- All nodes are now converted to objects -- Bruteforce tests are in a separate project -- Improved tests with mocha -- Many syntax fixes -- Tests over a silent error mode -- Release of a complete AST documentation - -## 0.1.5 : (2016-12-27) - -> The 0.1.x version starts to be deprecated - -- Fix closure use token -- Improve silent errors handler -- Pass PHP7 tests -- Update class, traits, interface declarations -- Many syntax fixes - -## 0.1.4 : (2016-12-12) - -- Move from static instances to instanciated objects in order to fully handle -promises -- Fix the silentLexer -- Fix the debug output mode -- Add positions on `expr->set` - -## Older releases - -* 0.1.3 : add comments nodes, add a browser version and improved parser stability -* 0.1.0 : major release, rewriting of the lexer and many bug fixes -* 0.0.10 : bugfixes and php7 implementation -* 0.0.9 : const (value as expr) bugfix -* 0.0.8 : all tokens are passed on ZF2 (many fixes) -* 0.0.7 : isset, unset, try, catch, finally, fix T_STATIC, fix T_NEW with a dynamic var name, improve tests -* 0.0.6 : Improve tests, implements arrays & new statements -* 0.0.5 : Implement traits diff --git a/RetIf.html b/RetIf.html new file mode 100644 index 000000000..22222eb74 --- /dev/null +++ b/RetIf.html @@ -0,0 +1,517 @@ + + + + + + + + + RetIf - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ RetIf +

+ + + + +
+
+ +

+ + RetIf + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new RetIf() +

+
+ + + + + +
+

Defines a short if statement that returns a value

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
test + + + + Expression + + + + + + + + +
trueExpr + + + + Expression + + + + + + + + +
falseExpr + + + + Expression + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Return.html b/Return.html new file mode 100644 index 000000000..8dc7ad1df --- /dev/null +++ b/Return.html @@ -0,0 +1,465 @@ + + + + + + + + + Return - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Return +

+ + + + +
+
+ +

+ + Return + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Return() +

+
+ + + + + +
+

A continue statement

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
expr + + + + Expression + + + | + + + null + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Silent.html b/Silent.html new file mode 100644 index 000000000..cb3691436 --- /dev/null +++ b/Silent.html @@ -0,0 +1,459 @@ + + + + + + + + + Silent - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Silent +

+ + + + +
+
+ +

+ + Silent + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Silent() +

+
+ + + + + +
+

Avoids to show/log warnings & notices from the inner expression

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
expr + + + + Expression + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Statement.html b/Statement.html new file mode 100644 index 000000000..edd3ec2d0 --- /dev/null +++ b/Statement.html @@ -0,0 +1,401 @@ + + + + + + + + + Statement - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Statement +

+ + + + +
+
+ +

+ + Statement + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Statement() +

+
+ + + + + +
+

Any statement.

+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Static.html b/Static.html new file mode 100644 index 000000000..c77a5760f --- /dev/null +++ b/Static.html @@ -0,0 +1,465 @@ + + + + + + + + + Static - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Static +

+ + + + +
+
+ +

+ + Static + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Static() +

+
+ + + + + +
+

Declares a static variable into the current scope

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
items + + + + Array.<Variable> + + + | + + + Array.<Assign> + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/StaticLookup.html b/StaticLookup.html new file mode 100644 index 000000000..c70ed32a4 --- /dev/null +++ b/StaticLookup.html @@ -0,0 +1,401 @@ + + + + + + + + + StaticLookup - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ StaticLookup +

+ + + + +
+
+ +

+ + StaticLookup + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new StaticLookup() +

+
+ + + + + +
+

Lookup to a static property

+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/String.html b/String.html new file mode 100644 index 000000000..879852ec8 --- /dev/null +++ b/String.html @@ -0,0 +1,917 @@ + + + + + + + + + String - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ String +

+ + + + +
+
+ +

+ + String + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new String() +

+
+ + + + + +
+

Defines a nowdoc string

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
label + + + + String + + + + + + + + +
raw + + + + String + + + + + + + + +
quote + + + + Boolean + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + + + +
Overrides:
+
+ +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+
+ +

+ + String + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new String() +

+
+ + + + + +
+

Defines a string (simple ou double quoted) - chars are already escaped

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
unicode + + + + boolean + + + + + + + + +
isDoubleQuote + + + + boolean + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + +
See:
+
+ +
+ + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + + + +
Overrides:
+
+ +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Switch.html b/Switch.html new file mode 100644 index 000000000..e781b6fd3 --- /dev/null +++ b/Switch.html @@ -0,0 +1,517 @@ + + + + + + + + + Switch - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Switch +

+ + + + +
+
+ +

+ + Switch + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Switch() +

+
+ + + + + +
+

Defines a switch statement

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
test + + + + Expression + + + + + + + + +
body + + + + Block + + + + + + + + +
shortForm + + + + boolean + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Sys.html b/Sys.html new file mode 100644 index 000000000..5d09cba73 --- /dev/null +++ b/Sys.html @@ -0,0 +1,459 @@ + + + + + + + + + Sys - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Sys +

+ + + + +
+
+ +

+ + Sys + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Sys() +

+
+ + + + + +
+

Defines system based call

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
arguments + + + + Array.<Node> + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Throw.html b/Throw.html new file mode 100644 index 000000000..c41bd707c --- /dev/null +++ b/Throw.html @@ -0,0 +1,459 @@ + + + + + + + + + Throw - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Throw +

+ + + + +
+
+ +

+ + Throw + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Throw() +

+
+ + + + + +
+

Defines a throw statement

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
what + + + + Expression + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Trait.html b/Trait.html new file mode 100644 index 000000000..b9f8a2463 --- /dev/null +++ b/Trait.html @@ -0,0 +1,678 @@ + + + + + + + + + Trait - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Trait +

+ + + + +
+
+ +

+ + Trait + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Trait() +

+
+ + + + + +
+

A trait definition

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
extends + + + + Identifier + + + | + + + null + + + + + + + + +
implements + + + + Array.<Identifier> + + + + + + + + +
body + + + + Array.<Declaration> + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+ parseFlags(flags) → {void} +

+
+ + + + + +
+

Generic flags parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
flags + + + + Array.<Integer> + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/TraitAlias.html b/TraitAlias.html new file mode 100644 index 000000000..f49fb2cf5 --- /dev/null +++ b/TraitAlias.html @@ -0,0 +1,564 @@ + + + + + + + + + TraitAlias - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ TraitAlias +

+ + + + +
+
+ +

+ + TraitAlias + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new TraitAlias() +

+
+ + + + + +
+

Defines a trait alias

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
trait + + + + Identifier + + + | + + + null + + + + + + + + +
method + + + + string + + + + + + + + +
as + + + + string + + + | + + + null + + + + + + + + +
visibility + + + + string + + + | + + + null + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/TraitPrecedence.html b/TraitPrecedence.html new file mode 100644 index 000000000..bf13a09d1 --- /dev/null +++ b/TraitPrecedence.html @@ -0,0 +1,523 @@ + + + + + + + + + TraitPrecedence - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ TraitPrecedence +

+ + + + +
+
+ +

+ + TraitPrecedence + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new TraitPrecedence() +

+
+ + + + + +
+

Defines a trait alias

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
trait + + + + Identifier + + + | + + + null + + + + + + + + +
method + + + + string + + + + + + + + +
instead + + + + Array.<Identifier> + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/TraitUse.html b/TraitUse.html new file mode 100644 index 000000000..c9d7f0f13 --- /dev/null +++ b/TraitUse.html @@ -0,0 +1,494 @@ + + + + + + + + + TraitUse - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ TraitUse +

+ + + + +
+
+ +

+ + TraitUse + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new TraitUse() +

+
+ + + + + +
+

Defines a trait usage

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
traits + + + + Array.<Identifier> + + + + + + + + +
adaptations + + + + Array.<Node> + + + | + + + null + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Try.html b/Try.html new file mode 100644 index 000000000..c64623744 --- /dev/null +++ b/Try.html @@ -0,0 +1,517 @@ + + + + + + + + + Try - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Try +

+ + + + +
+
+ +

+ + Try + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Try() +

+
+ + + + + +
+

Defines a try statement

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
body + + + + Block + + + + + + + + +
catches + + + + Array.<Catch> + + + + + + + + +
allways + + + + Block + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Unary.html b/Unary.html new file mode 100644 index 000000000..685fb73f8 --- /dev/null +++ b/Unary.html @@ -0,0 +1,488 @@ + + + + + + + + + Unary - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Unary +

+ + + + +
+
+ +

+ + Unary + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Unary() +

+
+ + + + + +
+

Unary operations

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
type + + + + String + + + + + + + + +
what + + + + Expression + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Unset.html b/Unset.html new file mode 100644 index 000000000..a9187e9da --- /dev/null +++ b/Unset.html @@ -0,0 +1,401 @@ + + + + + + + + + Unset - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Unset +

+ + + + +
+
+ +

+ + Unset + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Unset() +

+
+ + + + + +
+

Deletes references to a list of variables

+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/UseGroup.html b/UseGroup.html new file mode 100644 index 000000000..237ab0558 --- /dev/null +++ b/UseGroup.html @@ -0,0 +1,544 @@ + + + + + + + + + UseGroup - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ UseGroup +

+ + + + +
+
+ +

+ + UseGroup + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new UseGroup() +

+
+ + + + + +
+

Defines a use statement (with a list of use items)

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
name + + + + String + + + | + + + null + + + + + + + + +
type + + + + String + + + | + + + null + + + + + + + +

Possible value : function, const

+
item + + + + Array.<UseItem> + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + +
See:
+
+ +
+ + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/UseItem.html b/UseItem.html new file mode 100644 index 000000000..f35feb4ef --- /dev/null +++ b/UseItem.html @@ -0,0 +1,544 @@ + + + + + + + + + UseItem - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ UseItem +

+ + + + +
+
+ +

+ + UseItem + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new UseItem() +

+
+ + + + + +
+

Defines a use statement (from namespace)

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
name + + + + String + + + + + + + + +
type + + + + String + + + | + + + null + + + + + + + +

Possible value : function, const

+
alias + + + + String + + + | + + + null + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + +
See:
+
+ +
+ + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Variable.html b/Variable.html new file mode 100644 index 000000000..08cf4b81a --- /dev/null +++ b/Variable.html @@ -0,0 +1,538 @@ + + + + + + + + + Variable - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Variable +

+ + + + +
+
+ +

+ + Variable + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Variable() +

+
+ + + + + +
+

Any expression node. Since the left-hand side of an assignment may +be any expression in general, an expression can also be a pattern.

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
name + + + + String + + + | + + + Node + + + + + + + +

The variable name (can be a complex expression when the name is resolved dynamically)

+
byref + + + + boolean + + + + + + + +

Indicate if the variable reference is used, ex &$foo

+
curly + + + + boolean + + + + + + + +

Indicate if the name is defined between curlies, ex ${foo}

+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + +
+ + + + + +
Example
+ + +
// PHP code :
&$foo
// AST output
{
 "kind": "variable",
 "name": "foo",
 "byref": true,
 "curly": false
}
+ + +
+ + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/While.html b/While.html new file mode 100644 index 000000000..6b31281de --- /dev/null +++ b/While.html @@ -0,0 +1,517 @@ + + + + + + + + + While - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ While +

+ + + + +
+
+ +

+ + While + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new While() +

+
+ + + + + +
+

Defines a while statement

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
test + + + + Expression + + + + + + + + +
body + + + + Statement + + + + + + + + +
shortForm + + + + boolean + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/Yield.html b/Yield.html new file mode 100644 index 000000000..1e0378c3f --- /dev/null +++ b/Yield.html @@ -0,0 +1,511 @@ + + + + + + + + + Yield - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Yield +

+ + + + +
+
+ +

+ + Yield + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new Yield() +

+
+ + + + + +
+

Defines a yield generator statement

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
value + + + + Expression + + + | + + + Null + + + + + + + + +
key + + + + Expression + + + | + + + Null + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + +
See:
+
+ +
+ + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/YieldFrom.html b/YieldFrom.html new file mode 100644 index 000000000..f6572308e --- /dev/null +++ b/YieldFrom.html @@ -0,0 +1,470 @@ + + + + + + + + + YieldFrom - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ YieldFrom +

+ + + + +
+
+ +

+ + YieldFrom + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new YieldFrom() +

+
+ + + + + +
+

Defines a yield from generator statement

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
value + + + + Expression + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + +
See:
+
+ +
+ + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/ast.js.html b/ast.js.html new file mode 100644 index 000000000..8b8252b5c --- /dev/null +++ b/ast.js.html @@ -0,0 +1,497 @@ + + + + + + + + + + + ast.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Location = require("./ast/location");
+const Position = require("./ast/position");
+
+/**
+ * ## Class hierarchy
+ *
+ * - [Location](#location)
+ * - [Position](#position)
+ * - [Node](#node)
+ *   - [Identifier](#identifier)
+ *   - [TraitUse](#traituse)
+ *   - [TraitAlias](#traitalias)
+ *   - [TraitPrecedence](#traitprecedence)
+ *   - [Entry](#entry)
+ *   - [Case](#case)
+ *   - [Label](#label)
+ *   - [Comment](#comment)
+ *     - [CommentLine](#commentline)
+ *     - [CommentBlock](#commentblock)
+ *   - [Error](#error)
+ *   - [Expression](#expression)
+ *     - [Array](#array)
+ *     - [Variable](#variable)
+ *     - [Variadic](#variadic)
+ *     - [ConstRef](#constref)
+ *     - [Yield](#yield)
+ *     - [YieldFrom](#yieldfrom)
+ *     - [Lookup](#lookup)
+ *       - [PropertyLookup](#propertylookup)
+ *       - [StaticLookup](#staticlookup)
+ *       - [OffsetLookup](#offsetlookup)
+ *     - [Operation](#operation)
+ *       - [Pre](#pre)
+ *       - [Post](#post)
+ *       - [Bin](#bin)
+ *       - [Parenthesis](#parenthesis)
+ *       - [Unary](#unary)
+ *       - [Cast](#cast)
+ *     - [Literal](#literal)
+ *       - [Boolean](#boolean)
+ *       - [String](#string)
+ *       - [Number](#number)
+ *       - [Inline](#inline)
+ *       - [Magic](#magic)
+ *       - [Nowdoc](#nowdoc)
+ *       - [Encapsed](#encapsed)
+ *   - [Statement](#statement)
+ *     - [Eval](#eval)
+ *     - [Exit](#exit)
+ *     - [Halt](#halt)
+ *     - [Clone](#clone)
+ *     - [Declare](#declare)
+ *     - [Global](#global)
+ *     - [Static](#static)
+ *     - [Include](#include)
+ *     - [Assign](#assign)
+ *     - [RetIf](#retif)
+ *     - [If](#if)
+ *     - [Do](#do)
+ *     - [While](#while)
+ *     - [For](#for)
+ *     - [Foreach](#foreach)
+ *     - [Switch](#switch)
+ *     - [Goto](#goto)
+ *     - [Silent](#silent)
+ *     - [Try](#try)
+ *     - [Catch](#catch)
+ *     - [Throw](#throw)
+ *     - [Call](#call)
+ *     - [Closure](#closure)
+ *     - [New](#new)
+ *     - [UseGroup](#usegroup)
+ *     - [UseItem](#useitem)
+ *     - [Block](#block)
+ *       - [Program](#program)
+ *       - [Namespace](#namespace)
+ *     - [Sys](#sys)
+ *       - [Echo](#echo)
+ *       - [List](#list)
+ *       - [Print](#print)
+ *       - [Isset](#isset)
+ *       - [Unset](#unset)
+ *       - [Empty](#empty)
+ *     - [Declaration](#declaration)
+ *       - [Class](#class)
+ *       - [Interface](#interface)
+ *       - [Trait](#trait)
+ *       - [Constant](#constant)
+ *         - [ClassConstant](#classconstant)
+ *       - [Function](#function)
+ *         - [Method](#method)
+ *       - [Parameter](#parameter)
+ *       - [Property](#property)
+ * ---
+ */
+
+/**
+ * The AST builder class
+ * @constructor AST
+ * @tutorial AST
+ * @property {Boolean} withPositions - Should locate any node (by default false)
+ * @property {Boolean} withSource - Should extract the node original code (by default false)
+ */
+const AST = function(withPositions, withSource) {
+  this.withPositions = withPositions;
+  this.withSource = withSource;
+};
+
+/**
+ * Create a position node from specified parser
+ * including it's lexer current state
+ * @param {Parser}
+ * @return {Position}
+ * @private
+ */
+AST.prototype.position = function(parser) {
+  return new Position(
+    parser.lexer.yylloc.first_line,
+    parser.lexer.yylloc.first_column,
+    parser.lexer.yylloc.first_offset
+  );
+};
+
+// operators in ascending order of precedence
+AST.precedence = {};
+[
+  ["or"],
+  ["xor"],
+  ["and"],
+  ["="],
+  ["?"],
+  ["??"],
+  ["||"],
+  ["&&"],
+  ["|"],
+  ["^"],
+  ["&"],
+  ["==", "!=", "===", "!==", /* '<>', */ "<=>"],
+  ["<", "<=", ">", ">="],
+  ["<<", ">>"],
+  ["+", "-", "."],
+  ["*", "/", "%"],
+  ["!"],
+  ["instanceof"]
+  // TODO: typecasts
+  // TODO: [ (array)
+  // TODO: clone, new
+].forEach(function(list, index) {
+  list.forEach(function(operator) {
+    AST.precedence[operator] = index + 1;
+  });
+});
+
+/**
+ * Check and fix precence, by default using right
+ */
+AST.prototype.resolvePrecedence = function(result) {
+  let buffer, lLevel, rLevel;
+  // handling precendence
+  if (result.kind === "bin") {
+    if (result.right) {
+      if (result.right.kind === "bin") {
+        lLevel = AST.precedence[result.type];
+        rLevel = AST.precedence[result.right.type];
+        if (lLevel && rLevel && rLevel <= lLevel) {
+          // https://github.com/glayzzle/php-parser/issues/79
+          // shift precedence
+          buffer = result.right;
+          result.right = result.right.left;
+          buffer.left = this.resolvePrecedence(result);
+          result = buffer;
+        }
+      } else if (result.right.kind === "retif") {
+        lLevel = AST.precedence[result.type];
+        rLevel = AST.precedence["?"];
+        if (lLevel && rLevel && rLevel <= lLevel) {
+          buffer = result.right;
+          result.right = result.right.test;
+          buffer.test = this.resolvePrecedence(result);
+          result = buffer;
+        }
+      }
+    }
+  } else if (result.kind === "unary") {
+    // https://github.com/glayzzle/php-parser/issues/75
+    if (result.what) {
+      // unary precedence is allways lower
+      if (result.what.kind === "bin") {
+        buffer = result.what;
+        result.what = result.what.left;
+        buffer.left = this.resolvePrecedence(result);
+        result = buffer;
+      } else if (result.what.kind === "retif") {
+        buffer = result.what;
+        result.what = result.what.test;
+        buffer.test = this.resolvePrecedence(result);
+        result = buffer;
+      }
+    }
+  } else if (result.kind === "retif") {
+    // https://github.com/glayzzle/php-parser/issues/77
+    if (result.falseExpr && result.falseExpr.kind === "retif") {
+      buffer = result.falseExpr;
+      result.falseExpr = buffer.test;
+      buffer.test = this.resolvePrecedence(result);
+      result = buffer;
+    }
+  } else if (result.kind === "assign") {
+    // https://github.com/glayzzle/php-parser/issues/81
+    if (result.right && result.right.kind === "bin") {
+      lLevel = AST.precedence["="];
+      rLevel = AST.precedence[result.right.type];
+      // only shifts with and, xor, or
+      if (lLevel && rLevel && rLevel < lLevel) {
+        buffer = result.right;
+        result.right = result.right.left;
+        buffer.left = result;
+        result = buffer;
+      }
+    }
+  }
+  return result;
+};
+
+/**
+ * Prepares an AST node
+ * @param {String|null} kind - Defines the node type
+ * (if null, the kind must be passed at the function call)
+ * @param {Parser} parser - The parser instance (use for extracting locations)
+ * @return {Function}
+ */
+AST.prototype.prepare = function(kind, docs, parser) {
+  let start = null;
+  if (this.withPositions || this.withSource) {
+    start = this.position(parser);
+  }
+  const self = this;
+  // returns the node
+  const result = function() {
+    let location = null;
+    const args = Array.prototype.slice.call(arguments);
+    args.push(docs);
+    if (self.withPositions || self.withSource) {
+      let src = null;
+      if (self.withSource) {
+        src = parser.lexer._input.substring(start.offset, parser.prev[2]);
+      }
+      if (self.withPositions) {
+        location = new Location(
+          src,
+          start,
+          new Position(parser.prev[0], parser.prev[1], parser.prev[2])
+        );
+      } else {
+        location = new Location(src, null, null);
+      }
+      // last argument is allways the location
+      args.push(location);
+    }
+    // handle lazy kind definitions
+    if (!kind) {
+      kind = args.shift();
+    }
+    // build the object
+    const node = self[kind];
+    if (typeof node !== "function") {
+      throw new Error('Undefined node "' + kind + '"');
+    }
+    const result = Object.create(node.prototype);
+    node.apply(result, args);
+    return self.resolvePrecedence(result);
+  };
+  /**
+   * Helper to change a node kind
+   * @param {String} newKind
+   */
+  result.setKind = function(newKind) {
+    kind = newKind;
+  };
+  return result;
+};
+
+// Define all AST nodes
+[
+  require("./ast/array"),
+  require("./ast/assign"),
+  require("./ast/bin"),
+  require("./ast/block"),
+  require("./ast/boolean"),
+  require("./ast/break"),
+  require("./ast/call"),
+  require("./ast/case"),
+  require("./ast/cast"),
+  require("./ast/catch"),
+  require("./ast/class"),
+  require("./ast/classconstant"),
+  require("./ast/clone"),
+  require("./ast/closure"),
+  require("./ast/comment"),
+  require("./ast/commentblock"),
+  require("./ast/commentline"),
+  require("./ast/constant"),
+  require("./ast/constref"),
+  require("./ast/continue"),
+  require("./ast/declaration"),
+  require("./ast/declare"),
+  require("./ast/do"),
+  require("./ast/echo"),
+  require("./ast/empty"),
+  require("./ast/encapsed"),
+  require("./ast/entry"),
+  require("./ast/error"),
+  require("./ast/eval"),
+  require("./ast/exit"),
+  require("./ast/expression"),
+  require("./ast/for"),
+  require("./ast/foreach"),
+  require("./ast/function"),
+  require("./ast/global"),
+  require("./ast/goto"),
+  require("./ast/halt"),
+  require("./ast/identifier"),
+  require("./ast/if"),
+  require("./ast/include"),
+  require("./ast/inline"),
+  require("./ast/interface"),
+  require("./ast/isset"),
+  require("./ast/label"),
+  require("./ast/list"),
+  require("./ast/literal"),
+  require("./ast/lookup"),
+  require("./ast/magic"),
+  require("./ast/method"),
+  require("./ast/namespace"),
+  require("./ast/new"),
+  require("./ast/node"),
+  require("./ast/nowdoc"),
+  require("./ast/number"),
+  require("./ast/offsetlookup"),
+  require("./ast/operation"),
+  require("./ast/parameter"),
+  require("./ast/parenthesis"),
+  require("./ast/post"),
+  require("./ast/pre"),
+  require("./ast/print"),
+  require("./ast/program"),
+  require("./ast/property"),
+  require("./ast/propertylookup"),
+  require("./ast/retif"),
+  require("./ast/return"),
+  require("./ast/silent"),
+  require("./ast/statement"),
+  require("./ast/static"),
+  require("./ast/staticlookup"),
+  require("./ast/string"),
+  require("./ast/switch"),
+  require("./ast/sys"),
+  require("./ast/throw"),
+  require("./ast/trait"),
+  require("./ast/traitalias"),
+  require("./ast/traitprecedence"),
+  require("./ast/traituse"),
+  require("./ast/try"),
+  require("./ast/unary"),
+  require("./ast/unset"),
+  require("./ast/usegroup"),
+  require("./ast/useitem"),
+  require("./ast/variable"),
+  require("./ast/variadic"),
+  require("./ast/while"),
+  require("./ast/yield"),
+  require("./ast/yieldfrom")
+].forEach(function(ctor) {
+  let kind = ctor.prototype.constructor.name.toLowerCase();
+  if (kind[0] === "_") kind = kind.substring(1);
+  AST.prototype[kind] = ctor;
+});
+
+module.exports = AST;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_array.js.html b/ast_array.js.html new file mode 100644 index 000000000..b4ce8bc06 --- /dev/null +++ b/ast_array.js.html @@ -0,0 +1,153 @@ + + + + + + + + + + + ast/array.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/array.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Expr = require("./expression");
+const KIND = "array";
+
+/**
+ * Defines an array structure
+ * @constructor Array
+ * @example
+ * // PHP code :
+ * [1, 'foo' => 'bar', 3]
+ *
+ * // AST structure :
+ * {
+ *  "kind": "array",
+ *  "shortForm": true
+ *  "items": [
+ *    {"kind": "number", "value": "1"},
+ *    {
+ *      "kind": "entry",
+ *      "key": {"kind": "string", "value": "foo", "isDoubleQuote": false},
+ *      "value": {"kind": "string", "value": "bar", "isDoubleQuote": false}
+ *    },
+ *    {"kind": "number", "value": "3"}
+ *  ]
+ * }
+ * @extends {Expression}
+ * @property {Entry|Expr|Variable} items List of array items
+ * @property {boolean} shortForm Indicate if the short array syntax is used, ex `[]` instead `array()`
+ */
+const Array = Expr.extends(function Array(shortForm, items, docs, location) {
+  Expr.apply(this, [KIND, docs, location]);
+  this.items = items;
+  this.shortForm = shortForm;
+});
+
+module.exports = Array;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_assign.js.html b/ast_assign.js.html new file mode 100644 index 000000000..796b44f3e --- /dev/null +++ b/ast_assign.js.html @@ -0,0 +1,143 @@ + + + + + + + + + + + ast/assign.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/assign.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Statement = require("./statement");
+const KIND = "assign";
+
+/**
+ * Assigns a value to the specified target
+ * @constructor Assign
+ * @extends {Statement}
+ * @property {Expression} left
+ * @property {Expression} right
+ * @property {String} operator
+ */
+const Assign = Statement.extends(function Assign(
+  left,
+  right,
+  operator,
+  docs,
+  location
+) {
+  Statement.apply(this, [KIND, docs, location]);
+  this.operator = operator;
+  this.left = left;
+  this.right = right;
+});
+
+module.exports = Assign;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_bin.js.html b/ast_bin.js.html new file mode 100644 index 000000000..6d2fbe3d9 --- /dev/null +++ b/ast_bin.js.html @@ -0,0 +1,136 @@ + + + + + + + + + + + ast/bin.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/bin.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Operation = require("./operation");
+const KIND = "bin";
+/**
+ * Binary operations
+ * @constructor Bin
+ * @extends {Operation}
+ * @property {String} type
+ * @property {Expression} left
+ * @property {Expression} right
+ */
+const Bin = Operation.extends(function Bin(type, left, right, docs, location) {
+  Operation.apply(this, [KIND, docs, location]);
+  this.type = type;
+  this.left = left;
+  this.right = right;
+});
+
+module.exports = Bin;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_block.js.html b/ast_block.js.html new file mode 100644 index 000000000..9b9de17c2 --- /dev/null +++ b/ast_block.js.html @@ -0,0 +1,133 @@ + + + + + + + + + + + ast/block.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/block.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Statement = require("./statement");
+const KIND = "block";
+
+/**
+ * A block statement, i.e., a sequence of statements surrounded by braces.
+ * @constructor Block
+ * @extends {Statement}
+ * @property {Node[]} children
+ */
+const Block = Statement.extends(function Block(kind, children, docs, location) {
+  Statement.apply(this, [kind || KIND, docs, location]);
+  this.children = children.filter(Boolean);
+});
+
+module.exports = Block;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_boolean.js.html b/ast_boolean.js.html new file mode 100644 index 000000000..6f2d51882 --- /dev/null +++ b/ast_boolean.js.html @@ -0,0 +1,131 @@ + + + + + + + + + + + ast/boolean.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/boolean.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Literal = require("./literal");
+const KIND = "boolean";
+
+/**
+ * Defines a boolean value (true/false)
+ * @constructor Boolean
+ * @extends {Literal}
+ */
+const Boolean = Literal.extends(function Boolean(value, raw, docs, location) {
+  Literal.apply(this, [KIND, value, raw, docs, location]);
+});
+
+module.exports = Boolean;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_break.js.html b/ast_break.js.html new file mode 100644 index 000000000..5cf52d767 --- /dev/null +++ b/ast_break.js.html @@ -0,0 +1,133 @@ + + + + + + + + + + + ast/break.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/break.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Node = require("./node");
+const KIND = "break";
+
+/**
+ * A break statement
+ * @constructor Break
+ * @extends {Node}
+ * @property {Number|Null} level
+ */
+const Break = Node.extends(function Break(level, docs, location) {
+  Node.apply(this, [KIND, docs, location]);
+  this.level = level;
+});
+
+module.exports = Break;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_call.js.html b/ast_call.js.html new file mode 100644 index 000000000..bfc45f8c5 --- /dev/null +++ b/ast_call.js.html @@ -0,0 +1,135 @@ + + + + + + + + + + + ast/call.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/call.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Statement = require("./statement");
+const KIND = "call";
+
+/**
+ * Executes a call statement
+ * @constructor Call
+ * @extends {Statement}
+ * @property {Identifier|Variable|??} what
+ * @property {Arguments[]} arguments
+ */
+const Call = Statement.extends(function Call(what, args, docs, location) {
+  Statement.apply(this, [KIND, docs, location]);
+  this.what = what;
+  this.arguments = args;
+});
+
+module.exports = Call;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_case.js.html b/ast_case.js.html new file mode 100644 index 000000000..c796cbaf0 --- /dev/null +++ b/ast_case.js.html @@ -0,0 +1,135 @@ + + + + + + + + + + + ast/case.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/case.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Node = require("./node");
+const KIND = "case";
+
+/**
+ * A switch case statement
+ * @constructor Case
+ * @extends {Node}
+ * @property {Expression|null} test - if null, means that the default case
+ * @property {Block|null} body
+ */
+const Case = Node.extends(function Case(test, body, docs, location) {
+  Node.apply(this, [KIND, docs, location]);
+  this.test = test;
+  this.body = body;
+});
+
+module.exports = Case;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_cast.js.html b/ast_cast.js.html new file mode 100644 index 000000000..1a0528ff1 --- /dev/null +++ b/ast_cast.js.html @@ -0,0 +1,135 @@ + + + + + + + + + + + ast/cast.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/cast.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Operation = require("./operation");
+const KIND = "cast";
+
+/**
+ * Binary operations
+ * @constructor Cast
+ * @extends {Operation}
+ * @property {String} type
+ * @property {Expression} what
+ */
+const Cast = Operation.extends(function Cast(type, what, docs, location) {
+  Operation.apply(this, [KIND, docs, location]);
+  this.type = type;
+  this.what = what;
+});
+
+module.exports = Cast;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_catch.js.html b/ast_catch.js.html new file mode 100644 index 000000000..fe03ee827 --- /dev/null +++ b/ast_catch.js.html @@ -0,0 +1,144 @@ + + + + + + + + + + + ast/catch.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/catch.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Statement = require("./statement");
+const KIND = "catch";
+
+/**
+ * Defines a catch statement
+ * @constructor Catch
+ * @extends {Statement}
+ * @property {Identifier[]} what
+ * @property {Variable} variable
+ * @property {Statement} body
+ * @see http://php.net/manual/en/language.exceptions.php
+ */
+const Catch = Statement.extends(function Catch(
+  body,
+  what,
+  variable,
+  docs,
+  location
+) {
+  Statement.apply(this, [KIND, docs, location]);
+  this.body = body;
+  this.what = what;
+  this.variable = variable;
+});
+
+module.exports = Catch;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_class.js.html b/ast_class.js.html new file mode 100644 index 000000000..581b226f4 --- /dev/null +++ b/ast_class.js.html @@ -0,0 +1,150 @@ + + + + + + + + + + + ast/class.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/class.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Declaration = require("./declaration");
+const KIND = "class";
+
+/**
+ * A class definition
+ * @constructor Class
+ * @extends {Declaration}
+ * @property {Identifier|null} extends
+ * @property {Identifier[]} implements
+ * @property {Declaration[]} body
+ * @property {boolean} isAnonymous
+ * @property {boolean} isAbstract
+ * @property {boolean} isFinal
+ */
+const Class = Declaration.extends(function Class(
+  name,
+  ext,
+  impl,
+  body,
+  flags,
+  docs,
+  location
+) {
+  Declaration.apply(this, [KIND, name, docs, location]);
+  this.isAnonymous = name ? false : true;
+  this.extends = ext;
+  this.implements = impl;
+  this.body = body;
+  this.parseFlags(flags);
+});
+
+module.exports = Class;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_classconstant.js.html b/ast_classconstant.js.html new file mode 100644 index 000000000..7f76c9169 --- /dev/null +++ b/ast_classconstant.js.html @@ -0,0 +1,141 @@ + + + + + + + + + + + ast/classconstant.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/classconstant.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Constant = require("./constant");
+const KIND = "classconstant";
+
+/**
+ * Defines a class/interface/trait constant
+ * @constructor ClassConstant
+ * @extends {Constant}
+ * @property {boolean} isStatic
+ * @property {string} visibility
+ */
+const ClassConstant = Constant.extends(function ClassConstant(
+  name,
+  value,
+  flags,
+  docs,
+  location
+) {
+  Constant.apply(this, [name, value, docs, location]);
+  this.kind = KIND;
+  this.parseFlags(flags);
+});
+
+module.exports = ClassConstant;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_clone.js.html b/ast_clone.js.html new file mode 100644 index 000000000..9d01dbabc --- /dev/null +++ b/ast_clone.js.html @@ -0,0 +1,133 @@ + + + + + + + + + + + ast/clone.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/clone.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Statement = require("./statement");
+const KIND = "clone";
+
+/**
+ * Defines a clone call
+ * @constructor Clone
+ * @extends {Statement}
+ * @property {Expression} what
+ */
+const Clone = Statement.extends(function Clone(what, docs, location) {
+  Statement.apply(this, [KIND, docs, location]);
+  this.what = what;
+});
+
+module.exports = Clone;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_closure.js.html b/ast_closure.js.html new file mode 100644 index 000000000..abe842f16 --- /dev/null +++ b/ast_closure.js.html @@ -0,0 +1,154 @@ + + + + + + + + + + + ast/closure.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/closure.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Statement = require("./statement");
+const KIND = "closure";
+
+/**
+ * Defines a closure
+ * @constructor Closure
+ * @extends {Statement}
+ * @property {Parameter[]} arguments
+ * @property {Variable[]} uses
+ * @property {Identifier} type
+ * @property {boolean} byref
+ * @property {boolean} nullable
+ * @property {Block|null} body
+ * @property {boolean} isStatic
+ */
+const Closure = Statement.extends(function Closure(
+  args,
+  byref,
+  uses,
+  type,
+  nullable,
+  isStatic,
+  docs,
+  location
+) {
+  Statement.apply(this, [KIND, docs, location]);
+  this.uses = uses;
+  this.arguments = args;
+  this.byref = byref;
+  this.type = type;
+  this.nullable = nullable;
+  this.isStatic = isStatic || false;
+  this.body = null;
+});
+
+module.exports = Closure;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_comment.js.html b/ast_comment.js.html new file mode 100644 index 000000000..9ddc7cbe5 --- /dev/null +++ b/ast_comment.js.html @@ -0,0 +1,132 @@ + + + + + + + + + + + ast/comment.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/comment.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Node = require("./node");
+
+/**
+ * Abstract documentation node (ComentLine or CommentBlock)
+ * @constructor Comment
+ * @extends {Node}
+ * @property {String} value
+ */
+const Comment = Node.extends(function Comment(kind, value, docs, location) {
+  Node.apply(this, [kind, docs, location]);
+  this.value = value;
+});
+
+module.exports = Comment;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_commentblock.js.html b/ast_commentblock.js.html new file mode 100644 index 000000000..e6f52d302 --- /dev/null +++ b/ast_commentblock.js.html @@ -0,0 +1,135 @@ + + + + + + + + + + + ast/commentblock.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/commentblock.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Comment = require("./comment");
+const KIND = "commentblock";
+
+/**
+ * A comment block (multiline)
+ * @constructor CommentBlock
+ * @extends {Comment}
+ */
+const CommentBlock = Comment.extends(function CommentBlock(
+  value,
+  docs,
+  location
+) {
+  Comment.apply(this, [KIND, value, docs, location]);
+});
+
+module.exports = CommentBlock;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_commentline.js.html b/ast_commentline.js.html new file mode 100644 index 000000000..da09c3435 --- /dev/null +++ b/ast_commentline.js.html @@ -0,0 +1,135 @@ + + + + + + + + + + + ast/commentline.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/commentline.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Comment = require("./comment");
+const KIND = "commentline";
+
+/**
+ * A single line comment
+ * @constructor CommentLine
+ * @extends {Comment}
+ */
+const CommentLine = Comment.extends(function CommentLine(
+  value,
+  docs,
+  location
+) {
+  Comment.apply(this, [KIND, value, docs, location]);
+});
+
+module.exports = CommentLine;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_constant.js.html b/ast_constant.js.html new file mode 100644 index 000000000..867b618ae --- /dev/null +++ b/ast_constant.js.html @@ -0,0 +1,138 @@ + + + + + + + + + + + ast/constant.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/constant.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Declaration = require("./declaration");
+const KIND = "constant";
+
+/**
+ * Defines a namespace constant
+ * @constructor Constant
+ * @extends {Declaration}
+ * @property {Node|null} value
+ */
+const Constant = Declaration.extends(function Constant(
+  name,
+  value,
+  docs,
+  location
+) {
+  Declaration.apply(this, [KIND, name, docs, location]);
+  this.value = value;
+});
+
+module.exports = Constant;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_constref.js.html b/ast_constref.js.html new file mode 100644 index 000000000..5e37aba90 --- /dev/null +++ b/ast_constref.js.html @@ -0,0 +1,133 @@ + + + + + + + + + + + ast/constref.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/constref.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Expr = require("./expression");
+const KIND = "constref";
+
+/**
+ * A constant reference
+ * @constructor ConstRef
+ * @extends {Expression}
+ * @property {String|Node} name
+ */
+const ConstRef = Expr.extends(function ConstRef(identifier, docs, location) {
+  Expr.apply(this, [KIND, docs, location]);
+  this.name = identifier;
+});
+
+module.exports = ConstRef;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_continue.js.html b/ast_continue.js.html new file mode 100644 index 000000000..a8ff41d3b --- /dev/null +++ b/ast_continue.js.html @@ -0,0 +1,133 @@ + + + + + + + + + + + ast/continue.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/continue.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Node = require("./node");
+const KIND = "continue";
+
+/**
+ * A continue statement
+ * @constructor Continue
+ * @extends {Node}
+ * @property {Number|Null} level
+ */
+const Continue = Node.extends(function Continue(level, docs, location) {
+  Node.apply(this, [KIND, docs, location]);
+  this.level = level;
+});
+
+module.exports = Continue;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_declaration.js.html b/ast_declaration.js.html new file mode 100644 index 000000000..e74d8632b --- /dev/null +++ b/ast_declaration.js.html @@ -0,0 +1,165 @@ + + + + + + + + + + + ast/declaration.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/declaration.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Statement = require("./statement");
+const KIND = "declaration";
+
+const IS_UNDEFINED = "";
+const IS_PUBLIC = "public";
+const IS_PROTECTED = "protected";
+const IS_PRIVATE = "private";
+
+/**
+ * A declaration statement (function, class, interface...)
+ * @constructor Declaration
+ * @extends {Statement}
+ * @property {string} name
+ */
+const Declaration = Statement.extends(function Declaration(
+  kind,
+  name,
+  docs,
+  location
+) {
+  Statement.apply(this, [kind || KIND, docs, location]);
+  this.name = name;
+});
+
+/**
+ * Generic flags parser
+ * @param {Integer[]} flags
+ * @return {void}
+ */
+Declaration.prototype.parseFlags = function(flags) {
+  this.isAbstract = flags[2] === 1;
+  this.isFinal = flags[2] === 2;
+  if (this.kind !== "class") {
+    if (flags[0] === -1) {
+      this.visibility = IS_UNDEFINED;
+    } else if (flags[0] === 0) {
+      this.visibility = IS_PUBLIC;
+    } else if (flags[0] === 1) {
+      this.visibility = IS_PROTECTED;
+    } else if (flags[0] === 2) {
+      this.visibility = IS_PRIVATE;
+    }
+    this.isStatic = flags[1] === 1;
+  }
+};
+
+module.exports = Declaration;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_declare.js.html b/ast_declare.js.html new file mode 100644 index 000000000..d1bde1df4 --- /dev/null +++ b/ast_declare.js.html @@ -0,0 +1,181 @@ + + + + + + + + + + + ast/declare.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/declare.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Block = require("./block");
+const KIND = "declare";
+
+/**
+ * The declare construct is used to set execution directives for a block of code
+ * @constructor Declare
+ * @extends {Block}
+ * @property {Expression[]} what
+ * @property {String} mode
+ * @see http://php.net/manual/en/control-structures.declare.php
+ */
+const Declare = Block.extends(function Declare(
+  what,
+  body,
+  mode,
+  docs,
+  location
+) {
+  Block.apply(this, [KIND, body, docs, location]);
+  this.what = what;
+  this.mode = mode;
+});
+
+/**
+ * The node is declared as a short tag syntax :
+ * ```php
+ * <?php
+ * declare(ticks=1):
+ * // some statements
+ * enddeclare;
+ * ```
+ * @constant {String} MODE_SHORT
+ */
+Declare.MODE_SHORT = "short";
+
+/**
+ * The node is declared bracket enclosed code :
+ * ```php
+ * <?php
+ * declare(ticks=1) {
+ * // some statements
+ * }
+ * ```
+ * @constant {String} MODE_BLOCK
+ */
+Declare.MODE_BLOCK = "block";
+
+/**
+ * The node is declared as a simple statement. In order to make things simpler
+ * children of the node are automatically collected until the next
+ * declare statement.
+ * ```php
+ * <?php
+ * declare(ticks=1);
+ * // some statements
+ * declare(ticks=2);
+ * // some statements
+ * ```
+ * @constant {String} MODE_NONE
+ */
+Declare.MODE_NONE = "none";
+
+module.exports = Declare;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_do.js.html b/ast_do.js.html new file mode 100644 index 000000000..ff4b9b2b4 --- /dev/null +++ b/ast_do.js.html @@ -0,0 +1,135 @@ + + + + + + + + + + + ast/do.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/do.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Statement = require("./statement");
+const KIND = "do";
+
+/**
+ * Defines a do/while statement
+ * @constructor Do
+ * @extends {Statement}
+ * @property {Expression} test
+ * @property {Statement} body
+ */
+const Do = Statement.extends(function Do(test, body, docs, location) {
+  Statement.apply(this, [KIND, docs, location]);
+  this.test = test;
+  this.body = body;
+});
+
+module.exports = Do;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_echo.js.html b/ast_echo.js.html new file mode 100644 index 000000000..5d7791356 --- /dev/null +++ b/ast_echo.js.html @@ -0,0 +1,133 @@ + + + + + + + + + + + ast/echo.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/echo.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Sys = require("./sys");
+const KIND = "echo";
+
+/**
+ * Defines system based call
+ * @constructor Echo
+ * @property {boolean} shortForm
+ * @extends {Sys}
+ */
+const Echo = Sys.extends(function Echo(args, shortForm, docs, location) {
+  Sys.apply(this, [KIND, args, docs, location]);
+  this.shortForm = shortForm;
+});
+
+module.exports = Echo;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_empty.js.html b/ast_empty.js.html new file mode 100644 index 000000000..72f355225 --- /dev/null +++ b/ast_empty.js.html @@ -0,0 +1,131 @@ + + + + + + + + + + + ast/empty.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/empty.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Sys = require("./sys");
+const KIND = "empty";
+
+/**
+ * Defines an empty check call
+ * @constructor Empty
+ * @extends {Sys}
+ */
+const Empty = Sys.extends(function Empty(args, docs, location) {
+  Sys.apply(this, [KIND, args, docs, location]);
+});
+
+module.exports = Empty;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_encapsed.js.html b/ast_encapsed.js.html new file mode 100644 index 000000000..f029f3501 --- /dev/null +++ b/ast_encapsed.js.html @@ -0,0 +1,183 @@ + + + + + + + + + + + ast/encapsed.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/encapsed.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Literal = require("./literal");
+const KIND = "encapsed";
+
+/**
+ * Defines an encapsed string (contains expressions)
+ * @constructor Encapsed
+ * @extends {Literal}
+ * @property {String} type - Defines the type of encapsed string (shell, heredoc, string)
+ * @property {String|Null} label - The heredoc label, defined only when the type is heredoc
+ */
+const Encapsed = Literal.extends(function Encapsed(
+  value,
+  raw,
+  type,
+  docs,
+  location
+) {
+  Literal.apply(this, [KIND, value, raw, docs, location]);
+  this.type = type;
+});
+
+/**
+ * The node is a double quote string :
+ * ```php
+ * <?php
+ * echo "hello $world";
+ * ```
+ * @constant {String} TYPE_STRING - `string`
+ */
+Encapsed.TYPE_STRING = "string";
+
+/**
+ * The node is a shell execute string :
+ * ```php
+ * <?php
+ * echo `ls -larth $path`;
+ * ```
+ * @constant {String} TYPE_SHELL - `shell`
+ */
+Encapsed.TYPE_SHELL = "shell";
+
+/**
+ * The node is a shell execute string :
+ * ```php
+ * <?php
+ * echo <<<STR
+ *  Hello $world
+ * STR
+ * ;
+ * ```
+ * @constant {String} TYPE_HEREDOC - `heredoc`
+ */
+Encapsed.TYPE_HEREDOC = "heredoc";
+
+/**
+ * The node contains a list of constref / variables / expr :
+ * ```php
+ * <?php
+ * echo $foo->bar_$baz;
+ * ```
+ * @constant {String} TYPE_OFFSET - `offset`
+ */
+Encapsed.TYPE_OFFSET = "offset";
+
+module.exports = Encapsed;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_entry.js.html b/ast_entry.js.html new file mode 100644 index 000000000..362959911 --- /dev/null +++ b/ast_entry.js.html @@ -0,0 +1,135 @@ + + + + + + + + + + + ast/entry.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/entry.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Node = require("./node");
+const KIND = "entry";
+
+/**
+ * An array entry - see [Array](#array)
+ * @constructor Entry
+ * @extends {Node}
+ * @property {Node|null} key The entry key/offset
+ * @property {Node} value The entry value
+ */
+const Entry = Node.extends(function Entry(key, value, docs, location) {
+  Node.apply(this, [KIND, docs, location]);
+  this.key = key;
+  this.value = value;
+});
+
+module.exports = Entry;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_error.js.html b/ast_error.js.html new file mode 100644 index 000000000..090f8d5d4 --- /dev/null +++ b/ast_error.js.html @@ -0,0 +1,146 @@ + + + + + + + + + + + ast/error.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/error.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Node = require("./node");
+const KIND = "error";
+
+/**
+ * Defines an error node (used only on silentMode)
+ * @constructor Error
+ * @extends {Node}
+ * @property {string} message
+ * @property {number} line
+ * @property {number|string} token
+ * @property {string|array} expected
+ */
+const Error = Node.extends(function Error(
+  message,
+  token,
+  line,
+  expected,
+  docs,
+  location
+) {
+  Node.apply(this, [KIND, docs, location]);
+  this.message = message;
+  this.token = token;
+  this.line = line;
+  this.expected = expected;
+});
+
+module.exports = Error;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_eval.js.html b/ast_eval.js.html new file mode 100644 index 000000000..8bdaec49c --- /dev/null +++ b/ast_eval.js.html @@ -0,0 +1,133 @@ + + + + + + + + + + + ast/eval.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/eval.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Statement = require("./statement");
+const KIND = "eval";
+
+/**
+ * Defines an eval statement
+ * @constructor Eval
+ * @extends {Statement}
+ * @property {Node} source
+ */
+const Eval = Statement.extends(function Eval(source, docs, location) {
+  Statement.apply(this, [KIND, docs, location]);
+  this.source = source;
+});
+
+module.exports = Eval;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_exit.js.html b/ast_exit.js.html new file mode 100644 index 000000000..f0a62f04a --- /dev/null +++ b/ast_exit.js.html @@ -0,0 +1,135 @@ + + + + + + + + + + + ast/exit.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/exit.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Statement = require("./statement");
+const KIND = "exit";
+
+/**
+ * Defines an exit / die call
+ * @constructor Exit
+ * @extends {Statement}
+ * @property {Node|null} status
+ * @property {Boolean} useDie
+ */
+const Exit = Statement.extends(function Exit(status, useDie, docs, location) {
+  Statement.apply(this, [KIND, docs, location]);
+  this.status = status;
+  this.useDie = useDie;
+});
+
+module.exports = Exit;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_expression.js.html b/ast_expression.js.html new file mode 100644 index 000000000..40509fce5 --- /dev/null +++ b/ast_expression.js.html @@ -0,0 +1,132 @@ + + + + + + + + + + + ast/expression.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/expression.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Node = require("./node");
+const KIND = "expression";
+
+/**
+ * Any expression node. Since the left-hand side of an assignment may
+ * be any expression in general, an expression can also be a pattern.
+ * @constructor Expression
+ * @extends {Node}
+ */
+const Expression = Node.extends(function Expression(kind, docs, location) {
+  Node.apply(this, [kind || KIND, docs, location]);
+});
+
+module.exports = Expression;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_for.js.html b/ast_for.js.html new file mode 100644 index 000000000..b8a2a8fc3 --- /dev/null +++ b/ast_for.js.html @@ -0,0 +1,150 @@ + + + + + + + + + + + ast/for.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/for.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Statement = require("./statement");
+const KIND = "for";
+
+/**
+ * Defines a for iterator
+ * @constructor For
+ * @extends {Statement}
+ * @property {Expression[]} init
+ * @property {Expression[]} test
+ * @property {Expression[]} increment
+ * @property {Statement} body
+ * @property {boolean} shortForm
+ * @see http://php.net/manual/en/control-structures.for.php
+ */
+const For = Statement.extends(function For(
+  init,
+  test,
+  increment,
+  body,
+  shortForm,
+  docs,
+  location
+) {
+  Statement.apply(this, [KIND, docs, location]);
+  this.init = init;
+  this.test = test;
+  this.increment = increment;
+  this.shortForm = shortForm;
+  this.body = body;
+});
+
+module.exports = For;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_foreach.js.html b/ast_foreach.js.html new file mode 100644 index 000000000..818c95259 --- /dev/null +++ b/ast_foreach.js.html @@ -0,0 +1,150 @@ + + + + + + + + + + + ast/foreach.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/foreach.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Statement = require("./statement");
+const KIND = "foreach";
+
+/**
+ * Defines a foreach iterator
+ * @constructor Foreach
+ * @extends {Statement}
+ * @property {Expression} source
+ * @property {Expression|null} key
+ * @property {Expression} value
+ * @property {Statement} body
+ * @property {boolean} shortForm
+ * @see http://php.net/manual/en/control-structures.foreach.php
+ */
+const Foreach = Statement.extends(function Foreach(
+  source,
+  key,
+  value,
+  body,
+  shortForm,
+  docs,
+  location
+) {
+  Statement.apply(this, [KIND, docs, location]);
+  this.source = source;
+  this.key = key;
+  this.value = value;
+  this.shortForm = shortForm;
+  this.body = body;
+});
+
+module.exports = Foreach;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_function.js.html b/ast_function.js.html new file mode 100644 index 000000000..d00495e51 --- /dev/null +++ b/ast_function.js.html @@ -0,0 +1,148 @@ + + + + + + + + + + + ast/function.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/function.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Declaration = require("./declaration");
+const KIND = "function";
+
+/**
+ * Defines a classic function
+ * @constructor Function
+ * @extends {Declaration}
+ * @property {Parameter[]} arguments
+ * @property {Identifier} type
+ * @property {boolean} byref
+ * @property {boolean} nullable
+ * @property {Block|null} body
+ */
+const fn = Declaration.extends(function _Function(
+  name,
+  args,
+  byref,
+  type,
+  nullable,
+  docs,
+  location
+) {
+  Declaration.apply(this, [KIND, name, docs, location]);
+  this.arguments = args;
+  this.byref = byref;
+  this.type = type;
+  this.nullable = nullable;
+  this.body = null;
+});
+module.exports = fn;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_global.js.html b/ast_global.js.html new file mode 100644 index 000000000..8d5625ccd --- /dev/null +++ b/ast_global.js.html @@ -0,0 +1,133 @@ + + + + + + + + + + + ast/global.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/global.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Statement = require("./statement");
+const KIND = "global";
+
+/**
+ * Imports a variable from the global scope
+ * @constructor Global
+ * @extends {Statement}
+ * @property {Variable[]} items
+ */
+const Global = Statement.extends(function Global(items, docs, location) {
+  Statement.apply(this, [KIND, docs, location]);
+  this.items = items;
+});
+
+module.exports = Global;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_goto.js.html b/ast_goto.js.html new file mode 100644 index 000000000..cee260f32 --- /dev/null +++ b/ast_goto.js.html @@ -0,0 +1,134 @@ + + + + + + + + + + + ast/goto.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/goto.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Statement = require("./statement");
+const KIND = "goto";
+
+/**
+ * Defines goto statement
+ * @constructor Goto
+ * @extends {Statement}
+ * @property {String} label
+ * @see {Label}
+ */
+const Goto = Statement.extends(function Goto(label, docs, location) {
+  Statement.apply(this, [KIND, docs, location]);
+  this.label = label;
+});
+
+module.exports = Goto;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_halt.js.html b/ast_halt.js.html new file mode 100644 index 000000000..a91f743b6 --- /dev/null +++ b/ast_halt.js.html @@ -0,0 +1,134 @@ + + + + + + + + + + + ast/halt.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/halt.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Statement = require("./statement");
+const KIND = "halt";
+
+/**
+ * Halts the compiler execution
+ * @constructor Halt
+ * @extends {Statement}
+ * @property {String} after - String after the halt statement
+ * @see http://php.net/manual/en/function.halt-compiler.php
+ */
+const Halt = Statement.extends(function Halt(after, docs, location) {
+  Statement.apply(this, [KIND, docs, location]);
+  this.after = after;
+});
+
+module.exports = Halt;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_identifier.js.html b/ast_identifier.js.html new file mode 100644 index 000000000..967817256 --- /dev/null +++ b/ast_identifier.js.html @@ -0,0 +1,171 @@ + + + + + + + + + + + ast/identifier.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/identifier.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Node = require("./node");
+const KIND = "identifier";
+
+/**
+ * Defines an identifier node
+ * @constructor Identifier
+ * @extends {Node}
+ * @property {string} name
+ * @property {string} resolution
+ */
+const Identifier = Node.extends(function Identifier(
+  name,
+  isRelative,
+  docs,
+  location
+) {
+  Node.apply(this, [KIND, docs, location]);
+  if (isRelative) {
+    this.resolution = Identifier.RELATIVE_NAME;
+  } else if (name.length === 1) {
+    this.resolution = Identifier.UNQUALIFIED_NAME;
+  } else if (name[0] === "") {
+    this.resolution = Identifier.FULL_QUALIFIED_NAME;
+  } else {
+    this.resolution = Identifier.QUALIFIED_NAME;
+  }
+  this.name = name.join("\\");
+});
+
+/**
+ * This is an identifier without a namespace separator, such as Foo
+ * @constant {String} UNQUALIFIED_NAME
+ */
+Identifier.UNQUALIFIED_NAME = "uqn";
+/**
+ * This is an identifier with a namespace separator, such as Foo\Bar
+ * @constant {String} QUALIFIED_NAME
+ */
+Identifier.QUALIFIED_NAME = "qn";
+/**
+ * This is an identifier with a namespace separator that begins with
+ * a namespace separator, such as \Foo\Bar. The namespace \Foo is also
+ * a fully qualified name.
+ * @constant {String} FULL_QUALIFIED_NAME
+ */
+Identifier.FULL_QUALIFIED_NAME = "fqn";
+/**
+ * This is an identifier starting with namespace, such as namespace\Foo\Bar.
+ * @constant {String} RELATIVE_NAME
+ */
+Identifier.RELATIVE_NAME = "rn";
+
+module.exports = Identifier;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_if.js.html b/ast_if.js.html new file mode 100644 index 000000000..ada975717 --- /dev/null +++ b/ast_if.js.html @@ -0,0 +1,146 @@ + + + + + + + + + + + ast/if.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/if.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Statement = require("./statement");
+const KIND = "if";
+
+/**
+ * Defines a if statement
+ * @constructor If
+ * @extends {Statement}
+ * @property {Expression} test
+ * @property {Block} body
+ * @property {Block|If|null} alternate
+ * @property {boolean} shortForm
+ */
+const If = Statement.extends(function If(
+  test,
+  body,
+  alternate,
+  shortForm,
+  docs,
+  location
+) {
+  Statement.apply(this, [KIND, docs, location]);
+  this.test = test;
+  this.body = body;
+  this.alternate = alternate;
+  this.shortForm = shortForm;
+});
+
+module.exports = If;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_include.js.html b/ast_include.js.html new file mode 100644 index 000000000..e1b374d3c --- /dev/null +++ b/ast_include.js.html @@ -0,0 +1,143 @@ + + + + + + + + + + + ast/include.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/include.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Statement = require("./statement");
+const KIND = "include";
+
+/**
+ * Defines system include call
+ * @constructor Include
+ * @extends {Statement}
+ * @property {Node} target
+ * @property {boolean} once
+ * @property {boolean} require
+ */
+const Include = Statement.extends(function Include(
+  once,
+  require,
+  target,
+  docs,
+  location
+) {
+  Statement.apply(this, [KIND, docs, location]);
+  this.once = once;
+  this.require = require;
+  this.target = target;
+});
+
+module.exports = Include;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_inline.js.html b/ast_inline.js.html new file mode 100644 index 000000000..39b5b9cd8 --- /dev/null +++ b/ast_inline.js.html @@ -0,0 +1,131 @@ + + + + + + + + + + + ast/inline.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/inline.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Literal = require("./literal");
+const KIND = "inline";
+
+/**
+ * Defines inline html output (treated as echo output)
+ * @constructor Inline
+ * @extends {Literal}
+ */
+const Inline = Literal.extends(function Inline(value, raw, docs, location) {
+  Literal.apply(this, [KIND, value, raw, docs, location]);
+});
+
+module.exports = Inline;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_interface.js.html b/ast_interface.js.html new file mode 100644 index 000000000..7b369cc51 --- /dev/null +++ b/ast_interface.js.html @@ -0,0 +1,141 @@ + + + + + + + + + + + ast/interface.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/interface.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Declaration = require("./declaration");
+const KIND = "interface";
+
+/**
+ * An interface definition
+ * @constructor Interface
+ * @extends {Declaration}
+ * @property {Identifier[]} extends
+ * @property {Declaration[]} body
+ */
+const Interface = Declaration.extends(function Interface(
+  name,
+  ext,
+  body,
+  docs,
+  location
+) {
+  Declaration.apply(this, [KIND, name, docs, location]);
+  this.extends = ext;
+  this.body = body;
+});
+
+module.exports = Interface;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_isset.js.html b/ast_isset.js.html new file mode 100644 index 000000000..c7a3207d7 --- /dev/null +++ b/ast_isset.js.html @@ -0,0 +1,131 @@ + + + + + + + + + + + ast/isset.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/isset.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Sys = require("./sys");
+const KIND = "isset";
+
+/**
+ * Defines an isset call
+ * @constructor Isset
+ * @extends {Sys}
+ */
+const Isset = Sys.extends(function Isset(args, docs, location) {
+  Sys.apply(this, [KIND, args, docs, location]);
+});
+
+module.exports = Isset;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_label.js.html b/ast_label.js.html new file mode 100644 index 000000000..fe624b029 --- /dev/null +++ b/ast_label.js.html @@ -0,0 +1,133 @@ + + + + + + + + + + + ast/label.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/label.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Node = require("./node");
+const KIND = "label";
+
+/**
+ * A label statement (referenced by goto)
+ * @constructor Label
+ * @extends {Node}
+ * @property {String} name
+ */
+const Label = Node.extends(function Label(name, docs, location) {
+  Node.apply(this, [KIND, docs, location]);
+  this.name = name;
+});
+
+module.exports = Label;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_list.js.html b/ast_list.js.html new file mode 100644 index 000000000..d198a775d --- /dev/null +++ b/ast_list.js.html @@ -0,0 +1,133 @@ + + + + + + + + + + + ast/list.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/list.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Sys = require("./sys");
+const KIND = "list";
+
+/**
+ * Defines list assignment
+ * @constructor List
+ * @extends {Sys}
+ * @property {boolean} shortForm
+ */
+const List = Sys.extends(function List(items, shortForm, docs, location) {
+  Sys.apply(this, [KIND, items, docs, location]);
+  this.shortForm = shortForm;
+});
+
+module.exports = List;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_literal.js.html b/ast_literal.js.html new file mode 100644 index 000000000..9d9fa3951 --- /dev/null +++ b/ast_literal.js.html @@ -0,0 +1,143 @@ + + + + + + + + + + + ast/literal.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/literal.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Expr = require("./expression");
+const KIND = "literal";
+
+/**
+ * Defines an array structure
+ * @constructor Literal
+ * @extends {Expression}
+ * @property {string} raw
+ * @property {Node|string|number|boolean|null} value
+ */
+const Literal = Expr.extends(function Literal(
+  kind,
+  value,
+  raw,
+  docs,
+  location
+) {
+  Expr.apply(this, [kind || KIND, docs, location]);
+  this.value = value;
+  if (raw) {
+    this.raw = raw;
+  }
+});
+
+module.exports = Literal;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_location.js.html b/ast_location.js.html new file mode 100644 index 000000000..eb1fe13f6 --- /dev/null +++ b/ast_location.js.html @@ -0,0 +1,132 @@ + + + + + + + + + + + ast/location.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/location.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+/**
+ * Defines the location of the node (with it's source contents as string)
+ * @constructor Location
+ * @property {String|null} source
+ * @property {Position} start
+ * @property {Position} end
+ */
+const Location = function(source, start, end) {
+  this.source = source;
+  this.start = start;
+  this.end = end;
+};
+
+module.exports = Location;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_lookup.js.html b/ast_lookup.js.html new file mode 100644 index 000000000..1a9593092 --- /dev/null +++ b/ast_lookup.js.html @@ -0,0 +1,141 @@ + + + + + + + + + + + ast/lookup.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/lookup.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Expr = require("./expression");
+const KIND = "lookup";
+
+/**
+ * Lookup on an offset in the specified object
+ * @constructor Lookup
+ * @extends {Expression}
+ * @property {Expression} what
+ * @property {Expression} offset
+ */
+const Lookup = Expr.extends(function Lookup(
+  kind,
+  what,
+  offset,
+  docs,
+  location
+) {
+  Expr.apply(this, [kind || KIND, docs, location]);
+  this.what = what;
+  this.offset = offset;
+});
+
+module.exports = Lookup;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_magic.js.html b/ast_magic.js.html new file mode 100644 index 000000000..5a5283b7f --- /dev/null +++ b/ast_magic.js.html @@ -0,0 +1,131 @@ + + + + + + + + + + + ast/magic.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/magic.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Literal = require("./literal");
+const KIND = "magic";
+
+/**
+ * Defines magic constant
+ * @constructor Magic
+ * @extends {Literal}
+ */
+const Magic = Literal.extends(function Magic(value, raw, docs, location) {
+  Literal.apply(this, [KIND, value, raw, docs, location]);
+});
+
+module.exports = Magic;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_method.js.html b/ast_method.js.html new file mode 100644 index 000000000..42c88086f --- /dev/null +++ b/ast_method.js.html @@ -0,0 +1,136 @@ + + + + + + + + + + + ast/method.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/method.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const fn = require("./function");
+const KIND = "method";
+
+/**
+ * Defines a class/interface/trait method
+ * @constructor Method
+ * @extends {Function}
+ * @property {boolean} isAbstract
+ * @property {boolean} isFinal
+ * @property {boolean} isStatic
+ * @property {string} visibility
+ */
+const Method = fn.extends(function Method() {
+  fn.apply(this, arguments);
+  this.kind = KIND;
+});
+
+module.exports = Method;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_namespace.js.html b/ast_namespace.js.html new file mode 100644 index 000000000..9d05cee9a --- /dev/null +++ b/ast_namespace.js.html @@ -0,0 +1,141 @@ + + + + + + + + + + + ast/namespace.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/namespace.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Block = require("./block");
+const KIND = "namespace";
+
+/**
+ * The main program node
+ * @constructor Namespace
+ * @extends {Block}
+ * @property {String} name
+ * @property {Boolean} withBrackets
+ */
+const Namespace = Block.extends(function Namespace(
+  name,
+  children,
+  withBrackets,
+  docs,
+  location
+) {
+  Block.apply(this, [KIND, children, docs, location]);
+  this.name = name;
+  this.withBrackets = withBrackets || false;
+});
+
+module.exports = Namespace;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_new.js.html b/ast_new.js.html new file mode 100644 index 000000000..a0bc9ba04 --- /dev/null +++ b/ast_new.js.html @@ -0,0 +1,135 @@ + + + + + + + + + + + ast/new.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/new.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Statement = require("./statement");
+const KIND = "new";
+
+/**
+ * Creates a new instance of the specified class
+ * @constructor New
+ * @extends {Statement}
+ * @property {Identifier|Variable|Class} what
+ * @property {Arguments[]} arguments
+ */
+const New = Statement.extends(function New(what, args, docs, location) {
+  Statement.apply(this, [KIND, docs, location]);
+  this.what = what;
+  this.arguments = args;
+});
+
+module.exports = New;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_node.js.html b/ast_node.js.html new file mode 100644 index 000000000..7fbe4a489 --- /dev/null +++ b/ast_node.js.html @@ -0,0 +1,170 @@ + + + + + + + + + + + ast/node.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/node.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+/**
+ * A generic AST node
+ * @constructor Node
+ * @property {Location|null} loc
+ * @property {Comment[]} leadingComments
+ * @property {Comment[]?} trailingComments
+ * @property {String} kind
+ */
+const Node = function Node(kind, docs, location) {
+  this.kind = kind;
+  if (docs) {
+    this.leadingComments = docs;
+  }
+  if (location) {
+    this.loc = location;
+  }
+};
+
+/**
+ * Includes current token position of the parser
+ * @param {*} parser
+ */
+Node.prototype.includeToken = function(parser) {
+  if (this.loc) {
+    if (this.loc.end) {
+      this.loc.end.line = parser.lexer.yylloc.last_line;
+      this.loc.end.column = parser.lexer.yylloc.last_column;
+      this.loc.end.offset = parser.lexer.offset;
+    }
+    if (parser.ast.withSource) {
+      this.loc.source = parser.lexer._input.substring(
+        this.loc.start.offset,
+        parser.lexer.offset
+      );
+    }
+  }
+  return this;
+};
+
+/**
+ * Helper for extending the Node class
+ * @param {Function} constructor
+ * @return {Function}
+ */
+Node.extends = function(constructor) {
+  constructor.prototype = Object.create(this.prototype);
+  constructor.extends = this.extends;
+  constructor.prototype.constructor = constructor;
+  return constructor;
+};
+
+module.exports = Node;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_nowdoc.js.html b/ast_nowdoc.js.html new file mode 100644 index 000000000..8e4db9d02 --- /dev/null +++ b/ast_nowdoc.js.html @@ -0,0 +1,143 @@ + + + + + + + + + + + ast/nowdoc.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/nowdoc.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Literal = require("./literal");
+const KIND = "nowdoc";
+
+/**
+ * Defines a nowdoc string
+ * @constructor String
+ * @extends {Literal}
+ * @property {String} label
+ * @property {String} raw
+ * @property {Boolean} quote
+ */
+const Nowdoc = Literal.extends(function Nowdoc(
+  value,
+  raw,
+  label,
+  quote,
+  docs,
+  location
+) {
+  Literal.apply(this, [KIND, value, raw, docs, location]);
+  this.label = label;
+  this.quote = quote;
+});
+
+module.exports = Nowdoc;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_number.js.html b/ast_number.js.html new file mode 100644 index 000000000..0e6b6cbd2 --- /dev/null +++ b/ast_number.js.html @@ -0,0 +1,131 @@ + + + + + + + + + + + ast/number.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/number.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Literal = require("./literal");
+const KIND = "number";
+
+/**
+ * Defines a numeric value
+ * @constructor Number
+ * @extends {Literal}
+ */
+const _Number = Literal.extends(function Number(value, raw, docs, location) {
+  Literal.apply(this, [KIND, value, raw, docs, location]);
+});
+
+module.exports = _Number;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_offsetlookup.js.html b/ast_offsetlookup.js.html new file mode 100644 index 000000000..3e78e62a0 --- /dev/null +++ b/ast_offsetlookup.js.html @@ -0,0 +1,136 @@ + + + + + + + + + + + ast/offsetlookup.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/offsetlookup.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Lookup = require("./lookup");
+const KIND = "offsetlookup";
+
+/**
+ * Lookup on an offset in an array
+ * @constructor OffsetLookup
+ * @extends {Lookup}
+ */
+const OffsetLookup = Lookup.extends(function OffsetLookup(
+  what,
+  offset,
+  docs,
+  location
+) {
+  Lookup.apply(this, [KIND, what, offset, docs, location]);
+});
+
+module.exports = OffsetLookup;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_operation.js.html b/ast_operation.js.html new file mode 100644 index 000000000..4fdbff4f6 --- /dev/null +++ b/ast_operation.js.html @@ -0,0 +1,131 @@ + + + + + + + + + + + ast/operation.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/operation.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Expr = require("./expression");
+const KIND = "operation";
+
+/**
+ * Defines binary operations
+ * @constructor Operation
+ * @extends {Expression}
+ */
+const Operation = Expr.extends(function Operation(kind, docs, location) {
+  Expr.apply(this, [kind || KIND, docs, location]);
+});
+
+module.exports = Operation;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_parameter.js.html b/ast_parameter.js.html new file mode 100644 index 000000000..2a9b9550d --- /dev/null +++ b/ast_parameter.js.html @@ -0,0 +1,150 @@ + + + + + + + + + + + ast/parameter.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/parameter.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Declaration = require("./declaration");
+const KIND = "parameter";
+
+/**
+ * Defines a function parameter
+ * @constructor Parameter
+ * @extends {Declaration}
+ * @property {Identifier|null} type
+ * @property {Node|null} value
+ * @property {boolean} byref
+ * @property {boolean} variadic
+ * @property {boolean} nullable
+ */
+const Parameter = Declaration.extends(function Parameter(
+  name,
+  type,
+  value,
+  isRef,
+  isVariadic,
+  nullable,
+  docs,
+  location
+) {
+  Declaration.apply(this, [KIND, name, docs, location]);
+  this.value = value;
+  this.type = type;
+  this.byref = isRef;
+  this.variadic = isVariadic;
+  this.nullable = nullable;
+});
+
+module.exports = Parameter;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_parenthesis.js.html b/ast_parenthesis.js.html new file mode 100644 index 000000000..a4d841ddf --- /dev/null +++ b/ast_parenthesis.js.html @@ -0,0 +1,137 @@ + + + + + + + + + + + ast/parenthesis.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/parenthesis.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Operation = require("./operation");
+const KIND = "parenthesis";
+
+/**
+ * Parenthesis encapsulation `(... expr ...)`
+ * @constructor Parenthesis
+ * @extends {Operation}
+ * @property {Expression} inner
+ */
+const Parenthesis = Operation.extends(function Parenthesis(
+  inner,
+  docs,
+  location
+) {
+  Operation.apply(this, [KIND, docs, location]);
+  this.inner = inner;
+});
+
+module.exports = Parenthesis;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_position.js.html b/ast_position.js.html new file mode 100644 index 000000000..4585eece5 --- /dev/null +++ b/ast_position.js.html @@ -0,0 +1,132 @@ + + + + + + + + + + + ast/position.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/position.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+/**
+ * Each Position object consists of a line number (1-indexed) and a column number (0-indexed):
+ * @constructor Position
+ * @property {Number} line
+ * @property {Number} column
+ * @property {Number} offset
+ */
+const Position = function(line, column, offset) {
+  this.line = line;
+  this.column = column;
+  this.offset = offset;
+};
+
+module.exports = Position;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_post.js.html b/ast_post.js.html new file mode 100644 index 000000000..2409c6cb4 --- /dev/null +++ b/ast_post.js.html @@ -0,0 +1,135 @@ + + + + + + + + + + + ast/post.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/post.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Operation = require("./operation");
+const KIND = "post";
+
+/**
+ * Defines a post operation `$i++` or `$i--`
+ * @constructor Post
+ * @extends {Operation}
+ * @property {String} type
+ * @property {Variable} what
+ */
+const Post = Operation.extends(function Post(type, what, docs, location) {
+  Operation.apply(this, [KIND, docs, location]);
+  this.type = type;
+  this.what = what;
+});
+
+module.exports = Post;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_pre.js.html b/ast_pre.js.html new file mode 100644 index 000000000..b3292fba9 --- /dev/null +++ b/ast_pre.js.html @@ -0,0 +1,135 @@ + + + + + + + + + + + ast/pre.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/pre.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Operation = require("./operation");
+const KIND = "pre";
+
+/**
+ * Defines a pre operation `++$i` or `--$i`
+ * @constructor Pre
+ * @extends {Operation}
+ * @property {String} type
+ * @property {Variable} what
+ */
+const Pre = Operation.extends(function Pre(type, what, docs, location) {
+  Operation.apply(this, [KIND, docs, location]);
+  this.type = type;
+  this.what = what;
+});
+
+module.exports = Pre;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_print.js.html b/ast_print.js.html new file mode 100644 index 000000000..982e68fb9 --- /dev/null +++ b/ast_print.js.html @@ -0,0 +1,131 @@ + + + + + + + + + + + ast/print.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/print.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Sys = require("./sys");
+const KIND = "print";
+
+/**
+ * Outputs
+ * @constructor Print
+ * @extends {Sys}
+ */
+const Print = Sys.extends(function Print(args, docs, location) {
+  Sys.apply(this, [KIND, args, docs, location]);
+});
+
+module.exports = Print;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_program.js.html b/ast_program.js.html new file mode 100644 index 000000000..ef622eb10 --- /dev/null +++ b/ast_program.js.html @@ -0,0 +1,148 @@ + + + + + + + + + + + ast/program.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/program.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Block = require("./block");
+const KIND = "program";
+
+/**
+ * The main program node
+ * @constructor Program
+ * @extends {Block}
+ * @property {Error[]} errors
+ * @property {Doc[]?} comments
+ * @property {String[]?} tokens
+ */
+const Program = Block.extends(function Program(
+  children,
+  errors,
+  comments,
+  tokens,
+  docs,
+  location
+) {
+  Block.apply(this, [KIND, children, docs, location]);
+  this.errors = errors;
+  if (comments) {
+    this.comments = comments;
+  }
+  if (tokens) {
+    this.tokens = tokens;
+  }
+});
+
+module.exports = Program;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_property.js.html b/ast_property.js.html new file mode 100644 index 000000000..d97296c69 --- /dev/null +++ b/ast_property.js.html @@ -0,0 +1,143 @@ + + + + + + + + + + + ast/property.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/property.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Declaration = require("./declaration");
+const KIND = "property";
+
+/**
+ * Defines a class property
+ * @constructor Property
+ * @extends {Declaration}
+ * @property {boolean} isFinal
+ * @property {boolean} isStatic
+ * @property {string} visibility
+ * @property {Node|null} value
+ */
+const Property = Declaration.extends(function Property(
+  name,
+  value,
+  flags,
+  docs,
+  location
+) {
+  Declaration.apply(this, [KIND, name, docs, location]);
+  this.value = value;
+  this.parseFlags(flags);
+});
+
+module.exports = Property;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_propertylookup.js.html b/ast_propertylookup.js.html new file mode 100644 index 000000000..6a356b610 --- /dev/null +++ b/ast_propertylookup.js.html @@ -0,0 +1,136 @@ + + + + + + + + + + + ast/propertylookup.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/propertylookup.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Lookup = require("./lookup");
+const KIND = "propertylookup";
+
+/**
+ * Lookup to an object property
+ * @constructor PropertyLookup
+ * @extends {Lookup}
+ */
+const PropertyLookup = Lookup.extends(function PropertyLookup(
+  what,
+  offset,
+  docs,
+  location
+) {
+  Lookup.apply(this, [KIND, what, offset, docs, location]);
+});
+
+module.exports = PropertyLookup;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_retif.js.html b/ast_retif.js.html new file mode 100644 index 000000000..c45980330 --- /dev/null +++ b/ast_retif.js.html @@ -0,0 +1,143 @@ + + + + + + + + + + + ast/retif.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/retif.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Statement = require("./statement");
+const KIND = "retif";
+
+/**
+ * Defines a short if statement that returns a value
+ * @constructor RetIf
+ * @extends {Statement}
+ * @property {Expression} test
+ * @property {Expression} trueExpr
+ * @property {Expression} falseExpr
+ */
+const RetIf = Statement.extends(function RetIf(
+  test,
+  trueExpr,
+  falseExpr,
+  docs,
+  location
+) {
+  Statement.apply(this, [KIND, docs, location]);
+  this.test = test;
+  this.trueExpr = trueExpr;
+  this.falseExpr = falseExpr;
+});
+
+module.exports = RetIf;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_return.js.html b/ast_return.js.html new file mode 100644 index 000000000..e24ae8fe2 --- /dev/null +++ b/ast_return.js.html @@ -0,0 +1,133 @@ + + + + + + + + + + + ast/return.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/return.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Node = require("./node");
+const KIND = "return";
+
+/**
+ * A continue statement
+ * @constructor Return
+ * @extends {Node}
+ * @property {Expression|null} expr
+ */
+const Return = Node.extends(function Return(expr, docs, location) {
+  Node.apply(this, [KIND, docs, location]);
+  this.expr = expr;
+});
+
+module.exports = Return;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_silent.js.html b/ast_silent.js.html new file mode 100644 index 000000000..2c9e4b2aa --- /dev/null +++ b/ast_silent.js.html @@ -0,0 +1,133 @@ + + + + + + + + + + + ast/silent.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/silent.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Statement = require("./statement");
+const KIND = "silent";
+
+/**
+ * Avoids to show/log warnings & notices from the inner expression
+ * @constructor Silent
+ * @extends {Statement}
+ * @property {Expression} expr
+ */
+const Silent = Statement.extends(function Silent(expr, docs, location) {
+  Statement.apply(this, [KIND, docs, location]);
+  this.expr = expr;
+});
+
+module.exports = Silent;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_statement.js.html b/ast_statement.js.html new file mode 100644 index 000000000..ed42b00d9 --- /dev/null +++ b/ast_statement.js.html @@ -0,0 +1,131 @@ + + + + + + + + + + + ast/statement.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/statement.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Node = require("./node");
+const KIND = "statement";
+
+/**
+ * Any statement.
+ * @constructor Statement
+ * @extends {Node}
+ */
+const Statement = Node.extends(function Statement(kind, docs, location) {
+  Node.apply(this, [kind || KIND, docs, location]);
+});
+
+module.exports = Statement;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_static.js.html b/ast_static.js.html new file mode 100644 index 000000000..6b4f5c247 --- /dev/null +++ b/ast_static.js.html @@ -0,0 +1,133 @@ + + + + + + + + + + + ast/static.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/static.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Statement = require("./statement");
+const KIND = "static";
+
+/**
+ * Declares a static variable into the current scope
+ * @constructor Static
+ * @extends {Statement}
+ * @property {Variable[]|Assign[]} items
+ */
+const Static = Statement.extends(function Static(items, docs, location) {
+  Statement.apply(this, [KIND, docs, location]);
+  this.items = items;
+});
+
+module.exports = Static;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_staticlookup.js.html b/ast_staticlookup.js.html new file mode 100644 index 000000000..5ce7a06df --- /dev/null +++ b/ast_staticlookup.js.html @@ -0,0 +1,136 @@ + + + + + + + + + + + ast/staticlookup.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/staticlookup.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Lookup = require("./lookup");
+const KIND = "staticlookup";
+
+/**
+ * Lookup to a static property
+ * @constructor StaticLookup
+ * @extends {Lookup}
+ */
+const StaticLookup = Lookup.extends(function StaticLookup(
+  what,
+  offset,
+  docs,
+  location
+) {
+  Lookup.apply(this, [KIND, what, offset, docs, location]);
+});
+
+module.exports = StaticLookup;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_string.js.html b/ast_string.js.html new file mode 100644 index 000000000..82f6a8100 --- /dev/null +++ b/ast_string.js.html @@ -0,0 +1,143 @@ + + + + + + + + + + + ast/string.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/string.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Literal = require("./literal");
+const KIND = "string";
+
+/**
+ * Defines a string (simple ou double quoted) - chars are already escaped
+ * @constructor String
+ * @extends {Literal}
+ * @property {boolean} unicode
+ * @property {boolean} isDoubleQuote
+ * @see {Encapsed}
+ */
+const String = Literal.extends(function String(
+  isDoubleQuote,
+  value,
+  unicode,
+  raw,
+  docs,
+  location
+) {
+  Literal.apply(this, [KIND, value, raw, docs, location]);
+  this.unicode = unicode;
+  this.isDoubleQuote = isDoubleQuote;
+});
+
+module.exports = String;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_switch.js.html b/ast_switch.js.html new file mode 100644 index 000000000..ed21c0de8 --- /dev/null +++ b/ast_switch.js.html @@ -0,0 +1,143 @@ + + + + + + + + + + + ast/switch.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/switch.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Statement = require("./statement");
+const KIND = "switch";
+
+/**
+ * Defines a switch statement
+ * @constructor Switch
+ * @extends {Statement}
+ * @property {Expression} test
+ * @property {Block} body
+ * @property {boolean} shortForm
+ */
+const Switch = Statement.extends(function Switch(
+  test,
+  body,
+  shortForm,
+  docs,
+  location
+) {
+  Statement.apply(this, [KIND, docs, location]);
+  this.test = test;
+  this.body = body;
+  this.shortForm = shortForm;
+});
+
+module.exports = Switch;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_sys.js.html b/ast_sys.js.html new file mode 100644 index 000000000..a9c40e7f7 --- /dev/null +++ b/ast_sys.js.html @@ -0,0 +1,133 @@ + + + + + + + + + + + ast/sys.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/sys.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Statement = require("./statement");
+const KIND = "sys";
+
+/**
+ * Defines system based call
+ * @constructor Sys
+ * @extends {Statement}
+ * @property {Node[]} arguments
+ */
+const Sys = Statement.extends(function Sys(kind, args, docs, location) {
+  Statement.apply(this, [kind || KIND, docs, location]);
+  this.arguments = args;
+});
+
+module.exports = Sys;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_throw.js.html b/ast_throw.js.html new file mode 100644 index 000000000..310bb7f73 --- /dev/null +++ b/ast_throw.js.html @@ -0,0 +1,133 @@ + + + + + + + + + + + ast/throw.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/throw.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Statement = require("./statement");
+const KIND = "throw";
+
+/**
+ * Defines a throw statement
+ * @constructor Throw
+ * @extends {Statement}
+ * @property {Expression} what
+ */
+const Throw = Statement.extends(function Throw(what, docs, location) {
+  Statement.apply(this, [KIND, docs, location]);
+  this.what = what;
+});
+
+module.exports = Throw;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_trait.js.html b/ast_trait.js.html new file mode 100644 index 000000000..73efa3949 --- /dev/null +++ b/ast_trait.js.html @@ -0,0 +1,144 @@ + + + + + + + + + + + ast/trait.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/trait.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Declaration = require("./declaration");
+const KIND = "trait";
+
+/**
+ * A trait definition
+ * @constructor Trait
+ * @extends {Declaration}
+ * @property {Identifier|null} extends
+ * @property {Identifier[]} implements
+ * @property {Declaration[]} body
+ */
+const Trait = Declaration.extends(function Trait(
+  name,
+  ext,
+  impl,
+  body,
+  docs,
+  location
+) {
+  Declaration.apply(this, [KIND, name, docs, location]);
+  this.extends = ext;
+  this.implements = impl;
+  this.body = body;
+});
+
+module.exports = Trait;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_traitalias.js.html b/ast_traitalias.js.html new file mode 100644 index 000000000..ace98226f --- /dev/null +++ b/ast_traitalias.js.html @@ -0,0 +1,160 @@ + + + + + + + + + + + ast/traitalias.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/traitalias.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Node = require("./node");
+const KIND = "traitalias";
+
+const IS_UNDEFINED = "";
+const IS_PUBLIC = "public";
+const IS_PROTECTED = "protected";
+const IS_PRIVATE = "private";
+
+/**
+ * Defines a trait alias
+ * @constructor TraitAlias
+ * @extends {Node}
+ * @property {Identifier|null} trait
+ * @property {string} method
+ * @property {string|null} as
+ * @property {string|null} visibility
+ */
+const TraitAlias = Node.extends(function TraitAlias(
+  trait,
+  method,
+  as,
+  flags,
+  docs,
+  location
+) {
+  Node.apply(this, [KIND, docs, location]);
+  this.trait = trait;
+  this.method = method;
+  this.as = as;
+  this.visibility = IS_UNDEFINED;
+  if (flags) {
+    if (flags[0] === 0) {
+      this.visibility = IS_PUBLIC;
+    } else if (flags[0] === 1) {
+      this.visibility = IS_PROTECTED;
+    } else if (flags[0] === 2) {
+      this.visibility = IS_PRIVATE;
+    }
+  }
+});
+
+module.exports = TraitAlias;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_traitprecedence.js.html b/ast_traitprecedence.js.html new file mode 100644 index 000000000..850cea348 --- /dev/null +++ b/ast_traitprecedence.js.html @@ -0,0 +1,143 @@ + + + + + + + + + + + ast/traitprecedence.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/traitprecedence.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Node = require("./node");
+const KIND = "traitprecedence";
+
+/**
+ * Defines a trait alias
+ * @constructor TraitPrecedence
+ * @extends {Node}
+ * @property {Identifier|null} trait
+ * @property {string} method
+ * @property {Identifier[]} instead
+ */
+const TraitPrecedence = Node.extends(function TraitPrecedence(
+  trait,
+  method,
+  instead,
+  docs,
+  location
+) {
+  Node.apply(this, [KIND, docs, location]);
+  this.trait = trait;
+  this.method = method;
+  this.instead = instead;
+});
+
+module.exports = TraitPrecedence;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_traituse.js.html b/ast_traituse.js.html new file mode 100644 index 000000000..18c3f4e0c --- /dev/null +++ b/ast_traituse.js.html @@ -0,0 +1,140 @@ + + + + + + + + + + + ast/traituse.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/traituse.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Node = require("./node");
+const KIND = "traituse";
+
+/**
+ * Defines a trait usage
+ * @constructor TraitUse
+ * @extends {Node}
+ * @property {Identifier[]} traits
+ * @property {Node[]|null} adaptations
+ */
+const TraitUse = Node.extends(function TraitUse(
+  traits,
+  adaptations,
+  docs,
+  location
+) {
+  Node.apply(this, [KIND, docs, location]);
+  this.traits = traits;
+  this.adaptations = adaptations;
+});
+
+module.exports = TraitUse;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_try.js.html b/ast_try.js.html new file mode 100644 index 000000000..0d9c3c6ba --- /dev/null +++ b/ast_try.js.html @@ -0,0 +1,143 @@ + + + + + + + + + + + ast/try.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/try.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Statement = require("./statement");
+const KIND = "try";
+
+/**
+ * Defines a try statement
+ * @constructor Try
+ * @extends {Statement}
+ * @property {Block} body
+ * @property {Catch[]} catches
+ * @property {Block} allways
+ */
+const Try = Statement.extends(function Try(
+  body,
+  catches,
+  always,
+  docs,
+  location
+) {
+  Statement.apply(this, [KIND, docs, location]);
+  this.body = body;
+  this.catches = catches;
+  this.always = always;
+});
+
+module.exports = Try;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_unary.js.html b/ast_unary.js.html new file mode 100644 index 000000000..ecd1a5fc2 --- /dev/null +++ b/ast_unary.js.html @@ -0,0 +1,135 @@ + + + + + + + + + + + ast/unary.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/unary.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Operation = require("./operation");
+const KIND = "unary";
+
+/**
+ * Unary operations
+ * @constructor Unary
+ * @extends {Operation}
+ * @property {String} type
+ * @property {Expression} what
+ */
+const Unary = Operation.extends(function Unary(type, what, docs, location) {
+  Operation.apply(this, [KIND, docs, location]);
+  this.type = type;
+  this.what = what;
+});
+
+module.exports = Unary;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_unset.js.html b/ast_unset.js.html new file mode 100644 index 000000000..37dc5aa12 --- /dev/null +++ b/ast_unset.js.html @@ -0,0 +1,131 @@ + + + + + + + + + + + ast/unset.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/unset.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Sys = require("./sys");
+const KIND = "unset";
+
+/**
+ * Deletes references to a list of variables
+ * @constructor Unset
+ * @extends {Sys}
+ */
+const Unset = Sys.extends(function Unset(args, docs, location) {
+  Sys.apply(this, [KIND, args, docs, location]);
+});
+
+module.exports = Unset;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_usegroup.js.html b/ast_usegroup.js.html new file mode 100644 index 000000000..38214ddb7 --- /dev/null +++ b/ast_usegroup.js.html @@ -0,0 +1,145 @@ + + + + + + + + + + + ast/usegroup.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/usegroup.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Statement = require("./statement");
+const KIND = "usegroup";
+
+/**
+ * Defines a use statement (with a list of use items)
+ * @constructor UseGroup
+ * @extends {Statement}
+ * @property {String|null} name
+ * @property {String|null} type - Possible value : function, const
+ * @property {UseItem[]} item
+ * @see {Namespace}
+ * @see http://php.net/manual/en/language.namespaces.importing.php
+ */
+const UseGroup = Statement.extends(function UseGroup(
+  name,
+  type,
+  items,
+  docs,
+  location
+) {
+  Statement.apply(this, [KIND, docs, location]);
+  this.name = name;
+  this.type = type;
+  this.items = items;
+});
+
+module.exports = UseGroup;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_useitem.js.html b/ast_useitem.js.html new file mode 100644 index 000000000..d85d13c4c --- /dev/null +++ b/ast_useitem.js.html @@ -0,0 +1,156 @@ + + + + + + + + + + + ast/useitem.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/useitem.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Statement = require("./statement");
+const KIND = "useitem";
+
+/**
+ * Defines a use statement (from namespace)
+ * @constructor UseItem
+ * @extends {Statement}
+ * @property {String} name
+ * @property {String|null} type - Possible value : function, const
+ * @property {String|null} alias
+ * @see {Namespace}
+ * @see http://php.net/manual/en/language.namespaces.importing.php
+ */
+const UseItem = Statement.extends(function UseItem(
+  name,
+  alias,
+  type,
+  docs,
+  location
+) {
+  Statement.apply(this, [KIND, docs, location]);
+  this.name = name;
+  this.alias = alias;
+  this.type = type;
+});
+
+/**
+ * Importing a constant
+ * @constant {String} TYPE_CONST
+ */
+UseItem.TYPE_CONST = "const";
+/**
+ * Importing a function
+ * @constant {String} TYPE_FUNC
+ */
+UseItem.TYPE_FUNCTION = "function";
+
+module.exports = UseItem;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_variable.js.html b/ast_variable.js.html new file mode 100644 index 000000000..50c357431 --- /dev/null +++ b/ast_variable.js.html @@ -0,0 +1,154 @@ + + + + + + + + + + + ast/variable.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/variable.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Expr = require("./expression");
+const KIND = "variable";
+
+/**
+ * Any expression node. Since the left-hand side of an assignment may
+ * be any expression in general, an expression can also be a pattern.
+ * @constructor Variable
+ * @extends {Expression}
+ * @example
+ * // PHP code :
+ * &$foo
+ * // AST output
+ * {
+ *  "kind": "variable",
+ *  "name": "foo",
+ *  "byref": true,
+ *  "curly": false
+ * }
+ * @property {String|Node} name The variable name (can be a complex expression when the name is resolved dynamically)
+ * @property {boolean} byref Indicate if the variable reference is used, ex `&$foo`
+ * @property {boolean} curly Indicate if the name is defined between curlies, ex `${foo}`
+ */
+const Variable = Expr.extends(function Variable(
+  name,
+  byref,
+  curly,
+  docs,
+  location
+) {
+  Expr.apply(this, [KIND, docs, location]);
+  this.name = name;
+  this.byref = byref || false;
+  this.curly = curly || false;
+});
+
+module.exports = Variable;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_variadic.js.html b/ast_variadic.js.html new file mode 100644 index 000000000..471f86657 --- /dev/null +++ b/ast_variadic.js.html @@ -0,0 +1,134 @@ + + + + + + + + + + + ast/variadic.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/variadic.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Expr = require("./expression");
+const KIND = "variadic";
+
+/**
+ * Introduce a list of items into the arguments of the call
+ * @constructor variadic
+ * @extends {Expression}
+ * @property {Array|Expression} what
+ * @see https://wiki.php.net/rfc/argument_unpacking
+ */
+const variadic = Expr.extends(function variadic(what, docs, location) {
+  Expr.apply(this, [KIND, docs, location]);
+  this.what = what;
+});
+
+module.exports = variadic;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_while.js.html b/ast_while.js.html new file mode 100644 index 000000000..17093698c --- /dev/null +++ b/ast_while.js.html @@ -0,0 +1,143 @@ + + + + + + + + + + + ast/while.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/while.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Statement = require("./statement");
+const KIND = "while";
+
+/**
+ * Defines a while statement
+ * @constructor While
+ * @extends {Statement}
+ * @property {Expression} test
+ * @property {Statement} body
+ * @property {boolean} shortForm
+ */
+const While = Statement.extends(function While(
+  test,
+  body,
+  shortForm,
+  docs,
+  location
+) {
+  Statement.apply(this, [KIND, docs, location]);
+  this.test = test;
+  this.body = body;
+  this.shortForm = shortForm;
+});
+
+module.exports = While;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_yield.js.html b/ast_yield.js.html new file mode 100644 index 000000000..f8f0d2c7b --- /dev/null +++ b/ast_yield.js.html @@ -0,0 +1,136 @@ + + + + + + + + + + + ast/yield.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/yield.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Expression = require("./expression");
+const KIND = "yield";
+
+/**
+ * Defines a yield generator statement
+ * @constructor Yield
+ * @extends {Expression}
+ * @property {Expression|Null} value
+ * @property {Expression|Null} key
+ * @see http://php.net/manual/en/language.generators.syntax.php
+ */
+const Yield = Expression.extends(function Yield(value, key, docs, location) {
+  Expression.apply(this, [KIND, docs, location]);
+  this.value = value;
+  this.key = key;
+});
+
+module.exports = Yield;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/ast_yieldfrom.js.html b/ast_yieldfrom.js.html new file mode 100644 index 000000000..9ba12a77c --- /dev/null +++ b/ast_yieldfrom.js.html @@ -0,0 +1,134 @@ + + + + + + + + + + + ast/yieldfrom.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ ast/yieldfrom.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const Expression = require("./expression");
+const KIND = "yieldfrom";
+
+/**
+ * Defines a yield from generator statement
+ * @constructor YieldFrom
+ * @extends {Expression}
+ * @property {Expression} value
+ * @see http://php.net/manual/en/language.generators.syntax.php
+ */
+const YieldFrom = Expression.extends(function YieldFrom(value, docs, location) {
+  Expression.apply(this, [KIND, docs, location]);
+  this.value = value;
+});
+
+module.exports = YieldFrom;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/dist/php-parser.js b/dist/php-parser.js deleted file mode 100644 index f394a1741..000000000 --- a/dist/php-parser.js +++ /dev/null @@ -1,11138 +0,0 @@ -/*! - * - * Package: php-parser - * Parse PHP code and returns its AST - * Build: 65fd01ae827233e0f643 - 2018-8-15 - * License: BSD-3-Clause - * Author: Ioan CHIRIAC - * - */ -(function webpackUniversalModuleDefinition(root, factory) { - if(typeof exports === 'object' && typeof module === 'object') - module.exports = factory(); - else if(typeof define === 'function' && define.amd) - define([], factory); - else if(typeof exports === 'object') - exports["PhpParser"] = factory(); - else - root["PhpParser"] = factory(); -})(window, function() { -return /******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 123); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Node = __webpack_require__(1); -var KIND = "statement"; - -/** - * Any statement. - * @constructor Statement - * @extends {Node} - */ -var Statement = Node.extends(function Statement(kind, docs, location) { - Node.apply(this, [kind || KIND, docs, location]); -}); - -module.exports = Statement; - -/***/ }), -/* 1 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -/** - * A generic AST node - * @constructor Node - * @property {Location|null} loc - * @property {Comment[]} leadingComments - * @property {Comment[]?} trailingComments - * @property {String} kind - */ - -var Node = function Node(kind, docs, location) { - this.kind = kind; - if (docs) { - this.leadingComments = docs; - } - if (location) { - this.loc = location; - } -}; - -/** - * Includes current token position of the parser - * @param {*} parser - */ -Node.prototype.includeToken = function (parser) { - if (this.loc) { - if (this.loc.end) { - this.loc.end.line = parser.lexer.yylloc.last_line; - this.loc.end.column = parser.lexer.yylloc.last_column; - this.loc.end.offset = parser.lexer.offset; - } - if (parser.ast.withSource) { - this.loc.source = parser.lexer._input.substring(this.loc.start.offset, parser.lexer.offset); - } - } - return this; -}; - -/** - * Helper for extending the Node class - * @param {Function} constructor - * @return {Function} - */ -Node.extends = function (constructor) { - constructor.prototype = Object.create(this.prototype); - constructor.extends = this.extends; - constructor.prototype.constructor = constructor; - return constructor; -}; - -module.exports = Node; - -/***/ }), -/* 2 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Node = __webpack_require__(1); -var KIND = "expression"; - -/** - * Any expression node. Since the left-hand side of an assignment may - * be any expression in general, an expression can also be a pattern. - * @constructor Expression - * @extends {Node} - */ -var Expression = Node.extends(function Expression(kind, docs, location) { - Node.apply(this, [kind || KIND, docs, location]); -}); - -module.exports = Expression; - -/***/ }), -/* 3 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Statement = __webpack_require__(0); -var KIND = "declaration"; - -var IS_UNDEFINED = ""; -var IS_PUBLIC = "public"; -var IS_PROTECTED = "protected"; -var IS_PRIVATE = "private"; - -/** - * A declaration statement (function, class, interface...) - * @constructor Declaration - * @extends {Statement} - * @property {string} name - */ -var Declaration = Statement.extends(function Declaration(kind, name, docs, location) { - Statement.apply(this, [kind || KIND, docs, location]); - this.name = name; -}); - -/** - * Generic flags parser - * @param {Integer[]} flags - * @return {void} - */ -Declaration.prototype.parseFlags = function (flags) { - this.isAbstract = flags[2] === 1; - this.isFinal = flags[2] === 2; - if (this.kind !== "class") { - if (flags[0] === -1) { - this.visibility = IS_UNDEFINED; - } else if (flags[0] === 0) { - this.visibility = IS_PUBLIC; - } else if (flags[0] === 1) { - this.visibility = IS_PROTECTED; - } else if (flags[0] === 2) { - this.visibility = IS_PRIVATE; - } - this.isStatic = flags[1] === 1; - } -}; - -module.exports = Declaration; - -/***/ }), -/* 4 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Expr = __webpack_require__(2); -var KIND = "literal"; - -/** - * Defines an array structure - * @constructor Literal - * @extends {Expression} - * @property {string} raw - * @property {Node|string|number|boolean|null} value - */ -var Literal = Expr.extends(function Literal(kind, value, raw, docs, location) { - Expr.apply(this, [kind || KIND, docs, location]); - this.value = value; - if (raw) { - this.raw = raw; - } -}); - -module.exports = Literal; - -/***/ }), -/* 5 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Statement = __webpack_require__(0); -var KIND = "sys"; - -/** - * Defines system based call - * @constructor Sys - * @extends {Statement} - * @property {Node[]} arguments - */ -var Sys = Statement.extends(function Sys(kind, args, docs, location) { - Statement.apply(this, [kind || KIND, docs, location]); - this.arguments = args; -}); - -module.exports = Sys; - -/***/ }), -/* 6 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Expr = __webpack_require__(2); -var KIND = "operation"; - -/** - * Defines binary operations - * @constructor Operation - * @extends {Expression} - */ -var Operation = Expr.extends(function Operation(kind, docs, location) { - Expr.apply(this, [kind || KIND, docs, location]); -}); - -module.exports = Operation; - -/***/ }), -/* 7 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Expr = __webpack_require__(2); -var KIND = "lookup"; - -/** - * Lookup on an offset in the specified object - * @constructor Lookup - * @extends {Expression} - * @property {Expression} what - * @property {Expression} offset - */ -var Lookup = Expr.extends(function Lookup(kind, what, offset, docs, location) { - Expr.apply(this, [kind || KIND, docs, location]); - this.what = what; - this.offset = offset; -}); - -module.exports = Lookup; - -/***/ }), -/* 8 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Statement = __webpack_require__(0); -var KIND = "block"; - -/** - * A block statement, i.e., a sequence of statements surrounded by braces. - * @constructor Block - * @extends {Statement} - * @property {Node[]} children - */ -var Block = Statement.extends(function Block(kind, children, docs, location) { - Statement.apply(this, [kind || KIND, docs, location]); - this.children = children.filter(Boolean); -}); - -module.exports = Block; - -/***/ }), -/* 9 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Node = __webpack_require__(1); - -/** - * Abstract documentation node (ComentLine or CommentBlock) - * @constructor Comment - * @extends {Node} - * @property {String} value - */ -var Comment = Node.extends(function Comment(kind, value, docs, location) { - Node.apply(this, [kind, docs, location]); - this.value = value; -}); - -module.exports = Comment; - -/***/ }), -/* 10 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Declaration = __webpack_require__(3); -var KIND = "function"; - -/** - * Defines a classic function - * @constructor Function - * @extends {Declaration} - * @property {Parameter[]} arguments - * @property {Identifier} type - * @property {boolean} byref - * @property {boolean} nullable - * @property {Block|null} body - */ -var fn = Declaration.extends(function _Function(name, args, byref, type, nullable, docs, location) { - Declaration.apply(this, [KIND, name, docs, location]); - this.arguments = args; - this.byref = byref; - this.type = type; - this.nullable = nullable; - this.body = null; -}); -module.exports = fn; - -/***/ }), -/* 11 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Declaration = __webpack_require__(3); -var KIND = "constant"; - -/** - * Defines a namespace constant - * @constructor Constant - * @extends {Declaration} - * @property {Node|null} value - */ -var Constant = Declaration.extends(function Constant(name, value, docs, location) { - Declaration.apply(this, [KIND, name, docs, location]); - this.value = value; -}); - -module.exports = Constant; - -/***/ }), -/* 12 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Expression = __webpack_require__(2); -var KIND = "yieldfrom"; - -/** - * Defines a yield from generator statement - * @constructor YieldFrom - * @extends {Expression} - * @property {Expression} value - * @see http://php.net/manual/en/language.generators.syntax.php - */ -var YieldFrom = Expression.extends(function YieldFrom(value, docs, location) { - Expression.apply(this, [KIND, docs, location]); - this.value = value; -}); - -module.exports = YieldFrom; - -/***/ }), -/* 13 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Expression = __webpack_require__(2); -var KIND = "yield"; - -/** - * Defines a yield generator statement - * @constructor Yield - * @extends {Expression} - * @property {Expression|Null} value - * @property {Expression|Null} key - * @see http://php.net/manual/en/language.generators.syntax.php - */ -var Yield = Expression.extends(function Yield(value, key, docs, location) { - Expression.apply(this, [KIND, docs, location]); - this.value = value; - this.key = key; -}); - -module.exports = Yield; - -/***/ }), -/* 14 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Statement = __webpack_require__(0); -var KIND = "while"; - -/** - * Defines a while statement - * @constructor While - * @extends {Statement} - * @property {Expression} test - * @property {Statement} body - * @property {boolean} shortForm - */ -var While = Statement.extends(function While(test, body, shortForm, docs, location) { - Statement.apply(this, [KIND, docs, location]); - this.test = test; - this.body = body; - this.shortForm = shortForm; -}); - -module.exports = While; - -/***/ }), -/* 15 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Expr = __webpack_require__(2); -var KIND = "variadic"; - -/** - * Introduce a list of items into the arguments of the call - * @constructor variadic - * @extends {Expression} - * @property {Array|Expression} what - * @see https://wiki.php.net/rfc/argument_unpacking - */ -var variadic = Expr.extends(function variadic(what, docs, location) { - Expr.apply(this, [KIND, docs, location]); - this.what = what; -}); - -module.exports = variadic; - -/***/ }), -/* 16 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Expr = __webpack_require__(2); -var KIND = "variable"; - -/** - * Any expression node. Since the left-hand side of an assignment may - * be any expression in general, an expression can also be a pattern. - * @constructor Variable - * @extends {Expression} - * @example - * // PHP code : - * &$foo - * // AST output - * { - * "kind": "variable", - * "name": "foo", - * "byref": true, - * "curly": false - * } - * @property {String|Node} name The variable name (can be a complex expression when the name is resolved dynamically) - * @property {boolean} byref Indicate if the variable reference is used, ex `&$foo` - * @property {boolean} curly Indicate if the name is defined between curlies, ex `${foo}` - */ -var Variable = Expr.extends(function Variable(name, byref, curly, docs, location) { - Expr.apply(this, [KIND, docs, location]); - this.name = name; - this.byref = byref || false; - this.curly = curly || false; -}); - -module.exports = Variable; - -/***/ }), -/* 17 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Statement = __webpack_require__(0); -var KIND = "useitem"; - -/** - * Defines a use statement (from namespace) - * @constructor UseItem - * @extends {Statement} - * @property {String} name - * @property {String|null} type - Possible value : function, const - * @property {String|null} alias - * @see {Namespace} - * @see http://php.net/manual/en/language.namespaces.importing.php - */ -var UseItem = Statement.extends(function UseItem(name, alias, type, docs, location) { - Statement.apply(this, [KIND, docs, location]); - this.name = name; - this.alias = alias; - this.type = type; -}); - -/** - * Importing a constant - * @constant {String} TYPE_CONST - */ -UseItem.TYPE_CONST = "const"; -/** - * Importing a function - * @constant {String} TYPE_FUNC - */ -UseItem.TYPE_FUNCTION = "function"; - -module.exports = UseItem; - -/***/ }), -/* 18 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Statement = __webpack_require__(0); -var KIND = "usegroup"; - -/** - * Defines a use statement (with a list of use items) - * @constructor UseGroup - * @extends {Statement} - * @property {String|null} name - * @property {String|null} type - Possible value : function, const - * @property {UseItem[]} item - * @see {Namespace} - * @see http://php.net/manual/en/language.namespaces.importing.php - */ -var UseGroup = Statement.extends(function UseGroup(name, type, items, docs, location) { - Statement.apply(this, [KIND, docs, location]); - this.name = name; - this.type = type; - this.items = items; -}); - -module.exports = UseGroup; - -/***/ }), -/* 19 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Sys = __webpack_require__(5); -var KIND = "unset"; - -/** - * Deletes references to a list of variables - * @constructor Unset - * @extends {Sys} - */ -var Unset = Sys.extends(function Unset(args, docs, location) { - Sys.apply(this, [KIND, args, docs, location]); -}); - -module.exports = Unset; - -/***/ }), -/* 20 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Operation = __webpack_require__(6); -var KIND = "unary"; - -/** - * Unary operations - * @constructor Unary - * @extends {Operation} - * @property {String} type - * @property {Expression} what - */ -var Unary = Operation.extends(function Unary(type, what, docs, location) { - Operation.apply(this, [KIND, docs, location]); - this.type = type; - this.what = what; -}); - -module.exports = Unary; - -/***/ }), -/* 21 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Statement = __webpack_require__(0); -var KIND = "try"; - -/** - * Defines a try statement - * @constructor Try - * @extends {Statement} - * @property {Block} body - * @property {Catch[]} catches - * @property {Block} allways - */ -var Try = Statement.extends(function Try(body, catches, always, docs, location) { - Statement.apply(this, [KIND, docs, location]); - this.body = body; - this.catches = catches; - this.always = always; -}); - -module.exports = Try; - -/***/ }), -/* 22 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Node = __webpack_require__(1); -var KIND = "traituse"; - -/** - * Defines a trait usage - * @constructor TraitUse - * @extends {Node} - * @property {Identifier[]} traits - * @property {Node[]|null} adaptations - */ -var TraitUse = Node.extends(function TraitUse(traits, adaptations, docs, location) { - Node.apply(this, [KIND, docs, location]); - this.traits = traits; - this.adaptations = adaptations; -}); - -module.exports = TraitUse; - -/***/ }), -/* 23 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Node = __webpack_require__(1); -var KIND = "traitprecedence"; - -/** - * Defines a trait alias - * @constructor TraitPrecedence - * @extends {Node} - * @property {Identifier|null} trait - * @property {string} method - * @property {Identifier[]} instead - */ -var TraitPrecedence = Node.extends(function TraitPrecedence(trait, method, instead, docs, location) { - Node.apply(this, [KIND, docs, location]); - this.trait = trait; - this.method = method; - this.instead = instead; -}); - -module.exports = TraitPrecedence; - -/***/ }), -/* 24 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Node = __webpack_require__(1); -var KIND = "traitalias"; - -var IS_UNDEFINED = ""; -var IS_PUBLIC = "public"; -var IS_PROTECTED = "protected"; -var IS_PRIVATE = "private"; - -/** - * Defines a trait alias - * @constructor TraitAlias - * @extends {Node} - * @property {Identifier|null} trait - * @property {string} method - * @property {string|null} as - * @property {string|null} visibility - */ -var TraitAlias = Node.extends(function TraitAlias(trait, method, as, flags, docs, location) { - Node.apply(this, [KIND, docs, location]); - this.trait = trait; - this.method = method; - this.as = as; - this.visibility = IS_UNDEFINED; - if (flags) { - if (flags[0] === 0) { - this.visibility = IS_PUBLIC; - } else if (flags[0] === 1) { - this.visibility = IS_PROTECTED; - } else if (flags[0] === 2) { - this.visibility = IS_PRIVATE; - } - } -}); - -module.exports = TraitAlias; - -/***/ }), -/* 25 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Declaration = __webpack_require__(3); -var KIND = "trait"; - -/** - * A trait definition - * @constructor Trait - * @extends {Declaration} - * @property {Identifier|null} extends - * @property {Identifier[]} implements - * @property {Declaration[]} body - */ -var Trait = Declaration.extends(function Trait(name, ext, impl, body, docs, location) { - Declaration.apply(this, [KIND, name, docs, location]); - this.extends = ext; - this.implements = impl; - this.body = body; -}); - -module.exports = Trait; - -/***/ }), -/* 26 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Statement = __webpack_require__(0); -var KIND = "throw"; - -/** - * Defines a throw statement - * @constructor Throw - * @extends {Statement} - * @property {Expression} what - */ -var Throw = Statement.extends(function Throw(what, docs, location) { - Statement.apply(this, [KIND, docs, location]); - this.what = what; -}); - -module.exports = Throw; - -/***/ }), -/* 27 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Statement = __webpack_require__(0); -var KIND = "switch"; - -/** - * Defines a switch statement - * @constructor Switch - * @extends {Statement} - * @property {Expression} test - * @property {Block} body - * @property {boolean} shortForm - */ -var Switch = Statement.extends(function Switch(test, body, shortForm, docs, location) { - Statement.apply(this, [KIND, docs, location]); - this.test = test; - this.body = body; - this.shortForm = shortForm; -}); - -module.exports = Switch; - -/***/ }), -/* 28 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Literal = __webpack_require__(4); -var KIND = "string"; - -/** - * Defines a string (simple ou double quoted) - chars are already escaped - * @constructor String - * @extends {Literal} - * @property {boolean} isDoubleQuote - * @see {Encapsed} - */ -var String = Literal.extends(function String(isDoubleQuote, value, raw, docs, location) { - Literal.apply(this, [KIND, value, raw, docs, location]); - this.isDoubleQuote = isDoubleQuote; -}); - -module.exports = String; - -/***/ }), -/* 29 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Lookup = __webpack_require__(7); -var KIND = "staticlookup"; - -/** - * Lookup to a static property - * @constructor StaticLookup - * @extends {Lookup} - */ -var StaticLookup = Lookup.extends(function StaticLookup(what, offset, docs, location) { - Lookup.apply(this, [KIND, what, offset, docs, location]); -}); - -module.exports = StaticLookup; - -/***/ }), -/* 30 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Statement = __webpack_require__(0); -var KIND = "static"; - -/** - * Declares a static variable into the current scope - * @constructor Static - * @extends {Statement} - * @property {Variable[]|Assign[]} items - */ -var Static = Statement.extends(function Static(items, docs, location) { - Statement.apply(this, [KIND, docs, location]); - this.items = items; -}); - -module.exports = Static; - -/***/ }), -/* 31 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Statement = __webpack_require__(0); -var KIND = "silent"; - -/** - * Avoids to show/log warnings & notices from the inner expression - * @constructor Silent - * @extends {Statement} - * @property {Expression} expr - */ -var Silent = Statement.extends(function Silent(expr, docs, location) { - Statement.apply(this, [KIND, docs, location]); - this.expr = expr; -}); - -module.exports = Silent; - -/***/ }), -/* 32 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Node = __webpack_require__(1); -var KIND = "return"; - -/** - * A continue statement - * @constructor Return - * @extends {Node} - * @property {Expression|null} expr - */ -var Return = Node.extends(function Return(expr, docs, location) { - Node.apply(this, [KIND, docs, location]); - this.expr = expr; -}); - -module.exports = Return; - -/***/ }), -/* 33 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Statement = __webpack_require__(0); -var KIND = "retif"; - -/** - * Defines a short if statement that returns a value - * @constructor RetIf - * @extends {Statement} - * @property {Expression} test - * @property {Expression} trueExpr - * @property {Expression} falseExpr - */ -var RetIf = Statement.extends(function RetIf(test, trueExpr, falseExpr, docs, location) { - Statement.apply(this, [KIND, docs, location]); - this.test = test; - this.trueExpr = trueExpr; - this.falseExpr = falseExpr; -}); - -module.exports = RetIf; - -/***/ }), -/* 34 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Lookup = __webpack_require__(7); -var KIND = "propertylookup"; - -/** - * Lookup to an object property - * @constructor PropertyLookup - * @extends {Lookup} - */ -var PropertyLookup = Lookup.extends(function PropertyLookup(what, offset, docs, location) { - Lookup.apply(this, [KIND, what, offset, docs, location]); -}); - -module.exports = PropertyLookup; - -/***/ }), -/* 35 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Declaration = __webpack_require__(3); -var KIND = "property"; - -/** - * Defines a class property - * @constructor Property - * @extends {Declaration} - * @property {boolean} isFinal - * @property {boolean} isStatic - * @property {string} visibility - * @property {Node|null} value - */ -var Property = Declaration.extends(function Property(name, value, flags, docs, location) { - Declaration.apply(this, [KIND, name, docs, location]); - this.value = value; - this.parseFlags(flags); -}); - -module.exports = Property; - -/***/ }), -/* 36 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Block = __webpack_require__(8); -var KIND = "program"; - -/** - * The main program node - * @constructor Program - * @extends {Block} - * @property {Error[]} errors - * @property {Doc[]?} comments - * @property {String[]?} tokens - */ -var Program = Block.extends(function Program(children, errors, comments, tokens, docs, location) { - Block.apply(this, [KIND, children, docs, location]); - this.errors = errors; - if (comments) { - this.comments = comments; - } - if (tokens) { - this.tokens = tokens; - } -}); - -module.exports = Program; - -/***/ }), -/* 37 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Sys = __webpack_require__(5); -var KIND = "print"; - -/** - * Outputs - * @constructor Print - * @extends {Sys} - */ -var Print = Sys.extends(function Print(args, docs, location) { - Sys.apply(this, [KIND, args, docs, location]); -}); - -module.exports = Print; - -/***/ }), -/* 38 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Operation = __webpack_require__(6); -var KIND = "pre"; - -/** - * Defines a pre operation `++$i` or `--$i` - * @constructor Pre - * @extends {Operation} - * @property {String} type - * @property {Variable} what - */ -var Pre = Operation.extends(function Pre(type, what, docs, location) { - Operation.apply(this, [KIND, docs, location]); - this.type = type; - this.what = what; -}); - -module.exports = Pre; - -/***/ }), -/* 39 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Operation = __webpack_require__(6); -var KIND = "post"; - -/** - * Defines a post operation `$i++` or `$i--` - * @constructor Post - * @extends {Operation} - * @property {String} type - * @property {Variable} what - */ -var Post = Operation.extends(function Post(type, what, docs, location) { - Operation.apply(this, [KIND, docs, location]); - this.type = type; - this.what = what; -}); - -module.exports = Post; - -/***/ }), -/* 40 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Operation = __webpack_require__(6); -var KIND = "parenthesis"; - -/** - * Parenthesis encapsulation `(... expr ...)` - * @constructor Parenthesis - * @extends {Operation} - * @property {Expression} inner - */ -var Parenthesis = Operation.extends(function Parenthesis(inner, docs, location) { - Operation.apply(this, [KIND, docs, location]); - this.inner = inner; -}); - -module.exports = Parenthesis; - -/***/ }), -/* 41 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Declaration = __webpack_require__(3); -var KIND = "parameter"; - -/** - * Defines a function parameter - * @constructor Parameter - * @extends {Declaration} - * @property {Identifier|null} type - * @property {Node|null} value - * @property {boolean} byref - * @property {boolean} variadic - * @property {boolean} nullable - */ -var Parameter = Declaration.extends(function Parameter(name, type, value, isRef, isVariadic, nullable, docs, location) { - Declaration.apply(this, [KIND, name, docs, location]); - this.value = value; - this.type = type; - this.byref = isRef; - this.variadic = isVariadic; - this.nullable = nullable; -}); - -module.exports = Parameter; - -/***/ }), -/* 42 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Lookup = __webpack_require__(7); -var KIND = "offsetlookup"; - -/** - * Lookup on an offset in an array - * @constructor OffsetLookup - * @extends {Lookup} - */ -var OffsetLookup = Lookup.extends(function OffsetLookup(what, offset, docs, location) { - Lookup.apply(this, [KIND, what, offset, docs, location]); -}); - -module.exports = OffsetLookup; - -/***/ }), -/* 43 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Literal = __webpack_require__(4); -var KIND = "number"; - -/** - * Defines a numeric value - * @constructor Number - * @extends {Literal} - */ -var _Number = Literal.extends(function Number(value, raw, docs, location) { - Literal.apply(this, [KIND, value, raw, docs, location]); -}); - -module.exports = _Number; - -/***/ }), -/* 44 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Literal = __webpack_require__(4); -var KIND = "nowdoc"; - -/** - * Defines a nowdoc string - * @constructor String - * @extends {Literal} - * @property {String} label - * @property {String} raw - * @property {Boolean} quote - */ -var Nowdoc = Literal.extends(function Nowdoc(value, raw, label, quote, docs, location) { - Literal.apply(this, [KIND, value, raw, docs, location]); - this.label = label; - this.quote = quote; -}); - -module.exports = Nowdoc; - -/***/ }), -/* 45 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Statement = __webpack_require__(0); -var KIND = "new"; - -/** - * Creates a new instance of the specified class - * @constructor New - * @extends {Statement} - * @property {Identifier|Variable|Class} what - * @property {Arguments[]} arguments - */ -var New = Statement.extends(function New(what, args, docs, location) { - Statement.apply(this, [KIND, docs, location]); - this.what = what; - this.arguments = args; -}); - -module.exports = New; - -/***/ }), -/* 46 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Block = __webpack_require__(8); -var KIND = "namespace"; - -/** - * The main program node - * @constructor Namespace - * @extends {Block} - * @property {String} name - * @property {Boolean} withBrackets - */ -var Namespace = Block.extends(function Namespace(name, children, withBrackets, docs, location) { - Block.apply(this, [KIND, children, docs, location]); - this.name = name; - this.withBrackets = withBrackets || false; -}); - -module.exports = Namespace; - -/***/ }), -/* 47 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var fn = __webpack_require__(10); -var KIND = "method"; - -/** - * Defines a class/interface/trait method - * @constructor Method - * @extends {Function} - * @property {boolean} isAbstract - * @property {boolean} isFinal - * @property {boolean} isStatic - * @property {string} visibility - */ -var Method = fn.extends(function Method() { - fn.apply(this, arguments); - this.kind = KIND; -}); - -module.exports = Method; - -/***/ }), -/* 48 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Literal = __webpack_require__(4); -var KIND = "magic"; - -/** - * Defines magic constant - * @constructor Magic - * @extends {Literal} - */ -var Magic = Literal.extends(function Magic(value, raw, docs, location) { - Literal.apply(this, [KIND, value, raw, docs, location]); -}); - -module.exports = Magic; - -/***/ }), -/* 49 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Sys = __webpack_require__(5); -var KIND = "list"; - -/** - * Defines list assignment - * @constructor List - * @extends {Sys} - * @property {boolean} shortForm - */ -var List = Sys.extends(function List(items, shortForm, docs, location) { - Sys.apply(this, [KIND, items, docs, location]); - this.shortForm = shortForm; -}); - -module.exports = List; - -/***/ }), -/* 50 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Node = __webpack_require__(1); -var KIND = "label"; - -/** - * A label statement (referenced by goto) - * @constructor Label - * @extends {Node} - * @property {String} name - */ -var Label = Node.extends(function Label(name, docs, location) { - Node.apply(this, [KIND, docs, location]); - this.name = name; -}); - -module.exports = Label; - -/***/ }), -/* 51 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Sys = __webpack_require__(5); -var KIND = "isset"; - -/** - * Defines an isset call - * @constructor Isset - * @extends {Sys} - */ -var Isset = Sys.extends(function Isset(args, docs, location) { - Sys.apply(this, [KIND, args, docs, location]); -}); - -module.exports = Isset; - -/***/ }), -/* 52 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Declaration = __webpack_require__(3); -var KIND = "interface"; - -/** - * An interface definition - * @constructor Interface - * @extends {Declaration} - * @property {Identifier[]} extends - * @property {Declaration[]} body - */ -var Interface = Declaration.extends(function Interface(name, ext, body, docs, location) { - Declaration.apply(this, [KIND, name, docs, location]); - this.extends = ext; - this.body = body; -}); - -module.exports = Interface; - -/***/ }), -/* 53 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Literal = __webpack_require__(4); -var KIND = "inline"; - -/** - * Defines inline html output (treated as echo output) - * @constructor Inline - * @extends {Literal} - */ -var Inline = Literal.extends(function Inline(value, raw, docs, location) { - Literal.apply(this, [KIND, value, raw, docs, location]); -}); - -module.exports = Inline; - -/***/ }), -/* 54 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Statement = __webpack_require__(0); -var KIND = "include"; - -/** - * Defines system include call - * @constructor Include - * @extends {Statement} - * @property {Node} target - * @property {boolean} once - * @property {boolean} require - */ -var Include = Statement.extends(function Include(once, require, target, docs, location) { - Statement.apply(this, [KIND, docs, location]); - this.once = once; - this.require = require; - this.target = target; -}); - -module.exports = Include; - -/***/ }), -/* 55 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Statement = __webpack_require__(0); -var KIND = "if"; - -/** - * Defines a if statement - * @constructor If - * @extends {Statement} - * @property {Expression} test - * @property {Block} body - * @property {Block|If|null} alternate - * @property {boolean} shortForm - */ -var If = Statement.extends(function If(test, body, alternate, shortForm, docs, location) { - Statement.apply(this, [KIND, docs, location]); - this.test = test; - this.body = body; - this.alternate = alternate; - this.shortForm = shortForm; -}); - -module.exports = If; - -/***/ }), -/* 56 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Node = __webpack_require__(1); -var KIND = "identifier"; - -/** - * Defines an identifier node - * @constructor Identifier - * @extends {Node} - * @property {string} name - * @property {string} resolution - */ -var Identifier = Node.extends(function Identifier(name, isRelative, docs, location) { - Node.apply(this, [KIND, docs, location]); - if (isRelative) { - this.resolution = Identifier.RELATIVE_NAME; - } else if (name.length === 1) { - this.resolution = Identifier.UNQUALIFIED_NAME; - } else if (name[0] === "") { - this.resolution = Identifier.FULL_QUALIFIED_NAME; - } else { - this.resolution = Identifier.QUALIFIED_NAME; - } - this.name = name.join("\\"); -}); - -/** - * This is an identifier without a namespace separator, such as Foo - * @constant {String} UNQUALIFIED_NAME - */ -Identifier.UNQUALIFIED_NAME = "uqn"; -/** - * This is an identifier with a namespace separator, such as Foo\Bar - * @constant {String} QUALIFIED_NAME - */ -Identifier.QUALIFIED_NAME = "qn"; -/** - * This is an identifier with a namespace separator that begins with - * a namespace separator, such as \Foo\Bar. The namespace \Foo is also - * a fully qualified name. - * @constant {String} FULL_QUALIFIED_NAME - */ -Identifier.FULL_QUALIFIED_NAME = "fqn"; -/** - * This is an identifier starting with namespace, such as namespace\Foo\Bar. - * @constant {String} RELATIVE_NAME - */ -Identifier.RELATIVE_NAME = "rn"; - -module.exports = Identifier; - -/***/ }), -/* 57 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Statement = __webpack_require__(0); -var KIND = "halt"; - -/** - * Halts the compiler execution - * @constructor Halt - * @extends {Statement} - * @property {String} after - String after the halt statement - * @see http://php.net/manual/en/function.halt-compiler.php - */ -var Halt = Statement.extends(function Halt(after, docs, location) { - Statement.apply(this, [KIND, docs, location]); - this.after = after; -}); - -module.exports = Halt; - -/***/ }), -/* 58 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Statement = __webpack_require__(0); -var KIND = "goto"; - -/** - * Defines goto statement - * @constructor Goto - * @extends {Statement} - * @property {String} label - * @see {Label} - */ -var Goto = Statement.extends(function Goto(label, docs, location) { - Statement.apply(this, [KIND, docs, location]); - this.label = label; -}); - -module.exports = Goto; - -/***/ }), -/* 59 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Statement = __webpack_require__(0); -var KIND = "global"; - -/** - * Imports a variable from the global scope - * @constructor Global - * @extends {Statement} - * @property {Variable[]} items - */ -var Global = Statement.extends(function Global(items, docs, location) { - Statement.apply(this, [KIND, docs, location]); - this.items = items; -}); - -module.exports = Global; - -/***/ }), -/* 60 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Statement = __webpack_require__(0); -var KIND = "foreach"; - -/** - * Defines a foreach iterator - * @constructor Foreach - * @extends {Statement} - * @property {Expression} source - * @property {Expression|null} key - * @property {Expression} value - * @property {Statement} body - * @property {boolean} shortForm - * @see http://php.net/manual/en/control-structures.foreach.php - */ -var Foreach = Statement.extends(function Foreach(source, key, value, body, shortForm, docs, location) { - Statement.apply(this, [KIND, docs, location]); - this.source = source; - this.key = key; - this.value = value; - this.shortForm = shortForm; - this.body = body; -}); - -module.exports = Foreach; - -/***/ }), -/* 61 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Statement = __webpack_require__(0); -var KIND = "for"; - -/** - * Defines a for iterator - * @constructor For - * @extends {Statement} - * @property {Expression[]} init - * @property {Expression[]} test - * @property {Expression[]} increment - * @property {Statement} body - * @property {boolean} shortForm - * @see http://php.net/manual/en/control-structures.for.php - */ -var For = Statement.extends(function For(init, test, increment, body, shortForm, docs, location) { - Statement.apply(this, [KIND, docs, location]); - this.init = init; - this.test = test; - this.increment = increment; - this.shortForm = shortForm; - this.body = body; -}); - -module.exports = For; - -/***/ }), -/* 62 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Statement = __webpack_require__(0); -var KIND = "exit"; - -/** - * Defines an exit / die call - * @constructor Exit - * @extends {Statement} - * @property {Node|null} status - * @property {Boolean} useDie - */ -var Exit = Statement.extends(function Exit(status, useDie, docs, location) { - Statement.apply(this, [KIND, docs, location]); - this.status = status; - this.useDie = useDie; -}); - -module.exports = Exit; - -/***/ }), -/* 63 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Statement = __webpack_require__(0); -var KIND = "eval"; - -/** - * Defines an eval statement - * @constructor Eval - * @extends {Statement} - * @property {Node} source - */ -var Eval = Statement.extends(function Eval(source, docs, location) { - Statement.apply(this, [KIND, docs, location]); - this.source = source; -}); - -module.exports = Eval; - -/***/ }), -/* 64 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Node = __webpack_require__(1); -var KIND = "error"; - -/** - * Defines an error node (used only on silentMode) - * @constructor Error - * @extends {Node} - * @property {string} message - * @property {number} line - * @property {number|string} token - * @property {string|array} expected - */ -var Error = Node.extends(function Error(message, token, line, expected, docs, location) { - Node.apply(this, [KIND, docs, location]); - this.message = message; - this.token = token; - this.line = line; - this.expected = expected; -}); - -module.exports = Error; - -/***/ }), -/* 65 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Node = __webpack_require__(1); -var KIND = "entry"; - -/** - * An array entry - see [Array](#array) - * @constructor Entry - * @extends {Node} - * @property {Node|null} key The entry key/offset - * @property {Node} value The entry value - */ -var Entry = Node.extends(function Entry(key, value, docs, location) { - Node.apply(this, [KIND, docs, location]); - this.key = key; - this.value = value; -}); - -module.exports = Entry; - -/***/ }), -/* 66 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Literal = __webpack_require__(4); -var KIND = "encapsed"; - -/** - * Defines an encapsed string (contains expressions) - * @constructor Encapsed - * @extends {Literal} - * @property {String} type - Defines the type of encapsed string (shell, heredoc, string) - * @property {String|Null} label - The heredoc label, defined only when the type is heredoc - */ -var Encapsed = Literal.extends(function Encapsed(value, raw, type, docs, location) { - Literal.apply(this, [KIND, value, raw, docs, location]); - this.type = type; -}); - -/** - * The node is a double quote string : - * ```php - * bar_$baz; - * ``` - * @constant {String} TYPE_OFFSET - `offset` - */ -Encapsed.TYPE_OFFSET = "offset"; - -module.exports = Encapsed; - -/***/ }), -/* 67 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Sys = __webpack_require__(5); -var KIND = "empty"; - -/** - * Defines an empty check call - * @constructor Empty - * @extends {Sys} - */ -var Empty = Sys.extends(function Empty(args, docs, location) { - Sys.apply(this, [KIND, args, docs, location]); -}); - -module.exports = Empty; - -/***/ }), -/* 68 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Sys = __webpack_require__(5); -var KIND = "echo"; - -/** - * Defines system based call - * @constructor Echo - * @property {boolean} shortForm - * @extends {Sys} - */ -var Echo = Sys.extends(function Echo(args, shortForm, docs, location) { - Sys.apply(this, [KIND, args, docs, location]); - this.shortForm = shortForm; -}); - -module.exports = Echo; - -/***/ }), -/* 69 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Statement = __webpack_require__(0); -var KIND = "do"; - -/** - * Defines a do/while statement - * @constructor Do - * @extends {Statement} - * @property {Expression} test - * @property {Statement} body - */ -var Do = Statement.extends(function Do(test, body, docs, location) { - Statement.apply(this, [KIND, docs, location]); - this.test = test; - this.body = body; -}); - -module.exports = Do; - -/***/ }), -/* 70 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Block = __webpack_require__(8); -var KIND = "declare"; - -/** - * The declare construct is used to set execution directives for a block of code - * @constructor Declare - * @extends {Block} - * @property {Expression[]} what - * @property {String} mode - * @see http://php.net/manual/en/control-structures.declare.php - */ -var Declare = Block.extends(function Declare(what, body, mode, docs, location) { - Block.apply(this, [KIND, body, docs, location]); - this.what = what; - this.mode = mode; -}); - -/** - * The node is declared as a short tag syntax : - * ```php - * 'bar', 3] - * - * // AST structure : - * { - * "kind": "array", - * "shortForm": true - * "items": [ - * {"kind": "number", "value": "1"}, - * { - * "kind": "entry", - * "key": {"kind": "string", "value": "foo", "isDoubleQuote": false}, - * "value": {"kind": "string", "value": "bar", "isDoubleQuote": false} - * }, - * {"kind": "number", "value": "3"} - * ] - * } - * @extends {Expression} - * @property {Entry|Expr|Variable} items List of array items - * @property {boolean} shortForm Indicate if the short array syntax is used, ex `[]` instead `array()` - */ -var Array = Expr.extends(function Array(shortForm, items, docs, location) { - Expr.apply(this, [KIND, docs, location]); - this.items = items; - this.shortForm = shortForm; -}); - -module.exports = Array; - -/***/ }), -/* 88 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -/** - * Each Position object consists of a line number (1-indexed) and a column number (0-indexed): - * @constructor Position - * @property {Number} line - * @property {Number} column - * @property {Number} offset - */ - -var Position = function Position(line, column, offset) { - this.line = line; - this.column = column; - this.offset = offset; -}; - -module.exports = Position; - -/***/ }), -/* 89 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -/** - * Defines the location of the node (with it's source contents as string) - * @constructor Location - * @property {String|null} source - * @property {Position} start - * @property {Position} end - */ - -var Location = function Location(source, start, end) { - this.source = source; - this.start = start; - this.end = end; -}; - -module.exports = Location; - -/***/ }), -/* 90 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var Location = __webpack_require__(89); -var Position = __webpack_require__(88); - -/** - * ## Class hierarchy - * - * - [Location](#location) - * - [Position](#position) - * - [Node](#node) - * - [Identifier](#identifier) - * - [TraitUse](#traituse) - * - [TraitAlias](#traitalias) - * - [TraitPrecedence](#traitprecedence) - * - [Entry](#entry) - * - [Case](#case) - * - [Label](#label) - * - [Comment](#comment) - * - [CommentLine](#commentline) - * - [CommentBlock](#commentblock) - * - [Error](#error) - * - [Expression](#expression) - * - [Array](#array) - * - [Variable](#variable) - * - [Variadic](#variadic) - * - [ConstRef](#constref) - * - [Yield](#yield) - * - [YieldFrom](#yieldfrom) - * - [Lookup](#lookup) - * - [PropertyLookup](#propertylookup) - * - [StaticLookup](#staticlookup) - * - [OffsetLookup](#offsetlookup) - * - [Operation](#operation) - * - [Pre](#pre) - * - [Post](#post) - * - [Bin](#bin) - * - [Parenthesis](#parenthesis) - * - [Unary](#unary) - * - [Cast](#cast) - * - [Literal](#literal) - * - [Boolean](#boolean) - * - [String](#string) - * - [Number](#number) - * - [Inline](#inline) - * - [Magic](#magic) - * - [Nowdoc](#nowdoc) - * - [Encapsed](#encapsed) - * - [Statement](#statement) - * - [Eval](#eval) - * - [Exit](#exit) - * - [Halt](#halt) - * - [Clone](#clone) - * - [Declare](#declare) - * - [Global](#global) - * - [Static](#static) - * - [Include](#include) - * - [Assign](#assign) - * - [RetIf](#retif) - * - [If](#if) - * - [Do](#do) - * - [While](#while) - * - [For](#for) - * - [Foreach](#foreach) - * - [Switch](#switch) - * - [Goto](#goto) - * - [Silent](#silent) - * - [Try](#try) - * - [Catch](#catch) - * - [Throw](#throw) - * - [Call](#call) - * - [Closure](#closure) - * - [New](#new) - * - [UseGroup](#usegroup) - * - [UseItem](#useitem) - * - [Block](#block) - * - [Program](#program) - * - [Namespace](#namespace) - * - [Sys](#sys) - * - [Echo](#echo) - * - [List](#list) - * - [Print](#print) - * - [Isset](#isset) - * - [Unset](#unset) - * - [Empty](#empty) - * - [Declaration](#declaration) - * - [Class](#class) - * - [Interface](#interface) - * - [Trait](#trait) - * - [Constant](#constant) - * - [ClassConstant](#classconstant) - * - [Function](#function) - * - [Method](#method) - * - [Parameter](#parameter) - * - [Property](#property) - * --- - */ - -/** - * The AST builder class - * @constructor AST - * @tutorial AST - * @property {Boolean} withPositions - Should locate any node (by default false) - * @property {Boolean} withSource - Should extract the node original code (by default false) - */ -var AST = function AST(withPositions, withSource) { - this.withPositions = withPositions; - this.withSource = withSource; -}; - -/** - * Create a position node from specified parser - * including it's lexer current state - * @param {Parser} - * @return {Position} - * @private - */ -AST.prototype.position = function (parser) { - return new Position(parser.lexer.yylloc.first_line, parser.lexer.yylloc.first_column, parser.lexer.yylloc.first_offset); -}; - -// operators in ascending order of precedence -AST.precedence = {}; -[["or"], ["xor"], ["and"], ["="], ["?"], ["??"], ["||"], ["&&"], ["|"], ["^"], ["&"], ["==", "!=", "===", "!==", /* '<>', */"<=>"], ["<", "<=", ">", ">="], ["<<", ">>"], ["+", "-", "."], ["*", "/", "%"], ["!"], ["instanceof"] -// TODO: typecasts -// TODO: [ (array) -// TODO: clone, new -].forEach(function (list, index) { - list.forEach(function (operator) { - AST.precedence[operator] = index + 1; - }); -}); - -/** - * Check and fix precence, by default using right - */ -AST.prototype.resolvePrecedence = function (result) { - var buffer = void 0, - lLevel = void 0, - rLevel = void 0; - // handling precendence - if (result.kind === "bin") { - if (result.right) { - if (result.right.kind === "bin") { - lLevel = AST.precedence[result.type]; - rLevel = AST.precedence[result.right.type]; - if (lLevel && rLevel && rLevel <= lLevel) { - // https://github.com/glayzzle/php-parser/issues/79 - // shift precedence - buffer = result.right; - result.right = result.right.left; - buffer.left = this.resolvePrecedence(result); - result = buffer; - } - } else if (result.right.kind === "retif") { - lLevel = AST.precedence[result.type]; - rLevel = AST.precedence["?"]; - if (lLevel && rLevel && rLevel <= lLevel) { - buffer = result.right; - result.right = result.right.test; - buffer.test = this.resolvePrecedence(result); - result = buffer; - } - } - } - } else if (result.kind === "unary") { - // https://github.com/glayzzle/php-parser/issues/75 - if (result.what) { - // unary precedence is allways lower - if (result.what.kind === "bin") { - buffer = result.what; - result.what = result.what.left; - buffer.left = this.resolvePrecedence(result); - result = buffer; - } else if (result.what.kind === "retif") { - buffer = result.what; - result.what = result.what.test; - buffer.test = this.resolvePrecedence(result); - result = buffer; - } - } - } else if (result.kind === "retif") { - // https://github.com/glayzzle/php-parser/issues/77 - if (result.falseExpr && result.falseExpr.kind === "retif") { - buffer = result.falseExpr; - result.falseExpr = buffer.test; - buffer.test = this.resolvePrecedence(result); - result = buffer; - } - } else if (result.kind === "assign") { - // https://github.com/glayzzle/php-parser/issues/81 - if (result.right && result.right.kind === "bin") { - lLevel = AST.precedence["="]; - rLevel = AST.precedence[result.right.type]; - // only shifts with and, xor, or - if (lLevel && rLevel && rLevel < lLevel) { - buffer = result.right; - result.right = result.right.left; - buffer.left = result; - result = buffer; - } - } - } - return result; -}; - -/** - * Prepares an AST node - * @param {String|null} kind - Defines the node type - * (if null, the kind must be passed at the function call) - * @param {Parser} parser - The parser instance (use for extracting locations) - * @return {Function} - */ -AST.prototype.prepare = function (kind, docs, parser) { - var start = null; - if (this.withPositions || this.withSource) { - start = this.position(parser); - } - var self = this; - // returns the node - var result = function result() { - var location = null; - var args = Array.prototype.slice.call(arguments); - args.push(docs); - if (self.withPositions || self.withSource) { - var src = null; - if (self.withSource) { - src = parser.lexer._input.substring(start.offset, parser.prev[2]); - } - if (self.withPositions) { - location = new Location(src, start, new Position(parser.prev[0], parser.prev[1], parser.prev[2])); - } else { - location = new Location(src, null, null); - } - // last argument is allways the location - args.push(location); - } - // handle lazy kind definitions - if (!kind) { - kind = args.shift(); - } - // build the object - var node = self[kind]; - if (typeof node !== "function") { - throw new Error('Undefined node "' + kind + '"'); - } - var result = Object.create(node.prototype); - node.apply(result, args); - return self.resolvePrecedence(result); - }; - /** - * Helper to change a node kind - * @param {String} newKind - */ - result.setKind = function (newKind) { - kind = newKind; - }; - return result; -}; - -// Define all AST nodes -[__webpack_require__(87), __webpack_require__(86), __webpack_require__(85), __webpack_require__(8), __webpack_require__(84), __webpack_require__(83), __webpack_require__(82), __webpack_require__(81), __webpack_require__(80), __webpack_require__(79), __webpack_require__(78), __webpack_require__(77), __webpack_require__(76), __webpack_require__(75), __webpack_require__(9), __webpack_require__(74), __webpack_require__(73), __webpack_require__(11), __webpack_require__(72), __webpack_require__(71), __webpack_require__(3), __webpack_require__(70), __webpack_require__(69), __webpack_require__(68), __webpack_require__(67), __webpack_require__(66), __webpack_require__(65), __webpack_require__(64), __webpack_require__(63), __webpack_require__(62), __webpack_require__(2), __webpack_require__(61), __webpack_require__(60), __webpack_require__(10), __webpack_require__(59), __webpack_require__(58), __webpack_require__(57), __webpack_require__(56), __webpack_require__(55), __webpack_require__(54), __webpack_require__(53), __webpack_require__(52), __webpack_require__(51), __webpack_require__(50), __webpack_require__(49), __webpack_require__(4), __webpack_require__(7), __webpack_require__(48), __webpack_require__(47), __webpack_require__(46), __webpack_require__(45), __webpack_require__(1), __webpack_require__(44), __webpack_require__(43), __webpack_require__(42), __webpack_require__(6), __webpack_require__(41), __webpack_require__(40), __webpack_require__(39), __webpack_require__(38), __webpack_require__(37), __webpack_require__(36), __webpack_require__(35), __webpack_require__(34), __webpack_require__(33), __webpack_require__(32), __webpack_require__(31), __webpack_require__(0), __webpack_require__(30), __webpack_require__(29), __webpack_require__(28), __webpack_require__(27), __webpack_require__(5), __webpack_require__(26), __webpack_require__(25), __webpack_require__(24), __webpack_require__(23), __webpack_require__(22), __webpack_require__(21), __webpack_require__(20), __webpack_require__(19), __webpack_require__(18), __webpack_require__(17), __webpack_require__(16), __webpack_require__(15), __webpack_require__(14), __webpack_require__(13), __webpack_require__(12)].forEach(function (ctor) { - var kind = ctor.prototype.constructor.name.toLowerCase(); - if (kind[0] === "_") kind = kind.substring(1); - AST.prototype[kind] = ctor; -}); - -module.exports = AST; - -/***/ }), -/* 91 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -/** - * PHP AST Tokens - * @type {Object} - */ - -module.exports = { - values: { - 101: "T_HALT_COMPILER", - 102: "T_USE", - 103: "T_ENCAPSED_AND_WHITESPACE", - 104: "T_OBJECT_OPERATOR", - 105: "T_STRING", - 106: "T_DOLLAR_OPEN_CURLY_BRACES", - 107: "T_STRING_VARNAME", - 108: "T_CURLY_OPEN", - 109: "T_NUM_STRING", - 110: "T_ISSET", - 111: "T_EMPTY", - 112: "T_INCLUDE", - 113: "T_INCLUDE_ONCE", - 114: "T_EVAL", - 115: "T_REQUIRE", - 116: "T_REQUIRE_ONCE", - 117: "T_NAMESPACE", - 118: "T_NS_SEPARATOR", - 119: "T_AS", - 120: "T_IF", - 121: "T_ENDIF", - 122: "T_WHILE", - 123: "T_DO", - 124: "T_FOR", - 125: "T_SWITCH", - 126: "T_BREAK", - 127: "T_CONTINUE", - 128: "T_RETURN", - 129: "T_GLOBAL", - 130: "T_STATIC", - 131: "T_ECHO", - 132: "T_INLINE_HTML", - 133: "T_UNSET", - 134: "T_FOREACH", - 135: "T_DECLARE", - 136: "T_TRY", - 137: "T_THROW", - 138: "T_GOTO", - 139: "T_FINALLY", - 140: "T_CATCH", - 141: "T_ENDDECLARE", - 142: "T_LIST", - 143: "T_CLONE", - 144: "T_PLUS_EQUAL", - 145: "T_MINUS_EQUAL", - 146: "T_MUL_EQUAL", - 147: "T_DIV_EQUAL", - 148: "T_CONCAT_EQUAL", - 149: "T_MOD_EQUAL", - 150: "T_AND_EQUAL", - 151: "T_OR_EQUAL", - 152: "T_XOR_EQUAL", - 153: "T_SL_EQUAL", - 154: "T_SR_EQUAL", - 155: "T_INC", - 156: "T_DEC", - 157: "T_BOOLEAN_OR", - 158: "T_BOOLEAN_AND", - 159: "T_LOGICAL_OR", - 160: "T_LOGICAL_AND", - 161: "T_LOGICAL_XOR", - 162: "T_SL", - 163: "T_SR", - 164: "T_IS_IDENTICAL", - 165: "T_IS_NOT_IDENTICAL", - 166: "T_IS_EQUAL", - 167: "T_IS_NOT_EQUAL", - 168: "T_IS_SMALLER_OR_EQUAL", - 169: "T_IS_GREATER_OR_EQUAL", - 170: "T_INSTANCEOF", - 171: "T_INT_CAST", - 172: "T_DOUBLE_CAST", - 173: "T_STRING_CAST", - 174: "T_ARRAY_CAST", - 175: "T_OBJECT_CAST", - 176: "T_BOOL_CAST", - 177: "T_UNSET_CAST", - 178: "T_EXIT", - 179: "T_PRINT", - 180: "T_YIELD", - 181: "T_YIELD_FROM", - 182: "T_FUNCTION", - 183: "T_DOUBLE_ARROW", - 184: "T_DOUBLE_COLON", - 185: "T_ARRAY", - 186: "T_CALLABLE", - 187: "T_CLASS", - 188: "T_ABSTRACT", - 189: "T_TRAIT", - 190: "T_FINAL", - 191: "T_EXTENDS", - 192: "T_INTERFACE", - 193: "T_IMPLEMENTS", - 194: "T_VAR", - 195: "T_PUBLIC", - 196: "T_PROTECTED", - 197: "T_PRIVATE", - 198: "T_CONST", - 199: "T_NEW", - 200: "T_INSTEADOF", - 201: "T_ELSEIF", - 202: "T_ELSE", - 203: "T_ENDSWITCH", - 204: "T_CASE", - 205: "T_DEFAULT", - 206: "T_ENDFOR", - 207: "T_ENDFOREACH", - 208: "T_ENDWHILE", - 209: "T_CONSTANT_ENCAPSED_STRING", - 210: "T_LNUMBER", - 211: "T_DNUMBER", - 212: "T_LINE", - 213: "T_FILE", - 214: "T_DIR", - 215: "T_TRAIT_C", - 216: "T_METHOD_C", - 217: "T_FUNC_C", - 218: "T_NS_C", - 219: "T_START_HEREDOC", - 220: "T_END_HEREDOC", - 221: "T_CLASS_C", - 222: "T_VARIABLE", - 223: "T_OPEN_TAG", - 224: "T_OPEN_TAG_WITH_ECHO", - 225: "T_CLOSE_TAG", - 226: "T_WHITESPACE", - 227: "T_COMMENT", - 228: "T_DOC_COMMENT", - 229: "T_ELLIPSIS", - 230: "T_COALESCE", - 231: "T_POW", - 232: "T_POW_EQUAL", - 233: "T_SPACESHIP" - }, - names: { - T_HALT_COMPILER: 101, - T_USE: 102, - T_ENCAPSED_AND_WHITESPACE: 103, - T_OBJECT_OPERATOR: 104, - T_STRING: 105, - T_DOLLAR_OPEN_CURLY_BRACES: 106, - T_STRING_VARNAME: 107, - T_CURLY_OPEN: 108, - T_NUM_STRING: 109, - T_ISSET: 110, - T_EMPTY: 111, - T_INCLUDE: 112, - T_INCLUDE_ONCE: 113, - T_EVAL: 114, - T_REQUIRE: 115, - T_REQUIRE_ONCE: 116, - T_NAMESPACE: 117, - T_NS_SEPARATOR: 118, - T_AS: 119, - T_IF: 120, - T_ENDIF: 121, - T_WHILE: 122, - T_DO: 123, - T_FOR: 124, - T_SWITCH: 125, - T_BREAK: 126, - T_CONTINUE: 127, - T_RETURN: 128, - T_GLOBAL: 129, - T_STATIC: 130, - T_ECHO: 131, - T_INLINE_HTML: 132, - T_UNSET: 133, - T_FOREACH: 134, - T_DECLARE: 135, - T_TRY: 136, - T_THROW: 137, - T_GOTO: 138, - T_FINALLY: 139, - T_CATCH: 140, - T_ENDDECLARE: 141, - T_LIST: 142, - T_CLONE: 143, - T_PLUS_EQUAL: 144, - T_MINUS_EQUAL: 145, - T_MUL_EQUAL: 146, - T_DIV_EQUAL: 147, - T_CONCAT_EQUAL: 148, - T_MOD_EQUAL: 149, - T_AND_EQUAL: 150, - T_OR_EQUAL: 151, - T_XOR_EQUAL: 152, - T_SL_EQUAL: 153, - T_SR_EQUAL: 154, - T_INC: 155, - T_DEC: 156, - T_BOOLEAN_OR: 157, - T_BOOLEAN_AND: 158, - T_LOGICAL_OR: 159, - T_LOGICAL_AND: 160, - T_LOGICAL_XOR: 161, - T_SL: 162, - T_SR: 163, - T_IS_IDENTICAL: 164, - T_IS_NOT_IDENTICAL: 165, - T_IS_EQUAL: 166, - T_IS_NOT_EQUAL: 167, - T_IS_SMALLER_OR_EQUAL: 168, - T_IS_GREATER_OR_EQUAL: 169, - T_INSTANCEOF: 170, - T_INT_CAST: 171, - T_DOUBLE_CAST: 172, - T_STRING_CAST: 173, - T_ARRAY_CAST: 174, - T_OBJECT_CAST: 175, - T_BOOL_CAST: 176, - T_UNSET_CAST: 177, - T_EXIT: 178, - T_PRINT: 179, - T_YIELD: 180, - T_YIELD_FROM: 181, - T_FUNCTION: 182, - T_DOUBLE_ARROW: 183, - T_DOUBLE_COLON: 184, - T_ARRAY: 185, - T_CALLABLE: 186, - T_CLASS: 187, - T_ABSTRACT: 188, - T_TRAIT: 189, - T_FINAL: 190, - T_EXTENDS: 191, - T_INTERFACE: 192, - T_IMPLEMENTS: 193, - T_VAR: 194, - T_PUBLIC: 195, - T_PROTECTED: 196, - T_PRIVATE: 197, - T_CONST: 198, - T_NEW: 199, - T_INSTEADOF: 200, - T_ELSEIF: 201, - T_ELSE: 202, - T_ENDSWITCH: 203, - T_CASE: 204, - T_DEFAULT: 205, - T_ENDFOR: 206, - T_ENDFOREACH: 207, - T_ENDWHILE: 208, - T_CONSTANT_ENCAPSED_STRING: 209, - T_LNUMBER: 210, - T_DNUMBER: 211, - T_LINE: 212, - T_FILE: 213, - T_DIR: 214, - T_TRAIT_C: 215, - T_METHOD_C: 216, - T_FUNC_C: 217, - T_NS_C: 218, - T_START_HEREDOC: 219, - T_END_HEREDOC: 220, - T_CLASS_C: 221, - T_VARIABLE: 222, - T_OPEN_TAG: 223, - T_OPEN_TAG_WITH_ECHO: 224, - T_CLOSE_TAG: 225, - T_WHITESPACE: 226, - T_COMMENT: 227, - T_DOC_COMMENT: 228, - T_ELLIPSIS: 229, - T_COALESCE: 230, - T_POW: 231, - T_POW_EQUAL: 232, - T_SPACESHIP: 233 - } -}; - -/***/ }), -/* 92 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -module.exports = { - /** - * Reads a variable - * - * ```ebnf - * variable ::= &? ...complex @todo - * ``` - * - * Some samples of parsed code : - * ```php - * &$var // simple var - * $var // simple var - * classname::CONST_NAME // dynamic class name with const retrieval - * foo() // function call - * $var->func()->property // chained calls - * ``` - */ - read_variable: function read_variable(read_only, encapsed, byref) { - var result = void 0; - - // check the byref flag - if (!byref && this.token === "&") { - byref = true; - this.next(); - } - - // reads the entry point - if (this.is([this.tok.T_VARIABLE, "$"])) { - result = this.read_reference_variable(encapsed, byref); - } else if (this.is([this.tok.T_NS_SEPARATOR, this.tok.T_STRING, this.tok.T_NAMESPACE])) { - result = this.node(); - var name = this.read_namespace_name(); - if (this.token != this.tok.T_DOUBLE_COLON && this.token != "(") { - // @see parser.js line 130 : resolves a conflict with scalar - var literal = name.name.toLowerCase(); - if (literal === "true") { - result = result("boolean", true, name.name); - } else if (literal === "false") { - result = result("boolean", false, name.name); - } else { - // @todo null keyword ? - result = result("constref", name); - } - } else { - result = name; - } - } else if (this.token === this.tok.T_STATIC) { - result = this.node("constref"); - this.next(); - result = result("static"); - } else { - this.expect("VARIABLE"); - } - - // static mode - if (this.token === this.tok.T_DOUBLE_COLON) { - result = this.read_static_getter(result, encapsed); - } - - return this.recursive_variable_chain_scan(result, read_only, encapsed); - }, - - // resolves a static call - read_static_getter: function read_static_getter(what, encapsed) { - var result = this.node("staticlookup"); - var offset = void 0, - name = void 0; - if (this.next().is([this.tok.T_VARIABLE, "$"])) { - offset = this.read_reference_variable(encapsed, false); - } else if (this.token === this.tok.T_STRING || this.token === this.tok.T_CLASS || this.php7 && this.is("IDENTIFIER")) { - offset = this.node("constref"); - name = this.text(); - this.next(); - offset = offset(name); - } else { - this.error([this.tok.T_VARIABLE, this.tok.T_STRING]); - // graceful mode : set getter as error node and continue - offset = this.node("constref"); - name = this.text(); - this.next(); - offset = offset(name); - } - return result(what, offset); - }, - - recursive_variable_chain_scan: function recursive_variable_chain_scan(result, read_only, encapsed) { - var name = void 0, - node = void 0, - offset = void 0; - recursive_scan_loop: while (this.token != this.EOF) { - switch (this.token) { - case "(": - if (read_only) { - // @fixme : add more informations & test - return result; - } else { - result = this.node("call")(result, this.read_function_argument_list()); - } - break; - case "[": - node = this.node("offsetlookup"); - this.next(); - offset = false; - if (encapsed) { - offset = this.read_encaps_var_offset(); - this.expect("]") && this.next(); - } else { - // callable_variable : https://github.com/php/php-src/blob/493524454d66adde84e00d249d607ecd540de99f/Zend/zend_language_parser.y#L1122 - if (this.token !== "]") { - offset = this.read_expr(); - this.expect("]") && this.next(); - } else { - this.next(); - } - } - result = node(result, offset); - break; - case this.tok.T_DOUBLE_COLON: - // @see https://github.com/glayzzle/php-parser/issues/107#issuecomment-354104574 - if (result.kind === "staticlookup") { - this.error(); - } - - node = this.node("staticlookup"); - if (this.next().token === this.tok.T_STRING || this.php7 && this.is("IDENTIFIER")) { - offset = this.node("constref"); - name = this.text(); - this.next(); - offset = offset(name); - - if (this.token === this.tok.T_OBJECT_OPERATOR) { - this.error(); - } - } else { - this.error(this.tok.T_STRING); - // fallback on a constref node - offset = this.node("constref")(this.text()); - this.next(); - } - result = node(result, offset); - break; - case this.tok.T_OBJECT_OPERATOR: - { - node = this.node("propertylookup"); - var what = null; - switch (this.next().token) { - case this.tok.T_STRING: - what = this.node("constref"); - name = this.text(); - this.next(); - what = what(name); - if (this.token === this.tok.T_VARIABLE) { - var inner = this.node("variable"); - name = this.text().substring(1); - this.next(); - what = this.node("encapsed")([what, inner(name, false, false)], null, "offset"); - if (what.loc && what.value[0].loc) { - what.loc.start = what.value[0].loc.start; - } - } else if (this.token === "{") { - var expr = this.next().read_expr(); - this.expect("}") && this.next(); - what = this.node("encapsed")([what, expr], null, "offset"); - if (what.loc && what.value[0].loc) { - what.loc.start = what.value[0].loc.start; - } - } - break; - case this.tok.T_VARIABLE: - what = this.node("variable"); - name = this.text().substring(1); - this.next(); - what = what(name, false, false); - break; - case "$": - this.next().expect(["{", this.tok.T_VARIABLE]); - if (this.token === "{") { - // $obj->${$varname} - what = this.next().read_expr(); - this.expect("}") && this.next(); - } else { - // $obj->$$varname - what = this.read_expr(); - } - break; - case "{": - what = this.next().read_expr(); - this.expect("}") && this.next(); - break; - default: - this.error([this.tok.T_STRING, this.tok.T_VARIABLE]); - // graceful mode : set what as error mode & continue - what = this.node("constref"); - name = this.text(); - this.next(); - what = what(name); - break; - } - result = node(result, what); - break; - } - default: - break recursive_scan_loop; - } - } - return result; - }, - /** - * https://github.com/php/php-src/blob/493524454d66adde84e00d249d607ecd540de99f/Zend/zend_language_parser.y#L1231 - */ - read_encaps_var_offset: function read_encaps_var_offset() { - var offset = this.node(); - if (this.token === this.tok.T_STRING) { - var text = this.text(); - this.next(); - offset = offset("constref", text); - } else if (this.token === this.tok.T_NUM_STRING) { - var num = this.text(); - this.next(); - offset = offset("number", num, null); - } else if (this.token === this.tok.T_VARIABLE) { - var name = this.text().substring(1); - this.next(); - offset = offset("variable", name, false, false); - } else { - this.expect([this.tok.T_STRING, this.tok.T_NUM_STRING, this.tok.T_VARIABLE]); - // fallback : consider as constref - var _text = this.text(); - this.next(); - offset = offset("constref", _text); - } - return offset; - }, - /** - * ```ebnf - * reference_variable ::= simple_variable ('[' OFFSET ']')* | '{' EXPR '}' - * ``` - * - * $foo[123]; // foo is an array ==> gets its entry - * $foo{1}; // foo is a string ==> get the 2nd char offset - * ${'foo'}[123]; // get the dynamic var $foo - * $foo[123]{1}; // gets the 2nd char from the 123 array entry - * - */ - read_reference_variable: function read_reference_variable(encapsed, byref) { - var result = this.read_simple_variable(byref); - var offset = void 0; - while (this.token != this.EOF) { - var node = this.node(); - if (this.token == "[") { - offset = null; - if (encapsed) { - offset = this.next().read_encaps_var_offset(); - } else { - offset = this.next().token === "]" ? null : this.read_dim_offset(); - } - this.expect("]") && this.next(); - result = node("offsetlookup", result, offset); - } else if (this.token == "{" && !encapsed) { - offset = this.next().read_expr(); - this.expect("}") && this.next(); - result = node("offsetlookup", result, offset); - } else break; - } - return result; - }, - /** - * ```ebnf - * simple_variable ::= T_VARIABLE | '$' '{' expr '}' | '$' simple_variable - * ``` - */ - read_simple_variable: function read_simple_variable(byref) { - var result = this.node("variable"); - var name = void 0; - if (this.expect([this.tok.T_VARIABLE, "$"]) && this.token === this.tok.T_VARIABLE) { - // plain variable name - name = this.text().substring(1); - this.next(); - result = result(name, byref, false); - } else { - if (this.token === "$") this.next(); - // dynamic variable name - switch (this.token) { - case "{": - { - var expr = this.next().read_expr(); - this.expect("}") && this.next(); - result = result(expr, byref, true); - break; - } - case "$": - // $$$var - result = result(this.read_simple_variable(false), byref); - break; - case this.tok.T_VARIABLE: - { - // $$var - name = this.text().substring(1); - var node = this.node("variable"); - this.next(); - result = result(node(name, false, false), byref, false); - break; - } - default: - this.error(["{", "$", this.tok.T_VARIABLE]); - // graceful mode - name = this.text(); - this.next(); - result = result(name, byref, false); - } - } - return result; - } -}; - -/***/ }), -/* 93 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -module.exports = { - /** - * Reads a short form of tokens - * @param {Number} token - The ending token - * @return {Block} - */ - read_short_form: function read_short_form(token) { - var body = this.node("block"); - var items = []; - if (this.expect(":")) this.next(); - while (this.token != this.EOF && this.token !== token) { - items.push(this.read_inner_statement()); - } - if (this.expect(token)) this.next(); - this.expectEndOfStatement(); - return body(null, items); - }, - - /** - * Helper : reads a list of tokens / sample : T_STRING ',' T_STRING ... - * ```ebnf - * list ::= separator? ( item separator )* item - * ``` - */ - read_list: function read_list(item, separator, preserveFirstSeparator) { - var result = []; - - if (this.token == separator) { - if (preserveFirstSeparator) result.push(null); - this.next(); - } - - if (typeof item === "function") { - do { - result.push(item.apply(this, [])); - if (this.token != separator) { - break; - } - } while (this.next().token != this.EOF); - } else { - if (this.expect(item)) { - result.push(this.text()); - } else { - return []; - } - while (this.next().token != this.EOF) { - if (this.token != separator) break; - // trim current separator & check item - if (this.next().token != item) break; - result.push(this.text()); - } - } - return result; - }, - - /** - * Reads a list of names separated by a comma - * - * ```ebnf - * name_list ::= namespace (',' namespace)* - * ``` - * - * Sample code : - * ```php - * 0 ? body(null, items) : null); - } -}; - -/***/ }), -/* 96 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -module.exports = { - /** - * reading a list of top statements (helper for top_statement*) - * ```ebnf - * top_statements ::= top_statement* - * ``` - */ - read_top_statements: function read_top_statements() { - var result = []; - while (this.token !== this.EOF && this.token !== "}") { - var statement = this.read_top_statement(); - if (statement) { - if (Array.isArray(statement)) { - result = result.concat(statement); - } else { - result.push(statement); - } - } - } - return result; - }, - /** - * reading a top statement - * ```ebnf - * top_statement ::= - * namespace | function | class - * | interface | trait - * | use_statements | const_list - * | statement - * ``` - */ - read_top_statement: function read_top_statement() { - switch (this.token) { - case this.tok.T_FUNCTION: - return this.read_function(false, false); - // optional flags - case this.tok.T_ABSTRACT: - case this.tok.T_FINAL: - { - var flag = this.read_class_scope(); - if (this.token === this.tok.T_CLASS) { - return this.read_class(flag); - } else { - this.error(this.tok.T_CLASS); - this.next(); - return null; - } - } - case this.tok.T_CLASS: - return this.read_class([0, 0, 0]); - case this.tok.T_INTERFACE: - return this.read_interface(); - case this.tok.T_TRAIT: - return this.read_trait(); - case this.tok.T_USE: - return this.read_use_statement(); - case this.tok.T_CONST: - return this.next().read_const_list(); - case this.tok.T_NAMESPACE: - return this.read_namespace(); - case this.tok.T_HALT_COMPILER: - { - var result = this.node("halt"); - if (this.next().expect("(")) this.next(); - if (this.expect(")")) this.next(); - this.expect(";"); - this.lexer.done = true; - return result(this.lexer._input.substring(this.lexer.offset)); - } - default: - return this.read_statement(); - } - }, - /** - * reads a list of simple inner statements (helper for inner_statement*) - * ```ebnf - * inner_statements ::= inner_statement* - * ``` - */ - read_inner_statements: function read_inner_statements() { - var result = []; - while (this.token != this.EOF && this.token !== "}") { - var statement = this.read_inner_statement(); - if (statement) { - if (Array.isArray(statement)) { - result = result.concat(statement); - } else { - result.push(statement); - } - } - } - return result; - }, - /** - * Reads a list of constants declaration - * ```ebnf - * const_list ::= T_CONST T_STRING '=' expr (',' T_STRING '=' expr)* ';' - * ``` - */ - read_const_list: function read_const_list() { - var result = this.read_list(function () { - this.expect(this.tok.T_STRING); - var result = this.node("constant"); - var name = this.text(); - if (this.next().expect("=")) { - return result(name, this.next().read_expr()); - } else { - // fallback - return result(name, null); - } - }, ",", false); - this.expectEndOfStatement(); - return result; - }, - /** - * Reads a list of constants declaration - * ```ebnf - * declare_list ::= T_STRING '=' expr (',' T_STRING '=' expr)* - * ``` - * @retrurn {Object} - */ - read_declare_list: function read_declare_list() { - var result = {}; - while (this.token != this.EOF && this.token !== ")") { - this.expect(this.tok.T_STRING); - var name = this.text().toLowerCase(); - if (this.next().expect("=")) { - result[name] = this.next().read_expr(); - } else { - result[name] = null; - } - if (this.token !== ",") break; - this.next(); - } - return result; - }, - /** - * reads a simple inner statement - * ```ebnf - * inner_statement ::= '{' inner_statements '}' | token - * ``` - */ - read_inner_statement: function read_inner_statement() { - switch (this.token) { - case this.tok.T_FUNCTION: - return this.read_function(false, false); - // optional flags - case this.tok.T_ABSTRACT: - case this.tok.T_FINAL: - { - var flag = this.read_class_scope(); - if (this.token === this.tok.T_CLASS) { - return this.read_class(flag); - } else { - this.error(this.tok.T_CLASS); - // graceful mode : ignore token & go next - this.next(); - return null; - } - } - case this.tok.T_CLASS: - return this.read_class([0, 0, 0]); - case this.tok.T_INTERFACE: - return this.read_interface(); - case this.tok.T_TRAIT: - return this.read_trait(); - case this.tok.T_HALT_COMPILER: - { - this.raiseError("__HALT_COMPILER() can only be used from the outermost scope"); - // fallback : returns a node but does not stop the parsing - var node = this.node("halt"); - this.next().expect("(") && this.next(); - this.expect(")") && this.next(); - node = node(this.lexer._input.substring(this.lexer.offset)); - this.expect(";") && this.next(); - return node; - } - default: - return this.read_statement(); - } - }, - /** - * Reads statements - */ - read_statement: function read_statement() { - var result = void 0, - expr = void 0, - items = void 0, - current = void 0, - label = void 0; - switch (this.token) { - case "{": - return this.read_code_block(false); - - case this.tok.T_IF: - return this.read_if(); - - case this.tok.T_SWITCH: - return this.read_switch(); - - case this.tok.T_FOR: - return this.next().read_for(); - - case this.tok.T_FOREACH: - return this.next().read_foreach(); - - case this.tok.T_WHILE: - return this.next().read_while(); - - case this.tok.T_DO: - return this.next().read_do(); - - case this.tok.T_COMMENT: - return this.read_comment(); - - case this.tok.T_DOC_COMMENT: - return this.read_doc_comment(); - - case this.tok.T_RETURN: - result = this.node("return"); - expr = null; - if (!this.next().is("EOS")) { - expr = this.read_expr(); - } - this.expectEndOfStatement(); - return result(expr); - - // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L429 - case this.tok.T_BREAK: - case this.tok.T_CONTINUE: - { - result = this.node(this.token === this.tok.T_CONTINUE ? "continue" : "break"); - var level = null; - this.next(); // look ahead - if (this.token !== ";") { - level = this.read_expr(); - } - this.expectEndOfStatement(); - return result(level); - } - - case this.tok.T_GLOBAL: - result = this.node("global"); - items = this.next().read_list(this.read_simple_variable, ","); - this.expectEndOfStatement(); - return result(items); - - case this.tok.T_STATIC: - current = [this.token, this.lexer.getState()]; - result = this.node("static"); - if (this.next().token === this.tok.T_DOUBLE_COLON) { - // static keyword for a class - this.lexer.tokens.push(current); - expr = this.next().read_expr(); - this.expect(";") && this.next(); - return expr; - } - if (this.token === this.tok.T_FUNCTION) { - return this.read_function(true, [0, 1, 0]); - } - items = this.read_variable_declarations(); - this.expectEndOfStatement(); - return result(items); - - case this.tok.T_ECHO: - { - result = this.node("echo"); - var text = this.text(); - var shortForm = text === " 0 ? this.lexer._input[this.lexer.yylloc.first_offset - 1] : null; - var fixFirstLine = prevChar === "\r" || prevChar === "\n"; - // revert back the first stripped line - if (fixFirstLine) { - if (prevChar === "\n" && this.lexer.yylloc.first_offset > 1 && this.lexer._input[this.lexer.yylloc.first_offset - 2] === "\r") { - prevChar = "\r\n"; - } - } - result = this.node("inline"); - this.next(); - return result(value, fixFirstLine ? prevChar + value : value); - } - - case this.tok.T_UNSET: - result = this.node("unset"); - this.next().expect("(") && this.next(); - items = this.read_list(this.read_variable, ","); - this.expect(")") && this.next(); - this.expect(";") && this.next(); - return result(items); - - case this.tok.T_DECLARE: - { - result = this.node("declare"); - var body = []; - var mode = void 0; - this.next().expect("(") && this.next(); - var what = this.read_declare_list(); - this.expect(")") && this.next(); - if (this.token === ":") { - this.next(); - while (this.token != this.EOF && this.token !== this.tok.T_ENDDECLARE) { - // @todo : check declare_statement from php / not valid - body.push(this.read_top_statement()); - } - this.expect(this.tok.T_ENDDECLARE) && this.next(); - this.expectEndOfStatement(); - mode = this.ast.declare.MODE_SHORT; - } else if (this.token === "{") { - this.next(); - while (this.token != this.EOF && this.token !== "}") { - // @todo : check declare_statement from php / not valid - body.push(this.read_top_statement()); - } - this.expect("}") && this.next(); - mode = this.ast.declare.MODE_BLOCK; - } else { - this.expect(";") && this.next(); - mode = this.ast.declare.MODE_NONE; - } - return result(what, body, mode); - } - - case this.tok.T_TRY: - return this.read_try(); - - case this.tok.T_THROW: - result = this.node("throw"); - expr = this.next().read_expr(); - this.expectEndOfStatement(); - return result(expr); - - case ";": - // ignore this (extra ponctuation) - this.next(); - return null; - - case this.tok.T_STRING: - current = [this.token, this.lexer.getState()]; - label = this.text(); - // AST : https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L457 - if (this.next().token === ":") { - result = this.node("label"); - this.next(); - return result(label); - } - - // default fallback expr / T_STRING '::' (etc...) - this.lexer.tokens.push(current); - expr = this.next().read_expr(); - this.expectEndOfStatement(); - return expr; - - case this.tok.T_GOTO: - result = this.node("goto"); - label = null; - if (this.next().expect(this.tok.T_STRING)) { - label = this.text(); - this.next().expectEndOfStatement(); - } - return result(label); - - default: - // default fallback expr - expr = this.read_expr(); - this.expectEndOfStatement(expr); - return expr; - } - }, - /** - * ```ebnf - * code_block ::= '{' (inner_statements | top_statements) '}' - * ``` - */ - read_code_block: function read_code_block(top) { - var result = this.node("block"); - this.expect("{") && this.next(); - var body = top ? this.read_top_statements() : this.read_inner_statements(); - this.expect("}") && this.next(); - return result(null, body); - } -}; - -/***/ }), -/* 97 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var specialChar = { - "\\r": "\r", - "\\n": "\n", - "\\t": "\t", - "\\v": String.fromCharCode(11), - "\\e": String.fromCharCode(27), - "\\f": String.fromCharCode(12), - "\\\\": "\\", - "\\$": "$", - '\\"': '"', - "\\'": "'" -}; - -module.exports = { - /** - * Unescape special chars - */ - resolve_special_chars: function resolve_special_chars(text, doubleQuote) { - if (!doubleQuote) { - // single quote fix - return text.replace(/\\['\\]/g, function (seq) { - return specialChar[seq]; - }); - } - return text.replace(/\\[rntvef"'\\$]/g, function (seq) { - return specialChar[seq]; - }); - }, - /** - * ```ebnf - * scalar ::= T_MAGIC_CONST - * | T_LNUMBER | T_DNUMBER - * | T_START_HEREDOC T_ENCAPSED_AND_WHITESPACE? T_END_HEREDOC - * | '"' encaps_list '"' - * | T_START_HEREDOC encaps_list T_END_HEREDOC - * | namespace_name (T_DOUBLE_COLON T_STRING)? - * ``` - */ - read_scalar: function read_scalar() { - if (this.is("T_MAGIC_CONST")) { - return this.get_magic_constant(); - } else { - var value = void 0, - node = void 0; - switch (this.token) { - // TEXTS - case this.tok.T_CONSTANT_ENCAPSED_STRING: - { - value = this.node("string"); - var text = this.text(); - var offset = 0; - if (text[0] === "b" || text[0] === "B") { - offset = 1; - } - var isDoubleQuote = text[offset] === '"'; - this.next(); - value = value(isDoubleQuote, this.resolve_special_chars(text.substring(offset + 1, text.length - 1), isDoubleQuote), text); - if (this.token === this.tok.T_DOUBLE_COLON) { - // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L1151 - return this.read_static_getter(value); - } else { - // dirrect string - return value; - } - } - case this.tok.T_START_HEREDOC: - if (this.lexer.curCondition === "ST_NOWDOC") { - var start = this.lexer.yylloc.first_offset; - node = this.node("nowdoc"); - value = this.next().text(); - // strip the last line return char - var lastCh = value[value.length - 1]; - if (lastCh === "\n") { - if (value[value.length - 2] === "\r") { - // windows style - value = value.substring(0, value.length - 2); - } else { - // linux style - value = value.substring(0, value.length - 1); - } - } else if (lastCh === "\r") { - // mac style - value = value.substring(0, value.length - 1); - } - this.expect(this.tok.T_ENCAPSED_AND_WHITESPACE) && this.next(); - var raw = this.lexer._input.substring(start, this.lexer.yylloc.last_offset); - node = node(value, raw, this.lexer.heredoc_label, raw[3] === '"' || raw[3] === "'"); - this.expect(this.tok.T_END_HEREDOC) && this.next(); - return node; - } else { - return this.next().read_encapsed_string(this.tok.T_END_HEREDOC); - } - - case '"': - return this.next().read_encapsed_string('"'); - - case 'b"': - case 'B"': - { - this.next(); - this.lexer.yylloc.prev_offset -= 1; - return this.read_encapsed_string('"'); - } - - // NUMERIC - case this.tok.T_LNUMBER: // long - case this.tok.T_DNUMBER: - { - // double - var result = this.node("number"); - value = this.text(); - this.next(); - return result(value, null); - } - - // ARRAYS - case this.tok.T_ARRAY: - // array parser - return this.read_array(); - case "[": - // short array format - return this.read_array(); - default: - { - var err = this.error("SCALAR"); - // graceful mode : ignore token & return error node - this.next(); - return err; - } - } - } - }, - /** - * Handles the dereferencing - */ - read_dereferencable: function read_dereferencable(expr) { - var result = void 0, - offset = void 0; - var node = this.node("offsetlookup"); - if (this.token === "[") { - offset = this.next().read_expr(); - if (this.expect("]")) this.next(); - result = node(expr, offset); - } else if (this.token === this.tok.T_DOLLAR_OPEN_CURLY_BRACES) { - offset = this.read_encapsed_string_item(false); - result = node(expr, offset); - } - return result; - }, - /** - * Reads and extracts an encapsed item - * ```ebnf - * encapsed_string_item ::= T_ENCAPSED_AND_WHITESPACE - * | T_DOLLAR_OPEN_CURLY_BRACES expr '}' - * | T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME '}' - * | T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME '[' expr ']' '}' - * | T_CURLY_OPEN variable '}' - * | variable - * | variable '[' expr ']' - * | variable T_OBJECT_OPERATOR T_STRING - * ``` - * @return {String|Variable|Expr|Lookup} - * @see https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L1219 - */ - read_encapsed_string_item: function read_encapsed_string_item(isDoubleQuote) { - var result = this.node(), - offset = void 0, - node = void 0, - name = void 0; - - // plain text - // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L1222 - if (this.token === this.tok.T_ENCAPSED_AND_WHITESPACE) { - var text = this.text(); - this.next(); - result = result("string", false, this.resolve_special_chars(text, isDoubleQuote), text); - } else if (this.token === this.tok.T_DOLLAR_OPEN_CURLY_BRACES) { - // dynamic variable name - // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L1239 - name = null; - if (this.next().token === this.tok.T_STRING_VARNAME) { - var varName = this.text(); - name = this.node("variable"); - this.next(); - // check if lookup an offset - // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L1243 - if (this.token === "[") { - name = name(varName, false); - node = this.node("offsetlookup"); - offset = this.next().read_expr(); - this.expect("]") && this.next(); - name = node(name, offset); - } else { - name = this.node("constref")(varName); - } - } else { - name = this.read_expr(); - } - this.expect("}") && this.next(); - result = result("variable", name, false, true); - } else if (this.token === this.tok.T_CURLY_OPEN) { - // expression - // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L1246 - result = this.next().read_variable(false, false, false); - if (result.kind === "variable") { - result.curly = true; - } - this.expect("}") && this.next(); - } else if (this.token === this.tok.T_VARIABLE) { - // plain variable - // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L1231 - result = this.read_simple_variable(false); - - // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L1233 - if (this.token === "[") { - node = this.node("offsetlookup"); - offset = this.next().read_encaps_var_offset(); - this.expect("]") && this.next(); - result = node(result, offset); - } - - // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L1236 - if (this.token === this.tok.T_OBJECT_OPERATOR) { - node = this.node("propertylookup"); - var what = this.node("constref"); - this.next().expect(this.tok.T_STRING); - name = this.text(); - this.next(); - result = node(result, what(name)); - } - - // error / fallback - } else { - this.expect(this.tok.T_ENCAPSED_AND_WHITESPACE); - var value = this.text(); - this.next(); - // consider it as string - result = result("string", false, value, value); - } - - return result; - }, - /** - * Reads an encapsed string - */ - read_encapsed_string: function read_encapsed_string(expect) { - var start = this.lexer.yylloc.prev_offset; - var node = this.node("encapsed"); - var value = []; - var type = null; - - if (expect === "`") { - type = this.ast.encapsed.TYPE_SHELL; - } else if (expect === '"') { - type = this.ast.encapsed.TYPE_STRING; - } else { - type = this.ast.encapsed.TYPE_HEREDOC; - } - - // reading encapsed parts - while (this.token !== expect && this.token !== this.EOF) { - value.push(this.read_encapsed_string_item(true)); - } - - this.expect(expect) && this.next(); - node = node(value, this.lexer._input.substring(start - 1, this.lexer.yylloc.first_offset), type); - - if (expect === this.tok.T_END_HEREDOC) { - node.label = this.lexer.heredoc_label; - } - return node; - }, - /** - * Constant token - */ - get_magic_constant: function get_magic_constant() { - var result = this.node("magic"); - var name = this.text(); - this.next(); - return result(name.toUpperCase(), name); - } -}; - -/***/ }), -/* 98 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -module.exports = { - /** - * Reads a namespace declaration block - * ```ebnf - * namespace ::= T_NAMESPACE namespace_name? '{' - * top_statements - * '}' - * | T_NAMESPACE namespace_name ';' top_statements - * ``` - * @see http://php.net/manual/en/language.namespaces.php - * @return {Namespace} - */ - read_namespace: function read_namespace() { - var result = this.node("namespace"); - var body = void 0; - this.expect(this.tok.T_NAMESPACE) && this.next(); - if (this.token == "{") { - this.currentNamespace = [""]; - body = this.next().read_top_statements(); - this.expect("}") && this.next(); - return result([""], body, true); - } else { - var name = this.read_namespace_name(); - if (this.token == ";") { - this.currentNamespace = name; - body = this.next().read_top_statements(); - this.expect(this.EOF); - return result(name.name, body, false); - } else if (this.token == "{") { - this.currentNamespace = name; - body = this.next().read_top_statements(); - this.expect("}") && this.next(); - return result(name.name, body, true); - } else if (this.token === "(") { - // resolve ambuiguity between namespace & function call - name.resolution = this.ast.identifier.RELATIVE_NAME; - name.name = name.name.substring(1); - return this.node("call")(name, this.read_function_argument_list()); - } else { - this.error(["{", ";"]); - // graceful mode : - this.currentNamespace = name; - body = this.read_top_statements(); - this.expect(this.EOF); - return result(name, body, false); - } - } - }, - /** - * Reads a namespace name - * ```ebnf - * namespace_name ::= T_NS_SEPARATOR? (T_STRING T_NS_SEPARATOR)* T_STRING - * ``` - * @see http://php.net/manual/en/language.namespaces.rules.php - * @return {Identifier} - */ - read_namespace_name: function read_namespace_name() { - var result = this.node("identifier"); - var relative = false; - if (this.token === this.tok.T_NAMESPACE) { - this.next().expect(this.tok.T_NS_SEPARATOR) && this.next(); - relative = true; - } - return result(this.read_list(this.tok.T_STRING, this.tok.T_NS_SEPARATOR, true), relative); - }, - /** - * Reads a use statement - * ```ebnf - * use_statement ::= T_USE - * use_type? use_declarations | - * use_type use_statement '{' use_declarations '}' | - * use_statement '{' use_declarations(=>typed) '}' - * ';' - * ``` - * @see http://php.net/manual/en/language.namespaces.importing.php - * @return {UseGroup} - */ - read_use_statement: function read_use_statement() { - var result = this.node("usegroup"); - var items = []; - var name = null; - this.expect(this.tok.T_USE) && this.next(); - var type = this.read_use_type(); - items.push(this.read_use_declaration(false)); - if (this.token === ",") { - items = items.concat(this.next().read_use_declarations(false)); - } else if (this.token === "{") { - name = items[0].name; - items = this.next().read_use_declarations(type === null); - this.expect("}") && this.next(); - } - result = result(name, type, items); - this.expect(";") && this.next(); - return result; - }, - /** - * Reads a use declaration - * ```ebnf - * use_declaration ::= use_type? namespace_name use_alias - * ``` - * @see https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L380 - * @return {UseItem} - */ - read_use_declaration: function read_use_declaration(typed) { - var result = this.node("useitem"); - var type = null; - if (typed) type = this.read_use_type(); - var name = this.read_namespace_name(); - var alias = this.read_use_alias(); - return result(name.name, alias, type); - }, - /** - * Reads a list of use declarations - * ```ebnf - * use_declarations ::= use_declaration (',' use_declaration)* - * ``` - * @see https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L380 - * @return {UseItem[]} - */ - read_use_declarations: function read_use_declarations(typed) { - var result = [this.read_use_declaration(typed)]; - while (this.token === ",") { - result.push(this.next().read_use_declaration(typed)); - } - return result; - }, - /** - * Reads a use statement - * ```ebnf - * use_alias ::= (T_AS T_STRING)? - * ``` - * @return {String|null} - */ - read_use_alias: function read_use_alias() { - var result = null; - if (this.token === this.tok.T_AS) { - if (this.next().expect(this.tok.T_STRING)) { - result = this.text(); - this.next(); - } - } - return result; - }, - /** - * Reads the namespace type declaration - * ```ebnf - * use_type ::= (T_FUNCTION | T_CONST)? - * ``` - * @see https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L335 - * @return {String|null} Possible values : function, const - */ - read_use_type: function read_use_type() { - if (this.token === this.tok.T_FUNCTION) { - this.next(); - return this.ast.useitem.TYPE_FUNCTION; - } else if (this.token === this.tok.T_CONST) { - this.next(); - return this.ast.useitem.TYPE_CONST; - } - return null; - } -}; - -/***/ }), -/* 99 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -module.exports = { - /** - * ```ebnf - * start ::= (namespace | top_statement)* - * ``` - */ - read_start: function read_start() { - if (this.token == this.tok.T_NAMESPACE) { - return this.read_namespace(); - } else { - return this.read_top_statement(); - } - } -}; - -/***/ }), -/* 100 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -module.exports = { - /** - * Reads a while statement - * ```ebnf - * while ::= T_WHILE (statement | ':' inner_statement_list T_ENDWHILE ';') - * ``` - * @see https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L587 - * @return {While} - */ - read_while: function read_while() { - var result = this.node("while"); - var test = null; - var body = null; - var shortForm = false; - if (this.expect("(")) this.next(); - test = this.read_expr(); - if (this.expect(")")) this.next(); - if (this.token === ":") { - shortForm = true; - body = this.read_short_form(this.tok.T_ENDWHILE); - } else { - body = this.read_statement(); - } - return result(test, body, shortForm); - }, - /** - * Reads a do / while loop - * ```ebnf - * do ::= T_DO statement T_WHILE '(' expr ')' ';' - * ``` - * @see https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L423 - * @return {Do} - */ - read_do: function read_do() { - var result = this.node("do"); - var test = null; - var body = null; - body = this.read_statement(); - if (this.expect(this.tok.T_WHILE)) { - if (this.next().expect("(")) this.next(); - test = this.read_expr(); - if (this.expect(")")) this.next(); - if (this.expect(";")) this.next(); - } - return result(test, body); - }, - /** - * Read a for incremental loop - * ```ebnf - * for ::= T_FOR '(' for_exprs ';' for_exprs ';' for_exprs ')' for_statement - * for_statement ::= statement | ':' inner_statement_list T_ENDFOR ';' - * for_exprs ::= expr? (',' expr)* - * ``` - * @see https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L425 - * @return {For} - */ - read_for: function read_for() { - var result = this.node("for"); - var init = []; - var test = []; - var increment = []; - var body = null; - var shortForm = false; - if (this.expect("(")) this.next(); - if (this.token !== ";") { - init = this.read_list(this.read_expr, ","); - if (this.expect(";")) this.next(); - } else { - this.next(); - } - if (this.token !== ";") { - test = this.read_list(this.read_expr, ","); - if (this.expect(";")) this.next(); - } else { - this.next(); - } - if (this.token !== ")") { - increment = this.read_list(this.read_expr, ","); - if (this.expect(")")) this.next(); - } else { - this.next(); - } - if (this.token === ":") { - shortForm = true; - body = this.read_short_form(this.tok.T_ENDFOR); - } else { - body = this.read_statement(); - } - return result(init, test, increment, body, shortForm); - }, - /** - * Reads a foreach loop - * ```ebnf - * foreach ::= '(' expr T_AS foreach_variable (T_DOUBLE_ARROW foreach_variable)? ')' statement - * ``` - * @see https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L438 - * @return {Foreach} - */ - read_foreach: function read_foreach() { - var result = this.node("foreach"); - var source = null; - var key = null; - var value = null; - var body = null; - var shortForm = false; - if (this.expect("(")) this.next(); - source = this.read_expr(); - if (this.expect(this.tok.T_AS)) { - this.next(); - value = this.read_foreach_variable(); - if (this.token === this.tok.T_DOUBLE_ARROW) { - key = value; - value = this.next().read_foreach_variable(); - } - } - - // grammatically correct but not supported by PHP - if (key && key.kind === "list") { - this.raiseError("Fatal Error : Cannot use list as key element"); - } - - if (this.expect(")")) this.next(); - - if (this.token === ":") { - shortForm = true; - body = this.read_short_form(this.tok.T_ENDFOREACH); - } else { - body = this.read_statement(); - } - return result(source, key, value, body, shortForm); - }, - /** - * Reads a foreach variable statement - * ```ebnf - * foreach_variable = - * variable | - * '&' variable | - * T_LIST '(' assignment_list ')' | - * '[' assignment_list ']' - * ``` - * @see https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L544 - * @return {Expression} - */ - read_foreach_variable: function read_foreach_variable() { - if (this.token === this.tok.T_LIST || this.token === "[") { - var isShort = this.token === "["; - var result = this.node("list"); - this.next(); - if (!isShort && this.expect("(")) this.next(); - var assignList = this.read_array_pair_list(isShort); - if (this.expect(isShort ? "]" : ")")) this.next(); - return result(assignList, isShort); - } else { - return this.read_variable(false, false, false); - } - } -}; - -/***/ }), -/* 101 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -module.exports = { - /** - * Reads an IF statement - * - * ```ebnf - * if ::= T_IF '(' expr ')' ':' ... - * ``` - */ - read_if: function read_if() { - var result = this.node("if"); - var body = null; - var alternate = null; - var shortForm = false; - var test = null; - test = this.next().read_if_expr(); - - if (this.token === ":") { - shortForm = true; - this.next(); - body = this.node("block"); - var items = []; - while (this.token !== this.EOF && this.token !== this.tok.T_ENDIF) { - if (this.token === this.tok.T_ELSEIF) { - alternate = this.read_elseif_short(); - break; - } else if (this.token === this.tok.T_ELSE) { - alternate = this.read_else_short(); - break; - } - items.push(this.read_inner_statement()); - } - body = body(null, items); - this.expect(this.tok.T_ENDIF) && this.next(); - this.expectEndOfStatement(); - } else { - body = this.read_statement(); - if (this.token === this.tok.T_ELSEIF) { - alternate = this.read_if(); - } else if (this.token === this.tok.T_ELSE) { - alternate = this.next().read_statement(); - } - } - return result(test, body, alternate, shortForm); - }, - /** - * reads an if expression : '(' expr ')' - */ - read_if_expr: function read_if_expr() { - this.expect("(") && this.next(); - var result = this.read_expr(); - this.expect(")") && this.next(); - return result; - }, - /** - * reads an elseif (expr): statements - */ - read_elseif_short: function read_elseif_short() { - var result = this.node("if"); - var alternate = null; - var test = null; - var body = null; - var items = []; - test = this.next().read_if_expr(); - if (this.expect(":")) this.next(); - body = this.node("block"); - while (this.token != this.EOF && this.token !== this.tok.T_ENDIF) { - if (this.token === this.tok.T_ELSEIF) { - alternate = this.read_elseif_short(); - break; - } else if (this.token === this.tok.T_ELSE) { - alternate = this.read_else_short(); - break; - } - items.push(this.read_inner_statement()); - } - body = body(null, items); - return result(test, body, alternate, true); - }, - /** - * - */ - read_else_short: function read_else_short() { - var body = this.node("block"); - if (this.next().expect(":")) this.next(); - var items = []; - while (this.token != this.EOF && this.token !== this.tok.T_ENDIF) { - items.push(this.read_inner_statement()); - } - return body(null, items); - } -}; - -/***/ }), -/* 102 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -module.exports = { - /** - * checks if current token is a reference keyword - */ - is_reference: function is_reference() { - if (this.token == "&") { - this.next(); - return true; - } - return false; - }, - /** - * checks if current token is a variadic keyword - */ - is_variadic: function is_variadic() { - if (this.token === this.tok.T_ELLIPSIS) { - this.next(); - return true; - } - return false; - }, - /** - * reading a function - * ```ebnf - * function ::= function_declaration code_block - * ``` - */ - read_function: function read_function(closure, flag) { - var result = this.read_function_declaration(closure ? 1 : flag ? 2 : 0, flag && flag[1] === 1); - if (flag && flag[2] == 1) { - // abstract function : - result.parseFlags(flag); - if (this.expect(";")) { - this.next(); - } - } else { - if (this.expect("{")) { - result.body = this.read_code_block(false); - if (result.loc && result.body.loc) { - result.loc.end = result.body.loc.end; - } - } - if (!closure && flag) { - result.parseFlags(flag); - } - } - return result; - }, - /** - * reads a function declaration (without his body) - * ```ebnf - * function_declaration ::= T_FUNCTION '&'? T_STRING '(' parameter_list ')' - * ``` - */ - read_function_declaration: function read_function_declaration(type, isStatic) { - var nodeName = "function"; - if (type === 1) { - nodeName = "closure"; - } else if (type === 2) { - nodeName = "method"; - } - var result = this.node(nodeName); - - if (this.expect(this.tok.T_FUNCTION)) { - this.next(); - } - var isRef = this.is_reference(); - var name = false, - use = [], - returnType = null, - nullable = false; - if (type !== 1) { - if (type === 2) { - if (this.token === this.tok.T_STRING || this.php7 && this.is("IDENTIFIER")) { - name = this.text(); - this.next(); - } else { - this.error("IDENTIFIER"); - } - } else { - if (this.expect(this.tok.T_STRING)) { - name = this.text(); - } - this.next(); - } - } - if (this.expect("(")) this.next(); - var params = this.read_parameter_list(); - if (this.expect(")")) this.next(); - if (type === 1 && this.token === this.tok.T_USE) { - if (this.next().expect("(")) this.next(); - use = this.read_list(this.read_lexical_var, ","); - if (this.expect(")")) this.next(); - } - if (this.token === ":") { - if (this.next().token === "?") { - nullable = true; - this.next(); - } - returnType = this.read_type(); - } - if (type === 1) { - // closure - return result(params, isRef, use, returnType, nullable, isStatic); - } - return result(name, params, isRef, returnType, nullable); - }, - /** - * ```ebnf - * lexical_var ::= '&'? T_VARIABLE - * ``` - */ - read_lexical_var: function read_lexical_var() { - var result = this.node("variable"); - var isRef = false; - if (this.token === "&") { - isRef = true; - this.next(); - } - this.expect(this.tok.T_VARIABLE); - var name = this.text().substring(1); - this.next(); - return result(name, isRef, false); - }, - /** - * reads a list of parameters - * ```ebnf - * parameter_list ::= (parameter ',')* parameter? - * ``` - */ - read_parameter_list: function read_parameter_list() { - var result = []; - if (this.token != ")") { - while (this.token != this.EOF) { - result.push(this.read_parameter()); - if (this.token == ",") { - this.next(); - } else if (this.token == ")") { - break; - } else { - this.error([",", ")"]); - break; - } - } - } - return result; - }, - /** - * ```ebnf - * parameter ::= type? '&'? T_ELLIPSIS? T_VARIABLE ('=' expr)? - * ``` - * @see https://github.com/php/php-src/blob/493524454d66adde84e00d249d607ecd540de99f/Zend/zend_language_parser.y#L640 - */ - read_parameter: function read_parameter() { - var node = this.node("parameter"); - var name = null; - var value = null; - var type = null; - var nullable = false; - if (this.token === "?") { - this.next(); - nullable = true; - } - type = this.read_type(); - if (nullable && !type) { - this.raiseError("Expecting a type definition combined with nullable operator"); - } - var isRef = this.is_reference(); - var isVariadic = this.is_variadic(); - if (this.expect(this.tok.T_VARIABLE)) { - name = this.text().substring(1); - this.next(); - } - if (this.token == "=") { - value = this.next().read_expr(); - } - return node(name, type, value, isRef, isVariadic, nullable); - }, - /** - * Reads a list of arguments - * ```ebnf - * function_argument_list ::= '(' (argument_list (',' argument_list)*)? ')' - * ``` - */ - read_function_argument_list: function read_function_argument_list() { - var result = []; - var wasVariadic = false; - this.expect("(") && this.next(); - if (this.token !== ")") { - while (this.token != this.EOF) { - var argument = this.read_argument_list(); - if (argument) { - result.push(argument); - if (argument.kind === "variadic") { - wasVariadic = true; - } else if (wasVariadic) { - this.raiseError("Unexpected argument after a variadic argument"); - } - } - if (this.token === ",") { - this.next(); - } else break; - } - } - this.expect(")") && this.next(); - return result; - }, - /** - * ```ebnf - * argument_list ::= T_ELLIPSIS? expr - * ``` - */ - read_argument_list: function read_argument_list() { - if (this.token === this.tok.T_ELLIPSIS) { - return this.node("variadic")(this.next().read_expr()); - } - return this.read_expr(); - }, - /** - * read type hinting - * ```ebnf - * type ::= T_ARRAY | T_CALLABLE | namespace_name - * ``` - */ - read_type: function read_type() { - var result = this.node("identifier"); - switch (this.token) { - case this.tok.T_ARRAY: - this.next(); - return result(["", "array"], false); - case this.tok.T_NAMESPACE: - case this.tok.T_NS_SEPARATOR: - case this.tok.T_STRING: - return this.read_namespace_name(); - case this.tok.T_CALLABLE: - this.next(); - return result(["", "callable"], false); - default: - return null; - } - } -}; - -/***/ }), -/* 103 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -module.exports = { - read_expr: function read_expr() { - var result = this.node(); - var expr = this.read_expr_item(); - // binary operations - if (this.token === "|") return result("bin", "|", expr, this.next().read_expr()); - if (this.token === "&") return result("bin", "&", expr, this.next().read_expr()); - if (this.token === "^") return result("bin", "^", expr, this.next().read_expr()); - if (this.token === ".") return result("bin", ".", expr, this.next().read_expr()); - if (this.token === "+") return result("bin", "+", expr, this.next().read_expr()); - if (this.token === "-") return result("bin", "-", expr, this.next().read_expr()); - if (this.token === "*") return result("bin", "*", expr, this.next().read_expr()); - if (this.token === "/") return result("bin", "/", expr, this.next().read_expr()); - if (this.token === "%") return result("bin", "%", expr, this.next().read_expr()); - if (this.token === this.tok.T_POW) return result("bin", "**", expr, this.next().read_expr()); - if (this.token === this.tok.T_SL) return result("bin", "<<", expr, this.next().read_expr()); - if (this.token === this.tok.T_SR) return result("bin", ">>", expr, this.next().read_expr()); - // more binary operations (formerly bool) - if (this.token === this.tok.T_BOOLEAN_OR) return result("bin", "||", expr, this.next().read_expr()); - if (this.token === this.tok.T_LOGICAL_OR) return result("bin", "or", expr, this.next().read_expr()); - if (this.token === this.tok.T_BOOLEAN_AND) return result("bin", "&&", expr, this.next().read_expr()); - if (this.token === this.tok.T_LOGICAL_AND) return result("bin", "and", expr, this.next().read_expr()); - if (this.token === this.tok.T_LOGICAL_XOR) return result("bin", "xor", expr, this.next().read_expr()); - if (this.token === this.tok.T_IS_IDENTICAL) return result("bin", "===", expr, this.next().read_expr()); - if (this.token === this.tok.T_IS_NOT_IDENTICAL) return result("bin", "!==", expr, this.next().read_expr()); - if (this.token === this.tok.T_IS_EQUAL) return result("bin", "==", expr, this.next().read_expr()); - if (this.token === this.tok.T_IS_NOT_EQUAL) return result("bin", "!=", expr, this.next().read_expr()); - if (this.token === "<") return result("bin", "<", expr, this.next().read_expr()); - if (this.token === ">") return result("bin", ">", expr, this.next().read_expr()); - if (this.token === this.tok.T_IS_SMALLER_OR_EQUAL) return result("bin", "<=", expr, this.next().read_expr()); - if (this.token === this.tok.T_IS_GREATER_OR_EQUAL) return result("bin", ">=", expr, this.next().read_expr()); - if (this.token === this.tok.T_SPACESHIP) return result("bin", "<=>", expr, this.next().read_expr()); - if (this.token === this.tok.T_INSTANCEOF) return result("bin", "instanceof", expr, this.next().read_expr()); - - // extra operations : - // $username = $_GET['user'] ?? 'nobody'; - if (this.token === this.tok.T_COALESCE) return result("bin", "??", expr, this.next().read_expr()); - - // extra operations : - // $username = $_GET['user'] ? true : false; - if (this.token === "?") { - var trueArg = null; - if (this.next().token !== ":") { - trueArg = this.read_expr(); - } - this.expect(":") && this.next(); - return result("retif", expr, trueArg, this.read_expr()); - } - - return expr; - }, - - /** - * ```ebnf - * Reads an expression - * expr ::= @todo - * ``` - */ - read_expr_item: function read_expr_item() { - var result = void 0, - expr = void 0; - if (this.token === "@") return this.node("silent")(this.next().read_expr()); - if (this.token === "+") return this.node("unary")("+", this.next().read_expr()); - if (this.token === "!") return this.node("unary")("!", this.next().read_expr()); - if (this.token === "~") return this.node("unary")("~", this.next().read_expr()); - - if (this.token === "-") { - result = this.node(); - this.next(); - if (this.token === this.tok.T_LNUMBER || this.token === this.tok.T_DNUMBER) { - // negative number - result = result("number", "-" + this.text(), null); - this.next(); - return result; - } else { - return result("unary", "-", this.read_expr()); - } - } - - if (this.token === "(") { - var node = this.node("parenthesis"); - expr = this.next().read_expr(); - this.expect(")") && this.next(); - return this.handleDereferencable(node(expr)); - } - - if (this.token === "`") { - // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L1048 - return this.next().read_encapsed_string("`"); - } - - if (this.token === this.tok.T_LIST) { - var assign = null; - var isInner = this.innerList; - result = this.node("list"); - if (!isInner) { - assign = this.node("assign"); - } - if (this.next().expect("(")) { - this.next(); - } - - if (!this.innerList) this.innerList = true; - - // reads inner items - var assignList = this.read_array_pair_list(false); - if (this.expect(")")) { - this.next(); - } - - // check if contains at least one assignment statement - var hasItem = false; - for (var i = 0; i < assignList.length; i++) { - if (assignList[i] !== null) { - hasItem = true; - break; - } - } - if (!hasItem) { - this.raiseError("Fatal Error : Cannot use empty list on line " + this.lexer.yylloc.first_line); - } - - // handles the node resolution - if (!isInner) { - this.innerList = false; - if (this.expect("=")) { - return assign(result(assignList, false), this.next().read_expr(), "="); - } else { - // error fallback : list($a, $b); - return result(assignList, false); - } - } else { - return result(assignList, false); - } - } - - if (this.token === this.tok.T_CLONE) return this.node("clone")(this.next().read_expr()); - - switch (this.token) { - case this.tok.T_INC: - return this.node("pre")("+", this.next().read_variable(false, false, false)); - - case this.tok.T_DEC: - return this.node("pre")("-", this.next().read_variable(false, false, false)); - - case this.tok.T_NEW: - return this.next().read_new_expr(); - - case this.tok.T_ISSET: - { - result = this.node("isset"); - if (this.next().expect("(")) { - this.next(); - } - var args = this.read_list(this.read_expr, ","); - if (this.expect(")")) { - this.next(); - } - return result(args); - } - case this.tok.T_EMPTY: - { - result = this.node("empty"); - if (this.next().expect("(")) { - this.next(); - } - var arg = this.read_expr(); - if (this.expect(")")) { - this.next(); - } - return result([arg]); - } - case this.tok.T_INCLUDE: - return this.node("include")(false, false, this.next().read_expr()); - - case this.tok.T_INCLUDE_ONCE: - return this.node("include")(true, false, this.next().read_expr()); - - case this.tok.T_REQUIRE: - return this.node("include")(false, true, this.next().read_expr()); - - case this.tok.T_REQUIRE_ONCE: - return this.node("include")(true, true, this.next().read_expr()); - - case this.tok.T_EVAL: - result = this.node("eval"); - if (this.next().expect("(")) { - this.next(); - } - expr = this.read_expr(); - if (this.expect(")")) { - this.next(); - } - return result(expr); - - case this.tok.T_INT_CAST: - return this.node("cast")("int", this.next().read_expr()); - - case this.tok.T_DOUBLE_CAST: - return this.node("cast")("float", this.next().read_expr()); - - case this.tok.T_STRING_CAST: - return this.node("cast")("string", this.next().read_expr()); - - case this.tok.T_ARRAY_CAST: - return this.node("cast")("array", this.next().read_expr()); - - case this.tok.T_OBJECT_CAST: - return this.node("cast")("object", this.next().read_expr()); - - case this.tok.T_BOOL_CAST: - return this.node("cast")("bool", this.next().read_expr()); - - case this.tok.T_UNSET_CAST: - return this.node("cast")("unset", this.next().read_expr()); - - case this.tok.T_EXIT: - { - var useDie = this.lexer.yytext.toLowerCase() === "die"; - result = this.node("exit"); - var status = null; - if (this.next().token === "(") { - if (this.next().token !== ")") { - status = this.read_expr(); - if (this.expect(")")) { - this.next(); - } - } else { - this.next(); - } - } - return result(status, useDie); - } - - case this.tok.T_PRINT: - return this.node("print")(this.next().read_expr()); - - // T_YIELD (expr (T_DOUBLE_ARROW expr)?)? - case this.tok.T_YIELD: - { - var value = null; - var key = null; - result = this.node("yield"); - if (this.next().is("EXPR")) { - // reads the yield return value - value = this.read_expr(); - if (this.token === this.tok.T_DOUBLE_ARROW) { - // reads the yield returned key - key = value; - value = this.next().read_expr(); - } - } - return result(value, key); - } - - // T_YIELD_FROM expr - case this.tok.T_YIELD_FROM: - result = this.node("yieldfrom"); - expr = this.next().read_expr(); - return result(expr); - - case this.tok.T_FUNCTION: - return this.read_function(true); - - case this.tok.T_STATIC: - { - var backup = [this.token, this.lexer.getState()]; - if (this.next().token === this.tok.T_FUNCTION) { - // handles static function - return this.read_function(true, [0, 1, 0]); - } else { - // rollback - this.lexer.tokens.push(backup); - this.next(); - } - } - } - - // SCALAR | VARIABLE - if (this.is("VARIABLE")) { - result = this.node(); - expr = this.read_variable(false, false, false); - - // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L877 - // should accept only a variable - var isConst = expr.kind === "constref" || expr.kind === "staticlookup" && expr.offset.kind === "constref"; - - // VARIABLES SPECIFIC OPERATIONS - switch (this.token) { - case "=": - { - if (isConst) this.error("VARIABLE"); - var right = void 0; - if (this.next().token == "&") { - if (this.next().token === this.tok.T_NEW) { - right = this.next().read_new_expr(); - } else { - right = this.read_variable(false, false, true); - } - } else { - right = this.read_expr(); - } - return result("assign", expr, right, "="); - } - - // operations : - case this.tok.T_PLUS_EQUAL: - if (isConst) this.error("VARIABLE"); - return result("assign", expr, this.next().read_expr(), "+="); - - case this.tok.T_MINUS_EQUAL: - if (isConst) this.error("VARIABLE"); - return result("assign", expr, this.next().read_expr(), "-="); - - case this.tok.T_MUL_EQUAL: - if (isConst) this.error("VARIABLE"); - return result("assign", expr, this.next().read_expr(), "*="); - - case this.tok.T_POW_EQUAL: - if (isConst) this.error("VARIABLE"); - return result("assign", expr, this.next().read_expr(), "**="); - - case this.tok.T_DIV_EQUAL: - if (isConst) this.error("VARIABLE"); - return result("assign", expr, this.next().read_expr(), "/="); - - case this.tok.T_CONCAT_EQUAL: - if (isConst) this.error("VARIABLE"); - return result("assign", expr, this.next().read_expr(), ".="); - - case this.tok.T_MOD_EQUAL: - if (isConst) this.error("VARIABLE"); - return result("assign", expr, this.next().read_expr(), "%="); - - case this.tok.T_AND_EQUAL: - if (isConst) this.error("VARIABLE"); - return result("assign", expr, this.next().read_expr(), "&="); - - case this.tok.T_OR_EQUAL: - if (isConst) this.error("VARIABLE"); - return result("assign", expr, this.next().read_expr(), "|="); - - case this.tok.T_XOR_EQUAL: - if (isConst) this.error("VARIABLE"); - return result("assign", expr, this.next().read_expr(), "^="); - - case this.tok.T_SL_EQUAL: - if (isConst) this.error("VARIABLE"); - return result("assign", expr, this.next().read_expr(), "<<="); - - case this.tok.T_SR_EQUAL: - if (isConst) this.error("VARIABLE"); - return result("assign", expr, this.next().read_expr(), ">>="); - - case this.tok.T_INC: - if (isConst) this.error("VARIABLE"); - this.next(); - return result("post", "+", expr); - case this.tok.T_DEC: - if (isConst) this.error("VARIABLE"); - this.next(); - return result("post", "-", expr); - } - } else if (this.is("SCALAR")) { - result = this.node(); - expr = this.read_scalar(); - if (expr.kind === "array" && expr.shortForm && this.token === "=") { - // list assign - var list = this.node("list")(expr.items, true); - if (expr.loc) list.loc = expr.loc; - var _right = this.next().read_expr(); - return result("assign", list, _right, "="); - } - // classic array - return this.handleDereferencable(expr); - } else { - this.error("EXPR"); - this.next(); - } - - // returns variable | scalar - return expr; - }, - /** - * ```ebnf - * new_expr ::= T_NEW (namespace_name function_argument_list) | (T_CLASS ... class declaration) - * ``` - * https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L850 - */ - read_new_expr: function read_new_expr() { - var result = this.node("new"); - var args = []; - if (this.token === this.tok.T_CLASS) { - var what = this.node("class"); - // Annonymous class declaration - var propExtends = null, - propImplements = null, - body = null; - if (this.next().token === "(") { - args = this.read_function_argument_list(); - } - if (this.token == this.tok.T_EXTENDS) { - propExtends = this.next().read_namespace_name(); - } - if (this.token == this.tok.T_IMPLEMENTS) { - propImplements = this.next().read_name_list(); - } - if (this.expect("{")) { - body = this.next().read_class_body(); - } - return result(what(null, propExtends, propImplements, body, [0, 0, 0]), args); - } - // Already existing class - var name = this.read_class_name_reference(); - if (this.token === "(") { - args = this.read_function_argument_list(); - } - return result(name, args); - }, - /** - * Reads a class name - * ```ebnf - * class_name_reference ::= namespace_name | variable - * ``` - */ - read_class_name_reference: function read_class_name_reference() { - if (this.token === this.tok.T_NS_SEPARATOR || this.token === this.tok.T_STRING || this.token === this.tok.T_NAMESPACE) { - var result = this.read_namespace_name(); - if (this.token === this.tok.T_DOUBLE_COLON) { - result = this.read_static_getter(result); - } - return result; - } else if (this.is("VARIABLE")) { - return this.read_variable(true, false, false); - } else { - this.expect([this.tok.T_STRING, "VARIABLE"]); - } - }, - handleDereferencable: function handleDereferencable(expr) { - while (this.token !== this.EOF) { - if (this.token === this.tok.T_OBJECT_OPERATOR) { - expr = this.recursive_variable_chain_scan(expr, false); - } else if (this.token === this.tok.T_CURLY_OPEN || this.token === "[") { - expr = this.read_dereferencable(expr); - } else if (this.token === "(") { - // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L1118 - expr = this.node("call")(expr, this.read_function_argument_list()); - } else { - return expr; - } - } - return expr; - } -}; - -/***/ }), -/* 104 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -module.exports = { - /** - * Comments with // or # or / * ... * / - */ - read_comment: function read_comment() { - var text = this.text(); - var result = this.ast.prepare(text.substring(0, 2) === "/*" ? "commentblock" : "commentline", null, this); - // handle location on comment - var prev = this.prev; - this.prev = [this.lexer.yylloc.last_line, this.lexer.yylloc.last_column, this.lexer.offset]; - this.lex(); - result = result(text); - this.prev = prev; - return result; - }, - /** - * Comments with / ** ... * / - */ - read_doc_comment: function read_doc_comment() { - var result = this.ast.prepare("commentblock", null, this); - var text = this.text(); - var prev = this.prev; - this.prev = [this.lexer.yylloc.last_line, this.lexer.yylloc.last_column, this.lexer.offset]; - this.lex(); - result = result(text); - this.prev = prev; - return result; - } -}; - -/***/ }), -/* 105 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -module.exports = { - /** - * reading a class - * ```ebnf - * class ::= class_scope? T_CLASS T_STRING (T_EXTENDS NAMESPACE_NAME)? (T_IMPLEMENTS (NAMESPACE_NAME ',')* NAMESPACE_NAME)? '{' CLASS_BODY '}' - * ``` - */ - read_class: function read_class(flag) { - var result = this.node("class"); - this.expect(this.tok.T_CLASS); - this.next().expect(this.tok.T_STRING); - var propName = this.text(); - var propExtends = null; - var propImplements = null; - if (this.next().token == this.tok.T_EXTENDS) { - propExtends = this.next().read_namespace_name(); - } - if (this.token == this.tok.T_IMPLEMENTS) { - propImplements = this.next().read_name_list(); - } - this.expect("{"); - var body = this.next().read_class_body(); - return result(propName, propExtends, propImplements, body, flag); - }, - /** - * Read the class visibility - * ```ebnf - * class_scope ::= (T_FINAL | T_ABSTRACT)? - * ``` - */ - read_class_scope: function read_class_scope() { - var result = this.token; - if (result == this.tok.T_FINAL) { - this.next(); - return [0, 0, 2]; - } else if (result == this.tok.T_ABSTRACT) { - this.next(); - return [0, 0, 1]; - } - return [0, 0, 0]; - }, - /** - * Reads a class body - * ```ebnf - * class_body ::= (member_flags? (T_VAR | T_STRING | T_FUNCTION))* - * ``` - */ - read_class_body: function read_class_body() { - var result = []; - - while (this.token !== this.EOF && this.token !== "}") { - if (this.token === this.tok.T_COMMENT) { - result.push(this.read_comment()); - continue; - } - - if (this.token === this.tok.T_DOC_COMMENT) { - result.push(this.read_doc_comment()); - continue; - } - - // check T_USE trait - if (this.token === this.tok.T_USE) { - result = result.concat(this.next().read_trait_use_statement()); - continue; - } - - // read member flags - var flags = this.read_member_flags(false); - - // check constant - if (this.token === this.tok.T_CONST) { - var constants = this.read_constant_list(flags); - if (this.expect(";")) { - this.next(); - } - result = result.concat(constants); - continue; - } - - // jump over T_VAR then land on T_VARIABLE - if (this.token === this.tok.T_VAR) { - this.next().expect(this.tok.T_VARIABLE); - flags[0] = flags[1] = 0; // public & non static var - } - - if (this.token === this.tok.T_VARIABLE) { - // reads a variable - var variables = this.read_variable_list(flags); - this.expect(";"); - this.next(); - result = result.concat(variables); - } else if (this.token === this.tok.T_FUNCTION) { - // reads a function - result.push(this.read_function(false, flags)); - } else { - // raise an error - this.error([this.tok.T_CONST, this.tok.T_VARIABLE, this.tok.T_FUNCTION]); - // ignore token - this.next(); - } - } - this.expect("}"); - this.next(); - return result; - }, - /** - * Reads variable list - * ```ebnf - * variable_list ::= (variable_declaration ',')* variable_declaration - * ``` - */ - read_variable_list: function read_variable_list(flags) { - return this.read_list( - /** - * Reads a variable declaration - * - * ```ebnf - * variable_declaration ::= T_VARIABLE '=' scalar - * ``` - */ - function read_variable_declaration() { - var result = this.node("property"); - this.expect(this.tok.T_VARIABLE); - var name = this.text().substring(1); // ignore $ - this.next(); - if (this.token === ";" || this.token === ",") { - return result(name, null, flags); - } else if (this.token === "=") { - // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L815 - return result(name, this.next().read_expr(), flags); - } else { - this.expect([",", ";", "="]); - return result(name, null, flags); - } - }, ","); - }, - /** - * Reads constant list - * ```ebnf - * constant_list ::= T_CONST (constant_declaration ',')* constant_declaration - * ``` - */ - read_constant_list: function read_constant_list(flags) { - if (this.expect(this.tok.T_CONST)) { - this.next(); - } - return this.read_list( - /** - * Reads a constant declaration - * - * ```ebnf - * constant_declaration ::= (T_STRING | IDENTIFIER) '=' expr - * ``` - * @return {Constant} [:link:](AST.md#constant) - */ - function read_constant_declaration() { - var result = this.node("classconstant"); - var name = null; - var value = null; - if (this.token === this.tok.T_STRING || this.php7 && this.is("IDENTIFIER")) { - name = this.text(); - this.next(); - } else { - this.expect("IDENTIFIER"); - } - if (this.expect("=")) { - value = this.next().read_expr(); - } - return result(name, value, flags); - }, ","); - }, - /** - * Read member flags - * @return array - * 1st index : 0 => public, 1 => protected, 2 => private - * 2nd index : 0 => instance member, 1 => static member - * 3rd index : 0 => normal, 1 => abstract member, 2 => final member - */ - read_member_flags: function read_member_flags(asInterface) { - var result = [-1, -1, -1]; - if (this.is("T_MEMBER_FLAGS")) { - var idx = 0, - val = 0; - do { - switch (this.token) { - case this.tok.T_PUBLIC: - idx = 0; - val = 0; - break; - case this.tok.T_PROTECTED: - idx = 0; - val = 1; - break; - case this.tok.T_PRIVATE: - idx = 0; - val = 2; - break; - case this.tok.T_STATIC: - idx = 1; - val = 1; - break; - case this.tok.T_ABSTRACT: - idx = 2; - val = 1; - break; - case this.tok.T_FINAL: - idx = 2; - val = 2; - break; - } - if (asInterface) { - if (idx == 0 && val == 2) { - // an interface can't be private - this.expect([this.tok.T_PUBLIC, this.tok.T_PROTECTED]); - val = -1; - } else if (idx == 2 && val == 1) { - // an interface cant be abstract - this.error(); - val = -1; - } - } - if (result[idx] !== -1) { - // already defined flag - this.error(); - } else if (val !== -1) { - result[idx] = val; - } - } while (this.next().is("T_MEMBER_FLAGS")); - } - - if (result[1] == -1) result[1] = 0; - if (result[2] == -1) result[2] = 0; - return result; - }, - /** - * reading an interface - * ```ebnf - * interface ::= T_INTERFACE T_STRING (T_EXTENDS (NAMESPACE_NAME ',')* NAMESPACE_NAME)? '{' INTERFACE_BODY '}' - * ``` - */ - read_interface: function read_interface() { - var result = this.node("interface"); - var name = null; - var body = null; - var propExtends = null; - if (this.expect(this.tok.T_INTERFACE)) { - this.next(); - } - if (this.expect(this.tok.T_STRING)) { - name = this.text(); - this.next(); - } - if (this.token === this.tok.T_EXTENDS) { - propExtends = this.next().read_name_list(); - } - if (this.expect("{")) { - body = this.next().read_interface_body(); - } - return result(name, propExtends, body); - }, - /** - * Reads an interface body - * ```ebnf - * interface_body ::= (member_flags? (T_CONST | T_FUNCTION))* - * ``` - */ - read_interface_body: function read_interface_body() { - var result = []; - - while (this.token !== this.EOF && this.token !== "}") { - if (this.token === this.tok.T_COMMENT) { - result.push(this.read_comment()); - continue; - } - - if (this.token === this.tok.T_DOC_COMMENT) { - result.push(this.read_doc_comment()); - continue; - } - - // read member flags - var flags = this.read_member_flags(true); - - // check constant - if (this.token == this.tok.T_CONST) { - var constants = this.read_constant_list(flags); - if (this.expect(";")) { - this.next(); - } - result = result.concat(constants); - } else if (this.token === this.tok.T_FUNCTION) { - // reads a function - var method = this.read_function_declaration(2, flags); - method.parseFlags(flags); - result.push(method); - if (this.expect(";")) { - this.next(); - } - } else { - // raise an error - this.error([this.tok.T_CONST, this.tok.T_FUNCTION]); - this.next(); - } - } - if (this.expect("}")) { - this.next(); - } - return result; - }, - /** - * reading a trait - * ```ebnf - * trait ::= T_TRAIT T_STRING (T_EXTENDS (NAMESPACE_NAME ',')* NAMESPACE_NAME)? '{' FUNCTION* '}' - * ``` - */ - read_trait: function read_trait() { - var result = this.node("trait"); - var propName = null; - var propExtends = null; - var propImplements = null; - var body = null; - if (this.expect(this.tok.T_TRAIT)) { - this.next(); - } - if (this.expect(this.tok.T_STRING)) { - propName = this.text(); - } - if (this.next().token == this.tok.T_EXTENDS) { - propExtends = this.next().read_namespace_name(); - } - if (this.token == this.tok.T_IMPLEMENTS) { - propImplements = this.next().read_name_list(); - } - if (this.expect("{")) { - body = this.next().read_class_body(); - } - return result(propName, propExtends, propImplements, body); - }, - /** - * reading a use statement - * ```ebnf - * trait_use_statement ::= namespace_name (',' namespace_name)* ('{' trait_use_alias '}')? - * ``` - */ - read_trait_use_statement: function read_trait_use_statement() { - // defines use statements - var node = this.node("traituse"); - var traits = [this.read_namespace_name()]; - var adaptations = null; - while (this.token === ",") { - traits.push(this.next().read_namespace_name()); - } - if (this.token === "{") { - adaptations = []; - // defines alias statements - while (this.next().token !== this.EOF) { - if (this.token === "}") break; - adaptations.push(this.read_trait_use_alias()); - this.expect(";"); - } - if (this.expect("}")) { - this.next(); - } - } else { - if (this.expect(";")) { - this.next(); - } - } - return node(traits, adaptations); - }, - /** - * Reading trait alias - * ```ebnf - * trait_use_alias ::= namespace_name ( T_DOUBLE_COLON T_STRING )? (T_INSTEADOF namespace_name) | (T_AS member_flags? T_STRING) - * ``` - * name list : https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L303 - * trait adaptation : https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L742 - */ - read_trait_use_alias: function read_trait_use_alias() { - var node = this.node(); - var trait = null; - var method = void 0; - - if (this.is("IDENTIFIER")) { - method = this.text(); - this.next(); - } else { - method = this.read_namespace_name(); - - if (this.token === this.tok.T_DOUBLE_COLON) { - this.next(); - if (this.token === this.tok.T_STRING || this.php7 && this.is("IDENTIFIER")) { - trait = method; - method = this.text(); - this.next(); - } else { - this.expect(this.tok.T_STRING); - } - } else { - // convert identifier as string - method = method.name; - } - } - - // handle trait precedence - if (this.token === this.tok.T_INSTEADOF) { - return node("traitprecedence", trait, method, this.next().read_name_list()); - } else if (this.token === this.tok.T_AS) { - // handle trait alias - var flags = null; - var alias = null; - if (this.next().is("T_MEMBER_FLAGS")) { - flags = this.read_member_flags(); - } - - if (this.token === this.tok.T_STRING || this.php7 && this.is("IDENTIFIER")) { - alias = this.text(); - this.next(); - } else if (flags === false) { - // no visibility flags and no name => too bad - this.expect(this.tok.T_STRING); - } - - return node("traitalias", trait, method, alias, flags); - } - - // handle errors - this.expect([this.tok.T_AS, this.tok.T_INSTEADOF]); - return node("traitalias", trait, method, null, null); - } -}; - -/***/ }), -/* 106 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var ArrayExpr = "array"; -var ArrayEntry = "entry"; - -module.exports = { - /** - * Parse an array - * ```ebnf - * array ::= T_ARRAY '(' array_pair_list ')' | - * '[' array_pair_list ']' - * ``` - */ - read_array: function read_array() { - var expect = null; - var shortForm = false; - var result = this.node(ArrayExpr); - - if (this.token === this.tok.T_ARRAY) { - this.next().expect("("); - expect = ")"; - } else { - shortForm = true; - expect = "]"; - } - var items = []; - if (this.next().token !== expect) { - items = this.read_array_pair_list(shortForm); - } - // check non empty entries - /*for(let i = 0, size = items.length - 1; i < size; i++) { - if (items[i] === null) { - this.raiseError( - "Cannot use empty array elements in arrays" - ); - } - }*/ - this.expect(expect); - this.next(); - return result(shortForm, items); - }, - /** - * Reads an array of items - * ```ebnf - * array_pair_list ::= array_pair (',' array_pair?)* - * ``` - */ - read_array_pair_list: function read_array_pair_list(shortForm) { - var self = this; - return this.read_list(function () { - return self.read_array_pair(shortForm); - }, ",", true); - }, - /** - * Reads an entry - * array_pair: - * expr T_DOUBLE_ARROW expr - * | expr - * | expr T_DOUBLE_ARROW '&' variable - * | '&' variable - * | expr T_DOUBLE_ARROW T_LIST '(' array_pair_list ')' - * | T_LIST '(' array_pair_list ')' - */ - read_array_pair: function read_array_pair(shortForm) { - if (this.token === "," || !shortForm && this.token === ")" || shortForm && this.token === "]") { - return null; - } - if (this.token === "&") { - return this.next().read_variable(true, false, true); - } else { - var entry = this.node(ArrayEntry); - var expr = this.read_expr(); - if (this.token === this.tok.T_DOUBLE_ARROW) { - if (this.next().token === "&") { - return entry(expr, this.next().read_variable(true, false, true)); - } else { - return entry(expr, this.read_expr()); - } - } - return expr; - } - }, - /** - * ```ebnf - * dim_offset ::= expr? - * ``` - */ - read_dim_offset: function read_dim_offset() { - if (this.token == "]") return false; - return this.read_expr(); - } -}; - -/***/ }), -/* 107 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -/** - * @private - */ - -function isNumber(n) { - return n != "." && n != "," && !isNaN(parseFloat(n)) && isFinite(n); -} - -/** - * The PHP Parser class that build the AST tree from the lexer - * - * @class - * @tutorial Parser - * @property {Lexer} lexer - current lexer instance - * @property {AST} ast - the AST factory instance - * @property {Integer|String} token - current token - * @property {Boolean} extractDoc - should extract documentation as AST node - * @property {Boolean} extractTokens - should extract each token - * @property {Boolean} suppressErrors - should ignore parsing errors and continue - * @property {Boolean} debug - should output debug informations - */ -var parser = function parser(lexer, ast) { - this.lexer = lexer; - this.ast = ast; - this.tok = lexer.tok; - this.EOF = lexer.EOF; - this.token = null; - this.prev = null; - this.debug = false; - this.php7 = true; - this.extractDoc = false; - this.extractTokens = false; - this.suppressErrors = false; - var mapIt = function mapIt(item) { - return [item, null]; - }; - this.entries = { - IDENTIFIER: new Map([this.tok.T_ABSTRACT, this.tok.T_ARRAY, this.tok.T_AS, this.tok.T_BREAK, this.tok.T_CALLABLE, this.tok.T_CASE, this.tok.T_CATCH, this.tok.T_CLASS, this.tok.T_CLASS_C, this.tok.T_CLONE, this.tok.T_CONST, this.tok.T_CONTINUE, this.tok.T_DECLARE, this.tok.T_DEFAULT, this.tok.T_DIR, this.tok.T_DO, this.tok.T_ECHO, this.tok.T_ELSE, this.tok.T_ELSEIF, this.tok.T_EMPTY, this.tok.T_ENDDECLARE, this.tok.T_ENDFOR, this.tok.T_ENDFOREACH, this.tok.T_ENDIF, this.tok.T_ENDSWITCH, this.tok.T_ENDWHILE, this.tok.T_EVAL, this.tok.T_EXIT, this.tok.T_EXTENDS, this.tok.T_FILE, this.tok.T_FINAL, this.tok.T_FINALLY, this.tok.T_FUNC_C, this.tok.T_FOR, this.tok.T_FOREACH, this.tok.T_FUNCTION, this.tok.T_GLOBAL, this.tok.T_GOTO, this.tok.T_IF, this.tok.T_IMPLEMENTS, this.tok.T_INCLUDE, this.tok.T_INCLUDE_ONCE, this.tok.T_INSTANCEOF, this.tok.T_INSTEADOF, this.tok.T_INTERFACE, this.tok.T_ISSET, this.tok.T_LINE, this.tok.T_LIST, this.tok.T_LOGICAL_AND, this.tok.T_LOGICAL_OR, this.tok.T_LOGICAL_XOR, this.tok.T_METHOD_C, this.tok.T_NAMESPACE, this.tok.T_NEW, this.tok.T_NS_C, this.tok.T_PRINT, this.tok.T_PRIVATE, this.tok.T_PROTECTED, this.tok.T_PUBLIC, this.tok.T_REQUIRE, this.tok.T_REQUIRE_ONCE, this.tok.T_RETURN, this.tok.T_STATIC, this.tok.T_SWITCH, this.tok.T_THROW, this.tok.T_TRAIT, this.tok.T_TRY, this.tok.T_UNSET, this.tok.T_USE, this.tok.T_VAR, this.tok.T_WHILE, this.tok.T_YIELD].map(mapIt)), - VARIABLE: new Map([this.tok.T_VARIABLE, "$", "&", this.tok.T_NS_SEPARATOR, this.tok.T_STRING, this.tok.T_NAMESPACE, this.tok.T_STATIC].map(mapIt)), - SCALAR: new Map([this.tok.T_CONSTANT_ENCAPSED_STRING, this.tok.T_START_HEREDOC, this.tok.T_LNUMBER, this.tok.T_DNUMBER, this.tok.T_ARRAY, "[", this.tok.T_CLASS_C, this.tok.T_TRAIT_C, this.tok.T_FUNC_C, this.tok.T_METHOD_C, this.tok.T_LINE, this.tok.T_FILE, this.tok.T_DIR, this.tok.T_NS_C, '"', 'b"', 'B"', "-", this.tok.T_NS_SEPARATOR].map(mapIt)), - T_MAGIC_CONST: new Map([this.tok.T_CLASS_C, this.tok.T_TRAIT_C, this.tok.T_FUNC_C, this.tok.T_METHOD_C, this.tok.T_LINE, this.tok.T_FILE, this.tok.T_DIR, this.tok.T_NS_C].map(mapIt)), - T_MEMBER_FLAGS: new Map([this.tok.T_PUBLIC, this.tok.T_PRIVATE, this.tok.T_PROTECTED, this.tok.T_STATIC, this.tok.T_ABSTRACT, this.tok.T_FINAL].map(mapIt)), - EOS: new Map([";", this.EOF, this.tok.T_INLINE_HTML].map(mapIt)), - EXPR: new Map(["@", "-", "+", "!", "~", "(", "`", this.tok.T_LIST, this.tok.T_CLONE, this.tok.T_INC, this.tok.T_DEC, this.tok.T_NEW, this.tok.T_ISSET, this.tok.T_EMPTY, this.tok.T_INCLUDE, this.tok.T_INCLUDE_ONCE, this.tok.T_REQUIRE, this.tok.T_REQUIRE_ONCE, this.tok.T_EVAL, this.tok.T_INT_CAST, this.tok.T_DOUBLE_CAST, this.tok.T_STRING_CAST, this.tok.T_ARRAY_CAST, this.tok.T_OBJECT_CAST, this.tok.T_BOOL_CAST, this.tok.T_UNSET_CAST, this.tok.T_EXIT, this.tok.T_PRINT, this.tok.T_YIELD, this.tok.T_STATIC, this.tok.T_FUNCTION, - // using VARIABLES : - this.tok.T_VARIABLE, "$", this.tok.T_NS_SEPARATOR, this.tok.T_STRING, - // using SCALAR : - this.tok.T_STRING, // @see variable.js line 45 > conflict with variable = shift/reduce :) - this.tok.T_CONSTANT_ENCAPSED_STRING, this.tok.T_START_HEREDOC, this.tok.T_LNUMBER, this.tok.T_DNUMBER, this.tok.T_ARRAY, "[", this.tok.T_CLASS_C, this.tok.T_TRAIT_C, this.tok.T_FUNC_C, this.tok.T_METHOD_C, this.tok.T_LINE, this.tok.T_FILE, this.tok.T_DIR, this.tok.T_NS_C].map(mapIt)) - }; -}; - -/** - * helper : gets a token name - */ -parser.prototype.getTokenName = function (token) { - if (!isNumber(token)) { - return "'" + token + "'"; - } else { - if (token == this.EOF) return "the end of file (EOF)"; - return this.lexer.engine.tokens.values[token]; - } -}; - -/** - * main entry point : converts a source code to AST - */ -parser.prototype.parse = function (code, filename) { - this._errors = []; - this.filename = filename || "eval"; - this.currentNamespace = [""]; - if (this.extractDoc) { - this._docs = []; - } else { - this._docs = null; - } - if (this.extractTokens) { - this._tokens = []; - } else { - this._tokens = null; - } - this._docIndex = 0; - this.lexer.setInput(code); - this.lexer.all_tokens = this.extractTokens; - this.lexer.comment_tokens = this.extractDoc; - this.length = this.lexer._input.length; - this.innerList = false; - this.innerListForm = false; - var program = this.ast.prepare("program", null, this); - var childs = []; - this.next(); - while (this.token != this.EOF) { - var node = this.read_start(); - if (node !== null && node !== undefined) { - if (Array.isArray(node)) { - childs = childs.concat(node); - } else { - childs.push(node); - } - } - } - return program(childs, this._errors, this._docs, this._tokens); -}; - -/** - * Raise an error - */ -parser.prototype.raiseError = function (message, msgExpect, expect, token) { - message += " on line " + this.lexer.yylloc.first_line; - if (!this.suppressErrors) { - var err = new SyntaxError(message, this.filename, this.lexer.yylloc.first_line); - err.lineNumber = this.lexer.yylloc.first_line; - err.fileName = this.filename; - err.columnNumber = this.lexer.yylloc.first_column; - throw err; - } - // Error node : - var node = this.ast.prepare("error", null, this)(message, token, this.lexer.yylloc.first_line, expect); - this._errors.push(node); - return node; -}; - -/** - * handling errors - */ -parser.prototype.error = function (expect) { - var msg = "Parse Error : syntax error"; - var token = this.getTokenName(this.token); - var msgExpect = ""; - - if (this.token !== this.EOF) { - if (isNumber(this.token)) { - var symbol = this.text(); - if (symbol.length > 10) { - symbol = symbol.substring(0, 7) + "..."; - } - token = "'" + symbol + "' (" + token + ")"; - } - msg += ", unexpected " + token; - } - if (expect && !Array.isArray(expect)) { - if (isNumber(expect) || expect.length === 1) { - msgExpect = ", expecting " + this.getTokenName(expect); - } - msg += msgExpect; - } - return this.raiseError(msg, msgExpect, expect, token); -}; - -/** - * Creates a new AST node - */ -parser.prototype.node = function (name) { - if (this.extractDoc) { - if (this._docIndex < this._docs.length) { - var docs = this._docs.slice(this._docIndex); - this._docIndex = this._docs.length; - return this.ast.prepare(name, docs, this); - } - } - return this.ast.prepare(name, null, this); -}; - -/** - * expects an end of statement or end of file - * @return {boolean} - */ -parser.prototype.expectEndOfStatement = function (node) { - if (this.token === ";") { - // include only real ';' statements - // https://github.com/glayzzle/php-parser/issues/164 - if (node && this.lexer.yytext === ";") { - node.includeToken(this); - } - } else if (this.token !== this.tok.T_INLINE_HTML && this.token !== this.EOF) { - this.error(";"); - return false; - } - this.next(); - return true; -}; - -/** outputs some debug information on current token **/ -var ignoreStack = ["parser.next"]; -parser.prototype.showlog = function () { - var stack = new Error().stack.split("\n"); - var line = void 0; - for (var offset = 2; offset < stack.length; offset++) { - line = stack[offset].trim(); - var found = false; - for (var i = 0; i < ignoreStack.length; i++) { - if (line.substring(3, 3 + ignoreStack[i].length) === ignoreStack[i]) { - found = true; - break; - } - } - if (!found) { - break; - } - } - // eslint-disable-next-line no-console - console.log("Line " + this.lexer.yylloc.first_line + " : " + this.getTokenName(this.token) + ">" + this.lexer.yytext + "<" + " @-->" + line); - return this; -}; - -/** - * Force the parser to check the current token. - * - * If the current token does not match to expected token, - * the an error will be raised. - * - * If the suppressError mode is activated, then the error will - * be added to the program error stack and this function will return `false`. - * - * @param {String|Number} token - * @return {boolean} - * @throws Error - */ -parser.prototype.expect = function (token) { - if (Array.isArray(token)) { - if (token.indexOf(this.token) === -1) { - this.error(token); - return false; - } - } else if (this.token != token) { - this.error(token); - return false; - } - return true; -}; - -/** - * Returns the current token contents - * @return {String} - */ -parser.prototype.text = function () { - return this.lexer.yytext; -}; - -/** consume the next token **/ -parser.prototype.next = function () { - // prepare the back command - if (this.token !== ";" || this.lexer.yytext === ";") { - // ignore '?>' from automated resolution - // https://github.com/glayzzle/php-parser/issues/168 - this.prev = [this.lexer.yylloc.last_line, this.lexer.yylloc.last_column, this.lexer.offset]; - } - - // eating the token - this.lex(); - - // showing the debug - if (this.debug) { - this.showlog(); - } - - // handling comments - if (this.extractDoc) { - while (this.token === this.tok.T_COMMENT || this.token === this.tok.T_DOC_COMMENT) { - // APPEND COMMENTS - if (this.token === this.tok.T_COMMENT) { - this._docs.push(this.read_comment()); - } else { - this._docs.push(this.read_doc_comment()); - } - } - } - - return this; -}; - -/** - * Eating a token - */ -parser.prototype.lex = function () { - // append on token stack - if (this.extractTokens) { - do { - // the token - this.token = this.lexer.lex() || this.EOF; - if (this.token === this.EOF) return this; - var entry = this.lexer.yytext; - if (this.lexer.engine.tokens.values.hasOwnProperty(this.token)) { - entry = [this.lexer.engine.tokens.values[this.token], entry, this.lexer.yylloc.first_line, this.lexer.yylloc.first_offset, this.lexer.offset]; - } else { - entry = [null, entry, this.lexer.yylloc.first_line, this.lexer.yylloc.first_offset, this.lexer.offset]; - } - this._tokens.push(entry); - if (this.token === this.tok.T_CLOSE_TAG) { - // https://github.com/php/php-src/blob/7ff186434e82ee7be7c59d0db9a976641cf7b09c/Zend/zend_compile.c#L1680 - this.token = ";"; - return this; - } else if (this.token === this.tok.T_OPEN_TAG_WITH_ECHO) { - this.token = this.tok.T_ECHO; - return this; - } - } while (this.token === this.tok.T_WHITESPACE || // ignore white space - !this.extractDoc && (this.token === this.tok.T_COMMENT || // ignore single lines comments - this.token === this.tok.T_DOC_COMMENT) || // ignore doc comments - // ignore open tags - this.token === this.tok.T_OPEN_TAG); - } else { - this.token = this.lexer.lex() || this.EOF; - } - return this; -}; - -/** - * Check if token is of specified type - */ -parser.prototype.is = function (type) { - if (Array.isArray(type)) { - return type.indexOf(this.token) !== -1; - } - return this.entries[type].has(this.token); -}; - -// extends the parser with syntax files -[__webpack_require__(106), __webpack_require__(105), __webpack_require__(104), __webpack_require__(103), __webpack_require__(102), __webpack_require__(101), __webpack_require__(100), __webpack_require__(99), __webpack_require__(98), __webpack_require__(97), __webpack_require__(96), __webpack_require__(95), __webpack_require__(94), __webpack_require__(93), __webpack_require__(92)].forEach(function (ext) { - for (var k in ext) { - parser.prototype[k] = ext[k]; - } -}); - -module.exports = parser; - -/***/ }), -/* 108 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var tokens = ";:,.\\[]()|^&+-/*=%!~$<>?@"; - -module.exports = { - // check if the char can be a numeric - is_NUM: function is_NUM() { - var ch = this._input.charCodeAt(this.offset - 1); - return ch > 47 && ch < 58; - }, - - // check if current char can be a label - is_LABEL: function is_LABEL() { - var ch = this._input.charCodeAt(this.offset - 1); - return ch > 96 && ch < 123 || ch > 64 && ch < 91 || ch === 95 || ch > 47 && ch < 58 || ch > 126; - }, - - // check if current char can be a label - is_LABEL_START: function is_LABEL_START() { - var ch = this._input.charCodeAt(this.offset - 1); - return ch > 96 && ch < 123 || ch > 64 && ch < 91 || ch === 95 || ch > 126; - }, - - // reads each char of the label - consume_LABEL: function consume_LABEL() { - while (this.offset < this.size) { - var ch = this.input(); - if (!this.is_LABEL()) { - if (ch) this.unput(1); - break; - } - } - return this; - }, - - // check if current char is a token char - is_TOKEN: function is_TOKEN() { - var ch = this._input[this.offset - 1]; - return tokens.indexOf(ch) !== -1; - }, - // check if current char is a whitespace - is_WHITESPACE: function is_WHITESPACE() { - var ch = this._input[this.offset - 1]; - return ch === " " || ch === "\t" || ch === "\n" || ch === "\r"; - }, - // check if current char is a whitespace (without newlines) - is_TABSPACE: function is_TABSPACE() { - var ch = this._input[this.offset - 1]; - return ch === " " || ch === "\t"; - }, - // consume all whitespaces (excluding newlines) - consume_TABSPACE: function consume_TABSPACE() { - while (this.offset < this.size) { - var ch = this.input(); - if (!this.is_TABSPACE()) { - if (ch) this.unput(1); - break; - } - } - return this; - }, - // check if current char can be a hexadecimal number - is_HEX: function is_HEX() { - var ch = this._input.charCodeAt(this.offset - 1); - return ch > 47 && ch < 58 || ch > 64 && ch < 71 || ch > 96 && ch < 103; - } -}; - -/***/ }), -/* 109 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -module.exports = { - T_STRING: function T_STRING() { - var token = this.yytext.toLowerCase(); - var id = this.keywords[token]; - if (typeof id !== "number") { - if (token === "yield") { - if (this.php7 && this.tryMatch(" from")) { - this.consume(5); - id = this.tok.T_YIELD_FROM; - } else { - id = this.tok.T_YIELD; - } - } else { - id = this.tok.T_STRING; - if (token === "b" || token === "B") { - var ch = this.input(1); - if (ch === '"') { - return this.ST_DOUBLE_QUOTES(); - } else if (ch === "'") { - return this.T_CONSTANT_ENCAPSED_STRING(); - } else if (ch) { - this.unput(1); - } - } - } - } - return id; - }, - // reads a custom token - consume_TOKEN: function consume_TOKEN() { - var ch = this._input[this.offset - 1]; - var fn = this.tokenTerminals[ch]; - if (fn) { - return fn.apply(this, []); - } else { - return this.yytext; - } - }, - // list of special char tokens - tokenTerminals: { - $: function $() { - this.offset++; - if (this.is_LABEL_START()) { - this.offset--; - this.consume_LABEL(); - return this.tok.T_VARIABLE; - } else { - this.offset--; - return "$"; - } - }, - "-": function _() { - var nchar = this._input[this.offset]; - if (nchar === ">") { - this.begin("ST_LOOKING_FOR_PROPERTY").input(); - return this.tok.T_OBJECT_OPERATOR; - } else if (nchar === "-") { - this.input(); - return this.tok.T_DEC; - } else if (nchar === "=") { - this.input(); - return this.tok.T_MINUS_EQUAL; - } - return "-"; - }, - "\\": function _() { - return this.tok.T_NS_SEPARATOR; - }, - "/": function _() { - if (this._input[this.offset] === "=") { - this.input(); - return this.tok.T_DIV_EQUAL; - } - return "/"; - }, - ":": function _() { - if (this._input[this.offset] === ":") { - this.input(); - return this.tok.T_DOUBLE_COLON; - } else { - return ":"; - } - }, - "(": function _() { - var initial = this.offset; - this.input(); - if (this.is_TABSPACE()) { - this.consume_TABSPACE().input(); - } - if (this.is_LABEL_START()) { - var yylen = this.yytext.length; - this.consume_LABEL(); - var castToken = this.yytext.substring(yylen - 1).toLowerCase(); - var castId = this.castKeywords[castToken]; - if (typeof castId === "number") { - this.input(); - if (this.is_TABSPACE()) { - this.consume_TABSPACE().input(); - } - if (this._input[this.offset - 1] === ")") { - return castId; - } - } - } - // revert the check - this.unput(this.offset - initial); - return "("; - }, - "=": function _() { - var nchar = this._input[this.offset]; - if (nchar === ">") { - this.input(); - return this.tok.T_DOUBLE_ARROW; - } else if (nchar === "=") { - if (this._input[this.offset + 1] === "=") { - this.consume(2); - return this.tok.T_IS_IDENTICAL; - } else { - this.input(); - return this.tok.T_IS_EQUAL; - } - } - return "="; - }, - "+": function _() { - var nchar = this._input[this.offset]; - if (nchar === "+") { - this.input(); - return this.tok.T_INC; - } else if (nchar === "=") { - this.input(); - return this.tok.T_PLUS_EQUAL; - } - return "+"; - }, - "!": function _() { - if (this._input[this.offset] === "=") { - if (this._input[this.offset + 1] === "=") { - this.consume(2); - return this.tok.T_IS_NOT_IDENTICAL; - } else { - this.input(); - return this.tok.T_IS_NOT_EQUAL; - } - } - return "!"; - }, - "?": function _() { - if (this.php7 && this._input[this.offset] === "?") { - this.input(); - return this.tok.T_COALESCE; - } - return "?"; - }, - "<": function _() { - var nchar = this._input[this.offset]; - if (nchar === "<") { - nchar = this._input[this.offset + 1]; - if (nchar === "=") { - this.consume(2); - return this.tok.T_SL_EQUAL; - } else if (nchar === "<") { - if (this.is_HEREDOC()) { - return this.tok.T_START_HEREDOC; - } - } - this.input(); - return this.tok.T_SL; - } else if (nchar === "=") { - this.input(); - if (this.php7 && this._input[this.offset] === ">") { - this.input(); - return this.tok.T_SPACESHIP; - } else { - return this.tok.T_IS_SMALLER_OR_EQUAL; - } - } else if (nchar === ">") { - this.input(); - return this.tok.T_IS_NOT_EQUAL; - } - return "<"; - }, - ">": function _() { - var nchar = this._input[this.offset]; - if (nchar === "=") { - this.input(); - return this.tok.T_IS_GREATER_OR_EQUAL; - } else if (nchar === ">") { - nchar = this._input[this.offset + 1]; - if (nchar === "=") { - this.consume(2); - return this.tok.T_SR_EQUAL; - } else { - this.input(); - return this.tok.T_SR; - } - } - return ">"; - }, - "*": function _() { - var nchar = this._input[this.offset]; - if (nchar === "=") { - this.input(); - return this.tok.T_MUL_EQUAL; - } else if (nchar === "*") { - this.input(); - if (this._input[this.offset] === "=") { - this.input(); - return this.tok.T_POW_EQUAL; - } else { - return this.tok.T_POW; - } - } - return "*"; - }, - ".": function _() { - var nchar = this._input[this.offset]; - if (nchar === "=") { - this.input(); - return this.tok.T_CONCAT_EQUAL; - } else if (nchar === "." && this._input[this.offset + 1] === ".") { - this.consume(2); - return this.tok.T_ELLIPSIS; - } - return "."; - }, - "%": function _() { - if (this._input[this.offset] === "=") { - this.input(); - return this.tok.T_MOD_EQUAL; - } - return "%"; - }, - "&": function _() { - var nchar = this._input[this.offset]; - if (nchar === "=") { - this.input(); - return this.tok.T_AND_EQUAL; - } else if (nchar === "&") { - this.input(); - return this.tok.T_BOOLEAN_AND; - } - return "&"; - }, - "|": function _() { - var nchar = this._input[this.offset]; - if (nchar === "=") { - this.input(); - return this.tok.T_OR_EQUAL; - } else if (nchar === "|") { - this.input(); - return this.tok.T_BOOLEAN_OR; - } - return "|"; - }, - "^": function _() { - if (this._input[this.offset] === "=") { - this.input(); - return this.tok.T_XOR_EQUAL; - } - return "^"; - } - } -}; - -/***/ }), -/* 110 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -module.exports = { - T_CONSTANT_ENCAPSED_STRING: function T_CONSTANT_ENCAPSED_STRING() { - var ch = void 0; - while (this.offset < this.size) { - ch = this.input(); - if (ch == "\\") { - this.input(); - } else if (ch == "'") { - break; - } - } - return this.tok.T_CONSTANT_ENCAPSED_STRING; - }, - // check if matching a HEREDOC state - is_HEREDOC: function is_HEREDOC() { - var revert = this.offset; - if (this._input[this.offset - 1] === "<" && this._input[this.offset] === "<" && this._input[this.offset + 1] === "<") { - this.offset += 3; - - // optional tabs / spaces - if (this.is_TABSPACE()) { - while (this.offset < this.size) { - this.offset++; - if (!this.is_TABSPACE()) { - break; - } - } - } - - // optional quotes - var tChar = this._input[this.offset - 1]; - if (tChar === "'" || tChar === '"') { - this.offset++; - } else { - tChar = null; - } - - // required label - if (this.is_LABEL_START()) { - var yyoffset = this.offset - 1; - while (this.offset < this.size) { - this.offset++; - if (!this.is_LABEL()) { - break; - } - } - var yylabel = this._input.substring(yyoffset, this.offset - 1); - if (!tChar || tChar === this._input[this.offset - 1]) { - // required ending quote - if (tChar) this.offset++; - // require newline - if (this._input[this.offset - 1] === "\r" || this._input[this.offset - 1] === "\n") { - // go go go - this.heredoc_label = yylabel; - yyoffset = this.offset - revert; - this.offset = revert; - this.consume(yyoffset); - if (tChar === "'") { - this.begin("ST_NOWDOC"); - } else { - this.begin("ST_HEREDOC"); - } - return this.tok.T_START_HEREDOC; - } - } - } - } - this.offset = revert; - return false; - }, - ST_DOUBLE_QUOTES: function ST_DOUBLE_QUOTES() { - var ch = void 0; - while (this.offset < this.size) { - ch = this.input(); - if (ch == "\\") { - this.input(); - } else if (ch == '"') { - break; - } else if (ch == "$") { - ch = this.input(); - if (ch == "{" || this.is_LABEL_START()) { - this.unput(2); - break; - } - if (ch) this.unput(1); - } else if (ch == "{") { - ch = this.input(); - if (ch == "$") { - this.unput(2); - break; - } - if (ch) this.unput(1); - } - } - if (ch == '"') { - return this.tok.T_CONSTANT_ENCAPSED_STRING; - } else { - var prefix = 1; - if (this.yytext[0] === "b" || this.yytext[0] === "B") { - prefix = 2; - } - if (this.yytext.length > 2) { - this.appendToken(this.tok.T_ENCAPSED_AND_WHITESPACE, this.yytext.length - prefix); - } - this.unput(this.yytext.length - prefix); - this.begin("ST_DOUBLE_QUOTES"); - return this.yytext; - } - }, - - // check if its a DOC end sequence - isDOC_MATCH: function isDOC_MATCH() { - // @fixme : check if out of text limits - if (this._input.substring(this.offset - 1, this.offset - 1 + this.heredoc_label.length) === this.heredoc_label) { - var ch = this._input[this.offset - 1 + this.heredoc_label.length]; - if (ch === "\n" || ch === "\r" || ch === ";") { - return true; - } - } - return false; - }, - - matchST_NOWDOC: function matchST_NOWDOC() { - /** edge case : empty now doc **/ - if (this.isDOC_MATCH()) { - // @fixme : never reached (may be caused by quotes) - this.consume(this.heredoc_label.length); - this.popState(); - return this.tok.T_END_HEREDOC; - } - /** SCANNING CONTENTS **/ - var ch = this._input[this.offset - 1]; - while (this.offset < this.size) { - if (ch === "\n" || ch === "\r") { - ch = this.input(); - if (this.isDOC_MATCH()) { - this.unput(1).popState(); - this.appendToken(this.tok.T_END_HEREDOC, this.heredoc_label.length); - return this.tok.T_ENCAPSED_AND_WHITESPACE; - } - } else { - ch = this.input(); - } - } - // too bad ! reached end of document (will get a parse error) - return this.tok.T_ENCAPSED_AND_WHITESPACE; - }, - - matchST_HEREDOC: function matchST_HEREDOC() { - /** edge case : empty here doc **/ - var ch = this.input(); - if (this.isDOC_MATCH()) { - this.consume(this.heredoc_label.length - 1); - this.popState(); - return this.tok.T_END_HEREDOC; - } - /** SCANNING CONTENTS **/ - while (this.offset < this.size) { - if (ch === "\\") { - ch = this.input(); // ignore next - if (ch !== "\n" && ch !== "\r") { - ch = this.input(); - } - } - - if (ch === "\n" || ch === "\r") { - ch = this.input(); - if (this.isDOC_MATCH()) { - this.unput(1).popState(); - this.appendToken(this.tok.T_END_HEREDOC, this.heredoc_label.length); - return this.tok.T_ENCAPSED_AND_WHITESPACE; - } - } else if (ch === "$") { - ch = this.input(); - if (ch === "{") { - // start of ${ - this.begin("ST_LOOKING_FOR_VARNAME"); - if (this.yytext.length > 2) { - this.appendToken(this.tok.T_DOLLAR_OPEN_CURLY_BRACES, 2); - this.unput(2); - return this.tok.T_ENCAPSED_AND_WHITESPACE; - } else { - return this.tok.T_DOLLAR_OPEN_CURLY_BRACES; - } - } else if (this.is_LABEL_START()) { - // start of $var... - var yyoffset = this.offset; - var next = this.consume_VARIABLE(); - if (this.yytext.length > this.offset - yyoffset + 2) { - this.appendToken(next, this.offset - yyoffset + 2); - this.unput(this.offset - yyoffset + 2); - return this.tok.T_ENCAPSED_AND_WHITESPACE; - } else { - return next; - } - //console.log(this.yytext); - } - } else if (ch === "{") { - ch = this.input(); - if (ch === "$") { - // start of {$... - this.begin("ST_IN_SCRIPTING"); - if (this.yytext.length > 2) { - this.appendToken(this.tok.T_CURLY_OPEN, 1); - this.unput(2); - return this.tok.T_ENCAPSED_AND_WHITESPACE; - } else { - this.unput(1); - return this.tok.T_CURLY_OPEN; - } - } - } else { - ch = this.input(); - } - } - - // too bad ! reached end of document (will get a parse error) - return this.tok.T_ENCAPSED_AND_WHITESPACE; - }, - - consume_VARIABLE: function consume_VARIABLE() { - this.consume_LABEL(); - var ch = this.input(); - if (ch == "[") { - this.unput(1); - this.begin("ST_VAR_OFFSET"); - return this.tok.T_VARIABLE; - } else if (ch === "-") { - if (this.input() === ">") { - this.input(); - if (this.is_LABEL_START()) { - this.begin("ST_LOOKING_FOR_PROPERTY"); - } - this.unput(3); - return this.tok.T_VARIABLE; - } else { - this.unput(2); - } - } else { - if (ch) this.unput(1); - } - return this.tok.T_VARIABLE; - }, - // HANDLES BACKQUOTES - matchST_BACKQUOTE: function matchST_BACKQUOTE() { - var ch = this.input(); - if (ch === "$") { - ch = this.input(); - if (ch === "{") { - this.begin("ST_LOOKING_FOR_VARNAME"); - return this.tok.T_DOLLAR_OPEN_CURLY_BRACES; - } else if (this.is_LABEL_START()) { - var tok = this.consume_VARIABLE(); - return tok; - } - } else if (ch === "{") { - if (this._input[this.offset] === "$") { - this.begin("ST_IN_SCRIPTING"); - return this.tok.T_CURLY_OPEN; - } - } else if (ch === "`") { - this.popState(); - return "`"; - } - - // any char - while (this.offset < this.size) { - if (ch === "\\") { - this.input(); - } else if (ch === "`") { - this.unput(1); - this.popState(); - this.appendToken("`", 1); - break; - } else if (ch === "$") { - ch = this.input(); - if (ch === "{") { - this.begin("ST_LOOKING_FOR_VARNAME"); - if (this.yytext.length > 2) { - this.appendToken(this.tok.T_DOLLAR_OPEN_CURLY_BRACES, 2); - this.unput(2); - return this.tok.T_ENCAPSED_AND_WHITESPACE; - } else { - return this.tok.T_DOLLAR_OPEN_CURLY_BRACES; - } - } else if (this.is_LABEL_START()) { - // start of $var... - var yyoffset = this.offset; - var next = this.consume_VARIABLE(); - if (this.yytext.length > this.offset - yyoffset + 2) { - this.appendToken(next, this.offset - yyoffset + 2); - this.unput(this.offset - yyoffset + 2); - return this.tok.T_ENCAPSED_AND_WHITESPACE; - } else { - return next; - } - } - continue; - } else if (ch === "{") { - ch = this.input(); - if (ch === "$") { - // start of {$... - this.begin("ST_IN_SCRIPTING"); - if (this.yytext.length > 2) { - this.appendToken(this.tok.T_CURLY_OPEN, 1); - this.unput(2); - return this.tok.T_ENCAPSED_AND_WHITESPACE; - } else { - this.unput(1); - return this.tok.T_CURLY_OPEN; - } - } - continue; - } - ch = this.input(); - } - return this.tok.T_ENCAPSED_AND_WHITESPACE; - }, - - matchST_DOUBLE_QUOTES: function matchST_DOUBLE_QUOTES() { - var ch = this.input(); - if (ch === "$") { - ch = this.input(); - if (ch === "{") { - this.begin("ST_LOOKING_FOR_VARNAME"); - return this.tok.T_DOLLAR_OPEN_CURLY_BRACES; - } else if (this.is_LABEL_START()) { - var tok = this.consume_VARIABLE(); - return tok; - } - } else if (ch === "{") { - if (this._input[this.offset] === "$") { - this.begin("ST_IN_SCRIPTING"); - return this.tok.T_CURLY_OPEN; - } - } else if (ch === '"') { - this.popState(); - return '"'; - } - - // any char - while (this.offset < this.size) { - if (ch === "\\") { - this.input(); - } else if (ch === '"') { - this.unput(1); - this.popState(); - this.appendToken('"', 1); - break; - } else if (ch === "$") { - ch = this.input(); - if (ch === "{") { - this.begin("ST_LOOKING_FOR_VARNAME"); - if (this.yytext.length > 2) { - this.appendToken(this.tok.T_DOLLAR_OPEN_CURLY_BRACES, 2); - this.unput(2); - return this.tok.T_ENCAPSED_AND_WHITESPACE; - } else { - return this.tok.T_DOLLAR_OPEN_CURLY_BRACES; - } - } else if (this.is_LABEL_START()) { - // start of $var... - var yyoffset = this.offset; - var next = this.consume_VARIABLE(); - if (this.yytext.length > this.offset - yyoffset + 2) { - this.appendToken(next, this.offset - yyoffset + 2); - this.unput(this.offset - yyoffset + 2); - return this.tok.T_ENCAPSED_AND_WHITESPACE; - } else { - return next; - } - } - if (ch) this.unput(1); - } else if (ch === "{") { - ch = this.input(); - if (ch === "$") { - // start of {$... - this.begin("ST_IN_SCRIPTING"); - if (this.yytext.length > 2) { - this.appendToken(this.tok.T_CURLY_OPEN, 1); - this.unput(2); - return this.tok.T_ENCAPSED_AND_WHITESPACE; - } else { - // @fixme : yytext = '"{$' (this.yytext.length > 3) - this.unput(1); - return this.tok.T_CURLY_OPEN; - } - } - if (ch) this.unput(1); - } - ch = this.input(); - } - return this.tok.T_ENCAPSED_AND_WHITESPACE; - } -}; - -/***/ }), -/* 111 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -module.exports = { - matchST_IN_SCRIPTING: function matchST_IN_SCRIPTING() { - var ch = this.input(); - switch (ch) { - case " ": - case "\t": - case "\n": - case "\r": - case "\r\n": - return this.T_WHITESPACE(); - case "#": - return this.T_COMMENT(); - case "/": - if (this._input[this.offset] === "/") { - return this.T_COMMENT(); - } else if (this._input[this.offset] === "*") { - this.input(); - return this.T_DOC_COMMENT(); - } - return this.consume_TOKEN(); - case "'": - return this.T_CONSTANT_ENCAPSED_STRING(); - case '"': - return this.ST_DOUBLE_QUOTES(); - case "`": - this.begin("ST_BACKQUOTE"); - return "`"; - case "?": - if (!this.aspTagMode && this.tryMatch(">")) { - this.input(); - var nextCH = this._input[this.offset]; - if (nextCH === "\n" || nextCH === "\r") this.input(); - if (this.conditionStack.length > 1) { - this.begin("INITIAL"); - } - return this.tok.T_CLOSE_TAG; - } - return this.consume_TOKEN(); - case "%": - if (this.aspTagMode && this._input[this.offset] === ">") { - this.input(); // consume the '>' - ch = this._input[this.offset]; // read next - if (ch === "\n" || ch === "\r") { - this.input(); // consume the newline - } - this.aspTagMode = false; - if (this.conditionStack.length > 1) { - this.begin("INITIAL"); - } - return this.tok.T_CLOSE_TAG; - } - return this.consume_TOKEN(); - case "{": - this.begin("ST_IN_SCRIPTING"); - return "{"; - case "}": - if (this.conditionStack.length > 2) { - // Return to HEREDOC/ST_DOUBLE_QUOTES mode - this.popState(); - } - return "}"; - default: - if (ch === ".") { - ch = this.input(); - if (this.is_NUM()) { - return this.consume_NUM(); - } else { - if (ch) this.unput(1); - } - } - if (this.is_NUM()) { - return this.consume_NUM(); - } else if (this.is_LABEL_START()) { - return this.consume_LABEL().T_STRING(); - } else if (this.is_TOKEN()) { - return this.consume_TOKEN(); - } - } - throw new Error('Bad terminal sequence "' + ch + '" at line ' + this.yylineno + " (offset " + this.offset + ")"); - }, - - T_WHITESPACE: function T_WHITESPACE() { - while (this.offset < this.size) { - var ch = this.input(); - if (ch === " " || ch === "\t" || ch === "\n" || ch === "\r") { - continue; - } - if (ch) this.unput(1); - break; - } - return this.tok.T_WHITESPACE; - } -}; - -/***/ }), -/* 112 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -module.exports = { - matchST_LOOKING_FOR_PROPERTY: function matchST_LOOKING_FOR_PROPERTY() { - var ch = this.input(); - if (ch === "-") { - ch = this.input(); - if (ch === ">") { - // https://github.com/php/php-src/blob/master/Zend/zend_language_scanner.l#L1296 - return this.tok.T_OBJECT_OPERATOR; - } - if (ch) this.unput(1); - } else if (this.is_WHITESPACE()) { - return this.tok.T_WHITESPACE; - } else if (this.is_LABEL_START()) { - // https://github.com/php/php-src/blob/master/Zend/zend_language_scanner.l#L1300 - this.consume_LABEL(); - this.popState(); - return this.tok.T_STRING; - } - // https://github.com/php/php-src/blob/master/Zend/zend_language_scanner.l#L1306 - this.popState(); - if (ch) this.unput(1); - return false; - }, - matchST_LOOKING_FOR_VARNAME: function matchST_LOOKING_FOR_VARNAME() { - var ch = this.input(); - - // SHIFT STATE - this.popState(); - this.begin("ST_IN_SCRIPTING"); - - if (this.is_LABEL_START()) { - this.consume_LABEL(); - ch = this.input(); - if (ch === "[" || ch === "}") { - this.unput(1); - return this.tok.T_STRING_VARNAME; - } else { - // any char (that's started with a label sequence) - this.unput(this.yytext.length); - } - } else { - // any char (thats not a label start sequence) - if (ch) this.unput(1); - } - // stops looking for a varname and starts the scripting mode - return false; - }, - matchST_VAR_OFFSET: function matchST_VAR_OFFSET() { - var ch = this.input(); - if (this.is_NUM()) { - this.consume_NUM(); - return this.tok.T_NUM_STRING; - } else if (ch === "]") { - this.popState(); - return "]"; - } else if (ch === "$") { - this.input(); - if (this.is_LABEL_START()) { - this.consume_LABEL(); - return this.tok.T_VARIABLE; - } else { - throw new Error("Unexpected terminal"); - } - } else if (this.is_LABEL_START()) { - this.consume_LABEL(); - return this.tok.T_STRING; - } else if (this.is_WHITESPACE() || ch === "\\" || ch === "'" || ch === "#") { - return this.tok.T_ENCAPSED_AND_WHITESPACE; - } else if (ch === "[" || ch === "{" || ch === "}" || ch === '"' || ch === "`" || this.is_TOKEN()) { - return ch; - } else { - throw new Error("Unexpected terminal"); - } - } -}; - -/***/ }), -/* 113 */ -/***/ (function(module, exports) { - -// shim for using process in browser -var process = module.exports = {}; - -// cached from whatever global is present so that test runners that stub it -// don't break things. But we need to wrap it in a try catch in case it is -// wrapped in strict mode code which doesn't define any globals. It's inside a -// function because try/catches deoptimize in certain engines. - -var cachedSetTimeout; -var cachedClearTimeout; - -function defaultSetTimout() { - throw new Error('setTimeout has not been defined'); -} -function defaultClearTimeout () { - throw new Error('clearTimeout has not been defined'); -} -(function () { - try { - if (typeof setTimeout === 'function') { - cachedSetTimeout = setTimeout; - } else { - cachedSetTimeout = defaultSetTimout; - } - } catch (e) { - cachedSetTimeout = defaultSetTimout; - } - try { - if (typeof clearTimeout === 'function') { - cachedClearTimeout = clearTimeout; - } else { - cachedClearTimeout = defaultClearTimeout; - } - } catch (e) { - cachedClearTimeout = defaultClearTimeout; - } -} ()) -function runTimeout(fun) { - if (cachedSetTimeout === setTimeout) { - //normal enviroments in sane situations - return setTimeout(fun, 0); - } - // if setTimeout wasn't available but was latter defined - if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { - cachedSetTimeout = setTimeout; - return setTimeout(fun, 0); - } - try { - // when when somebody has screwed with setTimeout but no I.E. maddness - return cachedSetTimeout(fun, 0); - } catch(e){ - try { - // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally - return cachedSetTimeout.call(null, fun, 0); - } catch(e){ - // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error - return cachedSetTimeout.call(this, fun, 0); - } - } - - -} -function runClearTimeout(marker) { - if (cachedClearTimeout === clearTimeout) { - //normal enviroments in sane situations - return clearTimeout(marker); - } - // if clearTimeout wasn't available but was latter defined - if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { - cachedClearTimeout = clearTimeout; - return clearTimeout(marker); - } - try { - // when when somebody has screwed with setTimeout but no I.E. maddness - return cachedClearTimeout(marker); - } catch (e){ - try { - // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally - return cachedClearTimeout.call(null, marker); - } catch (e){ - // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. - // Some versions of I.E. have different rules for clearTimeout vs setTimeout - return cachedClearTimeout.call(this, marker); - } - } - - - -} -var queue = []; -var draining = false; -var currentQueue; -var queueIndex = -1; - -function cleanUpNextTick() { - if (!draining || !currentQueue) { - return; - } - draining = false; - if (currentQueue.length) { - queue = currentQueue.concat(queue); - } else { - queueIndex = -1; - } - if (queue.length) { - drainQueue(); - } -} - -function drainQueue() { - if (draining) { - return; - } - var timeout = runTimeout(cleanUpNextTick); - draining = true; - - var len = queue.length; - while(len) { - currentQueue = queue; - queue = []; - while (++queueIndex < len) { - if (currentQueue) { - currentQueue[queueIndex].run(); - } - } - queueIndex = -1; - len = queue.length; - } - currentQueue = null; - draining = false; - runClearTimeout(timeout); -} - -process.nextTick = function (fun) { - var args = new Array(arguments.length - 1); - if (arguments.length > 1) { - for (var i = 1; i < arguments.length; i++) { - args[i - 1] = arguments[i]; - } - } - queue.push(new Item(fun, args)); - if (queue.length === 1 && !draining) { - runTimeout(drainQueue); - } -}; - -// v8 likes predictible objects -function Item(fun, array) { - this.fun = fun; - this.array = array; -} -Item.prototype.run = function () { - this.fun.apply(null, this.array); -}; -process.title = 'browser'; -process.browser = true; -process.env = {}; -process.argv = []; -process.version = ''; // empty string to avoid regexp issues -process.versions = {}; - -function noop() {} - -process.on = noop; -process.addListener = noop; -process.once = noop; -process.off = noop; -process.removeListener = noop; -process.removeAllListeners = noop; -process.emit = noop; -process.prependListener = noop; -process.prependOnceListener = noop; - -process.listeners = function (name) { return [] } - -process.binding = function (name) { - throw new Error('process.binding is not supported'); -}; - -process.cwd = function () { return '/' }; -process.chdir = function (dir) { - throw new Error('process.chdir is not supported'); -}; -process.umask = function() { return 0; }; - - -/***/ }), -/* 114 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/* WEBPACK VAR INJECTION */(function(process) {/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -/* istanbul ignore else */ - -var MAX_LENGTH_OF_LONG = 10; -var long_min_digits = "2147483648"; -if (process.arch == "x64") { - MAX_LENGTH_OF_LONG = 19; - long_min_digits = "9223372036854775808"; -} - -module.exports = { - consume_NUM: function consume_NUM() { - var ch = this.yytext[0]; - var hasPoint = this.yytext[0] === "."; - if (ch === "0") { - ch = this.input(); - // check if hexa - if (ch === "x" || ch === "X") { - ch = this.input(); - if (this.is_HEX()) { - return this.consume_HNUM(); - } else { - this.unput(ch ? 2 : 1); - } - } else if (ch === "b" || ch === "B") { - ch = this.input(); - if (ch === "0" || ch === "1") { - return this.consume_BNUM(); - } else { - this.unput(ch ? 2 : 1); - } - } else if (!this.is_NUM()) { - if (ch) this.unput(1); - } - } - - while (this.offset < this.size) { - ch = this.input(); - if (!this.is_NUM()) { - if (ch === "." && !hasPoint) { - hasPoint = true; - } else if (ch === "e" || ch === "E") { - ch = this.input(); - if (ch === "+" || ch === "-") { - ch = this.input(); - if (this.is_NUM()) { - this.consume_LNUM(); - return this.tok.T_DNUMBER; - } else { - this.unput(ch ? 3 : 2); - break; - } - } else if (this.is_NUM()) { - this.consume_LNUM(); - return this.tok.T_DNUMBER; - } else { - this.unput(ch ? 2 : 1); - break; - } - } else { - if (ch) this.unput(1); - break; - } - } - } - if (hasPoint) { - return this.tok.T_DNUMBER; - } else if (this.yytext.length < MAX_LENGTH_OF_LONG - 1) { - return this.tok.T_LNUMBER; - } else { - if (this.yytext.length < MAX_LENGTH_OF_LONG || this.yytext.length == MAX_LENGTH_OF_LONG && this.yytext < long_min_digits) { - return this.tok.T_LNUMBER; - } - return this.tok.T_DNUMBER; - } - }, - // read hexa - consume_HNUM: function consume_HNUM() { - while (this.offset < this.size) { - var ch = this.input(); - if (!this.is_HEX()) { - if (ch) this.unput(1); - break; - } - } - return this.tok.T_LNUMBER; - }, - // read a generic number - consume_LNUM: function consume_LNUM() { - while (this.offset < this.size) { - var ch = this.input(); - if (!this.is_NUM()) { - if (ch) this.unput(1); - break; - } - } - return this.tok.T_LNUMBER; - }, - // read binary - consume_BNUM: function consume_BNUM() { - var ch = void 0; - while (this.offset < this.size) { - ch = this.input(); - if (ch !== "0" && ch !== "1") { - if (ch) this.unput(1); - break; - } - } - return this.tok.T_LNUMBER; - } -}; -/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(113))) - -/***/ }), -/* 115 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -module.exports = { - nextINITIAL: function nextINITIAL() { - if (this.conditionStack.length > 1 && this.conditionStack[this.conditionStack.length - 1] === "INITIAL") { - // Return to HEREDOC/ST_DOUBLE_QUOTES mode - this.popState(); - } else { - this.begin("ST_IN_SCRIPTING"); - } - return this; - }, - matchINITIAL: function matchINITIAL() { - while (this.offset < this.size) { - var ch = this.input(); - if (ch == "<") { - ch = this.ahead(1); - if (ch == "?") { - if (this.tryMatch("?=")) { - this.unput(1).appendToken(this.tok.T_OPEN_TAG_WITH_ECHO, 3).nextINITIAL(); - break; - } else if (this.tryMatchCaseless("?php")) { - ch = this._input[this.offset + 4]; - if (ch === " " || ch === "\t" || ch === "\n" || ch === "\r") { - this.unput(1).appendToken(this.tok.T_OPEN_TAG, 6).nextINITIAL(); - break; - } - } - if (this.short_tags) { - this.unput(1).appendToken(this.tok.T_OPEN_TAG, 2).nextINITIAL(); - break; - } - } else if (this.asp_tags && ch == "%") { - if (this.tryMatch("%=")) { - this.aspTagMode = true; - this.unput(1).appendToken(this.tok.T_OPEN_TAG_WITH_ECHO, 3).nextINITIAL(); - break; - } else { - this.aspTagMode = true; - this.unput(1).appendToken(this.tok.T_OPEN_TAG, 2).nextINITIAL(); - break; - } - } - } - } - if (this.yytext.length > 0) { - return this.tok.T_INLINE_HTML; - } else { - return false; - } - } -}; - -/***/ }), -/* 116 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -module.exports = { - /** - * Reads a single line comment - */ - T_COMMENT: function T_COMMENT() { - while (this.offset < this.size) { - var ch = this.input(); - if (ch === "\n" || ch === "\r") { - return this.tok.T_COMMENT; - } else if (ch === "?" && !this.aspTagMode && this._input[this.offset] === ">") { - this.unput(1); - return this.tok.T_COMMENT; - } else if (ch === "%" && this.aspTagMode && this._input[this.offset] === ">") { - this.unput(1); - return this.tok.T_COMMENT; - } - } - return this.tok.T_COMMENT; - }, - /** - * Behaviour : https://github.com/php/php-src/blob/master/Zend/zend_language_scanner.l#L1927 - */ - T_DOC_COMMENT: function T_DOC_COMMENT() { - var ch = this.input(); - var token = this.tok.T_COMMENT; - if (ch === "*") { - // started with '/*' , check is next is '*' - ch = this.input(); - if (this.is_WHITESPACE()) { - // check if next is WHITESPACE - token = this.tok.T_DOC_COMMENT; - } - if (ch === "/") { - return token; - } else { - this.unput(1); // reset - } - } - while (this.offset < this.size) { - ch = this.input(); - if (ch === "*" && this._input[this.offset] === "/") { - this.input(); - break; - } - } - return token; - } -}; - -/***/ }), -/* 117 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -/** - * This is the php lexer. It will tokenize the string for helping the - * parser to build the AST from its grammar. - * - * @class - * @property {Integer} EOF - * @property {Boolean} all_tokens defines if all tokens must be retrieved (used by token_get_all only) - * @property {Boolean} comment_tokens extracts comments tokens - * @property {Boolean} mode_eval enables the evald mode (ignore opening tags) - * @property {Boolean} asp_tags disables by default asp tags mode - * @property {Boolean} short_tags enables by default short tags mode - * @property {Object} keywords List of php keyword - * @property {Object} castKeywords List of php keywords for type casting - */ - -var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; - -var lexer = function lexer(engine) { - this.engine = engine; - this.tok = this.engine.tokens.names; - this.EOF = 1; - this.debug = false; - this.all_tokens = true; - this.comment_tokens = false; - this.mode_eval = false; - this.asp_tags = false; - this.short_tags = true; - this.php7 = true; - this.yyprevcol = 0; - this.keywords = { - __class__: this.tok.T_CLASS_C, - __trait__: this.tok.T_TRAIT_C, - __function__: this.tok.T_FUNC_C, - __method__: this.tok.T_METHOD_C, - __line__: this.tok.T_LINE, - __file__: this.tok.T_FILE, - __dir__: this.tok.T_DIR, - __namespace__: this.tok.T_NS_C, - exit: this.tok.T_EXIT, - die: this.tok.T_EXIT, - function: this.tok.T_FUNCTION, - const: this.tok.T_CONST, - return: this.tok.T_RETURN, - try: this.tok.T_TRY, - catch: this.tok.T_CATCH, - finally: this.tok.T_FINALLY, - throw: this.tok.T_THROW, - if: this.tok.T_IF, - elseif: this.tok.T_ELSEIF, - endif: this.tok.T_ENDIF, - else: this.tok.T_ELSE, - while: this.tok.T_WHILE, - endwhile: this.tok.T_ENDWHILE, - do: this.tok.T_DO, - for: this.tok.T_FOR, - endfor: this.tok.T_ENDFOR, - foreach: this.tok.T_FOREACH, - endforeach: this.tok.T_ENDFOREACH, - declare: this.tok.T_DECLARE, - enddeclare: this.tok.T_ENDDECLARE, - instanceof: this.tok.T_INSTANCEOF, - as: this.tok.T_AS, - switch: this.tok.T_SWITCH, - endswitch: this.tok.T_ENDSWITCH, - case: this.tok.T_CASE, - default: this.tok.T_DEFAULT, - break: this.tok.T_BREAK, - continue: this.tok.T_CONTINUE, - goto: this.tok.T_GOTO, - echo: this.tok.T_ECHO, - print: this.tok.T_PRINT, - class: this.tok.T_CLASS, - interface: this.tok.T_INTERFACE, - trait: this.tok.T_TRAIT, - extends: this.tok.T_EXTENDS, - implements: this.tok.T_IMPLEMENTS, - new: this.tok.T_NEW, - clone: this.tok.T_CLONE, - var: this.tok.T_VAR, - eval: this.tok.T_EVAL, - include: this.tok.T_INCLUDE, - include_once: this.tok.T_INCLUDE_ONCE, - require: this.tok.T_REQUIRE, - require_once: this.tok.T_REQUIRE_ONCE, - namespace: this.tok.T_NAMESPACE, - use: this.tok.T_USE, - insteadof: this.tok.T_INSTEADOF, - global: this.tok.T_GLOBAL, - isset: this.tok.T_ISSET, - empty: this.tok.T_EMPTY, - __halt_compiler: this.tok.T_HALT_COMPILER, - static: this.tok.T_STATIC, - abstract: this.tok.T_ABSTRACT, - final: this.tok.T_FINAL, - private: this.tok.T_PRIVATE, - protected: this.tok.T_PROTECTED, - public: this.tok.T_PUBLIC, - unset: this.tok.T_UNSET, - list: this.tok.T_LIST, - array: this.tok.T_ARRAY, - callable: this.tok.T_CALLABLE, - or: this.tok.T_LOGICAL_OR, - and: this.tok.T_LOGICAL_AND, - xor: this.tok.T_LOGICAL_XOR - }; - this.castKeywords = { - int: this.tok.T_INT_CAST, - integer: this.tok.T_INT_CAST, - real: this.tok.T_DOUBLE_CAST, - double: this.tok.T_DOUBLE_CAST, - float: this.tok.T_DOUBLE_CAST, - string: this.tok.T_STRING_CAST, - binary: this.tok.T_STRING_CAST, - array: this.tok.T_ARRAY_CAST, - object: this.tok.T_OBJECT_CAST, - bool: this.tok.T_BOOL_CAST, - boolean: this.tok.T_BOOL_CAST, - unset: this.tok.T_UNSET_CAST - }; -}; - -/** - * Initialize the lexer with the specified input - */ -lexer.prototype.setInput = function (input) { - this._input = input; - this.size = input.length; - this.yylineno = 1; - this.offset = 0; - this.yyprevcol = 0; - this.yytext = ""; - this.yylloc = { - first_offset: 0, - first_line: 1, - first_column: 0, - prev_offset: 0, - prev_line: 1, - prev_column: 0, - last_line: 1, - last_column: 0 - }; - this.tokens = []; - this.done = this.offset >= this.size; - if (!this.all_tokens && this.mode_eval) { - this.conditionStack = ["INITIAL"]; - this.begin("ST_IN_SCRIPTING"); - } else { - this.conditionStack = []; - this.begin("INITIAL"); - } - return this; -}; - -/** - * consumes and returns one char from the input - */ -lexer.prototype.input = function () { - var ch = this._input[this.offset]; - if (!ch) return ""; - this.yytext += ch; - this.offset++; - if (ch === "\r" && this._input[this.offset] === "\n") { - this.yytext += "\n"; - this.offset++; - } - if (ch === "\n" || ch === "\r") { - this.yylloc.last_line = ++this.yylineno; - this.yyprevcol = this.yylloc.last_column; - this.yylloc.last_column = 0; - } else { - this.yylloc.last_column++; - } - return ch; -}; - -/** - * revert eating specified size - */ -lexer.prototype.unput = function (size) { - if (size === 1) { - // 1 char unput (most cases) - this.offset--; - if (this._input[this.offset] === "\n" && this._input[this.offset - 1] === "\r") { - this.offset--; - size++; - } - if (this._input[this.offset] === "\r" || this._input[this.offset] === "\n") { - this.yylloc.last_line--; - this.yylineno--; - this.yylloc.last_column = this.yyprevcol; - } else { - this.yylloc.last_column--; - } - this.yytext = this.yytext.substring(0, this.yytext.length - size); - } else if (size > 0) { - this.offset -= size; - if (size < this.yytext.length) { - this.yytext = this.yytext.substring(0, this.yytext.length - size); - // re-calculate position - this.yylloc.last_line = this.yylloc.first_line; - this.yylloc.last_column = this.yyprevcol = this.yylloc.first_column; - for (var i = 0; i < this.yytext.length; i++) { - var c = this.yytext[i]; - if (c === "\r") { - c = this.yytext[++i]; - this.yyprevcol = this.yylloc.last_column; - this.yylloc.last_line++; - this.yylloc.last_column = 0; - if (c !== "\n") { - if (c === "\r") { - this.yylloc.last_line++; - } else { - this.yylloc.last_column++; - } - } - } else if (c === "\n") { - this.yyprevcol = this.yylloc.last_column; - this.yylloc.last_line++; - this.yylloc.last_column = 0; - } else { - this.yylloc.last_column++; - } - } - this.yylineno = this.yylloc.last_line; - } else { - // reset full text - this.yytext = ""; - this.yylloc.last_line = this.yylineno = this.yylloc.first_line; - this.yylloc.last_column = this.yylloc.first_column; - } - } - - return this; -}; - -// check if the text matches -lexer.prototype.tryMatch = function (text) { - return text === this.ahead(text.length); -}; - -// check if the text matches -lexer.prototype.tryMatchCaseless = function (text) { - return text === this.ahead(text.length).toLowerCase(); -}; - -// look ahead -lexer.prototype.ahead = function (size) { - var text = this._input.substring(this.offset, this.offset + size); - if (text[text.length - 1] === "\r" && this._input[this.offset + size + 1] === "\n") { - text += "\n"; - } - return text; -}; - -// consume the specified size -lexer.prototype.consume = function (size) { - for (var i = 0; i < size; i++) { - var ch = this._input[this.offset]; - if (!ch) break; - this.yytext += ch; - this.offset++; - if (ch === "\r" && this._input[this.offset] === "\n") { - this.yytext += "\n"; - this.offset++; - i++; - } - if (ch === "\n" || ch === "\r") { - this.yylloc.last_line = ++this.yylineno; - this.yyprevcol = this.yylloc.last_column; - this.yylloc.last_column = 0; - } else { - this.yylloc.last_column++; - } - } - return this; -}; - -/** - * Gets the current state - */ -lexer.prototype.getState = function () { - return { - yytext: this.yytext, - offset: this.offset, - yylineno: this.yylineno, - yyprevcol: this.yyprevcol, - yylloc: { - first_offset: this.yylloc.first_offset, - first_line: this.yylloc.first_line, - first_column: this.yylloc.first_column, - last_line: this.yylloc.last_line, - last_column: this.yylloc.last_column - } - }; -}; - -/** - * Sets the current lexer state - */ -lexer.prototype.setState = function (state) { - this.yytext = state.yytext; - this.offset = state.offset; - this.yylineno = state.yylineno; - this.yyprevcol = state.yyprevcol; - this.yylloc = state.yylloc; - return this; -}; - -// prepend next token -lexer.prototype.appendToken = function (value, ahead) { - this.tokens.push([value, ahead]); - return this; -}; - -// return next match that has a token -lexer.prototype.lex = function () { - this.yylloc.prev_offset = this.offset; - this.yylloc.prev_line = this.yylloc.last_line; - this.yylloc.prev_column = this.yylloc.last_column; - var token = this.next() || this.lex(); - if (!this.all_tokens) { - while (token === this.tok.T_WHITESPACE || // ignore white space - !this.comment_tokens && (token === this.tok.T_COMMENT || // ignore single lines comments - token === this.tok.T_DOC_COMMENT) || // ignore doc comments - // ignore open tags - token === this.tok.T_OPEN_TAG) { - token = this.next() || this.lex(); - } - if (token == this.tok.T_OPEN_TAG_WITH_ECHO) { - // https://github.com/php/php-src/blob/7ff186434e82ee7be7c59d0db9a976641cf7b09c/Zend/zend_compile.c#L1683 - // open tag with echo statement - return this.tok.T_ECHO; - } else if (token === this.tok.T_CLOSE_TAG) { - // https://github.com/php/php-src/blob/7ff186434e82ee7be7c59d0db9a976641cf7b09c/Zend/zend_compile.c#L1680 - return ";"; /* implicit ; */ - } - } - if (!this.yylloc.prev_offset) { - this.yylloc.prev_offset = this.yylloc.first_offset; - this.yylloc.prev_line = this.yylloc.first_line; - this.yylloc.prev_column = this.yylloc.first_column; - } - /*else if (this.yylloc.prev_offset === this.offset && this.offset !== this.size) { - throw new Error('Infinite loop @ ' + this.offset + ' / ' + this.size); - }*/ - return token; -}; - -// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) -lexer.prototype.begin = function (condition) { - this.conditionStack.push(condition); - this.curCondition = condition; - this.stateCb = this["match" + condition]; - if (typeof this.stateCb !== "function") { - throw new Error('Undefined condition state "' + condition + '"'); - } - return this; -}; - -// pop the previously active lexer condition state off the condition stack -lexer.prototype.popState = function () { - var n = this.conditionStack.length - 1; - var condition = n > 0 ? this.conditionStack.pop() : this.conditionStack[0]; - this.curCondition = this.conditionStack[this.conditionStack.length - 1]; - this.stateCb = this["match" + this.curCondition]; - if (typeof this.stateCb !== "function") { - throw new Error('Undefined condition state "' + this.curCondition + '"'); - } - return condition; -}; - -// return next match in input -lexer.prototype.next = function () { - var token = void 0; - if (!this._input) { - this.done = true; - } - this.yylloc.first_offset = this.offset; - this.yylloc.first_line = this.yylloc.last_line; - this.yylloc.first_column = this.yylloc.last_column; - this.yytext = ""; - if (this.done) { - this.yylloc.prev_offset = this.yylloc.first_offset; - this.yylloc.prev_line = this.yylloc.first_line; - this.yylloc.prev_column = this.yylloc.first_column; - return this.EOF; - } - if (this.tokens.length > 0) { - token = this.tokens.shift(); - if (_typeof(token[1]) === "object") { - this.setState(token[1]); - } else { - this.consume(token[1]); - } - token = token[0]; - } else { - token = this.stateCb.apply(this, []); - } - if (this.offset >= this.size && this.tokens.length === 0) { - this.done = true; - } - if (this.debug) { - var tName = token; - if (typeof tName === "number") { - tName = this.engine.tokens.values[tName]; - } else { - tName = '"' + tName + '"'; - } - var e = new Error(tName + "\tfrom " + this.yylloc.first_line + "," + this.yylloc.first_column + "\t - to " + this.yylloc.last_line + "," + this.yylloc.last_column + '\t"' + this.yytext + '"'); - // eslint-disable-next-line no-console - console.error(e.stack); - } - return token; -}; - -// extends the lexer with states -[__webpack_require__(116), __webpack_require__(115), __webpack_require__(114), __webpack_require__(112), __webpack_require__(111), __webpack_require__(110), __webpack_require__(109), __webpack_require__(108)].forEach(function (ext) { - for (var k in ext) { - lexer.prototype[k] = ext[k]; - } -}); - -module.exports = lexer; - -/***/ }), -/* 118 */ -/***/ (function(module, exports) { - -var toString = {}.toString; - -module.exports = Array.isArray || function (arr) { - return toString.call(arr) == '[object Array]'; -}; - - -/***/ }), -/* 119 */ -/***/ (function(module, exports) { - -exports.read = function (buffer, offset, isLE, mLen, nBytes) { - var e, m - var eLen = (nBytes * 8) - mLen - 1 - var eMax = (1 << eLen) - 1 - var eBias = eMax >> 1 - var nBits = -7 - var i = isLE ? (nBytes - 1) : 0 - var d = isLE ? -1 : 1 - var s = buffer[offset + i] - - i += d - - e = s & ((1 << (-nBits)) - 1) - s >>= (-nBits) - nBits += eLen - for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {} - - m = e & ((1 << (-nBits)) - 1) - e >>= (-nBits) - nBits += mLen - for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {} - - if (e === 0) { - e = 1 - eBias - } else if (e === eMax) { - return m ? NaN : ((s ? -1 : 1) * Infinity) - } else { - m = m + Math.pow(2, mLen) - e = e - eBias - } - return (s ? -1 : 1) * m * Math.pow(2, e - mLen) -} - -exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { - var e, m, c - var eLen = (nBytes * 8) - mLen - 1 - var eMax = (1 << eLen) - 1 - var eBias = eMax >> 1 - var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) - var i = isLE ? 0 : (nBytes - 1) - var d = isLE ? 1 : -1 - var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 - - value = Math.abs(value) - - if (isNaN(value) || value === Infinity) { - m = isNaN(value) ? 1 : 0 - e = eMax - } else { - e = Math.floor(Math.log(value) / Math.LN2) - if (value * (c = Math.pow(2, -e)) < 1) { - e-- - c *= 2 - } - if (e + eBias >= 1) { - value += rt / c - } else { - value += rt * Math.pow(2, 1 - eBias) - } - if (value * c >= 2) { - e++ - c /= 2 - } - - if (e + eBias >= eMax) { - m = 0 - e = eMax - } else if (e + eBias >= 1) { - m = ((value * c) - 1) * Math.pow(2, mLen) - e = e + eBias - } else { - m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) - e = 0 - } - } - - for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} - - e = (e << mLen) | m - eLen += mLen - for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} - - buffer[offset + i - d] |= s * 128 -} - - -/***/ }), -/* 120 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -exports.byteLength = byteLength -exports.toByteArray = toByteArray -exports.fromByteArray = fromByteArray - -var lookup = [] -var revLookup = [] -var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array - -var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' -for (var i = 0, len = code.length; i < len; ++i) { - lookup[i] = code[i] - revLookup[code.charCodeAt(i)] = i -} - -// Support decoding URL-safe base64 strings, as Node.js does. -// See: https://en.wikipedia.org/wiki/Base64#URL_applications -revLookup['-'.charCodeAt(0)] = 62 -revLookup['_'.charCodeAt(0)] = 63 - -function getLens (b64) { - var len = b64.length - - if (len % 4 > 0) { - throw new Error('Invalid string. Length must be a multiple of 4') - } - - // Trim off extra bytes after placeholder bytes are found - // See: https://github.com/beatgammit/base64-js/issues/42 - var validLen = b64.indexOf('=') - if (validLen === -1) validLen = len - - var placeHoldersLen = validLen === len - ? 0 - : 4 - (validLen % 4) - - return [validLen, placeHoldersLen] -} - -// base64 is 4/3 + up to two characters of the original data -function byteLength (b64) { - var lens = getLens(b64) - var validLen = lens[0] - var placeHoldersLen = lens[1] - return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen -} - -function _byteLength (b64, validLen, placeHoldersLen) { - return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen -} - -function toByteArray (b64) { - var tmp - var lens = getLens(b64) - var validLen = lens[0] - var placeHoldersLen = lens[1] - - var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen)) - - var curByte = 0 - - // if there are placeholders, only get up to the last complete 4 chars - var len = placeHoldersLen > 0 - ? validLen - 4 - : validLen - - for (var i = 0; i < len; i += 4) { - tmp = - (revLookup[b64.charCodeAt(i)] << 18) | - (revLookup[b64.charCodeAt(i + 1)] << 12) | - (revLookup[b64.charCodeAt(i + 2)] << 6) | - revLookup[b64.charCodeAt(i + 3)] - arr[curByte++] = (tmp >> 16) & 0xFF - arr[curByte++] = (tmp >> 8) & 0xFF - arr[curByte++] = tmp & 0xFF - } - - if (placeHoldersLen === 2) { - tmp = - (revLookup[b64.charCodeAt(i)] << 2) | - (revLookup[b64.charCodeAt(i + 1)] >> 4) - arr[curByte++] = tmp & 0xFF - } - - if (placeHoldersLen === 1) { - tmp = - (revLookup[b64.charCodeAt(i)] << 10) | - (revLookup[b64.charCodeAt(i + 1)] << 4) | - (revLookup[b64.charCodeAt(i + 2)] >> 2) - arr[curByte++] = (tmp >> 8) & 0xFF - arr[curByte++] = tmp & 0xFF - } - - return arr -} - -function tripletToBase64 (num) { - return lookup[num >> 18 & 0x3F] + - lookup[num >> 12 & 0x3F] + - lookup[num >> 6 & 0x3F] + - lookup[num & 0x3F] -} - -function encodeChunk (uint8, start, end) { - var tmp - var output = [] - for (var i = start; i < end; i += 3) { - tmp = - ((uint8[i] << 16) & 0xFF0000) + - ((uint8[i + 1] << 8) & 0xFF00) + - (uint8[i + 2] & 0xFF) - output.push(tripletToBase64(tmp)) - } - return output.join('') -} - -function fromByteArray (uint8) { - var tmp - var len = uint8.length - var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes - var parts = [] - var maxChunkLength = 16383 // must be multiple of 3 - - // go through the array every three bytes, we'll deal with trailing stuff later - for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { - parts.push(encodeChunk( - uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength) - )) - } - - // pad the end with zeros, but make sure to not forget the extra bytes - if (extraBytes === 1) { - tmp = uint8[len - 1] - parts.push( - lookup[tmp >> 2] + - lookup[(tmp << 4) & 0x3F] + - '==' - ) - } else if (extraBytes === 2) { - tmp = (uint8[len - 2] << 8) + uint8[len - 1] - parts.push( - lookup[tmp >> 10] + - lookup[(tmp >> 4) & 0x3F] + - lookup[(tmp << 2) & 0x3F] + - '=' - ) - } - - return parts.join('') -} - - -/***/ }), -/* 121 */ -/***/ (function(module, exports) { - -var g; - -// This works in non-strict mode -g = (function() { - return this; -})(); - -try { - // This works if eval is allowed (see CSP) - g = g || Function("return this")() || (1, eval)("this"); -} catch (e) { - // This works if the window reference is available - if (typeof window === "object") g = window; -} - -// g can still be undefined, but nothing to do about it... -// We return undefined, instead of nothing here, so it's -// easier to handle this case. if(!global) { ...} - -module.exports = g; - - -/***/ }), -/* 122 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/* WEBPACK VAR INJECTION */(function(global) {/*! - * The buffer module from node.js, for the browser. - * - * @author Feross Aboukhadijeh - * @license MIT - */ -/* eslint-disable no-proto */ - - - -var base64 = __webpack_require__(120) -var ieee754 = __webpack_require__(119) -var isArray = __webpack_require__(118) - -exports.Buffer = Buffer -exports.SlowBuffer = SlowBuffer -exports.INSPECT_MAX_BYTES = 50 - -/** - * If `Buffer.TYPED_ARRAY_SUPPORT`: - * === true Use Uint8Array implementation (fastest) - * === false Use Object implementation (most compatible, even IE6) - * - * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, - * Opera 11.6+, iOS 4.2+. - * - * Due to various browser bugs, sometimes the Object implementation will be used even - * when the browser supports typed arrays. - * - * Note: - * - * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances, - * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. - * - * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. - * - * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of - * incorrect length in some situations. - - * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they - * get the Object implementation, which is slower but behaves correctly. - */ -Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined - ? global.TYPED_ARRAY_SUPPORT - : typedArraySupport() - -/* - * Export kMaxLength after typed array support is determined. - */ -exports.kMaxLength = kMaxLength() - -function typedArraySupport () { - try { - var arr = new Uint8Array(1) - arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }} - return arr.foo() === 42 && // typed array instances can be augmented - typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray` - arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray` - } catch (e) { - return false - } -} - -function kMaxLength () { - return Buffer.TYPED_ARRAY_SUPPORT - ? 0x7fffffff - : 0x3fffffff -} - -function createBuffer (that, length) { - if (kMaxLength() < length) { - throw new RangeError('Invalid typed array length') - } - if (Buffer.TYPED_ARRAY_SUPPORT) { - // Return an augmented `Uint8Array` instance, for best performance - that = new Uint8Array(length) - that.__proto__ = Buffer.prototype - } else { - // Fallback: Return an object instance of the Buffer class - if (that === null) { - that = new Buffer(length) - } - that.length = length - } - - return that -} - -/** - * The Buffer constructor returns instances of `Uint8Array` that have their - * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of - * `Uint8Array`, so the returned instances will have all the node `Buffer` methods - * and the `Uint8Array` methods. Square bracket notation works as expected -- it - * returns a single octet. - * - * The `Uint8Array` prototype remains unmodified. - */ - -function Buffer (arg, encodingOrOffset, length) { - if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) { - return new Buffer(arg, encodingOrOffset, length) - } - - // Common case. - if (typeof arg === 'number') { - if (typeof encodingOrOffset === 'string') { - throw new Error( - 'If encoding is specified then the first argument must be a string' - ) - } - return allocUnsafe(this, arg) - } - return from(this, arg, encodingOrOffset, length) -} - -Buffer.poolSize = 8192 // not used by this implementation - -// TODO: Legacy, not needed anymore. Remove in next major version. -Buffer._augment = function (arr) { - arr.__proto__ = Buffer.prototype - return arr -} - -function from (that, value, encodingOrOffset, length) { - if (typeof value === 'number') { - throw new TypeError('"value" argument must not be a number') - } - - if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) { - return fromArrayBuffer(that, value, encodingOrOffset, length) - } - - if (typeof value === 'string') { - return fromString(that, value, encodingOrOffset) - } - - return fromObject(that, value) -} - -/** - * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError - * if value is a number. - * Buffer.from(str[, encoding]) - * Buffer.from(array) - * Buffer.from(buffer) - * Buffer.from(arrayBuffer[, byteOffset[, length]]) - **/ -Buffer.from = function (value, encodingOrOffset, length) { - return from(null, value, encodingOrOffset, length) -} - -if (Buffer.TYPED_ARRAY_SUPPORT) { - Buffer.prototype.__proto__ = Uint8Array.prototype - Buffer.__proto__ = Uint8Array - if (typeof Symbol !== 'undefined' && Symbol.species && - Buffer[Symbol.species] === Buffer) { - // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97 - Object.defineProperty(Buffer, Symbol.species, { - value: null, - configurable: true - }) - } -} - -function assertSize (size) { - if (typeof size !== 'number') { - throw new TypeError('"size" argument must be a number') - } else if (size < 0) { - throw new RangeError('"size" argument must not be negative') - } -} - -function alloc (that, size, fill, encoding) { - assertSize(size) - if (size <= 0) { - return createBuffer(that, size) - } - if (fill !== undefined) { - // Only pay attention to encoding if it's a string. This - // prevents accidentally sending in a number that would - // be interpretted as a start offset. - return typeof encoding === 'string' - ? createBuffer(that, size).fill(fill, encoding) - : createBuffer(that, size).fill(fill) - } - return createBuffer(that, size) -} - -/** - * Creates a new filled Buffer instance. - * alloc(size[, fill[, encoding]]) - **/ -Buffer.alloc = function (size, fill, encoding) { - return alloc(null, size, fill, encoding) -} - -function allocUnsafe (that, size) { - assertSize(size) - that = createBuffer(that, size < 0 ? 0 : checked(size) | 0) - if (!Buffer.TYPED_ARRAY_SUPPORT) { - for (var i = 0; i < size; ++i) { - that[i] = 0 - } - } - return that -} - -/** - * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance. - * */ -Buffer.allocUnsafe = function (size) { - return allocUnsafe(null, size) -} -/** - * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance. - */ -Buffer.allocUnsafeSlow = function (size) { - return allocUnsafe(null, size) -} - -function fromString (that, string, encoding) { - if (typeof encoding !== 'string' || encoding === '') { - encoding = 'utf8' - } - - if (!Buffer.isEncoding(encoding)) { - throw new TypeError('"encoding" must be a valid string encoding') - } - - var length = byteLength(string, encoding) | 0 - that = createBuffer(that, length) - - var actual = that.write(string, encoding) - - if (actual !== length) { - // Writing a hex string, for example, that contains invalid characters will - // cause everything after the first invalid character to be ignored. (e.g. - // 'abxxcd' will be treated as 'ab') - that = that.slice(0, actual) - } - - return that -} - -function fromArrayLike (that, array) { - var length = array.length < 0 ? 0 : checked(array.length) | 0 - that = createBuffer(that, length) - for (var i = 0; i < length; i += 1) { - that[i] = array[i] & 255 - } - return that -} - -function fromArrayBuffer (that, array, byteOffset, length) { - array.byteLength // this throws if `array` is not a valid ArrayBuffer - - if (byteOffset < 0 || array.byteLength < byteOffset) { - throw new RangeError('\'offset\' is out of bounds') - } - - if (array.byteLength < byteOffset + (length || 0)) { - throw new RangeError('\'length\' is out of bounds') - } - - if (byteOffset === undefined && length === undefined) { - array = new Uint8Array(array) - } else if (length === undefined) { - array = new Uint8Array(array, byteOffset) - } else { - array = new Uint8Array(array, byteOffset, length) - } - - if (Buffer.TYPED_ARRAY_SUPPORT) { - // Return an augmented `Uint8Array` instance, for best performance - that = array - that.__proto__ = Buffer.prototype - } else { - // Fallback: Return an object instance of the Buffer class - that = fromArrayLike(that, array) - } - return that -} - -function fromObject (that, obj) { - if (Buffer.isBuffer(obj)) { - var len = checked(obj.length) | 0 - that = createBuffer(that, len) - - if (that.length === 0) { - return that - } - - obj.copy(that, 0, 0, len) - return that - } - - if (obj) { - if ((typeof ArrayBuffer !== 'undefined' && - obj.buffer instanceof ArrayBuffer) || 'length' in obj) { - if (typeof obj.length !== 'number' || isnan(obj.length)) { - return createBuffer(that, 0) - } - return fromArrayLike(that, obj) - } - - if (obj.type === 'Buffer' && isArray(obj.data)) { - return fromArrayLike(that, obj.data) - } - } - - throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.') -} - -function checked (length) { - // Note: cannot use `length < kMaxLength()` here because that fails when - // length is NaN (which is otherwise coerced to zero.) - if (length >= kMaxLength()) { - throw new RangeError('Attempt to allocate Buffer larger than maximum ' + - 'size: 0x' + kMaxLength().toString(16) + ' bytes') - } - return length | 0 -} - -function SlowBuffer (length) { - if (+length != length) { // eslint-disable-line eqeqeq - length = 0 - } - return Buffer.alloc(+length) -} - -Buffer.isBuffer = function isBuffer (b) { - return !!(b != null && b._isBuffer) -} - -Buffer.compare = function compare (a, b) { - if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { - throw new TypeError('Arguments must be Buffers') - } - - if (a === b) return 0 - - var x = a.length - var y = b.length - - for (var i = 0, len = Math.min(x, y); i < len; ++i) { - if (a[i] !== b[i]) { - x = a[i] - y = b[i] - break - } - } - - if (x < y) return -1 - if (y < x) return 1 - return 0 -} - -Buffer.isEncoding = function isEncoding (encoding) { - switch (String(encoding).toLowerCase()) { - case 'hex': - case 'utf8': - case 'utf-8': - case 'ascii': - case 'latin1': - case 'binary': - case 'base64': - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return true - default: - return false - } -} - -Buffer.concat = function concat (list, length) { - if (!isArray(list)) { - throw new TypeError('"list" argument must be an Array of Buffers') - } - - if (list.length === 0) { - return Buffer.alloc(0) - } - - var i - if (length === undefined) { - length = 0 - for (i = 0; i < list.length; ++i) { - length += list[i].length - } - } - - var buffer = Buffer.allocUnsafe(length) - var pos = 0 - for (i = 0; i < list.length; ++i) { - var buf = list[i] - if (!Buffer.isBuffer(buf)) { - throw new TypeError('"list" argument must be an Array of Buffers') - } - buf.copy(buffer, pos) - pos += buf.length - } - return buffer -} - -function byteLength (string, encoding) { - if (Buffer.isBuffer(string)) { - return string.length - } - if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' && - (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) { - return string.byteLength - } - if (typeof string !== 'string') { - string = '' + string - } - - var len = string.length - if (len === 0) return 0 - - // Use a for loop to avoid recursion - var loweredCase = false - for (;;) { - switch (encoding) { - case 'ascii': - case 'latin1': - case 'binary': - return len - case 'utf8': - case 'utf-8': - case undefined: - return utf8ToBytes(string).length - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return len * 2 - case 'hex': - return len >>> 1 - case 'base64': - return base64ToBytes(string).length - default: - if (loweredCase) return utf8ToBytes(string).length // assume utf8 - encoding = ('' + encoding).toLowerCase() - loweredCase = true - } - } -} -Buffer.byteLength = byteLength - -function slowToString (encoding, start, end) { - var loweredCase = false - - // No need to verify that "this.length <= MAX_UINT32" since it's a read-only - // property of a typed array. - - // This behaves neither like String nor Uint8Array in that we set start/end - // to their upper/lower bounds if the value passed is out of range. - // undefined is handled specially as per ECMA-262 6th Edition, - // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization. - if (start === undefined || start < 0) { - start = 0 - } - // Return early if start > this.length. Done here to prevent potential uint32 - // coercion fail below. - if (start > this.length) { - return '' - } - - if (end === undefined || end > this.length) { - end = this.length - } - - if (end <= 0) { - return '' - } - - // Force coersion to uint32. This will also coerce falsey/NaN values to 0. - end >>>= 0 - start >>>= 0 - - if (end <= start) { - return '' - } - - if (!encoding) encoding = 'utf8' - - while (true) { - switch (encoding) { - case 'hex': - return hexSlice(this, start, end) - - case 'utf8': - case 'utf-8': - return utf8Slice(this, start, end) - - case 'ascii': - return asciiSlice(this, start, end) - - case 'latin1': - case 'binary': - return latin1Slice(this, start, end) - - case 'base64': - return base64Slice(this, start, end) - - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return utf16leSlice(this, start, end) - - default: - if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) - encoding = (encoding + '').toLowerCase() - loweredCase = true - } - } -} - -// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect -// Buffer instances. -Buffer.prototype._isBuffer = true - -function swap (b, n, m) { - var i = b[n] - b[n] = b[m] - b[m] = i -} - -Buffer.prototype.swap16 = function swap16 () { - var len = this.length - if (len % 2 !== 0) { - throw new RangeError('Buffer size must be a multiple of 16-bits') - } - for (var i = 0; i < len; i += 2) { - swap(this, i, i + 1) - } - return this -} - -Buffer.prototype.swap32 = function swap32 () { - var len = this.length - if (len % 4 !== 0) { - throw new RangeError('Buffer size must be a multiple of 32-bits') - } - for (var i = 0; i < len; i += 4) { - swap(this, i, i + 3) - swap(this, i + 1, i + 2) - } - return this -} - -Buffer.prototype.swap64 = function swap64 () { - var len = this.length - if (len % 8 !== 0) { - throw new RangeError('Buffer size must be a multiple of 64-bits') - } - for (var i = 0; i < len; i += 8) { - swap(this, i, i + 7) - swap(this, i + 1, i + 6) - swap(this, i + 2, i + 5) - swap(this, i + 3, i + 4) - } - return this -} - -Buffer.prototype.toString = function toString () { - var length = this.length | 0 - if (length === 0) return '' - if (arguments.length === 0) return utf8Slice(this, 0, length) - return slowToString.apply(this, arguments) -} - -Buffer.prototype.equals = function equals (b) { - if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') - if (this === b) return true - return Buffer.compare(this, b) === 0 -} - -Buffer.prototype.inspect = function inspect () { - var str = '' - var max = exports.INSPECT_MAX_BYTES - if (this.length > 0) { - str = this.toString('hex', 0, max).match(/.{2}/g).join(' ') - if (this.length > max) str += ' ... ' - } - return '' -} - -Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) { - if (!Buffer.isBuffer(target)) { - throw new TypeError('Argument must be a Buffer') - } - - if (start === undefined) { - start = 0 - } - if (end === undefined) { - end = target ? target.length : 0 - } - if (thisStart === undefined) { - thisStart = 0 - } - if (thisEnd === undefined) { - thisEnd = this.length - } - - if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) { - throw new RangeError('out of range index') - } - - if (thisStart >= thisEnd && start >= end) { - return 0 - } - if (thisStart >= thisEnd) { - return -1 - } - if (start >= end) { - return 1 - } - - start >>>= 0 - end >>>= 0 - thisStart >>>= 0 - thisEnd >>>= 0 - - if (this === target) return 0 - - var x = thisEnd - thisStart - var y = end - start - var len = Math.min(x, y) - - var thisCopy = this.slice(thisStart, thisEnd) - var targetCopy = target.slice(start, end) - - for (var i = 0; i < len; ++i) { - if (thisCopy[i] !== targetCopy[i]) { - x = thisCopy[i] - y = targetCopy[i] - break - } - } - - if (x < y) return -1 - if (y < x) return 1 - return 0 -} - -// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`, -// OR the last index of `val` in `buffer` at offset <= `byteOffset`. -// -// Arguments: -// - buffer - a Buffer to search -// - val - a string, Buffer, or number -// - byteOffset - an index into `buffer`; will be clamped to an int32 -// - encoding - an optional encoding, relevant is val is a string -// - dir - true for indexOf, false for lastIndexOf -function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) { - // Empty buffer means no match - if (buffer.length === 0) return -1 - - // Normalize byteOffset - if (typeof byteOffset === 'string') { - encoding = byteOffset - byteOffset = 0 - } else if (byteOffset > 0x7fffffff) { - byteOffset = 0x7fffffff - } else if (byteOffset < -0x80000000) { - byteOffset = -0x80000000 - } - byteOffset = +byteOffset // Coerce to Number. - if (isNaN(byteOffset)) { - // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer - byteOffset = dir ? 0 : (buffer.length - 1) - } - - // Normalize byteOffset: negative offsets start from the end of the buffer - if (byteOffset < 0) byteOffset = buffer.length + byteOffset - if (byteOffset >= buffer.length) { - if (dir) return -1 - else byteOffset = buffer.length - 1 - } else if (byteOffset < 0) { - if (dir) byteOffset = 0 - else return -1 - } - - // Normalize val - if (typeof val === 'string') { - val = Buffer.from(val, encoding) - } - - // Finally, search either indexOf (if dir is true) or lastIndexOf - if (Buffer.isBuffer(val)) { - // Special case: looking for empty string/buffer always fails - if (val.length === 0) { - return -1 - } - return arrayIndexOf(buffer, val, byteOffset, encoding, dir) - } else if (typeof val === 'number') { - val = val & 0xFF // Search for a byte value [0-255] - if (Buffer.TYPED_ARRAY_SUPPORT && - typeof Uint8Array.prototype.indexOf === 'function') { - if (dir) { - return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset) - } else { - return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset) - } - } - return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir) - } - - throw new TypeError('val must be string, number or Buffer') -} - -function arrayIndexOf (arr, val, byteOffset, encoding, dir) { - var indexSize = 1 - var arrLength = arr.length - var valLength = val.length - - if (encoding !== undefined) { - encoding = String(encoding).toLowerCase() - if (encoding === 'ucs2' || encoding === 'ucs-2' || - encoding === 'utf16le' || encoding === 'utf-16le') { - if (arr.length < 2 || val.length < 2) { - return -1 - } - indexSize = 2 - arrLength /= 2 - valLength /= 2 - byteOffset /= 2 - } - } - - function read (buf, i) { - if (indexSize === 1) { - return buf[i] - } else { - return buf.readUInt16BE(i * indexSize) - } - } - - var i - if (dir) { - var foundIndex = -1 - for (i = byteOffset; i < arrLength; i++) { - if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { - if (foundIndex === -1) foundIndex = i - if (i - foundIndex + 1 === valLength) return foundIndex * indexSize - } else { - if (foundIndex !== -1) i -= i - foundIndex - foundIndex = -1 - } - } - } else { - if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength - for (i = byteOffset; i >= 0; i--) { - var found = true - for (var j = 0; j < valLength; j++) { - if (read(arr, i + j) !== read(val, j)) { - found = false - break - } - } - if (found) return i - } - } - - return -1 -} - -Buffer.prototype.includes = function includes (val, byteOffset, encoding) { - return this.indexOf(val, byteOffset, encoding) !== -1 -} - -Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) { - return bidirectionalIndexOf(this, val, byteOffset, encoding, true) -} - -Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) { - return bidirectionalIndexOf(this, val, byteOffset, encoding, false) -} - -function hexWrite (buf, string, offset, length) { - offset = Number(offset) || 0 - var remaining = buf.length - offset - if (!length) { - length = remaining - } else { - length = Number(length) - if (length > remaining) { - length = remaining - } - } - - // must be an even number of digits - var strLen = string.length - if (strLen % 2 !== 0) throw new TypeError('Invalid hex string') - - if (length > strLen / 2) { - length = strLen / 2 - } - for (var i = 0; i < length; ++i) { - var parsed = parseInt(string.substr(i * 2, 2), 16) - if (isNaN(parsed)) return i - buf[offset + i] = parsed - } - return i -} - -function utf8Write (buf, string, offset, length) { - return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) -} - -function asciiWrite (buf, string, offset, length) { - return blitBuffer(asciiToBytes(string), buf, offset, length) -} - -function latin1Write (buf, string, offset, length) { - return asciiWrite(buf, string, offset, length) -} - -function base64Write (buf, string, offset, length) { - return blitBuffer(base64ToBytes(string), buf, offset, length) -} - -function ucs2Write (buf, string, offset, length) { - return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) -} - -Buffer.prototype.write = function write (string, offset, length, encoding) { - // Buffer#write(string) - if (offset === undefined) { - encoding = 'utf8' - length = this.length - offset = 0 - // Buffer#write(string, encoding) - } else if (length === undefined && typeof offset === 'string') { - encoding = offset - length = this.length - offset = 0 - // Buffer#write(string, offset[, length][, encoding]) - } else if (isFinite(offset)) { - offset = offset | 0 - if (isFinite(length)) { - length = length | 0 - if (encoding === undefined) encoding = 'utf8' - } else { - encoding = length - length = undefined - } - // legacy write(string, encoding, offset, length) - remove in v0.13 - } else { - throw new Error( - 'Buffer.write(string, encoding, offset[, length]) is no longer supported' - ) - } - - var remaining = this.length - offset - if (length === undefined || length > remaining) length = remaining - - if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { - throw new RangeError('Attempt to write outside buffer bounds') - } - - if (!encoding) encoding = 'utf8' - - var loweredCase = false - for (;;) { - switch (encoding) { - case 'hex': - return hexWrite(this, string, offset, length) - - case 'utf8': - case 'utf-8': - return utf8Write(this, string, offset, length) - - case 'ascii': - return asciiWrite(this, string, offset, length) - - case 'latin1': - case 'binary': - return latin1Write(this, string, offset, length) - - case 'base64': - // Warning: maxLength not taken into account in base64Write - return base64Write(this, string, offset, length) - - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return ucs2Write(this, string, offset, length) - - default: - if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) - encoding = ('' + encoding).toLowerCase() - loweredCase = true - } - } -} - -Buffer.prototype.toJSON = function toJSON () { - return { - type: 'Buffer', - data: Array.prototype.slice.call(this._arr || this, 0) - } -} - -function base64Slice (buf, start, end) { - if (start === 0 && end === buf.length) { - return base64.fromByteArray(buf) - } else { - return base64.fromByteArray(buf.slice(start, end)) - } -} - -function utf8Slice (buf, start, end) { - end = Math.min(buf.length, end) - var res = [] - - var i = start - while (i < end) { - var firstByte = buf[i] - var codePoint = null - var bytesPerSequence = (firstByte > 0xEF) ? 4 - : (firstByte > 0xDF) ? 3 - : (firstByte > 0xBF) ? 2 - : 1 - - if (i + bytesPerSequence <= end) { - var secondByte, thirdByte, fourthByte, tempCodePoint - - switch (bytesPerSequence) { - case 1: - if (firstByte < 0x80) { - codePoint = firstByte - } - break - case 2: - secondByte = buf[i + 1] - if ((secondByte & 0xC0) === 0x80) { - tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F) - if (tempCodePoint > 0x7F) { - codePoint = tempCodePoint - } - } - break - case 3: - secondByte = buf[i + 1] - thirdByte = buf[i + 2] - if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { - tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F) - if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { - codePoint = tempCodePoint - } - } - break - case 4: - secondByte = buf[i + 1] - thirdByte = buf[i + 2] - fourthByte = buf[i + 3] - if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { - tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F) - if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { - codePoint = tempCodePoint - } - } - } - } - - if (codePoint === null) { - // we did not generate a valid codePoint so insert a - // replacement char (U+FFFD) and advance only 1 byte - codePoint = 0xFFFD - bytesPerSequence = 1 - } else if (codePoint > 0xFFFF) { - // encode to utf16 (surrogate pair dance) - codePoint -= 0x10000 - res.push(codePoint >>> 10 & 0x3FF | 0xD800) - codePoint = 0xDC00 | codePoint & 0x3FF - } - - res.push(codePoint) - i += bytesPerSequence - } - - return decodeCodePointsArray(res) -} - -// Based on http://stackoverflow.com/a/22747272/680742, the browser with -// the lowest limit is Chrome, with 0x10000 args. -// We go 1 magnitude less, for safety -var MAX_ARGUMENTS_LENGTH = 0x1000 - -function decodeCodePointsArray (codePoints) { - var len = codePoints.length - if (len <= MAX_ARGUMENTS_LENGTH) { - return String.fromCharCode.apply(String, codePoints) // avoid extra slice() - } - - // Decode in chunks to avoid "call stack size exceeded". - var res = '' - var i = 0 - while (i < len) { - res += String.fromCharCode.apply( - String, - codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) - ) - } - return res -} - -function asciiSlice (buf, start, end) { - var ret = '' - end = Math.min(buf.length, end) - - for (var i = start; i < end; ++i) { - ret += String.fromCharCode(buf[i] & 0x7F) - } - return ret -} - -function latin1Slice (buf, start, end) { - var ret = '' - end = Math.min(buf.length, end) - - for (var i = start; i < end; ++i) { - ret += String.fromCharCode(buf[i]) - } - return ret -} - -function hexSlice (buf, start, end) { - var len = buf.length - - if (!start || start < 0) start = 0 - if (!end || end < 0 || end > len) end = len - - var out = '' - for (var i = start; i < end; ++i) { - out += toHex(buf[i]) - } - return out -} - -function utf16leSlice (buf, start, end) { - var bytes = buf.slice(start, end) - var res = '' - for (var i = 0; i < bytes.length; i += 2) { - res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256) - } - return res -} - -Buffer.prototype.slice = function slice (start, end) { - var len = this.length - start = ~~start - end = end === undefined ? len : ~~end - - if (start < 0) { - start += len - if (start < 0) start = 0 - } else if (start > len) { - start = len - } - - if (end < 0) { - end += len - if (end < 0) end = 0 - } else if (end > len) { - end = len - } - - if (end < start) end = start - - var newBuf - if (Buffer.TYPED_ARRAY_SUPPORT) { - newBuf = this.subarray(start, end) - newBuf.__proto__ = Buffer.prototype - } else { - var sliceLen = end - start - newBuf = new Buffer(sliceLen, undefined) - for (var i = 0; i < sliceLen; ++i) { - newBuf[i] = this[i + start] - } - } - - return newBuf -} - -/* - * Need to make sure that buffer isn't trying to write out of bounds. - */ -function checkOffset (offset, ext, length) { - if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') - if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') -} - -Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { - offset = offset | 0 - byteLength = byteLength | 0 - if (!noAssert) checkOffset(offset, byteLength, this.length) - - var val = this[offset] - var mul = 1 - var i = 0 - while (++i < byteLength && (mul *= 0x100)) { - val += this[offset + i] * mul - } - - return val -} - -Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { - offset = offset | 0 - byteLength = byteLength | 0 - if (!noAssert) { - checkOffset(offset, byteLength, this.length) - } - - var val = this[offset + --byteLength] - var mul = 1 - while (byteLength > 0 && (mul *= 0x100)) { - val += this[offset + --byteLength] * mul - } - - return val -} - -Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { - if (!noAssert) checkOffset(offset, 1, this.length) - return this[offset] -} - -Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 2, this.length) - return this[offset] | (this[offset + 1] << 8) -} - -Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 2, this.length) - return (this[offset] << 8) | this[offset + 1] -} - -Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length) - - return ((this[offset]) | - (this[offset + 1] << 8) | - (this[offset + 2] << 16)) + - (this[offset + 3] * 0x1000000) -} - -Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length) - - return (this[offset] * 0x1000000) + - ((this[offset + 1] << 16) | - (this[offset + 2] << 8) | - this[offset + 3]) -} - -Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { - offset = offset | 0 - byteLength = byteLength | 0 - if (!noAssert) checkOffset(offset, byteLength, this.length) - - var val = this[offset] - var mul = 1 - var i = 0 - while (++i < byteLength && (mul *= 0x100)) { - val += this[offset + i] * mul - } - mul *= 0x80 - - if (val >= mul) val -= Math.pow(2, 8 * byteLength) - - return val -} - -Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { - offset = offset | 0 - byteLength = byteLength | 0 - if (!noAssert) checkOffset(offset, byteLength, this.length) - - var i = byteLength - var mul = 1 - var val = this[offset + --i] - while (i > 0 && (mul *= 0x100)) { - val += this[offset + --i] * mul - } - mul *= 0x80 - - if (val >= mul) val -= Math.pow(2, 8 * byteLength) - - return val -} - -Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { - if (!noAssert) checkOffset(offset, 1, this.length) - if (!(this[offset] & 0x80)) return (this[offset]) - return ((0xff - this[offset] + 1) * -1) -} - -Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 2, this.length) - var val = this[offset] | (this[offset + 1] << 8) - return (val & 0x8000) ? val | 0xFFFF0000 : val -} - -Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 2, this.length) - var val = this[offset + 1] | (this[offset] << 8) - return (val & 0x8000) ? val | 0xFFFF0000 : val -} - -Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length) - - return (this[offset]) | - (this[offset + 1] << 8) | - (this[offset + 2] << 16) | - (this[offset + 3] << 24) -} - -Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length) - - return (this[offset] << 24) | - (this[offset + 1] << 16) | - (this[offset + 2] << 8) | - (this[offset + 3]) -} - -Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length) - return ieee754.read(this, offset, true, 23, 4) -} - -Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length) - return ieee754.read(this, offset, false, 23, 4) -} - -Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 8, this.length) - return ieee754.read(this, offset, true, 52, 8) -} - -Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 8, this.length) - return ieee754.read(this, offset, false, 52, 8) -} - -function checkInt (buf, value, offset, ext, max, min) { - if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance') - if (value > max || value < min) throw new RangeError('"value" argument is out of bounds') - if (offset + ext > buf.length) throw new RangeError('Index out of range') -} - -Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { - value = +value - offset = offset | 0 - byteLength = byteLength | 0 - if (!noAssert) { - var maxBytes = Math.pow(2, 8 * byteLength) - 1 - checkInt(this, value, offset, byteLength, maxBytes, 0) - } - - var mul = 1 - var i = 0 - this[offset] = value & 0xFF - while (++i < byteLength && (mul *= 0x100)) { - this[offset + i] = (value / mul) & 0xFF - } - - return offset + byteLength -} - -Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { - value = +value - offset = offset | 0 - byteLength = byteLength | 0 - if (!noAssert) { - var maxBytes = Math.pow(2, 8 * byteLength) - 1 - checkInt(this, value, offset, byteLength, maxBytes, 0) - } - - var i = byteLength - 1 - var mul = 1 - this[offset + i] = value & 0xFF - while (--i >= 0 && (mul *= 0x100)) { - this[offset + i] = (value / mul) & 0xFF - } - - return offset + byteLength -} - -Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0) - if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) - this[offset] = (value & 0xff) - return offset + 1 -} - -function objectWriteUInt16 (buf, value, offset, littleEndian) { - if (value < 0) value = 0xffff + value + 1 - for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) { - buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>> - (littleEndian ? i : 1 - i) * 8 - } -} - -Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value & 0xff) - this[offset + 1] = (value >>> 8) - } else { - objectWriteUInt16(this, value, offset, true) - } - return offset + 2 -} - -Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 8) - this[offset + 1] = (value & 0xff) - } else { - objectWriteUInt16(this, value, offset, false) - } - return offset + 2 -} - -function objectWriteUInt32 (buf, value, offset, littleEndian) { - if (value < 0) value = 0xffffffff + value + 1 - for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) { - buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff - } -} - -Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset + 3] = (value >>> 24) - this[offset + 2] = (value >>> 16) - this[offset + 1] = (value >>> 8) - this[offset] = (value & 0xff) - } else { - objectWriteUInt32(this, value, offset, true) - } - return offset + 4 -} - -Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 24) - this[offset + 1] = (value >>> 16) - this[offset + 2] = (value >>> 8) - this[offset + 3] = (value & 0xff) - } else { - objectWriteUInt32(this, value, offset, false) - } - return offset + 4 -} - -Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) { - var limit = Math.pow(2, 8 * byteLength - 1) - - checkInt(this, value, offset, byteLength, limit - 1, -limit) - } - - var i = 0 - var mul = 1 - var sub = 0 - this[offset] = value & 0xFF - while (++i < byteLength && (mul *= 0x100)) { - if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) { - sub = 1 - } - this[offset + i] = ((value / mul) >> 0) - sub & 0xFF - } - - return offset + byteLength -} - -Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) { - var limit = Math.pow(2, 8 * byteLength - 1) - - checkInt(this, value, offset, byteLength, limit - 1, -limit) - } - - var i = byteLength - 1 - var mul = 1 - var sub = 0 - this[offset + i] = value & 0xFF - while (--i >= 0 && (mul *= 0x100)) { - if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) { - sub = 1 - } - this[offset + i] = ((value / mul) >> 0) - sub & 0xFF - } - - return offset + byteLength -} - -Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80) - if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) - if (value < 0) value = 0xff + value + 1 - this[offset] = (value & 0xff) - return offset + 1 -} - -Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value & 0xff) - this[offset + 1] = (value >>> 8) - } else { - objectWriteUInt16(this, value, offset, true) - } - return offset + 2 -} - -Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 8) - this[offset + 1] = (value & 0xff) - } else { - objectWriteUInt16(this, value, offset, false) - } - return offset + 2 -} - -Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value & 0xff) - this[offset + 1] = (value >>> 8) - this[offset + 2] = (value >>> 16) - this[offset + 3] = (value >>> 24) - } else { - objectWriteUInt32(this, value, offset, true) - } - return offset + 4 -} - -Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) - if (value < 0) value = 0xffffffff + value + 1 - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 24) - this[offset + 1] = (value >>> 16) - this[offset + 2] = (value >>> 8) - this[offset + 3] = (value & 0xff) - } else { - objectWriteUInt32(this, value, offset, false) - } - return offset + 4 -} - -function checkIEEE754 (buf, value, offset, ext, max, min) { - if (offset + ext > buf.length) throw new RangeError('Index out of range') - if (offset < 0) throw new RangeError('Index out of range') -} - -function writeFloat (buf, value, offset, littleEndian, noAssert) { - if (!noAssert) { - checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38) - } - ieee754.write(buf, value, offset, littleEndian, 23, 4) - return offset + 4 -} - -Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { - return writeFloat(this, value, offset, true, noAssert) -} - -Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { - return writeFloat(this, value, offset, false, noAssert) -} - -function writeDouble (buf, value, offset, littleEndian, noAssert) { - if (!noAssert) { - checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308) - } - ieee754.write(buf, value, offset, littleEndian, 52, 8) - return offset + 8 -} - -Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { - return writeDouble(this, value, offset, true, noAssert) -} - -Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { - return writeDouble(this, value, offset, false, noAssert) -} - -// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) -Buffer.prototype.copy = function copy (target, targetStart, start, end) { - if (!start) start = 0 - if (!end && end !== 0) end = this.length - if (targetStart >= target.length) targetStart = target.length - if (!targetStart) targetStart = 0 - if (end > 0 && end < start) end = start - - // Copy 0 bytes; we're done - if (end === start) return 0 - if (target.length === 0 || this.length === 0) return 0 - - // Fatal error conditions - if (targetStart < 0) { - throw new RangeError('targetStart out of bounds') - } - if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds') - if (end < 0) throw new RangeError('sourceEnd out of bounds') - - // Are we oob? - if (end > this.length) end = this.length - if (target.length - targetStart < end - start) { - end = target.length - targetStart + start - } - - var len = end - start - var i - - if (this === target && start < targetStart && targetStart < end) { - // descending copy from end - for (i = len - 1; i >= 0; --i) { - target[i + targetStart] = this[i + start] - } - } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) { - // ascending copy from start - for (i = 0; i < len; ++i) { - target[i + targetStart] = this[i + start] - } - } else { - Uint8Array.prototype.set.call( - target, - this.subarray(start, start + len), - targetStart - ) - } - - return len -} - -// Usage: -// buffer.fill(number[, offset[, end]]) -// buffer.fill(buffer[, offset[, end]]) -// buffer.fill(string[, offset[, end]][, encoding]) -Buffer.prototype.fill = function fill (val, start, end, encoding) { - // Handle string cases: - if (typeof val === 'string') { - if (typeof start === 'string') { - encoding = start - start = 0 - end = this.length - } else if (typeof end === 'string') { - encoding = end - end = this.length - } - if (val.length === 1) { - var code = val.charCodeAt(0) - if (code < 256) { - val = code - } - } - if (encoding !== undefined && typeof encoding !== 'string') { - throw new TypeError('encoding must be a string') - } - if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) { - throw new TypeError('Unknown encoding: ' + encoding) - } - } else if (typeof val === 'number') { - val = val & 255 - } - - // Invalid ranges are not set to a default, so can range check early. - if (start < 0 || this.length < start || this.length < end) { - throw new RangeError('Out of range index') - } - - if (end <= start) { - return this - } - - start = start >>> 0 - end = end === undefined ? this.length : end >>> 0 - - if (!val) val = 0 - - var i - if (typeof val === 'number') { - for (i = start; i < end; ++i) { - this[i] = val - } - } else { - var bytes = Buffer.isBuffer(val) - ? val - : utf8ToBytes(new Buffer(val, encoding).toString()) - var len = bytes.length - for (i = 0; i < end - start; ++i) { - this[i + start] = bytes[i % len] - } - } - - return this -} - -// HELPER FUNCTIONS -// ================ - -var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g - -function base64clean (str) { - // Node strips out invalid characters like \n and \t from the string, base64-js does not - str = stringtrim(str).replace(INVALID_BASE64_RE, '') - // Node converts strings with length < 2 to '' - if (str.length < 2) return '' - // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not - while (str.length % 4 !== 0) { - str = str + '=' - } - return str -} - -function stringtrim (str) { - if (str.trim) return str.trim() - return str.replace(/^\s+|\s+$/g, '') -} - -function toHex (n) { - if (n < 16) return '0' + n.toString(16) - return n.toString(16) -} - -function utf8ToBytes (string, units) { - units = units || Infinity - var codePoint - var length = string.length - var leadSurrogate = null - var bytes = [] - - for (var i = 0; i < length; ++i) { - codePoint = string.charCodeAt(i) - - // is surrogate component - if (codePoint > 0xD7FF && codePoint < 0xE000) { - // last char was a lead - if (!leadSurrogate) { - // no lead yet - if (codePoint > 0xDBFF) { - // unexpected trail - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) - continue - } else if (i + 1 === length) { - // unpaired lead - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) - continue - } - - // valid lead - leadSurrogate = codePoint - - continue - } - - // 2 leads in a row - if (codePoint < 0xDC00) { - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) - leadSurrogate = codePoint - continue - } - - // valid surrogate pair - codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000 - } else if (leadSurrogate) { - // valid bmp char, but last char was a lead - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) - } - - leadSurrogate = null - - // encode utf8 - if (codePoint < 0x80) { - if ((units -= 1) < 0) break - bytes.push(codePoint) - } else if (codePoint < 0x800) { - if ((units -= 2) < 0) break - bytes.push( - codePoint >> 0x6 | 0xC0, - codePoint & 0x3F | 0x80 - ) - } else if (codePoint < 0x10000) { - if ((units -= 3) < 0) break - bytes.push( - codePoint >> 0xC | 0xE0, - codePoint >> 0x6 & 0x3F | 0x80, - codePoint & 0x3F | 0x80 - ) - } else if (codePoint < 0x110000) { - if ((units -= 4) < 0) break - bytes.push( - codePoint >> 0x12 | 0xF0, - codePoint >> 0xC & 0x3F | 0x80, - codePoint >> 0x6 & 0x3F | 0x80, - codePoint & 0x3F | 0x80 - ) - } else { - throw new Error('Invalid code point') - } - } - - return bytes -} - -function asciiToBytes (str) { - var byteArray = [] - for (var i = 0; i < str.length; ++i) { - // Node's code seems to be doing this and not & 0x7F.. - byteArray.push(str.charCodeAt(i) & 0xFF) - } - return byteArray -} - -function utf16leToBytes (str, units) { - var c, hi, lo - var byteArray = [] - for (var i = 0; i < str.length; ++i) { - if ((units -= 2) < 0) break - - c = str.charCodeAt(i) - hi = c >> 8 - lo = c % 256 - byteArray.push(lo) - byteArray.push(hi) - } - - return byteArray -} - -function base64ToBytes (str) { - return base64.toByteArray(base64clean(str)) -} - -function blitBuffer (src, dst, offset, length) { - for (var i = 0; i < length; ++i) { - if ((i + offset >= dst.length) || (i >= src.length)) break - dst[i + offset] = src[i] - } - return i -} - -function isnan (val) { - return val !== val // eslint-disable-line no-self-compare -} - -/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(121))) - -/***/ }), -/* 123 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/* WEBPACK VAR INJECTION */(function(Buffer) {/*! - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - - -var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; - -var lexer = __webpack_require__(117); -var parser = __webpack_require__(107); -var tokens = __webpack_require__(91); -var AST = __webpack_require__(90); - -/** - * @private - */ -function combine(src, to) { - var keys = Object.keys(src); - var i = keys.length; - while (i--) { - var k = keys[i]; - var val = src[k]; - if (val === null) { - delete to[k]; - } else if (typeof val === "function") { - to[k] = val.bind(to); - } else if (Array.isArray(val)) { - to[k] = Array.isArray(to[k]) ? to[k].concat(val) : val; - } else if ((typeof val === "undefined" ? "undefined" : _typeof(val)) === "object") { - to[k] = _typeof(to[k]) === "object" ? combine(val, to[k]) : val; - } else { - to[k] = val; - } - } - return to; -} - -/** - * Initialise a new parser instance with the specified options - * - * @class - * @tutorial Engine - * @example - * var parser = require('php-parser'); - * var instance = new parser({ - * parser: { - * extractDoc: true, - * suppressErrors: true, - * php7: true - * }, - * ast: { - * withPositions: true - * }, - * lexer: { - * short_tags: true, - * asp_tags: true - * } - * }); - * - * var evalAST = instance.parseEval('some php code'); - * var codeAST = instance.parseCode(' Note that the output tokens are *STRICLY* similar to PHP function `token_get_all` - * @param {String} buffer - * @return {String[]} - Each item can be a string or an array with following informations [token_name, text, line_number] - */ -engine.prototype.tokenGetAll = function (buffer) { - this.lexer.mode_eval = false; - this.lexer.all_tokens = true; - buffer = getStringBuffer(buffer); - var EOF = this.lexer.EOF; - var names = this.tokens.values; - this.lexer.setInput(buffer); - var token = this.lexer.lex() || EOF; - var result = []; - while (token != EOF) { - var entry = this.lexer.yytext; - if (names.hasOwnProperty(token)) { - entry = [names[token], entry, this.lexer.yylloc.first_line]; - } - result.push(entry); - token = this.lexer.lex() || EOF; - } - return result; -}; - -// exports the function -module.exports = engine; - -// makes libraries public -module.exports.tokens = tokens; -module.exports.lexer = lexer; -module.exports.AST = AST; -module.exports.parser = parser; -module.exports.combine = combine; - -// allow the default export in index.d.ts -module.exports.default = engine; -/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(122).Buffer)) - -/***/ }) -/******/ ])["default"]; -}); \ No newline at end of file diff --git a/dist/php-parser.min.js b/dist/php-parser.min.js deleted file mode 100644 index 0867f11ef..000000000 --- a/dist/php-parser.min.js +++ /dev/null @@ -1,23 +0,0 @@ -/*! - * - * Package: php-parser - * Parse PHP code and returns its AST - * Build: 65fd01ae827233e0f643 - 2018-8-15 - * License: BSD-3-Clause - * Author: Ioan CHIRIAC - * - */ -!function webpackUniversalModuleDefinition(root,factory){"object"==typeof exports&&"object"==typeof module?module.exports=factory():"function"==typeof define&&define.amd?define([],factory):"object"==typeof exports?exports.PhpParser=factory():root.PhpParser=factory()}(window,function(){return function(modules){var installedModules={};function __webpack_require__(moduleId){if(installedModules[moduleId])return installedModules[moduleId].exports;var module=installedModules[moduleId]={i:moduleId,l:!1,exports:{}};return modules[moduleId].call(module.exports,module,module.exports,__webpack_require__),module.l=!0,module.exports}return __webpack_require__.m=modules,__webpack_require__.c=installedModules,__webpack_require__.d=function(exports,name,getter){__webpack_require__.o(exports,name)||Object.defineProperty(exports,name,{enumerable:!0,get:getter})},__webpack_require__.r=function(exports){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(exports,"__esModule",{value:!0})},__webpack_require__.t=function(value,mode){if(1&mode&&(value=__webpack_require__(value)),8&mode)return value;if(4&mode&&"object"==typeof value&&value&&value.__esModule)return value;var ns=Object.create(null);if(__webpack_require__.r(ns),Object.defineProperty(ns,"default",{enumerable:!0,value:value}),2&mode&&"string"!=typeof value)for(var key in value)__webpack_require__.d(ns,key,function(key){return value[key]}.bind(null,key));return ns},__webpack_require__.n=function(module){var getter=module&&module.__esModule?function getDefault(){return module.default}:function getModuleExports(){return module};return __webpack_require__.d(getter,"a",getter),getter},__webpack_require__.o=function(object,property){return Object.prototype.hasOwnProperty.call(object,property)},__webpack_require__.p="",__webpack_require__(__webpack_require__.s=123)}([function(module,exports,__webpack_require__){"use strict";var Node=__webpack_require__(1),Statement=Node.extends(function Statement(kind,docs,location){Node.apply(this,[kind||"statement",docs,location])});module.exports=Statement},function(module,exports,__webpack_require__){"use strict";var Node=function Node(kind,docs,location){this.kind=kind,docs&&(this.leadingComments=docs),location&&(this.loc=location)};Node.prototype.includeToken=function(parser){return this.loc&&(this.loc.end&&(this.loc.end.line=parser.lexer.yylloc.last_line,this.loc.end.column=parser.lexer.yylloc.last_column,this.loc.end.offset=parser.lexer.offset),parser.ast.withSource&&(this.loc.source=parser.lexer._input.substring(this.loc.start.offset,parser.lexer.offset))),this},Node.extends=function(constructor){return constructor.prototype=Object.create(this.prototype),constructor.extends=this.extends,constructor.prototype.constructor=constructor,constructor},module.exports=Node},function(module,exports,__webpack_require__){"use strict";var Node=__webpack_require__(1),Expression=Node.extends(function Expression(kind,docs,location){Node.apply(this,[kind||"expression",docs,location])});module.exports=Expression},function(module,exports,__webpack_require__){"use strict";var Statement=__webpack_require__(0),Declaration=Statement.extends(function Declaration(kind,name,docs,location){Statement.apply(this,[kind||"declaration",docs,location]),this.name=name});Declaration.prototype.parseFlags=function(flags){this.isAbstract=1===flags[2],this.isFinal=2===flags[2],"class"!==this.kind&&(-1===flags[0]?this.visibility="":0===flags[0]?this.visibility="public":1===flags[0]?this.visibility="protected":2===flags[0]&&(this.visibility="private"),this.isStatic=1===flags[1])},module.exports=Declaration},function(module,exports,__webpack_require__){"use strict";var Expr=__webpack_require__(2),Literal=Expr.extends(function Literal(kind,value,raw,docs,location){Expr.apply(this,[kind||"literal",docs,location]),this.value=value,raw&&(this.raw=raw)});module.exports=Literal},function(module,exports,__webpack_require__){"use strict";var Statement=__webpack_require__(0),Sys=Statement.extends(function Sys(kind,args,docs,location){Statement.apply(this,[kind||"sys",docs,location]),this.arguments=args});module.exports=Sys},function(module,exports,__webpack_require__){"use strict";var Expr=__webpack_require__(2),Operation=Expr.extends(function Operation(kind,docs,location){Expr.apply(this,[kind||"operation",docs,location])});module.exports=Operation},function(module,exports,__webpack_require__){"use strict";var Expr=__webpack_require__(2),Lookup=Expr.extends(function Lookup(kind,what,offset,docs,location){Expr.apply(this,[kind||"lookup",docs,location]),this.what=what,this.offset=offset});module.exports=Lookup},function(module,exports,__webpack_require__){"use strict";var Statement=__webpack_require__(0),Block=Statement.extends(function Block(kind,children,docs,location){Statement.apply(this,[kind||"block",docs,location]),this.children=children.filter(Boolean)});module.exports=Block},function(module,exports,__webpack_require__){"use strict";var Node=__webpack_require__(1),Comment=Node.extends(function Comment(kind,value,docs,location){Node.apply(this,[kind,docs,location]),this.value=value});module.exports=Comment},function(module,exports,__webpack_require__){"use strict";var Declaration=__webpack_require__(3),fn=Declaration.extends(function _Function(name,args,byref,type,nullable,docs,location){Declaration.apply(this,["function",name,docs,location]),this.arguments=args,this.byref=byref,this.type=type,this.nullable=nullable,this.body=null});module.exports=fn},function(module,exports,__webpack_require__){"use strict";var Declaration=__webpack_require__(3),Constant=Declaration.extends(function Constant(name,value,docs,location){Declaration.apply(this,["constant",name,docs,location]),this.value=value});module.exports=Constant},function(module,exports,__webpack_require__){"use strict";var Expression=__webpack_require__(2),YieldFrom=Expression.extends(function YieldFrom(value,docs,location){Expression.apply(this,["yieldfrom",docs,location]),this.value=value});module.exports=YieldFrom},function(module,exports,__webpack_require__){"use strict";var Expression=__webpack_require__(2),Yield=Expression.extends(function Yield(value,key,docs,location){Expression.apply(this,["yield",docs,location]),this.value=value,this.key=key});module.exports=Yield},function(module,exports,__webpack_require__){"use strict";var Statement=__webpack_require__(0),While=Statement.extends(function While(test,body,shortForm,docs,location){Statement.apply(this,["while",docs,location]),this.test=test,this.body=body,this.shortForm=shortForm});module.exports=While},function(module,exports,__webpack_require__){"use strict";var Expr=__webpack_require__(2),variadic=Expr.extends(function variadic(what,docs,location){Expr.apply(this,["variadic",docs,location]),this.what=what});module.exports=variadic},function(module,exports,__webpack_require__){"use strict";var Expr=__webpack_require__(2),Variable=Expr.extends(function Variable(name,byref,curly,docs,location){Expr.apply(this,["variable",docs,location]),this.name=name,this.byref=byref||!1,this.curly=curly||!1});module.exports=Variable},function(module,exports,__webpack_require__){"use strict";var Statement=__webpack_require__(0),UseItem=Statement.extends(function UseItem(name,alias,type,docs,location){Statement.apply(this,["useitem",docs,location]),this.name=name,this.alias=alias,this.type=type});UseItem.TYPE_CONST="const",UseItem.TYPE_FUNCTION="function",module.exports=UseItem},function(module,exports,__webpack_require__){"use strict";var Statement=__webpack_require__(0),UseGroup=Statement.extends(function UseGroup(name,type,items,docs,location){Statement.apply(this,["usegroup",docs,location]),this.name=name,this.type=type,this.items=items});module.exports=UseGroup},function(module,exports,__webpack_require__){"use strict";var Sys=__webpack_require__(5),Unset=Sys.extends(function Unset(args,docs,location){Sys.apply(this,["unset",args,docs,location])});module.exports=Unset},function(module,exports,__webpack_require__){"use strict";var Operation=__webpack_require__(6),Unary=Operation.extends(function Unary(type,what,docs,location){Operation.apply(this,["unary",docs,location]),this.type=type,this.what=what});module.exports=Unary},function(module,exports,__webpack_require__){"use strict";var Statement=__webpack_require__(0),Try=Statement.extends(function Try(body,catches,always,docs,location){Statement.apply(this,["try",docs,location]),this.body=body,this.catches=catches,this.always=always});module.exports=Try},function(module,exports,__webpack_require__){"use strict";var Node=__webpack_require__(1),TraitUse=Node.extends(function TraitUse(traits,adaptations,docs,location){Node.apply(this,["traituse",docs,location]),this.traits=traits,this.adaptations=adaptations});module.exports=TraitUse},function(module,exports,__webpack_require__){"use strict";var Node=__webpack_require__(1),TraitPrecedence=Node.extends(function TraitPrecedence(trait,method,instead,docs,location){Node.apply(this,["traitprecedence",docs,location]),this.trait=trait,this.method=method,this.instead=instead});module.exports=TraitPrecedence},function(module,exports,__webpack_require__){"use strict";var Node=__webpack_require__(1),TraitAlias=Node.extends(function TraitAlias(trait,method,as,flags,docs,location){Node.apply(this,["traitalias",docs,location]),this.trait=trait,this.method=method,this.as=as,this.visibility="",flags&&(0===flags[0]?this.visibility="public":1===flags[0]?this.visibility="protected":2===flags[0]&&(this.visibility="private"))});module.exports=TraitAlias},function(module,exports,__webpack_require__){"use strict";var Declaration=__webpack_require__(3),Trait=Declaration.extends(function Trait(name,ext,impl,body,docs,location){Declaration.apply(this,["trait",name,docs,location]),this.extends=ext,this.implements=impl,this.body=body});module.exports=Trait},function(module,exports,__webpack_require__){"use strict";var Statement=__webpack_require__(0),Throw=Statement.extends(function Throw(what,docs,location){Statement.apply(this,["throw",docs,location]),this.what=what});module.exports=Throw},function(module,exports,__webpack_require__){"use strict";var Statement=__webpack_require__(0),Switch=Statement.extends(function Switch(test,body,shortForm,docs,location){Statement.apply(this,["switch",docs,location]),this.test=test,this.body=body,this.shortForm=shortForm});module.exports=Switch},function(module,exports,__webpack_require__){"use strict";var Literal=__webpack_require__(4),String=Literal.extends(function String(isDoubleQuote,value,raw,docs,location){Literal.apply(this,["string",value,raw,docs,location]),this.isDoubleQuote=isDoubleQuote});module.exports=String},function(module,exports,__webpack_require__){"use strict";var Lookup=__webpack_require__(7),StaticLookup=Lookup.extends(function StaticLookup(what,offset,docs,location){Lookup.apply(this,["staticlookup",what,offset,docs,location])});module.exports=StaticLookup},function(module,exports,__webpack_require__){"use strict";var Statement=__webpack_require__(0),Static=Statement.extends(function Static(items,docs,location){Statement.apply(this,["static",docs,location]),this.items=items});module.exports=Static},function(module,exports,__webpack_require__){"use strict";var Statement=__webpack_require__(0),Silent=Statement.extends(function Silent(expr,docs,location){Statement.apply(this,["silent",docs,location]),this.expr=expr});module.exports=Silent},function(module,exports,__webpack_require__){"use strict";var Node=__webpack_require__(1),Return=Node.extends(function Return(expr,docs,location){Node.apply(this,["return",docs,location]),this.expr=expr});module.exports=Return},function(module,exports,__webpack_require__){"use strict";var Statement=__webpack_require__(0),RetIf=Statement.extends(function RetIf(test,trueExpr,falseExpr,docs,location){Statement.apply(this,["retif",docs,location]),this.test=test,this.trueExpr=trueExpr,this.falseExpr=falseExpr});module.exports=RetIf},function(module,exports,__webpack_require__){"use strict";var Lookup=__webpack_require__(7),PropertyLookup=Lookup.extends(function PropertyLookup(what,offset,docs,location){Lookup.apply(this,["propertylookup",what,offset,docs,location])});module.exports=PropertyLookup},function(module,exports,__webpack_require__){"use strict";var Declaration=__webpack_require__(3),Property=Declaration.extends(function Property(name,value,flags,docs,location){Declaration.apply(this,["property",name,docs,location]),this.value=value,this.parseFlags(flags)});module.exports=Property},function(module,exports,__webpack_require__){"use strict";var Block=__webpack_require__(8),Program=Block.extends(function Program(children,errors,comments,tokens,docs,location){Block.apply(this,["program",children,docs,location]),this.errors=errors,comments&&(this.comments=comments),tokens&&(this.tokens=tokens)});module.exports=Program},function(module,exports,__webpack_require__){"use strict";var Sys=__webpack_require__(5),Print=Sys.extends(function Print(args,docs,location){Sys.apply(this,["print",args,docs,location])});module.exports=Print},function(module,exports,__webpack_require__){"use strict";var Operation=__webpack_require__(6),Pre=Operation.extends(function Pre(type,what,docs,location){Operation.apply(this,["pre",docs,location]),this.type=type,this.what=what});module.exports=Pre},function(module,exports,__webpack_require__){"use strict";var Operation=__webpack_require__(6),Post=Operation.extends(function Post(type,what,docs,location){Operation.apply(this,["post",docs,location]),this.type=type,this.what=what});module.exports=Post},function(module,exports,__webpack_require__){"use strict";var Operation=__webpack_require__(6),Parenthesis=Operation.extends(function Parenthesis(inner,docs,location){Operation.apply(this,["parenthesis",docs,location]),this.inner=inner});module.exports=Parenthesis},function(module,exports,__webpack_require__){"use strict";var Declaration=__webpack_require__(3),Parameter=Declaration.extends(function Parameter(name,type,value,isRef,isVariadic,nullable,docs,location){Declaration.apply(this,["parameter",name,docs,location]),this.value=value,this.type=type,this.byref=isRef,this.variadic=isVariadic,this.nullable=nullable});module.exports=Parameter},function(module,exports,__webpack_require__){"use strict";var Lookup=__webpack_require__(7),OffsetLookup=Lookup.extends(function OffsetLookup(what,offset,docs,location){Lookup.apply(this,["offsetlookup",what,offset,docs,location])});module.exports=OffsetLookup},function(module,exports,__webpack_require__){"use strict";var Literal=__webpack_require__(4),_Number=Literal.extends(function Number(value,raw,docs,location){Literal.apply(this,["number",value,raw,docs,location])});module.exports=_Number},function(module,exports,__webpack_require__){"use strict";var Literal=__webpack_require__(4),Nowdoc=Literal.extends(function Nowdoc(value,raw,label,quote,docs,location){Literal.apply(this,["nowdoc",value,raw,docs,location]),this.label=label,this.quote=quote});module.exports=Nowdoc},function(module,exports,__webpack_require__){"use strict";var Statement=__webpack_require__(0),New=Statement.extends(function New(what,args,docs,location){Statement.apply(this,["new",docs,location]),this.what=what,this.arguments=args});module.exports=New},function(module,exports,__webpack_require__){"use strict";var Block=__webpack_require__(8),Namespace=Block.extends(function Namespace(name,children,withBrackets,docs,location){Block.apply(this,["namespace",children,docs,location]),this.name=name,this.withBrackets=withBrackets||!1});module.exports=Namespace},function(module,exports,__webpack_require__){"use strict";var fn=__webpack_require__(10),Method=fn.extends(function Method(){fn.apply(this,arguments),this.kind="method"});module.exports=Method},function(module,exports,__webpack_require__){"use strict";var Literal=__webpack_require__(4),Magic=Literal.extends(function Magic(value,raw,docs,location){Literal.apply(this,["magic",value,raw,docs,location])});module.exports=Magic},function(module,exports,__webpack_require__){"use strict";var Sys=__webpack_require__(5),List=Sys.extends(function List(items,shortForm,docs,location){Sys.apply(this,["list",items,docs,location]),this.shortForm=shortForm});module.exports=List},function(module,exports,__webpack_require__){"use strict";var Node=__webpack_require__(1),Label=Node.extends(function Label(name,docs,location){Node.apply(this,["label",docs,location]),this.name=name});module.exports=Label},function(module,exports,__webpack_require__){"use strict";var Sys=__webpack_require__(5),Isset=Sys.extends(function Isset(args,docs,location){Sys.apply(this,["isset",args,docs,location])});module.exports=Isset},function(module,exports,__webpack_require__){"use strict";var Declaration=__webpack_require__(3),Interface=Declaration.extends(function Interface(name,ext,body,docs,location){Declaration.apply(this,["interface",name,docs,location]),this.extends=ext,this.body=body});module.exports=Interface},function(module,exports,__webpack_require__){"use strict";var Literal=__webpack_require__(4),Inline=Literal.extends(function Inline(value,raw,docs,location){Literal.apply(this,["inline",value,raw,docs,location])});module.exports=Inline},function(module,exports,__webpack_require__){"use strict";var Statement=__webpack_require__(0),Include=Statement.extends(function Include(once,require,target,docs,location){Statement.apply(this,["include",docs,location]),this.once=once,this.require=require,this.target=target});module.exports=Include},function(module,exports,__webpack_require__){"use strict";var Statement=__webpack_require__(0),If=Statement.extends(function If(test,body,alternate,shortForm,docs,location){Statement.apply(this,["if",docs,location]),this.test=test,this.body=body,this.alternate=alternate,this.shortForm=shortForm});module.exports=If},function(module,exports,__webpack_require__){"use strict";var Node=__webpack_require__(1),Identifier=Node.extends(function Identifier(name,isRelative,docs,location){Node.apply(this,["identifier",docs,location]),isRelative?this.resolution=Identifier.RELATIVE_NAME:1===name.length?this.resolution=Identifier.UNQUALIFIED_NAME:""===name[0]?this.resolution=Identifier.FULL_QUALIFIED_NAME:this.resolution=Identifier.QUALIFIED_NAME,this.name=name.join("\\")});Identifier.UNQUALIFIED_NAME="uqn",Identifier.QUALIFIED_NAME="qn",Identifier.FULL_QUALIFIED_NAME="fqn",Identifier.RELATIVE_NAME="rn",module.exports=Identifier},function(module,exports,__webpack_require__){"use strict";var Statement=__webpack_require__(0),Halt=Statement.extends(function Halt(after,docs,location){Statement.apply(this,["halt",docs,location]),this.after=after});module.exports=Halt},function(module,exports,__webpack_require__){"use strict";var Statement=__webpack_require__(0),Goto=Statement.extends(function Goto(label,docs,location){Statement.apply(this,["goto",docs,location]),this.label=label});module.exports=Goto},function(module,exports,__webpack_require__){"use strict";var Statement=__webpack_require__(0),Global=Statement.extends(function Global(items,docs,location){Statement.apply(this,["global",docs,location]),this.items=items});module.exports=Global},function(module,exports,__webpack_require__){"use strict";var Statement=__webpack_require__(0),Foreach=Statement.extends(function Foreach(source,key,value,body,shortForm,docs,location){Statement.apply(this,["foreach",docs,location]),this.source=source,this.key=key,this.value=value,this.shortForm=shortForm,this.body=body});module.exports=Foreach},function(module,exports,__webpack_require__){"use strict";var Statement=__webpack_require__(0),For=Statement.extends(function For(init,test,increment,body,shortForm,docs,location){Statement.apply(this,["for",docs,location]),this.init=init,this.test=test,this.increment=increment,this.shortForm=shortForm,this.body=body});module.exports=For},function(module,exports,__webpack_require__){"use strict";var Statement=__webpack_require__(0),Exit=Statement.extends(function Exit(status,useDie,docs,location){Statement.apply(this,["exit",docs,location]),this.status=status,this.useDie=useDie});module.exports=Exit},function(module,exports,__webpack_require__){"use strict";var Statement=__webpack_require__(0),Eval=Statement.extends(function Eval(source,docs,location){Statement.apply(this,["eval",docs,location]),this.source=source});module.exports=Eval},function(module,exports,__webpack_require__){"use strict";var Node=__webpack_require__(1),Error=Node.extends(function Error(message,token,line,expected,docs,location){Node.apply(this,["error",docs,location]),this.message=message,this.token=token,this.line=line,this.expected=expected});module.exports=Error},function(module,exports,__webpack_require__){"use strict";var Node=__webpack_require__(1),Entry=Node.extends(function Entry(key,value,docs,location){Node.apply(this,["entry",docs,location]),this.key=key,this.value=value});module.exports=Entry},function(module,exports,__webpack_require__){"use strict";var Literal=__webpack_require__(4),Encapsed=Literal.extends(function Encapsed(value,raw,type,docs,location){Literal.apply(this,["encapsed",value,raw,docs,location]),this.type=type});Encapsed.TYPE_STRING="string",Encapsed.TYPE_SHELL="shell",Encapsed.TYPE_HEREDOC="heredoc",Encapsed.TYPE_OFFSET="offset",module.exports=Encapsed},function(module,exports,__webpack_require__){"use strict";var Sys=__webpack_require__(5),Empty=Sys.extends(function Empty(args,docs,location){Sys.apply(this,["empty",args,docs,location])});module.exports=Empty},function(module,exports,__webpack_require__){"use strict";var Sys=__webpack_require__(5),Echo=Sys.extends(function Echo(args,shortForm,docs,location){Sys.apply(this,["echo",args,docs,location]),this.shortForm=shortForm});module.exports=Echo},function(module,exports,__webpack_require__){"use strict";var Statement=__webpack_require__(0),Do=Statement.extends(function Do(test,body,docs,location){Statement.apply(this,["do",docs,location]),this.test=test,this.body=body});module.exports=Do},function(module,exports,__webpack_require__){"use strict";var Block=__webpack_require__(8),Declare=Block.extends(function Declare(what,body,mode,docs,location){Block.apply(this,["declare",body,docs,location]),this.what=what,this.mode=mode});Declare.MODE_SHORT="short",Declare.MODE_BLOCK="block",Declare.MODE_NONE="none",module.exports=Declare},function(module,exports,__webpack_require__){"use strict";var Node=__webpack_require__(1),Continue=Node.extends(function Continue(level,docs,location){Node.apply(this,["continue",docs,location]),this.level=level});module.exports=Continue},function(module,exports,__webpack_require__){"use strict";var Expr=__webpack_require__(2),ConstRef=Expr.extends(function ConstRef(identifier,docs,location){Expr.apply(this,["constref",docs,location]),this.name=identifier});module.exports=ConstRef},function(module,exports,__webpack_require__){"use strict";var Comment=__webpack_require__(9),CommentLine=Comment.extends(function CommentLine(value,docs,location){Comment.apply(this,["commentline",value,docs,location])});module.exports=CommentLine},function(module,exports,__webpack_require__){"use strict";var Comment=__webpack_require__(9),CommentBlock=Comment.extends(function CommentBlock(value,docs,location){Comment.apply(this,["commentblock",value,docs,location])});module.exports=CommentBlock},function(module,exports,__webpack_require__){"use strict";var Statement=__webpack_require__(0),Closure=Statement.extends(function Closure(args,byref,uses,type,nullable,isStatic,docs,location){Statement.apply(this,["closure",docs,location]),this.uses=uses,this.arguments=args,this.byref=byref,this.type=type,this.nullable=nullable,this.isStatic=isStatic||!1,this.body=null});module.exports=Closure},function(module,exports,__webpack_require__){"use strict";var Statement=__webpack_require__(0),Clone=Statement.extends(function Clone(what,docs,location){Statement.apply(this,["clone",docs,location]),this.what=what});module.exports=Clone},function(module,exports,__webpack_require__){"use strict";var Constant=__webpack_require__(11),ClassConstant=Constant.extends(function ClassConstant(name,value,flags,docs,location){Constant.apply(this,[name,value,docs,location]),this.kind="classconstant",this.parseFlags(flags)});module.exports=ClassConstant},function(module,exports,__webpack_require__){"use strict";var Declaration=__webpack_require__(3),Class=Declaration.extends(function Class(name,ext,impl,body,flags,docs,location){Declaration.apply(this,["class",name,docs,location]),this.isAnonymous=!name,this.extends=ext,this.implements=impl,this.body=body,this.parseFlags(flags)});module.exports=Class},function(module,exports,__webpack_require__){"use strict";var Statement=__webpack_require__(0),Catch=Statement.extends(function Catch(body,what,variable,docs,location){Statement.apply(this,["catch",docs,location]),this.body=body,this.what=what,this.variable=variable});module.exports=Catch},function(module,exports,__webpack_require__){"use strict";var Operation=__webpack_require__(6),Cast=Operation.extends(function Cast(type,what,docs,location){Operation.apply(this,["cast",docs,location]),this.type=type,this.what=what});module.exports=Cast},function(module,exports,__webpack_require__){"use strict";var Node=__webpack_require__(1),Case=Node.extends(function Case(test,body,docs,location){Node.apply(this,["case",docs,location]),this.test=test,this.body=body});module.exports=Case},function(module,exports,__webpack_require__){"use strict";var Statement=__webpack_require__(0),Call=Statement.extends(function Call(what,args,docs,location){Statement.apply(this,["call",docs,location]),this.what=what,this.arguments=args});module.exports=Call},function(module,exports,__webpack_require__){"use strict";var Node=__webpack_require__(1),Break=Node.extends(function Break(level,docs,location){Node.apply(this,["break",docs,location]),this.level=level});module.exports=Break},function(module,exports,__webpack_require__){"use strict";var Literal=__webpack_require__(4),Boolean=Literal.extends(function Boolean(value,raw,docs,location){Literal.apply(this,["boolean",value,raw,docs,location])});module.exports=Boolean},function(module,exports,__webpack_require__){"use strict";var Operation=__webpack_require__(6),Bin=Operation.extends(function Bin(type,left,right,docs,location){Operation.apply(this,["bin",docs,location]),this.type=type,this.left=left,this.right=right});module.exports=Bin},function(module,exports,__webpack_require__){"use strict";var Statement=__webpack_require__(0),Assign=Statement.extends(function Assign(left,right,operator,docs,location){Statement.apply(this,["assign",docs,location]),this.operator=operator,this.left=left,this.right=right});module.exports=Assign},function(module,exports,__webpack_require__){"use strict";var Expr=__webpack_require__(2),Array=Expr.extends(function Array(shortForm,items,docs,location){Expr.apply(this,["array",docs,location]),this.items=items,this.shortForm=shortForm});module.exports=Array},function(module,exports,__webpack_require__){"use strict";module.exports=function Position(line,column,offset){this.line=line,this.column=column,this.offset=offset}},function(module,exports,__webpack_require__){"use strict";module.exports=function Location(source,start,end){this.source=source,this.start=start,this.end=end}},function(module,exports,__webpack_require__){"use strict";var Location=__webpack_require__(89),Position=__webpack_require__(88),AST=function AST(withPositions,withSource){this.withPositions=withPositions,this.withSource=withSource};AST.prototype.position=function(parser){return new Position(parser.lexer.yylloc.first_line,parser.lexer.yylloc.first_column,parser.lexer.yylloc.first_offset)},AST.precedence={},[["or"],["xor"],["and"],["="],["?"],["??"],["||"],["&&"],["|"],["^"],["&"],["==","!=","===","!==","<=>"],["<","<=",">",">="],["<<",">>"],["+","-","."],["*","/","%"],["!"],["instanceof"]].forEach(function(list,index){list.forEach(function(operator){AST.precedence[operator]=index+1})}),AST.prototype.resolvePrecedence=function(result){var buffer=void 0,lLevel=void 0,rLevel=void 0;return"bin"===result.kind?result.right&&("bin"===result.right.kind?(lLevel=AST.precedence[result.type],rLevel=AST.precedence[result.right.type],lLevel&&rLevel&&rLevel<=lLevel&&(buffer=result.right,result.right=result.right.left,buffer.left=this.resolvePrecedence(result),result=buffer)):"retif"===result.right.kind&&(lLevel=AST.precedence[result.type],rLevel=AST.precedence["?"],lLevel&&rLevel&&rLevel<=lLevel&&(buffer=result.right,result.right=result.right.test,buffer.test=this.resolvePrecedence(result),result=buffer))):"unary"===result.kind?result.what&&("bin"===result.what.kind?(buffer=result.what,result.what=result.what.left,buffer.left=this.resolvePrecedence(result),result=buffer):"retif"===result.what.kind&&(buffer=result.what,result.what=result.what.test,buffer.test=this.resolvePrecedence(result),result=buffer)):"retif"===result.kind?result.falseExpr&&"retif"===result.falseExpr.kind&&(buffer=result.falseExpr,result.falseExpr=buffer.test,buffer.test=this.resolvePrecedence(result),result=buffer):"assign"===result.kind&&result.right&&"bin"===result.right.kind&&(lLevel=AST.precedence["="],rLevel=AST.precedence[result.right.type],lLevel&&rLevel&&rLevel0?body(null,items):null)}}},function(module,exports,__webpack_require__){"use strict";module.exports={read_top_statements:function read_top_statements(){for(var result=[];this.token!==this.EOF&&"}"!==this.token;){var statement=this.read_top_statement();statement&&(Array.isArray(statement)?result=result.concat(statement):result.push(statement))}return result},read_top_statement:function read_top_statement(){switch(this.token){case this.tok.T_FUNCTION:return this.read_function(!1,!1);case this.tok.T_ABSTRACT:case this.tok.T_FINAL:var flag=this.read_class_scope();return this.token===this.tok.T_CLASS?this.read_class(flag):(this.error(this.tok.T_CLASS),this.next(),null);case this.tok.T_CLASS:return this.read_class([0,0,0]);case this.tok.T_INTERFACE:return this.read_interface();case this.tok.T_TRAIT:return this.read_trait();case this.tok.T_USE:return this.read_use_statement();case this.tok.T_CONST:return this.next().read_const_list();case this.tok.T_NAMESPACE:return this.read_namespace();case this.tok.T_HALT_COMPILER:var result=this.node("halt");return this.next().expect("(")&&this.next(),this.expect(")")&&this.next(),this.expect(";"),this.lexer.done=!0,result(this.lexer._input.substring(this.lexer.offset));default:return this.read_statement()}},read_inner_statements:function read_inner_statements(){for(var result=[];this.token!=this.EOF&&"}"!==this.token;){var statement=this.read_inner_statement();statement&&(Array.isArray(statement)?result=result.concat(statement):result.push(statement))}return result},read_const_list:function read_const_list(){var result=this.read_list(function(){this.expect(this.tok.T_STRING);var result=this.node("constant"),name=this.text();return this.next().expect("=")?result(name,this.next().read_expr()):result(name,null)},",",!1);return this.expectEndOfStatement(),result},read_declare_list:function read_declare_list(){for(var result={};this.token!=this.EOF&&")"!==this.token;){this.expect(this.tok.T_STRING);var name=this.text().toLowerCase();if(this.next().expect("=")?result[name]=this.next().read_expr():result[name]=null,","!==this.token)break;this.next()}return result},read_inner_statement:function read_inner_statement(){switch(this.token){case this.tok.T_FUNCTION:return this.read_function(!1,!1);case this.tok.T_ABSTRACT:case this.tok.T_FINAL:var flag=this.read_class_scope();return this.token===this.tok.T_CLASS?this.read_class(flag):(this.error(this.tok.T_CLASS),this.next(),null);case this.tok.T_CLASS:return this.read_class([0,0,0]);case this.tok.T_INTERFACE:return this.read_interface();case this.tok.T_TRAIT:return this.read_trait();case this.tok.T_HALT_COMPILER:this.raiseError("__HALT_COMPILER() can only be used from the outermost scope");var node=this.node("halt");return this.next().expect("(")&&this.next(),this.expect(")")&&this.next(),node=node(this.lexer._input.substring(this.lexer.offset)),this.expect(";")&&this.next(),node;default:return this.read_statement()}},read_statement:function read_statement(){var result=void 0,expr=void 0,items=void 0,current=void 0,label=void 0;switch(this.token){case"{":return this.read_code_block(!1);case this.tok.T_IF:return this.read_if();case this.tok.T_SWITCH:return this.read_switch();case this.tok.T_FOR:return this.next().read_for();case this.tok.T_FOREACH:return this.next().read_foreach();case this.tok.T_WHILE:return this.next().read_while();case this.tok.T_DO:return this.next().read_do();case this.tok.T_COMMENT:return this.read_comment();case this.tok.T_DOC_COMMENT:return this.read_doc_comment();case this.tok.T_RETURN:return result=this.node("return"),expr=null,this.next().is("EOS")||(expr=this.read_expr()),this.expectEndOfStatement(),result(expr);case this.tok.T_BREAK:case this.tok.T_CONTINUE:result=this.node(this.token===this.tok.T_CONTINUE?"continue":"break");var level=null;return this.next(),";"!==this.token&&(level=this.read_expr()),this.expectEndOfStatement(),result(level);case this.tok.T_GLOBAL:return result=this.node("global"),items=this.next().read_list(this.read_simple_variable,","),this.expectEndOfStatement(),result(items);case this.tok.T_STATIC:return current=[this.token,this.lexer.getState()],result=this.node("static"),this.next().token===this.tok.T_DOUBLE_COLON?(this.lexer.tokens.push(current),expr=this.next().read_expr(),this.expect(";")&&this.next(),expr):this.token===this.tok.T_FUNCTION?this.read_function(!0,[0,1,0]):(items=this.read_variable_declarations(),this.expectEndOfStatement(),result(items));case this.tok.T_ECHO:result=this.node("echo");var text=this.text(),shortForm="0?this.lexer._input[this.lexer.yylloc.first_offset-1]:null,fixFirstLine="\r"===prevChar||"\n"===prevChar;return fixFirstLine&&"\n"===prevChar&&this.lexer.yylloc.first_offset>1&&"\r"===this.lexer._input[this.lexer.yylloc.first_offset-2]&&(prevChar="\r\n"),result=this.node("inline"),this.next(),result(value,fixFirstLine?prevChar+value:value);case this.tok.T_UNSET:return result=this.node("unset"),this.next().expect("(")&&this.next(),items=this.read_list(this.read_variable,","),this.expect(")")&&this.next(),this.expect(";")&&this.next(),result(items);case this.tok.T_DECLARE:result=this.node("declare");var body=[],mode=void 0;this.next().expect("(")&&this.next();var what=this.read_declare_list();if(this.expect(")")&&this.next(),":"===this.token){for(this.next();this.token!=this.EOF&&this.token!==this.tok.T_ENDDECLARE;)body.push(this.read_top_statement());this.expect(this.tok.T_ENDDECLARE)&&this.next(),this.expectEndOfStatement(),mode=this.ast.declare.MODE_SHORT}else if("{"===this.token){for(this.next();this.token!=this.EOF&&"}"!==this.token;)body.push(this.read_top_statement());this.expect("}")&&this.next(),mode=this.ast.declare.MODE_BLOCK}else this.expect(";")&&this.next(),mode=this.ast.declare.MODE_NONE;return result(what,body,mode);case this.tok.T_TRY:return this.read_try();case this.tok.T_THROW:return result=this.node("throw"),expr=this.next().read_expr(),this.expectEndOfStatement(),result(expr);case";":return this.next(),null;case this.tok.T_STRING:return current=[this.token,this.lexer.getState()],label=this.text(),":"===this.next().token?(result=this.node("label"),this.next(),result(label)):(this.lexer.tokens.push(current),expr=this.next().read_expr(),this.expectEndOfStatement(),expr);case this.tok.T_GOTO:return result=this.node("goto"),label=null,this.next().expect(this.tok.T_STRING)&&(label=this.text(),this.next().expectEndOfStatement()),result(label);default:return expr=this.read_expr(),this.expectEndOfStatement(expr),expr}},read_code_block:function read_code_block(top){var result=this.node("block");this.expect("{")&&this.next();var body=top?this.read_top_statements():this.read_inner_statements();return this.expect("}")&&this.next(),result(null,body)}}},function(module,exports,__webpack_require__){"use strict";var specialChar={"\\r":"\r","\\n":"\n","\\t":"\t","\\v":String.fromCharCode(11),"\\e":String.fromCharCode(27),"\\f":String.fromCharCode(12),"\\\\":"\\","\\$":"$",'\\"':'"',"\\'":"'"};module.exports={resolve_special_chars:function resolve_special_chars(text,doubleQuote){return doubleQuote?text.replace(/\\[rntvef"'\\$]/g,function(seq){return specialChar[seq]}):text.replace(/\\['\\]/g,function(seq){return specialChar[seq]})},read_scalar:function read_scalar(){if(this.is("T_MAGIC_CONST"))return this.get_magic_constant();var value=void 0,node=void 0;switch(this.token){case this.tok.T_CONSTANT_ENCAPSED_STRING:value=this.node("string");var text=this.text(),offset=0;"b"!==text[0]&&"B"!==text[0]||(offset=1);var isDoubleQuote='"'===text[offset];return this.next(),value=value(isDoubleQuote,this.resolve_special_chars(text.substring(offset+1,text.length-1),isDoubleQuote),text),this.token===this.tok.T_DOUBLE_COLON?this.read_static_getter(value):value;case this.tok.T_START_HEREDOC:if("ST_NOWDOC"===this.lexer.curCondition){var start=this.lexer.yylloc.first_offset;node=this.node("nowdoc");var lastCh=(value=this.next().text())[value.length-1];"\n"===lastCh?value="\r"===value[value.length-2]?value.substring(0,value.length-2):value.substring(0,value.length-1):"\r"===lastCh&&(value=value.substring(0,value.length-1)),this.expect(this.tok.T_ENCAPSED_AND_WHITESPACE)&&this.next();var raw=this.lexer._input.substring(start,this.lexer.yylloc.last_offset);return node=node(value,raw,this.lexer.heredoc_label,'"'===raw[3]||"'"===raw[3]),this.expect(this.tok.T_END_HEREDOC)&&this.next(),node}return this.next().read_encapsed_string(this.tok.T_END_HEREDOC);case'"':return this.next().read_encapsed_string('"');case'b"':case'B"':return this.next(),this.lexer.yylloc.prev_offset-=1,this.read_encapsed_string('"');case this.tok.T_LNUMBER:case this.tok.T_DNUMBER:var result=this.node("number");return value=this.text(),this.next(),result(value,null);case this.tok.T_ARRAY:case"[":return this.read_array();default:var err=this.error("SCALAR");return this.next(),err}},read_dereferencable:function read_dereferencable(expr){var result=void 0,offset=void 0,node=this.node("offsetlookup");return"["===this.token?(offset=this.next().read_expr(),this.expect("]")&&this.next(),result=node(expr,offset)):this.token===this.tok.T_DOLLAR_OPEN_CURLY_BRACES&&(result=node(expr,offset=this.read_encapsed_string_item(!1))),result},read_encapsed_string_item:function read_encapsed_string_item(isDoubleQuote){var result=this.node(),offset=void 0,node=void 0,name=void 0;if(this.token===this.tok.T_ENCAPSED_AND_WHITESPACE){var text=this.text();this.next(),result=result("string",!1,this.resolve_special_chars(text,isDoubleQuote),text)}else if(this.token===this.tok.T_DOLLAR_OPEN_CURLY_BRACES){if(name=null,this.next().token===this.tok.T_STRING_VARNAME){var varName=this.text();name=this.node("variable"),this.next(),"["===this.token?(name=name(varName,!1),node=this.node("offsetlookup"),offset=this.next().read_expr(),this.expect("]")&&this.next(),name=node(name,offset)):name=this.node("constref")(varName)}else name=this.read_expr();this.expect("}")&&this.next(),result=result("variable",name,!1,!0)}else if(this.token===this.tok.T_CURLY_OPEN)"variable"===(result=this.next().read_variable(!1,!1,!1)).kind&&(result.curly=!0),this.expect("}")&&this.next();else if(this.token===this.tok.T_VARIABLE){if(result=this.read_simple_variable(!1),"["===this.token&&(node=this.node("offsetlookup"),offset=this.next().read_encaps_var_offset(),this.expect("]")&&this.next(),result=node(result,offset)),this.token===this.tok.T_OBJECT_OPERATOR){node=this.node("propertylookup");var what=this.node("constref");this.next().expect(this.tok.T_STRING),name=this.text(),this.next(),result=node(result,what(name))}}else{this.expect(this.tok.T_ENCAPSED_AND_WHITESPACE);var value=this.text();this.next(),result=result("string",!1,value,value)}return result},read_encapsed_string:function read_encapsed_string(expect){var start=this.lexer.yylloc.prev_offset,node=this.node("encapsed"),value=[],type=null;for(type="`"===expect?this.ast.encapsed.TYPE_SHELL:'"'===expect?this.ast.encapsed.TYPE_STRING:this.ast.encapsed.TYPE_HEREDOC;this.token!==expect&&this.token!==this.EOF;)value.push(this.read_encapsed_string_item(!0));return this.expect(expect)&&this.next(),node=node(value,this.lexer._input.substring(start-1,this.lexer.yylloc.first_offset),type),expect===this.tok.T_END_HEREDOC&&(node.label=this.lexer.heredoc_label),node},get_magic_constant:function get_magic_constant(){var result=this.node("magic"),name=this.text();return this.next(),result(name.toUpperCase(),name)}}},function(module,exports,__webpack_require__){"use strict";module.exports={read_namespace:function read_namespace(){var result=this.node("namespace"),body=void 0;if(this.expect(this.tok.T_NAMESPACE)&&this.next(),"{"==this.token)return this.currentNamespace=[""],body=this.next().read_top_statements(),this.expect("}")&&this.next(),result([""],body,!0);var name=this.read_namespace_name();return";"==this.token?(this.currentNamespace=name,body=this.next().read_top_statements(),this.expect(this.EOF),result(name.name,body,!1)):"{"==this.token?(this.currentNamespace=name,body=this.next().read_top_statements(),this.expect("}")&&this.next(),result(name.name,body,!0)):"("===this.token?(name.resolution=this.ast.identifier.RELATIVE_NAME,name.name=name.name.substring(1),this.node("call")(name,this.read_function_argument_list())):(this.error(["{",";"]),this.currentNamespace=name,body=this.read_top_statements(),this.expect(this.EOF),result(name,body,!1))},read_namespace_name:function read_namespace_name(){var result=this.node("identifier"),relative=!1;return this.token===this.tok.T_NAMESPACE&&(this.next().expect(this.tok.T_NS_SEPARATOR)&&this.next(),relative=!0),result(this.read_list(this.tok.T_STRING,this.tok.T_NS_SEPARATOR,!0),relative)},read_use_statement:function read_use_statement(){var result=this.node("usegroup"),items=[],name=null;this.expect(this.tok.T_USE)&&this.next();var type=this.read_use_type();return items.push(this.read_use_declaration(!1)),","===this.token?items=items.concat(this.next().read_use_declarations(!1)):"{"===this.token&&(name=items[0].name,items=this.next().read_use_declarations(null===type),this.expect("}")&&this.next()),result=result(name,type,items),this.expect(";")&&this.next(),result},read_use_declaration:function read_use_declaration(typed){var result=this.node("useitem"),type=null;typed&&(type=this.read_use_type());var name=this.read_namespace_name(),alias=this.read_use_alias();return result(name.name,alias,type)},read_use_declarations:function read_use_declarations(typed){for(var result=[this.read_use_declaration(typed)];","===this.token;)result.push(this.next().read_use_declaration(typed));return result},read_use_alias:function read_use_alias(){var result=null;return this.token===this.tok.T_AS&&this.next().expect(this.tok.T_STRING)&&(result=this.text(),this.next()),result},read_use_type:function read_use_type(){return this.token===this.tok.T_FUNCTION?(this.next(),this.ast.useitem.TYPE_FUNCTION):this.token===this.tok.T_CONST?(this.next(),this.ast.useitem.TYPE_CONST):null}}},function(module,exports,__webpack_require__){"use strict";module.exports={read_start:function read_start(){return this.token==this.tok.T_NAMESPACE?this.read_namespace():this.read_top_statement()}}},function(module,exports,__webpack_require__){"use strict";module.exports={read_while:function read_while(){var test,result=this.node("while"),body=null,shortForm=!1;return this.expect("(")&&this.next(),test=this.read_expr(),this.expect(")")&&this.next(),":"===this.token?(shortForm=!0,body=this.read_short_form(this.tok.T_ENDWHILE)):body=this.read_statement(),result(test,body,shortForm)},read_do:function read_do(){var body,result=this.node("do"),test=null;return body=this.read_statement(),this.expect(this.tok.T_WHILE)&&(this.next().expect("(")&&this.next(),test=this.read_expr(),this.expect(")")&&this.next(),this.expect(";")&&this.next()),result(test,body)},read_for:function read_for(){var result=this.node("for"),init=[],test=[],increment=[],body=null,shortForm=!1;return this.expect("(")&&this.next(),";"!==this.token?(init=this.read_list(this.read_expr,","),this.expect(";")&&this.next()):this.next(),";"!==this.token?(test=this.read_list(this.read_expr,","),this.expect(";")&&this.next()):this.next(),")"!==this.token?(increment=this.read_list(this.read_expr,","),this.expect(")")&&this.next()):this.next(),":"===this.token?(shortForm=!0,body=this.read_short_form(this.tok.T_ENDFOR)):body=this.read_statement(),result(init,test,increment,body,shortForm)},read_foreach:function read_foreach(){var source,result=this.node("foreach"),key=null,value=null,body=null,shortForm=!1;return this.expect("(")&&this.next(),source=this.read_expr(),this.expect(this.tok.T_AS)&&(this.next(),value=this.read_foreach_variable(),this.token===this.tok.T_DOUBLE_ARROW&&(key=value,value=this.next().read_foreach_variable())),key&&"list"===key.kind&&this.raiseError("Fatal Error : Cannot use list as key element"),this.expect(")")&&this.next(),":"===this.token?(shortForm=!0,body=this.read_short_form(this.tok.T_ENDFOREACH)):body=this.read_statement(),result(source,key,value,body,shortForm)},read_foreach_variable:function read_foreach_variable(){if(this.token===this.tok.T_LIST||"["===this.token){var isShort="["===this.token,result=this.node("list");this.next(),!isShort&&this.expect("(")&&this.next();var assignList=this.read_array_pair_list(isShort);return this.expect(isShort?"]":")")&&this.next(),result(assignList,isShort)}return this.read_variable(!1,!1,!1)}}},function(module,exports,__webpack_require__){"use strict";module.exports={read_if:function read_if(){var test,result=this.node("if"),body=null,alternate=null,shortForm=!1;if(test=this.next().read_if_expr(),":"===this.token){shortForm=!0,this.next(),body=this.node("block");for(var items=[];this.token!==this.EOF&&this.token!==this.tok.T_ENDIF;){if(this.token===this.tok.T_ELSEIF){alternate=this.read_elseif_short();break}if(this.token===this.tok.T_ELSE){alternate=this.read_else_short();break}items.push(this.read_inner_statement())}body=body(null,items),this.expect(this.tok.T_ENDIF)&&this.next(),this.expectEndOfStatement()}else body=this.read_statement(),this.token===this.tok.T_ELSEIF?alternate=this.read_if():this.token===this.tok.T_ELSE&&(alternate=this.next().read_statement());return result(test,body,alternate,shortForm)},read_if_expr:function read_if_expr(){this.expect("(")&&this.next();var result=this.read_expr();return this.expect(")")&&this.next(),result},read_elseif_short:function read_elseif_short(){var test,result=this.node("if"),alternate=null,body=null,items=[];for(test=this.next().read_if_expr(),this.expect(":")&&this.next(),body=this.node("block");this.token!=this.EOF&&this.token!==this.tok.T_ENDIF;){if(this.token===this.tok.T_ELSEIF){alternate=this.read_elseif_short();break}if(this.token===this.tok.T_ELSE){alternate=this.read_else_short();break}items.push(this.read_inner_statement())}return result(test,body=body(null,items),alternate,!0)},read_else_short:function read_else_short(){var body=this.node("block");this.next().expect(":")&&this.next();for(var items=[];this.token!=this.EOF&&this.token!==this.tok.T_ENDIF;)items.push(this.read_inner_statement());return body(null,items)}}},function(module,exports,__webpack_require__){"use strict";module.exports={is_reference:function is_reference(){return"&"==this.token&&(this.next(),!0)},is_variadic:function is_variadic(){return this.token===this.tok.T_ELLIPSIS&&(this.next(),!0)},read_function:function read_function(closure,flag){var result=this.read_function_declaration(closure?1:flag?2:0,flag&&1===flag[1]);return flag&&1==flag[2]?(result.parseFlags(flag),this.expect(";")&&this.next()):(this.expect("{")&&(result.body=this.read_code_block(!1),result.loc&&result.body.loc&&(result.loc.end=result.body.loc.end)),!closure&&flag&&result.parseFlags(flag)),result},read_function_declaration:function read_function_declaration(type,isStatic){var nodeName="function";1===type?nodeName="closure":2===type&&(nodeName="method");var result=this.node(nodeName);this.expect(this.tok.T_FUNCTION)&&this.next();var isRef=this.is_reference(),name=!1,use=[],returnType=null,nullable=!1;1!==type&&(2===type?this.token===this.tok.T_STRING||this.php7&&this.is("IDENTIFIER")?(name=this.text(),this.next()):this.error("IDENTIFIER"):(this.expect(this.tok.T_STRING)&&(name=this.text()),this.next())),this.expect("(")&&this.next();var params=this.read_parameter_list();return this.expect(")")&&this.next(),1===type&&this.token===this.tok.T_USE&&(this.next().expect("(")&&this.next(),use=this.read_list(this.read_lexical_var,","),this.expect(")")&&this.next()),":"===this.token&&("?"===this.next().token&&(nullable=!0,this.next()),returnType=this.read_type()),1===type?result(params,isRef,use,returnType,nullable,isStatic):result(name,params,isRef,returnType,nullable)},read_lexical_var:function read_lexical_var(){var result=this.node("variable"),isRef=!1;"&"===this.token&&(isRef=!0,this.next()),this.expect(this.tok.T_VARIABLE);var name=this.text().substring(1);return this.next(),result(name,isRef,!1)},read_parameter_list:function read_parameter_list(){var result=[];if(")"!=this.token)for(;this.token!=this.EOF;){if(result.push(this.read_parameter()),","!=this.token){if(")"==this.token)break;this.error([",",")"]);break}this.next()}return result},read_parameter:function read_parameter(){var type,node=this.node("parameter"),name=null,value=null,nullable=!1;"?"===this.token&&(this.next(),nullable=!0),type=this.read_type(),nullable&&!type&&this.raiseError("Expecting a type definition combined with nullable operator");var isRef=this.is_reference(),isVariadic=this.is_variadic();return this.expect(this.tok.T_VARIABLE)&&(name=this.text().substring(1),this.next()),"="==this.token&&(value=this.next().read_expr()),node(name,type,value,isRef,isVariadic,nullable)},read_function_argument_list:function read_function_argument_list(){var result=[],wasVariadic=!1;if(this.expect("(")&&this.next(),")"!==this.token)for(;this.token!=this.EOF;){var argument=this.read_argument_list();if(argument&&(result.push(argument),"variadic"===argument.kind?wasVariadic=!0:wasVariadic&&this.raiseError("Unexpected argument after a variadic argument")),","!==this.token)break;this.next()}return this.expect(")")&&this.next(),result},read_argument_list:function read_argument_list(){return this.token===this.tok.T_ELLIPSIS?this.node("variadic")(this.next().read_expr()):this.read_expr()},read_type:function read_type(){var result=this.node("identifier");switch(this.token){case this.tok.T_ARRAY:return this.next(),result(["","array"],!1);case this.tok.T_NAMESPACE:case this.tok.T_NS_SEPARATOR:case this.tok.T_STRING:return this.read_namespace_name();case this.tok.T_CALLABLE:return this.next(),result(["","callable"],!1);default:return null}}}},function(module,exports,__webpack_require__){"use strict";module.exports={read_expr:function read_expr(){var result=this.node(),expr=this.read_expr_item();if("|"===this.token)return result("bin","|",expr,this.next().read_expr());if("&"===this.token)return result("bin","&",expr,this.next().read_expr());if("^"===this.token)return result("bin","^",expr,this.next().read_expr());if("."===this.token)return result("bin",".",expr,this.next().read_expr());if("+"===this.token)return result("bin","+",expr,this.next().read_expr());if("-"===this.token)return result("bin","-",expr,this.next().read_expr());if("*"===this.token)return result("bin","*",expr,this.next().read_expr());if("/"===this.token)return result("bin","/",expr,this.next().read_expr());if("%"===this.token)return result("bin","%",expr,this.next().read_expr());if(this.token===this.tok.T_POW)return result("bin","**",expr,this.next().read_expr());if(this.token===this.tok.T_SL)return result("bin","<<",expr,this.next().read_expr());if(this.token===this.tok.T_SR)return result("bin",">>",expr,this.next().read_expr());if(this.token===this.tok.T_BOOLEAN_OR)return result("bin","||",expr,this.next().read_expr());if(this.token===this.tok.T_LOGICAL_OR)return result("bin","or",expr,this.next().read_expr());if(this.token===this.tok.T_BOOLEAN_AND)return result("bin","&&",expr,this.next().read_expr());if(this.token===this.tok.T_LOGICAL_AND)return result("bin","and",expr,this.next().read_expr());if(this.token===this.tok.T_LOGICAL_XOR)return result("bin","xor",expr,this.next().read_expr());if(this.token===this.tok.T_IS_IDENTICAL)return result("bin","===",expr,this.next().read_expr());if(this.token===this.tok.T_IS_NOT_IDENTICAL)return result("bin","!==",expr,this.next().read_expr());if(this.token===this.tok.T_IS_EQUAL)return result("bin","==",expr,this.next().read_expr());if(this.token===this.tok.T_IS_NOT_EQUAL)return result("bin","!=",expr,this.next().read_expr());if("<"===this.token)return result("bin","<",expr,this.next().read_expr());if(">"===this.token)return result("bin",">",expr,this.next().read_expr());if(this.token===this.tok.T_IS_SMALLER_OR_EQUAL)return result("bin","<=",expr,this.next().read_expr());if(this.token===this.tok.T_IS_GREATER_OR_EQUAL)return result("bin",">=",expr,this.next().read_expr());if(this.token===this.tok.T_SPACESHIP)return result("bin","<=>",expr,this.next().read_expr());if(this.token===this.tok.T_INSTANCEOF)return result("bin","instanceof",expr,this.next().read_expr());if(this.token===this.tok.T_COALESCE)return result("bin","??",expr,this.next().read_expr());if("?"===this.token){var trueArg=null;return":"!==this.next().token&&(trueArg=this.read_expr()),this.expect(":")&&this.next(),result("retif",expr,trueArg,this.read_expr())}return expr},read_expr_item:function read_expr_item(){var result=void 0,expr=void 0;if("@"===this.token)return this.node("silent")(this.next().read_expr());if("+"===this.token)return this.node("unary")("+",this.next().read_expr());if("!"===this.token)return this.node("unary")("!",this.next().read_expr());if("~"===this.token)return this.node("unary")("~",this.next().read_expr());if("-"===this.token)return result=this.node(),this.next(),this.token===this.tok.T_LNUMBER||this.token===this.tok.T_DNUMBER?(result=result("number","-"+this.text(),null),this.next(),result):result("unary","-",this.read_expr());if("("===this.token){var node=this.node("parenthesis");return expr=this.next().read_expr(),this.expect(")")&&this.next(),this.handleDereferencable(node(expr))}if("`"===this.token)return this.next().read_encapsed_string("`");if(this.token===this.tok.T_LIST){var assign=null,isInner=this.innerList;result=this.node("list"),isInner||(assign=this.node("assign")),this.next().expect("(")&&this.next(),this.innerList||(this.innerList=!0);var assignList=this.read_array_pair_list(!1);this.expect(")")&&this.next();for(var hasItem=!1,i=0;i>=");case this.tok.T_INC:return isConst&&this.error("VARIABLE"),this.next(),result("post","+",expr);case this.tok.T_DEC:return isConst&&this.error("VARIABLE"),this.next(),result("post","-",expr)}}else{if(this.is("SCALAR")){if(result=this.node(),"array"===(expr=this.read_scalar()).kind&&expr.shortForm&&"="===this.token){var list=this.node("list")(expr.items,!0);return expr.loc&&(list.loc=expr.loc),result("assign",list,this.next().read_expr(),"=")}return this.handleDereferencable(expr)}this.error("EXPR"),this.next()}return expr},read_new_expr:function read_new_expr(){var result=this.node("new"),args=[];if(this.token===this.tok.T_CLASS){var what=this.node("class"),propExtends=null,propImplements=null,body=null;return"("===this.next().token&&(args=this.read_function_argument_list()),this.token==this.tok.T_EXTENDS&&(propExtends=this.next().read_namespace_name()),this.token==this.tok.T_IMPLEMENTS&&(propImplements=this.next().read_name_list()),this.expect("{")&&(body=this.next().read_class_body()),result(what(null,propExtends,propImplements,body,[0,0,0]),args)}var name=this.read_class_name_reference();return"("===this.token&&(args=this.read_function_argument_list()),result(name,args)},read_class_name_reference:function read_class_name_reference(){if(this.token===this.tok.T_NS_SEPARATOR||this.token===this.tok.T_STRING||this.token===this.tok.T_NAMESPACE){var result=this.read_namespace_name();return this.token===this.tok.T_DOUBLE_COLON&&(result=this.read_static_getter(result)),result}if(this.is("VARIABLE"))return this.read_variable(!0,!1,!1);this.expect([this.tok.T_STRING,"VARIABLE"])},handleDereferencable:function handleDereferencable(expr){for(;this.token!==this.EOF;)if(this.token===this.tok.T_OBJECT_OPERATOR)expr=this.recursive_variable_chain_scan(expr,!1);else if(this.token===this.tok.T_CURLY_OPEN||"["===this.token)expr=this.read_dereferencable(expr);else{if("("!==this.token)return expr;expr=this.node("call")(expr,this.read_function_argument_list())}return expr}}},function(module,exports,__webpack_require__){"use strict";module.exports={read_comment:function read_comment(){var text=this.text(),result=this.ast.prepare("/*"===text.substring(0,2)?"commentblock":"commentline",null,this),prev=this.prev;return this.prev=[this.lexer.yylloc.last_line,this.lexer.yylloc.last_column,this.lexer.offset],this.lex(),result=result(text),this.prev=prev,result},read_doc_comment:function read_doc_comment(){var result=this.ast.prepare("commentblock",null,this),text=this.text(),prev=this.prev;return this.prev=[this.lexer.yylloc.last_line,this.lexer.yylloc.last_column,this.lexer.offset],this.lex(),result=result(text),this.prev=prev,result}}},function(module,exports,__webpack_require__){"use strict";module.exports={read_class:function read_class(flag){var result=this.node("class");this.expect(this.tok.T_CLASS),this.next().expect(this.tok.T_STRING);var propName=this.text(),propExtends=null,propImplements=null;return this.next().token==this.tok.T_EXTENDS&&(propExtends=this.next().read_namespace_name()),this.token==this.tok.T_IMPLEMENTS&&(propImplements=this.next().read_name_list()),this.expect("{"),result(propName,propExtends,propImplements,this.next().read_class_body(),flag)},read_class_scope:function read_class_scope(){var result=this.token;return result==this.tok.T_FINAL?(this.next(),[0,0,2]):result==this.tok.T_ABSTRACT?(this.next(),[0,0,1]):[0,0,0]},read_class_body:function read_class_body(){for(var result=[];this.token!==this.EOF&&"}"!==this.token;)if(this.token!==this.tok.T_COMMENT)if(this.token!==this.tok.T_DOC_COMMENT)if(this.token!==this.tok.T_USE){var flags=this.read_member_flags(!1);if(this.token!==this.tok.T_CONST)if(this.token===this.tok.T_VAR&&(this.next().expect(this.tok.T_VARIABLE),flags[0]=flags[1]=0),this.token===this.tok.T_VARIABLE){var variables=this.read_variable_list(flags);this.expect(";"),this.next(),result=result.concat(variables)}else this.token===this.tok.T_FUNCTION?result.push(this.read_function(!1,flags)):(this.error([this.tok.T_CONST,this.tok.T_VARIABLE,this.tok.T_FUNCTION]),this.next());else{var constants=this.read_constant_list(flags);this.expect(";")&&this.next(),result=result.concat(constants)}}else result=result.concat(this.next().read_trait_use_statement());else result.push(this.read_doc_comment());else result.push(this.read_comment());return this.expect("}"),this.next(),result},read_variable_list:function read_variable_list(flags){return this.read_list(function read_variable_declaration(){var result=this.node("property");this.expect(this.tok.T_VARIABLE);var name=this.text().substring(1);return this.next(),";"===this.token||","===this.token?result(name,null,flags):"="===this.token?result(name,this.next().read_expr(),flags):(this.expect([",",";","="]),result(name,null,flags))},",")},read_constant_list:function read_constant_list(flags){return this.expect(this.tok.T_CONST)&&this.next(),this.read_list(function read_constant_declaration(){var result=this.node("classconstant"),name=null,value=null;return this.token===this.tok.T_STRING||this.php7&&this.is("IDENTIFIER")?(name=this.text(),this.next()):this.expect("IDENTIFIER"),this.expect("=")&&(value=this.next().read_expr()),result(name,value,flags)},",")},read_member_flags:function read_member_flags(asInterface){var result=[-1,-1,-1];if(this.is("T_MEMBER_FLAGS")){var idx=0,val=0;do{switch(this.token){case this.tok.T_PUBLIC:idx=0,val=0;break;case this.tok.T_PROTECTED:idx=0,val=1;break;case this.tok.T_PRIVATE:idx=0,val=2;break;case this.tok.T_STATIC:idx=1,val=1;break;case this.tok.T_ABSTRACT:idx=2,val=1;break;case this.tok.T_FINAL:idx=2,val=2}asInterface&&(0==idx&&2==val?(this.expect([this.tok.T_PUBLIC,this.tok.T_PROTECTED]),val=-1):2==idx&&1==val&&(this.error(),val=-1)),-1!==result[idx]?this.error():-1!==val&&(result[idx]=val)}while(this.next().is("T_MEMBER_FLAGS"))}return-1==result[1]&&(result[1]=0),-1==result[2]&&(result[2]=0),result},read_interface:function read_interface(){var result=this.node("interface"),name=null,body=null,propExtends=null;return this.expect(this.tok.T_INTERFACE)&&this.next(),this.expect(this.tok.T_STRING)&&(name=this.text(),this.next()),this.token===this.tok.T_EXTENDS&&(propExtends=this.next().read_name_list()),this.expect("{")&&(body=this.next().read_interface_body()),result(name,propExtends,body)},read_interface_body:function read_interface_body(){for(var result=[];this.token!==this.EOF&&"}"!==this.token;)if(this.token!==this.tok.T_COMMENT)if(this.token!==this.tok.T_DOC_COMMENT){var flags=this.read_member_flags(!0);if(this.token==this.tok.T_CONST){var constants=this.read_constant_list(flags);this.expect(";")&&this.next(),result=result.concat(constants)}else if(this.token===this.tok.T_FUNCTION){var method=this.read_function_declaration(2,flags);method.parseFlags(flags),result.push(method),this.expect(";")&&this.next()}else this.error([this.tok.T_CONST,this.tok.T_FUNCTION]),this.next()}else result.push(this.read_doc_comment());else result.push(this.read_comment());return this.expect("}")&&this.next(),result},read_trait:function read_trait(){var result=this.node("trait"),propName=null,propExtends=null,propImplements=null,body=null;return this.expect(this.tok.T_TRAIT)&&this.next(),this.expect(this.tok.T_STRING)&&(propName=this.text()),this.next().token==this.tok.T_EXTENDS&&(propExtends=this.next().read_namespace_name()),this.token==this.tok.T_IMPLEMENTS&&(propImplements=this.next().read_name_list()),this.expect("{")&&(body=this.next().read_class_body()),result(propName,propExtends,propImplements,body)},read_trait_use_statement:function read_trait_use_statement(){for(var node=this.node("traituse"),traits=[this.read_namespace_name()],adaptations=null;","===this.token;)traits.push(this.next().read_namespace_name());if("{"===this.token){for(adaptations=[];this.next().token!==this.EOF&&"}"!==this.token;)adaptations.push(this.read_trait_use_alias()),this.expect(";");this.expect("}")&&this.next()}else this.expect(";")&&this.next();return node(traits,adaptations)},read_trait_use_alias:function read_trait_use_alias(){var node=this.node(),trait=null,method=void 0;if(this.is("IDENTIFIER")?(method=this.text(),this.next()):(method=this.read_namespace_name(),this.token===this.tok.T_DOUBLE_COLON?(this.next(),this.token===this.tok.T_STRING||this.php7&&this.is("IDENTIFIER")?(trait=method,method=this.text(),this.next()):this.expect(this.tok.T_STRING)):method=method.name),this.token===this.tok.T_INSTEADOF)return node("traitprecedence",trait,method,this.next().read_name_list());if(this.token===this.tok.T_AS){var flags=null,alias=null;return this.next().is("T_MEMBER_FLAGS")&&(flags=this.read_member_flags()),this.token===this.tok.T_STRING||this.php7&&this.is("IDENTIFIER")?(alias=this.text(),this.next()):!1===flags&&this.expect(this.tok.T_STRING),node("traitalias",trait,method,alias,flags)}return this.expect([this.tok.T_AS,this.tok.T_INSTEADOF]),node("traitalias",trait,method,null,null)}}},function(module,exports,__webpack_require__){"use strict";module.exports={read_array:function read_array(){var expect=null,shortForm=!1,result=this.node("array");this.token===this.tok.T_ARRAY?(this.next().expect("("),expect=")"):(shortForm=!0,expect="]");var items=[];return this.next().token!==expect&&(items=this.read_array_pair_list(shortForm)),this.expect(expect),this.next(),result(shortForm,items)},read_array_pair_list:function read_array_pair_list(shortForm){var self=this;return this.read_list(function(){return self.read_array_pair(shortForm)},",",!0)},read_array_pair:function read_array_pair(shortForm){if(","===this.token||!shortForm&&")"===this.token||shortForm&&"]"===this.token)return null;if("&"===this.token)return this.next().read_variable(!0,!1,!0);var entry=this.node("entry"),expr=this.read_expr();return this.token===this.tok.T_DOUBLE_ARROW?"&"===this.next().token?entry(expr,this.next().read_variable(!0,!1,!0)):entry(expr,this.read_expr()):expr},read_dim_offset:function read_dim_offset(){return"]"!=this.token&&this.read_expr()}}},function(module,exports,__webpack_require__){"use strict";function isNumber(n){return"."!=n&&","!=n&&!isNaN(parseFloat(n))&&isFinite(n)}var parser=function parser(lexer,ast){this.lexer=lexer,this.ast=ast,this.tok=lexer.tok,this.EOF=lexer.EOF,this.token=null,this.prev=null,this.debug=!1,this.php7=!0,this.extractDoc=!1,this.extractTokens=!1,this.suppressErrors=!1;var mapIt=function mapIt(item){return[item,null]};this.entries={IDENTIFIER:new Map([this.tok.T_ABSTRACT,this.tok.T_ARRAY,this.tok.T_AS,this.tok.T_BREAK,this.tok.T_CALLABLE,this.tok.T_CASE,this.tok.T_CATCH,this.tok.T_CLASS,this.tok.T_CLASS_C,this.tok.T_CLONE,this.tok.T_CONST,this.tok.T_CONTINUE,this.tok.T_DECLARE,this.tok.T_DEFAULT,this.tok.T_DIR,this.tok.T_DO,this.tok.T_ECHO,this.tok.T_ELSE,this.tok.T_ELSEIF,this.tok.T_EMPTY,this.tok.T_ENDDECLARE,this.tok.T_ENDFOR,this.tok.T_ENDFOREACH,this.tok.T_ENDIF,this.tok.T_ENDSWITCH,this.tok.T_ENDWHILE,this.tok.T_EVAL,this.tok.T_EXIT,this.tok.T_EXTENDS,this.tok.T_FILE,this.tok.T_FINAL,this.tok.T_FINALLY,this.tok.T_FUNC_C,this.tok.T_FOR,this.tok.T_FOREACH,this.tok.T_FUNCTION,this.tok.T_GLOBAL,this.tok.T_GOTO,this.tok.T_IF,this.tok.T_IMPLEMENTS,this.tok.T_INCLUDE,this.tok.T_INCLUDE_ONCE,this.tok.T_INSTANCEOF,this.tok.T_INSTEADOF,this.tok.T_INTERFACE,this.tok.T_ISSET,this.tok.T_LINE,this.tok.T_LIST,this.tok.T_LOGICAL_AND,this.tok.T_LOGICAL_OR,this.tok.T_LOGICAL_XOR,this.tok.T_METHOD_C,this.tok.T_NAMESPACE,this.tok.T_NEW,this.tok.T_NS_C,this.tok.T_PRINT,this.tok.T_PRIVATE,this.tok.T_PROTECTED,this.tok.T_PUBLIC,this.tok.T_REQUIRE,this.tok.T_REQUIRE_ONCE,this.tok.T_RETURN,this.tok.T_STATIC,this.tok.T_SWITCH,this.tok.T_THROW,this.tok.T_TRAIT,this.tok.T_TRY,this.tok.T_UNSET,this.tok.T_USE,this.tok.T_VAR,this.tok.T_WHILE,this.tok.T_YIELD].map(mapIt)),VARIABLE:new Map([this.tok.T_VARIABLE,"$","&",this.tok.T_NS_SEPARATOR,this.tok.T_STRING,this.tok.T_NAMESPACE,this.tok.T_STATIC].map(mapIt)),SCALAR:new Map([this.tok.T_CONSTANT_ENCAPSED_STRING,this.tok.T_START_HEREDOC,this.tok.T_LNUMBER,this.tok.T_DNUMBER,this.tok.T_ARRAY,"[",this.tok.T_CLASS_C,this.tok.T_TRAIT_C,this.tok.T_FUNC_C,this.tok.T_METHOD_C,this.tok.T_LINE,this.tok.T_FILE,this.tok.T_DIR,this.tok.T_NS_C,'"','b"','B"',"-",this.tok.T_NS_SEPARATOR].map(mapIt)),T_MAGIC_CONST:new Map([this.tok.T_CLASS_C,this.tok.T_TRAIT_C,this.tok.T_FUNC_C,this.tok.T_METHOD_C,this.tok.T_LINE,this.tok.T_FILE,this.tok.T_DIR,this.tok.T_NS_C].map(mapIt)),T_MEMBER_FLAGS:new Map([this.tok.T_PUBLIC,this.tok.T_PRIVATE,this.tok.T_PROTECTED,this.tok.T_STATIC,this.tok.T_ABSTRACT,this.tok.T_FINAL].map(mapIt)),EOS:new Map([";",this.EOF,this.tok.T_INLINE_HTML].map(mapIt)),EXPR:new Map(["@","-","+","!","~","(","`",this.tok.T_LIST,this.tok.T_CLONE,this.tok.T_INC,this.tok.T_DEC,this.tok.T_NEW,this.tok.T_ISSET,this.tok.T_EMPTY,this.tok.T_INCLUDE,this.tok.T_INCLUDE_ONCE,this.tok.T_REQUIRE,this.tok.T_REQUIRE_ONCE,this.tok.T_EVAL,this.tok.T_INT_CAST,this.tok.T_DOUBLE_CAST,this.tok.T_STRING_CAST,this.tok.T_ARRAY_CAST,this.tok.T_OBJECT_CAST,this.tok.T_BOOL_CAST,this.tok.T_UNSET_CAST,this.tok.T_EXIT,this.tok.T_PRINT,this.tok.T_YIELD,this.tok.T_STATIC,this.tok.T_FUNCTION,this.tok.T_VARIABLE,"$",this.tok.T_NS_SEPARATOR,this.tok.T_STRING,this.tok.T_STRING,this.tok.T_CONSTANT_ENCAPSED_STRING,this.tok.T_START_HEREDOC,this.tok.T_LNUMBER,this.tok.T_DNUMBER,this.tok.T_ARRAY,"[",this.tok.T_CLASS_C,this.tok.T_TRAIT_C,this.tok.T_FUNC_C,this.tok.T_METHOD_C,this.tok.T_LINE,this.tok.T_FILE,this.tok.T_DIR,this.tok.T_NS_C].map(mapIt))}};parser.prototype.getTokenName=function(token){return isNumber(token)?token==this.EOF?"the end of file (EOF)":this.lexer.engine.tokens.values[token]:"'"+token+"'"},parser.prototype.parse=function(code,filename){this._errors=[],this.filename=filename||"eval",this.currentNamespace=[""],this.extractDoc?this._docs=[]:this._docs=null,this.extractTokens?this._tokens=[]:this._tokens=null,this._docIndex=0,this.lexer.setInput(code),this.lexer.all_tokens=this.extractTokens,this.lexer.comment_tokens=this.extractDoc,this.length=this.lexer._input.length,this.innerList=!1,this.innerListForm=!1;var program=this.ast.prepare("program",null,this),childs=[];for(this.next();this.token!=this.EOF;){var node=this.read_start();null!==node&&void 0!==node&&(Array.isArray(node)?childs=childs.concat(node):childs.push(node))}return program(childs,this._errors,this._docs,this._tokens)},parser.prototype.raiseError=function(message,msgExpect,expect,token){if(message+=" on line "+this.lexer.yylloc.first_line,!this.suppressErrors){var err=new SyntaxError(message,this.filename,this.lexer.yylloc.first_line);throw err.lineNumber=this.lexer.yylloc.first_line,err.fileName=this.filename,err.columnNumber=this.lexer.yylloc.first_column,err}var node=this.ast.prepare("error",null,this)(message,token,this.lexer.yylloc.first_line,expect);return this._errors.push(node),node},parser.prototype.error=function(expect){var msg="Parse Error : syntax error",token=this.getTokenName(this.token),msgExpect="";if(this.token!==this.EOF){if(isNumber(this.token)){var symbol=this.text();symbol.length>10&&(symbol=symbol.substring(0,7)+"..."),token="'"+symbol+"' ("+token+")"}msg+=", unexpected "+token}return expect&&!Array.isArray(expect)&&((isNumber(expect)||1===expect.length)&&(msgExpect=", expecting "+this.getTokenName(expect)),msg+=msgExpect),this.raiseError(msg,msgExpect,expect,token)},parser.prototype.node=function(name){if(this.extractDoc&&this._docIndex"+this.lexer.yytext+"< @--\x3e"+line),this},parser.prototype.expect=function(token){if(Array.isArray(token)){if(-1===token.indexOf(this.token))return this.error(token),!1}else if(this.token!=token)return this.error(token),!1;return!0},parser.prototype.text=function(){return this.lexer.yytext},parser.prototype.next=function(){if(";"===this.token&&";"!==this.lexer.yytext||(this.prev=[this.lexer.yylloc.last_line,this.lexer.yylloc.last_column,this.lexer.offset]),this.lex(),this.debug&&this.showlog(),this.extractDoc)for(;this.token===this.tok.T_COMMENT||this.token===this.tok.T_DOC_COMMENT;)this.token===this.tok.T_COMMENT?this._docs.push(this.read_comment()):this._docs.push(this.read_doc_comment());return this},parser.prototype.lex=function(){if(this.extractTokens)do{if(this.token=this.lexer.lex()||this.EOF,this.token===this.EOF)return this;var entry=this.lexer.yytext;if(entry=this.lexer.engine.tokens.values.hasOwnProperty(this.token)?[this.lexer.engine.tokens.values[this.token],entry,this.lexer.yylloc.first_line,this.lexer.yylloc.first_offset,this.lexer.offset]:[null,entry,this.lexer.yylloc.first_line,this.lexer.yylloc.first_offset,this.lexer.offset],this._tokens.push(entry),this.token===this.tok.T_CLOSE_TAG)return this.token=";",this;if(this.token===this.tok.T_OPEN_TAG_WITH_ECHO)return this.token=this.tok.T_ECHO,this}while(this.token===this.tok.T_WHITESPACE||!this.extractDoc&&(this.token===this.tok.T_COMMENT||this.token===this.tok.T_DOC_COMMENT)||this.token===this.tok.T_OPEN_TAG);else this.token=this.lexer.lex()||this.EOF;return this},parser.prototype.is=function(type){return Array.isArray(type)?-1!==type.indexOf(this.token):this.entries[type].has(this.token)},[__webpack_require__(106),__webpack_require__(105),__webpack_require__(104),__webpack_require__(103),__webpack_require__(102),__webpack_require__(101),__webpack_require__(100),__webpack_require__(99),__webpack_require__(98),__webpack_require__(97),__webpack_require__(96),__webpack_require__(95),__webpack_require__(94),__webpack_require__(93),__webpack_require__(92)].forEach(function(ext){for(var k in ext)parser.prototype[k]=ext[k]}),module.exports=parser},function(module,exports,__webpack_require__){"use strict";module.exports={is_NUM:function is_NUM(){var ch=this._input.charCodeAt(this.offset-1);return ch>47&&ch<58},is_LABEL:function is_LABEL(){var ch=this._input.charCodeAt(this.offset-1);return ch>96&&ch<123||ch>64&&ch<91||95===ch||ch>47&&ch<58||ch>126},is_LABEL_START:function is_LABEL_START(){var ch=this._input.charCodeAt(this.offset-1);return ch>96&&ch<123||ch>64&&ch<91||95===ch||ch>126},consume_LABEL:function consume_LABEL(){for(;this.offset?@".indexOf(ch)},is_WHITESPACE:function is_WHITESPACE(){var ch=this._input[this.offset-1];return" "===ch||"\t"===ch||"\n"===ch||"\r"===ch},is_TABSPACE:function is_TABSPACE(){var ch=this._input[this.offset-1];return" "===ch||"\t"===ch},consume_TABSPACE:function consume_TABSPACE(){for(;this.offset47&&ch<58||ch>64&&ch<71||ch>96&&ch<103}}},function(module,exports,__webpack_require__){"use strict";module.exports={T_STRING:function T_STRING(){var token=this.yytext.toLowerCase(),id=this.keywords[token];if("number"!=typeof id)if("yield"===token)this.php7&&this.tryMatch(" from")?(this.consume(5),id=this.tok.T_YIELD_FROM):id=this.tok.T_YIELD;else if(id=this.tok.T_STRING,"b"===token||"B"===token){var ch=this.input(1);if('"'===ch)return this.ST_DOUBLE_QUOTES();if("'"===ch)return this.T_CONSTANT_ENCAPSED_STRING();ch&&this.unput(1)}return id},consume_TOKEN:function consume_TOKEN(){var ch=this._input[this.offset-1],fn=this.tokenTerminals[ch];return fn?fn.apply(this,[]):this.yytext},tokenTerminals:{$:function $(){return this.offset++,this.is_LABEL_START()?(this.offset--,this.consume_LABEL(),this.tok.T_VARIABLE):(this.offset--,"$")},"-":function _(){var nchar=this._input[this.offset];return">"===nchar?(this.begin("ST_LOOKING_FOR_PROPERTY").input(),this.tok.T_OBJECT_OPERATOR):"-"===nchar?(this.input(),this.tok.T_DEC):"="===nchar?(this.input(),this.tok.T_MINUS_EQUAL):"-"},"\\":function _(){return this.tok.T_NS_SEPARATOR},"/":function _(){return"="===this._input[this.offset]?(this.input(),this.tok.T_DIV_EQUAL):"/"},":":function _(){return":"===this._input[this.offset]?(this.input(),this.tok.T_DOUBLE_COLON):":"},"(":function _(){var initial=this.offset;if(this.input(),this.is_TABSPACE()&&this.consume_TABSPACE().input(),this.is_LABEL_START()){var yylen=this.yytext.length;this.consume_LABEL();var castToken=this.yytext.substring(yylen-1).toLowerCase(),castId=this.castKeywords[castToken];if("number"==typeof castId&&(this.input(),this.is_TABSPACE()&&this.consume_TABSPACE().input(),")"===this._input[this.offset-1]))return castId}return this.unput(this.offset-initial),"("},"=":function _(){var nchar=this._input[this.offset];return">"===nchar?(this.input(),this.tok.T_DOUBLE_ARROW):"="===nchar?"="===this._input[this.offset+1]?(this.consume(2),this.tok.T_IS_IDENTICAL):(this.input(),this.tok.T_IS_EQUAL):"="},"+":function _(){var nchar=this._input[this.offset];return"+"===nchar?(this.input(),this.tok.T_INC):"="===nchar?(this.input(),this.tok.T_PLUS_EQUAL):"+"},"!":function _(){return"="===this._input[this.offset]?"="===this._input[this.offset+1]?(this.consume(2),this.tok.T_IS_NOT_IDENTICAL):(this.input(),this.tok.T_IS_NOT_EQUAL):"!"},"?":function _(){return this.php7&&"?"===this._input[this.offset]?(this.input(),this.tok.T_COALESCE):"?"},"<":function _(){var nchar=this._input[this.offset];return"<"===nchar?"="===(nchar=this._input[this.offset+1])?(this.consume(2),this.tok.T_SL_EQUAL):"<"===nchar&&this.is_HEREDOC()?this.tok.T_START_HEREDOC:(this.input(),this.tok.T_SL):"="===nchar?(this.input(),this.php7&&">"===this._input[this.offset]?(this.input(),this.tok.T_SPACESHIP):this.tok.T_IS_SMALLER_OR_EQUAL):">"===nchar?(this.input(),this.tok.T_IS_NOT_EQUAL):"<"},">":function _(){var nchar=this._input[this.offset];return"="===nchar?(this.input(),this.tok.T_IS_GREATER_OR_EQUAL):">"===nchar?"="===(nchar=this._input[this.offset+1])?(this.consume(2),this.tok.T_SR_EQUAL):(this.input(),this.tok.T_SR):">"},"*":function _(){var nchar=this._input[this.offset];return"="===nchar?(this.input(),this.tok.T_MUL_EQUAL):"*"===nchar?(this.input(),"="===this._input[this.offset]?(this.input(),this.tok.T_POW_EQUAL):this.tok.T_POW):"*"},".":function _(){var nchar=this._input[this.offset];return"="===nchar?(this.input(),this.tok.T_CONCAT_EQUAL):"."===nchar&&"."===this._input[this.offset+1]?(this.consume(2),this.tok.T_ELLIPSIS):"."},"%":function _(){return"="===this._input[this.offset]?(this.input(),this.tok.T_MOD_EQUAL):"%"},"&":function _(){var nchar=this._input[this.offset];return"="===nchar?(this.input(),this.tok.T_AND_EQUAL):"&"===nchar?(this.input(),this.tok.T_BOOLEAN_AND):"&"},"|":function _(){var nchar=this._input[this.offset];return"="===nchar?(this.input(),this.tok.T_OR_EQUAL):"|"===nchar?(this.input(),this.tok.T_BOOLEAN_OR):"|"},"^":function _(){return"="===this._input[this.offset]?(this.input(),this.tok.T_XOR_EQUAL):"^"}}}},function(module,exports,__webpack_require__){"use strict";module.exports={T_CONSTANT_ENCAPSED_STRING:function T_CONSTANT_ENCAPSED_STRING(){for(var ch=void 0;this.offset2&&this.appendToken(this.tok.T_ENCAPSED_AND_WHITESPACE,this.yytext.length-prefix),this.unput(this.yytext.length-prefix),this.begin("ST_DOUBLE_QUOTES"),this.yytext},isDOC_MATCH:function isDOC_MATCH(){if(this._input.substring(this.offset-1,this.offset-1+this.heredoc_label.length)===this.heredoc_label){var ch=this._input[this.offset-1+this.heredoc_label.length];if("\n"===ch||"\r"===ch||";"===ch)return!0}return!1},matchST_NOWDOC:function matchST_NOWDOC(){if(this.isDOC_MATCH())return this.consume(this.heredoc_label.length),this.popState(),this.tok.T_END_HEREDOC;for(var ch=this._input[this.offset-1];this.offset2?(this.appendToken(this.tok.T_DOLLAR_OPEN_CURLY_BRACES,2),this.unput(2),this.tok.T_ENCAPSED_AND_WHITESPACE):this.tok.T_DOLLAR_OPEN_CURLY_BRACES;if(this.is_LABEL_START()){var yyoffset=this.offset,next=this.consume_VARIABLE();return this.yytext.length>this.offset-yyoffset+2?(this.appendToken(next,this.offset-yyoffset+2),this.unput(this.offset-yyoffset+2),this.tok.T_ENCAPSED_AND_WHITESPACE):next}}else if("{"===ch){if("$"===(ch=this.input()))return this.begin("ST_IN_SCRIPTING"),this.yytext.length>2?(this.appendToken(this.tok.T_CURLY_OPEN,1),this.unput(2),this.tok.T_ENCAPSED_AND_WHITESPACE):(this.unput(1),this.tok.T_CURLY_OPEN)}else ch=this.input();return this.tok.T_ENCAPSED_AND_WHITESPACE},consume_VARIABLE:function consume_VARIABLE(){this.consume_LABEL();var ch=this.input();if("["==ch)return this.unput(1),this.begin("ST_VAR_OFFSET"),this.tok.T_VARIABLE;if("-"===ch){if(">"===this.input())return this.input(),this.is_LABEL_START()&&this.begin("ST_LOOKING_FOR_PROPERTY"),this.unput(3),this.tok.T_VARIABLE;this.unput(2)}else ch&&this.unput(1);return this.tok.T_VARIABLE},matchST_BACKQUOTE:function matchST_BACKQUOTE(){var ch=this.input();if("$"===ch){if("{"===(ch=this.input()))return this.begin("ST_LOOKING_FOR_VARNAME"),this.tok.T_DOLLAR_OPEN_CURLY_BRACES;if(this.is_LABEL_START())return this.consume_VARIABLE()}else if("{"===ch){if("$"===this._input[this.offset])return this.begin("ST_IN_SCRIPTING"),this.tok.T_CURLY_OPEN}else if("`"===ch)return this.popState(),"`";for(;this.offset2?(this.appendToken(this.tok.T_DOLLAR_OPEN_CURLY_BRACES,2),this.unput(2),this.tok.T_ENCAPSED_AND_WHITESPACE):this.tok.T_DOLLAR_OPEN_CURLY_BRACES;if(this.is_LABEL_START()){var yyoffset=this.offset,next=this.consume_VARIABLE();return this.yytext.length>this.offset-yyoffset+2?(this.appendToken(next,this.offset-yyoffset+2),this.unput(this.offset-yyoffset+2),this.tok.T_ENCAPSED_AND_WHITESPACE):next}continue}if("{"===ch){if("$"===(ch=this.input()))return this.begin("ST_IN_SCRIPTING"),this.yytext.length>2?(this.appendToken(this.tok.T_CURLY_OPEN,1),this.unput(2),this.tok.T_ENCAPSED_AND_WHITESPACE):(this.unput(1),this.tok.T_CURLY_OPEN);continue}}ch=this.input()}return this.tok.T_ENCAPSED_AND_WHITESPACE},matchST_DOUBLE_QUOTES:function matchST_DOUBLE_QUOTES(){var ch=this.input();if("$"===ch){if("{"===(ch=this.input()))return this.begin("ST_LOOKING_FOR_VARNAME"),this.tok.T_DOLLAR_OPEN_CURLY_BRACES;if(this.is_LABEL_START())return this.consume_VARIABLE()}else if("{"===ch){if("$"===this._input[this.offset])return this.begin("ST_IN_SCRIPTING"),this.tok.T_CURLY_OPEN}else if('"'===ch)return this.popState(),'"';for(;this.offset2?(this.appendToken(this.tok.T_DOLLAR_OPEN_CURLY_BRACES,2),this.unput(2),this.tok.T_ENCAPSED_AND_WHITESPACE):this.tok.T_DOLLAR_OPEN_CURLY_BRACES;if(this.is_LABEL_START()){var yyoffset=this.offset,next=this.consume_VARIABLE();return this.yytext.length>this.offset-yyoffset+2?(this.appendToken(next,this.offset-yyoffset+2),this.unput(this.offset-yyoffset+2),this.tok.T_ENCAPSED_AND_WHITESPACE):next}ch&&this.unput(1)}else if("{"===ch){if("$"===(ch=this.input()))return this.begin("ST_IN_SCRIPTING"),this.yytext.length>2?(this.appendToken(this.tok.T_CURLY_OPEN,1),this.unput(2),this.tok.T_ENCAPSED_AND_WHITESPACE):(this.unput(1),this.tok.T_CURLY_OPEN);ch&&this.unput(1)}}ch=this.input()}return this.tok.T_ENCAPSED_AND_WHITESPACE}}},function(module,exports,__webpack_require__){"use strict";module.exports={matchST_IN_SCRIPTING:function matchST_IN_SCRIPTING(){var ch=this.input();switch(ch){case" ":case"\t":case"\n":case"\r":case"\r\n":return this.T_WHITESPACE();case"#":return this.T_COMMENT();case"/":return"/"===this._input[this.offset]?this.T_COMMENT():"*"===this._input[this.offset]?(this.input(),this.T_DOC_COMMENT()):this.consume_TOKEN();case"'":return this.T_CONSTANT_ENCAPSED_STRING();case'"':return this.ST_DOUBLE_QUOTES();case"`":return this.begin("ST_BACKQUOTE"),"`";case"?":if(!this.aspTagMode&&this.tryMatch(">")){this.input();var nextCH=this._input[this.offset];return"\n"!==nextCH&&"\r"!==nextCH||this.input(),this.conditionStack.length>1&&this.begin("INITIAL"),this.tok.T_CLOSE_TAG}return this.consume_TOKEN();case"%":return this.aspTagMode&&">"===this._input[this.offset]?(this.input(),"\n"!==(ch=this._input[this.offset])&&"\r"!==ch||this.input(),this.aspTagMode=!1,this.conditionStack.length>1&&this.begin("INITIAL"),this.tok.T_CLOSE_TAG):this.consume_TOKEN();case"{":return this.begin("ST_IN_SCRIPTING"),"{";case"}":return this.conditionStack.length>2&&this.popState(),"}";default:if("."===ch){if(ch=this.input(),this.is_NUM())return this.consume_NUM();ch&&this.unput(1)}if(this.is_NUM())return this.consume_NUM();if(this.is_LABEL_START())return this.consume_LABEL().T_STRING();if(this.is_TOKEN())return this.consume_TOKEN()}throw new Error('Bad terminal sequence "'+ch+'" at line '+this.yylineno+" (offset "+this.offset+")")},T_WHITESPACE:function T_WHITESPACE(){for(;this.offset"===(ch=this.input()))return this.tok.T_OBJECT_OPERATOR;ch&&this.unput(1)}else{if(this.is_WHITESPACE())return this.tok.T_WHITESPACE;if(this.is_LABEL_START())return this.consume_LABEL(),this.popState(),this.tok.T_STRING}return this.popState(),ch&&this.unput(1),!1},matchST_LOOKING_FOR_VARNAME:function matchST_LOOKING_FOR_VARNAME(){var ch=this.input();if(this.popState(),this.begin("ST_IN_SCRIPTING"),this.is_LABEL_START()){if(this.consume_LABEL(),"["===(ch=this.input())||"}"===ch)return this.unput(1),this.tok.T_STRING_VARNAME;this.unput(this.yytext.length)}else ch&&this.unput(1);return!1},matchST_VAR_OFFSET:function matchST_VAR_OFFSET(){var ch=this.input();if(this.is_NUM())return this.consume_NUM(),this.tok.T_NUM_STRING;if("]"===ch)return this.popState(),"]";if("$"===ch){if(this.input(),this.is_LABEL_START())return this.consume_LABEL(),this.tok.T_VARIABLE;throw new Error("Unexpected terminal")}if(this.is_LABEL_START())return this.consume_LABEL(),this.tok.T_STRING;if(this.is_WHITESPACE()||"\\"===ch||"'"===ch||"#"===ch)return this.tok.T_ENCAPSED_AND_WHITESPACE;if("["===ch||"{"===ch||"}"===ch||'"'===ch||"`"===ch||this.is_TOKEN())return ch;throw new Error("Unexpected terminal")}}},function(module,exports){var cachedSetTimeout,cachedClearTimeout,process=module.exports={};function defaultSetTimout(){throw new Error("setTimeout has not been defined")}function defaultClearTimeout(){throw new Error("clearTimeout has not been defined")}function runTimeout(fun){if(cachedSetTimeout===setTimeout)return setTimeout(fun,0);if((cachedSetTimeout===defaultSetTimout||!cachedSetTimeout)&&setTimeout)return cachedSetTimeout=setTimeout,setTimeout(fun,0);try{return cachedSetTimeout(fun,0)}catch(e){try{return cachedSetTimeout.call(null,fun,0)}catch(e){return cachedSetTimeout.call(this,fun,0)}}}!function(){try{cachedSetTimeout="function"==typeof setTimeout?setTimeout:defaultSetTimout}catch(e){cachedSetTimeout=defaultSetTimout}try{cachedClearTimeout="function"==typeof clearTimeout?clearTimeout:defaultClearTimeout}catch(e){cachedClearTimeout=defaultClearTimeout}}();var currentQueue,queue=[],draining=!1,queueIndex=-1;function cleanUpNextTick(){draining&¤tQueue&&(draining=!1,currentQueue.length?queue=currentQueue.concat(queue):queueIndex=-1,queue.length&&drainQueue())}function drainQueue(){if(!draining){var timeout=runTimeout(cleanUpNextTick);draining=!0;for(var len=queue.length;len;){for(currentQueue=queue,queue=[];++queueIndex1)for(var i=1;i1&&"INITIAL"===this.conditionStack[this.conditionStack.length-1]?this.popState():this.begin("ST_IN_SCRIPTING"),this},matchINITIAL:function matchINITIAL(){for(;this.offset0&&this.tok.T_INLINE_HTML}}},function(module,exports,__webpack_require__){"use strict";module.exports={T_COMMENT:function T_COMMENT(){for(;this.offset"===this._input[this.offset])return this.unput(1),this.tok.T_COMMENT;if("%"===ch&&this.aspTagMode&&">"===this._input[this.offset])return this.unput(1),this.tok.T_COMMENT}return this.tok.T_COMMENT},T_DOC_COMMENT:function T_DOC_COMMENT(){var ch=this.input(),token=this.tok.T_COMMENT;if("*"===ch){if(ch=this.input(),this.is_WHITESPACE()&&(token=this.tok.T_DOC_COMMENT),"/"===ch)return token;this.unput(1)}for(;this.offset=this.size,!this.all_tokens&&this.mode_eval?(this.conditionStack=["INITIAL"],this.begin("ST_IN_SCRIPTING")):(this.conditionStack=[],this.begin("INITIAL")),this},lexer.prototype.input=function(){var ch=this._input[this.offset];return ch?(this.yytext+=ch,this.offset++,"\r"===ch&&"\n"===this._input[this.offset]&&(this.yytext+="\n",this.offset++),"\n"===ch||"\r"===ch?(this.yylloc.last_line=++this.yylineno,this.yyprevcol=this.yylloc.last_column,this.yylloc.last_column=0):this.yylloc.last_column++,ch):""},lexer.prototype.unput=function(size){if(1===size)this.offset--,"\n"===this._input[this.offset]&&"\r"===this._input[this.offset-1]&&(this.offset--,size++),"\r"===this._input[this.offset]||"\n"===this._input[this.offset]?(this.yylloc.last_line--,this.yylineno--,this.yylloc.last_column=this.yyprevcol):this.yylloc.last_column--,this.yytext=this.yytext.substring(0,this.yytext.length-size);else if(size>0)if(this.offset-=size,size0?this.conditionStack.pop():this.conditionStack[0];if(this.curCondition=this.conditionStack[this.conditionStack.length-1],this.stateCb=this["match"+this.curCondition],"function"!=typeof this.stateCb)throw new Error('Undefined condition state "'+this.curCondition+'"');return condition},lexer.prototype.next=function(){var token=void 0;if(this._input||(this.done=!0),this.yylloc.first_offset=this.offset,this.yylloc.first_line=this.yylloc.last_line,this.yylloc.first_column=this.yylloc.last_column,this.yytext="",this.done)return this.yylloc.prev_offset=this.yylloc.first_offset,this.yylloc.prev_line=this.yylloc.first_line,this.yylloc.prev_column=this.yylloc.first_column,this.EOF;if(this.tokens.length>0?(token=this.tokens.shift(),"object"===_typeof(token[1])?this.setState(token[1]):this.consume(token[1]),token=token[0]):token=this.stateCb.apply(this,[]),this.offset>=this.size&&0===this.tokens.length&&(this.done=!0),this.debug){var tName=token;tName="number"==typeof tName?this.engine.tokens.values[tName]:'"'+tName+'"';var e=new Error(tName+"\tfrom "+this.yylloc.first_line+","+this.yylloc.first_column+"\t - to "+this.yylloc.last_line+","+this.yylloc.last_column+'\t"'+this.yytext+'"');console.error(e.stack)}return token},[__webpack_require__(116),__webpack_require__(115),__webpack_require__(114),__webpack_require__(112),__webpack_require__(111),__webpack_require__(110),__webpack_require__(109),__webpack_require__(108)].forEach(function(ext){for(var k in ext)lexer.prototype[k]=ext[k]}),module.exports=lexer},function(module,exports){var toString={}.toString;module.exports=Array.isArray||function(arr){return"[object Array]"==toString.call(arr)}},function(module,exports){exports.read=function(buffer,offset,isLE,mLen,nBytes){var e,m,eLen=8*nBytes-mLen-1,eMax=(1<>1,nBits=-7,i=isLE?nBytes-1:0,d=isLE?-1:1,s=buffer[offset+i];for(i+=d,e=s&(1<<-nBits)-1,s>>=-nBits,nBits+=eLen;nBits>0;e=256*e+buffer[offset+i],i+=d,nBits-=8);for(m=e&(1<<-nBits)-1,e>>=-nBits,nBits+=mLen;nBits>0;m=256*m+buffer[offset+i],i+=d,nBits-=8);if(0===e)e=1-eBias;else{if(e===eMax)return m?NaN:1/0*(s?-1:1);m+=Math.pow(2,mLen),e-=eBias}return(s?-1:1)*m*Math.pow(2,e-mLen)},exports.write=function(buffer,value,offset,isLE,mLen,nBytes){var e,m,c,eLen=8*nBytes-mLen-1,eMax=(1<>1,rt=23===mLen?Math.pow(2,-24)-Math.pow(2,-77):0,i=isLE?0:nBytes-1,d=isLE?1:-1,s=value<0||0===value&&1/value<0?1:0;for(value=Math.abs(value),isNaN(value)||value===1/0?(m=isNaN(value)?1:0,e=eMax):(e=Math.floor(Math.log(value)/Math.LN2),value*(c=Math.pow(2,-e))<1&&(e--,c*=2),(value+=e+eBias>=1?rt/c:rt*Math.pow(2,1-eBias))*c>=2&&(e++,c/=2),e+eBias>=eMax?(m=0,e=eMax):e+eBias>=1?(m=(value*c-1)*Math.pow(2,mLen),e+=eBias):(m=value*Math.pow(2,eBias-1)*Math.pow(2,mLen),e=0));mLen>=8;buffer[offset+i]=255&m,i+=d,m/=256,mLen-=8);for(e=e<0;buffer[offset+i]=255&e,i+=d,e/=256,eLen-=8);buffer[offset+i-d]|=128*s}},function(module,exports,__webpack_require__){"use strict";exports.byteLength=function byteLength(b64){var lens=getLens(b64),validLen=lens[0],placeHoldersLen=lens[1];return 3*(validLen+placeHoldersLen)/4-placeHoldersLen},exports.toByteArray=function toByteArray(b64){for(var tmp,lens=getLens(b64),validLen=lens[0],placeHoldersLen=lens[1],arr=new Arr(function _byteLength(b64,validLen,placeHoldersLen){return 3*(validLen+placeHoldersLen)/4-placeHoldersLen}(0,validLen,placeHoldersLen)),curByte=0,len=placeHoldersLen>0?validLen-4:validLen,i=0;i>16&255,arr[curByte++]=tmp>>8&255,arr[curByte++]=255&tmp;2===placeHoldersLen&&(tmp=revLookup[b64.charCodeAt(i)]<<2|revLookup[b64.charCodeAt(i+1)]>>4,arr[curByte++]=255&tmp);1===placeHoldersLen&&(tmp=revLookup[b64.charCodeAt(i)]<<10|revLookup[b64.charCodeAt(i+1)]<<4|revLookup[b64.charCodeAt(i+2)]>>2,arr[curByte++]=tmp>>8&255,arr[curByte++]=255&tmp);return arr},exports.fromByteArray=function fromByteArray(uint8){for(var tmp,len=uint8.length,extraBytes=len%3,parts=[],i=0,len2=len-extraBytes;ilen2?len2:i+16383));1===extraBytes?(tmp=uint8[len-1],parts.push(lookup[tmp>>2]+lookup[tmp<<4&63]+"==")):2===extraBytes&&(tmp=(uint8[len-2]<<8)+uint8[len-1],parts.push(lookup[tmp>>10]+lookup[tmp>>4&63]+lookup[tmp<<2&63]+"="));return parts.join("")};for(var lookup=[],revLookup=[],Arr="undefined"!=typeof Uint8Array?Uint8Array:Array,code="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",i=0,len=code.length;i0)throw new Error("Invalid string. Length must be a multiple of 4");var validLen=b64.indexOf("=");return-1===validLen&&(validLen=len),[validLen,validLen===len?0:4-validLen%4]}function encodeChunk(uint8,start,end){for(var tmp,num,output=[],i=start;i>18&63]+lookup[num>>12&63]+lookup[num>>6&63]+lookup[63&num]);return output.join("")}revLookup["-".charCodeAt(0)]=62,revLookup["_".charCodeAt(0)]=63},function(module,exports){var g;g=function(){return this}();try{g=g||Function("return this")()||(0,eval)("this")}catch(e){"object"==typeof window&&(g=window)}module.exports=g},function(module,exports,__webpack_require__){"use strict";(function(global){ -/*! - * The buffer module from node.js, for the browser. - * - * @author Feross Aboukhadijeh - * @license MIT - */ -var base64=__webpack_require__(120),ieee754=__webpack_require__(119),isArray=__webpack_require__(118);function kMaxLength(){return Buffer.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function createBuffer(that,length){if(kMaxLength()=kMaxLength())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+kMaxLength().toString(16)+" bytes");return 0|length}function byteLength(string,encoding){if(Buffer.isBuffer(string))return string.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(string)||string instanceof ArrayBuffer))return string.byteLength;"string"!=typeof string&&(string=""+string);var len=string.length;if(0===len)return 0;for(var loweredCase=!1;;)switch(encoding){case"ascii":case"latin1":case"binary":return len;case"utf8":case"utf-8":case void 0:return utf8ToBytes(string).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*len;case"hex":return len>>>1;case"base64":return base64ToBytes(string).length;default:if(loweredCase)return utf8ToBytes(string).length;encoding=(""+encoding).toLowerCase(),loweredCase=!0}}function swap(b,n,m){var i=b[n];b[n]=b[m],b[m]=i}function bidirectionalIndexOf(buffer,val,byteOffset,encoding,dir){if(0===buffer.length)return-1;if("string"==typeof byteOffset?(encoding=byteOffset,byteOffset=0):byteOffset>2147483647?byteOffset=2147483647:byteOffset<-2147483648&&(byteOffset=-2147483648),byteOffset=+byteOffset,isNaN(byteOffset)&&(byteOffset=dir?0:buffer.length-1),byteOffset<0&&(byteOffset=buffer.length+byteOffset),byteOffset>=buffer.length){if(dir)return-1;byteOffset=buffer.length-1}else if(byteOffset<0){if(!dir)return-1;byteOffset=0}if("string"==typeof val&&(val=Buffer.from(val,encoding)),Buffer.isBuffer(val))return 0===val.length?-1:arrayIndexOf(buffer,val,byteOffset,encoding,dir);if("number"==typeof val)return val&=255,Buffer.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?dir?Uint8Array.prototype.indexOf.call(buffer,val,byteOffset):Uint8Array.prototype.lastIndexOf.call(buffer,val,byteOffset):arrayIndexOf(buffer,[val],byteOffset,encoding,dir);throw new TypeError("val must be string, number or Buffer")}function arrayIndexOf(arr,val,byteOffset,encoding,dir){var i,indexSize=1,arrLength=arr.length,valLength=val.length;if(void 0!==encoding&&("ucs2"===(encoding=String(encoding).toLowerCase())||"ucs-2"===encoding||"utf16le"===encoding||"utf-16le"===encoding)){if(arr.length<2||val.length<2)return-1;indexSize=2,arrLength/=2,valLength/=2,byteOffset/=2}function read(buf,i){return 1===indexSize?buf[i]:buf.readUInt16BE(i*indexSize)}if(dir){var foundIndex=-1;for(i=byteOffset;iarrLength&&(byteOffset=arrLength-valLength),i=byteOffset;i>=0;i--){for(var found=!0,j=0;jremaining&&(length=remaining):length=remaining;var strLen=string.length;if(strLen%2!=0)throw new TypeError("Invalid hex string");length>strLen/2&&(length=strLen/2);for(var i=0;i>8,lo=c%256,byteArray.push(lo),byteArray.push(hi);return byteArray}(string,buf.length-offset),buf,offset,length)}function base64Slice(buf,start,end){return 0===start&&end===buf.length?base64.fromByteArray(buf):base64.fromByteArray(buf.slice(start,end))}function utf8Slice(buf,start,end){end=Math.min(buf.length,end);for(var res=[],i=start;i239?4:firstByte>223?3:firstByte>191?2:1;if(i+bytesPerSequence<=end)switch(bytesPerSequence){case 1:firstByte<128&&(codePoint=firstByte);break;case 2:128==(192&(secondByte=buf[i+1]))&&(tempCodePoint=(31&firstByte)<<6|63&secondByte)>127&&(codePoint=tempCodePoint);break;case 3:secondByte=buf[i+1],thirdByte=buf[i+2],128==(192&secondByte)&&128==(192&thirdByte)&&(tempCodePoint=(15&firstByte)<<12|(63&secondByte)<<6|63&thirdByte)>2047&&(tempCodePoint<55296||tempCodePoint>57343)&&(codePoint=tempCodePoint);break;case 4:secondByte=buf[i+1],thirdByte=buf[i+2],fourthByte=buf[i+3],128==(192&secondByte)&&128==(192&thirdByte)&&128==(192&fourthByte)&&(tempCodePoint=(15&firstByte)<<18|(63&secondByte)<<12|(63&thirdByte)<<6|63&fourthByte)>65535&&tempCodePoint<1114112&&(codePoint=tempCodePoint)}null===codePoint?(codePoint=65533,bytesPerSequence=1):codePoint>65535&&(codePoint-=65536,res.push(codePoint>>>10&1023|55296),codePoint=56320|1023&codePoint),res.push(codePoint),i+=bytesPerSequence}return function decodeCodePointsArray(codePoints){var len=codePoints.length;if(len<=MAX_ARGUMENTS_LENGTH)return String.fromCharCode.apply(String,codePoints);var res="",i=0;for(;ithis.length)return"";if((void 0===end||end>this.length)&&(end=this.length),end<=0)return"";if((end>>>=0)<=(start>>>=0))return"";for(encoding||(encoding="utf8");;)switch(encoding){case"hex":return hexSlice(this,start,end);case"utf8":case"utf-8":return utf8Slice(this,start,end);case"ascii":return asciiSlice(this,start,end);case"latin1":case"binary":return latin1Slice(this,start,end);case"base64":return base64Slice(this,start,end);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return utf16leSlice(this,start,end);default:if(loweredCase)throw new TypeError("Unknown encoding: "+encoding);encoding=(encoding+"").toLowerCase(),loweredCase=!0}}.apply(this,arguments)},Buffer.prototype.equals=function equals(b){if(!Buffer.isBuffer(b))throw new TypeError("Argument must be a Buffer");return this===b||0===Buffer.compare(this,b)},Buffer.prototype.inspect=function inspect(){var str="",max=exports.INSPECT_MAX_BYTES;return this.length>0&&(str=this.toString("hex",0,max).match(/.{2}/g).join(" "),this.length>max&&(str+=" ... ")),""},Buffer.prototype.compare=function compare(target,start,end,thisStart,thisEnd){if(!Buffer.isBuffer(target))throw new TypeError("Argument must be a Buffer");if(void 0===start&&(start=0),void 0===end&&(end=target?target.length:0),void 0===thisStart&&(thisStart=0),void 0===thisEnd&&(thisEnd=this.length),start<0||end>target.length||thisStart<0||thisEnd>this.length)throw new RangeError("out of range index");if(thisStart>=thisEnd&&start>=end)return 0;if(thisStart>=thisEnd)return-1;if(start>=end)return 1;if(start>>>=0,end>>>=0,thisStart>>>=0,thisEnd>>>=0,this===target)return 0;for(var x=thisEnd-thisStart,y=end-start,len=Math.min(x,y),thisCopy=this.slice(thisStart,thisEnd),targetCopy=target.slice(start,end),i=0;iremaining)&&(length=remaining),string.length>0&&(length<0||offset<0)||offset>this.length)throw new RangeError("Attempt to write outside buffer bounds");encoding||(encoding="utf8");for(var loweredCase=!1;;)switch(encoding){case"hex":return hexWrite(this,string,offset,length);case"utf8":case"utf-8":return utf8Write(this,string,offset,length);case"ascii":return asciiWrite(this,string,offset,length);case"latin1":case"binary":return latin1Write(this,string,offset,length);case"base64":return base64Write(this,string,offset,length);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return ucs2Write(this,string,offset,length);default:if(loweredCase)throw new TypeError("Unknown encoding: "+encoding);encoding=(""+encoding).toLowerCase(),loweredCase=!0}},Buffer.prototype.toJSON=function toJSON(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var MAX_ARGUMENTS_LENGTH=4096;function asciiSlice(buf,start,end){var ret="";end=Math.min(buf.length,end);for(var i=start;ilen)&&(end=len);for(var out="",i=start;ilength)throw new RangeError("Trying to access beyond buffer length")}function checkInt(buf,value,offset,ext,max,min){if(!Buffer.isBuffer(buf))throw new TypeError('"buffer" argument must be a Buffer instance');if(value>max||valuebuf.length)throw new RangeError("Index out of range")}function objectWriteUInt16(buf,value,offset,littleEndian){value<0&&(value=65535+value+1);for(var i=0,j=Math.min(buf.length-offset,2);i>>8*(littleEndian?i:1-i)}function objectWriteUInt32(buf,value,offset,littleEndian){value<0&&(value=4294967295+value+1);for(var i=0,j=Math.min(buf.length-offset,4);i>>8*(littleEndian?i:3-i)&255}function checkIEEE754(buf,value,offset,ext,max,min){if(offset+ext>buf.length)throw new RangeError("Index out of range");if(offset<0)throw new RangeError("Index out of range")}function writeFloat(buf,value,offset,littleEndian,noAssert){return noAssert||checkIEEE754(buf,0,offset,4),ieee754.write(buf,value,offset,littleEndian,23,4),offset+4}function writeDouble(buf,value,offset,littleEndian,noAssert){return noAssert||checkIEEE754(buf,0,offset,8),ieee754.write(buf,value,offset,littleEndian,52,8),offset+8}Buffer.prototype.slice=function slice(start,end){var newBuf,len=this.length;if(start=~~start,end=void 0===end?len:~~end,start<0?(start+=len)<0&&(start=0):start>len&&(start=len),end<0?(end+=len)<0&&(end=0):end>len&&(end=len),end0&&(mul*=256);)val+=this[offset+--byteLength]*mul;return val},Buffer.prototype.readUInt8=function readUInt8(offset,noAssert){return noAssert||checkOffset(offset,1,this.length),this[offset]},Buffer.prototype.readUInt16LE=function readUInt16LE(offset,noAssert){return noAssert||checkOffset(offset,2,this.length),this[offset]|this[offset+1]<<8},Buffer.prototype.readUInt16BE=function readUInt16BE(offset,noAssert){return noAssert||checkOffset(offset,2,this.length),this[offset]<<8|this[offset+1]},Buffer.prototype.readUInt32LE=function readUInt32LE(offset,noAssert){return noAssert||checkOffset(offset,4,this.length),(this[offset]|this[offset+1]<<8|this[offset+2]<<16)+16777216*this[offset+3]},Buffer.prototype.readUInt32BE=function readUInt32BE(offset,noAssert){return noAssert||checkOffset(offset,4,this.length),16777216*this[offset]+(this[offset+1]<<16|this[offset+2]<<8|this[offset+3])},Buffer.prototype.readIntLE=function readIntLE(offset,byteLength,noAssert){offset|=0,byteLength|=0,noAssert||checkOffset(offset,byteLength,this.length);for(var val=this[offset],mul=1,i=0;++i=(mul*=128)&&(val-=Math.pow(2,8*byteLength)),val},Buffer.prototype.readIntBE=function readIntBE(offset,byteLength,noAssert){offset|=0,byteLength|=0,noAssert||checkOffset(offset,byteLength,this.length);for(var i=byteLength,mul=1,val=this[offset+--i];i>0&&(mul*=256);)val+=this[offset+--i]*mul;return val>=(mul*=128)&&(val-=Math.pow(2,8*byteLength)),val},Buffer.prototype.readInt8=function readInt8(offset,noAssert){return noAssert||checkOffset(offset,1,this.length),128&this[offset]?-1*(255-this[offset]+1):this[offset]},Buffer.prototype.readInt16LE=function readInt16LE(offset,noAssert){noAssert||checkOffset(offset,2,this.length);var val=this[offset]|this[offset+1]<<8;return 32768&val?4294901760|val:val},Buffer.prototype.readInt16BE=function readInt16BE(offset,noAssert){noAssert||checkOffset(offset,2,this.length);var val=this[offset+1]|this[offset]<<8;return 32768&val?4294901760|val:val},Buffer.prototype.readInt32LE=function readInt32LE(offset,noAssert){return noAssert||checkOffset(offset,4,this.length),this[offset]|this[offset+1]<<8|this[offset+2]<<16|this[offset+3]<<24},Buffer.prototype.readInt32BE=function readInt32BE(offset,noAssert){return noAssert||checkOffset(offset,4,this.length),this[offset]<<24|this[offset+1]<<16|this[offset+2]<<8|this[offset+3]},Buffer.prototype.readFloatLE=function readFloatLE(offset,noAssert){return noAssert||checkOffset(offset,4,this.length),ieee754.read(this,offset,!0,23,4)},Buffer.prototype.readFloatBE=function readFloatBE(offset,noAssert){return noAssert||checkOffset(offset,4,this.length),ieee754.read(this,offset,!1,23,4)},Buffer.prototype.readDoubleLE=function readDoubleLE(offset,noAssert){return noAssert||checkOffset(offset,8,this.length),ieee754.read(this,offset,!0,52,8)},Buffer.prototype.readDoubleBE=function readDoubleBE(offset,noAssert){return noAssert||checkOffset(offset,8,this.length),ieee754.read(this,offset,!1,52,8)},Buffer.prototype.writeUIntLE=function writeUIntLE(value,offset,byteLength,noAssert){(value=+value,offset|=0,byteLength|=0,noAssert)||checkInt(this,value,offset,byteLength,Math.pow(2,8*byteLength)-1,0);var mul=1,i=0;for(this[offset]=255&value;++i=0&&(mul*=256);)this[offset+i]=value/mul&255;return offset+byteLength},Buffer.prototype.writeUInt8=function writeUInt8(value,offset,noAssert){return value=+value,offset|=0,noAssert||checkInt(this,value,offset,1,255,0),Buffer.TYPED_ARRAY_SUPPORT||(value=Math.floor(value)),this[offset]=255&value,offset+1},Buffer.prototype.writeUInt16LE=function writeUInt16LE(value,offset,noAssert){return value=+value,offset|=0,noAssert||checkInt(this,value,offset,2,65535,0),Buffer.TYPED_ARRAY_SUPPORT?(this[offset]=255&value,this[offset+1]=value>>>8):objectWriteUInt16(this,value,offset,!0),offset+2},Buffer.prototype.writeUInt16BE=function writeUInt16BE(value,offset,noAssert){return value=+value,offset|=0,noAssert||checkInt(this,value,offset,2,65535,0),Buffer.TYPED_ARRAY_SUPPORT?(this[offset]=value>>>8,this[offset+1]=255&value):objectWriteUInt16(this,value,offset,!1),offset+2},Buffer.prototype.writeUInt32LE=function writeUInt32LE(value,offset,noAssert){return value=+value,offset|=0,noAssert||checkInt(this,value,offset,4,4294967295,0),Buffer.TYPED_ARRAY_SUPPORT?(this[offset+3]=value>>>24,this[offset+2]=value>>>16,this[offset+1]=value>>>8,this[offset]=255&value):objectWriteUInt32(this,value,offset,!0),offset+4},Buffer.prototype.writeUInt32BE=function writeUInt32BE(value,offset,noAssert){return value=+value,offset|=0,noAssert||checkInt(this,value,offset,4,4294967295,0),Buffer.TYPED_ARRAY_SUPPORT?(this[offset]=value>>>24,this[offset+1]=value>>>16,this[offset+2]=value>>>8,this[offset+3]=255&value):objectWriteUInt32(this,value,offset,!1),offset+4},Buffer.prototype.writeIntLE=function writeIntLE(value,offset,byteLength,noAssert){if(value=+value,offset|=0,!noAssert){var limit=Math.pow(2,8*byteLength-1);checkInt(this,value,offset,byteLength,limit-1,-limit)}var i=0,mul=1,sub=0;for(this[offset]=255&value;++i>0)-sub&255;return offset+byteLength},Buffer.prototype.writeIntBE=function writeIntBE(value,offset,byteLength,noAssert){if(value=+value,offset|=0,!noAssert){var limit=Math.pow(2,8*byteLength-1);checkInt(this,value,offset,byteLength,limit-1,-limit)}var i=byteLength-1,mul=1,sub=0;for(this[offset+i]=255&value;--i>=0&&(mul*=256);)value<0&&0===sub&&0!==this[offset+i+1]&&(sub=1),this[offset+i]=(value/mul>>0)-sub&255;return offset+byteLength},Buffer.prototype.writeInt8=function writeInt8(value,offset,noAssert){return value=+value,offset|=0,noAssert||checkInt(this,value,offset,1,127,-128),Buffer.TYPED_ARRAY_SUPPORT||(value=Math.floor(value)),value<0&&(value=255+value+1),this[offset]=255&value,offset+1},Buffer.prototype.writeInt16LE=function writeInt16LE(value,offset,noAssert){return value=+value,offset|=0,noAssert||checkInt(this,value,offset,2,32767,-32768),Buffer.TYPED_ARRAY_SUPPORT?(this[offset]=255&value,this[offset+1]=value>>>8):objectWriteUInt16(this,value,offset,!0),offset+2},Buffer.prototype.writeInt16BE=function writeInt16BE(value,offset,noAssert){return value=+value,offset|=0,noAssert||checkInt(this,value,offset,2,32767,-32768),Buffer.TYPED_ARRAY_SUPPORT?(this[offset]=value>>>8,this[offset+1]=255&value):objectWriteUInt16(this,value,offset,!1),offset+2},Buffer.prototype.writeInt32LE=function writeInt32LE(value,offset,noAssert){return value=+value,offset|=0,noAssert||checkInt(this,value,offset,4,2147483647,-2147483648),Buffer.TYPED_ARRAY_SUPPORT?(this[offset]=255&value,this[offset+1]=value>>>8,this[offset+2]=value>>>16,this[offset+3]=value>>>24):objectWriteUInt32(this,value,offset,!0),offset+4},Buffer.prototype.writeInt32BE=function writeInt32BE(value,offset,noAssert){return value=+value,offset|=0,noAssert||checkInt(this,value,offset,4,2147483647,-2147483648),value<0&&(value=4294967295+value+1),Buffer.TYPED_ARRAY_SUPPORT?(this[offset]=value>>>24,this[offset+1]=value>>>16,this[offset+2]=value>>>8,this[offset+3]=255&value):objectWriteUInt32(this,value,offset,!1),offset+4},Buffer.prototype.writeFloatLE=function writeFloatLE(value,offset,noAssert){return writeFloat(this,value,offset,!0,noAssert)},Buffer.prototype.writeFloatBE=function writeFloatBE(value,offset,noAssert){return writeFloat(this,value,offset,!1,noAssert)},Buffer.prototype.writeDoubleLE=function writeDoubleLE(value,offset,noAssert){return writeDouble(this,value,offset,!0,noAssert)},Buffer.prototype.writeDoubleBE=function writeDoubleBE(value,offset,noAssert){return writeDouble(this,value,offset,!1,noAssert)},Buffer.prototype.copy=function copy(target,targetStart,start,end){if(start||(start=0),end||0===end||(end=this.length),targetStart>=target.length&&(targetStart=target.length),targetStart||(targetStart=0),end>0&&end=this.length)throw new RangeError("sourceStart out of bounds");if(end<0)throw new RangeError("sourceEnd out of bounds");end>this.length&&(end=this.length),target.length-targetStart=0;--i)target[i+targetStart]=this[i+start];else if(len<1e3||!Buffer.TYPED_ARRAY_SUPPORT)for(i=0;i>>=0,end=void 0===end?this.length:end>>>0,val||(val=0),"number"==typeof val)for(i=start;i55295&&codePoint<57344){if(!leadSurrogate){if(codePoint>56319){(units-=3)>-1&&bytes.push(239,191,189);continue}if(i+1===length){(units-=3)>-1&&bytes.push(239,191,189);continue}leadSurrogate=codePoint;continue}if(codePoint<56320){(units-=3)>-1&&bytes.push(239,191,189),leadSurrogate=codePoint;continue}codePoint=65536+(leadSurrogate-55296<<10|codePoint-56320)}else leadSurrogate&&(units-=3)>-1&&bytes.push(239,191,189);if(leadSurrogate=null,codePoint<128){if((units-=1)<0)break;bytes.push(codePoint)}else if(codePoint<2048){if((units-=2)<0)break;bytes.push(codePoint>>6|192,63&codePoint|128)}else if(codePoint<65536){if((units-=3)<0)break;bytes.push(codePoint>>12|224,codePoint>>6&63|128,63&codePoint|128)}else{if(!(codePoint<1114112))throw new Error("Invalid code point");if((units-=4)<0)break;bytes.push(codePoint>>18|240,codePoint>>12&63|128,codePoint>>6&63|128,63&codePoint|128)}}return bytes}function base64ToBytes(str){return base64.toByteArray(function base64clean(str){if((str=function stringtrim(str){return str.trim?str.trim():str.replace(/^\s+|\s+$/g,"")}(str).replace(INVALID_BASE64_RE,"")).length<2)return"";for(;str.length%4!=0;)str+="=";return str}(str))}function blitBuffer(src,dst,offset,length){for(var i=0;i=dst.length||i>=src.length);++i)dst[i+offset]=src[i];return i}}).call(this,__webpack_require__(121))},function(module,exports,__webpack_require__){"use strict";(function(Buffer){ -/*! - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -var _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(obj){return typeof obj}:function(obj){return obj&&"function"==typeof Symbol&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj},lexer=__webpack_require__(117),parser=__webpack_require__(107),tokens=__webpack_require__(91),AST=__webpack_require__(90);function combine(src,to){for(var keys=Object.keys(src),i=keys.length;i--;){var k=keys[i],val=src[k];null===val?delete to[k]:"function"==typeof val?to[k]=val.bind(to):Array.isArray(val)?to[k]=Array.isArray(to[k])?to[k].concat(val):val:"object"===(void 0===val?"undefined":_typeof(val))?to[k]="object"===_typeof(to[k])?combine(val,to[k]):val:to[k]=val}return to}var engine=function engine(options){if("function"==typeof this)return new this(options);this.tokens=tokens,this.lexer=new lexer(this),this.ast=new AST,this.parser=new parser(this.lexer,this.ast),options&&"object"===(void 0===options?"undefined":_typeof(options))&&(options.parser&&!1===options.parser.php7&&(options.lexer||(options.lexer={}),options.lexer.php7=!1),combine(options,this))},getStringBuffer=function getStringBuffer(buffer){return Buffer.isBuffer(buffer)?buffer.toString():buffer};engine.create=function(options){return new engine(options)},engine.parseEval=function(buffer,options){return new engine(options).parseEval(buffer)},engine.prototype.parseEval=function(buffer){return this.lexer.mode_eval=!0,this.lexer.all_tokens=!1,buffer=getStringBuffer(buffer),this.parser.parse(buffer,"eval")},engine.parseCode=function(buffer,filename,options){return"object"===(void 0===filename?"undefined":_typeof(filename))&&(options=filename,filename="unknown"),new engine(options).parseCode(buffer,filename)},engine.prototype.parseCode=function(buffer,filename){return this.lexer.mode_eval=!1,this.lexer.all_tokens=!1,buffer=getStringBuffer(buffer),this.parser.parse(buffer,filename)},engine.tokenGetAll=function(buffer,options){return new engine(options).tokenGetAll(buffer)},engine.prototype.tokenGetAll=function(buffer){this.lexer.mode_eval=!1,this.lexer.all_tokens=!0,buffer=getStringBuffer(buffer);var EOF=this.lexer.EOF,names=this.tokens.values;this.lexer.setInput(buffer);for(var token=this.lexer.lex()||EOF,result=[];token!=EOF;){var entry=this.lexer.yytext;names.hasOwnProperty(token)&&(entry=[names[token],entry,this.lexer.yylloc.first_line]),result.push(entry),token=this.lexer.lex()||EOF}return result},module.exports=engine,module.exports.tokens=tokens,module.exports.lexer=lexer,module.exports.AST=AST,module.exports.parser=parser,module.exports.combine=combine,module.exports.default=engine}).call(this,__webpack_require__(122).Buffer)}]).default}); \ No newline at end of file diff --git a/engine.html b/engine.html new file mode 100644 index 000000000..0ddfcada1 --- /dev/null +++ b/engine.html @@ -0,0 +1,937 @@ + + + + + + + + + engine - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ engine +

+ + + + +
+
+ +

+ + engine + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new engine(options) +

+
+ + + + + +
+

Initialise a new parser instance with the specified options

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
options + + + + Object + + + + + + + +

List of options

+ +
+ + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
lexer + + + + Lexer + + + + + + + + +
parser + + + + Parser + + + + + + + + +
ast + + + + AST + + + + + + + + +
tokens + + + + Object + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + +
Tutorials:
+
+ +
+ + + + + +
+ + + + + + + + + + + + + +
+ + + + + +
Example
+ + +
var parser = require('php-parser');
var instance = new parser({
  parser: {
    extractDoc: true,
    suppressErrors: true,
    php7: true
  },
  ast: {
    withPositions: true
  },
  lexer: {
    short_tags: true,
    asp_tags: true
  }
});

var evalAST = instance.parseEval('some php code');
var codeAST = instance.parseCode('<?php some php code', 'foo.php');
var tokens = instance.tokenGetAll('<?php some php code');
+ + +
+ + + +
+ + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ parseCode(buffer, filename) → {Program} +

+
+ + + + + +
+

Function that parse a php code with open/close tags

+

Sample code :

+
<?php $x = 1;

Usage :

+
var parser = require('php-parser');
+var phpParser = new parser({
+  // some options
+});
+var ast = phpParser.parseCode('...php code...', 'foo.php');
+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
buffer + + + + String + + + + + + + +

The code to be parsed

+ +
filename + + + + String + + + + + + + +

Filename

+ +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+ parseEval(buffer) → {Program} +

+
+ + + + + +
+

Parse an evaluating mode string (no need to open php tags)

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
buffer + + + + String + + + + + + + + + +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+ tokenGetAll(buffer) → {Array.<String>} +

+
+ + + + + +
+

Extract tokens from the specified buffer.

+
+

Note that the output tokens are STRICLY similar to PHP function token_get_all

+
+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
buffer + + + + String + + + + + + + + + +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/fonts/OpenSans-Bold-webfont.eot b/fonts/OpenSans-Bold-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..5d20d916338a5890a033952e2e07ba7380f5a7d3 GIT binary patch literal 19544 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 literal 0 HcmV?d00001 diff --git a/fonts/OpenSans-Bold-webfont.svg b/fonts/OpenSans-Bold-webfont.svg new file mode 100644 index 000000000..3ed7be4bc --- /dev/null +++ b/fonts/OpenSans-Bold-webfont.svg @@ -0,0 +1,1830 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/fonts/OpenSans-Bold-webfont.woff b/fonts/OpenSans-Bold-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..1205787b0ed50db71ebd4f8a7f85d106721ff258 GIT binary patch literal 22432 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 ig3W + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/fonts/OpenSans-BoldItalic-webfont.woff b/fonts/OpenSans-BoldItalic-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..ed760c0628b6a0026041f5b8bba466a0471fd2e0 GIT binary patch literal 23048 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/fonts/OpenSans-Italic-webfont.woff b/fonts/OpenSans-Italic-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..ff652e64356b538c001423b6aedefcf1ee66cd17 GIT binary patch literal 23188 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 literal 0 HcmV?d00001 diff --git a/fonts/OpenSans-Light-webfont.svg b/fonts/OpenSans-Light-webfont.svg new file mode 100644 index 000000000..11a472ca8 --- /dev/null +++ b/fonts/OpenSans-Light-webfont.svg @@ -0,0 +1,1831 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/fonts/OpenSans-Light-webfont.woff b/fonts/OpenSans-Light-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..e786074813a27d0a7a249047832988d5bf0fe756 GIT binary patch literal 22248 zcmZsh1B_-}@aEgLZQHi(Y1_7KW7@WDOqPg|;+~g#c zTn|MF2_RsgpQU~Rg!-RNT>BsYzy1HaBqY@2fq;N3epI~wFj1RzkQ5V__|b-ce1ac{ zfboIAB$X6Zf3!m&Ah2Q}Am}`LXG{@E)n6h&KoF5XF+o366qrO7DylNF00BY5{rLJn z7#4V@A(_}2IsRz2Klw#KKp-%vH*Cr#?yf{Xb&!5yn10}+rURcbceJqk(S&|_y#3h3 z7+7y%3nQ1GTm-(K7^wdZl7+38`HvGnn`na|ZCO>gXKYf5#e%Pm@MS-(3 z^8E2tq<-><{sR;j#M$1+&g@6C{E0dHIb*DcNj9~kgNrK=keb?$_WDx~4Q1c$gXgoLPPM$A|b23vuQ89}D~g&=h~s?0Y}FgUqqZGapfmNBxwIuVFm(k ze2_5J1XP7GNR!Ub>HZ>jTD#<+>v|6A@Ps=rubqHZd2a9KgyVR&^O181UPYR$*uv^8jHMb|3VJelk8s&^2FN|ruFH*b0P-=Pxx z)n&d4)334G1?Ye~Q~-z$@yO0)EPiZm>;@5h&oDPs1QBS&9@GP>1JDlZFdytO5p0Mf z0mF?w6vH4nRycA8NUE&3+j`oFx2aVo;#l_bC3x_^QC zOIwCIWC%j+h!TDPjSlof`zj7nbHRVUC^89-V-ah|_Am14(ubnMne6_`PxvYvvpOVTMneb_yNnzE-NHsp$uk~E4o=th_|)1p<|5PC5H40YZHHZK-0b~`fdbVqJ0;h^LkIPchf2cz+yFG$aT z@DGbUJX0g2nIZ6P_yO?_upuT84MViLL9EyzcI!?A&RvR4?ajT7?&c*9@UShNC>D%g zbkUyp_`i6o+|@2C0Lra`zc3u!ksLzWwU(G7!V%!{ad_BVPb}tVi}J+a_!{n}qp>W~|28eomjC7^3R6XCBh(RU@wByCnk>!cCyG+VX=Bte zYU%#}!v9H8K*;?#<#4raxn*02CxZ3@H1hlPE*zzH|+~{B8@12|ap3}yg zAn`i=x1~J2YI*7A(S3-RGo}N{t(H0vi%hWoWf7SK=H3~n^NR^NGyzFG!35uS?VmGs z#O~2+m3{oxh>~A|GwHKj@^xCC#?&r*Wd@ku3Sl}MJ}=oDv{v)e=O*)`catXcw6a6> zIjNhA|EiRtXtcUS98TojtJQHI(4JQ*w%MFEdJ5Egiqjt%+9a|YTLDGxJw*yNDujmh z)?FRVkId@D`hL}`kNE24COmcC*q>vkgmXm55o|RadVe`=#EQN1zdKBpc;j2o)BKNC zG0P(>k~Ou}`%wH4-VYVy!*$z!?x_E{!;B-1#|#afobI8Ge#_L+O&BRjGs;Yx&rM3x zjhi$W8Uj}ty?hf&8Ja*dF}=RMQ!zn-y}pA;H&BhK{mq$r5Q9KKf{oSc_r?k$iG}kv z%mTM;MhZa-0U6?jFo#ft2ncUC1Vrq?gQEU^#*umh`o+TH2?A7PfrI^Xm;QGK^F+fX zBSSMoqudeess4T{#KKHQmJ;UPJwxMtb8{1OGb3YTum1jr?I2;|te_xa&`4}J{E*xr zv}*^9ww3@ZI5<3Mxi1*F*n44Tx~H0rz!VTrRv|@MiU!hiGAPzM z)@~MdW*``9Cx{_ZV?$G;i=(sC{mtDiEEEiMOk{MFtdxxOx>gk zSUl#;Xsk>n=^=XQszVLN8Ya#Jk-0kWM3t3pZ+oPx4x4{`?pGATLnQP00v=u-aleR#fDQRn(B-T3VH;M z;RhWOM2;`%!_}Jo3IIKf_y_>qW9?{w0RiIlM#A+3eqSd>6Z?Iw#)o+F0^cf)3N zDwrP&rN?5jq8V`~*29CU1=A~`bN$Cl_^#D=MBQ@yKq^@K9G@PVmbb`3DS17UUEQwR zgB@ccR;mc<6vv}>=S-BkJgRak5QW>h_pdQ&fXIGKeV^J2wKZ96+?JC!MOJslJ+%h4 zCi&JGsk)qImX-WbIA^f9LxU1P1d!@slSWa*6O?Y@3VETD2BF3d<4QFTN2!`8N~=OJ zlZntTPK?ZkP~pINtQaclB&4~*o9!%Zg)l5}P9@cC)VDk8a^ksZf|Ra7y|CktZQN^o zQ?3%CktiemUZdt##(_{7QHjuwDjt&a-;!jhtN~{+L!+f}Lma-mD&J^}JS|+jbyKcp zQ(c~RlbE+nh?m3{^BUt&p!`=h(-y(FDyLlQJ~G_~n#t@)P0l*+hXU-HA(dMVskz(; zQ)0hFh;EUe07{m$PW8(R=2F>#sM*|tk)dqs(p3B?;o)BBXllm3``+>70q2HM^Shfm z=g*0S5?lWK%5)*cruPOap=EkReE%|C$%xU3v;k>9XWUn2!*+MJfb^*l(zc5oy z6I@_r`Z&~4Tf+{b#lG-R8a3V(Nqk<7ito0vLKA@Yy&T1eH&z;zch#h;i|S#u)poOY z>Ta;5&3YDI`fv9%% zVtRy)z*h_1cGTi))g8RZm+i%`Idzga1P(TF&jWxVtp< z>@d>ppQ%o3ICIHhOwl>5v{!ta`vE5TFZJ!11?yK|lsnT^M^Vek6@EDPP-=Ov$cR-n zY8k}Vl;R7dh;}qH0>_CESncrP4g@zuYn$QILT@ZwSmN-)mL8-ADQZ3Rot6oYTY_pE zz=`L6^o=VicT}XJQ|c#`XH|8vzbmAjezSe0kxc5@slb8i#d({bnmSJ9!Nmyu@&NmE zr-Z`D1L|v*<`yo3_OlQoI-&fW)URpgPUZ=$I5YXz>_CRU6AoCl+O~ZW@0H0d(Z4*9 zll@%w33A-q4b1w|TqeglzX1j9ak{rIWJm4dK>^1?7il%Y-WDuKCcxaVI74fLhX_M% zaE#|S0dfl8eekd`hgz4GIn%0yb&0VweNJdNY=3F5=j zu<(A@2HXV1`td-Me{ zI_AYB-$W}FhJ_e0o+R# zu}kX=W$X-v;%pDfM-j0L%?)OdEP4}{SdE(5_fLc)u($byLdm)uB8CGaGtmb1NdPm= z&k%V%0wdAe^zbe8Ed^HgbDKmZpdoUJFm5wLDPVt4C7>;G$$*aJG4r<6o$O!gfXnv$ zK>n3c?ayTMGm!v)e*+pClbdwnc_Zj&Vg zoqc~>63J~>*HxdNRfQ|5NI>OM#gTz1OQjzNxn4HwAftZeK6lgk0W8{uZguXu`vub0 zM!V3t8%t;H4fEga2(o8Q?o;N`=-~+#vPu#$^XO3(k-((eba@~@OM9R=W63ISU$A3| zfc8p5RSJ`!f@P^>zE-L zfs7xqH~Z2or}b&!Iu+CtIK))LB}?KHDN-QdG6fuPQ%5%{$W(C!W7UTx!(hIY0t_5~ z@h_cuY-{_B9iEM98GWtOJ-8UJ=+LT-J8*U*? zPW3>S2*!yhD!19sO8Pbt12uIj7NXJgrtWZ$oeCsTN-gCq(US=63_AmvDpE=XqrMDD zm~3!vG7lMyC76D--aUT^(U+Tpw2ygfPpP#Tzw z$44<#KlWvtc(CKqnhU8!Kna3>pZoOI8Ev)%p5Jiu*{f={`DVB8URD1WH|MMY(0e*R zzTcHjRw^4eJ)$ZWGT3HGr~#MFqJI0k*4>Cj*zD{E^_r1-<~8TP5;k~ir=keIo_ zn*v6uM`V~7DIrg?eTm#<%o{PXIL>s71X;`WAb4ceXzPrYj9giy3Q4pxd7@dmZd!8k zB7J!_DLp+qJ^gex4o32&qs05Y?bc#XWz%6wPvxmpz91vc%jgP1e%1gi;ZhtgpV37J z4_A-91eII|nU6)&Y zz3!wb8hAq=^6Bqi*yzu3fe`?SUQ)32Fu4Qk7L z`x|N+oVB~%rT(Z-tVPTYz`^y`5S^q(QQHW-7GvHhD3wOvxOo9Cpaow*D_}?Nr0q6n z9WLW3d*$596R1}xR%_cJ+&xJusal(KaEQ(vRhtUg!wig?pqtjob6Q_4 ztpUCx!jHArozN&Cu0&a?VwRpeg=x(31!fLw`guS*o#Q!Oy#7k-qquDj*oMWloTJss zD!lDeyF*&XonFn1&MvsM<4Vq1_#v8i{_br_Z4+J%hXzDgb{r1p3~muE>gm9Ia)N^m zK%c!D{xoq^-fYyau3rcrp@-fg{*CH>?#r;~4=(tcH%2BLCmsqcL-k&a9l%4-XG+4W zBq6}*JgyIfy%$3HfPeP7UHW-RYbj@?{}c={8{Q^%yQMmw13nqi}YfxaMbnU?~=&EhEX}?q2+W?;Jp6n<-Xgu z@j_{Q*Vp@f_U$UGI2ZIsrgrc-OTsvo|`gfwB; z(H3*?K|#_0Ki}}1YuQdkEXXOdrI5fx+?!ut=Q&vFH%q@_JA0^Psb&5{=&xntl`ME= zXahZ1EuPQj`BCO~EK#0H?0MupDabeZAQsOSlqlh7SI}9auAa;(Tnk|VH09pMRJbiA zC2(B=W!p@I$+k`X7Qffta_<|~=dmuvn)$EyvNo}$ zRl*owvJQWW)8Z$wGAPT;xp&Fkvpp)iMzB&L;etoFX&E&+`_W*$r&6zlg{I&y3TR!0 z`Q!;b1${&@M%=qchdD87Z1ESXmYad*=PN+HU%4JvbL-jXeEIk7NI5R&C4cL|)v1s9 zzxa>6vUWlA(QP*(h4}6Jxv1t;RG#CWo8c_@19!fLo3BCP(pB}|3Df*IzHC~2k*^Ku zJispq5|Jnp)kKz9=na8Q8|QQsU^62lqbH`WMf1^GQxV-BU(!OI2OrxN5JnsgC;Q2@ zz|=hLxgxtbHf~BtZNs`Yl%uq0XIU`Ya0W_WM2IBpK6TQ*8mf0N=UQzHL=Y#f-+Jbz z=}IW@AP?fUO1@$hl61q!W9$S9;O!tt7^z&BiF?svC`7`-v`LgC8*?q~w{cO+10bmc zY)|<}g?>K%Z@A=(dA(Py4uS!nZ9Z=gMfKnuN47}j{{9yiVHZ>5;Oo~Hp8G-)5Pq(@ z1?0*JBWWag`kREzWVtC7BPvCVXwf9+QWUU0YXQ!n7xU~l(2 zh05vNlM~OPAR#bGCjTh48Q(fmF2b~Aax`U*>eLRbErBV-U2DTlbAe!+STzdY?bt^U zK`*4wRhm2&!8@1*k|Gu8Q;h=8=oBtPy#+a(o}HJCMTjh6OeA5hvcH{C z*@3Ky#>A)x1_H~Cg~&nztYY>Te2aeZ3$jfPpAnup*axUM;zY=pSZeV>qI( z&tG1HkEf%afc$DNPJ+!pUJEYCqkQCW3j&K6_>tA|vBAZpdOekT8Jx&7 zY;1=fr-OS4!h~3%8{*R|Jq3}vB6Ythd`)G}RX}JG*;%GyXK4_|Z({f_z(vk^=2HKR z4JTD#`7vM7jEb(Xd21UW`*CZ|r4yP@ynws~%ROkm?y`iO*kO}gSb51(0m0hRgeKH4 zmRTp@u!JraX?Uv6o~oJ8!>uYJw-(X?;|5JghxwOFjVQvCr zY6&H$eFT(Pa`P(pkqFD{!Kr+e|5xc3hX6OtKXUOp7 znuXKkkO%7CI?k`HtsSnFEU_uNM+eW0B@f0m5;%G?+pXsQro`Z*=BPdo1n=vLd&v4l8CF9 zV0W^2#C>wZ6LuwgC4;gdzJnEW$w%`Cx|<*ziZIA8oL^|;)u$eS9zgDb{-waB@(FktCfk<#uJ+(_hdS1{njaOdGRm-aTahyQpxjENsLmov z8xaM?hwMx5znb589ckN`8NvohPx0`+TpSG(fs@XHtkS=dv2_;+>}jRSG_W{vk%;@0 zZ@}K>Awd?g8X)UPJAF&&uHLY;p{f^t+g(bhfH+ z_to=UD666OD1w&l3PQn+_eu*;j~ci&o%e5p2ghlI?uqR6@VLB68l70_yXkLYiR=;i z;)XLh7SH-S-FYan(WMBQ7o*#t6iHALZm?1bR>vjEv@qM^ShrJ6ZuKBfqn~j38Q-2M zFaj2lNhGIAq(pveA?)v_3Pnug#qAYw0!Ds|p?z|sReA|mK;un~S>-|224H>S&#n9ujyxHe#H=^^v^jer7uF@a{Km!Ia7QwgLbiD;&-aii0 z;>vEqC5*al^N7~_a#vZvFkg*k&G&#d?&U@~Kh`(XJYBcsi3@jRaa-su)fB9Cc6m-9 zyp%i|VT^?!P&>5lO7)g{i^^{^D;qH4hOjh?B36W2TnVyH0giZZbB+4Q|Ci&p+ZBKxR=M`+o{4tR) z8>ydcce|0jjAmg45(Y@w+?a4`i0XErsxhoRtZfE97rI6TzY`e{=u)40AD=!QJP_Cx zM%WbvzLrG2b0VBJydG4o$RsZhC3vw&i(`zVl9W)4-vLGb4sGeQa6D6Jy?Z_lzw^>@ z;BhU<7^T&?>OWm2-n}0GeqX*8eE*FQ^ugG@eAa)s-0FO7-S*(Sy?8QeFx=Vk=1ddt zlKl73c_nI~+4axVYx=iad%R`U#j?*4O?*E1Yf6x>ie_AB7((|0w(*6V>Hv&310p_) z)_qh|7GiUoQ)dr%s88VjJBPWX7Po?68k9;%-$vy0`Hf6$xx&6Q`BdO3aJqaEpqxtM zGG_eyW8>YRI4iZ?(m;gd57~t+_4ls9P7V@66T9YAb7O1#&_XB*MO%RaX*`IC1#>)M z(H1|$aDv*7gN0`W zqt=Ie7n&3_m#o8Q_?|o(=wso8=5krCytVyFx|PF(=63~Gx_lIM9}}+c*GVLuR3;rq zZ4Lh8>qx-CK05zs0$!RIW=H5N{au|EC`U}L+ZQun;t!#a559R)onif@dlv&3>+ZKd zE9>e%m)1Q%;JTy2xetFhyiJ)+&uNz-wau8 zz_;-n8KNyGB0nj;Cp4*U^n^6dVm}sk&-2OK8qyMfZqSW0RFfto(H4%!RuO0z%Fv=v z9efGU$11^3VT}E}9Lukj=TQolt?+Q(B^+2FTLir%%CXYR7UXS8C4#EEe7do&8%>D0 z8X2kXO@bZ$qF`l|cS-D{ixA~c>d=STOi(mKND5uy$CKlq##-w&fVfszIjH3pA0`H^ZV+2KFE_@sup#w2(AG zf%xAkB^@mDEe4{uNOazu+hItOCzP4O5@RP`K|%q+rw!O z!H)IkK^I28db11P^EnMk42OIc>&dK9cj>#pN8IYFY6Lv^!-s(T*UGX6@OHMDqqYFX zBM4DbN&q3Em)#8mt#b)&B9r!Ss-ik5SGs+?@ka7gio@1yD+e)Z*$HhjEWX-~i^>NF$HDN;aItgzp zID3c$M{M0Yn<4La`%Z5-VrJTuq!uG;^>2*~$xJ3c=M3cqxKrxhJ?{L@4)xAk#HkvLzEZ9KtnL5ZRQp8LA_wJ)d2*IUIa4 z={O(a*y-P%E}oBPuKa;1u6Mp-HGgfn-h*`9x4Y;d8g8N@IL%dF4L)mc@62pyD?q-I z`6e_u7ah|m$Jk-Xues6EA=5~;r~{Kmu#i!lqr|uu#>F~~NRCR1hcb_I4_H|z=kO!* zbrxMi|s7(SJ zfm%O~{cinj(qFx6cJC1!aedCf>mK&yw7Sky3KZWpO3w5B@;$$*+69r&eaO>v+JoMH zuS>tT>VR=nW0WDlG)doLWM6;x0p6qhw)I1Ps zB=qy(NR&bP@s|5OU^|g8D=7QRDRYEp7H`Ox1eL#rxK&AP5xV5vP45GlGfrW5%hoxK zp&q|{?FO%)QPH^Maa-(z*q7S1bm(|>{8toCUxexQDSyM^moj0>yI$&iOxGp-1Wkd;DP4S#1s#_hlBOW@K@Ua7=rSx$edN?TXaqc7g7 zMR3wls5#UKe>%B5I^jy{aA@hePO4^8wDNTsiG<0{tn(ln7G!)6=4^GH>LhHne_I+- ze?s6n_@j7g)9LdTJ>6tPMJN=RV|yoX0Yq(321Mf!XcF?*qP9%BbhEd<2=X}e>YT@> zk(SFQI}SPY65R+_QCDFpnG0J%Jl?f~W-HJOy2@XtI8dQlVfdMUX@B0r3(fjVFtpn8 zcUsKOb3R{ii|_-yE|*{mW&^>SS`b@c^Yyx4*4GUJj2e*uox~js_qC$S!Y7A9MgY)^ zwTZZzs_nClP2#+Tk(;LZrb+xfu=$`xi$CEB>4fEXZ zhwS{X>qenS7P%$3pdk!6~*{&ra9AUEj!OPDNhKTSn=rtb?3sA+uRSLLo@GdFv zx_^8`QpKtLq-vtOXWZ=(Rckrz@n%>dXh8xdB zrUkb@U()D(2m`FwMHM&oy^X)?;(FyL)9o}H&cAqNh`)LzWy{s&YHKr=i=W3TMKQNk zRWwvo1)3VU0uI^olJ$5bF{M78MvPk(v2IucqH%MXTEq&qM7kyuwu)u6QWo5=;;qrp zu?M_@fy+=*FAvDQU2{)vV+LkXg)P`}a5e(^*L>0izdZ8@qg#jA%~tl96ZoVNA1Ao$ zKh^QEdNl>}x5MA#qelk(W?n?HUjD}Ki|lUn(0FQMbj}iMmd=rKx6Km!j%2Mqv#YKD zGmov(h#CQQn*?wwEM~<-tlEYAdeF2{V6+`&AJX(7Z>H<8L~Zs`E+sK!8!v+RFv=J* zO1@Yp&{w&6HZ;>*D~huZU9&+stg(%>Taq|HiF#(+VUNh`@yr-f_)BGqI~Y&-#~O2q zdu4ErtT7%K7{@G;1=d_e`%;}R%43%?duX7l5`+R-xql`E&sRL+i;~tl@^+_d(Ntq5 z0Un?;%?pd~eEl+erU2hCQ3k9-X-znf2w6+eLh(E9rRL>0HUOa%5u)tNM#>Jt|!C?p`|_6TxQks9@<`VO4#wXVqq-rM!Hx zZmH@qupLwoY&)X9#WSQlEBT%+{PYj}a~gWHih6)ytIzx{!~NbbZ`~t#7cNcU(IbyF zcoZ!Ig4Gui?YWo76tF*wZU&szjXe>H_zTSe^(p~gPG(#S?aJ?Ed+KT{^O$xCa_4(h zZSL6*QIwjX$Y)3q)k{J}{_PMXORXO=>ELbih@khU6UKX|S^H@?xosksM0(VhBWr(} zv(PbRwMIdC7s+dKBlv+Xl#+Q%9V@4fhQBYcz-2q+^=u7XXU7c%eAX}_(iclkHuin!lv@BTG$Wi!8$U#XoKf*| zl4TS&*yF-ok0=ieojDGkIIZt%s?BN}Ff&MeXC=<&@D?kYgLz^5De3e2`(Db^dJtsv z?w(U7)Mx`?bJ9Cy<+RgW255s^{HqGd&%p%@LU~es{b+kQJC@DGtyA=7VmpV$~YN61m@T45ibeRM8 z2d$Fr34ErPihf3i?VB-@H$9{4M%I1aXBxH9e^sClSnkzrcn}4NM$9$(Rw8^7ZQ2%U z>imHtmnU{MmM;xVPQ9wvW(5xVzIs{4YzjcHKz3iyr}#_hjaBrz66~&$M9C&l=-_E) zZvV6}+S^@SnerEAZON#E$$M_$In!Ogg2{>hjBb22)c+VxTGImVD4@%u2 z6>_+gkpDbvAM#T4eaz_iq;0bw%-=+dO8E3wD^CW1|eRuKhFXko2*ZB(PG620YiH01S!m;&$I zNOQYn>t9z8XRi2lzlY(+H^qp?5Qd{*>OUBw55r*fl*FXW#V(zpxMP(asc=W}sj(na zNU$t0o3U9S?I`dAYYC|%GfTA>J-&ZCBg*SedYTaW447Z%A63&1o&hPm`rIuS@uKx} zhy*!JRkQpie>WE`e%*JzTR`;XSH9}&`LCYW@3^hnL}H#BXGXp!TL@*m1EpjD%T0wf z-~sxOOGI4R8=SwZnGH&|5p9O(sLe*?2=wN zqtrZL7Ua;g;kEOc0dfmaB z-)z6s#Tgqwig}yp+hZ&TW}zbpfh<>$F9BjhC|q7fH9*fWInarN6kzY3wu(x)p>DwD za)8UmGawASc|51*Fy+LprKpQT?+6eN(9hyu8z$ZKo;|R+uFhIq`?%x%=3)xSsxSOE zbHMau_w?A=_R2`vIxYE^4{^)=I=rqce_5fsLzefC4xNwLM$pzeJGa62Cu5&m{nR|c zVZCMcjzE>&=cIH6Z<~%!0H==)rR(~4_Y=dJ`k&oGvxV%AbUxEg94k?`CXfx4q^YGU z)T&<~N%XQr#eTo$Y^5xzWB=e&E;7^yZ^W^SvbFL{^6>qt*4AR@7rh>$xxy+8u)&6%W?^H~>bCA^;k(h^y+f}OTS70Tk#)8=idqwdbE1TS$3m;CGJ>b;{}Esk_4!pG`X`&NmCqh0m{ zZ}R>JEUw8Ar2<-2c35iR*mDkg8KpUMw&eyHvlQiVxisa~WpU9j1HYr2IxWNYbCVC3 z%vJ29ZQY0m*Y*{(r$o|XnG-)3_&fsPmZBwy>bCwS7Ylqo$=T)#070;5`qB2#&Qf}$MB z*3uCS(m)9kR>T^O)??H6J|3TQ=SgmBPSUxH zDYz*oY9L)>(@LKFI}>^ZF4)S|Fh!msu|o!NIYC{-7+4@$L>QXJm_EHun$a1!0gssr zY*5_Jyhx(+?v#iJ^VTETbs3jHLTBS4u6V?-T_EL85BA%i~VK#{Txp?m4cO!+RTZQZ6ue{V_?mHA_^9o@mT8L|y!L8aqkVfZHx3Mz?0S9f9a& z0k(3iahK-pGxn*c<_GcF7W6-UWz!ofT5?9onsS(;#=14z$7Yvbmv?slG8qGtvPfO~ z`uyiJyaFDB&V6i!di(sYa>BFo|7r?`kJ(x<8b#cbs8~M4;b>kHsc4PP`#uN7k+kv&&R)!UP$$3y+cjQ#;vTtCJ5#PD+K?l#wUB~rR8_4&Mg?_T2A#Lr zgWMNzf{?cJ}&>|#YYuvTCd+(Pt z;7qb_jsCsPIbXbQCdMkm-?eyks@kwk@-h$_tI@F0wm8=(qQz!%cNO*A9Isp0PJ^uQ z7{tE{6MgKc5`628J9!_Rt2=8WVS|&<8Q}ZXuwpv(BE7Q9N3_*p^>`-9QS;|mIj;Bn zYxs1LGTMbO!03H3+v9Sx=o6-_R5p#M1NbDO8~^h+HVd8zu+$r2u!c_rH_6y4!P2%- zJk(uf&Gc-zc}7+(eWb&?db+H`18Z|h&(zZc#fq!*VgQtO0izW&i#oBvB5RPJX{fe6 zGi|U43NRXGBt;?Fl$<;kj%u>zXr`I4#sG+^cp)iS&oDA3CI&`2O8Ov$b}oYY1WXKE zOl;%&AZqhtD|1kq{lY53flc4UYIy!DfD?+P&aYPc?@F4qFCI9wC=9p>74~N`UEC3E zwum~%U#p?P1wU!%#;X*^ssY3s-B^hN#pZra-Lekvlf_7r=Ig=E$VUGA}D%w zVXm+SCbh^qLzwiAb(m2&Zkph5oqn>2?6Wxps_xVFVq#iyBcnSg^@ObR+A=#aB)s)$l6GV1(yF=YvQKl@}3G3W(B6psOU1Km(^4?Xt zsC?N@=kS-6)O6TOxPW|JK^R7XMC9)e{N|z%+U7$8{g}tWG?} zriZRAO5+?Got7Rb4e*qhs(r&UY-KHls+8Tc@4Xua((PODW3A%S6Vwb=7FK(e=uCI=kb3)ghd-C7bF}DqdFA z7YCY(bd$eE?=qME{OmfteSwrm<{tP;Ax)9MgfEtX(lBja)I<%HIP0ZOg9L(ET!7RO zsxOkv_&MPtk6$8m84p})n{=q{o>P-iumUG>4!P56D%SA0L@-rZi>1;;VK)F<8wa?^ z(0OCuUG+7XDya@V4T`A5@r+aG^`yPX8}oUJ+qRQAt(V%UJ&AZe(6{(HQdiL9DYqw1 zMIP;1*2H`}vSh8Z1IA|YlMWU`O*Dk|Go^VOgG&n>V^V-V%}+Pe9(g;K4Kc&cj$~j> z=9d<-e=C->`9&EP>#FE1lCwyF9R9Q@zg5PihtXY*^_aZplXQ@6by0DwJcuPLwoy@2 zz=ftITno80y<_91Oc-`(4KmG7aaG6j>YrV8fw@p-TMTIK1mr8 zgUTd$4%pZ4E?f2hjefX2C~f2FvXSqh=0w?-hv&LA48yCsRI6u z#;+KXQqZ=I?L&tBPuwY@dXsG~kWqGz9gOK>nY#;7gMy8HE_k8N=)%^3)9?O86Hp&G zeze(Qe*48_-64`$@d=2E&)}YGBSQ+9aE!-cW0>+L!#$Hye8Api+Z0?rCpWVI0|j7Z zd^@Urbc00Yfq&9x8=m`|gFrio;GCQV!U{FT>6+uql&6rooH4BkyFBF!cf!UHqz$kberT==L9GjtR-~Q0?{F zp}0v>6yQC%(rrq}a>jl>9lv-sJJ#&=T$&OWE2*U$y_~#k6B|m9HuchL=ck+`?S`n( zwg@6sKGBsW%G3Y$pN7MX`NEa&kI-ZJOfc?37~MAG&JR-o;J{sh_%>y2g57#rsI^@b zHLK-MsY8cEFY4v_*MG6S;PS1(KGz6bJ0kGw@*VxL6tv4QB&YmSe5p(^E(RW!OPQhx ztcERhi>@qtoq~-QF*mv8n-h`V32p-+_P%Z!h`UyhAb{g^)p#cC2DvWP-=19tpYeJ& zl^WDxM!BZcKSD}-iaEJ$o&CGx_V2cA{E#gNTElLk0Al{qipaGE9g z2X5fUKmPM@d%XRRp1*T@dEUdRyH^E6&N?Pt!~%h9SmmG>hR-|;X#6X^IGbLFkofko z#UTU+(DowTyl=Au{1Pifn|am=!b?9x>Xl>^#Ytwif`2fVTtkb3| z|G*YC^;Fj`xPlBZi7U6Hga=psiQsOT|@+=^|uK&P}dJV3^kE8x%#Un-hk??^x?bh?CYhug4t!^h4sz}>3;shar^q&uKP zPJv=ey4BhVLHET2^1}zh6AN z*OhE}<4fdO9_U{w*FZMHE9|*Xho{e7& z=lRlxLy_xsVt_QM!?}!yso14GDQ5t+EY03?C7q4EXXD{$A}mC5OLNP@xIXW|CoZ$Y zczguK={i2d#E@C5s$(~n~+>${Awf;*MGVz#*F@YiO5m+seK^5aj zoO8C~a8sx2%afg9W=#-&jr1gQdEHy&E@8ZO|47HBJm~*@3(#iY%1_S(ChPOj59$LN zD&L&aRdiM%39nMnQR@)Lkmf0o6gQKl4pxSN;U|zaIzFq}+B%zm=Mo85AQHcERm2pW z7qF(|{hABE#MIvIw0Z?icyqr1lFs$A|Aq|m#p1tfJ1xGp(Yl*DXAE$5ENqZ^XNii} zzXof%D5JdgGi@Kol78Jyd0NyMYQ19ScGH4(t8Jzp)VKRP&{z0zY@_hM0s$8O={9r0 zkMklxvtdZdiR~L0z zeh1fiy*aL!mnib(xFVv6ZV=a6-J=jLe^^LYo)5mEbFJ0?EIkJG({>e7O^y%#olw-{cW<7B#=y!t!A=Yv0P4e zuwen!=pSpn3Iqk3;qxS?rHVG=GB^EtB6k7JkTBQFD2V2no?YqQ+Dq0$O#b!k-!2CJ zKJBr7qIyF6G56={**W)5I-C3UBM(n`ecMZWUfKD=%e1R@PJ183Z@vVfq?khFD~}Gn zuc+sUenXa5EqG9y_RW1yzV+^bljn6k<-PqFbFiFdFQ?4ZnD)!7W?quT{>r`r!iyXkN2}RSVbmejUye_Xhu4_ zsM-4cUF^2dtAN%kGCp3B5y(uiie7OY?+10Wx&YCyaH=Qh2HAX1EiyskhtTYdO_Z)> z*AuY#M$s>qQjE)`T93EduG^X^>?G3qP>YR{Lr9dFk+nX^I*hu<^KQn!HDs~Ri3R? zZ2)nxXcvNZz|8Hy)o`2F$Z(5w@&kvC!AB4`=FWcyw~%9sKgKOFA;$eDaXS`C$gTU5 z;+#Soav{M+D0b$nVb?C$Fy1g<4Lt{dCnX_11VKwMH{&?sKI@2MbELkTgP=oV3(J+4 z0bo%@0;UG7tArWnifoo3#0QVoCG;5~v(+dxn6hLC5p0+c1w*fNB1=S)d5a#OH{izm zvY~@`)oYy461n-RqY2D{#jyDV{iN2I(c&|hDP*ZJ$ZP^hp$Z=(XK9o^c^*7baEDCV zmj;)<{FN&{ZJa}LJY3N(LgHgxDbXoxUeo5ZrFksQZ0HfZd$o1K%celcXcxrJ(LVj= zr@!h0UK13!{;7T1mcu)q71kXJ&UEQhUM8X~_@!khoA3JTZ+14{736hD6&nkUxzCR_xCeC<_Z%mzroa0)I>C>!j^vFqzuQLwUj1h}qnBSJ&^pRLg#;_GlL>S8{YRKYC2_ zSi{`eSs({5@p88wbW3>!HsfwDd3PXu$V7e(&=|-opF;l?m`$4k57E^vqo?;RnxS3L zzJ^#U+zZ!1J*=|n2jG!*@kgunymnkWs_iuV+c_l}O#!>h+|OpbtzcFX1q_Cg_$)dx zqmMO}l%KG+mU31_o}>}HtO zNzG`t-P3-QK6G@`r;pW38#kOT=zZ*AeTehH<2`49=e2(XWO{TrAF;pi#nC-G_a4~3 z=ZLs@{mv-5YK!yErMIjIj&|O?65MR+{_C&#)IH7r?Bf5v{_MA3e*4SoZ2F$G*4|wm zYVXaL{-U38>ScF+p(=(e#F(=Wmd{z}Z@1g^zzPFi@grfj>_G+0-Di>Y>tl3#7|z>l zTRR3Vykn3}Adj!z<8(M!V;bujjCQ-c?9xFmWEZW>YAD;;f8m5_v-^wRmF_OR@iptD z<~d{7k?i&2CxTC2%6m>dYEp1=g7=dRBdv22!K<`FyU9XWEck95KmJDcrEMHsR5ZA} zchO*J*Z3Q57(aIIyfGz%2bZXWhj6;$alKR0TO^iogrG~LXlO?9YwcN1!@zVjw|$gOD<_nGmzhY>SNGl(Byn zBS@Ji_zg6Mr#5sdNh*ob%0sBV5hCjwv=18F$ZlIxAy&4g8K{mTqucnWIH1gALN;1W z)`)P<0lAF>9=F_q6|g%Zts#@G-NqE>E!z1}4Up5Q+XmzhogKoT)0{tITL9 zByPOf44~7?c_kbD)!(27#tWO+UcJ1FH7%9e+I5D1Gh*Pt5fuXlRM2y^^<%3?jvLGS zVlSPO++>&D7fV=IqK$VY+Tc5Gt!%;v2s2J~i~O#}O7`!E@cZfcFIJggvzUwFDDMk3 z&a@pJh7v+Y5!g&3K7Szed83CE4qT~al`!Z-w6f{cj)IFL2`Y?GwYhYV){U24UP>Bb^|f$QZRQ6G&JVipGu+jRRy! zEU}<4_4zIn2#P-66^>#Kt0eqnMUsO5h6j-Jv{X+@azZ?7$+PjXfA$Y8kWSDkLZ5|1 zpRKr@%zZN(sLw+Z!JF?-&o98=?c5tG>4JCXmsxOLqoN3hwSGze+W)}H5i76#Qv0sc zp6#NzeSZd|d|Y$i;Eda)xflOa(G=4+y5ggs`i@PFW%u7yqz`Va04wCBW>yc-&w(xU zE6L6GObp8fto%NCGZ@V+`sH;PzOm!rFpEhN*#(pO-wAFdQ;aFb9gS?Zv!*+1cnojo zMziJx!Ruy0ZanXKF7OJ_v-%@y`GnS-mc@$2r$1XJtqTC=yRsqL@#amQ+5<{be5I3-v3r878>y?4{nXVNZd*`jE%&?i$~ZO?wdq} zvRY1N`!|v8nt^<`454g$-=x|j!6Zb1S;RcRjOn{18qPYS?ZO?xPOu0&z|ybRQTTN> za`1K$ewnP9O@jX3bG2$jS}O0__Zb~!25w6(!)+MHZOhIf%tgcay;MNkk;9a<7^cpDb-bM^v^XeB23N;e5%OdNay15`_p2)(ZrX^_sh zrva_fKt==OGym6^9#o^#B59=Hi=t6t5~3cJsL(cE=UDhZ8Dr+Slc=c3N)j3AEH%kg zU`RxSQHDmi61+q_3}v|1ggKTRQg~ zNQ5Z(lA=taBytLvJou*(?LReS;?)U@FjGcZ5W_HNM~)6V&BE==u=Wq}H(^8@={}uw zCZYCEl8A`5=TJ(nD^MKC`xy28WBgKfOCa?dSC&i2{{!xrcAR+HV_;-pU|^J-B{kuW zXFR{nR|a_w1`s%VRs0By{sUCK86W2MHC!a}%qo-Ek$2(yg&&^6|@0Z-78KPY*-)JKHh z-Z8%q(a{{MlOQQ}Z3-Q~$F(DB7$vC=m2tAfeQ#reIUl49gl=I*(yViyY_pD6sM<4A zXZZj7CKU{%tTrW%6=|Vv+9*I+)fmy}*j}-VvFow7aTsx=actxG$7#Zu zz}d!mjq@Lu7?%@Q9#;?739cX9cHBkW$9TASqIjx!*6>{6mE!f_&EuWLyNCA%?+-pX zJ`27Sz9alm{Br~h1eye{2u2C661*fNB9tQ3B6LldPuNR%iSR!WE0H#lQ=%-QMxu41 z>qI|@$%rM1wTPV(=K(?!@d@G&Btj%+Nt}@klB|*ZC6y-CC$&N9jI@VzlJqp`L(>0b z0%U4r4#{%JD#?b(R>-cBy&@+h=Os5o?t{FHyoY>={0jL?^8XYZ6lN%#Q23#!p%|uE zr?^bJ$pIZDTrJ}Ijx`zRMEUr}LD(NT#~X;E3D@n?Wb~%! z9n!m@f6TziAj4pe!4*Rh98k&7z|hVx%CO9Ej^P2rJ4Rwg0Y*heQ;fC&;W?uh#w0003r z0cQXN00DT~om0y$1VI!%Jw4u!AR-nby|kEVJtGpa^NL3%BnTEZt!IoG^N^kv;S;QU zft3Y+!q!Jv`3R?O-@!0Qq*B$VZryw8o_nhS4C5I#tYi;>kTb>>Cb^4o0)x0wY-0_# zij#2hqPPR&)~Mo6Ojs$!UAVK>6nA6FdR5$qxkS^yABTyY;sN4&#e>+jlZuBhVjn0T zMz38~{D?6-Qv3wZzQ!_2C~`)eS12G4htucYCkjx<87`^Kc%9Jd;DIv>4;jw1q6|{B zuF|_szY2LAED?u{HmfiEb<|jcE!ql14t8j-p+S^;=ila85$ELa8MnaGK)mx@Lwcq; ze`j#8$oLW&j24rn_h&@wt$T7;Lo+rUuJANjnjGm*9PMr>$!h8tNezsKs@!l&TOG&W zYUYblN4zfiJrZju*%`J-GK;%ZlG_5Ym~O@UGF61)o97z5*S$dv->ccaM@COX>pZ48 zE@ZeoZ;cK#))iEx=YQiOYCRKG1*v+GzHtX!;jFScIZ;y(C9(eVPdXy{nMy5?$ERPs zYmG54^lN9cyutf1?+-3laxU_;(!$xGC5Ls^aRr;~{EGY$Zrd04@mBVEa>VYN93p*R zo>+~p4N>NB%*t7od1W!jb(Y`ezc=#+t4Fo!004N}ZO~P0({T{M@$YS2+qt{rPXGV5 z>xQ?i#oe93R)MjNjsn98u7Qy72Ekr{;2QJ+2yVei;2DPp;1#;{#~b(Z$z5`nyCaI0 z_~XUP|KbNoltdGaff$UKFcV80@g$H)63L{HN*d{8kVzKVW(;E)$9N_%kx5Ku3R9WJbY?J++~YA1c*r9@hQIfWCp_f@ zzVOd>@{;Ggz|UvCvWYnan9DqBsbe4Y%%_1Mjf7ahLKg9f#VnzTr7UL|7unBBRON ztxB8Ht}IhJl;z5Q^PCYiHCNN(ya8V*SW{iq=#P|iPei-YVKcZx!TRRJt@iP_BKw5Z zl~$$A+;Xk>&S-A)R2moUsumK}PumdA-uop!jAWOIa z4pB?622)yCurwR6C|O`;Ac|F3umUAvumMG5BVw=uBSf+b0R}3v3 literal 0 HcmV?d00001 diff --git a/fonts/OpenSans-LightItalic-webfont.eot b/fonts/OpenSans-LightItalic-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..8f445929ffb03b50e98c2a2f7d831a0cb1b276a2 GIT binary patch literal 20535 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 Z%0#`NexefPFV?Xj51H#Y#AC7WXn+Jg($4?@ literal 0 HcmV?d00001 diff --git a/fonts/OpenSans-LightItalic-webfont.svg b/fonts/OpenSans-LightItalic-webfont.svg new file mode 100644 index 000000000..431d7e354 --- /dev/null +++ b/fonts/OpenSans-LightItalic-webfont.svg @@ -0,0 +1,1835 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/fonts/OpenSans-LightItalic-webfont.woff b/fonts/OpenSans-LightItalic-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..43e8b9e6cc061ff17fd2903075cbde12715512b3 GIT binary patch literal 23400 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 + + + + + + + + +
+ +

+ Global +

+ + + + +
+
+ +

+ + + +

+ + + +
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + +

Members

+ + + + +

+ (constant) FULL_QUALIFIED_NAME :String +

+ + + + +
+

This is an identifier with a namespace separator that begins with +a namespace separator, such as \Foo\Bar. The namespace \Foo is also +a fully qualified name.

+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + +

+ (constant) ignoreStack +

+ + + + +
+

outputs some debug information on current token

+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + +

+ (constant) MODE_BLOCK :String +

+ + + + +
+

The node is declared bracket enclosed code :

+
<?php
+declare(ticks=1) {
+// some statements
+}
+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + +

+ (constant) MODE_NONE :String +

+ + + + +
+

The node is declared as a simple statement. In order to make things simpler +children of the node are automatically collected until the next +declare statement.

+
<?php
+declare(ticks=1);
+// some statements
+declare(ticks=2);
+// some statements
+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + +

+ (constant) MODE_SHORT :String +

+ + + + +
+

The node is declared as a short tag syntax :

+
<?php
+declare(ticks=1):
+// some statements
+enddeclare;
+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + +

+ (constant) QUALIFIED_NAME :String +

+ + + + +
+

This is an identifier with a namespace separator, such as Foo\Bar

+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + +

+ (constant) RELATIVE_NAME :String +

+ + + + +
+

This is an identifier starting with namespace, such as namespace\Foo\Bar.

+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + +

+ (constant) TYPE_CONST :String +

+ + + + +
+

Importing a constant

+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + +

+ (constant) TYPE_FUNC :String +

+ + + + +
+

Importing a function

+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + +

+ (constant) TYPE_HEREDOC :String +

+ + + + +
+

The node is a shell execute string :

+
<?php
+echo <<<STR
+ Hello $world
+STR
+;
+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + +

+ (constant) TYPE_OFFSET :String +

+ + + + +
+

The node contains a list of constref / variables / expr :

+
<?php
+echo $foo->bar_$baz;
+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + +

+ (constant) TYPE_SHELL :String +

+ + + + +
+

The node is a shell execute string :

+
<?php
+echo `ls -larth $path`;
+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + +

+ (constant) TYPE_STRING :String +

+ + + + +
+

The node is a double quote string :

+
<?php
+echo "hello $world";
+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + +

+ (constant) UNQUALIFIED_NAME :String +

+ + + + +
+

This is an identifier without a namespace separator, such as Foo

+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ getStringBuffer(buffer) → {String} +

+
+ + + + + +
+

Check if the inpyt is a buffer or a string

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
buffer + + + + Buffer + + + | + + + String + + + + + + + +

Input value that can be either a buffer or a string

+ +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/icons/home.svg b/icons/home.svg new file mode 100644 index 000000000..676d2d385 --- /dev/null +++ b/icons/home.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/icons/search.svg b/icons/search.svg new file mode 100644 index 000000000..ccc84b62c --- /dev/null +++ b/icons/search.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/index.d.ts b/index.d.ts deleted file mode 100644 index 6d72fb1b6..000000000 --- a/index.d.ts +++ /dev/null @@ -1,364 +0,0 @@ -/*! - * Copyright (C) 2017 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - -declare module "php-parser" { - /** - * Token items - */ - const enum TokenEnum { - T_HALT_COMPILER = 101, - T_USE = 102, - T_ENCAPSED_AND_WHITESPACE = 103, - T_OBJECT_OPERATOR = 104, - T_STRING = 105, - T_DOLLAR_OPEN_CURLY_BRACES = 106, - T_STRING_VARNAME = 107, - T_CURLY_OPEN = 108, - T_NUM_STRING = 109, - T_ISSET = 110, - T_EMPTY = 111, - T_INCLUDE = 112, - T_INCLUDE_ONCE = 113, - T_EVAL = 114, - T_REQUIRE = 115, - T_REQUIRE_ONCE = 116, - T_NAMESPACE = 117, - T_NS_SEPARATOR = 118, - T_AS = 119, - T_IF = 120, - T_ENDIF = 121, - T_WHILE = 122, - T_DO = 123, - T_FOR = 124, - T_SWITCH = 125, - T_BREAK = 126, - T_CONTINUE = 127, - T_RETURN = 128, - T_GLOBAL = 129, - T_STATIC = 130, - T_ECHO = 131, - T_INLINE_HTML = 132, - T_UNSET = 133, - T_FOREACH = 134, - T_DECLARE = 135, - T_TRY = 136, - T_THROW = 137, - T_GOTO = 138, - T_FINALLY = 139, - T_CATCH = 140, - T_ENDDECLARE = 141, - T_LIST = 142, - T_CLONE = 143, - T_PLUS_EQUAL = 144, - T_MINUS_EQUAL = 145, - T_MUL_EQUAL = 146, - T_DIV_EQUAL = 147, - T_CONCAT_EQUAL = 148, - T_MOD_EQUAL = 149, - T_AND_EQUAL = 150, - T_OR_EQUAL = 151, - T_XOR_EQUAL = 152, - T_SL_EQUAL = 153, - T_SR_EQUAL = 154, - T_INC = 155, - T_DEC = 156, - T_BOOLEAN_OR = 157, - T_BOOLEAN_AND = 158, - T_LOGICAL_OR = 159, - T_LOGICAL_AND = 160, - T_LOGICAL_XOR = 161, - T_SL = 162, - T_SR = 163, - T_IS_IDENTICAL = 164, - T_IS_NOT_IDENTICAL = 165, - T_IS_EQUAL = 166, - T_IS_NOT_EQUAL = 167, - T_IS_SMALLER_OR_EQUAL = 168, - T_IS_GREATER_OR_EQUAL = 169, - T_INSTANCEOF = 170, - T_INT_CAST = 171, - T_DOUBLE_CAST = 172, - T_STRING_CAST = 173, - T_ARRAY_CAST = 174, - T_OBJECT_CAST = 175, - T_BOOL_CAST = 176, - T_UNSET_CAST = 177, - T_EXIT = 178, - T_PRINT = 179, - T_YIELD = 180, - T_YIELD_FROM = 181, - T_FUNCTION = 182, - T_DOUBLE_ARROW = 183, - T_DOUBLE_COLON = 184, - T_ARRAY = 185, - T_CALLABLE = 186, - T_CLASS = 187, - T_ABSTRACT = 188, - T_TRAIT = 189, - T_FINAL = 190, - T_EXTENDS = 191, - T_INTERFACE = 192, - T_IMPLEMENTS = 193, - T_VAR = 194, - T_PUBLIC = 195, - T_PROTECTED = 196, - T_PRIVATE = 197, - T_CONST = 198, - T_NEW = 199, - T_INSTEADOF = 200, - T_ELSEIF = 201, - T_ELSE = 202, - T_ENDSWITCH = 203, - T_CASE = 204, - T_DEFAULT = 205, - T_ENDFOR = 206, - T_ENDFOREACH = 207, - T_ENDWHILE = 208, - T_CONSTANT_ENCAPSED_STRING = 209, - T_LNUMBER = 210, - T_DNUMBER = 211, - T_LINE = 212, - T_FILE = 213, - T_DIR = 214, - T_TRAIT_C = 215, - T_METHOD_C = 216, - T_FUNC_C = 217, - T_NS_C = 218, - T_START_HEREDOC = 219, - T_END_HEREDOC = 220, - T_CLASS_C = 221, - T_VARIABLE = 222, - T_OPEN_TAG = 223, - T_OPEN_TAG_WITH_ECHO = 224, - T_CLOSE_TAG = 225, - T_WHITESPACE = 226, - T_COMMENT = 227, - T_DOC_COMMENT = 228, - T_ELLIPSIS = 229, - T_COALESCE = 230, - T_POW = 231, - T_POW_EQUAL = 232, - T_SPACESHIP = 233 - } - - /** - * The tokens dictionnary - */ - interface TokenDefinition { - /** List of token names as texts */ - values: String[], - /** Define tokens */ - names: TokenEnum[] - } - - /** - * The token structure - */ - interface Token extends Array { - // token name - 0: String; - // the token value - 1: TokenEnum; - // the current line - 2: Number - } - - /** - * Each Position object consists of a line number (1-indexed) and a column number (0-indexed): - */ - interface Position { - line: Number; - column: Number; - offset: Number; - } - - /** - * Defines the location of the node (with it's source contents as string) - */ - interface Location { - source: string; - start: Position; - end: Position; - } - - /** - * - */ - interface Node { - kind: String; - loc: Location; - } - - /** - * Error node - */ - interface ParserError extends Node { - message: String; - token: Token; - line: Number; - expected: any; - } - - /** - * A block statement, i.e., a sequence of statements surrounded by braces. - */ - interface Block extends Node { - children: Node[]; - } - - /** - * The main root node - */ - interface Program extends Block { - errors: ParserError[]; - } - - interface Parser { - lexer: Lexer; - ast: AST; - token: TokenEnum; - prev: TokenEnum; - debug: Boolean; - extractDoc: Boolean; - suppressErrors: Boolean; - getTokenName(token:TokenEnum): String; - parse(code: String, filename: String): Program; - raiseError(message: String, msgExpect: String, expect: any, token: TokenEnum): ParserError; - error(expect: String): ParserError; - node(kind:String): Node; - expectEndOfStatement(): Boolean; - showlog(): Parser; - expect(token:TokenEnum): Boolean; - expect(tokens:TokenEnum[]): Boolean; - text(): String; - next(): Parser; - ignoreComments(): Parser; - nextWithComments(): Parser; - is(type: String): Boolean; - // @todo other parsing functions ... - } - - interface KeywordsDictionnary { - [index: string]: TokenEnum - } - - interface yylloc { - first_offset: Number; - first_line: Number; - first_column: Number; - last_line: Number; - last_column: Number; - } - - interface LexerState { - yytext: String; - offset: Number; - yylineno: Number; - yyprevcol: Number; - yylloc: yylloc; - } - - interface Lexer { - debug: Boolean; - all_tokens: Boolean; - comment_tokens: Boolean; - mode_eval: Boolean; - asp_tags: Boolean; - short_tags: Boolean; - keywords: KeywordsDictionnary; - castKeywords: KeywordsDictionnary; - setInput(input:String): Lexer; - input(size:Number): String; - unput(size:Number): Lexer; - tryMatch(match:String): Boolean; - tryMatchCaseless(match:String): Boolean; - ahead(size:Number): String; - consume(size:Number): Lexer; - getState(): LexerState; - setState(state:LexerState): Lexer; - appendToken(value:TokenEnum, ahead:Number): Lexer; - lex(): TokenEnum; - begin(state:String): Lexer; - popState(): String; - next(): TokenEnum; - // @todo other lexer functions ... - } - - - interface AST { - /** - * - */ - withPositions: Boolean; - /** - * Option, if true extracts original source code attached to the node (by default false) - */ - withSource: Boolean; - /** - * Constructor - */ - constructor(withPositions:Boolean, withSource:Boolean): AST; - constructor(withPositions:Boolean): AST; - constructor(): AST; - /** - * Create a position node from specified parser - * including it's lexer current state - */ - position(parser:Parser): Position; - /** - * Prepares an AST node - */ - prepare(kind:String, parser:Parser): Function; - } - - /** - * List of options / extensions - */ - interface Options { - ast?: { - withPositions?: Boolean; - withSource?: Boolean; - }; - lexer?: { - debug?: Boolean; - all_tokens?: Boolean; - comment_tokens?: Boolean; - mode_eval?: Boolean; - asp_tags?: Boolean; - short_tags?: Boolean; - }; - parser?: { - debug?: Boolean; - extractDoc?: Boolean; - suppressErrors?: Boolean; - }; - } - - /** - * Initialise a new parser instance with the specified options - */ - export default class Engine { - // ----- STATIC HELPERS - static create(options?: Options) : Engine; - static parseEval(buffer: String, options: Options) : Program; - static parseEval(buffer: String) : Program; - static parseCode(buffer: String, filename: String, options: Options) : Program; - static parseCode(buffer: String, options: Options) : Program; - static parseCode(buffer: String) : Program; - static tokenGetAll(buffer: String, options: Options) : Token[]; - static tokenGetAll(buffer: String) : Token[]; - // ----- INSTANCE FUNCTIONS - ast: AST; - lexer: Lexer; - parser: Parser; - tokens: TokenDefinition; - constructor(options?: Options); - parseEval(buffer: String) : Program; - parseCode(buffer: String, filename: String) : Program; - parseCode(buffer: String) : Program; - tokenGetAll(buffer: String) : Token[]; - } -} diff --git a/index.html b/index.html new file mode 100644 index 000000000..8a8d41654 --- /dev/null +++ b/index.html @@ -0,0 +1,209 @@ + + + + + + + + + Home - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + + + + + + + + + + +
+
+

php-parser

+

+ +Coverage Status + + + + +

+

This javascript library parses PHP code and convert it to AST.

+ +

Installation

+

This library is distributed with npm :

+
npm install php-parser --save

Usage

+
// initialize the php parser factory class
+var fs = require('fs');
+var path = require('path');
+var engine = require('php-parser');
+
+// initialize a new parser instance
+var parser = new engine({
+  // some options :
+  parser: {
+    extractDoc: true,
+    php7: true
+  },
+  ast: {
+    withPositions: true
+  }
+});
+
+// Retrieve the AST from the specified source
+var eval = parser.parseEval('echo "Hello World";');
+
+// Retrieve an array of tokens (same as php function token_get_all)
+var tokens = parser.tokenGetAll('<?php echo "Hello World";');
+
+// Load a static file (Note: this file should exist on your computer)
+var phpFile = fs.readFileSync( './example.php' );
+
+// Log out results
+console.log( 'Eval parse:', eval );
+console.log( 'Tokens parse:', tokens );
+console.log( 'File parse:', parser.parseCode(phpFile) );
+

Sample AST output

+
{
+  'kind': 'program',
+  'children': [
+    {
+      'kind': 'echo',
+      'arguments': [
+        {
+          'kind': 'string',
+          'isDoubleQuote': true,
+          'value': 'Hello World'
+        }
+      ]
+    }
+  ]
+}
    +
  • Try it online (demo) : http://glayzzle.com/php-parser/
  • +
  • Or from AST Explorer : https://astexplorer.net/
  • +
+

API Overview

+

The main API exposes a class with the following methods :

+
    +
  • parseEval(String|Buffer) : parse a PHP code in eval style mode (without php open tags)
  • +
  • parseCode(String|Buffer, String filename) : parse a PHP code by using php open tags.
  • +
  • tokenGetAll(String|Buffer) : retrieves a list of all tokens from the specified input.
  • +
+

You can also pass options that change the behavior of the parser/lexer.

+

Documentation

+ + +
    +
  • prettier/plugin-php : Prettier PHP Plugin
  • +
  • babel-preset-php : Babel preset for converting PHP syntax to JavaScript. It can run subset of PHP in the browser or in Node.js
  • +
  • wp-pot : Generate pot file for WordPress plugins and themes
  • +
  • crane : PHP Intellisense/code-completion for VS Code
  • +
  • php-unparser : Produce code that uses the style format recommended by PSR-1 and PSR-2.
  • +
  • php-writer : Update PHP scripts from their AST
  • +
  • ts-php-inspections : Provide PHP code inspections written in typescript
  • +
  • php-reflection : Reflection API for PHP files
  • +
  • vscode-phpunit : vscode phpunit extension
  • +
+
+

You can add here your own project by opening an issue request.

+
+

License

+

This library is released under BSD-3 license clause.

+

FOSSA Status

+
+
+ + + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/index.js.html b/index.js.html new file mode 100644 index 000000000..d91240cb7 --- /dev/null +++ b/index.js.html @@ -0,0 +1,327 @@ + + + + + + + + + + + index.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ index.js +

+ + + + + +
+
+
/*!
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const lexer = require("./lexer");
+const parser = require("./parser");
+const tokens = require("./tokens");
+const AST = require("./ast");
+
+/**
+ * @private
+ */
+function combine(src, to) {
+  const keys = Object.keys(src);
+  let i = keys.length;
+  while (i--) {
+    const k = keys[i];
+    const val = src[k];
+    if (val === null) {
+      delete to[k];
+    } else if (typeof val === "function") {
+      to[k] = val.bind(to);
+    } else if (Array.isArray(val)) {
+      to[k] = Array.isArray(to[k]) ? to[k].concat(val) : val;
+    } else if (typeof val === "object") {
+      to[k] = typeof to[k] === "object" ? combine(val, to[k]) : val;
+    } else {
+      to[k] = val;
+    }
+  }
+  return to;
+}
+
+/**
+ * Initialise a new parser instance with the specified options
+ *
+ * @class
+ * @tutorial Engine
+ * @example
+ * var parser = require('php-parser');
+ * var instance = new parser({
+ *   parser: {
+ *     extractDoc: true,
+ *     suppressErrors: true,
+ *     php7: true
+ *   },
+ *   ast: {
+ *     withPositions: true
+ *   },
+ *   lexer: {
+ *     short_tags: true,
+ *     asp_tags: true
+ *   }
+ * });
+ *
+ * var evalAST = instance.parseEval('some php code');
+ * var codeAST = instance.parseCode('<?php some php code', 'foo.php');
+ * var tokens = instance.tokenGetAll('<?php some php code');
+ *
+ * @param {Object} options - List of options
+ * @property {Lexer} lexer
+ * @property {Parser} parser
+ * @property {AST} ast
+ * @property {Object} tokens
+ */
+const engine = function(options) {
+  if (typeof this === "function") {
+    return new this(options);
+  }
+  this.tokens = tokens;
+  this.lexer = new lexer(this);
+  this.ast = new AST();
+  this.parser = new parser(this.lexer, this.ast);
+  if (options && typeof options === "object") {
+    // disable php7 from lexer if already disabled from parser
+    if (options.parser && options.parser.php7 === false) {
+      if (!options.lexer) {
+        options.lexer = {};
+      }
+      options.lexer.php7 = false;
+    }
+    combine(options, this);
+  }
+};
+
+/**
+ * Check if the inpyt is a buffer or a string
+ * @param  {Buffer|String} buffer Input value that can be either a buffer or a string
+ * @return {String}   Returns the string from input
+ */
+const getStringBuffer = function(buffer) {
+  return Buffer.isBuffer(buffer) ? buffer.toString() : buffer;
+};
+
+/**
+ * Creates a new instance (Helper)
+ * @param {Object} options
+ * @return {Engine}
+ * @private
+ */
+engine.create = function(options) {
+  return new engine(options);
+};
+
+/**
+ * Evaluate the buffer
+ * @private
+ */
+engine.parseEval = function(buffer, options) {
+  const self = new engine(options);
+  return self.parseEval(buffer);
+};
+
+/**
+ * Parse an evaluating mode string (no need to open php tags)
+ * @param {String} buffer
+ * @return {Program}
+ */
+engine.prototype.parseEval = function(buffer) {
+  this.lexer.mode_eval = true;
+  this.lexer.all_tokens = false;
+  buffer = getStringBuffer(buffer);
+  return this.parser.parse(buffer, "eval");
+};
+
+/**
+ * Static function that parse a php code with open/close tags
+ * @private
+ */
+engine.parseCode = function(buffer, filename, options) {
+  if (typeof filename === "object") {
+    // retro-compatibility
+    options = filename;
+    filename = "unknown";
+  }
+  const self = new engine(options);
+  return self.parseCode(buffer, filename);
+};
+
+/**
+ * Function that parse a php code with open/close tags
+ *
+ * Sample code :
+ * ```php
+ * <?php $x = 1;
+ * ```
+ *
+ * Usage :
+ * ```js
+ * var parser = require('php-parser');
+ * var phpParser = new parser({
+ *   // some options
+ * });
+ * var ast = phpParser.parseCode('...php code...', 'foo.php');
+ * ```
+ * @param {String} buffer - The code to be parsed
+ * @param {String} filename - Filename
+ * @return {Program}
+ */
+engine.prototype.parseCode = function(buffer, filename) {
+  this.lexer.mode_eval = false;
+  this.lexer.all_tokens = false;
+  buffer = getStringBuffer(buffer);
+  return this.parser.parse(buffer, filename);
+};
+
+/**
+ * Split the buffer into tokens
+ * @private
+ */
+engine.tokenGetAll = function(buffer, options) {
+  const self = new engine(options);
+  return self.tokenGetAll(buffer);
+};
+
+/**
+ * Extract tokens from the specified buffer.
+ * > Note that the output tokens are *STRICLY* similar to PHP function `token_get_all`
+ * @param {String} buffer
+ * @return {String[]} - Each item can be a string or an array with following informations [token_name, text, line_number]
+ */
+engine.prototype.tokenGetAll = function(buffer) {
+  this.lexer.mode_eval = false;
+  this.lexer.all_tokens = true;
+  buffer = getStringBuffer(buffer);
+  const EOF = this.lexer.EOF;
+  const names = this.tokens.values;
+  this.lexer.setInput(buffer);
+  let token = this.lexer.lex() || EOF;
+  const result = [];
+  while (token != EOF) {
+    let entry = this.lexer.yytext;
+    if (names.hasOwnProperty(token)) {
+      entry = [names[token], entry, this.lexer.yylloc.first_line];
+    }
+    result.push(entry);
+    token = this.lexer.lex() || EOF;
+  }
+  return result;
+};
+
+// exports the function
+module.exports = engine;
+
+// makes libraries public
+module.exports.tokens = tokens;
+module.exports.lexer = lexer;
+module.exports.AST = AST;
+module.exports.parser = parser;
+module.exports.combine = combine;
+
+// allow the default export in index.d.ts
+module.exports.default = engine;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/lexer.html b/lexer.html new file mode 100644 index 000000000..4931673dd --- /dev/null +++ b/lexer.html @@ -0,0 +1,952 @@ + + + + + + + + + lexer - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ lexer +

+ + + + +
+
+ +

+ + lexer + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new lexer() +

+
+ + + + + +
+

This is the php lexer. It will tokenize the string for helping the +parser to build the AST from its grammar.

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
EOF + + + + Integer + + + + + + + + +
all_tokens + + + + Boolean + + + + + + + +

defines if all tokens must be retrieved (used by token_get_all only)

+
comment_tokens + + + + Boolean + + + + + + + +

extracts comments tokens

+
mode_eval + + + + Boolean + + + + + + + +

enables the evald mode (ignore opening tags)

+
asp_tags + + + + Boolean + + + + + + + +

disables by default asp tags mode

+
short_tags + + + + Boolean + + + + + + + +

enables by default short tags mode

+
keywords + + + + Object + + + + + + + +

List of php keyword

+
castKeywords + + + + Object + + + + + + + +

List of php keywords for type casting

+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ getState() +

+
+ + + + + +
+

Gets the current state

+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+ input() +

+
+ + + + + +
+

consumes and returns one char from the input

+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+ setInput() +

+
+ + + + + +
+

Initialize the lexer with the specified input

+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+ setState() +

+
+ + + + + +
+

Sets the current lexer state

+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+ unput() +

+
+ + + + + +
+

revert eating specified size

+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/lexer.js.html b/lexer.js.html new file mode 100644 index 000000000..c969fb761 --- /dev/null +++ b/lexer.js.html @@ -0,0 +1,572 @@ + + + + + + + + + + + lexer.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ lexer.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+/**
+ * This is the php lexer. It will tokenize the string for helping the
+ * parser to build the AST from its grammar.
+ *
+ * @class
+ * @property {Integer} EOF
+ * @property {Boolean} all_tokens defines if all tokens must be retrieved (used by token_get_all only)
+ * @property {Boolean} comment_tokens extracts comments tokens
+ * @property {Boolean} mode_eval enables the evald mode (ignore opening tags)
+ * @property {Boolean} asp_tags disables by default asp tags mode
+ * @property {Boolean} short_tags enables by default short tags mode
+ * @property {Object} keywords List of php keyword
+ * @property {Object} castKeywords List of php keywords for type casting
+ */
+const lexer = function(engine) {
+  this.engine = engine;
+  this.tok = this.engine.tokens.names;
+  this.EOF = 1;
+  this.debug = false;
+  this.all_tokens = true;
+  this.comment_tokens = false;
+  this.mode_eval = false;
+  this.asp_tags = false;
+  this.short_tags = true;
+  this.php7 = true;
+  this.yyprevcol = 0;
+  this.keywords = {
+    __class__: this.tok.T_CLASS_C,
+    __trait__: this.tok.T_TRAIT_C,
+    __function__: this.tok.T_FUNC_C,
+    __method__: this.tok.T_METHOD_C,
+    __line__: this.tok.T_LINE,
+    __file__: this.tok.T_FILE,
+    __dir__: this.tok.T_DIR,
+    __namespace__: this.tok.T_NS_C,
+    exit: this.tok.T_EXIT,
+    die: this.tok.T_EXIT,
+    function: this.tok.T_FUNCTION,
+    const: this.tok.T_CONST,
+    return: this.tok.T_RETURN,
+    try: this.tok.T_TRY,
+    catch: this.tok.T_CATCH,
+    finally: this.tok.T_FINALLY,
+    throw: this.tok.T_THROW,
+    if: this.tok.T_IF,
+    elseif: this.tok.T_ELSEIF,
+    endif: this.tok.T_ENDIF,
+    else: this.tok.T_ELSE,
+    while: this.tok.T_WHILE,
+    endwhile: this.tok.T_ENDWHILE,
+    do: this.tok.T_DO,
+    for: this.tok.T_FOR,
+    endfor: this.tok.T_ENDFOR,
+    foreach: this.tok.T_FOREACH,
+    endforeach: this.tok.T_ENDFOREACH,
+    declare: this.tok.T_DECLARE,
+    enddeclare: this.tok.T_ENDDECLARE,
+    instanceof: this.tok.T_INSTANCEOF,
+    as: this.tok.T_AS,
+    switch: this.tok.T_SWITCH,
+    endswitch: this.tok.T_ENDSWITCH,
+    case: this.tok.T_CASE,
+    default: this.tok.T_DEFAULT,
+    break: this.tok.T_BREAK,
+    continue: this.tok.T_CONTINUE,
+    goto: this.tok.T_GOTO,
+    echo: this.tok.T_ECHO,
+    print: this.tok.T_PRINT,
+    class: this.tok.T_CLASS,
+    interface: this.tok.T_INTERFACE,
+    trait: this.tok.T_TRAIT,
+    extends: this.tok.T_EXTENDS,
+    implements: this.tok.T_IMPLEMENTS,
+    new: this.tok.T_NEW,
+    clone: this.tok.T_CLONE,
+    var: this.tok.T_VAR,
+    eval: this.tok.T_EVAL,
+    include: this.tok.T_INCLUDE,
+    include_once: this.tok.T_INCLUDE_ONCE,
+    require: this.tok.T_REQUIRE,
+    require_once: this.tok.T_REQUIRE_ONCE,
+    namespace: this.tok.T_NAMESPACE,
+    use: this.tok.T_USE,
+    insteadof: this.tok.T_INSTEADOF,
+    global: this.tok.T_GLOBAL,
+    isset: this.tok.T_ISSET,
+    empty: this.tok.T_EMPTY,
+    __halt_compiler: this.tok.T_HALT_COMPILER,
+    static: this.tok.T_STATIC,
+    abstract: this.tok.T_ABSTRACT,
+    final: this.tok.T_FINAL,
+    private: this.tok.T_PRIVATE,
+    protected: this.tok.T_PROTECTED,
+    public: this.tok.T_PUBLIC,
+    unset: this.tok.T_UNSET,
+    list: this.tok.T_LIST,
+    array: this.tok.T_ARRAY,
+    callable: this.tok.T_CALLABLE,
+    or: this.tok.T_LOGICAL_OR,
+    and: this.tok.T_LOGICAL_AND,
+    xor: this.tok.T_LOGICAL_XOR
+  };
+  this.castKeywords = {
+    int: this.tok.T_INT_CAST,
+    integer: this.tok.T_INT_CAST,
+    real: this.tok.T_DOUBLE_CAST,
+    double: this.tok.T_DOUBLE_CAST,
+    float: this.tok.T_DOUBLE_CAST,
+    string: this.tok.T_STRING_CAST,
+    binary: this.tok.T_STRING_CAST,
+    array: this.tok.T_ARRAY_CAST,
+    object: this.tok.T_OBJECT_CAST,
+    bool: this.tok.T_BOOL_CAST,
+    boolean: this.tok.T_BOOL_CAST,
+    unset: this.tok.T_UNSET_CAST
+  };
+};
+
+/**
+ * Initialize the lexer with the specified input
+ */
+lexer.prototype.setInput = function(input) {
+  this._input = input;
+  this.size = input.length;
+  this.yylineno = 1;
+  this.offset = 0;
+  this.yyprevcol = 0;
+  this.yytext = "";
+  this.yylloc = {
+    first_offset: 0,
+    first_line: 1,
+    first_column: 0,
+    prev_offset: 0,
+    prev_line: 1,
+    prev_column: 0,
+    last_line: 1,
+    last_column: 0
+  };
+  this.tokens = [];
+  this.done = this.offset >= this.size;
+  if (!this.all_tokens && this.mode_eval) {
+    this.conditionStack = ["INITIAL"];
+    this.begin("ST_IN_SCRIPTING");
+  } else {
+    this.conditionStack = [];
+    this.begin("INITIAL");
+  }
+  return this;
+};
+
+/**
+ * consumes and returns one char from the input
+ */
+lexer.prototype.input = function() {
+  const ch = this._input[this.offset];
+  if (!ch) return "";
+  this.yytext += ch;
+  this.offset++;
+  if (ch === "\r" && this._input[this.offset] === "\n") {
+    this.yytext += "\n";
+    this.offset++;
+  }
+  if (ch === "\n" || ch === "\r") {
+    this.yylloc.last_line = ++this.yylineno;
+    this.yyprevcol = this.yylloc.last_column;
+    this.yylloc.last_column = 0;
+  } else {
+    this.yylloc.last_column++;
+  }
+  return ch;
+};
+
+/**
+ * revert eating specified size
+ */
+lexer.prototype.unput = function(size) {
+  if (size === 1) {
+    // 1 char unput (most cases)
+    this.offset--;
+    if (
+      this._input[this.offset] === "\n" &&
+      this._input[this.offset - 1] === "\r"
+    ) {
+      this.offset--;
+      size++;
+    }
+    if (
+      this._input[this.offset] === "\r" ||
+      this._input[this.offset] === "\n"
+    ) {
+      this.yylloc.last_line--;
+      this.yylineno--;
+      this.yylloc.last_column = this.yyprevcol;
+    } else {
+      this.yylloc.last_column--;
+    }
+    this.yytext = this.yytext.substring(0, this.yytext.length - size);
+  } else if (size > 0) {
+    this.offset -= size;
+    if (size < this.yytext.length) {
+      this.yytext = this.yytext.substring(0, this.yytext.length - size);
+      // re-calculate position
+      this.yylloc.last_line = this.yylloc.first_line;
+      this.yylloc.last_column = this.yyprevcol = this.yylloc.first_column;
+      for (let i = 0; i < this.yytext.length; i++) {
+        let c = this.yytext[i];
+        if (c === "\r") {
+          c = this.yytext[++i];
+          this.yyprevcol = this.yylloc.last_column;
+          this.yylloc.last_line++;
+          this.yylloc.last_column = 0;
+          if (c !== "\n") {
+            if (c === "\r") {
+              this.yylloc.last_line++;
+            } else {
+              this.yylloc.last_column++;
+            }
+          }
+        } else if (c === "\n") {
+          this.yyprevcol = this.yylloc.last_column;
+          this.yylloc.last_line++;
+          this.yylloc.last_column = 0;
+        } else {
+          this.yylloc.last_column++;
+        }
+      }
+      this.yylineno = this.yylloc.last_line;
+    } else {
+      // reset full text
+      this.yytext = "";
+      this.yylloc.last_line = this.yylineno = this.yylloc.first_line;
+      this.yylloc.last_column = this.yylloc.first_column;
+    }
+  }
+
+  return this;
+};
+
+// check if the text matches
+lexer.prototype.tryMatch = function(text) {
+  return text === this.ahead(text.length);
+};
+
+// check if the text matches
+lexer.prototype.tryMatchCaseless = function(text) {
+  return text === this.ahead(text.length).toLowerCase();
+};
+
+// look ahead
+lexer.prototype.ahead = function(size) {
+  let text = this._input.substring(this.offset, this.offset + size);
+  if (
+    text[text.length - 1] === "\r" &&
+    this._input[this.offset + size + 1] === "\n"
+  ) {
+    text += "\n";
+  }
+  return text;
+};
+
+// consume the specified size
+lexer.prototype.consume = function(size) {
+  for (let i = 0; i < size; i++) {
+    const ch = this._input[this.offset];
+    if (!ch) break;
+    this.yytext += ch;
+    this.offset++;
+    if (ch === "\r" && this._input[this.offset] === "\n") {
+      this.yytext += "\n";
+      this.offset++;
+      i++;
+    }
+    if (ch === "\n" || ch === "\r") {
+      this.yylloc.last_line = ++this.yylineno;
+      this.yyprevcol = this.yylloc.last_column;
+      this.yylloc.last_column = 0;
+    } else {
+      this.yylloc.last_column++;
+    }
+  }
+  return this;
+};
+
+/**
+ * Gets the current state
+ */
+lexer.prototype.getState = function() {
+  return {
+    yytext: this.yytext,
+    offset: this.offset,
+    yylineno: this.yylineno,
+    yyprevcol: this.yyprevcol,
+    yylloc: {
+      first_offset: this.yylloc.first_offset,
+      first_line: this.yylloc.first_line,
+      first_column: this.yylloc.first_column,
+      last_line: this.yylloc.last_line,
+      last_column: this.yylloc.last_column
+    }
+  };
+};
+
+/**
+ * Sets the current lexer state
+ */
+lexer.prototype.setState = function(state) {
+  this.yytext = state.yytext;
+  this.offset = state.offset;
+  this.yylineno = state.yylineno;
+  this.yyprevcol = state.yyprevcol;
+  this.yylloc = state.yylloc;
+  return this;
+};
+
+// prepend next token
+lexer.prototype.appendToken = function(value, ahead) {
+  this.tokens.push([value, ahead]);
+  return this;
+};
+
+// return next match that has a token
+lexer.prototype.lex = function() {
+  this.yylloc.prev_offset = this.offset;
+  this.yylloc.prev_line = this.yylloc.last_line;
+  this.yylloc.prev_column = this.yylloc.last_column;
+  let token = this.next() || this.lex();
+  if (!this.all_tokens) {
+    while (
+      token === this.tok.T_WHITESPACE || // ignore white space
+      (!this.comment_tokens &&
+        (token === this.tok.T_COMMENT || // ignore single lines comments
+          token === this.tok.T_DOC_COMMENT)) || // ignore doc comments
+      // ignore open tags
+      token === this.tok.T_OPEN_TAG
+    ) {
+      token = this.next() || this.lex();
+    }
+    if (token == this.tok.T_OPEN_TAG_WITH_ECHO) {
+      // https://github.com/php/php-src/blob/7ff186434e82ee7be7c59d0db9a976641cf7b09c/Zend/zend_compile.c#L1683
+      // open tag with echo statement
+      return this.tok.T_ECHO;
+    } else if (token === this.tok.T_CLOSE_TAG) {
+      // https://github.com/php/php-src/blob/7ff186434e82ee7be7c59d0db9a976641cf7b09c/Zend/zend_compile.c#L1680
+      return ";"; /* implicit ; */
+    }
+  }
+  if (!this.yylloc.prev_offset) {
+    this.yylloc.prev_offset = this.yylloc.first_offset;
+    this.yylloc.prev_line = this.yylloc.first_line;
+    this.yylloc.prev_column = this.yylloc.first_column;
+  }
+  /*else if (this.yylloc.prev_offset === this.offset && this.offset !== this.size) {
+    throw new Error('Infinite loop @ ' + this.offset + ' / ' + this.size);
+  }*/
+  return token;
+};
+
+// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)
+lexer.prototype.begin = function(condition) {
+  this.conditionStack.push(condition);
+  this.curCondition = condition;
+  this.stateCb = this["match" + condition];
+  if (typeof this.stateCb !== "function") {
+    throw new Error('Undefined condition state "' + condition + '"');
+  }
+  return this;
+};
+
+// pop the previously active lexer condition state off the condition stack
+lexer.prototype.popState = function() {
+  const n = this.conditionStack.length - 1;
+  const condition = n > 0 ? this.conditionStack.pop() : this.conditionStack[0];
+  this.curCondition = this.conditionStack[this.conditionStack.length - 1];
+  this.stateCb = this["match" + this.curCondition];
+  if (typeof this.stateCb !== "function") {
+    throw new Error('Undefined condition state "' + this.curCondition + '"');
+  }
+  return condition;
+};
+
+// return next match in input
+lexer.prototype.next = function() {
+  let token;
+  if (!this._input) {
+    this.done = true;
+  }
+  this.yylloc.first_offset = this.offset;
+  this.yylloc.first_line = this.yylloc.last_line;
+  this.yylloc.first_column = this.yylloc.last_column;
+  this.yytext = "";
+  if (this.done) {
+    this.yylloc.prev_offset = this.yylloc.first_offset;
+    this.yylloc.prev_line = this.yylloc.first_line;
+    this.yylloc.prev_column = this.yylloc.first_column;
+    return this.EOF;
+  }
+  if (this.tokens.length > 0) {
+    token = this.tokens.shift();
+    if (typeof token[1] === "object") {
+      this.setState(token[1]);
+    } else {
+      this.consume(token[1]);
+    }
+    token = token[0];
+  } else {
+    token = this.stateCb.apply(this, []);
+  }
+  if (this.offset >= this.size && this.tokens.length === 0) {
+    this.done = true;
+  }
+  if (this.debug) {
+    let tName = token;
+    if (typeof tName === "number") {
+      tName = this.engine.tokens.values[tName];
+    } else {
+      tName = '"' + tName + '"';
+    }
+    const e = new Error(
+      tName +
+        "\tfrom " +
+        this.yylloc.first_line +
+        "," +
+        this.yylloc.first_column +
+        "\t - to " +
+        this.yylloc.last_line +
+        "," +
+        this.yylloc.last_column +
+        '\t"' +
+        this.yytext +
+        '"'
+    );
+    // eslint-disable-next-line no-console
+    console.error(e.stack);
+  }
+  return token;
+};
+
+// extends the lexer with states
+[
+  require("./lexer/comments.js"),
+  require("./lexer/initial.js"),
+  require("./lexer/numbers.js"),
+  require("./lexer/property.js"),
+  require("./lexer/scripting.js"),
+  require("./lexer/strings.js"),
+  require("./lexer/tokens.js"),
+  require("./lexer/utils.js")
+].forEach(function(ext) {
+  for (const k in ext) {
+    lexer.prototype[k] = ext[k];
+  }
+});
+
+module.exports = lexer;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/lexer_comments.js.html b/lexer_comments.js.html new file mode 100644 index 000000000..b6859f554 --- /dev/null +++ b/lexer_comments.js.html @@ -0,0 +1,174 @@ + + + + + + + + + + + lexer/comments.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ lexer/comments.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+module.exports = {
+  /**
+   * Reads a single line comment
+   */
+  T_COMMENT: function() {
+    while (this.offset < this.size) {
+      const ch = this.input();
+      if (ch === "\n" || ch === "\r") {
+        return this.tok.T_COMMENT;
+      } else if (
+        ch === "?" &&
+        !this.aspTagMode &&
+        this._input[this.offset] === ">"
+      ) {
+        this.unput(1);
+        return this.tok.T_COMMENT;
+      } else if (
+        ch === "%" &&
+        this.aspTagMode &&
+        this._input[this.offset] === ">"
+      ) {
+        this.unput(1);
+        return this.tok.T_COMMENT;
+      }
+    }
+    return this.tok.T_COMMENT;
+  },
+  /**
+   * Behaviour : https://github.com/php/php-src/blob/master/Zend/zend_language_scanner.l#L1927
+   */
+  T_DOC_COMMENT: function() {
+    let ch = this.input();
+    let token = this.tok.T_COMMENT;
+    if (ch === "*") {
+      // started with '/*' , check is next is '*'
+      ch = this.input();
+      if (this.is_WHITESPACE()) {
+        // check if next is WHITESPACE
+        token = this.tok.T_DOC_COMMENT;
+      }
+      if (ch === "/") {
+        return token;
+      } else {
+        this.unput(1); // reset
+      }
+    }
+    while (this.offset < this.size) {
+      ch = this.input();
+      if (ch === "*" && this._input[this.offset] === "/") {
+        this.input();
+        break;
+      }
+    }
+    return token;
+  }
+};
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/lexer_strings.js.html b/lexer_strings.js.html new file mode 100644 index 000000000..f02fb9917 --- /dev/null +++ b/lexer_strings.js.html @@ -0,0 +1,528 @@ + + + + + + + + + + + lexer/strings.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ lexer/strings.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+module.exports = {
+  T_CONSTANT_ENCAPSED_STRING: function() {
+    let ch;
+    while (this.offset < this.size) {
+      ch = this.input();
+      if (ch == "\\") {
+        this.input();
+      } else if (ch == "'") {
+        break;
+      }
+    }
+    return this.tok.T_CONSTANT_ENCAPSED_STRING;
+  },
+  // check if matching a HEREDOC state
+  is_HEREDOC: function() {
+    const revert = this.offset;
+    if (
+      this._input[this.offset - 1] === "<" &&
+      this._input[this.offset] === "<" &&
+      this._input[this.offset + 1] === "<"
+    ) {
+      this.offset += 3;
+
+      // optional tabs / spaces
+      if (this.is_TABSPACE()) {
+        while (this.offset < this.size) {
+          this.offset++;
+          if (!this.is_TABSPACE()) {
+            break;
+          }
+        }
+      }
+
+      // optional quotes
+      let tChar = this._input[this.offset - 1];
+      if (tChar === "'" || tChar === '"') {
+        this.offset++;
+      } else {
+        tChar = null;
+      }
+
+      // required label
+      if (this.is_LABEL_START()) {
+        let yyoffset = this.offset - 1;
+        while (this.offset < this.size) {
+          this.offset++;
+          if (!this.is_LABEL()) {
+            break;
+          }
+        }
+        const yylabel = this._input.substring(yyoffset, this.offset - 1);
+        if (!tChar || tChar === this._input[this.offset - 1]) {
+          // required ending quote
+          if (tChar) this.offset++;
+          // require newline
+          if (
+            this._input[this.offset - 1] === "\r" ||
+            this._input[this.offset - 1] === "\n"
+          ) {
+            // go go go
+            this.heredoc_label = yylabel;
+            yyoffset = this.offset - revert;
+            this.offset = revert;
+            this.consume(yyoffset);
+            if (tChar === "'") {
+              this.begin("ST_NOWDOC");
+            } else {
+              this.begin("ST_HEREDOC");
+            }
+            return this.tok.T_START_HEREDOC;
+          }
+        }
+      }
+    }
+    this.offset = revert;
+    return false;
+  },
+  ST_DOUBLE_QUOTES: function() {
+    let ch;
+    while (this.offset < this.size) {
+      ch = this.input();
+      if (ch == "\\") {
+        this.input();
+      } else if (ch == '"') {
+        break;
+      } else if (ch == "$") {
+        ch = this.input();
+        if (ch == "{" || this.is_LABEL_START()) {
+          this.unput(2);
+          break;
+        }
+        if (ch) this.unput(1);
+      } else if (ch == "{") {
+        ch = this.input();
+        if (ch == "$") {
+          this.unput(2);
+          break;
+        }
+        if (ch) this.unput(1);
+      }
+    }
+    if (ch == '"') {
+      return this.tok.T_CONSTANT_ENCAPSED_STRING;
+    } else {
+      let prefix = 1;
+      if (this.yytext[0] === "b" || this.yytext[0] === "B") {
+        prefix = 2;
+      }
+      if (this.yytext.length > 2) {
+        this.appendToken(
+          this.tok.T_ENCAPSED_AND_WHITESPACE,
+          this.yytext.length - prefix
+        );
+      }
+      this.unput(this.yytext.length - prefix);
+      this.begin("ST_DOUBLE_QUOTES");
+      return this.yytext;
+    }
+  },
+
+  // check if its a DOC end sequence
+  isDOC_MATCH: function() {
+    // @fixme : check if out of text limits
+    if (
+      this._input.substring(
+        this.offset - 1,
+        this.offset - 1 + this.heredoc_label.length
+      ) === this.heredoc_label
+    ) {
+      const ch = this._input[this.offset - 1 + this.heredoc_label.length];
+      if (ch === "\n" || ch === "\r" || ch === ";") {
+        return true;
+      }
+    }
+    return false;
+  },
+
+  matchST_NOWDOC: function() {
+    /** edge case : empty now doc **/
+    if (this.isDOC_MATCH()) {
+      // @fixme : never reached (may be caused by quotes)
+      this.consume(this.heredoc_label.length);
+      this.popState();
+      return this.tok.T_END_HEREDOC;
+    }
+    /** SCANNING CONTENTS **/
+    let ch = this._input[this.offset - 1];
+    while (this.offset < this.size) {
+      if (ch === "\n" || ch === "\r") {
+        ch = this.input();
+        if (this.isDOC_MATCH()) {
+          this.unput(1).popState();
+          this.appendToken(this.tok.T_END_HEREDOC, this.heredoc_label.length);
+          return this.tok.T_ENCAPSED_AND_WHITESPACE;
+        }
+      } else {
+        ch = this.input();
+      }
+    }
+    // too bad ! reached end of document (will get a parse error)
+    return this.tok.T_ENCAPSED_AND_WHITESPACE;
+  },
+
+  matchST_HEREDOC: function() {
+    /** edge case : empty here doc **/
+    let ch = this.input();
+    if (this.isDOC_MATCH()) {
+      this.consume(this.heredoc_label.length - 1);
+      this.popState();
+      return this.tok.T_END_HEREDOC;
+    }
+    /** SCANNING CONTENTS **/
+    while (this.offset < this.size) {
+      if (ch === "\\") {
+        ch = this.input(); // ignore next
+        if (ch !== "\n" && ch !== "\r") {
+          ch = this.input();
+        }
+      }
+
+      if (ch === "\n" || ch === "\r") {
+        ch = this.input();
+        if (this.isDOC_MATCH()) {
+          this.unput(1).popState();
+          this.appendToken(this.tok.T_END_HEREDOC, this.heredoc_label.length);
+          return this.tok.T_ENCAPSED_AND_WHITESPACE;
+        }
+      } else if (ch === "$") {
+        ch = this.input();
+        if (ch === "{") {
+          // start of ${
+          this.begin("ST_LOOKING_FOR_VARNAME");
+          if (this.yytext.length > 2) {
+            this.appendToken(this.tok.T_DOLLAR_OPEN_CURLY_BRACES, 2);
+            this.unput(2);
+            return this.tok.T_ENCAPSED_AND_WHITESPACE;
+          } else {
+            return this.tok.T_DOLLAR_OPEN_CURLY_BRACES;
+          }
+        } else if (this.is_LABEL_START()) {
+          // start of $var...
+          const yyoffset = this.offset;
+          const next = this.consume_VARIABLE();
+          if (this.yytext.length > this.offset - yyoffset + 2) {
+            this.appendToken(next, this.offset - yyoffset + 2);
+            this.unput(this.offset - yyoffset + 2);
+            return this.tok.T_ENCAPSED_AND_WHITESPACE;
+          } else {
+            return next;
+          }
+          //console.log(this.yytext);
+        }
+      } else if (ch === "{") {
+        ch = this.input();
+        if (ch === "$") {
+          // start of {$...
+          this.begin("ST_IN_SCRIPTING");
+          if (this.yytext.length > 2) {
+            this.appendToken(this.tok.T_CURLY_OPEN, 1);
+            this.unput(2);
+            return this.tok.T_ENCAPSED_AND_WHITESPACE;
+          } else {
+            this.unput(1);
+            return this.tok.T_CURLY_OPEN;
+          }
+        }
+      } else {
+        ch = this.input();
+      }
+    }
+
+    // too bad ! reached end of document (will get a parse error)
+    return this.tok.T_ENCAPSED_AND_WHITESPACE;
+  },
+
+  consume_VARIABLE: function() {
+    this.consume_LABEL();
+    const ch = this.input();
+    if (ch == "[") {
+      this.unput(1);
+      this.begin("ST_VAR_OFFSET");
+      return this.tok.T_VARIABLE;
+    } else if (ch === "-") {
+      if (this.input() === ">") {
+        this.input();
+        if (this.is_LABEL_START()) {
+          this.begin("ST_LOOKING_FOR_PROPERTY");
+        }
+        this.unput(3);
+        return this.tok.T_VARIABLE;
+      } else {
+        this.unput(2);
+      }
+    } else {
+      if (ch) this.unput(1);
+    }
+    return this.tok.T_VARIABLE;
+  },
+  // HANDLES BACKQUOTES
+  matchST_BACKQUOTE: function() {
+    let ch = this.input();
+    if (ch === "$") {
+      ch = this.input();
+      if (ch === "{") {
+        this.begin("ST_LOOKING_FOR_VARNAME");
+        return this.tok.T_DOLLAR_OPEN_CURLY_BRACES;
+      } else if (this.is_LABEL_START()) {
+        const tok = this.consume_VARIABLE();
+        return tok;
+      }
+    } else if (ch === "{") {
+      if (this._input[this.offset] === "$") {
+        this.begin("ST_IN_SCRIPTING");
+        return this.tok.T_CURLY_OPEN;
+      }
+    } else if (ch === "`") {
+      this.popState();
+      return "`";
+    }
+
+    // any char
+    while (this.offset < this.size) {
+      if (ch === "\\") {
+        this.input();
+      } else if (ch === "`") {
+        this.unput(1);
+        this.popState();
+        this.appendToken("`", 1);
+        break;
+      } else if (ch === "$") {
+        ch = this.input();
+        if (ch === "{") {
+          this.begin("ST_LOOKING_FOR_VARNAME");
+          if (this.yytext.length > 2) {
+            this.appendToken(this.tok.T_DOLLAR_OPEN_CURLY_BRACES, 2);
+            this.unput(2);
+            return this.tok.T_ENCAPSED_AND_WHITESPACE;
+          } else {
+            return this.tok.T_DOLLAR_OPEN_CURLY_BRACES;
+          }
+        } else if (this.is_LABEL_START()) {
+          // start of $var...
+          const yyoffset = this.offset;
+          const next = this.consume_VARIABLE();
+          if (this.yytext.length > this.offset - yyoffset + 2) {
+            this.appendToken(next, this.offset - yyoffset + 2);
+            this.unput(this.offset - yyoffset + 2);
+            return this.tok.T_ENCAPSED_AND_WHITESPACE;
+          } else {
+            return next;
+          }
+        }
+        continue;
+      } else if (ch === "{") {
+        ch = this.input();
+        if (ch === "$") {
+          // start of {$...
+          this.begin("ST_IN_SCRIPTING");
+          if (this.yytext.length > 2) {
+            this.appendToken(this.tok.T_CURLY_OPEN, 1);
+            this.unput(2);
+            return this.tok.T_ENCAPSED_AND_WHITESPACE;
+          } else {
+            this.unput(1);
+            return this.tok.T_CURLY_OPEN;
+          }
+        }
+        continue;
+      }
+      ch = this.input();
+    }
+    return this.tok.T_ENCAPSED_AND_WHITESPACE;
+  },
+
+  matchST_DOUBLE_QUOTES: function() {
+    let ch = this.input();
+    if (ch === "$") {
+      ch = this.input();
+      if (ch === "{") {
+        this.begin("ST_LOOKING_FOR_VARNAME");
+        return this.tok.T_DOLLAR_OPEN_CURLY_BRACES;
+      } else if (this.is_LABEL_START()) {
+        const tok = this.consume_VARIABLE();
+        return tok;
+      }
+    } else if (ch === "{") {
+      if (this._input[this.offset] === "$") {
+        this.begin("ST_IN_SCRIPTING");
+        return this.tok.T_CURLY_OPEN;
+      }
+    } else if (ch === '"') {
+      this.popState();
+      return '"';
+    }
+
+    // any char
+    while (this.offset < this.size) {
+      if (ch === "\\") {
+        this.input();
+      } else if (ch === '"') {
+        this.unput(1);
+        this.popState();
+        this.appendToken('"', 1);
+        break;
+      } else if (ch === "$") {
+        ch = this.input();
+        if (ch === "{") {
+          this.begin("ST_LOOKING_FOR_VARNAME");
+          if (this.yytext.length > 2) {
+            this.appendToken(this.tok.T_DOLLAR_OPEN_CURLY_BRACES, 2);
+            this.unput(2);
+            return this.tok.T_ENCAPSED_AND_WHITESPACE;
+          } else {
+            return this.tok.T_DOLLAR_OPEN_CURLY_BRACES;
+          }
+        } else if (this.is_LABEL_START()) {
+          // start of $var...
+          const yyoffset = this.offset;
+          const next = this.consume_VARIABLE();
+          if (this.yytext.length > this.offset - yyoffset + 2) {
+            this.appendToken(next, this.offset - yyoffset + 2);
+            this.unput(this.offset - yyoffset + 2);
+            return this.tok.T_ENCAPSED_AND_WHITESPACE;
+          } else {
+            return next;
+          }
+        }
+        if (ch) this.unput(1);
+      } else if (ch === "{") {
+        ch = this.input();
+        if (ch === "$") {
+          // start of {$...
+          this.begin("ST_IN_SCRIPTING");
+          if (this.yytext.length > 2) {
+            this.appendToken(this.tok.T_CURLY_OPEN, 1);
+            this.unput(2);
+            return this.tok.T_ENCAPSED_AND_WHITESPACE;
+          } else {
+            // @fixme : yytext = '"{$' (this.yytext.length > 3)
+            this.unput(1);
+            return this.tok.T_CURLY_OPEN;
+          }
+        }
+        if (ch) this.unput(1);
+      }
+      ch = this.input();
+    }
+    return this.tok.T_ENCAPSED_AND_WHITESPACE;
+  }
+};
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 69034fc0d..000000000 --- a/package-lock.json +++ /dev/null @@ -1,9623 +0,0 @@ -{ - "name": "php-parser", - "version": "3.0.0-alpha2", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.0.0-beta.46", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.46.tgz", - "integrity": "sha512-7BKRkmYaPZm3Yff5HGZJKCz7RqZ5jUjknsXT6Gz5YKG23J3uq9hAj0epncCB0rlqmnZ8Q+UUpQB2tCR5mT37vw==", - "dev": true, - "requires": { - "@babel/highlight": "7.0.0-beta.46" - } - }, - "@babel/highlight": { - "version": "7.0.0-beta.46", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.46.tgz", - "integrity": "sha512-r4snW6Q8ICL3Y8hGzYJRvyG/+sc+kvkewXNedG9tQjoHmUFMwMSv/o45GWQUQswevGnWghiGkpRPivFfOuMsOA==", - "dev": true, - "requires": { - "chalk": "2.4.1", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } - } - } - }, - "@webassemblyjs/ast": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.5.13.tgz", - "integrity": "sha512-49nwvW/Hx9i+OYHg+mRhKZfAlqThr11Dqz8TsrvqGKMhdI2ijy3KBJOun2Z4770TPjrIJhR6KxChQIDaz8clDA==", - "dev": true, - "requires": { - "@webassemblyjs/helper-module-context": "1.5.13", - "@webassemblyjs/helper-wasm-bytecode": "1.5.13", - "@webassemblyjs/wast-parser": "1.5.13", - "debug": "3.1.0", - "mamacro": "0.0.3" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.5.13.tgz", - "integrity": "sha512-vrvvB18Kh4uyghSKb0NTv+2WZx871WL2NzwMj61jcq2bXkyhRC+8Q0oD7JGVf0+5i/fKQYQSBCNMMsDMRVAMqA==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.5.13.tgz", - "integrity": "sha512-dBh2CWYqjaDlvMmRP/kudxpdh30uXjIbpkLj9HQe+qtYlwvYjPRjdQXrq1cTAAOUSMTtzqbXIxEdEZmyKfcwsg==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.5.13.tgz", - "integrity": "sha512-v7igWf1mHcpJNbn4m7e77XOAWXCDT76Xe7Is1VQFXc4K5jRcFrl9D0NrqM4XifQ0bXiuTSkTKMYqDxu5MhNljA==", - "dev": true, - "requires": { - "debug": "3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.5.13.tgz", - "integrity": "sha512-yN6ScQQDFCiAXnVctdVO/J5NQRbwyTbQzsGzEgXsAnrxhjp0xihh+nNHQTMrq5UhOqTb5LykpJAvEv9AT0jnAQ==", - "dev": true, - "requires": { - "@webassemblyjs/wast-printer": "1.5.13" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.5.13.tgz", - "integrity": "sha512-hSIKzbXjVMRvy3Jzhgu+vDd/aswJ+UMEnLRCkZDdknZO3Z9e6rp1DAs0tdLItjCFqkz9+0BeOPK/mk3eYvVzZg==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.5.13.tgz", - "integrity": "sha512-zxJXULGPLB7r+k+wIlvGlXpT4CYppRz8fLUM/xobGHc9Z3T6qlmJD9ySJ2jknuktuuiR9AjnNpKYDECyaiX+QQ==", - "dev": true, - "requires": { - "debug": "3.1.0", - "mamacro": "0.0.3" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.5.13.tgz", - "integrity": "sha512-0n3SoNGLvbJIZPhtMFq0XmmnA/YmQBXaZKQZcW8maGKwLpVcgjNrxpFZHEOLKjXJYVN5Il8vSfG7nRX50Zn+aw==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.5.13.tgz", - "integrity": "sha512-IJ/goicOZ5TT1axZFSnlAtz4m8KEjYr12BNOANAwGFPKXM4byEDaMNXYowHMG0yKV9a397eU/NlibFaLwr1fbw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.5.13", - "@webassemblyjs/helper-buffer": "1.5.13", - "@webassemblyjs/helper-wasm-bytecode": "1.5.13", - "@webassemblyjs/wasm-gen": "1.5.13", - "debug": "3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "@webassemblyjs/ieee754": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.5.13.tgz", - "integrity": "sha512-TseswvXEPpG5TCBKoLx9tT7+/GMACjC1ruo09j46ULRZWYm8XHpDWaosOjTnI7kr4SRJFzA6MWoUkAB+YCGKKg==", - "dev": true, - "requires": { - "ieee754": "1.1.11" - } - }, - "@webassemblyjs/leb128": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.5.13.tgz", - "integrity": "sha512-0NRMxrL+GG3eISGZBmLBLAVjphbN8Si15s7jzThaw1UE9e5BY1oH49/+MA1xBzxpf1OW5sf9OrPDOclk9wj2yg==", - "dev": true, - "requires": { - "long": "4.0.0" - }, - "dependencies": { - "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", - "dev": true - } - } - }, - "@webassemblyjs/utf8": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.5.13.tgz", - "integrity": "sha512-Ve1ilU2N48Ew0lVGB8FqY7V7hXjaC4+PeZM+vDYxEd+R2iQ0q+Wb3Rw8v0Ri0+rxhoz6gVGsnQNb4FjRiEH/Ng==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.5.13.tgz", - "integrity": "sha512-X7ZNW4+Hga4f2NmqENnHke2V/mGYK/xnybJSIXImt1ulxbCOEs/A+ZK/Km2jgihjyVxp/0z0hwIcxC6PrkWtgw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.5.13", - "@webassemblyjs/helper-buffer": "1.5.13", - "@webassemblyjs/helper-wasm-bytecode": "1.5.13", - "@webassemblyjs/helper-wasm-section": "1.5.13", - "@webassemblyjs/wasm-gen": "1.5.13", - "@webassemblyjs/wasm-opt": "1.5.13", - "@webassemblyjs/wasm-parser": "1.5.13", - "@webassemblyjs/wast-printer": "1.5.13", - "debug": "3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.5.13.tgz", - "integrity": "sha512-yfv94Se8R73zmr8GAYzezFHc3lDwE/lBXQddSiIZEKZFuqy7yWtm3KMwA1uGbv5G1WphimJxboXHR80IgX1hQA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.5.13", - "@webassemblyjs/helper-wasm-bytecode": "1.5.13", - "@webassemblyjs/ieee754": "1.5.13", - "@webassemblyjs/leb128": "1.5.13", - "@webassemblyjs/utf8": "1.5.13" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.5.13.tgz", - "integrity": "sha512-IkXSkgzVhQ0QYAdIayuCWMmXSYx0dHGU8Ah/AxJf1gBvstMWVnzJnBwLsXLyD87VSBIcsqkmZ28dVb0mOC3oBg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.5.13", - "@webassemblyjs/helper-buffer": "1.5.13", - "@webassemblyjs/wasm-gen": "1.5.13", - "@webassemblyjs/wasm-parser": "1.5.13", - "debug": "3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.5.13.tgz", - "integrity": "sha512-XnYoIcu2iqq8/LrtmdnN3T+bRjqYFjRHqWbqK3osD/0r/Fcv4d9ecRzjVtC29ENEuNTK4mQ9yyxCBCbK8S/cpg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.5.13", - "@webassemblyjs/helper-api-error": "1.5.13", - "@webassemblyjs/helper-wasm-bytecode": "1.5.13", - "@webassemblyjs/ieee754": "1.5.13", - "@webassemblyjs/leb128": "1.5.13", - "@webassemblyjs/utf8": "1.5.13" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.5.13.tgz", - "integrity": "sha512-Lbz65T0LQ1LgzKiUytl34CwuhMNhaCLgrh0JW4rJBN6INnBB8NMwUfQM+FxTnLY9qJ+lHJL/gCM5xYhB9oWi4A==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.5.13", - "@webassemblyjs/floating-point-hex-parser": "1.5.13", - "@webassemblyjs/helper-api-error": "1.5.13", - "@webassemblyjs/helper-code-frame": "1.5.13", - "@webassemblyjs/helper-fsm": "1.5.13", - "long": "3.2.0", - "mamacro": "0.0.3" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.5.13.tgz", - "integrity": "sha512-QcwogrdqcBh8Z+eUF8SG+ag5iwQSXxQJELBEHmLkk790wgQgnIMmntT2sMAMw53GiFNckArf5X0bsCA44j3lWQ==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.5.13", - "@webassemblyjs/wast-parser": "1.5.13", - "long": "3.2.0" - } - }, - "abab": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", - "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=", - "dev": true - }, - "acorn-dynamic-import": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", - "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", - "dev": true, - "requires": { - "acorn": "5.7.1" - }, - "dependencies": { - "acorn": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz", - "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==", - "dev": true - } - } - }, - "acorn-globals": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.1.0.tgz", - "integrity": "sha512-KjZwU26uG3u6eZcfGbTULzFcsoz6pegNKtHPksZPOUsiKo5bUmiBPa38FuHZ/Eun+XYh/JCCkS9AS3Lu4McQOQ==", - "dev": true, - "requires": { - "acorn": "5.5.3" - }, - "dependencies": { - "acorn": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", - "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==", - "dev": true - } - } - }, - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" - } - }, - "ajv-keywords": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", - "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", - "dev": true - }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" - } - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true - }, - "ansi-escapes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", - "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "append-transform": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", - "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", - "dev": true, - "requires": { - "default-require-extensions": "1.0.0" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "1.0.3" - } - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "1.1.0" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", - "dev": true - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true - }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1" - } - }, - "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", - "dev": true, - "requires": { - "util": "0.10.3" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true - }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", - "dev": true - }, - "async-limiter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "atob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", - "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", - "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==", - "dev": true - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - } - }, - "babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "babel-generator": "6.26.1", - "babel-helpers": "6.24.1", - "babel-messages": "6.23.0", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "convert-source-map": "1.5.1", - "debug": "2.6.9", - "json5": "0.5.1", - "lodash": "4.17.10", - "minimatch": "3.0.4", - "path-is-absolute": "1.0.1", - "private": "0.1.8", - "slash": "1.0.0", - "source-map": "0.5.7" - } - }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", - "dev": true, - "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.10", - "source-map": "0.5.7", - "trim-right": "1.0.1" - }, - "dependencies": { - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - } - } - }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-define-map": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", - "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", - "dev": true, - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.10" - } - }, - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "dev": true, - "requires": { - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-regex": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", - "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.10" - } - }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "dev": true, - "requires": { - "babel-helper-optimise-call-expression": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-jest": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-22.4.3.tgz", - "integrity": "sha512-BgSjmtl3mW3i+VeVHEr9d2zFSAT66G++pJcHQiUjd00pkW+voYXFctIm/indcqOWWXw5a1nUpR1XWszD9fJ1qg==", - "dev": true, - "requires": { - "babel-plugin-istanbul": "4.1.6", - "babel-preset-jest": "22.4.3" - } - }, - "babel-loader": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.5.tgz", - "integrity": "sha512-iCHfbieL5d1LfOQeeVJEUyD9rTwBcP/fcEbRCfempxTDuqrKpu0AZjLAQHEQa3Yqyj9ORKe2iHfoj4rHLf7xpw==", - "dev": true, - "requires": { - "find-cache-dir": "1.0.0", - "loader-utils": "1.1.0", - "mkdirp": "0.5.1" - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-istanbul": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", - "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==", - "dev": true, - "requires": { - "babel-plugin-syntax-object-rest-spread": "6.13.0", - "find-up": "2.1.0", - "istanbul-lib-instrument": "1.10.1", - "test-exclude": "4.2.1" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" - } - } - } - }, - "babel-plugin-jest-hoist": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.4.3.tgz", - "integrity": "sha512-zhvv4f6OTWy2bYevcJftwGCWXMFe7pqoz41IhMi4xna7xNsX5NygdagsrE0y6kkfuXq8UalwvPwKTyAxME2E/g==", - "dev": true - }, - "babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", - "dev": true - }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", - "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.10" - } - }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "dev": true, - "requires": { - "babel-helper-define-map": "6.26.0", - "babel-helper-function-name": "6.24.1", - "babel-helper-optimise-call-expression": "6.24.1", - "babel-helper-replace-supers": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "dev": true, - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", - "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", - "dev": true, - "requires": { - "babel-plugin-transform-strict-mode": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "dev": true, - "requires": { - "babel-helper-replace-supers": "6.24.1", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "dev": true, - "requires": { - "babel-helper-call-delegate": "6.24.1", - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", - "dev": true, - "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", - "dev": true, - "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "regexpu-core": "2.0.0" - } - }, - "babel-plugin-transform-regenerator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", - "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", - "dev": true, - "requires": { - "regenerator-transform": "0.10.1" - } - }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-preset-es2015": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", - "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", - "dev": true, - "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoping": "6.26.0", - "babel-plugin-transform-es2015-classes": "6.24.1", - "babel-plugin-transform-es2015-computed-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", - "babel-plugin-transform-es2015-for-of": "6.23.0", - "babel-plugin-transform-es2015-function-name": "6.24.1", - "babel-plugin-transform-es2015-literals": "6.22.0", - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", - "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", - "babel-plugin-transform-es2015-modules-umd": "6.24.1", - "babel-plugin-transform-es2015-object-super": "6.24.1", - "babel-plugin-transform-es2015-parameters": "6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", - "babel-plugin-transform-es2015-spread": "6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "6.24.1", - "babel-plugin-transform-es2015-template-literals": "6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "6.24.1", - "babel-plugin-transform-regenerator": "6.26.0" - } - }, - "babel-preset-jest": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-22.4.3.tgz", - "integrity": "sha512-a+M3LTEXTq3gxv0uBN9Qm6ahUl7a8pj923nFbCUdqFUSsf3YrX8Uc+C3MEwji5Af3LiQjSC7w4ooYewlz8HRTA==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "22.4.3", - "babel-plugin-syntax-object-rest-spread": "6.13.0" - } - }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "dev": true, - "requires": { - "babel-core": "6.26.3", - "babel-runtime": "6.26.0", - "core-js": "2.5.5", - "home-or-tmp": "2.0.0", - "lodash": "4.17.10", - "mkdirp": "0.5.1", - "source-map-support": "0.4.18" - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "2.5.5", - "regenerator-runtime": "0.11.1" - } - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.10" - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.9", - "globals": "9.18.0", - "invariant": "2.2.4", - "lodash": "4.17.10" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.10", - "to-fast-properties": "1.0.3" - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "1.0.1", - "class-utils": "0.3.6", - "component-emitter": "1.2.1", - "define-property": "1.0.0", - "isobject": "3.0.1", - "mixin-deep": "1.3.1", - "pascalcase": "0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "1.0.2" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", - "dev": true - }, - "binary-extensions": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", - "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", - "dev": true - }, - "bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", - "dev": true - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true - }, - "boom": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", - "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", - "dev": true, - "requires": { - "hoek": "4.2.1" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browser-process-hrtime": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz", - "integrity": "sha1-Ql1opY00R/AqBKqJQYf86K+Le44=", - "dev": true - }, - "browser-resolve": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", - "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", - "dev": true, - "requires": { - "resolve": "1.1.7" - } - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "1.0.3", - "cipher-base": "1.0.4", - "create-hash": "1.2.0", - "evp_bytestokey": "1.0.3", - "inherits": "2.0.3", - "safe-buffer": "5.1.2" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "1.2.0", - "browserify-des": "1.0.1", - "evp_bytestokey": "1.0.3" - } - }, - "browserify-des": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.1.tgz", - "integrity": "sha512-zy0Cobe3hhgpiOM32Tj7KQ3Vl91m0njwsjzZQK1L+JDf11dzP9qIvjreVinsvXrgfjhStXwUWAEpB9D7Gwmayw==", - "dev": true, - "requires": { - "cipher-base": "1.0.4", - "des.js": "1.0.0", - "inherits": "2.0.3" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "randombytes": "2.0.6" - } - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "elliptic": "6.4.0", - "inherits": "2.0.3", - "parse-asn1": "5.1.1" - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "1.0.6" - } - }, - "bser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", - "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", - "dev": true, - "requires": { - "node-int64": "0.4.0" - } - }, - "buffer-from": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", - "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "cacache": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", - "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", - "dev": true, - "requires": { - "bluebird": "3.5.1", - "chownr": "1.0.1", - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "lru-cache": "4.1.2", - "mississippi": "2.0.0", - "mkdirp": "0.5.1", - "move-concurrently": "1.0.1", - "promise-inflight": "1.0.1", - "rimraf": "2.6.2", - "ssri": "5.3.0", - "unique-filename": "1.1.0", - "y18n": "4.0.0" - }, - "dependencies": { - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "requires": { - "glob": "7.1.2" - } - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - } - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "1.0.0", - "component-emitter": "1.2.1", - "get-value": "2.0.6", - "has-value": "1.0.0", - "isobject": "3.0.1", - "set-value": "2.0.0", - "to-object-path": "0.3.0", - "union-value": "1.0.0", - "unset-value": "1.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "catharsis": { - "version": "0.8.9", - "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.9.tgz", - "integrity": "sha1-mMyJDKZS3S7w5ws3klMQ/56Q/Is=", - "dev": true, - "requires": { - "underscore-contrib": "0.3.0" - } - }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "optional": true, - "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" - } - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "chardet": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.5.0.tgz", - "integrity": "sha512-9ZTaoBaePSCFvNlNGrsyI8ZVACP2svUtq0DkM7t4K2ClAa96sqOIRjAzDTc8zXzFt1cZR46rRzLTiHFSJ+Qw0g==", - "dev": true - }, - "chownr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", - "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", - "dev": true - }, - "chrome-trace-event": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz", - "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==", - "dev": true, - "requires": { - "tslib": "1.9.3" - } - }, - "ci-info": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz", - "integrity": "sha512-SK/846h/Rcy8q9Z9CAwGBLfCJ6EkjJWdpelWDufQpqVDYq2Wnnv8zlSO6AMQap02jvhVruKKpEtQOufo3pFhLg==", - "dev": true - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.2" - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "3.1.0", - "define-property": "0.2.5", - "isobject": "3.0.1", - "static-extend": "0.1.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "2.0.0" - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "optional": true, - "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", - "wordwrap": "0.0.2" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "1.0.0", - "object-visit": "1.0.1" - } - }, - "color-convert": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "commander": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", - "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "compare-versions": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.1.0.tgz", - "integrity": "sha512-4hAxDSBypT/yp2ySFD346So6Ragw5xmBn/e/agIGl3bZr6DLUqnoRZPusxKrXdYRZpgexO9daejmIenlq/wrIQ==", - "dev": true - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "1.0.0", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "typedarray": "0.0.6" - } - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "0.1.4" - } - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "convert-source-map": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", - "dev": true - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "1.2.0", - "fs-write-stream-atomic": "1.0.10", - "iferr": "0.1.5", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "run-queue": "1.0.3" - }, - "dependencies": { - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "requires": { - "glob": "7.0.6" - } - } - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "core-js": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz", - "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "coveralls": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.0.tgz", - "integrity": "sha512-ZppXR9y5PraUOrf/DzHJY6gzNUhXYE3b9D43xEXs4QYZ7/Oe0Gy0CS+IPKWFfvQFXB3RG9QduaQUFehzSpGAFw==", - "dev": true, - "requires": { - "js-yaml": "3.11.0", - "lcov-parse": "0.0.10", - "log-driver": "1.2.7", - "minimist": "1.2.0", - "request": "2.85.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "create-ecdh": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.1.tgz", - "integrity": "sha512-iZvCCg8XqHQZ1ioNBTzXS/cQSkqkqcPs8xSX4upNB+DAk9Ht3uzQf2J32uAHNCne8LDmKr29AgZrEs4oIrwLuQ==", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "elliptic": "6.4.0" - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "1.0.4", - "inherits": "2.0.3", - "md5.js": "1.3.4", - "ripemd160": "2.0.2", - "sha.js": "2.4.11" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "1.0.4", - "create-hash": "1.2.0", - "inherits": "2.0.3", - "ripemd160": "2.0.2", - "safe-buffer": "5.1.2", - "sha.js": "2.4.11" - } - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "4.1.2", - "shebang-command": "1.2.0", - "which": "1.2.14" - } - }, - "cryptiles": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", - "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", - "dev": true, - "requires": { - "boom": "5.2.0" - }, - "dependencies": { - "boom": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", - "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", - "dev": true, - "requires": { - "hoek": "4.2.1" - } - } - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "1.0.1", - "browserify-sign": "4.0.4", - "create-ecdh": "4.0.1", - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "diffie-hellman": "5.0.3", - "inherits": "2.0.3", - "pbkdf2": "3.0.16", - "public-encrypt": "4.0.2", - "randombytes": "2.0.6", - "randomfill": "1.0.4" - } - }, - "cssom": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz", - "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=", - "dev": true - }, - "cssstyle": { - "version": "0.2.37", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", - "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", - "dev": true, - "requires": { - "cssom": "0.3.2" - } - }, - "cyclist": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", - "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "1.0.0" - } - }, - "data-urls": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.0.0.tgz", - "integrity": "sha512-ai40PPQR0Fn1lD2PPie79CibnlMN2AYiDhwFX/rZHVsxbs5kNJSjegqXIprhouGXlRdEnfybva7kqRGnB6mypA==", - "dev": true, - "requires": { - "abab": "1.0.4", - "whatwg-mimetype": "2.1.0", - "whatwg-url": "6.4.1" - } - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "default-require-extensions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", - "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", - "dev": true, - "requires": { - "strip-bom": "2.0.0" - } - }, - "define-properties": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", - "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", - "dev": true, - "requires": { - "foreach": "2.0.5", - "object-keys": "1.0.11" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "1.0.2", - "isobject": "3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1" - } - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "requires": { - "repeating": "2.0.1" - } - }, - "detect-newline": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", - "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "miller-rabin": "4.0.1", - "randombytes": "2.0.6" - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", - "dev": true, - "requires": { - "webidl-conversions": "4.0.2" - } - }, - "duplexify": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.4.tgz", - "integrity": "sha512-JzYSLYMhoVVBe8+mbHQ4KgpvHpm0DZpJuL8PY93Vyv1fW7jYJ90LoXa1di/CVbJM+TgMs91rbDapE/RNIfnJsA==", - "dev": true, - "requires": { - "end-of-stream": "1.4.1", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "stream-shift": "1.0.0" - } - }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "elliptic": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", - "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0", - "hash.js": "1.1.3", - "hmac-drbg": "1.0.1", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1", - "minimalistic-crypto-utils": "1.0.1" - } - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "1.4.0" - } - }, - "enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "memory-fs": "0.4.1", - "tapable": "1.0.0" - } - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "requires": { - "prr": "1.0.1" - } - }, - "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "dev": true, - "requires": { - "is-arrayish": "0.2.1" - } - }, - "es-abstract": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.11.0.tgz", - "integrity": "sha512-ZnQrE/lXTTQ39ulXZ+J1DTFazV9qBy61x2bY071B+qGco8Z8q1QddsLdt/EF8Ai9hcWH72dWS0kFqXLxOxqslA==", - "dev": true, - "requires": { - "es-to-primitive": "1.1.1", - "function-bind": "1.1.1", - "has": "1.0.1", - "is-callable": "1.1.3", - "is-regex": "1.0.4" - } - }, - "es-to-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", - "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", - "dev": true, - "requires": { - "is-callable": "1.1.3", - "is-date-object": "1.0.1", - "is-symbol": "1.0.1" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "escodegen": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz", - "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==", - "dev": true, - "requires": { - "esprima": "3.1.3", - "estraverse": "4.2.0", - "esutils": "2.0.2", - "optionator": "0.8.2", - "source-map": "0.6.1" - }, - "dependencies": { - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - } - } - }, - "eslint-plugin-prettier": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-2.6.2.tgz", - "integrity": "sha512-tGek5clmW5swrAx1mdPYM8oThrBE83ePh7LeseZHBWfHVGrHPhKn7Y5zgRMbU/9D5Td9K4CEmUPjGxA7iw98Og==", - "dev": true, - "requires": { - "fast-diff": "1.1.2", - "jest-docblock": "21.2.0" - }, - "dependencies": { - "jest-docblock": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-21.2.0.tgz", - "integrity": "sha512-5IZ7sY9dBAYSV+YjQ0Ovb540Ku7AO9Z5o2Cg789xj167iQuZ2cG+z0f3Uct6WeYLbU6aQiM2pCs7sZ+4dotydw==", - "dev": true - } - } - }, - "eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", - "dev": true, - "requires": { - "esrecurse": "4.2.1", - "estraverse": "4.2.0" - } - }, - "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", - "dev": true - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "4.2.0" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "1.3.4", - "safe-buffer": "5.1.2" - } - }, - "exec-sh": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.1.tgz", - "integrity": "sha512-aLt95pexaugVtQerpmE51+4QfWrNc304uez7jvj6fWnN8GeEHpttB8F36n8N7uVhUMbH/1enbxQ9HImZ4w/9qg==", - "dev": true, - "requires": { - "merge": "1.2.0" - } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "0.1.1" - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "requires": { - "fill-range": "2.2.3" - } - }, - "expect": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/expect/-/expect-22.4.3.tgz", - "integrity": "sha1-1aKdCg4fshU1V8rvJnTUVH6RRnQ=", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "jest-diff": "22.4.3", - "jest-get-type": "22.4.3", - "jest-matcher-utils": "22.4.3", - "jest-message-util": "22.4.3", - "jest-regex-util": "22.4.3" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - } - } - }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", - "dev": true - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - }, - "external-editor": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.0.tgz", - "integrity": "sha512-mpkfj0FEdxrIhOC04zk85X7StNtr0yXnG7zCb+8ikO8OJi2jsHh5YGoknNTyXgsbHOf1WOOcVU3kPFWT2WgCkQ==", - "dev": true, - "requires": { - "chardet": "0.5.0", - "iconv-lite": "0.4.23", - "tmp": "0.0.33" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", - "dev": true, - "requires": { - "safer-buffer": "2.1.2" - } - } - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "fast-diff": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz", - "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fb-watchman": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", - "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", - "dev": true, - "requires": { - "bser": "2.0.0" - } - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, - "fileset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", - "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", - "dev": true, - "requires": { - "glob": "7.0.6", - "minimatch": "3.0.4" - } - }, - "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", - "dev": true, - "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" - } - }, - "find-cache-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", - "dev": true, - "requires": { - "commondir": "1.0.1", - "make-dir": "1.3.0", - "pkg-dir": "2.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - }, - "flush-write-stream": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", - "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", - "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.6" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "1.0.2" - } - }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", - "dev": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.6", - "mime-types": "2.1.18" - } - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "0.2.2" - } - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.6" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "iferr": "0.1.5", - "imurmurhash": "0.1.4", - "readable-stream": "2.3.6" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.3.tgz", - "integrity": "sha512-X+57O5YkDTiEQGiw8i7wYc2nQgweIekqkepI8Q3y4wVlurgBt2SuwxTeYUYMZIGpLZH3r/TsMjczCMXE5ZOt7Q==", - "dev": true, - "optional": true, - "requires": { - "nan": "2.10.0", - "node-pre-gyp": "0.9.1" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "debug": { - "version": "2.6.9", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.4.2", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "2.2.4" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "1.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.21", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": "2.1.2" - } - }, - "ignore-walk": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimatch": "3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "1.1.11" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, - "minipass": { - "version": "2.2.4", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "5.1.1", - "yallist": "3.0.2" - } - }, - "minizlib": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "2.2.4" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "needle": { - "version": "2.2.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "2.6.9", - "iconv-lite": "0.4.21", - "sax": "1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.9.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "1.0.3", - "mkdirp": "0.5.1", - "needle": "2.2.0", - "nopt": "4.0.1", - "npm-packlist": "1.1.10", - "npmlog": "4.1.2", - "rc": "1.2.6", - "rimraf": "2.6.2", - "semver": "5.5.0", - "tar": "4.4.1" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1.1.1", - "osenv": "0.1.5" - } - }, - "npm-bundled": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.1.10", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "3.0.1", - "npm-bundled": "1.0.3" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - }, - "rimraf": { - "version": "2.6.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "glob": "7.1.2" - } - }, - "safe-buffer": { - "version": "5.1.1", - "bundled": true, - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "5.5.0", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "chownr": "1.0.1", - "fs-minipass": "1.2.5", - "minipass": "2.2.4", - "minizlib": "1.1.0", - "mkdirp": "0.5.1", - "safe-buffer": "5.1.1", - "yallist": "3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "yallist": { - "version": "3.0.2", - "bundled": true, - "dev": true - } - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "get-caller-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "1.0.0" - } - }, - "glob": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", - "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "2.0.1" - } - }, - "global-modules-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.1.0.tgz", - "integrity": "sha512-3DrmGj2TP+96cABk9TfMp6f3knH/Y46dqvWznTU3Tf6/bDGLDAn15tFluQ7BcloykOcdY16U0WGq0BQblYOxJQ==", - "dev": true - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", - "dev": true - }, - "handlebars": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", - "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", - "dev": true, - "requires": { - "async": "1.5.2", - "optimist": "0.6.1", - "source-map": "0.4.4", - "uglify-js": "2.8.29" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": "1.0.1" - } - } - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", - "dev": true, - "requires": { - "ajv": "5.5.2", - "har-schema": "2.0.0" - } - }, - "has": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", - "dev": true, - "requires": { - "function-bind": "1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "2.0.6", - "has-values": "1.0.0", - "isobject": "3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.2" - } - }, - "hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", - "dev": true, - "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1" - } - }, - "hawk": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", - "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", - "dev": true, - "requires": { - "boom": "4.3.1", - "cryptiles": "3.1.2", - "hoek": "4.2.1", - "sntp": "2.1.0" - } - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "1.1.3", - "minimalistic-assert": "1.0.1", - "minimalistic-crypto-utils": "1.0.1" - } - }, - "hoek": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", - "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==", - "dev": true - }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "hosted-git-info": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", - "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", - "dev": true - }, - "html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", - "dev": true, - "requires": { - "whatwg-encoding": "1.0.3" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.14.1" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "ieee754": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.11.tgz", - "integrity": "sha512-VhDzCKN7K8ufStx/CLj5/PDTMgph+qwN5Pkd5i0sGnVwk56zJ0lkT8Qzi1xqWLS0Wp29DgDtNeS7v8/wMoZeHg==", - "dev": true - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, - "import-local": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", - "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", - "dev": true, - "requires": { - "pkg-dir": "2.0.0", - "resolve-cwd": "2.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "inquirer": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.0.0.tgz", - "integrity": "sha512-tISQWRwtcAgrz+SHPhTH7d3e73k31gsOy6i1csonLc0u1dVK/wYvuOnFeiWqC5OXFIYbmrIFInef31wbT8MEJg==", - "dev": true, - "requires": { - "ansi-escapes": "3.1.0", - "chalk": "2.4.1", - "cli-cursor": "2.1.0", - "cli-width": "2.2.0", - "external-editor": "3.0.0", - "figures": "2.0.0", - "lodash": "4.17.10", - "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rxjs": "6.2.1", - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "through": "2.3.8" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } - } - } - }, - "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", - "dev": true - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "requires": { - "loose-envify": "1.3.1" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "1.11.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "1.1.1" - } - }, - "is-callable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", - "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", - "dev": true - }, - "is-ci": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz", - "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==", - "dev": true, - "requires": { - "ci-info": "1.1.3" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", - "dev": true - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "2.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-generator-fn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-1.0.0.tgz", - "integrity": "sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "is-odd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", - "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", - "dev": true, - "requires": { - "is-number": "4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } - } - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "dev": true, - "requires": { - "has": "1.0.1" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-symbol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", - "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "istanbul-api": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.1.tgz", - "integrity": "sha512-duj6AlLcsWNwUpfyfHt0nWIeRiZpuShnP40YTxOGQgtaN8fd6JYSxsvxUphTDy8V5MfDXo4s/xVCIIvVCO808g==", - "dev": true, - "requires": { - "async": "2.6.0", - "compare-versions": "3.1.0", - "fileset": "2.0.3", - "istanbul-lib-coverage": "1.2.0", - "istanbul-lib-hook": "1.2.0", - "istanbul-lib-instrument": "1.10.1", - "istanbul-lib-report": "1.1.4", - "istanbul-lib-source-maps": "1.2.4", - "istanbul-reports": "1.3.0", - "js-yaml": "3.11.0", - "mkdirp": "0.5.1", - "once": "1.4.0" - }, - "dependencies": { - "async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", - "dev": true, - "requires": { - "lodash": "4.17.10" - } - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "istanbul-lib-source-maps": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.4.tgz", - "integrity": "sha512-UzuK0g1wyQijiaYQxj/CdNycFhAd2TLtO2obKQMTZrZ1jzEMRY3rvpASEKkaxbRR6brvdovfA03znPa/pXcejg==", - "dev": true, - "requires": { - "debug": "3.1.0", - "istanbul-lib-coverage": "1.2.0", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "source-map": "0.5.7" - } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "requires": { - "glob": "7.0.6" - } - } - } - }, - "istanbul-lib-coverage": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz", - "integrity": "sha512-GvgM/uXRwm+gLlvkWHTjDAvwynZkL9ns15calTrmhGgowlwJBbWMYzWbKqE2DT6JDP1AFXKa+Zi0EkqNCUqY0A==", - "dev": true - }, - "istanbul-lib-hook": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.0.tgz", - "integrity": "sha512-p3En6/oGkFQV55Up8ZPC2oLxvgSxD8CzA0yBrhRZSh3pfv3OFj9aSGVC0yoerAi/O4u7jUVnOGVX1eVFM+0tmQ==", - "dev": true, - "requires": { - "append-transform": "0.4.0" - } - }, - "istanbul-lib-instrument": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz", - "integrity": "sha512-1dYuzkOCbuR5GRJqySuZdsmsNKPL3PTuyPevQfoCXJePT9C8y1ga75neU+Tuy9+yS3G/dgx8wgOmp2KLpgdoeQ==", - "dev": true, - "requires": { - "babel-generator": "6.26.1", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "istanbul-lib-coverage": "1.2.0", - "semver": "5.5.0" - } - }, - "istanbul-lib-report": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.4.tgz", - "integrity": "sha512-Azqvq5tT0U09nrncK3q82e/Zjkxa4tkFZv7E6VcqP0QCPn6oNljDPfrZEC/umNXds2t7b8sRJfs6Kmpzt8m2kA==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "1.2.0", - "mkdirp": "0.5.1", - "path-parse": "1.0.5", - "supports-color": "3.2.3" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.3.tgz", - "integrity": "sha512-fDa0hwU/5sDXwAklXgAoCJCOsFsBplVQ6WBldz5UwaqOzmDhUK4nfuR7/G//G2lERlblUNJB8P6e8cXq3a7MlA==", - "dev": true, - "requires": { - "debug": "3.1.0", - "istanbul-lib-coverage": "1.2.0", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "source-map": "0.5.7" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "requires": { - "glob": "7.0.6" - } - } - } - }, - "istanbul-reports": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.3.0.tgz", - "integrity": "sha512-y2Z2IMqE1gefWUaVjrBm0mSKvUkaBy9Vqz8iwr/r40Y9hBbIteH5wqHG/9DLTfJ9xUnUT2j7A3+VVJ6EaYBllA==", - "dev": true, - "requires": { - "handlebars": "4.0.11" - } - }, - "jest": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest/-/jest-22.4.3.tgz", - "integrity": "sha512-FFCdU/pXOEASfHxFDOWUysI/+FFoqiXJADEIXgDKuZyqSmBD3tZ4BEGH7+M79v7czj7bbkhwtd2LaEDcJiM/GQ==", - "dev": true, - "requires": { - "import-local": "1.0.0", - "jest-cli": "22.4.3" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "wrap-ansi": "2.1.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "jest-cli": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-22.4.3.tgz", - "integrity": "sha512-IiHybF0DJNqZPsbjn4Cy4vcqcmImpoFwNFnkehzVw8lTUSl4axZh5DHewu5bdpZF2Y5gUqFKYzH0FH4Qx2k+UA==", - "dev": true, - "requires": { - "ansi-escapes": "3.1.0", - "chalk": "2.4.1", - "exit": "0.1.2", - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "import-local": "1.0.0", - "is-ci": "1.1.0", - "istanbul-api": "1.3.1", - "istanbul-lib-coverage": "1.2.0", - "istanbul-lib-instrument": "1.10.1", - "istanbul-lib-source-maps": "1.2.3", - "jest-changed-files": "22.4.3", - "jest-config": "22.4.3", - "jest-environment-jsdom": "22.4.3", - "jest-get-type": "22.4.3", - "jest-haste-map": "22.4.3", - "jest-message-util": "22.4.3", - "jest-regex-util": "22.4.3", - "jest-resolve-dependencies": "22.4.3", - "jest-runner": "22.4.3", - "jest-runtime": "22.4.3", - "jest-snapshot": "22.4.3", - "jest-util": "22.4.3", - "jest-validate": "22.4.3", - "jest-worker": "22.4.3", - "micromatch": "2.3.11", - "node-notifier": "5.2.1", - "realpath-native": "1.0.0", - "rimraf": "2.6.2", - "slash": "1.0.0", - "string-length": "2.0.0", - "strip-ansi": "4.0.0", - "which": "1.2.14", - "yargs": "10.1.2" - } - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" - } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "requires": { - "glob": "7.1.2" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "yargs": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", - "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", - "dev": true, - "requires": { - "cliui": "4.1.0", - "decamelize": "1.2.0", - "find-up": "2.1.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "8.1.0" - } - }, - "yargs-parser": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", - "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", - "dev": true, - "requires": { - "camelcase": "4.1.0" - } - } - } - }, - "jest-changed-files": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-22.4.3.tgz", - "integrity": "sha512-83Dh0w1aSkUNFhy5d2dvqWxi/y6weDwVVLU6vmK0cV9VpRxPzhTeGimbsbRDSnEoszhF937M4sDLLeS7Cu/Tmw==", - "dev": true, - "requires": { - "throat": "4.1.0" - } - }, - "jest-config": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-22.4.3.tgz", - "integrity": "sha512-KSg3EOToCgkX+lIvenKY7J8s426h6ahXxaUFJxvGoEk0562Z6inWj1TnKoGycTASwiLD+6kSYFALcjdosq9KIQ==", - "dev": true, - "requires": { - "chalk": "2.4.1", - "glob": "7.1.2", - "jest-environment-jsdom": "22.4.3", - "jest-environment-node": "22.4.3", - "jest-get-type": "22.4.3", - "jest-jasmine2": "22.4.3", - "jest-regex-util": "22.4.3", - "jest-resolve": "22.4.3", - "jest-util": "22.4.3", - "jest-validate": "22.4.3", - "pretty-format": "22.4.3" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } - } - } - }, - "jest-diff": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-22.4.3.tgz", - "integrity": "sha512-/QqGvCDP5oZOF6PebDuLwrB2BMD8ffJv6TAGAdEVuDx1+uEgrHpSFrfrOiMRx2eJ1hgNjlQrOQEHetVwij90KA==", - "dev": true, - "requires": { - "chalk": "2.4.1", - "diff": "3.5.0", - "jest-get-type": "22.4.3", - "pretty-format": "22.4.3" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } - } - } - }, - "jest-docblock": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-22.4.3.tgz", - "integrity": "sha512-uPKBEAw7YrEMcXueMKZXn/rbMxBiSv48fSqy3uEnmgOlQhSX+lthBqHb1fKWNVmFqAp9E/RsSdBfiV31LbzaOg==", - "dev": true, - "requires": { - "detect-newline": "2.1.0" - } - }, - "jest-environment-jsdom": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-22.4.3.tgz", - "integrity": "sha512-FviwfR+VyT3Datf13+ULjIMO5CSeajlayhhYQwpzgunswoaLIPutdbrnfUHEMyJCwvqQFaVtTmn9+Y8WCt6n1w==", - "dev": true, - "requires": { - "jest-mock": "22.4.3", - "jest-util": "22.4.3", - "jsdom": "11.9.0" - } - }, - "jest-environment-node": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-22.4.3.tgz", - "integrity": "sha512-reZl8XF6t/lMEuPWwo9OLfttyC26A5AMgDyEQ6DBgZuyfyeNUzYT8BFo6uxCCP/Av/b7eb9fTi3sIHFPBzmlRA==", - "dev": true, - "requires": { - "jest-mock": "22.4.3", - "jest-util": "22.4.3" - } - }, - "jest-get-type": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", - "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", - "dev": true - }, - "jest-haste-map": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-22.4.3.tgz", - "integrity": "sha512-4Q9fjzuPVwnaqGKDpIsCSoTSnG3cteyk2oNVjBX12HHOaF1oxql+uUiqZb5Ndu7g/vTZfdNwwy4WwYogLh29DQ==", - "dev": true, - "requires": { - "fb-watchman": "2.0.0", - "graceful-fs": "4.1.11", - "jest-docblock": "22.4.3", - "jest-serializer": "22.4.3", - "jest-worker": "22.4.3", - "micromatch": "2.3.11", - "sane": "2.5.0" - } - }, - "jest-jasmine2": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-22.4.3.tgz", - "integrity": "sha512-yZCPCJUcEY6R5KJB/VReo1AYI2b+5Ky+C+JA1v34jndJsRcLpU4IZX4rFJn7yDTtdNbO/nNqg+3SDIPNH2ecnw==", - "dev": true, - "requires": { - "chalk": "2.4.1", - "co": "4.6.0", - "expect": "22.4.3", - "graceful-fs": "4.1.11", - "is-generator-fn": "1.0.0", - "jest-diff": "22.4.3", - "jest-matcher-utils": "22.4.3", - "jest-message-util": "22.4.3", - "jest-snapshot": "22.4.3", - "jest-util": "22.4.3", - "source-map-support": "0.5.5" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.5.tgz", - "integrity": "sha512-mR7/Nd5l1z6g99010shcXJiNEaf3fEtmLhRB/sBcQVJGodcHCULPp2y4Sfa43Kv2zq7T+Izmfp/WHCR6dYkQCA==", - "dev": true, - "requires": { - "buffer-from": "1.0.0", - "source-map": "0.6.1" - } - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } - } - } - }, - "jest-leak-detector": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-22.4.3.tgz", - "integrity": "sha512-NZpR/Ls7+ndO57LuXROdgCGz2RmUdC541tTImL9bdUtU3WadgFGm0yV+Ok4Fuia/1rLAn5KaJ+i76L6e3zGJYQ==", - "dev": true, - "requires": { - "pretty-format": "22.4.3" - } - }, - "jest-matcher-utils": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz", - "integrity": "sha512-lsEHVaTnKzdAPR5t4B6OcxXo9Vy4K+kRRbG5gtddY8lBEC+Mlpvm1CJcsMESRjzUhzkz568exMV1hTB76nAKbA==", - "dev": true, - "requires": { - "chalk": "2.4.1", - "jest-get-type": "22.4.3", - "pretty-format": "22.4.3" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } - } - } - }, - "jest-message-util": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-22.4.3.tgz", - "integrity": "sha512-iAMeKxhB3Se5xkSjU0NndLLCHtP4n+GtCqV0bISKA5dmOXQfEbdEmYiu2qpnWBDCQdEafNDDU6Q+l6oBMd/+BA==", - "dev": true, - "requires": { - "@babel/code-frame": "7.0.0-beta.46", - "chalk": "2.4.1", - "micromatch": "2.3.11", - "slash": "1.0.0", - "stack-utils": "1.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } - } - } - }, - "jest-mock": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-22.4.3.tgz", - "integrity": "sha512-+4R6mH5M1G4NK16CKg9N1DtCaFmuxhcIqF4lQK/Q1CIotqMs/XBemfpDPeVZBFow6iyUNu6EBT9ugdNOTT5o5Q==", - "dev": true - }, - "jest-regex-util": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-22.4.3.tgz", - "integrity": "sha512-LFg1gWr3QinIjb8j833bq7jtQopiwdAs67OGfkPrvy7uNUbVMfTXXcOKXJaeY5GgjobELkKvKENqq1xrUectWg==", - "dev": true - }, - "jest-resolve": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-22.4.3.tgz", - "integrity": "sha512-u3BkD/MQBmwrOJDzDIaxpyqTxYH+XqAXzVJP51gt29H8jpj3QgKof5GGO2uPGKGeA1yTMlpbMs1gIQ6U4vcRhw==", - "dev": true, - "requires": { - "browser-resolve": "1.11.2", - "chalk": "2.4.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } - } - } - }, - "jest-resolve-dependencies": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-22.4.3.tgz", - "integrity": "sha512-06czCMVToSN8F2U4EvgSB1Bv/56gc7MpCftZ9z9fBgUQM7dzHGCMBsyfVA6dZTx8v0FDcnALf7hupeQxaBCvpA==", - "dev": true, - "requires": { - "jest-regex-util": "22.4.3" - } - }, - "jest-runner": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-22.4.3.tgz", - "integrity": "sha512-U7PLlQPRlWNbvOHWOrrVay9sqhBJmiKeAdKIkvX4n1G2tsvzLlf77nBD28GL1N6tGv4RmuTfI8R8JrkvCa+IBg==", - "dev": true, - "requires": { - "exit": "0.1.2", - "jest-config": "22.4.3", - "jest-docblock": "22.4.3", - "jest-haste-map": "22.4.3", - "jest-jasmine2": "22.4.3", - "jest-leak-detector": "22.4.3", - "jest-message-util": "22.4.3", - "jest-runtime": "22.4.3", - "jest-util": "22.4.3", - "jest-worker": "22.4.3", - "throat": "4.1.0" - } - }, - "jest-runtime": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-22.4.3.tgz", - "integrity": "sha512-Eat/esQjevhx9BgJEC8udye+FfoJ2qvxAZfOAWshYGS22HydHn5BgsvPdTtt9cp0fSl5LxYOFA1Pja9Iz2Zt8g==", - "dev": true, - "requires": { - "babel-core": "6.26.3", - "babel-jest": "22.4.3", - "babel-plugin-istanbul": "4.1.6", - "chalk": "2.4.1", - "convert-source-map": "1.5.1", - "exit": "0.1.2", - "graceful-fs": "4.1.11", - "jest-config": "22.4.3", - "jest-haste-map": "22.4.3", - "jest-regex-util": "22.4.3", - "jest-resolve": "22.4.3", - "jest-util": "22.4.3", - "jest-validate": "22.4.3", - "json-stable-stringify": "1.0.1", - "micromatch": "2.3.11", - "realpath-native": "1.0.0", - "slash": "1.0.0", - "strip-bom": "3.0.0", - "write-file-atomic": "2.3.0", - "yargs": "10.1.2" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "wrap-ansi": "2.1.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "yargs": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", - "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", - "dev": true, - "requires": { - "cliui": "4.1.0", - "decamelize": "1.2.0", - "find-up": "2.1.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "8.1.0" - } - }, - "yargs-parser": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", - "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", - "dev": true, - "requires": { - "camelcase": "4.1.0" - } - } - } - }, - "jest-serializer": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-22.4.3.tgz", - "integrity": "sha512-uPaUAppx4VUfJ0QDerpNdF43F68eqKWCzzhUlKNDsUPhjOon7ZehR4C809GCqh765FoMRtTVUVnGvIoskkYHiw==", - "dev": true - }, - "jest-snapshot": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-22.4.3.tgz", - "integrity": "sha512-JXA0gVs5YL0HtLDCGa9YxcmmV2LZbwJ+0MfyXBBc5qpgkEYITQFJP7XNhcHFbUvRiniRpRbGVfJrOoYhhGE0RQ==", - "dev": true, - "requires": { - "chalk": "2.4.1", - "jest-diff": "22.4.3", - "jest-matcher-utils": "22.4.3", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "pretty-format": "22.4.3" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } - } - } - }, - "jest-util": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-22.4.3.tgz", - "integrity": "sha512-rfDfG8wyC5pDPNdcnAlZgwKnzHvZDu8Td2NJI/jAGKEGxJPYiE4F0ss/gSAkG4778Y23Hvbz+0GMrDJTeo7RjQ==", - "dev": true, - "requires": { - "callsites": "2.0.0", - "chalk": "2.4.1", - "graceful-fs": "4.1.11", - "is-ci": "1.1.0", - "jest-message-util": "22.4.3", - "mkdirp": "0.5.1", - "source-map": "0.6.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } - } - } - }, - "jest-validate": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-22.4.3.tgz", - "integrity": "sha512-CfFM18W3GSP/xgmA4UouIx0ljdtfD2mjeBC6c89Gg17E44D4tQhAcTrZmf9djvipwU30kSTnk6CzcxdCCeSXfA==", - "dev": true, - "requires": { - "chalk": "2.4.1", - "jest-config": "22.4.3", - "jest-get-type": "22.4.3", - "leven": "2.1.0", - "pretty-format": "22.4.3" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } - } - } - }, - "jest-worker": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-22.4.3.tgz", - "integrity": "sha512-B1ucW4fI8qVAuZmicFxI1R3kr2fNeYJyvIQ1rKcuLYnenFV5K5aMbxFj6J0i00Ju83S8jP2d7Dz14+AvbIHRYQ==", - "dev": true, - "requires": { - "merge-stream": "1.0.1" - } - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "js-yaml": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", - "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", - "dev": true, - "requires": { - "argparse": "1.0.10", - "esprima": "4.0.0" - } - }, - "js2xmlparser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-3.0.0.tgz", - "integrity": "sha1-P7YOqgicVED5MZ9RdgzNB+JJlzM=", - "dev": true, - "requires": { - "xmlcreate": "1.0.2" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true - }, - "jsdoc": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.5.5.tgz", - "integrity": "sha512-6PxB65TAU4WO0Wzyr/4/YhlGovXl0EVYfpKbpSroSj0qBxT4/xod/l40Opkm38dRHRdQgdeY836M0uVnJQG7kg==", - "dev": true, - "requires": { - "babylon": "7.0.0-beta.19", - "bluebird": "3.5.1", - "catharsis": "0.8.9", - "escape-string-regexp": "1.0.5", - "js2xmlparser": "3.0.0", - "klaw": "2.0.0", - "marked": "0.3.19", - "mkdirp": "0.5.1", - "requizzle": "0.2.1", - "strip-json-comments": "2.0.1", - "taffydb": "2.6.2", - "underscore": "1.8.3" - }, - "dependencies": { - "babylon": { - "version": "7.0.0-beta.19", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.19.tgz", - "integrity": "sha512-Vg0C9s/REX6/WIXN37UKpv5ZhRi6A4pjHlpkE34+8/a6c2W1Q692n3hmc+SZG5lKRnaExLUbxtJ1SVT+KaCQ/A==", - "dev": true - }, - "klaw": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-2.0.0.tgz", - "integrity": "sha1-WcEo4Nxc5BAgEVEZTuucv4WGUPY=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11" - } - }, - "taffydb": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz", - "integrity": "sha1-fLy2S1oUG2ou/CxdLGe04VCyomg=", - "dev": true - } - } - }, - "jsdoc-template": { - "version": "github:braintree/jsdoc-template#9ac837f2a774610c3de55431454777ae2419ba11", - "dev": true - }, - "jsdom": { - "version": "11.9.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.9.0.tgz", - "integrity": "sha512-sb3omwJTJ+HwAltLZevM/KQBusY+l2Ar5UfnTCWk9oUVBiDnQPBNiG1BaTAKttCnneonYbNo7vi4EFDY2lBfNA==", - "dev": true, - "requires": { - "abab": "1.0.4", - "acorn": "5.5.3", - "acorn-globals": "4.1.0", - "array-equal": "1.0.0", - "cssom": "0.3.2", - "cssstyle": "0.2.37", - "data-urls": "1.0.0", - "domexception": "1.0.1", - "escodegen": "1.9.1", - "html-encoding-sniffer": "1.0.2", - "left-pad": "1.3.0", - "nwmatcher": "1.4.4", - "parse5": "4.0.0", - "pn": "1.1.0", - "request": "2.85.0", - "request-promise-native": "1.0.5", - "sax": "1.2.4", - "symbol-tree": "3.2.2", - "tough-cookie": "2.3.4", - "w3c-hr-time": "1.0.1", - "webidl-conversions": "4.0.2", - "whatwg-encoding": "1.0.3", - "whatwg-mimetype": "2.1.0", - "whatwg-url": "6.4.1", - "ws": "4.1.0", - "xml-name-validator": "3.0.0" - }, - "dependencies": { - "acorn": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", - "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==", - "dev": true - } - } - }, - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true, - "optional": true - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "1.0.0" - } - }, - "lcov-parse": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", - "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", - "dev": true - }, - "left-pad": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", - "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", - "dev": true - }, - "leven": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", - "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "1.1.2", - "type-check": "0.3.2" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" - } - }, - "loader-runner": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", - "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", - "dev": true - }, - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" - }, - "dependencies": { - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } - } - }, - "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", - "dev": true - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", - "dev": true - }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", - "dev": true - }, - "log-driver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", - "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", - "dev": true - }, - "long": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", - "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=", - "dev": true - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true - }, - "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", - "dev": true, - "requires": { - "js-tokens": "3.0.2" - } - }, - "lru-cache": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", - "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", - "dev": true, - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" - } - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", - "dev": true, - "requires": { - "tmpl": "1.0.4" - } - }, - "mamacro": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", - "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", - "dev": true - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "1.0.1" - } - }, - "marked": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz", - "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==", - "dev": true - }, - "md5.js": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", - "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", - "dev": true, - "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.3" - } - }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "dev": true, - "requires": { - "mimic-fn": "1.2.0" - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "0.1.7", - "readable-stream": "2.3.6" - } - }, - "merge": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", - "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=", - "dev": true - }, - "merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", - "dev": true, - "requires": { - "readable-stream": "2.3.6" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0" - } - }, - "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", - "dev": true - }, - "mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", - "dev": true, - "requires": { - "mime-db": "1.33.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "1.1.11" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mississippi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", - "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", - "dev": true, - "requires": { - "concat-stream": "1.6.2", - "duplexify": "3.5.4", - "end-of-stream": "1.4.1", - "flush-write-stream": "1.0.3", - "from2": "2.3.0", - "parallel-transform": "1.1.0", - "pump": "2.0.1", - "pumpify": "1.5.1", - "stream-each": "1.2.2", - "through2": "2.0.3" - } - }, - "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", - "dev": true, - "requires": { - "for-in": "1.0.2", - "is-extendable": "1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "1.2.0", - "copy-concurrently": "1.0.5", - "fs-write-stream-atomic": "1.0.10", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "run-queue": "1.0.3" - }, - "dependencies": { - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "requires": { - "glob": "7.0.6" - } - } - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "nan": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", - "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", - "dev": true, - "optional": true - }, - "nanomatch": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", - "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", - "dev": true, - "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "fragment-cache": "0.2.1", - "is-odd": "2.0.0", - "is-windows": "1.0.2", - "kind-of": "6.0.2", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "2.0.4" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "neo-async": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.1.tgz", - "integrity": "sha512-3KL3fvuRkZ7s4IFOMfztb7zJp3QaVWnBeGoJlgB38XnCRPj/0tLzzLG5IB8NYOHbJ8g8UGrgZv44GLDk6CxTxA==", - "dev": true - }, - "nice-try": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz", - "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==", - "dev": true - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true - }, - "node-libs-browser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", - "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", - "dev": true, - "requires": { - "assert": "1.4.1", - "browserify-zlib": "0.2.0", - "buffer": "4.9.1", - "console-browserify": "1.1.0", - "constants-browserify": "1.0.0", - "crypto-browserify": "3.12.0", - "domain-browser": "1.2.0", - "events": "1.1.1", - "https-browserify": "1.0.0", - "os-browserify": "0.3.0", - "path-browserify": "0.0.0", - "process": "0.11.10", - "punycode": "1.4.1", - "querystring-es3": "0.2.1", - "readable-stream": "2.3.6", - "stream-browserify": "2.0.1", - "stream-http": "2.8.1", - "string_decoder": "1.1.1", - "timers-browserify": "2.0.10", - "tty-browserify": "0.0.0", - "url": "0.11.0", - "util": "0.10.3", - "vm-browserify": "0.0.4" - }, - "dependencies": { - "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "dev": true, - "requires": { - "base64-js": "1.3.0", - "ieee754": "1.1.11", - "isarray": "1.0.0" - } - }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", - "dev": true - }, - "timers-browserify": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", - "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", - "dev": true, - "requires": { - "setimmediate": "1.0.5" - } - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "dev": true, - "requires": { - "indexof": "0.0.1" - } - } - } - }, - "node-notifier": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.2.1.tgz", - "integrity": "sha512-MIBs+AAd6dJ2SklbbE8RUDRlIVhU8MaNLh1A9SUZDUHPiZkWLFde6UNwG41yQHZEToHgJMXqyVZ9UcS/ReOVTg==", - "dev": true, - "requires": { - "growly": "1.3.0", - "semver": "5.5.0", - "shellwords": "0.1.1", - "which": "1.3.0" - }, - "dependencies": { - "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", - "dev": true, - "requires": { - "isexe": "2.0.0" - } - } - } - }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true, - "requires": { - "hosted-git-info": "2.6.0", - "is-builtin-module": "1.0.0", - "semver": "5.5.0", - "validate-npm-package-license": "3.0.3" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "1.1.0" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "2.0.1" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "nwmatcher": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz", - "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==", - "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "0.1.1", - "define-property": "0.2.5", - "kind-of": "3.2.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - } - } - }, - "object-keys": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", - "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "object.getownpropertydescriptors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", - "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", - "dev": true, - "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.11.0" - } - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "1.2.0" - } - }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "0.0.8", - "wordwrap": "0.0.2" - } - }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "dev": true, - "requires": { - "deep-is": "0.1.3", - "fast-levenshtein": "2.0.6", - "levn": "0.3.0", - "prelude-ls": "1.1.2", - "type-check": "0.3.2", - "wordwrap": "1.0.0" - }, - "dependencies": { - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - } - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-limit": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", - "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", - "dev": true, - "requires": { - "p-try": "1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "1.2.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "pako": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", - "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", - "dev": true - }, - "parallel-transform": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", - "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", - "dev": true, - "requires": { - "cyclist": "0.2.2", - "inherits": "2.0.3", - "readable-stream": "2.3.6" - } - }, - "parse-asn1": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", - "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", - "dev": true, - "requires": { - "asn1.js": "4.10.1", - "browserify-aes": "1.2.0", - "create-hash": "1.2.0", - "evp_bytestokey": "1.0.3", - "pbkdf2": "3.0.16" - } - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "1.3.1" - } - }, - "parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "2.0.1" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", - "dev": true - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "pbkdf2": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz", - "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==", - "dev": true, - "requires": { - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "ripemd160": "2.0.2", - "safe-buffer": "5.1.2", - "sha.js": "2.4.11" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "2.0.4" - } - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "2.1.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" - } - } - } - }, - "pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", - "dev": true - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, - "prettier": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.12.1.tgz", - "integrity": "sha1-wa0g6APndJ+vkFpAnSNn4Gu+cyU=", - "dev": true - }, - "pretty-format": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", - "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", - "dev": true, - "requires": { - "ansi-regex": "3.0.0", - "ansi-styles": "3.2.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - } - } - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "public-encrypt": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", - "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.2.0", - "parse-asn1": "5.1.1", - "randombytes": "2.0.6" - } - }, - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "3.6.0", - "inherits": "2.0.3", - "pump": "2.0.1" - }, - "dependencies": { - "duplexify": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", - "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", - "dev": true, - "requires": { - "end-of-stream": "1.4.1", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "stream-shift": "1.0.0" - } - } - } - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", - "dev": true - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "randomatic": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", - "dev": true, - "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "randombytes": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", - "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "2.0.6", - "safe-buffer": "5.1.2" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - }, - "readdirp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", - "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "readable-stream": "2.3.6", - "set-immediate-shim": "1.0.1" - } - }, - "realpath-native": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.0.0.tgz", - "integrity": "sha512-XJtlRJ9jf0E1H1SLeJyQ9PGzQD7S65h1pRXEcAeK48doKOnKxcgPeNohJvD5u/2sI9J1oke6E8bZHS/fmW1UiQ==", - "dev": true, - "requires": { - "util.promisify": "1.0.0" - } - }, - "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "regenerator-transform": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "private": "0.1.8" - } - }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "requires": { - "is-equal-shallow": "0.1.3" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "3.0.2", - "safe-regex": "1.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "2.0.4" - } - } - } - }, - "regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "dev": true, - "requires": { - "regenerate": "1.4.0", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "requires": { - "jsesc": "0.5.0" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "1.0.2" - } - }, - "request": { - "version": "2.85.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz", - "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==", - "dev": true, - "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.7.0", - "caseless": "0.12.0", - "combined-stream": "1.0.6", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.3.2", - "har-validator": "5.0.3", - "hawk": "6.0.2", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.18", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.1", - "safe-buffer": "5.1.2", - "stringstream": "0.0.5", - "tough-cookie": "2.3.4", - "tunnel-agent": "0.6.0", - "uuid": "3.2.1" - } - }, - "request-promise-core": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz", - "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", - "dev": true, - "requires": { - "lodash": "4.17.10" - } - }, - "request-promise-native": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz", - "integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=", - "dev": true, - "requires": { - "request-promise-core": "1.1.1", - "stealthy-require": "1.1.1", - "tough-cookie": "2.3.4" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "requizzle": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.1.tgz", - "integrity": "sha1-aUPDUwxNmn5G8c3dUcFY/GcM294=", - "dev": true, - "requires": { - "underscore": "1.6.0" - }, - "dependencies": { - "underscore": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", - "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", - "dev": true - } - } - }, - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "3.0.0" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "2.0.1", - "signal-exit": "3.0.2" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "optional": true, - "requires": { - "align-text": "0.1.4" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.3" - } - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "2.1.0" - } - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "1.2.0" - } - }, - "rxjs": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.1.tgz", - "integrity": "sha512-OwMxHxmnmHTUpgO+V7dZChf3Tixf4ih95cmXjzzadULziVl/FKhHScGLj4goEw9weePVOH2Q0+GcCBUhKCZc/g==", - "dev": true, - "requires": { - "tslib": "1.9.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "0.1.15" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sane": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-2.5.0.tgz", - "integrity": "sha512-glfKd7YH4UCrh/7dD+UESsr8ylKWRE7UQPoXuz28FgmcF0ViJQhCTCCZHICRKxf8G8O1KdLEn20dcICK54c7ew==", - "dev": true, - "requires": { - "anymatch": "2.0.0", - "exec-sh": "0.2.1", - "fb-watchman": "2.0.0", - "fsevents": "1.2.3", - "micromatch": "3.1.10", - "minimist": "1.2.0", - "walker": "1.0.7", - "watch": "0.18.0" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "3.1.10", - "normalize-path": "2.1.1" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "repeat-element": "1.1.2", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "1.0.2" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.9", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "schema-utils": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.5.tgz", - "integrity": "sha512-yYrjb9TX2k/J1Y5UNy3KYdZq10xhYcF8nMpAW6o3hy6Q8WSIEf9lJHG/ePnOBfziPM3fvQwfOwa13U/Fh8qTfA==", - "dev": true, - "requires": { - "ajv": "6.5.2", - "ajv-keywords": "3.2.0" - }, - "dependencies": { - "ajv": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.2.tgz", - "integrity": "sha512-hOs7GfvI6tUI1LfZddH82ky6mOMyTuY0mk7kE2pWpmhhUSkumzaTO5vbVwij39MdwPQWCV4Zv57Eo06NtL/GVA==", - "dev": true, - "requires": { - "fast-deep-equal": "2.0.1", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.4.1", - "uri-js": "4.2.2" - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - } - } - }, - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "dev": true - }, - "serialize-javascript": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz", - "integrity": "sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==", - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true - }, - "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", - "dev": true, - "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "split-string": "3.1.0" - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.2" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "0.11.2", - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "map-cache": "0.2.2", - "source-map": "0.5.7", - "source-map-resolve": "0.5.1", - "use": "3.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "1.0.0", - "isobject": "3.0.1", - "snapdragon-util": "3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "1.0.2" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "sntp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", - "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", - "dev": true, - "requires": { - "hoek": "4.2.1" - } - }, - "source-list-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", - "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", - "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", - "dev": true, - "requires": { - "atob": "2.1.1", - "decode-uri-component": "0.2.0", - "resolve-url": "0.2.1", - "source-map-url": "0.4.0", - "urix": "0.1.0" - } - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "0.5.7" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "spdx-correct": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", - "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", - "dev": true, - "requires": { - "spdx-expression-parse": "3.0.0", - "spdx-license-ids": "3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "requires": { - "spdx-exceptions": "2.1.0", - "spdx-license-ids": "3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", - "dev": true - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "3.0.2" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "2.0.4" - } - } - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", - "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", - "dev": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - } - }, - "ssri": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", - "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "stack-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha1-1PM6tU6OOHeLDKXP07OvsS22hiA=", - "dev": true - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "0.2.5", - "object-copy": "0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - } - } - }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "dev": true - }, - "stream-browserify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.6" - } - }, - "stream-each": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz", - "integrity": "sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA==", - "dev": true, - "requires": { - "end-of-stream": "1.4.1", - "stream-shift": "1.0.0" - } - }, - "stream-http": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.1.tgz", - "integrity": "sha512-cQ0jo17BLca2r0GfRdZKYAGLU6JRoIWxqSOakUMuKOT6MOK7AAlE856L33QuDmAy/eeOrhLee3dZKX0Uadu93A==", - "dev": true, - "requires": { - "builtin-status-codes": "3.0.0", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "to-arraybuffer": "1.0.1", - "xtend": "4.0.1" - } - }, - "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true - }, - "string-length": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", - "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", - "dev": true, - "requires": { - "astral-regex": "1.0.0", - "strip-ansi": "4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "0.2.1" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "symbol-tree": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", - "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", - "dev": true - }, - "tapable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.0.0.tgz", - "integrity": "sha512-dQRhbNQkRnaqauC7WqSJ21EEksgT0fYZX2lqXzGkpo8JNig9zGZTYoMGvyI2nWmXlE2VSVXVDu7wLVGu/mQEsg==", - "dev": true - }, - "test-exclude": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.1.tgz", - "integrity": "sha512-qpqlP/8Zl+sosLxBcVKl9vYy26T9NPalxSzzCP/OY6K7j938ui2oKgo+kRZYfxAeIpLqpbVnsHq1tyV70E4lWQ==", - "dev": true, - "requires": { - "arrify": "1.0.1", - "micromatch": "3.1.10", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "require-main-filename": "1.0.1" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "repeat-element": "1.1.2", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "1.0.2" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.9", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - } - } - } - }, - "throat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", - "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, - "requires": { - "readable-stream": "2.3.6", - "xtend": "4.0.1" - } - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "1.0.2" - } - }, - "tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", - "dev": true - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "regex-not": "1.0.2", - "safe-regex": "1.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "2.0.4" - } - } - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "3.0.0", - "repeat-string": "1.6.1" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - } - } - }, - "tough-cookie": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", - "dev": true, - "requires": { - "punycode": "1.4.1" - } - }, - "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", - "dev": true, - "requires": { - "punycode": "2.1.0" - }, - "dependencies": { - "punycode": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", - "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=", - "dev": true - } - } - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, - "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "1.1.2" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "optional": true, - "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - } - }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true, - "optional": true - }, - "uglifyjs-webpack-plugin": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.7.tgz", - "integrity": "sha512-1VicfKhCYHLS8m1DCApqBhoulnASsEoJ/BvpUpP4zoNAPpKzdH+ghk0olGJMmwX2/jprK2j3hAHdUbczBSy2FA==", - "dev": true, - "requires": { - "cacache": "10.0.4", - "find-cache-dir": "1.0.0", - "schema-utils": "0.4.5", - "serialize-javascript": "1.5.0", - "source-map": "0.6.1", - "uglify-es": "3.3.9", - "webpack-sources": "1.1.0", - "worker-farm": "1.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "uglify-es": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", - "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", - "dev": true, - "requires": { - "commander": "2.13.0", - "source-map": "0.6.1" - } - } - } - }, - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", - "dev": true - }, - "underscore-contrib": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/underscore-contrib/-/underscore-contrib-0.3.0.tgz", - "integrity": "sha1-ZltmwkeD+PorGMn4y7Dix9SMJsc=", - "dev": true, - "requires": { - "underscore": "1.6.0" - }, - "dependencies": { - "underscore": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", - "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", - "dev": true - } - } - }, - "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", - "dev": true, - "requires": { - "arr-union": "3.1.0", - "get-value": "2.0.6", - "is-extendable": "0.1.1", - "set-value": "0.4.3" - }, - "dependencies": { - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, - "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "to-object-path": "0.3.0" - } - } - } - }, - "unique-filename": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz", - "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", - "dev": true, - "requires": { - "unique-slug": "2.0.0" - } - }, - "unique-slug": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz", - "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", - "dev": true, - "requires": { - "imurmurhash": "0.1.4" - } - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "0.3.1", - "isobject": "3.0.1" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "2.0.6", - "has-values": "0.1.4", - "isobject": "2.1.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "upath": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", - "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", - "dev": true - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "2.1.1" - }, - "dependencies": { - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - } - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "use": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", - "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", - "dev": true, - "requires": { - "define-properties": "1.1.2", - "object.getownpropertydescriptors": "2.0.3" - } - }, - "uuid": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", - "dev": true - }, - "v8-compile-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.0.tgz", - "integrity": "sha512-qNdTUMaCjPs4eEnM3W9H94R3sU70YCuT+/ST7nUf+id1bVOrdjrpUaeZLqPBPRph3hsgn4a4BvwpxhHZx+oSDg==", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", - "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", - "dev": true, - "requires": { - "spdx-correct": "3.0.0", - "spdx-expression-parse": "3.0.0" - } - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "1.3.0" - } - }, - "w3c-hr-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", - "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", - "dev": true, - "requires": { - "browser-process-hrtime": "0.1.2" - } - }, - "walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", - "dev": true, - "requires": { - "makeerror": "1.0.11" - } - }, - "watch": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz", - "integrity": "sha1-KAlUdsbffJDJYxOJkMClQj60uYY=", - "dev": true, - "requires": { - "exec-sh": "0.2.1", - "minimist": "1.2.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", - "dev": true, - "requires": { - "chokidar": "2.0.4", - "graceful-fs": "4.1.11", - "neo-async": "2.5.1" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "3.1.10", - "normalize-path": "2.1.1" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "repeat-element": "1.1.2", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "chokidar": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", - "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", - "dev": true, - "requires": { - "anymatch": "2.0.0", - "async-each": "1.0.1", - "braces": "2.3.2", - "fsevents": "1.2.3", - "glob-parent": "3.1.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "4.0.0", - "lodash.debounce": "4.0.8", - "normalize-path": "2.1.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0", - "upath": "1.1.0" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "1.0.2" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "3.1.0", - "path-dirname": "1.0.2" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "2.1.1" - } - } - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", - "dev": true, - "requires": { - "is-extglob": "2.1.1" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.9", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - } - } - } - }, - "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - }, - "webpack": { - "version": "4.15.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.15.1.tgz", - "integrity": "sha512-UwfFQ2plA5EMhhzwi/hl5xpLk7mNK7p0853Ml04z1Bqw553pY+oS8Xke3funcVy7eG/yMpZPvnlFTUyGKyKoyw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.5.13", - "@webassemblyjs/helper-module-context": "1.5.13", - "@webassemblyjs/wasm-edit": "1.5.13", - "@webassemblyjs/wasm-opt": "1.5.13", - "@webassemblyjs/wasm-parser": "1.5.13", - "acorn": "5.7.1", - "acorn-dynamic-import": "3.0.0", - "ajv": "6.5.2", - "ajv-keywords": "3.2.0", - "chrome-trace-event": "1.0.0", - "enhanced-resolve": "4.1.0", - "eslint-scope": "3.7.1", - "json-parse-better-errors": "1.0.2", - "loader-runner": "2.3.0", - "loader-utils": "1.1.0", - "memory-fs": "0.4.1", - "micromatch": "3.1.10", - "mkdirp": "0.5.1", - "neo-async": "2.5.1", - "node-libs-browser": "2.1.0", - "schema-utils": "0.4.5", - "tapable": "1.0.0", - "uglifyjs-webpack-plugin": "1.2.7", - "watchpack": "1.6.0", - "webpack-sources": "1.1.0" - }, - "dependencies": { - "acorn": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz", - "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==", - "dev": true - }, - "ajv": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.2.tgz", - "integrity": "sha512-hOs7GfvI6tUI1LfZddH82ky6mOMyTuY0mk7kE2pWpmhhUSkumzaTO5vbVwij39MdwPQWCV4Zv57Eo06NtL/GVA==", - "dev": true, - "requires": { - "fast-deep-equal": "2.0.1", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.4.1", - "uri-js": "4.2.2" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "repeat-element": "1.1.2", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "1.0.2" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.9", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - } - } - } - }, - "webpack-cli": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.0.8.tgz", - "integrity": "sha512-KnRLJ0BUaYRqrhAMb9dv3gzdmhmgIMKo0FmdsnmfqbPGtLnnZ6tORZAvmmKfr+A0VgiVpqC60Gv7Ofg0R2CHtQ==", - "dev": true, - "requires": { - "chalk": "2.4.1", - "cross-spawn": "6.0.5", - "enhanced-resolve": "4.1.0", - "global-modules-path": "2.1.0", - "import-local": "1.0.0", - "inquirer": "6.0.0", - "interpret": "1.1.0", - "loader-utils": "1.1.0", - "supports-color": "5.4.0", - "v8-compile-cache": "2.0.0", - "yargs": "11.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "wrap-ansi": "2.1.0" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "1.0.4", - "path-key": "2.0.1", - "semver": "5.5.0", - "shebang-command": "1.2.0", - "which": "1.2.14" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "yargs": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", - "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", - "dev": true, - "requires": { - "cliui": "4.1.0", - "decamelize": "1.2.0", - "find-up": "2.1.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "9.0.2" - } - }, - "yargs-parser": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", - "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", - "dev": true, - "requires": { - "camelcase": "4.1.0" - } - } - } - }, - "webpack-sources": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", - "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", - "dev": true, - "requires": { - "source-list-map": "2.0.0", - "source-map": "0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "whatwg-encoding": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz", - "integrity": "sha512-jLBwwKUhi8WtBfsMQlL4bUUcT8sMkAtQinscJAe/M4KHCkHuUJAF6vuB0tueNIw4c8ziO6AkRmgY+jL3a0iiPw==", - "dev": true, - "requires": { - "iconv-lite": "0.4.19" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", - "dev": true - } - } - }, - "whatwg-mimetype": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz", - "integrity": "sha512-FKxhYLytBQiUKjkYteN71fAUA3g6KpNXoho1isLiLSB3N1G4F35Q5vUxWfKFhBwi5IWF27VE6WxhrnnC+m0Mew==", - "dev": true - }, - "whatwg-url": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.1.tgz", - "integrity": "sha512-FwygsxsXx27x6XXuExA/ox3Ktwcbf+OAvrKmLulotDAiO1Q6ixchPFaHYsis2zZBZSJTR0+dR+JVtf7MlbqZjw==", - "dev": true, - "requires": { - "lodash.sortby": "4.7.0", - "tr46": "1.0.1", - "webidl-conversions": "4.0.2" - } - }, - "which": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", - "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", - "dev": true, - "requires": { - "isexe": "2.0.0" - } - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true, - "optional": true - }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true - }, - "worker-farm": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", - "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", - "dev": true, - "requires": { - "errno": "0.1.7" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write-file-atomic": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", - "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "signal-exit": "3.0.2" - } - }, - "ws": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-4.1.0.tgz", - "integrity": "sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==", - "dev": true, - "requires": { - "async-limiter": "1.0.0", - "safe-buffer": "5.1.2" - } - }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "xmlcreate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-1.0.2.tgz", - "integrity": "sha1-+mv3YqYKQT+z3Y9LA8WyaSONMI8=", - "dev": true - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "optional": true, - "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", - "window-size": "0.1.0" - }, - "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true, - "optional": true - } - } - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index 4446dc188..000000000 --- a/package.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "name": "php-parser", - "version": "3.0.0-alpha.3", - "description": "Parse PHP code and returns its AST", - "main": "src/index.js", - "browser": "dist/php-parser.js", - "scripts": { - "lint": "prettier --write src/*.js src/**/*.js", - "pretest": "npm run lint", - "test": "jest", - "prebuild": "npm run test", - "build": "webpack --config webpack.config.js", - "postbuild": "npm run build-docs", - "build-docs": "jsdoc -c .jsdoc.json", - "cover": "jest --coverage --coverageDirectory=coverage/" - }, - "repository": { - "type": "git", - "url": "https://github.com/glayzzle/php-parser" - }, - "bugs": { - "url": "https://github.com/glayzzle/php-parser/issues" - }, - "homepage": "https://glayzzle.com/", - "keywords": [ - "php", - "php5", - "php7", - "parser", - "lexer", - "tokenizer", - "ast" - ], - "author": "Ioan CHIRIAC", - "contributors": [ - { - "name": "Filippo Conti", - "email": "filippo@codekraft.it", - "url": "https://b4dnewz.github.io/" - }, - { - "name": "Christian Zosel", - "email": "christian@zosel.ch", - "url": "https://twitter.com/chrzosel" - } - ], - "license": "BSD-3-Clause", - "jest": { - "testEnvironment": "node", - "testURL": "http://localhost/" - }, - "devDependencies": { - "babel-loader": "^7", - "babel-preset-es2015": "^6", - "coveralls": "^3", - "eslint-plugin-prettier": "^2.6.2", - "jest": "^22.4", - "jsdoc": "^3.5.5", - "jsdoc-template": "github:braintree/jsdoc-template", - "prettier": "^1.9", - "webpack": "^4.15.1", - "webpack-cli": "^3.0.8" - } -} diff --git a/parser.html b/parser.html new file mode 100644 index 000000000..0cd7d728c --- /dev/null +++ b/parser.html @@ -0,0 +1,1562 @@ + + + + + + + + + parser - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ parser +

+ + + + +
+
+ +

+ + parser + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new parser() +

+
+ + + + + +
+

The PHP Parser class that build the AST tree from the lexer

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
lexer + + + + Lexer + + + + + + + +

current lexer instance

+
ast + + + + AST + + + + + + + +

the AST factory instance

+
token + + + + Integer + + + | + + + String + + + + + + + +

current token

+
extractDoc + + + + Boolean + + + + + + + +

should extract documentation as AST node

+
extractTokens + + + + Boolean + + + + + + + +

should extract each token

+
suppressErrors + + + + Boolean + + + + + + + +

should ignore parsing errors and continue

+
debug + + + + Boolean + + + + + + + +

should output debug informations

+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + +
Tutorials:
+
+ +
+ + + + + +
+ + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ error() +

+
+ + + + + +
+

handling errors

+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+ expect(token) → {boolean} +

+
+ + + + + +
+

Force the parser to check the current token.

+

If the current token does not match to expected token, +the an error will be raised.

+

If the suppressError mode is activated, then the error will +be added to the program error stack and this function will return false.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
token + + + + String + + + | + + + Number + + + + + + + + + +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + +
Throws:
+ + + +
+ +

Error

+ +
+ + + + + + + + + + + + + + + + + + +

+ expectEndOfStatement() → {boolean} +

+
+ + + + + +
+

expects an end of statement or end of file

+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+ getTokenName() +

+
+ + + + + +
+

helper : gets a token name

+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+ is() +

+
+ + + + + +
+

Check if token is of specified type

+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+ lex() +

+
+ + + + + +
+

Eating a token

+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+ next() +

+
+ + + + + +
+

consume the next token

+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+ node() +

+
+ + + + + +
+

Creates a new AST node

+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+ parse() +

+
+ + + + + +
+

main entry point : converts a source code to AST

+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+ raiseError() +

+
+ + + + + +
+

Raise an error

+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+ text() → {String} +

+
+ + + + + +
+

Returns the current token contents

+
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/parser.js.html b/parser.js.html new file mode 100644 index 000000000..6760e2c6d --- /dev/null +++ b/parser.js.html @@ -0,0 +1,676 @@ + + + + + + + + + + + parser.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ parser.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+/**
+ * @private
+ */
+function isNumber(n) {
+  return n != "." && n != "," && !isNaN(parseFloat(n)) && isFinite(n);
+}
+
+/**
+ * The PHP Parser class that build the AST tree from the lexer
+ *
+ * @class
+ * @tutorial Parser
+ * @property {Lexer} lexer - current lexer instance
+ * @property {AST} ast - the AST factory instance
+ * @property {Integer|String} token - current token
+ * @property {Boolean} extractDoc - should extract documentation as AST node
+ * @property {Boolean} extractTokens - should extract each token
+ * @property {Boolean} suppressErrors - should ignore parsing errors and continue
+ * @property {Boolean} debug - should output debug informations
+ */
+const parser = function(lexer, ast) {
+  this.lexer = lexer;
+  this.ast = ast;
+  this.tok = lexer.tok;
+  this.EOF = lexer.EOF;
+  this.token = null;
+  this.prev = null;
+  this.debug = false;
+  this.php7 = true;
+  this.extractDoc = false;
+  this.extractTokens = false;
+  this.suppressErrors = false;
+  const mapIt = function(item) {
+    return [item, null];
+  };
+  this.entries = {
+    IDENTIFIER: new Map(
+      [
+        this.tok.T_ABSTRACT,
+        this.tok.T_ARRAY,
+        this.tok.T_AS,
+        this.tok.T_BREAK,
+        this.tok.T_CALLABLE,
+        this.tok.T_CASE,
+        this.tok.T_CATCH,
+        this.tok.T_CLASS,
+        this.tok.T_CLASS_C,
+        this.tok.T_CLONE,
+        this.tok.T_CONST,
+        this.tok.T_CONTINUE,
+        this.tok.T_DECLARE,
+        this.tok.T_DEFAULT,
+        this.tok.T_DIR,
+        this.tok.T_DO,
+        this.tok.T_ECHO,
+        this.tok.T_ELSE,
+        this.tok.T_ELSEIF,
+        this.tok.T_EMPTY,
+        this.tok.T_ENDDECLARE,
+        this.tok.T_ENDFOR,
+        this.tok.T_ENDFOREACH,
+        this.tok.T_ENDIF,
+        this.tok.T_ENDSWITCH,
+        this.tok.T_ENDWHILE,
+        this.tok.T_EVAL,
+        this.tok.T_EXIT,
+        this.tok.T_EXTENDS,
+        this.tok.T_FILE,
+        this.tok.T_FINAL,
+        this.tok.T_FINALLY,
+        this.tok.T_FUNC_C,
+        this.tok.T_FOR,
+        this.tok.T_FOREACH,
+        this.tok.T_FUNCTION,
+        this.tok.T_GLOBAL,
+        this.tok.T_GOTO,
+        this.tok.T_IF,
+        this.tok.T_IMPLEMENTS,
+        this.tok.T_INCLUDE,
+        this.tok.T_INCLUDE_ONCE,
+        this.tok.T_INSTANCEOF,
+        this.tok.T_INSTEADOF,
+        this.tok.T_INTERFACE,
+        this.tok.T_ISSET,
+        this.tok.T_LINE,
+        this.tok.T_LIST,
+        this.tok.T_LOGICAL_AND,
+        this.tok.T_LOGICAL_OR,
+        this.tok.T_LOGICAL_XOR,
+        this.tok.T_METHOD_C,
+        this.tok.T_NAMESPACE,
+        this.tok.T_NEW,
+        this.tok.T_NS_C,
+        this.tok.T_PRINT,
+        this.tok.T_PRIVATE,
+        this.tok.T_PROTECTED,
+        this.tok.T_PUBLIC,
+        this.tok.T_REQUIRE,
+        this.tok.T_REQUIRE_ONCE,
+        this.tok.T_RETURN,
+        this.tok.T_STATIC,
+        this.tok.T_SWITCH,
+        this.tok.T_THROW,
+        this.tok.T_TRAIT,
+        this.tok.T_TRY,
+        this.tok.T_UNSET,
+        this.tok.T_USE,
+        this.tok.T_VAR,
+        this.tok.T_WHILE,
+        this.tok.T_YIELD
+      ].map(mapIt)
+    ),
+    VARIABLE: new Map(
+      [
+        this.tok.T_VARIABLE,
+        "$",
+        "&",
+        this.tok.T_NS_SEPARATOR,
+        this.tok.T_STRING,
+        this.tok.T_NAMESPACE,
+        this.tok.T_STATIC
+      ].map(mapIt)
+    ),
+    SCALAR: new Map(
+      [
+        this.tok.T_CONSTANT_ENCAPSED_STRING,
+        this.tok.T_START_HEREDOC,
+        this.tok.T_LNUMBER,
+        this.tok.T_DNUMBER,
+        this.tok.T_ARRAY,
+        "[",
+        this.tok.T_CLASS_C,
+        this.tok.T_TRAIT_C,
+        this.tok.T_FUNC_C,
+        this.tok.T_METHOD_C,
+        this.tok.T_LINE,
+        this.tok.T_FILE,
+        this.tok.T_DIR,
+        this.tok.T_NS_C,
+        '"',
+        'b"',
+        'B"',
+        "-",
+        this.tok.T_NS_SEPARATOR
+      ].map(mapIt)
+    ),
+    T_MAGIC_CONST: new Map(
+      [
+        this.tok.T_CLASS_C,
+        this.tok.T_TRAIT_C,
+        this.tok.T_FUNC_C,
+        this.tok.T_METHOD_C,
+        this.tok.T_LINE,
+        this.tok.T_FILE,
+        this.tok.T_DIR,
+        this.tok.T_NS_C
+      ].map(mapIt)
+    ),
+    T_MEMBER_FLAGS: new Map(
+      [
+        this.tok.T_PUBLIC,
+        this.tok.T_PRIVATE,
+        this.tok.T_PROTECTED,
+        this.tok.T_STATIC,
+        this.tok.T_ABSTRACT,
+        this.tok.T_FINAL
+      ].map(mapIt)
+    ),
+    EOS: new Map([";", this.EOF, this.tok.T_INLINE_HTML].map(mapIt)),
+    EXPR: new Map(
+      [
+        "@",
+        "-",
+        "+",
+        "!",
+        "~",
+        "(",
+        "`",
+        this.tok.T_LIST,
+        this.tok.T_CLONE,
+        this.tok.T_INC,
+        this.tok.T_DEC,
+        this.tok.T_NEW,
+        this.tok.T_ISSET,
+        this.tok.T_EMPTY,
+        this.tok.T_INCLUDE,
+        this.tok.T_INCLUDE_ONCE,
+        this.tok.T_REQUIRE,
+        this.tok.T_REQUIRE_ONCE,
+        this.tok.T_EVAL,
+        this.tok.T_INT_CAST,
+        this.tok.T_DOUBLE_CAST,
+        this.tok.T_STRING_CAST,
+        this.tok.T_ARRAY_CAST,
+        this.tok.T_OBJECT_CAST,
+        this.tok.T_BOOL_CAST,
+        this.tok.T_UNSET_CAST,
+        this.tok.T_EXIT,
+        this.tok.T_PRINT,
+        this.tok.T_YIELD,
+        this.tok.T_STATIC,
+        this.tok.T_FUNCTION,
+        // using VARIABLES :
+        this.tok.T_VARIABLE,
+        "$",
+        this.tok.T_NS_SEPARATOR,
+        this.tok.T_STRING,
+        // using SCALAR :
+        this.tok.T_STRING, // @see variable.js line 45 > conflict with variable = shift/reduce :)
+        this.tok.T_CONSTANT_ENCAPSED_STRING,
+        this.tok.T_START_HEREDOC,
+        this.tok.T_LNUMBER,
+        this.tok.T_DNUMBER,
+        this.tok.T_ARRAY,
+        "[",
+        this.tok.T_CLASS_C,
+        this.tok.T_TRAIT_C,
+        this.tok.T_FUNC_C,
+        this.tok.T_METHOD_C,
+        this.tok.T_LINE,
+        this.tok.T_FILE,
+        this.tok.T_DIR,
+        this.tok.T_NS_C
+      ].map(mapIt)
+    )
+  };
+};
+
+/**
+ * helper : gets a token name
+ */
+parser.prototype.getTokenName = function(token) {
+  if (!isNumber(token)) {
+    return "'" + token + "'";
+  } else {
+    if (token == this.EOF) return "the end of file (EOF)";
+    return this.lexer.engine.tokens.values[token];
+  }
+};
+
+/**
+ * main entry point : converts a source code to AST
+ */
+parser.prototype.parse = function(code, filename) {
+  this._errors = [];
+  this.filename = filename || "eval";
+  this.currentNamespace = [""];
+  if (this.extractDoc) {
+    this._docs = [];
+  } else {
+    this._docs = null;
+  }
+  if (this.extractTokens) {
+    this._tokens = [];
+  } else {
+    this._tokens = null;
+  }
+  this._docIndex = 0;
+  this.lexer.setInput(code);
+  this.lexer.all_tokens = this.extractTokens;
+  this.lexer.comment_tokens = this.extractDoc;
+  this.length = this.lexer._input.length;
+  this.innerList = false;
+  this.innerListForm = false;
+  const program = this.ast.prepare("program", null, this);
+  let childs = [];
+  this.next();
+  while (this.token != this.EOF) {
+    const node = this.read_start();
+    if (node !== null && node !== undefined) {
+      if (Array.isArray(node)) {
+        childs = childs.concat(node);
+      } else {
+        childs.push(node);
+      }
+    }
+  }
+  return program(childs, this._errors, this._docs, this._tokens);
+};
+
+/**
+ * Raise an error
+ */
+parser.prototype.raiseError = function(message, msgExpect, expect, token) {
+  message += " on line " + this.lexer.yylloc.first_line;
+  if (!this.suppressErrors) {
+    const err = new SyntaxError(
+      message,
+      this.filename,
+      this.lexer.yylloc.first_line
+    );
+    err.lineNumber = this.lexer.yylloc.first_line;
+    err.fileName = this.filename;
+    err.columnNumber = this.lexer.yylloc.first_column;
+    throw err;
+  }
+  // Error node :
+  const node = this.ast.prepare("error", null, this)(
+    message,
+    token,
+    this.lexer.yylloc.first_line,
+    expect
+  );
+  this._errors.push(node);
+  return node;
+};
+
+/**
+ * handling errors
+ */
+parser.prototype.error = function(expect) {
+  let msg = "Parse Error : syntax error";
+  let token = this.getTokenName(this.token);
+  let msgExpect = "";
+
+  if (this.token !== this.EOF) {
+    if (isNumber(this.token)) {
+      let symbol = this.text();
+      if (symbol.length > 10) {
+        symbol = symbol.substring(0, 7) + "...";
+      }
+      token = "'" + symbol + "' (" + token + ")";
+    }
+    msg += ", unexpected " + token;
+  }
+  if (expect && !Array.isArray(expect)) {
+    if (isNumber(expect) || expect.length === 1) {
+      msgExpect = ", expecting " + this.getTokenName(expect);
+    }
+    msg += msgExpect;
+  }
+  return this.raiseError(msg, msgExpect, expect, token);
+};
+
+/**
+ * Creates a new AST node
+ */
+parser.prototype.node = function(name) {
+  if (this.extractDoc) {
+    if (this._docIndex < this._docs.length) {
+      const docs = this._docs.slice(this._docIndex);
+      this._docIndex = this._docs.length;
+      return this.ast.prepare(name, docs, this);
+    }
+  }
+  return this.ast.prepare(name, null, this);
+};
+
+/**
+ * expects an end of statement or end of file
+ * @return {boolean}
+ */
+parser.prototype.expectEndOfStatement = function(node) {
+  if (this.token === ";") {
+    // include only real ';' statements
+    // https://github.com/glayzzle/php-parser/issues/164
+    if (node && this.lexer.yytext === ";") {
+      node.includeToken(this);
+    }
+  } else if (this.token !== this.tok.T_INLINE_HTML && this.token !== this.EOF) {
+    this.error(";");
+    return false;
+  }
+  this.next();
+  return true;
+};
+
+/** outputs some debug information on current token **/
+const ignoreStack = ["parser.next"];
+parser.prototype.showlog = function() {
+  const stack = new Error().stack.split("\n");
+  let line;
+  for (let offset = 2; offset < stack.length; offset++) {
+    line = stack[offset].trim();
+    let found = false;
+    for (let i = 0; i < ignoreStack.length; i++) {
+      if (line.substring(3, 3 + ignoreStack[i].length) === ignoreStack[i]) {
+        found = true;
+        break;
+      }
+    }
+    if (!found) {
+      break;
+    }
+  }
+  // eslint-disable-next-line no-console
+  console.log(
+    "Line " +
+      this.lexer.yylloc.first_line +
+      " : " +
+      this.getTokenName(this.token) +
+      ">" +
+      this.lexer.yytext +
+      "<" +
+      " @-->" +
+      line
+  );
+  return this;
+};
+
+/**
+ * Force the parser to check the current token.
+ *
+ * If the current token does not match to expected token,
+ * the an error will be raised.
+ *
+ * If the suppressError mode is activated, then the error will
+ * be added to the program error stack and this function will return `false`.
+ *
+ * @param {String|Number} token
+ * @return {boolean}
+ * @throws Error
+ */
+parser.prototype.expect = function(token) {
+  if (Array.isArray(token)) {
+    if (token.indexOf(this.token) === -1) {
+      this.error(token);
+      return false;
+    }
+  } else if (this.token != token) {
+    this.error(token);
+    return false;
+  }
+  return true;
+};
+
+/**
+ * Returns the current token contents
+ * @return {String}
+ */
+parser.prototype.text = function() {
+  return this.lexer.yytext;
+};
+
+/** consume the next token **/
+parser.prototype.next = function() {
+  // prepare the back command
+  if (this.token !== ";" || this.lexer.yytext === ";") {
+    // ignore '?>' from automated resolution
+    // https://github.com/glayzzle/php-parser/issues/168
+    this.prev = [
+      this.lexer.yylloc.last_line,
+      this.lexer.yylloc.last_column,
+      this.lexer.offset
+    ];
+  }
+
+  // eating the token
+  this.lex();
+
+  // showing the debug
+  if (this.debug) {
+    this.showlog();
+  }
+
+  // handling comments
+  if (this.extractDoc) {
+    while (
+      this.token === this.tok.T_COMMENT ||
+      this.token === this.tok.T_DOC_COMMENT
+    ) {
+      // APPEND COMMENTS
+      if (this.token === this.tok.T_COMMENT) {
+        this._docs.push(this.read_comment());
+      } else {
+        this._docs.push(this.read_doc_comment());
+      }
+    }
+  }
+
+  return this;
+};
+
+/**
+ * Eating a token
+ */
+parser.prototype.lex = function() {
+  // append on token stack
+  if (this.extractTokens) {
+    do {
+      // the token
+      this.token = this.lexer.lex() || this.EOF;
+      if (this.token === this.EOF) return this;
+      let entry = this.lexer.yytext;
+      if (this.lexer.engine.tokens.values.hasOwnProperty(this.token)) {
+        entry = [
+          this.lexer.engine.tokens.values[this.token],
+          entry,
+          this.lexer.yylloc.first_line,
+          this.lexer.yylloc.first_offset,
+          this.lexer.offset
+        ];
+      } else {
+        entry = [
+          null,
+          entry,
+          this.lexer.yylloc.first_line,
+          this.lexer.yylloc.first_offset,
+          this.lexer.offset
+        ];
+      }
+      this._tokens.push(entry);
+      if (this.token === this.tok.T_CLOSE_TAG) {
+        // https://github.com/php/php-src/blob/7ff186434e82ee7be7c59d0db9a976641cf7b09c/Zend/zend_compile.c#L1680
+        this.token = ";";
+        return this;
+      } else if (this.token === this.tok.T_OPEN_TAG_WITH_ECHO) {
+        this.token = this.tok.T_ECHO;
+        return this;
+      }
+    } while (
+      this.token === this.tok.T_WHITESPACE || // ignore white space
+      (!this.extractDoc &&
+        (this.token === this.tok.T_COMMENT || // ignore single lines comments
+          this.token === this.tok.T_DOC_COMMENT)) || // ignore doc comments
+      // ignore open tags
+      this.token === this.tok.T_OPEN_TAG
+    );
+  } else {
+    this.token = this.lexer.lex() || this.EOF;
+  }
+  return this;
+};
+
+/**
+ * Check if token is of specified type
+ */
+parser.prototype.is = function(type) {
+  if (Array.isArray(type)) {
+    return type.indexOf(this.token) !== -1;
+  }
+  return this.entries[type].has(this.token);
+};
+
+// extends the parser with syntax files
+[
+  require("./parser/array.js"),
+  require("./parser/class.js"),
+  require("./parser/comment.js"),
+  require("./parser/expr.js"),
+  require("./parser/function.js"),
+  require("./parser/if.js"),
+  require("./parser/loops.js"),
+  require("./parser/main.js"),
+  require("./parser/namespace.js"),
+  require("./parser/scalar.js"),
+  require("./parser/statement.js"),
+  require("./parser/switch.js"),
+  require("./parser/try.js"),
+  require("./parser/utils.js"),
+  require("./parser/variable.js")
+].forEach(function(ext) {
+  for (const k in ext) {
+    parser.prototype[k] = ext[k];
+  }
+});
+
+module.exports = parser;
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/parser_array.js.html b/parser_array.js.html new file mode 100644 index 000000000..3b5ce4685 --- /dev/null +++ b/parser_array.js.html @@ -0,0 +1,216 @@ + + + + + + + + + + + parser/array.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ parser/array.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const ArrayExpr = "array";
+const ArrayEntry = "entry";
+
+module.exports = {
+  /**
+   * Parse an array
+   * ```ebnf
+   * array ::= T_ARRAY '(' array_pair_list ')' |
+   *   '[' array_pair_list ']'
+   * ```
+   */
+  read_array: function() {
+    let expect = null;
+    let shortForm = false;
+    const result = this.node(ArrayExpr);
+
+    if (this.token === this.tok.T_ARRAY) {
+      this.next().expect("(");
+      expect = ")";
+    } else {
+      shortForm = true;
+      expect = "]";
+    }
+    let items = [];
+    if (this.next().token !== expect) {
+      items = this.read_array_pair_list(shortForm);
+    }
+    // check non empty entries
+    /*for(let i = 0, size = items.length - 1; i < size; i++) {
+      if (items[i] === null) {
+        this.raiseError(
+          "Cannot use empty array elements in arrays"
+        );
+      }
+    }*/
+    this.expect(expect);
+    this.next();
+    return result(shortForm, items);
+  },
+  /**
+   * Reads an array of items
+   * ```ebnf
+   * array_pair_list ::= array_pair (',' array_pair?)*
+   * ```
+   */
+  read_array_pair_list: function(shortForm) {
+    const self = this;
+    return this.read_list(
+      function() {
+        return self.read_array_pair(shortForm);
+      },
+      ",",
+      true
+    );
+  },
+  /**
+   * Reads an entry
+   * array_pair:
+   *  expr T_DOUBLE_ARROW expr
+   *  | expr
+   *  | expr T_DOUBLE_ARROW '&' variable
+   *  | '&' variable
+   *  | expr T_DOUBLE_ARROW T_LIST '(' array_pair_list ')'
+   *  | T_LIST '(' array_pair_list ')'
+   */
+  read_array_pair: function(shortForm) {
+    if (
+      this.token === "," ||
+      (!shortForm && this.token === ")") ||
+      (shortForm && this.token === "]")
+    ) {
+      return null;
+    }
+    if (this.token === "&") {
+      return this.next().read_variable(true, false, true);
+    } else {
+      const entry = this.node(ArrayEntry);
+      const expr = this.read_expr();
+      if (this.token === this.tok.T_DOUBLE_ARROW) {
+        if (this.next().token === "&") {
+          return entry(expr, this.next().read_variable(true, false, true));
+        } else {
+          return entry(expr, this.read_expr());
+        }
+      }
+      return expr;
+    }
+  },
+  /**
+   * ```ebnf
+   *  dim_offset ::= expr?
+   * ```
+   */
+  read_dim_offset: function() {
+    if (this.token == "]") return false;
+    return this.read_expr();
+  }
+};
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/parser_class.js.html b/parser_class.js.html new file mode 100644 index 000000000..f356fc1bf --- /dev/null +++ b/parser_class.js.html @@ -0,0 +1,572 @@ + + + + + + + + + + + parser/class.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ parser/class.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+module.exports = {
+  /**
+   * reading a class
+   * ```ebnf
+   * class ::= class_scope? T_CLASS T_STRING (T_EXTENDS NAMESPACE_NAME)? (T_IMPLEMENTS (NAMESPACE_NAME ',')* NAMESPACE_NAME)? '{' CLASS_BODY '}'
+   * ```
+   */
+  read_class: function(flag) {
+    const result = this.node("class");
+    this.expect(this.tok.T_CLASS);
+    this.next().expect(this.tok.T_STRING);
+    const propName = this.text();
+    let propExtends = null;
+    let propImplements = null;
+    if (this.next().token == this.tok.T_EXTENDS) {
+      propExtends = this.next().read_namespace_name();
+    }
+    if (this.token == this.tok.T_IMPLEMENTS) {
+      propImplements = this.next().read_name_list();
+    }
+    this.expect("{");
+    const body = this.next().read_class_body();
+    return result(propName, propExtends, propImplements, body, flag);
+  },
+  /**
+   * Read the class visibility
+   * ```ebnf
+   *   class_scope ::= (T_FINAL | T_ABSTRACT)?
+   * ```
+   */
+  read_class_scope: function() {
+    const result = this.token;
+    if (result == this.tok.T_FINAL) {
+      this.next();
+      return [0, 0, 2];
+    } else if (result == this.tok.T_ABSTRACT) {
+      this.next();
+      return [0, 0, 1];
+    }
+    return [0, 0, 0];
+  },
+  /**
+   * Reads a class body
+   * ```ebnf
+   *   class_body ::= (member_flags? (T_VAR | T_STRING | T_FUNCTION))*
+   * ```
+   */
+  read_class_body: function() {
+    let result = [];
+
+    while (this.token !== this.EOF && this.token !== "}") {
+      if (this.token === this.tok.T_COMMENT) {
+        result.push(this.read_comment());
+        continue;
+      }
+
+      if (this.token === this.tok.T_DOC_COMMENT) {
+        result.push(this.read_doc_comment());
+        continue;
+      }
+
+      // check T_USE trait
+      if (this.token === this.tok.T_USE) {
+        result = result.concat(this.next().read_trait_use_statement());
+        continue;
+      }
+
+      // read member flags
+      const flags = this.read_member_flags(false);
+
+      // check constant
+      if (this.token === this.tok.T_CONST) {
+        const constants = this.read_constant_list(flags);
+        if (this.expect(";")) {
+          this.next();
+        }
+        result = result.concat(constants);
+        continue;
+      }
+
+      // jump over T_VAR then land on T_VARIABLE
+      if (this.token === this.tok.T_VAR) {
+        this.next().expect(this.tok.T_VARIABLE);
+        flags[0] = flags[1] = 0; // public & non static var
+      }
+
+      if (this.token === this.tok.T_VARIABLE) {
+        // reads a variable
+        const variables = this.read_variable_list(flags);
+        this.expect(";");
+        this.next();
+        result = result.concat(variables);
+      } else if (this.token === this.tok.T_FUNCTION) {
+        // reads a function
+        result.push(this.read_function(false, flags));
+      } else {
+        // raise an error
+        this.error([
+          this.tok.T_CONST,
+          this.tok.T_VARIABLE,
+          this.tok.T_FUNCTION
+        ]);
+        // ignore token
+        this.next();
+      }
+    }
+    this.expect("}");
+    this.next();
+    return result;
+  },
+  /**
+   * Reads variable list
+   * ```ebnf
+   *  variable_list ::= (variable_declaration ',')* variable_declaration
+   * ```
+   */
+  read_variable_list: function(flags) {
+    return this.read_list(
+      /**
+       * Reads a variable declaration
+       *
+       * ```ebnf
+       *  variable_declaration ::= T_VARIABLE '=' scalar
+       * ```
+       */
+      function read_variable_declaration() {
+        const result = this.node("property");
+        this.expect(this.tok.T_VARIABLE);
+        const name = this.text().substring(1); // ignore $
+        this.next();
+        if (this.token === ";" || this.token === ",") {
+          return result(name, null, flags);
+        } else if (this.token === "=") {
+          // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L815
+          return result(name, this.next().read_expr(), flags);
+        } else {
+          this.expect([",", ";", "="]);
+          return result(name, null, flags);
+        }
+      },
+      ","
+    );
+  },
+  /**
+   * Reads constant list
+   * ```ebnf
+   *  constant_list ::= T_CONST (constant_declaration ',')* constant_declaration
+   * ```
+   */
+  read_constant_list: function(flags) {
+    if (this.expect(this.tok.T_CONST)) {
+      this.next();
+    }
+    return this.read_list(
+      /**
+       * Reads a constant declaration
+       *
+       * ```ebnf
+       *  constant_declaration ::= (T_STRING | IDENTIFIER) '=' expr
+       * ```
+       * @return {Constant} [:link:](AST.md#constant)
+       */
+      function read_constant_declaration() {
+        const result = this.node("classconstant");
+        let name = null;
+        let value = null;
+        if (
+          this.token === this.tok.T_STRING ||
+          (this.php7 && this.is("IDENTIFIER"))
+        ) {
+          name = this.text();
+          this.next();
+        } else {
+          this.expect("IDENTIFIER");
+        }
+        if (this.expect("=")) {
+          value = this.next().read_expr();
+        }
+        return result(name, value, flags);
+      },
+      ","
+    );
+  },
+  /**
+   * Read member flags
+   * @return array
+   *  1st index : 0 => public, 1 => protected, 2 => private
+   *  2nd index : 0 => instance member, 1 => static member
+   *  3rd index : 0 => normal, 1 => abstract member, 2 => final member
+   */
+  read_member_flags: function(asInterface) {
+    const result = [-1, -1, -1];
+    if (this.is("T_MEMBER_FLAGS")) {
+      let idx = 0,
+        val = 0;
+      do {
+        switch (this.token) {
+          case this.tok.T_PUBLIC:
+            idx = 0;
+            val = 0;
+            break;
+          case this.tok.T_PROTECTED:
+            idx = 0;
+            val = 1;
+            break;
+          case this.tok.T_PRIVATE:
+            idx = 0;
+            val = 2;
+            break;
+          case this.tok.T_STATIC:
+            idx = 1;
+            val = 1;
+            break;
+          case this.tok.T_ABSTRACT:
+            idx = 2;
+            val = 1;
+            break;
+          case this.tok.T_FINAL:
+            idx = 2;
+            val = 2;
+            break;
+        }
+        if (asInterface) {
+          if (idx == 0 && val == 2) {
+            // an interface can't be private
+            this.expect([this.tok.T_PUBLIC, this.tok.T_PROTECTED]);
+            val = -1;
+          } else if (idx == 2 && val == 1) {
+            // an interface cant be abstract
+            this.error();
+            val = -1;
+          }
+        }
+        if (result[idx] !== -1) {
+          // already defined flag
+          this.error();
+        } else if (val !== -1) {
+          result[idx] = val;
+        }
+      } while (this.next().is("T_MEMBER_FLAGS"));
+    }
+
+    if (result[1] == -1) result[1] = 0;
+    if (result[2] == -1) result[2] = 0;
+    return result;
+  },
+  /**
+   * reading an interface
+   * ```ebnf
+   * interface ::= T_INTERFACE T_STRING (T_EXTENDS (NAMESPACE_NAME ',')* NAMESPACE_NAME)? '{' INTERFACE_BODY '}'
+   * ```
+   */
+  read_interface: function() {
+    const result = this.node("interface");
+    let name = null;
+    let body = null;
+    let propExtends = null;
+    if (this.expect(this.tok.T_INTERFACE)) {
+      this.next();
+    }
+    if (this.expect(this.tok.T_STRING)) {
+      name = this.text();
+      this.next();
+    }
+    if (this.token === this.tok.T_EXTENDS) {
+      propExtends = this.next().read_name_list();
+    }
+    if (this.expect("{")) {
+      body = this.next().read_interface_body();
+    }
+    return result(name, propExtends, body);
+  },
+  /**
+   * Reads an interface body
+   * ```ebnf
+   *   interface_body ::= (member_flags? (T_CONST | T_FUNCTION))*
+   * ```
+   */
+  read_interface_body: function() {
+    let result = [];
+
+    while (this.token !== this.EOF && this.token !== "}") {
+      if (this.token === this.tok.T_COMMENT) {
+        result.push(this.read_comment());
+        continue;
+      }
+
+      if (this.token === this.tok.T_DOC_COMMENT) {
+        result.push(this.read_doc_comment());
+        continue;
+      }
+
+      // read member flags
+      const flags = this.read_member_flags(true);
+
+      // check constant
+      if (this.token == this.tok.T_CONST) {
+        const constants = this.read_constant_list(flags);
+        if (this.expect(";")) {
+          this.next();
+        }
+        result = result.concat(constants);
+      } else if (this.token === this.tok.T_FUNCTION) {
+        // reads a function
+        const method = this.read_function_declaration(2, flags);
+        method.parseFlags(flags);
+        result.push(method);
+        if (this.expect(";")) {
+          this.next();
+        }
+      } else {
+        // raise an error
+        this.error([this.tok.T_CONST, this.tok.T_FUNCTION]);
+        this.next();
+      }
+    }
+    if (this.expect("}")) {
+      this.next();
+    }
+    return result;
+  },
+  /**
+   * reading a trait
+   * ```ebnf
+   * trait ::= T_TRAIT T_STRING (T_EXTENDS (NAMESPACE_NAME ',')* NAMESPACE_NAME)? '{' FUNCTION* '}'
+   * ```
+   */
+  read_trait: function() {
+    const result = this.node("trait");
+    let propName = null;
+    let propExtends = null;
+    let propImplements = null;
+    let body = null;
+    if (this.expect(this.tok.T_TRAIT)) {
+      this.next();
+    }
+    if (this.expect(this.tok.T_STRING)) {
+      propName = this.text();
+    }
+    if (this.next().token == this.tok.T_EXTENDS) {
+      propExtends = this.next().read_namespace_name();
+    }
+    if (this.token == this.tok.T_IMPLEMENTS) {
+      propImplements = this.next().read_name_list();
+    }
+    if (this.expect("{")) {
+      body = this.next().read_class_body();
+    }
+    return result(propName, propExtends, propImplements, body);
+  },
+  /**
+   * reading a use statement
+   * ```ebnf
+   * trait_use_statement ::= namespace_name (',' namespace_name)* ('{' trait_use_alias '}')?
+   * ```
+   */
+  read_trait_use_statement: function() {
+    // defines use statements
+    const node = this.node("traituse");
+    const traits = [this.read_namespace_name()];
+    let adaptations = null;
+    while (this.token === ",") {
+      traits.push(this.next().read_namespace_name());
+    }
+    if (this.token === "{") {
+      adaptations = [];
+      // defines alias statements
+      while (this.next().token !== this.EOF) {
+        if (this.token === "}") break;
+        adaptations.push(this.read_trait_use_alias());
+        this.expect(";");
+      }
+      if (this.expect("}")) {
+        this.next();
+      }
+    } else {
+      if (this.expect(";")) {
+        this.next();
+      }
+    }
+    return node(traits, adaptations);
+  },
+  /**
+   * Reading trait alias
+   * ```ebnf
+   * trait_use_alias ::= namespace_name ( T_DOUBLE_COLON T_STRING )? (T_INSTEADOF namespace_name) | (T_AS member_flags? T_STRING)
+   * ```
+   * name list : https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L303
+   * trait adaptation : https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L742
+   */
+  read_trait_use_alias: function() {
+    const node = this.node();
+    let trait = null;
+    let method;
+
+    if (this.is("IDENTIFIER")) {
+      method = this.text();
+      this.next();
+    } else {
+      method = this.read_namespace_name();
+
+      if (this.token === this.tok.T_DOUBLE_COLON) {
+        this.next();
+        if (
+          this.token === this.tok.T_STRING ||
+          (this.php7 && this.is("IDENTIFIER"))
+        ) {
+          trait = method;
+          method = this.text();
+          this.next();
+        } else {
+          this.expect(this.tok.T_STRING);
+        }
+      } else {
+        // convert identifier as string
+        method = method.name;
+      }
+    }
+
+    // handle trait precedence
+    if (this.token === this.tok.T_INSTEADOF) {
+      return node(
+        "traitprecedence",
+        trait,
+        method,
+        this.next().read_name_list()
+      );
+    } else if (this.token === this.tok.T_AS) {
+      // handle trait alias
+      let flags = null;
+      let alias = null;
+      if (this.next().is("T_MEMBER_FLAGS")) {
+        flags = this.read_member_flags();
+      }
+
+      if (
+        this.token === this.tok.T_STRING ||
+        (this.php7 && this.is("IDENTIFIER"))
+      ) {
+        alias = this.text();
+        this.next();
+      } else if (flags === false) {
+        // no visibility flags and no name => too bad
+        this.expect(this.tok.T_STRING);
+      }
+
+      return node("traitalias", trait, method, alias, flags);
+    }
+
+    // handle errors
+    this.expect([this.tok.T_AS, this.tok.T_INSTEADOF]);
+    return node("traitalias", trait, method, null, null);
+  }
+};
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/parser_comment.js.html b/parser_comment.js.html new file mode 100644 index 000000000..b243e9b12 --- /dev/null +++ b/parser_comment.js.html @@ -0,0 +1,159 @@ + + + + + + + + + + + parser/comment.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ parser/comment.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+module.exports = {
+  /**
+   *  Comments with // or # or / * ... * /
+   */
+  read_comment: function() {
+    const text = this.text();
+    let result = this.ast.prepare(
+      text.substring(0, 2) === "/*" ? "commentblock" : "commentline",
+      null,
+      this
+    );
+    // handle location on comment
+    const prev = this.prev;
+    this.prev = [
+      this.lexer.yylloc.last_line,
+      this.lexer.yylloc.last_column,
+      this.lexer.offset
+    ];
+    this.lex();
+    result = result(text);
+    this.prev = prev;
+    return result;
+  },
+  /**
+   * Comments with / ** ... * /
+   */
+  read_doc_comment: function() {
+    let result = this.ast.prepare("commentblock", null, this);
+    const text = this.text();
+    const prev = this.prev;
+    this.prev = [
+      this.lexer.yylloc.last_line,
+      this.lexer.yylloc.last_column,
+      this.lexer.offset
+    ];
+    this.lex();
+    result = result(text);
+    this.prev = prev;
+    return result;
+  }
+};
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/parser_expr.js.html b/parser_expr.js.html new file mode 100644 index 000000000..3072ee574 --- /dev/null +++ b/parser_expr.js.html @@ -0,0 +1,625 @@ + + + + + + + + + + + parser/expr.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ parser/expr.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+module.exports = {
+  read_expr: function() {
+    const result = this.node();
+    const expr = this.read_expr_item();
+    // binary operations
+    if (this.token === "|")
+      return result("bin", "|", expr, this.next().read_expr());
+    if (this.token === "&")
+      return result("bin", "&", expr, this.next().read_expr());
+    if (this.token === "^")
+      return result("bin", "^", expr, this.next().read_expr());
+    if (this.token === ".")
+      return result("bin", ".", expr, this.next().read_expr());
+    if (this.token === "+")
+      return result("bin", "+", expr, this.next().read_expr());
+    if (this.token === "-")
+      return result("bin", "-", expr, this.next().read_expr());
+    if (this.token === "*")
+      return result("bin", "*", expr, this.next().read_expr());
+    if (this.token === "/")
+      return result("bin", "/", expr, this.next().read_expr());
+    if (this.token === "%")
+      return result("bin", "%", expr, this.next().read_expr());
+    if (this.token === this.tok.T_POW)
+      return result("bin", "**", expr, this.next().read_expr());
+    if (this.token === this.tok.T_SL)
+      return result("bin", "<<", expr, this.next().read_expr());
+    if (this.token === this.tok.T_SR)
+      return result("bin", ">>", expr, this.next().read_expr());
+    // more binary operations (formerly bool)
+    if (this.token === this.tok.T_BOOLEAN_OR)
+      return result("bin", "||", expr, this.next().read_expr());
+    if (this.token === this.tok.T_LOGICAL_OR)
+      return result("bin", "or", expr, this.next().read_expr());
+    if (this.token === this.tok.T_BOOLEAN_AND)
+      return result("bin", "&&", expr, this.next().read_expr());
+    if (this.token === this.tok.T_LOGICAL_AND)
+      return result("bin", "and", expr, this.next().read_expr());
+    if (this.token === this.tok.T_LOGICAL_XOR)
+      return result("bin", "xor", expr, this.next().read_expr());
+    if (this.token === this.tok.T_IS_IDENTICAL)
+      return result("bin", "===", expr, this.next().read_expr());
+    if (this.token === this.tok.T_IS_NOT_IDENTICAL)
+      return result("bin", "!==", expr, this.next().read_expr());
+    if (this.token === this.tok.T_IS_EQUAL)
+      return result("bin", "==", expr, this.next().read_expr());
+    if (this.token === this.tok.T_IS_NOT_EQUAL)
+      return result("bin", "!=", expr, this.next().read_expr());
+    if (this.token === "<")
+      return result("bin", "<", expr, this.next().read_expr());
+    if (this.token === ">")
+      return result("bin", ">", expr, this.next().read_expr());
+    if (this.token === this.tok.T_IS_SMALLER_OR_EQUAL)
+      return result("bin", "<=", expr, this.next().read_expr());
+    if (this.token === this.tok.T_IS_GREATER_OR_EQUAL)
+      return result("bin", ">=", expr, this.next().read_expr());
+    if (this.token === this.tok.T_SPACESHIP)
+      return result("bin", "<=>", expr, this.next().read_expr());
+    if (this.token === this.tok.T_INSTANCEOF)
+      return result("bin", "instanceof", expr, this.next().read_expr());
+
+    // extra operations :
+    // $username = $_GET['user'] ?? 'nobody';
+    if (this.token === this.tok.T_COALESCE)
+      return result("bin", "??", expr, this.next().read_expr());
+
+    // extra operations :
+    // $username = $_GET['user'] ? true : false;
+    if (this.token === "?") {
+      let trueArg = null;
+      if (this.next().token !== ":") {
+        trueArg = this.read_expr();
+      }
+      this.expect(":") && this.next();
+      return result("retif", expr, trueArg, this.read_expr());
+    }
+
+    return expr;
+  },
+
+  /**
+   * ```ebnf
+   * Reads an expression
+   *  expr ::= @todo
+   * ```
+   */
+  read_expr_item: function() {
+    let result, expr;
+    if (this.token === "@") return this.node("silent")(this.next().read_expr());
+    if (this.token === "+")
+      return this.node("unary")("+", this.next().read_expr());
+    if (this.token === "!")
+      return this.node("unary")("!", this.next().read_expr());
+    if (this.token === "~")
+      return this.node("unary")("~", this.next().read_expr());
+
+    if (this.token === "-") {
+      result = this.node();
+      this.next();
+      if (
+        this.token === this.tok.T_LNUMBER ||
+        this.token === this.tok.T_DNUMBER
+      ) {
+        // negative number
+        result = result("number", "-" + this.text(), null);
+        this.next();
+        return result;
+      } else {
+        return result("unary", "-", this.read_expr());
+      }
+    }
+
+    if (this.token === "(") {
+      const node = this.node("parenthesis");
+      expr = this.next().read_expr();
+      this.expect(")") && this.next();
+      return this.handleDereferencable(node(expr));
+    }
+
+    if (this.token === "`") {
+      // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L1048
+      return this.next().read_encapsed_string("`");
+    }
+
+    if (this.token === this.tok.T_LIST) {
+      let assign = null;
+      const isInner = this.innerList;
+      result = this.node("list");
+      if (!isInner) {
+        assign = this.node("assign");
+      }
+      if (this.next().expect("(")) {
+        this.next();
+      }
+
+      if (!this.innerList) this.innerList = true;
+
+      // reads inner items
+      const assignList = this.read_array_pair_list(false);
+      if (this.expect(")")) {
+        this.next();
+      }
+
+      // check if contains at least one assignment statement
+      let hasItem = false;
+      for (let i = 0; i < assignList.length; i++) {
+        if (assignList[i] !== null) {
+          hasItem = true;
+          break;
+        }
+      }
+      if (!hasItem) {
+        this.raiseError(
+          "Fatal Error :  Cannot use empty list on line " +
+            this.lexer.yylloc.first_line
+        );
+      }
+
+      // handles the node resolution
+      if (!isInner) {
+        this.innerList = false;
+        if (this.expect("=")) {
+          return assign(
+            result(assignList, false),
+            this.next().read_expr(),
+            "="
+          );
+        } else {
+          // error fallback : list($a, $b);
+          return result(assignList, false);
+        }
+      } else {
+        return result(assignList, false);
+      }
+    }
+
+    if (this.token === this.tok.T_CLONE)
+      return this.node("clone")(this.next().read_expr());
+
+    switch (this.token) {
+      case this.tok.T_INC:
+        return this.node("pre")(
+          "+",
+          this.next().read_variable(false, false, false)
+        );
+
+      case this.tok.T_DEC:
+        return this.node("pre")(
+          "-",
+          this.next().read_variable(false, false, false)
+        );
+
+      case this.tok.T_NEW:
+        return this.next().read_new_expr();
+
+      case this.tok.T_ISSET: {
+        result = this.node("isset");
+        if (this.next().expect("(")) {
+          this.next();
+        }
+        const args = this.read_list(this.read_expr, ",");
+        if (this.expect(")")) {
+          this.next();
+        }
+        return result(args);
+      }
+      case this.tok.T_EMPTY: {
+        result = this.node("empty");
+        if (this.next().expect("(")) {
+          this.next();
+        }
+        const arg = this.read_expr();
+        if (this.expect(")")) {
+          this.next();
+        }
+        return result([arg]);
+      }
+      case this.tok.T_INCLUDE:
+        return this.node("include")(false, false, this.next().read_expr());
+
+      case this.tok.T_INCLUDE_ONCE:
+        return this.node("include")(true, false, this.next().read_expr());
+
+      case this.tok.T_REQUIRE:
+        return this.node("include")(false, true, this.next().read_expr());
+
+      case this.tok.T_REQUIRE_ONCE:
+        return this.node("include")(true, true, this.next().read_expr());
+
+      case this.tok.T_EVAL:
+        result = this.node("eval");
+        if (this.next().expect("(")) {
+          this.next();
+        }
+        expr = this.read_expr();
+        if (this.expect(")")) {
+          this.next();
+        }
+        return result(expr);
+
+      case this.tok.T_INT_CAST:
+        return this.node("cast")("int", this.next().read_expr());
+
+      case this.tok.T_DOUBLE_CAST:
+        return this.node("cast")("float", this.next().read_expr());
+
+      case this.tok.T_STRING_CAST:
+        return this.node("cast")(
+          this.text() === "(binary)" ? "binary" : "string",
+          this.next().read_expr()
+        );
+
+      case this.tok.T_ARRAY_CAST:
+        return this.node("cast")("array", this.next().read_expr());
+
+      case this.tok.T_OBJECT_CAST:
+        return this.node("cast")("object", this.next().read_expr());
+
+      case this.tok.T_BOOL_CAST:
+        return this.node("cast")("bool", this.next().read_expr());
+
+      case this.tok.T_UNSET_CAST:
+        return this.node("cast")("unset", this.next().read_expr());
+
+      case this.tok.T_EXIT: {
+        const useDie = this.lexer.yytext.toLowerCase() === "die";
+        result = this.node("exit");
+        let status = null;
+        if (this.next().token === "(") {
+          if (this.next().token !== ")") {
+            status = this.read_expr();
+            if (this.expect(")")) {
+              this.next();
+            }
+          } else {
+            this.next();
+          }
+        }
+        return result(status, useDie);
+      }
+
+      case this.tok.T_PRINT:
+        return this.node("print")(this.next().read_expr());
+
+      // T_YIELD (expr (T_DOUBLE_ARROW expr)?)?
+      case this.tok.T_YIELD: {
+        let value = null;
+        let key = null;
+        result = this.node("yield");
+        if (this.next().is("EXPR")) {
+          // reads the yield return value
+          value = this.read_expr();
+          if (this.token === this.tok.T_DOUBLE_ARROW) {
+            // reads the yield returned key
+            key = value;
+            value = this.next().read_expr();
+          }
+        }
+        return result(value, key);
+      }
+
+      // T_YIELD_FROM expr
+      case this.tok.T_YIELD_FROM:
+        result = this.node("yieldfrom");
+        expr = this.next().read_expr();
+        return result(expr);
+
+      case this.tok.T_FUNCTION:
+        return this.read_function(true);
+
+      case this.tok.T_STATIC: {
+        const backup = [this.token, this.lexer.getState()];
+        if (this.next().token === this.tok.T_FUNCTION) {
+          // handles static function
+          return this.read_function(true, [0, 1, 0]);
+        } else {
+          // rollback
+          this.lexer.tokens.push(backup);
+          this.next();
+        }
+      }
+    }
+
+    // SCALAR | VARIABLE
+    if (this.is("VARIABLE")) {
+      result = this.node();
+      expr = this.read_variable(false, false, false);
+
+      // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L877
+      // should accept only a variable
+      const isConst =
+        expr.kind === "constref" ||
+        (expr.kind === "staticlookup" && expr.offset.kind === "constref");
+
+      // VARIABLES SPECIFIC OPERATIONS
+      switch (this.token) {
+        case "=": {
+          if (isConst) this.error("VARIABLE");
+          let right;
+          if (this.next().token == "&") {
+            if (this.next().token === this.tok.T_NEW) {
+              right = this.next().read_new_expr();
+            } else {
+              right = this.read_variable(false, false, true);
+            }
+          } else {
+            right = this.read_expr();
+          }
+          return result("assign", expr, right, "=");
+        }
+
+        // operations :
+        case this.tok.T_PLUS_EQUAL:
+          if (isConst) this.error("VARIABLE");
+          return result("assign", expr, this.next().read_expr(), "+=");
+
+        case this.tok.T_MINUS_EQUAL:
+          if (isConst) this.error("VARIABLE");
+          return result("assign", expr, this.next().read_expr(), "-=");
+
+        case this.tok.T_MUL_EQUAL:
+          if (isConst) this.error("VARIABLE");
+          return result("assign", expr, this.next().read_expr(), "*=");
+
+        case this.tok.T_POW_EQUAL:
+          if (isConst) this.error("VARIABLE");
+          return result("assign", expr, this.next().read_expr(), "**=");
+
+        case this.tok.T_DIV_EQUAL:
+          if (isConst) this.error("VARIABLE");
+          return result("assign", expr, this.next().read_expr(), "/=");
+
+        case this.tok.T_CONCAT_EQUAL:
+          if (isConst) this.error("VARIABLE");
+          return result("assign", expr, this.next().read_expr(), ".=");
+
+        case this.tok.T_MOD_EQUAL:
+          if (isConst) this.error("VARIABLE");
+          return result("assign", expr, this.next().read_expr(), "%=");
+
+        case this.tok.T_AND_EQUAL:
+          if (isConst) this.error("VARIABLE");
+          return result("assign", expr, this.next().read_expr(), "&=");
+
+        case this.tok.T_OR_EQUAL:
+          if (isConst) this.error("VARIABLE");
+          return result("assign", expr, this.next().read_expr(), "|=");
+
+        case this.tok.T_XOR_EQUAL:
+          if (isConst) this.error("VARIABLE");
+          return result("assign", expr, this.next().read_expr(), "^=");
+
+        case this.tok.T_SL_EQUAL:
+          if (isConst) this.error("VARIABLE");
+          return result("assign", expr, this.next().read_expr(), "<<=");
+
+        case this.tok.T_SR_EQUAL:
+          if (isConst) this.error("VARIABLE");
+          return result("assign", expr, this.next().read_expr(), ">>=");
+
+        case this.tok.T_INC:
+          if (isConst) this.error("VARIABLE");
+          this.next();
+          return result("post", "+", expr);
+        case this.tok.T_DEC:
+          if (isConst) this.error("VARIABLE");
+          this.next();
+          return result("post", "-", expr);
+      }
+    } else if (this.is("SCALAR")) {
+      result = this.node();
+      expr = this.read_scalar();
+      if (expr.kind === "array" && expr.shortForm && this.token === "=") {
+        // list assign
+        let list = this.node("list")(expr.items, true);
+        if (expr.loc) list.loc = expr.loc;
+        let right = this.next().read_expr();
+        return result("assign", list, right, "=");
+      }
+      // classic array
+      return this.handleDereferencable(expr);
+    } else {
+      this.error("EXPR");
+      this.next();
+    }
+
+    // returns variable | scalar
+    return expr;
+  },
+  /**
+   * ```ebnf
+   *    new_expr ::= T_NEW (namespace_name function_argument_list) | (T_CLASS ... class declaration)
+   * ```
+   * https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L850
+   */
+  read_new_expr: function() {
+    const result = this.node("new");
+    let args = [];
+    if (this.token === this.tok.T_CLASS) {
+      const what = this.node("class");
+      // Annonymous class declaration
+      let propExtends = null,
+        propImplements = null,
+        body = null;
+      if (this.next().token === "(") {
+        args = this.read_function_argument_list();
+      }
+      if (this.token == this.tok.T_EXTENDS) {
+        propExtends = this.next().read_namespace_name();
+      }
+      if (this.token == this.tok.T_IMPLEMENTS) {
+        propImplements = this.next().read_name_list();
+      }
+      if (this.expect("{")) {
+        body = this.next().read_class_body();
+      }
+      return result(
+        what(null, propExtends, propImplements, body, [0, 0, 0]),
+        args
+      );
+    }
+    // Already existing class
+    const name = this.read_class_name_reference();
+    if (this.token === "(") {
+      args = this.read_function_argument_list();
+    }
+    return result(name, args);
+  },
+  /**
+   * Reads a class name
+   * ```ebnf
+   * class_name_reference ::= namespace_name | variable
+   * ```
+   */
+  read_class_name_reference: function() {
+    if (
+      this.token === this.tok.T_NS_SEPARATOR ||
+      this.token === this.tok.T_STRING ||
+      this.token === this.tok.T_NAMESPACE
+    ) {
+      let result = this.read_namespace_name();
+      if (this.token === this.tok.T_DOUBLE_COLON) {
+        result = this.read_static_getter(result);
+      }
+      return result;
+    } else if (this.is("VARIABLE")) {
+      return this.read_variable(true, false, false);
+    } else {
+      this.expect([this.tok.T_STRING, "VARIABLE"]);
+    }
+  },
+  handleDereferencable: function(expr) {
+    while (this.token !== this.EOF) {
+      if (this.token === this.tok.T_OBJECT_OPERATOR) {
+        expr = this.recursive_variable_chain_scan(expr, false);
+      } else if (this.token === this.tok.T_CURLY_OPEN || this.token === "[") {
+        expr = this.read_dereferencable(expr);
+      } else if (this.token === "(") {
+        // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L1118
+        expr = this.node("call")(expr, this.read_function_argument_list());
+      } else {
+        return expr;
+      }
+    }
+    return expr;
+  }
+};
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/parser_function.js.html b/parser_function.js.html new file mode 100644 index 000000000..a8a762961 --- /dev/null +++ b/parser_function.js.html @@ -0,0 +1,368 @@ + + + + + + + + + + + parser/function.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ parser/function.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+module.exports = {
+  /**
+   * checks if current token is a reference keyword
+   */
+  is_reference: function() {
+    if (this.token == "&") {
+      this.next();
+      return true;
+    }
+    return false;
+  },
+  /**
+   * checks if current token is a variadic keyword
+   */
+  is_variadic: function() {
+    if (this.token === this.tok.T_ELLIPSIS) {
+      this.next();
+      return true;
+    }
+    return false;
+  },
+  /**
+   * reading a function
+   * ```ebnf
+   * function ::= function_declaration code_block
+   * ```
+   */
+  read_function: function(closure, flag) {
+    const result = this.read_function_declaration(
+      closure ? 1 : flag ? 2 : 0,
+      flag && flag[1] === 1
+    );
+    if (flag && flag[2] == 1) {
+      // abstract function :
+      result.parseFlags(flag);
+      if (this.expect(";")) {
+        this.next();
+      }
+    } else {
+      if (this.expect("{")) {
+        result.body = this.read_code_block(false);
+        if (result.loc && result.body.loc) {
+          result.loc.end = result.body.loc.end;
+        }
+      }
+      if (!closure && flag) {
+        result.parseFlags(flag);
+      }
+    }
+    return result;
+  },
+  /**
+   * reads a function declaration (without his body)
+   * ```ebnf
+   * function_declaration ::= T_FUNCTION '&'?  T_STRING '(' parameter_list ')'
+   * ```
+   */
+  read_function_declaration: function(type, isStatic) {
+    let nodeName = "function";
+    if (type === 1) {
+      nodeName = "closure";
+    } else if (type === 2) {
+      nodeName = "method";
+    }
+    const result = this.node(nodeName);
+
+    if (this.expect(this.tok.T_FUNCTION)) {
+      this.next();
+    }
+    const isRef = this.is_reference();
+    let name = false,
+      use = [],
+      returnType = null,
+      nullable = false;
+    if (type !== 1) {
+      if (type === 2) {
+        if (
+          this.token === this.tok.T_STRING ||
+          (this.php7 && this.is("IDENTIFIER"))
+        ) {
+          name = this.text();
+          this.next();
+        } else {
+          this.error("IDENTIFIER");
+        }
+      } else {
+        if (this.expect(this.tok.T_STRING)) {
+          name = this.text();
+        }
+        this.next();
+      }
+    }
+    if (this.expect("(")) this.next();
+    const params = this.read_parameter_list();
+    if (this.expect(")")) this.next();
+    if (type === 1 && this.token === this.tok.T_USE) {
+      if (this.next().expect("(")) this.next();
+      use = this.read_list(this.read_lexical_var, ",");
+      if (this.expect(")")) this.next();
+    }
+    if (this.token === ":") {
+      if (this.next().token === "?") {
+        nullable = true;
+        this.next();
+      }
+      returnType = this.read_type();
+    }
+    if (type === 1) {
+      // closure
+      return result(params, isRef, use, returnType, nullable, isStatic);
+    }
+    return result(name, params, isRef, returnType, nullable);
+  },
+  /**
+   * ```ebnf
+   * lexical_var ::= '&'? T_VARIABLE
+   * ```
+   */
+  read_lexical_var: function() {
+    const result = this.node("variable");
+    let isRef = false;
+    if (this.token === "&") {
+      isRef = true;
+      this.next();
+    }
+    this.expect(this.tok.T_VARIABLE);
+    const name = this.text().substring(1);
+    this.next();
+    return result(name, isRef, false);
+  },
+  /**
+   * reads a list of parameters
+   * ```ebnf
+   *  parameter_list ::= (parameter ',')* parameter?
+   * ```
+   */
+  read_parameter_list: function() {
+    const result = [];
+    if (this.token != ")") {
+      while (this.token != this.EOF) {
+        result.push(this.read_parameter());
+        if (this.token == ",") {
+          this.next();
+        } else if (this.token == ")") {
+          break;
+        } else {
+          this.error([",", ")"]);
+          break;
+        }
+      }
+    }
+    return result;
+  },
+  /**
+   * ```ebnf
+   *  parameter ::= type? '&'? T_ELLIPSIS? T_VARIABLE ('=' expr)?
+   * ```
+   * @see https://github.com/php/php-src/blob/493524454d66adde84e00d249d607ecd540de99f/Zend/zend_language_parser.y#L640
+   */
+  read_parameter: function() {
+    const node = this.node("parameter");
+    let name = null;
+    let value = null;
+    let type = null;
+    let nullable = false;
+    if (this.token === "?") {
+      this.next();
+      nullable = true;
+    }
+    type = this.read_type();
+    if (nullable && !type) {
+      this.raiseError(
+        "Expecting a type definition combined with nullable operator"
+      );
+    }
+    const isRef = this.is_reference();
+    const isVariadic = this.is_variadic();
+    if (this.expect(this.tok.T_VARIABLE)) {
+      name = this.text().substring(1);
+      this.next();
+    }
+    if (this.token == "=") {
+      value = this.next().read_expr();
+    }
+    return node(name, type, value, isRef, isVariadic, nullable);
+  },
+  /**
+   * Reads a list of arguments
+   * ```ebnf
+   *  function_argument_list ::= '(' (argument_list (',' argument_list)*)? ')'
+   * ```
+   */
+  read_function_argument_list: function() {
+    const result = [];
+    let wasVariadic = false;
+    this.expect("(") && this.next();
+    if (this.token !== ")") {
+      while (this.token != this.EOF) {
+        const argument = this.read_argument_list();
+        if (argument) {
+          result.push(argument);
+          if (argument.kind === "variadic") {
+            wasVariadic = true;
+          } else if (wasVariadic) {
+            this.raiseError("Unexpected argument after a variadic argument");
+          }
+        }
+        if (this.token === ",") {
+          this.next();
+        } else break;
+      }
+    }
+    this.expect(")") && this.next();
+    return result;
+  },
+  /**
+   * ```ebnf
+   *    argument_list ::= T_ELLIPSIS? expr
+   * ```
+   */
+  read_argument_list: function() {
+    if (this.token === this.tok.T_ELLIPSIS) {
+      return this.node("variadic")(this.next().read_expr());
+    }
+    return this.read_expr();
+  },
+  /**
+   * read type hinting
+   * ```ebnf
+   *  type ::= T_ARRAY | T_CALLABLE | namespace_name
+   * ```
+   */
+  read_type: function() {
+    const result = this.node("identifier");
+    switch (this.token) {
+      case this.tok.T_ARRAY:
+        this.next();
+        return result(["", "array"], false);
+      case this.tok.T_NAMESPACE:
+      case this.tok.T_NS_SEPARATOR:
+      case this.tok.T_STRING:
+        return this.read_namespace_name();
+      case this.tok.T_CALLABLE:
+        this.next();
+        return result(["", "callable"], false);
+      default:
+        return null;
+    }
+  }
+};
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/parser_if.js.html b/parser_if.js.html new file mode 100644 index 000000000..f8d85e537 --- /dev/null +++ b/parser_if.js.html @@ -0,0 +1,209 @@ + + + + + + + + + + + parser/if.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ parser/if.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+module.exports = {
+  /**
+   * Reads an IF statement
+   *
+   * ```ebnf
+   *  if ::= T_IF '(' expr ')' ':' ...
+   * ```
+   */
+  read_if: function() {
+    const result = this.node("if");
+    let body = null;
+    let alternate = null;
+    let shortForm = false;
+    let test = null;
+    test = this.next().read_if_expr();
+
+    if (this.token === ":") {
+      shortForm = true;
+      this.next();
+      body = this.node("block");
+      const items = [];
+      while (this.token !== this.EOF && this.token !== this.tok.T_ENDIF) {
+        if (this.token === this.tok.T_ELSEIF) {
+          alternate = this.read_elseif_short();
+          break;
+        } else if (this.token === this.tok.T_ELSE) {
+          alternate = this.read_else_short();
+          break;
+        }
+        items.push(this.read_inner_statement());
+      }
+      body = body(null, items);
+      this.expect(this.tok.T_ENDIF) && this.next();
+      this.expectEndOfStatement();
+    } else {
+      body = this.read_statement();
+      if (this.token === this.tok.T_ELSEIF) {
+        alternate = this.read_if();
+      } else if (this.token === this.tok.T_ELSE) {
+        alternate = this.next().read_statement();
+      }
+    }
+    return result(test, body, alternate, shortForm);
+  },
+  /**
+   * reads an if expression : '(' expr ')'
+   */
+  read_if_expr: function() {
+    this.expect("(") && this.next();
+    const result = this.read_expr();
+    this.expect(")") && this.next();
+    return result;
+  },
+  /**
+   * reads an elseif (expr): statements
+   */
+  read_elseif_short: function() {
+    const result = this.node("if");
+    let alternate = null;
+    let test = null;
+    let body = null;
+    const items = [];
+    test = this.next().read_if_expr();
+    if (this.expect(":")) this.next();
+    body = this.node("block");
+    while (this.token != this.EOF && this.token !== this.tok.T_ENDIF) {
+      if (this.token === this.tok.T_ELSEIF) {
+        alternate = this.read_elseif_short();
+        break;
+      } else if (this.token === this.tok.T_ELSE) {
+        alternate = this.read_else_short();
+        break;
+      }
+      items.push(this.read_inner_statement());
+    }
+    body = body(null, items);
+    return result(test, body, alternate, true);
+  },
+  /**
+   *
+   */
+  read_else_short: function() {
+    const body = this.node("block");
+    if (this.next().expect(":")) this.next();
+    const items = [];
+    while (this.token != this.EOF && this.token !== this.tok.T_ENDIF) {
+      items.push(this.read_inner_statement());
+    }
+    return body(null, items);
+  }
+};
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/parser_loops.js.html b/parser_loops.js.html new file mode 100644 index 000000000..bb868ca89 --- /dev/null +++ b/parser_loops.js.html @@ -0,0 +1,275 @@ + + + + + + + + + + + parser/loops.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ parser/loops.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+module.exports = {
+  /**
+   * Reads a while statement
+   * ```ebnf
+   * while ::= T_WHILE (statement | ':' inner_statement_list T_ENDWHILE ';')
+   * ```
+   * @see https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L587
+   * @return {While}
+   */
+  read_while: function() {
+    const result = this.node("while");
+    let test = null;
+    let body = null;
+    let shortForm = false;
+    if (this.expect("(")) this.next();
+    test = this.read_expr();
+    if (this.expect(")")) this.next();
+    if (this.token === ":") {
+      shortForm = true;
+      body = this.read_short_form(this.tok.T_ENDWHILE);
+    } else {
+      body = this.read_statement();
+    }
+    return result(test, body, shortForm);
+  },
+  /**
+   * Reads a do / while loop
+   * ```ebnf
+   * do ::= T_DO statement T_WHILE '(' expr ')' ';'
+   * ```
+   * @see https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L423
+   * @return {Do}
+   */
+  read_do: function() {
+    const result = this.node("do");
+    let test = null;
+    let body = null;
+    body = this.read_statement();
+    if (this.expect(this.tok.T_WHILE)) {
+      if (this.next().expect("(")) this.next();
+      test = this.read_expr();
+      if (this.expect(")")) this.next();
+      if (this.expect(";")) this.next();
+    }
+    return result(test, body);
+  },
+  /**
+   * Read a for incremental loop
+   * ```ebnf
+   * for ::= T_FOR '(' for_exprs ';' for_exprs ';' for_exprs ')' for_statement
+   * for_statement ::= statement | ':' inner_statement_list T_ENDFOR ';'
+   * for_exprs ::= expr? (',' expr)*
+   * ```
+   * @see https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L425
+   * @return {For}
+   */
+  read_for: function() {
+    const result = this.node("for");
+    let init = [];
+    let test = [];
+    let increment = [];
+    let body = null;
+    let shortForm = false;
+    if (this.expect("(")) this.next();
+    if (this.token !== ";") {
+      init = this.read_list(this.read_expr, ",");
+      if (this.expect(";")) this.next();
+    } else {
+      this.next();
+    }
+    if (this.token !== ";") {
+      test = this.read_list(this.read_expr, ",");
+      if (this.expect(";")) this.next();
+    } else {
+      this.next();
+    }
+    if (this.token !== ")") {
+      increment = this.read_list(this.read_expr, ",");
+      if (this.expect(")")) this.next();
+    } else {
+      this.next();
+    }
+    if (this.token === ":") {
+      shortForm = true;
+      body = this.read_short_form(this.tok.T_ENDFOR);
+    } else {
+      body = this.read_statement();
+    }
+    return result(init, test, increment, body, shortForm);
+  },
+  /**
+   * Reads a foreach loop
+   * ```ebnf
+   * foreach ::= '(' expr T_AS foreach_variable (T_DOUBLE_ARROW foreach_variable)? ')' statement
+   * ```
+   * @see https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L438
+   * @return {Foreach}
+   */
+  read_foreach: function() {
+    const result = this.node("foreach");
+    let source = null;
+    let key = null;
+    let value = null;
+    let body = null;
+    let shortForm = false;
+    if (this.expect("(")) this.next();
+    source = this.read_expr();
+    if (this.expect(this.tok.T_AS)) {
+      this.next();
+      value = this.read_foreach_variable();
+      if (this.token === this.tok.T_DOUBLE_ARROW) {
+        key = value;
+        value = this.next().read_foreach_variable();
+      }
+    }
+
+    // grammatically correct but not supported by PHP
+    if (key && key.kind === "list") {
+      this.raiseError("Fatal Error : Cannot use list as key element");
+    }
+
+    if (this.expect(")")) this.next();
+
+    if (this.token === ":") {
+      shortForm = true;
+      body = this.read_short_form(this.tok.T_ENDFOREACH);
+    } else {
+      body = this.read_statement();
+    }
+    return result(source, key, value, body, shortForm);
+  },
+  /**
+   * Reads a foreach variable statement
+   * ```ebnf
+   * foreach_variable =
+   *    variable |
+   *    '&' variable |
+   *    T_LIST '(' assignment_list ')' |
+   *    '[' assignment_list ']'
+   * ```
+   * @see https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L544
+   * @return {Expression}
+   */
+  read_foreach_variable: function() {
+    if (this.token === this.tok.T_LIST || this.token === "[") {
+      const isShort = this.token === "[";
+      const result = this.node("list");
+      this.next();
+      if (!isShort && this.expect("(")) this.next();
+      const assignList = this.read_array_pair_list(isShort);
+      if (this.expect(isShort ? "]" : ")")) this.next();
+      return result(assignList, isShort);
+    } else {
+      return this.read_variable(false, false, false);
+    }
+  }
+};
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/parser_main.js.html b/parser_main.js.html new file mode 100644 index 000000000..fd45bb0fc --- /dev/null +++ b/parser_main.js.html @@ -0,0 +1,132 @@ + + + + + + + + + + + parser/main.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ parser/main.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+module.exports = {
+  /**
+   * ```ebnf
+   * start ::= (namespace | top_statement)*
+   * ```
+   */
+  read_start: function() {
+    if (this.token == this.tok.T_NAMESPACE) {
+      return this.read_namespace();
+    } else {
+      return this.read_top_statement();
+    }
+  }
+};
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/parser_namespace.js.html b/parser_namespace.js.html new file mode 100644 index 000000000..7b03a308a --- /dev/null +++ b/parser_namespace.js.html @@ -0,0 +1,283 @@ + + + + + + + + + + + parser/namespace.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ parser/namespace.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+module.exports = {
+  /**
+   * Reads a namespace declaration block
+   * ```ebnf
+   * namespace ::= T_NAMESPACE namespace_name? '{'
+   *    top_statements
+   * '}'
+   * | T_NAMESPACE namespace_name ';' top_statements
+   * ```
+   * @see http://php.net/manual/en/language.namespaces.php
+   * @return {Namespace}
+   */
+  read_namespace: function() {
+    const result = this.node("namespace");
+    let body;
+    this.expect(this.tok.T_NAMESPACE) && this.next();
+    if (this.token == "{") {
+      this.currentNamespace = [""];
+      body = this.next().read_top_statements();
+      this.expect("}") && this.next();
+      return result([""], body, true);
+    } else {
+      const name = this.read_namespace_name();
+      if (this.token == ";") {
+        this.currentNamespace = name;
+        body = this.next().read_top_statements();
+        this.expect(this.EOF);
+        return result(name.name, body, false);
+      } else if (this.token == "{") {
+        this.currentNamespace = name;
+        body = this.next().read_top_statements();
+        this.expect("}") && this.next();
+        return result(name.name, body, true);
+      } else if (this.token === "(") {
+        // resolve ambuiguity between namespace & function call
+        name.resolution = this.ast.identifier.RELATIVE_NAME;
+        name.name = name.name.substring(1);
+        return this.node("call")(name, this.read_function_argument_list());
+      } else {
+        this.error(["{", ";"]);
+        // graceful mode :
+        this.currentNamespace = name;
+        body = this.read_top_statements();
+        this.expect(this.EOF);
+        return result(name, body, false);
+      }
+    }
+  },
+  /**
+   * Reads a namespace name
+   * ```ebnf
+   *  namespace_name ::= T_NS_SEPARATOR? (T_STRING T_NS_SEPARATOR)* T_STRING
+   * ```
+   * @see http://php.net/manual/en/language.namespaces.rules.php
+   * @return {Identifier}
+   */
+  read_namespace_name: function() {
+    const result = this.node("identifier");
+    let relative = false;
+    if (this.token === this.tok.T_NAMESPACE) {
+      this.next().expect(this.tok.T_NS_SEPARATOR) && this.next();
+      relative = true;
+    }
+    return result(
+      this.read_list(this.tok.T_STRING, this.tok.T_NS_SEPARATOR, true),
+      relative
+    );
+  },
+  /**
+   * Reads a use statement
+   * ```ebnf
+   * use_statement ::= T_USE
+   *   use_type? use_declarations |
+   *   use_type use_statement '{' use_declarations '}' |
+   *   use_statement '{' use_declarations(=>typed) '}'
+   * ';'
+   * ```
+   * @see http://php.net/manual/en/language.namespaces.importing.php
+   * @return {UseGroup}
+   */
+  read_use_statement: function() {
+    let result = this.node("usegroup");
+    let items = [];
+    let name = null;
+    this.expect(this.tok.T_USE) && this.next();
+    const type = this.read_use_type();
+    items.push(this.read_use_declaration(false));
+    if (this.token === ",") {
+      items = items.concat(this.next().read_use_declarations(false));
+    } else if (this.token === "{") {
+      name = items[0].name;
+      items = this.next().read_use_declarations(type === null);
+      this.expect("}") && this.next();
+    }
+    result = result(name, type, items);
+    this.expect(";") && this.next();
+    return result;
+  },
+  /**
+   * Reads a use declaration
+   * ```ebnf
+   * use_declaration ::= use_type? namespace_name use_alias
+   * ```
+   * @see https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L380
+   * @return {UseItem}
+   */
+  read_use_declaration: function(typed) {
+    const result = this.node("useitem");
+    let type = null;
+    if (typed) type = this.read_use_type();
+    const name = this.read_namespace_name();
+    const alias = this.read_use_alias();
+    return result(name.name, alias, type);
+  },
+  /**
+   * Reads a list of use declarations
+   * ```ebnf
+   * use_declarations ::= use_declaration (',' use_declaration)*
+   * ```
+   * @see https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L380
+   * @return {UseItem[]}
+   */
+  read_use_declarations: function(typed) {
+    const result = [this.read_use_declaration(typed)];
+    while (this.token === ",") {
+      result.push(this.next().read_use_declaration(typed));
+    }
+    return result;
+  },
+  /**
+   * Reads a use statement
+   * ```ebnf
+   * use_alias ::= (T_AS T_STRING)?
+   * ```
+   * @return {String|null}
+   */
+  read_use_alias: function() {
+    let result = null;
+    if (this.token === this.tok.T_AS) {
+      if (this.next().expect(this.tok.T_STRING)) {
+        result = this.text();
+        this.next();
+      }
+    }
+    return result;
+  },
+  /**
+   * Reads the namespace type declaration
+   * ```ebnf
+   * use_type ::= (T_FUNCTION | T_CONST)?
+   * ```
+   * @see https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L335
+   * @return {String|null} Possible values : function, const
+   */
+  read_use_type: function() {
+    if (this.token === this.tok.T_FUNCTION) {
+      this.next();
+      return this.ast.useitem.TYPE_FUNCTION;
+    } else if (this.token === this.tok.T_CONST) {
+      this.next();
+      return this.ast.useitem.TYPE_CONST;
+    }
+    return null;
+  }
+};
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/parser_scalar.js.html b/parser_scalar.js.html new file mode 100644 index 000000000..f5e27282d --- /dev/null +++ b/parser_scalar.js.html @@ -0,0 +1,418 @@ + + + + + + + + + + + parser/scalar.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ parser/scalar.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+const specialChar = {
+  "\\r": "\r",
+  "\\n": "\n",
+  "\\t": "\t",
+  "\\v": String.fromCharCode(11),
+  "\\e": String.fromCharCode(27),
+  "\\f": String.fromCharCode(12),
+  "\\\\": "\\",
+  "\\$": "$",
+  '\\"': '"',
+  "\\'": "'"
+};
+
+module.exports = {
+  /**
+   * Unescape special chars
+   */
+  resolve_special_chars: function(text, doubleQuote) {
+    if (!doubleQuote) {
+      // single quote fix
+      return text.replace(/\\['\\]/g, function(seq) {
+        return specialChar[seq];
+      });
+    }
+    return text.replace(/\\[rntvef"'\\$]/g, function(seq) {
+      return specialChar[seq];
+    });
+  },
+  /**
+   * ```ebnf
+   *  scalar ::= T_MAGIC_CONST
+   *       | T_LNUMBER | T_DNUMBER
+   *       | T_START_HEREDOC T_ENCAPSED_AND_WHITESPACE? T_END_HEREDOC
+   *       | '"' encaps_list '"'
+   *       | T_START_HEREDOC encaps_list T_END_HEREDOC
+   *       | namespace_name (T_DOUBLE_COLON T_STRING)?
+   * ```
+   */
+  read_scalar: function() {
+    if (this.is("T_MAGIC_CONST")) {
+      return this.get_magic_constant();
+    } else {
+      let value, node;
+      switch (this.token) {
+        // TEXTS
+        case this.tok.T_CONSTANT_ENCAPSED_STRING: {
+          value = this.node("string");
+          const text = this.text();
+          let offset = 0;
+          if (text[0] === "b" || text[0] === "B") {
+            offset = 1;
+          }
+          const isDoubleQuote = text[offset] === '"';
+          this.next();
+          value = value(
+            isDoubleQuote,
+            this.resolve_special_chars(
+              text.substring(offset + 1, text.length - 1),
+              isDoubleQuote
+            ),
+            offset === 1, // unicode flag
+            text
+          );
+          if (this.token === this.tok.T_DOUBLE_COLON) {
+            // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L1151
+            return this.read_static_getter(value);
+          } else {
+            // dirrect string
+            return value;
+          }
+        }
+        case this.tok.T_START_HEREDOC:
+          if (this.lexer.curCondition === "ST_NOWDOC") {
+            const start = this.lexer.yylloc.first_offset;
+            node = this.node("nowdoc");
+            value = this.next().text();
+            // strip the last line return char
+            const lastCh = value[value.length - 1];
+            if (lastCh === "\n") {
+              if (value[value.length - 2] === "\r") {
+                // windows style
+                value = value.substring(0, value.length - 2);
+              } else {
+                // linux style
+                value = value.substring(0, value.length - 1);
+              }
+            } else if (lastCh === "\r") {
+              // mac style
+              value = value.substring(0, value.length - 1);
+            }
+            this.expect(this.tok.T_ENCAPSED_AND_WHITESPACE) && this.next();
+            const raw = this.lexer._input.substring(
+              start,
+              this.lexer.yylloc.last_offset
+            );
+            node = node(
+              value,
+              raw,
+              this.lexer.heredoc_label,
+              raw[3] === '"' || raw[3] === "'"
+            );
+            this.expect(this.tok.T_END_HEREDOC) && this.next();
+            return node;
+          } else {
+            return this.next().read_encapsed_string(this.tok.T_END_HEREDOC);
+          }
+
+        case '"':
+          return this.next().read_encapsed_string('"');
+
+        case 'b"':
+        case 'B"': {
+          this.next();
+          this.lexer.yylloc.prev_offset -= 1;
+          return this.read_encapsed_string('"');
+        }
+
+        // NUMERIC
+        case this.tok.T_LNUMBER: // long
+        case this.tok.T_DNUMBER: {
+          // double
+          const result = this.node("number");
+          value = this.text();
+          this.next();
+          return result(value, null);
+        }
+
+        // ARRAYS
+        case this.tok.T_ARRAY: // array parser
+          return this.read_array();
+        case "[": // short array format
+          return this.read_array();
+        default: {
+          const err = this.error("SCALAR");
+          // graceful mode : ignore token & return error node
+          this.next();
+          return err;
+        }
+      }
+    }
+  },
+  /**
+   * Handles the dereferencing
+   */
+  read_dereferencable: function(expr) {
+    let result, offset;
+    const node = this.node("offsetlookup");
+    if (this.token === "[") {
+      offset = this.next().read_expr();
+      if (this.expect("]")) this.next();
+      result = node(expr, offset);
+    } else if (this.token === this.tok.T_DOLLAR_OPEN_CURLY_BRACES) {
+      offset = this.read_encapsed_string_item(false);
+      result = node(expr, offset);
+    }
+    return result;
+  },
+  /**
+   * Reads and extracts an encapsed item
+   * ```ebnf
+   * encapsed_string_item ::= T_ENCAPSED_AND_WHITESPACE
+   *  | T_DOLLAR_OPEN_CURLY_BRACES expr '}'
+   *  | T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME '}'
+   *  | T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME '[' expr ']' '}'
+   *  | T_CURLY_OPEN variable '}'
+   *  | variable
+   *  | variable '[' expr ']'
+   *  | variable T_OBJECT_OPERATOR T_STRING
+   * ```
+   * @return {String|Variable|Expr|Lookup}
+   * @see https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L1219
+   */
+  read_encapsed_string_item: function(isDoubleQuote) {
+    let result = this.node(),
+      offset,
+      node,
+      name;
+
+    // plain text
+    // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L1222
+    if (this.token === this.tok.T_ENCAPSED_AND_WHITESPACE) {
+      const text = this.text();
+      this.next();
+      result = result(
+        "string",
+        false,
+        this.resolve_special_chars(text, isDoubleQuote),
+        false,
+        text
+      );
+    } else if (this.token === this.tok.T_DOLLAR_OPEN_CURLY_BRACES) {
+      // dynamic variable name
+      // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L1239
+      name = null;
+      if (this.next().token === this.tok.T_STRING_VARNAME) {
+        const varName = this.text();
+        name = this.node("variable");
+        this.next();
+        // check if lookup an offset
+        // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L1243
+        if (this.token === "[") {
+          name = name(varName, false);
+          node = this.node("offsetlookup");
+          offset = this.next().read_expr();
+          this.expect("]") && this.next();
+          name = node(name, offset);
+        } else {
+          name = this.node("constref")(varName);
+        }
+      } else {
+        name = this.read_expr();
+      }
+      this.expect("}") && this.next();
+      result = result("variable", name, false, true);
+    } else if (this.token === this.tok.T_CURLY_OPEN) {
+      // expression
+      // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L1246
+      result = this.next().read_variable(false, false, false);
+      if (result.kind === "variable") {
+        result.curly = true;
+      }
+      this.expect("}") && this.next();
+    } else if (this.token === this.tok.T_VARIABLE) {
+      // plain variable
+      // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L1231
+      result = this.read_simple_variable(false);
+
+      // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L1233
+      if (this.token === "[") {
+        node = this.node("offsetlookup");
+        offset = this.next().read_encaps_var_offset();
+        this.expect("]") && this.next();
+        result = node(result, offset);
+      }
+
+      // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L1236
+      if (this.token === this.tok.T_OBJECT_OPERATOR) {
+        node = this.node("propertylookup");
+        const what = this.node("constref");
+        this.next().expect(this.tok.T_STRING);
+        name = this.text();
+        this.next();
+        result = node(result, what(name));
+      }
+
+      // error / fallback
+    } else {
+      this.expect(this.tok.T_ENCAPSED_AND_WHITESPACE);
+      const value = this.text();
+      this.next();
+      // consider it as string
+      result = result("string", false, value, false, value);
+    }
+
+    return result;
+  },
+  /**
+   * Reads an encapsed string
+   */
+  read_encapsed_string: function(expect) {
+    const start = this.lexer.yylloc.prev_offset;
+    let node = this.node("encapsed");
+    const value = [];
+    let type = null;
+
+    if (expect === "`") {
+      type = this.ast.encapsed.TYPE_SHELL;
+    } else if (expect === '"') {
+      type = this.ast.encapsed.TYPE_STRING;
+    } else {
+      type = this.ast.encapsed.TYPE_HEREDOC;
+    }
+
+    // reading encapsed parts
+    while (this.token !== expect && this.token !== this.EOF) {
+      value.push(this.read_encapsed_string_item(true));
+    }
+
+    this.expect(expect) && this.next();
+    node = node(
+      value,
+      this.lexer._input.substring(start - 1, this.lexer.yylloc.first_offset),
+      type
+    );
+
+    if (expect === this.tok.T_END_HEREDOC) {
+      node.label = this.lexer.heredoc_label;
+    }
+    return node;
+  },
+  /**
+   * Constant token
+   */
+  get_magic_constant: function() {
+    const result = this.node("magic");
+    const name = this.text();
+    this.next();
+    return result(name.toUpperCase(), name);
+  }
+};
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/parser_statement.js.html b/parser_statement.js.html new file mode 100644 index 000000000..fefb1b43e --- /dev/null +++ b/parser_statement.js.html @@ -0,0 +1,514 @@ + + + + + + + + + + + parser/statement.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ parser/statement.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+module.exports = {
+  /**
+   * reading a list of top statements (helper for top_statement*)
+   * ```ebnf
+   *  top_statements ::= top_statement*
+   * ```
+   */
+  read_top_statements: function() {
+    let result = [];
+    while (this.token !== this.EOF && this.token !== "}") {
+      const statement = this.read_top_statement();
+      if (statement) {
+        if (Array.isArray(statement)) {
+          result = result.concat(statement);
+        } else {
+          result.push(statement);
+        }
+      }
+    }
+    return result;
+  },
+  /**
+   * reading a top statement
+   * ```ebnf
+   *  top_statement ::=
+   *       namespace | function | class
+   *       | interface | trait
+   *       | use_statements | const_list
+   *       | statement
+   * ```
+   */
+  read_top_statement: function() {
+    switch (this.token) {
+      case this.tok.T_FUNCTION:
+        return this.read_function(false, false);
+      // optional flags
+      case this.tok.T_ABSTRACT:
+      case this.tok.T_FINAL: {
+        const flag = this.read_class_scope();
+        if (this.token === this.tok.T_CLASS) {
+          return this.read_class(flag);
+        } else {
+          this.error(this.tok.T_CLASS);
+          this.next();
+          return null;
+        }
+      }
+      case this.tok.T_CLASS:
+        return this.read_class([0, 0, 0]);
+      case this.tok.T_INTERFACE:
+        return this.read_interface();
+      case this.tok.T_TRAIT:
+        return this.read_trait();
+      case this.tok.T_USE:
+        return this.read_use_statement();
+      case this.tok.T_CONST:
+        return this.next().read_const_list();
+      case this.tok.T_NAMESPACE:
+        return this.read_namespace();
+      case this.tok.T_HALT_COMPILER: {
+        const result = this.node("halt");
+        if (this.next().expect("(")) this.next();
+        if (this.expect(")")) this.next();
+        this.expect(";");
+        this.lexer.done = true;
+        return result(this.lexer._input.substring(this.lexer.offset));
+      }
+      default:
+        return this.read_statement();
+    }
+  },
+  /**
+   * reads a list of simple inner statements (helper for inner_statement*)
+   * ```ebnf
+   *  inner_statements ::= inner_statement*
+   * ```
+   */
+  read_inner_statements: function() {
+    let result = [];
+    while (this.token != this.EOF && this.token !== "}") {
+      const statement = this.read_inner_statement();
+      if (statement) {
+        if (Array.isArray(statement)) {
+          result = result.concat(statement);
+        } else {
+          result.push(statement);
+        }
+      }
+    }
+    return result;
+  },
+  /**
+   * Reads a list of constants declaration
+   * ```ebnf
+   *   const_list ::= T_CONST T_STRING '=' expr (',' T_STRING '=' expr)* ';'
+   * ```
+   */
+  read_const_list: function() {
+    const result = this.read_list(
+      function() {
+        this.expect(this.tok.T_STRING);
+        const result = this.node("constant");
+        const name = this.text();
+        if (this.next().expect("=")) {
+          return result(name, this.next().read_expr());
+        } else {
+          // fallback
+          return result(name, null);
+        }
+      },
+      ",",
+      false
+    );
+    this.expectEndOfStatement();
+    return result;
+  },
+  /**
+   * Reads a list of constants declaration
+   * ```ebnf
+   *   declare_list ::= T_STRING '=' expr (',' T_STRING '=' expr)*
+   * ```
+   * @retrurn {Object}
+   */
+  read_declare_list: function() {
+    const result = {};
+    while (this.token != this.EOF && this.token !== ")") {
+      this.expect(this.tok.T_STRING);
+      const name = this.text().toLowerCase();
+      if (this.next().expect("=")) {
+        result[name] = this.next().read_expr();
+      } else {
+        result[name] = null;
+      }
+      if (this.token !== ",") break;
+      this.next();
+    }
+    return result;
+  },
+  /**
+   * reads a simple inner statement
+   * ```ebnf
+   *  inner_statement ::= '{' inner_statements '}' | token
+   * ```
+   */
+  read_inner_statement: function() {
+    switch (this.token) {
+      case this.tok.T_FUNCTION:
+        return this.read_function(false, false);
+      // optional flags
+      case this.tok.T_ABSTRACT:
+      case this.tok.T_FINAL: {
+        const flag = this.read_class_scope();
+        if (this.token === this.tok.T_CLASS) {
+          return this.read_class(flag);
+        } else {
+          this.error(this.tok.T_CLASS);
+          // graceful mode : ignore token & go next
+          this.next();
+          return null;
+        }
+      }
+      case this.tok.T_CLASS:
+        return this.read_class([0, 0, 0]);
+      case this.tok.T_INTERFACE:
+        return this.read_interface();
+      case this.tok.T_TRAIT:
+        return this.read_trait();
+      case this.tok.T_HALT_COMPILER: {
+        this.raiseError(
+          "__HALT_COMPILER() can only be used from the outermost scope"
+        );
+        // fallback : returns a node but does not stop the parsing
+        let node = this.node("halt");
+        this.next().expect("(") && this.next();
+        this.expect(")") && this.next();
+        node = node(this.lexer._input.substring(this.lexer.offset));
+        this.expect(";") && this.next();
+        return node;
+      }
+      default:
+        return this.read_statement();
+    }
+  },
+  /**
+   * Reads statements
+   */
+  read_statement: function() {
+    let result, expr, items, current, label;
+    switch (this.token) {
+      case "{":
+        return this.read_code_block(false);
+
+      case this.tok.T_IF:
+        return this.read_if();
+
+      case this.tok.T_SWITCH:
+        return this.read_switch();
+
+      case this.tok.T_FOR:
+        return this.next().read_for();
+
+      case this.tok.T_FOREACH:
+        return this.next().read_foreach();
+
+      case this.tok.T_WHILE:
+        return this.next().read_while();
+
+      case this.tok.T_DO:
+        return this.next().read_do();
+
+      case this.tok.T_COMMENT:
+        return this.read_comment();
+
+      case this.tok.T_DOC_COMMENT:
+        return this.read_doc_comment();
+
+      case this.tok.T_RETURN:
+        result = this.node("return");
+        expr = null;
+        if (!this.next().is("EOS")) {
+          expr = this.read_expr();
+        }
+        this.expectEndOfStatement();
+        return result(expr);
+
+      // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L429
+      case this.tok.T_BREAK:
+      case this.tok.T_CONTINUE: {
+        result = this.node(
+          this.token === this.tok.T_CONTINUE ? "continue" : "break"
+        );
+        let level = null;
+        this.next(); // look ahead
+        if (this.token !== ";") {
+          level = this.read_expr();
+        }
+        this.expectEndOfStatement();
+        return result(level);
+      }
+
+      case this.tok.T_GLOBAL:
+        result = this.node("global");
+        items = this.next().read_list(this.read_simple_variable, ",");
+        this.expectEndOfStatement();
+        return result(items);
+
+      case this.tok.T_STATIC:
+        current = [this.token, this.lexer.getState()];
+        result = this.node("static");
+        if (this.next().token === this.tok.T_DOUBLE_COLON) {
+          // static keyword for a class
+          this.lexer.tokens.push(current);
+          expr = this.next().read_expr();
+          this.expect(";") && this.next();
+          return expr;
+        }
+        if (this.token === this.tok.T_FUNCTION) {
+          return this.read_function(true, [0, 1, 0]);
+        }
+        items = this.read_variable_declarations();
+        this.expectEndOfStatement();
+        return result(items);
+
+      case this.tok.T_ECHO: {
+        result = this.node("echo");
+        const text = this.text();
+        const shortForm = text === "<?=" || text === "<%=";
+        const args = this.next().read_list(this.read_expr, ",");
+        this.expectEndOfStatement();
+        return result(args, shortForm);
+      }
+
+      case this.tok.T_INLINE_HTML: {
+        const value = this.text();
+        let prevChar =
+          this.lexer.yylloc.first_offset > 0
+            ? this.lexer._input[this.lexer.yylloc.first_offset - 1]
+            : null;
+        const fixFirstLine = prevChar === "\r" || prevChar === "\n";
+        // revert back the first stripped line
+        if (fixFirstLine) {
+          if (
+            prevChar === "\n" &&
+            this.lexer.yylloc.first_offset > 1 &&
+            this.lexer._input[this.lexer.yylloc.first_offset - 2] === "\r"
+          ) {
+            prevChar = "\r\n";
+          }
+        }
+        result = this.node("inline");
+        this.next();
+        return result(value, fixFirstLine ? prevChar + value : value);
+      }
+
+      case this.tok.T_UNSET:
+        result = this.node("unset");
+        this.next().expect("(") && this.next();
+        items = this.read_list(this.read_variable, ",");
+        this.expect(")") && this.next();
+        this.expect(";") && this.next();
+        return result(items);
+
+      case this.tok.T_DECLARE: {
+        result = this.node("declare");
+        const body = [];
+        let mode;
+        this.next().expect("(") && this.next();
+        const what = this.read_declare_list();
+        this.expect(")") && this.next();
+        if (this.token === ":") {
+          this.next();
+          while (
+            this.token != this.EOF &&
+            this.token !== this.tok.T_ENDDECLARE
+          ) {
+            // @todo : check declare_statement from php / not valid
+            body.push(this.read_top_statement());
+          }
+          this.expect(this.tok.T_ENDDECLARE) && this.next();
+          this.expectEndOfStatement();
+          mode = this.ast.declare.MODE_SHORT;
+        } else if (this.token === "{") {
+          this.next();
+          while (this.token != this.EOF && this.token !== "}") {
+            // @todo : check declare_statement from php / not valid
+            body.push(this.read_top_statement());
+          }
+          this.expect("}") && this.next();
+          mode = this.ast.declare.MODE_BLOCK;
+        } else {
+          this.expect(";") && this.next();
+          mode = this.ast.declare.MODE_NONE;
+        }
+        return result(what, body, mode);
+      }
+
+      case this.tok.T_TRY:
+        return this.read_try();
+
+      case this.tok.T_THROW:
+        result = this.node("throw");
+        expr = this.next().read_expr();
+        this.expectEndOfStatement();
+        return result(expr);
+
+      case ";": // ignore this (extra ponctuation)
+        this.next();
+        return null;
+
+      case this.tok.T_STRING:
+        current = [this.token, this.lexer.getState()];
+        label = this.text();
+        // AST : https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L457
+        if (this.next().token === ":") {
+          result = this.node("label");
+          this.next();
+          return result(label);
+        }
+
+        // default fallback expr / T_STRING '::' (etc...)
+        this.lexer.tokens.push(current);
+        expr = this.next().read_expr();
+        this.expectEndOfStatement();
+        return expr;
+
+      case this.tok.T_GOTO:
+        result = this.node("goto");
+        label = null;
+        if (this.next().expect(this.tok.T_STRING)) {
+          label = this.text();
+          this.next().expectEndOfStatement();
+        }
+        return result(label);
+
+      default:
+        // default fallback expr
+        expr = this.read_expr();
+        this.expectEndOfStatement(expr);
+        return expr;
+    }
+  },
+  /**
+   * ```ebnf
+   *  code_block ::= '{' (inner_statements | top_statements) '}'
+   * ```
+   */
+  read_code_block: function(top) {
+    const result = this.node("block");
+    this.expect("{") && this.next();
+    const body = top
+      ? this.read_top_statements()
+      : this.read_inner_statements();
+    this.expect("}") && this.next();
+    return result(null, body);
+  }
+};
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/parser_switch.js.html b/parser_switch.js.html new file mode 100644 index 000000000..f33912144 --- /dev/null +++ b/parser_switch.js.html @@ -0,0 +1,202 @@ + + + + + + + + + + + parser/switch.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ parser/switch.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+module.exports = {
+  /**
+   * Reads a switch statement
+   * ```ebnf
+   *  switch ::= T_SWITCH '(' expr ')' switch_case_list
+   * ```
+   * @return {Switch}
+   * @see http://php.net/manual/en/control-structures.switch.php
+   */
+  read_switch: function() {
+    this.expect(this.tok.T_SWITCH) && this.next();
+    const result = this.node("switch");
+    this.expect("(") && this.next();
+    const test = this.read_expr();
+    this.expect(")") && this.next();
+    const shortForm = this.token === ":";
+    const body = this.read_switch_case_list();
+    return result(test, body, shortForm);
+  },
+  /**
+   * ```ebnf
+   *  switch_case_list ::= '{' ';'? case_list* '}' | ':' ';'? case_list* T_ENDSWITCH ';'
+   * ```
+   * @see https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L566
+   */
+  read_switch_case_list: function() {
+    // DETECT SWITCH MODE
+    let expect = null;
+    const result = this.node("block");
+    const items = [];
+    if (this.token === "{") {
+      expect = "}";
+    } else if (this.token === ":") {
+      expect = this.tok.T_ENDSWITCH;
+    } else {
+      this.expect(["{", ":"]);
+    }
+    // OPTIONNAL ';'
+    // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L570
+    if (this.next().token === ";") {
+      this.next();
+    }
+    // EXTRACTING CASES
+    while (this.token !== this.EOF && this.token !== expect) {
+      items.push(this.read_case_list(expect));
+    }
+    // CHECK END TOKEN
+    this.expect(expect) && this.next();
+    if (expect === this.tok.T_ENDSWITCH) {
+      this.expectEndOfStatement();
+    }
+    return result(null, items);
+  },
+  /**
+   * ```ebnf
+   *   case_list ::= ((T_CASE expr) | T_DEFAULT) (':' | ';') inner_statement*
+   * ```
+   */
+  read_case_list: function(stopToken) {
+    const result = this.node("case");
+    let test = null;
+    let body = null;
+    const items = [];
+    if (this.token === this.tok.T_CASE) {
+      test = this.next().read_expr();
+    } else if (this.token === this.tok.T_DEFAULT) {
+      // the defaut entry - no condition
+      this.next();
+    } else {
+      this.expect([this.tok.T_CASE, this.tok.T_DEFAULT]);
+    }
+    this.expect([":", ";"]) && this.next();
+    body = this.node("block");
+    while (
+      this.token != this.EOF &&
+      this.token !== stopToken &&
+      this.token !== this.tok.T_CASE &&
+      this.token !== this.tok.T_DEFAULT
+    ) {
+      items.push(this.read_inner_statement());
+    }
+    return result(test, items.length > 0 ? body(null, items) : null);
+  }
+};
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/parser_try.js.html b/parser_try.js.html new file mode 100644 index 000000000..ce313c60d --- /dev/null +++ b/parser_try.js.html @@ -0,0 +1,151 @@ + + + + + + + + + + + parser/try.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ parser/try.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+module.exports = {
+  /**
+   * ```ebnf
+   *  try ::= T_TRY '{' inner_statement* '}'
+   *          (
+   *              T_CATCH '(' namespace_name variable ')' '{'  inner_statement* '}'
+   *          )*
+   *          (T_FINALLY '{' inner_statement* '}')?
+   * ```
+   * @see https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L448
+   * @return {Try}
+   */
+  read_try: function() {
+    this.expect(this.tok.T_TRY);
+    const result = this.node("try");
+    let always = null;
+    const catches = [];
+    const body = this.next().read_statement();
+    // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L455
+    while (this.token === this.tok.T_CATCH) {
+      const item = this.node("catch");
+      this.next().expect("(") && this.next();
+      const what = this.read_list(this.read_namespace_name, "|", false);
+      const variable = this.read_variable(true, false, false);
+      this.expect(")");
+      catches.push(item(this.next().read_statement(), what, variable));
+    }
+    if (this.token === this.tok.T_FINALLY) {
+      always = this.next().read_statement();
+    }
+    return result(body, catches, always);
+  }
+};
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/parser_utils.js.html b/parser_utils.js.html new file mode 100644 index 000000000..8f3208242 --- /dev/null +++ b/parser_utils.js.html @@ -0,0 +1,227 @@ + + + + + + + + + + + parser/utils.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ parser/utils.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+module.exports = {
+  /**
+   * Reads a short form of tokens
+   * @param {Number} token - The ending token
+   * @return {Block}
+   */
+  read_short_form: function(token) {
+    const body = this.node("block");
+    const items = [];
+    if (this.expect(":")) this.next();
+    while (this.token != this.EOF && this.token !== token) {
+      items.push(this.read_inner_statement());
+    }
+    if (this.expect(token)) this.next();
+    this.expectEndOfStatement();
+    return body(null, items);
+  },
+
+  /**
+   * Helper : reads a list of tokens / sample : T_STRING ',' T_STRING ...
+   * ```ebnf
+   * list ::= separator? ( item separator )* item
+   * ```
+   */
+  read_list: function(item, separator, preserveFirstSeparator) {
+    const result = [];
+
+    if (this.token == separator) {
+      if (preserveFirstSeparator) result.push(null);
+      this.next();
+    }
+
+    if (typeof item === "function") {
+      do {
+        result.push(item.apply(this, []));
+        if (this.token != separator) {
+          break;
+        }
+      } while (this.next().token != this.EOF);
+    } else {
+      if (this.expect(item)) {
+        result.push(this.text());
+      } else {
+        return [];
+      }
+      while (this.next().token != this.EOF) {
+        if (this.token != separator) break;
+        // trim current separator & check item
+        if (this.next().token != item) break;
+        result.push(this.text());
+      }
+    }
+    return result;
+  },
+
+  /**
+   * Reads a list of names separated by a comma
+   *
+   * ```ebnf
+   * name_list ::= namespace (',' namespace)*
+   * ```
+   *
+   * Sample code :
+   * ```php
+   * <?php class foo extends bar, baz { }
+   * ```
+   *
+   * @see https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L726
+   * @return {Identifier[]}
+   */
+  read_name_list: function() {
+    return this.read_list(this.read_namespace_name, ",", false);
+  },
+
+  /**
+   * Reads a list of variables declarations
+   *
+   * ```ebnf
+   * variable_declaration ::= T_VARIABLE ('=' expr)?*
+   * variable_declarations ::= variable_declaration (',' variable_declaration)*
+   * ```
+   *
+   * Sample code :
+   * ```php
+   * <?php class foo extends bar, baz { }
+   * ```
+   * @return {Variable[]|Assign[]} Returns an array composed by a list of variables, or
+   * assign values
+   */
+  read_variable_declarations: function() {
+    return this.read_list(function() {
+      const node = this.node("assign");
+      let variable = this.node("variable");
+      // plain variable name
+      if (this.expect(this.tok.T_VARIABLE)) {
+        const name = this.text().substring(1);
+        this.next();
+        variable = variable(name, false, false);
+      } else {
+        variable = variable("#ERR", false, false);
+      }
+      if (this.token === "=") {
+        return node(variable, this.next().read_expr());
+      } else {
+        return variable;
+      }
+    }, ",");
+  }
+};
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/parser_variable.js.html b/parser_variable.js.html new file mode 100644 index 000000000..df7b00525 --- /dev/null +++ b/parser_variable.js.html @@ -0,0 +1,452 @@ + + + + + + + + + + + parser/variable.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ parser/variable.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+module.exports = {
+  /**
+   * Reads a variable
+   *
+   * ```ebnf
+   *   variable ::= &? ...complex @todo
+   * ```
+   *
+   * Some samples of parsed code :
+   * ```php
+   *  &$var                      // simple var
+   *  $var                      // simple var
+   *  classname::CONST_NAME     // dynamic class name with const retrieval
+   *  foo()                     // function call
+   *  $var->func()->property    // chained calls
+   * ```
+   */
+  read_variable: function(read_only, encapsed, byref) {
+    let result;
+
+    // check the byref flag
+    if (!byref && this.token === "&") {
+      byref = true;
+      this.next();
+    }
+
+    // reads the entry point
+    if (this.is([this.tok.T_VARIABLE, "$"])) {
+      result = this.read_reference_variable(encapsed, byref);
+    } else if (
+      this.is([
+        this.tok.T_NS_SEPARATOR,
+        this.tok.T_STRING,
+        this.tok.T_NAMESPACE
+      ])
+    ) {
+      result = this.node();
+      const name = this.read_namespace_name();
+      if (this.token != this.tok.T_DOUBLE_COLON && this.token != "(") {
+        // @see parser.js line 130 : resolves a conflict with scalar
+        const literal = name.name.toLowerCase();
+        if (literal === "true") {
+          result = result("boolean", true, name.name);
+        } else if (literal === "false") {
+          result = result("boolean", false, name.name);
+        } else {
+          // @todo null keyword ?
+          result = result("constref", name);
+        }
+      } else {
+        result = name;
+      }
+    } else if (this.token === this.tok.T_STATIC) {
+      result = this.node("constref");
+      this.next();
+      result = result("static");
+    } else {
+      this.expect("VARIABLE");
+    }
+
+    // static mode
+    if (this.token === this.tok.T_DOUBLE_COLON) {
+      result = this.read_static_getter(result, encapsed);
+    }
+
+    return this.recursive_variable_chain_scan(result, read_only, encapsed);
+  },
+
+  // resolves a static call
+  read_static_getter: function(what, encapsed) {
+    const result = this.node("staticlookup");
+    let offset, name;
+    if (this.next().is([this.tok.T_VARIABLE, "$"])) {
+      offset = this.read_reference_variable(encapsed, false);
+    } else if (
+      this.token === this.tok.T_STRING ||
+      this.token === this.tok.T_CLASS ||
+      (this.php7 && this.is("IDENTIFIER"))
+    ) {
+      offset = this.node("constref");
+      name = this.text();
+      this.next();
+      offset = offset(name);
+    } else {
+      this.error([this.tok.T_VARIABLE, this.tok.T_STRING]);
+      // graceful mode : set getter as error node and continue
+      offset = this.node("constref");
+      name = this.text();
+      this.next();
+      offset = offset(name);
+    }
+    return result(what, offset);
+  },
+
+  recursive_variable_chain_scan: function(result, read_only, encapsed) {
+    let name, node, offset;
+    recursive_scan_loop: while (this.token != this.EOF) {
+      switch (this.token) {
+        case "(":
+          if (read_only) {
+            // @fixme : add more informations & test
+            return result;
+          } else {
+            result = this.node("call")(
+              result,
+              this.read_function_argument_list()
+            );
+          }
+          break;
+        case "[":
+          node = this.node("offsetlookup");
+          this.next();
+          offset = false;
+          if (encapsed) {
+            offset = this.read_encaps_var_offset();
+            this.expect("]") && this.next();
+          } else {
+            // callable_variable : https://github.com/php/php-src/blob/493524454d66adde84e00d249d607ecd540de99f/Zend/zend_language_parser.y#L1122
+            if (this.token !== "]") {
+              offset = this.read_expr();
+              this.expect("]") && this.next();
+            } else {
+              this.next();
+            }
+          }
+          result = node(result, offset);
+          break;
+        case this.tok.T_DOUBLE_COLON:
+          // @see https://github.com/glayzzle/php-parser/issues/107#issuecomment-354104574
+          if (result.kind === "staticlookup") {
+            this.error();
+          }
+
+          node = this.node("staticlookup");
+          if (
+            this.next().token === this.tok.T_STRING ||
+            (this.php7 && this.is("IDENTIFIER"))
+          ) {
+            offset = this.node("constref");
+            name = this.text();
+            this.next();
+            offset = offset(name);
+
+            if (this.token === this.tok.T_OBJECT_OPERATOR) {
+              this.error();
+            }
+          } else {
+            this.error(this.tok.T_STRING);
+            // fallback on a constref node
+            offset = this.node("constref")(this.text());
+            this.next();
+          }
+          result = node(result, offset);
+          break;
+        case this.tok.T_OBJECT_OPERATOR: {
+          node = this.node("propertylookup");
+          let what = null;
+          switch (this.next().token) {
+            case this.tok.T_STRING:
+              what = this.node("constref");
+              name = this.text();
+              this.next();
+              what = what(name);
+              if (this.token === this.tok.T_VARIABLE) {
+                const inner = this.node("variable");
+                name = this.text().substring(1);
+                this.next();
+                what = this.node("encapsed")(
+                  [what, inner(name, false, false)],
+                  null,
+                  "offset"
+                );
+                if (what.loc && what.value[0].loc) {
+                  what.loc.start = what.value[0].loc.start;
+                }
+              } else if (this.token === "{") {
+                const expr = this.next().read_expr();
+                this.expect("}") && this.next();
+                what = this.node("encapsed")([what, expr], null, "offset");
+                if (what.loc && what.value[0].loc) {
+                  what.loc.start = what.value[0].loc.start;
+                }
+              }
+              break;
+            case this.tok.T_VARIABLE:
+              what = this.node("variable");
+              name = this.text().substring(1);
+              this.next();
+              what = what(name, false, false);
+              break;
+            case "$":
+              this.next().expect(["{", this.tok.T_VARIABLE]);
+              if (this.token === "{") {
+                // $obj->${$varname}
+                what = this.next().read_expr();
+                this.expect("}") && this.next();
+              } else {
+                // $obj->$$varname
+                what = this.read_expr();
+              }
+              break;
+            case "{":
+              what = this.next().read_expr();
+              this.expect("}") && this.next();
+              break;
+            default:
+              this.error([this.tok.T_STRING, this.tok.T_VARIABLE]);
+              // graceful mode : set what as error mode & continue
+              what = this.node("constref");
+              name = this.text();
+              this.next();
+              what = what(name);
+              break;
+          }
+          result = node(result, what);
+          break;
+        }
+        default:
+          break recursive_scan_loop;
+      }
+    }
+    return result;
+  },
+  /**
+   * https://github.com/php/php-src/blob/493524454d66adde84e00d249d607ecd540de99f/Zend/zend_language_parser.y#L1231
+   */
+  read_encaps_var_offset: function() {
+    let offset = this.node();
+    if (this.token === this.tok.T_STRING) {
+      const text = this.text();
+      this.next();
+      offset = offset("constref", text);
+    } else if (this.token === this.tok.T_NUM_STRING) {
+      const num = this.text();
+      this.next();
+      offset = offset("number", num, null);
+    } else if (this.token === this.tok.T_VARIABLE) {
+      const name = this.text().substring(1);
+      this.next();
+      offset = offset("variable", name, false, false);
+    } else {
+      this.expect([
+        this.tok.T_STRING,
+        this.tok.T_NUM_STRING,
+        this.tok.T_VARIABLE
+      ]);
+      // fallback : consider as constref
+      const text = this.text();
+      this.next();
+      offset = offset("constref", text);
+    }
+    return offset;
+  },
+  /**
+   * ```ebnf
+   *  reference_variable ::=  simple_variable ('[' OFFSET ']')* | '{' EXPR '}'
+   * ```
+   * <code>
+   *  $foo[123];      // foo is an array ==> gets its entry
+   *  $foo{1};        // foo is a string ==> get the 2nd char offset
+   *  ${'foo'}[123];  // get the dynamic var $foo
+   *  $foo[123]{1};   // gets the 2nd char from the 123 array entry
+   * </code>
+   */
+  read_reference_variable: function(encapsed, byref) {
+    let result = this.read_simple_variable(byref);
+    let offset;
+    while (this.token != this.EOF) {
+      const node = this.node();
+      if (this.token == "[") {
+        offset = null;
+        if (encapsed) {
+          offset = this.next().read_encaps_var_offset();
+        } else {
+          offset = this.next().token === "]" ? null : this.read_dim_offset();
+        }
+        this.expect("]") && this.next();
+        result = node("offsetlookup", result, offset);
+      } else if (this.token == "{" && !encapsed) {
+        offset = this.next().read_expr();
+        this.expect("}") && this.next();
+        result = node("offsetlookup", result, offset);
+      } else break;
+    }
+    return result;
+  },
+  /**
+   * ```ebnf
+   *  simple_variable ::= T_VARIABLE | '$' '{' expr '}' | '$' simple_variable
+   * ```
+   */
+  read_simple_variable: function(byref) {
+    let result = this.node("variable");
+    let name;
+    if (
+      this.expect([this.tok.T_VARIABLE, "$"]) &&
+      this.token === this.tok.T_VARIABLE
+    ) {
+      // plain variable name
+      name = this.text().substring(1);
+      this.next();
+      result = result(name, byref, false);
+    } else {
+      if (this.token === "$") this.next();
+      // dynamic variable name
+      switch (this.token) {
+        case "{": {
+          const expr = this.next().read_expr();
+          this.expect("}") && this.next();
+          result = result(expr, byref, true);
+          break;
+        }
+        case "$": // $$$var
+          result = result(this.read_simple_variable(false), byref);
+          break;
+        case this.tok.T_VARIABLE: {
+          // $$var
+          name = this.text().substring(1);
+          const node = this.node("variable");
+          this.next();
+          result = result(node(name, false, false), byref, false);
+          break;
+        }
+        default:
+          this.error(["{", "$", this.tok.T_VARIABLE]);
+          // graceful mode
+          name = this.text();
+          this.next();
+          result = result(name, byref, false);
+      }
+    }
+    return result;
+  }
+};
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/scripts/linenumber.js b/scripts/linenumber.js new file mode 100644 index 000000000..ff6c0693b --- /dev/null +++ b/scripts/linenumber.js @@ -0,0 +1,24 @@ +'use strict'; + +/* global document */ +(function () { + var lineId, lines, totalLines, anchorHash; + var source = document.getElementsByClassName('prettyprint source linenums'); + var i = 0; + var lineNumber = 0; + + if (source && source[0]) { + anchorHash = document.location.hash.substring(1); + lines = source[0].getElementsByTagName('li'); + totalLines = lines.length; + + for (; i < totalLines; i++) { + lineNumber++; + lineId = 'line' + lineNumber; + lines[i].id = lineId; + if (lineId === anchorHash) { + lines[i].className += ' selected'; + } + } + } +})(); diff --git a/scripts/pagelocation.js b/scripts/pagelocation.js new file mode 100644 index 000000000..e1383680c --- /dev/null +++ b/scripts/pagelocation.js @@ -0,0 +1,89 @@ +'use strict'; + +$(document).ready(function () { + var currentSectionNav, target; + + // If an anchor hash is in the URL highlight the menu item + highlightActiveHash(); + // If a specific page section is in the URL highlight the menu item + highlightActiveSection(); + + // If a specific page section is in the URL scroll that section up to the top + currentSectionNav = $('#' + getCurrentSectionName() + '-nav'); + + if (currentSectionNav.position()) { + $('nav').scrollTop(currentSectionNav.position().top); + } + + // function to scroll to anchor when clicking an anchor linl + $('a[href*="#"]:not([href="#"])').click(function () { + /* eslint-disable no-invalid-this */ + if (location.pathname.replace(/^\//, '') === this.pathname.replace(/^\//, '') && location.hostname === this.hostname) { + target = $(this.hash); + target = target.length ? target : $('[name=' + this.hash.slice(1) + ']'); + if (target.length) { + $('html, body').animate({ + scrollTop: target.offset().top + }, 1000); + } + } + /* eslint-enable no-invalid-this */ + }); +}); + +// If a new anchor section is selected, change the hightlighted menu item +$(window).bind('hashchange', function (event) { + highlightActiveHash(event); +}); + +function highlightActiveHash(event) { + var oldUrl, oldSubSectionElement; + + // check for and remove old hash active state + if (event && event.originalEvent.oldURL) { + oldUrl = event.originalEvent.oldURL; + + if (oldUrl.indexOf('#') > -1) { + oldSubSectionElement = $('#' + getCurrentSectionName() + '-' + oldUrl.substring(oldUrl.indexOf('#') + 1) + '-nav'); + + if (oldSubSectionElement) { + oldSubSectionElement.removeClass('active'); + } + } + } + + if (getCurrentHashName()) { + $('#' + getCurrentSectionName() + '-' + getCurrentHashName() + '-nav').addClass('active'); + } +} + +function highlightActiveSection() { + var pageId = getCurrentSectionName(); + + $('#' + pageId + '-nav').addClass('active'); +} + +function getCurrentSectionName() { + var path = window.location.pathname; + var pageUrl = path.split('/').pop(); + + var sectionName = pageUrl.substring(0, pageUrl.indexOf('.')); + + // remove the wodr module- if its in the url + sectionName = sectionName.replace('module-', ''); + + return sectionName; +} + +function getCurrentHashName() { + var pageSubSectionId; + var pageSubSectionHash = window.location.hash; + + if (pageSubSectionHash) { + pageSubSectionId = pageSubSectionHash.substring(1).replace('.', ''); + + return pageSubSectionId; + } + + return false; +} diff --git a/src/ast.js b/src/ast.js deleted file mode 100644 index c7e3626dd..000000000 --- a/src/ast.js +++ /dev/null @@ -1,386 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Location = require("./ast/location"); -const Position = require("./ast/position"); - -/** - * ## Class hierarchy - * - * - [Location](#location) - * - [Position](#position) - * - [Node](#node) - * - [Identifier](#identifier) - * - [TraitUse](#traituse) - * - [TraitAlias](#traitalias) - * - [TraitPrecedence](#traitprecedence) - * - [Entry](#entry) - * - [Case](#case) - * - [Label](#label) - * - [Comment](#comment) - * - [CommentLine](#commentline) - * - [CommentBlock](#commentblock) - * - [Error](#error) - * - [Expression](#expression) - * - [Array](#array) - * - [Variable](#variable) - * - [Variadic](#variadic) - * - [ConstRef](#constref) - * - [Yield](#yield) - * - [YieldFrom](#yieldfrom) - * - [Lookup](#lookup) - * - [PropertyLookup](#propertylookup) - * - [StaticLookup](#staticlookup) - * - [OffsetLookup](#offsetlookup) - * - [Operation](#operation) - * - [Pre](#pre) - * - [Post](#post) - * - [Bin](#bin) - * - [Parenthesis](#parenthesis) - * - [Unary](#unary) - * - [Cast](#cast) - * - [Literal](#literal) - * - [Boolean](#boolean) - * - [String](#string) - * - [Number](#number) - * - [Inline](#inline) - * - [Magic](#magic) - * - [Nowdoc](#nowdoc) - * - [Encapsed](#encapsed) - * - [Statement](#statement) - * - [Eval](#eval) - * - [Exit](#exit) - * - [Halt](#halt) - * - [Clone](#clone) - * - [Declare](#declare) - * - [Global](#global) - * - [Static](#static) - * - [Include](#include) - * - [Assign](#assign) - * - [RetIf](#retif) - * - [If](#if) - * - [Do](#do) - * - [While](#while) - * - [For](#for) - * - [Foreach](#foreach) - * - [Switch](#switch) - * - [Goto](#goto) - * - [Silent](#silent) - * - [Try](#try) - * - [Catch](#catch) - * - [Throw](#throw) - * - [Call](#call) - * - [Closure](#closure) - * - [New](#new) - * - [UseGroup](#usegroup) - * - [UseItem](#useitem) - * - [Block](#block) - * - [Program](#program) - * - [Namespace](#namespace) - * - [Sys](#sys) - * - [Echo](#echo) - * - [List](#list) - * - [Print](#print) - * - [Isset](#isset) - * - [Unset](#unset) - * - [Empty](#empty) - * - [Declaration](#declaration) - * - [Class](#class) - * - [Interface](#interface) - * - [Trait](#trait) - * - [Constant](#constant) - * - [ClassConstant](#classconstant) - * - [Function](#function) - * - [Method](#method) - * - [Parameter](#parameter) - * - [Property](#property) - * --- - */ - -/** - * The AST builder class - * @constructor AST - * @tutorial AST - * @property {Boolean} withPositions - Should locate any node (by default false) - * @property {Boolean} withSource - Should extract the node original code (by default false) - */ -const AST = function(withPositions, withSource) { - this.withPositions = withPositions; - this.withSource = withSource; -}; - -/** - * Create a position node from specified parser - * including it's lexer current state - * @param {Parser} - * @return {Position} - * @private - */ -AST.prototype.position = function(parser) { - return new Position( - parser.lexer.yylloc.first_line, - parser.lexer.yylloc.first_column, - parser.lexer.yylloc.first_offset - ); -}; - -// operators in ascending order of precedence -AST.precedence = {}; -[ - ["or"], - ["xor"], - ["and"], - ["="], - ["?"], - ["??"], - ["||"], - ["&&"], - ["|"], - ["^"], - ["&"], - ["==", "!=", "===", "!==", /* '<>', */ "<=>"], - ["<", "<=", ">", ">="], - ["<<", ">>"], - ["+", "-", "."], - ["*", "/", "%"], - ["!"], - ["instanceof"] - // TODO: typecasts - // TODO: [ (array) - // TODO: clone, new -].forEach(function(list, index) { - list.forEach(function(operator) { - AST.precedence[operator] = index + 1; - }); -}); - -/** - * Check and fix precence, by default using right - */ -AST.prototype.resolvePrecedence = function(result) { - let buffer, lLevel, rLevel; - // handling precendence - if (result.kind === "bin") { - if (result.right) { - if (result.right.kind === "bin") { - lLevel = AST.precedence[result.type]; - rLevel = AST.precedence[result.right.type]; - if (lLevel && rLevel && rLevel <= lLevel) { - // https://github.com/glayzzle/php-parser/issues/79 - // shift precedence - buffer = result.right; - result.right = result.right.left; - buffer.left = this.resolvePrecedence(result); - result = buffer; - } - } else if (result.right.kind === "retif") { - lLevel = AST.precedence[result.type]; - rLevel = AST.precedence["?"]; - if (lLevel && rLevel && rLevel <= lLevel) { - buffer = result.right; - result.right = result.right.test; - buffer.test = this.resolvePrecedence(result); - result = buffer; - } - } - } - } else if (result.kind === "unary") { - // https://github.com/glayzzle/php-parser/issues/75 - if (result.what) { - // unary precedence is allways lower - if (result.what.kind === "bin") { - buffer = result.what; - result.what = result.what.left; - buffer.left = this.resolvePrecedence(result); - result = buffer; - } else if (result.what.kind === "retif") { - buffer = result.what; - result.what = result.what.test; - buffer.test = this.resolvePrecedence(result); - result = buffer; - } - } - } else if (result.kind === "retif") { - // https://github.com/glayzzle/php-parser/issues/77 - if (result.falseExpr && result.falseExpr.kind === "retif") { - buffer = result.falseExpr; - result.falseExpr = buffer.test; - buffer.test = this.resolvePrecedence(result); - result = buffer; - } - } else if (result.kind === "assign") { - // https://github.com/glayzzle/php-parser/issues/81 - if (result.right && result.right.kind === "bin") { - lLevel = AST.precedence["="]; - rLevel = AST.precedence[result.right.type]; - // only shifts with and, xor, or - if (lLevel && rLevel && rLevel < lLevel) { - buffer = result.right; - result.right = result.right.left; - buffer.left = result; - result = buffer; - } - } - } - return result; -}; - -/** - * Prepares an AST node - * @param {String|null} kind - Defines the node type - * (if null, the kind must be passed at the function call) - * @param {Parser} parser - The parser instance (use for extracting locations) - * @return {Function} - */ -AST.prototype.prepare = function(kind, docs, parser) { - let start = null; - if (this.withPositions || this.withSource) { - start = this.position(parser); - } - const self = this; - // returns the node - const result = function() { - let location = null; - const args = Array.prototype.slice.call(arguments); - args.push(docs); - if (self.withPositions || self.withSource) { - let src = null; - if (self.withSource) { - src = parser.lexer._input.substring(start.offset, parser.prev[2]); - } - if (self.withPositions) { - location = new Location( - src, - start, - new Position(parser.prev[0], parser.prev[1], parser.prev[2]) - ); - } else { - location = new Location(src, null, null); - } - // last argument is allways the location - args.push(location); - } - // handle lazy kind definitions - if (!kind) { - kind = args.shift(); - } - // build the object - const node = self[kind]; - if (typeof node !== "function") { - throw new Error('Undefined node "' + kind + '"'); - } - const result = Object.create(node.prototype); - node.apply(result, args); - return self.resolvePrecedence(result); - }; - /** - * Helper to change a node kind - * @param {String} newKind - */ - result.setKind = function(newKind) { - kind = newKind; - }; - return result; -}; - -// Define all AST nodes -[ - require("./ast/array"), - require("./ast/assign"), - require("./ast/bin"), - require("./ast/block"), - require("./ast/boolean"), - require("./ast/break"), - require("./ast/call"), - require("./ast/case"), - require("./ast/cast"), - require("./ast/catch"), - require("./ast/class"), - require("./ast/classconstant"), - require("./ast/clone"), - require("./ast/closure"), - require("./ast/comment"), - require("./ast/commentblock"), - require("./ast/commentline"), - require("./ast/constant"), - require("./ast/constref"), - require("./ast/continue"), - require("./ast/declaration"), - require("./ast/declare"), - require("./ast/do"), - require("./ast/echo"), - require("./ast/empty"), - require("./ast/encapsed"), - require("./ast/entry"), - require("./ast/error"), - require("./ast/eval"), - require("./ast/exit"), - require("./ast/expression"), - require("./ast/for"), - require("./ast/foreach"), - require("./ast/function"), - require("./ast/global"), - require("./ast/goto"), - require("./ast/halt"), - require("./ast/identifier"), - require("./ast/if"), - require("./ast/include"), - require("./ast/inline"), - require("./ast/interface"), - require("./ast/isset"), - require("./ast/label"), - require("./ast/list"), - require("./ast/literal"), - require("./ast/lookup"), - require("./ast/magic"), - require("./ast/method"), - require("./ast/namespace"), - require("./ast/new"), - require("./ast/node"), - require("./ast/nowdoc"), - require("./ast/number"), - require("./ast/offsetlookup"), - require("./ast/operation"), - require("./ast/parameter"), - require("./ast/parenthesis"), - require("./ast/post"), - require("./ast/pre"), - require("./ast/print"), - require("./ast/program"), - require("./ast/property"), - require("./ast/propertylookup"), - require("./ast/retif"), - require("./ast/return"), - require("./ast/silent"), - require("./ast/statement"), - require("./ast/static"), - require("./ast/staticlookup"), - require("./ast/string"), - require("./ast/switch"), - require("./ast/sys"), - require("./ast/throw"), - require("./ast/trait"), - require("./ast/traitalias"), - require("./ast/traitprecedence"), - require("./ast/traituse"), - require("./ast/try"), - require("./ast/unary"), - require("./ast/unset"), - require("./ast/usegroup"), - require("./ast/useitem"), - require("./ast/variable"), - require("./ast/variadic"), - require("./ast/while"), - require("./ast/yield"), - require("./ast/yieldfrom") -].forEach(function(ctor) { - let kind = ctor.prototype.constructor.name.toLowerCase(); - if (kind[0] === "_") kind = kind.substring(1); - AST.prototype[kind] = ctor; -}); - -module.exports = AST; diff --git a/src/ast/array.js b/src/ast/array.js deleted file mode 100644 index 0941b880c..000000000 --- a/src/ast/array.js +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Expr = require("./expression"); -const KIND = "array"; - -/** - * Defines an array structure - * @constructor Array - * @example - * // PHP code : - * [1, 'foo' => 'bar', 3] - * - * // AST structure : - * { - * "kind": "array", - * "shortForm": true - * "items": [ - * {"kind": "number", "value": "1"}, - * { - * "kind": "entry", - * "key": {"kind": "string", "value": "foo", "isDoubleQuote": false}, - * "value": {"kind": "string", "value": "bar", "isDoubleQuote": false} - * }, - * {"kind": "number", "value": "3"} - * ] - * } - * @extends {Expression} - * @property {Entry|Expr|Variable} items List of array items - * @property {boolean} shortForm Indicate if the short array syntax is used, ex `[]` instead `array()` - */ -const Array = Expr.extends(function Array(shortForm, items, docs, location) { - Expr.apply(this, [KIND, docs, location]); - this.items = items; - this.shortForm = shortForm; -}); - -module.exports = Array; diff --git a/src/ast/assign.js b/src/ast/assign.js deleted file mode 100644 index 935c49e1f..000000000 --- a/src/ast/assign.js +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Statement = require("./statement"); -const KIND = "assign"; - -/** - * Assigns a value to the specified target - * @constructor Assign - * @extends {Statement} - * @property {Expression} left - * @property {Expression} right - * @property {String} operator - */ -const Assign = Statement.extends(function Assign( - left, - right, - operator, - docs, - location -) { - Statement.apply(this, [KIND, docs, location]); - this.operator = operator; - this.left = left; - this.right = right; -}); - -module.exports = Assign; diff --git a/src/ast/bin.js b/src/ast/bin.js deleted file mode 100644 index 59b7d0a81..000000000 --- a/src/ast/bin.js +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Operation = require("./operation"); -const KIND = "bin"; -/** - * Binary operations - * @constructor Bin - * @extends {Operation} - * @property {String} type - * @property {Expression} left - * @property {Expression} right - */ -const Bin = Operation.extends(function Bin(type, left, right, docs, location) { - Operation.apply(this, [KIND, docs, location]); - this.type = type; - this.left = left; - this.right = right; -}); - -module.exports = Bin; diff --git a/src/ast/block.js b/src/ast/block.js deleted file mode 100644 index 3b480e5ac..000000000 --- a/src/ast/block.js +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Statement = require("./statement"); -const KIND = "block"; - -/** - * A block statement, i.e., a sequence of statements surrounded by braces. - * @constructor Block - * @extends {Statement} - * @property {Node[]} children - */ -const Block = Statement.extends(function Block(kind, children, docs, location) { - Statement.apply(this, [kind || KIND, docs, location]); - this.children = children.filter(Boolean); -}); - -module.exports = Block; diff --git a/src/ast/boolean.js b/src/ast/boolean.js deleted file mode 100644 index bdb5be539..000000000 --- a/src/ast/boolean.js +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Literal = require("./literal"); -const KIND = "boolean"; - -/** - * Defines a boolean value (true/false) - * @constructor Boolean - * @extends {Literal} - */ -const Boolean = Literal.extends(function Boolean(value, raw, docs, location) { - Literal.apply(this, [KIND, value, raw, docs, location]); -}); - -module.exports = Boolean; diff --git a/src/ast/break.js b/src/ast/break.js deleted file mode 100644 index fcc378305..000000000 --- a/src/ast/break.js +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Node = require("./node"); -const KIND = "break"; - -/** - * A break statement - * @constructor Break - * @extends {Node} - * @property {Number|Null} level - */ -const Break = Node.extends(function Break(level, docs, location) { - Node.apply(this, [KIND, docs, location]); - this.level = level; -}); - -module.exports = Break; diff --git a/src/ast/call.js b/src/ast/call.js deleted file mode 100644 index 7be69febb..000000000 --- a/src/ast/call.js +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Statement = require("./statement"); -const KIND = "call"; - -/** - * Executes a call statement - * @constructor Call - * @extends {Statement} - * @property {Identifier|Variable|??} what - * @property {Arguments[]} arguments - */ -const Call = Statement.extends(function Call(what, args, docs, location) { - Statement.apply(this, [KIND, docs, location]); - this.what = what; - this.arguments = args; -}); - -module.exports = Call; diff --git a/src/ast/case.js b/src/ast/case.js deleted file mode 100644 index 850198fb5..000000000 --- a/src/ast/case.js +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Node = require("./node"); -const KIND = "case"; - -/** - * A switch case statement - * @constructor Case - * @extends {Node} - * @property {Expression|null} test - if null, means that the default case - * @property {Block|null} body - */ -const Case = Node.extends(function Case(test, body, docs, location) { - Node.apply(this, [KIND, docs, location]); - this.test = test; - this.body = body; -}); - -module.exports = Case; diff --git a/src/ast/cast.js b/src/ast/cast.js deleted file mode 100644 index 94ea16c44..000000000 --- a/src/ast/cast.js +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Operation = require("./operation"); -const KIND = "cast"; - -/** - * Binary operations - * @constructor Cast - * @extends {Operation} - * @property {String} type - * @property {Expression} what - */ -const Cast = Operation.extends(function Cast(type, what, docs, location) { - Operation.apply(this, [KIND, docs, location]); - this.type = type; - this.what = what; -}); - -module.exports = Cast; diff --git a/src/ast/catch.js b/src/ast/catch.js deleted file mode 100644 index e416b2126..000000000 --- a/src/ast/catch.js +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Statement = require("./statement"); -const KIND = "catch"; - -/** - * Defines a catch statement - * @constructor Catch - * @extends {Statement} - * @property {Identifier[]} what - * @property {Variable} variable - * @property {Statement} body - * @see http://php.net/manual/en/language.exceptions.php - */ -const Catch = Statement.extends(function Catch( - body, - what, - variable, - docs, - location -) { - Statement.apply(this, [KIND, docs, location]); - this.body = body; - this.what = what; - this.variable = variable; -}); - -module.exports = Catch; diff --git a/src/ast/class.js b/src/ast/class.js deleted file mode 100644 index 06296c0d7..000000000 --- a/src/ast/class.js +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Declaration = require("./declaration"); -const KIND = "class"; - -/** - * A class definition - * @constructor Class - * @extends {Declaration} - * @property {Identifier|null} extends - * @property {Identifier[]} implements - * @property {Declaration[]} body - * @property {boolean} isAnonymous - * @property {boolean} isAbstract - * @property {boolean} isFinal - */ -const Class = Declaration.extends(function Class( - name, - ext, - impl, - body, - flags, - docs, - location -) { - Declaration.apply(this, [KIND, name, docs, location]); - this.isAnonymous = name ? false : true; - this.extends = ext; - this.implements = impl; - this.body = body; - this.parseFlags(flags); -}); - -module.exports = Class; diff --git a/src/ast/classconstant.js b/src/ast/classconstant.js deleted file mode 100644 index 09d11cd6e..000000000 --- a/src/ast/classconstant.js +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Constant = require("./constant"); -const KIND = "classconstant"; - -/** - * Defines a class/interface/trait constant - * @constructor ClassConstant - * @extends {Constant} - * @property {boolean} isStatic - * @property {string} visibility - */ -const ClassConstant = Constant.extends(function ClassConstant( - name, - value, - flags, - docs, - location -) { - Constant.apply(this, [name, value, docs, location]); - this.kind = KIND; - this.parseFlags(flags); -}); - -module.exports = ClassConstant; diff --git a/src/ast/clone.js b/src/ast/clone.js deleted file mode 100644 index d5a59ff43..000000000 --- a/src/ast/clone.js +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Statement = require("./statement"); -const KIND = "clone"; - -/** - * Defines a clone call - * @constructor Clone - * @extends {Statement} - * @property {Expression} what - */ -const Clone = Statement.extends(function Clone(what, docs, location) { - Statement.apply(this, [KIND, docs, location]); - this.what = what; -}); - -module.exports = Clone; diff --git a/src/ast/closure.js b/src/ast/closure.js deleted file mode 100644 index a74a8778b..000000000 --- a/src/ast/closure.js +++ /dev/null @@ -1,43 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Statement = require("./statement"); -const KIND = "closure"; - -/** - * Defines a closure - * @constructor Closure - * @extends {Statement} - * @property {Parameter[]} arguments - * @property {Variable[]} uses - * @property {Identifier} type - * @property {boolean} byref - * @property {boolean} nullable - * @property {Block|null} body - * @property {boolean} isStatic - */ -const Closure = Statement.extends(function Closure( - args, - byref, - uses, - type, - nullable, - isStatic, - docs, - location -) { - Statement.apply(this, [KIND, docs, location]); - this.uses = uses; - this.arguments = args; - this.byref = byref; - this.type = type; - this.nullable = nullable; - this.isStatic = isStatic || false; - this.body = null; -}); - -module.exports = Closure; diff --git a/src/ast/comment.js b/src/ast/comment.js deleted file mode 100644 index cfebe473e..000000000 --- a/src/ast/comment.js +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Node = require("./node"); - -/** - * Abstract documentation node (ComentLine or CommentBlock) - * @constructor Comment - * @extends {Node} - * @property {String} value - */ -const Comment = Node.extends(function Comment(kind, value, docs, location) { - Node.apply(this, [kind, docs, location]); - this.value = value; -}); - -module.exports = Comment; diff --git a/src/ast/commentblock.js b/src/ast/commentblock.js deleted file mode 100644 index 2db59e200..000000000 --- a/src/ast/commentblock.js +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Comment = require("./comment"); -const KIND = "commentblock"; - -/** - * A comment block (multiline) - * @constructor CommentBlock - * @extends {Comment} - */ -const CommentBlock = Comment.extends(function CommentBlock( - value, - docs, - location -) { - Comment.apply(this, [KIND, value, docs, location]); -}); - -module.exports = CommentBlock; diff --git a/src/ast/commentline.js b/src/ast/commentline.js deleted file mode 100644 index af39f979e..000000000 --- a/src/ast/commentline.js +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Comment = require("./comment"); -const KIND = "commentline"; - -/** - * A single line comment - * @constructor CommentLine - * @extends {Comment} - */ -const CommentLine = Comment.extends(function CommentLine( - value, - docs, - location -) { - Comment.apply(this, [KIND, value, docs, location]); -}); - -module.exports = CommentLine; diff --git a/src/ast/constant.js b/src/ast/constant.js deleted file mode 100644 index 5d85eee32..000000000 --- a/src/ast/constant.js +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Declaration = require("./declaration"); -const KIND = "constant"; - -/** - * Defines a namespace constant - * @constructor Constant - * @extends {Declaration} - * @property {Node|null} value - */ -const Constant = Declaration.extends(function Constant( - name, - value, - docs, - location -) { - Declaration.apply(this, [KIND, name, docs, location]); - this.value = value; -}); - -module.exports = Constant; diff --git a/src/ast/constref.js b/src/ast/constref.js deleted file mode 100644 index fdb9e60eb..000000000 --- a/src/ast/constref.js +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Expr = require("./expression"); -const KIND = "constref"; - -/** - * A constant reference - * @constructor ConstRef - * @extends {Expression} - * @property {String|Node} name - */ -const ConstRef = Expr.extends(function ConstRef(identifier, docs, location) { - Expr.apply(this, [KIND, docs, location]); - this.name = identifier; -}); - -module.exports = ConstRef; diff --git a/src/ast/continue.js b/src/ast/continue.js deleted file mode 100644 index a76d4e56b..000000000 --- a/src/ast/continue.js +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Node = require("./node"); -const KIND = "continue"; - -/** - * A continue statement - * @constructor Continue - * @extends {Node} - * @property {Number|Null} level - */ -const Continue = Node.extends(function Continue(level, docs, location) { - Node.apply(this, [KIND, docs, location]); - this.level = level; -}); - -module.exports = Continue; diff --git a/src/ast/declaration.js b/src/ast/declaration.js deleted file mode 100644 index af8cf1f03..000000000 --- a/src/ast/declaration.js +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Statement = require("./statement"); -const KIND = "declaration"; - -const IS_UNDEFINED = ""; -const IS_PUBLIC = "public"; -const IS_PROTECTED = "protected"; -const IS_PRIVATE = "private"; - -/** - * A declaration statement (function, class, interface...) - * @constructor Declaration - * @extends {Statement} - * @property {string} name - */ -const Declaration = Statement.extends(function Declaration( - kind, - name, - docs, - location -) { - Statement.apply(this, [kind || KIND, docs, location]); - this.name = name; -}); - -/** - * Generic flags parser - * @param {Integer[]} flags - * @return {void} - */ -Declaration.prototype.parseFlags = function(flags) { - this.isAbstract = flags[2] === 1; - this.isFinal = flags[2] === 2; - if (this.kind !== "class") { - if (flags[0] === -1) { - this.visibility = IS_UNDEFINED; - } else if (flags[0] === 0) { - this.visibility = IS_PUBLIC; - } else if (flags[0] === 1) { - this.visibility = IS_PROTECTED; - } else if (flags[0] === 2) { - this.visibility = IS_PRIVATE; - } - this.isStatic = flags[1] === 1; - } -}; - -module.exports = Declaration; diff --git a/src/ast/declare.js b/src/ast/declare.js deleted file mode 100644 index 376cc698b..000000000 --- a/src/ast/declare.js +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Block = require("./block"); -const KIND = "declare"; - -/** - * The declare construct is used to set execution directives for a block of code - * @constructor Declare - * @extends {Block} - * @property {Expression[]} what - * @property {String} mode - * @see http://php.net/manual/en/control-structures.declare.php - */ -const Declare = Block.extends(function Declare( - what, - body, - mode, - docs, - location -) { - Block.apply(this, [KIND, body, docs, location]); - this.what = what; - this.mode = mode; -}); - -/** - * The node is declared as a short tag syntax : - * ```php - * bar_$baz; - * ``` - * @constant {String} TYPE_OFFSET - `offset` - */ -Encapsed.TYPE_OFFSET = "offset"; - -module.exports = Encapsed; diff --git a/src/ast/entry.js b/src/ast/entry.js deleted file mode 100644 index 11805ac4e..000000000 --- a/src/ast/entry.js +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Node = require("./node"); -const KIND = "entry"; - -/** - * An array entry - see [Array](#array) - * @constructor Entry - * @extends {Node} - * @property {Node|null} key The entry key/offset - * @property {Node} value The entry value - */ -const Entry = Node.extends(function Entry(key, value, docs, location) { - Node.apply(this, [KIND, docs, location]); - this.key = key; - this.value = value; -}); - -module.exports = Entry; diff --git a/src/ast/error.js b/src/ast/error.js deleted file mode 100644 index be008d881..000000000 --- a/src/ast/error.js +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Node = require("./node"); -const KIND = "error"; - -/** - * Defines an error node (used only on silentMode) - * @constructor Error - * @extends {Node} - * @property {string} message - * @property {number} line - * @property {number|string} token - * @property {string|array} expected - */ -const Error = Node.extends(function Error( - message, - token, - line, - expected, - docs, - location -) { - Node.apply(this, [KIND, docs, location]); - this.message = message; - this.token = token; - this.line = line; - this.expected = expected; -}); - -module.exports = Error; diff --git a/src/ast/eval.js b/src/ast/eval.js deleted file mode 100644 index eacc7c455..000000000 --- a/src/ast/eval.js +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Statement = require("./statement"); -const KIND = "eval"; - -/** - * Defines an eval statement - * @constructor Eval - * @extends {Statement} - * @property {Node} source - */ -const Eval = Statement.extends(function Eval(source, docs, location) { - Statement.apply(this, [KIND, docs, location]); - this.source = source; -}); - -module.exports = Eval; diff --git a/src/ast/exit.js b/src/ast/exit.js deleted file mode 100644 index 7fad799d7..000000000 --- a/src/ast/exit.js +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Statement = require("./statement"); -const KIND = "exit"; - -/** - * Defines an exit / die call - * @constructor Exit - * @extends {Statement} - * @property {Node|null} status - * @property {Boolean} useDie - */ -const Exit = Statement.extends(function Exit(status, useDie, docs, location) { - Statement.apply(this, [KIND, docs, location]); - this.status = status; - this.useDie = useDie; -}); - -module.exports = Exit; diff --git a/src/ast/expression.js b/src/ast/expression.js deleted file mode 100644 index 2fe9bfd41..000000000 --- a/src/ast/expression.js +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Node = require("./node"); -const KIND = "expression"; - -/** - * Any expression node. Since the left-hand side of an assignment may - * be any expression in general, an expression can also be a pattern. - * @constructor Expression - * @extends {Node} - */ -const Expression = Node.extends(function Expression(kind, docs, location) { - Node.apply(this, [kind || KIND, docs, location]); -}); - -module.exports = Expression; diff --git a/src/ast/for.js b/src/ast/for.js deleted file mode 100644 index cba225f6e..000000000 --- a/src/ast/for.js +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Statement = require("./statement"); -const KIND = "for"; - -/** - * Defines a for iterator - * @constructor For - * @extends {Statement} - * @property {Expression[]} init - * @property {Expression[]} test - * @property {Expression[]} increment - * @property {Statement} body - * @property {boolean} shortForm - * @see http://php.net/manual/en/control-structures.for.php - */ -const For = Statement.extends(function For( - init, - test, - increment, - body, - shortForm, - docs, - location -) { - Statement.apply(this, [KIND, docs, location]); - this.init = init; - this.test = test; - this.increment = increment; - this.shortForm = shortForm; - this.body = body; -}); - -module.exports = For; diff --git a/src/ast/foreach.js b/src/ast/foreach.js deleted file mode 100644 index 8e64e91a1..000000000 --- a/src/ast/foreach.js +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Statement = require("./statement"); -const KIND = "foreach"; - -/** - * Defines a foreach iterator - * @constructor Foreach - * @extends {Statement} - * @property {Expression} source - * @property {Expression|null} key - * @property {Expression} value - * @property {Statement} body - * @property {boolean} shortForm - * @see http://php.net/manual/en/control-structures.foreach.php - */ -const Foreach = Statement.extends(function Foreach( - source, - key, - value, - body, - shortForm, - docs, - location -) { - Statement.apply(this, [KIND, docs, location]); - this.source = source; - this.key = key; - this.value = value; - this.shortForm = shortForm; - this.body = body; -}); - -module.exports = Foreach; diff --git a/src/ast/function.js b/src/ast/function.js deleted file mode 100644 index d07f088db..000000000 --- a/src/ast/function.js +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Declaration = require("./declaration"); -const KIND = "function"; - -/** - * Defines a classic function - * @constructor Function - * @extends {Declaration} - * @property {Parameter[]} arguments - * @property {Identifier} type - * @property {boolean} byref - * @property {boolean} nullable - * @property {Block|null} body - */ -const fn = Declaration.extends(function _Function( - name, - args, - byref, - type, - nullable, - docs, - location -) { - Declaration.apply(this, [KIND, name, docs, location]); - this.arguments = args; - this.byref = byref; - this.type = type; - this.nullable = nullable; - this.body = null; -}); -module.exports = fn; diff --git a/src/ast/global.js b/src/ast/global.js deleted file mode 100644 index 114049c75..000000000 --- a/src/ast/global.js +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Statement = require("./statement"); -const KIND = "global"; - -/** - * Imports a variable from the global scope - * @constructor Global - * @extends {Statement} - * @property {Variable[]} items - */ -const Global = Statement.extends(function Global(items, docs, location) { - Statement.apply(this, [KIND, docs, location]); - this.items = items; -}); - -module.exports = Global; diff --git a/src/ast/goto.js b/src/ast/goto.js deleted file mode 100644 index 6b0eb3c5f..000000000 --- a/src/ast/goto.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Statement = require("./statement"); -const KIND = "goto"; - -/** - * Defines goto statement - * @constructor Goto - * @extends {Statement} - * @property {String} label - * @see {Label} - */ -const Goto = Statement.extends(function Goto(label, docs, location) { - Statement.apply(this, [KIND, docs, location]); - this.label = label; -}); - -module.exports = Goto; diff --git a/src/ast/halt.js b/src/ast/halt.js deleted file mode 100644 index 8e4a65135..000000000 --- a/src/ast/halt.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Statement = require("./statement"); -const KIND = "halt"; - -/** - * Halts the compiler execution - * @constructor Halt - * @extends {Statement} - * @property {String} after - String after the halt statement - * @see http://php.net/manual/en/function.halt-compiler.php - */ -const Halt = Statement.extends(function Halt(after, docs, location) { - Statement.apply(this, [KIND, docs, location]); - this.after = after; -}); - -module.exports = Halt; diff --git a/src/ast/identifier.js b/src/ast/identifier.js deleted file mode 100644 index 8a006b0cc..000000000 --- a/src/ast/identifier.js +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Node = require("./node"); -const KIND = "identifier"; - -/** - * Defines an identifier node - * @constructor Identifier - * @extends {Node} - * @property {string} name - * @property {string} resolution - */ -const Identifier = Node.extends(function Identifier( - name, - isRelative, - docs, - location -) { - Node.apply(this, [KIND, docs, location]); - if (isRelative) { - this.resolution = Identifier.RELATIVE_NAME; - } else if (name.length === 1) { - this.resolution = Identifier.UNQUALIFIED_NAME; - } else if (name[0] === "") { - this.resolution = Identifier.FULL_QUALIFIED_NAME; - } else { - this.resolution = Identifier.QUALIFIED_NAME; - } - this.name = name.join("\\"); -}); - -/** - * This is an identifier without a namespace separator, such as Foo - * @constant {String} UNQUALIFIED_NAME - */ -Identifier.UNQUALIFIED_NAME = "uqn"; -/** - * This is an identifier with a namespace separator, such as Foo\Bar - * @constant {String} QUALIFIED_NAME - */ -Identifier.QUALIFIED_NAME = "qn"; -/** - * This is an identifier with a namespace separator that begins with - * a namespace separator, such as \Foo\Bar. The namespace \Foo is also - * a fully qualified name. - * @constant {String} FULL_QUALIFIED_NAME - */ -Identifier.FULL_QUALIFIED_NAME = "fqn"; -/** - * This is an identifier starting with namespace, such as namespace\Foo\Bar. - * @constant {String} RELATIVE_NAME - */ -Identifier.RELATIVE_NAME = "rn"; - -module.exports = Identifier; diff --git a/src/ast/if.js b/src/ast/if.js deleted file mode 100644 index 3d15b079e..000000000 --- a/src/ast/if.js +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Statement = require("./statement"); -const KIND = "if"; - -/** - * Defines a if statement - * @constructor If - * @extends {Statement} - * @property {Expression} test - * @property {Block} body - * @property {Block|If|null} alternate - * @property {boolean} shortForm - */ -const If = Statement.extends(function If( - test, - body, - alternate, - shortForm, - docs, - location -) { - Statement.apply(this, [KIND, docs, location]); - this.test = test; - this.body = body; - this.alternate = alternate; - this.shortForm = shortForm; -}); - -module.exports = If; diff --git a/src/ast/include.js b/src/ast/include.js deleted file mode 100644 index 1ea15aea5..000000000 --- a/src/ast/include.js +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Statement = require("./statement"); -const KIND = "include"; - -/** - * Defines system include call - * @constructor Include - * @extends {Statement} - * @property {Node} target - * @property {boolean} once - * @property {boolean} require - */ -const Include = Statement.extends(function Include( - once, - require, - target, - docs, - location -) { - Statement.apply(this, [KIND, docs, location]); - this.once = once; - this.require = require; - this.target = target; -}); - -module.exports = Include; diff --git a/src/ast/inline.js b/src/ast/inline.js deleted file mode 100644 index 3c3b34c45..000000000 --- a/src/ast/inline.js +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Literal = require("./literal"); -const KIND = "inline"; - -/** - * Defines inline html output (treated as echo output) - * @constructor Inline - * @extends {Literal} - */ -const Inline = Literal.extends(function Inline(value, raw, docs, location) { - Literal.apply(this, [KIND, value, raw, docs, location]); -}); - -module.exports = Inline; diff --git a/src/ast/interface.js b/src/ast/interface.js deleted file mode 100644 index 96a3c2c1f..000000000 --- a/src/ast/interface.js +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Declaration = require("./declaration"); -const KIND = "interface"; - -/** - * An interface definition - * @constructor Interface - * @extends {Declaration} - * @property {Identifier[]} extends - * @property {Declaration[]} body - */ -const Interface = Declaration.extends(function Interface( - name, - ext, - body, - docs, - location -) { - Declaration.apply(this, [KIND, name, docs, location]); - this.extends = ext; - this.body = body; -}); - -module.exports = Interface; diff --git a/src/ast/isset.js b/src/ast/isset.js deleted file mode 100644 index 01eeaa455..000000000 --- a/src/ast/isset.js +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Sys = require("./sys"); -const KIND = "isset"; - -/** - * Defines an isset call - * @constructor Isset - * @extends {Sys} - */ -const Isset = Sys.extends(function Isset(args, docs, location) { - Sys.apply(this, [KIND, args, docs, location]); -}); - -module.exports = Isset; diff --git a/src/ast/label.js b/src/ast/label.js deleted file mode 100644 index e7aed3fae..000000000 --- a/src/ast/label.js +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Node = require("./node"); -const KIND = "label"; - -/** - * A label statement (referenced by goto) - * @constructor Label - * @extends {Node} - * @property {String} name - */ -const Label = Node.extends(function Label(name, docs, location) { - Node.apply(this, [KIND, docs, location]); - this.name = name; -}); - -module.exports = Label; diff --git a/src/ast/list.js b/src/ast/list.js deleted file mode 100644 index 0fdbd7284..000000000 --- a/src/ast/list.js +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Sys = require("./sys"); -const KIND = "list"; - -/** - * Defines list assignment - * @constructor List - * @extends {Sys} - * @property {boolean} shortForm - */ -const List = Sys.extends(function List(items, shortForm, docs, location) { - Sys.apply(this, [KIND, items, docs, location]); - this.shortForm = shortForm; -}); - -module.exports = List; diff --git a/src/ast/literal.js b/src/ast/literal.js deleted file mode 100644 index be901f953..000000000 --- a/src/ast/literal.js +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Expr = require("./expression"); -const KIND = "literal"; - -/** - * Defines an array structure - * @constructor Literal - * @extends {Expression} - * @property {string} raw - * @property {Node|string|number|boolean|null} value - */ -const Literal = Expr.extends(function Literal( - kind, - value, - raw, - docs, - location -) { - Expr.apply(this, [kind || KIND, docs, location]); - this.value = value; - if (raw) { - this.raw = raw; - } -}); - -module.exports = Literal; diff --git a/src/ast/location.js b/src/ast/location.js deleted file mode 100644 index a0f5f46de..000000000 --- a/src/ast/location.js +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -/** - * Defines the location of the node (with it's source contents as string) - * @constructor Location - * @property {String|null} source - * @property {Position} start - * @property {Position} end - */ -const Location = function(source, start, end) { - this.source = source; - this.start = start; - this.end = end; -}; - -module.exports = Location; diff --git a/src/ast/lookup.js b/src/ast/lookup.js deleted file mode 100644 index 71278704e..000000000 --- a/src/ast/lookup.js +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Expr = require("./expression"); -const KIND = "lookup"; - -/** - * Lookup on an offset in the specified object - * @constructor Lookup - * @extends {Expression} - * @property {Expression} what - * @property {Expression} offset - */ -const Lookup = Expr.extends(function Lookup( - kind, - what, - offset, - docs, - location -) { - Expr.apply(this, [kind || KIND, docs, location]); - this.what = what; - this.offset = offset; -}); - -module.exports = Lookup; diff --git a/src/ast/magic.js b/src/ast/magic.js deleted file mode 100644 index a3329b484..000000000 --- a/src/ast/magic.js +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Literal = require("./literal"); -const KIND = "magic"; - -/** - * Defines magic constant - * @constructor Magic - * @extends {Literal} - */ -const Magic = Literal.extends(function Magic(value, raw, docs, location) { - Literal.apply(this, [KIND, value, raw, docs, location]); -}); - -module.exports = Magic; diff --git a/src/ast/method.js b/src/ast/method.js deleted file mode 100644 index 045bd85cd..000000000 --- a/src/ast/method.js +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const fn = require("./function"); -const KIND = "method"; - -/** - * Defines a class/interface/trait method - * @constructor Method - * @extends {Function} - * @property {boolean} isAbstract - * @property {boolean} isFinal - * @property {boolean} isStatic - * @property {string} visibility - */ -const Method = fn.extends(function Method() { - fn.apply(this, arguments); - this.kind = KIND; -}); - -module.exports = Method; diff --git a/src/ast/namespace.js b/src/ast/namespace.js deleted file mode 100644 index 2a4d41d2b..000000000 --- a/src/ast/namespace.js +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Block = require("./block"); -const KIND = "namespace"; - -/** - * The main program node - * @constructor Namespace - * @extends {Block} - * @property {String} name - * @property {Boolean} withBrackets - */ -const Namespace = Block.extends(function Namespace( - name, - children, - withBrackets, - docs, - location -) { - Block.apply(this, [KIND, children, docs, location]); - this.name = name; - this.withBrackets = withBrackets || false; -}); - -module.exports = Namespace; diff --git a/src/ast/new.js b/src/ast/new.js deleted file mode 100644 index 49b7a2123..000000000 --- a/src/ast/new.js +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Statement = require("./statement"); -const KIND = "new"; - -/** - * Creates a new instance of the specified class - * @constructor New - * @extends {Statement} - * @property {Identifier|Variable|Class} what - * @property {Arguments[]} arguments - */ -const New = Statement.extends(function New(what, args, docs, location) { - Statement.apply(this, [KIND, docs, location]); - this.what = what; - this.arguments = args; -}); - -module.exports = New; diff --git a/src/ast/node.js b/src/ast/node.js deleted file mode 100644 index 907851363..000000000 --- a/src/ast/node.js +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -/** - * A generic AST node - * @constructor Node - * @property {Location|null} loc - * @property {Comment[]} leadingComments - * @property {Comment[]?} trailingComments - * @property {String} kind - */ -const Node = function Node(kind, docs, location) { - this.kind = kind; - if (docs) { - this.leadingComments = docs; - } - if (location) { - this.loc = location; - } -}; - -/** - * Includes current token position of the parser - * @param {*} parser - */ -Node.prototype.includeToken = function(parser) { - if (this.loc) { - if (this.loc.end) { - this.loc.end.line = parser.lexer.yylloc.last_line; - this.loc.end.column = parser.lexer.yylloc.last_column; - this.loc.end.offset = parser.lexer.offset; - } - if (parser.ast.withSource) { - this.loc.source = parser.lexer._input.substring( - this.loc.start.offset, - parser.lexer.offset - ); - } - } - return this; -}; - -/** - * Helper for extending the Node class - * @param {Function} constructor - * @return {Function} - */ -Node.extends = function(constructor) { - constructor.prototype = Object.create(this.prototype); - constructor.extends = this.extends; - constructor.prototype.constructor = constructor; - return constructor; -}; - -module.exports = Node; diff --git a/src/ast/nowdoc.js b/src/ast/nowdoc.js deleted file mode 100644 index c26194caa..000000000 --- a/src/ast/nowdoc.js +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Literal = require("./literal"); -const KIND = "nowdoc"; - -/** - * Defines a nowdoc string - * @constructor String - * @extends {Literal} - * @property {String} label - * @property {String} raw - * @property {Boolean} quote - */ -const Nowdoc = Literal.extends(function Nowdoc( - value, - raw, - label, - quote, - docs, - location -) { - Literal.apply(this, [KIND, value, raw, docs, location]); - this.label = label; - this.quote = quote; -}); - -module.exports = Nowdoc; diff --git a/src/ast/number.js b/src/ast/number.js deleted file mode 100644 index dd51dfe70..000000000 --- a/src/ast/number.js +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Literal = require("./literal"); -const KIND = "number"; - -/** - * Defines a numeric value - * @constructor Number - * @extends {Literal} - */ -const _Number = Literal.extends(function Number(value, raw, docs, location) { - Literal.apply(this, [KIND, value, raw, docs, location]); -}); - -module.exports = _Number; diff --git a/src/ast/offsetlookup.js b/src/ast/offsetlookup.js deleted file mode 100644 index aeb4b98fa..000000000 --- a/src/ast/offsetlookup.js +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Lookup = require("./lookup"); -const KIND = "offsetlookup"; - -/** - * Lookup on an offset in an array - * @constructor OffsetLookup - * @extends {Lookup} - */ -const OffsetLookup = Lookup.extends(function OffsetLookup( - what, - offset, - docs, - location -) { - Lookup.apply(this, [KIND, what, offset, docs, location]); -}); - -module.exports = OffsetLookup; diff --git a/src/ast/operation.js b/src/ast/operation.js deleted file mode 100644 index 4cf9c34f1..000000000 --- a/src/ast/operation.js +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Expr = require("./expression"); -const KIND = "operation"; - -/** - * Defines binary operations - * @constructor Operation - * @extends {Expression} - */ -const Operation = Expr.extends(function Operation(kind, docs, location) { - Expr.apply(this, [kind || KIND, docs, location]); -}); - -module.exports = Operation; diff --git a/src/ast/parameter.js b/src/ast/parameter.js deleted file mode 100644 index ea5d880d2..000000000 --- a/src/ast/parameter.js +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Declaration = require("./declaration"); -const KIND = "parameter"; - -/** - * Defines a function parameter - * @constructor Parameter - * @extends {Declaration} - * @property {Identifier|null} type - * @property {Node|null} value - * @property {boolean} byref - * @property {boolean} variadic - * @property {boolean} nullable - */ -const Parameter = Declaration.extends(function Parameter( - name, - type, - value, - isRef, - isVariadic, - nullable, - docs, - location -) { - Declaration.apply(this, [KIND, name, docs, location]); - this.value = value; - this.type = type; - this.byref = isRef; - this.variadic = isVariadic; - this.nullable = nullable; -}); - -module.exports = Parameter; diff --git a/src/ast/parenthesis.js b/src/ast/parenthesis.js deleted file mode 100644 index d539e055a..000000000 --- a/src/ast/parenthesis.js +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Operation = require("./operation"); -const KIND = "parenthesis"; - -/** - * Parenthesis encapsulation `(... expr ...)` - * @constructor Parenthesis - * @extends {Operation} - * @property {Expression} inner - */ -const Parenthesis = Operation.extends(function Parenthesis( - inner, - docs, - location -) { - Operation.apply(this, [KIND, docs, location]); - this.inner = inner; -}); - -module.exports = Parenthesis; diff --git a/src/ast/position.js b/src/ast/position.js deleted file mode 100644 index bb08cd811..000000000 --- a/src/ast/position.js +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -/** - * Each Position object consists of a line number (1-indexed) and a column number (0-indexed): - * @constructor Position - * @property {Number} line - * @property {Number} column - * @property {Number} offset - */ -const Position = function(line, column, offset) { - this.line = line; - this.column = column; - this.offset = offset; -}; - -module.exports = Position; diff --git a/src/ast/post.js b/src/ast/post.js deleted file mode 100644 index f8e0bdf70..000000000 --- a/src/ast/post.js +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Operation = require("./operation"); -const KIND = "post"; - -/** - * Defines a post operation `$i++` or `$i--` - * @constructor Post - * @extends {Operation} - * @property {String} type - * @property {Variable} what - */ -const Post = Operation.extends(function Post(type, what, docs, location) { - Operation.apply(this, [KIND, docs, location]); - this.type = type; - this.what = what; -}); - -module.exports = Post; diff --git a/src/ast/pre.js b/src/ast/pre.js deleted file mode 100644 index afb11e588..000000000 --- a/src/ast/pre.js +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Operation = require("./operation"); -const KIND = "pre"; - -/** - * Defines a pre operation `++$i` or `--$i` - * @constructor Pre - * @extends {Operation} - * @property {String} type - * @property {Variable} what - */ -const Pre = Operation.extends(function Pre(type, what, docs, location) { - Operation.apply(this, [KIND, docs, location]); - this.type = type; - this.what = what; -}); - -module.exports = Pre; diff --git a/src/ast/print.js b/src/ast/print.js deleted file mode 100644 index 08c9f31f3..000000000 --- a/src/ast/print.js +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Sys = require("./sys"); -const KIND = "print"; - -/** - * Outputs - * @constructor Print - * @extends {Sys} - */ -const Print = Sys.extends(function Print(args, docs, location) { - Sys.apply(this, [KIND, args, docs, location]); -}); - -module.exports = Print; diff --git a/src/ast/program.js b/src/ast/program.js deleted file mode 100644 index 0ecaa949c..000000000 --- a/src/ast/program.js +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Block = require("./block"); -const KIND = "program"; - -/** - * The main program node - * @constructor Program - * @extends {Block} - * @property {Error[]} errors - * @property {Doc[]?} comments - * @property {String[]?} tokens - */ -const Program = Block.extends(function Program( - children, - errors, - comments, - tokens, - docs, - location -) { - Block.apply(this, [KIND, children, docs, location]); - this.errors = errors; - if (comments) { - this.comments = comments; - } - if (tokens) { - this.tokens = tokens; - } -}); - -module.exports = Program; diff --git a/src/ast/property.js b/src/ast/property.js deleted file mode 100644 index 17d3a77cd..000000000 --- a/src/ast/property.js +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Declaration = require("./declaration"); -const KIND = "property"; - -/** - * Defines a class property - * @constructor Property - * @extends {Declaration} - * @property {boolean} isFinal - * @property {boolean} isStatic - * @property {string} visibility - * @property {Node|null} value - */ -const Property = Declaration.extends(function Property( - name, - value, - flags, - docs, - location -) { - Declaration.apply(this, [KIND, name, docs, location]); - this.value = value; - this.parseFlags(flags); -}); - -module.exports = Property; diff --git a/src/ast/propertylookup.js b/src/ast/propertylookup.js deleted file mode 100644 index b05f82b80..000000000 --- a/src/ast/propertylookup.js +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Lookup = require("./lookup"); -const KIND = "propertylookup"; - -/** - * Lookup to an object property - * @constructor PropertyLookup - * @extends {Lookup} - */ -const PropertyLookup = Lookup.extends(function PropertyLookup( - what, - offset, - docs, - location -) { - Lookup.apply(this, [KIND, what, offset, docs, location]); -}); - -module.exports = PropertyLookup; diff --git a/src/ast/retif.js b/src/ast/retif.js deleted file mode 100644 index da6def606..000000000 --- a/src/ast/retif.js +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Statement = require("./statement"); -const KIND = "retif"; - -/** - * Defines a short if statement that returns a value - * @constructor RetIf - * @extends {Statement} - * @property {Expression} test - * @property {Expression} trueExpr - * @property {Expression} falseExpr - */ -const RetIf = Statement.extends(function RetIf( - test, - trueExpr, - falseExpr, - docs, - location -) { - Statement.apply(this, [KIND, docs, location]); - this.test = test; - this.trueExpr = trueExpr; - this.falseExpr = falseExpr; -}); - -module.exports = RetIf; diff --git a/src/ast/return.js b/src/ast/return.js deleted file mode 100644 index 8e77ed39a..000000000 --- a/src/ast/return.js +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Node = require("./node"); -const KIND = "return"; - -/** - * A continue statement - * @constructor Return - * @extends {Node} - * @property {Expression|null} expr - */ -const Return = Node.extends(function Return(expr, docs, location) { - Node.apply(this, [KIND, docs, location]); - this.expr = expr; -}); - -module.exports = Return; diff --git a/src/ast/silent.js b/src/ast/silent.js deleted file mode 100644 index 927232b15..000000000 --- a/src/ast/silent.js +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Statement = require("./statement"); -const KIND = "silent"; - -/** - * Avoids to show/log warnings & notices from the inner expression - * @constructor Silent - * @extends {Statement} - * @property {Expression} expr - */ -const Silent = Statement.extends(function Silent(expr, docs, location) { - Statement.apply(this, [KIND, docs, location]); - this.expr = expr; -}); - -module.exports = Silent; diff --git a/src/ast/statement.js b/src/ast/statement.js deleted file mode 100644 index 9cd96c35b..000000000 --- a/src/ast/statement.js +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Node = require("./node"); -const KIND = "statement"; - -/** - * Any statement. - * @constructor Statement - * @extends {Node} - */ -const Statement = Node.extends(function Statement(kind, docs, location) { - Node.apply(this, [kind || KIND, docs, location]); -}); - -module.exports = Statement; diff --git a/src/ast/static.js b/src/ast/static.js deleted file mode 100644 index b31e6c975..000000000 --- a/src/ast/static.js +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Statement = require("./statement"); -const KIND = "static"; - -/** - * Declares a static variable into the current scope - * @constructor Static - * @extends {Statement} - * @property {Variable[]|Assign[]} items - */ -const Static = Statement.extends(function Static(items, docs, location) { - Statement.apply(this, [KIND, docs, location]); - this.items = items; -}); - -module.exports = Static; diff --git a/src/ast/staticlookup.js b/src/ast/staticlookup.js deleted file mode 100644 index aeef1c3ec..000000000 --- a/src/ast/staticlookup.js +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Lookup = require("./lookup"); -const KIND = "staticlookup"; - -/** - * Lookup to a static property - * @constructor StaticLookup - * @extends {Lookup} - */ -const StaticLookup = Lookup.extends(function StaticLookup( - what, - offset, - docs, - location -) { - Lookup.apply(this, [KIND, what, offset, docs, location]); -}); - -module.exports = StaticLookup; diff --git a/src/ast/string.js b/src/ast/string.js deleted file mode 100644 index e5a625cd4..000000000 --- a/src/ast/string.js +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Literal = require("./literal"); -const KIND = "string"; - -/** - * Defines a string (simple ou double quoted) - chars are already escaped - * @constructor String - * @extends {Literal} - * @property {boolean} unicode - * @property {boolean} isDoubleQuote - * @see {Encapsed} - */ -const String = Literal.extends(function String( - isDoubleQuote, - value, - unicode, - raw, - docs, - location -) { - Literal.apply(this, [KIND, value, raw, docs, location]); - this.unicode = unicode; - this.isDoubleQuote = isDoubleQuote; -}); - -module.exports = String; diff --git a/src/ast/switch.js b/src/ast/switch.js deleted file mode 100644 index 3d9932468..000000000 --- a/src/ast/switch.js +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Statement = require("./statement"); -const KIND = "switch"; - -/** - * Defines a switch statement - * @constructor Switch - * @extends {Statement} - * @property {Expression} test - * @property {Block} body - * @property {boolean} shortForm - */ -const Switch = Statement.extends(function Switch( - test, - body, - shortForm, - docs, - location -) { - Statement.apply(this, [KIND, docs, location]); - this.test = test; - this.body = body; - this.shortForm = shortForm; -}); - -module.exports = Switch; diff --git a/src/ast/sys.js b/src/ast/sys.js deleted file mode 100644 index 747862309..000000000 --- a/src/ast/sys.js +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Statement = require("./statement"); -const KIND = "sys"; - -/** - * Defines system based call - * @constructor Sys - * @extends {Statement} - * @property {Node[]} arguments - */ -const Sys = Statement.extends(function Sys(kind, args, docs, location) { - Statement.apply(this, [kind || KIND, docs, location]); - this.arguments = args; -}); - -module.exports = Sys; diff --git a/src/ast/throw.js b/src/ast/throw.js deleted file mode 100644 index 92797f61a..000000000 --- a/src/ast/throw.js +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Statement = require("./statement"); -const KIND = "throw"; - -/** - * Defines a throw statement - * @constructor Throw - * @extends {Statement} - * @property {Expression} what - */ -const Throw = Statement.extends(function Throw(what, docs, location) { - Statement.apply(this, [KIND, docs, location]); - this.what = what; -}); - -module.exports = Throw; diff --git a/src/ast/trait.js b/src/ast/trait.js deleted file mode 100644 index 07a7b51e8..000000000 --- a/src/ast/trait.js +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Declaration = require("./declaration"); -const KIND = "trait"; - -/** - * A trait definition - * @constructor Trait - * @extends {Declaration} - * @property {Identifier|null} extends - * @property {Identifier[]} implements - * @property {Declaration[]} body - */ -const Trait = Declaration.extends(function Trait( - name, - ext, - impl, - body, - docs, - location -) { - Declaration.apply(this, [KIND, name, docs, location]); - this.extends = ext; - this.implements = impl; - this.body = body; -}); - -module.exports = Trait; diff --git a/src/ast/traitalias.js b/src/ast/traitalias.js deleted file mode 100644 index a8df69a03..000000000 --- a/src/ast/traitalias.js +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Node = require("./node"); -const KIND = "traitalias"; - -const IS_UNDEFINED = ""; -const IS_PUBLIC = "public"; -const IS_PROTECTED = "protected"; -const IS_PRIVATE = "private"; - -/** - * Defines a trait alias - * @constructor TraitAlias - * @extends {Node} - * @property {Identifier|null} trait - * @property {string} method - * @property {string|null} as - * @property {string|null} visibility - */ -const TraitAlias = Node.extends(function TraitAlias( - trait, - method, - as, - flags, - docs, - location -) { - Node.apply(this, [KIND, docs, location]); - this.trait = trait; - this.method = method; - this.as = as; - this.visibility = IS_UNDEFINED; - if (flags) { - if (flags[0] === 0) { - this.visibility = IS_PUBLIC; - } else if (flags[0] === 1) { - this.visibility = IS_PROTECTED; - } else if (flags[0] === 2) { - this.visibility = IS_PRIVATE; - } - } -}); - -module.exports = TraitAlias; diff --git a/src/ast/traitprecedence.js b/src/ast/traitprecedence.js deleted file mode 100644 index 8e3841d5f..000000000 --- a/src/ast/traitprecedence.js +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Node = require("./node"); -const KIND = "traitprecedence"; - -/** - * Defines a trait alias - * @constructor TraitPrecedence - * @extends {Node} - * @property {Identifier|null} trait - * @property {string} method - * @property {Identifier[]} instead - */ -const TraitPrecedence = Node.extends(function TraitPrecedence( - trait, - method, - instead, - docs, - location -) { - Node.apply(this, [KIND, docs, location]); - this.trait = trait; - this.method = method; - this.instead = instead; -}); - -module.exports = TraitPrecedence; diff --git a/src/ast/traituse.js b/src/ast/traituse.js deleted file mode 100644 index 5d130258f..000000000 --- a/src/ast/traituse.js +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Node = require("./node"); -const KIND = "traituse"; - -/** - * Defines a trait usage - * @constructor TraitUse - * @extends {Node} - * @property {Identifier[]} traits - * @property {Node[]|null} adaptations - */ -const TraitUse = Node.extends(function TraitUse( - traits, - adaptations, - docs, - location -) { - Node.apply(this, [KIND, docs, location]); - this.traits = traits; - this.adaptations = adaptations; -}); - -module.exports = TraitUse; diff --git a/src/ast/try.js b/src/ast/try.js deleted file mode 100644 index b44ddabb2..000000000 --- a/src/ast/try.js +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Statement = require("./statement"); -const KIND = "try"; - -/** - * Defines a try statement - * @constructor Try - * @extends {Statement} - * @property {Block} body - * @property {Catch[]} catches - * @property {Block} allways - */ -const Try = Statement.extends(function Try( - body, - catches, - always, - docs, - location -) { - Statement.apply(this, [KIND, docs, location]); - this.body = body; - this.catches = catches; - this.always = always; -}); - -module.exports = Try; diff --git a/src/ast/unary.js b/src/ast/unary.js deleted file mode 100644 index d94dd7fa0..000000000 --- a/src/ast/unary.js +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Operation = require("./operation"); -const KIND = "unary"; - -/** - * Unary operations - * @constructor Unary - * @extends {Operation} - * @property {String} type - * @property {Expression} what - */ -const Unary = Operation.extends(function Unary(type, what, docs, location) { - Operation.apply(this, [KIND, docs, location]); - this.type = type; - this.what = what; -}); - -module.exports = Unary; diff --git a/src/ast/unset.js b/src/ast/unset.js deleted file mode 100644 index 69fe65702..000000000 --- a/src/ast/unset.js +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Sys = require("./sys"); -const KIND = "unset"; - -/** - * Deletes references to a list of variables - * @constructor Unset - * @extends {Sys} - */ -const Unset = Sys.extends(function Unset(args, docs, location) { - Sys.apply(this, [KIND, args, docs, location]); -}); - -module.exports = Unset; diff --git a/src/ast/usegroup.js b/src/ast/usegroup.js deleted file mode 100644 index f790b6a89..000000000 --- a/src/ast/usegroup.js +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Statement = require("./statement"); -const KIND = "usegroup"; - -/** - * Defines a use statement (with a list of use items) - * @constructor UseGroup - * @extends {Statement} - * @property {String|null} name - * @property {String|null} type - Possible value : function, const - * @property {UseItem[]} item - * @see {Namespace} - * @see http://php.net/manual/en/language.namespaces.importing.php - */ -const UseGroup = Statement.extends(function UseGroup( - name, - type, - items, - docs, - location -) { - Statement.apply(this, [KIND, docs, location]); - this.name = name; - this.type = type; - this.items = items; -}); - -module.exports = UseGroup; diff --git a/src/ast/useitem.js b/src/ast/useitem.js deleted file mode 100644 index 83644a097..000000000 --- a/src/ast/useitem.js +++ /dev/null @@ -1,45 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Statement = require("./statement"); -const KIND = "useitem"; - -/** - * Defines a use statement (from namespace) - * @constructor UseItem - * @extends {Statement} - * @property {String} name - * @property {String|null} type - Possible value : function, const - * @property {String|null} alias - * @see {Namespace} - * @see http://php.net/manual/en/language.namespaces.importing.php - */ -const UseItem = Statement.extends(function UseItem( - name, - alias, - type, - docs, - location -) { - Statement.apply(this, [KIND, docs, location]); - this.name = name; - this.alias = alias; - this.type = type; -}); - -/** - * Importing a constant - * @constant {String} TYPE_CONST - */ -UseItem.TYPE_CONST = "const"; -/** - * Importing a function - * @constant {String} TYPE_FUNC - */ -UseItem.TYPE_FUNCTION = "function"; - -module.exports = UseItem; diff --git a/src/ast/variable.js b/src/ast/variable.js deleted file mode 100644 index a68f736c0..000000000 --- a/src/ast/variable.js +++ /dev/null @@ -1,43 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Expr = require("./expression"); -const KIND = "variable"; - -/** - * Any expression node. Since the left-hand side of an assignment may - * be any expression in general, an expression can also be a pattern. - * @constructor Variable - * @extends {Expression} - * @example - * // PHP code : - * &$foo - * // AST output - * { - * "kind": "variable", - * "name": "foo", - * "byref": true, - * "curly": false - * } - * @property {String|Node} name The variable name (can be a complex expression when the name is resolved dynamically) - * @property {boolean} byref Indicate if the variable reference is used, ex `&$foo` - * @property {boolean} curly Indicate if the name is defined between curlies, ex `${foo}` - */ -const Variable = Expr.extends(function Variable( - name, - byref, - curly, - docs, - location -) { - Expr.apply(this, [KIND, docs, location]); - this.name = name; - this.byref = byref || false; - this.curly = curly || false; -}); - -module.exports = Variable; diff --git a/src/ast/variadic.js b/src/ast/variadic.js deleted file mode 100644 index f9eced6e6..000000000 --- a/src/ast/variadic.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Expr = require("./expression"); -const KIND = "variadic"; - -/** - * Introduce a list of items into the arguments of the call - * @constructor variadic - * @extends {Expression} - * @property {Array|Expression} what - * @see https://wiki.php.net/rfc/argument_unpacking - */ -const variadic = Expr.extends(function variadic(what, docs, location) { - Expr.apply(this, [KIND, docs, location]); - this.what = what; -}); - -module.exports = variadic; diff --git a/src/ast/while.js b/src/ast/while.js deleted file mode 100644 index 1e200a4cb..000000000 --- a/src/ast/while.js +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Statement = require("./statement"); -const KIND = "while"; - -/** - * Defines a while statement - * @constructor While - * @extends {Statement} - * @property {Expression} test - * @property {Statement} body - * @property {boolean} shortForm - */ -const While = Statement.extends(function While( - test, - body, - shortForm, - docs, - location -) { - Statement.apply(this, [KIND, docs, location]); - this.test = test; - this.body = body; - this.shortForm = shortForm; -}); - -module.exports = While; diff --git a/src/ast/yield.js b/src/ast/yield.js deleted file mode 100644 index c0e2e28d4..000000000 --- a/src/ast/yield.js +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Expression = require("./expression"); -const KIND = "yield"; - -/** - * Defines a yield generator statement - * @constructor Yield - * @extends {Expression} - * @property {Expression|Null} value - * @property {Expression|Null} key - * @see http://php.net/manual/en/language.generators.syntax.php - */ -const Yield = Expression.extends(function Yield(value, key, docs, location) { - Expression.apply(this, [KIND, docs, location]); - this.value = value; - this.key = key; -}); - -module.exports = Yield; diff --git a/src/ast/yieldfrom.js b/src/ast/yieldfrom.js deleted file mode 100644 index 54fa97395..000000000 --- a/src/ast/yieldfrom.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const Expression = require("./expression"); -const KIND = "yieldfrom"; - -/** - * Defines a yield from generator statement - * @constructor YieldFrom - * @extends {Expression} - * @property {Expression} value - * @see http://php.net/manual/en/language.generators.syntax.php - */ -const YieldFrom = Expression.extends(function YieldFrom(value, docs, location) { - Expression.apply(this, [KIND, docs, location]); - this.value = value; -}); - -module.exports = YieldFrom; diff --git a/src/index.js b/src/index.js deleted file mode 100644 index 44b33bb7c..000000000 --- a/src/index.js +++ /dev/null @@ -1,216 +0,0 @@ -/*! - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const lexer = require("./lexer"); -const parser = require("./parser"); -const tokens = require("./tokens"); -const AST = require("./ast"); - -/** - * @private - */ -function combine(src, to) { - const keys = Object.keys(src); - let i = keys.length; - while (i--) { - const k = keys[i]; - const val = src[k]; - if (val === null) { - delete to[k]; - } else if (typeof val === "function") { - to[k] = val.bind(to); - } else if (Array.isArray(val)) { - to[k] = Array.isArray(to[k]) ? to[k].concat(val) : val; - } else if (typeof val === "object") { - to[k] = typeof to[k] === "object" ? combine(val, to[k]) : val; - } else { - to[k] = val; - } - } - return to; -} - -/** - * Initialise a new parser instance with the specified options - * - * @class - * @tutorial Engine - * @example - * var parser = require('php-parser'); - * var instance = new parser({ - * parser: { - * extractDoc: true, - * suppressErrors: true, - * php7: true - * }, - * ast: { - * withPositions: true - * }, - * lexer: { - * short_tags: true, - * asp_tags: true - * } - * }); - * - * var evalAST = instance.parseEval('some php code'); - * var codeAST = instance.parseCode(' Note that the output tokens are *STRICLY* similar to PHP function `token_get_all` - * @param {String} buffer - * @return {String[]} - Each item can be a string or an array with following informations [token_name, text, line_number] - */ -engine.prototype.tokenGetAll = function(buffer) { - this.lexer.mode_eval = false; - this.lexer.all_tokens = true; - buffer = getStringBuffer(buffer); - const EOF = this.lexer.EOF; - const names = this.tokens.values; - this.lexer.setInput(buffer); - let token = this.lexer.lex() || EOF; - const result = []; - while (token != EOF) { - let entry = this.lexer.yytext; - if (names.hasOwnProperty(token)) { - entry = [names[token], entry, this.lexer.yylloc.first_line]; - } - result.push(entry); - token = this.lexer.lex() || EOF; - } - return result; -}; - -// exports the function -module.exports = engine; - -// makes libraries public -module.exports.tokens = tokens; -module.exports.lexer = lexer; -module.exports.AST = AST; -module.exports.parser = parser; -module.exports.combine = combine; - -// allow the default export in index.d.ts -module.exports.default = engine; diff --git a/src/lexer.js b/src/lexer.js deleted file mode 100644 index 0254082d9..000000000 --- a/src/lexer.js +++ /dev/null @@ -1,461 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -/** - * This is the php lexer. It will tokenize the string for helping the - * parser to build the AST from its grammar. - * - * @class - * @property {Integer} EOF - * @property {Boolean} all_tokens defines if all tokens must be retrieved (used by token_get_all only) - * @property {Boolean} comment_tokens extracts comments tokens - * @property {Boolean} mode_eval enables the evald mode (ignore opening tags) - * @property {Boolean} asp_tags disables by default asp tags mode - * @property {Boolean} short_tags enables by default short tags mode - * @property {Object} keywords List of php keyword - * @property {Object} castKeywords List of php keywords for type casting - */ -const lexer = function(engine) { - this.engine = engine; - this.tok = this.engine.tokens.names; - this.EOF = 1; - this.debug = false; - this.all_tokens = true; - this.comment_tokens = false; - this.mode_eval = false; - this.asp_tags = false; - this.short_tags = true; - this.php7 = true; - this.yyprevcol = 0; - this.keywords = { - __class__: this.tok.T_CLASS_C, - __trait__: this.tok.T_TRAIT_C, - __function__: this.tok.T_FUNC_C, - __method__: this.tok.T_METHOD_C, - __line__: this.tok.T_LINE, - __file__: this.tok.T_FILE, - __dir__: this.tok.T_DIR, - __namespace__: this.tok.T_NS_C, - exit: this.tok.T_EXIT, - die: this.tok.T_EXIT, - function: this.tok.T_FUNCTION, - const: this.tok.T_CONST, - return: this.tok.T_RETURN, - try: this.tok.T_TRY, - catch: this.tok.T_CATCH, - finally: this.tok.T_FINALLY, - throw: this.tok.T_THROW, - if: this.tok.T_IF, - elseif: this.tok.T_ELSEIF, - endif: this.tok.T_ENDIF, - else: this.tok.T_ELSE, - while: this.tok.T_WHILE, - endwhile: this.tok.T_ENDWHILE, - do: this.tok.T_DO, - for: this.tok.T_FOR, - endfor: this.tok.T_ENDFOR, - foreach: this.tok.T_FOREACH, - endforeach: this.tok.T_ENDFOREACH, - declare: this.tok.T_DECLARE, - enddeclare: this.tok.T_ENDDECLARE, - instanceof: this.tok.T_INSTANCEOF, - as: this.tok.T_AS, - switch: this.tok.T_SWITCH, - endswitch: this.tok.T_ENDSWITCH, - case: this.tok.T_CASE, - default: this.tok.T_DEFAULT, - break: this.tok.T_BREAK, - continue: this.tok.T_CONTINUE, - goto: this.tok.T_GOTO, - echo: this.tok.T_ECHO, - print: this.tok.T_PRINT, - class: this.tok.T_CLASS, - interface: this.tok.T_INTERFACE, - trait: this.tok.T_TRAIT, - extends: this.tok.T_EXTENDS, - implements: this.tok.T_IMPLEMENTS, - new: this.tok.T_NEW, - clone: this.tok.T_CLONE, - var: this.tok.T_VAR, - eval: this.tok.T_EVAL, - include: this.tok.T_INCLUDE, - include_once: this.tok.T_INCLUDE_ONCE, - require: this.tok.T_REQUIRE, - require_once: this.tok.T_REQUIRE_ONCE, - namespace: this.tok.T_NAMESPACE, - use: this.tok.T_USE, - insteadof: this.tok.T_INSTEADOF, - global: this.tok.T_GLOBAL, - isset: this.tok.T_ISSET, - empty: this.tok.T_EMPTY, - __halt_compiler: this.tok.T_HALT_COMPILER, - static: this.tok.T_STATIC, - abstract: this.tok.T_ABSTRACT, - final: this.tok.T_FINAL, - private: this.tok.T_PRIVATE, - protected: this.tok.T_PROTECTED, - public: this.tok.T_PUBLIC, - unset: this.tok.T_UNSET, - list: this.tok.T_LIST, - array: this.tok.T_ARRAY, - callable: this.tok.T_CALLABLE, - or: this.tok.T_LOGICAL_OR, - and: this.tok.T_LOGICAL_AND, - xor: this.tok.T_LOGICAL_XOR - }; - this.castKeywords = { - int: this.tok.T_INT_CAST, - integer: this.tok.T_INT_CAST, - real: this.tok.T_DOUBLE_CAST, - double: this.tok.T_DOUBLE_CAST, - float: this.tok.T_DOUBLE_CAST, - string: this.tok.T_STRING_CAST, - binary: this.tok.T_STRING_CAST, - array: this.tok.T_ARRAY_CAST, - object: this.tok.T_OBJECT_CAST, - bool: this.tok.T_BOOL_CAST, - boolean: this.tok.T_BOOL_CAST, - unset: this.tok.T_UNSET_CAST - }; -}; - -/** - * Initialize the lexer with the specified input - */ -lexer.prototype.setInput = function(input) { - this._input = input; - this.size = input.length; - this.yylineno = 1; - this.offset = 0; - this.yyprevcol = 0; - this.yytext = ""; - this.yylloc = { - first_offset: 0, - first_line: 1, - first_column: 0, - prev_offset: 0, - prev_line: 1, - prev_column: 0, - last_line: 1, - last_column: 0 - }; - this.tokens = []; - this.done = this.offset >= this.size; - if (!this.all_tokens && this.mode_eval) { - this.conditionStack = ["INITIAL"]; - this.begin("ST_IN_SCRIPTING"); - } else { - this.conditionStack = []; - this.begin("INITIAL"); - } - return this; -}; - -/** - * consumes and returns one char from the input - */ -lexer.prototype.input = function() { - const ch = this._input[this.offset]; - if (!ch) return ""; - this.yytext += ch; - this.offset++; - if (ch === "\r" && this._input[this.offset] === "\n") { - this.yytext += "\n"; - this.offset++; - } - if (ch === "\n" || ch === "\r") { - this.yylloc.last_line = ++this.yylineno; - this.yyprevcol = this.yylloc.last_column; - this.yylloc.last_column = 0; - } else { - this.yylloc.last_column++; - } - return ch; -}; - -/** - * revert eating specified size - */ -lexer.prototype.unput = function(size) { - if (size === 1) { - // 1 char unput (most cases) - this.offset--; - if ( - this._input[this.offset] === "\n" && - this._input[this.offset - 1] === "\r" - ) { - this.offset--; - size++; - } - if ( - this._input[this.offset] === "\r" || - this._input[this.offset] === "\n" - ) { - this.yylloc.last_line--; - this.yylineno--; - this.yylloc.last_column = this.yyprevcol; - } else { - this.yylloc.last_column--; - } - this.yytext = this.yytext.substring(0, this.yytext.length - size); - } else if (size > 0) { - this.offset -= size; - if (size < this.yytext.length) { - this.yytext = this.yytext.substring(0, this.yytext.length - size); - // re-calculate position - this.yylloc.last_line = this.yylloc.first_line; - this.yylloc.last_column = this.yyprevcol = this.yylloc.first_column; - for (let i = 0; i < this.yytext.length; i++) { - let c = this.yytext[i]; - if (c === "\r") { - c = this.yytext[++i]; - this.yyprevcol = this.yylloc.last_column; - this.yylloc.last_line++; - this.yylloc.last_column = 0; - if (c !== "\n") { - if (c === "\r") { - this.yylloc.last_line++; - } else { - this.yylloc.last_column++; - } - } - } else if (c === "\n") { - this.yyprevcol = this.yylloc.last_column; - this.yylloc.last_line++; - this.yylloc.last_column = 0; - } else { - this.yylloc.last_column++; - } - } - this.yylineno = this.yylloc.last_line; - } else { - // reset full text - this.yytext = ""; - this.yylloc.last_line = this.yylineno = this.yylloc.first_line; - this.yylloc.last_column = this.yylloc.first_column; - } - } - - return this; -}; - -// check if the text matches -lexer.prototype.tryMatch = function(text) { - return text === this.ahead(text.length); -}; - -// check if the text matches -lexer.prototype.tryMatchCaseless = function(text) { - return text === this.ahead(text.length).toLowerCase(); -}; - -// look ahead -lexer.prototype.ahead = function(size) { - let text = this._input.substring(this.offset, this.offset + size); - if ( - text[text.length - 1] === "\r" && - this._input[this.offset + size + 1] === "\n" - ) { - text += "\n"; - } - return text; -}; - -// consume the specified size -lexer.prototype.consume = function(size) { - for (let i = 0; i < size; i++) { - const ch = this._input[this.offset]; - if (!ch) break; - this.yytext += ch; - this.offset++; - if (ch === "\r" && this._input[this.offset] === "\n") { - this.yytext += "\n"; - this.offset++; - i++; - } - if (ch === "\n" || ch === "\r") { - this.yylloc.last_line = ++this.yylineno; - this.yyprevcol = this.yylloc.last_column; - this.yylloc.last_column = 0; - } else { - this.yylloc.last_column++; - } - } - return this; -}; - -/** - * Gets the current state - */ -lexer.prototype.getState = function() { - return { - yytext: this.yytext, - offset: this.offset, - yylineno: this.yylineno, - yyprevcol: this.yyprevcol, - yylloc: { - first_offset: this.yylloc.first_offset, - first_line: this.yylloc.first_line, - first_column: this.yylloc.first_column, - last_line: this.yylloc.last_line, - last_column: this.yylloc.last_column - } - }; -}; - -/** - * Sets the current lexer state - */ -lexer.prototype.setState = function(state) { - this.yytext = state.yytext; - this.offset = state.offset; - this.yylineno = state.yylineno; - this.yyprevcol = state.yyprevcol; - this.yylloc = state.yylloc; - return this; -}; - -// prepend next token -lexer.prototype.appendToken = function(value, ahead) { - this.tokens.push([value, ahead]); - return this; -}; - -// return next match that has a token -lexer.prototype.lex = function() { - this.yylloc.prev_offset = this.offset; - this.yylloc.prev_line = this.yylloc.last_line; - this.yylloc.prev_column = this.yylloc.last_column; - let token = this.next() || this.lex(); - if (!this.all_tokens) { - while ( - token === this.tok.T_WHITESPACE || // ignore white space - (!this.comment_tokens && - (token === this.tok.T_COMMENT || // ignore single lines comments - token === this.tok.T_DOC_COMMENT)) || // ignore doc comments - // ignore open tags - token === this.tok.T_OPEN_TAG - ) { - token = this.next() || this.lex(); - } - if (token == this.tok.T_OPEN_TAG_WITH_ECHO) { - // https://github.com/php/php-src/blob/7ff186434e82ee7be7c59d0db9a976641cf7b09c/Zend/zend_compile.c#L1683 - // open tag with echo statement - return this.tok.T_ECHO; - } else if (token === this.tok.T_CLOSE_TAG) { - // https://github.com/php/php-src/blob/7ff186434e82ee7be7c59d0db9a976641cf7b09c/Zend/zend_compile.c#L1680 - return ";"; /* implicit ; */ - } - } - if (!this.yylloc.prev_offset) { - this.yylloc.prev_offset = this.yylloc.first_offset; - this.yylloc.prev_line = this.yylloc.first_line; - this.yylloc.prev_column = this.yylloc.first_column; - } - /*else if (this.yylloc.prev_offset === this.offset && this.offset !== this.size) { - throw new Error('Infinite loop @ ' + this.offset + ' / ' + this.size); - }*/ - return token; -}; - -// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) -lexer.prototype.begin = function(condition) { - this.conditionStack.push(condition); - this.curCondition = condition; - this.stateCb = this["match" + condition]; - if (typeof this.stateCb !== "function") { - throw new Error('Undefined condition state "' + condition + '"'); - } - return this; -}; - -// pop the previously active lexer condition state off the condition stack -lexer.prototype.popState = function() { - const n = this.conditionStack.length - 1; - const condition = n > 0 ? this.conditionStack.pop() : this.conditionStack[0]; - this.curCondition = this.conditionStack[this.conditionStack.length - 1]; - this.stateCb = this["match" + this.curCondition]; - if (typeof this.stateCb !== "function") { - throw new Error('Undefined condition state "' + this.curCondition + '"'); - } - return condition; -}; - -// return next match in input -lexer.prototype.next = function() { - let token; - if (!this._input) { - this.done = true; - } - this.yylloc.first_offset = this.offset; - this.yylloc.first_line = this.yylloc.last_line; - this.yylloc.first_column = this.yylloc.last_column; - this.yytext = ""; - if (this.done) { - this.yylloc.prev_offset = this.yylloc.first_offset; - this.yylloc.prev_line = this.yylloc.first_line; - this.yylloc.prev_column = this.yylloc.first_column; - return this.EOF; - } - if (this.tokens.length > 0) { - token = this.tokens.shift(); - if (typeof token[1] === "object") { - this.setState(token[1]); - } else { - this.consume(token[1]); - } - token = token[0]; - } else { - token = this.stateCb.apply(this, []); - } - if (this.offset >= this.size && this.tokens.length === 0) { - this.done = true; - } - if (this.debug) { - let tName = token; - if (typeof tName === "number") { - tName = this.engine.tokens.values[tName]; - } else { - tName = '"' + tName + '"'; - } - const e = new Error( - tName + - "\tfrom " + - this.yylloc.first_line + - "," + - this.yylloc.first_column + - "\t - to " + - this.yylloc.last_line + - "," + - this.yylloc.last_column + - '\t"' + - this.yytext + - '"' - ); - // eslint-disable-next-line no-console - console.error(e.stack); - } - return token; -}; - -// extends the lexer with states -[ - require("./lexer/comments.js"), - require("./lexer/initial.js"), - require("./lexer/numbers.js"), - require("./lexer/property.js"), - require("./lexer/scripting.js"), - require("./lexer/strings.js"), - require("./lexer/tokens.js"), - require("./lexer/utils.js") -].forEach(function(ext) { - for (const k in ext) { - lexer.prototype[k] = ext[k]; - } -}); - -module.exports = lexer; diff --git a/src/lexer/comments.js b/src/lexer/comments.js deleted file mode 100644 index d38240562..000000000 --- a/src/lexer/comments.js +++ /dev/null @@ -1,63 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -module.exports = { - /** - * Reads a single line comment - */ - T_COMMENT: function() { - while (this.offset < this.size) { - const ch = this.input(); - if (ch === "\n" || ch === "\r") { - return this.tok.T_COMMENT; - } else if ( - ch === "?" && - !this.aspTagMode && - this._input[this.offset] === ">" - ) { - this.unput(1); - return this.tok.T_COMMENT; - } else if ( - ch === "%" && - this.aspTagMode && - this._input[this.offset] === ">" - ) { - this.unput(1); - return this.tok.T_COMMENT; - } - } - return this.tok.T_COMMENT; - }, - /** - * Behaviour : https://github.com/php/php-src/blob/master/Zend/zend_language_scanner.l#L1927 - */ - T_DOC_COMMENT: function() { - let ch = this.input(); - let token = this.tok.T_COMMENT; - if (ch === "*") { - // started with '/*' , check is next is '*' - ch = this.input(); - if (this.is_WHITESPACE()) { - // check if next is WHITESPACE - token = this.tok.T_DOC_COMMENT; - } - if (ch === "/") { - return token; - } else { - this.unput(1); // reset - } - } - while (this.offset < this.size) { - ch = this.input(); - if (ch === "*" && this._input[this.offset] === "/") { - this.input(); - break; - } - } - return token; - } -}; diff --git a/src/lexer/initial.js b/src/lexer/initial.js deleted file mode 100644 index 03bb9d7d7..000000000 --- a/src/lexer/initial.js +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -module.exports = { - nextINITIAL: function() { - if ( - this.conditionStack.length > 1 && - this.conditionStack[this.conditionStack.length - 1] === "INITIAL" - ) { - // Return to HEREDOC/ST_DOUBLE_QUOTES mode - this.popState(); - } else { - this.begin("ST_IN_SCRIPTING"); - } - return this; - }, - matchINITIAL: function() { - while (this.offset < this.size) { - let ch = this.input(); - if (ch == "<") { - ch = this.ahead(1); - if (ch == "?") { - if (this.tryMatch("?=")) { - this.unput(1) - .appendToken(this.tok.T_OPEN_TAG_WITH_ECHO, 3) - .nextINITIAL(); - break; - } else if (this.tryMatchCaseless("?php")) { - ch = this._input[this.offset + 4]; - if (ch === " " || ch === "\t" || ch === "\n" || ch === "\r") { - this.unput(1) - .appendToken(this.tok.T_OPEN_TAG, 6) - .nextINITIAL(); - break; - } - } - if (this.short_tags) { - this.unput(1) - .appendToken(this.tok.T_OPEN_TAG, 2) - .nextINITIAL(); - break; - } - } else if (this.asp_tags && ch == "%") { - if (this.tryMatch("%=")) { - this.aspTagMode = true; - this.unput(1) - .appendToken(this.tok.T_OPEN_TAG_WITH_ECHO, 3) - .nextINITIAL(); - break; - } else { - this.aspTagMode = true; - this.unput(1) - .appendToken(this.tok.T_OPEN_TAG, 2) - .nextINITIAL(); - break; - } - } - } - } - if (this.yytext.length > 0) { - return this.tok.T_INLINE_HTML; - } else { - return false; - } - } -}; diff --git a/src/lexer/numbers.js b/src/lexer/numbers.js deleted file mode 100644 index e2b2a02a2..000000000 --- a/src/lexer/numbers.js +++ /dev/null @@ -1,120 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -/* istanbul ignore else */ -let MAX_LENGTH_OF_LONG = 10; -let long_min_digits = "2147483648"; -if (process.arch == "x64") { - MAX_LENGTH_OF_LONG = 19; - long_min_digits = "9223372036854775808"; -} - -module.exports = { - consume_NUM: function() { - let ch = this.yytext[0]; - let hasPoint = this.yytext[0] === "."; - if (ch === "0") { - ch = this.input(); - // check if hexa - if (ch === "x" || ch === "X") { - ch = this.input(); - if (this.is_HEX()) { - return this.consume_HNUM(); - } else { - this.unput(ch ? 2 : 1); - } - } else if (ch === "b" || ch === "B") { - ch = this.input(); - if (ch === "0" || ch === "1") { - return this.consume_BNUM(); - } else { - this.unput(ch ? 2 : 1); - } - } else if (!this.is_NUM()) { - if (ch) this.unput(1); - } - } - - while (this.offset < this.size) { - ch = this.input(); - if (!this.is_NUM()) { - if (ch === "." && !hasPoint) { - hasPoint = true; - } else if (ch === "e" || ch === "E") { - ch = this.input(); - if (ch === "+" || ch === "-") { - ch = this.input(); - if (this.is_NUM()) { - this.consume_LNUM(); - return this.tok.T_DNUMBER; - } else { - this.unput(ch ? 3 : 2); - break; - } - } else if (this.is_NUM()) { - this.consume_LNUM(); - return this.tok.T_DNUMBER; - } else { - this.unput(ch ? 2 : 1); - break; - } - } else { - if (ch) this.unput(1); - break; - } - } - } - if (hasPoint) { - return this.tok.T_DNUMBER; - } else if (this.yytext.length < MAX_LENGTH_OF_LONG - 1) { - return this.tok.T_LNUMBER; - } else { - if ( - this.yytext.length < MAX_LENGTH_OF_LONG || - (this.yytext.length == MAX_LENGTH_OF_LONG && - this.yytext < long_min_digits) - ) { - return this.tok.T_LNUMBER; - } - return this.tok.T_DNUMBER; - } - }, - // read hexa - consume_HNUM: function() { - while (this.offset < this.size) { - const ch = this.input(); - if (!this.is_HEX()) { - if (ch) this.unput(1); - break; - } - } - return this.tok.T_LNUMBER; - }, - // read a generic number - consume_LNUM: function() { - while (this.offset < this.size) { - const ch = this.input(); - if (!this.is_NUM()) { - if (ch) this.unput(1); - break; - } - } - return this.tok.T_LNUMBER; - }, - // read binary - consume_BNUM: function() { - let ch; - while (this.offset < this.size) { - ch = this.input(); - if (ch !== "0" && ch !== "1") { - if (ch) this.unput(1); - break; - } - } - return this.tok.T_LNUMBER; - } -}; diff --git a/src/lexer/property.js b/src/lexer/property.js deleted file mode 100644 index 6d6d5b1b2..000000000 --- a/src/lexer/property.js +++ /dev/null @@ -1,94 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -module.exports = { - matchST_LOOKING_FOR_PROPERTY: function() { - let ch = this.input(); - if (ch === "-") { - ch = this.input(); - if (ch === ">") { - // https://github.com/php/php-src/blob/master/Zend/zend_language_scanner.l#L1296 - return this.tok.T_OBJECT_OPERATOR; - } - if (ch) this.unput(1); - } else if (this.is_WHITESPACE()) { - return this.tok.T_WHITESPACE; - } else if (this.is_LABEL_START()) { - // https://github.com/php/php-src/blob/master/Zend/zend_language_scanner.l#L1300 - this.consume_LABEL(); - this.popState(); - return this.tok.T_STRING; - } - // https://github.com/php/php-src/blob/master/Zend/zend_language_scanner.l#L1306 - this.popState(); - if (ch) this.unput(1); - return false; - }, - matchST_LOOKING_FOR_VARNAME: function() { - let ch = this.input(); - - // SHIFT STATE - this.popState(); - this.begin("ST_IN_SCRIPTING"); - - if (this.is_LABEL_START()) { - this.consume_LABEL(); - ch = this.input(); - if (ch === "[" || ch === "}") { - this.unput(1); - return this.tok.T_STRING_VARNAME; - } else { - // any char (that's started with a label sequence) - this.unput(this.yytext.length); - } - } else { - // any char (thats not a label start sequence) - if (ch) this.unput(1); - } - // stops looking for a varname and starts the scripting mode - return false; - }, - matchST_VAR_OFFSET: function() { - const ch = this.input(); - if (this.is_NUM()) { - this.consume_NUM(); - return this.tok.T_NUM_STRING; - } else if (ch === "]") { - this.popState(); - return "]"; - } else if (ch === "$") { - this.input(); - if (this.is_LABEL_START()) { - this.consume_LABEL(); - return this.tok.T_VARIABLE; - } else { - throw new Error("Unexpected terminal"); - } - } else if (this.is_LABEL_START()) { - this.consume_LABEL(); - return this.tok.T_STRING; - } else if ( - this.is_WHITESPACE() || - ch === "\\" || - ch === "'" || - ch === "#" - ) { - return this.tok.T_ENCAPSED_AND_WHITESPACE; - } else if ( - ch === "[" || - ch === "{" || - ch === "}" || - ch === '"' || - ch === "`" || - this.is_TOKEN() - ) { - return ch; - } else { - throw new Error("Unexpected terminal"); - } - } -}; diff --git a/src/lexer/scripting.js b/src/lexer/scripting.js deleted file mode 100644 index a577290b3..000000000 --- a/src/lexer/scripting.js +++ /dev/null @@ -1,108 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -module.exports = { - matchST_IN_SCRIPTING: function() { - let ch = this.input(); - switch (ch) { - case " ": - case "\t": - case "\n": - case "\r": - case "\r\n": - return this.T_WHITESPACE(); - case "#": - return this.T_COMMENT(); - case "/": - if (this._input[this.offset] === "/") { - return this.T_COMMENT(); - } else if (this._input[this.offset] === "*") { - this.input(); - return this.T_DOC_COMMENT(); - } - return this.consume_TOKEN(); - case "'": - return this.T_CONSTANT_ENCAPSED_STRING(); - case '"': - return this.ST_DOUBLE_QUOTES(); - case "`": - this.begin("ST_BACKQUOTE"); - return "`"; - case "?": - if (!this.aspTagMode && this.tryMatch(">")) { - this.input(); - const nextCH = this._input[this.offset]; - if (nextCH === "\n" || nextCH === "\r") this.input(); - if (this.conditionStack.length > 1) { - this.begin("INITIAL"); - } - return this.tok.T_CLOSE_TAG; - } - return this.consume_TOKEN(); - case "%": - if (this.aspTagMode && this._input[this.offset] === ">") { - this.input(); // consume the '>' - ch = this._input[this.offset]; // read next - if (ch === "\n" || ch === "\r") { - this.input(); // consume the newline - } - this.aspTagMode = false; - if (this.conditionStack.length > 1) { - this.begin("INITIAL"); - } - return this.tok.T_CLOSE_TAG; - } - return this.consume_TOKEN(); - case "{": - this.begin("ST_IN_SCRIPTING"); - return "{"; - case "}": - if (this.conditionStack.length > 2) { - // Return to HEREDOC/ST_DOUBLE_QUOTES mode - this.popState(); - } - return "}"; - default: - if (ch === ".") { - ch = this.input(); - if (this.is_NUM()) { - return this.consume_NUM(); - } else { - if (ch) this.unput(1); - } - } - if (this.is_NUM()) { - return this.consume_NUM(); - } else if (this.is_LABEL_START()) { - return this.consume_LABEL().T_STRING(); - } else if (this.is_TOKEN()) { - return this.consume_TOKEN(); - } - } - throw new Error( - 'Bad terminal sequence "' + - ch + - '" at line ' + - this.yylineno + - " (offset " + - this.offset + - ")" - ); - }, - - T_WHITESPACE: function() { - while (this.offset < this.size) { - const ch = this.input(); - if (ch === " " || ch === "\t" || ch === "\n" || ch === "\r") { - continue; - } - if (ch) this.unput(1); - break; - } - return this.tok.T_WHITESPACE; - } -}; diff --git a/src/lexer/strings.js b/src/lexer/strings.js deleted file mode 100644 index d2d0100bd..000000000 --- a/src/lexer/strings.js +++ /dev/null @@ -1,417 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -module.exports = { - T_CONSTANT_ENCAPSED_STRING: function() { - let ch; - while (this.offset < this.size) { - ch = this.input(); - if (ch == "\\") { - this.input(); - } else if (ch == "'") { - break; - } - } - return this.tok.T_CONSTANT_ENCAPSED_STRING; - }, - // check if matching a HEREDOC state - is_HEREDOC: function() { - const revert = this.offset; - if ( - this._input[this.offset - 1] === "<" && - this._input[this.offset] === "<" && - this._input[this.offset + 1] === "<" - ) { - this.offset += 3; - - // optional tabs / spaces - if (this.is_TABSPACE()) { - while (this.offset < this.size) { - this.offset++; - if (!this.is_TABSPACE()) { - break; - } - } - } - - // optional quotes - let tChar = this._input[this.offset - 1]; - if (tChar === "'" || tChar === '"') { - this.offset++; - } else { - tChar = null; - } - - // required label - if (this.is_LABEL_START()) { - let yyoffset = this.offset - 1; - while (this.offset < this.size) { - this.offset++; - if (!this.is_LABEL()) { - break; - } - } - const yylabel = this._input.substring(yyoffset, this.offset - 1); - if (!tChar || tChar === this._input[this.offset - 1]) { - // required ending quote - if (tChar) this.offset++; - // require newline - if ( - this._input[this.offset - 1] === "\r" || - this._input[this.offset - 1] === "\n" - ) { - // go go go - this.heredoc_label = yylabel; - yyoffset = this.offset - revert; - this.offset = revert; - this.consume(yyoffset); - if (tChar === "'") { - this.begin("ST_NOWDOC"); - } else { - this.begin("ST_HEREDOC"); - } - return this.tok.T_START_HEREDOC; - } - } - } - } - this.offset = revert; - return false; - }, - ST_DOUBLE_QUOTES: function() { - let ch; - while (this.offset < this.size) { - ch = this.input(); - if (ch == "\\") { - this.input(); - } else if (ch == '"') { - break; - } else if (ch == "$") { - ch = this.input(); - if (ch == "{" || this.is_LABEL_START()) { - this.unput(2); - break; - } - if (ch) this.unput(1); - } else if (ch == "{") { - ch = this.input(); - if (ch == "$") { - this.unput(2); - break; - } - if (ch) this.unput(1); - } - } - if (ch == '"') { - return this.tok.T_CONSTANT_ENCAPSED_STRING; - } else { - let prefix = 1; - if (this.yytext[0] === "b" || this.yytext[0] === "B") { - prefix = 2; - } - if (this.yytext.length > 2) { - this.appendToken( - this.tok.T_ENCAPSED_AND_WHITESPACE, - this.yytext.length - prefix - ); - } - this.unput(this.yytext.length - prefix); - this.begin("ST_DOUBLE_QUOTES"); - return this.yytext; - } - }, - - // check if its a DOC end sequence - isDOC_MATCH: function() { - // @fixme : check if out of text limits - if ( - this._input.substring( - this.offset - 1, - this.offset - 1 + this.heredoc_label.length - ) === this.heredoc_label - ) { - const ch = this._input[this.offset - 1 + this.heredoc_label.length]; - if (ch === "\n" || ch === "\r" || ch === ";") { - return true; - } - } - return false; - }, - - matchST_NOWDOC: function() { - /** edge case : empty now doc **/ - if (this.isDOC_MATCH()) { - // @fixme : never reached (may be caused by quotes) - this.consume(this.heredoc_label.length); - this.popState(); - return this.tok.T_END_HEREDOC; - } - /** SCANNING CONTENTS **/ - let ch = this._input[this.offset - 1]; - while (this.offset < this.size) { - if (ch === "\n" || ch === "\r") { - ch = this.input(); - if (this.isDOC_MATCH()) { - this.unput(1).popState(); - this.appendToken(this.tok.T_END_HEREDOC, this.heredoc_label.length); - return this.tok.T_ENCAPSED_AND_WHITESPACE; - } - } else { - ch = this.input(); - } - } - // too bad ! reached end of document (will get a parse error) - return this.tok.T_ENCAPSED_AND_WHITESPACE; - }, - - matchST_HEREDOC: function() { - /** edge case : empty here doc **/ - let ch = this.input(); - if (this.isDOC_MATCH()) { - this.consume(this.heredoc_label.length - 1); - this.popState(); - return this.tok.T_END_HEREDOC; - } - /** SCANNING CONTENTS **/ - while (this.offset < this.size) { - if (ch === "\\") { - ch = this.input(); // ignore next - if (ch !== "\n" && ch !== "\r") { - ch = this.input(); - } - } - - if (ch === "\n" || ch === "\r") { - ch = this.input(); - if (this.isDOC_MATCH()) { - this.unput(1).popState(); - this.appendToken(this.tok.T_END_HEREDOC, this.heredoc_label.length); - return this.tok.T_ENCAPSED_AND_WHITESPACE; - } - } else if (ch === "$") { - ch = this.input(); - if (ch === "{") { - // start of ${ - this.begin("ST_LOOKING_FOR_VARNAME"); - if (this.yytext.length > 2) { - this.appendToken(this.tok.T_DOLLAR_OPEN_CURLY_BRACES, 2); - this.unput(2); - return this.tok.T_ENCAPSED_AND_WHITESPACE; - } else { - return this.tok.T_DOLLAR_OPEN_CURLY_BRACES; - } - } else if (this.is_LABEL_START()) { - // start of $var... - const yyoffset = this.offset; - const next = this.consume_VARIABLE(); - if (this.yytext.length > this.offset - yyoffset + 2) { - this.appendToken(next, this.offset - yyoffset + 2); - this.unput(this.offset - yyoffset + 2); - return this.tok.T_ENCAPSED_AND_WHITESPACE; - } else { - return next; - } - //console.log(this.yytext); - } - } else if (ch === "{") { - ch = this.input(); - if (ch === "$") { - // start of {$... - this.begin("ST_IN_SCRIPTING"); - if (this.yytext.length > 2) { - this.appendToken(this.tok.T_CURLY_OPEN, 1); - this.unput(2); - return this.tok.T_ENCAPSED_AND_WHITESPACE; - } else { - this.unput(1); - return this.tok.T_CURLY_OPEN; - } - } - } else { - ch = this.input(); - } - } - - // too bad ! reached end of document (will get a parse error) - return this.tok.T_ENCAPSED_AND_WHITESPACE; - }, - - consume_VARIABLE: function() { - this.consume_LABEL(); - const ch = this.input(); - if (ch == "[") { - this.unput(1); - this.begin("ST_VAR_OFFSET"); - return this.tok.T_VARIABLE; - } else if (ch === "-") { - if (this.input() === ">") { - this.input(); - if (this.is_LABEL_START()) { - this.begin("ST_LOOKING_FOR_PROPERTY"); - } - this.unput(3); - return this.tok.T_VARIABLE; - } else { - this.unput(2); - } - } else { - if (ch) this.unput(1); - } - return this.tok.T_VARIABLE; - }, - // HANDLES BACKQUOTES - matchST_BACKQUOTE: function() { - let ch = this.input(); - if (ch === "$") { - ch = this.input(); - if (ch === "{") { - this.begin("ST_LOOKING_FOR_VARNAME"); - return this.tok.T_DOLLAR_OPEN_CURLY_BRACES; - } else if (this.is_LABEL_START()) { - const tok = this.consume_VARIABLE(); - return tok; - } - } else if (ch === "{") { - if (this._input[this.offset] === "$") { - this.begin("ST_IN_SCRIPTING"); - return this.tok.T_CURLY_OPEN; - } - } else if (ch === "`") { - this.popState(); - return "`"; - } - - // any char - while (this.offset < this.size) { - if (ch === "\\") { - this.input(); - } else if (ch === "`") { - this.unput(1); - this.popState(); - this.appendToken("`", 1); - break; - } else if (ch === "$") { - ch = this.input(); - if (ch === "{") { - this.begin("ST_LOOKING_FOR_VARNAME"); - if (this.yytext.length > 2) { - this.appendToken(this.tok.T_DOLLAR_OPEN_CURLY_BRACES, 2); - this.unput(2); - return this.tok.T_ENCAPSED_AND_WHITESPACE; - } else { - return this.tok.T_DOLLAR_OPEN_CURLY_BRACES; - } - } else if (this.is_LABEL_START()) { - // start of $var... - const yyoffset = this.offset; - const next = this.consume_VARIABLE(); - if (this.yytext.length > this.offset - yyoffset + 2) { - this.appendToken(next, this.offset - yyoffset + 2); - this.unput(this.offset - yyoffset + 2); - return this.tok.T_ENCAPSED_AND_WHITESPACE; - } else { - return next; - } - } - continue; - } else if (ch === "{") { - ch = this.input(); - if (ch === "$") { - // start of {$... - this.begin("ST_IN_SCRIPTING"); - if (this.yytext.length > 2) { - this.appendToken(this.tok.T_CURLY_OPEN, 1); - this.unput(2); - return this.tok.T_ENCAPSED_AND_WHITESPACE; - } else { - this.unput(1); - return this.tok.T_CURLY_OPEN; - } - } - continue; - } - ch = this.input(); - } - return this.tok.T_ENCAPSED_AND_WHITESPACE; - }, - - matchST_DOUBLE_QUOTES: function() { - let ch = this.input(); - if (ch === "$") { - ch = this.input(); - if (ch === "{") { - this.begin("ST_LOOKING_FOR_VARNAME"); - return this.tok.T_DOLLAR_OPEN_CURLY_BRACES; - } else if (this.is_LABEL_START()) { - const tok = this.consume_VARIABLE(); - return tok; - } - } else if (ch === "{") { - if (this._input[this.offset] === "$") { - this.begin("ST_IN_SCRIPTING"); - return this.tok.T_CURLY_OPEN; - } - } else if (ch === '"') { - this.popState(); - return '"'; - } - - // any char - while (this.offset < this.size) { - if (ch === "\\") { - this.input(); - } else if (ch === '"') { - this.unput(1); - this.popState(); - this.appendToken('"', 1); - break; - } else if (ch === "$") { - ch = this.input(); - if (ch === "{") { - this.begin("ST_LOOKING_FOR_VARNAME"); - if (this.yytext.length > 2) { - this.appendToken(this.tok.T_DOLLAR_OPEN_CURLY_BRACES, 2); - this.unput(2); - return this.tok.T_ENCAPSED_AND_WHITESPACE; - } else { - return this.tok.T_DOLLAR_OPEN_CURLY_BRACES; - } - } else if (this.is_LABEL_START()) { - // start of $var... - const yyoffset = this.offset; - const next = this.consume_VARIABLE(); - if (this.yytext.length > this.offset - yyoffset + 2) { - this.appendToken(next, this.offset - yyoffset + 2); - this.unput(this.offset - yyoffset + 2); - return this.tok.T_ENCAPSED_AND_WHITESPACE; - } else { - return next; - } - } - if (ch) this.unput(1); - } else if (ch === "{") { - ch = this.input(); - if (ch === "$") { - // start of {$... - this.begin("ST_IN_SCRIPTING"); - if (this.yytext.length > 2) { - this.appendToken(this.tok.T_CURLY_OPEN, 1); - this.unput(2); - return this.tok.T_ENCAPSED_AND_WHITESPACE; - } else { - // @fixme : yytext = '"{$' (this.yytext.length > 3) - this.unput(1); - return this.tok.T_CURLY_OPEN; - } - } - if (ch) this.unput(1); - } - ch = this.input(); - } - return this.tok.T_ENCAPSED_AND_WHITESPACE; - } -}; diff --git a/src/lexer/tokens.js b/src/lexer/tokens.js deleted file mode 100644 index fbec8db37..000000000 --- a/src/lexer/tokens.js +++ /dev/null @@ -1,271 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -module.exports = { - T_STRING: function() { - const token = this.yytext.toLowerCase(); - let id = this.keywords[token]; - if (typeof id !== "number") { - if (token === "yield") { - if (this.php7 && this.tryMatch(" from")) { - this.consume(5); - id = this.tok.T_YIELD_FROM; - } else { - id = this.tok.T_YIELD; - } - } else { - id = this.tok.T_STRING; - if (token === "b" || token === "B") { - const ch = this.input(1); - if (ch === '"') { - return this.ST_DOUBLE_QUOTES(); - } else if (ch === "'") { - return this.T_CONSTANT_ENCAPSED_STRING(); - } else if (ch) { - this.unput(1); - } - } - } - } - return id; - }, - // reads a custom token - consume_TOKEN: function() { - const ch = this._input[this.offset - 1]; - const fn = this.tokenTerminals[ch]; - if (fn) { - return fn.apply(this, []); - } else { - return this.yytext; - } - }, - // list of special char tokens - tokenTerminals: { - $: function() { - this.offset++; - if (this.is_LABEL_START()) { - this.offset--; - this.consume_LABEL(); - return this.tok.T_VARIABLE; - } else { - this.offset--; - return "$"; - } - }, - "-": function() { - const nchar = this._input[this.offset]; - if (nchar === ">") { - this.begin("ST_LOOKING_FOR_PROPERTY").input(); - return this.tok.T_OBJECT_OPERATOR; - } else if (nchar === "-") { - this.input(); - return this.tok.T_DEC; - } else if (nchar === "=") { - this.input(); - return this.tok.T_MINUS_EQUAL; - } - return "-"; - }, - "\\": function() { - return this.tok.T_NS_SEPARATOR; - }, - "/": function() { - if (this._input[this.offset] === "=") { - this.input(); - return this.tok.T_DIV_EQUAL; - } - return "/"; - }, - ":": function() { - if (this._input[this.offset] === ":") { - this.input(); - return this.tok.T_DOUBLE_COLON; - } else { - return ":"; - } - }, - "(": function() { - const initial = this.offset; - this.input(); - if (this.is_TABSPACE()) { - this.consume_TABSPACE().input(); - } - if (this.is_LABEL_START()) { - const yylen = this.yytext.length; - this.consume_LABEL(); - const castToken = this.yytext.substring(yylen - 1).toLowerCase(); - const castId = this.castKeywords[castToken]; - if (typeof castId === "number") { - this.input(); - if (this.is_TABSPACE()) { - this.consume_TABSPACE().input(); - } - if (this._input[this.offset - 1] === ")") { - return castId; - } - } - } - // revert the check - this.unput(this.offset - initial); - return "("; - }, - "=": function() { - const nchar = this._input[this.offset]; - if (nchar === ">") { - this.input(); - return this.tok.T_DOUBLE_ARROW; - } else if (nchar === "=") { - if (this._input[this.offset + 1] === "=") { - this.consume(2); - return this.tok.T_IS_IDENTICAL; - } else { - this.input(); - return this.tok.T_IS_EQUAL; - } - } - return "="; - }, - "+": function() { - const nchar = this._input[this.offset]; - if (nchar === "+") { - this.input(); - return this.tok.T_INC; - } else if (nchar === "=") { - this.input(); - return this.tok.T_PLUS_EQUAL; - } - return "+"; - }, - "!": function() { - if (this._input[this.offset] === "=") { - if (this._input[this.offset + 1] === "=") { - this.consume(2); - return this.tok.T_IS_NOT_IDENTICAL; - } else { - this.input(); - return this.tok.T_IS_NOT_EQUAL; - } - } - return "!"; - }, - "?": function() { - if (this.php7 && this._input[this.offset] === "?") { - this.input(); - return this.tok.T_COALESCE; - } - return "?"; - }, - "<": function() { - let nchar = this._input[this.offset]; - if (nchar === "<") { - nchar = this._input[this.offset + 1]; - if (nchar === "=") { - this.consume(2); - return this.tok.T_SL_EQUAL; - } else if (nchar === "<") { - if (this.is_HEREDOC()) { - return this.tok.T_START_HEREDOC; - } - } - this.input(); - return this.tok.T_SL; - } else if (nchar === "=") { - this.input(); - if (this.php7 && this._input[this.offset] === ">") { - this.input(); - return this.tok.T_SPACESHIP; - } else { - return this.tok.T_IS_SMALLER_OR_EQUAL; - } - } else if (nchar === ">") { - this.input(); - return this.tok.T_IS_NOT_EQUAL; - } - return "<"; - }, - ">": function() { - let nchar = this._input[this.offset]; - if (nchar === "=") { - this.input(); - return this.tok.T_IS_GREATER_OR_EQUAL; - } else if (nchar === ">") { - nchar = this._input[this.offset + 1]; - if (nchar === "=") { - this.consume(2); - return this.tok.T_SR_EQUAL; - } else { - this.input(); - return this.tok.T_SR; - } - } - return ">"; - }, - "*": function() { - const nchar = this._input[this.offset]; - if (nchar === "=") { - this.input(); - return this.tok.T_MUL_EQUAL; - } else if (nchar === "*") { - this.input(); - if (this._input[this.offset] === "=") { - this.input(); - return this.tok.T_POW_EQUAL; - } else { - return this.tok.T_POW; - } - } - return "*"; - }, - ".": function() { - const nchar = this._input[this.offset]; - if (nchar === "=") { - this.input(); - return this.tok.T_CONCAT_EQUAL; - } else if (nchar === "." && this._input[this.offset + 1] === ".") { - this.consume(2); - return this.tok.T_ELLIPSIS; - } - return "."; - }, - "%": function() { - if (this._input[this.offset] === "=") { - this.input(); - return this.tok.T_MOD_EQUAL; - } - return "%"; - }, - "&": function() { - const nchar = this._input[this.offset]; - if (nchar === "=") { - this.input(); - return this.tok.T_AND_EQUAL; - } else if (nchar === "&") { - this.input(); - return this.tok.T_BOOLEAN_AND; - } - return "&"; - }, - "|": function() { - const nchar = this._input[this.offset]; - if (nchar === "=") { - this.input(); - return this.tok.T_OR_EQUAL; - } else if (nchar === "|") { - this.input(); - return this.tok.T_BOOLEAN_OR; - } - return "|"; - }, - "^": function() { - if (this._input[this.offset] === "=") { - this.input(); - return this.tok.T_XOR_EQUAL; - } - return "^"; - } - } -}; diff --git a/src/lexer/utils.js b/src/lexer/utils.js deleted file mode 100644 index 190d0f626..000000000 --- a/src/lexer/utils.js +++ /dev/null @@ -1,82 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const tokens = ";:,.\\[]()|^&+-/*=%!~$<>?@"; - -module.exports = { - // check if the char can be a numeric - is_NUM: function() { - const ch = this._input.charCodeAt(this.offset - 1); - return ch > 47 && ch < 58; - }, - - // check if current char can be a label - is_LABEL: function() { - const ch = this._input.charCodeAt(this.offset - 1); - return ( - (ch > 96 && ch < 123) || - (ch > 64 && ch < 91) || - ch === 95 || - (ch > 47 && ch < 58) || - ch > 126 - ); - }, - - // check if current char can be a label - is_LABEL_START: function() { - const ch = this._input.charCodeAt(this.offset - 1); - return ( - (ch > 96 && ch < 123) || (ch > 64 && ch < 91) || ch === 95 || ch > 126 - ); - }, - - // reads each char of the label - consume_LABEL: function() { - while (this.offset < this.size) { - const ch = this.input(); - if (!this.is_LABEL()) { - if (ch) this.unput(1); - break; - } - } - return this; - }, - - // check if current char is a token char - is_TOKEN: function() { - const ch = this._input[this.offset - 1]; - return tokens.indexOf(ch) !== -1; - }, - // check if current char is a whitespace - is_WHITESPACE: function() { - const ch = this._input[this.offset - 1]; - return ch === " " || ch === "\t" || ch === "\n" || ch === "\r"; - }, - // check if current char is a whitespace (without newlines) - is_TABSPACE: function() { - const ch = this._input[this.offset - 1]; - return ch === " " || ch === "\t"; - }, - // consume all whitespaces (excluding newlines) - consume_TABSPACE: function() { - while (this.offset < this.size) { - const ch = this.input(); - if (!this.is_TABSPACE()) { - if (ch) this.unput(1); - break; - } - } - return this; - }, - // check if current char can be a hexadecimal number - is_HEX: function() { - const ch = this._input.charCodeAt(this.offset - 1); - return ( - (ch > 47 && ch < 58) || (ch > 64 && ch < 71) || (ch > 96 && ch < 103) - ); - } -}; diff --git a/src/parser.js b/src/parser.js deleted file mode 100644 index ea9ff2380..000000000 --- a/src/parser.js +++ /dev/null @@ -1,565 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -/** - * @private - */ -function isNumber(n) { - return n != "." && n != "," && !isNaN(parseFloat(n)) && isFinite(n); -} - -/** - * The PHP Parser class that build the AST tree from the lexer - * - * @class - * @tutorial Parser - * @property {Lexer} lexer - current lexer instance - * @property {AST} ast - the AST factory instance - * @property {Integer|String} token - current token - * @property {Boolean} extractDoc - should extract documentation as AST node - * @property {Boolean} extractTokens - should extract each token - * @property {Boolean} suppressErrors - should ignore parsing errors and continue - * @property {Boolean} debug - should output debug informations - */ -const parser = function(lexer, ast) { - this.lexer = lexer; - this.ast = ast; - this.tok = lexer.tok; - this.EOF = lexer.EOF; - this.token = null; - this.prev = null; - this.debug = false; - this.php7 = true; - this.extractDoc = false; - this.extractTokens = false; - this.suppressErrors = false; - const mapIt = function(item) { - return [item, null]; - }; - this.entries = { - IDENTIFIER: new Map( - [ - this.tok.T_ABSTRACT, - this.tok.T_ARRAY, - this.tok.T_AS, - this.tok.T_BREAK, - this.tok.T_CALLABLE, - this.tok.T_CASE, - this.tok.T_CATCH, - this.tok.T_CLASS, - this.tok.T_CLASS_C, - this.tok.T_CLONE, - this.tok.T_CONST, - this.tok.T_CONTINUE, - this.tok.T_DECLARE, - this.tok.T_DEFAULT, - this.tok.T_DIR, - this.tok.T_DO, - this.tok.T_ECHO, - this.tok.T_ELSE, - this.tok.T_ELSEIF, - this.tok.T_EMPTY, - this.tok.T_ENDDECLARE, - this.tok.T_ENDFOR, - this.tok.T_ENDFOREACH, - this.tok.T_ENDIF, - this.tok.T_ENDSWITCH, - this.tok.T_ENDWHILE, - this.tok.T_EVAL, - this.tok.T_EXIT, - this.tok.T_EXTENDS, - this.tok.T_FILE, - this.tok.T_FINAL, - this.tok.T_FINALLY, - this.tok.T_FUNC_C, - this.tok.T_FOR, - this.tok.T_FOREACH, - this.tok.T_FUNCTION, - this.tok.T_GLOBAL, - this.tok.T_GOTO, - this.tok.T_IF, - this.tok.T_IMPLEMENTS, - this.tok.T_INCLUDE, - this.tok.T_INCLUDE_ONCE, - this.tok.T_INSTANCEOF, - this.tok.T_INSTEADOF, - this.tok.T_INTERFACE, - this.tok.T_ISSET, - this.tok.T_LINE, - this.tok.T_LIST, - this.tok.T_LOGICAL_AND, - this.tok.T_LOGICAL_OR, - this.tok.T_LOGICAL_XOR, - this.tok.T_METHOD_C, - this.tok.T_NAMESPACE, - this.tok.T_NEW, - this.tok.T_NS_C, - this.tok.T_PRINT, - this.tok.T_PRIVATE, - this.tok.T_PROTECTED, - this.tok.T_PUBLIC, - this.tok.T_REQUIRE, - this.tok.T_REQUIRE_ONCE, - this.tok.T_RETURN, - this.tok.T_STATIC, - this.tok.T_SWITCH, - this.tok.T_THROW, - this.tok.T_TRAIT, - this.tok.T_TRY, - this.tok.T_UNSET, - this.tok.T_USE, - this.tok.T_VAR, - this.tok.T_WHILE, - this.tok.T_YIELD - ].map(mapIt) - ), - VARIABLE: new Map( - [ - this.tok.T_VARIABLE, - "$", - "&", - this.tok.T_NS_SEPARATOR, - this.tok.T_STRING, - this.tok.T_NAMESPACE, - this.tok.T_STATIC - ].map(mapIt) - ), - SCALAR: new Map( - [ - this.tok.T_CONSTANT_ENCAPSED_STRING, - this.tok.T_START_HEREDOC, - this.tok.T_LNUMBER, - this.tok.T_DNUMBER, - this.tok.T_ARRAY, - "[", - this.tok.T_CLASS_C, - this.tok.T_TRAIT_C, - this.tok.T_FUNC_C, - this.tok.T_METHOD_C, - this.tok.T_LINE, - this.tok.T_FILE, - this.tok.T_DIR, - this.tok.T_NS_C, - '"', - 'b"', - 'B"', - "-", - this.tok.T_NS_SEPARATOR - ].map(mapIt) - ), - T_MAGIC_CONST: new Map( - [ - this.tok.T_CLASS_C, - this.tok.T_TRAIT_C, - this.tok.T_FUNC_C, - this.tok.T_METHOD_C, - this.tok.T_LINE, - this.tok.T_FILE, - this.tok.T_DIR, - this.tok.T_NS_C - ].map(mapIt) - ), - T_MEMBER_FLAGS: new Map( - [ - this.tok.T_PUBLIC, - this.tok.T_PRIVATE, - this.tok.T_PROTECTED, - this.tok.T_STATIC, - this.tok.T_ABSTRACT, - this.tok.T_FINAL - ].map(mapIt) - ), - EOS: new Map([";", this.EOF, this.tok.T_INLINE_HTML].map(mapIt)), - EXPR: new Map( - [ - "@", - "-", - "+", - "!", - "~", - "(", - "`", - this.tok.T_LIST, - this.tok.T_CLONE, - this.tok.T_INC, - this.tok.T_DEC, - this.tok.T_NEW, - this.tok.T_ISSET, - this.tok.T_EMPTY, - this.tok.T_INCLUDE, - this.tok.T_INCLUDE_ONCE, - this.tok.T_REQUIRE, - this.tok.T_REQUIRE_ONCE, - this.tok.T_EVAL, - this.tok.T_INT_CAST, - this.tok.T_DOUBLE_CAST, - this.tok.T_STRING_CAST, - this.tok.T_ARRAY_CAST, - this.tok.T_OBJECT_CAST, - this.tok.T_BOOL_CAST, - this.tok.T_UNSET_CAST, - this.tok.T_EXIT, - this.tok.T_PRINT, - this.tok.T_YIELD, - this.tok.T_STATIC, - this.tok.T_FUNCTION, - // using VARIABLES : - this.tok.T_VARIABLE, - "$", - this.tok.T_NS_SEPARATOR, - this.tok.T_STRING, - // using SCALAR : - this.tok.T_STRING, // @see variable.js line 45 > conflict with variable = shift/reduce :) - this.tok.T_CONSTANT_ENCAPSED_STRING, - this.tok.T_START_HEREDOC, - this.tok.T_LNUMBER, - this.tok.T_DNUMBER, - this.tok.T_ARRAY, - "[", - this.tok.T_CLASS_C, - this.tok.T_TRAIT_C, - this.tok.T_FUNC_C, - this.tok.T_METHOD_C, - this.tok.T_LINE, - this.tok.T_FILE, - this.tok.T_DIR, - this.tok.T_NS_C - ].map(mapIt) - ) - }; -}; - -/** - * helper : gets a token name - */ -parser.prototype.getTokenName = function(token) { - if (!isNumber(token)) { - return "'" + token + "'"; - } else { - if (token == this.EOF) return "the end of file (EOF)"; - return this.lexer.engine.tokens.values[token]; - } -}; - -/** - * main entry point : converts a source code to AST - */ -parser.prototype.parse = function(code, filename) { - this._errors = []; - this.filename = filename || "eval"; - this.currentNamespace = [""]; - if (this.extractDoc) { - this._docs = []; - } else { - this._docs = null; - } - if (this.extractTokens) { - this._tokens = []; - } else { - this._tokens = null; - } - this._docIndex = 0; - this.lexer.setInput(code); - this.lexer.all_tokens = this.extractTokens; - this.lexer.comment_tokens = this.extractDoc; - this.length = this.lexer._input.length; - this.innerList = false; - this.innerListForm = false; - const program = this.ast.prepare("program", null, this); - let childs = []; - this.next(); - while (this.token != this.EOF) { - const node = this.read_start(); - if (node !== null && node !== undefined) { - if (Array.isArray(node)) { - childs = childs.concat(node); - } else { - childs.push(node); - } - } - } - return program(childs, this._errors, this._docs, this._tokens); -}; - -/** - * Raise an error - */ -parser.prototype.raiseError = function(message, msgExpect, expect, token) { - message += " on line " + this.lexer.yylloc.first_line; - if (!this.suppressErrors) { - const err = new SyntaxError( - message, - this.filename, - this.lexer.yylloc.first_line - ); - err.lineNumber = this.lexer.yylloc.first_line; - err.fileName = this.filename; - err.columnNumber = this.lexer.yylloc.first_column; - throw err; - } - // Error node : - const node = this.ast.prepare("error", null, this)( - message, - token, - this.lexer.yylloc.first_line, - expect - ); - this._errors.push(node); - return node; -}; - -/** - * handling errors - */ -parser.prototype.error = function(expect) { - let msg = "Parse Error : syntax error"; - let token = this.getTokenName(this.token); - let msgExpect = ""; - - if (this.token !== this.EOF) { - if (isNumber(this.token)) { - let symbol = this.text(); - if (symbol.length > 10) { - symbol = symbol.substring(0, 7) + "..."; - } - token = "'" + symbol + "' (" + token + ")"; - } - msg += ", unexpected " + token; - } - if (expect && !Array.isArray(expect)) { - if (isNumber(expect) || expect.length === 1) { - msgExpect = ", expecting " + this.getTokenName(expect); - } - msg += msgExpect; - } - return this.raiseError(msg, msgExpect, expect, token); -}; - -/** - * Creates a new AST node - */ -parser.prototype.node = function(name) { - if (this.extractDoc) { - if (this._docIndex < this._docs.length) { - const docs = this._docs.slice(this._docIndex); - this._docIndex = this._docs.length; - return this.ast.prepare(name, docs, this); - } - } - return this.ast.prepare(name, null, this); -}; - -/** - * expects an end of statement or end of file - * @return {boolean} - */ -parser.prototype.expectEndOfStatement = function(node) { - if (this.token === ";") { - // include only real ';' statements - // https://github.com/glayzzle/php-parser/issues/164 - if (node && this.lexer.yytext === ";") { - node.includeToken(this); - } - } else if (this.token !== this.tok.T_INLINE_HTML && this.token !== this.EOF) { - this.error(";"); - return false; - } - this.next(); - return true; -}; - -/** outputs some debug information on current token **/ -const ignoreStack = ["parser.next"]; -parser.prototype.showlog = function() { - const stack = new Error().stack.split("\n"); - let line; - for (let offset = 2; offset < stack.length; offset++) { - line = stack[offset].trim(); - let found = false; - for (let i = 0; i < ignoreStack.length; i++) { - if (line.substring(3, 3 + ignoreStack[i].length) === ignoreStack[i]) { - found = true; - break; - } - } - if (!found) { - break; - } - } - // eslint-disable-next-line no-console - console.log( - "Line " + - this.lexer.yylloc.first_line + - " : " + - this.getTokenName(this.token) + - ">" + - this.lexer.yytext + - "<" + - " @-->" + - line - ); - return this; -}; - -/** - * Force the parser to check the current token. - * - * If the current token does not match to expected token, - * the an error will be raised. - * - * If the suppressError mode is activated, then the error will - * be added to the program error stack and this function will return `false`. - * - * @param {String|Number} token - * @return {boolean} - * @throws Error - */ -parser.prototype.expect = function(token) { - if (Array.isArray(token)) { - if (token.indexOf(this.token) === -1) { - this.error(token); - return false; - } - } else if (this.token != token) { - this.error(token); - return false; - } - return true; -}; - -/** - * Returns the current token contents - * @return {String} - */ -parser.prototype.text = function() { - return this.lexer.yytext; -}; - -/** consume the next token **/ -parser.prototype.next = function() { - // prepare the back command - if (this.token !== ";" || this.lexer.yytext === ";") { - // ignore '?>' from automated resolution - // https://github.com/glayzzle/php-parser/issues/168 - this.prev = [ - this.lexer.yylloc.last_line, - this.lexer.yylloc.last_column, - this.lexer.offset - ]; - } - - // eating the token - this.lex(); - - // showing the debug - if (this.debug) { - this.showlog(); - } - - // handling comments - if (this.extractDoc) { - while ( - this.token === this.tok.T_COMMENT || - this.token === this.tok.T_DOC_COMMENT - ) { - // APPEND COMMENTS - if (this.token === this.tok.T_COMMENT) { - this._docs.push(this.read_comment()); - } else { - this._docs.push(this.read_doc_comment()); - } - } - } - - return this; -}; - -/** - * Eating a token - */ -parser.prototype.lex = function() { - // append on token stack - if (this.extractTokens) { - do { - // the token - this.token = this.lexer.lex() || this.EOF; - if (this.token === this.EOF) return this; - let entry = this.lexer.yytext; - if (this.lexer.engine.tokens.values.hasOwnProperty(this.token)) { - entry = [ - this.lexer.engine.tokens.values[this.token], - entry, - this.lexer.yylloc.first_line, - this.lexer.yylloc.first_offset, - this.lexer.offset - ]; - } else { - entry = [ - null, - entry, - this.lexer.yylloc.first_line, - this.lexer.yylloc.first_offset, - this.lexer.offset - ]; - } - this._tokens.push(entry); - if (this.token === this.tok.T_CLOSE_TAG) { - // https://github.com/php/php-src/blob/7ff186434e82ee7be7c59d0db9a976641cf7b09c/Zend/zend_compile.c#L1680 - this.token = ";"; - return this; - } else if (this.token === this.tok.T_OPEN_TAG_WITH_ECHO) { - this.token = this.tok.T_ECHO; - return this; - } - } while ( - this.token === this.tok.T_WHITESPACE || // ignore white space - (!this.extractDoc && - (this.token === this.tok.T_COMMENT || // ignore single lines comments - this.token === this.tok.T_DOC_COMMENT)) || // ignore doc comments - // ignore open tags - this.token === this.tok.T_OPEN_TAG - ); - } else { - this.token = this.lexer.lex() || this.EOF; - } - return this; -}; - -/** - * Check if token is of specified type - */ -parser.prototype.is = function(type) { - if (Array.isArray(type)) { - return type.indexOf(this.token) !== -1; - } - return this.entries[type].has(this.token); -}; - -// extends the parser with syntax files -[ - require("./parser/array.js"), - require("./parser/class.js"), - require("./parser/comment.js"), - require("./parser/expr.js"), - require("./parser/function.js"), - require("./parser/if.js"), - require("./parser/loops.js"), - require("./parser/main.js"), - require("./parser/namespace.js"), - require("./parser/scalar.js"), - require("./parser/statement.js"), - require("./parser/switch.js"), - require("./parser/try.js"), - require("./parser/utils.js"), - require("./parser/variable.js") -].forEach(function(ext) { - for (const k in ext) { - parser.prototype[k] = ext[k]; - } -}); - -module.exports = parser; diff --git a/src/parser/array.js b/src/parser/array.js deleted file mode 100644 index 0f8008f64..000000000 --- a/src/parser/array.js +++ /dev/null @@ -1,105 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const ArrayExpr = "array"; -const ArrayEntry = "entry"; - -module.exports = { - /** - * Parse an array - * ```ebnf - * array ::= T_ARRAY '(' array_pair_list ')' | - * '[' array_pair_list ']' - * ``` - */ - read_array: function() { - let expect = null; - let shortForm = false; - const result = this.node(ArrayExpr); - - if (this.token === this.tok.T_ARRAY) { - this.next().expect("("); - expect = ")"; - } else { - shortForm = true; - expect = "]"; - } - let items = []; - if (this.next().token !== expect) { - items = this.read_array_pair_list(shortForm); - } - // check non empty entries - /*for(let i = 0, size = items.length - 1; i < size; i++) { - if (items[i] === null) { - this.raiseError( - "Cannot use empty array elements in arrays" - ); - } - }*/ - this.expect(expect); - this.next(); - return result(shortForm, items); - }, - /** - * Reads an array of items - * ```ebnf - * array_pair_list ::= array_pair (',' array_pair?)* - * ``` - */ - read_array_pair_list: function(shortForm) { - const self = this; - return this.read_list( - function() { - return self.read_array_pair(shortForm); - }, - ",", - true - ); - }, - /** - * Reads an entry - * array_pair: - * expr T_DOUBLE_ARROW expr - * | expr - * | expr T_DOUBLE_ARROW '&' variable - * | '&' variable - * | expr T_DOUBLE_ARROW T_LIST '(' array_pair_list ')' - * | T_LIST '(' array_pair_list ')' - */ - read_array_pair: function(shortForm) { - if ( - this.token === "," || - (!shortForm && this.token === ")") || - (shortForm && this.token === "]") - ) { - return null; - } - if (this.token === "&") { - return this.next().read_variable(true, false, true); - } else { - const entry = this.node(ArrayEntry); - const expr = this.read_expr(); - if (this.token === this.tok.T_DOUBLE_ARROW) { - if (this.next().token === "&") { - return entry(expr, this.next().read_variable(true, false, true)); - } else { - return entry(expr, this.read_expr()); - } - } - return expr; - } - }, - /** - * ```ebnf - * dim_offset ::= expr? - * ``` - */ - read_dim_offset: function() { - if (this.token == "]") return false; - return this.read_expr(); - } -}; diff --git a/src/parser/class.js b/src/parser/class.js deleted file mode 100644 index 221904dfc..000000000 --- a/src/parser/class.js +++ /dev/null @@ -1,461 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -module.exports = { - /** - * reading a class - * ```ebnf - * class ::= class_scope? T_CLASS T_STRING (T_EXTENDS NAMESPACE_NAME)? (T_IMPLEMENTS (NAMESPACE_NAME ',')* NAMESPACE_NAME)? '{' CLASS_BODY '}' - * ``` - */ - read_class: function(flag) { - const result = this.node("class"); - this.expect(this.tok.T_CLASS); - this.next().expect(this.tok.T_STRING); - const propName = this.text(); - let propExtends = null; - let propImplements = null; - if (this.next().token == this.tok.T_EXTENDS) { - propExtends = this.next().read_namespace_name(); - } - if (this.token == this.tok.T_IMPLEMENTS) { - propImplements = this.next().read_name_list(); - } - this.expect("{"); - const body = this.next().read_class_body(); - return result(propName, propExtends, propImplements, body, flag); - }, - /** - * Read the class visibility - * ```ebnf - * class_scope ::= (T_FINAL | T_ABSTRACT)? - * ``` - */ - read_class_scope: function() { - const result = this.token; - if (result == this.tok.T_FINAL) { - this.next(); - return [0, 0, 2]; - } else if (result == this.tok.T_ABSTRACT) { - this.next(); - return [0, 0, 1]; - } - return [0, 0, 0]; - }, - /** - * Reads a class body - * ```ebnf - * class_body ::= (member_flags? (T_VAR | T_STRING | T_FUNCTION))* - * ``` - */ - read_class_body: function() { - let result = []; - - while (this.token !== this.EOF && this.token !== "}") { - if (this.token === this.tok.T_COMMENT) { - result.push(this.read_comment()); - continue; - } - - if (this.token === this.tok.T_DOC_COMMENT) { - result.push(this.read_doc_comment()); - continue; - } - - // check T_USE trait - if (this.token === this.tok.T_USE) { - result = result.concat(this.next().read_trait_use_statement()); - continue; - } - - // read member flags - const flags = this.read_member_flags(false); - - // check constant - if (this.token === this.tok.T_CONST) { - const constants = this.read_constant_list(flags); - if (this.expect(";")) { - this.next(); - } - result = result.concat(constants); - continue; - } - - // jump over T_VAR then land on T_VARIABLE - if (this.token === this.tok.T_VAR) { - this.next().expect(this.tok.T_VARIABLE); - flags[0] = flags[1] = 0; // public & non static var - } - - if (this.token === this.tok.T_VARIABLE) { - // reads a variable - const variables = this.read_variable_list(flags); - this.expect(";"); - this.next(); - result = result.concat(variables); - } else if (this.token === this.tok.T_FUNCTION) { - // reads a function - result.push(this.read_function(false, flags)); - } else { - // raise an error - this.error([ - this.tok.T_CONST, - this.tok.T_VARIABLE, - this.tok.T_FUNCTION - ]); - // ignore token - this.next(); - } - } - this.expect("}"); - this.next(); - return result; - }, - /** - * Reads variable list - * ```ebnf - * variable_list ::= (variable_declaration ',')* variable_declaration - * ``` - */ - read_variable_list: function(flags) { - return this.read_list( - /** - * Reads a variable declaration - * - * ```ebnf - * variable_declaration ::= T_VARIABLE '=' scalar - * ``` - */ - function read_variable_declaration() { - const result = this.node("property"); - this.expect(this.tok.T_VARIABLE); - const name = this.text().substring(1); // ignore $ - this.next(); - if (this.token === ";" || this.token === ",") { - return result(name, null, flags); - } else if (this.token === "=") { - // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L815 - return result(name, this.next().read_expr(), flags); - } else { - this.expect([",", ";", "="]); - return result(name, null, flags); - } - }, - "," - ); - }, - /** - * Reads constant list - * ```ebnf - * constant_list ::= T_CONST (constant_declaration ',')* constant_declaration - * ``` - */ - read_constant_list: function(flags) { - if (this.expect(this.tok.T_CONST)) { - this.next(); - } - return this.read_list( - /** - * Reads a constant declaration - * - * ```ebnf - * constant_declaration ::= (T_STRING | IDENTIFIER) '=' expr - * ``` - * @return {Constant} [:link:](AST.md#constant) - */ - function read_constant_declaration() { - const result = this.node("classconstant"); - let name = null; - let value = null; - if ( - this.token === this.tok.T_STRING || - (this.php7 && this.is("IDENTIFIER")) - ) { - name = this.text(); - this.next(); - } else { - this.expect("IDENTIFIER"); - } - if (this.expect("=")) { - value = this.next().read_expr(); - } - return result(name, value, flags); - }, - "," - ); - }, - /** - * Read member flags - * @return array - * 1st index : 0 => public, 1 => protected, 2 => private - * 2nd index : 0 => instance member, 1 => static member - * 3rd index : 0 => normal, 1 => abstract member, 2 => final member - */ - read_member_flags: function(asInterface) { - const result = [-1, -1, -1]; - if (this.is("T_MEMBER_FLAGS")) { - let idx = 0, - val = 0; - do { - switch (this.token) { - case this.tok.T_PUBLIC: - idx = 0; - val = 0; - break; - case this.tok.T_PROTECTED: - idx = 0; - val = 1; - break; - case this.tok.T_PRIVATE: - idx = 0; - val = 2; - break; - case this.tok.T_STATIC: - idx = 1; - val = 1; - break; - case this.tok.T_ABSTRACT: - idx = 2; - val = 1; - break; - case this.tok.T_FINAL: - idx = 2; - val = 2; - break; - } - if (asInterface) { - if (idx == 0 && val == 2) { - // an interface can't be private - this.expect([this.tok.T_PUBLIC, this.tok.T_PROTECTED]); - val = -1; - } else if (idx == 2 && val == 1) { - // an interface cant be abstract - this.error(); - val = -1; - } - } - if (result[idx] !== -1) { - // already defined flag - this.error(); - } else if (val !== -1) { - result[idx] = val; - } - } while (this.next().is("T_MEMBER_FLAGS")); - } - - if (result[1] == -1) result[1] = 0; - if (result[2] == -1) result[2] = 0; - return result; - }, - /** - * reading an interface - * ```ebnf - * interface ::= T_INTERFACE T_STRING (T_EXTENDS (NAMESPACE_NAME ',')* NAMESPACE_NAME)? '{' INTERFACE_BODY '}' - * ``` - */ - read_interface: function() { - const result = this.node("interface"); - let name = null; - let body = null; - let propExtends = null; - if (this.expect(this.tok.T_INTERFACE)) { - this.next(); - } - if (this.expect(this.tok.T_STRING)) { - name = this.text(); - this.next(); - } - if (this.token === this.tok.T_EXTENDS) { - propExtends = this.next().read_name_list(); - } - if (this.expect("{")) { - body = this.next().read_interface_body(); - } - return result(name, propExtends, body); - }, - /** - * Reads an interface body - * ```ebnf - * interface_body ::= (member_flags? (T_CONST | T_FUNCTION))* - * ``` - */ - read_interface_body: function() { - let result = []; - - while (this.token !== this.EOF && this.token !== "}") { - if (this.token === this.tok.T_COMMENT) { - result.push(this.read_comment()); - continue; - } - - if (this.token === this.tok.T_DOC_COMMENT) { - result.push(this.read_doc_comment()); - continue; - } - - // read member flags - const flags = this.read_member_flags(true); - - // check constant - if (this.token == this.tok.T_CONST) { - const constants = this.read_constant_list(flags); - if (this.expect(";")) { - this.next(); - } - result = result.concat(constants); - } else if (this.token === this.tok.T_FUNCTION) { - // reads a function - const method = this.read_function_declaration(2, flags); - method.parseFlags(flags); - result.push(method); - if (this.expect(";")) { - this.next(); - } - } else { - // raise an error - this.error([this.tok.T_CONST, this.tok.T_FUNCTION]); - this.next(); - } - } - if (this.expect("}")) { - this.next(); - } - return result; - }, - /** - * reading a trait - * ```ebnf - * trait ::= T_TRAIT T_STRING (T_EXTENDS (NAMESPACE_NAME ',')* NAMESPACE_NAME)? '{' FUNCTION* '}' - * ``` - */ - read_trait: function() { - const result = this.node("trait"); - let propName = null; - let propExtends = null; - let propImplements = null; - let body = null; - if (this.expect(this.tok.T_TRAIT)) { - this.next(); - } - if (this.expect(this.tok.T_STRING)) { - propName = this.text(); - } - if (this.next().token == this.tok.T_EXTENDS) { - propExtends = this.next().read_namespace_name(); - } - if (this.token == this.tok.T_IMPLEMENTS) { - propImplements = this.next().read_name_list(); - } - if (this.expect("{")) { - body = this.next().read_class_body(); - } - return result(propName, propExtends, propImplements, body); - }, - /** - * reading a use statement - * ```ebnf - * trait_use_statement ::= namespace_name (',' namespace_name)* ('{' trait_use_alias '}')? - * ``` - */ - read_trait_use_statement: function() { - // defines use statements - const node = this.node("traituse"); - const traits = [this.read_namespace_name()]; - let adaptations = null; - while (this.token === ",") { - traits.push(this.next().read_namespace_name()); - } - if (this.token === "{") { - adaptations = []; - // defines alias statements - while (this.next().token !== this.EOF) { - if (this.token === "}") break; - adaptations.push(this.read_trait_use_alias()); - this.expect(";"); - } - if (this.expect("}")) { - this.next(); - } - } else { - if (this.expect(";")) { - this.next(); - } - } - return node(traits, adaptations); - }, - /** - * Reading trait alias - * ```ebnf - * trait_use_alias ::= namespace_name ( T_DOUBLE_COLON T_STRING )? (T_INSTEADOF namespace_name) | (T_AS member_flags? T_STRING) - * ``` - * name list : https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L303 - * trait adaptation : https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L742 - */ - read_trait_use_alias: function() { - const node = this.node(); - let trait = null; - let method; - - if (this.is("IDENTIFIER")) { - method = this.text(); - this.next(); - } else { - method = this.read_namespace_name(); - - if (this.token === this.tok.T_DOUBLE_COLON) { - this.next(); - if ( - this.token === this.tok.T_STRING || - (this.php7 && this.is("IDENTIFIER")) - ) { - trait = method; - method = this.text(); - this.next(); - } else { - this.expect(this.tok.T_STRING); - } - } else { - // convert identifier as string - method = method.name; - } - } - - // handle trait precedence - if (this.token === this.tok.T_INSTEADOF) { - return node( - "traitprecedence", - trait, - method, - this.next().read_name_list() - ); - } else if (this.token === this.tok.T_AS) { - // handle trait alias - let flags = null; - let alias = null; - if (this.next().is("T_MEMBER_FLAGS")) { - flags = this.read_member_flags(); - } - - if ( - this.token === this.tok.T_STRING || - (this.php7 && this.is("IDENTIFIER")) - ) { - alias = this.text(); - this.next(); - } else if (flags === false) { - // no visibility flags and no name => too bad - this.expect(this.tok.T_STRING); - } - - return node("traitalias", trait, method, alias, flags); - } - - // handle errors - this.expect([this.tok.T_AS, this.tok.T_INSTEADOF]); - return node("traitalias", trait, method, null, null); - } -}; diff --git a/src/parser/comment.js b/src/parser/comment.js deleted file mode 100644 index 1be7a1594..000000000 --- a/src/parser/comment.js +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -module.exports = { - /** - * Comments with // or # or / * ... * / - */ - read_comment: function() { - const text = this.text(); - let result = this.ast.prepare( - text.substring(0, 2) === "/*" ? "commentblock" : "commentline", - null, - this - ); - // handle location on comment - const prev = this.prev; - this.prev = [ - this.lexer.yylloc.last_line, - this.lexer.yylloc.last_column, - this.lexer.offset - ]; - this.lex(); - result = result(text); - this.prev = prev; - return result; - }, - /** - * Comments with / ** ... * / - */ - read_doc_comment: function() { - let result = this.ast.prepare("commentblock", null, this); - const text = this.text(); - const prev = this.prev; - this.prev = [ - this.lexer.yylloc.last_line, - this.lexer.yylloc.last_column, - this.lexer.offset - ]; - this.lex(); - result = result(text); - this.prev = prev; - return result; - } -}; diff --git a/src/parser/expr.js b/src/parser/expr.js deleted file mode 100644 index bb2276f28..000000000 --- a/src/parser/expr.js +++ /dev/null @@ -1,514 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -module.exports = { - read_expr: function() { - const result = this.node(); - const expr = this.read_expr_item(); - // binary operations - if (this.token === "|") - return result("bin", "|", expr, this.next().read_expr()); - if (this.token === "&") - return result("bin", "&", expr, this.next().read_expr()); - if (this.token === "^") - return result("bin", "^", expr, this.next().read_expr()); - if (this.token === ".") - return result("bin", ".", expr, this.next().read_expr()); - if (this.token === "+") - return result("bin", "+", expr, this.next().read_expr()); - if (this.token === "-") - return result("bin", "-", expr, this.next().read_expr()); - if (this.token === "*") - return result("bin", "*", expr, this.next().read_expr()); - if (this.token === "/") - return result("bin", "/", expr, this.next().read_expr()); - if (this.token === "%") - return result("bin", "%", expr, this.next().read_expr()); - if (this.token === this.tok.T_POW) - return result("bin", "**", expr, this.next().read_expr()); - if (this.token === this.tok.T_SL) - return result("bin", "<<", expr, this.next().read_expr()); - if (this.token === this.tok.T_SR) - return result("bin", ">>", expr, this.next().read_expr()); - // more binary operations (formerly bool) - if (this.token === this.tok.T_BOOLEAN_OR) - return result("bin", "||", expr, this.next().read_expr()); - if (this.token === this.tok.T_LOGICAL_OR) - return result("bin", "or", expr, this.next().read_expr()); - if (this.token === this.tok.T_BOOLEAN_AND) - return result("bin", "&&", expr, this.next().read_expr()); - if (this.token === this.tok.T_LOGICAL_AND) - return result("bin", "and", expr, this.next().read_expr()); - if (this.token === this.tok.T_LOGICAL_XOR) - return result("bin", "xor", expr, this.next().read_expr()); - if (this.token === this.tok.T_IS_IDENTICAL) - return result("bin", "===", expr, this.next().read_expr()); - if (this.token === this.tok.T_IS_NOT_IDENTICAL) - return result("bin", "!==", expr, this.next().read_expr()); - if (this.token === this.tok.T_IS_EQUAL) - return result("bin", "==", expr, this.next().read_expr()); - if (this.token === this.tok.T_IS_NOT_EQUAL) - return result("bin", "!=", expr, this.next().read_expr()); - if (this.token === "<") - return result("bin", "<", expr, this.next().read_expr()); - if (this.token === ">") - return result("bin", ">", expr, this.next().read_expr()); - if (this.token === this.tok.T_IS_SMALLER_OR_EQUAL) - return result("bin", "<=", expr, this.next().read_expr()); - if (this.token === this.tok.T_IS_GREATER_OR_EQUAL) - return result("bin", ">=", expr, this.next().read_expr()); - if (this.token === this.tok.T_SPACESHIP) - return result("bin", "<=>", expr, this.next().read_expr()); - if (this.token === this.tok.T_INSTANCEOF) - return result("bin", "instanceof", expr, this.next().read_expr()); - - // extra operations : - // $username = $_GET['user'] ?? 'nobody'; - if (this.token === this.tok.T_COALESCE) - return result("bin", "??", expr, this.next().read_expr()); - - // extra operations : - // $username = $_GET['user'] ? true : false; - if (this.token === "?") { - let trueArg = null; - if (this.next().token !== ":") { - trueArg = this.read_expr(); - } - this.expect(":") && this.next(); - return result("retif", expr, trueArg, this.read_expr()); - } - - return expr; - }, - - /** - * ```ebnf - * Reads an expression - * expr ::= @todo - * ``` - */ - read_expr_item: function() { - let result, expr; - if (this.token === "@") return this.node("silent")(this.next().read_expr()); - if (this.token === "+") - return this.node("unary")("+", this.next().read_expr()); - if (this.token === "!") - return this.node("unary")("!", this.next().read_expr()); - if (this.token === "~") - return this.node("unary")("~", this.next().read_expr()); - - if (this.token === "-") { - result = this.node(); - this.next(); - if ( - this.token === this.tok.T_LNUMBER || - this.token === this.tok.T_DNUMBER - ) { - // negative number - result = result("number", "-" + this.text(), null); - this.next(); - return result; - } else { - return result("unary", "-", this.read_expr()); - } - } - - if (this.token === "(") { - const node = this.node("parenthesis"); - expr = this.next().read_expr(); - this.expect(")") && this.next(); - return this.handleDereferencable(node(expr)); - } - - if (this.token === "`") { - // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L1048 - return this.next().read_encapsed_string("`"); - } - - if (this.token === this.tok.T_LIST) { - let assign = null; - const isInner = this.innerList; - result = this.node("list"); - if (!isInner) { - assign = this.node("assign"); - } - if (this.next().expect("(")) { - this.next(); - } - - if (!this.innerList) this.innerList = true; - - // reads inner items - const assignList = this.read_array_pair_list(false); - if (this.expect(")")) { - this.next(); - } - - // check if contains at least one assignment statement - let hasItem = false; - for (let i = 0; i < assignList.length; i++) { - if (assignList[i] !== null) { - hasItem = true; - break; - } - } - if (!hasItem) { - this.raiseError( - "Fatal Error : Cannot use empty list on line " + - this.lexer.yylloc.first_line - ); - } - - // handles the node resolution - if (!isInner) { - this.innerList = false; - if (this.expect("=")) { - return assign( - result(assignList, false), - this.next().read_expr(), - "=" - ); - } else { - // error fallback : list($a, $b); - return result(assignList, false); - } - } else { - return result(assignList, false); - } - } - - if (this.token === this.tok.T_CLONE) - return this.node("clone")(this.next().read_expr()); - - switch (this.token) { - case this.tok.T_INC: - return this.node("pre")( - "+", - this.next().read_variable(false, false, false) - ); - - case this.tok.T_DEC: - return this.node("pre")( - "-", - this.next().read_variable(false, false, false) - ); - - case this.tok.T_NEW: - return this.next().read_new_expr(); - - case this.tok.T_ISSET: { - result = this.node("isset"); - if (this.next().expect("(")) { - this.next(); - } - const args = this.read_list(this.read_expr, ","); - if (this.expect(")")) { - this.next(); - } - return result(args); - } - case this.tok.T_EMPTY: { - result = this.node("empty"); - if (this.next().expect("(")) { - this.next(); - } - const arg = this.read_expr(); - if (this.expect(")")) { - this.next(); - } - return result([arg]); - } - case this.tok.T_INCLUDE: - return this.node("include")(false, false, this.next().read_expr()); - - case this.tok.T_INCLUDE_ONCE: - return this.node("include")(true, false, this.next().read_expr()); - - case this.tok.T_REQUIRE: - return this.node("include")(false, true, this.next().read_expr()); - - case this.tok.T_REQUIRE_ONCE: - return this.node("include")(true, true, this.next().read_expr()); - - case this.tok.T_EVAL: - result = this.node("eval"); - if (this.next().expect("(")) { - this.next(); - } - expr = this.read_expr(); - if (this.expect(")")) { - this.next(); - } - return result(expr); - - case this.tok.T_INT_CAST: - return this.node("cast")("int", this.next().read_expr()); - - case this.tok.T_DOUBLE_CAST: - return this.node("cast")("float", this.next().read_expr()); - - case this.tok.T_STRING_CAST: - return this.node("cast")( - this.text() === "(binary)" ? "binary" : "string", - this.next().read_expr() - ); - - case this.tok.T_ARRAY_CAST: - return this.node("cast")("array", this.next().read_expr()); - - case this.tok.T_OBJECT_CAST: - return this.node("cast")("object", this.next().read_expr()); - - case this.tok.T_BOOL_CAST: - return this.node("cast")("bool", this.next().read_expr()); - - case this.tok.T_UNSET_CAST: - return this.node("cast")("unset", this.next().read_expr()); - - case this.tok.T_EXIT: { - const useDie = this.lexer.yytext.toLowerCase() === "die"; - result = this.node("exit"); - let status = null; - if (this.next().token === "(") { - if (this.next().token !== ")") { - status = this.read_expr(); - if (this.expect(")")) { - this.next(); - } - } else { - this.next(); - } - } - return result(status, useDie); - } - - case this.tok.T_PRINT: - return this.node("print")(this.next().read_expr()); - - // T_YIELD (expr (T_DOUBLE_ARROW expr)?)? - case this.tok.T_YIELD: { - let value = null; - let key = null; - result = this.node("yield"); - if (this.next().is("EXPR")) { - // reads the yield return value - value = this.read_expr(); - if (this.token === this.tok.T_DOUBLE_ARROW) { - // reads the yield returned key - key = value; - value = this.next().read_expr(); - } - } - return result(value, key); - } - - // T_YIELD_FROM expr - case this.tok.T_YIELD_FROM: - result = this.node("yieldfrom"); - expr = this.next().read_expr(); - return result(expr); - - case this.tok.T_FUNCTION: - return this.read_function(true); - - case this.tok.T_STATIC: { - const backup = [this.token, this.lexer.getState()]; - if (this.next().token === this.tok.T_FUNCTION) { - // handles static function - return this.read_function(true, [0, 1, 0]); - } else { - // rollback - this.lexer.tokens.push(backup); - this.next(); - } - } - } - - // SCALAR | VARIABLE - if (this.is("VARIABLE")) { - result = this.node(); - expr = this.read_variable(false, false, false); - - // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L877 - // should accept only a variable - const isConst = - expr.kind === "constref" || - (expr.kind === "staticlookup" && expr.offset.kind === "constref"); - - // VARIABLES SPECIFIC OPERATIONS - switch (this.token) { - case "=": { - if (isConst) this.error("VARIABLE"); - let right; - if (this.next().token == "&") { - if (this.next().token === this.tok.T_NEW) { - right = this.next().read_new_expr(); - } else { - right = this.read_variable(false, false, true); - } - } else { - right = this.read_expr(); - } - return result("assign", expr, right, "="); - } - - // operations : - case this.tok.T_PLUS_EQUAL: - if (isConst) this.error("VARIABLE"); - return result("assign", expr, this.next().read_expr(), "+="); - - case this.tok.T_MINUS_EQUAL: - if (isConst) this.error("VARIABLE"); - return result("assign", expr, this.next().read_expr(), "-="); - - case this.tok.T_MUL_EQUAL: - if (isConst) this.error("VARIABLE"); - return result("assign", expr, this.next().read_expr(), "*="); - - case this.tok.T_POW_EQUAL: - if (isConst) this.error("VARIABLE"); - return result("assign", expr, this.next().read_expr(), "**="); - - case this.tok.T_DIV_EQUAL: - if (isConst) this.error("VARIABLE"); - return result("assign", expr, this.next().read_expr(), "/="); - - case this.tok.T_CONCAT_EQUAL: - if (isConst) this.error("VARIABLE"); - return result("assign", expr, this.next().read_expr(), ".="); - - case this.tok.T_MOD_EQUAL: - if (isConst) this.error("VARIABLE"); - return result("assign", expr, this.next().read_expr(), "%="); - - case this.tok.T_AND_EQUAL: - if (isConst) this.error("VARIABLE"); - return result("assign", expr, this.next().read_expr(), "&="); - - case this.tok.T_OR_EQUAL: - if (isConst) this.error("VARIABLE"); - return result("assign", expr, this.next().read_expr(), "|="); - - case this.tok.T_XOR_EQUAL: - if (isConst) this.error("VARIABLE"); - return result("assign", expr, this.next().read_expr(), "^="); - - case this.tok.T_SL_EQUAL: - if (isConst) this.error("VARIABLE"); - return result("assign", expr, this.next().read_expr(), "<<="); - - case this.tok.T_SR_EQUAL: - if (isConst) this.error("VARIABLE"); - return result("assign", expr, this.next().read_expr(), ">>="); - - case this.tok.T_INC: - if (isConst) this.error("VARIABLE"); - this.next(); - return result("post", "+", expr); - case this.tok.T_DEC: - if (isConst) this.error("VARIABLE"); - this.next(); - return result("post", "-", expr); - } - } else if (this.is("SCALAR")) { - result = this.node(); - expr = this.read_scalar(); - if (expr.kind === "array" && expr.shortForm && this.token === "=") { - // list assign - let list = this.node("list")(expr.items, true); - if (expr.loc) list.loc = expr.loc; - let right = this.next().read_expr(); - return result("assign", list, right, "="); - } - // classic array - return this.handleDereferencable(expr); - } else { - this.error("EXPR"); - this.next(); - } - - // returns variable | scalar - return expr; - }, - /** - * ```ebnf - * new_expr ::= T_NEW (namespace_name function_argument_list) | (T_CLASS ... class declaration) - * ``` - * https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L850 - */ - read_new_expr: function() { - const result = this.node("new"); - let args = []; - if (this.token === this.tok.T_CLASS) { - const what = this.node("class"); - // Annonymous class declaration - let propExtends = null, - propImplements = null, - body = null; - if (this.next().token === "(") { - args = this.read_function_argument_list(); - } - if (this.token == this.tok.T_EXTENDS) { - propExtends = this.next().read_namespace_name(); - } - if (this.token == this.tok.T_IMPLEMENTS) { - propImplements = this.next().read_name_list(); - } - if (this.expect("{")) { - body = this.next().read_class_body(); - } - return result( - what(null, propExtends, propImplements, body, [0, 0, 0]), - args - ); - } - // Already existing class - const name = this.read_class_name_reference(); - if (this.token === "(") { - args = this.read_function_argument_list(); - } - return result(name, args); - }, - /** - * Reads a class name - * ```ebnf - * class_name_reference ::= namespace_name | variable - * ``` - */ - read_class_name_reference: function() { - if ( - this.token === this.tok.T_NS_SEPARATOR || - this.token === this.tok.T_STRING || - this.token === this.tok.T_NAMESPACE - ) { - let result = this.read_namespace_name(); - if (this.token === this.tok.T_DOUBLE_COLON) { - result = this.read_static_getter(result); - } - return result; - } else if (this.is("VARIABLE")) { - return this.read_variable(true, false, false); - } else { - this.expect([this.tok.T_STRING, "VARIABLE"]); - } - }, - handleDereferencable: function(expr) { - while (this.token !== this.EOF) { - if (this.token === this.tok.T_OBJECT_OPERATOR) { - expr = this.recursive_variable_chain_scan(expr, false); - } else if (this.token === this.tok.T_CURLY_OPEN || this.token === "[") { - expr = this.read_dereferencable(expr); - } else if (this.token === "(") { - // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L1118 - expr = this.node("call")(expr, this.read_function_argument_list()); - } else { - return expr; - } - } - return expr; - } -}; diff --git a/src/parser/function.js b/src/parser/function.js deleted file mode 100644 index d41c5b024..000000000 --- a/src/parser/function.js +++ /dev/null @@ -1,257 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -module.exports = { - /** - * checks if current token is a reference keyword - */ - is_reference: function() { - if (this.token == "&") { - this.next(); - return true; - } - return false; - }, - /** - * checks if current token is a variadic keyword - */ - is_variadic: function() { - if (this.token === this.tok.T_ELLIPSIS) { - this.next(); - return true; - } - return false; - }, - /** - * reading a function - * ```ebnf - * function ::= function_declaration code_block - * ``` - */ - read_function: function(closure, flag) { - const result = this.read_function_declaration( - closure ? 1 : flag ? 2 : 0, - flag && flag[1] === 1 - ); - if (flag && flag[2] == 1) { - // abstract function : - result.parseFlags(flag); - if (this.expect(";")) { - this.next(); - } - } else { - if (this.expect("{")) { - result.body = this.read_code_block(false); - if (result.loc && result.body.loc) { - result.loc.end = result.body.loc.end; - } - } - if (!closure && flag) { - result.parseFlags(flag); - } - } - return result; - }, - /** - * reads a function declaration (without his body) - * ```ebnf - * function_declaration ::= T_FUNCTION '&'? T_STRING '(' parameter_list ')' - * ``` - */ - read_function_declaration: function(type, isStatic) { - let nodeName = "function"; - if (type === 1) { - nodeName = "closure"; - } else if (type === 2) { - nodeName = "method"; - } - const result = this.node(nodeName); - - if (this.expect(this.tok.T_FUNCTION)) { - this.next(); - } - const isRef = this.is_reference(); - let name = false, - use = [], - returnType = null, - nullable = false; - if (type !== 1) { - if (type === 2) { - if ( - this.token === this.tok.T_STRING || - (this.php7 && this.is("IDENTIFIER")) - ) { - name = this.text(); - this.next(); - } else { - this.error("IDENTIFIER"); - } - } else { - if (this.expect(this.tok.T_STRING)) { - name = this.text(); - } - this.next(); - } - } - if (this.expect("(")) this.next(); - const params = this.read_parameter_list(); - if (this.expect(")")) this.next(); - if (type === 1 && this.token === this.tok.T_USE) { - if (this.next().expect("(")) this.next(); - use = this.read_list(this.read_lexical_var, ","); - if (this.expect(")")) this.next(); - } - if (this.token === ":") { - if (this.next().token === "?") { - nullable = true; - this.next(); - } - returnType = this.read_type(); - } - if (type === 1) { - // closure - return result(params, isRef, use, returnType, nullable, isStatic); - } - return result(name, params, isRef, returnType, nullable); - }, - /** - * ```ebnf - * lexical_var ::= '&'? T_VARIABLE - * ``` - */ - read_lexical_var: function() { - const result = this.node("variable"); - let isRef = false; - if (this.token === "&") { - isRef = true; - this.next(); - } - this.expect(this.tok.T_VARIABLE); - const name = this.text().substring(1); - this.next(); - return result(name, isRef, false); - }, - /** - * reads a list of parameters - * ```ebnf - * parameter_list ::= (parameter ',')* parameter? - * ``` - */ - read_parameter_list: function() { - const result = []; - if (this.token != ")") { - while (this.token != this.EOF) { - result.push(this.read_parameter()); - if (this.token == ",") { - this.next(); - } else if (this.token == ")") { - break; - } else { - this.error([",", ")"]); - break; - } - } - } - return result; - }, - /** - * ```ebnf - * parameter ::= type? '&'? T_ELLIPSIS? T_VARIABLE ('=' expr)? - * ``` - * @see https://github.com/php/php-src/blob/493524454d66adde84e00d249d607ecd540de99f/Zend/zend_language_parser.y#L640 - */ - read_parameter: function() { - const node = this.node("parameter"); - let name = null; - let value = null; - let type = null; - let nullable = false; - if (this.token === "?") { - this.next(); - nullable = true; - } - type = this.read_type(); - if (nullable && !type) { - this.raiseError( - "Expecting a type definition combined with nullable operator" - ); - } - const isRef = this.is_reference(); - const isVariadic = this.is_variadic(); - if (this.expect(this.tok.T_VARIABLE)) { - name = this.text().substring(1); - this.next(); - } - if (this.token == "=") { - value = this.next().read_expr(); - } - return node(name, type, value, isRef, isVariadic, nullable); - }, - /** - * Reads a list of arguments - * ```ebnf - * function_argument_list ::= '(' (argument_list (',' argument_list)*)? ')' - * ``` - */ - read_function_argument_list: function() { - const result = []; - let wasVariadic = false; - this.expect("(") && this.next(); - if (this.token !== ")") { - while (this.token != this.EOF) { - const argument = this.read_argument_list(); - if (argument) { - result.push(argument); - if (argument.kind === "variadic") { - wasVariadic = true; - } else if (wasVariadic) { - this.raiseError("Unexpected argument after a variadic argument"); - } - } - if (this.token === ",") { - this.next(); - } else break; - } - } - this.expect(")") && this.next(); - return result; - }, - /** - * ```ebnf - * argument_list ::= T_ELLIPSIS? expr - * ``` - */ - read_argument_list: function() { - if (this.token === this.tok.T_ELLIPSIS) { - return this.node("variadic")(this.next().read_expr()); - } - return this.read_expr(); - }, - /** - * read type hinting - * ```ebnf - * type ::= T_ARRAY | T_CALLABLE | namespace_name - * ``` - */ - read_type: function() { - const result = this.node("identifier"); - switch (this.token) { - case this.tok.T_ARRAY: - this.next(); - return result(["", "array"], false); - case this.tok.T_NAMESPACE: - case this.tok.T_NS_SEPARATOR: - case this.tok.T_STRING: - return this.read_namespace_name(); - case this.tok.T_CALLABLE: - this.next(); - return result(["", "callable"], false); - default: - return null; - } - } -}; diff --git a/src/parser/if.js b/src/parser/if.js deleted file mode 100644 index eff2a9e1c..000000000 --- a/src/parser/if.js +++ /dev/null @@ -1,98 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -module.exports = { - /** - * Reads an IF statement - * - * ```ebnf - * if ::= T_IF '(' expr ')' ':' ... - * ``` - */ - read_if: function() { - const result = this.node("if"); - let body = null; - let alternate = null; - let shortForm = false; - let test = null; - test = this.next().read_if_expr(); - - if (this.token === ":") { - shortForm = true; - this.next(); - body = this.node("block"); - const items = []; - while (this.token !== this.EOF && this.token !== this.tok.T_ENDIF) { - if (this.token === this.tok.T_ELSEIF) { - alternate = this.read_elseif_short(); - break; - } else if (this.token === this.tok.T_ELSE) { - alternate = this.read_else_short(); - break; - } - items.push(this.read_inner_statement()); - } - body = body(null, items); - this.expect(this.tok.T_ENDIF) && this.next(); - this.expectEndOfStatement(); - } else { - body = this.read_statement(); - if (this.token === this.tok.T_ELSEIF) { - alternate = this.read_if(); - } else if (this.token === this.tok.T_ELSE) { - alternate = this.next().read_statement(); - } - } - return result(test, body, alternate, shortForm); - }, - /** - * reads an if expression : '(' expr ')' - */ - read_if_expr: function() { - this.expect("(") && this.next(); - const result = this.read_expr(); - this.expect(")") && this.next(); - return result; - }, - /** - * reads an elseif (expr): statements - */ - read_elseif_short: function() { - const result = this.node("if"); - let alternate = null; - let test = null; - let body = null; - const items = []; - test = this.next().read_if_expr(); - if (this.expect(":")) this.next(); - body = this.node("block"); - while (this.token != this.EOF && this.token !== this.tok.T_ENDIF) { - if (this.token === this.tok.T_ELSEIF) { - alternate = this.read_elseif_short(); - break; - } else if (this.token === this.tok.T_ELSE) { - alternate = this.read_else_short(); - break; - } - items.push(this.read_inner_statement()); - } - body = body(null, items); - return result(test, body, alternate, true); - }, - /** - * - */ - read_else_short: function() { - const body = this.node("block"); - if (this.next().expect(":")) this.next(); - const items = []; - while (this.token != this.EOF && this.token !== this.tok.T_ENDIF) { - items.push(this.read_inner_statement()); - } - return body(null, items); - } -}; diff --git a/src/parser/loops.js b/src/parser/loops.js deleted file mode 100644 index f61b1a349..000000000 --- a/src/parser/loops.js +++ /dev/null @@ -1,164 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -module.exports = { - /** - * Reads a while statement - * ```ebnf - * while ::= T_WHILE (statement | ':' inner_statement_list T_ENDWHILE ';') - * ``` - * @see https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L587 - * @return {While} - */ - read_while: function() { - const result = this.node("while"); - let test = null; - let body = null; - let shortForm = false; - if (this.expect("(")) this.next(); - test = this.read_expr(); - if (this.expect(")")) this.next(); - if (this.token === ":") { - shortForm = true; - body = this.read_short_form(this.tok.T_ENDWHILE); - } else { - body = this.read_statement(); - } - return result(test, body, shortForm); - }, - /** - * Reads a do / while loop - * ```ebnf - * do ::= T_DO statement T_WHILE '(' expr ')' ';' - * ``` - * @see https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L423 - * @return {Do} - */ - read_do: function() { - const result = this.node("do"); - let test = null; - let body = null; - body = this.read_statement(); - if (this.expect(this.tok.T_WHILE)) { - if (this.next().expect("(")) this.next(); - test = this.read_expr(); - if (this.expect(")")) this.next(); - if (this.expect(";")) this.next(); - } - return result(test, body); - }, - /** - * Read a for incremental loop - * ```ebnf - * for ::= T_FOR '(' for_exprs ';' for_exprs ';' for_exprs ')' for_statement - * for_statement ::= statement | ':' inner_statement_list T_ENDFOR ';' - * for_exprs ::= expr? (',' expr)* - * ``` - * @see https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L425 - * @return {For} - */ - read_for: function() { - const result = this.node("for"); - let init = []; - let test = []; - let increment = []; - let body = null; - let shortForm = false; - if (this.expect("(")) this.next(); - if (this.token !== ";") { - init = this.read_list(this.read_expr, ","); - if (this.expect(";")) this.next(); - } else { - this.next(); - } - if (this.token !== ";") { - test = this.read_list(this.read_expr, ","); - if (this.expect(";")) this.next(); - } else { - this.next(); - } - if (this.token !== ")") { - increment = this.read_list(this.read_expr, ","); - if (this.expect(")")) this.next(); - } else { - this.next(); - } - if (this.token === ":") { - shortForm = true; - body = this.read_short_form(this.tok.T_ENDFOR); - } else { - body = this.read_statement(); - } - return result(init, test, increment, body, shortForm); - }, - /** - * Reads a foreach loop - * ```ebnf - * foreach ::= '(' expr T_AS foreach_variable (T_DOUBLE_ARROW foreach_variable)? ')' statement - * ``` - * @see https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L438 - * @return {Foreach} - */ - read_foreach: function() { - const result = this.node("foreach"); - let source = null; - let key = null; - let value = null; - let body = null; - let shortForm = false; - if (this.expect("(")) this.next(); - source = this.read_expr(); - if (this.expect(this.tok.T_AS)) { - this.next(); - value = this.read_foreach_variable(); - if (this.token === this.tok.T_DOUBLE_ARROW) { - key = value; - value = this.next().read_foreach_variable(); - } - } - - // grammatically correct but not supported by PHP - if (key && key.kind === "list") { - this.raiseError("Fatal Error : Cannot use list as key element"); - } - - if (this.expect(")")) this.next(); - - if (this.token === ":") { - shortForm = true; - body = this.read_short_form(this.tok.T_ENDFOREACH); - } else { - body = this.read_statement(); - } - return result(source, key, value, body, shortForm); - }, - /** - * Reads a foreach variable statement - * ```ebnf - * foreach_variable = - * variable | - * '&' variable | - * T_LIST '(' assignment_list ')' | - * '[' assignment_list ']' - * ``` - * @see https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L544 - * @return {Expression} - */ - read_foreach_variable: function() { - if (this.token === this.tok.T_LIST || this.token === "[") { - const isShort = this.token === "["; - const result = this.node("list"); - this.next(); - if (!isShort && this.expect("(")) this.next(); - const assignList = this.read_array_pair_list(isShort); - if (this.expect(isShort ? "]" : ")")) this.next(); - return result(assignList, isShort); - } else { - return this.read_variable(false, false, false); - } - } -}; diff --git a/src/parser/main.js b/src/parser/main.js deleted file mode 100644 index 33e54ce10..000000000 --- a/src/parser/main.js +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -module.exports = { - /** - * ```ebnf - * start ::= (namespace | top_statement)* - * ``` - */ - read_start: function() { - if (this.token == this.tok.T_NAMESPACE) { - return this.read_namespace(); - } else { - return this.read_top_statement(); - } - } -}; diff --git a/src/parser/namespace.js b/src/parser/namespace.js deleted file mode 100644 index c2f959a08..000000000 --- a/src/parser/namespace.js +++ /dev/null @@ -1,172 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -module.exports = { - /** - * Reads a namespace declaration block - * ```ebnf - * namespace ::= T_NAMESPACE namespace_name? '{' - * top_statements - * '}' - * | T_NAMESPACE namespace_name ';' top_statements - * ``` - * @see http://php.net/manual/en/language.namespaces.php - * @return {Namespace} - */ - read_namespace: function() { - const result = this.node("namespace"); - let body; - this.expect(this.tok.T_NAMESPACE) && this.next(); - if (this.token == "{") { - this.currentNamespace = [""]; - body = this.next().read_top_statements(); - this.expect("}") && this.next(); - return result([""], body, true); - } else { - const name = this.read_namespace_name(); - if (this.token == ";") { - this.currentNamespace = name; - body = this.next().read_top_statements(); - this.expect(this.EOF); - return result(name.name, body, false); - } else if (this.token == "{") { - this.currentNamespace = name; - body = this.next().read_top_statements(); - this.expect("}") && this.next(); - return result(name.name, body, true); - } else if (this.token === "(") { - // resolve ambuiguity between namespace & function call - name.resolution = this.ast.identifier.RELATIVE_NAME; - name.name = name.name.substring(1); - return this.node("call")(name, this.read_function_argument_list()); - } else { - this.error(["{", ";"]); - // graceful mode : - this.currentNamespace = name; - body = this.read_top_statements(); - this.expect(this.EOF); - return result(name, body, false); - } - } - }, - /** - * Reads a namespace name - * ```ebnf - * namespace_name ::= T_NS_SEPARATOR? (T_STRING T_NS_SEPARATOR)* T_STRING - * ``` - * @see http://php.net/manual/en/language.namespaces.rules.php - * @return {Identifier} - */ - read_namespace_name: function() { - const result = this.node("identifier"); - let relative = false; - if (this.token === this.tok.T_NAMESPACE) { - this.next().expect(this.tok.T_NS_SEPARATOR) && this.next(); - relative = true; - } - return result( - this.read_list(this.tok.T_STRING, this.tok.T_NS_SEPARATOR, true), - relative - ); - }, - /** - * Reads a use statement - * ```ebnf - * use_statement ::= T_USE - * use_type? use_declarations | - * use_type use_statement '{' use_declarations '}' | - * use_statement '{' use_declarations(=>typed) '}' - * ';' - * ``` - * @see http://php.net/manual/en/language.namespaces.importing.php - * @return {UseGroup} - */ - read_use_statement: function() { - let result = this.node("usegroup"); - let items = []; - let name = null; - this.expect(this.tok.T_USE) && this.next(); - const type = this.read_use_type(); - items.push(this.read_use_declaration(false)); - if (this.token === ",") { - items = items.concat(this.next().read_use_declarations(false)); - } else if (this.token === "{") { - name = items[0].name; - items = this.next().read_use_declarations(type === null); - this.expect("}") && this.next(); - } - result = result(name, type, items); - this.expect(";") && this.next(); - return result; - }, - /** - * Reads a use declaration - * ```ebnf - * use_declaration ::= use_type? namespace_name use_alias - * ``` - * @see https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L380 - * @return {UseItem} - */ - read_use_declaration: function(typed) { - const result = this.node("useitem"); - let type = null; - if (typed) type = this.read_use_type(); - const name = this.read_namespace_name(); - const alias = this.read_use_alias(); - return result(name.name, alias, type); - }, - /** - * Reads a list of use declarations - * ```ebnf - * use_declarations ::= use_declaration (',' use_declaration)* - * ``` - * @see https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L380 - * @return {UseItem[]} - */ - read_use_declarations: function(typed) { - const result = [this.read_use_declaration(typed)]; - while (this.token === ",") { - result.push(this.next().read_use_declaration(typed)); - } - return result; - }, - /** - * Reads a use statement - * ```ebnf - * use_alias ::= (T_AS T_STRING)? - * ``` - * @return {String|null} - */ - read_use_alias: function() { - let result = null; - if (this.token === this.tok.T_AS) { - if (this.next().expect(this.tok.T_STRING)) { - result = this.text(); - this.next(); - } - } - return result; - }, - /** - * Reads the namespace type declaration - * ```ebnf - * use_type ::= (T_FUNCTION | T_CONST)? - * ``` - * @see https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L335 - * @return {String|null} Possible values : function, const - */ - read_use_type: function() { - if (this.token === this.tok.T_FUNCTION) { - this.next(); - return this.ast.useitem.TYPE_FUNCTION; - } else if (this.token === this.tok.T_CONST) { - this.next(); - return this.ast.useitem.TYPE_CONST; - } - return null; - } -}; diff --git a/src/parser/scalar.js b/src/parser/scalar.js deleted file mode 100644 index 3fbb1f947..000000000 --- a/src/parser/scalar.js +++ /dev/null @@ -1,307 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -const specialChar = { - "\\r": "\r", - "\\n": "\n", - "\\t": "\t", - "\\v": String.fromCharCode(11), - "\\e": String.fromCharCode(27), - "\\f": String.fromCharCode(12), - "\\\\": "\\", - "\\$": "$", - '\\"': '"', - "\\'": "'" -}; - -module.exports = { - /** - * Unescape special chars - */ - resolve_special_chars: function(text, doubleQuote) { - if (!doubleQuote) { - // single quote fix - return text.replace(/\\['\\]/g, function(seq) { - return specialChar[seq]; - }); - } - return text.replace(/\\[rntvef"'\\$]/g, function(seq) { - return specialChar[seq]; - }); - }, - /** - * ```ebnf - * scalar ::= T_MAGIC_CONST - * | T_LNUMBER | T_DNUMBER - * | T_START_HEREDOC T_ENCAPSED_AND_WHITESPACE? T_END_HEREDOC - * | '"' encaps_list '"' - * | T_START_HEREDOC encaps_list T_END_HEREDOC - * | namespace_name (T_DOUBLE_COLON T_STRING)? - * ``` - */ - read_scalar: function() { - if (this.is("T_MAGIC_CONST")) { - return this.get_magic_constant(); - } else { - let value, node; - switch (this.token) { - // TEXTS - case this.tok.T_CONSTANT_ENCAPSED_STRING: { - value = this.node("string"); - const text = this.text(); - let offset = 0; - if (text[0] === "b" || text[0] === "B") { - offset = 1; - } - const isDoubleQuote = text[offset] === '"'; - this.next(); - value = value( - isDoubleQuote, - this.resolve_special_chars( - text.substring(offset + 1, text.length - 1), - isDoubleQuote - ), - offset === 1, // unicode flag - text - ); - if (this.token === this.tok.T_DOUBLE_COLON) { - // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L1151 - return this.read_static_getter(value); - } else { - // dirrect string - return value; - } - } - case this.tok.T_START_HEREDOC: - if (this.lexer.curCondition === "ST_NOWDOC") { - const start = this.lexer.yylloc.first_offset; - node = this.node("nowdoc"); - value = this.next().text(); - // strip the last line return char - const lastCh = value[value.length - 1]; - if (lastCh === "\n") { - if (value[value.length - 2] === "\r") { - // windows style - value = value.substring(0, value.length - 2); - } else { - // linux style - value = value.substring(0, value.length - 1); - } - } else if (lastCh === "\r") { - // mac style - value = value.substring(0, value.length - 1); - } - this.expect(this.tok.T_ENCAPSED_AND_WHITESPACE) && this.next(); - const raw = this.lexer._input.substring( - start, - this.lexer.yylloc.last_offset - ); - node = node( - value, - raw, - this.lexer.heredoc_label, - raw[3] === '"' || raw[3] === "'" - ); - this.expect(this.tok.T_END_HEREDOC) && this.next(); - return node; - } else { - return this.next().read_encapsed_string(this.tok.T_END_HEREDOC); - } - - case '"': - return this.next().read_encapsed_string('"'); - - case 'b"': - case 'B"': { - this.next(); - this.lexer.yylloc.prev_offset -= 1; - return this.read_encapsed_string('"'); - } - - // NUMERIC - case this.tok.T_LNUMBER: // long - case this.tok.T_DNUMBER: { - // double - const result = this.node("number"); - value = this.text(); - this.next(); - return result(value, null); - } - - // ARRAYS - case this.tok.T_ARRAY: // array parser - return this.read_array(); - case "[": // short array format - return this.read_array(); - default: { - const err = this.error("SCALAR"); - // graceful mode : ignore token & return error node - this.next(); - return err; - } - } - } - }, - /** - * Handles the dereferencing - */ - read_dereferencable: function(expr) { - let result, offset; - const node = this.node("offsetlookup"); - if (this.token === "[") { - offset = this.next().read_expr(); - if (this.expect("]")) this.next(); - result = node(expr, offset); - } else if (this.token === this.tok.T_DOLLAR_OPEN_CURLY_BRACES) { - offset = this.read_encapsed_string_item(false); - result = node(expr, offset); - } - return result; - }, - /** - * Reads and extracts an encapsed item - * ```ebnf - * encapsed_string_item ::= T_ENCAPSED_AND_WHITESPACE - * | T_DOLLAR_OPEN_CURLY_BRACES expr '}' - * | T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME '}' - * | T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME '[' expr ']' '}' - * | T_CURLY_OPEN variable '}' - * | variable - * | variable '[' expr ']' - * | variable T_OBJECT_OPERATOR T_STRING - * ``` - * @return {String|Variable|Expr|Lookup} - * @see https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L1219 - */ - read_encapsed_string_item: function(isDoubleQuote) { - let result = this.node(), - offset, - node, - name; - - // plain text - // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L1222 - if (this.token === this.tok.T_ENCAPSED_AND_WHITESPACE) { - const text = this.text(); - this.next(); - result = result( - "string", - false, - this.resolve_special_chars(text, isDoubleQuote), - false, - text - ); - } else if (this.token === this.tok.T_DOLLAR_OPEN_CURLY_BRACES) { - // dynamic variable name - // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L1239 - name = null; - if (this.next().token === this.tok.T_STRING_VARNAME) { - const varName = this.text(); - name = this.node("variable"); - this.next(); - // check if lookup an offset - // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L1243 - if (this.token === "[") { - name = name(varName, false); - node = this.node("offsetlookup"); - offset = this.next().read_expr(); - this.expect("]") && this.next(); - name = node(name, offset); - } else { - name = this.node("constref")(varName); - } - } else { - name = this.read_expr(); - } - this.expect("}") && this.next(); - result = result("variable", name, false, true); - } else if (this.token === this.tok.T_CURLY_OPEN) { - // expression - // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L1246 - result = this.next().read_variable(false, false, false); - if (result.kind === "variable") { - result.curly = true; - } - this.expect("}") && this.next(); - } else if (this.token === this.tok.T_VARIABLE) { - // plain variable - // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L1231 - result = this.read_simple_variable(false); - - // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L1233 - if (this.token === "[") { - node = this.node("offsetlookup"); - offset = this.next().read_encaps_var_offset(); - this.expect("]") && this.next(); - result = node(result, offset); - } - - // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L1236 - if (this.token === this.tok.T_OBJECT_OPERATOR) { - node = this.node("propertylookup"); - const what = this.node("constref"); - this.next().expect(this.tok.T_STRING); - name = this.text(); - this.next(); - result = node(result, what(name)); - } - - // error / fallback - } else { - this.expect(this.tok.T_ENCAPSED_AND_WHITESPACE); - const value = this.text(); - this.next(); - // consider it as string - result = result("string", false, value, false, value); - } - - return result; - }, - /** - * Reads an encapsed string - */ - read_encapsed_string: function(expect) { - const start = this.lexer.yylloc.prev_offset; - let node = this.node("encapsed"); - const value = []; - let type = null; - - if (expect === "`") { - type = this.ast.encapsed.TYPE_SHELL; - } else if (expect === '"') { - type = this.ast.encapsed.TYPE_STRING; - } else { - type = this.ast.encapsed.TYPE_HEREDOC; - } - - // reading encapsed parts - while (this.token !== expect && this.token !== this.EOF) { - value.push(this.read_encapsed_string_item(true)); - } - - this.expect(expect) && this.next(); - node = node( - value, - this.lexer._input.substring(start - 1, this.lexer.yylloc.first_offset), - type - ); - - if (expect === this.tok.T_END_HEREDOC) { - node.label = this.lexer.heredoc_label; - } - return node; - }, - /** - * Constant token - */ - get_magic_constant: function() { - const result = this.node("magic"); - const name = this.text(); - this.next(); - return result(name.toUpperCase(), name); - } -}; diff --git a/src/parser/statement.js b/src/parser/statement.js deleted file mode 100644 index 0fbf44d48..000000000 --- a/src/parser/statement.js +++ /dev/null @@ -1,403 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -module.exports = { - /** - * reading a list of top statements (helper for top_statement*) - * ```ebnf - * top_statements ::= top_statement* - * ``` - */ - read_top_statements: function() { - let result = []; - while (this.token !== this.EOF && this.token !== "}") { - const statement = this.read_top_statement(); - if (statement) { - if (Array.isArray(statement)) { - result = result.concat(statement); - } else { - result.push(statement); - } - } - } - return result; - }, - /** - * reading a top statement - * ```ebnf - * top_statement ::= - * namespace | function | class - * | interface | trait - * | use_statements | const_list - * | statement - * ``` - */ - read_top_statement: function() { - switch (this.token) { - case this.tok.T_FUNCTION: - return this.read_function(false, false); - // optional flags - case this.tok.T_ABSTRACT: - case this.tok.T_FINAL: { - const flag = this.read_class_scope(); - if (this.token === this.tok.T_CLASS) { - return this.read_class(flag); - } else { - this.error(this.tok.T_CLASS); - this.next(); - return null; - } - } - case this.tok.T_CLASS: - return this.read_class([0, 0, 0]); - case this.tok.T_INTERFACE: - return this.read_interface(); - case this.tok.T_TRAIT: - return this.read_trait(); - case this.tok.T_USE: - return this.read_use_statement(); - case this.tok.T_CONST: - return this.next().read_const_list(); - case this.tok.T_NAMESPACE: - return this.read_namespace(); - case this.tok.T_HALT_COMPILER: { - const result = this.node("halt"); - if (this.next().expect("(")) this.next(); - if (this.expect(")")) this.next(); - this.expect(";"); - this.lexer.done = true; - return result(this.lexer._input.substring(this.lexer.offset)); - } - default: - return this.read_statement(); - } - }, - /** - * reads a list of simple inner statements (helper for inner_statement*) - * ```ebnf - * inner_statements ::= inner_statement* - * ``` - */ - read_inner_statements: function() { - let result = []; - while (this.token != this.EOF && this.token !== "}") { - const statement = this.read_inner_statement(); - if (statement) { - if (Array.isArray(statement)) { - result = result.concat(statement); - } else { - result.push(statement); - } - } - } - return result; - }, - /** - * Reads a list of constants declaration - * ```ebnf - * const_list ::= T_CONST T_STRING '=' expr (',' T_STRING '=' expr)* ';' - * ``` - */ - read_const_list: function() { - const result = this.read_list( - function() { - this.expect(this.tok.T_STRING); - const result = this.node("constant"); - const name = this.text(); - if (this.next().expect("=")) { - return result(name, this.next().read_expr()); - } else { - // fallback - return result(name, null); - } - }, - ",", - false - ); - this.expectEndOfStatement(); - return result; - }, - /** - * Reads a list of constants declaration - * ```ebnf - * declare_list ::= T_STRING '=' expr (',' T_STRING '=' expr)* - * ``` - * @retrurn {Object} - */ - read_declare_list: function() { - const result = {}; - while (this.token != this.EOF && this.token !== ")") { - this.expect(this.tok.T_STRING); - const name = this.text().toLowerCase(); - if (this.next().expect("=")) { - result[name] = this.next().read_expr(); - } else { - result[name] = null; - } - if (this.token !== ",") break; - this.next(); - } - return result; - }, - /** - * reads a simple inner statement - * ```ebnf - * inner_statement ::= '{' inner_statements '}' | token - * ``` - */ - read_inner_statement: function() { - switch (this.token) { - case this.tok.T_FUNCTION: - return this.read_function(false, false); - // optional flags - case this.tok.T_ABSTRACT: - case this.tok.T_FINAL: { - const flag = this.read_class_scope(); - if (this.token === this.tok.T_CLASS) { - return this.read_class(flag); - } else { - this.error(this.tok.T_CLASS); - // graceful mode : ignore token & go next - this.next(); - return null; - } - } - case this.tok.T_CLASS: - return this.read_class([0, 0, 0]); - case this.tok.T_INTERFACE: - return this.read_interface(); - case this.tok.T_TRAIT: - return this.read_trait(); - case this.tok.T_HALT_COMPILER: { - this.raiseError( - "__HALT_COMPILER() can only be used from the outermost scope" - ); - // fallback : returns a node but does not stop the parsing - let node = this.node("halt"); - this.next().expect("(") && this.next(); - this.expect(")") && this.next(); - node = node(this.lexer._input.substring(this.lexer.offset)); - this.expect(";") && this.next(); - return node; - } - default: - return this.read_statement(); - } - }, - /** - * Reads statements - */ - read_statement: function() { - let result, expr, items, current, label; - switch (this.token) { - case "{": - return this.read_code_block(false); - - case this.tok.T_IF: - return this.read_if(); - - case this.tok.T_SWITCH: - return this.read_switch(); - - case this.tok.T_FOR: - return this.next().read_for(); - - case this.tok.T_FOREACH: - return this.next().read_foreach(); - - case this.tok.T_WHILE: - return this.next().read_while(); - - case this.tok.T_DO: - return this.next().read_do(); - - case this.tok.T_COMMENT: - return this.read_comment(); - - case this.tok.T_DOC_COMMENT: - return this.read_doc_comment(); - - case this.tok.T_RETURN: - result = this.node("return"); - expr = null; - if (!this.next().is("EOS")) { - expr = this.read_expr(); - } - this.expectEndOfStatement(); - return result(expr); - - // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L429 - case this.tok.T_BREAK: - case this.tok.T_CONTINUE: { - result = this.node( - this.token === this.tok.T_CONTINUE ? "continue" : "break" - ); - let level = null; - this.next(); // look ahead - if (this.token !== ";") { - level = this.read_expr(); - } - this.expectEndOfStatement(); - return result(level); - } - - case this.tok.T_GLOBAL: - result = this.node("global"); - items = this.next().read_list(this.read_simple_variable, ","); - this.expectEndOfStatement(); - return result(items); - - case this.tok.T_STATIC: - current = [this.token, this.lexer.getState()]; - result = this.node("static"); - if (this.next().token === this.tok.T_DOUBLE_COLON) { - // static keyword for a class - this.lexer.tokens.push(current); - expr = this.next().read_expr(); - this.expect(";") && this.next(); - return expr; - } - if (this.token === this.tok.T_FUNCTION) { - return this.read_function(true, [0, 1, 0]); - } - items = this.read_variable_declarations(); - this.expectEndOfStatement(); - return result(items); - - case this.tok.T_ECHO: { - result = this.node("echo"); - const text = this.text(); - const shortForm = text === " 0 - ? this.lexer._input[this.lexer.yylloc.first_offset - 1] - : null; - const fixFirstLine = prevChar === "\r" || prevChar === "\n"; - // revert back the first stripped line - if (fixFirstLine) { - if ( - prevChar === "\n" && - this.lexer.yylloc.first_offset > 1 && - this.lexer._input[this.lexer.yylloc.first_offset - 2] === "\r" - ) { - prevChar = "\r\n"; - } - } - result = this.node("inline"); - this.next(); - return result(value, fixFirstLine ? prevChar + value : value); - } - - case this.tok.T_UNSET: - result = this.node("unset"); - this.next().expect("(") && this.next(); - items = this.read_list(this.read_variable, ","); - this.expect(")") && this.next(); - this.expect(";") && this.next(); - return result(items); - - case this.tok.T_DECLARE: { - result = this.node("declare"); - const body = []; - let mode; - this.next().expect("(") && this.next(); - const what = this.read_declare_list(); - this.expect(")") && this.next(); - if (this.token === ":") { - this.next(); - while ( - this.token != this.EOF && - this.token !== this.tok.T_ENDDECLARE - ) { - // @todo : check declare_statement from php / not valid - body.push(this.read_top_statement()); - } - this.expect(this.tok.T_ENDDECLARE) && this.next(); - this.expectEndOfStatement(); - mode = this.ast.declare.MODE_SHORT; - } else if (this.token === "{") { - this.next(); - while (this.token != this.EOF && this.token !== "}") { - // @todo : check declare_statement from php / not valid - body.push(this.read_top_statement()); - } - this.expect("}") && this.next(); - mode = this.ast.declare.MODE_BLOCK; - } else { - this.expect(";") && this.next(); - mode = this.ast.declare.MODE_NONE; - } - return result(what, body, mode); - } - - case this.tok.T_TRY: - return this.read_try(); - - case this.tok.T_THROW: - result = this.node("throw"); - expr = this.next().read_expr(); - this.expectEndOfStatement(); - return result(expr); - - case ";": // ignore this (extra ponctuation) - this.next(); - return null; - - case this.tok.T_STRING: - current = [this.token, this.lexer.getState()]; - label = this.text(); - // AST : https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L457 - if (this.next().token === ":") { - result = this.node("label"); - this.next(); - return result(label); - } - - // default fallback expr / T_STRING '::' (etc...) - this.lexer.tokens.push(current); - expr = this.next().read_expr(); - this.expectEndOfStatement(); - return expr; - - case this.tok.T_GOTO: - result = this.node("goto"); - label = null; - if (this.next().expect(this.tok.T_STRING)) { - label = this.text(); - this.next().expectEndOfStatement(); - } - return result(label); - - default: - // default fallback expr - expr = this.read_expr(); - this.expectEndOfStatement(expr); - return expr; - } - }, - /** - * ```ebnf - * code_block ::= '{' (inner_statements | top_statements) '}' - * ``` - */ - read_code_block: function(top) { - const result = this.node("block"); - this.expect("{") && this.next(); - const body = top - ? this.read_top_statements() - : this.read_inner_statements(); - this.expect("}") && this.next(); - return result(null, body); - } -}; diff --git a/src/parser/switch.js b/src/parser/switch.js deleted file mode 100644 index 41c69c86c..000000000 --- a/src/parser/switch.js +++ /dev/null @@ -1,91 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -module.exports = { - /** - * Reads a switch statement - * ```ebnf - * switch ::= T_SWITCH '(' expr ')' switch_case_list - * ``` - * @return {Switch} - * @see http://php.net/manual/en/control-structures.switch.php - */ - read_switch: function() { - this.expect(this.tok.T_SWITCH) && this.next(); - const result = this.node("switch"); - this.expect("(") && this.next(); - const test = this.read_expr(); - this.expect(")") && this.next(); - const shortForm = this.token === ":"; - const body = this.read_switch_case_list(); - return result(test, body, shortForm); - }, - /** - * ```ebnf - * switch_case_list ::= '{' ';'? case_list* '}' | ':' ';'? case_list* T_ENDSWITCH ';' - * ``` - * @see https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L566 - */ - read_switch_case_list: function() { - // DETECT SWITCH MODE - let expect = null; - const result = this.node("block"); - const items = []; - if (this.token === "{") { - expect = "}"; - } else if (this.token === ":") { - expect = this.tok.T_ENDSWITCH; - } else { - this.expect(["{", ":"]); - } - // OPTIONNAL ';' - // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L570 - if (this.next().token === ";") { - this.next(); - } - // EXTRACTING CASES - while (this.token !== this.EOF && this.token !== expect) { - items.push(this.read_case_list(expect)); - } - // CHECK END TOKEN - this.expect(expect) && this.next(); - if (expect === this.tok.T_ENDSWITCH) { - this.expectEndOfStatement(); - } - return result(null, items); - }, - /** - * ```ebnf - * case_list ::= ((T_CASE expr) | T_DEFAULT) (':' | ';') inner_statement* - * ``` - */ - read_case_list: function(stopToken) { - const result = this.node("case"); - let test = null; - let body = null; - const items = []; - if (this.token === this.tok.T_CASE) { - test = this.next().read_expr(); - } else if (this.token === this.tok.T_DEFAULT) { - // the defaut entry - no condition - this.next(); - } else { - this.expect([this.tok.T_CASE, this.tok.T_DEFAULT]); - } - this.expect([":", ";"]) && this.next(); - body = this.node("block"); - while ( - this.token != this.EOF && - this.token !== stopToken && - this.token !== this.tok.T_CASE && - this.token !== this.tok.T_DEFAULT - ) { - items.push(this.read_inner_statement()); - } - return result(test, items.length > 0 ? body(null, items) : null); - } -}; diff --git a/src/parser/try.js b/src/parser/try.js deleted file mode 100644 index 9433d84ea..000000000 --- a/src/parser/try.js +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -module.exports = { - /** - * ```ebnf - * try ::= T_TRY '{' inner_statement* '}' - * ( - * T_CATCH '(' namespace_name variable ')' '{' inner_statement* '}' - * )* - * (T_FINALLY '{' inner_statement* '}')? - * ``` - * @see https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L448 - * @return {Try} - */ - read_try: function() { - this.expect(this.tok.T_TRY); - const result = this.node("try"); - let always = null; - const catches = []; - const body = this.next().read_statement(); - // https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L455 - while (this.token === this.tok.T_CATCH) { - const item = this.node("catch"); - this.next().expect("(") && this.next(); - const what = this.read_list(this.read_namespace_name, "|", false); - const variable = this.read_variable(true, false, false); - this.expect(")"); - catches.push(item(this.next().read_statement(), what, variable)); - } - if (this.token === this.tok.T_FINALLY) { - always = this.next().read_statement(); - } - return result(body, catches, always); - } -}; diff --git a/src/parser/utils.js b/src/parser/utils.js deleted file mode 100644 index 8ef78c197..000000000 --- a/src/parser/utils.js +++ /dev/null @@ -1,116 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -module.exports = { - /** - * Reads a short form of tokens - * @param {Number} token - The ending token - * @return {Block} - */ - read_short_form: function(token) { - const body = this.node("block"); - const items = []; - if (this.expect(":")) this.next(); - while (this.token != this.EOF && this.token !== token) { - items.push(this.read_inner_statement()); - } - if (this.expect(token)) this.next(); - this.expectEndOfStatement(); - return body(null, items); - }, - - /** - * Helper : reads a list of tokens / sample : T_STRING ',' T_STRING ... - * ```ebnf - * list ::= separator? ( item separator )* item - * ``` - */ - read_list: function(item, separator, preserveFirstSeparator) { - const result = []; - - if (this.token == separator) { - if (preserveFirstSeparator) result.push(null); - this.next(); - } - - if (typeof item === "function") { - do { - result.push(item.apply(this, [])); - if (this.token != separator) { - break; - } - } while (this.next().token != this.EOF); - } else { - if (this.expect(item)) { - result.push(this.text()); - } else { - return []; - } - while (this.next().token != this.EOF) { - if (this.token != separator) break; - // trim current separator & check item - if (this.next().token != item) break; - result.push(this.text()); - } - } - return result; - }, - - /** - * Reads a list of names separated by a comma - * - * ```ebnf - * name_list ::= namespace (',' namespace)* - * ``` - * - * Sample code : - * ```php - * func()->property // chained calls - * ``` - */ - read_variable: function(read_only, encapsed, byref) { - let result; - - // check the byref flag - if (!byref && this.token === "&") { - byref = true; - this.next(); - } - - // reads the entry point - if (this.is([this.tok.T_VARIABLE, "$"])) { - result = this.read_reference_variable(encapsed, byref); - } else if ( - this.is([ - this.tok.T_NS_SEPARATOR, - this.tok.T_STRING, - this.tok.T_NAMESPACE - ]) - ) { - result = this.node(); - const name = this.read_namespace_name(); - if (this.token != this.tok.T_DOUBLE_COLON && this.token != "(") { - // @see parser.js line 130 : resolves a conflict with scalar - const literal = name.name.toLowerCase(); - if (literal === "true") { - result = result("boolean", true, name.name); - } else if (literal === "false") { - result = result("boolean", false, name.name); - } else { - // @todo null keyword ? - result = result("constref", name); - } - } else { - result = name; - } - } else if (this.token === this.tok.T_STATIC) { - result = this.node("constref"); - this.next(); - result = result("static"); - } else { - this.expect("VARIABLE"); - } - - // static mode - if (this.token === this.tok.T_DOUBLE_COLON) { - result = this.read_static_getter(result, encapsed); - } - - return this.recursive_variable_chain_scan(result, read_only, encapsed); - }, - - // resolves a static call - read_static_getter: function(what, encapsed) { - const result = this.node("staticlookup"); - let offset, name; - if (this.next().is([this.tok.T_VARIABLE, "$"])) { - offset = this.read_reference_variable(encapsed, false); - } else if ( - this.token === this.tok.T_STRING || - this.token === this.tok.T_CLASS || - (this.php7 && this.is("IDENTIFIER")) - ) { - offset = this.node("constref"); - name = this.text(); - this.next(); - offset = offset(name); - } else { - this.error([this.tok.T_VARIABLE, this.tok.T_STRING]); - // graceful mode : set getter as error node and continue - offset = this.node("constref"); - name = this.text(); - this.next(); - offset = offset(name); - } - return result(what, offset); - }, - - recursive_variable_chain_scan: function(result, read_only, encapsed) { - let name, node, offset; - recursive_scan_loop: while (this.token != this.EOF) { - switch (this.token) { - case "(": - if (read_only) { - // @fixme : add more informations & test - return result; - } else { - result = this.node("call")( - result, - this.read_function_argument_list() - ); - } - break; - case "[": - node = this.node("offsetlookup"); - this.next(); - offset = false; - if (encapsed) { - offset = this.read_encaps_var_offset(); - this.expect("]") && this.next(); - } else { - // callable_variable : https://github.com/php/php-src/blob/493524454d66adde84e00d249d607ecd540de99f/Zend/zend_language_parser.y#L1122 - if (this.token !== "]") { - offset = this.read_expr(); - this.expect("]") && this.next(); - } else { - this.next(); - } - } - result = node(result, offset); - break; - case this.tok.T_DOUBLE_COLON: - // @see https://github.com/glayzzle/php-parser/issues/107#issuecomment-354104574 - if (result.kind === "staticlookup") { - this.error(); - } - - node = this.node("staticlookup"); - if ( - this.next().token === this.tok.T_STRING || - (this.php7 && this.is("IDENTIFIER")) - ) { - offset = this.node("constref"); - name = this.text(); - this.next(); - offset = offset(name); - - if (this.token === this.tok.T_OBJECT_OPERATOR) { - this.error(); - } - } else { - this.error(this.tok.T_STRING); - // fallback on a constref node - offset = this.node("constref")(this.text()); - this.next(); - } - result = node(result, offset); - break; - case this.tok.T_OBJECT_OPERATOR: { - node = this.node("propertylookup"); - let what = null; - switch (this.next().token) { - case this.tok.T_STRING: - what = this.node("constref"); - name = this.text(); - this.next(); - what = what(name); - if (this.token === this.tok.T_VARIABLE) { - const inner = this.node("variable"); - name = this.text().substring(1); - this.next(); - what = this.node("encapsed")( - [what, inner(name, false, false)], - null, - "offset" - ); - if (what.loc && what.value[0].loc) { - what.loc.start = what.value[0].loc.start; - } - } else if (this.token === "{") { - const expr = this.next().read_expr(); - this.expect("}") && this.next(); - what = this.node("encapsed")([what, expr], null, "offset"); - if (what.loc && what.value[0].loc) { - what.loc.start = what.value[0].loc.start; - } - } - break; - case this.tok.T_VARIABLE: - what = this.node("variable"); - name = this.text().substring(1); - this.next(); - what = what(name, false, false); - break; - case "$": - this.next().expect(["{", this.tok.T_VARIABLE]); - if (this.token === "{") { - // $obj->${$varname} - what = this.next().read_expr(); - this.expect("}") && this.next(); - } else { - // $obj->$$varname - what = this.read_expr(); - } - break; - case "{": - what = this.next().read_expr(); - this.expect("}") && this.next(); - break; - default: - this.error([this.tok.T_STRING, this.tok.T_VARIABLE]); - // graceful mode : set what as error mode & continue - what = this.node("constref"); - name = this.text(); - this.next(); - what = what(name); - break; - } - result = node(result, what); - break; - } - default: - break recursive_scan_loop; - } - } - return result; - }, - /** - * https://github.com/php/php-src/blob/493524454d66adde84e00d249d607ecd540de99f/Zend/zend_language_parser.y#L1231 - */ - read_encaps_var_offset: function() { - let offset = this.node(); - if (this.token === this.tok.T_STRING) { - const text = this.text(); - this.next(); - offset = offset("constref", text); - } else if (this.token === this.tok.T_NUM_STRING) { - const num = this.text(); - this.next(); - offset = offset("number", num, null); - } else if (this.token === this.tok.T_VARIABLE) { - const name = this.text().substring(1); - this.next(); - offset = offset("variable", name, false, false); - } else { - this.expect([ - this.tok.T_STRING, - this.tok.T_NUM_STRING, - this.tok.T_VARIABLE - ]); - // fallback : consider as constref - const text = this.text(); - this.next(); - offset = offset("constref", text); - } - return offset; - }, - /** - * ```ebnf - * reference_variable ::= simple_variable ('[' OFFSET ']')* | '{' EXPR '}' - * ``` - * - * $foo[123]; // foo is an array ==> gets its entry - * $foo{1}; // foo is a string ==> get the 2nd char offset - * ${'foo'}[123]; // get the dynamic var $foo - * $foo[123]{1}; // gets the 2nd char from the 123 array entry - * - */ - read_reference_variable: function(encapsed, byref) { - let result = this.read_simple_variable(byref); - let offset; - while (this.token != this.EOF) { - const node = this.node(); - if (this.token == "[") { - offset = null; - if (encapsed) { - offset = this.next().read_encaps_var_offset(); - } else { - offset = this.next().token === "]" ? null : this.read_dim_offset(); - } - this.expect("]") && this.next(); - result = node("offsetlookup", result, offset); - } else if (this.token == "{" && !encapsed) { - offset = this.next().read_expr(); - this.expect("}") && this.next(); - result = node("offsetlookup", result, offset); - } else break; - } - return result; - }, - /** - * ```ebnf - * simple_variable ::= T_VARIABLE | '$' '{' expr '}' | '$' simple_variable - * ``` - */ - read_simple_variable: function(byref) { - let result = this.node("variable"); - let name; - if ( - this.expect([this.tok.T_VARIABLE, "$"]) && - this.token === this.tok.T_VARIABLE - ) { - // plain variable name - name = this.text().substring(1); - this.next(); - result = result(name, byref, false); - } else { - if (this.token === "$") this.next(); - // dynamic variable name - switch (this.token) { - case "{": { - const expr = this.next().read_expr(); - this.expect("}") && this.next(); - result = result(expr, byref, true); - break; - } - case "$": // $$$var - result = result(this.read_simple_variable(false), byref); - break; - case this.tok.T_VARIABLE: { - // $$var - name = this.text().substring(1); - const node = this.node("variable"); - this.next(); - result = result(node(name, false, false), byref, false); - break; - } - default: - this.error(["{", "$", this.tok.T_VARIABLE]); - // graceful mode - name = this.text(); - this.next(); - result = result(name, byref, false); - } - } - return result; - } -}; diff --git a/src/tokens.js b/src/tokens.js deleted file mode 100644 index d4ccadd3b..000000000 --- a/src/tokens.js +++ /dev/null @@ -1,283 +0,0 @@ -/** - * Copyright (C) 2018 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ -"use strict"; - -/** - * PHP AST Tokens - * @type {Object} - */ -module.exports = { - values: { - 101: "T_HALT_COMPILER", - 102: "T_USE", - 103: "T_ENCAPSED_AND_WHITESPACE", - 104: "T_OBJECT_OPERATOR", - 105: "T_STRING", - 106: "T_DOLLAR_OPEN_CURLY_BRACES", - 107: "T_STRING_VARNAME", - 108: "T_CURLY_OPEN", - 109: "T_NUM_STRING", - 110: "T_ISSET", - 111: "T_EMPTY", - 112: "T_INCLUDE", - 113: "T_INCLUDE_ONCE", - 114: "T_EVAL", - 115: "T_REQUIRE", - 116: "T_REQUIRE_ONCE", - 117: "T_NAMESPACE", - 118: "T_NS_SEPARATOR", - 119: "T_AS", - 120: "T_IF", - 121: "T_ENDIF", - 122: "T_WHILE", - 123: "T_DO", - 124: "T_FOR", - 125: "T_SWITCH", - 126: "T_BREAK", - 127: "T_CONTINUE", - 128: "T_RETURN", - 129: "T_GLOBAL", - 130: "T_STATIC", - 131: "T_ECHO", - 132: "T_INLINE_HTML", - 133: "T_UNSET", - 134: "T_FOREACH", - 135: "T_DECLARE", - 136: "T_TRY", - 137: "T_THROW", - 138: "T_GOTO", - 139: "T_FINALLY", - 140: "T_CATCH", - 141: "T_ENDDECLARE", - 142: "T_LIST", - 143: "T_CLONE", - 144: "T_PLUS_EQUAL", - 145: "T_MINUS_EQUAL", - 146: "T_MUL_EQUAL", - 147: "T_DIV_EQUAL", - 148: "T_CONCAT_EQUAL", - 149: "T_MOD_EQUAL", - 150: "T_AND_EQUAL", - 151: "T_OR_EQUAL", - 152: "T_XOR_EQUAL", - 153: "T_SL_EQUAL", - 154: "T_SR_EQUAL", - 155: "T_INC", - 156: "T_DEC", - 157: "T_BOOLEAN_OR", - 158: "T_BOOLEAN_AND", - 159: "T_LOGICAL_OR", - 160: "T_LOGICAL_AND", - 161: "T_LOGICAL_XOR", - 162: "T_SL", - 163: "T_SR", - 164: "T_IS_IDENTICAL", - 165: "T_IS_NOT_IDENTICAL", - 166: "T_IS_EQUAL", - 167: "T_IS_NOT_EQUAL", - 168: "T_IS_SMALLER_OR_EQUAL", - 169: "T_IS_GREATER_OR_EQUAL", - 170: "T_INSTANCEOF", - 171: "T_INT_CAST", - 172: "T_DOUBLE_CAST", - 173: "T_STRING_CAST", - 174: "T_ARRAY_CAST", - 175: "T_OBJECT_CAST", - 176: "T_BOOL_CAST", - 177: "T_UNSET_CAST", - 178: "T_EXIT", - 179: "T_PRINT", - 180: "T_YIELD", - 181: "T_YIELD_FROM", - 182: "T_FUNCTION", - 183: "T_DOUBLE_ARROW", - 184: "T_DOUBLE_COLON", - 185: "T_ARRAY", - 186: "T_CALLABLE", - 187: "T_CLASS", - 188: "T_ABSTRACT", - 189: "T_TRAIT", - 190: "T_FINAL", - 191: "T_EXTENDS", - 192: "T_INTERFACE", - 193: "T_IMPLEMENTS", - 194: "T_VAR", - 195: "T_PUBLIC", - 196: "T_PROTECTED", - 197: "T_PRIVATE", - 198: "T_CONST", - 199: "T_NEW", - 200: "T_INSTEADOF", - 201: "T_ELSEIF", - 202: "T_ELSE", - 203: "T_ENDSWITCH", - 204: "T_CASE", - 205: "T_DEFAULT", - 206: "T_ENDFOR", - 207: "T_ENDFOREACH", - 208: "T_ENDWHILE", - 209: "T_CONSTANT_ENCAPSED_STRING", - 210: "T_LNUMBER", - 211: "T_DNUMBER", - 212: "T_LINE", - 213: "T_FILE", - 214: "T_DIR", - 215: "T_TRAIT_C", - 216: "T_METHOD_C", - 217: "T_FUNC_C", - 218: "T_NS_C", - 219: "T_START_HEREDOC", - 220: "T_END_HEREDOC", - 221: "T_CLASS_C", - 222: "T_VARIABLE", - 223: "T_OPEN_TAG", - 224: "T_OPEN_TAG_WITH_ECHO", - 225: "T_CLOSE_TAG", - 226: "T_WHITESPACE", - 227: "T_COMMENT", - 228: "T_DOC_COMMENT", - 229: "T_ELLIPSIS", - 230: "T_COALESCE", - 231: "T_POW", - 232: "T_POW_EQUAL", - 233: "T_SPACESHIP" - }, - names: { - T_HALT_COMPILER: 101, - T_USE: 102, - T_ENCAPSED_AND_WHITESPACE: 103, - T_OBJECT_OPERATOR: 104, - T_STRING: 105, - T_DOLLAR_OPEN_CURLY_BRACES: 106, - T_STRING_VARNAME: 107, - T_CURLY_OPEN: 108, - T_NUM_STRING: 109, - T_ISSET: 110, - T_EMPTY: 111, - T_INCLUDE: 112, - T_INCLUDE_ONCE: 113, - T_EVAL: 114, - T_REQUIRE: 115, - T_REQUIRE_ONCE: 116, - T_NAMESPACE: 117, - T_NS_SEPARATOR: 118, - T_AS: 119, - T_IF: 120, - T_ENDIF: 121, - T_WHILE: 122, - T_DO: 123, - T_FOR: 124, - T_SWITCH: 125, - T_BREAK: 126, - T_CONTINUE: 127, - T_RETURN: 128, - T_GLOBAL: 129, - T_STATIC: 130, - T_ECHO: 131, - T_INLINE_HTML: 132, - T_UNSET: 133, - T_FOREACH: 134, - T_DECLARE: 135, - T_TRY: 136, - T_THROW: 137, - T_GOTO: 138, - T_FINALLY: 139, - T_CATCH: 140, - T_ENDDECLARE: 141, - T_LIST: 142, - T_CLONE: 143, - T_PLUS_EQUAL: 144, - T_MINUS_EQUAL: 145, - T_MUL_EQUAL: 146, - T_DIV_EQUAL: 147, - T_CONCAT_EQUAL: 148, - T_MOD_EQUAL: 149, - T_AND_EQUAL: 150, - T_OR_EQUAL: 151, - T_XOR_EQUAL: 152, - T_SL_EQUAL: 153, - T_SR_EQUAL: 154, - T_INC: 155, - T_DEC: 156, - T_BOOLEAN_OR: 157, - T_BOOLEAN_AND: 158, - T_LOGICAL_OR: 159, - T_LOGICAL_AND: 160, - T_LOGICAL_XOR: 161, - T_SL: 162, - T_SR: 163, - T_IS_IDENTICAL: 164, - T_IS_NOT_IDENTICAL: 165, - T_IS_EQUAL: 166, - T_IS_NOT_EQUAL: 167, - T_IS_SMALLER_OR_EQUAL: 168, - T_IS_GREATER_OR_EQUAL: 169, - T_INSTANCEOF: 170, - T_INT_CAST: 171, - T_DOUBLE_CAST: 172, - T_STRING_CAST: 173, - T_ARRAY_CAST: 174, - T_OBJECT_CAST: 175, - T_BOOL_CAST: 176, - T_UNSET_CAST: 177, - T_EXIT: 178, - T_PRINT: 179, - T_YIELD: 180, - T_YIELD_FROM: 181, - T_FUNCTION: 182, - T_DOUBLE_ARROW: 183, - T_DOUBLE_COLON: 184, - T_ARRAY: 185, - T_CALLABLE: 186, - T_CLASS: 187, - T_ABSTRACT: 188, - T_TRAIT: 189, - T_FINAL: 190, - T_EXTENDS: 191, - T_INTERFACE: 192, - T_IMPLEMENTS: 193, - T_VAR: 194, - T_PUBLIC: 195, - T_PROTECTED: 196, - T_PRIVATE: 197, - T_CONST: 198, - T_NEW: 199, - T_INSTEADOF: 200, - T_ELSEIF: 201, - T_ELSE: 202, - T_ENDSWITCH: 203, - T_CASE: 204, - T_DEFAULT: 205, - T_ENDFOR: 206, - T_ENDFOREACH: 207, - T_ENDWHILE: 208, - T_CONSTANT_ENCAPSED_STRING: 209, - T_LNUMBER: 210, - T_DNUMBER: 211, - T_LINE: 212, - T_FILE: 213, - T_DIR: 214, - T_TRAIT_C: 215, - T_METHOD_C: 216, - T_FUNC_C: 217, - T_NS_C: 218, - T_START_HEREDOC: 219, - T_END_HEREDOC: 220, - T_CLASS_C: 221, - T_VARIABLE: 222, - T_OPEN_TAG: 223, - T_OPEN_TAG_WITH_ECHO: 224, - T_CLOSE_TAG: 225, - T_WHITESPACE: 226, - T_COMMENT: 227, - T_DOC_COMMENT: 228, - T_ELLIPSIS: 229, - T_COALESCE: 230, - T_POW: 231, - T_POW_EQUAL: 232, - T_SPACESHIP: 233 - } -}; diff --git a/styles/jsdoc-default.css b/styles/jsdoc-default.css new file mode 100644 index 000000000..f2bc6a9d7 --- /dev/null +++ b/styles/jsdoc-default.css @@ -0,0 +1,957 @@ +@font-face { + font-family: "Avenir Next W01"; + font-style: normal; + font-weight: 600; + src: url("https://fast.fonts.net/dv2/14/14c73713-e4df-4dba-933b-057feeac8dd1.woff2?d44f19a684109620e484167ba790e8180fd9e29df91d80ce3d096f014db863074e1ea706cf5ed4e1c042492e76df291ce1d24ec684d3d9da9684f55406b9f22bce02f0f30f556681593dafea074d7bd44e28a680d083ccfd44ed4f8a3087a20c56147c11f917ed1dbd85c4a18cf38da25e6ac78f008f472262304d50e7e0cb7541ef1642c676db6e4bde4924846f5daf486fbde9335e98f6a20f6664bc4525253d1d4fca42cf1c490483c8daf0237f6a0fd292563417ad80ca3e69321417747bdc6f0969f34b2a0401b5e2b9a4dfd5b06d9710850900c66b34870aef&projectId=f750d5c7-baa2-4767-afd7-45484f47fe17") format('woff2'); +} + +@font-face { + font-family: "Avenir Next W01"; + font-style: normal; + font-weight: 500; + src: url("https://fast.fonts.net/dv2/14/627fbb5a-3bae-4cd9-b617-2f923e29d55e.woff2?d44f19a684109620e484167ba790e8180fd9e29df91d80ce3d096f014db863074e1ea706cf5ed4e1c042492e76df291ce1d24ec684d3d9da9684f55406b9f22bce02f0f30f556681593dafea074d7bd44e28a680d083ccfd44ed4f8a3087a20c56147c11f917ed1dbd85c4a18cf38da25e6ac78f008f472262304d50e7e0cb7541ef1642c676db6e4bde4924846f5daf486fbde9335e98f6a20f6664bc4525253d1d4fca42cf1c490483c8daf0237f6a0fd292563417ad80ca3e69321417747bdc6f0969f34b2a0401b5e2b9a4dfd5b06d9710850900c66b34870aef&projectId=f750d5c7-baa2-4767-afd7-45484f47fe17") format('woff2'); +} + +@font-face { + font-family: "Avenir Next W01"; + font-style: normal; + font-weight: 400; + src: url("https://fast.fonts.net/dv2/14/2cd55546-ec00-4af9-aeca-4a3cd186da53.woff2?d44f19a684109620e484167ba790e8180fd9e29df91d80ce3d096f014db863074e1ea706cf5ed4e1c042492e76df291ce1d24ec684d3d9da9684f55406b9f22bce02f0f30f556681593dafea074d7bd44e28a680d083ccfd44ed4f8a3087a20c56147c11f917ed1dbd85c4a18cf38da25e6ac78f008f472262304d50e7e0cb7541ef1642c676db6e4bde4924846f5daf486fbde9335e98f6a20f6664bc4525253d1d4fca42cf1c490483c8daf0237f6a0fd292563417ad80ca3e69321417747bdc6f0969f34b2a0401b5e2b9a4dfd5b06d9710850900c66b34870aef&projectId=f750d5c7-baa2-4767-afd7-45484f47fe17") format('woff2'); +} + +@font-face { + font-family: 'bt_mono'; + font-style: normal; + font-weight: 400; + src: url('https://assets.braintreegateway.com/fonts/bt_mono_regular-webfont.eot'); + src: url('https://assets.braintreegateway.com/fonts/bt_mono_regular-webfont.woff2') format('woff2'), url('https://assets.braintreegateway.com/fonts/bt_mono_regular-webfont.woff') format('woff'), url('https://assets.braintreegateway.com/fonts/bt_mono_regular-webfont.ttf') format('truetype'), url('https://assets.braintreegateway.com/fonts/bt_mono_regular-webfont.svg#bt_mono_reqular-webfont') format('svg'); +} + +@font-face { + font-family: 'bt_mono'; + font-style: normal; + font-weight: 500; + src: url('https://assets.braintreegateway.com/fonts/bt_mono_medium-webfont.eot'); + src: url('https://assets.braintreegateway.com/fonts/bt_mono_medium-webfont.woff2') format('woff2'), url('https://assets.braintreegateway.com/fonts/bt_mono_medium-webfont.woff') format('woff'), url('https://assets.braintreegateway.com/fonts/bt_mono_medium-webfont.ttf') format('truetype'), url('https://assets.braintreegateway.com/fonts/bt_mono_medium-webfont.svg#bt_mono_medium-webfont') format('svg'); +} + +@font-face { + font-family: 'bt_mono'; + font-style: normal; + font-weight: 600; + src: url('https://assets.braintreegateway.com/fonts/bt_mono_bold-webfont.eot'); + src: url('https://assets.braintreegateway.com/fonts/bt_mono_bold-webfont.woff2') format('woff2'), url('https://assets.braintreegateway.com/fonts/bt_mono_bold-webfont.woff') format('woff'), url('https://assets.braintreegateway.com/fonts/bt_mono_bold-webfont.ttf') format('truetype'), url('https://assets.braintreegateway.com/fonts/bt_mono_bold-webfont.svg#bt_mono_bold-webfont') format('svg'); +} + +@font-face { + font-family: 'bt_mono'; + font-style: normal; + font-weight: 900; + src: url('https://assets.braintreegateway.com/fonts/bt_mono_heavy-webfont.eot'); + src: url('https://assets.braintreegateway.com/fonts/bt_mono_heavy-webfont.woff2') format('woff2'), url('https://assets.braintreegateway.com/fonts/bt_mono_heavy-webfont.woff') format('woff'), url('https://assets.braintreegateway.com/fonts/bt_mono_heavy-webfont.ttf') format('truetype'), url('https://assets.braintreegateway.com/fonts/bt_mono_heavy-webfont.svg#bt_mono_heavy-webfont') format('svg'); +} + +* { + box-sizing: border-box +} + +html, body { + height: 100%; + width: 100%; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + color: #3e3c42; + text-rendering: optimizeLegibility; + margin: 0; +} + +body { + color: #3e3c42; + background-color: #f3f3f3; + width: 100%; + font: 16px/1.875 "Avenir Next W01", "Avenir Next", "Helvetica Neue", Helvetica, sans-serif; + font-size: 16px; + line-height: 160%; +} + +a, a:active { + color: #0095dd; + text-decoration: none; +} + +a:hover { + text-decoration: underline +} + +p, ul, ol, blockquote { + margin-bottom: 1em; +} + +p { + max-width: 800px; +} + +h1, h2, h3, h4, h5, h6 { + color: #706d77; + font-weight: 500; + margin: 0; + line-height: 1; +} + +h1 { + color: #4b484f; + font-weight: 500; + font-size: 40px; + display: block; +} + +h1 span { + color: #999; + font-size: 32px; + display: block; + line-height: 1.5; +} + +h1.page-title { + border-bottom: 1px dashed #ccc; + margin-bottom: 20px; + padding-bottom: 30px; +} + +h2 { + font-size: 30px; + margin: 1.5em 0 0; +} + +h3 { + font-size: 20px; + margin: 1.5em 0 0; + text-transform: uppercase; +} + +h3.reference-title { + display: block; + font-weight: 400; + margin-top: 2em; + max-width: 200px; +} + +h3.reference-title small { + display: inline-block; + color: #0095dd; + margin-left: 5px; + font-weight: 500; +} + +h3.subsection-title { + border-bottom: 1px solid #ececec; + padding-bottom: 20px; + margin-top: 3em; + margin-bottom: 1em; +} + +h4 { + font-size: 16px; + margin: 1em 0 0; + font-weight: bold; +} + +h4.name { + font-size: 20px; + margin-top: 0; + font-weight: 500; +} + +h5 { + margin: 2em 0 0.5em 0; + font-size: 14px; + font-weight: 500; + text-transform: uppercase; +} + +.container-overview .subsection-title { + font-size: 14px; + text-transform: uppercase; + margin: 8px 0 15px 0; + font-weight: bold; + color: #4D4E53; + padding-top: 10px; +} + +h6 { + font-size: 100%; + letter-spacing: -0.01em; + margin: 6px 0 3px 0; + font-style: italic; + text-transform: uppercase; + font-weight: 500; +} + +tt, code, kbd, samp { + font-family: "Source Code Pro", monospace; + background: #f4f4f4; + padding: 1px 5px; + border-radius: 5px; +} + +.class-description { + margin-bottom: 1em; + margin-top: 1em; + padding: 10px 20px; + background-color: rgba(26, 159, 224, 0.1); +} + +.class-description:empty { + margin: 0 +} + +#main { + background-color: white; + float: right; + min-width: 360px; + width: calc(100% - 300px); + padding: 30px; + z-index: 100; +} + +header { + display: block; + max-width: 1400px; +} + +section { + display: block; + max-width: 1400px; + background-color: #fff; +} + +.variation { + display: none +} + +.signature-attributes { + font-size: 60%; + color: #aaa; + font-style: italic; + font-weight: lighter; +} + +.rule { + width: 100%; + margin-top: 20px; + display: block; + border-top: 1px solid #ccc; +} + +ul { + list-style-type: none; + padding-left: 0; +} + +ul li a { + font-weight: 500; +} + +ul ul { + padding-top: 5px; +} + +ul li ul { + padding-left: 20px; +} + +ul li ul li a { + font-weight: normal; +} + +nav { + float: left; + display: block; + width: 300px; + background: #f7f7f7; + overflow-x: visible; + overflow-y: auto; + height: 100%; + padding: 0px 30px 100px 30px; + height: 100%; + position: fixed; + transition: left 0.2s; + z-index: 998; + margin-top: 0px; + top: 43px; +} + +.navicon-button { + display: inline-block; + position: fixed; + bottom: 1.5em; + right: 1.5em; + z-index: 2; +} + +nav h3 { + font-size: 13px; + text-transform: uppercase; + letter-spacing: 1px; + font-weight: bold; + line-height: 24px; + margin: 40px 0 10px 0; + padding: 0; +} + +nav ul { + font-size: 100%; + line-height: 17px; + padding: 0; + margin: 0; + list-style-type: none; + border: none; + padding-left: 0; +} + +nav ul a { + font-size: 16px; +} + +nav ul a, nav ul a:active { + display: block; +} + +nav ul a:hover, nav ul a:active { + color: hsl(200, 100%, 43%); + text-decoration: none; +} + +nav>ul { + padding: 0 10px; +} + +nav>ul li:first-child { + padding-top: 0; +} + +nav ul li ul { + padding-left: 0; +} + +nav>ul>li { + border-bottom: 1px solid #e2e2e2; + padding: 10px 0 20px 0; +} + +nav>ul>li.active ul { + border-left: 3px solid #0095dd; + padding-left: 15px; +} + +nav>ul>li.active ul li.active a { + font-weight: bold; +} + +nav>ul>li.active a { + color: #0095dd; +} + +nav>ul>li>a { + color: #706d77; + padding: 20px 0; + font-size: 18px; +} + +nav ul ul { + margin-bottom: 10px padding-left: 0; +} + +nav ul ul a { + color: #5f5c63; +} + +nav ul ul a, nav ul ul a:active { + font-family: 'bt_mono', monospace; + font-size: 14px; + padding-left: 20px; + padding-top: 3px; + padding-bottom: 9px; +} + +nav h2 { + font-size: 12px; + margin: 0; + padding: 0; +} + +nav>h2>a { + color: hsl(202, 71%, 50%); + border-bottom: 1px solid hsl(202, 71%, 50%); + padding-bottom: 5px; +} + +nav>h2>a:hover { + font-weight: 500; + text-decoration: none; +} + +footer { + background-color: #fff; + color: hsl(0, 0%, 28%); + margin-left: 300px; + display: block; + font-style: italic; + font-size: 12px; + padding: 30px; + text-align: center; +} + +.ancestors { + color: #999; +} + +.ancestors a { + color: #999 !important; + text-decoration: none; +} + +.clear { + clear: both; +} + +.important { + font-weight: bold; + color: #950B02; +} + +.yes-def { + text-indent: -1000px; +} + +.type-signature { + color: #aaa; +} + +.name, .signature { + font-family: 'bt_mono', monospace; + word-wrap: break-word; +} + +.details { + margin-top: 14px; + font-size: 13px; + text-align: right; + background: #ffffff; + /* Old browsers */ + background: -moz-linear-gradient(left, #ffffff 0%, #fafafa 100%); + /* FF3.6-15 */ + background: -webkit-linear-gradient(left, #ffffff 0%, #fafafa 100%); + /* Chrome10-25,Safari5.1-6 */ + background: linear-gradient(to right, #ffffff 0%, #fafafa 100%); + /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */ + filter: progid: DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#fafafa', GradientType=1); + padding-right: 5px; +} + +.details dt { + display: inline-block; +} + +.details dd { + display: inline-block; + margin: 0; +} + +.details dd a { + font-style: italic; + font-weight: normal; + line-height: 1; +} + +.details ul { + margin: 0 +} + +.details ul { + list-style-type: none +} + +.details li {} + +.details pre.prettyprint { + margin: 0 +} + +.details .object-value { + padding-top: 0 +} + +.description { + margin-bottom: 1em; + margin-top: 1em; +} + +.code-caption { + font-style: italic; + margin: 0; + font-size: 16px; + color: #545454; +} + +.prettyprint { + font-size: 13px; + border: 1px solid #ddd; + border-radius: 3px; + overflow: auto; + background-color: #fbfbfb; +} + +.prettyprint.source { + width: inherit; +} + +.prettyprint code { + font-size: 100%; + line-height: 18px; + display: block; + margin: 0 30px; + background-color: #fbfbfb; + color: #4D4E53; +} + +.prettyprint>code { + padding: 30px 15px; +} + +.prettyprint .linenums code { + padding: 0 15px; +} + +.prettyprint .linenums li:first-of-type code { + padding-top: 15px; +} + +.prettyprint code span.line { + display: inline-block; +} + +.prettyprint.linenums { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.prettyprint.linenums ol { + padding-left: 0 +} + +.prettyprint.linenums li { + border-left: 3px #ddd solid +} + +.prettyprint.linenums li.selected, .prettyprint.linenums li.selected * { + background-color: lightyellow +} + +.prettyprint.linenums li * { + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; +} + +.readme .prettyprint { + max-width: 800px; +} + +.params, .props { + border-spacing: 0; + border: 1px solid #ddd; + border-radius: 3px; + width: 100%; + font-size: 14px; +} + +.params .name, .props .name, .name code { + color: #4D4E53; + font-family: 'bt_mono', monospace; + font-size: 100%; +} + +.params td, .params th, .props td, .props th { + margin: 0px; + text-align: left; + vertical-align: top; + padding: 10px; + display: table-cell; +} + +.params td { + border-top: 1px solid #eee; +} + +.params thead tr, .props thead tr { + background-color: #fff; + font-weight: bold; +} + +.params .params thead tr, .props .props thead tr { + background-color: #fff; + font-weight: bold; +} + +.params td.description>p:first-child, .props td.description>p:first-child { + margin-top: 0; + padding-top: 0; +} + +.params td.description>p:last-child, .props td.description>p:last-child { + margin-bottom: 0; + padding-bottom: 0; +} + +dl.param-type { + margin-top: 5px; +} + +.param-type dt, .param-type dd { + display: inline-block +} + +.param-type dd { + font-family: Consolas, Monaco, 'Andale Mono', monospace +} + +.disabled { + color: #454545 +} + + +/* tag source style */ + +.tag-deprecated { + padding-right: 5px; +} + +.tag-source { + border-bottom: 1px solid rgba(28, 160, 224, 0.35); +} + +.tag-source:first-child { + border-bottom: 1px solid rgba(28, 160, 224, 1); +} + + +/* navicon button */ + +.navicon-button { + position: relative; + transition: 0.25s; + cursor: pointer; + user-select: none; + opacity: .8; + background-color: white; + border-radius: 100%; + width: 50px; + height: 50px; + -webkit-box-shadow: 0px 2px 9px 0px rgba(0, 0, 0, 0.31); + -moz-box-shadow: 0px 2px 9px 0px rgba(0, 0, 0, 0.31); + box-shadow: 0px 2px 9px 0px rgba(0, 0, 0, 0.31); +} + +.navicon-button .navicon:before, .navicon-button .navicon:after { + transition: 0.25s; +} + +.navicon-button:hover { + transition: 0.5s; + opacity: 1; +} + +.navicon-button:hover .navicon:before, .navicon-button:hover .navicon:after { + transition: 0.25s; +} + +.navicon-button:hover .navicon:before { + top: .425rem; +} + +.navicon-button:hover .navicon:after { + top: -.425rem; +} + + +/* navicon */ + +.navicon { + position: relative; + width: 1.5em; + height: .195rem; + background: #000; + top: calc(50% - .09rem); + left: calc(50% - .75rem); + transition: 0.3s; + border-radius: 5px; +} + +.navicon:before, .navicon:after { + display: block; + content: ""; + height: .195rem; + width: 1.5rem; + background: #000; + position: absolute; + z-index: -1; + transition: 0.3s 0.25s; +} + +.navicon:before { + top: 0.425rem; + height: .195rem; + border-radius: 5px; +} + +.navicon:after { + top: -0.425rem; + border-radius: 5px; +} + + +/* open */ + +.nav-trigger:checked+label:not(.steps) .navicon:before, .nav-trigger:checked+label:not(.steps) .navicon:after { + top: 0 !important; +} + +.nav-trigger:checked+label .navicon:before, .nav-trigger:checked+label .navicon:after { + transition: 0.5s; +} + + +/* Minus */ + +.nav-trigger:checked+label { + transform: scale(0.75); +} + + +/* × and + */ + +.nav-trigger:checked+label.plus .navicon, .nav-trigger:checked+label.x .navicon { + background: transparent; +} + +.nav-trigger:checked+label.plus .navicon:before, .nav-trigger:checked+label.x .navicon:before { + transform: rotate(-45deg); + background: #000; +} + +.nav-trigger:checked+label.plus .navicon:after, .nav-trigger:checked+label.x .navicon:after { + transform: rotate(45deg); + background: #000; +} + +.nav-trigger:checked+label.plus { + transform: scale(0.75) rotate(45deg); +} + +.nav-trigger:checked~nav { + left: 0 !important; +} + +.nav-trigger:checked~.overlay { + display: block; +} + +.nav-trigger { + position: fixed; + top: 0; + clip: rect(0, 0, 0, 0); +} + +.overlay { + display: none; + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + width: 100%; + height: 100%; + background: hsla(0, 0%, 0%, 0.5); + z-index: 1; +} + +table { + border-collapse: separate; + ; + display: block; + overflow-x: auto; + /*table-layout:fixed;*/ +} + +table tbody td { + border-top: 1px solid hsl(207, 10%, 86%); + border-right: 1px solid #eee; + padding: 5px; + /*word-wrap: break-word;*/ +} + +td table.params, td table.props { + border: 0; +} + +@media only screen and (min-width: 320px) and (max-width: 680px) { + body { + overflow-x: hidden; + } + #main { + padding: 30px 30px; + width: 100%; + min-width: 360px; + } + nav { + background: #FFF; + width: 300px; + height: 100%; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: -300px; + z-index: 3; + padding: 0 10px; + transition: left 0.2s; + margin-top: 0; + } + .navicon-button { + display: inline-block; + position: fixed; + bottom: 1.5em; + right: 20px; + z-index: 1000; + } + .top-nav-wrapper { + display: none; + } + #main h1.page-title { + margin: 0.5em 0; + } + footer { + margin-left: 0; + margin-bottom: 30px; + } +} + +.top-nav-wrapper { + background-color: #ececec; + position: fixed; + top: 0px; + left: 0px; + padding: 10px 10px 0 10px; + z-index: 999; + width: 300px; +} + +.top-nav-wrapper ul { + margin: 0; +} + +.top-nav-wrapper ul li { + display: inline-block; + padding: 0 10px; + vertical-align: top; +} + +.top-nav-wrapper ul li.active { + border-bottom: 2px solid rgba(28, 160, 224, 1); +} + +.search-wrapper { + display: inline-block; + position: relative; +} + +.search-wrapper svg { + position: absolute; + left: 0px; +} + +input.search-input { + background: transparent; + box-shadow: 0; + border: 0; + border-bottom: 1px solid #c7c7c7; + padding: 7px 15px 12px 35px; + margin: 0 auto; +} + + +/* Smooth outline with box-shadow: */ + +input.search-input:focus { + border-bottom: 2px solid rgba(28, 160, 224, 1); + outline: none; +} + + +/* Hightlight JS Paradiso Light Theme */ + +.hljs-comment, .hljs-quote { + color: #776e71 +} + +.hljs-variable, .hljs-template-variable, .hljs-tag, .hljs-name, .hljs-selector-id, .hljs-selector-class, .hljs-regexp, .hljs-link, .hljs-meta { + color: #ef6155 +} + +.hljs-number, .hljs-built_in, .hljs-builtin-name, .hljs-literal, .hljs-type, .hljs-params, .hljs-deletion { + color: #f99b15 +} + +.hljs-title, .hljs-section, .hljs-attribute { + color: #fec418 +} + +.hljs-string, .hljs-symbol, .hljs-bullet, .hljs-addition { + color: #48b685 +} + +.hljs-keyword, .hljs-selector-tag { + color: #815ba4 +} + +.hljs { + display: block; + overflow-x: auto; + background: #e7e9db; + color: #4f424c; + padding: 0.5em +} + +.hljs-emphasis { + font-style: italic +} + +.hljs-strong { + font-weight: bold +} + +.link-icon { + opacity: 0; + position: absolute; + margin-left: -25px; + padding-right: 5px; + padding-top: 2px; +} + +.example-container .link-icon { + margin-top: -6px; +} + +.example-container:hover .link-icon, +.name-container:hover .link-icon { + opacity: .5; +} + +.name-container { + display: flex; + padding-top: 1em; +} diff --git a/styles/prettify-jsdoc.css b/styles/prettify-jsdoc.css new file mode 100644 index 000000000..834a866d4 --- /dev/null +++ b/styles/prettify-jsdoc.css @@ -0,0 +1,111 @@ +/* JSDoc prettify.js theme */ + +/* plain text */ +.pln { + color: #000000; + font-weight: normal; + font-style: normal; +} + +/* string content */ +.str { + color: hsl(104, 100%, 24%); + font-weight: normal; + font-style: normal; +} + +/* a keyword */ +.kwd { + color: #000000; + font-weight: bold; + font-style: normal; +} + +/* a comment */ +.com { + font-weight: normal; + font-style: italic; +} + +/* a type name */ +.typ { + color: #000000; + font-weight: normal; + font-style: normal; +} + +/* a literal value */ +.lit { + color: #006400; + font-weight: normal; + font-style: normal; +} + +/* punctuation */ +.pun { + color: #000000; + font-weight: bold; + font-style: normal; +} + +/* lisp open bracket */ +.opn { + color: #000000; + font-weight: bold; + font-style: normal; +} + +/* lisp close bracket */ +.clo { + color: #000000; + font-weight: bold; + font-style: normal; +} + +/* a markup tag name */ +.tag { + color: #006400; + font-weight: normal; + font-style: normal; +} + +/* a markup attribute name */ +.atn { + color: #006400; + font-weight: normal; + font-style: normal; +} + +/* a markup attribute value */ +.atv { + color: #006400; + font-weight: normal; + font-style: normal; +} + +/* a declaration */ +.dec { + color: #000000; + font-weight: bold; + font-style: normal; +} + +/* a variable name */ +.var { + color: #000000; + font-weight: normal; + font-style: normal; +} + +/* a function name */ +.fun { + color: #000000; + font-weight: bold; + font-style: normal; +} + +/* Specify class=linenums on a pre to get line numbering */ +ol.linenums { + margin-top: 0; + margin-bottom: 0; +} diff --git a/styles/prettify-tomorrow.css b/styles/prettify-tomorrow.css new file mode 100644 index 000000000..eaf125103 --- /dev/null +++ b/styles/prettify-tomorrow.css @@ -0,0 +1,138 @@ +/* Tomorrow Theme */ +/* Original theme - https://github.com/chriskempson/tomorrow-theme */ +/* Pretty printing styles. Used with prettify.js. */ +/* SPAN elements with the classes below are added by prettyprint. */ +/* plain text */ +.pln { + color: #4d4d4c; } + +@media screen { + /* string content */ + .str { + color: hsl(104, 100%, 24%); } + + /* a keyword */ + .kwd { + color: hsl(240, 100%, 50%); } + + /* a comment */ + .com { + color: hsl(0, 0%, 60%); } + + /* a type name */ + .typ { + color: hsl(240, 100%, 32%); } + + /* a literal value */ + .lit { + color: hsl(240, 100%, 40%); } + + /* punctuation */ + .pun { + color: #000000; } + + /* lisp open bracket */ + .opn { + color: #000000; } + + /* lisp close bracket */ + .clo { + color: #000000; } + + /* a markup tag name */ + .tag { + color: #c82829; } + + /* a markup attribute name */ + .atn { + color: #f5871f; } + + /* a markup attribute value */ + .atv { + color: #3e999f; } + + /* a declaration */ + .dec { + color: #f5871f; } + + /* a variable name */ + .var { + color: #c82829; } + + /* a function name */ + .fun { + color: #4271ae; } } +/* Use higher contrast and text-weight for printable form. */ +@media print, projection { + .str { + color: #060; } + + .kwd { + color: #006; + font-weight: bold; } + + .com { + color: #600; + font-style: italic; } + + .typ { + color: #404; + font-weight: bold; } + + .lit { + color: #044; } + + .pun, .opn, .clo { + color: #440; } + + .tag { + color: #006; + font-weight: bold; } + + .atn { + color: #404; } + + .atv { + color: #060; } } +/* Style */ +/* +pre.prettyprint { + background: white; + font-family: Consolas, Monaco, 'Andale Mono', monospace; + font-size: 12px; + line-height: 1.5; + border: 1px solid #ccc; + padding: 10px; } +*/ + +/* Get LI elements to show when they are in the main article */ +article ul li { + list-style-type: circle; + margin-left: 25px; +} + +/* Specify class=linenums on a pre to get line numbering */ +ol.linenums { + margin-top: 0; + margin-bottom: 0; } + +/* IE indents via margin-left */ +li.L0, +li.L1, +li.L2, +li.L3, +li.L4, +li.L5, +li.L6, +li.L7, +li.L8, +li.L9 { + /* */ } + +/* Alternate shading for lines */ +li.L1, +li.L3, +li.L5, +li.L7, +li.L9 { + /* */ } diff --git a/test/location.test.js b/test/location.test.js deleted file mode 100644 index 0b25597e4..000000000 --- a/test/location.test.js +++ /dev/null @@ -1,140 +0,0 @@ -var parser = require("./main"); - -describe("Test offsets", function() { - // init a new parser instance - var test = parser.create({ - ast: { - withPositions: true, - withSource: true - }, - parser: { - extractDoc: true - // debug: true - }, - lexer: { - // debug: true - } - }); - - var lines = ["// a comment", 'echo "string";', "$a = true;"]; - var text = lines.join("\r\n"); - var ast = test.parseEval(text); - - describe("to program node", function() { - it("test line", function() { - expect(ast.loc.start.line).toBe(1); - expect(ast.loc.end.line).toBe(lines.length); - }); - it("test column", function() { - expect(ast.loc.start.column).toBe(0); - expect(ast.loc.end.column).toBe(lines[lines.length - 1].length); - }); - it("test offsets", function() { - expect(ast.loc.start.offset).toBe(0); - expect(ast.loc.end.offset).toBe(text.length); - }); - }); - - describe("to comment node", function() { - it("test line", function() { - expect(ast.comments[0].loc.start.line).toBe(1); - expect(ast.comments[0].loc.end.line).toBe(2); - }); - it("test column", function() { - expect(ast.comments[0].loc.start.column).toBe(0); - expect(ast.comments[0].loc.end.column).toBe(0); - }); - it("test offsets", function() { - expect(ast.comments[0].loc.start.offset).toBe(0); - expect(ast.comments[0].loc.end.offset).toBe(lines[0].length + 2); - expect(ast.comments[0].loc.source).toBe(lines[0] + '\r\n'); - }); - }); - - describe("on echo node", function() { - it("test line", function() { - expect(ast.children[0].loc.start.line).toBe(2); - expect(ast.children[0].loc.end.line).toBe(2); - }); - it("test column", function() { - expect(ast.children[0].loc.start.column).toBe(0); - expect(ast.children[0].loc.end.column).toBe(14); - }); - it("test offsets", function() { - expect(ast.children[0].loc.start.offset).toBe(14); - expect(ast.children[0].loc.end.offset).toBe(28); - expect(ast.children[0].loc.source).toBe(lines[1]); - }); - }); - - describe("on text node", function() { - const arg = ast.children[0].arguments[0]; - it("test line", function() { - expect(arg.loc.start.line).toBe(2); - expect(arg.loc.end.line).toBe(2); - }); - it("test column", function() { - expect(arg.loc.start.column).toBe(5); - expect(arg.loc.end.column).toBe(13); - }); - it("test offsets", function() { - expect(arg.loc.source).toBe('"string"'); - }); - }); - - describe("on assign node", function() { - it("test line", function() { - expect(ast.children[1].loc.start.line).toBe(3); - expect(ast.children[1].loc.end.line).toBe(3); - }); - it("test column", function() { - expect(ast.children[1].loc.start.column).toBe(0); - // ignored ';' because it was eaten by expr and assign - // was retrieved by expr_item without it - expect(ast.children[1].loc.end.column).toBe(10); - }); - it("test offsets", function() { - expect(ast.children[1].loc.source).toBe(lines[2].substring(0, 10)); - }); - }); - - describe("on variable node", function() { - const node = ast.children[1].left; - it("test line", function() { - expect(node.loc.start.line).toBe(3); - expect(node.loc.end.line).toBe(3); - }); - it("test column", function() { - expect(node.loc.start.column).toBe(0); - expect(node.loc.end.column).toBe(2); - }); - it("test offsets", function() { - expect(node.loc.source).toBe("$a"); - }); - }); - - describe("on boolean node", function() { - const node = ast.children[1].right; - it("test line", function() { - expect(node.loc.start.line).toBe(3); - expect(node.loc.end.line).toBe(3); - }); - it("test column", function() { - expect(node.loc.start.column).toBe(5); - expect(node.loc.end.column).toBe(9); - }); - it("test offsets", function() { - expect(node.loc.source).toBe("true"); - }); - }); - - describe("test block statements", function() { - it("test if", function() { - const ast = test.parseEval('if(true) {}\n//foo\necho $bar;'); - expect(ast.children[0].loc.start.line).toBe(1); - expect(ast.children[0].loc.end.line).toBe(1); - expect(ast.children[1].loc.start.line).toBe(3); - expect(ast.children[1].loc.end.line).toBe(3); - }); - }) -}); diff --git a/test/main.js b/test/main.js deleted file mode 100644 index 79f165adc..000000000 --- a/test/main.js +++ /dev/null @@ -1,11 +0,0 @@ -/*! - * Defines a list of helpers for tests - * Copyright (C) 2017 Glayzzle (BSD3 License) - * @authors https://github.com/glayzzle/php-parser/graphs/contributors - * @url http://glayzzle.com - */ - -var parser = require("../src/index"); -// @todo : move here the debug code -// @todo : add an automated token check (with php7) -module.exports = parser; diff --git a/test/perf.test.js b/test/perf.test.js deleted file mode 100644 index 66945efa0..000000000 --- a/test/perf.test.js +++ /dev/null @@ -1,117 +0,0 @@ -var parser = require("./main"); - -describe("Performance tests", function() { - var code = ` - 1000) { - speed = speed / 1000; - if (speed > 1000) { - speed = speed / 1000; - speed = Math.round(speed * 100) / 100 + "M"; - } else { - speed = Math.round(speed * 100) / 100 + "K"; - } - } - console.log(" + Tokens speed => " + speed + "/sec"); - - speed = 1000 / duration * (code.length * iter); - // speed.should.be.greaterThan(10e5 * 2 * 0.8); - - if (speed > 1024) { - speed = speed / 1024; - if (speed > 1024) { - speed = speed / 1024; - speed = Math.round(speed * 100) / 100 + "M"; - } else { - speed = Math.round(speed * 100) / 100 + "K"; - } - } - console.log(" + Reading speed => " + speed + "/sec"); - }); - - it("parser", function() { - var reader = new parser(); - var nodeSize = 0; - var countNode = function(node) { - nodeSize++; - for (var k in node) { - if (node[k]) { - if (node[k].kind) { - countNode(node[k]); - } else if (Array.isArray(node[k])) { - for (var i = 0; i < node[k].length; i++) { - if (node[k][i] && node[k][i].kind) { - countNode(node[k][i]); - } - } - } - } - } - }; - countNode(reader.parseCode(code)); - - var hrTime = process.hrtime(); - var iter = 100; - var start = hrTime[0] * 1000000 + hrTime[1] / 1000; - for (var i = 0; i < iter; i++) { - reader.parseCode(code); - } - hrTime = process.hrtime(); - var end = hrTime[0] * 1000000 + hrTime[1] / 1000; - var duration = (end - start) / 1000; // in MS - var speed = 1000 / duration * (nodeSize * iter); - // speed.should.be.greaterThan(10e4); - - if (speed > 1000) { - speed = speed / 1000; - if (speed > 1000) { - speed = speed / 1000; - speed = Math.round(speed * 100) / 100 + "M"; - } else { - speed = Math.round(speed * 100) / 100 + "K"; - } - } - console.log(" + Nodes speed => " + speed + "/sec"); - - speed = 1000 / duration * (code.length * iter); - // speed.should.be.greaterThan(10e5 * 1 * 0.8); - - if (speed > 1024) { - speed = speed / 1024; - if (speed > 1024) { - speed = speed / 1024; - speed = Math.round(speed * 100) / 100 + "M"; - } else { - speed = Math.round(speed * 100) / 100 + "K"; - } - } - console.log(" + Overall speed => " + speed + "/sec"); - }); -}); diff --git a/test/precedence.test.js b/test/precedence.test.js deleted file mode 100644 index 287eb437f..000000000 --- a/test/precedence.test.js +++ /dev/null @@ -1,121 +0,0 @@ -var parser = require("./main"); - -/** - * Check precedence by using parenthesis on node B - */ -var checkPrecedence = function(a, b) { - if (!a || !b) - return false; - if (b.kind === "parenthesis") { - // force the precendence with parenthesis - // ignore them in test - b = b.inner; - } - for (var k in b) { - if (b.hasOwnProperty(k)) { - if (!a.hasOwnProperty(k)) - return false; - if (typeof b[k] === "object") { - checkPrecedence(a[k], b[k]); - } else { - expect(a[k]).toEqual(b[k]); - } - } - } - return true; -}; - -var shouldBeSame = function(a, b) { - var ast = parser.parseEval([ - a + ";", - b + ";" - ].join("\n")); - expect(checkPrecedence(ast.children[0], ast.children[1])).toBeTruthy(); -}; - -// START TESTS HERE -describe("Test precedence", function() { - it("test *", function() { - shouldBeSame("5 * 3 - 2", "(5 * 3) - 2"); - shouldBeSame("2 - 5 * 3", "2 - (5 * 3)"); - }); - it("test /", function() { - shouldBeSame("5 / 3 + 2", "(5 / 3) + 2"); - shouldBeSame("5 + 3 / 2", "5 + (3 / 2)"); - }); - it("test %", function() { - shouldBeSame("5 % 3 . 2", "(5 % 3) . 2"); - }); - it("test instanceof", function() { - shouldBeSame("3 instanceof 2 * 5", "(3 instanceof 2) * 5"); - }); - it("test <<", function() { - shouldBeSame("1 + 3 << 5", "(1 + 3) << 5"); - }); - it("test ==", function() { - shouldBeSame("1 + 5 == 3", "(1 + 5 ) == 3"); - }); - it("test &", function() { - shouldBeSame("1 == 2 & 3", "(1 == 2) & 3"); - }); - it("test ^", function() { - shouldBeSame("1 & 2 ^ 3", "(1 & 2) ^ 3"); - }); - it("test |", function() { - shouldBeSame("1 ^ 2 | 3", "(1 ^ 2) | 3"); - }); - it("test &&", function() { - shouldBeSame("1 | 2 && 3", "(1 | 2) && 3"); - }); - it("test ||", function() { - shouldBeSame("1 && 2 || 3", "(1 && 2) || 3"); - }); - it("test ??", function() { - shouldBeSame("1 || 2 ?? 3", "(1 || 2) ?? 3"); - }); - it("test ?:", function() { - shouldBeSame("1 ?? 2 ? 3 : 5", "(1 ?? 2) ? 3 : 5"); - shouldBeSame("1 and 2 ? 3 : 5", "1 and (2 ? 3 : 5)"); - }); - it("test =", function() { - shouldBeSame("5 + $a = 1", "5 + ($a = 1)"); - shouldBeSame("5 XOR $a += 1", "5 XOR ($a += 1)"); - }); - it("test OR", function() { - shouldBeSame("5 XOR 4 OR 3", "(5 XOR 4) OR 3"); - shouldBeSame("5 OR 4 XOR 3", "5 OR (4 XOR 3)"); - }); - it("test XOR", function() { - shouldBeSame("5 AND 4 XOR 3", "(5 AND 4) XOR 3"); - shouldBeSame("5 XOR 4 AND 3", "5 XOR (4 AND 3)"); - }); - it("test AND", function() { - shouldBeSame("5 + 4 AND 3", "(5 + 4) AND 3"); - shouldBeSame("5 AND 4 + 3", "5 AND (4 + 3)"); - }); - it("test unary : !", function() { - shouldBeSame("!4 instanceof 3", "(!4) instanceof 3"); - shouldBeSame("!4 + 5 instanceof 3", "(!4) + (5 instanceof 3)"); - shouldBeSame("6 + !4 + 5", "6 + (!4) + 5"); - shouldBeSame("if($a && !$b) {}", "if($a && (!$b)) {}"); - }); - it("test concat", function() { - shouldBeSame('"a"."b"."c"."d"', '((("a"."b")."c")."d")'); - }); - it("test retif", function() { - shouldBeSame("$a ? 1 : $b ? 2 : $c ? 3 : 4", "(($a ? 1 : $b) ? 2 : $c) ? 3 : 4"); - }); - it("test + / *", function() { - shouldBeSame("1 + 2 * 3", "1 + (2 * 3)"); - }); - // https://github.com/glayzzle/php-parser/issues/81 - it("test assign with and", function() { - shouldBeSame("$a and $b = $c and $d", "($a and ($b = $c)) and $d"); - }); - it("test assign list", function() { - shouldBeSame("$a = $b = $c", "($a = ($b = $c))"); - }); - it("test assign with &&", function() { - shouldBeSame("$a && $b = $c && $d", "$a && ($b = ($c && $d))"); - }); -}); diff --git a/test/snapshot/__snapshots__/acid.test.js.snap b/test/snapshot/__snapshots__/acid.test.js.snap deleted file mode 100644 index 72caef76f..000000000 --- a/test/snapshot/__snapshots__/acid.test.js.snap +++ /dev/null @@ -1,7429 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Acid level 1 1`] = ` -Program { - "children": Array [ - Inline { - "kind": "inline", - "loc": Location { - "end": Position { - "column": 0, - "line": 2, - "offset": 15, - }, - "source": "#!/usr/bin/php -", - "start": Position { - "column": 0, - "line": 1, - "offset": 0, - }, - }, - "raw": "#!/usr/bin/php -", - "value": "#!/usr/bin/php -", - }, - Echo { - "arguments": Array [ - Call { - "arguments": Array [], - "kind": "call", - "loc": Location { - "end": Position { - "column": 17, - "line": 2, - "offset": 32, - }, - "source": "()", - "start": Position { - "column": 15, - "line": 2, - "offset": 30, - }, - }, - "what": Identifier { - "kind": "identifier", - "loc": Location { - "end": Position { - "column": 15, - "line": 2, - "offset": 30, - }, - "source": "php_version", - "start": Position { - "column": 4, - "line": 2, - "offset": 19, - }, - }, - "name": "php_version", - "resolution": "uqn", - }, - }, - ], - "kind": "echo", - "loc": Location { - "end": Position { - "column": 18, - "line": 2, - "offset": 33, - }, - "source": " 'achoum', - 'bashful' => 'tadah' - ]", - "start": Position { - "column": 14, - "line": 32, - "offset": 577, - }, - }, - "name": "dwarf", - "value": Array { - "items": Array [ - Entry { - "key": String { - "isDoubleQuote": false, - "kind": "string", - "loc": Location { - "end": Position { - "column": 14, - "line": 33, - "offset": 602, - }, - "source": "'sneezy'", - "start": Position { - "column": 6, - "line": 33, - "offset": 594, - }, - }, - "raw": "'sneezy'", - "unicode": false, - "value": "sneezy", - }, - "kind": "entry", - "loc": Location { - "end": Position { - "column": 26, - "line": 33, - "offset": 614, - }, - "source": "'sneezy' => 'achoum'", - "start": Position { - "column": 6, - "line": 33, - "offset": 594, - }, - }, - "value": String { - "isDoubleQuote": false, - "kind": "string", - "loc": Location { - "end": Position { - "column": 26, - "line": 33, - "offset": 614, - }, - "source": "'achoum'", - "start": Position { - "column": 18, - "line": 33, - "offset": 606, - }, - }, - "raw": "'achoum'", - "unicode": false, - "value": "achoum", - }, - }, - Entry { - "key": String { - "isDoubleQuote": false, - "kind": "string", - "loc": Location { - "end": Position { - "column": 15, - "line": 34, - "offset": 631, - }, - "source": "'bashful'", - "start": Position { - "column": 6, - "line": 34, - "offset": 622, - }, - }, - "raw": "'bashful'", - "unicode": false, - "value": "bashful", - }, - "kind": "entry", - "loc": Location { - "end": Position { - "column": 26, - "line": 34, - "offset": 642, - }, - "source": "'bashful' => 'tadah'", - "start": Position { - "column": 6, - "line": 34, - "offset": 622, - }, - }, - "value": String { - "isDoubleQuote": false, - "kind": "string", - "loc": Location { - "end": Position { - "column": 26, - "line": 34, - "offset": 642, - }, - "source": "'tadah'", - "start": Position { - "column": 19, - "line": 34, - "offset": 635, - }, - }, - "raw": "'tadah'", - "unicode": false, - "value": "tadah", - }, - }, - ], - "kind": "array", - "loc": Location { - "end": Position { - "column": 5, - "line": 35, - "offset": 648, - }, - "source": "[ - 'sneezy' => 'achoum', - 'bashful' => 'tadah' - ]", - "start": Position { - "column": 23, - "line": 32, - "offset": 586, - }, - }, - "shortForm": true, - }, - "visibility": "protected", - }, - Method { - "arguments": Array [], - "body": Block { - "children": Array [ - Foreach { - "body": Block { - "children": Array [ - Echo { - "arguments": Array [ - Encapsed { - "kind": "encapsed", - "loc": Location { - "end": Position { - "column": 40, - "line": 42, - "offset": 855, - }, - "source": "Hey ho $name, $greeting !\\"", - "start": Position { - "column": 14, - "line": 42, - "offset": 829, - }, - }, - "raw": "\\"Hey ho $name, $greeting !\\"", - "type": "string", - "value": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "loc": Location { - "end": Position { - "column": 21, - "line": 42, - "offset": 836, - }, - "source": "Hey ho ", - "start": Position { - "column": 14, - "line": 42, - "offset": 829, - }, - }, - "raw": "Hey ho ", - "unicode": false, - "value": "Hey ho ", - }, - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 26, - "line": 42, - "offset": 841, - }, - "source": "$name", - "start": Position { - "column": 21, - "line": 42, - "offset": 836, - }, - }, - "name": "name", - }, - String { - "isDoubleQuote": false, - "kind": "string", - "loc": Location { - "end": Position { - "column": 28, - "line": 42, - "offset": 843, - }, - "source": ", ", - "start": Position { - "column": 26, - "line": 42, - "offset": 841, - }, - }, - "raw": ", ", - "unicode": false, - "value": ", ", - }, - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 37, - "line": 42, - "offset": 852, - }, - "source": "$greeting", - "start": Position { - "column": 28, - "line": 42, - "offset": 843, - }, - }, - "name": "greeting", - }, - String { - "isDoubleQuote": false, - "kind": "string", - "loc": Location { - "end": Position { - "column": 39, - "line": 42, - "offset": 854, - }, - "source": " !", - "start": Position { - "column": 37, - "line": 42, - "offset": 852, - }, - }, - "raw": " !", - "unicode": false, - "value": " !", - }, - ], - }, - ], - "kind": "echo", - "loc": Location { - "end": Position { - "column": 41, - "line": 42, - "offset": 856, - }, - "source": "echo \\"Hey ho $name, $greeting !\\";", - "start": Position { - "column": 8, - "line": 42, - "offset": 823, - }, - }, - "shortForm": false, - }, - Continue { - "kind": "continue", - "level": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 21, - "line": 43, - "offset": 878, - }, - "source": "$foo", - "start": Position { - "column": 17, - "line": 43, - "offset": 874, - }, - }, - "name": "foo", - }, - "loc": Location { - "end": Position { - "column": 22, - "line": 43, - "offset": 879, - }, - "source": "continue $foo;", - "start": Position { - "column": 8, - "line": 43, - "offset": 865, - }, - }, - }, - ], - "kind": "block", - "loc": Location { - "end": Position { - "column": 7, - "line": 44, - "offset": 887, - }, - "source": "{ - echo \\"Hey ho $name, $greeting !\\"; - continue $foo; - }", - "start": Position { - "column": 50, - "line": 41, - "offset": 813, - }, - }, - }, - "key": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 35, - "line": 41, - "offset": 798, - }, - "source": "$name", - "start": Position { - "column": 30, - "line": 41, - "offset": 793, - }, - }, - "name": "name", - }, - "kind": "foreach", - "leadingComments": Array [ - CommentLine { - "kind": "commentline", - "loc": Location { - "end": Position { - "column": 0, - "line": 41, - "offset": 763, - }, - "source": "// do not wanna do -", - "start": Position { - "column": 6, - "line": 40, - "offset": 744, - }, - }, - "value": "// do not wanna do -", - }, - ], - "loc": Location { - "end": Position { - "column": 7, - "line": 44, - "offset": 887, - }, - "source": "($this->dwarf as $name => $greeting) { - echo \\"Hey ho $name, $greeting !\\"; - continue $foo; - }", - "start": Position { - "column": 13, - "line": 41, - "offset": 776, - }, - }, - "shortForm": false, - "source": PropertyLookup { - "kind": "propertylookup", - "loc": Location { - "end": Position { - "column": 26, - "line": 41, - "offset": 789, - }, - "source": "->dwarf", - "start": Position { - "column": 19, - "line": 41, - "offset": 782, - }, - }, - "offset": ConstRef { - "kind": "constref", - "loc": Location { - "end": Position { - "column": 26, - "line": 41, - "offset": 789, - }, - "source": "dwarf", - "start": Position { - "column": 21, - "line": 41, - "offset": 784, - }, - }, - "name": "dwarf", - }, - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 19, - "line": 41, - "offset": 782, - }, - "source": "$this", - "start": Position { - "column": 14, - "line": 41, - "offset": 777, - }, - }, - "name": "this", - }, - }, - "value": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 48, - "line": 41, - "offset": 811, - }, - "source": "$greeting", - "start": Position { - "column": 39, - "line": 41, - "offset": 802, - }, - }, - "name": "greeting", - }, - }, - Throw { - "kind": "throw", - "loc": Location { - "end": Position { - "column": 40, - "line": 45, - "offset": 928, - }, - "source": "throw new \\\\ComeToHome('Thats it');", - "start": Position { - "column": 6, - "line": 45, - "offset": 894, - }, - }, - "what": New { - "arguments": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "loc": Location { - "end": Position { - "column": 38, - "line": 45, - "offset": 926, - }, - "source": "'Thats it'", - "start": Position { - "column": 28, - "line": 45, - "offset": 916, - }, - }, - "raw": "'Thats it'", - "unicode": false, - "value": "Thats it", - }, - ], - "kind": "new", - "loc": Location { - "end": Position { - "column": 39, - "line": 45, - "offset": 927, - }, - "source": "\\\\ComeToHome('Thats it')", - "start": Position { - "column": 16, - "line": 45, - "offset": 904, - }, - }, - "what": Identifier { - "kind": "identifier", - "loc": Location { - "end": Position { - "column": 27, - "line": 45, - "offset": 915, - }, - "source": "\\\\ComeToHome", - "start": Position { - "column": 16, - "line": 45, - "offset": 904, - }, - }, - "name": "\\\\ComeToHome", - "resolution": "qn", - }, - }, - }, - ], - "kind": "block", - "loc": Location { - "end": Position { - "column": 5, - "line": 46, - "offset": 934, - }, - "source": "{ - // do not wanna do - foreach($this->dwarf as $name => $greeting) { - echo \\"Hey ho $name, $greeting !\\"; - continue $foo; - } - throw new \\\\ComeToHome('Thats it'); - }", - "start": Position { - "column": 40, - "line": 39, - "offset": 736, - }, - }, - }, - "byref": false, - "isAbstract": false, - "isFinal": true, - "isStatic": false, - "kind": "method", - "leadingComments": Array [ - CommentBlock { - "kind": "commentblock", - "loc": Location { - "end": Position { - "column": 7, - "line": 38, - "offset": 695, - }, - "source": "/** - * Something is done here - */", - "start": Position { - "column": 4, - "line": 36, - "offset": 654, - }, - }, - "value": "/** - * Something is done here - */", - }, - ], - "loc": Location { - "end": Position { - "column": 5, - "line": 46, - "offset": 934, - }, - "source": "function doSomething()", - "start": Position { - "column": 17, - "line": 39, - "offset": 713, - }, - }, - "name": "doSomething", - "nullable": false, - "type": null, - "visibility": "public", - }, - ], - "extends": null, - "implements": Array [ - Identifier { - "kind": "identifier", - "loc": Location { - "end": Position { - "column": 51, - "line": 25, - "offset": 439, - }, - "source": "namespace\\\\fooBaz", - "start": Position { - "column": 35, - "line": 25, - "offset": 423, - }, - }, - "name": "fooBaz", - "resolution": "rn", - }, - ], - "isAbstract": true, - "isAnonymous": false, - "isFinal": false, - "kind": "class", - "leadingComments": Array [ - CommentBlock { - "kind": "commentblock", - "loc": Location { - "end": Position { - "column": 5, - "line": 24, - "offset": 387, - }, - "source": "/** - * a class - */", - "start": Position { - "column": 2, - "line": 22, - "offset": 365, - }, - }, - "value": "/** - * a class - */", - }, - ], - "loc": Location { - "end": Position { - "column": 3, - "line": 47, - "offset": 938, - }, - "source": "class fooBar implements namespace\\\\fooBaz { - use Line; - use foo, bar { - foo::baz insteadof bar; - bar::foo as baz; - } - const FOOBAR = 'BARFOO'; - protected $dwarf = [ - 'sneezy' => 'achoum', - 'bashful' => 'tadah' - ]; - /** - * Something is done here - */ - final public function doSomething() { - // do not wanna do - foreach($this->dwarf as $name => $greeting) { - echo \\"Hey ho $name, $greeting !\\"; - continue $foo; - } - throw new \\\\ComeToHome('Thats it'); - } - }", - "start": Position { - "column": 11, - "line": 25, - "offset": 399, - }, - }, - "name": "fooBar", - }, - Interface { - "body": Array [ - Method { - "arguments": Array [], - "body": null, - "byref": false, - "isAbstract": false, - "isFinal": false, - "isStatic": false, - "kind": "method", - "loc": Location { - "end": Position { - "column": 39, - "line": 50, - "offset": 1014, - }, - "source": "function Am_I_Uggly() : bool", - "start": Position { - "column": 11, - "line": 50, - "offset": 986, - }, - }, - "name": "Am_I_Uggly", - "nullable": false, - "type": Identifier { - "kind": "identifier", - "loc": Location { - "end": Position { - "column": 39, - "line": 50, - "offset": 1014, - }, - "source": "bool", - "start": Position { - "column": 35, - "line": 50, - "offset": 1010, - }, - }, - "name": "bool", - "resolution": "uqn", - }, - "visibility": "public", - }, - Method { - "arguments": Array [], - "body": null, - "byref": false, - "isAbstract": false, - "isFinal": false, - "isStatic": false, - "kind": "method", - "loc": Location { - "end": Position { - "column": 38, - "line": 51, - "offset": 1054, - }, - "source": "function broken() : bool", - "start": Position { - "column": 14, - "line": 51, - "offset": 1030, - }, - }, - "name": "broken", - "nullable": false, - "type": Identifier { - "kind": "identifier", - "loc": Location { - "end": Position { - "column": 38, - "line": 51, - "offset": 1054, - }, - "source": "bool", - "start": Position { - "column": 34, - "line": 51, - "offset": 1050, - }, - }, - "name": "bool", - "resolution": "uqn", - }, - "visibility": "protected", - }, - Method { - "arguments": Array [], - "body": null, - "byref": false, - "isAbstract": false, - "isFinal": false, - "isStatic": true, - "kind": "method", - "loc": Location { - "end": Position { - "column": 55, - "line": 52, - "offset": 1111, - }, - "source": "function isWhiteSnowAlive() : bool", - "start": Position { - "column": 21, - "line": 52, - "offset": 1077, - }, - }, - "name": "isWhiteSnowAlive", - "nullable": false, - "type": Identifier { - "kind": "identifier", - "loc": Location { - "end": Position { - "column": 55, - "line": 52, - "offset": 1111, - }, - "source": "bool", - "start": Position { - "column": 51, - "line": 52, - "offset": 1107, - }, - }, - "name": "bool", - "resolution": "uqn", - }, - "visibility": "protected", - }, - ], - "extends": Array [ - Identifier { - "kind": "identifier", - "loc": Location { - "end": Position { - "column": 32, - "line": 49, - "offset": 972, - }, - "source": "Object", - "start": Position { - "column": 26, - "line": 49, - "offset": 966, - }, - }, - "name": "Object", - "resolution": "uqn", - }, - ], - "kind": "interface", - "loc": Location { - "end": Position { - "column": 3, - "line": 53, - "offset": 1116, - }, - "source": "interface Miror extends Object { - public function Am_I_Uggly() : bool; - protected function broken() : bool; - static protected function isWhiteSnowAlive() : bool; - }", - "start": Position { - "column": 2, - "line": 49, - "offset": 942, - }, - }, - "name": "Miror", - }, - _Function { - "arguments": Array [], - "body": Block { - "children": Array [ - Yield { - "key": String { - "isDoubleQuote": false, - "kind": "string", - "loc": Location { - "end": Position { - "column": 16, - "line": 56, - "offset": 1154, - }, - "source": "'ator'", - "start": Position { - "column": 10, - "line": 56, - "offset": 1148, - }, - }, - "raw": "'ator'", - "unicode": false, - "value": "ator", - }, - "kind": "yield", - "loc": Location { - "end": Position { - "column": 25, - "line": 56, - "offset": 1163, - }, - "source": "yield 'ator' => $foo;", - "start": Position { - "column": 4, - "line": 56, - "offset": 1142, - }, - }, - "value": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 24, - "line": 56, - "offset": 1162, - }, - "source": "$foo", - "start": Position { - "column": 20, - "line": 56, - "offset": 1158, - }, - }, - "name": "foo", - }, - }, - YieldFrom { - "kind": "yieldfrom", - "loc": Location { - "end": Position { - "column": 24, - "line": 57, - "offset": 1188, - }, - "source": "yield from iter(50);", - "start": Position { - "column": 4, - "line": 57, - "offset": 1168, - }, - }, - "value": Call { - "arguments": Array [ - Number { - "kind": "number", - "loc": Location { - "end": Position { - "column": 22, - "line": 57, - "offset": 1186, - }, - "source": "50", - "start": Position { - "column": 20, - "line": 57, - "offset": 1184, - }, - }, - "value": "50", - }, - ], - "kind": "call", - "loc": Location { - "end": Position { - "column": 23, - "line": 57, - "offset": 1187, - }, - "source": "(50)", - "start": Position { - "column": 19, - "line": 57, - "offset": 1183, - }, - }, - "what": Identifier { - "kind": "identifier", - "loc": Location { - "end": Position { - "column": 19, - "line": 57, - "offset": 1183, - }, - "source": "iter", - "start": Position { - "column": 15, - "line": 57, - "offset": 1179, - }, - }, - "name": "iter", - "resolution": "uqn", - }, - }, - }, - ], - "kind": "block", - "loc": Location { - "end": Position { - "column": 3, - "line": 58, - "offset": 1192, - }, - "source": "{ - yield 'ator' => $foo; - yield from iter(50); - }", - "start": Position { - "column": 18, - "line": 55, - "offset": 1136, - }, - }, - }, - "byref": false, - "kind": "function", - "loc": Location { - "end": Position { - "column": 3, - "line": 58, - "offset": 1192, - }, - "source": "function iter()", - "start": Position { - "column": 2, - "line": 55, - "offset": 1120, - }, - }, - "name": "iter", - "nullable": false, - "type": null, - }, - Trait { - "body": Array [ - Method { - "arguments": Array [ - Parameter { - "byref": false, - "kind": "parameter", - "loc": Location { - "end": Position { - "column": 44, - "line": 61, - "offset": 1253, - }, - "source": "bool $arrow = false", - "start": Position { - "column": 25, - "line": 61, - "offset": 1234, - }, - }, - "name": "arrow", - "nullable": false, - "type": Identifier { - "kind": "identifier", - "loc": Location { - "end": Position { - "column": 29, - "line": 61, - "offset": 1238, - }, - "source": "bool", - "start": Position { - "column": 25, - "line": 61, - "offset": 1234, - }, - }, - "name": "bool", - "resolution": "uqn", - }, - "value": Boolean { - "kind": "boolean", - "loc": Location { - "end": Position { - "column": 44, - "line": 61, - "offset": 1253, - }, - "source": "false", - "start": Position { - "column": 39, - "line": 61, - "offset": 1248, - }, - }, - "raw": "false", - "value": false, - }, - "variadic": false, - }, - ], - "body": Block { - "children": Array [ - Switch { - "body": Block { - "children": Array [ - Case { - "body": null, - "kind": "case", - "loc": Location { - "end": Position { - "column": 19, - "line": 63, - "offset": 1314, - }, - "source": "case 'dot':", - "start": Position { - "column": 8, - "line": 63, - "offset": 1303, - }, - }, - "test": String { - "isDoubleQuote": false, - "kind": "string", - "loc": Location { - "end": Position { - "column": 18, - "line": 63, - "offset": 1313, - }, - "source": "'dot'", - "start": Position { - "column": 13, - "line": 63, - "offset": 1308, - }, - }, - "raw": "'dot'", - "unicode": false, - "value": "dot", - }, - }, - Case { - "body": Block { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 15, - "line": 65, - "offset": 1352, - }, - "source": "$body", - "start": Position { - "column": 10, - "line": 65, - "offset": 1347, - }, - }, - "name": "body", - }, - "loc": Location { - "end": Position { - "column": 27, - "line": 65, - "offset": 1364, - }, - "source": "$body = '......';", - "start": Position { - "column": 10, - "line": 65, - "offset": 1347, - }, - }, - "operator": "=", - "right": String { - "isDoubleQuote": false, - "kind": "string", - "loc": Location { - "end": Position { - "column": 26, - "line": 65, - "offset": 1363, - }, - "source": "'......'", - "start": Position { - "column": 18, - "line": 65, - "offset": 1355, - }, - }, - "raw": "'......'", - "unicode": false, - "value": "......", - }, - }, - Break { - "kind": "break", - "level": null, - "loc": Location { - "end": Position { - "column": 16, - "line": 66, - "offset": 1381, - }, - "source": "break;", - "start": Position { - "column": 10, - "line": 66, - "offset": 1375, - }, - }, - }, - ], - "kind": "block", - "loc": Location { - "end": Position { - "column": 16, - "line": 66, - "offset": 1381, - }, - "source": "$body = '......'; - break;", - "start": Position { - "column": 10, - "line": 65, - "offset": 1347, - }, - }, - }, - "kind": "case", - "loc": Location { - "end": Position { - "column": 16, - "line": 66, - "offset": 1381, - }, - "source": "case 'point': - $body = '......'; - break;", - "start": Position { - "column": 8, - "line": 64, - "offset": 1323, - }, - }, - "test": String { - "isDoubleQuote": false, - "kind": "string", - "loc": Location { - "end": Position { - "column": 20, - "line": 64, - "offset": 1335, - }, - "source": "'point'", - "start": Position { - "column": 13, - "line": 64, - "offset": 1328, - }, - }, - "raw": "'point'", - "unicode": false, - "value": "point", - }, - }, - Case { - "body": Block { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 15, - "line": 68, - "offset": 1414, - }, - "source": "$body", - "start": Position { - "column": 10, - "line": 68, - "offset": 1409, - }, - }, - "name": "body", - }, - "loc": Location { - "end": Position { - "column": 26, - "line": 68, - "offset": 1425, - }, - "source": "$body = '-----';", - "start": Position { - "column": 10, - "line": 68, - "offset": 1409, - }, - }, - "operator": "=", - "right": String { - "isDoubleQuote": false, - "kind": "string", - "loc": Location { - "end": Position { - "column": 25, - "line": 68, - "offset": 1424, - }, - "source": "'-----'", - "start": Position { - "column": 18, - "line": 68, - "offset": 1417, - }, - }, - "raw": "'-----'", - "unicode": false, - "value": "-----", - }, - }, - Break { - "kind": "break", - "level": null, - "loc": Location { - "end": Position { - "column": 16, - "line": 69, - "offset": 1442, - }, - "source": "break;", - "start": Position { - "column": 10, - "line": 69, - "offset": 1436, - }, - }, - }, - ], - "kind": "block", - "loc": Location { - "end": Position { - "column": 16, - "line": 69, - "offset": 1442, - }, - "source": "$body = '-----'; - break;", - "start": Position { - "column": 10, - "line": 68, - "offset": 1409, - }, - }, - }, - "kind": "case", - "loc": Location { - "end": Position { - "column": 16, - "line": 69, - "offset": 1442, - }, - "source": "default: - $body = '-----'; - break;", - "start": Position { - "column": 8, - "line": 67, - "offset": 1390, - }, - }, - "test": null, - }, - ], - "kind": "block", - "loc": Location { - "end": Position { - "column": 7, - "line": 70, - "offset": 1450, - }, - "source": "{ - case 'dot': - case 'point': - $body = '......'; - break; - default: - $body = '-----'; - break; - }", - "start": Position { - "column": 27, - "line": 62, - "offset": 1293, - }, - }, - }, - "kind": "switch", - "loc": Location { - "end": Position { - "column": 7, - "line": 70, - "offset": 1450, - }, - "source": "($this->style) { - case 'dot': - case 'point': - $body = '......'; - break; - default: - $body = '-----'; - break; - }", - "start": Position { - "column": 12, - "line": 62, - "offset": 1278, - }, - }, - "shortForm": false, - "test": PropertyLookup { - "kind": "propertylookup", - "loc": Location { - "end": Position { - "column": 25, - "line": 62, - "offset": 1291, - }, - "source": "->style", - "start": Position { - "column": 18, - "line": 62, - "offset": 1284, - }, - }, - "offset": ConstRef { - "kind": "constref", - "loc": Location { - "end": Position { - "column": 25, - "line": 62, - "offset": 1291, - }, - "source": "style", - "start": Position { - "column": 20, - "line": 62, - "offset": 1286, - }, - }, - "name": "style", - }, - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 18, - "line": 62, - "offset": 1284, - }, - "source": "$this", - "start": Position { - "column": 13, - "line": 62, - "offset": 1279, - }, - }, - "name": "this", - }, - }, - }, - Return { - "expr": Bin { - "kind": "bin", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 18, - "line": 71, - "offset": 1469, - }, - "source": "$body", - "start": Position { - "column": 13, - "line": 71, - "offset": 1464, - }, - }, - "name": "body", - }, - "loc": Location { - "end": Position { - "column": 40, - "line": 71, - "offset": 1491, - }, - "source": "$body . ($arrow ? '>' : '')", - "start": Position { - "column": 13, - "line": 71, - "offset": 1464, - }, - }, - "right": Parenthesis { - "inner": RetIf { - "falseExpr": String { - "isDoubleQuote": false, - "kind": "string", - "loc": Location { - "end": Position { - "column": 39, - "line": 71, - "offset": 1490, - }, - "source": "''", - "start": Position { - "column": 37, - "line": 71, - "offset": 1488, - }, - }, - "raw": "''", - "unicode": false, - "value": "", - }, - "kind": "retif", - "loc": Location { - "end": Position { - "column": 39, - "line": 71, - "offset": 1490, - }, - "source": "$arrow ? '>' : ''", - "start": Position { - "column": 22, - "line": 71, - "offset": 1473, - }, - }, - "test": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 28, - "line": 71, - "offset": 1479, - }, - "source": "$arrow", - "start": Position { - "column": 22, - "line": 71, - "offset": 1473, - }, - }, - "name": "arrow", - }, - "trueExpr": String { - "isDoubleQuote": false, - "kind": "string", - "loc": Location { - "end": Position { - "column": 34, - "line": 71, - "offset": 1485, - }, - "source": "'>'", - "start": Position { - "column": 31, - "line": 71, - "offset": 1482, - }, - }, - "raw": "'>'", - "unicode": false, - "value": ">", - }, - }, - "kind": "parenthesis", - "loc": Location { - "end": Position { - "column": 40, - "line": 71, - "offset": 1491, - }, - "source": "($arrow ? '>' : '')", - "start": Position { - "column": 21, - "line": 71, - "offset": 1472, - }, - }, - }, - "type": ".", - }, - "kind": "return", - "loc": Location { - "end": Position { - "column": 41, - "line": 71, - "offset": 1492, - }, - "source": "return $body . ($arrow ? '>' : '');", - "start": Position { - "column": 6, - "line": 71, - "offset": 1457, - }, - }, - }, - ], - "kind": "block", - "loc": Location { - "end": Position { - "column": 5, - "line": 72, - "offset": 1498, - }, - "source": "{ - switch($this->style) { - case 'dot': - case 'point': - $body = '......'; - break; - default: - $body = '-----'; - break; - } - return $body . ($arrow ? '>' : ''); - }", - "start": Position { - "column": 55, - "line": 61, - "offset": 1264, - }, - }, - }, - "byref": false, - "isAbstract": false, - "isFinal": false, - "isStatic": false, - "kind": "method", - "loc": Location { - "end": Position { - "column": 5, - "line": 72, - "offset": 1498, - }, - "source": "function draw(bool $arrow = false) : string", - "start": Position { - "column": 11, - "line": 61, - "offset": 1220, - }, - }, - "name": "draw", - "nullable": false, - "type": Identifier { - "kind": "identifier", - "loc": Location { - "end": Position { - "column": 54, - "line": 61, - "offset": 1263, - }, - "source": "string", - "start": Position { - "column": 48, - "line": 61, - "offset": 1257, - }, - }, - "name": "string", - "resolution": "uqn", - }, - "visibility": "public", - }, - Method { - "arguments": Array [], - "body": Block { - "children": Array [ - Return { - "expr": Magic { - "kind": "magic", - "loc": Location { - "end": Position { - "column": 26, - "line": 74, - "offset": 1556, - }, - "source": "__NAMESPACE__", - "start": Position { - "column": 13, - "line": 74, - "offset": 1543, - }, - }, - "raw": "__NAMESPACE__", - "value": "__NAMESPACE__", - }, - "kind": "return", - "loc": Location { - "end": Position { - "column": 27, - "line": 74, - "offset": 1557, - }, - "source": "return __NAMESPACE__;", - "start": Position { - "column": 6, - "line": 74, - "offset": 1536, - }, - }, - }, - ], - "kind": "block", - "loc": Location { - "end": Position { - "column": 5, - "line": 75, - "offset": 1563, - }, - "source": "{ - return __NAMESPACE__; - }", - "start": Position { - "column": 29, - "line": 73, - "offset": 1528, - }, - }, - }, - "byref": false, - "isAbstract": false, - "isFinal": false, - "isStatic": false, - "kind": "method", - "loc": Location { - "end": Position { - "column": 5, - "line": 75, - "offset": 1563, - }, - "source": "function shuut()", - "start": Position { - "column": 12, - "line": 73, - "offset": 1511, - }, - }, - "name": "shuut", - "nullable": false, - "type": null, - "visibility": "private", - }, - ], - "extends": null, - "implements": null, - "kind": "trait", - "loc": Location { - "end": Position { - "column": 3, - "line": 76, - "offset": 1567, - }, - "source": "trait Line { - public function draw(bool $arrow = false) : string { - switch($this->style) { - case 'dot': - case 'point': - $body = '......'; - break; - default: - $body = '-----'; - break; - } - return $body . ($arrow ? '>' : ''); - } - private function shuut() { - return __NAMESPACE__; - } - }", - "start": Position { - "column": 2, - "line": 60, - "offset": 1196, - }, - }, - "name": "Line", - }, - _Function { - "arguments": Array [], - "body": Block { - "children": Array [ - Global { - "items": Array [ - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 20, - "line": 80, - "offset": 1640, - }, - "source": "$persians", - "start": Position { - "column": 11, - "line": 80, - "offset": 1631, - }, - }, - "name": "persians", - }, - ], - "kind": "global", - "loc": Location { - "end": Position { - "column": 21, - "line": 80, - "offset": 1641, - }, - "source": "global $persians;", - "start": Position { - "column": 4, - "line": 80, - "offset": 1624, - }, - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 10, - "line": 82, - "offset": 1653, - }, - "source": "$index", - "start": Position { - "column": 4, - "line": 82, - "offset": 1647, - }, - }, - "name": "index", - }, - "loc": Location { - "end": Position { - "column": 16, - "line": 82, - "offset": 1659, - }, - "source": "$index = -1;", - "start": Position { - "column": 4, - "line": 82, - "offset": 1647, - }, - }, - "operator": "=", - "right": Number { - "kind": "number", - "loc": Location { - "end": Position { - "column": 14, - "line": 82, - "offset": 1657, - }, - "source": "-", - "start": Position { - "column": 13, - "line": 82, - "offset": 1656, - }, - }, - "value": "-1", - }, - }, - Label { - "kind": "label", - "loc": Location { - "end": Position { - "column": 5, - "line": 83, - "offset": 1665, - }, - "source": ":", - "start": Position { - "column": 4, - "line": 83, - "offset": 1664, - }, - }, - "name": "next", - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 8, - "line": 84, - "offset": 1674, - }, - "source": "$guy", - "start": Position { - "column": 4, - "line": 84, - "offset": 1670, - }, - }, - "name": "guy", - }, - "loc": Location { - "end": Position { - "column": 31, - "line": 84, - "offset": 1697, - }, - "source": "$guy = $persians[++$index];", - "start": Position { - "column": 4, - "line": 84, - "offset": 1670, - }, - }, - "operator": "=", - "right": OffsetLookup { - "kind": "offsetlookup", - "loc": Location { - "end": Position { - "column": 30, - "line": 84, - "offset": 1696, - }, - "source": "[++$index]", - "start": Position { - "column": 20, - "line": 84, - "offset": 1686, - }, - }, - "offset": Pre { - "kind": "pre", - "loc": Location { - "end": Position { - "column": 29, - "line": 84, - "offset": 1695, - }, - "source": "++$index", - "start": Position { - "column": 21, - "line": 84, - "offset": 1687, - }, - }, - "type": "+", - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 29, - "line": 84, - "offset": 1695, - }, - "source": "$index", - "start": Position { - "column": 23, - "line": 84, - "offset": 1689, - }, - }, - "name": "index", - }, - }, - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 20, - "line": 84, - "offset": 1686, - }, - "source": "$persians", - "start": Position { - "column": 11, - "line": 84, - "offset": 1677, - }, - }, - "name": "persians", - }, - }, - }, - If { - "alternate": Block { - "children": Array [ - Call { - "arguments": Array [ - variadic { - "kind": "variadic", - "loc": Location { - "end": Position { - "column": 24, - "line": 88, - "offset": 1789, - }, - "source": "...$foo", - "start": Position { - "column": 17, - "line": 88, - "offset": 1782, - }, - }, - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 24, - "line": 88, - "offset": 1789, - }, - "source": "$foo", - "start": Position { - "column": 20, - "line": 88, - "offset": 1785, - }, - }, - "name": "foo", - }, - }, - ], - "kind": "call", - "loc": Location { - "end": Position { - "column": 26, - "line": 88, - "offset": 1791, - }, - "source": "(...$foo);", - "start": Position { - "column": 16, - "line": 88, - "offset": 1781, - }, - }, - "what": PropertyLookup { - "kind": "propertylookup", - "loc": Location { - "end": Position { - "column": 16, - "line": 88, - "offset": 1781, - }, - "source": "->kick", - "start": Position { - "column": 10, - "line": 88, - "offset": 1775, - }, - }, - "offset": ConstRef { - "kind": "constref", - "loc": Location { - "end": Position { - "column": 16, - "line": 88, - "offset": 1781, - }, - "source": "kick", - "start": Position { - "column": 12, - "line": 88, - "offset": 1777, - }, - }, - "name": "kick", - }, - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 10, - "line": 88, - "offset": 1775, - }, - "source": "$guy", - "start": Position { - "column": 6, - "line": 88, - "offset": 1771, - }, - }, - "name": "guy", - }, - }, - }, - ], - "kind": "block", - "loc": Location { - "end": Position { - "column": 5, - "line": 89, - "offset": 1797, - }, - "source": "{ - $guy->kick(...$foo); - }", - "start": Position { - "column": 11, - "line": 87, - "offset": 1763, - }, - }, - }, - "body": Block { - "children": Array [ - Silent { - "expr": Call { - "arguments": Array [], - "kind": "call", - "loc": Location { - "end": Position { - "column": 19, - "line": 86, - "offset": 1750, - }, - "source": "()", - "start": Position { - "column": 17, - "line": 86, - "offset": 1748, - }, - }, - "what": PropertyLookup { - "kind": "propertylookup", - "loc": Location { - "end": Position { - "column": 17, - "line": 86, - "offset": 1748, - }, - "source": "->kill", - "start": Position { - "column": 11, - "line": 86, - "offset": 1742, - }, - }, - "offset": ConstRef { - "kind": "constref", - "loc": Location { - "end": Position { - "column": 17, - "line": 86, - "offset": 1748, - }, - "source": "kill", - "start": Position { - "column": 13, - "line": 86, - "offset": 1744, - }, - }, - "name": "kill", - }, - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 11, - "line": 86, - "offset": 1742, - }, - "source": "$guy", - "start": Position { - "column": 7, - "line": 86, - "offset": 1738, - }, - }, - "name": "guy", - }, - }, - }, - "kind": "silent", - "loc": Location { - "end": Position { - "column": 20, - "line": 86, - "offset": 1751, - }, - "source": "@$guy->kill();", - "start": Position { - "column": 6, - "line": 86, - "offset": 1737, - }, - }, - }, - ], - "kind": "block", - "loc": Location { - "end": Position { - "column": 5, - "line": 87, - "offset": 1757, - }, - "source": "{ - @$guy->kill(); - }", - "start": Position { - "column": 31, - "line": 85, - "offset": 1729, - }, - }, - }, - "kind": "if", - "loc": Location { - "end": Position { - "column": 5, - "line": 89, - "offset": 1797, - }, - "source": "if(rand(0, 10)>5 || false) { - @$guy->kill(); - } else { - $guy->kick(...$foo); - }", - "start": Position { - "column": 4, - "line": 85, - "offset": 1702, - }, - }, - "shortForm": false, - "test": Bin { - "kind": "bin", - "left": Bin { - "kind": "bin", - "left": Call { - "arguments": Array [ - Number { - "kind": "number", - "loc": Location { - "end": Position { - "column": 13, - "line": 85, - "offset": 1711, - }, - "source": "0", - "start": Position { - "column": 12, - "line": 85, - "offset": 1710, - }, - }, - "value": "0", - }, - Number { - "kind": "number", - "loc": Location { - "end": Position { - "column": 17, - "line": 85, - "offset": 1715, - }, - "source": "10", - "start": Position { - "column": 15, - "line": 85, - "offset": 1713, - }, - }, - "value": "10", - }, - ], - "kind": "call", - "loc": Location { - "end": Position { - "column": 18, - "line": 85, - "offset": 1716, - }, - "source": "(0, 10)", - "start": Position { - "column": 11, - "line": 85, - "offset": 1709, - }, - }, - "what": Identifier { - "kind": "identifier", - "loc": Location { - "end": Position { - "column": 11, - "line": 85, - "offset": 1709, - }, - "source": "rand", - "start": Position { - "column": 7, - "line": 85, - "offset": 1705, - }, - }, - "name": "rand", - "resolution": "uqn", - }, - }, - "loc": Location { - "end": Position { - "column": 29, - "line": 85, - "offset": 1727, - }, - "source": "rand(0, 10)>5 || false", - "start": Position { - "column": 7, - "line": 85, - "offset": 1705, - }, - }, - "right": Number { - "kind": "number", - "loc": Location { - "end": Position { - "column": 20, - "line": 85, - "offset": 1718, - }, - "source": "5", - "start": Position { - "column": 19, - "line": 85, - "offset": 1717, - }, - }, - "value": "5", - }, - "type": ">", - }, - "loc": Location { - "end": Position { - "column": 29, - "line": 85, - "offset": 1727, - }, - "source": "5 || false", - "start": Position { - "column": 19, - "line": 85, - "offset": 1717, - }, - }, - "right": Boolean { - "kind": "boolean", - "loc": Location { - "end": Position { - "column": 29, - "line": 85, - "offset": 1727, - }, - "source": "false", - "start": Position { - "column": 24, - "line": 85, - "offset": 1722, - }, - }, - "raw": "false", - "value": false, - }, - "type": "||", - }, - }, - If { - "alternate": null, - "body": Goto { - "kind": "goto", - "label": "next", - "loc": Location { - "end": Position { - "column": 50, - "line": 90, - "offset": 1848, - }, - "source": "goto next;", - "start": Position { - "column": 40, - "line": 90, - "offset": 1838, - }, - }, - }, - "kind": "if", - "loc": Location { - "end": Position { - "column": 50, - "line": 90, - "offset": 1848, - }, - "source": "if ((int)$index < count($persians)) goto next;", - "start": Position { - "column": 4, - "line": 90, - "offset": 1802, - }, - }, - "shortForm": false, - "test": Cast { - "kind": "cast", - "loc": Location { - "end": Position { - "column": 38, - "line": 90, - "offset": 1836, - }, - "source": "(int)$index < count($persians)", - "start": Position { - "column": 8, - "line": 90, - "offset": 1806, - }, - }, - "type": "int", - "what": Bin { - "kind": "bin", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 19, - "line": 90, - "offset": 1817, - }, - "source": "$index", - "start": Position { - "column": 13, - "line": 90, - "offset": 1811, - }, - }, - "name": "index", - }, - "loc": Location { - "end": Position { - "column": 38, - "line": 90, - "offset": 1836, - }, - "source": "$index < count($persians)", - "start": Position { - "column": 13, - "line": 90, - "offset": 1811, - }, - }, - "right": Call { - "arguments": Array [ - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 37, - "line": 90, - "offset": 1835, - }, - "source": "$persians", - "start": Position { - "column": 28, - "line": 90, - "offset": 1826, - }, - }, - "name": "persians", - }, - ], - "kind": "call", - "loc": Location { - "end": Position { - "column": 38, - "line": 90, - "offset": 1836, - }, - "source": "($persians)", - "start": Position { - "column": 27, - "line": 90, - "offset": 1825, - }, - }, - "what": Identifier { - "kind": "identifier", - "loc": Location { - "end": Position { - "column": 27, - "line": 90, - "offset": 1825, - }, - "source": "count", - "start": Position { - "column": 22, - "line": 90, - "offset": 1820, - }, - }, - "name": "count", - "resolution": "uqn", - }, - }, - "type": "<", - }, - }, - }, - Return { - "expr": Bin { - "kind": "bin", - "left": Number { - "kind": "number", - "loc": Location { - "end": Position { - "column": 14, - "line": 92, - "offset": 1864, - }, - "source": "300", - "start": Position { - "column": 11, - "line": 92, - "offset": 1861, - }, - }, - "value": "300", - }, - "loc": Location { - "end": Position { - "column": 18, - "line": 92, - "offset": 1868, - }, - "source": "300 | 5", - "start": Position { - "column": 11, - "line": 92, - "offset": 1861, - }, - }, - "right": Number { - "kind": "number", - "loc": Location { - "end": Position { - "column": 18, - "line": 92, - "offset": 1868, - }, - "source": "5", - "start": Position { - "column": 17, - "line": 92, - "offset": 1867, - }, - }, - "value": "5", - }, - "type": "|", - }, - "kind": "return", - "loc": Location { - "end": Position { - "column": 19, - "line": 92, - "offset": 1869, - }, - "source": "return 300 | 5;", - "start": Position { - "column": 4, - "line": 92, - "offset": 1854, - }, - }, - }, - ], - "kind": "block", - "loc": Location { - "end": Position { - "column": 3, - "line": 93, - "offset": 1873, - }, - "source": "{ - global $persians; - - $index = -1; -next: - $guy = $persians[++$index]; - if(rand(0, 10)>5 || false) { - @$guy->kill(); - } else { - $guy->kick(...$foo); - } - if ((int)$index < count($persians)) goto next; - - return 300 | 5; - }", - "start": Position { - "column": 27, - "line": 79, - "offset": 1618, - }, - }, - }, - "byref": false, - "kind": "function", - "leadingComments": Array [ - CommentLine { - "kind": "commentline", - "loc": Location { - "end": Position { - "column": 0, - "line": 79, - "offset": 1591, - }, - "source": "// this is SPARTA ! -", - "start": Position { - "column": 2, - "line": 78, - "offset": 1571, - }, - }, - "value": "// this is SPARTA ! -", - }, - ], - "loc": Location { - "end": Position { - "column": 3, - "line": 93, - "offset": 1873, - }, - "source": "function sparta() : ?int", - "start": Position { - "column": 2, - "line": 79, - "offset": 1593, - }, - }, - "name": "sparta", - "nullable": true, - "type": Identifier { - "kind": "identifier", - "loc": Location { - "end": Position { - "column": 26, - "line": 79, - "offset": 1617, - }, - "source": "int", - "start": Position { - "column": 23, - "line": 79, - "offset": 1614, - }, - }, - "name": "int", - "resolution": "uqn", - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 6, - "line": 95, - "offset": 1881, - }, - "source": "$foo", - "start": Position { - "column": 2, - "line": 95, - "offset": 1877, - }, - }, - "name": "foo", - }, - "loc": Location { - "end": Position { - "column": 4, - "line": 131, - "offset": 2878, - }, - "source": "$foo = function(?int $bar = 42) use($something) : bool { - static $banana; - if($bar > fooBar::NUMBAR) { - while($bar) { - if ((int)calculateMeaningOfLife() === 42) { - break foo; - } else continue; - } - do { - ?> - Caesar: here I was - crazy()->boom([1, 2, 3]); - } catch(Coco|Nut $ex) { - $ex->printStackTrace(); - } finally { - if (isset($bipbip, $ex)) unset($bipbip, $ex); - return (new class extends fooBar { - function goatIt() { - return \\"meeeh\\"; - } - })->goatIt(); - } - } else { - for($i = 0; $i < count($this->banana); $i++) { - $x %= ($i * 2) / ($i - 1); - $what = $this->$x[++$i] ? 'yes!': 'noo!'; - } - // @todo $this->a_$foo - return $$foo ?? false; - } - return empty(namespace\\\\FOOBAR); - };", - "start": Position { - "column": 2, - "line": 95, - "offset": 1877, - }, - }, - "operator": "=", - "right": Closure { - "arguments": Array [ - Parameter { - "byref": false, - "kind": "parameter", - "loc": Location { - "end": Position { - "column": 32, - "line": 95, - "offset": 1907, - }, - "source": "?int $bar = 42", - "start": Position { - "column": 18, - "line": 95, - "offset": 1893, - }, - }, - "name": "bar", - "nullable": true, - "type": Identifier { - "kind": "identifier", - "loc": Location { - "end": Position { - "column": 22, - "line": 95, - "offset": 1897, - }, - "source": "int", - "start": Position { - "column": 19, - "line": 95, - "offset": 1894, - }, - }, - "name": "int", - "resolution": "uqn", - }, - "value": Number { - "kind": "number", - "loc": Location { - "end": Position { - "column": 32, - "line": 95, - "offset": 1907, - }, - "source": "42", - "start": Position { - "column": 30, - "line": 95, - "offset": 1905, - }, - }, - "value": "42", - }, - "variadic": false, - }, - ], - "body": Block { - "children": Array [ - Static { - "items": Array [ - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 18, - "line": 96, - "offset": 1952, - }, - "source": "$banana", - "start": Position { - "column": 11, - "line": 96, - "offset": 1945, - }, - }, - "name": "banana", - }, - ], - "kind": "static", - "loc": Location { - "end": Position { - "column": 19, - "line": 96, - "offset": 1953, - }, - "source": "static $banana;", - "start": Position { - "column": 4, - "line": 96, - "offset": 1938, - }, - }, - }, - If { - "alternate": If { - "alternate": Block { - "children": Array [ - For { - "body": Block { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 10, - "line": 124, - "offset": 2691, - }, - "source": "$x", - "start": Position { - "column": 8, - "line": 124, - "offset": 2689, - }, - }, - "name": "x", - }, - "loc": Location { - "end": Position { - "column": 34, - "line": 124, - "offset": 2715, - }, - "source": "$x %= ($i * 2) / ($i - 1);", - "start": Position { - "column": 8, - "line": 124, - "offset": 2689, - }, - }, - "operator": "%=", - "right": Bin { - "kind": "bin", - "left": Parenthesis { - "inner": Bin { - "kind": "bin", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 17, - "line": 124, - "offset": 2698, - }, - "source": "$i", - "start": Position { - "column": 15, - "line": 124, - "offset": 2696, - }, - }, - "name": "i", - }, - "loc": Location { - "end": Position { - "column": 21, - "line": 124, - "offset": 2702, - }, - "source": "$i * 2", - "start": Position { - "column": 15, - "line": 124, - "offset": 2696, - }, - }, - "right": Number { - "kind": "number", - "loc": Location { - "end": Position { - "column": 21, - "line": 124, - "offset": 2702, - }, - "source": "2", - "start": Position { - "column": 20, - "line": 124, - "offset": 2701, - }, - }, - "value": "2", - }, - "type": "*", - }, - "kind": "parenthesis", - "loc": Location { - "end": Position { - "column": 22, - "line": 124, - "offset": 2703, - }, - "source": "($i * 2)", - "start": Position { - "column": 14, - "line": 124, - "offset": 2695, - }, - }, - }, - "loc": Location { - "end": Position { - "column": 33, - "line": 124, - "offset": 2714, - }, - "source": "($i * 2) / ($i - 1)", - "start": Position { - "column": 14, - "line": 124, - "offset": 2695, - }, - }, - "right": Parenthesis { - "inner": Bin { - "kind": "bin", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 28, - "line": 124, - "offset": 2709, - }, - "source": "$i", - "start": Position { - "column": 26, - "line": 124, - "offset": 2707, - }, - }, - "name": "i", - }, - "loc": Location { - "end": Position { - "column": 32, - "line": 124, - "offset": 2713, - }, - "source": "$i - 1", - "start": Position { - "column": 26, - "line": 124, - "offset": 2707, - }, - }, - "right": Number { - "kind": "number", - "loc": Location { - "end": Position { - "column": 32, - "line": 124, - "offset": 2713, - }, - "source": "1", - "start": Position { - "column": 31, - "line": 124, - "offset": 2712, - }, - }, - "value": "1", - }, - "type": "-", - }, - "kind": "parenthesis", - "loc": Location { - "end": Position { - "column": 33, - "line": 124, - "offset": 2714, - }, - "source": "($i - 1)", - "start": Position { - "column": 25, - "line": 124, - "offset": 2706, - }, - }, - }, - "type": "/", - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 13, - "line": 125, - "offset": 2729, - }, - "source": "$what", - "start": Position { - "column": 8, - "line": 125, - "offset": 2724, - }, - }, - "name": "what", - }, - "loc": Location { - "end": Position { - "column": 49, - "line": 125, - "offset": 2765, - }, - "source": "$what = $this->$x[++$i] ? 'yes!': 'noo!';", - "start": Position { - "column": 8, - "line": 125, - "offset": 2724, - }, - }, - "operator": "=", - "right": RetIf { - "falseExpr": String { - "isDoubleQuote": false, - "kind": "string", - "loc": Location { - "end": Position { - "column": 48, - "line": 125, - "offset": 2764, - }, - "source": "'noo!'", - "start": Position { - "column": 42, - "line": 125, - "offset": 2758, - }, - }, - "raw": "'noo!'", - "unicode": false, - "value": "noo!", - }, - "kind": "retif", - "loc": Location { - "end": Position { - "column": 48, - "line": 125, - "offset": 2764, - }, - "source": "$this->$x[++$i] ? 'yes!': 'noo!'", - "start": Position { - "column": 16, - "line": 125, - "offset": 2732, - }, - }, - "test": OffsetLookup { - "kind": "offsetlookup", - "loc": Location { - "end": Position { - "column": 31, - "line": 125, - "offset": 2747, - }, - "source": "[++$i]", - "start": Position { - "column": 25, - "line": 125, - "offset": 2741, - }, - }, - "offset": Pre { - "kind": "pre", - "loc": Location { - "end": Position { - "column": 30, - "line": 125, - "offset": 2746, - }, - "source": "++$i", - "start": Position { - "column": 26, - "line": 125, - "offset": 2742, - }, - }, - "type": "+", - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 30, - "line": 125, - "offset": 2746, - }, - "source": "$i", - "start": Position { - "column": 28, - "line": 125, - "offset": 2744, - }, - }, - "name": "i", - }, - }, - "what": PropertyLookup { - "kind": "propertylookup", - "loc": Location { - "end": Position { - "column": 25, - "line": 125, - "offset": 2741, - }, - "source": "->$x", - "start": Position { - "column": 21, - "line": 125, - "offset": 2737, - }, - }, - "offset": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 25, - "line": 125, - "offset": 2741, - }, - "source": "$x", - "start": Position { - "column": 23, - "line": 125, - "offset": 2739, - }, - }, - "name": "x", - }, - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 21, - "line": 125, - "offset": 2737, - }, - "source": "$this", - "start": Position { - "column": 16, - "line": 125, - "offset": 2732, - }, - }, - "name": "this", - }, - }, - }, - "trueExpr": String { - "isDoubleQuote": false, - "kind": "string", - "loc": Location { - "end": Position { - "column": 40, - "line": 125, - "offset": 2756, - }, - "source": "'yes!'", - "start": Position { - "column": 34, - "line": 125, - "offset": 2750, - }, - }, - "raw": "'yes!'", - "unicode": false, - "value": "yes!", - }, - }, - }, - ], - "kind": "block", - "loc": Location { - "end": Position { - "column": 7, - "line": 126, - "offset": 2773, - }, - "source": "{ - $x %= ($i * 2) / ($i - 1); - $what = $this->$x[++$i] ? 'yes!': 'noo!'; - }", - "start": Position { - "column": 51, - "line": 123, - "offset": 2679, - }, - }, - }, - "increment": Array [ - Post { - "kind": "post", - "loc": Location { - "end": Position { - "column": 49, - "line": 123, - "offset": 2677, - }, - "source": "$i++", - "start": Position { - "column": 45, - "line": 123, - "offset": 2673, - }, - }, - "type": "+", - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 47, - "line": 123, - "offset": 2675, - }, - "source": "$i", - "start": Position { - "column": 45, - "line": 123, - "offset": 2673, - }, - }, - "name": "i", - }, - }, - ], - "init": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 12, - "line": 123, - "offset": 2640, - }, - "source": "$i", - "start": Position { - "column": 10, - "line": 123, - "offset": 2638, - }, - }, - "name": "i", - }, - "loc": Location { - "end": Position { - "column": 16, - "line": 123, - "offset": 2644, - }, - "source": "$i = 0", - "start": Position { - "column": 10, - "line": 123, - "offset": 2638, - }, - }, - "operator": "=", - "right": Number { - "kind": "number", - "loc": Location { - "end": Position { - "column": 16, - "line": 123, - "offset": 2644, - }, - "source": "0", - "start": Position { - "column": 15, - "line": 123, - "offset": 2643, - }, - }, - "value": "0", - }, - }, - ], - "kind": "for", - "loc": Location { - "end": Position { - "column": 7, - "line": 126, - "offset": 2773, - }, - "source": "($i = 0; $i < count($this->banana); $i++) { - $x %= ($i * 2) / ($i - 1); - $what = $this->$x[++$i] ? 'yes!': 'noo!'; - }", - "start": Position { - "column": 9, - "line": 123, - "offset": 2637, - }, - }, - "shortForm": false, - "test": Array [ - Bin { - "kind": "bin", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 20, - "line": 123, - "offset": 2648, - }, - "source": "$i", - "start": Position { - "column": 18, - "line": 123, - "offset": 2646, - }, - }, - "name": "i", - }, - "loc": Location { - "end": Position { - "column": 43, - "line": 123, - "offset": 2671, - }, - "source": "$i < count($this->banana)", - "start": Position { - "column": 18, - "line": 123, - "offset": 2646, - }, - }, - "right": Call { - "arguments": Array [ - PropertyLookup { - "kind": "propertylookup", - "loc": Location { - "end": Position { - "column": 42, - "line": 123, - "offset": 2670, - }, - "source": "->banana", - "start": Position { - "column": 34, - "line": 123, - "offset": 2662, - }, - }, - "offset": ConstRef { - "kind": "constref", - "loc": Location { - "end": Position { - "column": 42, - "line": 123, - "offset": 2670, - }, - "source": "banana", - "start": Position { - "column": 36, - "line": 123, - "offset": 2664, - }, - }, - "name": "banana", - }, - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 34, - "line": 123, - "offset": 2662, - }, - "source": "$this", - "start": Position { - "column": 29, - "line": 123, - "offset": 2657, - }, - }, - "name": "this", - }, - }, - ], - "kind": "call", - "loc": Location { - "end": Position { - "column": 43, - "line": 123, - "offset": 2671, - }, - "source": "($this->banana)", - "start": Position { - "column": 28, - "line": 123, - "offset": 2656, - }, - }, - "what": Identifier { - "kind": "identifier", - "loc": Location { - "end": Position { - "column": 28, - "line": 123, - "offset": 2656, - }, - "source": "count", - "start": Position { - "column": 23, - "line": 123, - "offset": 2651, - }, - }, - "name": "count", - "resolution": "uqn", - }, - }, - "type": "<", - }, - ], - }, - Return { - "expr": Bin { - "kind": "bin", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 18, - "line": 128, - "offset": 2821, - }, - "source": "$$foo", - "start": Position { - "column": 13, - "line": 128, - "offset": 2816, - }, - }, - "name": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 18, - "line": 128, - "offset": 2821, - }, - "source": "$foo", - "start": Position { - "column": 14, - "line": 128, - "offset": 2817, - }, - }, - "name": "foo", - }, - }, - "loc": Location { - "end": Position { - "column": 27, - "line": 128, - "offset": 2830, - }, - "source": "$$foo ?? false", - "start": Position { - "column": 13, - "line": 128, - "offset": 2816, - }, - }, - "right": Boolean { - "kind": "boolean", - "loc": Location { - "end": Position { - "column": 27, - "line": 128, - "offset": 2830, - }, - "source": "false", - "start": Position { - "column": 22, - "line": 128, - "offset": 2825, - }, - }, - "raw": "false", - "value": false, - }, - "type": "??", - }, - "kind": "return", - "leadingComments": Array [ - CommentLine { - "kind": "commentline", - "loc": Location { - "end": Position { - "column": 0, - "line": 128, - "offset": 2803, - }, - "source": "// @todo $this->a_$foo -", - "start": Position { - "column": 6, - "line": 127, - "offset": 2780, - }, - }, - "value": "// @todo $this->a_$foo -", - }, - ], - "loc": Location { - "end": Position { - "column": 28, - "line": 128, - "offset": 2831, - }, - "source": "return $$foo ?? false;", - "start": Position { - "column": 6, - "line": 128, - "offset": 2809, - }, - }, - }, - ], - "kind": "block", - "loc": Location { - "end": Position { - "column": 5, - "line": 129, - "offset": 2837, - }, - "source": "{ - for($i = 0; $i < count($this->banana); $i++) { - $x %= ($i * 2) / ($i - 1); - $what = $this->$x[++$i] ? 'yes!': 'noo!'; - } - // @todo $this->a_$foo - return $$foo ?? false; - }", - "start": Position { - "column": 11, - "line": 122, - "offset": 2626, - }, - }, - }, - "body": Block { - "children": Array [ - Try { - "always": Block { - "children": Array [ - If { - "alternate": null, - "body": Unset { - "arguments": Array [ - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 46, - "line": 115, - "offset": 2464, - }, - "source": "$bipbip", - "start": Position { - "column": 39, - "line": 115, - "offset": 2457, - }, - }, - "name": "bipbip", - }, - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 51, - "line": 115, - "offset": 2469, - }, - "source": "$ex", - "start": Position { - "column": 48, - "line": 115, - "offset": 2466, - }, - }, - "name": "ex", - }, - ], - "kind": "unset", - "loc": Location { - "end": Position { - "column": 53, - "line": 115, - "offset": 2471, - }, - "source": "unset($bipbip, $ex);", - "start": Position { - "column": 33, - "line": 115, - "offset": 2451, - }, - }, - }, - "kind": "if", - "loc": Location { - "end": Position { - "column": 53, - "line": 115, - "offset": 2471, - }, - "source": "if (isset($bipbip, $ex)) unset($bipbip, $ex);", - "start": Position { - "column": 8, - "line": 115, - "offset": 2426, - }, - }, - "shortForm": false, - "test": Isset { - "arguments": Array [ - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 25, - "line": 115, - "offset": 2443, - }, - "source": "$bipbip", - "start": Position { - "column": 18, - "line": 115, - "offset": 2436, - }, - }, - "name": "bipbip", - }, - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 30, - "line": 115, - "offset": 2448, - }, - "source": "$ex", - "start": Position { - "column": 27, - "line": 115, - "offset": 2445, - }, - }, - "name": "ex", - }, - ], - "kind": "isset", - "loc": Location { - "end": Position { - "column": 31, - "line": 115, - "offset": 2449, - }, - "source": "isset($bipbip, $ex)", - "start": Position { - "column": 12, - "line": 115, - "offset": 2430, - }, - }, - }, - }, - Return { - "expr": Call { - "arguments": Array [], - "kind": "call", - "loc": Location { - "end": Position { - "column": 20, - "line": 120, - "offset": 2605, - }, - "source": "()", - "start": Position { - "column": 18, - "line": 120, - "offset": 2603, - }, - }, - "what": PropertyLookup { - "kind": "propertylookup", - "loc": Location { - "end": Position { - "column": 18, - "line": 120, - "offset": 2603, - }, - "source": "->goatIt", - "start": Position { - "column": 10, - "line": 120, - "offset": 2595, - }, - }, - "offset": ConstRef { - "kind": "constref", - "loc": Location { - "end": Position { - "column": 18, - "line": 120, - "offset": 2603, - }, - "source": "goatIt", - "start": Position { - "column": 12, - "line": 120, - "offset": 2597, - }, - }, - "name": "goatIt", - }, - "what": Parenthesis { - "inner": New { - "arguments": Array [], - "kind": "new", - "loc": Location { - "end": Position { - "column": 9, - "line": 120, - "offset": 2594, - }, - "source": "class extends fooBar { - function goatIt() { - return \\"meeeh\\"; - } - }", - "start": Position { - "column": 20, - "line": 116, - "offset": 2492, - }, - }, - "what": Class { - "body": Array [ - Method { - "arguments": Array [], - "body": Block { - "children": Array [ - Return { - "expr": String { - "isDoubleQuote": true, - "kind": "string", - "loc": Location { - "end": Position { - "column": 26, - "line": 118, - "offset": 2571, - }, - "source": "\\"meeeh\\"", - "start": Position { - "column": 19, - "line": 118, - "offset": 2564, - }, - }, - "raw": "\\"meeeh\\"", - "unicode": false, - "value": "meeeh", - }, - "kind": "return", - "loc": Location { - "end": Position { - "column": 27, - "line": 118, - "offset": 2572, - }, - "source": "return \\"meeeh\\";", - "start": Position { - "column": 12, - "line": 118, - "offset": 2557, - }, - }, - }, - ], - "kind": "block", - "loc": Location { - "end": Position { - "column": 11, - "line": 119, - "offset": 2584, - }, - "source": "{ - return \\"meeeh\\"; - }", - "start": Position { - "column": 28, - "line": 117, - "offset": 2543, - }, - }, - }, - "byref": false, - "isAbstract": false, - "isFinal": false, - "isStatic": false, - "kind": "method", - "loc": Location { - "end": Position { - "column": 11, - "line": 119, - "offset": 2584, - }, - "source": "function goatIt()", - "start": Position { - "column": 10, - "line": 117, - "offset": 2525, - }, - }, - "name": "goatIt", - "nullable": false, - "type": null, - "visibility": "", - }, - ], - "extends": Identifier { - "kind": "identifier", - "loc": Location { - "end": Position { - "column": 40, - "line": 116, - "offset": 2512, - }, - "source": "fooBar", - "start": Position { - "column": 34, - "line": 116, - "offset": 2506, - }, - }, - "name": "fooBar", - "resolution": "uqn", - }, - "implements": null, - "isAbstract": false, - "isAnonymous": true, - "isFinal": false, - "kind": "class", - "loc": Location { - "end": Position { - "column": 9, - "line": 120, - "offset": 2594, - }, - "source": "class extends fooBar { - function goatIt() { - return \\"meeeh\\"; - } - }", - "start": Position { - "column": 20, - "line": 116, - "offset": 2492, - }, - }, - "name": null, - }, - }, - "kind": "parenthesis", - "loc": Location { - "end": Position { - "column": 10, - "line": 120, - "offset": 2595, - }, - "source": "(new class extends fooBar { - function goatIt() { - return \\"meeeh\\"; - } - })", - "start": Position { - "column": 15, - "line": 116, - "offset": 2487, - }, - }, - }, - }, - }, - "kind": "return", - "loc": Location { - "end": Position { - "column": 21, - "line": 120, - "offset": 2606, - }, - "source": "return (new class extends fooBar { - function goatIt() { - return \\"meeeh\\"; - } - })->goatIt();", - "start": Position { - "column": 8, - "line": 116, - "offset": 2480, - }, - }, - }, - ], - "kind": "block", - "loc": Location { - "end": Position { - "column": 7, - "line": 121, - "offset": 2614, - }, - "source": "{ - if (isset($bipbip, $ex)) unset($bipbip, $ex); - return (new class extends fooBar { - function goatIt() { - return \\"meeeh\\"; - } - })->goatIt(); - }", - "start": Position { - "column": 16, - "line": 114, - "offset": 2416, - }, - }, - }, - "body": Block { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 15, - "line": 110, - "offset": 2274, - }, - "source": "$bipbip", - "start": Position { - "column": 8, - "line": 110, - "offset": 2267, - }, - }, - "name": "bipbip", - }, - "loc": Location { - "end": Position { - "column": 35, - "line": 110, - "offset": 2294, - }, - "source": "$bipbip = clone $something;", - "start": Position { - "column": 8, - "line": 110, - "offset": 2267, - }, - }, - "operator": "=", - "right": Clone { - "kind": "clone", - "loc": Location { - "end": Position { - "column": 34, - "line": 110, - "offset": 2293, - }, - "source": "clone $something", - "start": Position { - "column": 18, - "line": 110, - "offset": 2277, - }, - }, - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 34, - "line": 110, - "offset": 2293, - }, - "source": "$something", - "start": Position { - "column": 24, - "line": 110, - "offset": 2283, - }, - }, - "name": "something", - }, - }, - }, - Call { - "arguments": Array [ - Array { - "items": Array [ - Number { - "kind": "number", - "loc": Location { - "end": Position { - "column": 33, - "line": 111, - "offset": 2328, - }, - "source": "1", - "start": Position { - "column": 32, - "line": 111, - "offset": 2327, - }, - }, - "value": "1", - }, - Number { - "kind": "number", - "loc": Location { - "end": Position { - "column": 36, - "line": 111, - "offset": 2331, - }, - "source": "2", - "start": Position { - "column": 35, - "line": 111, - "offset": 2330, - }, - }, - "value": "2", - }, - Number { - "kind": "number", - "loc": Location { - "end": Position { - "column": 39, - "line": 111, - "offset": 2334, - }, - "source": "3", - "start": Position { - "column": 38, - "line": 111, - "offset": 2333, - }, - }, - "value": "3", - }, - ], - "kind": "array", - "loc": Location { - "end": Position { - "column": 40, - "line": 111, - "offset": 2335, - }, - "source": "[1, 2, 3]", - "start": Position { - "column": 31, - "line": 111, - "offset": 2326, - }, - }, - "shortForm": true, - }, - ], - "kind": "call", - "loc": Location { - "end": Position { - "column": 42, - "line": 111, - "offset": 2337, - }, - "source": "([1, 2, 3]);", - "start": Position { - "column": 30, - "line": 111, - "offset": 2325, - }, - }, - "what": PropertyLookup { - "kind": "propertylookup", - "loc": Location { - "end": Position { - "column": 30, - "line": 111, - "offset": 2325, - }, - "source": "->boom", - "start": Position { - "column": 24, - "line": 111, - "offset": 2319, - }, - }, - "offset": ConstRef { - "kind": "constref", - "loc": Location { - "end": Position { - "column": 30, - "line": 111, - "offset": 2325, - }, - "source": "boom", - "start": Position { - "column": 26, - "line": 111, - "offset": 2321, - }, - }, - "name": "boom", - }, - "what": Call { - "arguments": Array [], - "kind": "call", - "loc": Location { - "end": Position { - "column": 24, - "line": 111, - "offset": 2319, - }, - "source": "()", - "start": Position { - "column": 22, - "line": 111, - "offset": 2317, - }, - }, - "what": PropertyLookup { - "kind": "propertylookup", - "loc": Location { - "end": Position { - "column": 22, - "line": 111, - "offset": 2317, - }, - "source": "->crazy", - "start": Position { - "column": 15, - "line": 111, - "offset": 2310, - }, - }, - "offset": ConstRef { - "kind": "constref", - "loc": Location { - "end": Position { - "column": 22, - "line": 111, - "offset": 2317, - }, - "source": "crazy", - "start": Position { - "column": 17, - "line": 111, - "offset": 2312, - }, - }, - "name": "crazy", - }, - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 15, - "line": 111, - "offset": 2310, - }, - "source": "$bipbip", - "start": Position { - "column": 8, - "line": 111, - "offset": 2303, - }, - }, - "name": "bipbip", - }, - }, - }, - }, - }, - ], - "kind": "block", - "loc": Location { - "end": Position { - "column": 7, - "line": 112, - "offset": 2345, - }, - "source": "{ - $bipbip = clone $something; - $bipbip->crazy()->boom([1, 2, 3]); - }", - "start": Position { - "column": 10, - "line": 109, - "offset": 2257, - }, - }, - }, - "catches": Array [ - Catch { - "body": Block { - "children": Array [ - Call { - "arguments": Array [], - "kind": "call", - "loc": Location { - "end": Position { - "column": 31, - "line": 113, - "offset": 2399, - }, - "source": "();", - "start": Position { - "column": 28, - "line": 113, - "offset": 2396, - }, - }, - "what": PropertyLookup { - "kind": "propertylookup", - "loc": Location { - "end": Position { - "column": 28, - "line": 113, - "offset": 2396, - }, - "source": "->printStackTrace", - "start": Position { - "column": 11, - "line": 113, - "offset": 2379, - }, - }, - "offset": ConstRef { - "kind": "constref", - "loc": Location { - "end": Position { - "column": 28, - "line": 113, - "offset": 2396, - }, - "source": "printStackTrace", - "start": Position { - "column": 13, - "line": 113, - "offset": 2381, - }, - }, - "name": "printStackTrace", - }, - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 11, - "line": 113, - "offset": 2379, - }, - "source": "$ex", - "start": Position { - "column": 8, - "line": 113, - "offset": 2376, - }, - }, - "name": "ex", - }, - }, - }, - ], - "kind": "block", - "loc": Location { - "end": Position { - "column": 7, - "line": 114, - "offset": 2407, - }, - "source": "{ - $ex->printStackTrace(); - }", - "start": Position { - "column": 28, - "line": 112, - "offset": 2366, - }, - }, - }, - "kind": "catch", - "loc": Location { - "end": Position { - "column": 7, - "line": 114, - "offset": 2407, - }, - "source": "catch(Coco|Nut $ex) { - $ex->printStackTrace(); - }", - "start": Position { - "column": 8, - "line": 112, - "offset": 2346, - }, - }, - "variable": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 26, - "line": 112, - "offset": 2364, - }, - "source": "$ex", - "start": Position { - "column": 23, - "line": 112, - "offset": 2361, - }, - }, - "name": "ex", - }, - "what": Array [ - Identifier { - "kind": "identifier", - "loc": Location { - "end": Position { - "column": 18, - "line": 112, - "offset": 2356, - }, - "source": "Coco", - "start": Position { - "column": 14, - "line": 112, - "offset": 2352, - }, - }, - "name": "Coco", - "resolution": "uqn", - }, - Identifier { - "kind": "identifier", - "loc": Location { - "end": Position { - "column": 22, - "line": 112, - "offset": 2360, - }, - "source": "Nut", - "start": Position { - "column": 19, - "line": 112, - "offset": 2357, - }, - }, - "name": "Nut", - "resolution": "uqn", - }, - ], - }, - ], - "kind": "try", - "loc": Location { - "end": Position { - "column": 7, - "line": 121, - "offset": 2614, - }, - "source": "try { - $bipbip = clone $something; - $bipbip->crazy()->boom([1, 2, 3]); - } catch(Coco|Nut $ex) { - $ex->printStackTrace(); - } finally { - if (isset($bipbip, $ex)) unset($bipbip, $ex); - return (new class extends fooBar { - function goatIt() { - return \\"meeeh\\"; - } - })->goatIt(); - }", - "start": Position { - "column": 6, - "line": 109, - "offset": 2253, - }, - }, - }, - ], - "kind": "block", - "loc": Location { - "end": Position { - "column": 5, - "line": 122, - "offset": 2620, - }, - "source": "{ - try { - $bipbip = clone $something; - $bipbip->crazy()->boom([1, 2, 3]); - } catch(Coco|Nut $ex) { - $ex->printStackTrace(); - } finally { - if (isset($bipbip, $ex)) unset($bipbip, $ex); - return (new class extends fooBar { - function goatIt() { - return \\"meeeh\\"; - } - })->goatIt(); - } - }", - "start": Position { - "column": 48, - "line": 108, - "offset": 2245, - }, - }, - }, - "kind": "if", - "loc": Location { - "end": Position { - "column": 5, - "line": 129, - "offset": 2837, - }, - "source": "if (!($something instanceof Banana)) { - try { - $bipbip = clone $something; - $bipbip->crazy()->boom([1, 2, 3]); - } catch(Coco|Nut $ex) { - $ex->printStackTrace(); - } finally { - if (isset($bipbip, $ex)) unset($bipbip, $ex); - return (new class extends fooBar { - function goatIt() { - return \\"meeeh\\"; - } - })->goatIt(); - } - } else { - for($i = 0; $i < count($this->banana); $i++) { - $x %= ($i * 2) / ($i - 1); - $what = $this->$x[++$i] ? 'yes!': 'noo!'; - } - // @todo $this->a_$foo - return $$foo ?? false; - }", - "start": Position { - "column": 11, - "line": 108, - "offset": 2208, - }, - }, - "shortForm": false, - "test": Unary { - "kind": "unary", - "loc": Location { - "end": Position { - "column": 46, - "line": 108, - "offset": 2243, - }, - "source": "!($something instanceof Banana)", - "start": Position { - "column": 15, - "line": 108, - "offset": 2212, - }, - }, - "type": "!", - "what": Parenthesis { - "inner": Bin { - "kind": "bin", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 27, - "line": 108, - "offset": 2224, - }, - "source": "$something", - "start": Position { - "column": 17, - "line": 108, - "offset": 2214, - }, - }, - "name": "something", - }, - "loc": Location { - "end": Position { - "column": 45, - "line": 108, - "offset": 2242, - }, - "source": "$something instanceof Banana", - "start": Position { - "column": 17, - "line": 108, - "offset": 2214, - }, - }, - "right": ConstRef { - "kind": "constref", - "loc": Location { - "end": Position { - "column": 45, - "line": 108, - "offset": 2242, - }, - "source": "Banana", - "start": Position { - "column": 39, - "line": 108, - "offset": 2236, - }, - }, - "name": Identifier { - "kind": "identifier", - "loc": Location { - "end": Position { - "column": 45, - "line": 108, - "offset": 2242, - }, - "source": "Banana", - "start": Position { - "column": 39, - "line": 108, - "offset": 2236, - }, - }, - "name": "Banana", - "resolution": "uqn", - }, - }, - "type": "instanceof", - }, - "kind": "parenthesis", - "loc": Location { - "end": Position { - "column": 46, - "line": 108, - "offset": 2243, - }, - "source": "($something instanceof Banana)", - "start": Position { - "column": 16, - "line": 108, - "offset": 2213, - }, - }, - }, - }, - }, - "body": Block { - "children": Array [ - While { - "body": Block { - "children": Array [ - If { - "alternate": Continue { - "kind": "continue", - "level": null, - "loc": Location { - "end": Position { - "column": 24, - "line": 101, - "offset": 2103, - }, - "source": "continue;", - "start": Position { - "column": 15, - "line": 101, - "offset": 2094, - }, - }, - }, - "body": Block { - "children": Array [ - Break { - "kind": "break", - "level": ConstRef { - "kind": "constref", - "loc": Location { - "end": Position { - "column": 19, - "line": 100, - "offset": 2077, - }, - "source": "foo", - "start": Position { - "column": 16, - "line": 100, - "offset": 2074, - }, - }, - "name": Identifier { - "kind": "identifier", - "loc": Location { - "end": Position { - "column": 19, - "line": 100, - "offset": 2077, - }, - "source": "foo", - "start": Position { - "column": 16, - "line": 100, - "offset": 2074, - }, - }, - "name": "foo", - "resolution": "uqn", - }, - }, - "loc": Location { - "end": Position { - "column": 20, - "line": 100, - "offset": 2078, - }, - "source": "break foo;", - "start": Position { - "column": 10, - "line": 100, - "offset": 2068, - }, - }, - }, - ], - "kind": "block", - "loc": Location { - "end": Position { - "column": 9, - "line": 101, - "offset": 2088, - }, - "source": "{ - break foo; - }", - "start": Position { - "column": 50, - "line": 99, - "offset": 2056, - }, - }, - }, - "kind": "if", - "loc": Location { - "end": Position { - "column": 24, - "line": 101, - "offset": 2103, - }, - "source": "if ((int)calculateMeaningOfLife() === 42) { - break foo; - } else continue;", - "start": Position { - "column": 8, - "line": 99, - "offset": 2014, - }, - }, - "shortForm": false, - "test": Cast { - "kind": "cast", - "loc": Location { - "end": Position { - "column": 48, - "line": 99, - "offset": 2054, - }, - "source": "(int)calculateMeaningOfLife() === 42", - "start": Position { - "column": 12, - "line": 99, - "offset": 2018, - }, - }, - "type": "int", - "what": Bin { - "kind": "bin", - "left": Call { - "arguments": Array [], - "kind": "call", - "loc": Location { - "end": Position { - "column": 41, - "line": 99, - "offset": 2047, - }, - "source": "()", - "start": Position { - "column": 39, - "line": 99, - "offset": 2045, - }, - }, - "what": Identifier { - "kind": "identifier", - "loc": Location { - "end": Position { - "column": 39, - "line": 99, - "offset": 2045, - }, - "source": "calculateMeaningOfLife", - "start": Position { - "column": 17, - "line": 99, - "offset": 2023, - }, - }, - "name": "calculateMeaningOfLife", - "resolution": "uqn", - }, - }, - "loc": Location { - "end": Position { - "column": 48, - "line": 99, - "offset": 2054, - }, - "source": "calculateMeaningOfLife() === 42", - "start": Position { - "column": 17, - "line": 99, - "offset": 2023, - }, - }, - "right": Number { - "kind": "number", - "loc": Location { - "end": Position { - "column": 48, - "line": 99, - "offset": 2054, - }, - "source": "42", - "start": Position { - "column": 46, - "line": 99, - "offset": 2052, - }, - }, - "value": "42", - }, - "type": "===", - }, - }, - }, - ], - "kind": "block", - "loc": Location { - "end": Position { - "column": 7, - "line": 102, - "offset": 2111, - }, - "source": "{ - if ((int)calculateMeaningOfLife() === 42) { - break foo; - } else continue; - }", - "start": Position { - "column": 18, - "line": 98, - "offset": 2004, - }, - }, - }, - "kind": "while", - "loc": Location { - "end": Position { - "column": 7, - "line": 102, - "offset": 2111, - }, - "source": "($bar) { - if ((int)calculateMeaningOfLife() === 42) { - break foo; - } else continue; - }", - "start": Position { - "column": 11, - "line": 98, - "offset": 1997, - }, - }, - "shortForm": false, - "test": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 16, - "line": 98, - "offset": 2002, - }, - "source": "$bar", - "start": Position { - "column": 12, - "line": 98, - "offset": 1998, - }, - }, - "name": "bar", - }, - }, - Do { - "body": Block { - "children": Array [ - Inline { - "kind": "inline", - "loc": Location { - "end": Position { - "column": 8, - "line": 106, - "offset": 2169, - }, - "source": " Caesar: here I was - ", - "start": Position { - "column": 0, - "line": 105, - "offset": 2134, - }, - }, - "raw": " - Caesar: here I was - ", - "value": " Caesar: here I was - ", - }, - ], - "kind": "block", - "loc": Location { - "end": Position { - "column": 7, - "line": 107, - "offset": 2182, - }, - "source": "{ - ?> - Caesar: here I was - - Caesar: here I was - - Caesar: here I was - fooBar::NUMBAR) { - while($bar) { - if ((int)calculateMeaningOfLife() === 42) { - break foo; - } else continue; - } - do { - ?> - Caesar: here I was - crazy()->boom([1, 2, 3]); - } catch(Coco|Nut $ex) { - $ex->printStackTrace(); - } finally { - if (isset($bipbip, $ex)) unset($bipbip, $ex); - return (new class extends fooBar { - function goatIt() { - return \\"meeeh\\"; - } - })->goatIt(); - } - } else { - for($i = 0; $i < count($this->banana); $i++) { - $x %= ($i * 2) / ($i - 1); - $what = $this->$x[++$i] ? 'yes!': 'noo!'; - } - // @todo $this->a_$foo - return $$foo ?? false; - }", - "start": Position { - "column": 4, - "line": 97, - "offset": 1958, - }, - }, - "shortForm": false, - "test": Bin { - "kind": "bin", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 11, - "line": 97, - "offset": 1965, - }, - "source": "$bar", - "start": Position { - "column": 7, - "line": 97, - "offset": 1961, - }, - }, - "name": "bar", - }, - "loc": Location { - "end": Position { - "column": 28, - "line": 97, - "offset": 1982, - }, - "source": "$bar > fooBar::NUMBAR", - "start": Position { - "column": 7, - "line": 97, - "offset": 1961, - }, - }, - "right": StaticLookup { - "kind": "staticlookup", - "loc": Location { - "end": Position { - "column": 28, - "line": 97, - "offset": 1982, - }, - "source": "::NUMBAR", - "start": Position { - "column": 20, - "line": 97, - "offset": 1974, - }, - }, - "offset": ConstRef { - "kind": "constref", - "loc": Location { - "end": Position { - "column": 28, - "line": 97, - "offset": 1982, - }, - "source": "NUMBAR", - "start": Position { - "column": 22, - "line": 97, - "offset": 1976, - }, - }, - "name": "NUMBAR", - }, - "what": Identifier { - "kind": "identifier", - "loc": Location { - "end": Position { - "column": 20, - "line": 97, - "offset": 1974, - }, - "source": "fooBar", - "start": Position { - "column": 14, - "line": 97, - "offset": 1968, - }, - }, - "name": "fooBar", - "resolution": "uqn", - }, - }, - "type": ">", - }, - }, - Return { - "expr": Empty { - "arguments": Array [ - ConstRef { - "kind": "constref", - "loc": Location { - "end": Position { - "column": 33, - "line": 130, - "offset": 2871, - }, - "source": "namespace\\\\FOOBAR", - "start": Position { - "column": 17, - "line": 130, - "offset": 2855, - }, - }, - "name": Identifier { - "kind": "identifier", - "loc": Location { - "end": Position { - "column": 33, - "line": 130, - "offset": 2871, - }, - "source": "namespace\\\\FOOBAR", - "start": Position { - "column": 17, - "line": 130, - "offset": 2855, - }, - }, - "name": "FOOBAR", - "resolution": "rn", - }, - }, - ], - "kind": "empty", - "loc": Location { - "end": Position { - "column": 34, - "line": 130, - "offset": 2872, - }, - "source": "empty(namespace\\\\FOOBAR)", - "start": Position { - "column": 11, - "line": 130, - "offset": 2849, - }, - }, - }, - "kind": "return", - "loc": Location { - "end": Position { - "column": 35, - "line": 130, - "offset": 2873, - }, - "source": "return empty(namespace\\\\FOOBAR);", - "start": Position { - "column": 4, - "line": 130, - "offset": 2842, - }, - }, - }, - ], - "kind": "block", - "loc": Location { - "end": Position { - "column": 3, - "line": 131, - "offset": 2877, - }, - "source": "{ - static $banana; - if($bar > fooBar::NUMBAR) { - while($bar) { - if ((int)calculateMeaningOfLife() === 42) { - break foo; - } else continue; - } - do { - ?> - Caesar: here I was - crazy()->boom([1, 2, 3]); - } catch(Coco|Nut $ex) { - $ex->printStackTrace(); - } finally { - if (isset($bipbip, $ex)) unset($bipbip, $ex); - return (new class extends fooBar { - function goatIt() { - return \\"meeeh\\"; - } - })->goatIt(); - } - } else { - for($i = 0; $i < count($this->banana); $i++) { - $x %= ($i * 2) / ($i - 1); - $what = $this->$x[++$i] ? 'yes!': 'noo!'; - } - // @todo $this->a_$foo - return $$foo ?? false; - } - return empty(namespace\\\\FOOBAR); - }", - "start": Position { - "column": 57, - "line": 95, - "offset": 1932, - }, - }, - }, - "byref": false, - "isStatic": false, - "kind": "closure", - "loc": Location { - "end": Position { - "column": 3, - "line": 131, - "offset": 2877, - }, - "source": "function(?int $bar = 42) use($something) : bool", - "start": Position { - "column": 9, - "line": 95, - "offset": 1884, - }, - }, - "nullable": false, - "type": Identifier { - "kind": "identifier", - "loc": Location { - "end": Position { - "column": 56, - "line": 95, - "offset": 1931, - }, - "source": "bool", - "start": Position { - "column": 52, - "line": 95, - "offset": 1927, - }, - }, - "name": "bool", - "resolution": "uqn", - }, - "uses": Array [ - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 48, - "line": 95, - "offset": 1923, - }, - "source": "$something", - "start": Position { - "column": 38, - "line": 95, - "offset": 1913, - }, - }, - "name": "something", - }, - ], - }, - }, - If { - "alternate": If { - "alternate": null, - "body": Block { - "children": Array [ - Echo { - "arguments": Array [ - Encapsed { - "kind": "encapsed", - "loc": Location { - "end": Position { - "column": 20, - "line": 136, - "offset": 2947, - }, - "source": "ls -larth\`", - "start": Position { - "column": 10, - "line": 136, - "offset": 2937, - }, - }, - "raw": "\`ls -larth\`", - "type": "shell", - "value": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "loc": Location { - "end": Position { - "column": 19, - "line": 136, - "offset": 2946, - }, - "source": "ls -larth", - "start": Position { - "column": 10, - "line": 136, - "offset": 2937, - }, - }, - "raw": "ls -larth", - "unicode": false, - "value": "ls -larth", - }, - ], - }, - ], - "kind": "echo", - "loc": Location { - "end": Position { - "column": 21, - "line": 136, - "offset": 2948, - }, - "source": "echo \`ls -larth\`;", - "start": Position { - "column": 4, - "line": 136, - "offset": 2931, - }, - }, - "shortForm": false, - }, - ], - "kind": "block", - "loc": Location { - "end": Position { - "column": 21, - "line": 136, - "offset": 2948, - }, - "source": "echo \`ls -larth\`;", - "start": Position { - "column": 4, - "line": 136, - "offset": 2931, - }, - }, - }, - "kind": "if", - "loc": Location { - "end": Position { - "column": 21, - "line": 136, - "offset": 2948, - }, - "source": "elseif ($bar): - echo \`ls -larth\`;", - "start": Position { - "column": 2, - "line": 135, - "offset": 2912, - }, - }, - "shortForm": true, - "test": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 14, - "line": 135, - "offset": 2924, - }, - "source": "$bar", - "start": Position { - "column": 10, - "line": 135, - "offset": 2920, - }, - }, - "name": "bar", - }, - }, - "body": Block { - "children": Array [ - Echo { - "arguments": Array [ - Encapsed { - "kind": "encapsed", - "loc": Location { - "end": Position { - "column": 15, - "line": 134, - "offset": 2908, - }, - "source": "bar&\`", - "start": Position { - "column": 10, - "line": 134, - "offset": 2903, - }, - }, - "raw": "\`bar&\`", - "type": "shell", - "value": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "loc": Location { - "end": Position { - "column": 14, - "line": 134, - "offset": 2907, - }, - "source": "bar&", - "start": Position { - "column": 10, - "line": 134, - "offset": 2903, - }, - }, - "raw": "bar&", - "unicode": false, - "value": "bar&", - }, - ], - }, - ], - "kind": "echo", - "loc": Location { - "end": Position { - "column": 16, - "line": 134, - "offset": 2909, - }, - "source": "echo \`bar&\`;", - "start": Position { - "column": 4, - "line": 134, - "offset": 2897, - }, - }, - "shortForm": false, - }, - ], - "kind": "block", - "loc": Location { - "end": Position { - "column": 21, - "line": 136, - "offset": 2948, - }, - "source": "echo \`bar&\`; - elseif ($bar): - echo \`ls -larth\`;", - "start": Position { - "column": 4, - "line": 134, - "offset": 2897, - }, - }, - }, - "kind": "if", - "loc": Location { - "end": Position { - "column": 8, - "line": 137, - "offset": 2957, - }, - "source": "if ($foo): - echo \`bar&\`; - elseif ($bar): - echo \`ls -larth\`; - endif;", - "start": Position { - "column": 2, - "line": 133, - "offset": 2882, - }, - }, - "shortForm": true, - "test": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 10, - "line": 133, - "offset": 2890, - }, - "source": "$foo", - "start": Position { - "column": 6, - "line": 133, - "offset": 2886, - }, - }, - "name": "foo", - }, - }, - Assign { - "kind": "assign", - "left": List { - "arguments": Array [ - null, - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 10, - "line": 140, - "offset": 2987, - }, - "source": "$a", - "start": Position { - "column": 8, - "line": 140, - "offset": 2985, - }, - }, - "name": "a", - }, - List { - "arguments": Array [ - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 19, - "line": 140, - "offset": 2996, - }, - "source": "$b", - "start": Position { - "column": 17, - "line": 140, - "offset": 2994, - }, - }, - "name": "b", - }, - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 23, - "line": 140, - "offset": 3000, - }, - "source": "$c", - "start": Position { - "column": 21, - "line": 140, - "offset": 2998, - }, - }, - "name": "c", - }, - ], - "kind": "list", - "loc": Location { - "end": Position { - "column": 24, - "line": 140, - "offset": 3001, - }, - "source": "list($b, $c)", - "start": Position { - "column": 12, - "line": 140, - "offset": 2989, - }, - }, - "shortForm": false, - }, - ], - "kind": "list", - "loc": Location { - "end": Position { - "column": 25, - "line": 140, - "offset": 3002, - }, - "source": "list(,$a, list($b, $c))", - "start": Position { - "column": 2, - "line": 140, - "offset": 2979, - }, - }, - "shortForm": false, - }, - "loc": Location { - "end": Position { - "column": 40, - "line": 140, - "offset": 3017, - }, - "source": "list(,$a, list($b, $c)) = [1, [2, 3]];", - "start": Position { - "column": 2, - "line": 140, - "offset": 2979, - }, - }, - "operator": "=", - "right": Array { - "items": Array [ - Number { - "kind": "number", - "loc": Location { - "end": Position { - "column": 30, - "line": 140, - "offset": 3007, - }, - "source": "1", - "start": Position { - "column": 29, - "line": 140, - "offset": 3006, - }, - }, - "value": "1", - }, - Array { - "items": Array [ - Number { - "kind": "number", - "loc": Location { - "end": Position { - "column": 34, - "line": 140, - "offset": 3011, - }, - "source": "2", - "start": Position { - "column": 33, - "line": 140, - "offset": 3010, - }, - }, - "value": "2", - }, - Number { - "kind": "number", - "loc": Location { - "end": Position { - "column": 37, - "line": 140, - "offset": 3014, - }, - "source": "3", - "start": Position { - "column": 36, - "line": 140, - "offset": 3013, - }, - }, - "value": "3", - }, - ], - "kind": "array", - "loc": Location { - "end": Position { - "column": 38, - "line": 140, - "offset": 3015, - }, - "source": "[2, 3]", - "start": Position { - "column": 32, - "line": 140, - "offset": 3009, - }, - }, - "shortForm": true, - }, - ], - "kind": "array", - "loc": Location { - "end": Position { - "column": 39, - "line": 140, - "offset": 3016, - }, - "source": "[1, [2, 3]]", - "start": Position { - "column": 28, - "line": 140, - "offset": 3005, - }, - }, - "shortForm": true, - }, - }, - Assign { - "kind": "assign", - "left": List { - "arguments": Array [ - null, - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 6, - "line": 141, - "offset": 3024, - }, - "source": "$a", - "start": Position { - "column": 4, - "line": 141, - "offset": 3022, - }, - }, - "name": "a", - }, - Array { - "items": Array [ - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 10, - "line": 141, - "offset": 3028, - }, - "source": "$b", - "start": Position { - "column": 8, - "line": 141, - "offset": 3026, - }, - }, - "name": "b", - }, - null, - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 15, - "line": 141, - "offset": 3033, - }, - "source": "$c", - "start": Position { - "column": 13, - "line": 141, - "offset": 3031, - }, - }, - "name": "c", - }, - ], - "kind": "array", - "loc": Location { - "end": Position { - "column": 16, - "line": 141, - "offset": 3034, - }, - "source": "[$b, ,$c]", - "start": Position { - "column": 7, - "line": 141, - "offset": 3025, - }, - }, - "shortForm": true, - }, - ], - "kind": "list", - "loc": Location { - "end": Position { - "column": 17, - "line": 141, - "offset": 3035, - }, - "source": "[,$a,[$b, ,$c]]", - "start": Position { - "column": 2, - "line": 141, - "offset": 3020, - }, - }, - "shortForm": true, - }, - "loc": Location { - "end": Position { - "column": 23, - "line": 141, - "offset": 3041, - }, - "source": "[,$a,[$b, ,$c]] = $f;", - "start": Position { - "column": 2, - "line": 141, - "offset": 3020, - }, - }, - "operator": "=", - "right": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 22, - "line": 141, - "offset": 3040, - }, - "source": "$f", - "start": Position { - "column": 20, - "line": 141, - "offset": 3038, - }, - }, - "name": "f", - }, - }, - Print { - "arguments": Parenthesis { - "inner": Encapsed { - "kind": "encapsed", - "label": "BAZ", - "loc": Location { - "end": Position { - "column": 3, - "line": 144, - "offset": 3074, - }, - "source": " Hello world -BAZ", - "start": Position { - "column": 0, - "line": 143, - "offset": 3057, - }, - }, - "raw": " - Hello world -BAZ -", - "type": "heredoc", - "value": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "loc": Location { - "end": Position { - "column": 0, - "line": 144, - "offset": 3071, - }, - "source": " Hello world -", - "start": Position { - "column": 0, - "line": 143, - "offset": 3057, - }, - }, - "raw": " Hello world -", - "unicode": false, - "value": " Hello world -", - }, - ], - }, - "kind": "parenthesis", - "loc": Location { - "end": Position { - "column": 1, - "line": 145, - "offset": 3076, - }, - "source": "(<<Hello 'achoum', - 'bashful' => 'tadah' - ]; - /** - * Something is done here - */ - final public function doSomething() { - // do not wanna do - foreach($this->dwarf as $name => $greeting) { - echo \\"Hey ho $name, $greeting !\\"; - continue $foo; - } - throw new \\\\ComeToHome('Thats it'); - } - } - - interface Miror extends Object { - public function Am_I_Uggly() : bool; - protected function broken() : bool; - static protected function isWhiteSnowAlive() : bool; - } - - function iter() { - yield 'ator' => $foo; - yield from iter(50); - } - - trait Line { - public function draw(bool $arrow = false) : string { - switch($this->style) { - case 'dot': - case 'point': - $body = '......'; - break; - default: - $body = '-----'; - break; - } - return $body . ($arrow ? '>' : ''); - } - private function shuut() { - return __NAMESPACE__; - } - } - - // this is SPARTA ! - function sparta() : ?int { - global $persians; - - $index = -1; -next: - $guy = $persians[++$index]; - if(rand(0, 10)>5 || false) { - @$guy->kill(); - } else { - $guy->kick(...$foo); - } - if ((int)$index < count($persians)) goto next; - - return 300 | 5; - } - - $foo = function(?int $bar = 42) use($something) : bool { - static $banana; - if($bar > fooBar::NUMBAR) { - while($bar) { - if ((int)calculateMeaningOfLife() === 42) { - break foo; - } else continue; - } - do { - ?> - Caesar: here I was - crazy()->boom([1, 2, 3]); - } catch(Coco|Nut $ex) { - $ex->printStackTrace(); - } finally { - if (isset($bipbip, $ex)) unset($bipbip, $ex); - return (new class extends fooBar { - function goatIt() { - return \\"meeeh\\"; - } - })->goatIt(); - } - } else { - for($i = 0; $i < count($this->banana); $i++) { - $x %= ($i * 2) / ($i - 1); - $what = $this->$x[++$i] ? 'yes!': 'noo!'; - } - // @todo $this->a_$foo - return $$foo ?? false; - } - return empty(namespace\\\\FOOBAR); - }; - - if ($foo): - echo \`bar&\`; - elseif ($bar): - echo \`ls -larth\`; - endif; - - // list version - list(,$a, list($b, $c)) = [1, [2, 3]]; - [,$a,[$b, ,$c]] = $f; - print(<<a_$foo -", - "start": Position { - "column": 6, - "line": 127, - "offset": 2780, - }, - }, - "value": "// @todo $this->a_$foo -", - }, - CommentLine { - "kind": "commentline", - "loc": Location { - "end": Position { - "column": 0, - "line": 140, - "offset": 2977, - }, - "source": "// list version -", - "start": Position { - "column": 2, - "line": 139, - "offset": 2961, - }, - }, - "value": "// list version -", - }, - ], - "errors": Array [], - "kind": "program", - "loc": Location { - "end": Position { - "column": 18, - "line": 156, - "offset": 3191, - }, - "source": "#!/usr/bin/php - -Hello 'achoum', - 'bashful' => 'tadah' - ]; - /** - * Something is done here - */ - final public function doSomething() { - // do not wanna do - foreach($this->dwarf as $name => $greeting) { - echo \\"Hey ho $name, $greeting !\\"; - continue $foo; - } - throw new \\\\ComeToHome('Thats it'); - } - } - - interface Miror extends Object { - public function Am_I_Uggly() : bool; - protected function broken() : bool; - static protected function isWhiteSnowAlive() : bool; - } - - function iter() { - yield 'ator' => $foo; - yield from iter(50); - } - - trait Line { - public function draw(bool $arrow = false) : string { - switch($this->style) { - case 'dot': - case 'point': - $body = '......'; - break; - default: - $body = '-----'; - break; - } - return $body . ($arrow ? '>' : ''); - } - private function shuut() { - return __NAMESPACE__; - } - } - - // this is SPARTA ! - function sparta() : ?int { - global $persians; - - $index = -1; -next: - $guy = $persians[++$index]; - if(rand(0, 10)>5 || false) { - @$guy->kill(); - } else { - $guy->kick(...$foo); - } - if ((int)$index < count($persians)) goto next; - - return 300 | 5; - } - - $foo = function(?int $bar = 42) use($something) : bool { - static $banana; - if($bar > fooBar::NUMBAR) { - while($bar) { - if ((int)calculateMeaningOfLife() === 42) { - break foo; - } else continue; - } - do { - ?> - Caesar: here I was - crazy()->boom([1, 2, 3]); - } catch(Coco|Nut $ex) { - $ex->printStackTrace(); - } finally { - if (isset($bipbip, $ex)) unset($bipbip, $ex); - return (new class extends fooBar { - function goatIt() { - return \\"meeeh\\"; - } - })->goatIt(); - } - } else { - for($i = 0; $i < count($this->banana); $i++) { - $x %= ($i * 2) / ($i - 1); - $what = $this->$x[++$i] ? 'yes!': 'noo!'; - } - // @todo $this->a_$foo - return $$foo ?? false; - } - return empty(namespace\\\\FOOBAR); - }; - - if ($foo): - echo \`bar&\`; - elseif ($bar): - echo \`ls -larth\`; - endif; - - // list version - list(,$a, list($b, $c)) = [1, [2, 3]]; - [,$a,[$b, ,$c]] = $f; - print(<<?>", - "value": "?>?>", - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test AST structure test clone 1`] = ` -Program { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": Clone { - "kind": "clone", - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "var", - }, - }, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test AST structure test coalesce operator 1`] = ` -Program { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "var", - }, - "operator": "=", - "right": Bin { - "kind": "bin", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "right": Boolean { - "kind": "boolean", - "raw": "true", - "value": true, - }, - "type": "??", - }, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test AST structure test constants 1`] = ` -Program { - "children": Array [ - Constant { - "kind": "constant", - "name": "FOO", - "value": Number { - "kind": "number", - "value": "3.14", - }, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test AST structure test die/exit 1`] = ` -Program { - "children": Array [ - Exit { - "kind": "exit", - "status": String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"bye\\"", - "unicode": false, - "value": "bye", - }, - "useDie": true, - }, - Exit { - "kind": "exit", - "status": Number { - "kind": "number", - "value": "-1", - }, - "useDie": false, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test AST structure test echo, isset, unset, empty 1`] = ` -Program { - "children": Array [ - Echo { - "arguments": Array [ - RetIf { - "falseExpr": String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"ko\\"", - "unicode": false, - "value": "ko", - }, - "kind": "retif", - "test": Parenthesis { - "inner": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "expr", - }, - "kind": "parenthesis", - }, - "trueExpr": String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"ok\\"", - "unicode": false, - "value": "ok", - }, - }, - ], - "kind": "echo", - "shortForm": false, - }, - Print { - "arguments": String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"some text\\"", - "unicode": false, - "value": "some text", - }, - "kind": "print", - }, - Isset { - "arguments": Array [ - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "foo", - }, - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "bar", - }, - ], - "kind": "isset", - }, - Unset { - "arguments": Array [ - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "var", - }, - ], - "kind": "unset", - }, - Empty { - "arguments": Array [ - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "var", - }, - ], - "kind": "empty", - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test AST structure test eval 1`] = ` -Program { - "children": Array [ - Eval { - "kind": "eval", - "source": String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"return true;\\"", - "unicode": false, - "value": "return true;", - }, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test AST structure test include / require 1`] = ` -Program { - "children": Array [ - Include { - "kind": "include", - "once": false, - "require": false, - "target": String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"file.php\\"", - "unicode": false, - "value": "file.php", - }, - }, - Include { - "kind": "include", - "once": true, - "require": false, - "target": Parenthesis { - "inner": Bin { - "kind": "bin", - "left": ConstRef { - "kind": "constref", - "name": Identifier { - "kind": "identifier", - "name": "PATH", - "resolution": "uqn", - }, - }, - "right": String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"/file.php\\"", - "unicode": false, - "value": "/file.php", - }, - "type": ".", - }, - "kind": "parenthesis", - }, - }, - Include { - "kind": "include", - "once": false, - "require": true, - "target": String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"req.php\\"", - "unicode": false, - "value": "req.php", - }, - }, - Include { - "kind": "include", - "once": true, - "require": true, - "target": String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"file.php\\"", - "unicode": false, - "value": "file.php", - }, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test AST structure test inline 1`] = ` -Program { - "children": Array [ - Inline { - "kind": "inline", - "raw": "Hello ", - "value": "Hello ", - }, - Echo { - "arguments": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "'World'", - "unicode": false, - "value": "World", - }, - ], - "kind": "echo", - "shortForm": false, - }, - Inline { - "kind": "inline", - "raw": " - !", - "value": " !", - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test AST structure test magics 1`] = ` -Program { - "children": Array [ - Echo { - "arguments": Array [ - Magic { - "kind": "magic", - "raw": "__FILE__", - "value": "__FILE__", - }, - Magic { - "kind": "magic", - "raw": "__DIR__", - "value": "__DIR__", - }, - ], - "kind": "echo", - "shortForm": false, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test AST structure test program 1`] = ` -Program { - "children": Array [], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test AST structure test shell 1`] = ` -Program { - "children": Array [ - Echo { - "arguments": Array [ - Encapsed { - "kind": "encapsed", - "raw": "\`ls -larth\`", - "type": "shell", - "value": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "ls -larth", - "unicode": false, - "value": "ls -larth", - }, - ], - }, - ], - "kind": "echo", - "shortForm": false, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test AST structure test syntax error 1`] = `"Parse Error : syntax error, unexpected '$b' (T_VARIABLE), expecting ';' on line 3"`; diff --git a/test/snapshot/__snapshots__/buffer.test.js.snap b/test/snapshot/__snapshots__/buffer.test.js.snap deleted file mode 100644 index d5ecae39b..000000000 --- a/test/snapshot/__snapshots__/buffer.test.js.snap +++ /dev/null @@ -1,23 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Test buffers handles buffers as input 1`] = ` -Program { - "children": Array [ - Echo { - "arguments": Array [ - String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"test\\"", - "unicode": false, - "value": "test", - }, - ], - "kind": "echo", - "shortForm": false, - }, - ], - "errors": Array [], - "kind": "program", -} -`; diff --git a/test/snapshot/__snapshots__/class.test.js.snap b/test/snapshot/__snapshots__/class.test.js.snap deleted file mode 100644 index 6252efbcc..000000000 --- a/test/snapshot/__snapshots__/class.test.js.snap +++ /dev/null @@ -1,833 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Test classes Advanced tests 1`] = ` -Program { - "children": Array [ - Class { - "body": Array [ - TraitUse { - "adaptations": null, - "kind": "traituse", - "traits": Array [ - Identifier { - "kind": "identifier", - "name": "A", - "resolution": "uqn", - }, - ], - }, - TraitUse { - "adaptations": Array [ - TraitAlias { - "as": "bar", - "kind": "traitalias", - "method": "foo", - "trait": null, - "visibility": "", - }, - ], - "kind": "traituse", - "traits": Array [ - Identifier { - "kind": "identifier", - "name": "B", - "resolution": "uqn", - }, - ], - }, - Property { - "isAbstract": false, - "isFinal": false, - "isStatic": false, - "kind": "property", - "leadingComments": Array [ - CommentLine { - "kind": "commentline", - "value": "// comment -", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* boo */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/** doc - * data - foo - */", - }, - ], - "name": "var", - "value": Boolean { - "kind": "boolean", - "raw": "true", - "value": true, - }, - "visibility": "public", - }, - Method { - "arguments": Array [], - "body": Block { - "children": Array [], - "kind": "block", - }, - "byref": false, - "isAbstract": false, - "isFinal": true, - "isStatic": false, - "kind": "method", - "name": "__construct", - "nullable": false, - "type": null, - "visibility": "", - }, - Method { - "arguments": Array [], - "body": Block { - "children": Array [], - "kind": "block", - }, - "byref": false, - "isAbstract": false, - "isFinal": false, - "isStatic": false, - "kind": "method", - "name": "boo", - "nullable": false, - "type": null, - "visibility": "private", - }, - ], - "extends": null, - "implements": Array [ - Identifier { - "kind": "identifier", - "name": "boo", - "resolution": "uqn", - }, - ], - "isAbstract": false, - "isAnonymous": false, - "isFinal": false, - "kind": "class", - "name": "foo", - }, - Interface { - "body": Array [ - ClassConstant { - "isAbstract": false, - "isFinal": false, - "isStatic": false, - "kind": "classconstant", - "leadingComments": Array [ - CommentLine { - "kind": "commentline", - "value": "// some doc -", - }, - ], - "name": "A", - "value": Number { - "kind": "number", - "value": "1.5", - }, - "visibility": "", - }, - Method { - "arguments": Array [], - "body": null, - "byref": false, - "isAbstract": false, - "isFinal": false, - "isStatic": false, - "kind": "method", - "leadingComments": Array [ - CommentBlock { - "kind": "commentblock", - "value": "/** foo */", - }, - ], - "name": "foo", - "nullable": false, - "type": null, - "visibility": "protected", - }, - ], - "extends": Array [ - Identifier { - "kind": "identifier", - "name": "something", - "resolution": "uqn", - }, - ], - "kind": "interface", - "name": "boo", - }, - Trait { - "body": Array [ - ClassConstant { - "isAbstract": false, - "isFinal": false, - "isStatic": false, - "kind": "classconstant", - "leadingComments": Array [ - CommentLine { - "kind": "commentline", - "value": "// some doc -", - }, - ], - "name": "A", - "value": Number { - "kind": "number", - "value": "1.5", - }, - "visibility": "", - }, - Method { - "arguments": Array [], - "body": null, - "byref": false, - "isAbstract": true, - "isFinal": false, - "isStatic": false, - "kind": "method", - "name": "foo", - "nullable": false, - "type": null, - "visibility": "protected", - }, - ], - "extends": Identifier { - "kind": "identifier", - "name": "foo", - "resolution": "uqn", - }, - "implements": Array [ - Identifier { - "kind": "identifier", - "name": "boo", - "resolution": "uqn", - }, - ], - "kind": "trait", - "name": "line", - }, - ], - "comments": Array [ - CommentLine { - "kind": "commentline", - "value": "// comment -", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* boo */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/** doc - * data - foo - */", - }, - CommentLine { - "kind": "commentline", - "value": "// some doc -", - }, - CommentBlock { - "kind": "commentblock", - "value": "/** foo */", - }, - CommentLine { - "kind": "commentline", - "value": "// some doc -", - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test classes Test js properties 1`] = ` -Program { - "children": Array [ - Class { - "body": Array [ - Property { - "isAbstract": false, - "isFinal": false, - "isStatic": true, - "kind": "property", - "name": "constructor", - "value": null, - "visibility": "", - }, - Method { - "arguments": Array [], - "body": Block { - "children": Array [], - "kind": "block", - }, - "byref": false, - "isAbstract": false, - "isFinal": false, - "isStatic": false, - "kind": "method", - "name": "constructor", - "nullable": false, - "type": null, - "visibility": "public", - }, - Method { - "arguments": Array [], - "body": Block { - "children": Array [ - Assign { - "kind": "assign", - "left": PropertyLookup { - "kind": "propertylookup", - "offset": ConstRef { - "kind": "constref", - "name": "constructor", - }, - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "this", - }, - }, - "operator": "=", - "right": ConstRef { - "kind": "constref", - "name": Identifier { - "kind": "identifier", - "name": "null", - "resolution": "uqn", - }, - }, - }, - Assign { - "kind": "assign", - "left": StaticLookup { - "kind": "staticlookup", - "offset": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "constructor", - }, - "what": Identifier { - "kind": "identifier", - "name": "self", - "resolution": "uqn", - }, - }, - "operator": "=", - "right": ConstRef { - "kind": "constref", - "name": Identifier { - "kind": "identifier", - "name": "null", - "resolution": "uqn", - }, - }, - }, - ], - "kind": "block", - }, - "byref": false, - "isAbstract": false, - "isFinal": false, - "isStatic": false, - "kind": "method", - "name": "__proto__", - "nullable": false, - "type": null, - "visibility": "public", - }, - ], - "extends": null, - "implements": null, - "isAbstract": false, - "isAnonymous": false, - "isFinal": false, - "kind": "class", - "name": "__proto__", - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test classes Test of silent mode 1`] = ` -Program { - "children": Array [ - Class { - "body": Array [ - TraitUse { - "adaptations": null, - "kind": "traituse", - "traits": Array [ - Identifier { - "kind": "identifier", - "name": "A", - "resolution": "uqn", - }, - ], - }, - TraitUse { - "adaptations": Array [ - TraitAlias { - "as": null, - "kind": "traitalias", - "method": "foo", - "trait": null, - "visibility": "", - }, - TraitAlias { - "as": null, - "kind": "traitalias", - "method": "", - "trait": null, - "visibility": "", - }, - ], - "kind": "traituse", - "traits": Array [ - Identifier { - "kind": "identifier", - "name": "B", - "resolution": "uqn", - }, - ], - }, - ], - "extends": null, - "implements": null, - "isAbstract": false, - "isAnonymous": false, - "isFinal": false, - "kind": "class", - "name": "foo", - }, - ], - "errors": Array [ - Error { - "expected": ";", - "kind": "error", - "line": 4, - "message": "Parse Error : syntax error, unexpected 'use' (T_USE), expecting ';' on line 4", - "token": "'use' (T_USE)", - }, - Error { - "expected": Array [ - 119, - 200, - ], - "kind": "error", - "line": 4, - "message": "Parse Error : syntax error, unexpected '}' on line 4", - "token": "'}'", - }, - Error { - "expected": ";", - "kind": "error", - "line": 4, - "message": "Parse Error : syntax error, unexpected '}', expecting ';' on line 4", - "token": "'}'", - }, - Error { - "expected": 105, - "kind": "error", - "line": 4, - "message": "Parse Error : syntax error, unexpected ';', expecting T_STRING on line 4", - "token": "';'", - }, - Error { - "expected": Array [ - 119, - 200, - ], - "kind": "error", - "line": 4, - "message": "Parse Error : syntax error, unexpected ';' on line 4", - "token": "';'", - }, - Error { - "expected": "}", - "kind": "error", - "line": 5, - "message": "Parse Error : syntax error, expecting '}' on line 5", - "token": "the end of file (EOF)", - }, - ], - "kind": "program", -} -`; - -exports[`Test classes Validate usual declarations 1`] = ` -Program { - "children": Array [ - Class { - "body": Array [ - ClassConstant { - "isAbstract": false, - "isFinal": false, - "isStatic": false, - "kind": "classconstant", - "name": "FOO", - "value": String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"azerty\\"", - "unicode": false, - "value": "azerty", - }, - "visibility": "", - }, - Property { - "isAbstract": false, - "isFinal": false, - "isStatic": true, - "kind": "property", - "name": "var", - "value": null, - "visibility": "public", - }, - Method { - "arguments": Array [ - Parameter { - "byref": false, - "kind": "parameter", - "name": "data", - "nullable": false, - "type": Identifier { - "kind": "identifier", - "name": "\\\\array", - "resolution": "fqn", - }, - "value": ConstRef { - "kind": "constref", - "name": Identifier { - "kind": "identifier", - "name": "null", - "resolution": "uqn", - }, - }, - "variadic": false, - }, - ], - "body": Block { - "children": Array [ - Assign { - "kind": "assign", - "left": PropertyLookup { - "kind": "propertylookup", - "offset": ConstRef { - "kind": "constref", - "name": "data", - }, - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "this", - }, - }, - "operator": "=", - "right": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "data", - }, - }, - ], - "kind": "block", - }, - "byref": false, - "isAbstract": false, - "isFinal": false, - "isStatic": false, - "kind": "method", - "name": "__construct", - "nullable": false, - "type": null, - "visibility": "public", - }, - ClassConstant { - "isAbstract": false, - "isFinal": false, - "isStatic": false, - "kind": "classconstant", - "name": "list", - "value": String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"bar\\"", - "unicode": false, - "value": "bar", - }, - "visibility": "", - }, - Method { - "arguments": Array [ - Parameter { - "byref": false, - "kind": "parameter", - "name": "foo", - "nullable": false, - "type": null, - "value": StaticLookup { - "kind": "staticlookup", - "offset": ConstRef { - "kind": "constref", - "name": "list", - }, - "what": Identifier { - "kind": "identifier", - "name": "self", - "resolution": "uqn", - }, - }, - "variadic": false, - }, - ], - "body": Block { - "children": Array [ - Return { - "expr": StaticLookup { - "kind": "staticlookup", - "offset": ConstRef { - "kind": "constref", - "name": "list", - }, - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "this", - }, - }, - "kind": "return", - }, - ], - "kind": "block", - }, - "byref": false, - "isAbstract": false, - "isFinal": false, - "isStatic": false, - "kind": "method", - "name": "new", - "nullable": false, - "type": null, - "visibility": "public", - }, - Property { - "isAbstract": false, - "isFinal": false, - "isStatic": false, - "kind": "property", - "name": "foo", - "value": null, - "visibility": "protected", - }, - Property { - "isAbstract": false, - "isFinal": false, - "isStatic": false, - "kind": "property", - "name": "bar", - "value": null, - "visibility": "private", - }, - Method { - "arguments": Array [], - "body": Block { - "children": Array [], - "kind": "block", - }, - "byref": false, - "isAbstract": false, - "isFinal": false, - "isStatic": false, - "kind": "method", - "name": "foobar", - "nullable": false, - "type": null, - "visibility": "", - }, - ], - "extends": Identifier { - "kind": "identifier", - "name": "bar", - "resolution": "uqn", - }, - "implements": Array [ - Identifier { - "kind": "identifier", - "name": "bim", - "resolution": "uqn", - }, - Identifier { - "kind": "identifier", - "name": "bam", - "resolution": "uqn", - }, - Identifier { - "kind": "identifier", - "name": "boum", - "resolution": "uqn", - }, - ], - "isAbstract": false, - "isAnonymous": false, - "isFinal": true, - "kind": "class", - "name": "foo", - }, - Class { - "body": Array [ - TraitUse { - "adaptations": Array [ - TraitPrecedence { - "instead": Array [ - Identifier { - "kind": "identifier", - "name": "A", - "resolution": "uqn", - }, - ], - "kind": "traitprecedence", - "method": "smallTalk", - "trait": Identifier { - "kind": "identifier", - "name": "B", - "resolution": "uqn", - }, - }, - TraitPrecedence { - "instead": Array [ - Identifier { - "kind": "identifier", - "name": "B", - "resolution": "uqn", - }, - Identifier { - "kind": "identifier", - "name": "C", - "resolution": "uqn", - }, - ], - "kind": "traitprecedence", - "method": "bigTalk", - "trait": Identifier { - "kind": "identifier", - "name": "A", - "resolution": "uqn", - }, - }, - TraitAlias { - "as": "talk", - "kind": "traitalias", - "method": "bigTalk", - "trait": Identifier { - "kind": "identifier", - "name": "B", - "resolution": "uqn", - }, - "visibility": "public", - }, - TraitAlias { - "as": "talk", - "kind": "traitalias", - "method": "bigTalk", - "trait": Identifier { - "kind": "identifier", - "name": "B", - "resolution": "uqn", - }, - "visibility": "protected", - }, - TraitAlias { - "as": "talk", - "kind": "traitalias", - "method": "bigTalk", - "trait": Identifier { - "kind": "identifier", - "name": "B", - "resolution": "uqn", - }, - "visibility": "private", - }, - TraitAlias { - "as": "list", - "kind": "traitalias", - "method": "new", - "trait": Identifier { - "kind": "identifier", - "name": "A", - "resolution": "uqn", - }, - "visibility": "", - }, - TraitAlias { - "as": "new", - "kind": "traitalias", - "method": "list", - "trait": null, - "visibility": "", - }, - ], - "kind": "traituse", - "traits": Array [ - Identifier { - "kind": "identifier", - "name": "A", - "resolution": "uqn", - }, - Identifier { - "kind": "identifier", - "name": "B", - "resolution": "uqn", - }, - ], - }, - Method { - "arguments": Array [], - "body": null, - "byref": true, - "isAbstract": true, - "isFinal": false, - "isStatic": false, - "kind": "method", - "name": "foo", - "nullable": false, - "type": Identifier { - "kind": "identifier", - "name": "bar", - "resolution": "uqn", - }, - "visibility": "protected", - }, - ], - "extends": null, - "implements": null, - "isAbstract": true, - "isAnonymous": false, - "isFinal": false, - "kind": "class", - "name": "bar", - }, - ], - "errors": Array [], - "kind": "program", -} -`; diff --git a/test/snapshot/__snapshots__/comment.test.js.snap b/test/snapshot/__snapshots__/comment.test.js.snap deleted file mode 100644 index 9514263cb..000000000 --- a/test/snapshot/__snapshots__/comment.test.js.snap +++ /dev/null @@ -1,850 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Test comments issues fix #55 1`] = ` -Program { - "children": Array [ - If { - "alternate": null, - "body": Block { - "children": Array [ - If { - "alternate": null, - "body": Block { - "children": Array [], - "kind": "block", - "leadingComments": Array [ - CommentLine { - "kind": "commentline", - "value": "// inner statements -", - }, - ], - }, - "kind": "if", - "shortForm": true, - "test": Boolean { - "kind": "boolean", - "raw": "true", - "value": true, - }, - }, - ], - "kind": "block", - }, - "kind": "if", - "shortForm": true, - "test": Boolean { - "kind": "boolean", - "raw": "true", - "value": true, - }, - }, - ], - "comments": Array [ - CommentLine { - "kind": "commentline", - "value": "// inner statements -", - }, - CommentLine { - "kind": "commentline", - "value": "// another comment -", - }, - CommentLine { - "kind": "commentline", - "value": "// 2nd comment -", - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test comments issues fix #126 : new option 1`] = ` -Program { - "children": Array [ - If { - "alternate": If { - "alternate": null, - "body": Block { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": Number { - "kind": "number", - "value": "2", - }, - }, - ], - "kind": "block", - }, - "kind": "if", - "leadingComments": Array [ - CommentLine { - "kind": "commentline", - "value": "// Don't parsed :( -", - }, - ], - "shortForm": false, - "test": Boolean { - "kind": "boolean", - "raw": "false", - "value": false, - }, - }, - "body": Block { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": Number { - "kind": "number", - "value": "1", - }, - }, - ], - "kind": "block", - }, - "kind": "if", - "shortForm": false, - "test": Boolean { - "kind": "boolean", - "raw": "true", - "value": true, - }, - }, - ], - "comments": Array [ - CommentLine { - "kind": "commentline", - "value": "// Don't parsed :( -", - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test comments multi line comments test function 1`] = ` -Program { - "children": Array [ - _Function { - "arguments": Array [ - Parameter { - "byref": false, - "kind": "parameter", - "leadingComments": Array [ - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* @var something */", - }, - ], - "name": "arg", - "nullable": false, - "type": null, - "value": null, - "variadic": false, - }, - ], - "body": Block { - "children": Array [ - Return { - "expr": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "arg", - }, - "kind": "return", - "leadingComments": Array [ - CommentLine { - "kind": "commentline", - "value": "// inner -", - }, - ], - }, - ], - "kind": "block", - }, - "byref": true, - "kind": "function", - "leadingComments": Array [ - CommentBlock { - "kind": "commentblock", - "value": "/** - * Description - */", - }, - ], - "name": "name", - "nullable": false, - "type": null, - }, - ], - "comments": Array [ - CommentBlock { - "kind": "commentblock", - "value": "/** - * Description - */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* @var something */", - }, - CommentLine { - "kind": "commentline", - "value": "// inner -", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test comments multi line comments test if statements 1`] = ` -Program { - "children": Array [ - If { - "alternate": If { - "alternate": If { - "alternate": Block { - "children": Array [], - "kind": "block", - "leadingComments": Array [ - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - ], - }, - "body": Block { - "children": Array [], - "kind": "block", - "leadingComments": Array [ - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - ], - }, - "kind": "if", - "leadingComments": Array [ - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - ], - "shortForm": false, - "test": Boolean { - "kind": "boolean", - "raw": "false", - "value": false, - }, - }, - "body": Block { - "children": Array [], - "kind": "block", - "leadingComments": Array [ - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - ], - }, - "kind": "if", - "leadingComments": Array [ - CommentLine { - "kind": "commentline", - "value": "# inner statement -", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - CommentLine { - "kind": "commentline", - "value": "// else with a inner if single statement : -", - }, - ], - "shortForm": false, - "test": Boolean { - "kind": "boolean", - "raw": "true", - "value": true, - }, - }, - "body": Block { - "children": Array [], - "kind": "block", - "leadingComments": Array [ - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - ], - }, - "kind": "if", - "shortForm": false, - "test": Boolean { - "kind": "boolean", - "raw": "true", - "value": true, - }, - }, - If { - "alternate": null, - "body": Block { - "children": Array [], - "kind": "block", - "leadingComments": Array [ - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - ], - }, - "kind": "if", - "shortForm": true, - "test": Boolean { - "kind": "boolean", - "raw": "false", - "value": false, - }, - }, - ], - "comments": Array [ - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - CommentLine { - "kind": "commentline", - "value": "# inner statement -", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - CommentLine { - "kind": "commentline", - "value": "// else with a inner if single statement : -", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test comments multi line comments test try statements 1`] = ` -Program { - "children": Array [ - Try { - "always": Block { - "children": Array [], - "kind": "block", - "leadingComments": Array [ - CommentBlock { - "kind": "commentblock", - "value": "/* ee */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* zz */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* yy */", - }, - ], - }, - "body": Block { - "children": Array [], - "kind": "block", - "leadingComments": Array [ - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - ], - }, - "catches": Array [ - Catch { - "body": Block { - "children": Array [], - "kind": "block", - "leadingComments": Array [ - CommentBlock { - "kind": "commentblock", - "value": "/* dd */", - }, - ], - }, - "kind": "catch", - "leadingComments": Array [ - CommentLine { - "kind": "commentline", - "value": "# inner statement -", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* dd */", - }, - ], - "variable": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "leadingComments": Array [ - CommentBlock { - "kind": "commentblock", - "value": "/* aa */", - }, - ], - "name": "e", - }, - "what": Array [ - Identifier { - "kind": "identifier", - "leadingComments": Array [ - CommentBlock { - "kind": "commentblock", - "value": "/* zz */", - }, - ], - "name": "\\\\Exception", - "resolution": "qn", - }, - Identifier { - "kind": "identifier", - "leadingComments": Array [ - CommentBlock { - "kind": "commentblock", - "value": "/* 1 */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* 2 */", - }, - ], - "name": "\\\\Foo", - "resolution": "qn", - }, - ], - }, - ], - "kind": "try", - }, - ], - "comments": Array [ - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - CommentLine { - "kind": "commentline", - "value": "# inner statement -", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* dd */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* zz */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* 1 */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* 2 */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* aa */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* bb */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* dd */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* ee */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* zz */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* yy */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - CommentLine { - "kind": "commentline", - "value": "// end -", - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test comments test classes 1`] = ` -Program { - "children": Array [ - Class { - "body": Array [ - Property { - "isAbstract": false, - "isFinal": false, - "isStatic": false, - "kind": "property", - "leadingComments": Array [ - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* hehe */", - }, - CommentLine { - "kind": "commentline", - "value": "// @var test -", - }, - ], - "name": "test", - "value": null, - "visibility": "protected", - }, - Property { - "isAbstract": false, - "isFinal": false, - "isStatic": false, - "kind": "property", - "name": "toto", - "value": null, - "visibility": "protected", - }, - Property { - "isAbstract": false, - "isFinal": false, - "isStatic": true, - "kind": "property", - "leadingComments": Array [ - CommentLine { - "kind": "commentline", - "value": "// ignored comment -", - }, - CommentBlock { - "kind": "commentblock", - "value": "/** @var Class */", - }, - ], - "name": "foo", - "value": Number { - "kind": "number", - "value": "123", - }, - "visibility": "public", - }, - Method { - "arguments": Array [], - "body": Block { - "children": Array [], - "kind": "block", - }, - "byref": false, - "isAbstract": false, - "isFinal": false, - "isStatic": false, - "kind": "method", - "leadingComments": Array [ - CommentBlock { - "kind": "commentblock", - "value": "/** ignored also **/", - }, - CommentBlock { - "kind": "commentblock", - "value": "/** - * @return void - */", - }, - ], - "name": "void", - "nullable": false, - "type": null, - "visibility": "public", - }, - ], - "extends": null, - "implements": null, - "isAbstract": false, - "isAnonymous": false, - "isFinal": false, - "kind": "class", - "leadingComments": Array [ - CommentBlock { - "kind": "commentblock", - "value": "/** - * Description - */", - }, - ], - "name": "name", - }, - ], - "comments": Array [ - CommentBlock { - "kind": "commentblock", - "value": "/** - * Description - */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* ignore */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* hehe */", - }, - CommentLine { - "kind": "commentline", - "value": "// @var test -", - }, - CommentLine { - "kind": "commentline", - "value": "// ignored comment -", - }, - CommentBlock { - "kind": "commentblock", - "value": "/** @var Class */", - }, - CommentBlock { - "kind": "commentblock", - "value": "/** ignored also **/", - }, - CommentBlock { - "kind": "commentblock", - "value": "/** - * @return void - */", - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test comments test single line comments 1`] = ` -Program { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "foo", - }, - "operator": "=", - "right": Number { - "kind": "number", - "value": "123", - }, - }, - ], - "comments": Array [ - CommentLine { - "kind": "commentline", - "value": "# some information -", - }, - CommentLine { - "kind": "commentline", - "value": "// another line -", - }, - CommentLine { - "kind": "commentline", - "value": "// 123 -", - }, - CommentBlock { - "kind": "commentblock", - "value": "/* done */", - }, - ], - "errors": Array [], - "kind": "program", -} -`; diff --git a/test/snapshot/__snapshots__/expr.test.js.snap b/test/snapshot/__snapshots__/expr.test.js.snap deleted file mode 100644 index 89705c539..000000000 --- a/test/snapshot/__snapshots__/expr.test.js.snap +++ /dev/null @@ -1,1488 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Test expressions should assign class static 1`] = ` -Program { - "children": Array [ - Assign { - "kind": "assign", - "left": StaticLookup { - "kind": "staticlookup", - "offset": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - "what": Identifier { - "kind": "identifier", - "name": "a", - "resolution": "uqn", - }, - }, - "operator": "=", - "right": Number { - "kind": "number", - "value": "1", - }, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test expressions should fail to assign class constants 1`] = ` -Program { - "children": Array [ - Assign { - "kind": "assign", - "left": StaticLookup { - "kind": "staticlookup", - "offset": ConstRef { - "kind": "constref", - "name": "b", - }, - "what": Identifier { - "kind": "identifier", - "name": "foo", - "resolution": "uqn", - }, - }, - "operator": "=", - "right": Number { - "kind": "number", - "value": "1", - }, - }, - ], - "errors": Array [ - Error { - "expected": "VARIABLE", - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error, unexpected '=' on line 1", - "token": "'='", - }, - ], - "kind": "program", -} -`; - -exports[`Test expressions should fail to assign constants 1`] = ` -Program { - "children": Array [ - Assign { - "kind": "assign", - "left": ConstRef { - "kind": "constref", - "name": Identifier { - "kind": "identifier", - "name": "a", - "resolution": "uqn", - }, - }, - "operator": "=", - "right": Number { - "kind": "number", - "value": "1", - }, - }, - ], - "errors": Array [ - Error { - "expected": "VARIABLE", - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error, unexpected '=' on line 1", - "token": "'='", - }, - ], - "kind": "program", -} -`; - -exports[`Test expressions test assignements 1`] = ` -Program { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": ".=", - "right": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "+=", - "right": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "-=", - "right": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "*=", - "right": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "**=", - "right": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "/=", - "right": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "&=", - "right": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "|=", - "right": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "%=", - "right": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "^=", - "right": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "<<=", - "right": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": ">>=", - "right": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test expressions test binary 1`] = ` -Program { - "children": Array [ - Bin { - "kind": "bin", - "left": Number { - "kind": "number", - "value": "1", - }, - "right": Number { - "kind": "number", - "value": "3", - }, - "type": "|", - }, - Bin { - "kind": "bin", - "left": Number { - "kind": "number", - "value": "1", - }, - "right": Number { - "kind": "number", - "value": "3", - }, - "type": "&", - }, - Bin { - "kind": "bin", - "left": Number { - "kind": "number", - "value": "1", - }, - "right": Number { - "kind": "number", - "value": "3", - }, - "type": "^", - }, - Bin { - "kind": "bin", - "left": String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"1\\"", - "unicode": false, - "value": "1", - }, - "right": String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"3\\"", - "unicode": false, - "value": "3", - }, - "type": ".", - }, - Bin { - "kind": "bin", - "left": Number { - "kind": "number", - "value": "1", - }, - "right": Number { - "kind": "number", - "value": "3", - }, - "type": "+", - }, - Bin { - "kind": "bin", - "left": Number { - "kind": "number", - "value": "1", - }, - "right": Number { - "kind": "number", - "value": "3", - }, - "type": "-", - }, - Bin { - "kind": "bin", - "left": Number { - "kind": "number", - "value": "1", - }, - "right": Number { - "kind": "number", - "value": "3", - }, - "type": "*", - }, - Bin { - "kind": "bin", - "left": Number { - "kind": "number", - "value": "1", - }, - "right": Number { - "kind": "number", - "value": "3", - }, - "type": "/", - }, - Bin { - "kind": "bin", - "left": Number { - "kind": "number", - "value": "1", - }, - "right": Number { - "kind": "number", - "value": "3", - }, - "type": "%", - }, - Bin { - "kind": "bin", - "left": Number { - "kind": "number", - "value": "1", - }, - "right": Number { - "kind": "number", - "value": "3", - }, - "type": "**", - }, - Bin { - "kind": "bin", - "left": Number { - "kind": "number", - "value": "1", - }, - "right": Number { - "kind": "number", - "value": "3", - }, - "type": "<<", - }, - Bin { - "kind": "bin", - "left": Number { - "kind": "number", - "value": "1", - }, - "right": Number { - "kind": "number", - "value": "3", - }, - "type": ">>", - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test expressions test cast 1`] = ` -Program { - "children": Array [ - Cast { - "kind": "cast", - "type": "int", - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "var", - }, - }, - Cast { - "kind": "cast", - "type": "int", - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "var", - }, - }, - Cast { - "kind": "cast", - "type": "bool", - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "var", - }, - }, - Cast { - "kind": "cast", - "type": "bool", - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "var", - }, - }, - Cast { - "kind": "cast", - "type": "float", - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "var", - }, - }, - Cast { - "kind": "cast", - "type": "float", - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "var", - }, - }, - Cast { - "kind": "cast", - "type": "float", - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "var", - }, - }, - Cast { - "kind": "cast", - "type": "string", - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "var", - }, - }, - Cast { - "kind": "cast", - "type": "binary", - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "var", - }, - }, - Cast { - "kind": "cast", - "type": "array", - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "var", - }, - }, - Cast { - "kind": "cast", - "type": "object", - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "var", - }, - }, - Cast { - "kind": "cast", - "type": "unset", - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "var", - }, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test expressions test exit 1`] = ` -Program { - "children": Array [ - Exit { - "kind": "exit", - "status": Number { - "kind": "number", - "value": "1", - }, - "useDie": false, - }, - Exit { - "kind": "exit", - "status": null, - "useDie": true, - }, - Exit { - "kind": "exit", - "status": null, - "useDie": false, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test expressions test generators 1`] = ` -Program { - "children": Array [ - _Function { - "arguments": Array [], - "body": Block { - "children": Array [ - Yield { - "key": null, - "kind": "yield", - "value": Number { - "kind": "number", - "value": "0", - }, - }, - YieldFrom { - "kind": "yieldfrom", - "value": Call { - "arguments": Array [], - "kind": "call", - "what": Identifier { - "kind": "identifier", - "name": "foo", - "resolution": "uqn", - }, - }, - }, - Yield { - "key": Number { - "kind": "number", - "value": "1", - }, - "kind": "yield", - "value": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - }, - ], - "kind": "block", - }, - "byref": false, - "kind": "function", - "name": "gen", - "nullable": false, - "type": null, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test expressions test if based returns 1`] = ` -Program { - "children": Array [ - Bin { - "kind": "bin", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "right": Boolean { - "kind": "boolean", - "raw": "false", - "value": false, - }, - "type": "??", - }, - RetIf { - "falseExpr": Boolean { - "kind": "boolean", - "raw": "false", - "value": false, - }, - "kind": "retif", - "test": Bin { - "kind": "bin", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "right": Number { - "kind": "number", - "value": "5", - }, - "type": ">", - }, - "trueExpr": Boolean { - "kind": "boolean", - "raw": "true", - "value": true, - }, - }, - RetIf { - "falseExpr": Boolean { - "kind": "boolean", - "raw": "false", - "value": false, - }, - "kind": "retif", - "test": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "trueExpr": null, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test expressions test incr/decr 1`] = ` -Program { - "children": Array [ - Post { - "kind": "post", - "loc": Location { - "end": Position { - "column": 11, - "line": 2, - "offset": 12, - }, - "source": null, - "start": Position { - "column": 6, - "line": 2, - "offset": 7, - }, - }, - "type": "+", - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 8, - "line": 2, - "offset": 9, - }, - "source": null, - "start": Position { - "column": 6, - "line": 2, - "offset": 7, - }, - }, - "name": "i", - }, - }, - Post { - "kind": "post", - "loc": Location { - "end": Position { - "column": 11, - "line": 3, - "offset": 24, - }, - "source": null, - "start": Position { - "column": 6, - "line": 3, - "offset": 19, - }, - }, - "type": "-", - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 8, - "line": 3, - "offset": 21, - }, - "source": null, - "start": Position { - "column": 6, - "line": 3, - "offset": 19, - }, - }, - "name": "i", - }, - }, - Pre { - "kind": "pre", - "loc": Location { - "end": Position { - "column": 11, - "line": 4, - "offset": 36, - }, - "source": null, - "start": Position { - "column": 6, - "line": 4, - "offset": 31, - }, - }, - "type": "+", - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 10, - "line": 4, - "offset": 35, - }, - "source": null, - "start": Position { - "column": 8, - "line": 4, - "offset": 33, - }, - }, - "name": "i", - }, - }, - Pre { - "kind": "pre", - "loc": Location { - "end": Position { - "column": 11, - "line": 5, - "offset": 48, - }, - "source": null, - "start": Position { - "column": 6, - "line": 5, - "offset": 43, - }, - }, - "type": "-", - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 10, - "line": 5, - "offset": 47, - }, - "source": null, - "start": Position { - "column": 8, - "line": 5, - "offset": 45, - }, - }, - "name": "i", - }, - }, - ], - "errors": Array [], - "kind": "program", - "loc": Location { - "end": Position { - "column": 11, - "line": 5, - "offset": 48, - }, - "source": null, - "start": Position { - "column": 0, - "line": 1, - "offset": 0, - }, - }, -} -`; - -exports[`Test expressions test more binary ops (formerly bool) 1`] = ` -Program { - "children": Array [ - Bin { - "kind": "bin", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "right": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - "type": "&&", - }, - Bin { - "kind": "bin", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "right": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - "type": "and", - }, - Bin { - "kind": "bin", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "right": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - "type": "||", - }, - Bin { - "kind": "bin", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "right": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - "type": "or", - }, - Bin { - "kind": "bin", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "right": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - "type": "xor", - }, - Bin { - "kind": "bin", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "right": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - "type": "===", - }, - Bin { - "kind": "bin", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "right": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - "type": "!==", - }, - Bin { - "kind": "bin", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "right": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - "type": "==", - }, - Bin { - "kind": "bin", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "right": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - "type": "!=", - }, - Bin { - "kind": "bin", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "right": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - "type": ">", - }, - Bin { - "kind": "bin", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "right": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - "type": "<", - }, - Bin { - "kind": "bin", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "right": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - "type": ">=", - }, - Bin { - "kind": "bin", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "right": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - "type": "<=", - }, - Bin { - "kind": "bin", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "right": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - "type": "<=>", - }, - Bin { - "kind": "bin", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "right": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - "type": "instanceof", - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test expressions test nested expressions precedence 1`] = ` -Program { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": Bin { - "kind": "bin", - "left": Bin { - "kind": "bin", - "left": Number { - "kind": "number", - "value": "5", - }, - "right": Number { - "kind": "number", - "value": "2", - }, - "type": "*", - }, - "right": Number { - "kind": "number", - "value": "1", - }, - "type": "+", - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - "operator": "=", - "right": Bin { - "kind": "bin", - "left": Number { - "kind": "number", - "value": "5", - }, - "right": Parenthesis { - "inner": Bin { - "kind": "bin", - "left": Number { - "kind": "number", - "value": "2", - }, - "right": Number { - "kind": "number", - "value": "1", - }, - "type": "+", - }, - "kind": "parenthesis", - }, - "type": "*", - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "c", - }, - "operator": "=", - "right": Bin { - "kind": "bin", - "left": Bin { - "kind": "bin", - "left": Number { - "kind": "number", - "value": "1", - }, - "right": Bin { - "kind": "bin", - "left": Number { - "kind": "number", - "value": "2", - }, - "right": Number { - "kind": "number", - "value": "3", - }, - "type": "/", - }, - "type": "+", - }, - "right": Number { - "kind": "number", - "value": "4", - }, - "type": "+", - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "d", - }, - "operator": "=", - "right": Bin { - "kind": "bin", - "left": Bin { - "kind": "bin", - "left": Number { - "kind": "number", - "value": "1", - }, - "right": Number { - "kind": "number", - "value": "2", - }, - "type": "!==", - }, - "right": Number { - "kind": "number", - "value": "3", - }, - "type": "&&", - }, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test expressions test new 1`] = ` -Program { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": New { - "arguments": Array [], - "kind": "new", - "what": Identifier { - "kind": "identifier", - "name": "\\\\foo", - "resolution": "qn", - }, - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": New { - "arguments": Array [], - "kind": "new", - "what": StaticLookup { - "kind": "staticlookup", - "offset": ConstRef { - "kind": "constref", - "name": "class", - }, - "what": Identifier { - "kind": "identifier", - "name": "foo", - "resolution": "rn", - }, - }, - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": New { - "arguments": Array [], - "kind": "new", - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "foo", - }, - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": New { - "arguments": Array [], - "kind": "new", - "what": Class { - "body": Array [], - "extends": Identifier { - "kind": "identifier", - "name": "foo", - "resolution": "uqn", - }, - "implements": Array [ - Identifier { - "kind": "identifier", - "name": "bar", - "resolution": "uqn", - }, - ], - "isAbstract": false, - "isAnonymous": true, - "isFinal": false, - "kind": "class", - "name": null, - }, - }, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test expressions test silent 1`] = ` -Program { - "children": Array [ - Silent { - "expr": Call { - "arguments": Array [], - "kind": "call", - "what": Identifier { - "kind": "identifier", - "name": "trigger_error", - "resolution": "uqn", - }, - }, - "kind": "silent", - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test expressions test unary 1`] = ` -Program { - "children": Array [ - Unary { - "kind": "unary", - "type": "+", - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "var", - }, - }, - Unary { - "kind": "unary", - "type": "~", - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "var", - }, - }, - Unary { - "kind": "unary", - "type": "!", - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "var", - }, - }, - Unary { - "kind": "unary", - "type": "-", - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "var", - }, - }, - ], - "errors": Array [], - "kind": "program", -} -`; diff --git a/test/snapshot/__snapshots__/function.test.js.snap b/test/snapshot/__snapshots__/function.test.js.snap deleted file mode 100644 index e6d9e9f59..000000000 --- a/test/snapshot/__snapshots__/function.test.js.snap +++ /dev/null @@ -1,302 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Function tests test function parsing 1`] = ` -Program { - "children": Array [ - _Function { - "arguments": Array [ - Parameter { - "byref": false, - "kind": "parameter", - "name": "a", - "nullable": false, - "type": null, - "value": Number { - "kind": "number", - "value": "1", - }, - "variadic": false, - }, - Parameter { - "byref": false, - "kind": "parameter", - "name": "b", - "nullable": false, - "type": Identifier { - "kind": "identifier", - "name": "\\\\callable", - "resolution": "fqn", - }, - "value": null, - "variadic": false, - }, - Parameter { - "byref": true, - "kind": "parameter", - "name": "params", - "nullable": true, - "type": Identifier { - "kind": "identifier", - "name": "\\\\array", - "resolution": "fqn", - }, - "value": null, - "variadic": true, - }, - ], - "body": Block { - "children": Array [], - "kind": "block", - }, - "byref": true, - "kind": "function", - "name": "foo", - "nullable": true, - "type": Identifier { - "kind": "identifier", - "name": "boolean", - "resolution": "uqn", - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": Closure { - "arguments": Array [ - Parameter { - "byref": false, - "kind": "parameter", - "name": "b", - "nullable": false, - "type": null, - "value": null, - "variadic": false, - }, - ], - "body": Block { - "children": Array [ - Return { - "expr": Boolean { - "kind": "boolean", - "raw": "true", - "value": true, - }, - "kind": "return", - }, - ], - "kind": "block", - }, - "byref": true, - "isStatic": false, - "kind": "closure", - "nullable": false, - "type": Identifier { - "kind": "identifier", - "name": "\\\\array", - "resolution": "fqn", - }, - "uses": Array [ - Variable { - "byref": true, - "curly": false, - "kind": "variable", - "name": "c", - }, - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "d", - }, - ], - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - "operator": "=", - "right": Call { - "arguments": Array [ - variadic { - "kind": "variadic", - "what": Array { - "items": Array [ - Number { - "kind": "number", - "value": "1", - }, - ConstRef { - "kind": "constref", - "name": Identifier { - "kind": "identifier", - "name": "null", - "resolution": "uqn", - }, - }, - Number { - "kind": "number", - "value": "1", - }, - Number { - "kind": "number", - "value": "2", - }, - Number { - "kind": "number", - "value": "3", - }, - ], - "kind": "array", - "shortForm": true, - }, - }, - ], - "kind": "call", - "what": Identifier { - "kind": "identifier", - "name": "foo", - "resolution": "uqn", - }, - }, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Function tests test reserved word for function name error 1`] = ` -Program { - "children": Array [ - _Function { - "arguments": Array [], - "body": Block { - "children": Array [], - "kind": "block", - }, - "byref": false, - "kind": "function", - "name": false, - "nullable": false, - "type": null, - }, - ], - "errors": Array [ - Error { - "expected": 105, - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error, unexpected 'list' (T_LIST), expecting T_STRING on line 1", - "token": "'list' (T_LIST)", - }, - ], - "kind": "program", -} -`; - -exports[`Function tests test static closure 1`] = ` -Program { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": Closure { - "arguments": Array [], - "body": Block { - "children": Array [], - "kind": "block", - }, - "byref": false, - "isStatic": true, - "kind": "closure", - "nullable": false, - "type": null, - "uses": Array [], - }, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Function tests test variadic error 1`] = ` -Program { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - "operator": "=", - "right": Call { - "arguments": Array [ - variadic { - "kind": "variadic", - "what": Array { - "items": Array [ - Number { - "kind": "number", - "value": "1", - }, - Number { - "kind": "number", - "value": "2", - }, - Number { - "kind": "number", - "value": "3", - }, - ], - "kind": "array", - "shortForm": true, - }, - }, - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - ], - "kind": "call", - "what": Identifier { - "kind": "identifier", - "name": "foo", - "resolution": "uqn", - }, - }, - }, - ], - "errors": Array [ - Error { - "expected": undefined, - "kind": "error", - "line": 1, - "message": "Unexpected argument after a variadic argument on line 1", - "token": undefined, - }, - ], - "kind": "program", -} -`; diff --git a/test/snapshot/__snapshots__/graceful.test.js.snap b/test/snapshot/__snapshots__/graceful.test.js.snap deleted file mode 100644 index a586c9bc6..000000000 --- a/test/snapshot/__snapshots__/graceful.test.js.snap +++ /dev/null @@ -1,414 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Test graceful mode to suppress errors should contain 2 errors 1`] = ` -Program { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "var", - }, - "operator": "=", - "right": Closure { - "arguments": Array [], - "body": Block { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "foo", - }, - "operator": "=", - "right": undefined, - }, - ], - "kind": "block", - }, - "byref": false, - "isStatic": false, - "kind": "closure", - "nullable": false, - "type": null, - "uses": Array [], - }, - }, - ], - "errors": Array [ - Error { - "expected": "EXPR", - "kind": "error", - "line": 4, - "message": "Parse Error : syntax error, unexpected '}' on line 4", - "token": "'}'", - }, - Error { - "expected": ";", - "kind": "error", - "line": 5, - "message": "Parse Error : syntax error, unexpected '}', expecting ';' on line 5", - "token": "'}'", - }, - ], - "kind": "program", -} -`; - -exports[`Test graceful mode to suppress errors test class 1`] = ` -Program { - "children": Array [ - Class { - "body": Array [ - ClassConstant { - "isAbstract": false, - "isFinal": false, - "isStatic": false, - "kind": "classconstant", - "name": "A", - "value": Number { - "kind": "number", - "value": "1", - }, - "visibility": "", - }, - ], - "extends": null, - "implements": null, - "isAbstract": false, - "isAnonymous": false, - "isFinal": false, - "kind": "class", - "name": "foo", - }, - ], - "errors": Array [ - Error { - "expected": Array [ - 198, - 222, - 182, - ], - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error, unexpected 'foo' (T_STRING) on line 1", - "token": "'foo' (T_STRING)", - }, - Error { - "expected": ";", - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error, expecting ';' on line 1", - "token": "the end of file (EOF)", - }, - Error { - "expected": "}", - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error, expecting '}' on line 1", - "token": "the end of file (EOF)", - }, - ], - "kind": "program", -} -`; - -exports[`Test graceful mode to suppress errors test expr 1`] = ` -Program { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": Bin { - "kind": "bin", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - "right": undefined, - "type": "-", - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "foo", - }, - "operator": "=", - "right": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - }, - ], - "errors": Array [ - Error { - "expected": "EXPR", - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error, unexpected ';' on line 1", - "token": "';'", - }, - Error { - "expected": ";", - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error, unexpected '$foo' (T_VARIABLE), expecting ';' on line 1", - "token": "'$foo' (T_VARIABLE)", - }, - ], - "kind": "program", -} -`; - -exports[`Test graceful mode to suppress errors test flags 1`] = ` -Program { - "children": Array [ - Interface { - "body": Array [ - Method { - "arguments": Array [], - "body": null, - "byref": false, - "isAbstract": false, - "isFinal": false, - "isStatic": false, - "kind": "method", - "name": "func", - "nullable": false, - "type": null, - "visibility": "", - }, - ], - "extends": null, - "kind": "interface", - "name": "foo", - }, - ], - "errors": Array [ - Error { - "expected": 187, - "kind": "error", - "line": 2, - "message": "Parse Error : syntax error, unexpected 'final' (T_FINAL), expecting T_CLASS on line 2", - "token": "'final' (T_FINAL)", - }, - Error { - "expected": undefined, - "kind": "error", - "line": 3, - "message": "Parse Error : syntax error, unexpected 'abstract' (T_ABSTRACT) on line 3", - "token": "'abstract' (T_ABSTRACT)", - }, - Error { - "expected": ";", - "kind": "error", - "line": 4, - "message": "Parse Error : syntax error, expecting ';' on line 4", - "token": "the end of file (EOF)", - }, - Error { - "expected": "}", - "kind": "error", - "line": 4, - "message": "Parse Error : syntax error, expecting '}' on line 4", - "token": "the end of file (EOF)", - }, - ], - "kind": "program", -} -`; - -exports[`Test graceful mode to suppress errors test function arguments 1`] = ` -Program { - "children": Array [ - Call { - "arguments": Array [ - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "arg", - }, - ], - "kind": "call", - "what": PropertyLookup { - "kind": "propertylookup", - "offset": ConstRef { - "kind": "constref", - "name": "bar", - }, - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "foo", - }, - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "foo", - }, - "operator": "=", - "right": New { - "arguments": Array [ - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "baz", - }, - ], - "kind": "new", - "what": Identifier { - "kind": "identifier", - "name": "bar", - "resolution": "uqn", - }, - }, - }, - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "foo", - }, - ], - "errors": Array [ - Error { - "expected": "EXPR", - "kind": "error", - "line": 2, - "message": "Parse Error : syntax error, unexpected ')' on line 2", - "token": "')'", - }, - Error { - "expected": ")", - "kind": "error", - "line": 2, - "message": "Parse Error : syntax error, unexpected ';', expecting ')' on line 2", - "token": "';'", - }, - Error { - "expected": "EXPR", - "kind": "error", - "line": 3, - "message": "Parse Error : syntax error, unexpected ',' on line 3", - "token": "','", - }, - Error { - "expected": ")", - "kind": "error", - "line": 3, - "message": "Parse Error : syntax error, unexpected '$foo' (T_VARIABLE), expecting ')' on line 3", - "token": "'$foo' (T_VARIABLE)", - }, - Error { - "expected": ";", - "kind": "error", - "line": 3, - "message": "Parse Error : syntax error, unexpected '$foo' (T_VARIABLE), expecting ';' on line 3", - "token": "'$foo' (T_VARIABLE)", - }, - Error { - "expected": ";", - "kind": "error", - "line": 3, - "message": "Parse Error : syntax error, unexpected ')', expecting ';' on line 3", - "token": "')'", - }, - Error { - "expected": "EXPR", - "kind": "error", - "line": 3, - "message": "Parse Error : syntax error, unexpected ')' on line 3", - "token": "')'", - }, - ], - "kind": "program", -} -`; - -exports[`Test graceful mode to suppress errors test method chains 1`] = ` -Program { - "children": Array [ - PropertyLookup { - "kind": "propertylookup", - "offset": ConstRef { - "kind": "constref", - "name": "", - }, - "what": Call { - "arguments": Array [ - Call { - "arguments": Array [], - "kind": "call", - "what": PropertyLookup { - "kind": "propertylookup", - "offset": ConstRef { - "kind": "constref", - "name": "once", - }, - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "this", - }, - }, - }, - ], - "kind": "call", - "what": PropertyLookup { - "kind": "propertylookup", - "offset": ConstRef { - "kind": "constref", - "name": "expects", - }, - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "controller", - }, - }, - }, - }, - ], - "errors": Array [ - Error { - "expected": Array [ - 105, - 222, - ], - "kind": "error", - "line": 4, - "message": "Parse Error : syntax error on line 4", - "token": "the end of file (EOF)", - }, - ], - "kind": "program", -} -`; diff --git a/test/snapshot/__snapshots__/if.test.js.snap b/test/snapshot/__snapshots__/if.test.js.snap deleted file mode 100644 index de74fbb94..000000000 --- a/test/snapshot/__snapshots__/if.test.js.snap +++ /dev/null @@ -1,601 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Test IF statements test common cases 1`] = ` -Program { - "children": Array [ - If { - "alternate": If { - "alternate": If { - "alternate": Block { - "children": Array [ - Echo { - "arguments": Array [ - String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"else\\"", - "unicode": false, - "value": "else", - }, - ], - "kind": "echo", - "shortForm": false, - }, - ], - "kind": "block", - }, - "body": Block { - "children": Array [ - Echo { - "arguments": Array [ - String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"2nd\\"", - "unicode": false, - "value": "2nd", - }, - ], - "kind": "echo", - "shortForm": false, - }, - ], - "kind": "block", - }, - "kind": "if", - "shortForm": false, - "test": Boolean { - "kind": "boolean", - "raw": "false", - "value": false, - }, - }, - "body": Block { - "children": Array [ - Echo { - "arguments": Array [ - String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"false\\"", - "unicode": false, - "value": "false", - }, - ], - "kind": "echo", - "shortForm": false, - }, - ], - "kind": "block", - }, - "kind": "if", - "shortForm": false, - "test": Boolean { - "kind": "boolean", - "raw": "false", - "value": false, - }, - }, - "body": Block { - "children": Array [ - Echo { - "arguments": Array [ - String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"is true\\"", - "unicode": false, - "value": "is true", - }, - ], - "kind": "echo", - "shortForm": false, - }, - ], - "kind": "block", - }, - "kind": "if", - "shortForm": false, - "test": Boolean { - "kind": "boolean", - "raw": "true", - "value": true, - }, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test IF statements test issue #84 1`] = ` -Program { - "children": Array [ - Inline { - "kind": "inline", - "raw": " - ", - "value": " - ", - }, - If { - "alternate": Block { - "children": Array [ - Inline { - "kind": "inline", - "raw": " - ", - "value": " ", - }, - ], - "kind": "block", - }, - "body": Block { - "children": Array [ - Inline { - "kind": "inline", - "raw": " - ", - "value": " ", - }, - ], - "kind": "block", - }, - "kind": "if", - "shortForm": true, - "test": Boolean { - "kind": "boolean", - "raw": "true", - "value": true, - }, - }, - Inline { - "kind": "inline", - "raw": " - ", - "value": " ", - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test IF statements test issue #168 1`] = ` -Program { - "children": Array [ - If { - "alternate": null, - "body": null, - "kind": "if", - "loc": Location { - "end": Position { - "column": 16, - "line": 1, - "offset": 16, - }, - "source": "if ($foo);", - "start": Position { - "column": 6, - "line": 1, - "offset": 6, - }, - }, - "shortForm": false, - "test": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 14, - "line": 1, - "offset": 14, - }, - "source": "$foo", - "start": Position { - "column": 10, - "line": 1, - "offset": 10, - }, - }, - "name": "foo", - }, - }, - Inline { - "kind": "inline", - "loc": Location { - "end": Position { - "column": 6, - "line": 2, - "offset": 26, - }, - "source": " ", - "start": Position { - "column": 0, - "line": 2, - "offset": 20, - }, - }, - "raw": " - ", - "value": " ", - }, - ], - "errors": Array [], - "kind": "program", - "loc": Location { - "end": Position { - "column": 6, - "line": 2, - "offset": 26, - }, - "source": " - ", - "start": Position { - "column": 0, - "line": 1, - "offset": 0, - }, - }, -} -`; - -exports[`Test IF statements test issue #168 2`] = ` -Program { - "children": Array [ - If { - "alternate": null, - "body": null, - "kind": "if", - "loc": Location { - "end": Position { - "column": 15, - "line": 1, - "offset": 15, - }, - "source": "if ($foo)", - "start": Position { - "column": 6, - "line": 1, - "offset": 6, - }, - }, - "shortForm": false, - "test": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 14, - "line": 1, - "offset": 14, - }, - "source": "$foo", - "start": Position { - "column": 10, - "line": 1, - "offset": 10, - }, - }, - "name": "foo", - }, - }, - Inline { - "kind": "inline", - "loc": Location { - "end": Position { - "column": 6, - "line": 2, - "offset": 25, - }, - "source": " ", - "start": Position { - "column": 0, - "line": 2, - "offset": 19, - }, - }, - "raw": " - ", - "value": " ", - }, - ], - "errors": Array [], - "kind": "program", - "loc": Location { - "end": Position { - "column": 6, - "line": 2, - "offset": 25, - }, - "source": " - ", - "start": Position { - "column": 0, - "line": 1, - "offset": 0, - }, - }, -} -`; - -exports[`Test IF statements test issue #168 3`] = ` -Program { - "children": Array [ - If { - "alternate": null, - "body": null, - "kind": "if", - "loc": Location { - "end": Position { - "column": 7, - "line": 2, - "offset": 23, - }, - "source": "if ($foo) - ;", - "start": Position { - "column": 6, - "line": 1, - "offset": 6, - }, - }, - "shortForm": false, - "test": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 14, - "line": 1, - "offset": 14, - }, - "source": "$foo", - "start": Position { - "column": 10, - "line": 1, - "offset": 10, - }, - }, - "name": "foo", - }, - }, - ], - "errors": Array [], - "kind": "program", - "loc": Location { - "end": Position { - "column": 7, - "line": 2, - "offset": 23, - }, - "source": "", - 1, - ], - Array [ - "T_WHITESPACE", - " ", - 1, - ], - Array [ - "T_STRING", - "list", - 1, - ], - ";", -] -`; - -exports[`Test lexer test comments 1`] = ` -Program { - "children": Array [ - Inline { - "kind": "inline", - "raw": " - ", - "value": " - ", - }, - Inline { - "kind": "inline", - "leadingComments": Array [ - CommentLine { - "kind": "commentline", - "value": "// simple comment ", - }, - ], - "raw": " - ", - "value": " ", - }, - Inline { - "kind": "inline", - "leadingComments": Array [ - CommentLine { - "kind": "commentline", - "value": "// another line ", - }, - ], - "raw": " - ", - "value": " ", - }, - Inline { - "kind": "inline", - "leadingComments": Array [ - CommentBlock { - "kind": "commentblock", - "value": "/**/", - }, - ], - "raw": " - ", - "value": " ", - }, - ], - "comments": Array [ - CommentLine { - "kind": "commentline", - "value": "// simple comment ", - }, - CommentLine { - "kind": "commentline", - "value": "// another line ", - }, - CommentBlock { - "kind": "commentblock", - "value": "/**/", - }, - CommentLine { - "kind": "commentline", - "value": "// last comment -", - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test lexer test tokens 1`] = ` -Array [ - Array [ - "T_OPEN_TAG", - " 1`] = ` -Program { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 8, - "line": 1, - "offset": 8, - }, - "source": "$a", - "start": Position { - "column": 6, - "line": 1, - "offset": 6, - }, - }, - "name": "a", - }, - "loc": Location { - "end": Position { - "column": 17, - "line": 1, - "offset": 17, - }, - "source": "$a = $b + 1", - "start": Position { - "column": 6, - "line": 1, - "offset": 6, - }, - }, - "operator": "=", - "right": Bin { - "kind": "bin", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 13, - "line": 1, - "offset": 13, - }, - "source": "$b", - "start": Position { - "column": 11, - "line": 1, - "offset": 11, - }, - }, - "name": "b", - }, - "loc": Location { - "end": Position { - "column": 17, - "line": 1, - "offset": 17, - }, - "source": "$b + 1", - "start": Position { - "column": 11, - "line": 1, - "offset": 11, - }, - }, - "right": Number { - "kind": "number", - "loc": Location { - "end": Position { - "column": 17, - "line": 1, - "offset": 17, - }, - "source": "1", - "start": Position { - "column": 16, - "line": 1, - "offset": 16, - }, - }, - "value": "1", - }, - "type": "+", - }, - }, - ], - "errors": Array [], - "kind": "program", - "loc": Location { - "end": Position { - "column": 17, - "line": 1, - "offset": 17, - }, - "source": " $v -\\"", - "type": "string", - "value": Array [ - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "k", - }, - String { - "isDoubleQuote": false, - "kind": "string", - "raw": " -> ", - "unicode": false, - "value": " -> ", - }, - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "v", - }, - String { - "isDoubleQuote": false, - "kind": "string", - "raw": " -", - "unicode": false, - "value": " -", - }, - ], - }, - ], - "kind": "echo", - "shortForm": false, - }, - ], - "errors": Array [ - Error { - "expected": "VARIABLE", - "kind": "error", - "line": 2, - "message": "Parse Error : syntax error, unexpected 'array' (T_ARRAY) on line 2", - "token": "'array' (T_ARRAY)", - }, - Error { - "expected": ")", - "kind": "error", - "line": 2, - "message": "Parse Error : syntax error, unexpected 'array' (T_ARRAY), expecting ')' on line 2", - "token": "'array' (T_ARRAY)", - }, - Error { - "expected": ";", - "kind": "error", - "line": 2, - "message": "Parse Error : syntax error, unexpected ')', expecting ';' on line 2", - "token": "')'", - }, - Error { - "expected": "EXPR", - "kind": "error", - "line": 2, - "message": "Parse Error : syntax error, unexpected ')' on line 2", - "token": "')'", - }, - Error { - "expected": ";", - "kind": "error", - "line": 3, - "message": "Parse Error : syntax error, unexpected 'echo' (T_ECHO), expecting ';' on line 3", - "token": "'echo' (T_ECHO)", - }, - ], - "kind": "program", -} -`; - -exports[`Test loops statements (for, while) fix #122 2`] = ` -Program { - "children": Array [ - Foreach { - "body": Echo { - "arguments": Array [ - Encapsed { - "kind": "encapsed", - "raw": "\\"$k -> $v -\\"", - "type": "string", - "value": Array [ - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "k", - }, - String { - "isDoubleQuote": false, - "kind": "string", - "raw": " -> ", - "unicode": false, - "value": " -> ", - }, - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "v", - }, - String { - "isDoubleQuote": false, - "kind": "string", - "raw": " -", - "unicode": false, - "value": " -", - }, - ], - }, - ], - "kind": "echo", - "shortForm": false, - }, - "key": List { - "arguments": Array [ - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "bar", - }, - ], - "kind": "list", - "shortForm": true, - }, - "kind": "foreach", - "shortForm": false, - "source": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "foo", - }, - "value": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "foo", - }, - }, - ], - "errors": Array [ - Error { - "expected": undefined, - "kind": "error", - "line": 2, - "message": "Fatal Error : Cannot use list as key element on line 2", - "token": undefined, - }, - ], - "kind": "program", -} -`; - -exports[`Test loops statements (for, while) test do 1`] = ` -Program { - "children": Array [ - Do { - "body": Block { - "children": Array [ - Echo { - "arguments": Array [ - String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"something\\"", - "unicode": false, - "value": "something", - }, - ], - "kind": "echo", - "shortForm": false, - }, - ], - "kind": "block", - }, - "kind": "do", - "test": Boolean { - "kind": "boolean", - "raw": "true", - "value": true, - }, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test loops statements (for, while) test for 1`] = ` -Program { - "children": Array [ - For { - "body": Echo { - "arguments": Array [ - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "i", - }, - ], - "kind": "echo", - "shortForm": false, - }, - "increment": Array [ - Post { - "kind": "post", - "type": "+", - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "i", - }, - }, - ], - "init": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "i", - }, - "operator": "=", - "right": Number { - "kind": "number", - "value": "0", - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - "operator": "=", - "right": Number { - "kind": "number", - "value": "0", - }, - }, - ], - "kind": "for", - "shortForm": false, - "test": Array [ - Bin { - "kind": "bin", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "i", - }, - "right": Number { - "kind": "number", - "value": "10", - }, - "type": "<", - }, - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "ok", - }, - ], - }, - For { - "body": Block { - "children": Array [ - Echo { - "arguments": Array [ - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "ok", - }, - ], - "kind": "echo", - "shortForm": false, - }, - Continue { - "kind": "continue", - "level": Number { - "kind": "number", - "value": "5", - }, - }, - Continue { - "kind": "continue", - "level": Parenthesis { - "inner": Number { - "kind": "number", - "value": "5", - }, - "kind": "parenthesis", - }, - }, - ], - "kind": "block", - }, - "increment": Array [], - "init": Array [], - "kind": "for", - "shortForm": true, - "test": Array [], - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test loops statements (for, while) test foreach 1`] = ` -Program { - "children": Array [ - Foreach { - "body": Echo { - "arguments": Array [ - Encapsed { - "kind": "encapsed", - "raw": "\\"$k -> $v -\\"", - "type": "string", - "value": Array [ - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "k", - }, - String { - "isDoubleQuote": false, - "kind": "string", - "raw": " -> ", - "unicode": false, - "value": " -> ", - }, - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "v", - }, - String { - "isDoubleQuote": false, - "kind": "string", - "raw": " -", - "unicode": false, - "value": " -", - }, - ], - }, - ], - "kind": "echo", - "shortForm": false, - }, - "key": null, - "kind": "foreach", - "shortForm": false, - "source": Variable { - "byref": true, - "curly": false, - "kind": "variable", - "name": "foo", - }, - "value": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "v", - }, - }, - Foreach { - "body": Block { - "children": Array [ - Echo { - "arguments": Array [ - Encapsed { - "kind": "encapsed", - "raw": "\\"$a -> $b -\\"", - "type": "string", - "value": Array [ - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - String { - "isDoubleQuote": false, - "kind": "string", - "raw": " -> ", - "unicode": false, - "value": " -> ", - }, - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - String { - "isDoubleQuote": false, - "kind": "string", - "raw": " -", - "unicode": false, - "value": " -", - }, - ], - }, - ], - "kind": "echo", - "shortForm": false, - }, - ], - "kind": "block", - }, - "key": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "kind": "foreach", - "shortForm": true, - "source": Array { - "items": Array [ - Array { - "items": Array [ - Number { - "kind": "number", - "value": "1", - }, - Number { - "kind": "number", - "value": "2", - }, - ], - "kind": "array", - "shortForm": true, - }, - Array { - "items": Array [ - Number { - "kind": "number", - "value": "3", - }, - Number { - "kind": "number", - "value": "4", - }, - ], - "kind": "array", - "shortForm": true, - }, - ], - "kind": "array", - "shortForm": true, - }, - "value": List { - "arguments": Array [ - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "c", - }, - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "d", - }, - ], - "kind": "list", - "shortForm": true, - }, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test loops statements (for, while) test while test default form 1`] = ` -Program { - "children": Array [ - While { - "body": Block { - "children": Array [ - Echo { - "arguments": Array [ - String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"go\\"", - "unicode": false, - "value": "go", - }, - ], - "kind": "echo", - "shortForm": false, - }, - ], - "kind": "block", - }, - "kind": "while", - "shortForm": false, - "test": Boolean { - "kind": "boolean", - "raw": "true", - "value": true, - }, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test loops statements (for, while) test while test short form 1`] = ` -Program { - "children": Array [ - While { - "body": Block { - "children": Array [ - Echo { - "arguments": Array [ - String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"short\\"", - "unicode": false, - "value": "short", - }, - ], - "kind": "echo", - "shortForm": false, - }, - ], - "kind": "block", - }, - "kind": "while", - "shortForm": true, - "test": Boolean { - "kind": "boolean", - "raw": "true", - "value": true, - }, - }, - ], - "errors": Array [], - "kind": "program", -} -`; diff --git a/test/snapshot/__snapshots__/namespace.test.js.snap b/test/snapshot/__snapshots__/namespace.test.js.snap deleted file mode 100644 index 72186b1b0..000000000 --- a/test/snapshot/__snapshots__/namespace.test.js.snap +++ /dev/null @@ -1,1222 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Test namespace statements check silent mode 1`] = ` -Program { - "children": Array [ - Namespace { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "var", - }, - "operator": "=", - "right": Boolean { - "kind": "boolean", - "raw": "true", - "value": true, - }, - }, - ], - "kind": "namespace", - "name": Identifier { - "kind": "identifier", - "name": "", - "resolution": "qn", - }, - "withBrackets": false, - }, - ], - "errors": Array [ - Error { - "expected": 105, - "kind": "error", - "line": 2, - "message": "Parse Error : syntax error, unexpected '$var' (T_VARIABLE), expecting T_STRING on line 2", - "token": "'$var' (T_VARIABLE)", - }, - Error { - "expected": Array [ - "{", - ";", - ], - "kind": "error", - "line": 2, - "message": "Parse Error : syntax error, unexpected '$var' (T_VARIABLE) on line 2", - "token": "'$var' (T_VARIABLE)", - }, - ], - "kind": "program", -} -`; - -exports[`Test namespace statements read usegroup location correctly with docs 1`] = ` -Program { - "children": Array [ - Namespace { - "children": Array [ - UseGroup { - "items": Array [ - UseItem { - "alias": null, - "kind": "useitem", - "loc": Location { - "end": Position { - "column": 25, - "line": 4, - "offset": 59, - }, - "source": null, - "start": Position { - "column": 10, - "line": 4, - "offset": 44, - }, - }, - "name": "Some\\\\other\\\\test", - "type": null, - }, - ], - "kind": "usegroup", - "loc": Location { - "end": Position { - "column": 25, - "line": 4, - "offset": 59, - }, - "source": null, - "start": Position { - "column": 6, - "line": 4, - "offset": 40, - }, - }, - "name": null, - "type": null, - }, - Class { - "body": Array [ - Property { - "isAbstract": false, - "isFinal": false, - "isStatic": false, - "kind": "property", - "loc": Location { - "end": Position { - "column": 20, - "line": 10, - "offset": 189, - }, - "source": null, - "start": Position { - "column": 15, - "line": 10, - "offset": 184, - }, - }, - "name": "test", - "value": null, - "visibility": "public", - }, - Method { - "arguments": Array [], - "body": Block { - "children": Array [ - Return { - "expr": Boolean { - "kind": "boolean", - "loc": Location { - "end": Position { - "column": 21, - "line": 13, - "offset": 239, - }, - "source": null, - "start": Position { - "column": 17, - "line": 13, - "offset": 235, - }, - }, - "raw": "true", - "value": true, - }, - "kind": "return", - "loc": Location { - "end": Position { - "column": 22, - "line": 13, - "offset": 240, - }, - "source": null, - "start": Position { - "column": 10, - "line": 13, - "offset": 228, - }, - }, - }, - ], - "kind": "block", - "loc": Location { - "end": Position { - "column": 9, - "line": 14, - "offset": 250, - }, - "source": null, - "start": Position { - "column": 24, - "line": 12, - "offset": 216, - }, - }, - }, - "byref": false, - "isAbstract": false, - "isFinal": false, - "isStatic": false, - "kind": "method", - "loc": Location { - "end": Position { - "column": 9, - "line": 14, - "offset": 250, - }, - "source": null, - "start": Position { - "column": 8, - "line": 12, - "offset": 200, - }, - }, - "name": "test", - "nullable": false, - "type": null, - "visibility": "", - }, - Method { - "arguments": Array [], - "body": Block { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 12, - "line": 17, - "offset": 313, - }, - "source": null, - "start": Position { - "column": 10, - "line": 17, - "offset": 311, - }, - }, - "name": "a", - }, - "loc": Location { - "end": Position { - "column": 17, - "line": 17, - "offset": 318, - }, - "source": null, - "start": Position { - "column": 10, - "line": 17, - "offset": 311, - }, - }, - "operator": "=", - "right": Number { - "kind": "number", - "loc": Location { - "end": Position { - "column": 16, - "line": 17, - "offset": 317, - }, - "source": null, - "start": Position { - "column": 15, - "line": 17, - "offset": 316, - }, - }, - "value": "1", - }, - }, - Return { - "expr": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 19, - "line": 18, - "offset": 338, - }, - "source": null, - "start": Position { - "column": 17, - "line": 18, - "offset": 336, - }, - }, - "name": "a", - }, - "kind": "return", - "loc": Location { - "end": Position { - "column": 20, - "line": 18, - "offset": 339, - }, - "source": null, - "start": Position { - "column": 10, - "line": 18, - "offset": 329, - }, - }, - }, - ], - "kind": "block", - "loc": Location { - "end": Position { - "column": 9, - "line": 19, - "offset": 349, - }, - "source": null, - "start": Position { - "column": 47, - "line": 16, - "offset": 299, - }, - }, - }, - "byref": true, - "isAbstract": false, - "isFinal": false, - "isStatic": false, - "kind": "method", - "loc": Location { - "end": Position { - "column": 9, - "line": 19, - "offset": 349, - }, - "source": null, - "start": Position { - "column": 15, - "line": 16, - "offset": 267, - }, - }, - "name": "passByReferenceTest", - "nullable": false, - "type": null, - "visibility": "public", - }, - ], - "extends": Identifier { - "kind": "identifier", - "loc": Location { - "end": Position { - "column": 27, - "line": 9, - "offset": 145, - }, - "source": null, - "start": Position { - "column": 24, - "line": 9, - "offset": 142, - }, - }, - "name": "Bar", - "resolution": "uqn", - }, - "implements": Array [ - Identifier { - "kind": "identifier", - "loc": Location { - "end": Position { - "column": 42, - "line": 9, - "offset": 160, - }, - "source": null, - "start": Position { - "column": 39, - "line": 9, - "offset": 157, - }, - }, - "name": "Baz", - "resolution": "uqn", - }, - Identifier { - "kind": "identifier", - "loc": Location { - "end": Position { - "column": 48, - "line": 9, - "offset": 166, - }, - "source": null, - "start": Position { - "column": 44, - "line": 9, - "offset": 162, - }, - }, - "name": "Buzz", - "resolution": "uqn", - }, - ], - "isAbstract": false, - "isAnonymous": false, - "isFinal": false, - "kind": "class", - "leadingComments": Array [ - CommentBlock { - "kind": "commentblock", - "loc": Location { - "end": Position { - "column": 9, - "line": 8, - "offset": 117, - }, - "source": null, - "start": Position { - "column": 6, - "line": 6, - "offset": 68, - }, - }, - "value": "/** - * @property \\\\Test\\\\test $test - */", - }, - ], - "loc": Location { - "end": Position { - "column": 7, - "line": 20, - "offset": 357, - }, - "source": null, - "start": Position { - "column": 6, - "line": 9, - "offset": 124, - }, - }, - "name": "Foo", - }, - ], - "kind": "namespace", - "loc": Location { - "end": Position { - "column": 7, - "line": 20, - "offset": 357, - }, - "source": null, - "start": Position { - "column": 6, - "line": 2, - "offset": 7, - }, - }, - "name": "Test\\\\test\\\\test", - "withBrackets": false, - }, - ], - "comments": Array [ - CommentBlock { - "kind": "commentblock", - "loc": Location { - "end": Position { - "column": 9, - "line": 8, - "offset": 117, - }, - "source": null, - "start": Position { - "column": 6, - "line": 6, - "offset": 68, - }, - }, - "value": "/** - * @property \\\\Test\\\\test $test - */", - }, - ], - "errors": Array [], - "kind": "program", - "loc": Location { - "end": Position { - "column": 7, - "line": 20, - "offset": 357, - }, - "source": null, - "start": Position { - "column": 0, - "line": 1, - "offset": 0, - }, - }, -} -`; - -exports[`Test namespace statements read usegroup location correctly without docs 1`] = ` -Program { - "children": Array [ - Namespace { - "children": Array [ - UseGroup { - "items": Array [ - UseItem { - "alias": null, - "kind": "useitem", - "loc": Location { - "end": Position { - "column": 25, - "line": 4, - "offset": 59, - }, - "source": null, - "start": Position { - "column": 10, - "line": 4, - "offset": 44, - }, - }, - "name": "Some\\\\other\\\\test", - "type": null, - }, - ], - "kind": "usegroup", - "loc": Location { - "end": Position { - "column": 25, - "line": 4, - "offset": 59, - }, - "source": null, - "start": Position { - "column": 6, - "line": 4, - "offset": 40, - }, - }, - "name": null, - "type": null, - }, - Class { - "body": Array [ - Property { - "isAbstract": false, - "isFinal": false, - "isStatic": false, - "kind": "property", - "loc": Location { - "end": Position { - "column": 20, - "line": 10, - "offset": 189, - }, - "source": null, - "start": Position { - "column": 15, - "line": 10, - "offset": 184, - }, - }, - "name": "test", - "value": null, - "visibility": "public", - }, - Method { - "arguments": Array [], - "body": Block { - "children": Array [ - Return { - "expr": Boolean { - "kind": "boolean", - "loc": Location { - "end": Position { - "column": 21, - "line": 13, - "offset": 239, - }, - "source": null, - "start": Position { - "column": 17, - "line": 13, - "offset": 235, - }, - }, - "raw": "true", - "value": true, - }, - "kind": "return", - "loc": Location { - "end": Position { - "column": 22, - "line": 13, - "offset": 240, - }, - "source": null, - "start": Position { - "column": 10, - "line": 13, - "offset": 228, - }, - }, - }, - ], - "kind": "block", - "loc": Location { - "end": Position { - "column": 9, - "line": 14, - "offset": 250, - }, - "source": null, - "start": Position { - "column": 24, - "line": 12, - "offset": 216, - }, - }, - }, - "byref": false, - "isAbstract": false, - "isFinal": false, - "isStatic": false, - "kind": "method", - "loc": Location { - "end": Position { - "column": 9, - "line": 14, - "offset": 250, - }, - "source": null, - "start": Position { - "column": 8, - "line": 12, - "offset": 200, - }, - }, - "name": "test", - "nullable": false, - "type": null, - "visibility": "", - }, - Method { - "arguments": Array [], - "body": Block { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 12, - "line": 17, - "offset": 313, - }, - "source": null, - "start": Position { - "column": 10, - "line": 17, - "offset": 311, - }, - }, - "name": "a", - }, - "loc": Location { - "end": Position { - "column": 17, - "line": 17, - "offset": 318, - }, - "source": null, - "start": Position { - "column": 10, - "line": 17, - "offset": 311, - }, - }, - "operator": "=", - "right": Number { - "kind": "number", - "loc": Location { - "end": Position { - "column": 16, - "line": 17, - "offset": 317, - }, - "source": null, - "start": Position { - "column": 15, - "line": 17, - "offset": 316, - }, - }, - "value": "1", - }, - }, - Return { - "expr": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "loc": Location { - "end": Position { - "column": 19, - "line": 18, - "offset": 338, - }, - "source": null, - "start": Position { - "column": 17, - "line": 18, - "offset": 336, - }, - }, - "name": "a", - }, - "kind": "return", - "loc": Location { - "end": Position { - "column": 20, - "line": 18, - "offset": 339, - }, - "source": null, - "start": Position { - "column": 10, - "line": 18, - "offset": 329, - }, - }, - }, - ], - "kind": "block", - "loc": Location { - "end": Position { - "column": 9, - "line": 19, - "offset": 349, - }, - "source": null, - "start": Position { - "column": 47, - "line": 16, - "offset": 299, - }, - }, - }, - "byref": true, - "isAbstract": false, - "isFinal": false, - "isStatic": false, - "kind": "method", - "loc": Location { - "end": Position { - "column": 9, - "line": 19, - "offset": 349, - }, - "source": null, - "start": Position { - "column": 15, - "line": 16, - "offset": 267, - }, - }, - "name": "passByReferenceTest", - "nullable": false, - "type": null, - "visibility": "public", - }, - ], - "extends": Identifier { - "kind": "identifier", - "loc": Location { - "end": Position { - "column": 27, - "line": 9, - "offset": 145, - }, - "source": null, - "start": Position { - "column": 24, - "line": 9, - "offset": 142, - }, - }, - "name": "Bar", - "resolution": "uqn", - }, - "implements": Array [ - Identifier { - "kind": "identifier", - "loc": Location { - "end": Position { - "column": 42, - "line": 9, - "offset": 160, - }, - "source": null, - "start": Position { - "column": 39, - "line": 9, - "offset": 157, - }, - }, - "name": "Baz", - "resolution": "uqn", - }, - Identifier { - "kind": "identifier", - "loc": Location { - "end": Position { - "column": 48, - "line": 9, - "offset": 166, - }, - "source": null, - "start": Position { - "column": 44, - "line": 9, - "offset": 162, - }, - }, - "name": "Buzz", - "resolution": "uqn", - }, - ], - "isAbstract": false, - "isAnonymous": false, - "isFinal": false, - "kind": "class", - "loc": Location { - "end": Position { - "column": 7, - "line": 20, - "offset": 357, - }, - "source": null, - "start": Position { - "column": 6, - "line": 9, - "offset": 124, - }, - }, - "name": "Foo", - }, - ], - "kind": "namespace", - "loc": Location { - "end": Position { - "column": 7, - "line": 20, - "offset": 357, - }, - "source": null, - "start": Position { - "column": 6, - "line": 2, - "offset": 7, - }, - }, - "name": "Test\\\\test\\\\test", - "withBrackets": false, - }, - ], - "errors": Array [], - "kind": "program", - "loc": Location { - "end": Position { - "column": 7, - "line": 20, - "offset": 357, - }, - "source": null, - "start": Position { - "column": 0, - "line": 1, - "offset": 0, - }, - }, -} -`; - -exports[`Test namespace statements test multiple namespace 1`] = ` -Program { - "children": Array [ - Namespace { - "children": Array [ - Post { - "kind": "post", - "type": "+", - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "i", - }, - }, - ], - "kind": "namespace", - "name": "\\\\foo", - "withBrackets": true, - }, - Namespace { - "children": Array [ - Post { - "kind": "post", - "type": "+", - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - }, - ], - "kind": "namespace", - "name": Array [ - "", - ], - "withBrackets": true, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test namespace statements test namespace error 1`] = ` -Program { - "children": Array [ - Namespace { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "var", - }, - "operator": "=", - "right": Boolean { - "kind": "boolean", - "raw": "true", - "value": true, - }, - }, - ], - "kind": "namespace", - "name": Identifier { - "kind": "identifier", - "name": "", - "resolution": "qn", - }, - "withBrackets": false, - }, - ], - "errors": Array [ - Error { - "expected": 105, - "kind": "error", - "line": 2, - "message": "Parse Error : syntax error, unexpected '$var' (T_VARIABLE), expecting T_STRING on line 2", - "token": "'$var' (T_VARIABLE)", - }, - Error { - "expected": Array [ - "{", - ";", - ], - "kind": "error", - "line": 2, - "message": "Parse Error : syntax error, unexpected '$var' (T_VARIABLE) on line 2", - "token": "'$var' (T_VARIABLE)", - }, - ], - "kind": "program", -} -`; - -exports[`Test namespace statements test namespace keyword 1`] = ` -Program { - "children": Array [ - Call { - "arguments": Array [], - "kind": "call", - "what": Identifier { - "kind": "identifier", - "name": "foo", - "resolution": "rn", - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "var", - }, - "operator": "=", - "right": ConstRef { - "kind": "constref", - "name": Identifier { - "kind": "identifier", - "name": "bar", - "resolution": "rn", - }, - }, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test namespace statements test single namespace 1`] = ` -Program { - "children": Array [ - Namespace { - "children": Array [ - UseGroup { - "items": Array [ - UseItem { - "alias": "barBaz", - "kind": "useitem", - "name": "bar\\\\baz", - "type": null, - }, - ], - "kind": "usegroup", - "name": null, - "type": null, - }, - UseGroup { - "items": Array [ - UseItem { - "alias": "barBaz", - "kind": "useitem", - "name": "bar\\\\baz", - "type": null, - }, - UseItem { - "alias": "bazBoo", - "kind": "useitem", - "name": "baz\\\\boo", - "type": null, - }, - ], - "kind": "usegroup", - "name": null, - "type": "const", - }, - UseGroup { - "items": Array [ - UseItem { - "alias": "barBaz", - "kind": "useitem", - "name": "bar\\\\baz", - "type": null, - }, - UseItem { - "alias": "bazBoo", - "kind": "useitem", - "name": "baz\\\\boo", - "type": null, - }, - ], - "kind": "usegroup", - "name": null, - "type": "function", - }, - UseGroup { - "items": Array [ - UseItem { - "alias": "BAZ_FOO", - "kind": "useitem", - "name": "FOO", - "type": "const", - }, - UseItem { - "alias": "BAZ_BOO", - "kind": "useitem", - "name": "BOO", - "type": "function", - }, - ], - "kind": "usegroup", - "name": "bar\\\\baz", - "type": null, - }, - UseGroup { - "items": Array [ - UseItem { - "alias": "AZERTY_A", - "kind": "useitem", - "name": "A", - "type": null, - }, - UseItem { - "alias": "AZERTY_B", - "kind": "useitem", - "name": "B", - "type": null, - }, - ], - "kind": "usegroup", - "name": "azerty", - "type": "const", - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": ConstRef { - "kind": "constref", - "name": Identifier { - "kind": "identifier", - "name": "barBaz", - "resolution": "rn", - }, - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - "operator": "=", - "right": ConstRef { - "kind": "constref", - "name": Identifier { - "kind": "identifier", - "name": "\\\\barBaz", - "resolution": "qn", - }, - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "c", - }, - "operator": "=", - "right": ConstRef { - "kind": "constref", - "name": Identifier { - "kind": "identifier", - "name": "barBaz\\\\foo", - "resolution": "qn", - }, - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "d", - }, - "operator": "=", - "right": ConstRef { - "kind": "constref", - "name": Identifier { - "kind": "identifier", - "name": "barBaz", - "resolution": "uqn", - }, - }, - }, - ], - "kind": "namespace", - "name": "foo", - "withBrackets": false, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test namespace statements work with declare statement 1`] = ` -Program { - "children": Array [ - Declare { - "children": Array [], - "kind": "declare", - "mode": "none", - "what": Object { - "strict_types": Number { - "kind": "number", - "value": "1", - }, - }, - }, - Namespace { - "children": Array [ - Class { - "body": Array [], - "extends": null, - "implements": null, - "isAbstract": false, - "isAnonymous": false, - "isFinal": false, - "kind": "class", - "name": "bar", - }, - ], - "kind": "namespace", - "name": "foo", - "withBrackets": false, - }, - ], - "errors": Array [], - "kind": "program", -} -`; diff --git a/test/snapshot/__snapshots__/number.test.js.snap b/test/snapshot/__snapshots__/number.test.js.snap deleted file mode 100644 index 33014fb64..000000000 --- a/test/snapshot/__snapshots__/number.test.js.snap +++ /dev/null @@ -1,302 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Test numbers test common cases 1`] = ` -Program { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": Number { - "kind": "number", - "value": "-1.5", - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - "operator": "=", - "right": Number { - "kind": "number", - "value": "1234", - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "c", - }, - "operator": "=", - "right": Number { - "kind": "number", - "value": "9223372036854775807", - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "c", - }, - "operator": "=", - "right": Number { - "kind": "number", - "value": "9223372036854775808", - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "d", - }, - "operator": "=", - "right": Number { - "kind": "number", - "value": "0x1A", - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "d", - }, - "operator": "=", - "right": Number { - "kind": "number", - "value": "0xFF", - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "e", - }, - "operator": "=", - "right": Number { - "kind": "number", - "value": "0b1011", - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "f", - }, - "operator": "=", - "right": Number { - "kind": "number", - "value": "0123", - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "g", - }, - "operator": "=", - "right": Number { - "kind": "number", - "value": "1.2e3", - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "h", - }, - "operator": "=", - "right": Number { - "kind": "number", - "value": "7E-10", - }, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test numbers test edge cases 1`] = ` -Program { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": Number { - "kind": "number", - "value": "0", - }, - }, - ConstRef { - "kind": "constref", - "name": Identifier { - "kind": "identifier", - "name": "xx", - "resolution": "uqn", - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - "operator": "=", - "right": Number { - "kind": "number", - "value": "0", - }, - }, - ConstRef { - "kind": "constref", - "name": Identifier { - "kind": "identifier", - "name": "b2", - "resolution": "uqn", - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "c", - }, - "operator": "=", - "right": Number { - "kind": "number", - "value": "01239", - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "d", - }, - "operator": "=", - "right": Number { - "kind": "number", - "value": "7", - }, - }, - Bin { - "kind": "bin", - "left": ConstRef { - "kind": "constref", - "name": Identifier { - "kind": "identifier", - "name": "E", - "resolution": "uqn", - }, - }, - "right": ConstRef { - "kind": "constref", - "name": Identifier { - "kind": "identifier", - "name": "a", - "resolution": "uqn", - }, - }, - "type": "-", - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "e", - }, - "operator": "=", - "right": Number { - "kind": "number", - "value": "7", - }, - }, - ConstRef { - "kind": "constref", - "name": Identifier { - "kind": "identifier", - "name": "EX", - "resolution": "uqn", - }, - }, - ], - "errors": Array [ - Error { - "expected": ";", - "kind": "error", - "line": 2, - "message": "Parse Error : syntax error, unexpected 'xx' (T_STRING), expecting ';' on line 2", - "token": "'xx' (T_STRING)", - }, - Error { - "expected": ";", - "kind": "error", - "line": 3, - "message": "Parse Error : syntax error, unexpected 'b2' (T_STRING), expecting ';' on line 3", - "token": "'b2' (T_STRING)", - }, - Error { - "expected": ";", - "kind": "error", - "line": 5, - "message": "Parse Error : syntax error, unexpected 'E' (T_STRING), expecting ';' on line 5", - "token": "'E' (T_STRING)", - }, - Error { - "expected": ";", - "kind": "error", - "line": 6, - "message": "Parse Error : syntax error, unexpected 'EX' (T_STRING), expecting ';' on line 6", - "token": "'EX' (T_STRING)", - }, - ], - "kind": "program", -} -`; diff --git a/test/snapshot/__snapshots__/php5.test.js.snap b/test/snapshot/__snapshots__/php5.test.js.snap deleted file mode 100644 index 03d95bdd7..000000000 --- a/test/snapshot/__snapshots__/php5.test.js.snap +++ /dev/null @@ -1,141 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Test syntax parsing without PHP7 support special keywords should fail 1`] = ` -Program { - "children": Array [ - Class { - "body": Array [ - Method { - "arguments": Array [ - Parameter { - "byref": false, - "kind": "parameter", - "name": null, - "nullable": false, - "type": null, - "value": null, - "variadic": false, - }, - ], - "body": null, - "byref": false, - "isAbstract": false, - "isFinal": false, - "isStatic": false, - "kind": "method", - "name": false, - "nullable": false, - "type": null, - "visibility": "", - }, - ], - "extends": null, - "implements": null, - "isAbstract": false, - "isAnonymous": false, - "isFinal": false, - "kind": "class", - "name": "foo", - }, - ], - "errors": Array [ - Error { - "expected": "IDENTIFIER", - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error, unexpected 'list' (T_LIST) on line 1", - "token": "'list' (T_LIST)", - }, - Error { - "expected": "(", - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error, unexpected 'list' (T_LIST), expecting '(' on line 1", - "token": "'list' (T_LIST)", - }, - Error { - "expected": 222, - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error, unexpected 'list' (T_LIST), expecting T_VARIABLE on line 1", - "token": "'list' (T_LIST)", - }, - Error { - "expected": Array [ - ",", - ")", - ], - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error, unexpected 'list' (T_LIST) on line 1", - "token": "'list' (T_LIST)", - }, - Error { - "expected": ")", - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error, unexpected 'list' (T_LIST), expecting ')' on line 1", - "token": "'list' (T_LIST)", - }, - Error { - "expected": "{", - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error, unexpected 'list' (T_LIST), expecting '{' on line 1", - "token": "'list' (T_LIST)", - }, - Error { - "expected": Array [ - 198, - 222, - 182, - ], - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error, unexpected 'list' (T_LIST) on line 1", - "token": "'list' (T_LIST)", - }, - Error { - "expected": Array [ - 198, - 222, - 182, - ], - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error, unexpected '(' on line 1", - "token": "'('", - }, - Error { - "expected": Array [ - 198, - 222, - 182, - ], - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error, unexpected ')' on line 1", - "token": "')'", - }, - Error { - "expected": Array [ - 198, - 222, - 182, - ], - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error, unexpected '{' on line 1", - "token": "'{'", - }, - Error { - "expected": "EXPR", - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error, unexpected '}' on line 1", - "token": "'}'", - }, - ], - "kind": "program", -} -`; diff --git a/test/snapshot/__snapshots__/scalar.test.js.snap b/test/snapshot/__snapshots__/scalar.test.js.snap deleted file mode 100644 index 64df8991d..000000000 --- a/test/snapshot/__snapshots__/scalar.test.js.snap +++ /dev/null @@ -1,213 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Test scalar statements test constants 1`] = ` -Program { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": OffsetLookup { - "kind": "offsetlookup", - "offset": Number { - "kind": "number", - "value": "-5", - }, - "what": StaticLookup { - "kind": "staticlookup", - "offset": ConstRef { - "kind": "constref", - "name": "ref", - }, - "what": Identifier { - "kind": "identifier", - "name": "foo", - "resolution": "uqn", - }, - }, - }, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test scalar statements test dereferencable 1`] = ` -Program { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": PropertyLookup { - "kind": "propertylookup", - "offset": ConstRef { - "kind": "constref", - "name": "test", - }, - "what": OffsetLookup { - "kind": "offsetlookup", - "offset": Number { - "kind": "number", - "value": "5", - }, - "what": Call { - "arguments": Array [], - "kind": "call", - "what": StaticLookup { - "kind": "staticlookup", - "offset": ConstRef { - "kind": "constref", - "name": "bar", - }, - "what": Identifier { - "kind": "identifier", - "name": "foo", - "resolution": "uqn", - }, - }, - }, - }, - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - "operator": "=", - "right": Call { - "arguments": Array [], - "kind": "call", - "what": PropertyLookup { - "kind": "propertylookup", - "offset": ConstRef { - "kind": "constref", - "name": "foo", - }, - "what": Parenthesis { - "inner": New { - "arguments": Array [], - "kind": "new", - "what": Identifier { - "kind": "identifier", - "name": "test", - "resolution": "uqn", - }, - }, - "kind": "parenthesis", - }, - }, - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "c", - }, - "operator": "=", - "right": OffsetLookup { - "kind": "offsetlookup", - "offset": Number { - "kind": "number", - "value": "5", - }, - "what": Parenthesis { - "inner": Call { - "arguments": Array [], - "kind": "call", - "what": Identifier { - "kind": "identifier", - "name": "foo", - "resolution": "uqn", - }, - }, - "kind": "parenthesis", - }, - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "d", - }, - "operator": "=", - "right": Call { - "arguments": Array [ - Number { - "kind": "number", - "value": "5", - }, - ], - "kind": "call", - "what": Parenthesis { - "inner": Closure { - "arguments": Array [ - Parameter { - "byref": false, - "kind": "parameter", - "name": "a", - "nullable": false, - "type": null, - "value": null, - "variadic": false, - }, - ], - "body": Block { - "children": Array [ - Return { - "expr": Bin { - "kind": "bin", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "right": Number { - "kind": "number", - "value": "2", - }, - "type": "*", - }, - "kind": "return", - }, - ], - "kind": "block", - }, - "byref": false, - "isStatic": false, - "kind": "closure", - "nullable": false, - "type": null, - "uses": Array [], - }, - "kind": "parenthesis", - }, - }, - }, - ], - "errors": Array [], - "kind": "program", -} -`; diff --git a/test/snapshot/__snapshots__/statement.test.js.snap b/test/snapshot/__snapshots__/statement.test.js.snap deleted file mode 100644 index b59821057..000000000 --- a/test/snapshot/__snapshots__/statement.test.js.snap +++ /dev/null @@ -1,554 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Test statements halt statements test fallback 1`] = ` -Program { - "children": Array [ - If { - "alternate": null, - "body": Block { - "children": Array [ - Halt { - "after": " - } - $b = 1; - ", - "kind": "halt", - }, - ], - "kind": "block", - }, - "kind": "if", - "shortForm": false, - "test": Boolean { - "kind": "boolean", - "raw": "true", - "value": true, - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - "operator": "=", - "right": Number { - "kind": "number", - "value": "1", - }, - }, - ], - "errors": Array [ - Error { - "expected": undefined, - "kind": "error", - "line": 3, - "message": "__HALT_COMPILER() can only be used from the outermost scope on line 3", - "token": undefined, - }, - ], - "kind": "program", -} -`; - -exports[`Test statements halt statements test halt statement 1`] = ` -Program { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": Number { - "kind": "number", - "value": "1", - }, - }, - Halt { - "after": " - $b = 1; - ", - "kind": "halt", - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test statements test declare 1`] = ` -Program { - "children": Array [ - If { - "alternate": null, - "body": Block { - "children": Array [ - Declare { - "children": Array [], - "kind": "declare", - "mode": "none", - "what": Object { - "ticks": Number { - "kind": "number", - "value": "1", - }, - }, - }, - ], - "kind": "block", - }, - "kind": "if", - "shortForm": false, - "test": Boolean { - "kind": "boolean", - "raw": "true", - "value": true, - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": Number { - "kind": "number", - "value": "1", - }, - }, - Declare { - "children": Array [], - "kind": "declare", - "mode": "none", - "what": Object { - "encoding": Bin { - "kind": "bin", - "left": Bin { - "kind": "bin", - "left": ConstRef { - "kind": "constref", - "name": Identifier { - "kind": "identifier", - "name": "ISO", - "resolution": "uqn", - }, - }, - "right": Number { - "kind": "number", - "value": "8859", - }, - "type": "-", - }, - "right": Number { - "kind": "number", - "value": "1", - }, - "type": "-", - }, - "ticks": Number { - "kind": "number", - "value": "2", - }, - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - "operator": "=", - "right": Number { - "kind": "number", - "value": "1", - }, - }, - Declare { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "c", - }, - "operator": "=", - "right": Number { - "kind": "number", - "value": "2", - }, - }, - ], - "kind": "declare", - "mode": "block", - "what": Object { - "ticks": Number { - "kind": "number", - "value": "1", - }, - }, - }, - Declare { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "d", - }, - "operator": "=", - "right": Number { - "kind": "number", - "value": "3", - }, - }, - ], - "kind": "declare", - "mode": "short", - "what": Object { - "encoding": String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"UTF-8\\"", - "unicode": false, - "value": "UTF-8", - }, - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "e", - }, - "operator": "=", - "right": Number { - "kind": "number", - "value": "4", - }, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test statements test global 1`] = ` -Program { - "children": Array [ - _Function { - "arguments": Array [], - "body": Block { - "children": Array [ - Global { - "items": Array [ - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - ], - "kind": "global", - }, - ], - "kind": "block", - }, - "byref": false, - "kind": "function", - "name": "foo", - "nullable": false, - "type": null, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test statements test goto label 1`] = ` -Program { - "children": Array [ - Label { - "kind": "label", - "name": "start", - }, - Post { - "kind": "post", - "type": "+", - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "i", - }, - }, - Goto { - "kind": "goto", - "label": "start", - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test statements test inner statements 1`] = ` -Program { - "children": Array [ - If { - "alternate": null, - "body": Block { - "children": Array [ - _Function { - "arguments": Array [], - "body": Block { - "children": Array [], - "kind": "block", - }, - "byref": false, - "kind": "function", - "name": "foo", - "nullable": false, - "type": null, - }, - Class { - "body": Array [], - "extends": null, - "implements": null, - "isAbstract": true, - "isAnonymous": false, - "isFinal": false, - "kind": "class", - "name": "foo", - }, - Class { - "body": Array [], - "extends": null, - "implements": null, - "isAbstract": false, - "isAnonymous": false, - "isFinal": true, - "kind": "class", - "name": "foo", - }, - Class { - "body": Array [], - "extends": null, - "implements": null, - "isAbstract": false, - "isAnonymous": false, - "isFinal": false, - "kind": "class", - "name": "foo", - }, - Trait { - "body": Array [], - "extends": null, - "implements": null, - "kind": "trait", - "name": "foo", - }, - Interface { - "body": Array [], - "extends": null, - "kind": "interface", - "name": "foo", - }, - ], - "kind": "block", - }, - "kind": "if", - "shortForm": false, - "test": Boolean { - "kind": "boolean", - "raw": "true", - "value": true, - }, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test statements test static 1`] = ` -Program { - "children": Array [ - _Function { - "arguments": Array [], - "body": Block { - "children": Array [ - Static { - "items": Array [ - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - "operator": null, - "right": Number { - "kind": "number", - "value": "5", - }, - }, - ], - "kind": "static", - }, - ], - "kind": "block", - }, - "byref": false, - "kind": "function", - "name": "foo", - "nullable": false, - "type": null, - }, - Static { - "items": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "sVar1", - }, - "operator": null, - "right": Number { - "kind": "number", - "value": "11", - }, - }, - ], - "kind": "static", - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test statements test try 1`] = ` -Program { - "children": Array [ - Try { - "always": Block { - "children": Array [ - Call { - "arguments": Array [], - "kind": "call", - "what": Identifier { - "kind": "identifier", - "name": "clean", - "resolution": "uqn", - }, - }, - ], - "kind": "block", - }, - "body": Block { - "children": Array [ - Call { - "arguments": Array [], - "kind": "call", - "what": Identifier { - "kind": "identifier", - "name": "foo", - "resolution": "uqn", - }, - }, - ], - "kind": "block", - }, - "catches": Array [ - Catch { - "body": Block { - "children": Array [ - Call { - "arguments": Array [ - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "err", - }, - ], - "kind": "call", - "what": Identifier { - "kind": "identifier", - "name": "var_dump", - "resolution": "uqn", - }, - }, - Throw { - "kind": "throw", - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "err", - }, - }, - ], - "kind": "block", - }, - "kind": "catch", - "variable": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "err", - }, - "what": Array [ - Identifier { - "kind": "identifier", - "name": "FooError", - "resolution": "uqn", - }, - Identifier { - "kind": "identifier", - "name": "BarError", - "resolution": "uqn", - }, - ], - }, - ], - "kind": "try", - }, - ], - "errors": Array [], - "kind": "program", -} -`; diff --git a/test/snapshot/__snapshots__/string.test.js.snap b/test/snapshot/__snapshots__/string.test.js.snap deleted file mode 100644 index ad1bb6fb1..000000000 --- a/test/snapshot/__snapshots__/string.test.js.snap +++ /dev/null @@ -1,2076 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Test strings binary cast 1`] = ` -Program { - "children": Array [ - Echo { - "arguments": Array [ - Cast { - "kind": "cast", - "type": "string", - "what": Encapsed { - "kind": "encapsed", - "raw": "\\"\\\\colors[1] contains >$colors[1]<\\\\n\\"", - "type": "string", - "value": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "\\\\colors[1] contains >", - "value": "\\\\colors[1] contains >", - }, - OffsetLookup { - "kind": "offsetlookup", - "offset": Number { - "kind": "number", - "value": "1", - }, - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "colors", - }, - }, - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "<\\\\n", - "value": "< -", - }, - ], - }, - }, - ], - "kind": "echo", - "shortForm": false, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test strings check infinite on $ using backquotes 1`] = ` -Program { - "children": Array [ - Echo { - "arguments": Array [ - Encapsed { - "kind": "encapsed", - "raw": "\`$", - "type": "shell", - "value": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "$", - "unicode": false, - "value": "$", - }, - ], - }, - ], - "kind": "echo", - "shortForm": false, - }, - ], - "errors": Array [ - Error { - "expected": "\`", - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error, expecting '\`' on line 1", - "token": "the end of file (EOF)", - }, - ], - "kind": "program", -} -`; - -exports[`Test strings check infinite on $ using doublequotes 1`] = ` -Program { - "children": Array [ - Echo { - "arguments": Array [ - Encapsed { - "kind": "encapsed", - "raw": "\\"$", - "type": "string", - "value": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "$", - "unicode": false, - "value": "$", - }, - ], - }, - ], - "kind": "echo", - "shortForm": false, - }, - ], - "errors": Array [ - Error { - "expected": "\\"", - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error, expecting '\\"' on line 1", - "token": "the end of file (EOF)", - }, - ], - "kind": "program", -} -`; - -exports[`Test strings check infinite on $ with arrow 1`] = ` -Program { - "children": Array [ - Echo { - "arguments": Array [ - Encapsed { - "kind": "encapsed", - "raw": "\` -> $", - "type": "shell", - "value": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "raw": " -> $", - "unicode": false, - "value": " -> $", - }, - ], - }, - ], - "kind": "echo", - "shortForm": false, - }, - ], - "errors": Array [ - Error { - "expected": "\`", - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error, expecting '\`' on line 1", - "token": "the end of file (EOF)", - }, - ], - "kind": "program", -} -`; - -exports[`Test strings check infinite on \${ using backquotes 1`] = ` -Program { - "children": Array [ - Echo { - "arguments": Array [ - Encapsed { - "kind": "encapsed", - "raw": "\`\${", - "type": "shell", - "value": Array [ - Variable { - "byref": false, - "curly": true, - "kind": "variable", - "name": undefined, - }, - ], - }, - ], - "kind": "echo", - "shortForm": false, - }, - ], - "errors": Array [ - Error { - "expected": "EXPR", - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error on line 1", - "token": "the end of file (EOF)", - }, - Error { - "expected": "}", - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error, expecting '}' on line 1", - "token": "the end of file (EOF)", - }, - Error { - "expected": "\`", - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error, expecting '\`' on line 1", - "token": "the end of file (EOF)", - }, - ], - "kind": "program", -} -`; - -exports[`Test strings check infinite on \${ using doublequotes 1`] = ` -Program { - "children": Array [ - Echo { - "arguments": Array [ - Encapsed { - "kind": "encapsed", - "raw": "\\"\${", - "type": "string", - "value": Array [ - Variable { - "byref": false, - "curly": true, - "kind": "variable", - "name": undefined, - }, - ], - }, - ], - "kind": "echo", - "shortForm": false, - }, - ], - "errors": Array [ - Error { - "expected": "EXPR", - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error on line 1", - "token": "the end of file (EOF)", - }, - Error { - "expected": "}", - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error, expecting '}' on line 1", - "token": "the end of file (EOF)", - }, - Error { - "expected": "\\"", - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error, expecting '\\"' on line 1", - "token": "the end of file (EOF)", - }, - ], - "kind": "program", -} -`; - -exports[`Test strings check infinite on \${ with arrow 1`] = ` -Program { - "children": Array [ - Echo { - "arguments": Array [ - Encapsed { - "kind": "encapsed", - "raw": "\` -> \${", - "type": "shell", - "value": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "raw": " -> ", - "unicode": false, - "value": " -> ", - }, - Variable { - "byref": false, - "curly": true, - "kind": "variable", - "name": undefined, - }, - ], - }, - ], - "kind": "echo", - "shortForm": false, - }, - ], - "errors": Array [ - Error { - "expected": "EXPR", - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error on line 1", - "token": "the end of file (EOF)", - }, - Error { - "expected": "}", - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error, expecting '}' on line 1", - "token": "the end of file (EOF)", - }, - Error { - "expected": "\`", - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error, expecting '\`' on line 1", - "token": "the end of file (EOF)", - }, - ], - "kind": "program", -} -`; - -exports[`Test strings check infinite on { using backquotes 1`] = ` -Program { - "children": Array [ - Echo { - "arguments": Array [ - Encapsed { - "kind": "encapsed", - "raw": "\`{", - "type": "shell", - "value": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "{", - "unicode": false, - "value": "{", - }, - ], - }, - ], - "kind": "echo", - "shortForm": false, - }, - ], - "errors": Array [ - Error { - "expected": "\`", - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error, expecting '\`' on line 1", - "token": "the end of file (EOF)", - }, - ], - "kind": "program", -} -`; - -exports[`Test strings check infinite on { using doublequotes 1`] = ` -Program { - "children": Array [ - Echo { - "arguments": Array [ - Encapsed { - "kind": "encapsed", - "raw": "\\"{", - "type": "string", - "value": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "{", - "unicode": false, - "value": "{", - }, - ], - }, - ], - "kind": "echo", - "shortForm": false, - }, - ], - "errors": Array [ - Error { - "expected": "\\"", - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error, expecting '\\"' on line 1", - "token": "the end of file (EOF)", - }, - ], - "kind": "program", -} -`; - -exports[`Test strings check infinite on { with arrow 1`] = ` -Program { - "children": Array [ - Echo { - "arguments": Array [ - Encapsed { - "kind": "encapsed", - "raw": "\` -> {", - "type": "shell", - "value": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "raw": " -> {", - "unicode": false, - "value": " -> {", - }, - ], - }, - ], - "kind": "echo", - "shortForm": false, - }, - ], - "errors": Array [ - Error { - "expected": "\`", - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error, expecting '\`' on line 1", - "token": "the end of file (EOF)", - }, - ], - "kind": "program", -} -`; - -exports[`Test strings check infinite on {$ using backquotes 1`] = ` -Program { - "children": Array [ - Echo { - "arguments": Array [ - Encapsed { - "kind": "encapsed", - "raw": "\`{$", - "type": "shell", - "value": Array [ - Variable { - "byref": false, - "curly": true, - "kind": "variable", - "name": "", - }, - ], - }, - ], - "kind": "echo", - "shortForm": false, - }, - ], - "errors": Array [ - Error { - "expected": Array [ - "{", - "$", - 222, - ], - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error on line 1", - "token": "the end of file (EOF)", - }, - Error { - "expected": "}", - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error, expecting '}' on line 1", - "token": "the end of file (EOF)", - }, - Error { - "expected": "\`", - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error, expecting '\`' on line 1", - "token": "the end of file (EOF)", - }, - ], - "kind": "program", -} -`; - -exports[`Test strings check infinite on {$ using doublequotes 1`] = ` -Program { - "children": Array [ - Echo { - "arguments": Array [ - Encapsed { - "kind": "encapsed", - "raw": "\\"{$", - "type": "string", - "value": Array [ - Variable { - "byref": false, - "curly": true, - "kind": "variable", - "name": "", - }, - ], - }, - ], - "kind": "echo", - "shortForm": false, - }, - ], - "errors": Array [ - Error { - "expected": Array [ - "{", - "$", - 222, - ], - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error on line 1", - "token": "the end of file (EOF)", - }, - Error { - "expected": "}", - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error, expecting '}' on line 1", - "token": "the end of file (EOF)", - }, - Error { - "expected": "\\"", - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error, expecting '\\"' on line 1", - "token": "the end of file (EOF)", - }, - ], - "kind": "program", -} -`; - -exports[`Test strings check infinite on {$ with arrow 1`] = ` -Program { - "children": Array [ - Echo { - "arguments": Array [ - Encapsed { - "kind": "encapsed", - "raw": "\` -> {$", - "type": "shell", - "value": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "raw": " -> ", - "unicode": false, - "value": " -> ", - }, - Variable { - "byref": false, - "curly": true, - "kind": "variable", - "name": "", - }, - ], - }, - ], - "kind": "echo", - "shortForm": false, - }, - ], - "errors": Array [ - Error { - "expected": Array [ - "{", - "$", - 222, - ], - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error on line 1", - "token": "the end of file (EOF)", - }, - Error { - "expected": "}", - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error, expecting '}' on line 1", - "token": "the end of file (EOF)", - }, - Error { - "expected": "\`", - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error, expecting '\`' on line 1", - "token": "the end of file (EOF)", - }, - ], - "kind": "program", -} -`; - -exports[`Test strings encapsed variable / curly constant 1`] = ` -Program { - "children": Array [ - Echo { - "arguments": Array [ - Encapsed { - "kind": "encapsed", - "raw": "\\"Hello \${ obj }\\"", - "type": "string", - "value": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "Hello ", - "unicode": false, - "value": "Hello ", - }, - Variable { - "byref": false, - "curly": true, - "kind": "variable", - "name": ConstRef { - "kind": "constref", - "name": Identifier { - "kind": "identifier", - "name": "obj", - "resolution": "uqn", - }, - }, - }, - ], - }, - ], - "kind": "echo", - "shortForm": false, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test strings encapsed variable / curly varname 1`] = ` -Program { - "children": Array [ - Echo { - "arguments": Array [ - Encapsed { - "kind": "encapsed", - "raw": "\\"Hello \${obj}->name !\\"", - "type": "string", - "value": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "Hello ", - "unicode": false, - "value": "Hello ", - }, - Variable { - "byref": false, - "curly": true, - "kind": "variable", - "name": ConstRef { - "kind": "constref", - "name": "obj", - }, - }, - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "->name !", - "unicode": false, - "value": "->name !", - }, - ], - }, - ], - "kind": "echo", - "shortForm": false, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test strings encapsed variable / offsetlookup 1`] = ` -Program { - "children": Array [ - Echo { - "arguments": Array [ - Encapsed { - "kind": "encapsed", - "raw": "\\"\${$parts[$i]}\\\\n\\"", - "type": "string", - "value": Array [ - Variable { - "byref": false, - "curly": true, - "kind": "variable", - "name": OffsetLookup { - "kind": "offsetlookup", - "offset": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "i", - }, - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "parts", - }, - }, - }, - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "\\\\n", - "unicode": false, - "value": " -", - }, - ], - }, - ], - "kind": "echo", - "shortForm": false, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test strings fix #101 case 1 1`] = ` -Program { - "children": Array [ - Encapsed { - "kind": "encapsed", - "raw": "\\"encapsed {$var}\\"", - "type": "string", - "value": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "encapsed ", - "unicode": false, - "value": "encapsed ", - }, - Variable { - "byref": false, - "curly": true, - "kind": "variable", - "name": "var", - }, - ], - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test strings fix #101 case 2 1`] = ` -Program { - "children": Array [ - Encapsed { - "kind": "encapsed", - "raw": "\\"encapsed {$arr[0]}\\"", - "type": "string", - "value": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "encapsed ", - "unicode": false, - "value": "encapsed ", - }, - OffsetLookup { - "kind": "offsetlookup", - "offset": Number { - "kind": "number", - "value": "0", - }, - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "arr", - }, - }, - ], - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test strings fix #101 case 3 1`] = ` -Program { - "children": Array [ - Encapsed { - "kind": "encapsed", - "raw": "\\"encapsed \${var}\\"", - "type": "string", - "value": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "encapsed ", - "unicode": false, - "value": "encapsed ", - }, - Variable { - "byref": false, - "curly": true, - "kind": "variable", - "name": ConstRef { - "kind": "constref", - "name": "var", - }, - }, - ], - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test strings fix #123 1`] = ` -Program { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "string", - }, - "operator": "=", - "right": String { - "isDoubleQuote": false, - "kind": "string", - "raw": "'Avoid converting - chars, but \\\\' or \\\\\\\\ is ok.'", - "unicode": false, - "value": "Avoid converting - chars, but ' or \\\\ is ok.", - }, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test strings fix #124 1`] = ` -Program { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "string", - }, - "operator": "=", - "right": Encapsed { - "kind": "encapsed", - "raw": "\\"He drank some $juices[koolaid1] juice.\\"", - "type": "string", - "value": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "He drank some ", - "unicode": false, - "value": "He drank some ", - }, - OffsetLookup { - "kind": "offsetlookup", - "offset": ConstRef { - "kind": "constref", - "name": "koolaid1", - }, - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "juices", - }, - }, - String { - "isDoubleQuote": false, - "kind": "string", - "raw": " juice.", - "unicode": false, - "value": " juice.", - }, - ], - }, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test strings fix #144 1`] = ` -Program { - "children": Array [ - Encapsed { - "kind": "encapsed", - "raw": "\\"encapsed \\\\\\" {$var}\\"", - "type": "string", - "value": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "encapsed \\\\\\" ", - "unicode": false, - "value": "encapsed \\" ", - }, - Variable { - "byref": false, - "curly": true, - "kind": "variable", - "name": "var", - }, - ], - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test strings fix #149 1`] = ` -Program { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": String { - "isDoubleQuote": true, - "kind": "string", - "raw": "b\\"foo\\\\nbar\\"", - "unicode": true, - "value": "foo -bar", - }, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test strings implement #116 1`] = ` -Program { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"foo\\\\nbar\\"", - "unicode": false, - "value": "foo -bar", - }, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test strings test backquotes 1`] = ` -Program { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": Encapsed { - "kind": "encapsed", - "raw": "\`ls $cwd\`", - "type": "shell", - "value": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "ls ", - "unicode": false, - "value": "ls ", - }, - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "cwd", - }, - ], - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": Encapsed { - "kind": "encapsed", - "raw": "\`ls \${$cwd}\`", - "type": "shell", - "value": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "ls ", - "unicode": false, - "value": "ls ", - }, - Variable { - "byref": false, - "curly": true, - "kind": "variable", - "name": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "cwd", - }, - }, - ], - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": Encapsed { - "kind": "encapsed", - "raw": "\`ls {$cwd}\`", - "type": "shell", - "value": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "ls ", - "unicode": false, - "value": "ls ", - }, - Variable { - "byref": false, - "curly": true, - "kind": "variable", - "name": "cwd", - }, - ], - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": Encapsed { - "kind": "encapsed", - "raw": "\`$var\`", - "type": "shell", - "value": Array [ - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "var", - }, - ], - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": Encapsed { - "kind": "encapsed", - "raw": "\`\${var}\`", - "type": "shell", - "value": Array [ - Variable { - "byref": false, - "curly": true, - "kind": "variable", - "name": ConstRef { - "kind": "constref", - "name": "var", - }, - }, - ], - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": Encapsed { - "kind": "encapsed", - "raw": "\`{$var}\`", - "type": "shell", - "value": Array [ - Variable { - "byref": false, - "curly": true, - "kind": "variable", - "name": "var", - }, - ], - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": Encapsed { - "kind": "encapsed", - "raw": "\`\`", - "type": "shell", - "value": Array [], - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": Encapsed { - "kind": "encapsed", - "raw": "\`\\\\\`\`", - "type": "shell", - "value": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "\\\\\`", - "unicode": false, - "value": "\\\\\`", - }, - ], - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": Encapsed { - "kind": "encapsed", - "raw": "\`{\`", - "type": "shell", - "value": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "{", - "unicode": false, - "value": "{", - }, - ], - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": Encapsed { - "kind": "encapsed", - "raw": "\`-{\`", - "type": "shell", - "value": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "-{", - "unicode": false, - "value": "-{", - }, - ], - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": Encapsed { - "kind": "encapsed", - "raw": "\`-$\`", - "type": "shell", - "value": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "-$", - "unicode": false, - "value": "-$", - }, - ], - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": Encapsed { - "kind": "encapsed", - "raw": "\`$\`", - "type": "shell", - "value": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "$", - "unicode": false, - "value": "$", - }, - ], - }, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test strings test binary with double quotes 1`] = ` -Program { - "children": Array [ - Echo { - "arguments": Array [ - Encapsed { - "kind": "encapsed", - "raw": "b\\"\\\\colors contains >$colors<\\\\n\\"", - "type": "string", - "value": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "\\\\colors contains >", - "unicode": false, - "value": "\\\\colors contains >", - }, - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "colors", - }, - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "<\\\\n", - "unicode": false, - "value": "< -", - }, - ], - }, - ], - "kind": "echo", - "shortForm": false, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test strings test double quotes 1`] = ` -Program { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"$\\"", - "unicode": false, - "value": "$", - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"{\\"", - "unicode": false, - "value": "{", - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"-$-\\"", - "unicode": false, - "value": "-$-", - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"-{\\"", - "unicode": false, - "value": "-{", - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": Encapsed { - "kind": "encapsed", - "raw": "\\"$b\\"", - "type": "string", - "value": Array [ - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - ], - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": Encapsed { - "kind": "encapsed", - "raw": "\\"{$b}\\"", - "type": "string", - "value": Array [ - Variable { - "byref": false, - "curly": true, - "kind": "variable", - "name": "b", - }, - ], - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": Encapsed { - "kind": "encapsed", - "raw": "\\"\${$b}\\"", - "type": "string", - "value": Array [ - Variable { - "byref": false, - "curly": true, - "kind": "variable", - "name": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - }, - ], - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": Encapsed { - "kind": "encapsed", - "raw": "\\"-$b?\\"", - "type": "string", - "value": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "-", - "unicode": false, - "value": "-", - }, - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "?", - "unicode": false, - "value": "?", - }, - ], - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": Encapsed { - "kind": "encapsed", - "raw": "\\"-{$b}\\"", - "type": "string", - "value": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "-", - "unicode": false, - "value": "-", - }, - Variable { - "byref": false, - "curly": true, - "kind": "variable", - "name": "b", - }, - ], - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": Encapsed { - "kind": "encapsed", - "raw": "\\"-\${$b}\\"", - "type": "string", - "value": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "-", - "unicode": false, - "value": "-", - }, - Variable { - "byref": false, - "curly": true, - "kind": "variable", - "name": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - }, - ], - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"\\"", - "unicode": false, - "value": "", - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"\\\\\\"\\"", - "unicode": false, - "value": "\\"", - }, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test strings test empty nowdoc & heredoc contents 1`] = ` -Program { - "children": Array [ - Echo { - "arguments": Array [ - Encapsed { - "kind": "encapsed", - "label": "HDOC", - "raw": " - HDOC - ; - echo <<<'NDOC' - NDOC - ; - ", - "type": "heredoc", - "value": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "raw": " HDOC - ; - echo <<<'NDOC' - NDOC - ; - ", - "unicode": false, - "value": " HDOC - ; - echo <<<'NDOC' - NDOC - ; - ", - }, - ], - }, - ], - "kind": "echo", - "shortForm": false, - }, - ], - "errors": Array [ - Error { - "expected": 220, - "kind": "error", - "line": 8, - "message": "Parse Error : syntax error, expecting T_END_HEREDOC on line 8", - "token": "the end of file (EOF)", - }, - ], - "kind": "program", -} -`; - -exports[`Test strings test encapsed elements 1`] = ` -Program { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "code", - }, - "operator": "=", - "right": Encapsed { - "kind": "encapsed", - "label": "EOFX", - "raw": " -{$this->docStar} -\${$foo} -\${targetDirs[1]} -$test[1] -$test->foo -EOFX", - "type": "heredoc", - "value": Array [ - PropertyLookup { - "kind": "propertylookup", - "offset": ConstRef { - "kind": "constref", - "name": "docStar", - }, - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "this", - }, - }, - String { - "isDoubleQuote": false, - "kind": "string", - "raw": " -", - "unicode": false, - "value": " -", - }, - Variable { - "byref": false, - "curly": true, - "kind": "variable", - "name": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "foo", - }, - }, - String { - "isDoubleQuote": false, - "kind": "string", - "raw": " -", - "unicode": false, - "value": " -", - }, - Variable { - "byref": false, - "curly": true, - "kind": "variable", - "name": OffsetLookup { - "kind": "offsetlookup", - "offset": Number { - "kind": "number", - "value": "1", - }, - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "targetDirs", - }, - }, - }, - String { - "isDoubleQuote": false, - "kind": "string", - "raw": " -", - "unicode": false, - "value": " -", - }, - OffsetLookup { - "kind": "offsetlookup", - "offset": Number { - "kind": "number", - "value": "1", - }, - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "test", - }, - }, - String { - "isDoubleQuote": false, - "kind": "string", - "raw": " -", - "unicode": false, - "value": " -", - }, - PropertyLookup { - "kind": "propertylookup", - "offset": ConstRef { - "kind": "constref", - "name": "foo", - }, - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "test", - }, - }, - String { - "isDoubleQuote": false, - "kind": "string", - "raw": " -", - "unicode": false, - "value": " -", - }, - ], - }, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test strings test encapsed variable 1`] = ` -Program { - "children": Array [ - Echo { - "arguments": Array [ - Encapsed { - "kind": "encapsed", - "raw": "\\"Hello $obj->name !\\"", - "type": "string", - "value": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "Hello ", - "unicode": false, - "value": "Hello ", - }, - PropertyLookup { - "kind": "propertylookup", - "offset": ConstRef { - "kind": "constref", - "name": "name", - }, - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "obj", - }, - }, - String { - "isDoubleQuote": false, - "kind": "string", - "raw": " !", - "unicode": false, - "value": " !", - }, - ], - }, - ], - "kind": "echo", - "shortForm": false, - }, - Echo { - "arguments": Array [ - Encapsed { - "kind": "encapsed", - "raw": "\\"Hello $obj->foo->bar !\\"", - "type": "string", - "value": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "Hello ", - "unicode": false, - "value": "Hello ", - }, - PropertyLookup { - "kind": "propertylookup", - "offset": ConstRef { - "kind": "constref", - "name": "foo", - }, - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "obj", - }, - }, - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "->bar !", - "unicode": false, - "value": "->bar !", - }, - ], - }, - ], - "kind": "echo", - "shortForm": false, - }, - Echo { - "arguments": Array [ - Encapsed { - "kind": "encapsed", - "raw": "\\"Hello $obj[1]->foo !\\"", - "type": "string", - "value": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "Hello ", - "unicode": false, - "value": "Hello ", - }, - OffsetLookup { - "kind": "offsetlookup", - "offset": Number { - "kind": "number", - "value": "1", - }, - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "obj", - }, - }, - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "->foo !", - "unicode": false, - "value": "->foo !", - }, - ], - }, - ], - "kind": "echo", - "shortForm": false, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test strings test heredoc end of doc 1`] = ` -Program { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": Encapsed { - "kind": "encapsed", - "label": "EOF2", - "raw": " -SOMETHING", - "type": "heredoc", - "value": Array [ - String { - "isDoubleQuote": false, - "kind": "string", - "raw": "SOMETHING", - "unicode": false, - "value": "SOMETHING", - }, - ], - }, - }, - ], - "errors": Array [ - Error { - "expected": 220, - "kind": "error", - "line": 2, - "message": "Parse Error : syntax error, expecting T_END_HEREDOC on line 2", - "token": "the end of file (EOF)", - }, - ], - "kind": "program", -} -`; - -exports[`Test strings test nowdoc end of doc 1`] = ` -Program { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": Nowdoc { - "kind": "nowdoc", - "label": "EOF2", - "quote": true, - "raw": "<<<'EOF2' -FOO", - "value": "FOO", - }, - }, - ], - "errors": Array [ - Error { - "expected": 220, - "kind": "error", - "line": 2, - "message": "Parse Error : syntax error, expecting T_END_HEREDOC on line 2", - "token": "the end of file (EOF)", - }, - ], - "kind": "program", -} -`; - -exports[`Test strings test nowdoc label and contents 1`] = ` -Program { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "code", - }, - "operator": ".=", - "right": Nowdoc { - "kind": "nowdoc", - "label": "EOF", - "quote": true, - "raw": "<<<'EOF' - } -EOF;", - "value": " }", - }, - }, - ], - "errors": Array [], - "kind": "program", -} -`; diff --git a/test/snapshot/__snapshots__/switch.test.js.snap b/test/snapshot/__snapshots__/switch.test.js.snap deleted file mode 100644 index 340e5b4d4..000000000 --- a/test/snapshot/__snapshots__/switch.test.js.snap +++ /dev/null @@ -1,356 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Test SWITCH statements parse correctly 1`] = ` -Program { - "children": Array [ - Switch { - "body": Block { - "children": Array [ - Case { - "body": null, - "kind": "case", - "test": Number { - "kind": "number", - "value": "1", - }, - }, - Case { - "body": Block { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "foo", - }, - "operator": "=", - "right": Boolean { - "kind": "boolean", - "raw": "false", - "value": false, - }, - }, - Break { - "kind": "break", - "level": Number { - "kind": "number", - "value": "10", - }, - }, - ], - "kind": "block", - }, - "kind": "case", - "test": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "var", - }, - }, - Case { - "body": Block { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "foo", - }, - "operator": "=", - "right": Boolean { - "kind": "boolean", - "raw": "true", - "value": true, - }, - }, - Break { - "kind": "break", - "level": null, - }, - ], - "kind": "block", - }, - "kind": "case", - "test": ConstRef { - "kind": "constref", - "name": Identifier { - "kind": "identifier", - "name": "FOO", - "resolution": "uqn", - }, - }, - }, - Case { - "body": Block { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "bar", - }, - "operator": "=", - "right": Boolean { - "kind": "boolean", - "raw": "false", - "value": false, - }, - }, - ], - "kind": "block", - }, - "kind": "case", - "test": null, - }, - ], - "kind": "block", - }, - "kind": "switch", - "shortForm": false, - "test": Boolean { - "kind": "boolean", - "raw": "true", - "value": true, - }, - }, - Switch { - "body": Block { - "children": Array [ - Case { - "body": Block { - "children": Array [ - Return { - "expr": Boolean { - "kind": "boolean", - "raw": "true", - "value": true, - }, - "kind": "return", - }, - ], - "kind": "block", - }, - "kind": "case", - "test": ConstRef { - "kind": "constref", - "name": Identifier { - "kind": "identifier", - "name": "A", - "resolution": "uqn", - }, - }, - }, - Case { - "body": Block { - "children": Array [ - Return { - "expr": Boolean { - "kind": "boolean", - "raw": "false", - "value": false, - }, - "kind": "return", - }, - ], - "kind": "block", - }, - "kind": "case", - "test": ConstRef { - "kind": "constref", - "name": Identifier { - "kind": "identifier", - "name": "B", - "resolution": "uqn", - }, - }, - }, - ], - "kind": "block", - }, - "kind": "switch", - "shortForm": true, - "test": Boolean { - "kind": "boolean", - "raw": "true", - "value": true, - }, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test SWITCH statements test errors 1`] = ` -Program { - "children": Array [ - Switch { - "body": Block { - "children": Array [ - Case { - "body": Block { - "children": Array [ - Switch { - "body": Block { - "children": Array [ - Case { - "body": Block { - "children": Array [ - Inline { - "kind": "inline", - "raw": " bug ", - "value": " bug ", - }, - ], - "kind": "block", - }, - "kind": "case", - "test": null, - }, - Case { - "body": Block { - "children": Array [ - Return { - "expr": null, - "kind": "return", - }, - Boolean { - "kind": "boolean", - "raw": "true", - "value": true, - }, - ], - "kind": "block", - }, - "kind": "case", - "test": ConstRef { - "kind": "constref", - "name": Identifier { - "kind": "identifier", - "name": "A", - "resolution": "uqn", - }, - }, - }, - Case { - "body": Block { - "children": Array [ - Return { - "expr": Boolean { - "kind": "boolean", - "raw": "false", - "value": false, - }, - "kind": "return", - }, - ], - "kind": "block", - }, - "kind": "case", - "test": ConstRef { - "kind": "constref", - "name": Identifier { - "kind": "identifier", - "name": "B", - "resolution": "uqn", - }, - }, - }, - ], - "kind": "block", - }, - "kind": "switch", - "shortForm": true, - "test": Boolean { - "kind": "boolean", - "raw": "true", - "value": true, - }, - }, - ], - "kind": "block", - }, - "kind": "case", - "test": null, - }, - ], - "kind": "block", - }, - "kind": "switch", - "shortForm": false, - "test": Boolean { - "kind": "boolean", - "raw": "true", - "value": true, - }, - }, - ], - "errors": Array [ - Error { - "expected": Array [ - "{", - ":", - ], - "kind": "error", - "line": 2, - "message": "Parse Error : syntax error, unexpected ';' on line 2", - "token": "';'", - }, - Error { - "expected": Array [ - 204, - 205, - ], - "kind": "error", - "line": 3, - "message": "Parse Error : syntax error, unexpected 'switch' (T_SWITCH) on line 3", - "token": "'switch' (T_SWITCH)", - }, - Error { - "expected": Array [ - ":", - ";", - ], - "kind": "error", - "line": 3, - "message": "Parse Error : syntax error, unexpected 'switch' (T_SWITCH) on line 3", - "token": "'switch' (T_SWITCH)", - }, - Error { - "expected": Array [ - 204, - 205, - ], - "kind": "error", - "line": 3, - "message": "Parse Error : syntax error, unexpected ' bug ' (T_INLINE_HTML) on line 3", - "token": "' bug ' (T_INLINE_HTML)", - }, - Error { - "expected": Array [ - ":", - ";", - ], - "kind": "error", - "line": 3, - "message": "Parse Error : syntax error, unexpected ' bug ' (T_INLINE_HTML) on line 3", - "token": "' bug ' (T_INLINE_HTML)", - }, - Error { - "expected": null, - "kind": "error", - "line": 7, - "message": "Parse Error : syntax error on line 7", - "token": "the end of file (EOF)", - }, - ], - "kind": "program", -} -`; diff --git a/test/snapshot/__snapshots__/token.test.js.snap b/test/snapshot/__snapshots__/token.test.js.snap deleted file mode 100644 index eede57b30..000000000 --- a/test/snapshot/__snapshots__/token.test.js.snap +++ /dev/null @@ -1,78 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Test tokens statements hello world 1`] = ` -Program { - "children": Array [ - Inline { - "kind": "inline", - "raw": "Hello ", - "value": "Hello ", - }, - Echo { - "arguments": Array [ - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "world", - }, - ], - "kind": "echo", - "shortForm": true, - }, - ], - "errors": Array [], - "kind": "program", - "tokens": Array [ - Array [ - "T_INLINE_HTML", - "Hello ", - 1, - 0, - 6, - ], - Array [ - "T_OPEN_TAG_WITH_ECHO", - "", - 1, - 18, - 20, - ], - ], -} -`; diff --git a/test/snapshot/__snapshots__/variable.test.js.snap b/test/snapshot/__snapshots__/variable.test.js.snap deleted file mode 100644 index 951b4bb13..000000000 --- a/test/snapshot/__snapshots__/variable.test.js.snap +++ /dev/null @@ -1,778 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Test variables Chained encapsed vars 1`] = ` -Program { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": Encapsed { - "kind": "encapsed", - "raw": "\\"{$a->foo()[$bar[$foo]]}\\"", - "type": "string", - "value": Array [ - OffsetLookup { - "kind": "offsetlookup", - "offset": OffsetLookup { - "kind": "offsetlookup", - "offset": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "foo", - }, - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "bar", - }, - }, - "what": Call { - "arguments": Array [], - "kind": "call", - "what": PropertyLookup { - "kind": "propertylookup", - "offset": ConstRef { - "kind": "constref", - "name": "foo", - }, - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - }, - }, - }, - ], - }, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test variables Check errors should be ? 1`] = ` -Program { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "?", - }, - "operator": "=", - "right": Boolean { - "kind": "boolean", - "raw": "true", - "value": true, - }, - }, - ], - "errors": Array [ - Error { - "expected": Array [ - "{", - "$", - 222, - ], - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error, unexpected '?' on line 1", - "token": "'?'", - }, - ], - "kind": "program", -} -`; - -exports[`Test variables Check errors should fail $foo->bar::! 1`] = ` -Program { - "children": Array [ - StaticLookup { - "kind": "staticlookup", - "offset": ConstRef { - "kind": "constref", - "name": "!", - }, - "what": PropertyLookup { - "kind": "propertylookup", - "offset": ConstRef { - "kind": "constref", - "name": "bar", - }, - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "foo", - }, - }, - }, - ], - "errors": Array [ - Error { - "expected": 105, - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error, unexpected '!', expecting T_STRING on line 1", - "token": "'!'", - }, - ], - "kind": "program", -} -`; - -exports[`Test variables Check errors should fail foo::bar::baz 1`] = ` -Program { - "children": Array [ - StaticLookup { - "kind": "staticlookup", - "offset": ConstRef { - "kind": "constref", - "name": "baz", - }, - "what": StaticLookup { - "kind": "staticlookup", - "offset": ConstRef { - "kind": "constref", - "name": "bar", - }, - "what": Identifier { - "kind": "identifier", - "name": "foo", - "resolution": "uqn", - }, - }, - }, - ], - "errors": Array [ - Error { - "expected": undefined, - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error, unexpected '::' (T_DOUBLE_COLON) on line 1", - "token": "'::' (T_DOUBLE_COLON)", - }, - ], - "kind": "program", -} -`; - -exports[`Test variables Check errors should fail on double static lookup 1`] = ` -Program { - "children": Array [ - StaticLookup { - "kind": "staticlookup", - "offset": ConstRef { - "kind": "constref", - "name": "baz", - }, - "what": StaticLookup { - "kind": "staticlookup", - "offset": ConstRef { - "kind": "constref", - "name": "bar", - }, - "what": PropertyLookup { - "kind": "propertylookup", - "offset": ConstRef { - "kind": "constref", - "name": "foo", - }, - "what": ConstRef { - "kind": "constref", - "name": Identifier { - "kind": "identifier", - "name": "this", - "resolution": "uqn", - }, - }, - }, - }, - }, - ], - "errors": Array [ - Error { - "expected": undefined, - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error, unexpected '::' (T_DOUBLE_COLON) on line 1", - "token": "'::' (T_DOUBLE_COLON)", - }, - ], - "kind": "program", -} -`; - -exports[`Test variables Check errors should fail on property lookup on static lookup 1`] = ` -Program { - "children": Array [ - PropertyLookup { - "kind": "propertylookup", - "offset": ConstRef { - "kind": "constref", - "name": "baz", - }, - "what": StaticLookup { - "kind": "staticlookup", - "offset": ConstRef { - "kind": "constref", - "name": "bar", - }, - "what": PropertyLookup { - "kind": "propertylookup", - "offset": ConstRef { - "kind": "constref", - "name": "foo", - }, - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "this", - }, - }, - }, - }, - ], - "errors": Array [ - Error { - "expected": undefined, - "kind": "error", - "line": 1, - "message": "Parse Error : syntax error, unexpected '->' (T_OBJECT_OPERATOR) on line 1", - "token": "'->' (T_OBJECT_OPERATOR)", - }, - ], - "kind": "program", -} -`; - -exports[`Test variables Class constants 1`] = ` -Program { - "children": Array [ - Call { - "arguments": Array [], - "kind": "call", - "what": StaticLookup { - "kind": "staticlookup", - "offset": ConstRef { - "kind": "constref", - "name": "foo", - }, - "what": ConstRef { - "kind": "constref", - "name": "static", - }, - }, - }, - Call { - "arguments": Array [], - "kind": "call", - "what": StaticLookup { - "kind": "staticlookup", - "offset": ConstRef { - "kind": "constref", - "name": "foo", - }, - "what": Identifier { - "kind": "identifier", - "name": "self", - "resolution": "uqn", - }, - }, - }, - Call { - "arguments": Array [], - "kind": "call", - "what": StaticLookup { - "kind": "staticlookup", - "offset": ConstRef { - "kind": "constref", - "name": "foo", - }, - "what": Identifier { - "kind": "identifier", - "name": "parent", - "resolution": "uqn", - }, - }, - }, - StaticLookup { - "kind": "staticlookup", - "offset": ConstRef { - "kind": "constref", - "name": "class", - }, - "what": Identifier { - "kind": "identifier", - "name": "foo", - "resolution": "uqn", - }, - }, - Call { - "arguments": Array [], - "kind": "call", - "what": PropertyLookup { - "kind": "propertylookup", - "offset": ConstRef { - "kind": "constref", - "name": "foo", - }, - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "this", - }, - }, - }, - StaticLookup { - "kind": "staticlookup", - "offset": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "bar", - }, - "what": Identifier { - "kind": "identifier", - "name": "foo", - "resolution": "uqn", - }, - }, - Call { - "arguments": Array [], - "kind": "call", - "what": StaticLookup { - "kind": "staticlookup", - "offset": ConstRef { - "kind": "constref", - "name": "qux", - }, - "what": OffsetLookup { - "kind": "offsetlookup", - "offset": String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"baz\\"", - "unicode": false, - "value": "baz", - }, - "what": StaticLookup { - "kind": "staticlookup", - "offset": ConstRef { - "kind": "constref", - "name": "bar", - }, - "what": PropertyLookup { - "kind": "propertylookup", - "offset": ConstRef { - "kind": "constref", - "name": "foo", - }, - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "this", - }, - }, - }, - }, - }, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test variables Dynamic variables 1`] = ` -Program { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - }, - "operator": "=", - "right": String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"bar\\"", - "unicode": false, - "value": "bar", - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - }, - }, - "operator": "=", - "right": String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"bar\\"", - "unicode": false, - "value": "bar", - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": true, - "kind": "variable", - "name": Bin { - "kind": "bin", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "right": String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"bar\\"", - "unicode": false, - "value": "bar", - }, - "type": ".", - }, - }, - "operator": "=", - "right": String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"bar\\"", - "unicode": false, - "value": "bar", - }, - }, - Assign { - "kind": "assign", - "left": OffsetLookup { - "kind": "offsetlookup", - "offset": Bin { - "kind": "bin", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "right": String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"bar\\"", - "unicode": false, - "value": "bar", - }, - "type": ".", - }, - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "foo", - }, - }, - "operator": "=", - "right": String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"bar\\"", - "unicode": false, - "value": "bar", - }, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test variables Encaps var offset 1`] = ` -Program { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": Encapsed { - "kind": "encapsed", - "raw": "\\"{$a[1]}\\"", - "type": "string", - "value": Array [ - OffsetLookup { - "kind": "offsetlookup", - "offset": Number { - "kind": "number", - "value": "1", - }, - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - }, - ], - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": Encapsed { - "kind": "encapsed", - "raw": "\\"{$a[\\"a\\"]}\\"", - "type": "string", - "value": Array [ - OffsetLookup { - "kind": "offsetlookup", - "offset": String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"a\\"", - "unicode": false, - "value": "a", - }, - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - }, - ], - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": Encapsed { - "kind": "encapsed", - "raw": "\\"{$a[$b]}\\"", - "type": "string", - "value": Array [ - OffsetLookup { - "kind": "offsetlookup", - "offset": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - }, - ], - }, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test variables Variable chains 1`] = ` -Program { - "children": Array [ - StaticLookup { - "kind": "staticlookup", - "offset": OffsetLookup { - "kind": "offsetlookup", - "offset": Number { - "kind": "number", - "value": "2", - }, - "what": OffsetLookup { - "kind": "offsetlookup", - "offset": Number { - "kind": "number", - "value": "1", - }, - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - }, - }, - "what": Identifier { - "kind": "identifier", - "name": "foo", - "resolution": "uqn", - }, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test variables array destructuring 1`] = ` -Program { - "children": Array [ - Assign { - "kind": "assign", - "left": List { - "arguments": Array [ - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "id1", - }, - Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "name1", - }, - ], - "kind": "list", - "shortForm": true, - }, - "operator": "=", - "right": OffsetLookup { - "kind": "offsetlookup", - "offset": Number { - "kind": "number", - "value": "0", - }, - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "data", - }, - }, - }, - ], - "errors": Array [], - "kind": "program", -} -`; - -exports[`Test variables default variables 1`] = ` -Program { - "children": Array [ - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - "operator": "=", - "right": String { - "isDoubleQuote": true, - "kind": "string", - "raw": "\\"foo\\"", - "unicode": false, - "value": "foo", - }, - }, - Assign { - "kind": "assign", - "left": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "b", - }, - "operator": "=", - "right": Variable { - "byref": true, - "curly": false, - "kind": "variable", - "name": "c", - }, - }, - Assign { - "kind": "assign", - "left": PropertyLookup { - "kind": "propertylookup", - "offset": ConstRef { - "kind": "constref", - "name": "b", - }, - "what": Variable { - "byref": false, - "curly": false, - "kind": "variable", - "name": "a", - }, - }, - "operator": "=", - "right": Boolean { - "kind": "boolean", - "raw": "true", - "value": true, - }, - }, - ], - "errors": Array [], - "kind": "program", -} -`; diff --git a/test/snapshot/acid.test.js b/test/snapshot/acid.test.js deleted file mode 100644 index ec435a896..000000000 --- a/test/snapshot/acid.test.js +++ /dev/null @@ -1,172 +0,0 @@ -const parser = require('../main'); - -describe('Acid', () => { - it('level 1', () => { - expect(parser.parseCode(`#!/usr/bin/php - -Hello 'achoum', - 'bashful' => 'tadah' - ]; - /** - * Something is done here - */ - final public function doSomething() { - // do not wanna do - foreach($this->dwarf as $name => $greeting) { - echo "Hey ho $name, $greeting !"; - continue $foo; - } - throw new \\ComeToHome('Thats it'); - } - } - - interface Miror extends Object { - public function Am_I_Uggly() : bool; - protected function broken() : bool; - static protected function isWhiteSnowAlive() : bool; - } - - function iter() { - yield 'ator' => $foo; - yield from iter(50); - } - - trait Line { - public function draw(bool $arrow = false) : string { - switch($this->style) { - case 'dot': - case 'point': - $body = '......'; - break; - default: - $body = '-----'; - break; - } - return $body . ($arrow ? '>' : ''); - } - private function shuut() { - return __NAMESPACE__; - } - } - - // this is SPARTA ! - function sparta() : ?int { - global $persians; - - $index = -1; -next: - $guy = $persians[++$index]; - if(rand(0, 10)>5 || false) { - @$guy->kill(); - } else { - $guy->kick(...$foo); - } - if ((int)$index < count($persians)) goto next; - - return 300 | 5; - } - - $foo = function(?int $bar = 42) use($something) : bool { - static $banana; - if($bar > fooBar::NUMBAR) { - while($bar) { - if ((int)calculateMeaningOfLife() === 42) { - break foo; - } else continue; - } - do { - ?> - Caesar: here I was - crazy()->boom([1, 2, 3]); - } catch(Coco|Nut $ex) { - $ex->printStackTrace(); - } finally { - if (isset($bipbip, $ex)) unset($bipbip, $ex); - return (new class extends fooBar { - function goatIt() { - return "meeeh"; - } - })->goatIt(); - } - } else { - for($i = 0; $i < count($this->banana); $i++) { - $x %= ($i * 2) / ($i - 1); - $what = $this->$x[++$i] ? 'yes!': 'noo!'; - } - // @todo $this->a_$foo - return $$foo ?? false; - } - return empty(namespace\\FOOBAR); - }; - - if ($foo): - echo \`bar&\`; - elseif ($bar): - echo \`ls -larth\`; - endif; - - // list version - list(,$a, list($b, $c)) = [1, [2, 3]]; - [,$a,[$b, ,$c]] = $f; - print(<< { - it('deference array', () => { - expect( - parser.parseEval( - ['$a = [', '"a", "b"', ']($foo)[$foo->bar()[1]]->foo()'].join('\r'), - ), - ).toMatchSnapshot(); - }); - - it('of strings', () => { - expect( - parser.parseEval('array("item1", "item2", "item3")'), - ).toMatchSnapshot(); - }); - - it('of numbers', () => { - expect(parser.parseEval('array(1, 2.5, 0x1000)')).toMatchSnapshot(); - }); - - it('of strings and numbers', () => { - expect(parser.parseEval('array(1, "item2", 3, "item4")')).toMatchSnapshot(); - }); - - it('of variables', () => { - expect(parser.parseEval('array($obj1, $obj2, $obj3)')).toMatchSnapshot(); - }); - - it('of objects', () => { - expect( - parser.parseEval('[new foo(), new stdClass(), new bar()]'), - ).toMatchSnapshot(); - }); - - it('of arrays', () => { - expect( - parser.parseEval(` - array( - array("item1", "item2"), - array("item3", "item4"), - array("item5", "item6") - )`), - ).toMatchSnapshot(); - }); - - describe('mixed tests / coverage', function() { - it('test empty array', function() { - expect(parser.parseEval('$a = []; $b = array();')).toMatchSnapshot(); - }); - it('test short form / keys', function() { - expect( - parser.parseEval('[0 => &$foo, $bar => "foobar"];'), - ).toMatchSnapshot(); - }); - }); -}); diff --git a/test/snapshot/ast.test.js b/test/snapshot/ast.test.js deleted file mode 100644 index 3e4a83369..000000000 --- a/test/snapshot/ast.test.js +++ /dev/null @@ -1,99 +0,0 @@ -const parser = require('../main'); - -describe("Test AST structure", function() { - it('fix #127 - echo statements', () => { - expect(parser.parseEval('echo "hello"; ?> world')).toMatchSnapshot(); - }); - - it('fix #127 - inline', function() { - expect(parser.parseEval('?>?>?>')).toMatchSnapshot(); - }); - - it('test program', function() { - expect(parser.parseEval('')).toMatchSnapshot(); - }); - it("test syntax error", function() { - const parse = function() { - parser.parseEval(` - $a = 1 - $b = 2 - `); - }; - expect(parse).toThrowErrorMatchingSnapshot(); - }); - it("test inline", function() { - expect( - parser.parseCode("Hello \n !") - ).toMatchSnapshot(); - }); - - it("fix #120", function() { - expect( - parser.parseCode("\r\n !") - ).toMatchSnapshot(); - }); - - it("test magics", function() { - expect( - parser.parseEval("echo __FILE__, __DIR__;") - ).toMatchSnapshot(); - }); - it("test shell", function() { - expect( - parser.parseEval("echo `ls -larth`;") - ).toMatchSnapshot(); - }); - it("test clone", function() { - expect( - parser.parseEval("$a = clone $var;") - ).toMatchSnapshot(); - }); - it("test echo, isset, unset, empty", function() { - expect( - parser.parseEval(` - echo ($expr) ? "ok" : "ko"; - print "some text"; - isset($foo, $bar); - unset($var); - empty($var); - `) - ).toMatchSnapshot(); - }); - - it("test constants", function() { - expect( - parser.parseEval("const FOO = 3.14;") - ).toMatchSnapshot(); - }); - - it("test eval", function() { - expect( - parser.parseEval('eval("return true;");') - ).toMatchSnapshot(); - }); - it("test die/exit", function() { - expect( - parser.parseEval(` - die("bye"); - exit(-1); - `) - ).toMatchSnapshot(); - }); - - it("test coalesce operator", function() { - expect( - parser.parseEval("$var = $a ?? true;") - ).toMatchSnapshot(); - }); - - it("test include / require", function() { - expect( - parser.parseEval(` - include "file.php"; - include_once (PATH . "/file.php"); - require "req.php"; - require_once "file.php"; - `) - ).toMatchSnapshot(); - }); -}); diff --git a/test/snapshot/buffer.test.js b/test/snapshot/buffer.test.js deleted file mode 100644 index 3c26bcefc..000000000 --- a/test/snapshot/buffer.test.js +++ /dev/null @@ -1,8 +0,0 @@ -const parser = require('../main'); - -describe("Test buffers", function() { - it("handles buffers as input", function() { - var buffer = new Buffer('echo "test"'); - expect(parser.parseEval(buffer)).toMatchSnapshot(); - }); -}); diff --git a/test/snapshot/class.test.js b/test/snapshot/class.test.js deleted file mode 100644 index ee6fe13cf..000000000 --- a/test/snapshot/class.test.js +++ /dev/null @@ -1,94 +0,0 @@ -const parser = require('../main'); - -describe("Test classes", function() { - it("Validate usual declarations", function() { - expect(parser.parseEval(` - final class foo extends bar implements - bim, bam, boum { - const FOO = "azerty"; - public static $var; - public function __construct(array $data = null) { - $this->data = $data; - } - const list = "bar"; - public function new($foo = self::list) { - return $this::list; - } - protected $foo; - private $bar; - function foobar() {} - } - abstract class bar { - use A, B { - B::smallTalk insteadof A; - A::bigTalk insteadof B, C; - B::bigTalk as public talk; - B::bigTalk as protected talk; - B::bigTalk as private talk; - A::new as list; - list as new; - } - /** - * Some informations - */ - abstract protected function &foo() : bar; - }` - )).toMatchSnapshot(); - }); - - it("Advanced tests", function() { - expect(parser.parseEval(` - class foo implements boo { - use A; - use B { foo as bar; } - // comment - /* boo */ - /** doc - * data - foo - */ - var $var = true; - final function __construct() { } - private function boo() { } - } - interface boo extends something { - // some doc - const A = 1.5; - /** foo */ - protected function foo(); - } - trait line extends foo implements boo { - // some doc - const A = 1.5; - abstract protected function foo(); - } - `, { - parser: { extractDoc: true } - })).toMatchSnapshot(); - }); - - it("Test of silent mode", function() { - expect(parser.parseEval(` - class foo { - use A - use B { foo }; - }`, - { - parser: { suppressErrors: true } - } - )).toMatchSnapshot(); - }); - - it("Test js properties", function() { - expect(parser.parseEval(` - class __proto__ { - static $constructor; - public function constructor() {} - public function __proto__() { - $this->constructor = null; - self::$constructor = null; - } - }` - )).toMatchSnapshot(); - }); -}); diff --git a/test/snapshot/comment.test.js b/test/snapshot/comment.test.js deleted file mode 100644 index e8baaf835..000000000 --- a/test/snapshot/comment.test.js +++ /dev/null @@ -1,151 +0,0 @@ -const parser = require('../main'); - -describe("Test comments", function() { - describe("issues", function() { - it("fix #126 : new option", function() { - const ast = parser.parseEval( - ` - if (true) { - $a = 1; - } - // Don't parsed :( - else if (false) { - $a = 2; - } - `, - { - parser: { - extractDoc: true - } - } - ); - expect(ast).toMatchSnapshot(); - }); - it("fix #55", function() { - const ast = parser.parseEval( - ` - if (true): - if (true): - // inner statements - endif; // another comment - endif; // 2nd comment - `, - { - parser: { - extractDoc: true - // debug: true - } - } - ); - expect(ast).toMatchSnapshot(); - }); - }); - - it("test single line comments", function() { - const ast = parser.parseEval( - ` - # some information - // another line - $foo = 123 // 123 - ; /* done */ - `, - { - parser: { - extractDoc: true - } - } - ); - expect(ast).toMatchSnapshot(); - }); - - describe("multi line comments", function() { - it("test function", function() { - const ast = parser.parseEval( - ` - /** - * Description - */ - function /* ignore */ & /* ignore */ name(/* @var something */ $arg) { - // inner - return $arg /* ignore */; - } - `, - { - parser: { - extractDoc: true - } - } - ); - expect(ast).toMatchSnapshot(); - }); - it("test if statements", function() { - const ast = parser.parseEval( - ` - if /* ignore */ (/* */ true) /* ignore */ { - # inner statement - } /* ignore */ else /* ignore */ - // else with a inner if single statement : - if (true /* ignore */) /* ignore */ { - } /* ignore */ elseif /* ignore */ (/* ignore */ false /* ignore */ /* ignore */) /* ignore */ /* ignore */ { - } /* ignore */ else /* ignore */ { - } - if (false) /* ignore */ : /* ignore */ - /* ignore */ endif /* ignore */;/* ignore */ - `, - { - parser: { - extractDoc: true - } - } - ); - expect(ast).toMatchSnapshot(); - }); - it("test try statements", function() { - const ast = parser.parseEval( - ` - try /* ignore */ { - # inner statement - } /* dd */ catch(/* zz */ \\Exception /* 1 */ | /* 2 */ \\Foo /* aa */ $e /* bb */) /* dd */ { - /* ee */ - } /* zz */ finally /* yy */ { - /* ignore */ - } // end - `, - { - parser: { - extractDoc: true - } - } - ); - expect(ast).toMatchSnapshot(); - }); - }); - - it("test classes", function() { - const ast = parser.parseEval( - ` - /** - * Description - */ - class /* ignore */ name /* hehe */ { - // @var test - protected $test, $toto; - // ignored comment - /** @var Class */ - static public $foo = 123; - /** ignored also **/ - /** - * @return void - */ - public function void() { } - } - `, - { - parser: { - extractDoc: true - } - } - ); - expect(ast).toMatchSnapshot(); - }); -}); diff --git a/test/snapshot/expr.test.js b/test/snapshot/expr.test.js deleted file mode 100644 index ac22ee54e..000000000 --- a/test/snapshot/expr.test.js +++ /dev/null @@ -1,207 +0,0 @@ -const parser = require('../main'); - -describe("Test expressions", function() { - it("test binary", function() { - const ast = parser.parseEval( - ` - 1 | 3; - 1 & 3; - 1 ^ 3; - "1" . "3"; - 1 + 3; - 1 - 3; - 1 * 3; - 1 / 3; - 1 % 3; - 1 ** 3; - 1 << 3; - 1 >> 3; - ` - ); - expect(ast).toMatchSnapshot(); - }); - - it("test more binary ops (formerly bool)", function() { - const ast = parser.parseEval( - ` - $a && $b; - $a AND $b; - $a || $b; - $a OR $b; - $a XOR $b; - $a === $b; - $a !== $b; - $a == $b; - $a != $b; - $a > $b; - $a < $b; - $a >= $b; - $a <= $b; - $a <=> $b; - $a instanceof $b; - ` - ); - expect(ast).toMatchSnapshot(); - }); - - it("test assignements", function() { - const ast = parser.parseEval( - ` - $a = $b; - $a .= $b; - $a += $b; - $a -= $b; - $a *= $b; - $a **= $b; - $a /= $b; - $a &= $b; - $a |= $b; - $a %= $b; - $a ^= $b; - $a <<= $b; - $a >>= $b; - ` - ); - expect(ast).toMatchSnapshot(); - }); - - it("test if based returns", function() { - const ast = parser.parseEval( - ` - $a ?? false; - $a > 5 ? true : false; - $a ?: false; - ` - ); - expect(ast).toMatchSnapshot(); - }); - - it("test silent", function() { - const ast = parser.parseEval("@trigger_error();"); - expect(ast).toMatchSnapshot(); - }); - - it("test generators", function() { - const ast = parser.parseEval( - ` - function gen() { - yield 0; // key 0 - yield from foo(); // keys 0-2 - yield 1 => $a; // key 1 - } - ` - ); - expect(ast).toMatchSnapshot(); - }); - - it("test unary", function() { - const ast = parser.parseEval( - ` - +$var; - ~$var; - !$var; - -$var; - ` - ); - expect(ast).toMatchSnapshot(); - }); - - it("test cast", function() { - const ast = parser.parseEval( - ` - (int)$var; - (integer)$var; - (bool)$var; - (boolean)$var; - (float)$var; - (double)$var; - (real)$var; - (string)$var; - (binary)$var; - (array)$var; - (object)$var; - (unset)$var; - ` - ); - expect(ast).toMatchSnapshot(); - }); - - it("test exit", function() { - const ast = parser.parseEval( - ` - exit(1); - die(); - exit; - ` - ); - expect(ast).toMatchSnapshot(); - }); - - it("test incr/decr", function() { - const ast = parser.parseEval( - ` - $i++; - $i--; - ++$i; - --$i; - `, - { - ast: { - withPositions: true - } - } - ); - expect(ast).toMatchSnapshot(); - }); - - it("should fail to assign constants", function() { - const ast = parser.parseEval("a = 1;", { - parser: { debug: false, suppressErrors: true } - }); - expect(ast).toMatchSnapshot(); - }); - - it("should fail to assign class constants", function() { - const ast = parser.parseEval("foo::b = 1;", { - parser: { debug: false, suppressErrors: true } - }); - expect(ast).toMatchSnapshot(); - }); - - it("should assign class static", function() { - const ast = parser.parseEval("a::$b = 1;", { - parser: { debug: false, suppressErrors: true } - }); - expect(ast).toMatchSnapshot(); - }); - - it("test new", function() { - const ast = parser.parseEval( - ` - $a = new \\foo(); - $a = new namespace\\foo::class(); - $a = new $foo(); - $a = new class extends foo implements bar { }; - `, - { - parser: { debug: false } - } - ); - expect(ast).toMatchSnapshot(); - }); - - it("test nested expressions precedence", function() { - const ast = parser.parseEval( - ` - $a = 5 * 2 + 1; // same as ((5 * 2) + 1) - $b = 5 * (2 + 1); - $c = 1 + 2 / 3 + 4; // same as (1 + ((2 / 3) + 4)) - $d = 1 !== 2 && 3; // same as (1 !== 2) && 3 - `, - { - parser: { debug: false } - } - ); - expect(ast).toMatchSnapshot(); - }); -}); diff --git a/test/snapshot/function.test.js b/test/snapshot/function.test.js deleted file mode 100644 index ce073e999..000000000 --- a/test/snapshot/function.test.js +++ /dev/null @@ -1,39 +0,0 @@ -const parser = require('../main'); - -describe("Function tests", function() { - it("test function parsing", function() { - const ast = parser.parseEval( - ` - function &foo($a = 1, callable $b, ?array &...$params) : ?boolean {} - $a = function &($b) use(&$c, $d) : array { - return true; - }; - $b = foo(...[1, null, 1, 2, 3]); - ` - ); - expect(ast).toMatchSnapshot(); - }); - - it("test variadic error", function() { - const astErr = parser.parseEval(`$b = foo(...[1, 2, 3], $a);`, { - parser: { - suppressErrors: true - } - }); - expect(astErr).toMatchSnapshot(); - }); - - it("test reserved word for function name error", function() { - const astErr = parser.parseEval(`function list() {}`, { - parser: { - suppressErrors: true - } - }); - expect(astErr).toMatchSnapshot(); - }); - - it("test static closure", function() { - const ast = parser.parseEval("$a = static function() {};"); - expect(ast).toMatchSnapshot(); - }); -}); diff --git a/test/snapshot/graceful.test.js b/test/snapshot/graceful.test.js deleted file mode 100644 index 0d42e7c38..000000000 --- a/test/snapshot/graceful.test.js +++ /dev/null @@ -1,50 +0,0 @@ -const parser = require('../main'); - -describe("Test graceful mode", function() { - describe("to suppress errors", function() { - var test = parser.create({ - parser: { - suppressErrors: true - } - }); - - it("should contain 2 errors", function() { - expect(test.parseEval([ - "$var = ", // 1. - "function() {", // 2. - "$foo = ", // 3. <-- missing expr - "}", // 4. - "}" // 5. <-- extra '}' token here - ].join("\n"))).toMatchSnapshot(); - }); - - it("test expr", function() { - expect(test.parseEval("$a = $b -; $foo = $a;")).toMatchSnapshot(); - }); - - it("test class", function() { - expect(test.parseEval("class foo { foo const A = 1 ")).toMatchSnapshot(); - }); - - it("test flags", function() { - expect(test.parseEval(` - final final interface foo { - abstract function func() - `)).toMatchSnapshot(); - }); - - it("test function arguments", function() { - expect(test.parseEval(` - $foo->bar($arg, ); - $foo = new bar($baz, ,$foo); - `)).toMatchSnapshot(); - }); - - it("test method chains", function() { - expect(test.parseEval(` - $controller->expects($this->once()) - -> - `)).toMatchSnapshot(); - }); - }); -}); diff --git a/test/snapshot/if.test.js b/test/snapshot/if.test.js deleted file mode 100644 index 719caab60..000000000 --- a/test/snapshot/if.test.js +++ /dev/null @@ -1,120 +0,0 @@ -const parser = require('../main'); - -describe("Test IF statements", function() { - it("test common cases", function() { - const ast = parser.parseEval( - ` - if (true) { - echo "is true"; - } else if (false) { - echo "false"; - } elseif (false) { - echo "2nd"; - } else { - echo "else"; - } - `, - { - parser: { debug: false } - } - ); - expect(ast).toMatchSnapshot(); - }); - - it("test short form", function() { - const ast = parser.parseEval( - ` - if (true): - echo "is true"; - elseif (false): - echo "false"; - else: - echo "else"; - endif; - `, - { - parser: { debug: false } - } - ); - expect(ast).toMatchSnapshot(); - }); - - it("test various cases", function() { - const ast = parser.parseEval( - ` - if (true): - echo "is true"; - elseif (false): - echo "false"; - elseif (false): - echo "false"; - endif; - if (true): - echo "is true"; - else: - echo "false"; - endif; - `, - { - parser: { debug: false } - } - ); - expect(ast).toMatchSnapshot(); - }); - - it("test issue #84", function() { - const ast = parser.parseCode( - ` - - - - `, - { - parser: { debug: false } - } - ); - expect(ast).toMatchSnapshot(); - }); - it("test issue #168", () => { - - // should be ok - let ast = parser.parseCode( - ` - `, - { - ast: { - withPositions: true, - withSource: true - } - } - ); - expect(ast).toMatchSnapshot(); - - // should ignore ?> - ast = parser.parseCode( - ` - `, - { - ast: { - withPositions: true, - withSource: true - } - } - ); - expect(ast).toMatchSnapshot(); - - // should include ';' - ast = parser.parseCode( - `", { - lexer: { - short_tags: true - } - })).toMatchSnapshot(); - }); - - it("parse short echo", function() { - expect(parser.parseCode("", { - lexer: { - short_tags: true - } - })).toMatchSnapshot(); - }); - - it("parse asp tag", function() { - expect(parser.parseCode("<% echo $b; %>", { - lexer: { - short_tags: true, - asp_tags: true - } - })).toMatchSnapshot(); - }); - - it("parse asp echo tag", function() { - expect(parser.parseCode("<%= $b %>", { - lexer: { - short_tags: true, - asp_tags: true - } - })).toMatchSnapshot(); - }); - }); - - it("test comments", function() { - expect(parser.parseCode(` - - <% - // another line %> - - list;')).toMatchSnapshot(); - }); -}); diff --git a/test/snapshot/list.test.js b/test/snapshot/list.test.js deleted file mode 100644 index c7ab7d3b8..000000000 --- a/test/snapshot/list.test.js +++ /dev/null @@ -1,34 +0,0 @@ -const parser = require('../main'); - -describe("Test list expressions", function() { - it("test list statements", function() { - const ast = parser.parseEval(`list($a => list($c,$d,,$e,), $b) = [1, 2];`, { - ast: { - withPositions: true - } - }); - expect(ast).toMatchSnapshot(); - }); - - it("test short list", function() { - expect(parser.parseEval(`[$a => [$c,$d,,$e,], $b] = [1 => [5, 6, 7, 8, 9,], 2];`, { - ast: { - withPositions: true - } - })).toMatchSnapshot(); - }); - - it("fix #150", function() { - const ast = parser.parseEval("list('foo' => $bar) = ['foo' => 'bar'];"); - expect(ast).toMatchSnapshot(); - }); - - it("fix #137", function() { - const ast = parser.parseEval("list(,,$a,,$b) = [null, 1, null, 2];", { - ast: { - withPositions: true - } - }); - expect(ast).toMatchSnapshot(); - }); -}); \ No newline at end of file diff --git a/test/snapshot/location.test.js b/test/snapshot/location.test.js deleted file mode 100644 index 6db3e4621..000000000 --- a/test/snapshot/location.test.js +++ /dev/null @@ -1,28 +0,0 @@ -const parser = require('../main'); - -describe('Test locations', function() { - it('#164 : expr must include ;', function() { - expect( - parser.parseEval( - '$a = $b + 1;', { - ast: { - withPositions: true, - withSource: true - } - } - ) - ).toMatchSnapshot(); - }); - it('#164 : expr should avoid ?>', function() { - expect( - parser.parseCode( - '', { - ast: { - withPositions: true, - withSource: true - } - } - ) - ).toMatchSnapshot(); - }); -}); \ No newline at end of file diff --git a/test/snapshot/loop.test.js b/test/snapshot/loop.test.js deleted file mode 100644 index 701c282bf..000000000 --- a/test/snapshot/loop.test.js +++ /dev/null @@ -1,76 +0,0 @@ -const parser = require('../main'); - -describe("Test loops statements (for, while)", function() { - describe("test while", function() { - it("test default form", function() { - expect(parser.parseEval(` - while(true) { - echo "go"; - } - `)).toMatchSnapshot(); - }); - - it("test short form", function() { - expect(parser.parseEval(` - while(true): - echo "short"; - endwhile; - `)).toMatchSnapshot(); - }); - }); - - it("test do", function() { - expect(parser.parseEval(` - do { - echo "something"; - } while(true); - `, { - parser: { debug: false } - })).toMatchSnapshot(); - }); - - it("test for", function() { - expect(parser.parseEval(` - for($i = 0, $b = 0; $i < 10, $ok; $i++) - echo $i; - for(;;): - echo $ok; - continue 5; - continue(5); - endfor; - `, { - parser: { debug: false } - })).toMatchSnapshot(); - }); - - it("test foreach", function() { - expect(parser.parseEval(` - foreach(&$foo as $v) - echo "$k -> $v\n"; - foreach( - [[1,2], [3,4]] as - $a => - [$c, $d] - ): - echo "$a -> $b\n"; - endforeach; - `, { - parser: { debug: false } - })).toMatchSnapshot(); - }); - it("fix #122", function() { - // https://github.com/glayzzle/php-parser/issues/122 - expect(parser.parseEval(` - foreach($foo as $bar => array($foo)) - echo "$k -> $v\n"; - `, { - parser: { suppressErrors: true } - })).toMatchSnapshot(); - expect(parser.parseEval(` - foreach($foo as [$bar] => $foo) - echo "$k -> $v\n"; - `, { - parser: { suppressErrors: true } - })).toMatchSnapshot(); - }) -}); diff --git a/test/snapshot/namespace.test.js b/test/snapshot/namespace.test.js deleted file mode 100644 index 320b99f75..000000000 --- a/test/snapshot/namespace.test.js +++ /dev/null @@ -1,140 +0,0 @@ -const parser = require('../main'); - -describe("Test namespace statements", function() { - - it("test single namespace", function() { - expect(parser.parseEval(` - namespace foo; - use bar\\baz as barBaz; - use const bar\\baz as barBaz, baz\\boo as bazBoo; - use function bar\\baz as barBaz, baz\\boo as bazBoo; - use bar\\baz { - const FOO as BAZ_FOO, - function BOO as BAZ_BOO - }; - use const azerty { - A as AZERTY_A, - B as AZERTY_B - }; - $a = namespace\\barBaz; - $b = \\barBaz; - $c = barBaz\\foo; - $d = barBaz; - `, { - parser: { - debug: false - } - })).toMatchSnapshot(); - }); - - it("test multiple namespace", function() { - expect(parser.parseEval(` - namespace \\foo { - $i++; - } - namespace { - $b++; - } - `, { - parser: { - debug: false - } - })).toMatchSnapshot(); - }); - - it("test namespace keyword", function() { - expect(parser.parseEval(` - namespace\\foo(); - $var = namespace\\bar; - `, { - parser: { - debug: false - } - })).toMatchSnapshot(); - }); - - it("test namespace error", function() { - expect(parser.parseEval(` - namespace $var = true; - `, { - parser: { - debug: false, - suppressErrors: true - } - })).toMatchSnapshot(); - }); - - it("check namespace", function() { - // @todo - }); - - it("check use", function() { - // @todo - }); - - it("check resolution", function() { - // @todo - }); - - it("check silent mode", function() { - expect(parser.parseEval(` - namespace $var = true; - `, { - parser: { - debug: false, - suppressErrors: true - } - })).toMatchSnapshot(); - }); - - it("work with declare statement", function() { - expect(parser.parseEval(` - declare(strict_types=1); - namespace foo; - class bar {} - `)).toMatchSnapshot(); - }); - - describe("read usegroup location correctly", function() { - const testString = ` - namespace Test\\test\\test; - - use Some\\other\\test; - - /** - * @property \\Test\\test $test - */ - class Foo extends Bar implements Baz, Buzz { - public $test; - - function test() { - return true; - } - - public function &passByReferenceTest() { - $a = 1; - return $a; - } - } - `; - - it("without docs", function() { - expect(parser.parseEval(testString, { - ast: { - withPositions: true - } - })).toMatchSnapshot() - }); - - it("with docs", function() { - expect(parser.parseEval(testString, { - ast: { - withPositions: true - }, - parser: { - extractDoc: true - } - })).toMatchSnapshot() - }); - }); -}); diff --git a/test/snapshot/number.test.js b/test/snapshot/number.test.js deleted file mode 100644 index 56601fe35..000000000 --- a/test/snapshot/number.test.js +++ /dev/null @@ -1,32 +0,0 @@ -const parser = require('../main'); - -describe("Test numbers", function() { - it("test common cases", function() { - expect(parser.parseEval(` - $a = -1.5; - $b = 1234; - $c = 9223372036854775807; - $c = 9223372036854775808; - $d = 0x1A; - $d = 0xFF; - $e = 0b1011; - $f = 0123; - $g = 1.2e3; - $h = 7E-10; - `)).toMatchSnapshot(); - }); - - it("test edge cases", function() { - expect(parser.parseEval(` - $a = 0xx; - $b = 0b2; - $c = 01239; - $d = 7E-a; - $e = 7EX; - `, { - parser: { - suppressErrors: true - } - })).toMatchSnapshot(); - }); -}); diff --git a/test/snapshot/php5.test.js b/test/snapshot/php5.test.js deleted file mode 100644 index 8c9fafb6b..000000000 --- a/test/snapshot/php5.test.js +++ /dev/null @@ -1,14 +0,0 @@ -const parser = require('../main'); - -describe('Test syntax parsing without PHP7 support', function() { - - it('special keywords should fail', function() { - var ast = parser.parseEval('class foo { function list() { } }', { - parser: { - php7: false, - suppressErrors: true - } - }); - expect(ast).toMatchSnapshot(); - }); -}); diff --git a/test/snapshot/scalar.test.js b/test/snapshot/scalar.test.js deleted file mode 100644 index 0fc6830fb..000000000 --- a/test/snapshot/scalar.test.js +++ /dev/null @@ -1,16 +0,0 @@ -const parser = require('../main'); - -describe("Test scalar statements", function() { - it("test constants", function() { - expect(parser.parseEval('$a = foo::ref[-5];')).toMatchSnapshot(); - }); - - it("test dereferencable", function() { - expect(parser.parseEval(` - $a = foo::bar()[5]->test; - $b = (new test())->foo(); - $c = (foo())[5]; - $d = (function($a) { return $a * 2; })(5); - `)).toMatchSnapshot(); - }); -}); diff --git a/test/snapshot/statement.test.js b/test/snapshot/statement.test.js deleted file mode 100644 index f63d50625..000000000 --- a/test/snapshot/statement.test.js +++ /dev/null @@ -1,111 +0,0 @@ -const parser = require('../main'); - -describe("Test statements", function() { - it("test goto label", function() { - expect(parser.parseEval(` - start: - $i++; - goto start; - `)).toMatchSnapshot(); - }); - - it("test global", function() { - expect(parser.parseEval(` - function foo() { - global $a, $b; - } - `)).toMatchSnapshot(); - }); - - describe('halt statements', function() { - it("test halt statement", function() { - expect(parser.parseEval(` - $a = 1; - __halt_compiler(); - $b = 1; - `, { - parser: { debug: false } - })).toMatchSnapshot(); - }); - - it("test inner error", function() { - expect(() => { - parser.parseEval(` - if (true) { - __halt_compiler(); - } - `) - }).toThrow(); - }); - - it("test fallback", function() { - expect(parser.parseEval(` - if (true) { - __halt_compiler(); - } - $b = 1; - `, { - parser: { suppressErrors: true } - })).toMatchSnapshot(); - }); - }); - - it("test static", function() { - expect(parser.parseEval(` - function foo() { - static $a, $b = 5; - } - static $sVar1 = 11; - `, { - parser: { debug: false } - })).toMatchSnapshot(); - }); - - it("test declare", function() { - expect(parser.parseEval(` - if (true) { declare(ticks=1); } - $a = 1; - declare(ticks=2,encoding=ISO-8859-1); - $b = 1; - declare(ticks=1) { - $c = 2; - } - declare(encoding="UTF-8"): - $d = 3; - enddeclare; - $e = 4; - `, { - parser: { debug: false } - })).toMatchSnapshot(); - }); - - it("test try", function() { - expect(parser.parseEval(` - try { - foo(); - } catch(FooError|BarError $err) { - var_dump($err); - throw $err; - } finally { - clean(); - } - `, { - parser: { debug: false } - })).toMatchSnapshot(); - }); - - it("test inner statements", function() { - expect(parser.parseEval(` - if (true) { - function foo() {} - abstract class foo {} - final class foo {} - class foo {} - trait foo {} - interface foo {} - } - `, { - parser: { debug: false } - })).toMatchSnapshot(); - }); -}); diff --git a/test/snapshot/string.test.js b/test/snapshot/string.test.js deleted file mode 100644 index 0f256b6f8..000000000 --- a/test/snapshot/string.test.js +++ /dev/null @@ -1,317 +0,0 @@ -const parser = require('../main'); - -describe("Test strings", function() { - it("fix #144", function() { - expect(parser.parseEval('"encapsed \\\" {$var}";')).toMatchSnapshot(); - }); - - describe("fix #101", function() { - it("case 1", function() { - expect(parser.parseEval('"encapsed {$var}";')).toMatchSnapshot(); - }); - - it("case 2", function() { - expect(parser.parseEval('"encapsed {$arr[0]}";')).toMatchSnapshot(); - }); - - it("case 3", function() { - expect(parser.parseEval('"encapsed ${var}";')).toMatchSnapshot(); - }); - }); - - it("fix #124", function() { - expect(parser.parseEval('$string = "He drank some $juices[koolaid1] juice.";')).toMatchSnapshot(); - }); - - it("fix #123", function() { - expect(parser.parseEval("$string = 'Avoid converting \n chars, but \\' or \\\\ is ok.';")).toMatchSnapshot(); - }); - - it("implement #116", function() { - expect(parser.parseEval(`$a = "foo\\nbar";`)).toMatchSnapshot(); - }); - - it("fix #149", function() { - expect(parser.parseEval(`$a = b"foo\\nbar";`)).toMatchSnapshot(); - }); - - it("test binary with double quotes", function() { - expect(parser.parseEval(`echo b"\\colors contains >$colors<\\n";`)).toMatchSnapshot(); - }); - - describe("check infinite on $", function() { - it("using doublequotes", function() { - expect(parser.parseEval(`echo "$`, { - parser: { suppressErrors: true, debug: false }, - lexer: { debug: false } - })).toMatchSnapshot(); - }); - - it("using backquotes", function() { - expect(parser.parseEval("echo `$", { - parser: { suppressErrors: true, debug: false }, - lexer: { debug: false } - })).toMatchSnapshot(); - }); - - it("with arrow", function() { - expect(parser.parseEval("echo ` -> $", { - parser: { suppressErrors: true, debug: false }, - lexer: { debug: false } - })).toMatchSnapshot(); - }); - }); - - describe("check infinite on {", function() { - it("using doublequotes", function() { - expect(parser.parseEval(`echo "{`, { - parser: { suppressErrors: true, debug: false }, - lexer: { debug: false } - })).toMatchSnapshot(); - }); - - it("using backquotes", function() { - expect(parser.parseEval("echo `{", { - parser: { suppressErrors: true, debug: false }, - lexer: { debug: false } - })).toMatchSnapshot(); - }); - - it("with arrow", function() { - expect(parser.parseEval("echo ` -> {", { - parser: { suppressErrors: true, debug: false }, - lexer: { debug: false } - })).toMatchSnapshot(); - }); - }); - - describe("check infinite on ${", function() { - it("using doublequotes", function() { - expect(parser.parseEval('echo "${', { - parser: { suppressErrors: true, debug: false }, - lexer: { debug: false } - })).toMatchSnapshot(); - }); - - it("using backquotes", function() { - expect(parser.parseEval("echo `${", { - parser: { suppressErrors: true, debug: false }, - lexer: { debug: false } - })).toMatchSnapshot(); - }); - - it("with arrow", function() { - expect(parser.parseEval("echo ` -> ${", { - parser: { suppressErrors: true, debug: false }, - lexer: { debug: false } - })).toMatchSnapshot(); - }); - }); - - describe("check infinite on {$", function() { - it("using doublequotes", function() { - expect(parser.parseEval('echo "{$', { - parser: { suppressErrors: true, debug: false }, - lexer: { debug: false } - })).toMatchSnapshot(); - }); - - it("using backquotes", function() { - expect(parser.parseEval("echo `{$", { - parser: { suppressErrors: true, debug: false }, - lexer: { debug: false } - })).toMatchSnapshot(); - }); - - it("with arrow", function() { - expect(parser.parseEval("echo ` -> {$", { - parser: { suppressErrors: true, debug: false }, - lexer: { debug: false } - })).toMatchSnapshot(); - }); - }); - - it.skip("binary cast", function() { - expect(parser.parseEval(`echo (binary)"\\colors[1] contains >$colors[1]<\\n";`)).toMatchSnapshot(); - }); - - it("test encapsed variable", function() { - expect(parser.parseEval(` - echo "Hello $obj->name !"; - echo "Hello $obj->foo->bar !"; - echo "Hello $obj[1]->foo !"; - `)).toMatchSnapshot(); - }); - - it("encapsed variable / curly varname", function() { - expect(parser.parseEval('echo "Hello ${obj}->name !";')).toMatchSnapshot(); - }); - - it("encapsed variable / curly constant", function() { - expect(parser.parseEval('echo "Hello ${ obj }";')).toMatchSnapshot(); - }); - - it("encapsed variable / offsetlookup", function() { - expect(parser.parseEval('echo "${$parts[$i]}\\n";')).toMatchSnapshot(); - }); - - it("test double quotes", function() { - expect(parser.parseEval([ - '$a = "$";', - '$a = "{";', - '$a = "-$-";', - '$a = "-{";', - '$a = "$b";', - '$a = "{$b}";', - '$a = "${$b}";', - '$a = "-$b?";', - '$a = "-{$b}";', - '$a = "-${$b}";', - '$a = "";', - '$a = "\\"";' - ].join("\r\n"), { - lexer: { - debug: false - }, - parser: { - debug: false - } - })).toMatchSnapshot(); - }); - - it("...", function() { - var ast = parser.parseEval('echo B"\\colors[1] contains >$colors[1]<\\n";'); - }); - - it("...", function() { - var ast = parser.parseEval('echo "\\colors[1] contains >$colors [1]<\\n";'); - }); - - it("...", function() { - var ast = parser.parseEval("echo \"~'.{{$expectedLength}}'\\$~s\";"); - }); - - it("...", function() { - var ast = parser.parseEval("$a = b'\\t\\ra';"); - }); - - it("...", function() { - var ast = parser.parseEval('$foo = array("v1.09azAZ-._~!$", true);'); - }); - - it("...", function() { - var ast = parser.parseEval('$v = strtolower("$i.$j.$k-$rel");'); - }); - - it("...", function() { - var ast = parser.parseEval('$text = "$text at line $line";'); - }); - - it("...", function() { - var ast = parser.parseEval( - "return \"Class.create('$package$className',{\";" - ); - }); - - it("...", function() { - var ast = parser.parseEval("echo \"yo : {$feeds[0]['title[0][value]']}\";"); - }); - - it("...", function() { - var ast = parser.parseEval('return "\\x1B[{$color}m{$str}\\x1B[0m";'); - }); - - it("...", function() { - var ast = parser.parseEval('echo "\\"$parts[0]\\"\\n";'); - }); - - it("...", function() { - var ast = parser.parseEval('echo "Hello {".$obj->name."} !";'); - }); - - it("...", function() { - var ast = parser.parseEval('echo "Hello {$obj->name} !";'); - }); - - it("test encapsed elements", function() { - expect(parser.parseEval([ - "$code = <<<\t EOFX", - "{$this->docStar}", - "${$foo}", - "${targetDirs[1]}", - "$test[1]", - "$test->foo", - "EOFX;" - ].join("\r"), { - parser: { - debug: false - } - })).toMatchSnapshot(); - }); - - it("test nowdoc label and contents", function() { - expect(parser.parseEval(["$code .= <<<'EOF'", " }", "EOF;"].join("\r\n"), { - parser: { - debug: false - } - })).toMatchSnapshot(); - }); - - it.skip("heredoc ...", function() { - expect(parser.parseEval(` - $fallbackContent .= sprintf(<<addFallbackCatalogue(\\$catalogue%s); - EOF2 - ) - `)).toMatchSnapshot(); - }); - - it("test empty nowdoc & heredoc contents", function() { - expect(parser.parseEval(` - echo << bug ", { - parser: { - debug: false, - extractTokens: true - } - }); - expect(ast).toMatchSnapshot(); - }); -}); diff --git a/test/snapshot/variable.test.js b/test/snapshot/variable.test.js deleted file mode 100644 index 6c932254d..000000000 --- a/test/snapshot/variable.test.js +++ /dev/null @@ -1,98 +0,0 @@ -const parser = require('../main'); - -describe("Test variables", function() { - it("array destructuring", function() { - expect(parser.parseEval("[$id1, $name1] = $data[0];")).toMatchSnapshot(); - }); - - it("default variables", function() { - expect(parser.parseEval(` - $a = "foo"; - $b = &$c; - $a->b = true;` - )).toMatchSnapshot(); - }); - - it("Variable chains", function() { - expect(parser.parseEval("foo::$a[1][2];")).toMatchSnapshot(); - }); - - it("Class constants", function() { - expect(parser.parseEval(` - static::foo(); - self::foo(); - parent::foo(); - foo::class; - $this->foo(); - foo::$bar; - $this->foo::bar["baz"]::qux();` - )).toMatchSnapshot(); - }); - - it("Encaps var offset", function() { - expect(parser.parseEval(` - $a = "{$a[1]}"; - $a = "{$a["a"]}"; - $a = "{$a[$b]}";` - )).toMatchSnapshot(); - }); - - it("Chained encapsed vars", function() { - expect(parser.parseEval( - ` - $a = "{$a->foo()[$bar[$foo]]}"; - ` - )).toMatchSnapshot(); - }); - - it("Dynamic variables", function() { - expect(parser.parseEval(` - $$a = "bar"; - $$$a = "bar"; - \${$a."bar"} = "bar"; - $foo{$a."bar"} = "bar"; - `)).toMatchSnapshot(); - }); - - describe("Check errors", function() { - it("should be ?", function() { - expect(parser.parseEval("$? = true;", { - parser: { - suppressErrors: true - } - })).toMatchSnapshot(); - }); - - it("should fail on double static lookup", function() { - expect(parser.parseEval(["this->foo::bar::baz;"].join("\n"), { - parser: { - suppressErrors: true - } - })).toMatchSnapshot(); - }); - - it("should fail on property lookup on static lookup", function() { - expect(parser.parseEval(["$this->foo::bar->baz;"].join("\n"), { - parser: { - suppressErrors: true - } - })).toMatchSnapshot(); - }); - - it("should fail $foo->bar::!", function() { - expect(parser.parseEval("$foo->bar::!", { - parser: { - suppressErrors: true - } - })).toMatchSnapshot(); - }); - - it("should fail foo::bar::baz", function() { - expect(parser.parseEval("foo::bar::baz", { - parser: { - suppressErrors: true - } - })).toMatchSnapshot(); - }); - }); -}); diff --git a/tokens.js.html b/tokens.js.html new file mode 100644 index 000000000..1cd992a2d --- /dev/null +++ b/tokens.js.html @@ -0,0 +1,394 @@ + + + + + + + + + + + tokens.js - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ tokens.js +

+ + + + + +
+
+
/**
+ * Copyright (C) 2018 Glayzzle (BSD3 License)
+ * @authors https://github.com/glayzzle/php-parser/graphs/contributors
+ * @url http://glayzzle.com
+ */
+"use strict";
+
+/**
+ * PHP AST Tokens
+ * @type {Object}
+ */
+module.exports = {
+  values: {
+    101: "T_HALT_COMPILER",
+    102: "T_USE",
+    103: "T_ENCAPSED_AND_WHITESPACE",
+    104: "T_OBJECT_OPERATOR",
+    105: "T_STRING",
+    106: "T_DOLLAR_OPEN_CURLY_BRACES",
+    107: "T_STRING_VARNAME",
+    108: "T_CURLY_OPEN",
+    109: "T_NUM_STRING",
+    110: "T_ISSET",
+    111: "T_EMPTY",
+    112: "T_INCLUDE",
+    113: "T_INCLUDE_ONCE",
+    114: "T_EVAL",
+    115: "T_REQUIRE",
+    116: "T_REQUIRE_ONCE",
+    117: "T_NAMESPACE",
+    118: "T_NS_SEPARATOR",
+    119: "T_AS",
+    120: "T_IF",
+    121: "T_ENDIF",
+    122: "T_WHILE",
+    123: "T_DO",
+    124: "T_FOR",
+    125: "T_SWITCH",
+    126: "T_BREAK",
+    127: "T_CONTINUE",
+    128: "T_RETURN",
+    129: "T_GLOBAL",
+    130: "T_STATIC",
+    131: "T_ECHO",
+    132: "T_INLINE_HTML",
+    133: "T_UNSET",
+    134: "T_FOREACH",
+    135: "T_DECLARE",
+    136: "T_TRY",
+    137: "T_THROW",
+    138: "T_GOTO",
+    139: "T_FINALLY",
+    140: "T_CATCH",
+    141: "T_ENDDECLARE",
+    142: "T_LIST",
+    143: "T_CLONE",
+    144: "T_PLUS_EQUAL",
+    145: "T_MINUS_EQUAL",
+    146: "T_MUL_EQUAL",
+    147: "T_DIV_EQUAL",
+    148: "T_CONCAT_EQUAL",
+    149: "T_MOD_EQUAL",
+    150: "T_AND_EQUAL",
+    151: "T_OR_EQUAL",
+    152: "T_XOR_EQUAL",
+    153: "T_SL_EQUAL",
+    154: "T_SR_EQUAL",
+    155: "T_INC",
+    156: "T_DEC",
+    157: "T_BOOLEAN_OR",
+    158: "T_BOOLEAN_AND",
+    159: "T_LOGICAL_OR",
+    160: "T_LOGICAL_AND",
+    161: "T_LOGICAL_XOR",
+    162: "T_SL",
+    163: "T_SR",
+    164: "T_IS_IDENTICAL",
+    165: "T_IS_NOT_IDENTICAL",
+    166: "T_IS_EQUAL",
+    167: "T_IS_NOT_EQUAL",
+    168: "T_IS_SMALLER_OR_EQUAL",
+    169: "T_IS_GREATER_OR_EQUAL",
+    170: "T_INSTANCEOF",
+    171: "T_INT_CAST",
+    172: "T_DOUBLE_CAST",
+    173: "T_STRING_CAST",
+    174: "T_ARRAY_CAST",
+    175: "T_OBJECT_CAST",
+    176: "T_BOOL_CAST",
+    177: "T_UNSET_CAST",
+    178: "T_EXIT",
+    179: "T_PRINT",
+    180: "T_YIELD",
+    181: "T_YIELD_FROM",
+    182: "T_FUNCTION",
+    183: "T_DOUBLE_ARROW",
+    184: "T_DOUBLE_COLON",
+    185: "T_ARRAY",
+    186: "T_CALLABLE",
+    187: "T_CLASS",
+    188: "T_ABSTRACT",
+    189: "T_TRAIT",
+    190: "T_FINAL",
+    191: "T_EXTENDS",
+    192: "T_INTERFACE",
+    193: "T_IMPLEMENTS",
+    194: "T_VAR",
+    195: "T_PUBLIC",
+    196: "T_PROTECTED",
+    197: "T_PRIVATE",
+    198: "T_CONST",
+    199: "T_NEW",
+    200: "T_INSTEADOF",
+    201: "T_ELSEIF",
+    202: "T_ELSE",
+    203: "T_ENDSWITCH",
+    204: "T_CASE",
+    205: "T_DEFAULT",
+    206: "T_ENDFOR",
+    207: "T_ENDFOREACH",
+    208: "T_ENDWHILE",
+    209: "T_CONSTANT_ENCAPSED_STRING",
+    210: "T_LNUMBER",
+    211: "T_DNUMBER",
+    212: "T_LINE",
+    213: "T_FILE",
+    214: "T_DIR",
+    215: "T_TRAIT_C",
+    216: "T_METHOD_C",
+    217: "T_FUNC_C",
+    218: "T_NS_C",
+    219: "T_START_HEREDOC",
+    220: "T_END_HEREDOC",
+    221: "T_CLASS_C",
+    222: "T_VARIABLE",
+    223: "T_OPEN_TAG",
+    224: "T_OPEN_TAG_WITH_ECHO",
+    225: "T_CLOSE_TAG",
+    226: "T_WHITESPACE",
+    227: "T_COMMENT",
+    228: "T_DOC_COMMENT",
+    229: "T_ELLIPSIS",
+    230: "T_COALESCE",
+    231: "T_POW",
+    232: "T_POW_EQUAL",
+    233: "T_SPACESHIP"
+  },
+  names: {
+    T_HALT_COMPILER: 101,
+    T_USE: 102,
+    T_ENCAPSED_AND_WHITESPACE: 103,
+    T_OBJECT_OPERATOR: 104,
+    T_STRING: 105,
+    T_DOLLAR_OPEN_CURLY_BRACES: 106,
+    T_STRING_VARNAME: 107,
+    T_CURLY_OPEN: 108,
+    T_NUM_STRING: 109,
+    T_ISSET: 110,
+    T_EMPTY: 111,
+    T_INCLUDE: 112,
+    T_INCLUDE_ONCE: 113,
+    T_EVAL: 114,
+    T_REQUIRE: 115,
+    T_REQUIRE_ONCE: 116,
+    T_NAMESPACE: 117,
+    T_NS_SEPARATOR: 118,
+    T_AS: 119,
+    T_IF: 120,
+    T_ENDIF: 121,
+    T_WHILE: 122,
+    T_DO: 123,
+    T_FOR: 124,
+    T_SWITCH: 125,
+    T_BREAK: 126,
+    T_CONTINUE: 127,
+    T_RETURN: 128,
+    T_GLOBAL: 129,
+    T_STATIC: 130,
+    T_ECHO: 131,
+    T_INLINE_HTML: 132,
+    T_UNSET: 133,
+    T_FOREACH: 134,
+    T_DECLARE: 135,
+    T_TRY: 136,
+    T_THROW: 137,
+    T_GOTO: 138,
+    T_FINALLY: 139,
+    T_CATCH: 140,
+    T_ENDDECLARE: 141,
+    T_LIST: 142,
+    T_CLONE: 143,
+    T_PLUS_EQUAL: 144,
+    T_MINUS_EQUAL: 145,
+    T_MUL_EQUAL: 146,
+    T_DIV_EQUAL: 147,
+    T_CONCAT_EQUAL: 148,
+    T_MOD_EQUAL: 149,
+    T_AND_EQUAL: 150,
+    T_OR_EQUAL: 151,
+    T_XOR_EQUAL: 152,
+    T_SL_EQUAL: 153,
+    T_SR_EQUAL: 154,
+    T_INC: 155,
+    T_DEC: 156,
+    T_BOOLEAN_OR: 157,
+    T_BOOLEAN_AND: 158,
+    T_LOGICAL_OR: 159,
+    T_LOGICAL_AND: 160,
+    T_LOGICAL_XOR: 161,
+    T_SL: 162,
+    T_SR: 163,
+    T_IS_IDENTICAL: 164,
+    T_IS_NOT_IDENTICAL: 165,
+    T_IS_EQUAL: 166,
+    T_IS_NOT_EQUAL: 167,
+    T_IS_SMALLER_OR_EQUAL: 168,
+    T_IS_GREATER_OR_EQUAL: 169,
+    T_INSTANCEOF: 170,
+    T_INT_CAST: 171,
+    T_DOUBLE_CAST: 172,
+    T_STRING_CAST: 173,
+    T_ARRAY_CAST: 174,
+    T_OBJECT_CAST: 175,
+    T_BOOL_CAST: 176,
+    T_UNSET_CAST: 177,
+    T_EXIT: 178,
+    T_PRINT: 179,
+    T_YIELD: 180,
+    T_YIELD_FROM: 181,
+    T_FUNCTION: 182,
+    T_DOUBLE_ARROW: 183,
+    T_DOUBLE_COLON: 184,
+    T_ARRAY: 185,
+    T_CALLABLE: 186,
+    T_CLASS: 187,
+    T_ABSTRACT: 188,
+    T_TRAIT: 189,
+    T_FINAL: 190,
+    T_EXTENDS: 191,
+    T_INTERFACE: 192,
+    T_IMPLEMENTS: 193,
+    T_VAR: 194,
+    T_PUBLIC: 195,
+    T_PROTECTED: 196,
+    T_PRIVATE: 197,
+    T_CONST: 198,
+    T_NEW: 199,
+    T_INSTEADOF: 200,
+    T_ELSEIF: 201,
+    T_ELSE: 202,
+    T_ENDSWITCH: 203,
+    T_CASE: 204,
+    T_DEFAULT: 205,
+    T_ENDFOR: 206,
+    T_ENDFOREACH: 207,
+    T_ENDWHILE: 208,
+    T_CONSTANT_ENCAPSED_STRING: 209,
+    T_LNUMBER: 210,
+    T_DNUMBER: 211,
+    T_LINE: 212,
+    T_FILE: 213,
+    T_DIR: 214,
+    T_TRAIT_C: 215,
+    T_METHOD_C: 216,
+    T_FUNC_C: 217,
+    T_NS_C: 218,
+    T_START_HEREDOC: 219,
+    T_END_HEREDOC: 220,
+    T_CLASS_C: 221,
+    T_VARIABLE: 222,
+    T_OPEN_TAG: 223,
+    T_OPEN_TAG_WITH_ECHO: 224,
+    T_CLOSE_TAG: 225,
+    T_WHITESPACE: 226,
+    T_COMMENT: 227,
+    T_DOC_COMMENT: 228,
+    T_ELLIPSIS: 229,
+    T_COALESCE: 230,
+    T_POW: 231,
+    T_POW_EQUAL: 232,
+    T_SPACESHIP: 233
+  }
+};
+
+
+
+ + + + +
+ +
+ + + + + + + + + + diff --git a/tutorial-AST_.html b/tutorial-AST_.html new file mode 100644 index 000000000..91b172de5 --- /dev/null +++ b/tutorial-AST_.html @@ -0,0 +1,256 @@ + + + + + + + + + Tutorial: AST - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Tutorial: AST +

+ + +
+
+ + +

+ AST +

+
+ +
+

Abstract Syntax Tree

+

You can see the AST as a DOM document, the source code of the program beeing +the graphical text output, and the DOM beeing a representation of it.

+

The main node is the program node, and it's structured like this :

+
  {
+    "kind": "program",
+    "children": [
+      // array of nodes
+    ]
+  }

Nodes

+

Every node has a common structure enabling you to scan them and act accordingly.

+

NOTE : This structure depends also on what options you enable.

+
  {
+    "kind": "node name",
+    "loc": {
+      ""
+    },
+    // the location node
+    "loc": {
+      "source": "original source code of the node",
+      "start": {
+        "line": 1, // 1 based
+        "column": 0, // 0 based
+        "offset": 0 // offset from the source code
+      },
+      "end": {
+        // same structure as start
+      }
+    },
+    "leadingComments": [
+      // array of comments nodes
+    ]
+  }

Nodes hierarchy

+ +
+
+ +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/tutorial-Engine_.html b/tutorial-Engine_.html new file mode 100644 index 000000000..353a26cbd --- /dev/null +++ b/tutorial-Engine_.html @@ -0,0 +1,180 @@ + + + + + + + + + Tutorial: Engine - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Tutorial: Engine +

+ + +
+
+ + +

+ Engine +

+
+ +
+

Initialise a new parser instance with the specified options

+

Usage :

+
var parser = require('php-parser');
+var instance = new parser({
+  parser: {
+    extractDoc: true,
+    suppressErrors: true,
+    php7: true
+  },
+  ast: {
+    withPositions: true
+  },
+  lexer: {
+    short_tags: true,
+    asp_tags: true
+  }
+});
+
+var evalAST = instance.parseEval('some php code');
+var codeAST = instance.parseCode('<?php some php code', 'foo.php');
+var tokens = instance.tokenGetAll('<?php some php code');

Type: Engine

+

Parameters

+
    +
  • options Object List of options
  • +
+

Properties

+
    +
  • lexer Lexer
  • +
  • parser Parser
  • +
  • ast AST
  • +
  • tokens Object
  • +
+

parseEval

+

Parse an evaluating mode string (no need to open php tags)

+

Parameters

+ +

Returns Program

+

parseCode

+

Function that parse a php code with open/close tags

+

Sample code :

+
<?php $x = 1;

Usage :

+
var parser = require('php-parser');
+var phpParser = new parser({
+  // some options
+});
+var ast = phpParser.parseCode('...php code...', 'foo.php');

Parameters

+
    +
  • buffer String The code to be parsed
  • +
  • filename String Filename
  • +
+

Returns Program

+

tokenGetAll

+

Extract tokens from the specified buffer.

+
+

Note that the output tokens are STRICLY similar to PHP function token_get_all

+
+

Parameters

+ +

Returns Array<String> Each item can be a string or an array with following informations [token_name, text, line_number]

+

getStringBuffer

+

Check if the inpyt is a buffer or a string

+

Parameters

+
    +
  • buffer (Buffer | String) Input value that can be either a buffer or a string
  • +
+

Returns String Returns the string from input

+
+
+ +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/tutorial-Options.html b/tutorial-Options.html new file mode 100644 index 000000000..5a5148afb --- /dev/null +++ b/tutorial-Options.html @@ -0,0 +1,146 @@ + + + + + + + + + Tutorial: Options - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Tutorial: Options +

+ + +
+
+ + +

+ Options +

+
+ +
+

Options

+

When you call the parser you can pass options as following :

+
var reader = require('php-parser');
+reader.parseCode('<?php echo true;', {
+  parser: {
+    debug: false, 
+    locations: false,
+    extractDoc: false,
+    suppressErrors: false
+  },
+  ast: {
+    withPositions: true,
+    withSource: true
+  },
+  lexer: {
+    all_tokens: false,
+    comment_tokens: false,
+    mode_eval: false,
+    asp_tags: false,
+    short_tags: false
+  }
+});

Parser

+
    +
  • debug : enables debug output, useful for handling parsing errors when extending the library.
  • +
  • locations : attach location nodes to AST - see more details
  • +
  • extractDoc : extracting comments blocks - see more details
  • +
  • suppressErrors: graceful parsing mode, when an error is raised it's ignored see more details
  • +
+

Lexer

+
    +
  • all_tokens : extract all tokens (same output as token_get_all function in PHP)
  • +
  • comment_tokens: extract also comments tokens (used when all_tokens is false)
  • +
  • mode_eval: ignoring open or close tags, the input is directly a PHP script
  • +
  • asp_tags: handles ASP like tags <% and %>
  • +
  • short_tags : handle short opening tag <?
  • +
+
+
+ +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/tutorial-Parser_.html b/tutorial-Parser_.html new file mode 100644 index 000000000..bcda9a4b7 --- /dev/null +++ b/tutorial-Parser_.html @@ -0,0 +1,414 @@ + + + + + + + + + Tutorial: Parser - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ Tutorial: Parser +

+ + +
+
+ + +

+ Parser +

+
+ +
+

The PHP Parser class that build the AST tree from the lexer

+

Type: Parser

+

Parameters

+
    +
  • lexer
  • +
  • ast
  • +
+

Properties

+
    +
  • lexer Lexer current lexer instance
  • +
  • ast AST the AST factory instance
  • +
  • token (Integer | String) current token
  • +
  • extractDoc Boolean should extract documentation as AST node
  • +
  • extractTokens Boolean should extract each token
  • +
  • suppressErrors Boolean should ignore parsing errors and continue
  • +
  • debug Boolean should output debug informations
  • +
+

getTokenName

+

helper : gets a token name

+

Parameters

+
    +
  • token
  • +
+

parse

+

main entry point : converts a source code to AST

+

Parameters

+
    +
  • code
  • +
  • filename
  • +
+

raiseError

+

Raise an error

+

Parameters

+
    +
  • message
  • +
  • msgExpect
  • +
  • expect
  • +
  • token
  • +
+

error

+

handling errors

+

Parameters

+
    +
  • expect
  • +
+

node

+

Creates a new AST node

+

Parameters

+
    +
  • name
  • +
+

expectEndOfStatement

+

expects an end of statement or end of file

+

Returns boolean

+

expect

+

Force the parser to check the current token.

+

If the current token does not match to expected token, +the an error will be raised.

+

If the suppressError mode is activated, then the error will +be added to the program error stack and this function will return false.

+

Parameters

+ +

Returns boolean

+

text

+

Returns the current token contents

+

Returns String

+

next

+

consume the next token *

+

lex

+

Eating a token

+

is

+

Check if token is of specified type

+

Parameters

+
    +
  • type
  • +
+

ignoreStack

+

outputs some debug information on current token *

+

read_array

+

Parse an array

+
array ::= T_ARRAY '(' array_pair_list ')' |
+  '[' array_pair_list ']'

read_array_pair_list

+

Reads an array entry item

+
array_pair_list ::= '&' w_variable |
+ (
+   expr (
+     T_DOUBLE_ARROW (
+       expr | '&' w_variable
+     )
+   )?
+ )

read_dim_offset

+
 dim_offset ::= expr?

read_class

+

reading a class

+
class ::= class_scope? T_CLASS T_STRING (T_EXTENDS NAMESPACE_NAME)? (T_IMPLEMENTS (NAMESPACE_NAME ',')* NAMESPACE_NAME)? '{' CLASS_BODY '}'

read_class_scope

+

Read the class visibility

+
  class_scope ::= (T_FINAL | T_ABSTRACT)?

read_class_body

+

Reads a class body

+
  class_body ::= (member_flags? (T_VAR | T_STRING | T_FUNCTION))*

read_variable_list

+

Reads variable list

+
 variable_list ::= (variable_declaration ',')* variable_declaration

read_constant_list

+

Reads constant list

+
 constant_list ::= T_CONST (constant_declaration ',')* constant_declaration

read_member_flags

+

Read member flags

+

Returns any array +1st index : 0 => public, 1 => protected, 2 => private +2nd index : 0 => instance member, 1 => static member +3rd index : 0 => normal, 1 => abstract member, 2 => final member

+

read_interface

+

reading an interface

+
interface ::= T_INTERFACE T_STRING (T_EXTENDS (NAMESPACE_NAME ',')* NAMESPACE_NAME)? '{' INTERFACE_BODY '}'

read_interface_body

+

Reads an interface body

+
  interface_body ::= (member_flags? (T_CONST | T_FUNCTION))*

read_trait

+

reading a trait

+
trait ::= T_TRAIT T_STRING (T_EXTENDS (NAMESPACE_NAME ',')* NAMESPACE_NAME)? '{' FUNCTION* '}'

read_trait_use_statement

+

reading a use statement

+
trait_use_statement ::= namespace_name (',' namespace_name)* ('{' trait_use_alias '}')?

read_trait_use_alias

+

Reading trait alias

+
trait_use_alias ::= namespace_name ( T_DOUBLE_COLON T_STRING )? (T_INSTEADOF namespace_name) | (T_AS member_flags? T_STRING)

name list : https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L303 +trait adaptation : https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L742

+

read_variable_declaration

+

Reads a variable declaration

+
 variable_declaration ::= T_VARIABLE '=' scalar

read_constant_declaration

+

Reads a constant declaration

+
 constant_declaration ::= (T_STRING | IDENTIFIER) '=' expr

Returns Constant :link:

+

read_comment

+

Comments with // or # or / _ ... _ /

+

read_doc_comment

+

Comments with / *_ ... _ /

+

read_expr_item

+
Reads an expression
+ expr ::= @todo

read_new_expr

+
   new_expr ::= T_NEW (namespace_name function_argument_list) | (T_CLASS ... class declaration)

https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y#L850

+

read_class_name_reference

+

Reads a class name

+
class_name_reference ::= namespace_name | variable

read_assignment_list

+
  assignment_list ::= assignment_list_element (',' assignment_list_element?)*

read_assignment_list_element

+
 assignment_list_element ::= expr | expr T_DOUBLE_ARROW expr

is_reference

+

checks if current token is a reference keyword

+

is_variadic

+

checks if current token is a variadic keyword

+

read_function

+

reading a function

+
function ::= function_declaration code_block

read_function_declaration

+

reads a function declaration (without his body)

+
function_declaration ::= T_FUNCTION '&'?  T_STRING '(' parameter_list ')'

read_lexical_var

+
lexical_var ::= '&'? T_VARIABLE

read_parameter_list

+

reads a list of parameters

+
 parameter_list ::= (parameter ',')* parameter?

read_parameter

+
 parameter ::= type? '&'? T_ELLIPSIS? T_VARIABLE ('=' expr)?

read_function_argument_list

+

Reads a list of arguments

+
 function_argument_list ::= '(' (argument_list (',' argument_list)*)? ')'

read_argument_list

+
   argument_list ::= T_ELLIPSIS? expr

read_type

+

read type hinting

+
 type ::= T_ARRAY | T_CALLABLE | namespace_name

read_if

+

Reads an IF statement

+
 if ::= T_IF '(' expr ')' ':' ...

read_if_expr

+

reads an if expression : '(' expr ')'

+

read_elseif_short

+

reads an elseif (expr): statements

+

read_else_short

+

read_while

+

Reads a while statement

+
while ::= T_WHILE (statement | ':' inner_statement_list T_ENDWHILE ';')

Returns While

+

read_do

+

Reads a do / while loop

+
do ::= T_DO statement T_WHILE '(' expr ')' ';'

Returns Do

+

read_for

+

Read a for incremental loop

+
for ::= T_FOR '(' for_exprs ';' for_exprs ';' for_exprs ')' for_statement
+for_statement ::= statement | ':' inner_statement_list T_ENDFOR ';'
+for_exprs ::= expr? (',' expr)*

Returns For

+

read_foreach

+

Reads a foreach loop

+
foreach ::= '(' expr T_AS foreach_variable (T_DOUBLE_ARROW foreach_variable)? ')' statement

Returns Foreach

+

read_foreach_variable

+

Reads a foreach variable statement

+
foreach_variable = variable |
+ T_LIST '(' assignment_list ')' |
+ '[' array_pair_list ']'

Returns Expression

+

read_start

+
start ::= (namespace | top_statement)*

read_namespace

+

Reads a namespace declaration block

+
namespace ::= T_NAMESPACE namespace_name? '{'
+   top_statements
+'}'
+| T_NAMESPACE namespace_name ';' top_statements

Returns Namespace

+

read_namespace_name

+

Reads a namespace name

+
 namespace_name ::= T_NS_SEPARATOR? (T_STRING T_NS_SEPARATOR)* T_STRING

Returns Identifier

+

read_use_statement

+

Reads a use statement

+
use_statement ::= T_USE
+  use_type? use_declarations |
+  use_type use_statement '{' use_declarations '}' |
+  use_statement '{' use_declarations(=>typed) '}'
+';'

Returns UseGroup

+

read_use_declaration

+

Reads a use declaration

+
use_declaration ::= use_type? namespace_name use_alias

Returns UseItem

+

read_use_declarations

+

Reads a list of use declarations

+
use_declarations ::= use_declaration (',' use_declaration)*

Returns Array<UseItem>

+

read_use_alias

+

Reads a use statement

+
use_alias ::= (T_AS T_STRING)?

Returns (String | null)

+

read_use_type

+

Reads the namespace type declaration

+
use_type ::= (T_FUNCTION | T_CONST)?

Returns (String | null) Possible values : function, const

+

resolve_special_chars

+

Unescape special chars

+

read_scalar

+
 scalar ::= T_MAGIC_CONST
+      | T_LNUMBER | T_DNUMBER
+      | T_START_HEREDOC T_ENCAPSED_AND_WHITESPACE? T_END_HEREDOC
+      | '"' encaps_list '"'
+      | T_START_HEREDOC encaps_list T_END_HEREDOC
+      | namespace_name (T_DOUBLE_COLON T_STRING)?

read_dereferencable

+

Handles the dereferencing

+

read_encapsed_string_item

+

Reads and extracts an encapsed item

+
encapsed_string_item ::= T_ENCAPSED_AND_WHITESPACE
+ | T_DOLLAR_OPEN_CURLY_BRACES expr '}'
+ | T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME '}'
+ | T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME '[' expr ']' '}'
+ | T_CURLY_OPEN variable '}'
+ | variable
+ | variable '[' expr ']'
+ | variable T_OBJECT_OPERATOR T_STRING

Returns (String | Variable | Expr | Lookup)

+

read_encapsed_string

+

Reads an encapsed string

+

get_magic_constant

+

Constant token

+

read_top_statements

+

reading a list of top statements (helper for top_statement*)

+
 top_statements ::= top_statement*

read_top_statement

+

reading a top statement

+
 top_statement ::=
+      namespace | function | class
+      | interface | trait
+      | use_statements | const_list
+      | statement

read_inner_statements

+

reads a list of simple inner statements (helper for inner_statement*)

+
 inner_statements ::= inner_statement*

read_const_list

+

Reads a list of constants declaration

+
  const_list ::= T_CONST T_STRING '=' expr (',' T_STRING '=' expr)* ';'

read_declare_list

+

Reads a list of constants declaration

+
  declare_list ::= T_STRING '=' expr (',' T_STRING '=' expr)*

read_inner_statement

+

reads a simple inner statement

+
 inner_statement ::= '{' inner_statements '}' | token

read_statement

+

Reads statements

+

read_code_block

+
 code_block ::= '{' (inner_statements | top_statements) '}'

read_switch

+

Reads a switch statement

+
 switch ::= T_SWITCH '(' expr ')' switch_case_list

Returns Switch

+

read_switch_case_list

+
 switch_case_list ::= '{' ';'? case_list* '}' | ':' ';'? case_list* T_ENDSWITCH ';'

read_case_list

+
  case_list ::= ((T_CASE expr) | T_DEFAULT) (':' | ';') inner_statement*

read_try

+
 try ::= T_TRY '{' inner_statement* '}'
+         (
+             T_CATCH '(' namespace_name variable ')' '{'  inner_statement* '}'
+         )*
+         (T_FINALLY '{' inner_statement* '}')?

Returns Try

+

read_short_form

+

Reads a short form of tokens

+

Parameters

+
    +
  • token Number The ending token
  • +
+

Returns Block

+

read_list

+

Helper : reads a list of tokens / sample : T_STRING ',' T_STRING ...

+
list ::= separator? ( item separator )* item

read_name_list

+

Reads a list of names separated by a comma

+
name_list ::= namespace (',' namespace)*

Sample code :

+
<?php class foo extends bar, baz { }

Returns Array<Identifier>

+

read_variable_declarations

+

Reads a list of variables declarations

+
variable_declaration ::= T_VARIABLE ('=' expr)?*
+variable_declarations ::= variable_declaration (',' variable_declaration)*

Sample code :

+
<?php class foo extends bar, baz { }

Returns (Array<Variable> | Array<Assign>) Returns an array composed by a list of variables, or +assign values

+

read_variable

+

Reads a variable

+
  variable ::= &? ...complex @todo

Some samples of parsed code :

+
 &$var                      // simple var
+ $var                      // simple var
+ classname::CONST_NAME     // dynamic class name with const retrieval
+ foo()                     // function call
+ $var->func()->property    // chained calls

read_encaps_var_offset

+

https://github.com/php/php-src/blob/493524454d66adde84e00d249d607ecd540de99f/Zend/zend_language_parser.y#L1231

+

read_reference_variable

+
 reference_variable ::=  simple_variable ('[' OFFSET ']')* | '{' EXPR '}'

+ $foo[123]; // foo is an array ==> gets its entry + $foo{1}; // foo is a string ==> get the 2nd char offset + ${'foo'}[123]; // get the dynamic var $foo + $foo[123]{1}; // gets the 2nd char from the 123 array entry +

+

read_simple_variable

+
 simple_variable ::= T_VARIABLE | '$' '{' expr '}' | '$' simple_variable
+
+
+ +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/tutorials/AST.md b/tutorials/AST.md deleted file mode 100644 index 147ec4e1a..000000000 --- a/tutorials/AST.md +++ /dev/null @@ -1,135 +0,0 @@ -# Abstract Syntax Tree - -You can see the AST as a DOM document, the source code of the program beeing -the graphical text output, and the DOM beeing a representation of it. - -The main node is the program node, and it's structured like this : - -```js - { - "kind": "program", - "children": [ - // array of nodes - ] - } -``` - -## Nodes - -Every node has a common structure enabling you to scan them and act accordingly. - -NOTE : This structure depends also on what options you enable. - -```js - { - "kind": "node name", - "loc": { - "" - }, - // the location node - "loc": { - "source": "original source code of the node", - "start": { - "line": 1, // 1 based - "column": 0, // 0 based - "offset": 0 // offset from the source code - }, - "end": { - // same structure as start - } - }, - "leadingComments": [ - // array of comments nodes - ] - } -``` - -## Nodes hierarchy - - - [Location](#location) - - [Position](#position) - - [Node](#node) - - [Identifier](#identifier) - - [TraitUse](#traituse) - - [TraitAlias](#traitalias) - - [TraitPrecedence](#traitprecedence) - - [Entry](#entry) - - [Case](#case) - - [Label](#label) - - [Comment](#comment) - - [CommentLine](#commentline) - - [CommentBlock](#commentblock) - - [Error](#error) - - [Expression](#expression) - - [Array](#array) - - [Variable](#variable) - - [Variadic](#variadic) - - [ConstRef](#constref) - - [Yield](#yield) - - [YieldFrom](#yieldfrom) - - [Lookup](#lookup) - - [PropertyLookup](#propertylookup) - - [StaticLookup](#staticlookup) - - [OffsetLookup](#offsetlookup) - - [Operation](#operation) - - [Pre](#pre) - - [Post](#post) - - [Bin](#bin) - - [Parenthesis](#parenthesis) - - [Unary](#unary) - - [Cast](#cast) - - [Literal](#literal) - - [Boolean](#boolean) - - [String](#string) - - [Number](#number) - - [Inline](#inline) - - [Magic](#magic) - - [Nowdoc](#nowdoc) - - [Encapsed](#encapsed) - - [Statement](#statement) - - [Eval](#eval) - - [Exit](#exit) - - [Halt](#halt) - - [Clone](#clone) - - [Declare](#declare) - - [Global](#global) - - [Static](#static) - - [Include](#include) - - [Assign](#assign) - - [RetIf](#retif) - - [If](#if) - - [Do](#do) - - [While](#while) - - [For](#for) - - [Foreach](#foreach) - - [Switch](#switch) - - [Goto](#goto) - - [Silent](#silent) - - [Try](#try) - - [Catch](#catch) - - [Throw](#throw) - - [Call](#call) - - [Closure](#closure) - - [New](#new) - - [UseGroup](#usegroup) - - [UseItem](#useitem) - - [Block](#block) - - [Program](#program) - - [Namespace](#namespace) - - [Sys](#sys) - - [Echo](#echo) - - [List](#list) - - [Print](#print) - - [Isset](#isset) - - [Unset](#unset) - - [Empty](#empty) - - [Declaration](#declaration) - - [Class](#class) - - [Interface](#interface) - - [Trait](#trait) - - [Constant](#constant) - - [ClassConstant](#classconstant) - - [Function](#function) - - [Method](#method) - - [Parameter](#parameter) - - [Property](#property) \ No newline at end of file diff --git a/tutorials/Engine.md b/tutorials/Engine.md deleted file mode 100644 index 4b91350a1..000000000 --- a/tutorials/Engine.md +++ /dev/null @@ -1,97 +0,0 @@ -Initialise a new parser instance with the specified options - -Usage : - -```js -var parser = require('php-parser'); -var instance = new parser({ - parser: { - extractDoc: true, - suppressErrors: true, - php7: true - }, - ast: { - withPositions: true - }, - lexer: { - short_tags: true, - asp_tags: true - } -}); - -var evalAST = instance.parseEval('some php code'); -var codeAST = instance.parseCode(' Note that the output tokens are _STRICLY_ similar to PHP function `token_get_all` - -**Parameters** - -- `buffer` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** - -Returns **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)>** Each item can be a string or an array with following informations [token_name, text, line_number] - -## getStringBuffer - -Check if the inpyt is a buffer or a string - -**Parameters** - -- `buffer` **([Buffer](https://nodejs.org/api/buffer.html) \| [String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String))** Input value that can be either a buffer or a string - -Returns **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** Returns the string from input diff --git a/tutorials/Options.md b/tutorials/Options.md deleted file mode 100644 index d7b6f02c0..000000000 --- a/tutorials/Options.md +++ /dev/null @@ -1,41 +0,0 @@ -# Options - -When you call the parser you can pass options as following : - -```js -var reader = require('php-parser'); -reader.parseCode('` -* short_tags : handle short opening tag ` public, 1 => protected, 2 => private -2nd index : 0 => instance member, 1 => static member -3rd index : 0 => normal, 1 => abstract member, 2 => final member - -## read_interface - -reading an interface - -```ebnf -interface ::= T_INTERFACE T_STRING (T_EXTENDS (NAMESPACE_NAME ',')* NAMESPACE_NAME)? '{' INTERFACE_BODY '}' -``` - -## read_interface_body - -Reads an interface body - -```ebnf - interface_body ::= (member_flags? (T_CONST | T_FUNCTION))* -``` - -## read_trait - -reading a trait - -```ebnf -trait ::= T_TRAIT T_STRING (T_EXTENDS (NAMESPACE_NAME ',')* NAMESPACE_NAME)? '{' FUNCTION* '}' -``` - -## read_trait_use_statement - -reading a use statement - -```ebnf -trait_use_statement ::= namespace_name (',' namespace_name)* ('{' trait_use_alias '}')? -``` - -## read_trait_use_alias - -Reading trait alias - -```ebnf -trait_use_alias ::= namespace_name ( T_DOUBLE_COLON T_STRING )? (T_INSTEADOF namespace_name) | (T_AS member_flags? T_STRING) -``` - -name list : -trait adaptation : - -## read_variable_declaration - -Reads a variable declaration - -```ebnf - variable_declaration ::= T_VARIABLE '=' scalar -``` - -## read_constant_declaration - -Reads a constant declaration - -```ebnf - constant_declaration ::= (T_STRING | IDENTIFIER) '=' expr -``` - -Returns **Constant** [:link:](AST.md#constant) - -## read_comment - -Comments with // or # or / _ ... _ / - -## read_doc_comment - -Comments with / \*_ ... _ / - -## read_expr_item - -```ebnf -Reads an expression - expr ::= @todo -``` - -## read_new_expr - -```ebnf - new_expr ::= T_NEW (namespace_name function_argument_list) | (T_CLASS ... class declaration) -``` - - - -## read_class_name_reference - -Reads a class name - -```ebnf -class_name_reference ::= namespace_name | variable -``` - -## read_assignment_list - -```ebnf - assignment_list ::= assignment_list_element (',' assignment_list_element?)* -``` - -## read_assignment_list_element - -```ebnf - assignment_list_element ::= expr | expr T_DOUBLE_ARROW expr -``` - -## is_reference - -checks if current token is a reference keyword - -## is_variadic - -checks if current token is a variadic keyword - -## read_function - -reading a function - -```ebnf -function ::= function_declaration code_block -``` - -## read_function_declaration - -reads a function declaration (without his body) - -```ebnf -function_declaration ::= T_FUNCTION '&'? T_STRING '(' parameter_list ')' -``` - -## read_lexical_var - -```ebnf -lexical_var ::= '&'? T_VARIABLE -``` - -## read_parameter_list - -reads a list of parameters - -```ebnf - parameter_list ::= (parameter ',')* parameter? -``` - -## read_parameter - -```ebnf - parameter ::= type? '&'? T_ELLIPSIS? T_VARIABLE ('=' expr)? -``` - -## read_function_argument_list - -Reads a list of arguments - -```ebnf - function_argument_list ::= '(' (argument_list (',' argument_list)*)? ')' -``` - -## read_argument_list - -```ebnf - argument_list ::= T_ELLIPSIS? expr -``` - -## read_type - -read type hinting - -```ebnf - type ::= T_ARRAY | T_CALLABLE | namespace_name -``` - -## read_if - -Reads an IF statement - -```ebnf - if ::= T_IF '(' expr ')' ':' ... -``` - -## read_if_expr - -reads an if expression : '(' expr ')' - -## read_elseif_short - -reads an elseif (expr): statements - -## read_else_short - -## read_while - -Reads a while statement - -```ebnf -while ::= T_WHILE (statement | ':' inner_statement_list T_ENDWHILE ';') -``` - -Returns **While** - -## read_do - -Reads a do / while loop - -```ebnf -do ::= T_DO statement T_WHILE '(' expr ')' ';' -``` - -Returns **Do** - -## read_for - -Read a for incremental loop - -```ebnf -for ::= T_FOR '(' for_exprs ';' for_exprs ';' for_exprs ')' for_statement -for_statement ::= statement | ':' inner_statement_list T_ENDFOR ';' -for_exprs ::= expr? (',' expr)* -``` - -Returns **For** - -## read_foreach - -Reads a foreach loop - -```ebnf -foreach ::= '(' expr T_AS foreach_variable (T_DOUBLE_ARROW foreach_variable)? ')' statement -``` - -Returns **Foreach** - -## read_foreach_variable - -Reads a foreach variable statement - -```ebnf -foreach_variable = variable | - T_LIST '(' assignment_list ')' | - '[' array_pair_list ']' -``` - -Returns **Expression** - -## read_start - -```ebnf -start ::= (namespace | top_statement)* -``` - -## read_namespace - -Reads a namespace declaration block - -```ebnf -namespace ::= T_NAMESPACE namespace_name? '{' - top_statements -'}' -| T_NAMESPACE namespace_name ';' top_statements -``` - -Returns **Namespace** - -## read_namespace_name - -Reads a namespace name - -```ebnf - namespace_name ::= T_NS_SEPARATOR? (T_STRING T_NS_SEPARATOR)* T_STRING -``` - -Returns **Identifier** - -## read_use_statement - -Reads a use statement - -```ebnf -use_statement ::= T_USE - use_type? use_declarations | - use_type use_statement '{' use_declarations '}' | - use_statement '{' use_declarations(=>typed) '}' -';' -``` - -Returns **UseGroup** - -## read_use_declaration - -Reads a use declaration - -```ebnf -use_declaration ::= use_type? namespace_name use_alias -``` - -Returns **UseItem** - -## read_use_declarations - -Reads a list of use declarations - -```ebnf -use_declarations ::= use_declaration (',' use_declaration)* -``` - -Returns **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<UseItem>** - -## read_use_alias - -Reads a use statement - -```ebnf -use_alias ::= (T_AS T_STRING)? -``` - -Returns **([String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String) | null)** - -## read_use_type - -Reads the namespace type declaration - -```ebnf -use_type ::= (T_FUNCTION | T_CONST)? -``` - -Returns **([String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String) | null)** Possible values : function, const - -## resolve_special_chars - -Unescape special chars - -## read_scalar - -```ebnf - scalar ::= T_MAGIC_CONST - | T_LNUMBER | T_DNUMBER - | T_START_HEREDOC T_ENCAPSED_AND_WHITESPACE? T_END_HEREDOC - | '"' encaps_list '"' - | T_START_HEREDOC encaps_list T_END_HEREDOC - | namespace_name (T_DOUBLE_COLON T_STRING)? -``` - -## read_dereferencable - -Handles the dereferencing - -## read_encapsed_string_item - -Reads and extracts an encapsed item - -```ebnf -encapsed_string_item ::= T_ENCAPSED_AND_WHITESPACE - | T_DOLLAR_OPEN_CURLY_BRACES expr '}' - | T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME '}' - | T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME '[' expr ']' '}' - | T_CURLY_OPEN variable '}' - | variable - | variable '[' expr ']' - | variable T_OBJECT_OPERATOR T_STRING -``` - -Returns **([String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String) | Variable | Expr | Lookup)** - -## read_encapsed_string - -Reads an encapsed string - -## get_magic_constant - -Constant token - -## read_top_statements - -reading a list of top statements (helper for top_statement\*) - -```ebnf - top_statements ::= top_statement* -``` - -## read_top_statement - -reading a top statement - -```ebnf - top_statement ::= - namespace | function | class - | interface | trait - | use_statements | const_list - | statement -``` - -## read_inner_statements - -reads a list of simple inner statements (helper for inner_statement\*) - -```ebnf - inner_statements ::= inner_statement* -``` - -## read_const_list - -Reads a list of constants declaration - -```ebnf - const_list ::= T_CONST T_STRING '=' expr (',' T_STRING '=' expr)* ';' -``` - -## read_declare_list - -Reads a list of constants declaration - -```ebnf - declare_list ::= T_STRING '=' expr (',' T_STRING '=' expr)* -``` - -## read_inner_statement - -reads a simple inner statement - -```ebnf - inner_statement ::= '{' inner_statements '}' | token -``` - -## read_statement - -Reads statements - -## read_code_block - -```ebnf - code_block ::= '{' (inner_statements | top_statements) '}' -``` - -## read_switch - -Reads a switch statement - -```ebnf - switch ::= T_SWITCH '(' expr ')' switch_case_list -``` - -Returns **Switch** - -## read_switch_case_list - -```ebnf - switch_case_list ::= '{' ';'? case_list* '}' | ':' ';'? case_list* T_ENDSWITCH ';' -``` - -## read_case_list - -```ebnf - case_list ::= ((T_CASE expr) | T_DEFAULT) (':' | ';') inner_statement* -``` - -## read_try - -```ebnf - try ::= T_TRY '{' inner_statement* '}' - ( - T_CATCH '(' namespace_name variable ')' '{' inner_statement* '}' - )* - (T_FINALLY '{' inner_statement* '}')? -``` - -Returns **Try** - -## read_short_form - -Reads a short form of tokens - -**Parameters** - -* `token` **[Number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)** The ending token - -Returns **Block** - -## read_list - -Helper : reads a list of tokens / sample : T_STRING ',' T_STRING ... - -```ebnf -list ::= separator? ( item separator )* item -``` - -## read_name_list - -Reads a list of names separated by a comma - -```ebnf -name_list ::= namespace (',' namespace)* -``` - -Sample code : - -```php -** - -## read_variable_declarations - -Reads a list of variables declarations - -```ebnf -variable_declaration ::= T_VARIABLE ('=' expr)?* -variable_declarations ::= variable_declaration (',' variable_declaration)* -``` - -Sample code : - -```php - | [Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<Assign>)** Returns an array composed by a list of variables, or -assign values - -## read_variable - -Reads a variable - -```ebnf - variable ::= &? ...complex @todo -``` - -Some samples of parsed code : - -```php - &$var // simple var - $var // simple var - classname::CONST_NAME // dynamic class name with const retrieval - foo() // function call - $var->func()->property // chained calls -``` - -## read_encaps_var_offset - - - -## read_reference_variable - -```ebnf - reference_variable ::= simple_variable ('[' OFFSET ']')* | '{' EXPR '}' -``` - - - $foo[123]; // foo is an array ==> gets its entry - $foo{1}; // foo is a string ==> get the 2nd char offset - ${'foo'}[123]; // get the dynamic var $foo - $foo[123]{1}; // gets the 2nd char from the 123 array entry - - -## read_simple_variable - -```ebnf - simple_variable ::= T_VARIABLE | '$' '{' expr '}' | '$' simple_variable -``` diff --git a/variadic.html b/variadic.html new file mode 100644 index 000000000..301f1369b --- /dev/null +++ b/variadic.html @@ -0,0 +1,476 @@ + + + + + + + + + variadic - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ variadic +

+ + + + +
+
+ +

+ + variadic + +

+ + + +
+ +
+
+ + + + + + + + + + + + +

+ new variadic() +

+
+ + + + + +
+

Introduce a list of items into the arguments of the call

+
+ + + + + + + + + + +
Properties:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
what + + + + Array + + + | + + + Expression + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + +
See:
+
+ +
+ + + +
+ + + + + + + + + + + + + + + +
+ + +

Extends

+ + + + + + + + + + + + + + + + + + + + +

Methods

+ + + + + + + + + + + + + +

+ includeToken(parser) +

+
+ + + + + +
+

Includes current token position of the parser

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
parser + + + + * + + + + + + + + + +
+ + + + + +
+ + + + + + +
Inherited From:
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Source:
+
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/webpack.config.js b/webpack.config.js deleted file mode 100644 index 5f8396165..000000000 --- a/webpack.config.js +++ /dev/null @@ -1,66 +0,0 @@ -const path = require("path"); -const webpack = require("webpack"); -const UglifyJsPlugin = require("uglifyjs-webpack-plugin"); -const { name, description, license, author } = require("./package.json"); - -const entry = "./src/index.js"; - -const entries = { - [`${name}`]: entry, - [`${name}.min`]: entry -}; - -const today = `${new Date(Date.now()).toLocaleDateString()}`; - -module.exports = { - target: "web", - mode: "production", - entry: entries, - output: { - filename: `[name].js`, - path: path.resolve(__dirname, "dist"), - library: "PhpParser", - libraryExport: "default", - libraryTarget: "umd" - }, - module: { - rules: [ - { - test: /\.js$/, - exclude: /(node_modules|bower_components)/, - use: { - loader: "babel-loader?cacheDirectory=true" - } - } - ] - }, - optimization: { - minimize: true, - minimizer: [ - new UglifyJsPlugin({ - include: /\.min\.js$/, - sourceMap: true, - uglifyOptions: { - compress: { - keep_fnames: true - }, - sourceMap: true, - mangle: false, - maxLineLen: 1024 - } - }) - ] - }, - plugins: [ - new webpack.BannerPlugin({ - entryOnly: true, - banner: ` - Package: ${name} - ${description} - Build: [hash] - ${today} - License: ${license} - Author: ${author} - ` - }) - ] -}; From 47d2663a4db191f8adc5ce5010bb5bae43671d60 Mon Sep 17 00:00:00 2001 From: Filippo Conti Date: Tue, 21 Aug 2018 20:44:29 +0200 Subject: [PATCH 2/2] Added Algolia DocSearch support The jsdoc theme has builtin support for algolia docsearch feature, I've requested and added the apikey to the jsdoc configuration. --- AST.html | 36 ++++++++-- Array.html | 30 +++++++- Assign.html | 30 +++++++- Bin.html | 30 +++++++- Block.html | 30 +++++++- Boolean.html | 30 +++++++- Break.html | 30 +++++++- Call.html | 30 +++++++- Case.html | 30 +++++++- Cast.html | 59 +++++++++++++++- Catch.html | 30 +++++++- Class.html | 30 +++++++- ClassConstant.html | 30 +++++++- Clone.html | 30 +++++++- Closure.html | 30 +++++++- Comment.html | 30 +++++++- CommentBlock.html | 30 +++++++- CommentLine.html | 30 +++++++- ConstRef.html | 30 +++++++- Constant.html | 30 +++++++- Continue.html | 30 +++++++- Declaration.html | 30 +++++++- Declare.html | 30 +++++++- Do.html | 30 +++++++- Echo.html | 30 +++++++- Empty.html | 30 +++++++- Encapsed.html | 30 +++++++- Entry.html | 30 +++++++- Error.html | 30 +++++++- Eval.html | 30 +++++++- Exit.html | 30 +++++++- Expression.html | 30 +++++++- For.html | 30 +++++++- Foreach.html | 30 +++++++- Function.html | 30 +++++++- Global_.html | 30 +++++++- Goto.html | 30 +++++++- Halt.html | 30 +++++++- Identifier.html | 30 +++++++- If.html | 30 +++++++- Include.html | 30 +++++++- Inline.html | 30 +++++++- Interface.html | 30 +++++++- Isset.html | 30 +++++++- Label.html | 30 +++++++- List.html | 30 +++++++- Literal.html | 30 +++++++- Location.html | 30 +++++++- Lookup.html | 30 +++++++- Magic.html | 30 +++++++- Method.html | 30 +++++++- Namespace.html | 30 +++++++- New.html | 30 +++++++- Node.html | 30 +++++++- Number.html | 30 +++++++- OffsetLookup.html | 30 +++++++- Operation.html | 30 +++++++- Parameter.html | 30 +++++++- Parenthesis.html | 28 ++++++++ Position.html | 30 +++++++- Post.html | 30 +++++++- Pre.html | 30 +++++++- Print.html | 30 +++++++- Program.html | 30 +++++++- Property.html | 30 +++++++- PropertyLookup.html | 30 +++++++- RetIf.html | 30 +++++++- Return.html | 30 +++++++- Silent.html | 30 +++++++- Statement.html | 30 +++++++- Static.html | 30 +++++++- StaticLookup.html | 30 +++++++- String.html | 134 ++++++++++++++++++++++-------------- Switch.html | 30 +++++++- Sys.html | 30 +++++++- Throw.html | 30 +++++++- Trait.html | 30 +++++++- TraitAlias.html | 30 +++++++- TraitPrecedence.html | 30 +++++++- TraitUse.html | 30 +++++++- Try.html | 30 +++++++- Unary.html | 30 +++++++- Unset.html | 30 +++++++- UseGroup.html | 30 +++++++- UseItem.html | 30 +++++++- Variable.html | 30 +++++++- While.html | 30 +++++++- Yield.html | 30 +++++++- YieldFrom.html | 30 +++++++- ast.js.html | 48 +++++++++++-- ast_array.js.html | 30 +++++++- ast_assign.js.html | 30 +++++++- ast_bin.js.html | 30 +++++++- ast_block.js.html | 30 +++++++- ast_boolean.js.html | 30 +++++++- ast_break.js.html | 30 +++++++- ast_call.js.html | 30 +++++++- ast_case.js.html | 30 +++++++- ast_cast.js.html | 34 ++++++++- ast_catch.js.html | 30 +++++++- ast_class.js.html | 30 +++++++- ast_classconstant.js.html | 30 +++++++- ast_clone.js.html | 30 +++++++- ast_closure.js.html | 30 +++++++- ast_comment.js.html | 30 +++++++- ast_commentblock.js.html | 30 +++++++- ast_commentline.js.html | 30 +++++++- ast_constant.js.html | 30 +++++++- ast_constref.js.html | 30 +++++++- ast_continue.js.html | 30 +++++++- ast_declaration.js.html | 30 +++++++- ast_declare.js.html | 30 +++++++- ast_do.js.html | 30 +++++++- ast_echo.js.html | 30 +++++++- ast_empty.js.html | 30 +++++++- ast_encapsed.js.html | 30 +++++++- ast_entry.js.html | 30 +++++++- ast_error.js.html | 30 +++++++- ast_eval.js.html | 30 +++++++- ast_exit.js.html | 30 +++++++- ast_expression.js.html | 30 +++++++- ast_for.js.html | 30 +++++++- ast_foreach.js.html | 30 +++++++- ast_function.js.html | 30 +++++++- ast_global.js.html | 30 +++++++- ast_goto.js.html | 30 +++++++- ast_halt.js.html | 30 +++++++- ast_identifier.js.html | 30 +++++++- ast_if.js.html | 30 +++++++- ast_include.js.html | 30 +++++++- ast_inline.js.html | 30 +++++++- ast_interface.js.html | 30 +++++++- ast_isset.js.html | 30 +++++++- ast_label.js.html | 30 +++++++- ast_list.js.html | 30 +++++++- ast_literal.js.html | 30 +++++++- ast_location.js.html | 30 +++++++- ast_lookup.js.html | 30 +++++++- ast_magic.js.html | 30 +++++++- ast_method.js.html | 30 +++++++- ast_namespace.js.html | 30 +++++++- ast_new.js.html | 30 +++++++- ast_node.js.html | 30 +++++++- ast_nowdoc.js.html | 30 +++++++- ast_number.js.html | 30 +++++++- ast_offsetlookup.js.html | 30 +++++++- ast_operation.js.html | 30 +++++++- ast_parameter.js.html | 30 +++++++- ast_parenthesis.js.html | 28 ++++++++ ast_position.js.html | 30 +++++++- ast_post.js.html | 30 +++++++- ast_pre.js.html | 30 +++++++- ast_print.js.html | 30 +++++++- ast_program.js.html | 30 +++++++- ast_property.js.html | 30 +++++++- ast_propertylookup.js.html | 30 +++++++- ast_retif.js.html | 30 +++++++- ast_return.js.html | 30 +++++++- ast_silent.js.html | 30 +++++++- ast_statement.js.html | 30 +++++++- ast_static.js.html | 30 +++++++- ast_staticlookup.js.html | 30 +++++++- ast_string.js.html | 30 +++++++- ast_switch.js.html | 30 +++++++- ast_sys.js.html | 30 +++++++- ast_throw.js.html | 30 +++++++- ast_trait.js.html | 30 +++++++- ast_traitalias.js.html | 30 +++++++- ast_traitprecedence.js.html | 30 +++++++- ast_traituse.js.html | 30 +++++++- ast_try.js.html | 30 +++++++- ast_unary.js.html | 30 +++++++- ast_unset.js.html | 30 +++++++- ast_usegroup.js.html | 30 +++++++- ast_useitem.js.html | 30 +++++++- ast_variable.js.html | 30 +++++++- ast_variadic.js.html | 30 +++++++- ast_while.js.html | 30 +++++++- ast_yield.js.html | 30 +++++++- ast_yieldfrom.js.html | 30 +++++++- engine.html | 30 +++++++- global.html | 30 +++++++- index.html | 30 +++++++- index.js.html | 30 +++++++- lexer.html | 30 +++++++- lexer.js.html | 30 +++++++- lexer_comments.js.html | 30 +++++++- lexer_strings.js.html | 30 +++++++- parser.html | 30 +++++++- parser.js.html | 30 +++++++- parser_array.js.html | 30 +++++++- parser_class.js.html | 30 +++++++- parser_comment.js.html | 30 +++++++- parser_expr.js.html | 58 ++++++++++++---- parser_function.js.html | 30 +++++++- parser_if.js.html | 30 +++++++- parser_loops.js.html | 30 +++++++- parser_main.js.html | 30 +++++++- parser_namespace.js.html | 30 +++++++- parser_scalar.js.html | 30 +++++++- parser_statement.js.html | 30 +++++++- parser_switch.js.html | 30 +++++++- parser_try.js.html | 30 +++++++- parser_utils.js.html | 30 +++++++- parser_variable.js.html | 30 +++++++- tokens.js.html | 30 +++++++- tutorial-AST_.html | 30 +++++++- tutorial-Engine_.html | 30 +++++++- tutorial-Options.html | 30 +++++++- tutorial-Parser_.html | 30 +++++++- variadic.html | 30 +++++++- 211 files changed, 6233 insertions(+), 282 deletions(-) diff --git a/AST.html b/AST.html index 6c873a4da..062af5152 100644 --- a/AST.html +++ b/AST.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Array.html b/Array.html index 62a38f05c..e86fbd556 100644 --- a/Array.html +++ b/Array.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Assign.html b/Assign.html index 0c08e7023..80bc9545c 100644 --- a/Assign.html +++ b/Assign.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Bin.html b/Bin.html index f64d8de05..08bfa6e25 100644 --- a/Bin.html +++ b/Bin.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Block.html b/Block.html index 07a5adb6e..e27da4084 100644 --- a/Block.html +++ b/Block.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Boolean.html b/Boolean.html index 481248c53..65f7c258d 100644 --- a/Boolean.html +++ b/Boolean.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Break.html b/Break.html index 3561a458f..992052ba7 100644 --- a/Break.html +++ b/Break.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Call.html b/Call.html index e29875ed9..a687fb3f3 100644 --- a/Call.html +++ b/Call.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Case.html b/Case.html index d4996fd29..6c3999969 100644 --- a/Case.html +++ b/Case.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Cast.html b/Cast.html index dc79d43f9..7a240b756 100644 --- a/Cast.html +++ b/Cast.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Catch.html b/Catch.html index 71e361cfc..4cd2bf117 100644 --- a/Catch.html +++ b/Catch.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Class.html b/Class.html index 8d15ae348..dc6fd27b0 100644 --- a/Class.html +++ b/Class.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/ClassConstant.html b/ClassConstant.html index 42f086052..28c932729 100644 --- a/ClassConstant.html +++ b/ClassConstant.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Clone.html b/Clone.html index c134bb185..75b814fa6 100644 --- a/Clone.html +++ b/Clone.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Closure.html b/Closure.html index 327bebd51..7f6abf306 100644 --- a/Closure.html +++ b/Closure.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Comment.html b/Comment.html index ae8d85f89..9a7f46c43 100644 --- a/Comment.html +++ b/Comment.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/CommentBlock.html b/CommentBlock.html index b2ced6248..000749c6d 100644 --- a/CommentBlock.html +++ b/CommentBlock.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/CommentLine.html b/CommentLine.html index 7795ce993..1917d03ed 100644 --- a/CommentLine.html +++ b/CommentLine.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/ConstRef.html b/ConstRef.html index d2691c960..e59cd7017 100644 --- a/ConstRef.html +++ b/ConstRef.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Constant.html b/Constant.html index ae282f9fc..f0f1aad69 100644 --- a/Constant.html +++ b/Constant.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Continue.html b/Continue.html index 114a9c7c2..5c6dc4c9c 100644 --- a/Continue.html +++ b/Continue.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Declaration.html b/Declaration.html index 056629681..f69673418 100644 --- a/Declaration.html +++ b/Declaration.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Declare.html b/Declare.html index 33620a36a..948e13dc5 100644 --- a/Declare.html +++ b/Declare.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Do.html b/Do.html index ee33e0cd4..ca3333920 100644 --- a/Do.html +++ b/Do.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Echo.html b/Echo.html index 930dafe6e..3a2bd49d7 100644 --- a/Echo.html +++ b/Echo.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Empty.html b/Empty.html index c1fb54bac..39751f124 100644 --- a/Empty.html +++ b/Empty.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Encapsed.html b/Encapsed.html index a619d1f65..d02b1eaeb 100644 --- a/Encapsed.html +++ b/Encapsed.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Entry.html b/Entry.html index 3132a944a..338549396 100644 --- a/Entry.html +++ b/Entry.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Error.html b/Error.html index 17846093f..1bd18a8f5 100644 --- a/Error.html +++ b/Error.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Eval.html b/Eval.html index a39e5839e..8ed3a1dd1 100644 --- a/Eval.html +++ b/Eval.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Exit.html b/Exit.html index 7d34d0682..0729705e4 100644 --- a/Exit.html +++ b/Exit.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Expression.html b/Expression.html index 042bf6703..b9b8d52d9 100644 --- a/Expression.html +++ b/Expression.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/For.html b/For.html index 9858409bf..9604683b3 100644 --- a/For.html +++ b/For.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Foreach.html b/Foreach.html index 49c3fbbb2..43b9c2eb6 100644 --- a/Foreach.html +++ b/Foreach.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Function.html b/Function.html index 6feb4188e..4dbd067c0 100644 --- a/Function.html +++ b/Function.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Global_.html b/Global_.html index 2134acd47..d451f4e7d 100644 --- a/Global_.html +++ b/Global_.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Goto.html b/Goto.html index f44008a19..b8e32fdde 100644 --- a/Goto.html +++ b/Goto.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Halt.html b/Halt.html index 9b6dda487..dbf5ddc73 100644 --- a/Halt.html +++ b/Halt.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Identifier.html b/Identifier.html index c0bcf65c7..9041cd1d5 100644 --- a/Identifier.html +++ b/Identifier.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/If.html b/If.html index 0adedc2d3..c44434f41 100644 --- a/If.html +++ b/If.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Include.html b/Include.html index 9a89a6409..64ff42cea 100644 --- a/Include.html +++ b/Include.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Inline.html b/Inline.html index 3419f4488..3b0eb815e 100644 --- a/Inline.html +++ b/Inline.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Interface.html b/Interface.html index d02edcf9f..71d4a7730 100644 --- a/Interface.html +++ b/Interface.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Isset.html b/Isset.html index 528761948..f47f76892 100644 --- a/Isset.html +++ b/Isset.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Label.html b/Label.html index 42ac6449a..f0d45ecfb 100644 --- a/Label.html +++ b/Label.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/List.html b/List.html index 919228ab0..8bcb43a2d 100644 --- a/List.html +++ b/List.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Literal.html b/Literal.html index e00cf8f19..b03cb7b5e 100644 --- a/Literal.html +++ b/Literal.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Location.html b/Location.html index eb5ec84bc..228f98ad9 100644 --- a/Location.html +++ b/Location.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Lookup.html b/Lookup.html index 4b4f541d9..62acdd0f8 100644 --- a/Lookup.html +++ b/Lookup.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Magic.html b/Magic.html index 72a1d644b..a9f94aff0 100644 --- a/Magic.html +++ b/Magic.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Method.html b/Method.html index 7b83c56fe..811a3f688 100644 --- a/Method.html +++ b/Method.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Namespace.html b/Namespace.html index b7a5380c7..8eb121c34 100644 --- a/Namespace.html +++ b/Namespace.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/New.html b/New.html index 3bc358095..f18d4f311 100644 --- a/New.html +++ b/New.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Node.html b/Node.html index e8392149b..e724c6146 100644 --- a/Node.html +++ b/Node.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Number.html b/Number.html index aa0a2d254..b05913277 100644 --- a/Number.html +++ b/Number.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/OffsetLookup.html b/OffsetLookup.html index 717ec4aa6..e9294c0e1 100644 --- a/OffsetLookup.html +++ b/OffsetLookup.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Operation.html b/Operation.html index 14bec1bcd..3fd32da4b 100644 --- a/Operation.html +++ b/Operation.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Parameter.html b/Parameter.html index 786aff552..994e1996f 100644 --- a/Parameter.html +++ b/Parameter.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Parenthesis.html b/Parenthesis.html index 98302c9e4..176272af8 100644 --- a/Parenthesis.html +++ b/Parenthesis.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Position.html b/Position.html index 65c7a3eea..b1b53e2ef 100644 --- a/Position.html +++ b/Position.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Post.html b/Post.html index 4de185dc7..0382c20db 100644 --- a/Post.html +++ b/Post.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Pre.html b/Pre.html index ccb15ff71..936a63535 100644 --- a/Pre.html +++ b/Pre.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Print.html b/Print.html index 0709ea7ba..f29f0802e 100644 --- a/Print.html +++ b/Print.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Program.html b/Program.html index 9f79095d4..211fb79f7 100644 --- a/Program.html +++ b/Program.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Property.html b/Property.html index 96bab4689..3c88eaa8f 100644 --- a/Property.html +++ b/Property.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/PropertyLookup.html b/PropertyLookup.html index c2e8d7062..1f5e4f953 100644 --- a/PropertyLookup.html +++ b/PropertyLookup.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/RetIf.html b/RetIf.html index 22222eb74..4858687a3 100644 --- a/RetIf.html +++ b/RetIf.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Return.html b/Return.html index 8dc7ad1df..1862035d8 100644 --- a/Return.html +++ b/Return.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Silent.html b/Silent.html index cb3691436..65a042b7c 100644 --- a/Silent.html +++ b/Silent.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Statement.html b/Statement.html index edd3ec2d0..477b88957 100644 --- a/Statement.html +++ b/Statement.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Static.html b/Static.html index c77a5760f..7a17d1a2b 100644 --- a/Static.html +++ b/Static.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/StaticLookup.html b/StaticLookup.html index c70ed32a4..291afbcb8 100644 --- a/StaticLookup.html +++ b/StaticLookup.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/String.html b/String.html index 879852ec8..4f6660572 100644 --- a/String.html +++ b/String.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Switch.html b/Switch.html index e781b6fd3..09925746f 100644 --- a/Switch.html +++ b/Switch.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Sys.html b/Sys.html index 5d09cba73..f8e806685 100644 --- a/Sys.html +++ b/Sys.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Throw.html b/Throw.html index c41bd707c..54c07eb84 100644 --- a/Throw.html +++ b/Throw.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Trait.html b/Trait.html index b9f8a2463..e2882c2e7 100644 --- a/Trait.html +++ b/Trait.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/TraitAlias.html b/TraitAlias.html index f49fb2cf5..3b70dd3bd 100644 --- a/TraitAlias.html +++ b/TraitAlias.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/TraitPrecedence.html b/TraitPrecedence.html index bf13a09d1..73d79b0e6 100644 --- a/TraitPrecedence.html +++ b/TraitPrecedence.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/TraitUse.html b/TraitUse.html index c9d7f0f13..4b4b362df 100644 --- a/TraitUse.html +++ b/TraitUse.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Try.html b/Try.html index c64623744..dc6713aa5 100644 --- a/Try.html +++ b/Try.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Unary.html b/Unary.html index 685fb73f8..a68ae43c4 100644 --- a/Unary.html +++ b/Unary.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Unset.html b/Unset.html index a9187e9da..fc83ab252 100644 --- a/Unset.html +++ b/Unset.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/UseGroup.html b/UseGroup.html index 237ab0558..ba0dd95f3 100644 --- a/UseGroup.html +++ b/UseGroup.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/UseItem.html b/UseItem.html index f35feb4ef..54f4a2f5d 100644 --- a/UseItem.html +++ b/UseItem.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Variable.html b/Variable.html index 08cf4b81a..5b25d3256 100644 --- a/Variable.html +++ b/Variable.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/While.html b/While.html index 6b31281de..d6cb56c3d 100644 --- a/While.html +++ b/While.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/Yield.html b/Yield.html index 1e0378c3f..c9a070955 100644 --- a/Yield.html +++ b/Yield.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/YieldFrom.html b/YieldFrom.html index f6572308e..8a82bdd9c 100644 --- a/YieldFrom.html +++ b/YieldFrom.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/ast.js.html b/ast.js.html index 8b8252b5c..c13634c60 100644 --- a/ast.js.html +++ b/ast.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_array.js.html b/ast_array.js.html index b4ce8bc06..d65cc48e2 100644 --- a/ast_array.js.html +++ b/ast_array.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_assign.js.html b/ast_assign.js.html index 796b44f3e..43274c5a8 100644 --- a/ast_assign.js.html +++ b/ast_assign.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_bin.js.html b/ast_bin.js.html index 6d2fbe3d9..8cd593074 100644 --- a/ast_bin.js.html +++ b/ast_bin.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_block.js.html b/ast_block.js.html index 9b9de17c2..a327fb11f 100644 --- a/ast_block.js.html +++ b/ast_block.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_boolean.js.html b/ast_boolean.js.html index 6f2d51882..a9c82679b 100644 --- a/ast_boolean.js.html +++ b/ast_boolean.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_break.js.html b/ast_break.js.html index 5cf52d767..6582b6fa9 100644 --- a/ast_break.js.html +++ b/ast_break.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_call.js.html b/ast_call.js.html index bfc45f8c5..00d84bc04 100644 --- a/ast_call.js.html +++ b/ast_call.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_case.js.html b/ast_case.js.html index c796cbaf0..7ac1ded7f 100644 --- a/ast_case.js.html +++ b/ast_case.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_cast.js.html b/ast_cast.js.html index 1a0528ff1..677a25cfc 100644 --- a/ast_cast.js.html +++ b/ast_cast.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_catch.js.html b/ast_catch.js.html index fe03ee827..63f874b9e 100644 --- a/ast_catch.js.html +++ b/ast_catch.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_class.js.html b/ast_class.js.html index 581b226f4..6cdb4c9d3 100644 --- a/ast_class.js.html +++ b/ast_class.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_classconstant.js.html b/ast_classconstant.js.html index 7f76c9169..28e075294 100644 --- a/ast_classconstant.js.html +++ b/ast_classconstant.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_clone.js.html b/ast_clone.js.html index 9d01dbabc..a83f9f96f 100644 --- a/ast_clone.js.html +++ b/ast_clone.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_closure.js.html b/ast_closure.js.html index abe842f16..576cafc26 100644 --- a/ast_closure.js.html +++ b/ast_closure.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_comment.js.html b/ast_comment.js.html index 9ddc7cbe5..e0b167320 100644 --- a/ast_comment.js.html +++ b/ast_comment.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_commentblock.js.html b/ast_commentblock.js.html index e6f52d302..cb86b5d59 100644 --- a/ast_commentblock.js.html +++ b/ast_commentblock.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_commentline.js.html b/ast_commentline.js.html index da09c3435..d6c520c5a 100644 --- a/ast_commentline.js.html +++ b/ast_commentline.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_constant.js.html b/ast_constant.js.html index 867b618ae..e229d101d 100644 --- a/ast_constant.js.html +++ b/ast_constant.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_constref.js.html b/ast_constref.js.html index 5e37aba90..b82e21860 100644 --- a/ast_constref.js.html +++ b/ast_constref.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_continue.js.html b/ast_continue.js.html index a8ff41d3b..97ae3a425 100644 --- a/ast_continue.js.html +++ b/ast_continue.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_declaration.js.html b/ast_declaration.js.html index e74d8632b..696da4296 100644 --- a/ast_declaration.js.html +++ b/ast_declaration.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_declare.js.html b/ast_declare.js.html index d1bde1df4..2773a1bc8 100644 --- a/ast_declare.js.html +++ b/ast_declare.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_do.js.html b/ast_do.js.html index ff4b9b2b4..e7748f940 100644 --- a/ast_do.js.html +++ b/ast_do.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_echo.js.html b/ast_echo.js.html index 5d7791356..354df8de2 100644 --- a/ast_echo.js.html +++ b/ast_echo.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_empty.js.html b/ast_empty.js.html index 72f355225..28daec1a2 100644 --- a/ast_empty.js.html +++ b/ast_empty.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_encapsed.js.html b/ast_encapsed.js.html index f029f3501..f0ca07268 100644 --- a/ast_encapsed.js.html +++ b/ast_encapsed.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_entry.js.html b/ast_entry.js.html index 362959911..65070259c 100644 --- a/ast_entry.js.html +++ b/ast_entry.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_error.js.html b/ast_error.js.html index 090f8d5d4..81a7b1eba 100644 --- a/ast_error.js.html +++ b/ast_error.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_eval.js.html b/ast_eval.js.html index 8bdaec49c..fe3db1647 100644 --- a/ast_eval.js.html +++ b/ast_eval.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_exit.js.html b/ast_exit.js.html index f0a62f04a..dc0e04251 100644 --- a/ast_exit.js.html +++ b/ast_exit.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_expression.js.html b/ast_expression.js.html index 40509fce5..90f5ed98f 100644 --- a/ast_expression.js.html +++ b/ast_expression.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_for.js.html b/ast_for.js.html index b8a2a8fc3..8f121d00d 100644 --- a/ast_for.js.html +++ b/ast_for.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_foreach.js.html b/ast_foreach.js.html index 818c95259..d85c51a77 100644 --- a/ast_foreach.js.html +++ b/ast_foreach.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_function.js.html b/ast_function.js.html index d00495e51..7d9ea5349 100644 --- a/ast_function.js.html +++ b/ast_function.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_global.js.html b/ast_global.js.html index 8d5625ccd..9d97bdfce 100644 --- a/ast_global.js.html +++ b/ast_global.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_goto.js.html b/ast_goto.js.html index cee260f32..0a8d03675 100644 --- a/ast_goto.js.html +++ b/ast_goto.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_halt.js.html b/ast_halt.js.html index a91f743b6..e6fb18cc8 100644 --- a/ast_halt.js.html +++ b/ast_halt.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_identifier.js.html b/ast_identifier.js.html index 967817256..d5bf14b5a 100644 --- a/ast_identifier.js.html +++ b/ast_identifier.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_if.js.html b/ast_if.js.html index ada975717..7ce15862b 100644 --- a/ast_if.js.html +++ b/ast_if.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_include.js.html b/ast_include.js.html index e1b374d3c..ec282b434 100644 --- a/ast_include.js.html +++ b/ast_include.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_inline.js.html b/ast_inline.js.html index 39b5b9cd8..294a2d15e 100644 --- a/ast_inline.js.html +++ b/ast_inline.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_interface.js.html b/ast_interface.js.html index 7b369cc51..3c2c9a524 100644 --- a/ast_interface.js.html +++ b/ast_interface.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_isset.js.html b/ast_isset.js.html index c7a3207d7..05706df0a 100644 --- a/ast_isset.js.html +++ b/ast_isset.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_label.js.html b/ast_label.js.html index fe624b029..e62f9a210 100644 --- a/ast_label.js.html +++ b/ast_label.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_list.js.html b/ast_list.js.html index d198a775d..bde920e0c 100644 --- a/ast_list.js.html +++ b/ast_list.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_literal.js.html b/ast_literal.js.html index 9d9fa3951..2bba79b0a 100644 --- a/ast_literal.js.html +++ b/ast_literal.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_location.js.html b/ast_location.js.html index eb1fe13f6..df46e8eb6 100644 --- a/ast_location.js.html +++ b/ast_location.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_lookup.js.html b/ast_lookup.js.html index 1a9593092..bcb7524a9 100644 --- a/ast_lookup.js.html +++ b/ast_lookup.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_magic.js.html b/ast_magic.js.html index 5a5283b7f..020d52e81 100644 --- a/ast_magic.js.html +++ b/ast_magic.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_method.js.html b/ast_method.js.html index 42c88086f..c88bedf14 100644 --- a/ast_method.js.html +++ b/ast_method.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_namespace.js.html b/ast_namespace.js.html index 9d05cee9a..b63fa9e8e 100644 --- a/ast_namespace.js.html +++ b/ast_namespace.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_new.js.html b/ast_new.js.html index a0bc9ba04..9253e34f3 100644 --- a/ast_new.js.html +++ b/ast_new.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_node.js.html b/ast_node.js.html index 7fbe4a489..658c7ef16 100644 --- a/ast_node.js.html +++ b/ast_node.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_nowdoc.js.html b/ast_nowdoc.js.html index 8e4db9d02..5364508d0 100644 --- a/ast_nowdoc.js.html +++ b/ast_nowdoc.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_number.js.html b/ast_number.js.html index 0e6b6cbd2..cad24fdfb 100644 --- a/ast_number.js.html +++ b/ast_number.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_offsetlookup.js.html b/ast_offsetlookup.js.html index 3e78e62a0..11d00b61a 100644 --- a/ast_offsetlookup.js.html +++ b/ast_offsetlookup.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_operation.js.html b/ast_operation.js.html index 4fdbff4f6..a13f1192b 100644 --- a/ast_operation.js.html +++ b/ast_operation.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_parameter.js.html b/ast_parameter.js.html index 2a9b9550d..be5b309e9 100644 --- a/ast_parameter.js.html +++ b/ast_parameter.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_parenthesis.js.html b/ast_parenthesis.js.html index a4d841ddf..b50e56ebd 100644 --- a/ast_parenthesis.js.html +++ b/ast_parenthesis.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_position.js.html b/ast_position.js.html index 4585eece5..2a58ba8b2 100644 --- a/ast_position.js.html +++ b/ast_position.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_post.js.html b/ast_post.js.html index 2409c6cb4..8012b09ad 100644 --- a/ast_post.js.html +++ b/ast_post.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_pre.js.html b/ast_pre.js.html index b3292fba9..f9d52514c 100644 --- a/ast_pre.js.html +++ b/ast_pre.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_print.js.html b/ast_print.js.html index 982e68fb9..7b7abc0e5 100644 --- a/ast_print.js.html +++ b/ast_print.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_program.js.html b/ast_program.js.html index ef622eb10..ad3c449cd 100644 --- a/ast_program.js.html +++ b/ast_program.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_property.js.html b/ast_property.js.html index d97296c69..2e9690aab 100644 --- a/ast_property.js.html +++ b/ast_property.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_propertylookup.js.html b/ast_propertylookup.js.html index 6a356b610..b7a77f3e4 100644 --- a/ast_propertylookup.js.html +++ b/ast_propertylookup.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_retif.js.html b/ast_retif.js.html index c45980330..6039222aa 100644 --- a/ast_retif.js.html +++ b/ast_retif.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_return.js.html b/ast_return.js.html index e24ae8fe2..a6bfa96e8 100644 --- a/ast_return.js.html +++ b/ast_return.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_silent.js.html b/ast_silent.js.html index 2c9e4b2aa..5ab04b04c 100644 --- a/ast_silent.js.html +++ b/ast_silent.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_statement.js.html b/ast_statement.js.html index ed42b00d9..27ad0da2b 100644 --- a/ast_statement.js.html +++ b/ast_statement.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_static.js.html b/ast_static.js.html index 6b4f5c247..cf3c630cc 100644 --- a/ast_static.js.html +++ b/ast_static.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_staticlookup.js.html b/ast_staticlookup.js.html index 5ce7a06df..626c8b21b 100644 --- a/ast_staticlookup.js.html +++ b/ast_staticlookup.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_string.js.html b/ast_string.js.html index 82f6a8100..b84dc608c 100644 --- a/ast_string.js.html +++ b/ast_string.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_switch.js.html b/ast_switch.js.html index ed21c0de8..77d68d8c5 100644 --- a/ast_switch.js.html +++ b/ast_switch.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_sys.js.html b/ast_sys.js.html index a9c40e7f7..8bbc2336c 100644 --- a/ast_sys.js.html +++ b/ast_sys.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_throw.js.html b/ast_throw.js.html index 310bb7f73..45263cf60 100644 --- a/ast_throw.js.html +++ b/ast_throw.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_trait.js.html b/ast_trait.js.html index 73efa3949..b526db070 100644 --- a/ast_trait.js.html +++ b/ast_trait.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_traitalias.js.html b/ast_traitalias.js.html index ace98226f..c95e6b8d3 100644 --- a/ast_traitalias.js.html +++ b/ast_traitalias.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_traitprecedence.js.html b/ast_traitprecedence.js.html index 850cea348..fc1ff973e 100644 --- a/ast_traitprecedence.js.html +++ b/ast_traitprecedence.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_traituse.js.html b/ast_traituse.js.html index 18c3f4e0c..346bd1fc7 100644 --- a/ast_traituse.js.html +++ b/ast_traituse.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_try.js.html b/ast_try.js.html index 0d9c3c6ba..96f0edb27 100644 --- a/ast_try.js.html +++ b/ast_try.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_unary.js.html b/ast_unary.js.html index ecd1a5fc2..678848924 100644 --- a/ast_unary.js.html +++ b/ast_unary.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_unset.js.html b/ast_unset.js.html index 37dc5aa12..ce796f486 100644 --- a/ast_unset.js.html +++ b/ast_unset.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_usegroup.js.html b/ast_usegroup.js.html index 38214ddb7..0f3d49b12 100644 --- a/ast_usegroup.js.html +++ b/ast_usegroup.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_useitem.js.html b/ast_useitem.js.html index d85d13c4c..aa1bf70ee 100644 --- a/ast_useitem.js.html +++ b/ast_useitem.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_variable.js.html b/ast_variable.js.html index 50c357431..9288cfa6d 100644 --- a/ast_variable.js.html +++ b/ast_variable.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_variadic.js.html b/ast_variadic.js.html index 471f86657..9aa091741 100644 --- a/ast_variadic.js.html +++ b/ast_variadic.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_while.js.html b/ast_while.js.html index 17093698c..098e1ad73 100644 --- a/ast_while.js.html +++ b/ast_while.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_yield.js.html b/ast_yield.js.html index f8f0d2c7b..cbc41baab 100644 --- a/ast_yield.js.html +++ b/ast_yield.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/ast_yieldfrom.js.html b/ast_yieldfrom.js.html index 9ba12a77c..3c7ca97cd 100644 --- a/ast_yieldfrom.js.html +++ b/ast_yieldfrom.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/engine.html b/engine.html index 0ddfcada1..a9ffdd94b 100644 --- a/engine.html +++ b/engine.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/global.html b/global.html index 01ada0b0c..2f19d9bb6 100644 --- a/global.html +++ b/global.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/index.html b/index.html index 8a8d41654..fb3ea75a0 100644 --- a/index.html +++ b/index.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/index.js.html b/index.js.html index d91240cb7..6c08d5d54 100644 --- a/index.js.html +++ b/index.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/lexer.html b/lexer.html index 4931673dd..d3c1ed59d 100644 --- a/lexer.html +++ b/lexer.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/lexer.js.html b/lexer.js.html index c969fb761..659971fc3 100644 --- a/lexer.js.html +++ b/lexer.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/lexer_comments.js.html b/lexer_comments.js.html index b6859f554..fa8464ce2 100644 --- a/lexer_comments.js.html +++ b/lexer_comments.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/lexer_strings.js.html b/lexer_strings.js.html index f02fb9917..cc605aef5 100644 --- a/lexer_strings.js.html +++ b/lexer_strings.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/parser.html b/parser.html index 0cd7d728c..561d8331c 100644 --- a/parser.html +++ b/parser.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/parser.js.html b/parser.js.html index 6760e2c6d..c39907e7a 100644 --- a/parser.js.html +++ b/parser.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/parser_array.js.html b/parser_array.js.html index 3b5ce4685..5dd3cf649 100644 --- a/parser_array.js.html +++ b/parser_array.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/parser_class.js.html b/parser_class.js.html index f356fc1bf..65d3d69b8 100644 --- a/parser_class.js.html +++ b/parser_class.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/parser_comment.js.html b/parser_comment.js.html index b243e9b12..d89a7c2e8 100644 --- a/parser_comment.js.html +++ b/parser_comment.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/parser_expr.js.html b/parser_expr.js.html index 3072ee574..8e48d1643 100644 --- a/parser_expr.js.html +++ b/parser_expr.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/parser_function.js.html b/parser_function.js.html index a8a762961..ff1edf324 100644 --- a/parser_function.js.html +++ b/parser_function.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/parser_if.js.html b/parser_if.js.html index f8d85e537..ecf3f4647 100644 --- a/parser_if.js.html +++ b/parser_if.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/parser_loops.js.html b/parser_loops.js.html index bb868ca89..cb760801b 100644 --- a/parser_loops.js.html +++ b/parser_loops.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/parser_main.js.html b/parser_main.js.html index fd45bb0fc..614c23f56 100644 --- a/parser_main.js.html +++ b/parser_main.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/parser_namespace.js.html b/parser_namespace.js.html index 7b03a308a..a26855570 100644 --- a/parser_namespace.js.html +++ b/parser_namespace.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/parser_scalar.js.html b/parser_scalar.js.html index f5e27282d..9f3916b11 100644 --- a/parser_scalar.js.html +++ b/parser_scalar.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/parser_statement.js.html b/parser_statement.js.html index fefb1b43e..a1d886f56 100644 --- a/parser_statement.js.html +++ b/parser_statement.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/parser_switch.js.html b/parser_switch.js.html index f33912144..e540893ed 100644 --- a/parser_switch.js.html +++ b/parser_switch.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/parser_try.js.html b/parser_try.js.html index ce313c60d..468a00abd 100644 --- a/parser_try.js.html +++ b/parser_try.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/parser_utils.js.html b/parser_utils.js.html index 8f3208242..021fe7526 100644 --- a/parser_utils.js.html +++ b/parser_utils.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/parser_variable.js.html b/parser_variable.js.html index df7b00525..689fd18e5 100644 --- a/parser_variable.js.html +++ b/parser_variable.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/tokens.js.html b/tokens.js.html index 1cd992a2d..d3dd56894 100644 --- a/tokens.js.html +++ b/tokens.js.html @@ -22,6 +22,9 @@ + + + + + diff --git a/tutorial-AST_.html b/tutorial-AST_.html index 91b172de5..e6fe416ec 100644 --- a/tutorial-AST_.html +++ b/tutorial-AST_.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/tutorial-Engine_.html b/tutorial-Engine_.html index 353a26cbd..14c6cecde 100644 --- a/tutorial-Engine_.html +++ b/tutorial-Engine_.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/tutorial-Options.html b/tutorial-Options.html index 5a5148afb..412c6f4bc 100644 --- a/tutorial-Options.html +++ b/tutorial-Options.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/tutorial-Parser_.html b/tutorial-Parser_.html index bcda9a4b7..9e07441e3 100644 --- a/tutorial-Parser_.html +++ b/tutorial-Parser_.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file diff --git a/variadic.html b/variadic.html index 301f1369b..c4b19c503 100644 --- a/variadic.html +++ b/variadic.html @@ -20,6 +20,9 @@ + + + + + \ No newline at end of file

)CdQ3F!eKyF|9D2V!F-rhUpJ8J+l7g0OBBVM#THTI&O8)>EGR%u6Gd9D9pm5!S}%&6DxW}^f|7=Y zPoO3(pTZY#?(7(|!5}5Nn!D%DotZmlW)?smSMcEE<^aT$6gw#LlwubPI9BYTffL0! zyu-EPCnz{Y#ZR&1d{F!hr_NW!&#~mXis$jseXDo@U)-kR7sMBeUt-T&RQw9By@BF9 z3f?cpmw4m-R{RHncaC**(V--ipJ<~6LkW2fi6RVfh%vcYt9@z>&M0LBSf-Q|Et8wU zCt43_*JB)mHR71wb`K@~5Cizwp{`A2uuJ^_Bcl3k{7ree$8&@l?;^2nagS+NqCDBfkB?pJws=PbK~+A7|2 z{gCDJKI-i%m4LD$n{WIwWR|c+NRy`C1#)1sSBI7FiH6z-QkhY&Q_|%I3exQ zQ`X1M?cZH4^M&BSyr;2z$+^SZUMA*0001Z+HKHROw(}?!13=vX`$@Br+fGR zZ%e`5O6%Txi$Yrz0gF{}p>fY>OnlS0Uevf}oDXW;D{d2gcE<2)oFcV80@g$H)63L{HN*d{8kVzKVW(;E)$9N_%kx5Ku3R9WJbY?JW^G#k0Wdx>E$NBBVtKRLiL?sA*s%w`TdsNz1=+~FRNdB8&+@iBD0 zXFTC4C-8-Cwv(4U=LLQ~^Oa4^rG|OTr5?ItoaPMYxxh`%a*kVU z;HYGAjq6;IY{`*awo0DlOMw(hkrYdb(O28l;MYvSx*ChcQW4f^QL5UdE3HbqvbxB$pfSg`>Cj#;?~00;nMAg}==M6d%RaIhCe zARtS)01i=0um)3FSgr#ump{<1pq_<0a34Kp8x=7I1^|9 literal 0 HcmV?d00001 diff --git a/fonts/OpenSans-Regular-webfont.eot b/fonts/OpenSans-Regular-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..6bbc3cf58cb011a6b4bf3cb1612ce212608f7274 GIT binary patch literal 19836 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/fonts/OpenSans-Regular-webfont.woff b/fonts/OpenSans-Regular-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..e231183dce4c7b452afc9e7799586fd285e146f4 GIT binary patch literal 22660 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 ML;wL%uV=LY00kR;TmS$7 literal 0 HcmV?d00001 diff --git a/fonts/OpenSans-Semibold-webfont.eot b/fonts/OpenSans-Semibold-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..d8375dd0ab130207f023358d62ef6ff357108b7f GIT binary patch literal 20028 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 h1{iKYDIA5bqxNz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/fonts/OpenSans-Semibold-webfont.ttf b/fonts/OpenSans-Semibold-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b3290843a7a3e621867b169c8487de9a8c7a8054 GIT binary patch literal 39476 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 F{{Vm_4C4R* literal 0 HcmV?d00001 diff --git a/fonts/OpenSans-Semibold-webfont.woff b/fonts/OpenSans-Semibold-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..28d6adee03b8d2301e06680fce413eb94887b57e GIT binary patch literal 22908 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 G2><}8D24q1 literal 0 HcmV?d00001 diff --git a/fonts/OpenSans-SemiboldItalic-webfont.eot b/fonts/OpenSans-SemiboldItalic-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..0ab1db22e69ec331510563590527277ba5d68cc1 GIT binary patch literal 20962 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 literal 0 HcmV?d00001 diff --git a/fonts/OpenSans-SemiboldItalic-webfont.svg b/fonts/OpenSans-SemiboldItalic-webfont.svg new file mode 100644 index 000000000..7166ec1b9 --- /dev/null +++ b/fonts/OpenSans-SemiboldItalic-webfont.svg @@ -0,0 +1,1830 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/fonts/OpenSans-SemiboldItalic-webfont.ttf b/fonts/OpenSans-SemiboldItalic-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d2d6318f6640448517db133a40a6a5a36d36ed48 GIT binary patch literal 40252 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 Z0p^q`UCg`8t*mL+fyY_#j+!w<{{z_tFYy2X literal 0 HcmV?d00001 diff --git a/fonts/OpenSans-SemiboldItalic-webfont.woff b/fonts/OpenSans-SemiboldItalic-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..d4dfca402e53e59ec985ff4c6312864da493fa83 GIT binary patch literal 23764 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 + + + + + + + + Global - Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +