webshell-analyzer 1.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- webshell_analyzer/__init__.py +0 -0
- webshell_analyzer/cli/__init__.py +0 -0
- webshell_analyzer/cli/cli.py +151 -0
- webshell_analyzer/extractor/ast_extraction/composer.json +5 -0
- webshell_analyzer/extractor/ast_extraction/composer.lock +77 -0
- webshell_analyzer/extractor/ast_extraction/src/NodeVisitor.php +85 -0
- webshell_analyzer/extractor/ast_extraction/src/astBuilder.php +50 -0
- webshell_analyzer/extractor/ast_extraction/src/astExtractor.php +50 -0
- webshell_analyzer/extractor/ast_extraction/src/featuresDeclare.php +36 -0
- webshell_analyzer/extractor/ast_extraction/vendor/autoload.php +25 -0
- webshell_analyzer/extractor/ast_extraction/vendor/composer/ClassLoader.php +579 -0
- webshell_analyzer/extractor/ast_extraction/vendor/composer/InstalledVersions.php +378 -0
- webshell_analyzer/extractor/ast_extraction/vendor/composer/autoload_classmap.php +10 -0
- webshell_analyzer/extractor/ast_extraction/vendor/composer/autoload_namespaces.php +9 -0
- webshell_analyzer/extractor/ast_extraction/vendor/composer/autoload_psr4.php +10 -0
- webshell_analyzer/extractor/ast_extraction/vendor/composer/autoload_real.php +38 -0
- webshell_analyzer/extractor/ast_extraction/vendor/composer/autoload_static.php +36 -0
- webshell_analyzer/extractor/ast_extraction/vendor/composer/installed.json +67 -0
- webshell_analyzer/extractor/ast_extraction/vendor/composer/installed.php +32 -0
- webshell_analyzer/extractor/ast_extraction/vendor/composer/platform_check.php +26 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Builder/ClassConst.php +150 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Builder/Class_.php +151 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Builder/Declaration.php +50 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Builder/EnumCase.php +86 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Builder/Enum_.php +116 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php +73 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Builder/Function_.php +67 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Builder/Interface_.php +94 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Builder/Method.php +147 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php +45 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Builder/Param.php +171 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Builder/Property.php +223 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php +65 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.php +145 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Builder/Trait_.php +83 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Builder/Use_.php +49 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Builder.php +12 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/BuilderFactory.php +375 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/BuilderHelpers.php +338 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Comment/Doc.php +6 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Comment.php +209 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/ConstExprEvaluationException.php +6 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/ConstExprEvaluator.php +237 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Error.php +173 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Collecting.php +43 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php +17 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/ErrorHandler.php +12 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Internal/DiffElem.php +31 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Internal/Differ.php +178 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php +71 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Internal/TokenPolyfill.php +237 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php +282 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/JsonDecoder.php +108 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php +230 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AsymmetricVisibilityTokenEmulator.php +93 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AttributeEmulator.php +49 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/EnumTokenEmulator.php +26 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ExplicitOctalEmulator.php +45 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/KeywordEmulator.php +60 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.php +19 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NullsafeTokenEmulator.php +60 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/PipeOperatorEmulator.php +45 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/PropertyTokenEmulator.php +19 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyFunctionTokenEmulator.php +31 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyTokenEmulator.php +31 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReverseEmulator.php +37 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.php +30 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/VoidCastEmulator.php +98 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Lexer.php +116 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Modifiers.php +85 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/NameContext.php +284 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Arg.php +44 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/ArrayItem.php +43 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Attribute.php +33 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/AttributeGroup.php +27 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/ClosureUse.php +36 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/ComplexType.php +13 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Const_.php +36 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/DeclareItem.php +37 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.php +33 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php +34 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php +84 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php +33 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.php +11 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseOr.php +11 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseXor.php +11 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Coalesce.php +11 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Concat.php +11 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Div.php +11 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Minus.php +11 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mod.php +11 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mul.php +11 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Plus.php +11 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Pow.php +11 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftLeft.php +11 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftRight.php +11 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignRef.php +33 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseOr.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseXor.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanAnd.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanOr.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Coalesce.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Concat.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Div.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Equal.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Greater.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Identical.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalAnd.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalOr.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalXor.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Minus.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mod.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mul.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotEqual.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotIdentical.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pipe.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Plus.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pow.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftLeft.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftRight.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Smaller.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/SmallerOrEqual.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Spaceship.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php +37 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/CallLike.php +60 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.php +11 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Bool_.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Double.php +16 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Int_.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Object_.php +11 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/String_.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Unset_.php +11 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Void_.php +11 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php +25 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.php +36 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php +86 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php +30 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php +30 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php +33 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php +38 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php +38 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php +35 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php +34 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Match_.php +32 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php +45 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php +40 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafeMethodCall.php +45 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafePropertyFetch.php +35 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php +35 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php +30 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php +45 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php +36 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php +37 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Throw_.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php +33 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Expr.php +8 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php +40 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Identifier.php +85 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/InterpolatedStringPart.php +32 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/IntersectionType.php +27 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/MatchArm.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.php +49 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Name/Relative.php +49 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Name.php +278 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/NullableType.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Param.php +123 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/PropertyHook.php +105 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/PropertyItem.php +37 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php +17 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Float_.php +78 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Int_.php +82 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/InterpolatedString.php +34 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Dir.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/File.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Function_.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Line.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Method.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Namespace_.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Property.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Trait_.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php +27 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.php +161 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar.php +6 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/StaticVar.php +39 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Block.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php +33 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php +40 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php +77 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php +109 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php +154 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php +94 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php +37 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php +17 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php +34 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php +33 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php +33 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/EnumCase.php +36 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Enum_.php +44 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php +32 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php +47 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php +50 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php +81 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php +30 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php +41 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php +46 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php +40 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php +30 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php +37 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php +16 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php +121 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php +17 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php +15 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php +30 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php +33 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php +33 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.php +37 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php +33 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php +12 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php +34 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php +37 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php +29 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php +17 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php +47 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php +33 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt.php +8 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/UnionType.php +27 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/UseItem.php +55 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.php +16 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node/VariadicPlaceholder.php +27 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Node.php +150 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/NodeAbstract.php +181 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/NodeDumper.php +299 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/NodeFinder.php +90 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php +287 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php +26 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.php +19 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/CommentAnnotatingVisitor.php +82 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php +47 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php +49 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php +269 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.php +73 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php +51 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/NodeVisitor.php +124 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php +24 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.php +2919 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php +2917 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Parser.php +24 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/ParserAbstract.php +1335 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/ParserFactory.php +42 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/PhpVersion.php +175 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php +1232 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinter.php +51 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php +1706 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/Token.php +18 -0
- webshell_analyzer/extractor/ast_extraction/vendor/nikic/php-parser/lib/PhpParser/compatibility_tokens.php +71 -0
- webshell_analyzer/extractor/extractor.py +73 -0
- webshell_analyzer/extractor/lexical_extraction/lexicalExtractor.py +31 -0
- webshell_analyzer/extractor/statistical_extraction/statisticalExtractor.py +60 -0
- webshell_analyzer/model/features_selected.json +1 -0
- webshell_analyzer/model/model_loader.py +19 -0
- webshell_analyzer/model/rf_webshell_model.joblib +0 -0
- webshell_analyzer/modules/__init__.py +0 -0
- webshell_analyzer/modules/detector.py +174 -0
- webshell_analyzer/modules/scanner.py +68 -0
- webshell_analyzer-1.0.0.dist-info/METADATA +105 -0
- webshell_analyzer-1.0.0.dist-info/RECORD +304 -0
- webshell_analyzer-1.0.0.dist-info/WHEEL +5 -0
- webshell_analyzer-1.0.0.dist-info/entry_points.txt +2 -0
- webshell_analyzer-1.0.0.dist-info/licenses/LICENSE +21 -0
- webshell_analyzer-1.0.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
<?php declare(strict_types=1);
|
|
2
|
+
|
|
3
|
+
namespace PhpParser\Lexer\TokenEmulator;
|
|
4
|
+
|
|
5
|
+
use PhpParser\PhpVersion;
|
|
6
|
+
use PhpParser\Token;
|
|
7
|
+
|
|
8
|
+
final class AsymmetricVisibilityTokenEmulator extends TokenEmulator {
|
|
9
|
+
public function getPhpVersion(): PhpVersion {
|
|
10
|
+
return PhpVersion::fromComponents(8, 4);
|
|
11
|
+
}
|
|
12
|
+
public function isEmulationNeeded(string $code): bool {
|
|
13
|
+
$code = strtolower($code);
|
|
14
|
+
return strpos($code, 'public(set)') !== false ||
|
|
15
|
+
strpos($code, 'protected(set)') !== false ||
|
|
16
|
+
strpos($code, 'private(set)') !== false;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
public function emulate(string $code, array $tokens): array {
|
|
20
|
+
$map = [
|
|
21
|
+
\T_PUBLIC => \T_PUBLIC_SET,
|
|
22
|
+
\T_PROTECTED => \T_PROTECTED_SET,
|
|
23
|
+
\T_PRIVATE => \T_PRIVATE_SET,
|
|
24
|
+
];
|
|
25
|
+
for ($i = 0, $c = count($tokens); $i < $c; ++$i) {
|
|
26
|
+
$token = $tokens[$i];
|
|
27
|
+
if (isset($map[$token->id]) && $i + 3 < $c && $tokens[$i + 1]->text === '(' &&
|
|
28
|
+
$tokens[$i + 2]->id === \T_STRING && \strtolower($tokens[$i + 2]->text) === 'set' &&
|
|
29
|
+
$tokens[$i + 3]->text === ')' &&
|
|
30
|
+
$this->isKeywordContext($tokens, $i)
|
|
31
|
+
) {
|
|
32
|
+
array_splice($tokens, $i, 4, [
|
|
33
|
+
new Token(
|
|
34
|
+
$map[$token->id], $token->text . '(' . $tokens[$i + 2]->text . ')',
|
|
35
|
+
$token->line, $token->pos),
|
|
36
|
+
]);
|
|
37
|
+
$c -= 3;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return $tokens;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
public function reverseEmulate(string $code, array $tokens): array {
|
|
45
|
+
$reverseMap = [
|
|
46
|
+
\T_PUBLIC_SET => \T_PUBLIC,
|
|
47
|
+
\T_PROTECTED_SET => \T_PROTECTED,
|
|
48
|
+
\T_PRIVATE_SET => \T_PRIVATE,
|
|
49
|
+
];
|
|
50
|
+
for ($i = 0, $c = count($tokens); $i < $c; ++$i) {
|
|
51
|
+
$token = $tokens[$i];
|
|
52
|
+
if (isset($reverseMap[$token->id]) &&
|
|
53
|
+
\preg_match('/(public|protected|private)\((set)\)/i', $token->text, $matches)
|
|
54
|
+
) {
|
|
55
|
+
[, $modifier, $set] = $matches;
|
|
56
|
+
$modifierLen = \strlen($modifier);
|
|
57
|
+
array_splice($tokens, $i, 1, [
|
|
58
|
+
new Token($reverseMap[$token->id], $modifier, $token->line, $token->pos),
|
|
59
|
+
new Token(\ord('('), '(', $token->line, $token->pos + $modifierLen),
|
|
60
|
+
new Token(\T_STRING, $set, $token->line, $token->pos + $modifierLen + 1),
|
|
61
|
+
new Token(\ord(')'), ')', $token->line, $token->pos + $modifierLen + 4),
|
|
62
|
+
]);
|
|
63
|
+
$i += 3;
|
|
64
|
+
$c += 3;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return $tokens;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** @param Token[] $tokens */
|
|
72
|
+
protected function isKeywordContext(array $tokens, int $pos): bool {
|
|
73
|
+
$prevToken = $this->getPreviousNonSpaceToken($tokens, $pos);
|
|
74
|
+
if ($prevToken === null) {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
return $prevToken->id !== \T_OBJECT_OPERATOR
|
|
78
|
+
&& $prevToken->id !== \T_NULLSAFE_OBJECT_OPERATOR;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/** @param Token[] $tokens */
|
|
82
|
+
private function getPreviousNonSpaceToken(array $tokens, int $start): ?Token {
|
|
83
|
+
for ($i = $start - 1; $i >= 0; --$i) {
|
|
84
|
+
if ($tokens[$i]->id === T_WHITESPACE) {
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return $tokens[$i];
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
<?php declare(strict_types=1);
|
|
2
|
+
|
|
3
|
+
namespace PhpParser\Lexer\TokenEmulator;
|
|
4
|
+
|
|
5
|
+
use PhpParser\PhpVersion;
|
|
6
|
+
use PhpParser\Token;
|
|
7
|
+
|
|
8
|
+
final class AttributeEmulator extends TokenEmulator {
|
|
9
|
+
public function getPhpVersion(): PhpVersion {
|
|
10
|
+
return PhpVersion::fromComponents(8, 0);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
public function isEmulationNeeded(string $code): bool {
|
|
14
|
+
return strpos($code, '#[') !== false;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
public function emulate(string $code, array $tokens): array {
|
|
18
|
+
// We need to manually iterate and manage a count because we'll change
|
|
19
|
+
// the tokens array on the way.
|
|
20
|
+
for ($i = 0, $c = count($tokens); $i < $c; ++$i) {
|
|
21
|
+
$token = $tokens[$i];
|
|
22
|
+
if ($token->text === '#' && isset($tokens[$i + 1]) && $tokens[$i + 1]->text === '[') {
|
|
23
|
+
array_splice($tokens, $i, 2, [
|
|
24
|
+
new Token(\T_ATTRIBUTE, '#[', $token->line, $token->pos),
|
|
25
|
+
]);
|
|
26
|
+
$c--;
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return $tokens;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
public function reverseEmulate(string $code, array $tokens): array {
|
|
35
|
+
// TODO
|
|
36
|
+
return $tokens;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
public function preprocessCode(string $code, array &$patches): string {
|
|
40
|
+
$pos = 0;
|
|
41
|
+
while (false !== $pos = strpos($code, '#[', $pos)) {
|
|
42
|
+
// Replace #[ with %[
|
|
43
|
+
$code[$pos] = '%';
|
|
44
|
+
$patches[] = [$pos, 'replace', '#'];
|
|
45
|
+
$pos += 2;
|
|
46
|
+
}
|
|
47
|
+
return $code;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<?php declare(strict_types=1);
|
|
2
|
+
|
|
3
|
+
namespace PhpParser\Lexer\TokenEmulator;
|
|
4
|
+
|
|
5
|
+
use PhpParser\PhpVersion;
|
|
6
|
+
|
|
7
|
+
final class EnumTokenEmulator extends KeywordEmulator {
|
|
8
|
+
public function getPhpVersion(): PhpVersion {
|
|
9
|
+
return PhpVersion::fromComponents(8, 1);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
public function getKeywordString(): string {
|
|
13
|
+
return 'enum';
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
public function getKeywordToken(): int {
|
|
17
|
+
return \T_ENUM;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
protected function isKeywordContext(array $tokens, int $pos): bool {
|
|
21
|
+
return parent::isKeywordContext($tokens, $pos)
|
|
22
|
+
&& isset($tokens[$pos + 2])
|
|
23
|
+
&& $tokens[$pos + 1]->id === \T_WHITESPACE
|
|
24
|
+
&& $tokens[$pos + 2]->id === \T_STRING;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
<?php declare(strict_types=1);
|
|
2
|
+
|
|
3
|
+
namespace PhpParser\Lexer\TokenEmulator;
|
|
4
|
+
|
|
5
|
+
use PhpParser\PhpVersion;
|
|
6
|
+
use PhpParser\Token;
|
|
7
|
+
|
|
8
|
+
class ExplicitOctalEmulator extends TokenEmulator {
|
|
9
|
+
public function getPhpVersion(): PhpVersion {
|
|
10
|
+
return PhpVersion::fromComponents(8, 1);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
public function isEmulationNeeded(string $code): bool {
|
|
14
|
+
return strpos($code, '0o') !== false || strpos($code, '0O') !== false;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
public function emulate(string $code, array $tokens): array {
|
|
18
|
+
for ($i = 0, $c = count($tokens); $i < $c; ++$i) {
|
|
19
|
+
$token = $tokens[$i];
|
|
20
|
+
if ($token->id == \T_LNUMBER && $token->text === '0' &&
|
|
21
|
+
isset($tokens[$i + 1]) && $tokens[$i + 1]->id == \T_STRING &&
|
|
22
|
+
preg_match('/[oO][0-7]+(?:_[0-7]+)*/', $tokens[$i + 1]->text)
|
|
23
|
+
) {
|
|
24
|
+
$tokenKind = $this->resolveIntegerOrFloatToken($tokens[$i + 1]->text);
|
|
25
|
+
array_splice($tokens, $i, 2, [
|
|
26
|
+
new Token($tokenKind, '0' . $tokens[$i + 1]->text, $token->line, $token->pos),
|
|
27
|
+
]);
|
|
28
|
+
$c--;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return $tokens;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
private function resolveIntegerOrFloatToken(string $str): int {
|
|
35
|
+
$str = substr($str, 1);
|
|
36
|
+
$str = str_replace('_', '', $str);
|
|
37
|
+
$num = octdec($str);
|
|
38
|
+
return is_float($num) ? \T_DNUMBER : \T_LNUMBER;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
public function reverseEmulate(string $code, array $tokens): array {
|
|
42
|
+
// Explicit octals were not legal code previously, don't bother.
|
|
43
|
+
return $tokens;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
<?php declare(strict_types=1);
|
|
2
|
+
|
|
3
|
+
namespace PhpParser\Lexer\TokenEmulator;
|
|
4
|
+
|
|
5
|
+
use PhpParser\Token;
|
|
6
|
+
|
|
7
|
+
abstract class KeywordEmulator extends TokenEmulator {
|
|
8
|
+
abstract public function getKeywordString(): string;
|
|
9
|
+
abstract public function getKeywordToken(): int;
|
|
10
|
+
|
|
11
|
+
public function isEmulationNeeded(string $code): bool {
|
|
12
|
+
return strpos(strtolower($code), $this->getKeywordString()) !== false;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/** @param Token[] $tokens */
|
|
16
|
+
protected function isKeywordContext(array $tokens, int $pos): bool {
|
|
17
|
+
$prevToken = $this->getPreviousNonSpaceToken($tokens, $pos);
|
|
18
|
+
if ($prevToken === null) {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
return $prevToken->id !== \T_OBJECT_OPERATOR
|
|
22
|
+
&& $prevToken->id !== \T_NULLSAFE_OBJECT_OPERATOR;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
public function emulate(string $code, array $tokens): array {
|
|
26
|
+
$keywordString = $this->getKeywordString();
|
|
27
|
+
foreach ($tokens as $i => $token) {
|
|
28
|
+
if ($token->id === T_STRING && strtolower($token->text) === $keywordString
|
|
29
|
+
&& $this->isKeywordContext($tokens, $i)) {
|
|
30
|
+
$token->id = $this->getKeywordToken();
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return $tokens;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** @param Token[] $tokens */
|
|
38
|
+
private function getPreviousNonSpaceToken(array $tokens, int $start): ?Token {
|
|
39
|
+
for ($i = $start - 1; $i >= 0; --$i) {
|
|
40
|
+
if ($tokens[$i]->id === T_WHITESPACE) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return $tokens[$i];
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
public function reverseEmulate(string $code, array $tokens): array {
|
|
51
|
+
$keywordToken = $this->getKeywordToken();
|
|
52
|
+
foreach ($tokens as $token) {
|
|
53
|
+
if ($token->id === $keywordToken) {
|
|
54
|
+
$token->id = \T_STRING;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return $tokens;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<?php declare(strict_types=1);
|
|
2
|
+
|
|
3
|
+
namespace PhpParser\Lexer\TokenEmulator;
|
|
4
|
+
|
|
5
|
+
use PhpParser\PhpVersion;
|
|
6
|
+
|
|
7
|
+
final class MatchTokenEmulator extends KeywordEmulator {
|
|
8
|
+
public function getPhpVersion(): PhpVersion {
|
|
9
|
+
return PhpVersion::fromComponents(8, 0);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
public function getKeywordString(): string {
|
|
13
|
+
return 'match';
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
public function getKeywordToken(): int {
|
|
17
|
+
return \T_MATCH;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
<?php declare(strict_types=1);
|
|
2
|
+
|
|
3
|
+
namespace PhpParser\Lexer\TokenEmulator;
|
|
4
|
+
|
|
5
|
+
use PhpParser\PhpVersion;
|
|
6
|
+
use PhpParser\Token;
|
|
7
|
+
|
|
8
|
+
final class NullsafeTokenEmulator extends TokenEmulator {
|
|
9
|
+
public function getPhpVersion(): PhpVersion {
|
|
10
|
+
return PhpVersion::fromComponents(8, 0);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
public function isEmulationNeeded(string $code): bool {
|
|
14
|
+
return strpos($code, '?->') !== false;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
public function emulate(string $code, array $tokens): array {
|
|
18
|
+
// We need to manually iterate and manage a count because we'll change
|
|
19
|
+
// the tokens array on the way
|
|
20
|
+
for ($i = 0, $c = count($tokens); $i < $c; ++$i) {
|
|
21
|
+
$token = $tokens[$i];
|
|
22
|
+
if ($token->text === '?' && isset($tokens[$i + 1]) && $tokens[$i + 1]->id === \T_OBJECT_OPERATOR) {
|
|
23
|
+
array_splice($tokens, $i, 2, [
|
|
24
|
+
new Token(\T_NULLSAFE_OBJECT_OPERATOR, '?->', $token->line, $token->pos),
|
|
25
|
+
]);
|
|
26
|
+
$c--;
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Handle ?-> inside encapsed string.
|
|
31
|
+
if ($token->id === \T_ENCAPSED_AND_WHITESPACE && isset($tokens[$i - 1])
|
|
32
|
+
&& $tokens[$i - 1]->id === \T_VARIABLE
|
|
33
|
+
&& preg_match('/^\?->([a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*)/', $token->text, $matches)
|
|
34
|
+
) {
|
|
35
|
+
$replacement = [
|
|
36
|
+
new Token(\T_NULLSAFE_OBJECT_OPERATOR, '?->', $token->line, $token->pos),
|
|
37
|
+
new Token(\T_STRING, $matches[1], $token->line, $token->pos + 3),
|
|
38
|
+
];
|
|
39
|
+
$matchLen = \strlen($matches[0]);
|
|
40
|
+
if ($matchLen !== \strlen($token->text)) {
|
|
41
|
+
$replacement[] = new Token(
|
|
42
|
+
\T_ENCAPSED_AND_WHITESPACE,
|
|
43
|
+
\substr($token->text, $matchLen),
|
|
44
|
+
$token->line, $token->pos + $matchLen
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
array_splice($tokens, $i, 1, $replacement);
|
|
48
|
+
$c += \count($replacement) - 1;
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return $tokens;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
public function reverseEmulate(string $code, array $tokens): array {
|
|
57
|
+
// ?-> was not valid code previously, don't bother.
|
|
58
|
+
return $tokens;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
<?php declare(strict_types=1);
|
|
2
|
+
|
|
3
|
+
namespace PhpParser\Lexer\TokenEmulator;
|
|
4
|
+
|
|
5
|
+
use PhpParser\Lexer\TokenEmulator\TokenEmulator;
|
|
6
|
+
use PhpParser\PhpVersion;
|
|
7
|
+
use PhpParser\Token;
|
|
8
|
+
|
|
9
|
+
class PipeOperatorEmulator extends TokenEmulator {
|
|
10
|
+
public function getPhpVersion(): PhpVersion {
|
|
11
|
+
return PhpVersion::fromComponents(8, 5);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
public function isEmulationNeeded(string $code): bool {
|
|
15
|
+
return \strpos($code, '|>') !== false;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
public function emulate(string $code, array $tokens): array {
|
|
19
|
+
for ($i = 0, $c = count($tokens); $i < $c; ++$i) {
|
|
20
|
+
$token = $tokens[$i];
|
|
21
|
+
if ($token->text === '|' && isset($tokens[$i + 1]) && $tokens[$i + 1]->text === '>') {
|
|
22
|
+
array_splice($tokens, $i, 2, [
|
|
23
|
+
new Token(\T_PIPE, '|>', $token->line, $token->pos),
|
|
24
|
+
]);
|
|
25
|
+
$c--;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return $tokens;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
public function reverseEmulate(string $code, array $tokens): array {
|
|
32
|
+
for ($i = 0, $c = count($tokens); $i < $c; ++$i) {
|
|
33
|
+
$token = $tokens[$i];
|
|
34
|
+
if ($token->id === \T_PIPE) {
|
|
35
|
+
array_splice($tokens, $i, 1, [
|
|
36
|
+
new Token(\ord('|'), '|', $token->line, $token->pos),
|
|
37
|
+
new Token(\ord('>'), '>', $token->line, $token->pos + 1),
|
|
38
|
+
]);
|
|
39
|
+
$i++;
|
|
40
|
+
$c++;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return $tokens;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<?php declare(strict_types=1);
|
|
2
|
+
|
|
3
|
+
namespace PhpParser\Lexer\TokenEmulator;
|
|
4
|
+
|
|
5
|
+
use PhpParser\PhpVersion;
|
|
6
|
+
|
|
7
|
+
final class PropertyTokenEmulator extends KeywordEmulator {
|
|
8
|
+
public function getPhpVersion(): PhpVersion {
|
|
9
|
+
return PhpVersion::fromComponents(8, 4);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
public function getKeywordString(): string {
|
|
13
|
+
return '__property__';
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
public function getKeywordToken(): int {
|
|
17
|
+
return \T_PROPERTY_C;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
<?php declare(strict_types=1);
|
|
2
|
+
|
|
3
|
+
namespace PhpParser\Lexer\TokenEmulator;
|
|
4
|
+
|
|
5
|
+
use PhpParser\PhpVersion;
|
|
6
|
+
|
|
7
|
+
/*
|
|
8
|
+
* In PHP 8.1, "readonly(" was special cased in the lexer in order to support functions with
|
|
9
|
+
* name readonly. In PHP 8.2, this may conflict with readonly properties having a DNF type. For
|
|
10
|
+
* this reason, PHP 8.2 instead treats this as T_READONLY and then handles it specially in the
|
|
11
|
+
* parser. This emulator only exists to handle this special case, which is skipped by the
|
|
12
|
+
* PHP 8.1 ReadonlyTokenEmulator.
|
|
13
|
+
*/
|
|
14
|
+
class ReadonlyFunctionTokenEmulator extends KeywordEmulator {
|
|
15
|
+
public function getKeywordString(): string {
|
|
16
|
+
return 'readonly';
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
public function getKeywordToken(): int {
|
|
20
|
+
return \T_READONLY;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
public function getPhpVersion(): PhpVersion {
|
|
24
|
+
return PhpVersion::fromComponents(8, 2);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
public function reverseEmulate(string $code, array $tokens): array {
|
|
28
|
+
// Don't bother
|
|
29
|
+
return $tokens;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
<?php declare(strict_types=1);
|
|
2
|
+
|
|
3
|
+
namespace PhpParser\Lexer\TokenEmulator;
|
|
4
|
+
|
|
5
|
+
use PhpParser\PhpVersion;
|
|
6
|
+
|
|
7
|
+
final class ReadonlyTokenEmulator extends KeywordEmulator {
|
|
8
|
+
public function getPhpVersion(): PhpVersion {
|
|
9
|
+
return PhpVersion::fromComponents(8, 1);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
public function getKeywordString(): string {
|
|
13
|
+
return 'readonly';
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
public function getKeywordToken(): int {
|
|
17
|
+
return \T_READONLY;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
protected function isKeywordContext(array $tokens, int $pos): bool {
|
|
21
|
+
if (!parent::isKeywordContext($tokens, $pos)) {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
// Support "function readonly("
|
|
25
|
+
return !(isset($tokens[$pos + 1]) &&
|
|
26
|
+
($tokens[$pos + 1]->text === '(' ||
|
|
27
|
+
($tokens[$pos + 1]->id === \T_WHITESPACE &&
|
|
28
|
+
isset($tokens[$pos + 2]) &&
|
|
29
|
+
$tokens[$pos + 2]->text === '(')));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
<?php declare(strict_types=1);
|
|
2
|
+
|
|
3
|
+
namespace PhpParser\Lexer\TokenEmulator;
|
|
4
|
+
|
|
5
|
+
use PhpParser\PhpVersion;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Reverses emulation direction of the inner emulator.
|
|
9
|
+
*/
|
|
10
|
+
final class ReverseEmulator extends TokenEmulator {
|
|
11
|
+
/** @var TokenEmulator Inner emulator */
|
|
12
|
+
private TokenEmulator $emulator;
|
|
13
|
+
|
|
14
|
+
public function __construct(TokenEmulator $emulator) {
|
|
15
|
+
$this->emulator = $emulator;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
public function getPhpVersion(): PhpVersion {
|
|
19
|
+
return $this->emulator->getPhpVersion();
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
public function isEmulationNeeded(string $code): bool {
|
|
23
|
+
return $this->emulator->isEmulationNeeded($code);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
public function emulate(string $code, array $tokens): array {
|
|
27
|
+
return $this->emulator->reverseEmulate($code, $tokens);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
public function reverseEmulate(string $code, array $tokens): array {
|
|
31
|
+
return $this->emulator->emulate($code, $tokens);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
public function preprocessCode(string $code, array &$patches): string {
|
|
35
|
+
return $code;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
<?php declare(strict_types=1);
|
|
2
|
+
|
|
3
|
+
namespace PhpParser\Lexer\TokenEmulator;
|
|
4
|
+
|
|
5
|
+
use PhpParser\PhpVersion;
|
|
6
|
+
use PhpParser\Token;
|
|
7
|
+
|
|
8
|
+
/** @internal */
|
|
9
|
+
abstract class TokenEmulator {
|
|
10
|
+
abstract public function getPhpVersion(): PhpVersion;
|
|
11
|
+
|
|
12
|
+
abstract public function isEmulationNeeded(string $code): bool;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @param Token[] $tokens Original tokens
|
|
16
|
+
* @return Token[] Modified Tokens
|
|
17
|
+
*/
|
|
18
|
+
abstract public function emulate(string $code, array $tokens): array;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* @param Token[] $tokens Original tokens
|
|
22
|
+
* @return Token[] Modified Tokens
|
|
23
|
+
*/
|
|
24
|
+
abstract public function reverseEmulate(string $code, array $tokens): array;
|
|
25
|
+
|
|
26
|
+
/** @param array{int, string, string}[] $patches */
|
|
27
|
+
public function preprocessCode(string $code, array &$patches): string {
|
|
28
|
+
return $code;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
<?php declare(strict_types=1);
|
|
2
|
+
|
|
3
|
+
namespace PhpParser\Lexer\TokenEmulator;
|
|
4
|
+
|
|
5
|
+
use PhpParser\PhpVersion;
|
|
6
|
+
use PhpParser\Token;
|
|
7
|
+
|
|
8
|
+
class VoidCastEmulator extends TokenEmulator {
|
|
9
|
+
public function getPhpVersion(): PhpVersion {
|
|
10
|
+
return PhpVersion::fromComponents(8, 5);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
public function isEmulationNeeded(string $code): bool {
|
|
14
|
+
return (bool)\preg_match('/\([ \t]*void[ \t]*\)/i', $code);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
public function emulate(string $code, array $tokens): array {
|
|
18
|
+
for ($i = 0, $c = count($tokens); $i < $c; ++$i) {
|
|
19
|
+
$token = $tokens[$i];
|
|
20
|
+
if ($token->text !== '(') {
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
$numTokens = 1;
|
|
25
|
+
$text = '(';
|
|
26
|
+
$j = $i + 1;
|
|
27
|
+
if ($j < $c && $tokens[$j]->id === \T_WHITESPACE && preg_match('/[ \t]+/', $tokens[$j]->text)) {
|
|
28
|
+
$text .= $tokens[$j]->text;
|
|
29
|
+
$numTokens++;
|
|
30
|
+
$j++;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if ($j >= $c || $tokens[$j]->id !== \T_STRING || \strtolower($tokens[$j]->text) !== 'void') {
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
$text .= $tokens[$j]->text;
|
|
38
|
+
$numTokens++;
|
|
39
|
+
$k = $j + 1;
|
|
40
|
+
if ($k < $c && $tokens[$k]->id === \T_WHITESPACE && preg_match('/[ \t]+/', $tokens[$k]->text)) {
|
|
41
|
+
$text .= $tokens[$k]->text;
|
|
42
|
+
$numTokens++;
|
|
43
|
+
$k++;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if ($k >= $c || $tokens[$k]->text !== ')') {
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
$text .= ')';
|
|
51
|
+
$numTokens++;
|
|
52
|
+
array_splice($tokens, $i, $numTokens, [
|
|
53
|
+
new Token(\T_VOID_CAST, $text, $token->line, $token->pos),
|
|
54
|
+
]);
|
|
55
|
+
$c -= $numTokens - 1;
|
|
56
|
+
}
|
|
57
|
+
return $tokens;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
public function reverseEmulate(string $code, array $tokens): array {
|
|
61
|
+
for ($i = 0, $c = count($tokens); $i < $c; ++$i) {
|
|
62
|
+
$token = $tokens[$i];
|
|
63
|
+
if ($token->id !== \T_VOID_CAST) {
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (!preg_match('/^\(([ \t]*)(void)([ \t]*)\)$/i', $token->text, $match)) {
|
|
68
|
+
throw new \LogicException('Unexpected T_VOID_CAST contents');
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
$newTokens = [];
|
|
72
|
+
$pos = $token->pos;
|
|
73
|
+
|
|
74
|
+
$newTokens[] = new Token(\ord('('), '(', $token->line, $pos);
|
|
75
|
+
$pos++;
|
|
76
|
+
|
|
77
|
+
if ($match[1] !== '') {
|
|
78
|
+
$newTokens[] = new Token(\T_WHITESPACE, $match[1], $token->line, $pos);
|
|
79
|
+
$pos += \strlen($match[1]);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
$newTokens[] = new Token(\T_STRING, $match[2], $token->line, $pos);
|
|
83
|
+
$pos += \strlen($match[2]);
|
|
84
|
+
|
|
85
|
+
if ($match[3] !== '') {
|
|
86
|
+
$newTokens[] = new Token(\T_WHITESPACE, $match[3], $token->line, $pos);
|
|
87
|
+
$pos += \strlen($match[3]);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
$newTokens[] = new Token(\ord(')'), ')', $token->line, $pos);
|
|
91
|
+
|
|
92
|
+
array_splice($tokens, $i, 1, $newTokens);
|
|
93
|
+
$i += \count($newTokens) - 1;
|
|
94
|
+
$c += \count($newTokens) - 1;
|
|
95
|
+
}
|
|
96
|
+
return $tokens;
|
|
97
|
+
}
|
|
98
|
+
}
|