Skip to content

Commit fb8b783

Browse files
authored
Fix test-suite regarding indentation
1 parent 6e23241 commit fb8b783

File tree

5 files changed

+23
-57
lines changed

5 files changed

+23
-57
lines changed

bin/simple-downgrade

+1-2
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ foreach ([__DIR__ . '/../../../autoload.php', __DIR__ . '/../vendor/autoload.php
2020
$lexer = new \PhpParser\Lexer\Emulative();
2121

2222
$parser = new Php7($lexer);
23-
$printer = new PhpPrinter();
2423

2524
$phpDocParserConfig = new ParserConfig(['lines' => true, 'indexes' => true]);
2625
$constExprParser = new ConstExprParser($phpDocParserConfig);
@@ -29,6 +28,6 @@ $phpDocParser = new PhpDocParser($phpDocParserConfig, $typeParser, $constExprPar
2928
$phpDocLexer = new PHPStan\PhpDocParser\Lexer\Lexer($phpDocParserConfig);
3029

3130
$app = new Application();
32-
$app->add(new DowngradeCommand($parser, $printer, $phpDocLexer, $phpDocParser));
31+
$app->add(new DowngradeCommand($parser, $phpDocLexer, $phpDocParser));
3332
$app->setCatchExceptions(false);
3433
$app->run();

composer.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"license": ["MIT"],
55
"require": {
66
"php": "^7.4|^8.0",
7-
"nikic/php-parser": "^5.0",
7+
"nikic/php-parser": "^5.3.0",
88
"symfony/console": "^5.4",
99
"nette/utils": "^3.2.5",
1010
"symfony/finder": "^5.4",

src/Console/DowngradeCommand.php

+11-5
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use Exception;
66
use Nette\Utils\Strings;
7+
use PhpParser\Internal\TokenStream;
78
use PhpParser\Node\Stmt;
89
use PhpParser\NodeTraverser;
910
use PhpParser\NodeVisitor;
@@ -14,6 +15,7 @@
1415
use PHPStan\PhpDocParser\Printer\Printer;
1516
use SimpleDowngrader\Php\FollowedByCommaAnalyser;
1617
use SimpleDowngrader\Php\PhpPrinter;
18+
use SimpleDowngrader\Php\PhpPrinterIndentationDetectorVisitor;
1719
use SimpleDowngrader\PhpDoc\PhpDocEditor;
1820
use SimpleDowngrader\Visitor\DowngradeMixedTypeVisitor;
1921
use SimpleDowngrader\Visitor\DowngradeNonCapturingCatchesVisitor;
@@ -47,6 +49,7 @@
4749
use function is_string;
4850
use function preg_quote;
4951
use function sprintf;
52+
use function str_repeat;
5053
use function str_replace;
5154

5255
class DowngradeCommand extends Command
@@ -57,19 +60,16 @@ class DowngradeCommand extends Command
5760

5861
private Parser $parser;
5962

60-
private PhpPrinter $printer;
61-
6263
private Lexer $phpDocLexer;
6364

6465
private PhpDocParser $phpDocParser;
6566

6667
private NodeTraverser $cloningTraverser;
6768

68-
public function __construct(Parser $parser, PhpPrinter $printer, Lexer $phpDocLexer, PhpDocParser $phpDocParser)
69+
public function __construct(Parser $parser, Lexer $phpDocLexer, PhpDocParser $phpDocParser)
6970
{
7071
parent::__construct();
7172
$this->parser = $parser;
72-
$this->printer = $printer;
7373
$this->phpDocLexer = $phpDocLexer;
7474
$this->phpDocParser = $phpDocParser;
7575
$this->cloningTraverser = new NodeTraverser();
@@ -142,6 +142,11 @@ private function processFile(string $file, array $visitors): void
142142
/** @var Stmt[] $newStmts */
143143
$newStmts = $this->cloningTraverser->traverse($oldStmts);
144144

145+
$indentTraverser = new NodeTraverser();
146+
$indentDetector = new PhpPrinterIndentationDetectorVisitor(new TokenStream($oldTokens, PhpPrinter::TAB_WIDTH));
147+
$indentTraverser->addVisitor($indentDetector);
148+
$indentTraverser->traverse($oldStmts);
149+
145150
foreach ($visitors as $visitor) {
146151
$traverser = new NodeTraverser();
147152
$traverser->addVisitor($visitor);
@@ -154,7 +159,8 @@ private function processFile(string $file, array $visitors): void
154159
$newStmts = $traverser->traverse($newStmts);
155160
}
156161

157-
$newCode = $this->printer->printFormatPreserving($newStmts, $oldStmts, $oldTokens);
162+
$printer = new PhpPrinter(['indent' => str_repeat($indentDetector->indentCharacter, $indentDetector->indentSize)]);
163+
$newCode = $printer->printFormatPreserving($newStmts, $oldStmts, $oldTokens);
158164
$result = file_put_contents($file, $newCode);
159165
if ($result === false) {
160166
throw new Exception(sprintf('%s could not be written', $file));

src/Php/PhpPrinter.php

+1-48
Original file line numberDiff line numberDiff line change
@@ -3,63 +3,16 @@
33
namespace SimpleDowngrader\Php;
44

55
use PhpParser\Node;
6-
use PhpParser\NodeTraverser;
76
use PhpParser\PrettyPrinter\Standard;
87
use function count;
98
use function rtrim;
10-
use function str_repeat;
119

1210
class PhpPrinter extends Standard
1311
{
1412

13+
public const TAB_WIDTH = 4;
1514
public const FUNC_ARGS_TRAILING_COMMA_ATTRIBUTE = 'trailing_comma';
1615

17-
private string $indentCharacter = ' ';
18-
19-
private int $indentSize = 4;
20-
21-
protected function resetState(): void
22-
{
23-
parent::resetState();
24-
$this->indentCharacter = ' ';
25-
$this->indentSize = 4;
26-
}
27-
28-
protected function preprocessNodes(array $nodes): void
29-
{
30-
parent::preprocessNodes($nodes);
31-
if ($this->origTokens === null) {
32-
return;
33-
}
34-
35-
$traverser = new NodeTraverser();
36-
37-
$visitor = new PhpPrinterIndentationDetectorVisitor($this->origTokens);
38-
$traverser->addVisitor($visitor);
39-
$traverser->traverse($nodes);
40-
41-
$this->indentCharacter = $visitor->indentCharacter;
42-
$this->indentSize = $visitor->indentSize;
43-
}
44-
45-
protected function setIndentLevel(int $level): void
46-
{
47-
$this->indentLevel = $level;
48-
$this->nl = "\n" . str_repeat($this->indentCharacter, $level);
49-
}
50-
51-
protected function indent(): void
52-
{
53-
$this->indentLevel += $this->indentSize;
54-
$this->nl = "\n" . str_repeat($this->indentCharacter, $this->indentLevel);
55-
}
56-
57-
protected function outdent(): void
58-
{
59-
$this->indentLevel -= $this->indentSize;
60-
$this->nl = "\n" . str_repeat($this->indentCharacter, $this->indentLevel);
61-
}
62-
6316
/**
6417
* @param Node[] $nodes
6518
*/

tests/Visitor/AbstractVisitorTestCase.php

+9-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace SimpleDowngrader\Visitor;
44

5+
use PhpParser\Internal\TokenStream;
56
use PhpParser\Lexer\Emulative;
67
use PhpParser\Node\Stmt;
78
use PhpParser\NodeTraverser;
@@ -16,7 +17,9 @@
1617
use PHPStan\PhpDocParser\Printer\Printer;
1718
use PHPUnit\Framework\TestCase;
1819
use SimpleDowngrader\Php\PhpPrinter;
20+
use SimpleDowngrader\Php\PhpPrinterIndentationDetectorVisitor;
1921
use SimpleDowngrader\PhpDoc\PhpDocEditor;
22+
use function str_repeat;
2023

2124
abstract class AbstractVisitorTestCase extends TestCase
2225
{
@@ -38,6 +41,11 @@ public function testVisitor(string $codeBefore, string $codeAfter): void
3841
$oldStmts = $parser->parse($codeBefore);
3942
$oldTokens = $parser->getTokens();
4043

44+
$indentTraverser = new NodeTraverser();
45+
$indentDetector = new PhpPrinterIndentationDetectorVisitor(new TokenStream($oldTokens, PhpPrinter::TAB_WIDTH));
46+
$indentTraverser->addVisitor($indentDetector);
47+
$indentTraverser->traverse($oldStmts);
48+
4149
$cloningTraverser = new NodeTraverser();
4250
$cloningTraverser->addVisitor(new CloningVisitor());
4351

@@ -54,7 +62,7 @@ public function testVisitor(string $codeBefore, string $codeAfter): void
5462
/** @var Stmt[] $newStmts */
5563
$newStmts = $traverser->traverse($newStmts);
5664

57-
$printer = new PhpPrinter();
65+
$printer = new PhpPrinter(['indent' => str_repeat($indentDetector->indentCharacter, $indentDetector->indentSize)]);
5866
$newCode = $printer->printFormatPreserving($newStmts, $oldStmts, $oldTokens);
5967

6068
$this->assertSame($codeAfter, $newCode);

0 commit comments

Comments
 (0)