diff --git a/config/set/code-quality/code-quality.yaml b/config/set/code-quality/code-quality.yaml index 1f4d8d0c520..cdc644bd338 100644 --- a/config/set/code-quality/code-quality.yaml +++ b/config/set/code-quality/code-quality.yaml @@ -47,3 +47,4 @@ services: Rector\CodeQuality\Rector\FuncCall\ArrayMergeOfNonArraysToSimpleArrayRector: ~ Rector\CodeQuality\Rector\FuncCall\IntvalToTypeCastRector: ~ Rector\CodeQuality\Rector\Ternary\ArrayKeyExistsTernaryThenValueToCoalescingRector: ~ + Rector\CodeQuality\Rector\Include_\AbsolutizeRequireAndIncludePathRector: ~ diff --git a/packages/CodeQuality/src/Rector/Include_/AbsolutizeRequireAndIncludePathRector.php b/packages/CodeQuality/src/Rector/Include_/AbsolutizeRequireAndIncludePathRector.php new file mode 100644 index 00000000000..fa4a5c890c7 --- /dev/null +++ b/packages/CodeQuality/src/Rector/Include_/AbsolutizeRequireAndIncludePathRector.php @@ -0,0 +1,92 @@ +expr instanceof String_) { + return null; + } + + /** @var string $includeValue */ + $includeValue = $this->getValue($node->expr); + + // skip phar + if (Strings::startsWith($includeValue, 'phar://')) { + return null; + } + + // add preslash to string + if (! Strings::startsWith($includeValue, '/')) { + // keep dots + if (! Strings::startsWith($includeValue, '.')) { + $node->expr->value = '/' . $includeValue; + } + } + + $node->expr = new Concat(new Node\Scalar\MagicConst\Dir(), $node->expr); + + return $node; + } +} diff --git a/packages/CodeQuality/tests/Rector/Include_/AbsolutizeRequireAndIncludePathRector/AbsolutizeRequireAndIncludePathRectorTest.php b/packages/CodeQuality/tests/Rector/Include_/AbsolutizeRequireAndIncludePathRector/AbsolutizeRequireAndIncludePathRectorTest.php new file mode 100644 index 00000000000..4fdd1e36309 --- /dev/null +++ b/packages/CodeQuality/tests/Rector/Include_/AbsolutizeRequireAndIncludePathRector/AbsolutizeRequireAndIncludePathRectorTest.php @@ -0,0 +1,30 @@ +doTestFile($file); + } + + public function provideDataForTest(): Iterator + { + return $this->yieldFilesFromDirectory(__DIR__ . '/Fixture'); + } + + protected function getRectorClass(): string + { + return AbsolutizeRequireAndIncludePathRector::class; + } +} diff --git a/packages/CodeQuality/tests/Rector/Include_/AbsolutizeRequireAndIncludePathRector/Fixture/dots.php.inc b/packages/CodeQuality/tests/Rector/Include_/AbsolutizeRequireAndIncludePathRector/Fixture/dots.php.inc new file mode 100644 index 00000000000..4d6eebfa841 --- /dev/null +++ b/packages/CodeQuality/tests/Rector/Include_/AbsolutizeRequireAndIncludePathRector/Fixture/dots.php.inc @@ -0,0 +1,27 @@ + +----- + diff --git a/packages/CodeQuality/tests/Rector/Include_/AbsolutizeRequireAndIncludePathRector/Fixture/fixture.php.inc b/packages/CodeQuality/tests/Rector/Include_/AbsolutizeRequireAndIncludePathRector/Fixture/fixture.php.inc new file mode 100644 index 00000000000..dc2ec8fea86 --- /dev/null +++ b/packages/CodeQuality/tests/Rector/Include_/AbsolutizeRequireAndIncludePathRector/Fixture/fixture.php.inc @@ -0,0 +1,31 @@ + +----- + diff --git a/packages/CodeQuality/tests/Rector/Include_/AbsolutizeRequireAndIncludePathRector/Fixture/vendor_phar.php.inc b/packages/CodeQuality/tests/Rector/Include_/AbsolutizeRequireAndIncludePathRector/Fixture/vendor_phar.php.inc new file mode 100644 index 00000000000..df03e8a98b6 --- /dev/null +++ b/packages/CodeQuality/tests/Rector/Include_/AbsolutizeRequireAndIncludePathRector/Fixture/vendor_phar.php.inc @@ -0,0 +1,35 @@ + +----- +