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,19 @@
|
|
|
1
|
+
<?php declare(strict_types=1);
|
|
2
|
+
|
|
3
|
+
namespace PhpParser\NodeVisitor;
|
|
4
|
+
|
|
5
|
+
use PhpParser\Node;
|
|
6
|
+
use PhpParser\NodeVisitorAbstract;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Visitor cloning all nodes and linking to the original nodes using an attribute.
|
|
10
|
+
*
|
|
11
|
+
* This visitor is required to perform format-preserving pretty prints.
|
|
12
|
+
*/
|
|
13
|
+
class CloningVisitor extends NodeVisitorAbstract {
|
|
14
|
+
public function enterNode(Node $origNode) {
|
|
15
|
+
$node = clone $origNode;
|
|
16
|
+
$node->setAttribute('origNode', $origNode);
|
|
17
|
+
return $node;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
<?php declare(strict_types=1);
|
|
2
|
+
|
|
3
|
+
namespace PhpParser\NodeVisitor;
|
|
4
|
+
|
|
5
|
+
use PhpParser\Comment;
|
|
6
|
+
use PhpParser\Node;
|
|
7
|
+
use PhpParser\NodeVisitorAbstract;
|
|
8
|
+
use PhpParser\Token;
|
|
9
|
+
|
|
10
|
+
class CommentAnnotatingVisitor extends NodeVisitorAbstract {
|
|
11
|
+
/** @var int Last seen token start position */
|
|
12
|
+
private int $pos = 0;
|
|
13
|
+
/** @var Token[] Token array */
|
|
14
|
+
private array $tokens;
|
|
15
|
+
/** @var list<int> Token positions of comments */
|
|
16
|
+
private array $commentPositions = [];
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Create a comment annotation visitor.
|
|
20
|
+
*
|
|
21
|
+
* @param Token[] $tokens Token array
|
|
22
|
+
*/
|
|
23
|
+
public function __construct(array $tokens) {
|
|
24
|
+
$this->tokens = $tokens;
|
|
25
|
+
|
|
26
|
+
// Collect positions of comments. We use this to avoid traversing parts of the AST where
|
|
27
|
+
// there are no comments.
|
|
28
|
+
foreach ($tokens as $i => $token) {
|
|
29
|
+
if ($token->id === \T_COMMENT || $token->id === \T_DOC_COMMENT) {
|
|
30
|
+
$this->commentPositions[] = $i;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
public function enterNode(Node $node) {
|
|
36
|
+
$nextCommentPos = current($this->commentPositions);
|
|
37
|
+
if ($nextCommentPos === false) {
|
|
38
|
+
// No more comments.
|
|
39
|
+
return self::STOP_TRAVERSAL;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
$oldPos = $this->pos;
|
|
43
|
+
$this->pos = $pos = $node->getStartTokenPos();
|
|
44
|
+
if ($nextCommentPos > $oldPos && $nextCommentPos < $pos) {
|
|
45
|
+
$comments = [];
|
|
46
|
+
while (--$pos >= $oldPos) {
|
|
47
|
+
$token = $this->tokens[$pos];
|
|
48
|
+
if ($token->id === \T_DOC_COMMENT) {
|
|
49
|
+
$comments[] = new Comment\Doc(
|
|
50
|
+
$token->text, $token->line, $token->pos, $pos,
|
|
51
|
+
$token->getEndLine(), $token->getEndPos() - 1, $pos);
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
if ($token->id === \T_COMMENT) {
|
|
55
|
+
$comments[] = new Comment(
|
|
56
|
+
$token->text, $token->line, $token->pos, $pos,
|
|
57
|
+
$token->getEndLine(), $token->getEndPos() - 1, $pos);
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
if ($token->id !== \T_WHITESPACE) {
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (!empty($comments)) {
|
|
65
|
+
$node->setAttribute('comments', array_reverse($comments));
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
do {
|
|
69
|
+
$nextCommentPos = next($this->commentPositions);
|
|
70
|
+
} while ($nextCommentPos !== false && $nextCommentPos < $this->pos);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
$endPos = $node->getEndTokenPos();
|
|
74
|
+
if ($nextCommentPos > $endPos) {
|
|
75
|
+
// Skip children if there are no comments located inside this node.
|
|
76
|
+
$this->pos = $endPos;
|
|
77
|
+
return self::DONT_TRAVERSE_CHILDREN;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
<?php declare(strict_types=1);
|
|
2
|
+
|
|
3
|
+
namespace PhpParser\NodeVisitor;
|
|
4
|
+
|
|
5
|
+
use PhpParser\Node;
|
|
6
|
+
use PhpParser\NodeVisitorAbstract;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* This visitor can be used to find and collect all nodes satisfying some criterion determined by
|
|
10
|
+
* a filter callback.
|
|
11
|
+
*/
|
|
12
|
+
class FindingVisitor extends NodeVisitorAbstract {
|
|
13
|
+
/** @var callable Filter callback */
|
|
14
|
+
protected $filterCallback;
|
|
15
|
+
/** @var list<Node> Found nodes */
|
|
16
|
+
protected array $foundNodes;
|
|
17
|
+
|
|
18
|
+
public function __construct(callable $filterCallback) {
|
|
19
|
+
$this->filterCallback = $filterCallback;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Get found nodes satisfying the filter callback.
|
|
24
|
+
*
|
|
25
|
+
* Nodes are returned in pre-order.
|
|
26
|
+
*
|
|
27
|
+
* @return list<Node> Found nodes
|
|
28
|
+
*/
|
|
29
|
+
public function getFoundNodes(): array {
|
|
30
|
+
return $this->foundNodes;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
public function beforeTraverse(array $nodes): ?array {
|
|
34
|
+
$this->foundNodes = [];
|
|
35
|
+
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
public function enterNode(Node $node) {
|
|
40
|
+
$filterCallback = $this->filterCallback;
|
|
41
|
+
if ($filterCallback($node)) {
|
|
42
|
+
$this->foundNodes[] = $node;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
<?php declare(strict_types=1);
|
|
2
|
+
|
|
3
|
+
namespace PhpParser\NodeVisitor;
|
|
4
|
+
|
|
5
|
+
use PhpParser\Node;
|
|
6
|
+
use PhpParser\NodeVisitor;
|
|
7
|
+
use PhpParser\NodeVisitorAbstract;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* This visitor can be used to find the first node satisfying some criterion determined by
|
|
11
|
+
* a filter callback.
|
|
12
|
+
*/
|
|
13
|
+
class FirstFindingVisitor extends NodeVisitorAbstract {
|
|
14
|
+
/** @var callable Filter callback */
|
|
15
|
+
protected $filterCallback;
|
|
16
|
+
/** @var null|Node Found node */
|
|
17
|
+
protected ?Node $foundNode;
|
|
18
|
+
|
|
19
|
+
public function __construct(callable $filterCallback) {
|
|
20
|
+
$this->filterCallback = $filterCallback;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Get found node satisfying the filter callback.
|
|
25
|
+
*
|
|
26
|
+
* Returns null if no node satisfies the filter callback.
|
|
27
|
+
*
|
|
28
|
+
* @return null|Node Found node (or null if not found)
|
|
29
|
+
*/
|
|
30
|
+
public function getFoundNode(): ?Node {
|
|
31
|
+
return $this->foundNode;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
public function beforeTraverse(array $nodes): ?array {
|
|
35
|
+
$this->foundNode = null;
|
|
36
|
+
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
public function enterNode(Node $node) {
|
|
41
|
+
$filterCallback = $this->filterCallback;
|
|
42
|
+
if ($filterCallback($node)) {
|
|
43
|
+
$this->foundNode = $node;
|
|
44
|
+
return NodeVisitor::STOP_TRAVERSAL;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
<?php declare(strict_types=1);
|
|
2
|
+
|
|
3
|
+
namespace PhpParser\NodeVisitor;
|
|
4
|
+
|
|
5
|
+
use PhpParser\ErrorHandler;
|
|
6
|
+
use PhpParser\NameContext;
|
|
7
|
+
use PhpParser\Node;
|
|
8
|
+
use PhpParser\Node\Expr;
|
|
9
|
+
use PhpParser\Node\Name;
|
|
10
|
+
use PhpParser\Node\Name\FullyQualified;
|
|
11
|
+
use PhpParser\Node\Stmt;
|
|
12
|
+
use PhpParser\NodeVisitorAbstract;
|
|
13
|
+
|
|
14
|
+
class NameResolver extends NodeVisitorAbstract {
|
|
15
|
+
/** @var NameContext Naming context */
|
|
16
|
+
protected NameContext $nameContext;
|
|
17
|
+
|
|
18
|
+
/** @var bool Whether to preserve original names */
|
|
19
|
+
protected bool $preserveOriginalNames;
|
|
20
|
+
|
|
21
|
+
/** @var bool Whether to replace resolved nodes in place, or to add resolvedNode attributes */
|
|
22
|
+
protected bool $replaceNodes;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Constructs a name resolution visitor.
|
|
26
|
+
*
|
|
27
|
+
* Options:
|
|
28
|
+
* * preserveOriginalNames (default false): An "originalName" attribute will be added to
|
|
29
|
+
* all name nodes that underwent resolution.
|
|
30
|
+
* * replaceNodes (default true): Resolved names are replaced in-place. Otherwise, a
|
|
31
|
+
* resolvedName attribute is added. (Names that cannot be statically resolved receive a
|
|
32
|
+
* namespacedName attribute, as usual.)
|
|
33
|
+
*
|
|
34
|
+
* @param ErrorHandler|null $errorHandler Error handler
|
|
35
|
+
* @param array{preserveOriginalNames?: bool, replaceNodes?: bool} $options Options
|
|
36
|
+
*/
|
|
37
|
+
public function __construct(?ErrorHandler $errorHandler = null, array $options = []) {
|
|
38
|
+
$this->nameContext = new NameContext($errorHandler ?? new ErrorHandler\Throwing());
|
|
39
|
+
$this->preserveOriginalNames = $options['preserveOriginalNames'] ?? false;
|
|
40
|
+
$this->replaceNodes = $options['replaceNodes'] ?? true;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Get name resolution context.
|
|
45
|
+
*/
|
|
46
|
+
public function getNameContext(): NameContext {
|
|
47
|
+
return $this->nameContext;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
public function beforeTraverse(array $nodes): ?array {
|
|
51
|
+
$this->nameContext->startNamespace();
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
public function enterNode(Node $node) {
|
|
56
|
+
if ($node instanceof Stmt\Namespace_) {
|
|
57
|
+
$this->nameContext->startNamespace($node->name);
|
|
58
|
+
} elseif ($node instanceof Stmt\Use_) {
|
|
59
|
+
foreach ($node->uses as $use) {
|
|
60
|
+
$this->addAlias($use, $node->type, null);
|
|
61
|
+
}
|
|
62
|
+
} elseif ($node instanceof Stmt\GroupUse) {
|
|
63
|
+
foreach ($node->uses as $use) {
|
|
64
|
+
$this->addAlias($use, $node->type, $node->prefix);
|
|
65
|
+
}
|
|
66
|
+
} elseif ($node instanceof Stmt\Class_) {
|
|
67
|
+
if (null !== $node->extends) {
|
|
68
|
+
$node->extends = $this->resolveClassName($node->extends);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
foreach ($node->implements as &$interface) {
|
|
72
|
+
$interface = $this->resolveClassName($interface);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
$this->resolveAttrGroups($node);
|
|
76
|
+
if (null !== $node->name) {
|
|
77
|
+
$this->addNamespacedName($node);
|
|
78
|
+
} else {
|
|
79
|
+
$node->namespacedName = null;
|
|
80
|
+
}
|
|
81
|
+
} elseif ($node instanceof Stmt\Interface_) {
|
|
82
|
+
foreach ($node->extends as &$interface) {
|
|
83
|
+
$interface = $this->resolveClassName($interface);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
$this->resolveAttrGroups($node);
|
|
87
|
+
$this->addNamespacedName($node);
|
|
88
|
+
} elseif ($node instanceof Stmt\Enum_) {
|
|
89
|
+
foreach ($node->implements as &$interface) {
|
|
90
|
+
$interface = $this->resolveClassName($interface);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
$this->resolveAttrGroups($node);
|
|
94
|
+
$this->addNamespacedName($node);
|
|
95
|
+
} elseif ($node instanceof Stmt\Trait_) {
|
|
96
|
+
$this->resolveAttrGroups($node);
|
|
97
|
+
$this->addNamespacedName($node);
|
|
98
|
+
} elseif ($node instanceof Stmt\Function_) {
|
|
99
|
+
$this->resolveSignature($node);
|
|
100
|
+
$this->resolveAttrGroups($node);
|
|
101
|
+
$this->addNamespacedName($node);
|
|
102
|
+
} elseif ($node instanceof Stmt\ClassMethod
|
|
103
|
+
|| $node instanceof Expr\Closure
|
|
104
|
+
|| $node instanceof Expr\ArrowFunction
|
|
105
|
+
) {
|
|
106
|
+
$this->resolveSignature($node);
|
|
107
|
+
$this->resolveAttrGroups($node);
|
|
108
|
+
} elseif ($node instanceof Stmt\Property) {
|
|
109
|
+
if (null !== $node->type) {
|
|
110
|
+
$node->type = $this->resolveType($node->type);
|
|
111
|
+
}
|
|
112
|
+
$this->resolveAttrGroups($node);
|
|
113
|
+
} elseif ($node instanceof Node\PropertyHook) {
|
|
114
|
+
foreach ($node->params as $param) {
|
|
115
|
+
$param->type = $this->resolveType($param->type);
|
|
116
|
+
$this->resolveAttrGroups($param);
|
|
117
|
+
}
|
|
118
|
+
$this->resolveAttrGroups($node);
|
|
119
|
+
} elseif ($node instanceof Stmt\Const_) {
|
|
120
|
+
foreach ($node->consts as $const) {
|
|
121
|
+
$this->addNamespacedName($const);
|
|
122
|
+
}
|
|
123
|
+
$this->resolveAttrGroups($node);
|
|
124
|
+
} elseif ($node instanceof Stmt\ClassConst) {
|
|
125
|
+
if (null !== $node->type) {
|
|
126
|
+
$node->type = $this->resolveType($node->type);
|
|
127
|
+
}
|
|
128
|
+
$this->resolveAttrGroups($node);
|
|
129
|
+
} elseif ($node instanceof Stmt\EnumCase) {
|
|
130
|
+
$this->resolveAttrGroups($node);
|
|
131
|
+
} elseif ($node instanceof Expr\StaticCall
|
|
132
|
+
|| $node instanceof Expr\StaticPropertyFetch
|
|
133
|
+
|| $node instanceof Expr\ClassConstFetch
|
|
134
|
+
|| $node instanceof Expr\New_
|
|
135
|
+
|| $node instanceof Expr\Instanceof_
|
|
136
|
+
) {
|
|
137
|
+
if ($node->class instanceof Name) {
|
|
138
|
+
$node->class = $this->resolveClassName($node->class);
|
|
139
|
+
}
|
|
140
|
+
} elseif ($node instanceof Stmt\Catch_) {
|
|
141
|
+
foreach ($node->types as &$type) {
|
|
142
|
+
$type = $this->resolveClassName($type);
|
|
143
|
+
}
|
|
144
|
+
} elseif ($node instanceof Expr\FuncCall) {
|
|
145
|
+
if ($node->name instanceof Name) {
|
|
146
|
+
$node->name = $this->resolveName($node->name, Stmt\Use_::TYPE_FUNCTION);
|
|
147
|
+
}
|
|
148
|
+
} elseif ($node instanceof Expr\ConstFetch) {
|
|
149
|
+
$node->name = $this->resolveName($node->name, Stmt\Use_::TYPE_CONSTANT);
|
|
150
|
+
} elseif ($node instanceof Stmt\TraitUse) {
|
|
151
|
+
foreach ($node->traits as &$trait) {
|
|
152
|
+
$trait = $this->resolveClassName($trait);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
foreach ($node->adaptations as $adaptation) {
|
|
156
|
+
if (null !== $adaptation->trait) {
|
|
157
|
+
$adaptation->trait = $this->resolveClassName($adaptation->trait);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
if ($adaptation instanceof Stmt\TraitUseAdaptation\Precedence) {
|
|
161
|
+
foreach ($adaptation->insteadof as &$insteadof) {
|
|
162
|
+
$insteadof = $this->resolveClassName($insteadof);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
return null;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/** @param Stmt\Use_::TYPE_* $type */
|
|
172
|
+
private function addAlias(Node\UseItem $use, int $type, ?Name $prefix = null): void {
|
|
173
|
+
// Add prefix for group uses
|
|
174
|
+
$name = $prefix ? Name::concat($prefix, $use->name) : $use->name;
|
|
175
|
+
// Type is determined either by individual element or whole use declaration
|
|
176
|
+
$type |= $use->type;
|
|
177
|
+
|
|
178
|
+
$this->nameContext->addAlias(
|
|
179
|
+
$name, (string) $use->getAlias(), $type, $use->getAttributes()
|
|
180
|
+
);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/** @param Stmt\Function_|Stmt\ClassMethod|Expr\Closure|Expr\ArrowFunction $node */
|
|
184
|
+
private function resolveSignature($node): void {
|
|
185
|
+
foreach ($node->params as $param) {
|
|
186
|
+
$param->type = $this->resolveType($param->type);
|
|
187
|
+
$this->resolveAttrGroups($param);
|
|
188
|
+
}
|
|
189
|
+
$node->returnType = $this->resolveType($node->returnType);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* @template T of Node\Identifier|Name|Node\ComplexType|null
|
|
194
|
+
* @param T $node
|
|
195
|
+
* @return T
|
|
196
|
+
*/
|
|
197
|
+
private function resolveType(?Node $node): ?Node {
|
|
198
|
+
if ($node instanceof Name) {
|
|
199
|
+
return $this->resolveClassName($node);
|
|
200
|
+
}
|
|
201
|
+
if ($node instanceof Node\NullableType) {
|
|
202
|
+
$node->type = $this->resolveType($node->type);
|
|
203
|
+
return $node;
|
|
204
|
+
}
|
|
205
|
+
if ($node instanceof Node\UnionType || $node instanceof Node\IntersectionType) {
|
|
206
|
+
foreach ($node->types as &$type) {
|
|
207
|
+
$type = $this->resolveType($type);
|
|
208
|
+
}
|
|
209
|
+
return $node;
|
|
210
|
+
}
|
|
211
|
+
return $node;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Resolve name, according to name resolver options.
|
|
216
|
+
*
|
|
217
|
+
* @param Name $name Function or constant name to resolve
|
|
218
|
+
* @param Stmt\Use_::TYPE_* $type One of Stmt\Use_::TYPE_*
|
|
219
|
+
*
|
|
220
|
+
* @return Name Resolved name, or original name with attribute
|
|
221
|
+
*/
|
|
222
|
+
protected function resolveName(Name $name, int $type): Name {
|
|
223
|
+
if (!$this->replaceNodes) {
|
|
224
|
+
$resolvedName = $this->nameContext->getResolvedName($name, $type);
|
|
225
|
+
if (null !== $resolvedName) {
|
|
226
|
+
$name->setAttribute('resolvedName', $resolvedName);
|
|
227
|
+
} else {
|
|
228
|
+
$name->setAttribute('namespacedName', FullyQualified::concat(
|
|
229
|
+
$this->nameContext->getNamespace(), $name, $name->getAttributes()));
|
|
230
|
+
}
|
|
231
|
+
return $name;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
if ($this->preserveOriginalNames) {
|
|
235
|
+
// Save the original name
|
|
236
|
+
$originalName = $name;
|
|
237
|
+
$name = clone $originalName;
|
|
238
|
+
$name->setAttribute('originalName', $originalName);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
$resolvedName = $this->nameContext->getResolvedName($name, $type);
|
|
242
|
+
if (null !== $resolvedName) {
|
|
243
|
+
return $resolvedName;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// unqualified names inside a namespace cannot be resolved at compile-time
|
|
247
|
+
// add the namespaced version of the name as an attribute
|
|
248
|
+
$name->setAttribute('namespacedName', FullyQualified::concat(
|
|
249
|
+
$this->nameContext->getNamespace(), $name, $name->getAttributes()));
|
|
250
|
+
return $name;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
protected function resolveClassName(Name $name): Name {
|
|
254
|
+
return $this->resolveName($name, Stmt\Use_::TYPE_NORMAL);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
protected function addNamespacedName(Node $node): void {
|
|
258
|
+
$node->namespacedName = Name::concat(
|
|
259
|
+
$this->nameContext->getNamespace(), (string) $node->name);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
protected function resolveAttrGroups(Node $node): void {
|
|
263
|
+
foreach ($node->attrGroups as $attrGroup) {
|
|
264
|
+
foreach ($attrGroup->attrs as $attr) {
|
|
265
|
+
$attr->name = $this->resolveClassName($attr->name);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
<?php declare(strict_types=1);
|
|
2
|
+
|
|
3
|
+
namespace PhpParser\NodeVisitor;
|
|
4
|
+
|
|
5
|
+
use PhpParser\Node;
|
|
6
|
+
use PhpParser\NodeVisitorAbstract;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Visitor that connects a child node to its parent node
|
|
10
|
+
* as well as its sibling nodes.
|
|
11
|
+
*
|
|
12
|
+
* With <code>$weakReferences=false</code> on the child node, the parent node can be accessed through
|
|
13
|
+
* <code>$node->getAttribute('parent')</code>, the previous
|
|
14
|
+
* node can be accessed through <code>$node->getAttribute('previous')</code>,
|
|
15
|
+
* and the next node can be accessed through <code>$node->getAttribute('next')</code>.
|
|
16
|
+
*
|
|
17
|
+
* With <code>$weakReferences=true</code> attribute names are prefixed by "weak_", e.g. "weak_parent".
|
|
18
|
+
*/
|
|
19
|
+
final class NodeConnectingVisitor extends NodeVisitorAbstract {
|
|
20
|
+
/**
|
|
21
|
+
* @var Node[]
|
|
22
|
+
*/
|
|
23
|
+
private array $stack = [];
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* @var ?Node
|
|
27
|
+
*/
|
|
28
|
+
private $previous;
|
|
29
|
+
|
|
30
|
+
private bool $weakReferences;
|
|
31
|
+
|
|
32
|
+
public function __construct(bool $weakReferences = false) {
|
|
33
|
+
$this->weakReferences = $weakReferences;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
public function beforeTraverse(array $nodes) {
|
|
37
|
+
$this->stack = [];
|
|
38
|
+
$this->previous = null;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
public function enterNode(Node $node) {
|
|
42
|
+
if (!empty($this->stack)) {
|
|
43
|
+
$parent = $this->stack[count($this->stack) - 1];
|
|
44
|
+
if ($this->weakReferences) {
|
|
45
|
+
$node->setAttribute('weak_parent', \WeakReference::create($parent));
|
|
46
|
+
} else {
|
|
47
|
+
$node->setAttribute('parent', $parent);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if ($this->previous !== null) {
|
|
52
|
+
if (
|
|
53
|
+
$this->weakReferences
|
|
54
|
+
) {
|
|
55
|
+
if ($this->previous->getAttribute('weak_parent') === $node->getAttribute('weak_parent')) {
|
|
56
|
+
$node->setAttribute('weak_previous', \WeakReference::create($this->previous));
|
|
57
|
+
$this->previous->setAttribute('weak_next', \WeakReference::create($node));
|
|
58
|
+
}
|
|
59
|
+
} elseif ($this->previous->getAttribute('parent') === $node->getAttribute('parent')) {
|
|
60
|
+
$node->setAttribute('previous', $this->previous);
|
|
61
|
+
$this->previous->setAttribute('next', $node);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
$this->stack[] = $node;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
public function leaveNode(Node $node) {
|
|
69
|
+
$this->previous = $node;
|
|
70
|
+
|
|
71
|
+
array_pop($this->stack);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
<?php declare(strict_types=1);
|
|
2
|
+
|
|
3
|
+
namespace PhpParser\NodeVisitor;
|
|
4
|
+
|
|
5
|
+
use PhpParser\Node;
|
|
6
|
+
use PhpParser\NodeVisitorAbstract;
|
|
7
|
+
|
|
8
|
+
use function array_pop;
|
|
9
|
+
use function count;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Visitor that connects a child node to its parent node.
|
|
13
|
+
*
|
|
14
|
+
* With <code>$weakReferences=false</code> on the child node, the parent node can be accessed through
|
|
15
|
+
* <code>$node->getAttribute('parent')</code>.
|
|
16
|
+
*
|
|
17
|
+
* With <code>$weakReferences=true</code> the attribute name is "weak_parent" instead.
|
|
18
|
+
*/
|
|
19
|
+
final class ParentConnectingVisitor extends NodeVisitorAbstract {
|
|
20
|
+
/**
|
|
21
|
+
* @var Node[]
|
|
22
|
+
*/
|
|
23
|
+
private array $stack = [];
|
|
24
|
+
|
|
25
|
+
private bool $weakReferences;
|
|
26
|
+
|
|
27
|
+
public function __construct(bool $weakReferences = false) {
|
|
28
|
+
$this->weakReferences = $weakReferences;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
public function beforeTraverse(array $nodes) {
|
|
32
|
+
$this->stack = [];
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
public function enterNode(Node $node) {
|
|
36
|
+
if (!empty($this->stack)) {
|
|
37
|
+
$parent = $this->stack[count($this->stack) - 1];
|
|
38
|
+
if ($this->weakReferences) {
|
|
39
|
+
$node->setAttribute('weak_parent', \WeakReference::create($parent));
|
|
40
|
+
} else {
|
|
41
|
+
$node->setAttribute('parent', $parent);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
$this->stack[] = $node;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
public function leaveNode(Node $node) {
|
|
49
|
+
array_pop($this->stack);
|
|
50
|
+
}
|
|
51
|
+
}
|