-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathgenerate.php
57 lines (45 loc) · 1.74 KB
/
generate.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
<?php
require_once __DIR__ . "/vendor/autoload.php";
use Symfony\Component\Finder\Finder;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Filesystem\Exception\IOExceptionInterface;
use PhpParser\Parser;
use PhpParser\NodeTraverser;
use PhpParser\Lexer;
use PhpParser\NodeVisitor;
use Ivory\JsonBuilder;
$builder = new JsonBuilder\JsonBuilder();
$finder = new Finder();
$fs = new Filesystem();
$sourcePath = $argv[1];
$targetPath = $argv[2];
$finder->files()->in($sourcePath)
->name('*.php');
$start = time();
foreach ($finder as $file) {
$hintVisitor = new PhpCodeHints\HintVisitor();
$parser = new Parser(new PhpParser\Lexer);
$traverser = new NodeTraverser();
$traverser->addVisitor(new NodeVisitor\NameResolver);
$traverser->addVisitor($hintVisitor);
$code = $file->getContents();
try {
$stmts = $parser->parse($code);
$stmts = $traverser->traverse($stmts);
$jsonContent = "";
$builder->setJsonEncodeOptions(JSON_PRETTY_PRINT);
$builder->setValues($hintVisitor->fileStmts);
$jsonContent = $builder->build();
if (!$fs->exists($targetPath.$file->getRelativePath())) {
echo "created directory: ".$targetPath.$file->getRelativePath()."\n";
$fs->mkdir($targetPath.$file->getRelativePath());
}
$outputFilename = $targetPath.$file->getRelativePath()."/".$file->getBasename('.php').'.json';
file_put_contents($outputFilename, $jsonContent);
echo "wrote file: ".$outputFilename."\n";
$builder->reset();
} catch (PhpParser\Error $e) {
echo 'Parse Error: ', $e->getMessage();
}
}
echo "\nGenerated json hint files in: " . (time() - $start) . "secs\n";