-
Notifications
You must be signed in to change notification settings - Fork 3
/
dump.php
92 lines (84 loc) · 2.97 KB
/
dump.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
<?php declare(strict_types=1);
/**
* The MIT License (MIT)
*
* Copyright (c) 2017 Tyson Andre
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
* @phan-file-suppress PhanMissingRequireFile one or the other exists
*/
if (file_exists(__DIR__ . "/../../../vendor/autoload.php")) {
require __DIR__ . "/../../../vendor/autoload.php";
} else {
require __DIR__ . "/vendor/autoload.php";
}
use Microsoft\PhpParser\Parser;
use TolerantASTConverter\NodeDumper;
dump_main();
/**
* Dumps a snippet provided on stdin.
* @throws Exception
*/
function dump_main() : void {
error_reporting(E_ALL);
global $argv;
if (count($argv) !== 2) {
$help = <<<"EOB"
Usage: {$argv[0]} 'snippet'
E.g.
{$argv[0]} '2+2;'
{$argv[0]} '<?php function test() {}'
EOB;
echo $help;
exit(1);
}
$expr = $argv[1];
// Guess if this is a snippet or file contents
if (($expr[0] ?? '') !== '<') {
$expr = '<' . '?php ' . $expr;
}
dump_expr($expr);
}
/** Dumps the ast of the expression to stdout. */
function dump_expr_as_ast(string $expr) : void {
require_once __DIR__ . '/src/util.php';
$ast_data = (new \TolerantASTConverter\TolerantASTConverter())->parseCodeAsPHPAST($expr, 50);
echo ast_dump($ast_data, AST_DUMP_LINENOS);
}
/**
* Dumps the tolerant-php-parser AST to stdout
* @throws Exception
*/
function dump_expr(string $expr) : void {
// Instantiate new parser instance
$parser = new Parser();
// Return and print an AST from string contents
$ast_node = $parser->parseSourceFile($expr);
foreach ($ast_node->getDescendantNodes() as $descendant) {
// echo "unsetting " . get_class($descendant) . $descendant->getStart() . "\n";
$descendant->parent = null;
}
$ast_node->parent = null;
unset($ast_node->statementList[0]);
$dumper = new NodeDumper($expr);
$dumper->setIncludeTokenKind(true);
$dumper->dumpTree($ast_node);
echo "\n";
// var_export($ast_node->statementList);
}