From d641f308daadfb814431aa6834b02d4a7ec7392b Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 11:39:56 +0200 Subject: [PATCH 001/256] feat: Add Drupal11 directory scaffold and SetList stub Creates src/Drupal11/Rector/Deprecation/ and tests/src/Drupal11/Rector/Deprecation/ directory structure for incoming Drupal 11 deprecation rules. Adds stub Drupal11SetList.php following the established Drupal10SetList pattern. --- src/Drupal11/Rector/Deprecation/.gitkeep | 0 src/Set/Drupal11SetList.php | 10 ++++++++++ tests/src/Drupal11/Rector/Deprecation/.gitkeep | 0 3 files changed, 10 insertions(+) create mode 100644 src/Drupal11/Rector/Deprecation/.gitkeep create mode 100644 src/Set/Drupal11SetList.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/.gitkeep diff --git a/src/Drupal11/Rector/Deprecation/.gitkeep b/src/Drupal11/Rector/Deprecation/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/src/Set/Drupal11SetList.php b/src/Set/Drupal11SetList.php new file mode 100644 index 000000000..a0b041a6f --- /dev/null +++ b/src/Set/Drupal11SetList.php @@ -0,0 +1,10 @@ + Date: Thu, 30 Apr 2026 11:41:17 +0200 Subject: [PATCH 002/256] docs: Add drupal-digest to drupal-rector pattern mapping reference Captures the structural differences between drupal-digests AI-generated rules and drupal-rector conventions: namespace, base class selection, BC wrapping decision tree, fixture format, test config patterns, and multi-node-type handling. --- docs/digest-to-rector-mapping.md | 404 +++++++++++++++++++++++++++++++ 1 file changed, 404 insertions(+) create mode 100644 docs/digest-to-rector-mapping.md diff --git a/docs/digest-to-rector-mapping.md b/docs/digest-to-rector-mapping.md new file mode 100644 index 000000000..564f7ce8b --- /dev/null +++ b/docs/digest-to-rector-mapping.md @@ -0,0 +1,404 @@ +# Pattern Mapping: drupal-digests → drupal-rector + +This document maps the structural differences between AI-generated rules from the +[drupal-digests](https://github.com/dbuytaert/drupal-digests) repository and the conventions +expected in drupal-rector. Use this as a reference when converting a digests rule. + +--- + +## 1. Side-by-side comparison + +### drupal-digests rule (source) + +```php + 'Below', + 'FORM_SEPARATE_PAGE' => 'SeparatePage', + ]; + + public function getRuleDefinition(): RuleDefinition { ... } + public function getNodeTypes(): array { ... } + public function refactor(Node $node): ?Node { ... } +} +``` + +### drupal-rector equivalent (target) + +```php += 10.1.0? + YES → Use AbstractDrupalCoreRector + DrupalIntroducedVersionConfiguration + (BC wrapping fires automatically) + NO → Use AbstractRector (no BC wrapping available for old Drupal versions) + NO → Use AbstractRector (e.g. FuncCall input but ClassConstFetch output) + + NO → Use AbstractRector + Examples: ClassConstFetch, Class_, return types, property declarations +``` + +### Quick reference + +| Input node | Output node | Introduced | Base class | BC wrapping | +|---|---|---|---|---| +| `FuncCall` | `StaticCall` | >= 10.1.0 | `AbstractDrupalCoreRector` | Yes | +| `FuncCall` | `MethodCall` | >= 10.1.0 | `AbstractDrupalCoreRector` | Yes | +| `FuncCall` | `StaticCall` | < 10.1.0 | `AbstractRector` | No | +| `ClassConstFetch` | `ClassConstFetch` | any | `AbstractRector` | No | +| `New_` (arg modification) | `New_` | any | `AbstractRector` | No | +| `Class_` (structural) | `Class_` | any | `AbstractRector` | No | + +--- + +## 3. BC wrapping — how it works + +When using `AbstractDrupalCoreRector`, the base class `refactor()` method automatically wraps +`CallLike → CallLike` transformations in `DeprecationHelper::backwardsCompatibleCall()`, allowing +the generated code to run on both old and new Drupal versions simultaneously. + +### What you write + +```php +// Your rule class extends AbstractDrupalCoreRector +// You implement refactorWithConfiguration() instead of refactor() + +public function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration) +{ + if (!$node instanceof Node\Expr\FuncCall || $this->getName($node) !== 'some_deprecated_function') { + return null; + } + // Return the NEW call — the base class wraps it automatically + return $this->nodeFactory->createStaticCall('SomeClass', 'newMethod', $node->getArgs()); +} +``` + +### What Rector emits in the target code + +```php +// Before (in the fixture) +some_deprecated_function($arg); + +// After (with BC wrapping, for >= 10.1.0 deprecations) +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall( + \Drupal::VERSION, + '11.1.0', + static fn() => \SomeClass::newMethod($arg), + static fn() => some_deprecated_function($arg) +); +``` + +### AbstractDrupalCoreRector rule structure + +```php +class MyDeprecationRector extends AbstractDrupalCoreRector +{ + /** @var DrupalIntroducedVersionConfiguration[] */ + protected array $configuration; + + public function configure(array $configuration): void + { + foreach ($configuration as $value) { + if (!$value instanceof DrupalIntroducedVersionConfiguration) { + throw new \InvalidArgumentException(sprintf( + 'Each configuration item must be an instance of "%s"', + DrupalIntroducedVersionConfiguration::class + )); + } + } + parent::configure($configuration); + } + + public function getNodeTypes(): array + { + return [Node\Expr\FuncCall::class]; + } + + public function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration) + { + if (!$node instanceof Node\Expr\FuncCall || $this->getName($node) !== 'the_old_function') { + return null; + } + // Return the replacement node — base class adds BC wrapping + return $this->nodeFactory->createStaticCall('NewClass', 'newMethod', $node->getArgs()); + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition('Description of what this fixes', [ + new ConfiguredCodeSample( + 'the_old_function($arg);', + '\NewClass::newMethod($arg);', + [new DrupalIntroducedVersionConfiguration('11.1.0')] + ), + ]); + } +} +``` + +--- + +## 4. Fixture file format + +Test fixtures live at: +``` +tests/src/Drupal11/Rector/Deprecation/[RuleName]/fixture/basic.php.inc +``` + +### Format + +``` + +----- + +``` + +### Worked example (FormLocationRector) + +``` + +----- + +``` + +**Notes:** +- The `-----` separator must be on its own line with no trailing spaces. +- Use statements that are no longer needed after transformation should be removed in the "after" section. +- The `` tags are required (this is how `AbstractRectorTestCase` parses the sections). +- For BC-wrapped rules, the "after" section shows the `DeprecationHelper::backwardsCompatibleCall()` call. + +--- + +## 5. Namespace and file placement + +All Drupal 11 deprecation rules go into: +- **Rule class:** `src/Drupal11/Rector/Deprecation/[RuleName]Rector.php` +- **Namespace:** `DrupalRector\Drupal11\Rector\Deprecation` + +### Class name derivation from digests filename + +The drupal-digests filename format is: +``` +[action-verb]-[description]-[issue-number].php +``` + +Steps to derive the class name: +1. Strip the issue number suffix (e.g., `-3550054`). +2. Convert the remaining kebab-case to PascalCase: `replace-deprecated-commentiteminterface-form-below-and-form` → `ReplaceDeprecatedCommentiteminterfaceFormBelowAndForm` +3. Check if the digests rule already has a simpler class name (it often does — the class name inside the file is more descriptive than the filename). **Always use the class name from the file, not the filename.** +4. Append `Rector` if not already present. + +**Examples:** +- File: `replace-deprecated-commentiteminterface-form-below-and-form-3550054.php` +- Class inside file: `FormLocationRector` +- drupal-rector class: `FormLocationRector` ✓ (already has Rector suffix) + +- File: `add-componentpluginmanager-to-themeinstaller-constructor-3522505.php` +- Class inside file: `AddComponentPluginManagerToThemeInstallerRector` +- drupal-rector class: `AddComponentPluginManagerToThemeInstallerRector` ✓ + +### Version mapping + +All drupal-digests rules currently target Drupal 11.x deprecations. The issue markdown +(`issues/drupal-core/[issue-number].md`) states the exact version under the `## Impact` section: +``` +- **Deprecation:** ... deprecated in drupal:11.4.0, removed in drupal:13.0.0 ... +``` + +Use this to: +- Confirm the namespace (`Drupal11`). +- Extract the `introducedVersion` string for `DrupalIntroducedVersionConfiguration` (e.g., `'11.4.0'`). + +--- + +## 6. Test config patterns + +### Simple rule (no configuration, uses AbstractRector) + +```php +// tests/src/Drupal11/Rector/Deprecation/FormLocationRector/config/configured_rule.php +doTestFile($filePath); + } + + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} +``` + +--- + +## 8. Multi-node-type rules + +Some drupal-digests rules handle two or more distinct node types in a single class +(e.g., both `ClassConstFetch` and `FuncCall`). When converting: + +- **If both transformations are simple (no BC):** Keep them in one class, use `AbstractRector`. + Both node types are listed in `getNodeTypes()` and handled by type-checking inside `refactor()`. +- **If one transformation needs BC and the other doesn't:** Split into two separate rector classes. + This is necessary because `AbstractDrupalCoreRector::refactor()` assumes all transformations + use the same BC configuration. + +--- + +## 9. AddCommentService + +Some drupal-rector rules add a comment to the output code to prompt human review. When to use it: + +- The transformation is not fully automatic (e.g., requires developer judgment to complete). +- The digests rule itself contains a `// TODO` or review note in the transformed code. +- The output might need manual adjustment depending on context. + +When NOT to use it (the common case): +- The transformation is deterministic (one-to-one constant/function replacement). + +If used: +```php +// In the rule constructor +public function __construct(private readonly AddCommentService $commentService) {} + +// In refactor() +$this->commentService->addDrupalRectorComment($node, 'Please verify this change manually.'); +``` + +And in the test config: +```php +DeprecationBase::addClass(MyRector::class, $rectorConfig, true); // true = addNoticeConfig +``` From 4c2f6aa3246b44af2fcd09f4ff68c3b63ee37b7b Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 11:42:36 +0200 Subject: [PATCH 003/256] docs: Add drupal-digest to drupal-rector conversion prompt Reusable 14-step AI prompt that converts any drupal-digests rector rule into a fully drupal-rector-compliant implementation: namespaced rule class, test class, fixture file, and test config. Includes BC decision tree, class templates for both AbstractRector and AbstractDrupalCoreRector patterns, and a verification checklist. --- docs/digest-to-rector-prompt.md | 446 ++++++++++++++++++++++++++++++++ 1 file changed, 446 insertions(+) create mode 100644 docs/digest-to-rector-prompt.md diff --git a/docs/digest-to-rector-prompt.md b/docs/digest-to-rector-prompt.md new file mode 100644 index 000000000..73cd00153 --- /dev/null +++ b/docs/digest-to-rector-prompt.md @@ -0,0 +1,446 @@ +# Conversion Prompt: drupal-digests → drupal-rector + +This is a structured prompt for converting a single +[drupal-digests](https://github.com/dbuytaert/drupal-digests) rector rule into a +fully drupal-rector–compliant implementation with tests. + +**Usage:** Start a Claude Code session in the drupal-rector repository, then say: + +> Convert the drupal-digests rule at `[path-to-rule-file]` following the prompt in +> `docs/digest-to-rector-prompt.md`. + +The agent will read both this document and the target rule, then produce all output files. + +**Reference:** See `docs/digest-to-rector-mapping.md` for the full pattern mapping this prompt +is based on. + +--- + +## Prerequisites + +The following directories must exist (created by the scaffold in U1): +- `src/Drupal11/Rector/Deprecation/` +- `tests/src/Drupal11/Rector/Deprecation/` + +If they are missing, run: `mkdir -p src/Drupal11/Rector/Deprecation tests/src/Drupal11/Rector/Deprecation` + +--- + +## Step 1 — Confirm input + +You will be given a path to a drupal-digests rule file. Confirm the file exists and read it +completely. The file is typically at: +``` +[path-to-drupal-digests-repo]/rector/rules/[rule-filename].php +``` + +Extract from the file: +- **Class name** — the PHP class name (e.g., `FormLocationRector`) +- **Node types** — the array returned by `getNodeTypes()` (e.g., `[ClassConstFetch::class]`) +- **Refactor logic** — the full body of `refactor()` (or `refactorWithConfiguration()` if present) +- **CodeSample before** — the first string argument to `CodeSample` or `ConfiguredCodeSample` +- **CodeSample after** — the second string argument to `CodeSample` or `ConfiguredCodeSample` +- **Issue number** — the number from the filename or from the comment `// Source: https://www.drupal.org/node/[number]` + +--- + +## Step 2 — Read the companion issue markdown + +The issue markdown is at: +``` +[path-to-drupal-digests-repo]/issues/drupal-core/[issue-number].md +``` + +Read it completely. Extract: +- **Introduced version** — from the `## Impact` section, e.g.: + `deprecated in drupal:11.4.0` → `'11.4.0'` +- **Removal version** — e.g., `removed in drupal:13.0.0` → `'13.0.0'` +- **New API FQCN** — the fully-qualified class name of the replacement API, from `## Upgrade` or `## Technical details` +- **Description** — one-sentence summary of what this rule does + +If any of these are missing or ambiguous, proceed to Step 3. Otherwise skip Step 3. + +--- + +## Step 3 — Optional: fetch from Drupal.org (only if Step 2 was insufficient) + +If the introduced version, removal version, or replacement FQCN is not clear from the markdown: + +Fetch the Drupal.org issue page: +``` +https://www.drupal.org/node/[issue-number] +``` + +Look for the change record linked from the issue. Change records typically contain the exact +`deprecated in drupal:X.Y.Z` wording and code examples. + +--- + +## Step 4 — Classify the rule (BC decision) + +Answer these questions using the information gathered: + +**Q1: What node types does the rule process?** +- List each type from `getNodeTypes()`. + +**Q2: Is there a CallLike → CallLike transformation?** +- Old node is CallLike if: `FuncCall`, `MethodCall`, `StaticCall`. +- New node (what `refactor()` returns) is CallLike if: `StaticCall`, `MethodCall`, `FuncCall`. +- If both are CallLike → BC wrapping is **eligible**. +- If either is NOT CallLike (e.g., `ClassConstFetch`, `New_`, `Class_`) → BC wrapping is **not applicable**. + +**Q3: Was the deprecation introduced in Drupal >= 10.1.0?** +- Compare the introduced version from Step 2 against `10.1.0`. +- If introduced version >= `10.1.0` AND Q2 is eligible → BC wrapping **applies**. +- Otherwise → BC wrapping does **not** apply. + +**Decision:** +- BC wrapping applies → Use `AbstractDrupalCoreRector` + `DrupalIntroducedVersionConfiguration` +- BC wrapping does not apply → Use `AbstractRector` + +--- + +## Step 5 — Derive the class name and file paths + +**Class name:** +- Use the class name from the digests rule file (not the filename). +- The class name typically already ends in `Rector`. If not, append it. + +**drupal-rector file paths (all relative to the drupal-rector repo root):** +``` +src/Drupal11/Rector/Deprecation/[ClassName].php +tests/src/Drupal11/Rector/Deprecation/[ClassName]/[ClassName]Test.php +tests/src/Drupal11/Rector/Deprecation/[ClassName]/config/configured_rule.php +tests/src/Drupal11/Rector/Deprecation/[ClassName]/fixture/basic.php.inc +``` + +--- + +## Step 6 — Generate the rule class + +Write `src/Drupal11/Rector/Deprecation/[ClassName].php`. + +### Template A: Simple rule (AbstractRector, no BC) + +Use when Step 4 concluded: BC wrapping does NOT apply. + +```php +> */ + public function getNodeTypes(): array + { + return [/* [node types from Step 1] */]; + } + + /** @param [NodeType] $node */ + public function refactor(Node $node): ?Node + { + // [copy refactor() body from the digests rule unchanged] + } +} +``` + +### Template B: BC-capable rule (AbstractDrupalCoreRector) + +Use when Step 4 concluded: BC wrapping APPLIES. + +```php +> */ + public function getNodeTypes(): array + { + return [/* [node types from Step 1] */]; + } + + public function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration) + { + // [copy refactor() body from the digests rule — the base class handles BC wrapping automatically] + // Important: return the NEW call node. Do NOT call parent::refactor() or handle BC here. + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition( + '[description from Step 2]', + [ + new ConfiguredCodeSample( + <<<'CODE_BEFORE' +[CodeSample before string from Step 1] +CODE_BEFORE, + <<<'CODE_AFTER' +[CodeSample after string from Step 1] +CODE_AFTER, + [new DrupalIntroducedVersionConfiguration('[introduced version from Step 2]')] + ), + ] + ); + } +} +``` + +**Adaptation notes:** +- Remove `final` keyword — drupal-rector classes are not final. +- Remove `use Rector\Config\RectorConfig` from the rule class (it belongs only in config files). +- Keep all private constants, arrays, and helper methods unchanged. +- For multi-node-type rules (two or more different node types in `getNodeTypes()`), check if any + combination requires BC. If only some transformations need BC and others don't, split into two + separate rector classes. See `docs/digest-to-rector-mapping.md` section 8. + +--- + +## Step 7 — Generate the fixture file + +Write `tests/src/Drupal11/Rector/Deprecation/[ClassName]/fixture/basic.php.inc`. + +Format: +``` + +----- + +``` + +**Rules:** +- The `-----` separator must be on its own line with no surrounding whitespace. +- Remove `use` statements from the "after" section if the new code uses FQCNs (backslash-prefixed). +- For BC-wrapped rules: the "after" section should show the `DeprecationHelper::backwardsCompatibleCall()` output. +- If the CodeSample before/after strings are not full PHP files, wrap them appropriately (add ``). +- Add realistic surrounding context if the snippet is very minimal (e.g., wrap a bare expression in a function body). + +--- + +## Step 8 — Generate the test class + +Write `tests/src/Drupal11/Rector/Deprecation/[ClassName]/[ClassName]Test.php`. + +```php +doTestFile($filePath); + } + + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} +``` + +--- + +## Step 9 — Generate the test config + +Write `tests/src/Drupal11/Rector/Deprecation/[ClassName]/config/configured_rule.php`. + +### For simple rules (AbstractRector, no BC) + +```php + Date: Thu, 30 Apr 2026 11:49:43 +0200 Subject: [PATCH 004/256] feat(Drupal11): Add FormLocationRector and LanguageModuleFunctionDeprecationsRector MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Validates the conversion workflow on two real drupal-digests rules: - FormLocationRector (issue #3550054): ClassConstFetch replacement, no BC wrapping, replaces deprecated CommentItemInterface constants with FormLocation enum cases. - LanguageModuleFunctionDeprecationsRector (issue #3574727): FuncCall → StaticCall/MethodCall, BC-wrapped via AbstractDrupalCoreRector, replaces deprecated language.module functions with OOP equivalents. Updates Drupal stub VERSION from 10.99.x-dev to 11.99.x-dev so Drupal11 rules fire in tests. All 95 tests pass (93 existing + 2 new). --- docs/digest-to-rector-mapping.md | 19 ++++ docs/digest-to-rector-prompt.md | 5 ++ .../Rector/Deprecation/FormLocationRector.php | 75 ++++++++++++++++ ...nguageModuleFunctionDeprecationsRector.php | 90 +++++++++++++++++++ stubs/Drupal/Drupal.php | 2 +- .../FormLocationRectorTest.php | 30 +++++++ .../config/configured_rule.php | 11 +++ .../FormLocationRector/fixture/basic.php.inc | 15 ++++ ...geModuleFunctionDeprecationsRectorTest.php | 30 +++++++ .../config/configured_rule.php | 14 +++ .../fixture/basic.php.inc | 15 ++++ 11 files changed, 305 insertions(+), 1 deletion(-) create mode 100644 src/Drupal11/Rector/Deprecation/FormLocationRector.php create mode 100644 src/Drupal11/Rector/Deprecation/LanguageModuleFunctionDeprecationsRector.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/FormLocationRector/FormLocationRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/FormLocationRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/FormLocationRector/fixture/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/LanguageModuleFunctionDeprecationsRector/LanguageModuleFunctionDeprecationsRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/LanguageModuleFunctionDeprecationsRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/LanguageModuleFunctionDeprecationsRector/fixture/basic.php.inc diff --git a/docs/digest-to-rector-mapping.md b/docs/digest-to-rector-mapping.md index 564f7ce8b..a9aba1f1d 100644 --- a/docs/digest-to-rector-mapping.md +++ b/docs/digest-to-rector-mapping.md @@ -402,3 +402,22 @@ And in the test config: ```php DeprecationBase::addClass(MyRector::class, $rectorConfig, true); // true = addNoticeConfig ``` + +--- + +## 10. Test environment: Drupal VERSION stub + +The stub at `stubs/Drupal/Drupal.php` provides the `\Drupal::VERSION` constant used by +`AbstractDrupalCoreRector::rectorShouldApplyToDrupalVersion()`. The stub must be set to a version +**at least as high as the highest introduced version** among the rules being tested. + +| Scenario | Required stub VERSION | +|---|---| +| Only Drupal 8/9/10 rules | `10.99.x-dev` (original default) | +| Drupal 11.x rules | `11.99.x-dev` | + +The stub has been updated to `11.99.x-dev`. This value is safe for all existing Drupal 8/9/10 +tests — the BC logic only requires `installedVersion >= 10.1.0`, which `11.99.0` satisfies. + +**Do not change the stub back to `10.99.x-dev`** — doing so will silently disable all Drupal11 +rules in the test suite (their `refactor()` won't fire, tests pass trivially). diff --git a/docs/digest-to-rector-prompt.md b/docs/digest-to-rector-prompt.md index 73cd00153..dc8033fa1 100644 --- a/docs/digest-to-rector-prompt.md +++ b/docs/digest-to-rector-prompt.md @@ -24,6 +24,11 @@ The following directories must exist (created by the scaffold in U1): If they are missing, run: `mkdir -p src/Drupal11/Rector/Deprecation tests/src/Drupal11/Rector/Deprecation` +**Stub version:** The test stub at `stubs/Drupal/Drupal.php` must have a `VERSION` of `11.99.x-dev` +(or any version >= the deprecation's introduced version). If it is at `10.99.x-dev` the Drupal11 +rules will never fire in tests because the version check in `AbstractDrupalCoreRector` fails. +The stub has already been updated to `11.99.x-dev` — do not revert it. + --- ## Step 1 — Confirm input diff --git a/src/Drupal11/Rector/Deprecation/FormLocationRector.php b/src/Drupal11/Rector/Deprecation/FormLocationRector.php new file mode 100644 index 000000000..edaed2dff --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/FormLocationRector.php @@ -0,0 +1,75 @@ + 'Below', + 'FORM_SEPARATE_PAGE' => 'SeparatePage', + ]; + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition( + 'Replace deprecated CommentItemInterface::FORM_BELOW and FORM_SEPARATE_PAGE constants with FormLocation enum cases.', + [ + new CodeSample( + <<<'CODE_BEFORE' +use Drupal\comment\Plugin\Field\FieldType\CommentItemInterface; + +$location = CommentItemInterface::FORM_BELOW; +$other = CommentItemInterface::FORM_SEPARATE_PAGE; +CODE_BEFORE, + <<<'CODE_AFTER' +$location = \Drupal\comment\FormLocation::Below; +$other = \Drupal\comment\FormLocation::SeparatePage; +CODE_AFTER + ), + ] + ); + } + + /** @return array> */ + public function getNodeTypes(): array + { + return [ClassConstFetch::class]; + } + + /** @param ClassConstFetch $node */ + public function refactor(Node $node): ?Node + { + if (!$node->name instanceof Identifier) { + return null; + } + + $constName = $node->name->toString(); + if (!array_key_exists($constName, self::MAP)) { + return null; + } + + if (!$this->isName($node->class, 'Drupal\\comment\\Plugin\\Field\\FieldType\\CommentItemInterface')) { + return null; + } + + $enumCase = self::MAP[$constName]; + + return new ClassConstFetch( + new FullyQualified('Drupal\\comment\\FormLocation'), + new Identifier($enumCase) + ); + } +} diff --git a/src/Drupal11/Rector/Deprecation/LanguageModuleFunctionDeprecationsRector.php b/src/Drupal11/Rector/Deprecation/LanguageModuleFunctionDeprecationsRector.php new file mode 100644 index 000000000..b8f95aa44 --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/LanguageModuleFunctionDeprecationsRector.php @@ -0,0 +1,90 @@ +> */ + public function getNodeTypes(): array + { + return [FuncCall::class]; + } + + public function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration) + { + if (!$node instanceof FuncCall) { + return null; + } + + if ($this->isName($node, 'language_configuration_element_submit')) { + return $this->nodeFactory->createStaticCall( + 'Drupal\language\Element\LanguageConfiguration', + 'submit', + $node->args + ); + } + + if ($this->isName($node, 'language_process_language_select')) { + $serviceCall = $this->nodeFactory->createStaticCall('Drupal', 'service', [ + $this->nodeFactory->createClassConstReference('Drupal\language\Hook\LanguageHooks'), + ]); + + return $this->nodeFactory->createMethodCall($serviceCall, 'processLanguageSelect', $node->args); + } + + return null; + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition( + 'Replace deprecated language module procedural functions with their OOP replacements', + [ + new ConfiguredCodeSample( + <<<'CODE_BEFORE' +language_configuration_element_submit($form, $form_state); +CODE_BEFORE, + <<<'CODE_AFTER' +\Drupal\language\Element\LanguageConfiguration::submit($form, $form_state); +CODE_AFTER, + [new DrupalIntroducedVersionConfiguration('11.4.0')] + ), + new ConfiguredCodeSample( + <<<'CODE_BEFORE' +language_process_language_select($element); +CODE_BEFORE, + <<<'CODE_AFTER' +\Drupal::service(\Drupal\language\Hook\LanguageHooks::class)->processLanguageSelect($element); +CODE_AFTER, + [new DrupalIntroducedVersionConfiguration('11.4.0')] + ), + ] + ); + } +} diff --git a/stubs/Drupal/Drupal.php b/stubs/Drupal/Drupal.php index 558338c4d..cba68d976 100644 --- a/stubs/Drupal/Drupal.php +++ b/stubs/Drupal/Drupal.php @@ -5,5 +5,5 @@ } class Drupal { - const VERSION = '10.99.x-dev'; + const VERSION = '11.99.x-dev'; } diff --git a/tests/src/Drupal11/Rector/Deprecation/FormLocationRector/FormLocationRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/FormLocationRector/FormLocationRectorTest.php new file mode 100644 index 000000000..8d91fe795 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/FormLocationRector/FormLocationRectorTest.php @@ -0,0 +1,30 @@ +doTestFile($filePath); + } + + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/FormLocationRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/FormLocationRector/config/configured_rule.php new file mode 100644 index 000000000..931669ef3 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/FormLocationRector/config/configured_rule.php @@ -0,0 +1,11 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/LanguageModuleFunctionDeprecationsRector/LanguageModuleFunctionDeprecationsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/LanguageModuleFunctionDeprecationsRector/LanguageModuleFunctionDeprecationsRectorTest.php new file mode 100644 index 000000000..ba0778e35 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/LanguageModuleFunctionDeprecationsRector/LanguageModuleFunctionDeprecationsRectorTest.php @@ -0,0 +1,30 @@ +doTestFile($filePath); + } + + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/LanguageModuleFunctionDeprecationsRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/LanguageModuleFunctionDeprecationsRector/config/configured_rule.php new file mode 100644 index 000000000..df4eb942f --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/LanguageModuleFunctionDeprecationsRector/config/configured_rule.php @@ -0,0 +1,14 @@ + +----- + \Drupal\language\Element\LanguageConfiguration::submit($form, $form_state), fn() => language_configuration_element_submit($form, $form_state)); + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service(\Drupal\language\Hook\LanguageHooks::class)->processLanguageSelect($element), fn() => language_process_language_select($element)); +} +?> From eab1143bf903a82d45fbad090640e81d957b57fd Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 12:21:26 +0200 Subject: [PATCH 005/256] feat: Add Drupal 11.4 deprecation rules via generic configurable rectors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Implements Drupal 11.4.0 deprecation fixes using existing data-driven rectors rather than custom classes, following the pattern established by Drupal 8/9/10: - CommentItemInterface::FORM_BELOW/FORM_SEPARATE_PAGE → Drupal\comment\FormLocation (ClassConstantToClassConstantRector, no BC wrap — ClassConstFetch is not CallLike) - language_configuration_element_submit → LanguageConfiguration::submit (FunctionToStaticRector, BC-wrapped for 11.4.0) - language_process_language_select → \Drupal::service('…')->processLanguageSelect() (FunctionToServiceRector, BC-wrapped for 11.4.0) Also scaffolds src/Drupal11/ and tests/src/Drupal11/ directories and adds Drupal11SetList stub, plus digest-to-rector conversion prompt and mapping docs. Bumps Drupal VERSION stub to 11.99.x-dev so Drupal11 rules fire in tests. --- config/drupal-11/drupal-11.4-deprecations.php | 55 +++++++++ docs/digest-to-rector-mapping.md | 110 ++++++++++++++++-- docs/digest-to-rector-prompt.md | 70 +++++++++-- .../Rector/Deprecation/FormLocationRector.php | 75 ------------ ...nguageModuleFunctionDeprecationsRector.php | 90 -------------- src/Set/Drupal11SetList.php | 1 + .../FormLocationRectorTest.php | 30 ----- .../config/configured_rule.php | 11 -- ...geModuleFunctionDeprecationsRectorTest.php | 30 ----- .../config/configured_rule.php | 14 --- .../fixture/basic.php.inc | 15 --- .../config/configured_rule.php | 13 +++ .../fixture/comment_form_location.php.inc} | 0 .../config/configured_rule.php | 2 + .../language_process_language_select.php.inc | 13 +++ .../config/configured_rule.php | 2 + ...guage_configuration_element_submit.php.inc | 13 +++ 17 files changed, 263 insertions(+), 281 deletions(-) create mode 100644 config/drupal-11/drupal-11.4-deprecations.php delete mode 100644 src/Drupal11/Rector/Deprecation/FormLocationRector.php delete mode 100644 src/Drupal11/Rector/Deprecation/LanguageModuleFunctionDeprecationsRector.php delete mode 100644 tests/src/Drupal11/Rector/Deprecation/FormLocationRector/FormLocationRectorTest.php delete mode 100644 tests/src/Drupal11/Rector/Deprecation/FormLocationRector/config/configured_rule.php delete mode 100644 tests/src/Drupal11/Rector/Deprecation/LanguageModuleFunctionDeprecationsRector/LanguageModuleFunctionDeprecationsRectorTest.php delete mode 100644 tests/src/Drupal11/Rector/Deprecation/LanguageModuleFunctionDeprecationsRector/config/configured_rule.php delete mode 100644 tests/src/Drupal11/Rector/Deprecation/LanguageModuleFunctionDeprecationsRector/fixture/basic.php.inc rename tests/src/{Drupal11/Rector/Deprecation/FormLocationRector/fixture/basic.php.inc => Rector/Deprecation/ClassConstantToClassConstantRector/fixture/comment_form_location.php.inc} (100%) create mode 100644 tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/language_process_language_select.php.inc create mode 100644 tests/src/Rector/Deprecation/FunctionToStaticRector/fixture/language_configuration_element_submit.php.inc diff --git a/config/drupal-11/drupal-11.4-deprecations.php b/config/drupal-11/drupal-11.4-deprecations.php new file mode 100644 index 000000000..1ddc8e590 --- /dev/null +++ b/config/drupal-11/drupal-11.4-deprecations.php @@ -0,0 +1,55 @@ +ruleWithConfiguration(ClassConstantToClassConstantRector::class, [ + new ClassConstantToClassConstantConfiguration( + 'Drupal\comment\Plugin\Field\FieldType\CommentItemInterface', + 'FORM_BELOW', + 'Drupal\comment\FormLocation', + 'Below', + ), + new ClassConstantToClassConstantConfiguration( + 'Drupal\comment\Plugin\Field\FieldType\CommentItemInterface', + 'FORM_SEPARATE_PAGE', + 'Drupal\comment\FormLocation', + 'SeparatePage', + ), + ]); + + // https://www.drupal.org/node/3574727 + // language_configuration_element_submit() deprecated in 11.4.0, removed in 13.0.0. + // Replaced by LanguageConfiguration::submit(). + $rectorConfig->ruleWithConfiguration(FunctionToStaticRector::class, [ + new FunctionToStaticConfiguration( + '11.4.0', + 'language_configuration_element_submit', + 'Drupal\language\Element\LanguageConfiguration', + 'submit' + ), + ]); + + // https://www.drupal.org/node/3574727 + // language_process_language_select() deprecated in 11.4.0, removed in 12.0.0. + // Replaced by LanguageHooks::processLanguageSelect() via the service container. + $rectorConfig->ruleWithConfiguration(FunctionToServiceRector::class, [ + new FunctionToServiceConfiguration( + '11.4.0', + 'language_process_language_select', + 'Drupal\language\Hook\LanguageHooks', + 'processLanguageSelect' + ), + ]); +}; diff --git a/docs/digest-to-rector-mapping.md b/docs/digest-to-rector-mapping.md index a9aba1f1d..f8183f566 100644 --- a/docs/digest-to-rector-mapping.md +++ b/docs/digest-to-rector-mapping.md @@ -107,7 +107,101 @@ Does the rule transform a node type that is CallLike? --- -## 3. BC wrapping — how it works +## 3. Generic/configurable rectors — check these before writing a custom class + +drupal-rector ships several data-driven rectors in `src/Rector/Deprecation/` that handle common +deprecation patterns with zero custom PHP. **Always check whether one of these covers the +transformation before writing a new class.** + +### Available generic rectors + +#### `FunctionToStaticRector` — deprecated global function → static class call + +Config object: `FunctionToStaticConfiguration(introducedVersion, deprecatedFunctionName, className, methodName, [argReorder])` + +- Transforms `some_function($a, $b)` → `\ClassName::methodName($a, $b)` +- Uses `AbstractDrupalCoreRector` → BC-wrapped automatically for `introducedVersion >= 10.1.0` +- Optional `argReorder` map swaps argument positions: `[0 => 1, 1 => 0]` reverses two args + +```php +new FunctionToStaticConfiguration('11.4.0', 'language_configuration_element_submit', 'Drupal\language\Element\LanguageConfiguration', 'submit'), +``` + +Fixture output (BC-wrapped): +```php +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal\language\Element\LanguageConfiguration::submit($form, $form_state), fn() => language_configuration_element_submit($form, $form_state)); +``` + +#### `FunctionToServiceRector` — deprecated global function → service method call + +Config object: `FunctionToServiceConfiguration(introducedVersion, deprecatedFunctionName, serviceName, serviceMethodName)` + +- Transforms `some_function($a)` → `\Drupal::service('service.name')->method($a)` +- Uses `AbstractDrupalCoreRector` → BC-wrapped automatically for `introducedVersion >= 10.1.0` +- **`serviceName` is a string literal** (e.g., `'theme.registry'`), not a class constant +- If the service is a class-based service (e.g., `\Drupal\language\Hook\LanguageHooks`), pass the FQCN as a string + +```php +new FunctionToServiceConfiguration('11.4.0', 'language_process_language_select', 'Drupal\language\Hook\LanguageHooks', 'processLanguageSelect'), +``` + +Fixture output (BC-wrapped): +```php +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('Drupal\language\Hook\LanguageHooks')->processLanguageSelect($element), fn() => language_process_language_select($element)); +``` + +#### `ClassConstantToClassConstantRector` — deprecated class constant → new class constant + +Config object: `ClassConstantToClassConstantConfiguration(deprecatedClass, deprecatedConstant, newClass, newConstant)` + +- Transforms `OldClass::OLD_CONST` → `\NewClass::NewConst` +- Uses `AbstractRector` → **no BC wrapping** (ClassConstFetch is not a CallLike node) +- No `introducedVersion` parameter — applies unconditionally + +```php +new ClassConstantToClassConstantConfiguration('Drupal\comment\Plugin\Field\FieldType\CommentItemInterface', 'FORM_BELOW', 'Drupal\comment\FormLocation', 'Below'), +``` + +Fixture output (no BC wrapping): +```php +$location = \Drupal\comment\FormLocation::Below; +``` + +### Where to add generic rector configurations + +New configurations for existing generic rectors go into the appropriate versioned config file under `config/drupal-11/`: + +```php +// config/drupal-11/drupal-11.4-deprecations.php +$rectorConfig->ruleWithConfiguration(ClassConstantToClassConstantRector::class, [ + new ClassConstantToClassConstantConfiguration(...), +]); +$rectorConfig->ruleWithConfiguration(FunctionToStaticRector::class, [ + new FunctionToStaticConfiguration('11.4.0', ...), +]); +$rectorConfig->ruleWithConfiguration(FunctionToServiceRector::class, [ + new FunctionToServiceConfiguration('11.4.0', ...), +]); +``` + +Test coverage for generic rectors lives in `tests/src/Rector/Deprecation/[RectorName]/` — add a +new fixture file and a config entry there rather than creating a new test directory. + +### Decision: generic rector vs custom class + +| Pattern | Generic rector available? | +|---|---| +| Global function → static class method | `FunctionToStaticRector` ✓ | +| Global function → `\Drupal::service(…)->method()` | `FunctionToServiceRector` ✓ | +| Class constant → different class constant | `ClassConstantToClassConstantRector` ✓ | +| Function with complex arg transformation | Custom class | +| Constructor arg injection / `__construct` changes | Custom class | +| Multiple node types with different base classes | Custom classes (split by type) | +| Return type / property declaration changes | Custom class | + +--- + +## 4. BC wrapping — how it works When using `AbstractDrupalCoreRector`, the base class `refactor()` method automatically wraps `CallLike → CallLike` transformations in `DeprecationHelper::backwardsCompatibleCall()`, allowing @@ -194,7 +288,7 @@ class MyDeprecationRector extends AbstractDrupalCoreRector --- -## 4. Fixture file format +## 5. Fixture file format Test fixtures live at: ``` @@ -241,7 +335,7 @@ $other = \Drupal\comment\FormLocation::SeparatePage; --- -## 5. Namespace and file placement +## 6. Namespace and file placement All Drupal 11 deprecation rules go into: - **Rule class:** `src/Drupal11/Rector/Deprecation/[RuleName]Rector.php` @@ -283,7 +377,7 @@ Use this to: --- -## 6. Test config patterns +## 7. Test config patterns ### Simple rule (no configuration, uses AbstractRector) @@ -328,7 +422,7 @@ return static function (RectorConfig $rectorConfig): void { --- -## 7. Test class template +## 8. Test class template ```php // tests/src/Drupal11/Rector/Deprecation/[RuleName]/[RuleName]Test.php @@ -365,7 +459,7 @@ class [RuleName]Test extends AbstractRectorTestCase --- -## 8. Multi-node-type rules +## 9. Multi-node-type rules Some drupal-digests rules handle two or more distinct node types in a single class (e.g., both `ClassConstFetch` and `FuncCall`). When converting: @@ -378,7 +472,7 @@ Some drupal-digests rules handle two or more distinct node types in a single cla --- -## 9. AddCommentService +## 10. AddCommentService Some drupal-rector rules add a comment to the output code to prompt human review. When to use it: @@ -405,7 +499,7 @@ DeprecationBase::addClass(MyRector::class, $rectorConfig, true); // true = addN --- -## 10. Test environment: Drupal VERSION stub +## 11. Test environment: Drupal VERSION stub The stub at `stubs/Drupal/Drupal.php` provides the `\Drupal::VERSION` constant used by `AbstractDrupalCoreRector::rectorShouldApplyToDrupalVersion()`. The stub must be set to a version diff --git a/docs/digest-to-rector-prompt.md b/docs/digest-to-rector-prompt.md index dc8033fa1..0ae010418 100644 --- a/docs/digest-to-rector-prompt.md +++ b/docs/digest-to-rector-prompt.md @@ -105,6 +105,59 @@ Answer these questions using the information gathered: --- +## Step 4b — Check for existing generic rectors (BEFORE writing a custom class) + +Before generating a new PHP class, check whether the transformation can be expressed as a +configuration entry for an existing generic rector in `src/Rector/Deprecation/`. This is the +preferred path — it avoids creating new classes for patterns that drupal-rector already handles. + +**Check the decision table:** + +| Transformation pattern | Generic rector to use | +|---|---| +| Global function → static class method | `FunctionToStaticRector` | +| Global function → `\Drupal::service('…')->method()` | `FunctionToServiceRector` | +| Class constant → different class constant | `ClassConstantToClassConstantRector` | +| Anything else | Write a custom class (continue to Step 5) | + +**If a generic rector matches, do this instead of Steps 5–10:** + +1. Add the configuration entry to `config/drupal-11/drupal-11.4-deprecations.php` (or the + appropriate versioned file), inside the matching `$rectorConfig->ruleWithConfiguration()` block. + +2. Add a fixture file to the existing generic rector's test directory: + `tests/src/Rector/Deprecation/[GenericRectorName]/fixture/[descriptive-name].php.inc` + +3. Add the configuration entry to the generic rector's test config: + `tests/src/Rector/Deprecation/[GenericRectorName]/config/configured_rule.php` + +4. Run the existing test suite: + ```bash + vendor/bin/phpunit tests/src/Rector/Deprecation/[GenericRectorName]/ + ``` + +5. Skip to Step 11 (fix-style) then Step 12 (phpstan) then Step 13 (test) then Step 14 (commit). + +**Configuration entry syntax by generic rector:** + +```php +// FunctionToStaticRector +new FunctionToStaticConfiguration('[introducedVersion]', '[deprecatedFunctionName]', '[ClassName]', '[methodName]'), +// optional 5th arg: arg reorder map, e.g. [0 => 1, 1 => 0] to swap first two args + +// FunctionToServiceRector +new FunctionToServiceConfiguration('[introducedVersion]', '[deprecatedFunctionName]', '[ServiceName]', '[serviceMethodName]'), +// ServiceName is a string literal: 'theme.registry' or 'Drupal\module\Hook\SomeHooks' + +// ClassConstantToClassConstantRector +new ClassConstantToClassConstantConfiguration('[OldClass\\FQCN]', '[OLD_CONST]', '[NewClass\\FQCN]', '[NewConst]'), +// no introducedVersion — applies unconditionally; no BC wrapping +``` + +**If no generic rector matches, continue to Step 5 to generate a custom class.** + +--- + ## Step 5 — Derive the class name and file paths **Class name:** @@ -439,13 +492,14 @@ Do not push — leave pushing to the human reviewer. Before marking a conversion complete, verify: -- [ ] `declare(strict_types=1)` is present in the rule class -- [ ] Namespace is `DrupalRector\Drupal11\Rector\Deprecation` -- [ ] `final` keyword is removed -- [ ] `use Rector\Config\RectorConfig` is NOT in the rule class -- [ ] Base class matches the BC decision from Step 4 -- [ ] `getNodeTypes()` lists all node types from the original rule +- [ ] Step 4b was checked — a generic rector was used if the pattern matched, custom class only if it didn't +- [ ] (Custom class only) `declare(strict_types=1)` is present in the rule class +- [ ] (Custom class only) Namespace is `DrupalRector\Drupal11\Rector\Deprecation` +- [ ] (Custom class only) `final` keyword is removed +- [ ] (Custom class only) `use Rector\Config\RectorConfig` is NOT in the rule class +- [ ] (Custom class only) Base class matches the BC decision from Step 4 +- [ ] (Custom class only) `getNodeTypes()` lists all node types from the original rule - [ ] Fixture `-----` separator is on its own line -- [ ] `vendor/bin/phpunit` passes for this rule's test directory +- [ ] `vendor/bin/phpunit` passes for the relevant test directory - [ ] `ddev composer fix-style` has been run -- [ ] `ddev composer phpstan` reports no errors for the new file +- [ ] `ddev composer phpstan` reports no errors for new/modified files diff --git a/src/Drupal11/Rector/Deprecation/FormLocationRector.php b/src/Drupal11/Rector/Deprecation/FormLocationRector.php deleted file mode 100644 index edaed2dff..000000000 --- a/src/Drupal11/Rector/Deprecation/FormLocationRector.php +++ /dev/null @@ -1,75 +0,0 @@ - 'Below', - 'FORM_SEPARATE_PAGE' => 'SeparatePage', - ]; - - public function getRuleDefinition(): RuleDefinition - { - return new RuleDefinition( - 'Replace deprecated CommentItemInterface::FORM_BELOW and FORM_SEPARATE_PAGE constants with FormLocation enum cases.', - [ - new CodeSample( - <<<'CODE_BEFORE' -use Drupal\comment\Plugin\Field\FieldType\CommentItemInterface; - -$location = CommentItemInterface::FORM_BELOW; -$other = CommentItemInterface::FORM_SEPARATE_PAGE; -CODE_BEFORE, - <<<'CODE_AFTER' -$location = \Drupal\comment\FormLocation::Below; -$other = \Drupal\comment\FormLocation::SeparatePage; -CODE_AFTER - ), - ] - ); - } - - /** @return array> */ - public function getNodeTypes(): array - { - return [ClassConstFetch::class]; - } - - /** @param ClassConstFetch $node */ - public function refactor(Node $node): ?Node - { - if (!$node->name instanceof Identifier) { - return null; - } - - $constName = $node->name->toString(); - if (!array_key_exists($constName, self::MAP)) { - return null; - } - - if (!$this->isName($node->class, 'Drupal\\comment\\Plugin\\Field\\FieldType\\CommentItemInterface')) { - return null; - } - - $enumCase = self::MAP[$constName]; - - return new ClassConstFetch( - new FullyQualified('Drupal\\comment\\FormLocation'), - new Identifier($enumCase) - ); - } -} diff --git a/src/Drupal11/Rector/Deprecation/LanguageModuleFunctionDeprecationsRector.php b/src/Drupal11/Rector/Deprecation/LanguageModuleFunctionDeprecationsRector.php deleted file mode 100644 index b8f95aa44..000000000 --- a/src/Drupal11/Rector/Deprecation/LanguageModuleFunctionDeprecationsRector.php +++ /dev/null @@ -1,90 +0,0 @@ -> */ - public function getNodeTypes(): array - { - return [FuncCall::class]; - } - - public function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration) - { - if (!$node instanceof FuncCall) { - return null; - } - - if ($this->isName($node, 'language_configuration_element_submit')) { - return $this->nodeFactory->createStaticCall( - 'Drupal\language\Element\LanguageConfiguration', - 'submit', - $node->args - ); - } - - if ($this->isName($node, 'language_process_language_select')) { - $serviceCall = $this->nodeFactory->createStaticCall('Drupal', 'service', [ - $this->nodeFactory->createClassConstReference('Drupal\language\Hook\LanguageHooks'), - ]); - - return $this->nodeFactory->createMethodCall($serviceCall, 'processLanguageSelect', $node->args); - } - - return null; - } - - public function getRuleDefinition(): RuleDefinition - { - return new RuleDefinition( - 'Replace deprecated language module procedural functions with their OOP replacements', - [ - new ConfiguredCodeSample( - <<<'CODE_BEFORE' -language_configuration_element_submit($form, $form_state); -CODE_BEFORE, - <<<'CODE_AFTER' -\Drupal\language\Element\LanguageConfiguration::submit($form, $form_state); -CODE_AFTER, - [new DrupalIntroducedVersionConfiguration('11.4.0')] - ), - new ConfiguredCodeSample( - <<<'CODE_BEFORE' -language_process_language_select($element); -CODE_BEFORE, - <<<'CODE_AFTER' -\Drupal::service(\Drupal\language\Hook\LanguageHooks::class)->processLanguageSelect($element); -CODE_AFTER, - [new DrupalIntroducedVersionConfiguration('11.4.0')] - ), - ] - ); - } -} diff --git a/src/Set/Drupal11SetList.php b/src/Set/Drupal11SetList.php index a0b041a6f..c868745da 100644 --- a/src/Set/Drupal11SetList.php +++ b/src/Set/Drupal11SetList.php @@ -7,4 +7,5 @@ final class Drupal11SetList { public const DRUPAL_11 = __DIR__.'/../../config/drupal-11/drupal-11-all-deprecations.php'; + public const DRUPAL_114 = __DIR__.'/../../config/drupal-11/drupal-11.4-deprecations.php'; } diff --git a/tests/src/Drupal11/Rector/Deprecation/FormLocationRector/FormLocationRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/FormLocationRector/FormLocationRectorTest.php deleted file mode 100644 index 8d91fe795..000000000 --- a/tests/src/Drupal11/Rector/Deprecation/FormLocationRector/FormLocationRectorTest.php +++ /dev/null @@ -1,30 +0,0 @@ -doTestFile($filePath); - } - - public static function provideData(): \Iterator - { - return self::yieldFilesFromDirectory(__DIR__.'/fixture'); - } - - public function provideConfigFilePath(): string - { - return __DIR__.'/config/configured_rule.php'; - } -} diff --git a/tests/src/Drupal11/Rector/Deprecation/FormLocationRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/FormLocationRector/config/configured_rule.php deleted file mode 100644 index 931669ef3..000000000 --- a/tests/src/Drupal11/Rector/Deprecation/FormLocationRector/config/configured_rule.php +++ /dev/null @@ -1,11 +0,0 @@ -doTestFile($filePath); - } - - public static function provideData(): \Iterator - { - return self::yieldFilesFromDirectory(__DIR__.'/fixture'); - } - - public function provideConfigFilePath(): string - { - return __DIR__.'/config/configured_rule.php'; - } -} diff --git a/tests/src/Drupal11/Rector/Deprecation/LanguageModuleFunctionDeprecationsRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/LanguageModuleFunctionDeprecationsRector/config/configured_rule.php deleted file mode 100644 index df4eb942f..000000000 --- a/tests/src/Drupal11/Rector/Deprecation/LanguageModuleFunctionDeprecationsRector/config/configured_rule.php +++ /dev/null @@ -1,14 +0,0 @@ - ------ - \Drupal\language\Element\LanguageConfiguration::submit($form, $form_state), fn() => language_configuration_element_submit($form, $form_state)); - \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service(\Drupal\language\Hook\LanguageHooks::class)->processLanguageSelect($element), fn() => language_process_language_select($element)); -} -?> diff --git a/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/config/configured_rule.php b/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/config/configured_rule.php index 4d1352cb0..b89c3f456 100644 --- a/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/config/configured_rule.php +++ b/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/config/configured_rule.php @@ -9,6 +9,19 @@ return static function (RectorConfig $rectorConfig): void { DeprecationBase::addClass(ClassConstantToClassConstantRector::class, $rectorConfig, false, [ + // https://www.drupal.org/node/3550054 (Drupal 11.4) + new ClassConstantToClassConstantConfiguration( + 'Drupal\comment\Plugin\Field\FieldType\CommentItemInterface', + 'FORM_BELOW', + 'Drupal\comment\FormLocation', + 'Below', + ), + new ClassConstantToClassConstantConfiguration( + 'Drupal\comment\Plugin\Field\FieldType\CommentItemInterface', + 'FORM_SEPARATE_PAGE', + 'Drupal\comment\FormLocation', + 'SeparatePage', + ), new ClassConstantToClassConstantConfiguration( 'Symfony\Cmf\Component\Routing\RouteObjectInterface', 'ROUTE_NAME', diff --git a/tests/src/Drupal11/Rector/Deprecation/FormLocationRector/fixture/basic.php.inc b/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/fixture/comment_form_location.php.inc similarity index 100% rename from tests/src/Drupal11/Rector/Deprecation/FormLocationRector/fixture/basic.php.inc rename to tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/fixture/comment_form_location.php.inc diff --git a/tests/src/Rector/Deprecation/FunctionToServiceRector/config/configured_rule.php b/tests/src/Rector/Deprecation/FunctionToServiceRector/config/configured_rule.php index 6bfbfe980..e1bdd0eab 100644 --- a/tests/src/Rector/Deprecation/FunctionToServiceRector/config/configured_rule.php +++ b/tests/src/Rector/Deprecation/FunctionToServiceRector/config/configured_rule.php @@ -15,5 +15,7 @@ new FunctionToServiceConfiguration('9.3.0', 'file_save_data', 'file.repository', 'writeData'), new FunctionToServiceConfiguration('10.1.0', 'drupal_theme_rebuild', 'theme.registry', 'reset'), new FunctionToServiceConfiguration('10.2.0', '_drupal_flush_css_js', 'asset.query_string', 'reset'), + // https://www.drupal.org/node/3574727 (Drupal 11.4) + new FunctionToServiceConfiguration('11.4.0', 'language_process_language_select', 'Drupal\language\Hook\LanguageHooks', 'processLanguageSelect'), ]); }; diff --git a/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/language_process_language_select.php.inc b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/language_process_language_select.php.inc new file mode 100644 index 000000000..ae553fcb1 --- /dev/null +++ b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/language_process_language_select.php.inc @@ -0,0 +1,13 @@ + +----- + \Drupal::service('Drupal\language\Hook\LanguageHooks')->processLanguageSelect($element), fn() => language_process_language_select($element)); +} +?> diff --git a/tests/src/Rector/Deprecation/FunctionToStaticRector/config/configured_rule.php b/tests/src/Rector/Deprecation/FunctionToStaticRector/config/configured_rule.php index 5c2cec688..f522ec90a 100644 --- a/tests/src/Rector/Deprecation/FunctionToStaticRector/config/configured_rule.php +++ b/tests/src/Rector/Deprecation/FunctionToStaticRector/config/configured_rule.php @@ -14,5 +14,7 @@ new FunctionToStaticConfiguration('10.2.0', 'format_size', 'Drupal\Core\StringTranslation\ByteSizeMarkup', 'create'), new FunctionToStaticConfiguration('10.3.0', 'file_icon_class', 'Drupal\file\IconMimeTypes', 'getIconClass'), new FunctionToStaticConfiguration('10.3.0', 'file_icon_map', 'Drupal\file\IconMimeTypes', 'getGenericMimeType'), + // https://www.drupal.org/node/3574727 (Drupal 11.4) + new FunctionToStaticConfiguration('11.4.0', 'language_configuration_element_submit', 'Drupal\language\Element\LanguageConfiguration', 'submit'), ]); }; diff --git a/tests/src/Rector/Deprecation/FunctionToStaticRector/fixture/language_configuration_element_submit.php.inc b/tests/src/Rector/Deprecation/FunctionToStaticRector/fixture/language_configuration_element_submit.php.inc new file mode 100644 index 000000000..57094ee03 --- /dev/null +++ b/tests/src/Rector/Deprecation/FunctionToStaticRector/fixture/language_configuration_element_submit.php.inc @@ -0,0 +1,13 @@ + +----- + \Drupal\language\Element\LanguageConfiguration::submit($form, $form_state), fn() => language_configuration_element_submit($form, $form_state)); +} +?> From c048b59f73b2efecc3044c57156f8595a22c578d Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 12:41:41 +0200 Subject: [PATCH 006/256] refactor(tests): Add setVersionOverride() to AbstractDrupalCoreRector for version-specific test scenarios Replaces the broken namespaced-class Drupal hack in BackwardsCompatibilityActionAnnotationToAttributeRectorTest with a proper setUp/tearDown pattern. Updates docs to describe the new mechanism. --- docs/digest-to-rector-mapping.md | 49 ++++++++++++++----- docs/digest-to-rector-prompt.md | 13 +++-- src/Rector/AbstractDrupalCoreRector.php | 9 +++- ...yActionAnnotationToAttributeRectorTest.php | 18 +++++-- 4 files changed, 67 insertions(+), 22 deletions(-) diff --git a/docs/digest-to-rector-mapping.md b/docs/digest-to-rector-mapping.md index f8183f566..89ebae844 100644 --- a/docs/digest-to-rector-mapping.md +++ b/docs/digest-to-rector-mapping.md @@ -499,19 +499,44 @@ DeprecationBase::addClass(MyRector::class, $rectorConfig, true); // true = addN --- -## 11. Test environment: Drupal VERSION stub +## 11. Test environment: Drupal VERSION -The stub at `stubs/Drupal/Drupal.php` provides the `\Drupal::VERSION` constant used by -`AbstractDrupalCoreRector::rectorShouldApplyToDrupalVersion()`. The stub must be set to a version -**at least as high as the highest introduced version** among the rules being tested. +`AbstractDrupalCoreRector::installedDrupalVersion()` determines whether a rule fires. It resolves +the version in this order: -| Scenario | Required stub VERSION | -|---|---| -| Only Drupal 8/9/10 rules | `10.99.x-dev` (original default) | -| Drupal 11.x rules | `11.99.x-dev` | +1. **Static override** — `AbstractDrupalCoreRector::setVersionOverride($version)`, used in tests + that need to simulate a specific Drupal version. +2. **Stub fallback** — `stubs/Drupal/Drupal.php` defines `\Drupal::VERSION = '11.99.x-dev'`, + used by all tests that do not set an override. + +### Standard conversions (happy-path tests) + +For typical digest-to-rector test classes, no version setup is needed. The stub default `11.99.x-dev` +satisfies any `introducedVersion <= 11.x`, so the rule fires and the fixture transformation is verified. + +**Do not change the stub back to `10.99.x-dev`** — doing so will silently disable all Drupal 11 +rules in the test suite. + +### Version-specific tests (positive + negative cases) + +When a test needs to assert that a rule fires on one version but not another, use +`setVersionOverride` in `setUp`/`tearDown`: + +```php +use DrupalRector\Rector\AbstractDrupalCoreRector; + +protected function setUp(): void +{ + parent::setUp(); + AbstractDrupalCoreRector::setVersionOverride('11.0.0'); +} -The stub has been updated to `11.99.x-dev`. This value is safe for all existing Drupal 8/9/10 -tests — the BC logic only requires `installedVersion >= 10.1.0`, which `11.99.0` satisfies. +protected function tearDown(): void +{ + AbstractDrupalCoreRector::setVersionOverride(null); // always reset + parent::tearDown(); +} +``` -**Do not change the stub back to `10.99.x-dev`** — doing so will silently disable all Drupal11 -rules in the test suite (their `refactor()` won't fire, tests pass trivially). +Passing `null` resets to the stub fallback, so the override does not leak between test classes +in the same PHPUnit run. diff --git a/docs/digest-to-rector-prompt.md b/docs/digest-to-rector-prompt.md index 0ae010418..9bd16c824 100644 --- a/docs/digest-to-rector-prompt.md +++ b/docs/digest-to-rector-prompt.md @@ -24,10 +24,15 @@ The following directories must exist (created by the scaffold in U1): If they are missing, run: `mkdir -p src/Drupal11/Rector/Deprecation tests/src/Drupal11/Rector/Deprecation` -**Stub version:** The test stub at `stubs/Drupal/Drupal.php` must have a `VERSION` of `11.99.x-dev` -(or any version >= the deprecation's introduced version). If it is at `10.99.x-dev` the Drupal11 -rules will never fire in tests because the version check in `AbstractDrupalCoreRector` fails. -The stub has already been updated to `11.99.x-dev` — do not revert it. +**Stub version:** The test stub at `stubs/Drupal/Drupal.php` has `VERSION = '11.99.x-dev'`. This +is the default version used by `AbstractDrupalCoreRector::installedDrupalVersion()` for any test +that does not set an explicit override. Do not revert it to `10.99.x-dev` — that would silently +disable all Drupal 11 rules in the test suite. + +For tests that need to simulate a specific Drupal version (e.g., to verify a rule does NOT fire +on an older version), use `AbstractDrupalCoreRector::setVersionOverride($version)` in `setUp()` +and reset it with `setVersionOverride(null)` in `tearDown()`. Standard conversion tests do not +need this — the stub default is sufficient. --- diff --git a/src/Rector/AbstractDrupalCoreRector.php b/src/Rector/AbstractDrupalCoreRector.php index b3d6929ce..240b735ff 100644 --- a/src/Rector/AbstractDrupalCoreRector.php +++ b/src/Rector/AbstractDrupalCoreRector.php @@ -15,6 +15,8 @@ abstract class AbstractDrupalCoreRector extends AbstractRector implements ConfigurableRectorInterface { + private static ?string $versionOverride = null; + /** * @var array|VersionedConfigurationInterface[] */ @@ -124,6 +126,11 @@ public function rectorShouldApplyToDrupalVersion(VersionedConfigurationInterface return version_compare($this->installedDrupalVersion(), $configuration->getIntroducedVersion(), '>='); } + public static function setVersionOverride(?string $version): void + { + self::$versionOverride = $version; + } + /** * @phpstan-return non-empty-string */ @@ -132,7 +139,7 @@ public function installedDrupalVersion(): string return str_replace([ '.x-dev', '-dev', - ], '.0', \Drupal::VERSION); + ], '.0', self::$versionOverride ?? \Drupal::VERSION); } /** diff --git a/tests/src/Drupal10/Rector/Deprecation/ActionAnnotationToAttributeRector/BackwardsCompatibilityActionAnnotationToAttributeRectorTest.php b/tests/src/Drupal10/Rector/Deprecation/ActionAnnotationToAttributeRector/BackwardsCompatibilityActionAnnotationToAttributeRectorTest.php index 194f05a8a..9dca46229 100644 --- a/tests/src/Drupal10/Rector/Deprecation/ActionAnnotationToAttributeRector/BackwardsCompatibilityActionAnnotationToAttributeRectorTest.php +++ b/tests/src/Drupal10/Rector/Deprecation/ActionAnnotationToAttributeRector/BackwardsCompatibilityActionAnnotationToAttributeRectorTest.php @@ -4,16 +4,24 @@ namespace DrupalRector\Tests\Drupal10\Rector\Deprecation\ActionAnnotationToAttributeRector; +use DrupalRector\Rector\AbstractDrupalCoreRector; use Iterator; use Rector\Testing\PHPUnit\AbstractRectorTestCase; -class Drupal -{ - public const VERSION = '11.0.x-dev'; -} - class BackwardsCompatibilityActionAnnotationToAttributeRectorTest extends AbstractRectorTestCase { + protected function setUp(): void + { + parent::setUp(); + AbstractDrupalCoreRector::setVersionOverride('11.0.x-dev'); + } + + protected function tearDown(): void + { + AbstractDrupalCoreRector::setVersionOverride(null); + parent::tearDown(); + } + /** * @covers ::refactor * From 7d4901befa57449e7f0cd0bb192bb2e5100ecb74 Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 13:09:46 +0200 Subject: [PATCH 007/256] doc: update prompt to be more specifc on what node types are supported for BC --- docs/digest-to-rector-prompt.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/digest-to-rector-prompt.md b/docs/digest-to-rector-prompt.md index 9bd16c824..a44ad8ff9 100644 --- a/docs/digest-to-rector-prompt.md +++ b/docs/digest-to-rector-prompt.md @@ -94,10 +94,10 @@ Answer these questions using the information gathered: - List each type from `getNodeTypes()`. **Q2: Is there a CallLike → CallLike transformation?** -- Old node is CallLike if: `FuncCall`, `MethodCall`, `StaticCall`. -- New node (what `refactor()` returns) is CallLike if: `StaticCall`, `MethodCall`, `FuncCall`. +- Old node is CallLike if: `FuncCall`, `MethodCall`, `StaticCall`, `NullsafeMethodCall`, `New_`. +- New node (what `refactor()` returns) is CallLike if: `FuncCall`, `MethodCall`, `StaticCall`, `NullsafeMethodCall`, `New_`. - If both are CallLike → BC wrapping is **eligible**. -- If either is NOT CallLike (e.g., `ClassConstFetch`, `New_`, `Class_`) → BC wrapping is **not applicable**. +- If either is NOT CallLike (e.g., `ClassConstFetch`, `Class_`) → BC wrapping is **not applicable**. **Q3: Was the deprecation introduced in Drupal >= 10.1.0?** - Compare the introduced version from Step 2 against `10.1.0`. From a31bf4332986e033113f9b3509547726c09de992 Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 13:24:43 +0200 Subject: [PATCH 008/256] feat: Extend BC wrapping to all Expr node types in AbstractDrupalCoreRector MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously backwardsCompatibleCall wrapping only applied when both the old and new nodes were CallLike (FuncCall, MethodCall, StaticCall, etc.). The restriction was in AbstractDrupalCoreRector, not in DeprecationHelper itself, which accepts any callable. Broaden the guard to Node\Expr so that non-CallLike transformations such as ClassConstFetch → ClassConstFetch and ClassConstFetch → PropertyFetch also get BC-wrapped when the introduced version supports it. Add a test stub rector (ClassConstFetchBCRector) and fixture to cover the new Expr → Expr path. --- src/Rector/AbstractDrupalCoreRector.php | 7 +- .../AbstractDrupalCoreRectorTest.php | 35 ++++++++ .../Stub/ClassConstFetchBCRector.php | 89 +++++++++++++++++++ .../config/configured_rule.php | 14 +++ .../fixture/class_const_fetch.php.inc | 13 +++ 5 files changed, 154 insertions(+), 4 deletions(-) create mode 100644 tests/src/Rector/AbstractDrupalCoreRector/AbstractDrupalCoreRectorTest.php create mode 100644 tests/src/Rector/AbstractDrupalCoreRector/Stub/ClassConstFetchBCRector.php create mode 100644 tests/src/Rector/AbstractDrupalCoreRector/config/configured_rule.php create mode 100644 tests/src/Rector/AbstractDrupalCoreRector/fixture/class_const_fetch.php.inc diff --git a/src/Rector/AbstractDrupalCoreRector.php b/src/Rector/AbstractDrupalCoreRector.php index 240b735ff..ec57144fb 100644 --- a/src/Rector/AbstractDrupalCoreRector.php +++ b/src/Rector/AbstractDrupalCoreRector.php @@ -86,9 +86,8 @@ public function refactor(Node $node) return $result; } - // Create a backwards compatible call if the node is a call-like expression. - if ($node instanceof Node\Expr\CallLike && $result instanceof Node\Expr\CallLike) { - return $this->createBcCallOnCallLike($node, $result, $configuration->getIntroducedVersion()); + if ($node instanceof Node\Expr && $result instanceof Node\Expr) { + return $this->createBcCallOnExpr($node, $result, $configuration->getIntroducedVersion()); } return $result; @@ -104,7 +103,7 @@ public function refactor(Node $node) */ abstract protected function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration); - private function createBcCallOnCallLike(Node\Expr\CallLike $node, Node\Expr\CallLike $result, string $introducedVersion): Node\Expr\StaticCall + private function createBcCallOnExpr(Node\Expr $node, Node\Expr $result, string $introducedVersion): Node\Expr\StaticCall { $clonedNode = clone $node; diff --git a/tests/src/Rector/AbstractDrupalCoreRector/AbstractDrupalCoreRectorTest.php b/tests/src/Rector/AbstractDrupalCoreRector/AbstractDrupalCoreRectorTest.php new file mode 100644 index 000000000..755d34d2f --- /dev/null +++ b/tests/src/Rector/AbstractDrupalCoreRector/AbstractDrupalCoreRectorTest.php @@ -0,0 +1,35 @@ +doTestFile($filePath); + } + + /** + * @return Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + // must be implemented + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Rector/AbstractDrupalCoreRector/Stub/ClassConstFetchBCRector.php b/tests/src/Rector/AbstractDrupalCoreRector/Stub/ClassConstFetchBCRector.php new file mode 100644 index 000000000..6eadcb151 --- /dev/null +++ b/tests/src/Rector/AbstractDrupalCoreRector/Stub/ClassConstFetchBCRector.php @@ -0,0 +1,89 @@ +class instanceof Node\Name) { + return null; + } + + if ($this->getName($node->class) !== 'OldClass') { + return null; + } + + if (!$node->name instanceof Node\Identifier || $node->name->toString() !== 'OLD_CONST') { + return null; + } + + return new Node\Expr\ClassConstFetch( + new Node\Name\FullyQualified('NewClass'), + new Node\Identifier('NEW_CONST') + ); + } + + /** + * {@inheritdoc} + */ + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition('Test stub: replaces OldClass::OLD_CONST with \\NewClass::NEW_CONST, exercising the Expr BC-wrap path.', [ + new ConfiguredCodeSample( + <<<'CODE_BEFORE' +$value = OldClass::OLD_CONST; +CODE_BEFORE, + <<<'CODE_AFTER' +$value = \NewClass::NEW_CONST; +CODE_AFTER, + [ + new DrupalIntroducedVersionConfiguration('10.1.0'), + ] + ), + ]); + } +} diff --git a/tests/src/Rector/AbstractDrupalCoreRector/config/configured_rule.php b/tests/src/Rector/AbstractDrupalCoreRector/config/configured_rule.php new file mode 100644 index 000000000..11023ec7d --- /dev/null +++ b/tests/src/Rector/AbstractDrupalCoreRector/config/configured_rule.php @@ -0,0 +1,14 @@ + +----- + \NewClass::NEW_CONST, fn() => OldClass::OLD_CONST); +} +?> From b26eb2a1f92c70a378f17a40b3eac48f43a60323 Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 15:01:01 +0200 Subject: [PATCH 009/256] =?UTF-8?q?feat(Drupal10):=20Add=20FileSystemInter?= =?UTF-8?q?face::EXISTS=5F*=20=E2=86=92=20FileExists=20enum=20replacements?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit FileSystemInterface::EXISTS_RENAME, EXISTS_REPLACE, and EXISTS_ERROR were deprecated in drupal:10.3.0 and removed in drupal:12.0.0 (issue #3575575). Replaced by the \Drupal\Core\File\FileExists backed enum. --- .gitignore | 1 + config/drupal-10/drupal-10.3-deprecations.php | 26 +++++++++++++++++++ .../filesystem_exists_constants.php.inc | 21 +++++++++++++++ 3 files changed, 48 insertions(+) create mode 100644 tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/fixture/filesystem_exists_constants.php.inc diff --git a/.gitignore b/.gitignore index d78e97a5d..5039fb3ed 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ !/features/tmp/.placeholder /.phpunit.cache +.worktrees/ diff --git a/config/drupal-10/drupal-10.3-deprecations.php b/config/drupal-10/drupal-10.3-deprecations.php index ad76fea66..0e769e957 100644 --- a/config/drupal-10/drupal-10.3-deprecations.php +++ b/config/drupal-10/drupal-10.3-deprecations.php @@ -2,7 +2,9 @@ declare(strict_types=1); +use DrupalRector\Rector\Deprecation\ClassConstantToClassConstantRector; use DrupalRector\Rector\Deprecation\FunctionToStaticRector; +use DrupalRector\Rector\ValueObject\ClassConstantToClassConstantConfiguration; use DrupalRector\Rector\ValueObject\FunctionToStaticConfiguration; use Rector\Config\RectorConfig; @@ -12,4 +14,28 @@ new FunctionToStaticConfiguration('10.3.0', 'file_icon_class', 'Drupal\file\IconMimeTypes', 'getIconClass'), new FunctionToStaticConfiguration('10.3.0', 'file_icon_map', 'Drupal\file\IconMimeTypes', 'getGenericMimeType'), ]); + + // https://www.drupal.org/node/3575575 + // FileSystemInterface::EXISTS_* deprecated in drupal:10.3.0, removed in drupal:12.0.0. + // Replaced by \Drupal\Core\File\FileExists enum cases. + $rectorConfig->ruleWithConfiguration(ClassConstantToClassConstantRector::class, [ + new ClassConstantToClassConstantConfiguration( + 'Drupal\Core\File\FileSystemInterface', + 'EXISTS_RENAME', + 'Drupal\Core\File\FileExists', + 'Rename', + ), + new ClassConstantToClassConstantConfiguration( + 'Drupal\Core\File\FileSystemInterface', + 'EXISTS_REPLACE', + 'Drupal\Core\File\FileExists', + 'Replace', + ), + new ClassConstantToClassConstantConfiguration( + 'Drupal\Core\File\FileSystemInterface', + 'EXISTS_ERROR', + 'Drupal\Core\File\FileExists', + 'Error', + ), + ]); }; diff --git a/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/fixture/filesystem_exists_constants.php.inc b/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/fixture/filesystem_exists_constants.php.inc new file mode 100644 index 000000000..6da291247 --- /dev/null +++ b/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/fixture/filesystem_exists_constants.php.inc @@ -0,0 +1,21 @@ +copy($src, $dst, FileSystemInterface::EXISTS_RENAME); + $fileSystem->move($src, $dst, FileSystemInterface::EXISTS_REPLACE); + $fileSystem->saveData($data, $dst, FileSystemInterface::EXISTS_ERROR); +} +?> +----- +copy($src, $dst, \Drupal\Core\File\FileExists::Rename); + $fileSystem->move($src, $dst, \Drupal\Core\File\FileExists::Replace); + $fileSystem->saveData($data, $dst, \Drupal\Core\File\FileExists::Error); +} +?> From 8f1cd3bc35b8d9e68305542bc46935d17e359aa2 Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 15:01:07 +0200 Subject: [PATCH 010/256] feat(Drupal11): Add drupal:11.2 deprecation rules MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - template_preprocess_{container,html,page,links,time,datetime_form, datetime_wrapper}() → ThemePreprocess/DatePreprocess service methods (issue #3501136) - SystemManager::REQUIREMENT_{OK,WARNING,ERROR} → RequirementSeverity enum cases (issue #3575841) --- config/drupal-11/drupal-11.2-deprecations.php | 48 +++++++++++++++++++ ...stem_manager_requirement_constants.php.inc | 21 ++++++++ .../template_preprocess_service.php.inc | 25 ++++++++++ 3 files changed, 94 insertions(+) create mode 100644 config/drupal-11/drupal-11.2-deprecations.php create mode 100644 tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/fixture/system_manager_requirement_constants.php.inc create mode 100644 tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/template_preprocess_service.php.inc diff --git a/config/drupal-11/drupal-11.2-deprecations.php b/config/drupal-11/drupal-11.2-deprecations.php new file mode 100644 index 000000000..48297a0aa --- /dev/null +++ b/config/drupal-11/drupal-11.2-deprecations.php @@ -0,0 +1,48 @@ +ruleWithConfiguration(FunctionToServiceRector::class, [ + new FunctionToServiceConfiguration('11.2.0', 'template_preprocess_time', 'Drupal\Core\Datetime\DatePreprocess', 'preprocessTime'), + new FunctionToServiceConfiguration('11.2.0', 'template_preprocess_datetime_form', 'Drupal\Core\Datetime\DatePreprocess', 'preprocessDatetimeForm'), + new FunctionToServiceConfiguration('11.2.0', 'template_preprocess_datetime_wrapper', 'Drupal\Core\Datetime\DatePreprocess', 'preprocessDatetimeWrapper'), + new FunctionToServiceConfiguration('11.2.0', 'template_preprocess_links', 'Drupal\Core\Theme\ThemePreprocess', 'preprocessLinks'), + new FunctionToServiceConfiguration('11.2.0', 'template_preprocess_container', 'Drupal\Core\Theme\ThemePreprocess', 'preprocessContainer'), + new FunctionToServiceConfiguration('11.2.0', 'template_preprocess_html', 'Drupal\Core\Theme\ThemePreprocess', 'preprocessHtml'), + new FunctionToServiceConfiguration('11.2.0', 'template_preprocess_page', 'Drupal\Core\Theme\ThemePreprocess', 'preprocessPage'), + ]); + + // https://www.drupal.org/node/3575841 + // SystemManager::REQUIREMENT_* deprecated in drupal:11.2.0, removed in drupal:12.0.0. + // Replaced by \Drupal\Core\Extension\Requirement\RequirementSeverity enum cases. + $rectorConfig->ruleWithConfiguration(ClassConstantToClassConstantRector::class, [ + new ClassConstantToClassConstantConfiguration( + 'Drupal\system\SystemManager', + 'REQUIREMENT_OK', + 'Drupal\Core\Extension\Requirement\RequirementSeverity', + 'OK', + ), + new ClassConstantToClassConstantConfiguration( + 'Drupal\system\SystemManager', + 'REQUIREMENT_WARNING', + 'Drupal\Core\Extension\Requirement\RequirementSeverity', + 'Warning', + ), + new ClassConstantToClassConstantConfiguration( + 'Drupal\system\SystemManager', + 'REQUIREMENT_ERROR', + 'Drupal\Core\Extension\Requirement\RequirementSeverity', + 'Error', + ), + ]); +}; diff --git a/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/fixture/system_manager_requirement_constants.php.inc b/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/fixture/system_manager_requirement_constants.php.inc new file mode 100644 index 000000000..51c5f784a --- /dev/null +++ b/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/fixture/system_manager_requirement_constants.php.inc @@ -0,0 +1,21 @@ + +----- + diff --git a/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/template_preprocess_service.php.inc b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/template_preprocess_service.php.inc new file mode 100644 index 000000000..e4a3db4cf --- /dev/null +++ b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/template_preprocess_service.php.inc @@ -0,0 +1,25 @@ + +----- + \Drupal::service('Drupal\Core\Theme\ThemePreprocess')->preprocessContainer($variables), fn() => template_preprocess_container($variables)); + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => \Drupal::service('Drupal\Core\Theme\ThemePreprocess')->preprocessLinks($variables), fn() => template_preprocess_links($variables)); + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => \Drupal::service('Drupal\Core\Theme\ThemePreprocess')->preprocessHtml($variables), fn() => template_preprocess_html($variables)); + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => \Drupal::service('Drupal\Core\Theme\ThemePreprocess')->preprocessPage($variables), fn() => template_preprocess_page($variables)); + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => \Drupal::service('Drupal\Core\Datetime\DatePreprocess')->preprocessTime($variables), fn() => template_preprocess_time($variables)); + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => \Drupal::service('Drupal\Core\Datetime\DatePreprocess')->preprocessDatetimeForm($variables), fn() => template_preprocess_datetime_form($variables)); + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => \Drupal::service('Drupal\Core\Datetime\DatePreprocess')->preprocessDatetimeWrapper($variables), fn() => template_preprocess_datetime_wrapper($variables)); +} +?> From fd4c909a26827dde3845c014285dec8219aafca6 Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 15:01:12 +0200 Subject: [PATCH 011/256] feat(Drupal11): Add drupal:11.3 deprecation rule for node_mass_update node_mass_update() was deprecated in drupal:11.3.0 and removed in drupal:13.0.0 (issue #3571623). Replaced by NodeBulkUpdate::process() via the service container. --- config/drupal-11/drupal-11.3-deprecations.php | 16 ++++++++++++++++ .../fixture/node_mass_update.php.inc | 13 +++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 config/drupal-11/drupal-11.3-deprecations.php create mode 100644 tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/node_mass_update.php.inc diff --git a/config/drupal-11/drupal-11.3-deprecations.php b/config/drupal-11/drupal-11.3-deprecations.php new file mode 100644 index 000000000..79230dbc8 --- /dev/null +++ b/config/drupal-11/drupal-11.3-deprecations.php @@ -0,0 +1,16 @@ +ruleWithConfiguration(FunctionToServiceRector::class, [ + new FunctionToServiceConfiguration('11.3.0', 'node_mass_update', 'Drupal\node\NodeBulkUpdate', 'process'), + ]); +}; diff --git a/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/node_mass_update.php.inc b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/node_mass_update.php.inc new file mode 100644 index 000000000..5d19b40cd --- /dev/null +++ b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/node_mass_update.php.inc @@ -0,0 +1,13 @@ + +----- + \Drupal::service('Drupal\node\NodeBulkUpdate')->process($nids, $updates, $langcode, true, false), fn() => node_mass_update($nids, $updates, $langcode, true, false)); +} +?> From 15e5d7062126bac14c5f64c62cc0e5c7f35134ad Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 15:01:31 +0200 Subject: [PATCH 012/256] feat(Drupal11): Add drupal:11.4 deprecation rules via generic configurable rectors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit FunctionToServiceRector (29 functions across 9 modules, issue numbers below): - ckeditor5_filter_format_edit_form_submit, _update_ckeditor5_html_filter → Ckeditor5Hooks service (#3566792) - _dblog_get_message_types, dblog_filters → DbLogFilters service (#3560398) - contact_user_profile_form_submit, contact_form_user_admin_settings_submit → ContactFormHooks service (#3566888) - 6× content_translation_* → content_translation.manager / ContentTranslationEnableTranslationPerBundle / ContentTranslationHooks (#3548571) - locale_translation_batch_update_build, _batch_fetch_build → LocaleFetch (#3572339) - 7× locale_translation_* → locale.project / LocaleSource (#3569328) - 6× menu_ui_* → MenuUiUtility / MenuUiHooks (#3571400) - text_summary → TextSummary::generate (#3568387) - user_form_process_password_confirm → UserThemeHooks (#3582106) FunctionToStaticRector (4 functions): - views_ui_form_button_was_clicked → ViewsFormHelperTrait::formButtonWasClicked - views_ui_add_limited_validation, _add_ajax_wrapper, _nojs_submit → ViewsFormAjaxHelperTrait (#3035340) ClassConstantToClassConstantRector (6 constants): - CommentItemInterface::HIDDEN/CLOSED/OPEN → CommentingStatus enum (#3574661) - CommentInterface::ANONYMOUS_* → AnonymousContact enum (#3574661) --- config/drupal-11/drupal-11.4-deprecations.php | 121 +++++++++++++++--- .../config/configured_rule.php | 75 +++++++++++ .../comment_item_interface_constants.php.inc | 25 ++++ .../config/configured_rule.php | 48 +++++++ .../ckeditor5_procedural_functions.php.inc | 15 +++ .../contact_procedural_functions.php.inc | 15 +++ ...t_translation_procedural_functions.php.inc | 23 ++++ .../dblog_procedural_functions.php.inc | 15 +++ .../fixture/locale_fetch_functions.php.inc | 15 +++ .../locale_translation_inc_functions.php.inc | 25 ++++ .../menu_ui_procedural_functions.php.inc | 23 ++++ .../fixture/text_summary.php.inc | 13 ++ ...user_form_process_password_confirm.php.inc | 13 ++ .../config/configured_rule.php | 5 + .../fixture/views_ui_static_functions.php.inc | 19 +++ 15 files changed, 434 insertions(+), 16 deletions(-) create mode 100644 tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/fixture/comment_item_interface_constants.php.inc create mode 100644 tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/ckeditor5_procedural_functions.php.inc create mode 100644 tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/contact_procedural_functions.php.inc create mode 100644 tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/content_translation_procedural_functions.php.inc create mode 100644 tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/dblog_procedural_functions.php.inc create mode 100644 tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/locale_fetch_functions.php.inc create mode 100644 tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/locale_translation_inc_functions.php.inc create mode 100644 tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/menu_ui_procedural_functions.php.inc create mode 100644 tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/text_summary.php.inc create mode 100644 tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/user_form_process_password_confirm.php.inc create mode 100644 tests/src/Rector/Deprecation/FunctionToStaticRector/fixture/views_ui_static_functions.php.inc diff --git a/config/drupal-11/drupal-11.4-deprecations.php b/config/drupal-11/drupal-11.4-deprecations.php index 1ddc8e590..5be397413 100644 --- a/config/drupal-11/drupal-11.4-deprecations.php +++ b/config/drupal-11/drupal-11.4-deprecations.php @@ -14,6 +14,10 @@ // https://www.drupal.org/node/3550054 // CommentItemInterface::FORM_BELOW and FORM_SEPARATE_PAGE deprecated in 11.4.0, // removed in 13.0.0. Replaced by FormLocation enum cases. + // https://www.drupal.org/node/3574661 + // CommentItemInterface::HIDDEN/CLOSED/OPEN and CommentInterface::ANONYMOUS_* + // deprecated in 11.4.0, removed in 13.0.0. Replaced by CommentingStatus and + // AnonymousContact enum cases. $rectorConfig->ruleWithConfiguration(ClassConstantToClassConstantRector::class, [ new ClassConstantToClassConstantConfiguration( 'Drupal\comment\Plugin\Field\FieldType\CommentItemInterface', @@ -27,29 +31,114 @@ 'Drupal\comment\FormLocation', 'SeparatePage', ), + new ClassConstantToClassConstantConfiguration( + 'Drupal\comment\Plugin\Field\FieldType\CommentItemInterface', + 'HIDDEN', + 'Drupal\comment\CommentingStatus', + 'Hidden', + ), + new ClassConstantToClassConstantConfiguration( + 'Drupal\comment\Plugin\Field\FieldType\CommentItemInterface', + 'CLOSED', + 'Drupal\comment\CommentingStatus', + 'Closed', + ), + new ClassConstantToClassConstantConfiguration( + 'Drupal\comment\Plugin\Field\FieldType\CommentItemInterface', + 'OPEN', + 'Drupal\comment\CommentingStatus', + 'Open', + ), + new ClassConstantToClassConstantConfiguration( + 'Drupal\comment\CommentInterface', + 'ANONYMOUS_MAYNOT_CONTACT', + 'Drupal\comment\AnonymousContact', + 'Forbidden', + ), + new ClassConstantToClassConstantConfiguration( + 'Drupal\comment\CommentInterface', + 'ANONYMOUS_MAY_CONTACT', + 'Drupal\comment\AnonymousContact', + 'Allowed', + ), + new ClassConstantToClassConstantConfiguration( + 'Drupal\comment\CommentInterface', + 'ANONYMOUS_MUST_CONTACT', + 'Drupal\comment\AnonymousContact', + 'Required', + ), ]); // https://www.drupal.org/node/3574727 // language_configuration_element_submit() deprecated in 11.4.0, removed in 13.0.0. // Replaced by LanguageConfiguration::submit(). - $rectorConfig->ruleWithConfiguration(FunctionToStaticRector::class, [ - new FunctionToStaticConfiguration( - '11.4.0', - 'language_configuration_element_submit', - 'Drupal\language\Element\LanguageConfiguration', - 'submit' - ), - ]); - - // https://www.drupal.org/node/3574727 // language_process_language_select() deprecated in 11.4.0, removed in 12.0.0. // Replaced by LanguageHooks::processLanguageSelect() via the service container. + // https://www.drupal.org/node/3566792 + // ckeditor5_filter_format_edit_form_submit() and _update_ckeditor5_html_filter() + // deprecated in 11.4.0, removed in 12.0.0. Replaced by Ckeditor5Hooks service. + // https://www.drupal.org/node/3560398 + // _dblog_get_message_types() and dblog_filters() deprecated in 11.4.0, + // removed in 13.0.0. Replaced by DbLogFilters service. + // https://www.drupal.org/node/3566888 + // contact_user_profile_form_submit() and contact_form_user_admin_settings_submit() + // deprecated in 11.4.0, removed in 12.0.0. Replaced by ContactFormHooks service. + // https://www.drupal.org/node/3548571 + // content_translation_* functions deprecated in 11.4.0, removed in 12.0.0/13.0.0. + // https://www.drupal.org/node/3572339 + // locale_translation_batch_update_build() and locale_translation_batch_fetch_build() + // deprecated in 11.4.0, removed in 13.0.0. Replaced by LocaleFetch service. + // https://www.drupal.org/node/3569328 + // locale.translation.inc functions deprecated in 11.4.0, removed in 13.0.0. + // https://www.drupal.org/node/3571400 + // menu_ui.module procedural functions deprecated in 11.4.0, removed in 12.0.0/13.0.0. + // https://www.drupal.org/node/3568387 + // text_summary() deprecated in 11.4.0, removed in 13.0.0. Replaced by TextSummary service. + // https://www.drupal.org/node/3582106 + // user_form_process_password_confirm() deprecated in 11.4.0, removed in 13.0.0. $rectorConfig->ruleWithConfiguration(FunctionToServiceRector::class, [ - new FunctionToServiceConfiguration( - '11.4.0', - 'language_process_language_select', - 'Drupal\language\Hook\LanguageHooks', - 'processLanguageSelect' - ), + new FunctionToServiceConfiguration('11.4.0', 'language_process_language_select', 'Drupal\language\Hook\LanguageHooks', 'processLanguageSelect'), + new FunctionToServiceConfiguration('11.4.0', 'ckeditor5_filter_format_edit_form_submit', 'Drupal\ckeditor5\Hook\Ckeditor5Hooks', 'filterFormatEditFormSubmit'), + new FunctionToServiceConfiguration('11.4.0', '_update_ckeditor5_html_filter', 'Drupal\ckeditor5\Hook\Ckeditor5Hooks', 'updateCkeditor5HtmlFilter'), + new FunctionToServiceConfiguration('11.4.0', '_dblog_get_message_types', 'Drupal\dblog\DbLogFilters', 'getMessageTypes'), + new FunctionToServiceConfiguration('11.4.0', 'dblog_filters', 'Drupal\dblog\DbLogFilters', 'filters'), + new FunctionToServiceConfiguration('11.4.0', 'contact_user_profile_form_submit', 'Drupal\contact\Hook\ContactFormHooks', 'profileFormSubmit'), + new FunctionToServiceConfiguration('11.4.0', 'contact_form_user_admin_settings_submit', 'Drupal\contact\Hook\ContactFormHooks', 'userAdminSettingsSubmit'), + new FunctionToServiceConfiguration('11.4.0', 'content_translation_translate_access', 'content_translation.manager', 'access'), + new FunctionToServiceConfiguration('11.4.0', 'content_translation_enable_widget', 'Drupal\content_translation\ContentTranslationEnableTranslationPerBundle', 'getWidget'), + new FunctionToServiceConfiguration('11.4.0', 'content_translation_language_configuration_element_process', 'Drupal\content_translation\ContentTranslationEnableTranslationPerBundle', 'configElementProcess'), + new FunctionToServiceConfiguration('11.4.0', 'content_translation_language_configuration_element_validate', 'Drupal\content_translation\ContentTranslationEnableTranslationPerBundle', 'configElementValidate'), + new FunctionToServiceConfiguration('11.4.0', 'content_translation_language_configuration_element_submit', 'Drupal\content_translation\ContentTranslationEnableTranslationPerBundle', 'configElementSubmit'), + new FunctionToServiceConfiguration('11.4.0', '_content_translation_install_field_storage_definitions', 'Drupal\content_translation\Hook\ContentTranslationHooks', 'installFieldStorageDefinitions'), + new FunctionToServiceConfiguration('11.4.0', 'locale_translation_batch_update_build', 'Drupal\locale\LocaleFetch', 'batchUpdateBuild'), + new FunctionToServiceConfiguration('11.4.0', 'locale_translation_batch_fetch_build', 'Drupal\locale\LocaleFetch', 'batchFetchBuild'), + new FunctionToServiceConfiguration('11.4.0', 'locale_translation_get_projects', 'locale.project', 'getProjects'), + new FunctionToServiceConfiguration('11.4.0', 'locale_translation_clear_cache_projects', 'locale.project', 'resetCache'), + new FunctionToServiceConfiguration('11.4.0', 'locale_translation_load_sources', 'Drupal\locale\LocaleSource', 'loadSources'), + new FunctionToServiceConfiguration('11.4.0', 'locale_translation_build_sources', 'Drupal\locale\LocaleSource', 'buildSources'), + new FunctionToServiceConfiguration('11.4.0', 'locale_translation_source_check_file', 'Drupal\locale\LocaleSource', 'sourceCheckFile'), + new FunctionToServiceConfiguration('11.4.0', 'locale_translation_source_build', 'Drupal\locale\LocaleSource', 'sourceBuild'), + new FunctionToServiceConfiguration('11.4.0', 'locale_translation_build_server_pattern', 'Drupal\locale\LocaleSource', 'buildServerPattern'), + new FunctionToServiceConfiguration('11.4.0', '_menu_ui_node_save', 'Drupal\menu_ui\MenuUiUtility', 'menuUiNodeSave'), + new FunctionToServiceConfiguration('11.4.0', 'menu_ui_get_menu_link_defaults', 'Drupal\menu_ui\MenuUiUtility', 'getMenuLinkDefaults'), + new FunctionToServiceConfiguration('11.4.0', 'menu_ui_node_builder', 'Drupal\menu_ui\Hook\MenuUiHooks', 'nodeBuilder'), + new FunctionToServiceConfiguration('11.4.0', 'menu_ui_form_node_form_submit', 'Drupal\menu_ui\Hook\MenuUiHooks', 'formNodeFormSubmit'), + new FunctionToServiceConfiguration('11.4.0', 'menu_ui_form_node_type_form_validate', 'Drupal\menu_ui\Hook\MenuUiHooks', 'formNodeTypeFormValidate'), + new FunctionToServiceConfiguration('11.4.0', 'menu_ui_form_node_type_form_builder', 'Drupal\menu_ui\Hook\MenuUiHooks', 'formNodeTypeFormBuilder'), + new FunctionToServiceConfiguration('11.4.0', 'text_summary', 'Drupal\text\TextSummary', 'generate'), + new FunctionToServiceConfiguration('11.4.0', 'user_form_process_password_confirm', 'Drupal\user\Hook\UserThemeHooks', 'processPasswordConfirm'), + ]); + + // https://www.drupal.org/node/3574727 + // language_configuration_element_submit() deprecated in 11.4.0, removed in 13.0.0. + // Replaced by LanguageConfiguration::submit(). + // https://www.drupal.org/node/3035340 + // views_ui/admin.inc static trait functions deprecated in 11.4.0, removed in 13.0.0. + $rectorConfig->ruleWithConfiguration(FunctionToStaticRector::class, [ + new FunctionToStaticConfiguration('11.4.0', 'language_configuration_element_submit', 'Drupal\language\Element\LanguageConfiguration', 'submit'), + new FunctionToStaticConfiguration('11.4.0', 'views_ui_form_button_was_clicked', 'Drupal\views\ViewsFormHelperTrait', 'formButtonWasClicked'), + new FunctionToStaticConfiguration('11.4.0', 'views_ui_add_limited_validation', 'Drupal\views\ViewsFormAjaxHelperTrait', 'addLimitedValidation'), + new FunctionToStaticConfiguration('11.4.0', 'views_ui_add_ajax_wrapper', 'Drupal\views\ViewsFormAjaxHelperTrait', 'addAjaxWrapper'), + new FunctionToStaticConfiguration('11.4.0', 'views_ui_nojs_submit', 'Drupal\views\ViewsFormAjaxHelperTrait', 'noJsSubmit'), ]); }; diff --git a/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/config/configured_rule.php b/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/config/configured_rule.php index b89c3f456..303b195c9 100644 --- a/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/config/configured_rule.php +++ b/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/config/configured_rule.php @@ -40,5 +40,80 @@ 'Drupal\Core\Routing\RouteObjectInterface', 'CONTROLLER_NAME', ), + // https://www.drupal.org/node/3574661 (Drupal 11.4) + new ClassConstantToClassConstantConfiguration( + 'Drupal\comment\Plugin\Field\FieldType\CommentItemInterface', + 'HIDDEN', + 'Drupal\comment\CommentingStatus', + 'Hidden', + ), + new ClassConstantToClassConstantConfiguration( + 'Drupal\comment\Plugin\Field\FieldType\CommentItemInterface', + 'CLOSED', + 'Drupal\comment\CommentingStatus', + 'Closed', + ), + new ClassConstantToClassConstantConfiguration( + 'Drupal\comment\Plugin\Field\FieldType\CommentItemInterface', + 'OPEN', + 'Drupal\comment\CommentingStatus', + 'Open', + ), + new ClassConstantToClassConstantConfiguration( + 'Drupal\comment\CommentInterface', + 'ANONYMOUS_MAYNOT_CONTACT', + 'Drupal\comment\AnonymousContact', + 'Forbidden', + ), + new ClassConstantToClassConstantConfiguration( + 'Drupal\comment\CommentInterface', + 'ANONYMOUS_MAY_CONTACT', + 'Drupal\comment\AnonymousContact', + 'Allowed', + ), + new ClassConstantToClassConstantConfiguration( + 'Drupal\comment\CommentInterface', + 'ANONYMOUS_MUST_CONTACT', + 'Drupal\comment\AnonymousContact', + 'Required', + ), + // https://www.drupal.org/node/3575575 (Drupal 10.3) + new ClassConstantToClassConstantConfiguration( + 'Drupal\Core\File\FileSystemInterface', + 'EXISTS_RENAME', + 'Drupal\Core\File\FileExists', + 'Rename', + ), + new ClassConstantToClassConstantConfiguration( + 'Drupal\Core\File\FileSystemInterface', + 'EXISTS_REPLACE', + 'Drupal\Core\File\FileExists', + 'Replace', + ), + new ClassConstantToClassConstantConfiguration( + 'Drupal\Core\File\FileSystemInterface', + 'EXISTS_ERROR', + 'Drupal\Core\File\FileExists', + 'Error', + ), + // https://www.drupal.org/node/3575841 (Drupal 11.2) + new ClassConstantToClassConstantConfiguration( + 'Drupal\system\SystemManager', + 'REQUIREMENT_OK', + 'Drupal\Core\Extension\Requirement\RequirementSeverity', + 'OK', + ), + new ClassConstantToClassConstantConfiguration( + 'Drupal\system\SystemManager', + 'REQUIREMENT_WARNING', + 'Drupal\Core\Extension\Requirement\RequirementSeverity', + 'Warning', + ), + new ClassConstantToClassConstantConfiguration( + 'Drupal\system\SystemManager', + 'REQUIREMENT_ERROR', + 'Drupal\Core\Extension\Requirement\RequirementSeverity', + 'Error', + ), ]); }; diff --git a/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/fixture/comment_item_interface_constants.php.inc b/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/fixture/comment_item_interface_constants.php.inc new file mode 100644 index 000000000..b0a86e29d --- /dev/null +++ b/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/fixture/comment_item_interface_constants.php.inc @@ -0,0 +1,25 @@ + +----- + diff --git a/tests/src/Rector/Deprecation/FunctionToServiceRector/config/configured_rule.php b/tests/src/Rector/Deprecation/FunctionToServiceRector/config/configured_rule.php index e1bdd0eab..ed0460028 100644 --- a/tests/src/Rector/Deprecation/FunctionToServiceRector/config/configured_rule.php +++ b/tests/src/Rector/Deprecation/FunctionToServiceRector/config/configured_rule.php @@ -15,7 +15,55 @@ new FunctionToServiceConfiguration('9.3.0', 'file_save_data', 'file.repository', 'writeData'), new FunctionToServiceConfiguration('10.1.0', 'drupal_theme_rebuild', 'theme.registry', 'reset'), new FunctionToServiceConfiguration('10.2.0', '_drupal_flush_css_js', 'asset.query_string', 'reset'), + // https://www.drupal.org/node/3501136 (Drupal 11.2) + new FunctionToServiceConfiguration('11.2.0', 'template_preprocess_time', 'Drupal\Core\Datetime\DatePreprocess', 'preprocessTime'), + new FunctionToServiceConfiguration('11.2.0', 'template_preprocess_datetime_form', 'Drupal\Core\Datetime\DatePreprocess', 'preprocessDatetimeForm'), + new FunctionToServiceConfiguration('11.2.0', 'template_preprocess_datetime_wrapper', 'Drupal\Core\Datetime\DatePreprocess', 'preprocessDatetimeWrapper'), + new FunctionToServiceConfiguration('11.2.0', 'template_preprocess_links', 'Drupal\Core\Theme\ThemePreprocess', 'preprocessLinks'), + new FunctionToServiceConfiguration('11.2.0', 'template_preprocess_container', 'Drupal\Core\Theme\ThemePreprocess', 'preprocessContainer'), + new FunctionToServiceConfiguration('11.2.0', 'template_preprocess_html', 'Drupal\Core\Theme\ThemePreprocess', 'preprocessHtml'), + new FunctionToServiceConfiguration('11.2.0', 'template_preprocess_page', 'Drupal\Core\Theme\ThemePreprocess', 'preprocessPage'), + // https://www.drupal.org/node/3571623 (Drupal 11.3) + new FunctionToServiceConfiguration('11.3.0', 'node_mass_update', 'Drupal\node\NodeBulkUpdate', 'process'), // https://www.drupal.org/node/3574727 (Drupal 11.4) new FunctionToServiceConfiguration('11.4.0', 'language_process_language_select', 'Drupal\language\Hook\LanguageHooks', 'processLanguageSelect'), + // https://www.drupal.org/node/3566792 (Drupal 11.4) + new FunctionToServiceConfiguration('11.4.0', 'ckeditor5_filter_format_edit_form_submit', 'Drupal\ckeditor5\Hook\Ckeditor5Hooks', 'filterFormatEditFormSubmit'), + new FunctionToServiceConfiguration('11.4.0', '_update_ckeditor5_html_filter', 'Drupal\ckeditor5\Hook\Ckeditor5Hooks', 'updateCkeditor5HtmlFilter'), + // https://www.drupal.org/node/3560398 (Drupal 11.4) + new FunctionToServiceConfiguration('11.4.0', '_dblog_get_message_types', 'Drupal\dblog\DbLogFilters', 'getMessageTypes'), + new FunctionToServiceConfiguration('11.4.0', 'dblog_filters', 'Drupal\dblog\DbLogFilters', 'filters'), + // https://www.drupal.org/node/3566888 (Drupal 11.4) + new FunctionToServiceConfiguration('11.4.0', 'contact_user_profile_form_submit', 'Drupal\contact\Hook\ContactFormHooks', 'profileFormSubmit'), + new FunctionToServiceConfiguration('11.4.0', 'contact_form_user_admin_settings_submit', 'Drupal\contact\Hook\ContactFormHooks', 'userAdminSettingsSubmit'), + // https://www.drupal.org/node/3548571 (Drupal 11.4) + new FunctionToServiceConfiguration('11.4.0', 'content_translation_translate_access', 'content_translation.manager', 'access'), + new FunctionToServiceConfiguration('11.4.0', 'content_translation_enable_widget', 'Drupal\content_translation\ContentTranslationEnableTranslationPerBundle', 'getWidget'), + new FunctionToServiceConfiguration('11.4.0', 'content_translation_language_configuration_element_process', 'Drupal\content_translation\ContentTranslationEnableTranslationPerBundle', 'configElementProcess'), + new FunctionToServiceConfiguration('11.4.0', 'content_translation_language_configuration_element_validate', 'Drupal\content_translation\ContentTranslationEnableTranslationPerBundle', 'configElementValidate'), + new FunctionToServiceConfiguration('11.4.0', 'content_translation_language_configuration_element_submit', 'Drupal\content_translation\ContentTranslationEnableTranslationPerBundle', 'configElementSubmit'), + new FunctionToServiceConfiguration('11.4.0', '_content_translation_install_field_storage_definitions', 'Drupal\content_translation\Hook\ContentTranslationHooks', 'installFieldStorageDefinitions'), + // https://www.drupal.org/node/3572339 (Drupal 11.4) + new FunctionToServiceConfiguration('11.4.0', 'locale_translation_batch_update_build', 'Drupal\locale\LocaleFetch', 'batchUpdateBuild'), + new FunctionToServiceConfiguration('11.4.0', 'locale_translation_batch_fetch_build', 'Drupal\locale\LocaleFetch', 'batchFetchBuild'), + // https://www.drupal.org/node/3569328 (Drupal 11.4) + new FunctionToServiceConfiguration('11.4.0', 'locale_translation_get_projects', 'locale.project', 'getProjects'), + new FunctionToServiceConfiguration('11.4.0', 'locale_translation_clear_cache_projects', 'locale.project', 'resetCache'), + new FunctionToServiceConfiguration('11.4.0', 'locale_translation_load_sources', 'Drupal\locale\LocaleSource', 'loadSources'), + new FunctionToServiceConfiguration('11.4.0', 'locale_translation_build_sources', 'Drupal\locale\LocaleSource', 'buildSources'), + new FunctionToServiceConfiguration('11.4.0', 'locale_translation_source_check_file', 'Drupal\locale\LocaleSource', 'sourceCheckFile'), + new FunctionToServiceConfiguration('11.4.0', 'locale_translation_source_build', 'Drupal\locale\LocaleSource', 'sourceBuild'), + new FunctionToServiceConfiguration('11.4.0', 'locale_translation_build_server_pattern', 'Drupal\locale\LocaleSource', 'buildServerPattern'), + // https://www.drupal.org/node/3571400 (Drupal 11.4) + new FunctionToServiceConfiguration('11.4.0', '_menu_ui_node_save', 'Drupal\menu_ui\MenuUiUtility', 'menuUiNodeSave'), + new FunctionToServiceConfiguration('11.4.0', 'menu_ui_get_menu_link_defaults', 'Drupal\menu_ui\MenuUiUtility', 'getMenuLinkDefaults'), + new FunctionToServiceConfiguration('11.4.0', 'menu_ui_node_builder', 'Drupal\menu_ui\Hook\MenuUiHooks', 'nodeBuilder'), + new FunctionToServiceConfiguration('11.4.0', 'menu_ui_form_node_form_submit', 'Drupal\menu_ui\Hook\MenuUiHooks', 'formNodeFormSubmit'), + new FunctionToServiceConfiguration('11.4.0', 'menu_ui_form_node_type_form_validate', 'Drupal\menu_ui\Hook\MenuUiHooks', 'formNodeTypeFormValidate'), + new FunctionToServiceConfiguration('11.4.0', 'menu_ui_form_node_type_form_builder', 'Drupal\menu_ui\Hook\MenuUiHooks', 'formNodeTypeFormBuilder'), + // https://www.drupal.org/node/3568387 (Drupal 11.4) + new FunctionToServiceConfiguration('11.4.0', 'text_summary', 'Drupal\text\TextSummary', 'generate'), + // https://www.drupal.org/node/3582106 (Drupal 11.4) + new FunctionToServiceConfiguration('11.4.0', 'user_form_process_password_confirm', 'Drupal\user\Hook\UserThemeHooks', 'processPasswordConfirm'), ]); }; diff --git a/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/ckeditor5_procedural_functions.php.inc b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/ckeditor5_procedural_functions.php.inc new file mode 100644 index 000000000..e92463255 --- /dev/null +++ b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/ckeditor5_procedural_functions.php.inc @@ -0,0 +1,15 @@ + +----- + \Drupal::service('Drupal\ckeditor5\Hook\Ckeditor5Hooks')->filterFormatEditFormSubmit($form, $form_state), fn() => ckeditor5_filter_format_edit_form_submit($form, $form_state)); + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('Drupal\ckeditor5\Hook\Ckeditor5Hooks')->updateCkeditor5HtmlFilter($form, $form_state), fn() => _update_ckeditor5_html_filter($form, $form_state)); +} +?> diff --git a/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/contact_procedural_functions.php.inc b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/contact_procedural_functions.php.inc new file mode 100644 index 000000000..e54ebc1ec --- /dev/null +++ b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/contact_procedural_functions.php.inc @@ -0,0 +1,15 @@ + +----- + \Drupal::service('Drupal\contact\Hook\ContactFormHooks')->profileFormSubmit($form, $form_state), fn() => contact_user_profile_form_submit($form, $form_state)); + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('Drupal\contact\Hook\ContactFormHooks')->userAdminSettingsSubmit($form, $form_state), fn() => contact_form_user_admin_settings_submit($form, $form_state)); +} +?> diff --git a/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/content_translation_procedural_functions.php.inc b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/content_translation_procedural_functions.php.inc new file mode 100644 index 000000000..beda962f0 --- /dev/null +++ b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/content_translation_procedural_functions.php.inc @@ -0,0 +1,23 @@ + +----- + \Drupal::service('content_translation.manager')->access($entity), fn() => content_translation_translate_access($entity)); + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('Drupal\content_translation\ContentTranslationEnableTranslationPerBundle')->getWidget($entity_type, $bundle, $form, $form_state), fn() => content_translation_enable_widget($entity_type, $bundle, $form, $form_state)); + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('Drupal\content_translation\ContentTranslationEnableTranslationPerBundle')->configElementProcess($element, $form_state, $form), fn() => content_translation_language_configuration_element_process($element, $form_state, $form)); + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('Drupal\content_translation\ContentTranslationEnableTranslationPerBundle')->configElementValidate($element, $form_state, $form), fn() => content_translation_language_configuration_element_validate($element, $form_state, $form)); + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('Drupal\content_translation\ContentTranslationEnableTranslationPerBundle')->configElementSubmit($form, $form_state), fn() => content_translation_language_configuration_element_submit($form, $form_state)); + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('Drupal\content_translation\Hook\ContentTranslationHooks')->installFieldStorageDefinitions($entity_type_id), fn() => _content_translation_install_field_storage_definitions($entity_type_id)); +} +?> diff --git a/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/dblog_procedural_functions.php.inc b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/dblog_procedural_functions.php.inc new file mode 100644 index 000000000..edc361a2a --- /dev/null +++ b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/dblog_procedural_functions.php.inc @@ -0,0 +1,15 @@ + +----- + \Drupal::service('Drupal\dblog\DbLogFilters')->getMessageTypes(), fn() => _dblog_get_message_types()); + $filters = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('Drupal\dblog\DbLogFilters')->filters(), fn() => dblog_filters()); +} +?> diff --git a/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/locale_fetch_functions.php.inc b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/locale_fetch_functions.php.inc new file mode 100644 index 000000000..208abfd38 --- /dev/null +++ b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/locale_fetch_functions.php.inc @@ -0,0 +1,15 @@ + +----- + \Drupal::service('Drupal\locale\LocaleFetch')->batchUpdateBuild($projects, $langcodes, $options), fn() => locale_translation_batch_update_build($projects, $langcodes, $options)); + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('Drupal\locale\LocaleFetch')->batchFetchBuild($projects, $langcodes, $options), fn() => locale_translation_batch_fetch_build($projects, $langcodes, $options)); +} +?> diff --git a/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/locale_translation_inc_functions.php.inc b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/locale_translation_inc_functions.php.inc new file mode 100644 index 000000000..d68b7ea85 --- /dev/null +++ b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/locale_translation_inc_functions.php.inc @@ -0,0 +1,25 @@ + +----- + \Drupal::service('locale.project')->getProjects(['mymodule']), fn() => locale_translation_get_projects(['mymodule'])); + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('locale.project')->resetCache(), fn() => locale_translation_clear_cache_projects()); + $sources = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('Drupal\locale\LocaleSource')->loadSources($projects, $langcodes), fn() => locale_translation_load_sources($projects, $langcodes)); + $built = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('Drupal\locale\LocaleSource')->buildSources($projects, $langcodes), fn() => locale_translation_build_sources($projects, $langcodes)); + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('Drupal\locale\LocaleSource')->sourceCheckFile($source), fn() => locale_translation_source_check_file($source)); + $obj = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('Drupal\locale\LocaleSource')->sourceBuild($project, 'fr', 'mymodule.po'), fn() => locale_translation_source_build($project, 'fr', 'mymodule.po')); + $pattern = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('Drupal\locale\LocaleSource')->buildServerPattern($project, $template), fn() => locale_translation_build_server_pattern($project, $template)); +} +?> diff --git a/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/menu_ui_procedural_functions.php.inc b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/menu_ui_procedural_functions.php.inc new file mode 100644 index 000000000..d8571666a --- /dev/null +++ b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/menu_ui_procedural_functions.php.inc @@ -0,0 +1,23 @@ + +----- + \Drupal::service('Drupal\menu_ui\MenuUiUtility')->menuUiNodeSave($node, $values), fn() => _menu_ui_node_save($node, $values)); + $defaults = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('Drupal\menu_ui\MenuUiUtility')->getMenuLinkDefaults($node), fn() => menu_ui_get_menu_link_defaults($node)); + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('Drupal\menu_ui\Hook\MenuUiHooks')->nodeBuilder($node, $form, $form_state), fn() => menu_ui_node_builder($node, $form, $form_state)); + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('Drupal\menu_ui\Hook\MenuUiHooks')->formNodeFormSubmit($form, $form_state), fn() => menu_ui_form_node_form_submit($form, $form_state)); + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('Drupal\menu_ui\Hook\MenuUiHooks')->formNodeTypeFormValidate($form, $form_state), fn() => menu_ui_form_node_type_form_validate($form, $form_state)); + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('Drupal\menu_ui\Hook\MenuUiHooks')->formNodeTypeFormBuilder($node, $form, $form_state), fn() => menu_ui_form_node_type_form_builder($node, $form, $form_state)); +} +?> diff --git a/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/text_summary.php.inc b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/text_summary.php.inc new file mode 100644 index 000000000..d1339671c --- /dev/null +++ b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/text_summary.php.inc @@ -0,0 +1,13 @@ + +----- + \Drupal::service('Drupal\text\TextSummary')->generate($body, $format, $size), fn() => text_summary($body, $format, $size)); +} +?> diff --git a/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/user_form_process_password_confirm.php.inc b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/user_form_process_password_confirm.php.inc new file mode 100644 index 000000000..65376018d --- /dev/null +++ b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/user_form_process_password_confirm.php.inc @@ -0,0 +1,13 @@ + +----- + \Drupal::service('Drupal\user\Hook\UserThemeHooks')->processPasswordConfirm($element), fn() => user_form_process_password_confirm($element)); +} +?> diff --git a/tests/src/Rector/Deprecation/FunctionToStaticRector/config/configured_rule.php b/tests/src/Rector/Deprecation/FunctionToStaticRector/config/configured_rule.php index f522ec90a..34cbdb98b 100644 --- a/tests/src/Rector/Deprecation/FunctionToStaticRector/config/configured_rule.php +++ b/tests/src/Rector/Deprecation/FunctionToStaticRector/config/configured_rule.php @@ -16,5 +16,10 @@ new FunctionToStaticConfiguration('10.3.0', 'file_icon_map', 'Drupal\file\IconMimeTypes', 'getGenericMimeType'), // https://www.drupal.org/node/3574727 (Drupal 11.4) new FunctionToStaticConfiguration('11.4.0', 'language_configuration_element_submit', 'Drupal\language\Element\LanguageConfiguration', 'submit'), + // https://www.drupal.org/node/3035340 (Drupal 11.4) + new FunctionToStaticConfiguration('11.4.0', 'views_ui_form_button_was_clicked', 'Drupal\views\ViewsFormHelperTrait', 'formButtonWasClicked'), + new FunctionToStaticConfiguration('11.4.0', 'views_ui_add_limited_validation', 'Drupal\views\ViewsFormAjaxHelperTrait', 'addLimitedValidation'), + new FunctionToStaticConfiguration('11.4.0', 'views_ui_add_ajax_wrapper', 'Drupal\views\ViewsFormAjaxHelperTrait', 'addAjaxWrapper'), + new FunctionToStaticConfiguration('11.4.0', 'views_ui_nojs_submit', 'Drupal\views\ViewsFormAjaxHelperTrait', 'noJsSubmit'), ]); }; diff --git a/tests/src/Rector/Deprecation/FunctionToStaticRector/fixture/views_ui_static_functions.php.inc b/tests/src/Rector/Deprecation/FunctionToStaticRector/fixture/views_ui_static_functions.php.inc new file mode 100644 index 000000000..c37217f6a --- /dev/null +++ b/tests/src/Rector/Deprecation/FunctionToStaticRector/fixture/views_ui_static_functions.php.inc @@ -0,0 +1,19 @@ + +----- + \Drupal\views\ViewsFormHelperTrait::formButtonWasClicked($element, $form_state), fn() => views_ui_form_button_was_clicked($element, $form_state)); + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal\views\ViewsFormAjaxHelperTrait::addLimitedValidation($element, $form_state), fn() => views_ui_add_limited_validation($element, $form_state)); + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal\views\ViewsFormAjaxHelperTrait::addAjaxWrapper($element, $form_state), fn() => views_ui_add_ajax_wrapper($element, $form_state)); + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal\views\ViewsFormAjaxHelperTrait::noJsSubmit($form, $form_state), fn() => views_ui_nojs_submit($form, $form_state)); +} +?> From 61786ad2cb6ae0143c144cb972624e0eedc2fdda Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 15:38:56 +0200 Subject: [PATCH 013/256] feat(Drupal10): Add ReplaceModuleHandlerGetNameRector for issue #3571063 Replaces deprecated ModuleHandlerInterface::getName($module) calls with \Drupal::service('extension.list.module')->getName($module), BC-wrapped for sites running Drupal 10.3+. --- config/drupal-10/drupal-10.3-deprecations.php | 8 ++ .../ReplaceModuleHandlerGetNameRector.php | 80 +++++++++++++++++++ .../ReplaceModuleHandlerGetNameRectorTest.php | 33 ++++++++ .../config/configured_rule.php | 14 ++++ .../fixture/basic.php.inc | 11 +++ 5 files changed, 146 insertions(+) create mode 100644 src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector.php create mode 100644 tests/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector/ReplaceModuleHandlerGetNameRectorTest.php create mode 100644 tests/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector/config/configured_rule.php create mode 100644 tests/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector/fixture/basic.php.inc diff --git a/config/drupal-10/drupal-10.3-deprecations.php b/config/drupal-10/drupal-10.3-deprecations.php index 0e769e957..7e968c035 100644 --- a/config/drupal-10/drupal-10.3-deprecations.php +++ b/config/drupal-10/drupal-10.3-deprecations.php @@ -2,9 +2,11 @@ declare(strict_types=1); +use DrupalRector\Drupal10\Rector\Deprecation\ReplaceModuleHandlerGetNameRector; use DrupalRector\Rector\Deprecation\ClassConstantToClassConstantRector; use DrupalRector\Rector\Deprecation\FunctionToStaticRector; use DrupalRector\Rector\ValueObject\ClassConstantToClassConstantConfiguration; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use DrupalRector\Rector\ValueObject\FunctionToStaticConfiguration; use Rector\Config\RectorConfig; @@ -15,6 +17,12 @@ new FunctionToStaticConfiguration('10.3.0', 'file_icon_map', 'Drupal\file\IconMimeTypes', 'getGenericMimeType'), ]); + // https://www.drupal.org/node/3571063 + // ModuleHandlerInterface::getName() deprecated in drupal:10.3.0, removed in drupal:12.0.0. + $rectorConfig->ruleWithConfiguration(ReplaceModuleHandlerGetNameRector::class, [ + new DrupalIntroducedVersionConfiguration('10.3.0'), + ]); + // https://www.drupal.org/node/3575575 // FileSystemInterface::EXISTS_* deprecated in drupal:10.3.0, removed in drupal:12.0.0. // Replaced by \Drupal\Core\File\FileExists enum cases. diff --git a/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector.php b/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector.php new file mode 100644 index 000000000..6bdb0e876 --- /dev/null +++ b/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector.php @@ -0,0 +1,80 @@ +isName($node->name, 'getName')) { + return null; + } + + if (!$this->isObjectType($node->var, new ObjectType('Drupal\Core\Extension\ModuleHandlerInterface'))) { + return null; + } + + $service = new Node\Expr\StaticCall( + new Node\Name\FullyQualified('Drupal'), + 'service', + [new Node\Arg(new Node\Scalar\String_('extension.list.module'))] + ); + + return new Node\Expr\MethodCall($service, 'getName', $node->args); + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition("Replaces deprecated ModuleHandlerInterface::getName() with \\Drupal::service('extension.list.module')->getName()", [ + new ConfiguredCodeSample( + <<<'CODE_BEFORE' +$this->moduleHandler->getName($module); +CODE_BEFORE, + <<<'CODE_AFTER' +\Drupal::service('extension.list.module')->getName($module); +CODE_AFTER, + [new DrupalIntroducedVersionConfiguration('10.3.0')] + ), + ]); + } +} diff --git a/tests/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector/ReplaceModuleHandlerGetNameRectorTest.php b/tests/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector/ReplaceModuleHandlerGetNameRectorTest.php new file mode 100644 index 000000000..d58889035 --- /dev/null +++ b/tests/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector/ReplaceModuleHandlerGetNameRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector/config/configured_rule.php b/tests/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector/config/configured_rule.php new file mode 100644 index 000000000..9f4530a88 --- /dev/null +++ b/tests/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector/config/configured_rule.php @@ -0,0 +1,14 @@ +getName('mymodule'); +?> +----- + \Drupal::service('extension.list.module')->getName('mymodule'), fn() => $module_handler->getName('mymodule')); +?> From c82e6b397719b9d48e09072e16e8d4eeb963c2d5 Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 15:52:47 +0200 Subject: [PATCH 014/256] feat(Drupal11): Add 11.1 deprecation rules for path_alias AliasWhitelist rename Adds AliasManager::pathAliasWhitelistRebuild() -> pathAliasPrefixListRebuild() rename (drupal:11.1.0, issue #3151086). Also registers DRUPAL_111/112/113 constants in Drupal11SetList. --- config/drupal-11/drupal-11.1-deprecations.php | 16 ++++++++++++++++ src/Set/Drupal11SetList.php | 3 +++ .../config/configured_rule.php | 1 + .../fixture/path_alias_whitelist_method.php.inc | 11 +++++++++++ 4 files changed, 31 insertions(+) create mode 100644 config/drupal-11/drupal-11.1-deprecations.php create mode 100644 tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture/path_alias_whitelist_method.php.inc diff --git a/config/drupal-11/drupal-11.1-deprecations.php b/config/drupal-11/drupal-11.1-deprecations.php new file mode 100644 index 000000000..9e8660508 --- /dev/null +++ b/config/drupal-11/drupal-11.1-deprecations.php @@ -0,0 +1,16 @@ +ruleWithConfiguration(MethodToMethodWithCheckRector::class, [ + new MethodToMethodWithCheckConfiguration('Drupal\path_alias\AliasManager', 'pathAliasWhitelistRebuild', 'pathAliasPrefixListRebuild'), + ]); +}; diff --git a/src/Set/Drupal11SetList.php b/src/Set/Drupal11SetList.php index c868745da..fe83c73aa 100644 --- a/src/Set/Drupal11SetList.php +++ b/src/Set/Drupal11SetList.php @@ -7,5 +7,8 @@ final class Drupal11SetList { public const DRUPAL_11 = __DIR__.'/../../config/drupal-11/drupal-11-all-deprecations.php'; + public const DRUPAL_111 = __DIR__.'/../../config/drupal-11/drupal-11.1-deprecations.php'; + public const DRUPAL_112 = __DIR__.'/../../config/drupal-11/drupal-11.2-deprecations.php'; + public const DRUPAL_113 = __DIR__.'/../../config/drupal-11/drupal-11.3-deprecations.php'; public const DRUPAL_114 = __DIR__.'/../../config/drupal-11/drupal-11.4-deprecations.php'; } diff --git a/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/config/configured_rule.php b/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/config/configured_rule.php index 9e886e74c..34aeb5dfe 100644 --- a/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/config/configured_rule.php +++ b/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/config/configured_rule.php @@ -13,5 +13,6 @@ new MethodToMethodWithCheckConfiguration('Drupal\Core\Entity\EntityInterface', 'urlInfo', 'toUrl'), new MethodToMethodWithCheckConfiguration('Drupal\system\Plugin\ImageToolkit\GDToolkit', 'getResource', 'getImage'), new MethodToMethodWithCheckConfiguration('Drupal\system\Plugin\ImageToolkit\GDToolkit', 'setResource', 'setImage'), + new MethodToMethodWithCheckConfiguration('Drupal\path_alias\AliasManager', 'pathAliasWhitelistRebuild', 'pathAliasPrefixListRebuild'), ]); }; diff --git a/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture/path_alias_whitelist_method.php.inc b/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture/path_alias_whitelist_method.php.inc new file mode 100644 index 000000000..448190455 --- /dev/null +++ b/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture/path_alias_whitelist_method.php.inc @@ -0,0 +1,11 @@ +pathAliasWhitelistRebuild($path); +?> +----- +pathAliasPrefixListRebuild($path); +?> From 9bbbf972281de0c429e2105c9f96677f63164ee0 Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 15:55:42 +0200 Subject: [PATCH 015/256] feat(Drupal11): Add CacheBackendInterface::invalidateAll() deprecation rule Replaces invalidateAll() with deleteAll() on CacheBackendInterface objects (drupal:11.2.0, issue #3498947). --- config/drupal-11/drupal-11.2-deprecations.php | 9 +++++++++ .../config/configured_rule.php | 1 + .../fixture/cache_invalidate_all.php.inc | 11 +++++++++++ 3 files changed, 21 insertions(+) create mode 100644 tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture/cache_invalidate_all.php.inc diff --git a/config/drupal-11/drupal-11.2-deprecations.php b/config/drupal-11/drupal-11.2-deprecations.php index 48297a0aa..802b237f2 100644 --- a/config/drupal-11/drupal-11.2-deprecations.php +++ b/config/drupal-11/drupal-11.2-deprecations.php @@ -4,11 +4,20 @@ use DrupalRector\Rector\Deprecation\ClassConstantToClassConstantRector; use DrupalRector\Rector\Deprecation\FunctionToServiceRector; +use DrupalRector\Rector\Deprecation\MethodToMethodWithCheckRector; use DrupalRector\Rector\ValueObject\ClassConstantToClassConstantConfiguration; use DrupalRector\Rector\ValueObject\FunctionToServiceConfiguration; +use DrupalRector\Rector\ValueObject\MethodToMethodWithCheckConfiguration; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { + // https://www.drupal.org/node/3498947 + // CacheBackendInterface::invalidateAll() deprecated in drupal:11.2.0, removed in drupal:12.0.0. + // Replaced by deleteAll(). + $rectorConfig->ruleWithConfiguration(MethodToMethodWithCheckRector::class, [ + new MethodToMethodWithCheckConfiguration('Drupal\Core\Cache\CacheBackendInterface', 'invalidateAll', 'deleteAll'), + ]); + // https://www.drupal.org/node/3501136 // template_preprocess_*() functions deprecated in drupal:11.2.0, removed in drupal:12.0.0. // Replaced by ThemePreprocess and DatePreprocess service methods. diff --git a/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/config/configured_rule.php b/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/config/configured_rule.php index 34aeb5dfe..85c8aa68f 100644 --- a/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/config/configured_rule.php +++ b/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/config/configured_rule.php @@ -14,5 +14,6 @@ new MethodToMethodWithCheckConfiguration('Drupal\system\Plugin\ImageToolkit\GDToolkit', 'getResource', 'getImage'), new MethodToMethodWithCheckConfiguration('Drupal\system\Plugin\ImageToolkit\GDToolkit', 'setResource', 'setImage'), new MethodToMethodWithCheckConfiguration('Drupal\path_alias\AliasManager', 'pathAliasWhitelistRebuild', 'pathAliasPrefixListRebuild'), + new MethodToMethodWithCheckConfiguration('Drupal\Core\Cache\CacheBackendInterface', 'invalidateAll', 'deleteAll'), ]); }; diff --git a/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture/cache_invalidate_all.php.inc b/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture/cache_invalidate_all.php.inc new file mode 100644 index 000000000..dead84d92 --- /dev/null +++ b/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture/cache_invalidate_all.php.inc @@ -0,0 +1,11 @@ +invalidateAll(); +?> +----- +deleteAll(); +?> From aa4c878a9003d3c206e00492d8f360a551074b3e Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 15:57:38 +0200 Subject: [PATCH 016/256] feat(Drupal11): Add ReplaceCommentManagerGetCountNewCommentsRector for issue #3543035 Replaces CommentManagerInterface::getCountNewComments() with \Drupal::service(\Drupal\history\HistoryManager::class)->getCountNewComments(), BC-wrapped for drupal:11.3.0. --- config/drupal-11/drupal-11.3-deprecations.php | 9 +++ ...ommentManagerGetCountNewCommentsRector.php | 80 +++++++++++++++++++ ...ntManagerGetCountNewCommentsRectorTest.php | 33 ++++++++ .../config/configured_rule.php | 14 ++++ .../fixture/basic.php.inc | 11 +++ 5 files changed, 147 insertions(+) create mode 100644 src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/ReplaceCommentManagerGetCountNewCommentsRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/fixture/basic.php.inc diff --git a/config/drupal-11/drupal-11.3-deprecations.php b/config/drupal-11/drupal-11.3-deprecations.php index 79230dbc8..dfcbcb745 100644 --- a/config/drupal-11/drupal-11.3-deprecations.php +++ b/config/drupal-11/drupal-11.3-deprecations.php @@ -2,11 +2,20 @@ declare(strict_types=1); +use DrupalRector\Drupal11\Rector\Deprecation\ReplaceCommentManagerGetCountNewCommentsRector; use DrupalRector\Rector\Deprecation\FunctionToServiceRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use DrupalRector\Rector\ValueObject\FunctionToServiceConfiguration; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { + // https://www.drupal.org/node/3543035 + // CommentManagerInterface::getCountNewComments() deprecated in drupal:11.3.0, removed in drupal:12.0.0. + // Replaced by \Drupal\history\HistoryManager::getCountNewComments(). + $rectorConfig->ruleWithConfiguration(ReplaceCommentManagerGetCountNewCommentsRector::class, [ + new DrupalIntroducedVersionConfiguration('11.3.0'), + ]); + // https://www.drupal.org/node/3571623 // node_mass_update() deprecated in drupal:11.3.0, removed in drupal:13.0.0. // Replaced by \Drupal\node\NodeBulkUpdate::process(). diff --git a/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector.php b/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector.php new file mode 100644 index 000000000..dee197cff --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector.php @@ -0,0 +1,80 @@ +isName($node->name, 'getCountNewComments')) { + return null; + } + + if (!$this->isObjectType($node->var, new ObjectType('Drupal\comment\CommentManagerInterface'))) { + return null; + } + + $service = new Node\Expr\StaticCall( + new Node\Name\FullyQualified('Drupal'), + 'service', + [new Node\Arg(new Node\Expr\ClassConstFetch(new Node\Name\FullyQualified('Drupal\history\HistoryManager'), 'class'))] + ); + + return new Node\Expr\MethodCall($service, 'getCountNewComments', $node->args); + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition('Replaces deprecated CommentManagerInterface::getCountNewComments() with HistoryManager service', [ + new ConfiguredCodeSample( + <<<'CODE_BEFORE' +$this->commentManager->getCountNewComments($entity); +CODE_BEFORE, + <<<'CODE_AFTER' +\Drupal::service(\Drupal\history\HistoryManager::class)->getCountNewComments($entity); +CODE_AFTER, + [new DrupalIntroducedVersionConfiguration('11.3.0')] + ), + ]); + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/ReplaceCommentManagerGetCountNewCommentsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/ReplaceCommentManagerGetCountNewCommentsRectorTest.php new file mode 100644 index 000000000..ab37b68b3 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/ReplaceCommentManagerGetCountNewCommentsRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/config/configured_rule.php new file mode 100644 index 000000000..218f82f76 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/config/configured_rule.php @@ -0,0 +1,14 @@ +getCountNewComments($entity); +?> +----- + \Drupal::service(\Drupal\history\HistoryManager::class)->getCountNewComments($entity), fn() => $comment_manager->getCountNewComments($entity)); +?> From 74d14d36d60bce5ab5e9e27a515c2d53e9299d8c Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 15:59:25 +0200 Subject: [PATCH 017/256] feat(Drupal11): Add NodeStorageDeprecatedMethodsRector for issue #3396062 Replaces NodeStorage::revisionIds() and userRevisionIds() with equivalent entity query chains (drupal:11.3.0, removed in drupal:13.0.0). --- config/drupal-11/drupal-11.3-deprecations.php | 6 ++ .../NodeStorageDeprecatedMethodsRector.php | 95 +++++++++++++++++++ ...NodeStorageDeprecatedMethodsRectorTest.php | 33 +++++++ .../config/configured_rule.php | 11 +++ .../fixture/basic.php.inc | 13 +++ 5 files changed, 158 insertions(+) create mode 100644 src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector/NodeStorageDeprecatedMethodsRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector/fixture/basic.php.inc diff --git a/config/drupal-11/drupal-11.3-deprecations.php b/config/drupal-11/drupal-11.3-deprecations.php index dfcbcb745..5629c2767 100644 --- a/config/drupal-11/drupal-11.3-deprecations.php +++ b/config/drupal-11/drupal-11.3-deprecations.php @@ -2,6 +2,7 @@ declare(strict_types=1); +use DrupalRector\Drupal11\Rector\Deprecation\NodeStorageDeprecatedMethodsRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceCommentManagerGetCountNewCommentsRector; use DrupalRector\Rector\Deprecation\FunctionToServiceRector; use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; @@ -16,6 +17,11 @@ new DrupalIntroducedVersionConfiguration('11.3.0'), ]); + // https://www.drupal.org/node/3396062 + // NodeStorage::revisionIds() and userRevisionIds() deprecated in drupal:11.3.0, removed in drupal:13.0.0. + // Replaced by equivalent entity queries. + $rectorConfig->rule(NodeStorageDeprecatedMethodsRector::class); + // https://www.drupal.org/node/3571623 // node_mass_update() deprecated in drupal:11.3.0, removed in drupal:13.0.0. // Replaced by \Drupal\node\NodeBulkUpdate::process(). diff --git a/src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector.php b/src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector.php new file mode 100644 index 000000000..a3425877d --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector.php @@ -0,0 +1,95 @@ +isObjectType($node->var, new ObjectType('Drupal\node\NodeStorageInterface'))) { + return null; + } + + $methodName = $this->getName($node->name); + + if ($methodName === 'revisionIds') { + if (count($node->args) !== 1) { + return null; + } + + $nodeArg = $node->args[0] instanceof Node\Arg ? $node->args[0]->value : $node->args[0]; + $getQuery = $this->nodeFactory->createMethodCall($node->var, 'getQuery'); + $allRevisions = $this->nodeFactory->createMethodCall($getQuery, 'allRevisions'); + $nodeId = $this->nodeFactory->createMethodCall($nodeArg, 'id'); + $condition = new Node\Expr\MethodCall($allRevisions, 'condition', [ + new Node\Arg(new Node\Scalar\String_('nid')), + new Node\Arg($nodeId), + ]); + $accessCheck = new Node\Expr\MethodCall($condition, 'accessCheck', [ + new Node\Arg(new Node\Expr\ConstFetch(new Node\Name('FALSE'))), + ]); + $execute = $this->nodeFactory->createMethodCall($accessCheck, 'execute'); + + return $this->nodeFactory->createFuncCall('array_keys', [new Node\Arg($execute)]); + } + + if ($methodName === 'userRevisionIds') { + if (count($node->args) !== 1) { + return null; + } + + $accountArg = $node->args[0] instanceof Node\Arg ? $node->args[0]->value : $node->args[0]; + $getQuery = $this->nodeFactory->createMethodCall($node->var, 'getQuery'); + $allRevisions = $this->nodeFactory->createMethodCall($getQuery, 'allRevisions'); + $accessCheck = new Node\Expr\MethodCall($allRevisions, 'accessCheck', [ + new Node\Arg(new Node\Expr\ConstFetch(new Node\Name('FALSE'))), + ]); + $accountId = $this->nodeFactory->createMethodCall($accountArg, 'id'); + $condition = new Node\Expr\MethodCall($accessCheck, 'condition', [ + new Node\Arg(new Node\Scalar\String_('uid')), + new Node\Arg($accountId), + ]); + $execute = $this->nodeFactory->createMethodCall($condition, 'execute'); + + return $this->nodeFactory->createFuncCall('array_keys', [new Node\Arg($execute)]); + } + + return null; + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition('Replaces deprecated NodeStorage::revisionIds() and userRevisionIds() with entity queries', [ + new CodeSample( + '$storage->revisionIds($node);', + "array_keys(\$storage->getQuery()->allRevisions()->condition('nid', \$node->id())->accessCheck(FALSE)->execute());" + ), + new CodeSample( + '$storage->userRevisionIds($account);', + "array_keys(\$storage->getQuery()->allRevisions()->accessCheck(FALSE)->condition('uid', \$account->id())->execute());" + ), + ]); + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector/NodeStorageDeprecatedMethodsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector/NodeStorageDeprecatedMethodsRectorTest.php new file mode 100644 index 000000000..57ce14d1f --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector/NodeStorageDeprecatedMethodsRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector/config/configured_rule.php new file mode 100644 index 000000000..6caedd687 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector/config/configured_rule.php @@ -0,0 +1,11 @@ +revisionIds($node); +$revisions = $storage->userRevisionIds($account); +?> +----- +getQuery()->allRevisions()->condition('nid', $node->id())->accessCheck(FALSE)->execute()); +$revisions = array_keys($storage->getQuery()->allRevisions()->accessCheck(FALSE)->condition('uid', $account->id())->execute()); +?> From 640d5fd28c2d88ff4fdb4ff9168481b7a20158b0 Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 16:01:02 +0200 Subject: [PATCH 018/256] feat(Drupal11): Add PluginBaseIsConfigurableRector for issue #3459533 Replaces deprecated PluginBase::isConfigurable() calls with instanceof \Drupal\Component\Plugin\ConfigurableInterface checks (drupal:11.1.0, removed in drupal:12.0.0). --- config/drupal-11/drupal-11.1-deprecations.php | 6 ++ .../PluginBaseIsConfigurableRector.php | 61 +++++++++++++++++++ .../PluginBaseIsConfigurableRectorTest.php | 33 ++++++++++ .../config/configured_rule.php | 11 ++++ .../fixture/basic.php.inc | 21 +++++++ 5 files changed, 132 insertions(+) create mode 100644 src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/PluginBaseIsConfigurableRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture/basic.php.inc diff --git a/config/drupal-11/drupal-11.1-deprecations.php b/config/drupal-11/drupal-11.1-deprecations.php index 9e8660508..bf7b3823e 100644 --- a/config/drupal-11/drupal-11.1-deprecations.php +++ b/config/drupal-11/drupal-11.1-deprecations.php @@ -2,11 +2,17 @@ declare(strict_types=1); +use DrupalRector\Drupal11\Rector\Deprecation\PluginBaseIsConfigurableRector; use DrupalRector\Rector\Deprecation\MethodToMethodWithCheckRector; use DrupalRector\Rector\ValueObject\MethodToMethodWithCheckConfiguration; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { + // https://www.drupal.org/node/3459533 + // PluginBase::isConfigurable() deprecated in drupal:11.1.0, removed in drupal:12.0.0. + // Replaced by instanceof \Drupal\Component\Plugin\ConfigurableInterface. + $rectorConfig->rule(PluginBaseIsConfigurableRector::class); + // https://www.drupal.org/node/3151086 // AliasManager::pathAliasWhitelistRebuild() deprecated in drupal:11.1.0, removed in drupal:12.0.0. // Replaced by pathAliasPrefixListRebuild(). diff --git a/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector.php b/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector.php new file mode 100644 index 000000000..e7b4394b9 --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector.php @@ -0,0 +1,61 @@ +getName($node->name) !== 'isConfigurable') { + return null; + } + + if ($node->args !== []) { + return null; + } + + if (!$node->var instanceof Node\Expr\Variable) { + return null; + } + + if ($this->getName($node->var) !== 'this') { + return null; + } + + return new Node\Expr\Instanceof_( + $node->var, + new Node\Name\FullyQualified('Drupal\Component\Plugin\ConfigurableInterface') + ); + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition('Replaces deprecated PluginBase::isConfigurable() with instanceof ConfigurableInterface', [ + new CodeSample( + '$this->isConfigurable()', + '$this instanceof \Drupal\Component\Plugin\ConfigurableInterface' + ), + ]); + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/PluginBaseIsConfigurableRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/PluginBaseIsConfigurableRectorTest.php new file mode 100644 index 000000000..aa68896b5 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/PluginBaseIsConfigurableRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/config/configured_rule.php new file mode 100644 index 000000000..f7c1a3795 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/config/configured_rule.php @@ -0,0 +1,11 @@ +isConfigurable()) { + // handle configurable + } + } +} +?> +----- + From bd8c4f0b12f2a99777630581699425c2b25cfaff Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 16:02:28 +0200 Subject: [PATCH 019/256] feat(Drupal11): Add ReplaceSessionManagerDeleteRector for issue #3577376 Replaces SessionManager::delete($uid) with \Drupal::service(UserSessionRepositoryInterface::class)->deleteAll($uid), BC-wrapped for drupal:11.4.0. --- config/drupal-11/drupal-11.4-deprecations.php | 9 ++ .../ReplaceSessionManagerDeleteRector.php | 84 +++++++++++++++++++ .../ReplaceSessionManagerDeleteRectorTest.php | 33 ++++++++ .../config/configured_rule.php | 14 ++++ .../fixture/basic.php.inc | 11 +++ 5 files changed, 151 insertions(+) create mode 100644 src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/ReplaceSessionManagerDeleteRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/fixture/basic.php.inc diff --git a/config/drupal-11/drupal-11.4-deprecations.php b/config/drupal-11/drupal-11.4-deprecations.php index 5be397413..014b92c3b 100644 --- a/config/drupal-11/drupal-11.4-deprecations.php +++ b/config/drupal-11/drupal-11.4-deprecations.php @@ -2,15 +2,24 @@ declare(strict_types=1); +use DrupalRector\Drupal11\Rector\Deprecation\ReplaceSessionManagerDeleteRector; use DrupalRector\Rector\Deprecation\ClassConstantToClassConstantRector; use DrupalRector\Rector\Deprecation\FunctionToServiceRector; use DrupalRector\Rector\Deprecation\FunctionToStaticRector; use DrupalRector\Rector\ValueObject\ClassConstantToClassConstantConfiguration; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use DrupalRector\Rector\ValueObject\FunctionToServiceConfiguration; use DrupalRector\Rector\ValueObject\FunctionToStaticConfiguration; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { + // https://www.drupal.org/node/3577376 + // SessionManager::delete() deprecated in drupal:11.4.0, removed in drupal:12.0.0. + // Replaced by \Drupal\Core\Session\UserSessionRepositoryInterface::deleteAll(). + $rectorConfig->ruleWithConfiguration(ReplaceSessionManagerDeleteRector::class, [ + new DrupalIntroducedVersionConfiguration('11.4.0'), + ]); + // https://www.drupal.org/node/3550054 // CommentItemInterface::FORM_BELOW and FORM_SEPARATE_PAGE deprecated in 11.4.0, // removed in 13.0.0. Replaced by FormLocation enum cases. diff --git a/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector.php b/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector.php new file mode 100644 index 000000000..5dbcfed66 --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector.php @@ -0,0 +1,84 @@ +isName($node->name, 'delete')) { + return null; + } + + if (count($node->args) !== 1) { + return null; + } + + if (!$this->isObjectType($node->var, new ObjectType('Drupal\Core\Session\SessionManager'))) { + return null; + } + + $service = new Node\Expr\StaticCall( + new Node\Name\FullyQualified('Drupal'), + 'service', + [new Node\Arg(new Node\Expr\ClassConstFetch(new Node\Name\FullyQualified('Drupal\Core\Session\UserSessionRepositoryInterface'), 'class'))] + ); + + return new Node\Expr\MethodCall($service, 'deleteAll', [$node->args[0]]); + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition('Replaces deprecated SessionManager::delete($uid) with UserSessionRepositoryInterface service', [ + new ConfiguredCodeSample( + <<<'CODE_BEFORE' +$this->sessionManager->delete($uid); +CODE_BEFORE, + <<<'CODE_AFTER' +\Drupal::service(\Drupal\Core\Session\UserSessionRepositoryInterface::class)->deleteAll($uid); +CODE_AFTER, + [new DrupalIntroducedVersionConfiguration('11.4.0')] + ), + ]); + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/ReplaceSessionManagerDeleteRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/ReplaceSessionManagerDeleteRectorTest.php new file mode 100644 index 000000000..d39f42c80 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/ReplaceSessionManagerDeleteRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/config/configured_rule.php new file mode 100644 index 000000000..40c9952f6 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/config/configured_rule.php @@ -0,0 +1,14 @@ +delete($uid); +?> +----- + \Drupal::service(\Drupal\Core\Session\UserSessionRepositoryInterface::class)->deleteAll($uid), fn() => $session_manager->delete($uid)); +?> From e1cf641b155696bb844b255b1d6c05fe6831a522 Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 16:03:30 +0200 Subject: [PATCH 020/256] feat(Drupal11): Add StatementPrefetchIteratorFetchColumnRector for issue #3490200 Renames fetchColumn() to fetchField() on database statements, skipping PDO's native $this->clientStatement->fetchColumn() (drupal:11.2.0). --- config/drupal-11/drupal-11.2-deprecations.php | 6 ++ ...ementPrefetchIteratorFetchColumnRector.php | 55 +++++++++++++++++++ ...tPrefetchIteratorFetchColumnRectorTest.php | 33 +++++++++++ .../config/configured_rule.php | 11 ++++ .../fixture/basic.php.inc | 19 +++++++ 5 files changed, 124 insertions(+) create mode 100644 src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/StatementPrefetchIteratorFetchColumnRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture/basic.php.inc diff --git a/config/drupal-11/drupal-11.2-deprecations.php b/config/drupal-11/drupal-11.2-deprecations.php index 802b237f2..653dd4965 100644 --- a/config/drupal-11/drupal-11.2-deprecations.php +++ b/config/drupal-11/drupal-11.2-deprecations.php @@ -2,6 +2,7 @@ declare(strict_types=1); +use DrupalRector\Drupal11\Rector\Deprecation\StatementPrefetchIteratorFetchColumnRector; use DrupalRector\Rector\Deprecation\ClassConstantToClassConstantRector; use DrupalRector\Rector\Deprecation\FunctionToServiceRector; use DrupalRector\Rector\Deprecation\MethodToMethodWithCheckRector; @@ -11,6 +12,11 @@ use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { + // https://www.drupal.org/node/3490200 + // StatementPrefetchIterator::fetchColumn() deprecated in drupal:11.2.0, removed in drupal:12.0.0. + // Replaced by fetchField(). + $rectorConfig->rule(StatementPrefetchIteratorFetchColumnRector::class); + // https://www.drupal.org/node/3498947 // CacheBackendInterface::invalidateAll() deprecated in drupal:11.2.0, removed in drupal:12.0.0. // Replaced by deleteAll(). diff --git a/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector.php b/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector.php new file mode 100644 index 000000000..e4f7720f9 --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector.php @@ -0,0 +1,55 @@ +isName($node->name, 'fetchColumn')) { + return null; + } + + // Skip PDO's native fetchColumn() called on $this->clientStatement. + if ($node->var instanceof Node\Expr\PropertyFetch) { + if ($this->getName($node->var->name) === 'clientStatement') { + return null; + } + } + + $node->name = new Node\Identifier('fetchField'); + + return $node; + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition('Replaces deprecated StatementPrefetchIterator::fetchColumn() with fetchField()', [ + new CodeSample( + '$result = $statement->fetchColumn(0);', + '$result = $statement->fetchField(0);' + ), + ]); + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/StatementPrefetchIteratorFetchColumnRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/StatementPrefetchIteratorFetchColumnRectorTest.php new file mode 100644 index 000000000..af053b973 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/StatementPrefetchIteratorFetchColumnRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/config/configured_rule.php new file mode 100644 index 000000000..0c414265b --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/config/configured_rule.php @@ -0,0 +1,11 @@ +fetchColumn(0); + $other = $this->clientStatement->fetchColumn(0); + } +} +?> +----- +fetchField(0); + $other = $this->clientStatement->fetchColumn(0); + } +} +?> From fd9040b989b00bf241cc03d6e08829e8b89e7088 Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 16:04:37 +0200 Subject: [PATCH 021/256] feat(Drupal11): Add LoadAllIncludesRector for issue #3536431 Replaces ModuleHandler::loadAllIncludes() with an explicit foreach loop over getModuleList() + loadInclude() (drupal:11.3.0, removed in 13.0.0). --- config/drupal-11/drupal-11.3-deprecations.php | 6 ++ .../Deprecation/LoadAllIncludesRector.php | 72 +++++++++++++++++++ .../LoadAllIncludesRectorTest.php | 33 +++++++++ .../config/configured_rule.php | 11 +++ .../fixture/basic.php.inc | 15 ++++ 5 files changed, 137 insertions(+) create mode 100644 src/Drupal11/Rector/Deprecation/LoadAllIncludesRector.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector/LoadAllIncludesRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector/fixture/basic.php.inc diff --git a/config/drupal-11/drupal-11.3-deprecations.php b/config/drupal-11/drupal-11.3-deprecations.php index 5629c2767..ef540d63c 100644 --- a/config/drupal-11/drupal-11.3-deprecations.php +++ b/config/drupal-11/drupal-11.3-deprecations.php @@ -2,6 +2,7 @@ declare(strict_types=1); +use DrupalRector\Drupal11\Rector\Deprecation\LoadAllIncludesRector; use DrupalRector\Drupal11\Rector\Deprecation\NodeStorageDeprecatedMethodsRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceCommentManagerGetCountNewCommentsRector; use DrupalRector\Rector\Deprecation\FunctionToServiceRector; @@ -17,6 +18,11 @@ new DrupalIntroducedVersionConfiguration('11.3.0'), ]); + // https://www.drupal.org/node/3536431 + // ModuleHandler::loadAllIncludes() deprecated in drupal:11.3.0, removed in drupal:13.0.0. + // Replaced by an explicit foreach over getModuleList() + loadInclude(). + $rectorConfig->rule(LoadAllIncludesRector::class); + // https://www.drupal.org/node/3396062 // NodeStorage::revisionIds() and userRevisionIds() deprecated in drupal:11.3.0, removed in drupal:13.0.0. // Replaced by equivalent entity queries. diff --git a/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector.php b/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector.php new file mode 100644 index 000000000..2c2e7c5ad --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector.php @@ -0,0 +1,72 @@ +expr instanceof Node\Expr\MethodCall) { + return null; + } + + $methodCall = $node->expr; + + if (!$this->isName($methodCall->name, 'loadAllIncludes')) { + return null; + } + + $caller = $methodCall->var; + $getModuleListCall = new Node\Expr\MethodCall(clone $caller, 'getModuleList'); + + $moduleVar = new Node\Expr\Variable('module'); + $filenameVar = new Node\Expr\Variable('filename'); + + $loadIncludeArgs = [new Node\Arg($moduleVar)]; + foreach ($methodCall->args as $arg) { + $loadIncludeArgs[] = $arg; + } + + $loadIncludeCall = new Node\Expr\MethodCall(clone $caller, 'loadInclude', $loadIncludeArgs); + + return new Node\Stmt\Foreach_( + $getModuleListCall, + $filenameVar, + [ + 'keyVar' => $moduleVar, + 'stmts' => [new Node\Stmt\Expression($loadIncludeCall)], + ] + ); + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition('Replaces deprecated ModuleHandler::loadAllIncludes() with getModuleList() + loadInclude() loop', [ + new CodeSample( + "\$this->moduleHandler->loadAllIncludes('install');", + "foreach (\$this->moduleHandler->getModuleList() as \$module => \$filename) {\n \$this->moduleHandler->loadInclude(\$module, 'install');\n}" + ), + ]); + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector/LoadAllIncludesRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector/LoadAllIncludesRectorTest.php new file mode 100644 index 000000000..f257e76d2 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector/LoadAllIncludesRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector/config/configured_rule.php new file mode 100644 index 000000000..39cd8152e --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector/config/configured_rule.php @@ -0,0 +1,11 @@ +moduleHandler->loadAllIncludes('install'); +$this->moduleHandler->loadAllIncludes('inc', 'admin'); +?> +----- +moduleHandler->getModuleList() as $module => $filename) { + $this->moduleHandler->loadInclude($module, 'install'); +} +foreach ($this->moduleHandler->getModuleList() as $module => $filename) { + $this->moduleHandler->loadInclude($module, 'inc', 'admin'); +} +?> From f7fece62821cb2b3ee6496ec94e587e38e47ed46 Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 16:07:07 +0200 Subject: [PATCH 022/256] feat: Add ReplaceRebuildThemeDataRector and ViewsPluginHandlerManagerRector - ReplaceRebuildThemeDataRector: replaces ThemeHandlerInterface::rebuildThemeData() with extension.list.theme service chain (drupal:10.3.0, issue #3571068) - ViewsPluginHandlerManagerRector: replaces Views::pluginManager() and Views::handlerManager() with Drupal::service() equivalents (drupal:11.4.0, issue #3566424) --- config/drupal-10/drupal-10.3-deprecations.php | 8 ++ config/drupal-11/drupal-11.4-deprecations.php | 6 ++ .../ReplaceRebuildThemeDataRector.php | 81 +++++++++++++++++++ .../ViewsPluginHandlerManagerRector.php | 77 ++++++++++++++++++ .../ReplaceRebuildThemeDataRectorTest.php | 33 ++++++++ .../config/configured_rule.php | 14 ++++ .../fixture/basic.php.inc | 11 +++ .../ViewsPluginHandlerManagerRectorTest.php | 33 ++++++++ .../config/configured_rule.php | 11 +++ .../fixture/basic.php.inc | 19 +++++ 10 files changed, 293 insertions(+) create mode 100644 src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector.php create mode 100644 src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector.php create mode 100644 tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/ReplaceRebuildThemeDataRectorTest.php create mode 100644 tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/config/configured_rule.php create mode 100644 tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/fixture/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/ViewsPluginHandlerManagerRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/fixture/basic.php.inc diff --git a/config/drupal-10/drupal-10.3-deprecations.php b/config/drupal-10/drupal-10.3-deprecations.php index 7e968c035..6244bc191 100644 --- a/config/drupal-10/drupal-10.3-deprecations.php +++ b/config/drupal-10/drupal-10.3-deprecations.php @@ -3,6 +3,7 @@ declare(strict_types=1); use DrupalRector\Drupal10\Rector\Deprecation\ReplaceModuleHandlerGetNameRector; +use DrupalRector\Drupal10\Rector\Deprecation\ReplaceRebuildThemeDataRector; use DrupalRector\Rector\Deprecation\ClassConstantToClassConstantRector; use DrupalRector\Rector\Deprecation\FunctionToStaticRector; use DrupalRector\Rector\ValueObject\ClassConstantToClassConstantConfiguration; @@ -17,6 +18,13 @@ new FunctionToStaticConfiguration('10.3.0', 'file_icon_map', 'Drupal\file\IconMimeTypes', 'getGenericMimeType'), ]); + // https://www.drupal.org/node/3571068 + // ThemeHandlerInterface::rebuildThemeData() deprecated in drupal:10.3.0, removed in drupal:12.0.0. + // Replaced by \Drupal::service('extension.list.theme')->reset()->getList(). + $rectorConfig->ruleWithConfiguration(ReplaceRebuildThemeDataRector::class, [ + new DrupalIntroducedVersionConfiguration('10.3.0'), + ]); + // https://www.drupal.org/node/3571063 // ModuleHandlerInterface::getName() deprecated in drupal:10.3.0, removed in drupal:12.0.0. $rectorConfig->ruleWithConfiguration(ReplaceModuleHandlerGetNameRector::class, [ diff --git a/config/drupal-11/drupal-11.4-deprecations.php b/config/drupal-11/drupal-11.4-deprecations.php index 014b92c3b..be63a49ce 100644 --- a/config/drupal-11/drupal-11.4-deprecations.php +++ b/config/drupal-11/drupal-11.4-deprecations.php @@ -3,6 +3,7 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\ReplaceSessionManagerDeleteRector; +use DrupalRector\Drupal11\Rector\Deprecation\ViewsPluginHandlerManagerRector; use DrupalRector\Rector\Deprecation\ClassConstantToClassConstantRector; use DrupalRector\Rector\Deprecation\FunctionToServiceRector; use DrupalRector\Rector\Deprecation\FunctionToStaticRector; @@ -13,6 +14,11 @@ use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { + // https://www.drupal.org/node/3566424 + // Views::pluginManager() and Views::handlerManager() deprecated in drupal:11.4.0, removed in drupal:13.0.0. + // Replaced by \Drupal::service('plugin.manager.views.*') or views.plugin_managers service. + $rectorConfig->rule(ViewsPluginHandlerManagerRector::class); + // https://www.drupal.org/node/3577376 // SessionManager::delete() deprecated in drupal:11.4.0, removed in drupal:12.0.0. // Replaced by \Drupal\Core\Session\UserSessionRepositoryInterface::deleteAll(). diff --git a/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector.php b/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector.php new file mode 100644 index 000000000..d3d59453f --- /dev/null +++ b/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector.php @@ -0,0 +1,81 @@ +isName($node->name, 'rebuildThemeData')) { + return null; + } + + if (!empty($node->args)) { + return null; + } + + $service = new Node\Expr\StaticCall( + new Node\Name\FullyQualified('Drupal'), + 'service', + [new Node\Arg(new Node\Scalar\String_('extension.list.theme'))] + ); + + $reset = new Node\Expr\MethodCall($service, 'reset'); + + return new Node\Expr\MethodCall($reset, 'getList'); + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition("Replaces removed ThemeHandlerInterface::rebuildThemeData() with \\Drupal::service('extension.list.theme')->reset()->getList()", [ + new ConfiguredCodeSample( + <<<'CODE_BEFORE' +$this->themeHandler->rebuildThemeData(); +CODE_BEFORE, + <<<'CODE_AFTER' +\Drupal::service('extension.list.theme')->reset()->getList(); +CODE_AFTER, + [new DrupalIntroducedVersionConfiguration('10.3.0')] + ), + ]); + } +} diff --git a/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector.php b/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector.php new file mode 100644 index 000000000..3002362f4 --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector.php @@ -0,0 +1,77 @@ +isName($node->class, 'Drupal\views\Views')) { + return null; + } + + $methodName = $this->getName($node->name); + if ($methodName !== 'pluginManager' && $methodName !== 'handlerManager') { + return null; + } + + if (count($node->args) === 0) { + return null; + } + + $arg = $node->args[0]; + if (!$arg instanceof Node\Arg) { + return null; + } + + $typeExpr = $arg->value; + $drupalClass = new Node\Name\FullyQualified('Drupal'); + + if ($typeExpr instanceof Node\Scalar\String_) { + return new Node\Expr\StaticCall( + $drupalClass, + 'service', + [new Node\Arg(new Node\Scalar\String_('plugin.manager.views.' . $typeExpr->value))] + ); + } + + $serviceLocatorCall = new Node\Expr\StaticCall( + $drupalClass, + 'service', + [new Node\Arg(new Node\Scalar\String_('views.plugin_managers'))] + ); + + return new Node\Expr\MethodCall($serviceLocatorCall, 'get', [new Node\Arg($typeExpr)]); + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition('Replaces deprecated Views::pluginManager() and Views::handlerManager() with \\Drupal::service() equivalents', [ + new CodeSample( + "Views::handlerManager('filter');\nViews::pluginManager(\$type);", + "\\Drupal::service('plugin.manager.views.filter');\n\\Drupal::service('views.plugin_managers')->get(\$type);" + ), + ]); + } +} diff --git a/tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/ReplaceRebuildThemeDataRectorTest.php b/tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/ReplaceRebuildThemeDataRectorTest.php new file mode 100644 index 000000000..545c14647 --- /dev/null +++ b/tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/ReplaceRebuildThemeDataRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/config/configured_rule.php b/tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/config/configured_rule.php new file mode 100644 index 000000000..e861c7f4a --- /dev/null +++ b/tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/config/configured_rule.php @@ -0,0 +1,14 @@ +rebuildThemeData(); +?> +----- + \Drupal::service('extension.list.theme')->reset()->getList(), fn() => $theme_handler->rebuildThemeData()); +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/ViewsPluginHandlerManagerRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/ViewsPluginHandlerManagerRectorTest.php new file mode 100644 index 000000000..cc577b0e5 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/ViewsPluginHandlerManagerRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/config/configured_rule.php new file mode 100644 index 000000000..fe54899d0 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/config/configured_rule.php @@ -0,0 +1,11 @@ + +----- +get($type); +?> From d59de7187f6217494cb78d55614da7386a1d9704 Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 16:28:55 +0200 Subject: [PATCH 023/256] feat: Add generic FunctionCallRemovalRector for deprecated function call removal MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Handles 11 deprecated Drupal functions across versions 11.2–11.4 that have been removed with no direct replacement, using a configurable accumulation pattern so multiple version config files can each add their function list. --- .../Deprecation/FunctionCallRemovalRector.php | 73 +++++++++++++++++++ .../FunctionCallRemovalConfiguration.php | 17 +++++ .../FunctionCallRemovalRectorTest.php | 33 +++++++++ .../config/configured_rule.php | 24 ++++++ .../fixture/basic.php.inc | 24 ++++++ 5 files changed, 171 insertions(+) create mode 100644 src/Rector/Deprecation/FunctionCallRemovalRector.php create mode 100644 src/Rector/ValueObject/FunctionCallRemovalConfiguration.php create mode 100644 tests/src/Rector/Deprecation/FunctionCallRemovalRector/FunctionCallRemovalRectorTest.php create mode 100644 tests/src/Rector/Deprecation/FunctionCallRemovalRector/config/configured_rule.php create mode 100644 tests/src/Rector/Deprecation/FunctionCallRemovalRector/fixture/basic.php.inc diff --git a/src/Rector/Deprecation/FunctionCallRemovalRector.php b/src/Rector/Deprecation/FunctionCallRemovalRector.php new file mode 100644 index 000000000..0c7ab8d04 --- /dev/null +++ b/src/Rector/Deprecation/FunctionCallRemovalRector.php @@ -0,0 +1,73 @@ +configuration = array_merge($this->configuration, $configuration); + } + + public function getNodeTypes(): array + { + return [Node\Stmt\Expression::class]; + } + + public function refactor(Node $node): mixed + { + assert($node instanceof Node\Stmt\Expression); + + if (!$node->expr instanceof Node\Expr\FuncCall) { + return null; + } + + $name = $this->getName($node->expr); + if ($name === null) { + return null; + } + + foreach ($this->configuration as $configuration) { + if ($name === $configuration->getFunctionName()) { + return NodeVisitor::REMOVE_NODE; + } + } + + return null; + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition('Removes deprecated function call statements that have no replacement', [ + new ConfiguredCodeSample( + 'deprecated_function();', + '', + [new FunctionCallRemovalConfiguration('deprecated_function')] + ), + ]); + } +} diff --git a/src/Rector/ValueObject/FunctionCallRemovalConfiguration.php b/src/Rector/ValueObject/FunctionCallRemovalConfiguration.php new file mode 100644 index 000000000..ffbbd9510 --- /dev/null +++ b/src/Rector/ValueObject/FunctionCallRemovalConfiguration.php @@ -0,0 +1,17 @@ +functionName; + } +} diff --git a/tests/src/Rector/Deprecation/FunctionCallRemovalRector/FunctionCallRemovalRectorTest.php b/tests/src/Rector/Deprecation/FunctionCallRemovalRector/FunctionCallRemovalRectorTest.php new file mode 100644 index 000000000..2d6308c9b --- /dev/null +++ b/tests/src/Rector/Deprecation/FunctionCallRemovalRector/FunctionCallRemovalRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Rector/Deprecation/FunctionCallRemovalRector/config/configured_rule.php b/tests/src/Rector/Deprecation/FunctionCallRemovalRector/config/configured_rule.php new file mode 100644 index 000000000..06460cb8d --- /dev/null +++ b/tests/src/Rector/Deprecation/FunctionCallRemovalRector/config/configured_rule.php @@ -0,0 +1,24 @@ + +----- + From 6cdc00faeac1f899425ff6ab3e1d015bdda763ae Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 16:29:00 +0200 Subject: [PATCH 024/256] feat(Drupal11): Add RemoveStateCacheSettingRector for state_cache setting removal MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit $settings['state_cache'] deprecated in drupal:11.0.0 — state caching is permanently enabled. Adds drupal-11.0-deprecations.php config file and DRUPAL_110 set list constant. --- config/drupal-11/drupal-11.0-deprecations.php | 13 ++++ .../RemoveStateCacheSettingRector.php | 68 +++++++++++++++++++ src/Set/Drupal11SetList.php | 1 + .../RemoveStateCacheSettingRectorTest.php | 33 +++++++++ .../config/configured_rule.php | 10 +++ .../fixture/basic.php.inc | 12 ++++ 6 files changed, 137 insertions(+) create mode 100644 config/drupal-11/drupal-11.0-deprecations.php create mode 100644 src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector/RemoveStateCacheSettingRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector/fixture/basic.php.inc diff --git a/config/drupal-11/drupal-11.0-deprecations.php b/config/drupal-11/drupal-11.0-deprecations.php new file mode 100644 index 000000000..122253445 --- /dev/null +++ b/config/drupal-11/drupal-11.0-deprecations.php @@ -0,0 +1,13 @@ +rule(RemoveStateCacheSettingRector::class); +}; diff --git a/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector.php b/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector.php new file mode 100644 index 000000000..cf284e22c --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector.php @@ -0,0 +1,68 @@ +expr instanceof Node\Expr\Assign) { + return null; + } + + $assign = $node->expr; + + if (!$assign->var instanceof Node\Expr\ArrayDimFetch) { + return null; + } + + $arrayDimFetch = $assign->var; + + if (!$this->isName($arrayDimFetch->var, 'settings')) { + return null; + } + + if (!$arrayDimFetch->dim instanceof Node\Scalar\String_) { + return null; + } + + if ($arrayDimFetch->dim->value !== 'state_cache') { + return null; + } + + return NodeVisitor::REMOVE_NODE; + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition("Removes deprecated \$settings['state_cache'] assignments. State caching is permanently enabled since drupal:11.0.0 and the setting has no effect", [ + new CodeSample( + "\$settings['state_cache'] = TRUE;", + '' + ), + ]); + } +} diff --git a/src/Set/Drupal11SetList.php b/src/Set/Drupal11SetList.php index fe83c73aa..d01d169b4 100644 --- a/src/Set/Drupal11SetList.php +++ b/src/Set/Drupal11SetList.php @@ -7,6 +7,7 @@ final class Drupal11SetList { public const DRUPAL_11 = __DIR__.'/../../config/drupal-11/drupal-11-all-deprecations.php'; + public const DRUPAL_110 = __DIR__.'/../../config/drupal-11/drupal-11.0-deprecations.php'; public const DRUPAL_111 = __DIR__.'/../../config/drupal-11/drupal-11.1-deprecations.php'; public const DRUPAL_112 = __DIR__.'/../../config/drupal-11/drupal-11.2-deprecations.php'; public const DRUPAL_113 = __DIR__.'/../../config/drupal-11/drupal-11.3-deprecations.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector/RemoveStateCacheSettingRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector/RemoveStateCacheSettingRectorTest.php new file mode 100644 index 000000000..2146aa965 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector/RemoveStateCacheSettingRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector/config/configured_rule.php new file mode 100644 index 000000000..694ad2d16 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector/config/configured_rule.php @@ -0,0 +1,10 @@ +rule(RemoveStateCacheSettingRector::class); +}; diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector/fixture/basic.php.inc new file mode 100644 index 000000000..820d68f39 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector/fixture/basic.php.inc @@ -0,0 +1,12 @@ + +----- + From 2950c7785a1aae489b4f10792288f32f3395e2ee Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 16:29:04 +0200 Subject: [PATCH 025/256] feat(Drupal11): Add RemoveModuleHandlerAddModuleCallsRector ModuleHandlerInterface::addModule() and addProfile() are no-ops since drupal:11.2.0 and removed in drupal:12.0.0. Uses isObjectType() type check to target only calls on ModuleHandlerInterface implementors. --- ...emoveModuleHandlerAddModuleCallsRector.php | 58 +++++++++++++++++++ ...eModuleHandlerAddModuleCallsRectorTest.php | 33 +++++++++++ .../config/configured_rule.php | 11 ++++ .../fixture/basic.php.inc | 12 ++++ 4 files changed, 114 insertions(+) create mode 100644 src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector/RemoveModuleHandlerAddModuleCallsRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector/fixture/basic.php.inc diff --git a/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector.php b/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector.php new file mode 100644 index 000000000..17309b3bb --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector.php @@ -0,0 +1,58 @@ +expr instanceof Node\Expr\MethodCall) { + return null; + } + + $methodCall = $node->expr; + + if (!$this->isNames($methodCall->name, ['addModule', 'addProfile'])) { + return null; + } + + if (!$this->isObjectType($methodCall->var, new ObjectType('Drupal\Core\Extension\ModuleHandlerInterface'))) { + return null; + } + + return NodeVisitor::REMOVE_NODE; + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition('Removes deprecated ModuleHandlerInterface::addModule() and addProfile() calls, which are no-ops since drupal:11.2.0 and removed in drupal:12.0.0', [ + new CodeSample( + "\$moduleHandler->addModule('mymodule', 'modules/mymodule');", + '' + ), + ]); + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector/RemoveModuleHandlerAddModuleCallsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector/RemoveModuleHandlerAddModuleCallsRectorTest.php new file mode 100644 index 000000000..b7e0ec4c9 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector/RemoveModuleHandlerAddModuleCallsRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector/config/configured_rule.php new file mode 100644 index 000000000..211c18af3 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector/config/configured_rule.php @@ -0,0 +1,11 @@ +addModule('mymodule', 'modules/mymodule'); +$module_handler->addProfile('standard', 'core/profiles/standard'); +$module_handler->moduleExists('mymodule'); +?> +----- +moduleExists('mymodule'); +?> From 145cde0ff7a6fe0a794fb58e96e952ef61787170 Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 16:29:10 +0200 Subject: [PATCH 026/256] feat(Drupal11): Add RemoveLinkWidgetValidateTitleElementRector LinkWidget::validateTitleElement() deprecated in drupal:11.4.0, removed in drupal:12.0.0. Validation is now handled by LinkTitleRequiredConstraint on the LinkItem field type. --- ...veLinkWidgetValidateTitleElementRector.php | 58 +++++++++++++++++++ ...nkWidgetValidateTitleElementRectorTest.php | 33 +++++++++++ .../config/configured_rule.php | 11 ++++ .../fixture/basic.php.inc | 13 +++++ 4 files changed, 115 insertions(+) create mode 100644 src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector/RemoveLinkWidgetValidateTitleElementRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector/fixture/basic.php.inc diff --git a/src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector.php b/src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector.php new file mode 100644 index 000000000..d7f0433b7 --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector.php @@ -0,0 +1,58 @@ +expr instanceof Node\Expr\StaticCall) { + return null; + } + + $staticCall = $node->expr; + + if (!$this->isName($staticCall->name, 'validateTitleElement')) { + return null; + } + + if (!$this->isName($staticCall->class, 'Drupal\link\Plugin\Field\FieldWidget\LinkWidget')) { + return null; + } + + return NodeVisitor::REMOVE_NODE; + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition('Removes deprecated LinkWidget::validateTitleElement() calls. Validation is now handled by LinkTitleRequiredConstraint on the LinkItem field type (drupal:11.4.0)', [ + new CodeSample( + 'LinkWidget::validateTitleElement($element, $form_state, $form);', + '' + ), + ]); + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector/RemoveLinkWidgetValidateTitleElementRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector/RemoveLinkWidgetValidateTitleElementRectorTest.php new file mode 100644 index 000000000..c7877f113 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector/RemoveLinkWidgetValidateTitleElementRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector/config/configured_rule.php new file mode 100644 index 000000000..8cc290f6c --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector/config/configured_rule.php @@ -0,0 +1,11 @@ + +----- + From ccfa16e3302f8906a71198c26d5094fc0105fbea Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 16:29:15 +0200 Subject: [PATCH 027/256] feat(Drupal11): Add RemoveAutomatedCronSubmitHandlerRector \$form['#submit'][] = 'automated_cron_settings_submit' deprecated in drupal:11.4.0, removed in drupal:13.0.0. Config saving is now handled automatically via #config_target on the interval element. --- ...RemoveAutomatedCronSubmitHandlerRector.php | 67 +++++++++++++++++++ ...veAutomatedCronSubmitHandlerRectorTest.php | 33 +++++++++ .../config/configured_rule.php | 10 +++ .../fixture/basic.php.inc | 12 ++++ 4 files changed, 122 insertions(+) create mode 100644 src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector/RemoveAutomatedCronSubmitHandlerRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector/fixture/basic.php.inc diff --git a/src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector.php b/src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector.php new file mode 100644 index 000000000..b3d2e3945 --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector.php @@ -0,0 +1,67 @@ +expr instanceof Node\Expr\Assign) { + return null; + } + + $assign = $node->expr; + + if (!$assign->expr instanceof Node\Scalar\String_) { + return null; + } + + if ($assign->expr->value !== 'automated_cron_settings_submit') { + return null; + } + + // Must be an array append ([] = ...) with no explicit index. + if (!$assign->var instanceof Node\Expr\ArrayDimFetch) { + return null; + } + + if ($assign->var->dim !== null) { + return null; + } + + return NodeVisitor::REMOVE_NODE; + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition("Removes deprecated \$form['#submit'][] = 'automated_cron_settings_submit' handler assignments (drupal:11.4.0)", [ + new CodeSample( + "\$form['#submit'][] = 'automated_cron_settings_submit';", + '' + ), + ]); + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector/RemoveAutomatedCronSubmitHandlerRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector/RemoveAutomatedCronSubmitHandlerRectorTest.php new file mode 100644 index 000000000..942f531db --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector/RemoveAutomatedCronSubmitHandlerRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector/config/configured_rule.php new file mode 100644 index 000000000..a907dc9cc --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector/config/configured_rule.php @@ -0,0 +1,10 @@ +rule(RemoveAutomatedCronSubmitHandlerRector::class); +}; diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector/fixture/basic.php.inc new file mode 100644 index 000000000..f7de24077 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector/fixture/basic.php.inc @@ -0,0 +1,12 @@ + +----- + From fbd0718869e7d6ca200d5bbcf3ce6375a4b02ad6 Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 16:29:22 +0200 Subject: [PATCH 028/256] feat: Wire Phase 3 removal rectors into drupal-11.x deprecation configs - drupal-11.2: FunctionCallRemovalRector (template_preprocess, 5 update manager funcs), RemoveModuleHandlerAddModuleCallsRector - drupal-11.3: FunctionCallRemovalRector (block_content_add_body_field) - drupal-11.4: FunctionCallRemovalRector (views_ui contextual suppress funcs, automated_cron_settings_submit), RemoveLinkWidgetValidateTitleElementRector, RemoveAutomatedCronSubmitHandlerRector --- config/drupal-11/drupal-11.2-deprecations.php | 23 ++++++++++++++++ config/drupal-11/drupal-11.3-deprecations.php | 9 +++++++ config/drupal-11/drupal-11.4-deprecations.php | 27 +++++++++++++++++++ 3 files changed, 59 insertions(+) diff --git a/config/drupal-11/drupal-11.2-deprecations.php b/config/drupal-11/drupal-11.2-deprecations.php index 653dd4965..2f78721a3 100644 --- a/config/drupal-11/drupal-11.2-deprecations.php +++ b/config/drupal-11/drupal-11.2-deprecations.php @@ -2,11 +2,14 @@ declare(strict_types=1); +use DrupalRector\Drupal11\Rector\Deprecation\RemoveModuleHandlerAddModuleCallsRector; use DrupalRector\Drupal11\Rector\Deprecation\StatementPrefetchIteratorFetchColumnRector; use DrupalRector\Rector\Deprecation\ClassConstantToClassConstantRector; +use DrupalRector\Rector\Deprecation\FunctionCallRemovalRector; use DrupalRector\Rector\Deprecation\FunctionToServiceRector; use DrupalRector\Rector\Deprecation\MethodToMethodWithCheckRector; use DrupalRector\Rector\ValueObject\ClassConstantToClassConstantConfiguration; +use DrupalRector\Rector\ValueObject\FunctionCallRemovalConfiguration; use DrupalRector\Rector\ValueObject\FunctionToServiceConfiguration; use DrupalRector\Rector\ValueObject\MethodToMethodWithCheckConfiguration; use Rector\Config\RectorConfig; @@ -37,6 +40,26 @@ new FunctionToServiceConfiguration('11.2.0', 'template_preprocess_page', 'Drupal\Core\Theme\ThemePreprocess', 'preprocessPage'), ]); + // https://www.drupal.org/node/3501136 + // template_preprocess() deprecated in drupal:11.2.0, removed in drupal:12.0.0. + // https://www.drupal.org/node/3499559 + // update_clear_update_disk_cache(), update_delete_file_if_stale(), + // _update_manager_cache_directory(), _update_manager_extract_directory(), + // and _update_manager_unique_identifier() deprecated in drupal:11.2.0, removed in drupal:13.0.0. + $rectorConfig->ruleWithConfiguration(FunctionCallRemovalRector::class, [ + new FunctionCallRemovalConfiguration('template_preprocess'), + new FunctionCallRemovalConfiguration('update_clear_update_disk_cache'), + new FunctionCallRemovalConfiguration('update_delete_file_if_stale'), + new FunctionCallRemovalConfiguration('_update_manager_cache_directory'), + new FunctionCallRemovalConfiguration('_update_manager_extract_directory'), + new FunctionCallRemovalConfiguration('_update_manager_unique_identifier'), + ]); + + // https://www.drupal.org/node/3528899 + // ModuleHandlerInterface::addModule() and addProfile() deprecated in drupal:11.2.0, removed in drupal:12.0.0. + // These methods are no-ops and can be removed. + $rectorConfig->rule(RemoveModuleHandlerAddModuleCallsRector::class); + // https://www.drupal.org/node/3575841 // SystemManager::REQUIREMENT_* deprecated in drupal:11.2.0, removed in drupal:12.0.0. // Replaced by \Drupal\Core\Extension\Requirement\RequirementSeverity enum cases. diff --git a/config/drupal-11/drupal-11.3-deprecations.php b/config/drupal-11/drupal-11.3-deprecations.php index ef540d63c..4945d6576 100644 --- a/config/drupal-11/drupal-11.3-deprecations.php +++ b/config/drupal-11/drupal-11.3-deprecations.php @@ -5,8 +5,10 @@ use DrupalRector\Drupal11\Rector\Deprecation\LoadAllIncludesRector; use DrupalRector\Drupal11\Rector\Deprecation\NodeStorageDeprecatedMethodsRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceCommentManagerGetCountNewCommentsRector; +use DrupalRector\Rector\Deprecation\FunctionCallRemovalRector; use DrupalRector\Rector\Deprecation\FunctionToServiceRector; use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; +use DrupalRector\Rector\ValueObject\FunctionCallRemovalConfiguration; use DrupalRector\Rector\ValueObject\FunctionToServiceConfiguration; use Rector\Config\RectorConfig; @@ -34,4 +36,11 @@ $rectorConfig->ruleWithConfiguration(FunctionToServiceRector::class, [ new FunctionToServiceConfiguration('11.3.0', 'node_mass_update', 'Drupal\node\NodeBulkUpdate', 'process'), ]); + + // https://www.drupal.org/node/3504005 + // block_content_add_body_field() deprecated in drupal:11.3.0, removed in drupal:13.0.0. + // The body field is now added via config. + $rectorConfig->ruleWithConfiguration(FunctionCallRemovalRector::class, [ + new FunctionCallRemovalConfiguration('block_content_add_body_field'), + ]); }; diff --git a/config/drupal-11/drupal-11.4-deprecations.php b/config/drupal-11/drupal-11.4-deprecations.php index be63a49ce..58fc538e3 100644 --- a/config/drupal-11/drupal-11.4-deprecations.php +++ b/config/drupal-11/drupal-11.4-deprecations.php @@ -2,13 +2,17 @@ declare(strict_types=1); +use DrupalRector\Drupal11\Rector\Deprecation\RemoveAutomatedCronSubmitHandlerRector; +use DrupalRector\Drupal11\Rector\Deprecation\RemoveLinkWidgetValidateTitleElementRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceSessionManagerDeleteRector; use DrupalRector\Drupal11\Rector\Deprecation\ViewsPluginHandlerManagerRector; use DrupalRector\Rector\Deprecation\ClassConstantToClassConstantRector; +use DrupalRector\Rector\Deprecation\FunctionCallRemovalRector; use DrupalRector\Rector\Deprecation\FunctionToServiceRector; use DrupalRector\Rector\Deprecation\FunctionToStaticRector; use DrupalRector\Rector\ValueObject\ClassConstantToClassConstantConfiguration; use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; +use DrupalRector\Rector\ValueObject\FunctionCallRemovalConfiguration; use DrupalRector\Rector\ValueObject\FunctionToServiceConfiguration; use DrupalRector\Rector\ValueObject\FunctionToStaticConfiguration; use Rector\Config\RectorConfig; @@ -144,6 +148,29 @@ new FunctionToServiceConfiguration('11.4.0', 'user_form_process_password_confirm', 'Drupal\user\Hook\UserThemeHooks', 'processPasswordConfirm'), ]); + // https://www.drupal.org/node/3035340 + // views_ui_contextual_links_suppress*() deprecated in drupal:11.4.0, removed in drupal:13.0.0. + // These are no-ops and can be removed. + // https://www.drupal.org/node/3566768 + // automated_cron_settings_submit() deprecated in drupal:11.4.0, removed in drupal:13.0.0. + // Config saving is now handled automatically via #config_target on the interval element. + $rectorConfig->ruleWithConfiguration(FunctionCallRemovalRector::class, [ + new FunctionCallRemovalConfiguration('views_ui_contextual_links_suppress'), + new FunctionCallRemovalConfiguration('views_ui_contextual_links_suppress_push'), + new FunctionCallRemovalConfiguration('views_ui_contextual_links_suppress_pop'), + new FunctionCallRemovalConfiguration('automated_cron_settings_submit'), + ]); + + // https://www.drupal.org/node/3093118 + // LinkWidget::validateTitleElement() deprecated in drupal:11.4.0, removed in drupal:12.0.0. + // Validation is now handled by LinkTitleRequiredConstraint on the LinkItem field type. + $rectorConfig->rule(RemoveLinkWidgetValidateTitleElementRector::class); + + // https://www.drupal.org/node/3566768 + // $form['#submit'][] = 'automated_cron_settings_submit' deprecated in drupal:11.4.0, removed in drupal:13.0.0. + // Config saving is now handled automatically via #config_target on the interval element. + $rectorConfig->rule(RemoveAutomatedCronSubmitHandlerRector::class); + // https://www.drupal.org/node/3574727 // language_configuration_element_submit() deprecated in 11.4.0, removed in 13.0.0. // Replaced by LanguageConfiguration::submit(). From 0063d8795ec493563699eb912c66c6e1212d7889 Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 19:27:06 +0200 Subject: [PATCH 029/256] feat(Drupal10): Add ReplaceRequestTimeConstantRector REQUEST_TIME constant was deprecated in drupal:8.3.0 and removed in drupal:11.0.0. Replaces all uses with \Drupal::time()->getRequestTime(). --- config/drupal-11/drupal-11.0-deprecations.php | 6 +++ .../ReplaceRequestTimeConstantRector.php | 51 +++++++++++++++++++ .../ReplaceRequestTimeConstantRectorTest.php | 33 ++++++++++++ .../config/configured_rule.php | 10 ++++ .../fixture/basic.php.inc | 13 +++++ 5 files changed, 113 insertions(+) create mode 100644 src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector.php create mode 100644 tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/ReplaceRequestTimeConstantRectorTest.php create mode 100644 tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/config/configured_rule.php create mode 100644 tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/fixture/basic.php.inc diff --git a/config/drupal-11/drupal-11.0-deprecations.php b/config/drupal-11/drupal-11.0-deprecations.php index 122253445..5135a25af 100644 --- a/config/drupal-11/drupal-11.0-deprecations.php +++ b/config/drupal-11/drupal-11.0-deprecations.php @@ -2,6 +2,7 @@ declare(strict_types=1); +use DrupalRector\Drupal10\Rector\Deprecation\ReplaceRequestTimeConstantRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveStateCacheSettingRector; use Rector\Config\RectorConfig; @@ -10,4 +11,9 @@ // $settings['state_cache'] deprecated in drupal:11.0.0. // State caching is now permanently enabled and the setting has no effect. $rectorConfig->rule(RemoveStateCacheSettingRector::class); + + // https://www.drupal.org/node/3395986 + // REQUEST_TIME constant deprecated in drupal:8.3.0, removed in drupal:11.0.0. + // Replaced by \Drupal::time()->getRequestTime(). + $rectorConfig->rule(ReplaceRequestTimeConstantRector::class); }; diff --git a/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector.php b/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector.php new file mode 100644 index 000000000..a0fb0cdc6 --- /dev/null +++ b/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector.php @@ -0,0 +1,51 @@ +getRequestTime(). + * + * Deprecated in drupal:8.3.0, removed in drupal:11.0.0. + * + * @see https://www.drupal.org/node/3395986 + */ +final class ReplaceRequestTimeConstantRector extends AbstractRector +{ + public function getNodeTypes(): array + { + return [Node\Expr\ConstFetch::class]; + } + + public function refactor(Node $node): mixed + { + assert($node instanceof Node\Expr\ConstFetch); + + if (!$this->isName($node, 'REQUEST_TIME')) { + return null; + } + + $staticCall = new Node\Expr\StaticCall( + new Node\Name\FullyQualified('Drupal'), + new Node\Identifier('time') + ); + + return new Node\Expr\MethodCall($staticCall, new Node\Identifier('getRequestTime')); + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition('Replace deprecated REQUEST_TIME constant with \\Drupal::time()->getRequestTime() (deprecated drupal:8.3.0, removed drupal:11.0.0)', [ + new CodeSample( + '$cutoff = REQUEST_TIME - $lifespan;', + '$cutoff = \\Drupal::time()->getRequestTime() - $lifespan;' + ), + ]); + } +} diff --git a/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/ReplaceRequestTimeConstantRectorTest.php b/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/ReplaceRequestTimeConstantRectorTest.php new file mode 100644 index 000000000..5cba0795c --- /dev/null +++ b/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/ReplaceRequestTimeConstantRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/config/configured_rule.php b/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/config/configured_rule.php new file mode 100644 index 000000000..47f8697e1 --- /dev/null +++ b/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/config/configured_rule.php @@ -0,0 +1,10 @@ +rule(ReplaceRequestTimeConstantRector::class); +}; diff --git a/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/fixture/basic.php.inc b/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/fixture/basic.php.inc new file mode 100644 index 000000000..ef05283f6 --- /dev/null +++ b/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/fixture/basic.php.inc @@ -0,0 +1,13 @@ + +----- +getRequestTime() - $lifespan; +$other = time(); + +?> From 1cf1cb5170a114b2fe1b30a065924b6cbb40ad5f Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 19:27:11 +0200 Subject: [PATCH 030/256] feat(Drupal11): Add ReplaceJsonApiFilterConstantsRector JSONAPI_FILTER_AMONG_* global constants deprecated in drupal:11.3.0, removed in drupal:13.0.0. Replaced by \Drupal\jsonapi\JsonApiFilter::AMONG_* class constants. --- .../ReplaceJsonApiFilterConstantsRector.php | 57 +++++++++++++++++++ ...eplaceJsonApiFilterConstantsRectorTest.php | 33 +++++++++++ .../config/configured_rule.php | 10 ++++ .../fixture/basic.php.inc | 21 +++++++ 4 files changed, 121 insertions(+) create mode 100644 src/Drupal11/Rector/Deprecation/ReplaceJsonApiFilterConstantsRector.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceJsonApiFilterConstantsRector/ReplaceJsonApiFilterConstantsRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceJsonApiFilterConstantsRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceJsonApiFilterConstantsRector/fixture/basic.php.inc diff --git a/src/Drupal11/Rector/Deprecation/ReplaceJsonApiFilterConstantsRector.php b/src/Drupal11/Rector/Deprecation/ReplaceJsonApiFilterConstantsRector.php new file mode 100644 index 000000000..9af896f82 --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/ReplaceJsonApiFilterConstantsRector.php @@ -0,0 +1,57 @@ + 'AMONG_ALL', + 'JSONAPI_FILTER_AMONG_PUBLISHED' => 'AMONG_PUBLISHED', + 'JSONAPI_FILTER_AMONG_ENABLED' => 'AMONG_ENABLED', + 'JSONAPI_FILTER_AMONG_OWN' => 'AMONG_OWN', + ]; + + public function getNodeTypes(): array + { + return [Node\Expr\ConstFetch::class]; + } + + public function refactor(Node $node): mixed + { + assert($node instanceof Node\Expr\ConstFetch); + + $constName = $this->getName($node); + if ($constName === null || !isset(self::CONSTANT_MAP[$constName])) { + return null; + } + + return new Node\Expr\ClassConstFetch( + new Node\Name\FullyQualified('Drupal\jsonapi\JsonApiFilter'), + self::CONSTANT_MAP[$constName] + ); + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition('Replace deprecated JSONAPI_FILTER_AMONG_* global constants with \\Drupal\\jsonapi\\JsonApiFilter::AMONG_* class constants (drupal:11.3.0)', [ + new CodeSample( + 'return [JSONAPI_FILTER_AMONG_ALL => AccessResult::allowed()];', + 'return [\\Drupal\\jsonapi\\JsonApiFilter::AMONG_ALL => AccessResult::allowed()];' + ), + ]); + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceJsonApiFilterConstantsRector/ReplaceJsonApiFilterConstantsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceJsonApiFilterConstantsRector/ReplaceJsonApiFilterConstantsRectorTest.php new file mode 100644 index 000000000..b626ccec2 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceJsonApiFilterConstantsRector/ReplaceJsonApiFilterConstantsRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceJsonApiFilterConstantsRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceJsonApiFilterConstantsRector/config/configured_rule.php new file mode 100644 index 000000000..9f9ca3f26 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceJsonApiFilterConstantsRector/config/configured_rule.php @@ -0,0 +1,10 @@ +rule(ReplaceJsonApiFilterConstantsRector::class); +}; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceJsonApiFilterConstantsRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceJsonApiFilterConstantsRector/fixture/basic.php.inc new file mode 100644 index 000000000..8396c45a4 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceJsonApiFilterConstantsRector/fixture/basic.php.inc @@ -0,0 +1,21 @@ + 'a', + JSONAPI_FILTER_AMONG_PUBLISHED => 'b', + JSONAPI_FILTER_AMONG_ENABLED => 'c', + JSONAPI_FILTER_AMONG_OWN => 'd', +]; + +?> +----- + 'a', + \Drupal\jsonapi\JsonApiFilter::AMONG_PUBLISHED => 'b', + \Drupal\jsonapi\JsonApiFilter::AMONG_ENABLED => 'c', + \Drupal\jsonapi\JsonApiFilter::AMONG_OWN => 'd', +]; + +?> From 7e04037288c7499d301ae14afe0e02888630fd21 Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 19:27:19 +0200 Subject: [PATCH 031/256] feat(Drupal11): Add ReplaceNodeSetPreviewModeRector DRUPAL_DISABLED/OPTIONAL/REQUIRED constants and integer literals 0/1/2 in NodeTypeInterface::setPreviewMode() deprecated in drupal:11.3.0, removed in drupal:13.0.0. Replaced by NodePreviewMode enum cases. --- .../ReplaceNodeSetPreviewModeRector.php | 88 ++++++++++++++ .../ReplaceViewsProceduralFunctionsRector.php | 104 ++++++++++++++++ .../UseEntityTypeHasIntegerIdRector.php | 111 ++++++++++++++++++ .../ReplaceNodeSetPreviewModeRectorTest.php | 33 ++++++ .../config/configured_rule.php | 10 ++ .../fixture/basic.php.inc | 21 ++++ ...laceViewsProceduralFunctionsRectorTest.php | 33 ++++++ .../config/configured_rule.php | 10 ++ .../fixture/basic.php.inc | 19 +++ .../UseEntityTypeHasIntegerIdRectorTest.php | 33 ++++++ .../config/configured_rule.php | 10 ++ .../fixture/basic.php.inc | 19 +++ 12 files changed, 491 insertions(+) create mode 100644 src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector.php create mode 100644 src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector.php create mode 100644 src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/ReplaceNodeSetPreviewModeRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/fixture/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/ReplaceViewsProceduralFunctionsRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/fixture/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/UseEntityTypeHasIntegerIdRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/basic.php.inc diff --git a/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector.php b/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector.php new file mode 100644 index 000000000..f92195c32 --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector.php @@ -0,0 +1,88 @@ + 'Disabled', + 'DRUPAL_OPTIONAL' => 'Optional', + 'DRUPAL_REQUIRED' => 'Required', + ]; + + private const INT_TO_ENUM = [ + 0 => 'Disabled', + 1 => 'Optional', + 2 => 'Required', + ]; + + public function getNodeTypes(): array + { + return [Node\Expr\MethodCall::class]; + } + + public function refactor(Node $node): mixed + { + assert($node instanceof Node\Expr\MethodCall); + + if (!$this->isName($node->name, 'setPreviewMode')) { + return null; + } + + if (count($node->args) !== 1) { + return null; + } + + $argValue = $node->args[0]->value; + $enumCase = null; + + if ($argValue instanceof Node\Expr\ConstFetch) { + $constName = $this->getName($argValue); + if ($constName !== null && isset(self::CONST_TO_ENUM[$constName])) { + $enumCase = self::CONST_TO_ENUM[$constName]; + } + } + + if ($enumCase === null && $argValue instanceof Node\Scalar\LNumber) { + $enumCase = self::INT_TO_ENUM[$argValue->value] ?? null; + } + + if ($enumCase === null) { + return null; + } + + $node->args[0] = new Node\Arg( + new Node\Expr\ClassConstFetch( + new Node\Name\FullyQualified('Drupal\node\NodePreviewMode'), + $enumCase + ) + ); + + return $node; + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition('Replace deprecated DRUPAL_DISABLED/OPTIONAL/REQUIRED constants and integer literals in setPreviewMode() with NodePreviewMode enum cases (drupal:11.3.0)', [ + new CodeSample( + '$nodeType->setPreviewMode(DRUPAL_DISABLED);', + '$nodeType->setPreviewMode(\\Drupal\\node\\NodePreviewMode::Disabled);' + ), + ]); + } +} diff --git a/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector.php b/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector.php new file mode 100644 index 000000000..6a6b4ea11 --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector.php @@ -0,0 +1,104 @@ + $view->status() + * - views_view_is_disabled($view) => !$view->status() + * - views_enable_view($view) => $view->enable()->save() + * - views_disable_view($view) => $view->disable()->save() + * - views_get_view_result(...) => \Drupal\views\Views::getViewResult(...) + * + * @see https://www.drupal.org/node/3572243 + */ +final class ReplaceViewsProceduralFunctionsRector extends AbstractRector +{ + public function getNodeTypes(): array + { + return [Node\Expr\FuncCall::class]; + } + + public function refactor(Node $node): mixed + { + assert($node instanceof Node\Expr\FuncCall); + + if (!$node->name instanceof Node\Name) { + return null; + } + + return match ($node->name->toString()) { + 'views_view_is_enabled' => $this->statusCall($node), + 'views_view_is_disabled' => $this->negatedStatusCall($node), + 'views_enable_view' => $this->enableSaveCall($node), + 'views_disable_view' => $this->disableSaveCall($node), + 'views_get_view_result' => $this->staticGetViewResult($node), + default => null, + }; + } + + private function statusCall(Node\Expr\FuncCall $node): ?Node + { + if (count($node->args) < 1) { + return null; + } + return new Node\Expr\MethodCall($node->args[0]->value, new Node\Identifier('status')); + } + + private function negatedStatusCall(Node\Expr\FuncCall $node): ?Node + { + if (count($node->args) < 1) { + return null; + } + return new Node\Expr\BooleanNot( + new Node\Expr\MethodCall($node->args[0]->value, new Node\Identifier('status')) + ); + } + + private function enableSaveCall(Node\Expr\FuncCall $node): ?Node + { + if (count($node->args) < 1) { + return null; + } + $enable = new Node\Expr\MethodCall($node->args[0]->value, new Node\Identifier('enable')); + return new Node\Expr\MethodCall($enable, new Node\Identifier('save')); + } + + private function disableSaveCall(Node\Expr\FuncCall $node): ?Node + { + if (count($node->args) < 1) { + return null; + } + $disable = new Node\Expr\MethodCall($node->args[0]->value, new Node\Identifier('disable')); + return new Node\Expr\MethodCall($disable, new Node\Identifier('save')); + } + + private function staticGetViewResult(Node\Expr\FuncCall $node): Node\Expr\StaticCall + { + return new Node\Expr\StaticCall( + new Node\Name\FullyQualified('Drupal\views\Views'), + new Node\Identifier('getViewResult'), + $node->args + ); + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition('Replace deprecated Views procedural functions with OO equivalents (drupal:11.4.0)', [ + new CodeSample( + 'views_enable_view($view);', + '$view->enable()->save();' + ), + ]); + } +} diff --git a/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector.php b/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector.php new file mode 100644 index 000000000..aea0190e0 --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector.php @@ -0,0 +1,111 @@ +getEntityTypeIdKeyType($entityType) === 'integer' => $entityType->hasIntegerId() + * - $this->entityTypeSupportsComments($entityType) => $entityType->hasIntegerId() + * - $this->hasIntegerId($entityType) => $entityType->hasIntegerId() + * + * @see https://www.drupal.org/node/3566801 + */ +final class UseEntityTypeHasIntegerIdRector extends AbstractRector +{ + private const SIMPLE_METHODS = ['entityTypeSupportsComments', 'hasIntegerId']; + + public function getNodeTypes(): array + { + return [Node\Expr\BinaryOp\Identical::class, Node\Expr\MethodCall::class]; + } + + public function refactor(Node $node): mixed + { + if ($node instanceof Node\Expr\BinaryOp\Identical) { + return $this->refactorIdentical($node); + } + + assert($node instanceof Node\Expr\MethodCall); + return $this->refactorMethodCall($node); + } + + private function refactorIdentical(Node\Expr\BinaryOp\Identical $node): ?Node + { + [$methodCall, $string] = $this->extractPair($node); + + if ($methodCall === null || $string === null) { + return null; + } + + if (!$this->isThisCall($methodCall, 'getEntityTypeIdKeyType')) { + return null; + } + + if ($string->value !== 'integer' || count($methodCall->args) !== 1) { + return null; + } + + return new Node\Expr\MethodCall($methodCall->args[0]->value, new Node\Identifier('hasIntegerId')); + } + + private function refactorMethodCall(Node\Expr\MethodCall $node): ?Node + { + if (!$node->var instanceof Node\Expr\Variable || $node->var->name !== 'this') { + return null; + } + + $name = $this->getName($node->name); + if ($name === null || !in_array($name, self::SIMPLE_METHODS, true)) { + return null; + } + + if (count($node->args) !== 1) { + return null; + } + + return new Node\Expr\MethodCall($node->args[0]->value, new Node\Identifier('hasIntegerId')); + } + + /** + * @return array{Node\Expr\MethodCall|null, Node\Scalar\String_|null} + */ + private function extractPair(Node\Expr\BinaryOp\Identical $node): array + { + if ($node->left instanceof Node\Expr\MethodCall && $node->right instanceof Node\Scalar\String_) { + return [$node->left, $node->right]; + } + if ($node->right instanceof Node\Expr\MethodCall && $node->left instanceof Node\Scalar\String_) { + return [$node->right, $node->left]; + } + return [null, null]; + } + + private function isThisCall(Node\Expr\MethodCall $node, string $methodName): bool + { + if (!$node->var instanceof Node\Expr\Variable || $node->var->name !== 'this') { + return false; + } + return $this->isName($node->name, $methodName); + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition('Replace deprecated entity-type integer-ID helper methods with EntityTypeInterface::hasIntegerId() (drupal:11.4.0)', [ + new CodeSample( + "\$this->getEntityTypeIdKeyType(\$entity_type) === 'integer'", + '$entity_type->hasIntegerId()' + ), + ]); + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/ReplaceNodeSetPreviewModeRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/ReplaceNodeSetPreviewModeRectorTest.php new file mode 100644 index 000000000..5bdd17390 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/ReplaceNodeSetPreviewModeRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/config/configured_rule.php new file mode 100644 index 000000000..02b2b3e90 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/config/configured_rule.php @@ -0,0 +1,10 @@ +rule(ReplaceNodeSetPreviewModeRector::class); +}; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/fixture/basic.php.inc new file mode 100644 index 000000000..914c8240b --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/fixture/basic.php.inc @@ -0,0 +1,21 @@ +setPreviewMode(DRUPAL_DISABLED); +$nodeType->setPreviewMode(DRUPAL_OPTIONAL); +$nodeType->setPreviewMode(DRUPAL_REQUIRED); +$nodeType->setPreviewMode(0); +$nodeType->setPreviewMode(1); +$nodeType->setPreviewMode(2); + +?> +----- +setPreviewMode(\Drupal\node\NodePreviewMode::Disabled); +$nodeType->setPreviewMode(\Drupal\node\NodePreviewMode::Optional); +$nodeType->setPreviewMode(\Drupal\node\NodePreviewMode::Required); +$nodeType->setPreviewMode(\Drupal\node\NodePreviewMode::Disabled); +$nodeType->setPreviewMode(\Drupal\node\NodePreviewMode::Optional); +$nodeType->setPreviewMode(\Drupal\node\NodePreviewMode::Required); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/ReplaceViewsProceduralFunctionsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/ReplaceViewsProceduralFunctionsRectorTest.php new file mode 100644 index 000000000..bb579c1bb --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/ReplaceViewsProceduralFunctionsRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/config/configured_rule.php new file mode 100644 index 000000000..f70815879 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/config/configured_rule.php @@ -0,0 +1,10 @@ +rule(ReplaceViewsProceduralFunctionsRector::class); +}; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/fixture/basic.php.inc new file mode 100644 index 000000000..a97982db0 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/fixture/basic.php.inc @@ -0,0 +1,19 @@ + +----- +status(); +!$view->status(); +$view->enable()->save(); +$view->disable()->save(); +$result = \Drupal\views\Views::getViewResult('my_view', 'page_1', 'arg1'); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/UseEntityTypeHasIntegerIdRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/UseEntityTypeHasIntegerIdRectorTest.php new file mode 100644 index 000000000..fa7ed2e54 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/UseEntityTypeHasIntegerIdRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/config/configured_rule.php new file mode 100644 index 000000000..34c7fb6d2 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/config/configured_rule.php @@ -0,0 +1,10 @@ +rule(UseEntityTypeHasIntegerIdRector::class); +}; diff --git a/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/basic.php.inc new file mode 100644 index 000000000..09789e450 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/basic.php.inc @@ -0,0 +1,19 @@ +getEntityTypeIdKeyType($entity_type) === 'integer') { + $result = 'integer'; +} +$a = $this->entityTypeSupportsComments($entity_type); +$b = $this->hasIntegerId($entity_type); + +?> +----- +hasIntegerId()) { + $result = 'integer'; +} +$a = $entity_type->hasIntegerId(); +$b = $entity_type->hasIntegerId(); + +?> From cfc677b462420e9c7738ed008a04b15c0289bbd8 Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 19:27:26 +0200 Subject: [PATCH 032/256] feat: Wire Phase 4 complex rectors into drupal-11.x deprecation configs - drupal-11.3: ReplaceJsonApiFilterConstantsRector, ReplaceNodeSetPreviewModeRector - drupal-11.4: ReplaceViewsProceduralFunctionsRector, UseEntityTypeHasIntegerIdRector --- config/drupal-11/drupal-11.3-deprecations.php | 13 +++++++++++++ config/drupal-11/drupal-11.4-deprecations.php | 14 ++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/config/drupal-11/drupal-11.3-deprecations.php b/config/drupal-11/drupal-11.3-deprecations.php index 4945d6576..c1341975c 100644 --- a/config/drupal-11/drupal-11.3-deprecations.php +++ b/config/drupal-11/drupal-11.3-deprecations.php @@ -5,6 +5,8 @@ use DrupalRector\Drupal11\Rector\Deprecation\LoadAllIncludesRector; use DrupalRector\Drupal11\Rector\Deprecation\NodeStorageDeprecatedMethodsRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceCommentManagerGetCountNewCommentsRector; +use DrupalRector\Drupal11\Rector\Deprecation\ReplaceJsonApiFilterConstantsRector; +use DrupalRector\Drupal11\Rector\Deprecation\ReplaceNodeSetPreviewModeRector; use DrupalRector\Rector\Deprecation\FunctionCallRemovalRector; use DrupalRector\Rector\Deprecation\FunctionToServiceRector; use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; @@ -43,4 +45,15 @@ $rectorConfig->ruleWithConfiguration(FunctionCallRemovalRector::class, [ new FunctionCallRemovalConfiguration('block_content_add_body_field'), ]); + + // https://www.drupal.org/node/3495600 + // JSONAPI_FILTER_AMONG_* global constants deprecated in drupal:11.3.0, removed in drupal:13.0.0. + // Replaced by \Drupal\jsonapi\JsonApiFilter::AMONG_* class constants. + $rectorConfig->rule(ReplaceJsonApiFilterConstantsRector::class); + + // https://www.drupal.org/node/3538277 + // DRUPAL_DISABLED/OPTIONAL/REQUIRED constants (and integers 0/1/2) in setPreviewMode() + // deprecated in drupal:11.3.0, removed in drupal:13.0.0. + // Replaced by NodePreviewMode enum cases. + $rectorConfig->rule(ReplaceNodeSetPreviewModeRector::class); }; diff --git a/config/drupal-11/drupal-11.4-deprecations.php b/config/drupal-11/drupal-11.4-deprecations.php index 58fc538e3..936d6ff49 100644 --- a/config/drupal-11/drupal-11.4-deprecations.php +++ b/config/drupal-11/drupal-11.4-deprecations.php @@ -5,6 +5,8 @@ use DrupalRector\Drupal11\Rector\Deprecation\RemoveAutomatedCronSubmitHandlerRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveLinkWidgetValidateTitleElementRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceSessionManagerDeleteRector; +use DrupalRector\Drupal11\Rector\Deprecation\ReplaceViewsProceduralFunctionsRector; +use DrupalRector\Drupal11\Rector\Deprecation\UseEntityTypeHasIntegerIdRector; use DrupalRector\Drupal11\Rector\Deprecation\ViewsPluginHandlerManagerRector; use DrupalRector\Rector\Deprecation\ClassConstantToClassConstantRector; use DrupalRector\Rector\Deprecation\FunctionCallRemovalRector; @@ -171,6 +173,18 @@ // Config saving is now handled automatically via #config_target on the interval element. $rectorConfig->rule(RemoveAutomatedCronSubmitHandlerRector::class); + // https://www.drupal.org/node/3572243 + // views_view_is_enabled(), views_view_is_disabled(), views_enable_view(), + // views_disable_view(), views_get_view_result() deprecated in drupal:11.4.0, removed in drupal:13.0.0. + // Replaced by OO equivalents on the view object or Views::getViewResult(). + $rectorConfig->rule(ReplaceViewsProceduralFunctionsRector::class); + + // https://www.drupal.org/node/3566801 + // getEntityTypeIdKeyType() === 'integer', entityTypeSupportsComments(), and hasIntegerId($entityType) + // deprecated in drupal:11.4.0, removed in drupal:13.0.0. + // Replaced by EntityTypeInterface::hasIntegerId() called on the entity type object. + $rectorConfig->rule(UseEntityTypeHasIntegerIdRector::class); + // https://www.drupal.org/node/3574727 // language_configuration_element_submit() deprecated in 11.4.0, removed in 13.0.0. // Replaced by LanguageConfiguration::submit(). From 408e73309ea91e811bd1c56c9b362eb54dfebb99 Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 19:46:39 +0200 Subject: [PATCH 033/256] feat(Drupal11): Add Phase 5 deprecation rectors and config wiring MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ReplaceRequirementSeverityConstantsRector: REQUIREMENT_* global constants → RequirementSeverity::* enum cases - ReplaceCommentUriRector: comment_uri($comment) → $comment->permalink() - ReplaceUserSessionNamePropertyRector: typed $userSession->name → $userSession->getAccountName() - ReplaceLocaleConfigBatchFunctionsRector: rename locale_config_batch_set_config_langcodes and locale_config_batch_refresh_name - StripMigrationDependenciesExpandArgRector: remove expand arg from getMigrationDependencies() on MigrationInterface Also adds FunctionToStaticRector and FunctionToServiceRector config entries for drupal_requirements_severity, views field functions, file_system_settings_submit, editor/field/media library service-bound functions across 11.0–11.4 config files. --- config/drupal-11/drupal-11.0-deprecations.php | 6 ++ config/drupal-11/drupal-11.1-deprecations.php | 7 +++ config/drupal-11/drupal-11.2-deprecations.php | 27 +++++++++ config/drupal-11/drupal-11.3-deprecations.php | 21 +++++++ config/drupal-11/drupal-11.4-deprecations.php | 33 ++++++++++ .../Deprecation/ReplaceCommentUriRector.php | 53 ++++++++++++++++ ...eplaceLocaleConfigBatchFunctionsRector.php | 60 +++++++++++++++++++ ...laceRequirementSeverityConstantsRector.php | 58 ++++++++++++++++++ .../ReplaceUserSessionNamePropertyRector.php | 51 ++++++++++++++++ ...ipMigrationDependenciesExpandArgRector.php | 56 +++++++++++++++++ .../ReplaceCommentUriRectorTest.php | 33 ++++++++++ .../config/configured_rule.php | 10 ++++ .../fixture/basic.php.inc | 11 ++++ ...ceLocaleConfigBatchFunctionsRectorTest.php | 33 ++++++++++ .../config/configured_rule.php | 10 ++++ .../fixture/basic.php.inc | 15 +++++ ...RequirementSeverityConstantsRectorTest.php | 33 ++++++++++ .../config/configured_rule.php | 10 ++++ .../fixture/basic.php.inc | 19 ++++++ ...placeUserSessionNamePropertyRectorTest.php | 33 ++++++++++ .../config/configured_rule.php | 10 ++++ .../fixture/basic.php.inc | 15 +++++ ...grationDependenciesExpandArgRectorTest.php | 33 ++++++++++ .../config/configured_rule.php | 10 ++++ .../fixture/basic.php.inc | 17 ++++++ 25 files changed, 664 insertions(+) create mode 100644 src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector.php create mode 100644 src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector.php create mode 100644 src/Drupal11/Rector/Deprecation/ReplaceRequirementSeverityConstantsRector.php create mode 100644 src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector.php create mode 100644 src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/ReplaceCommentUriRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/ReplaceLocaleConfigBatchFunctionsRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/fixture/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceRequirementSeverityConstantsRector/ReplaceRequirementSeverityConstantsRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceRequirementSeverityConstantsRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceRequirementSeverityConstantsRector/fixture/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/ReplaceUserSessionNamePropertyRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/fixture/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/StripMigrationDependenciesExpandArgRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/fixture/basic.php.inc diff --git a/config/drupal-11/drupal-11.0-deprecations.php b/config/drupal-11/drupal-11.0-deprecations.php index 5135a25af..c5a6527d3 100644 --- a/config/drupal-11/drupal-11.0-deprecations.php +++ b/config/drupal-11/drupal-11.0-deprecations.php @@ -4,6 +4,7 @@ use DrupalRector\Drupal10\Rector\Deprecation\ReplaceRequestTimeConstantRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveStateCacheSettingRector; +use DrupalRector\Drupal11\Rector\Deprecation\StripMigrationDependenciesExpandArgRector; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { @@ -16,4 +17,9 @@ // REQUEST_TIME constant deprecated in drupal:8.3.0, removed in drupal:11.0.0. // Replaced by \Drupal::time()->getRequestTime(). $rectorConfig->rule(ReplaceRequestTimeConstantRector::class); + + // https://www.drupal.org/node/3574717 + // getMigrationDependencies($expand) deprecated in drupal:11.0.0, removed in drupal:12.0.0. + // The $expand boolean argument is removed; call without arguments. + $rectorConfig->rule(StripMigrationDependenciesExpandArgRector::class); }; diff --git a/config/drupal-11/drupal-11.1-deprecations.php b/config/drupal-11/drupal-11.1-deprecations.php index bf7b3823e..0537ee0f2 100644 --- a/config/drupal-11/drupal-11.1-deprecations.php +++ b/config/drupal-11/drupal-11.1-deprecations.php @@ -3,6 +3,7 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\PluginBaseIsConfigurableRector; +use DrupalRector\Drupal11\Rector\Deprecation\ReplaceLocaleConfigBatchFunctionsRector; use DrupalRector\Rector\Deprecation\MethodToMethodWithCheckRector; use DrupalRector\Rector\ValueObject\MethodToMethodWithCheckConfiguration; use Rector\Config\RectorConfig; @@ -19,4 +20,10 @@ $rectorConfig->ruleWithConfiguration(MethodToMethodWithCheckRector::class, [ new MethodToMethodWithCheckConfiguration('Drupal\path_alias\AliasManager', 'pathAliasWhitelistRebuild', 'pathAliasPrefixListRebuild'), ]); + + // https://www.drupal.org/node/3575254 + // locale_config_batch_set_config_langcodes() and locale_config_batch_refresh_name() deprecated + // in drupal:11.1.0, removed in drupal:12.0.0. Renamed to update_default_config_langcodes + // and update_config_translations respectively. + $rectorConfig->rule(ReplaceLocaleConfigBatchFunctionsRector::class); }; diff --git a/config/drupal-11/drupal-11.2-deprecations.php b/config/drupal-11/drupal-11.2-deprecations.php index 2f78721a3..53a388de0 100644 --- a/config/drupal-11/drupal-11.2-deprecations.php +++ b/config/drupal-11/drupal-11.2-deprecations.php @@ -3,14 +3,17 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\RemoveModuleHandlerAddModuleCallsRector; +use DrupalRector\Drupal11\Rector\Deprecation\ReplaceRequirementSeverityConstantsRector; use DrupalRector\Drupal11\Rector\Deprecation\StatementPrefetchIteratorFetchColumnRector; use DrupalRector\Rector\Deprecation\ClassConstantToClassConstantRector; use DrupalRector\Rector\Deprecation\FunctionCallRemovalRector; use DrupalRector\Rector\Deprecation\FunctionToServiceRector; +use DrupalRector\Rector\Deprecation\FunctionToStaticRector; use DrupalRector\Rector\Deprecation\MethodToMethodWithCheckRector; use DrupalRector\Rector\ValueObject\ClassConstantToClassConstantConfiguration; use DrupalRector\Rector\ValueObject\FunctionCallRemovalConfiguration; use DrupalRector\Rector\ValueObject\FunctionToServiceConfiguration; +use DrupalRector\Rector\ValueObject\FunctionToStaticConfiguration; use DrupalRector\Rector\ValueObject\MethodToMethodWithCheckConfiguration; use Rector\Config\RectorConfig; @@ -60,6 +63,30 @@ // These methods are no-ops and can be removed. $rectorConfig->rule(RemoveModuleHandlerAddModuleCallsRector::class); + // https://www.drupal.org/node/3410938 + // drupal_requirements_severity() deprecated in drupal:11.2.0, removed in drupal:12.0.0. + // Replaced by RequirementSeverity::maxSeverityFromRequirements(). + $rectorConfig->ruleWithConfiguration(FunctionToStaticRector::class, [ + new FunctionToStaticConfiguration('11.2.0', 'drupal_requirements_severity', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'maxSeverityFromRequirements'), + ]); + + // https://www.drupal.org/node/3489415 + // views_field_default_views_data() and _views_field_get_entity_type_storage() deprecated in drupal:11.2.0, removed in drupal:12.0.0. + // Replaced by views.field_data_provider service methods. + // https://www.drupal.org/node/3069442 + // views_entity_field_label() deprecated in drupal:11.2.0, removed in drupal:12.0.0. + // Replaced by entity_field.manager::getFieldLabels(). + $rectorConfig->ruleWithConfiguration(FunctionToServiceRector::class, [ + new FunctionToServiceConfiguration('11.2.0', 'views_field_default_views_data', 'views.field_data_provider', 'defaultFieldImplementation'), + new FunctionToServiceConfiguration('11.2.0', '_views_field_get_entity_type_storage', 'views.field_data_provider', 'getSqlStorageForField'), + new FunctionToServiceConfiguration('11.2.0', 'views_entity_field_label', 'entity_field.manager', 'getFieldLabels'), + ]); + + // https://www.drupal.org/node/3575841 + // REQUIREMENT_INFO/OK/WARNING/ERROR global constants deprecated in drupal:11.2.0, removed in drupal:12.0.0. + // Replaced by RequirementSeverity enum cases. + $rectorConfig->rule(ReplaceRequirementSeverityConstantsRector::class); + // https://www.drupal.org/node/3575841 // SystemManager::REQUIREMENT_* deprecated in drupal:11.2.0, removed in drupal:12.0.0. // Replaced by \Drupal\Core\Extension\Requirement\RequirementSeverity enum cases. diff --git a/config/drupal-11/drupal-11.3-deprecations.php b/config/drupal-11/drupal-11.3-deprecations.php index c1341975c..ea9fca7a5 100644 --- a/config/drupal-11/drupal-11.3-deprecations.php +++ b/config/drupal-11/drupal-11.3-deprecations.php @@ -5,13 +5,17 @@ use DrupalRector\Drupal11\Rector\Deprecation\LoadAllIncludesRector; use DrupalRector\Drupal11\Rector\Deprecation\NodeStorageDeprecatedMethodsRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceCommentManagerGetCountNewCommentsRector; +use DrupalRector\Drupal11\Rector\Deprecation\ReplaceCommentUriRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceJsonApiFilterConstantsRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceNodeSetPreviewModeRector; +use DrupalRector\Drupal11\Rector\Deprecation\ReplaceUserSessionNamePropertyRector; use DrupalRector\Rector\Deprecation\FunctionCallRemovalRector; use DrupalRector\Rector\Deprecation\FunctionToServiceRector; +use DrupalRector\Rector\Deprecation\FunctionToStaticRector; use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use DrupalRector\Rector\ValueObject\FunctionCallRemovalConfiguration; use DrupalRector\Rector\ValueObject\FunctionToServiceConfiguration; +use DrupalRector\Rector\ValueObject\FunctionToStaticConfiguration; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { @@ -46,6 +50,23 @@ new FunctionCallRemovalConfiguration('block_content_add_body_field'), ]); + // https://www.drupal.org/node/2010202 + // comment_uri($comment) deprecated in drupal:11.3.0, removed in drupal:12.0.0. + // Replaced by $comment->permalink(). + $rectorConfig->rule(ReplaceCommentUriRector::class); + + // https://www.drupal.org/node/3513856 + // UserSession::$name property read deprecated in drupal:11.3.0, removed in drupal:12.0.0. + // Replaced by getAccountName(). + $rectorConfig->rule(ReplaceUserSessionNamePropertyRector::class); + + // https://www.drupal.org/node/3534092 + // file_system_settings_submit() deprecated in drupal:11.3.0, removed in drupal:13.0.0. + // Replaced by \Drupal\file\Hook\FileHooks::settingsSubmit(). + $rectorConfig->ruleWithConfiguration(FunctionToStaticRector::class, [ + new FunctionToStaticConfiguration('11.3.0', 'file_system_settings_submit', 'Drupal\file\Hook\FileHooks', 'settingsSubmit'), + ]); + // https://www.drupal.org/node/3495600 // JSONAPI_FILTER_AMONG_* global constants deprecated in drupal:11.3.0, removed in drupal:13.0.0. // Replaced by \Drupal\jsonapi\JsonApiFilter::AMONG_* class constants. diff --git a/config/drupal-11/drupal-11.4-deprecations.php b/config/drupal-11/drupal-11.4-deprecations.php index 936d6ff49..d4361166c 100644 --- a/config/drupal-11/drupal-11.4-deprecations.php +++ b/config/drupal-11/drupal-11.4-deprecations.php @@ -156,11 +156,15 @@ // https://www.drupal.org/node/3566768 // automated_cron_settings_submit() deprecated in drupal:11.4.0, removed in drupal:13.0.0. // Config saving is now handled automatically via #config_target on the interval element. + // https://www.drupal.org/node/3566782 + // block_theme_initialize() deprecated in drupal:11.4.0, removed in drupal:13.0.0. + // Logic moved to protected BlockHooks::themeInitialize(); external callers must drop the call. $rectorConfig->ruleWithConfiguration(FunctionCallRemovalRector::class, [ new FunctionCallRemovalConfiguration('views_ui_contextual_links_suppress'), new FunctionCallRemovalConfiguration('views_ui_contextual_links_suppress_push'), new FunctionCallRemovalConfiguration('views_ui_contextual_links_suppress_pop'), new FunctionCallRemovalConfiguration('automated_cron_settings_submit'), + new FunctionCallRemovalConfiguration('block_theme_initialize'), ]); // https://www.drupal.org/node/3093118 @@ -185,6 +189,35 @@ // Replaced by EntityTypeInterface::hasIntegerId() called on the entity type object. $rectorConfig->rule(UseEntityTypeHasIntegerIdRector::class); + // https://www.drupal.org/node/3568144 + // editor_filter_xss() deprecated in drupal:11.4.0, removed in drupal:13.0.0. + // Replaced by \Drupal::service('element.editor')->filterXss(). + // https://www.drupal.org/node/3570917 + // editor_image_upload_settings_form() deprecated in drupal:11.4.0, removed in drupal:13.0.0. + // Replaced by \Drupal::service(EditorImageUploadSettings::class)->getForm(). + // https://www.drupal.org/node/2907780 + // field_purge_batch() deprecated in drupal:11.4.0, removed in drupal:13.0.0. + // Replaced by \Drupal::service(FieldPurger::class)->purgeBatch(). + // https://www.drupal.org/node/3570839 + // _media_library_media_type_form_submit() and _media_library_views_form_media_library_after_build() + // deprecated in drupal:11.4.0, removed in drupal:12.0.0. Replaced by MediaLibraryHooks service. + $rectorConfig->ruleWithConfiguration(FunctionToServiceRector::class, [ + new FunctionToServiceConfiguration('11.4.0', 'editor_filter_xss', 'element.editor', 'filterXss'), + new FunctionToServiceConfiguration('11.4.0', 'editor_image_upload_settings_form', 'Drupal\editor\EditorImageUploadSettings', 'getForm'), + new FunctionToServiceConfiguration('11.4.0', 'field_purge_batch', 'Drupal\Core\Field\FieldPurger', 'purgeBatch'), + new FunctionToServiceConfiguration('11.4.0', '_media_library_media_type_form_submit', 'Drupal\media_library\Hook\MediaLibraryHooks', 'mediaTypeFormSubmit'), + new FunctionToServiceConfiguration('11.4.0', '_media_library_views_form_media_library_after_build', 'Drupal\media_library\Hook\MediaLibraryHooks', 'viewsFormAfterBuild'), + ]); + + // https://www.drupal.org/node/3570839 + // _media_library_configure_form_display() and _media_library_configure_view_display() + // deprecated in drupal:11.4.0, removed in drupal:12.0.0. + // Replaced by MediaLibraryDisplayManager static methods. + $rectorConfig->ruleWithConfiguration(FunctionToStaticRector::class, [ + new FunctionToStaticConfiguration('11.4.0', '_media_library_configure_form_display', 'Drupal\media_library\MediaLibraryDisplayManager', 'configureFormDisplay'), + new FunctionToStaticConfiguration('11.4.0', '_media_library_configure_view_display', 'Drupal\media_library\MediaLibraryDisplayManager', 'configureViewDisplay'), + ]); + // https://www.drupal.org/node/3574727 // language_configuration_element_submit() deprecated in 11.4.0, removed in 13.0.0. // Replaced by LanguageConfiguration::submit(). diff --git a/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector.php b/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector.php new file mode 100644 index 000000000..855ed259e --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector.php @@ -0,0 +1,53 @@ +permalink(). + * + * Deprecated in drupal:11.3.0, removed in drupal:12.0.0. + * + * @see https://www.drupal.org/node/2010202 + */ +final class ReplaceCommentUriRector extends AbstractRector +{ + public function getNodeTypes(): array + { + return [Node\Expr\FuncCall::class]; + } + + public function refactor(Node $node): mixed + { + assert($node instanceof Node\Expr\FuncCall); + + if (!$this->isName($node, 'comment_uri')) { + return null; + } + + if (count($node->args) < 1) { + return null; + } + + return new Node\Expr\MethodCall( + $node->args[0]->value, + new Node\Identifier('permalink') + ); + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition('Replace deprecated comment_uri($comment) calls with $comment->permalink() (drupal:11.3.0)', [ + new CodeSample( + '$url = comment_uri($comment);', + '$url = $comment->permalink();' + ), + ]); + } +} diff --git a/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector.php b/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector.php new file mode 100644 index 000000000..abed35dc0 --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector.php @@ -0,0 +1,60 @@ + locale_config_batch_update_default_config_langcodes() + * - locale_config_batch_refresh_name() => locale_config_batch_update_config_translations() + * + * @see https://www.drupal.org/node/3575254 + */ +final class ReplaceLocaleConfigBatchFunctionsRector extends AbstractRector +{ + private const RENAME_MAP = [ + 'locale_config_batch_set_config_langcodes' => 'locale_config_batch_update_default_config_langcodes', + 'locale_config_batch_refresh_name' => 'locale_config_batch_update_config_translations', + ]; + + public function getNodeTypes(): array + { + return [Node\Expr\FuncCall::class]; + } + + public function refactor(Node $node): mixed + { + assert($node instanceof Node\Expr\FuncCall); + + if (!$node->name instanceof Node\Name) { + return null; + } + + $name = $node->name->toString(); + if (!isset(self::RENAME_MAP[$name])) { + return null; + } + + $node->name = new Node\Name(self::RENAME_MAP[$name]); + return $node; + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition('Replace removed locale config batch helper functions with their renamed successors (drupal:11.1.0)', [ + new CodeSample( + 'locale_config_batch_set_config_langcodes($context);', + 'locale_config_batch_update_default_config_langcodes($context);' + ), + ]); + } +} diff --git a/src/Drupal11/Rector/Deprecation/ReplaceRequirementSeverityConstantsRector.php b/src/Drupal11/Rector/Deprecation/ReplaceRequirementSeverityConstantsRector.php new file mode 100644 index 000000000..23c8e83fa --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/ReplaceRequirementSeverityConstantsRector.php @@ -0,0 +1,58 @@ + 'Info', + 'REQUIREMENT_OK' => 'OK', + 'REQUIREMENT_WARNING' => 'Warning', + 'REQUIREMENT_ERROR' => 'Error', + ]; + + public function getNodeTypes(): array + { + return [Node\Expr\ConstFetch::class]; + } + + public function refactor(Node $node): mixed + { + assert($node instanceof Node\Expr\ConstFetch); + + $name = ltrim($node->name->toString(), '\\'); + if (!isset(self::CONSTANT_MAP[$name])) { + return null; + } + + return new Node\Expr\ClassConstFetch( + new Node\Name\FullyQualified('Drupal\Core\Extension\Requirement\RequirementSeverity'), + self::CONSTANT_MAP[$name] + ); + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition('Replace deprecated REQUIREMENT_* global constants with RequirementSeverity enum cases (drupal:11.2.0)', [ + new CodeSample( + "\$requirements['check']['severity'] = REQUIREMENT_ERROR;", + "\$requirements['check']['severity'] = \\Drupal\\Core\\Extension\\Requirement\\RequirementSeverity::Error;" + ), + ]); + } +} diff --git a/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector.php b/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector.php new file mode 100644 index 000000000..f7649d31a --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector.php @@ -0,0 +1,51 @@ +name property read with $userSession->getAccountName(). + * + * Deprecated in drupal:11.3.0, removed in drupal:12.0.0. + * + * @see https://www.drupal.org/node/3513856 + */ +final class ReplaceUserSessionNamePropertyRector extends AbstractRector +{ + public function getNodeTypes(): array + { + return [Node\Expr\PropertyFetch::class]; + } + + public function refactor(Node $node): mixed + { + assert($node instanceof Node\Expr\PropertyFetch); + + if (!$this->isName($node->name, 'name')) { + return null; + } + + if (!$this->isObjectType($node->var, new ObjectType('Drupal\Core\Session\UserSession'))) { + return null; + } + + return new Node\Expr\MethodCall($node->var, new Node\Identifier('getAccountName')); + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition('Replace deprecated $userSession->name property read with $userSession->getAccountName() (drupal:11.3.0)', [ + new CodeSample( + '$name = $userSession->name;', + '$name = $userSession->getAccountName();' + ), + ]); + } +} diff --git a/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector.php b/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector.php new file mode 100644 index 000000000..ce68d2280 --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector.php @@ -0,0 +1,56 @@ +isName($node->name, 'getMigrationDependencies')) { + return null; + } + + if (count($node->args) === 0) { + return null; + } + + if (!$this->isObjectType($node->var, new ObjectType('Drupal\migrate\Plugin\MigrationInterface'))) { + return null; + } + + $node->args = []; + return $node; + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition('Strip removed $expand argument from getMigrationDependencies() calls on MigrationInterface (drupal:11.0.0)', [ + new CodeSample( + '$deps = $migration->getMigrationDependencies(TRUE);', + '$deps = $migration->getMigrationDependencies();' + ), + ]); + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/ReplaceCommentUriRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/ReplaceCommentUriRectorTest.php new file mode 100644 index 000000000..9b03a6c6a --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/ReplaceCommentUriRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/config/configured_rule.php new file mode 100644 index 000000000..d3d58b1a9 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/config/configured_rule.php @@ -0,0 +1,10 @@ +rule(ReplaceCommentUriRector::class); +}; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture/basic.php.inc new file mode 100644 index 000000000..e537a97ae --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture/basic.php.inc @@ -0,0 +1,11 @@ + +----- +permalink(); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/ReplaceLocaleConfigBatchFunctionsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/ReplaceLocaleConfigBatchFunctionsRectorTest.php new file mode 100644 index 000000000..18b4069a0 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/ReplaceLocaleConfigBatchFunctionsRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/config/configured_rule.php new file mode 100644 index 000000000..09b96774b --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/config/configured_rule.php @@ -0,0 +1,10 @@ +rule(ReplaceLocaleConfigBatchFunctionsRector::class); +}; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/fixture/basic.php.inc new file mode 100644 index 000000000..21da0f8b3 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/fixture/basic.php.inc @@ -0,0 +1,15 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceRequirementSeverityConstantsRector/ReplaceRequirementSeverityConstantsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceRequirementSeverityConstantsRector/ReplaceRequirementSeverityConstantsRectorTest.php new file mode 100644 index 000000000..f92a42d44 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceRequirementSeverityConstantsRector/ReplaceRequirementSeverityConstantsRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceRequirementSeverityConstantsRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceRequirementSeverityConstantsRector/config/configured_rule.php new file mode 100644 index 000000000..2ebcb3bbf --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceRequirementSeverityConstantsRector/config/configured_rule.php @@ -0,0 +1,10 @@ +rule(ReplaceRequirementSeverityConstantsRector::class); +}; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceRequirementSeverityConstantsRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceRequirementSeverityConstantsRector/fixture/basic.php.inc new file mode 100644 index 000000000..0e494fe71 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceRequirementSeverityConstantsRector/fixture/basic.php.inc @@ -0,0 +1,19 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/ReplaceUserSessionNamePropertyRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/ReplaceUserSessionNamePropertyRectorTest.php new file mode 100644 index 000000000..f1baaa4e3 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/ReplaceUserSessionNamePropertyRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/config/configured_rule.php new file mode 100644 index 000000000..ea6fabc3f --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/config/configured_rule.php @@ -0,0 +1,10 @@ +rule(ReplaceUserSessionNamePropertyRector::class); +}; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/fixture/basic.php.inc new file mode 100644 index 000000000..0dbd5f667 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/fixture/basic.php.inc @@ -0,0 +1,15 @@ +name; +$other = $untyped->name; + +?> +----- +getAccountName(); +$other = $untyped->name; + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/StripMigrationDependenciesExpandArgRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/StripMigrationDependenciesExpandArgRectorTest.php new file mode 100644 index 000000000..edbb290a6 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/StripMigrationDependenciesExpandArgRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/config/configured_rule.php new file mode 100644 index 000000000..9916a3ee3 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/config/configured_rule.php @@ -0,0 +1,10 @@ +rule(StripMigrationDependenciesExpandArgRector::class); +}; diff --git a/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/fixture/basic.php.inc new file mode 100644 index 000000000..9ffe9d627 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/fixture/basic.php.inc @@ -0,0 +1,17 @@ +getMigrationDependencies(TRUE); +$noop = $migration->getMigrationDependencies(); +$untyped = $other->getMigrationDependencies(TRUE); + +?> +----- +getMigrationDependencies(); +$noop = $migration->getMigrationDependencies(); +$untyped = $other->getMigrationDependencies(TRUE); + +?> From 475983d892c211906d53dca549c0e3ea7b6a18e0 Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 20:16:27 +0200 Subject: [PATCH 034/256] feat(Drupal11): Add Phase 6 deprecation/removal rectors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New rector classes: - RemoveSetUriCallbackRector: remove setUriCallback() standalone + mid-chain (11.4) - RemoveTrustDataCallRector: remove trustData() from fluent chains (11.4) - RemoveConfigSaveTrustedDataArgRector: strip boolean arg from save(TRUE/FALSE) (11.4) - RemoveModuleHandlerDeprecatedMethodsRector: remove writeCache(), replace getHookInfo() with [] (11.1) - FileSystemBasenameToNativeRector: FileSystemInterface::basename() → native basename() (11.3) - ErrorCurrentErrorHandlerRector: Error::currentErrorHandler() → get_error_handler() (11.3) - ReplaceDateTimeRangeConstantsRector: DateTimeRangeConstantsInterface constants → enum->value, datetime_type_field_views_data_helper() → service (11.2) Config additions: - 11.1: RemoveModuleHandlerDeprecatedMethodsRector - 11.2: ReplaceDateTimeRangeConstantsRector - 11.3: FileSystemBasenameToNativeRector, ErrorCurrentErrorHandlerRector - 11.4: RemoveSetUriCallbackRector, RemoveTrustDataCallRector, RemoveConfigSaveTrustedDataArgRector, syslog_facility_list, syslog_logging_settings_submit, taxonomy_build_node_index, taxonomy_delete_node_index FunctionCallRemovalRector entries --- config/drupal-11/drupal-11.1-deprecations.php | 6 + config/drupal-11/drupal-11.2-deprecations.php | 8 ++ config/drupal-11/drupal-11.3-deprecations.php | 12 ++ config/drupal-11/drupal-11.4-deprecations.php | 18 +++ .../ErrorCurrentErrorHandlerRector.php | 54 +++++++++ .../FileSystemBasenameToNativeRector.php | 66 +++++++++++ .../RemoveConfigSaveTrustedDataArgRector.php | 66 +++++++++++ ...veModuleHandlerDeprecatedMethodsRector.php | 78 +++++++++++++ .../RemoveSetUriCallbackRector.php | 68 +++++++++++ .../Deprecation/RemoveTrustDataCallRector.php | 49 ++++++++ .../ReplaceDateTimeRangeConstantsRector.php | 109 ++++++++++++++++++ .../ErrorCurrentErrorHandlerRectorTest.php | 33 ++++++ .../config/configured_rule.php | 11 ++ .../fixture/basic.php.inc | 13 +++ .../FileSystemBasenameToNativeRectorTest.php | 33 ++++++ .../config/configured_rule.php | 11 ++ .../fixture/basic.php.inc | 15 +++ ...moveConfigSaveTrustedDataArgRectorTest.php | 33 ++++++ .../config/configured_rule.php | 11 ++ .../fixture/basic.php.inc | 17 +++ ...duleHandlerDeprecatedMethodsRectorTest.php | 33 ++++++ .../config/configured_rule.php | 11 ++ .../fixture/basic.php.inc | 15 +++ .../RemoveSetUriCallbackRectorTest.php | 33 ++++++ .../config/configured_rule.php | 11 ++ .../fixture/basic.php.inc | 14 +++ .../RemoveTrustDataCallRectorTest.php | 33 ++++++ .../config/configured_rule.php | 11 ++ .../fixture/basic.php.inc | 13 +++ ...eplaceDateTimeRangeConstantsRectorTest.php | 33 ++++++ .../config/configured_rule.php | 11 ++ .../fixture/basic.php.inc | 21 ++++ 32 files changed, 950 insertions(+) create mode 100644 src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector.php create mode 100644 src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector.php create mode 100644 src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector.php create mode 100644 src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector.php create mode 100644 src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector.php create mode 100644 src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector.php create mode 100644 src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/ErrorCurrentErrorHandlerRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/fixture/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/FileSystemBasenameToNativeRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/fixture/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector/RemoveConfigSaveTrustedDataArgRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector/fixture/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector/RemoveModuleHandlerDeprecatedMethodsRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector/fixture/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/RemoveSetUriCallbackRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/fixture/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/RemoveTrustDataCallRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/fixture/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/ReplaceDateTimeRangeConstantsRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/fixture/basic.php.inc diff --git a/config/drupal-11/drupal-11.1-deprecations.php b/config/drupal-11/drupal-11.1-deprecations.php index 0537ee0f2..f4ff98714 100644 --- a/config/drupal-11/drupal-11.1-deprecations.php +++ b/config/drupal-11/drupal-11.1-deprecations.php @@ -3,6 +3,7 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\PluginBaseIsConfigurableRector; +use DrupalRector\Drupal11\Rector\Deprecation\RemoveModuleHandlerDeprecatedMethodsRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceLocaleConfigBatchFunctionsRector; use DrupalRector\Rector\Deprecation\MethodToMethodWithCheckRector; use DrupalRector\Rector\ValueObject\MethodToMethodWithCheckConfiguration; @@ -21,6 +22,11 @@ new MethodToMethodWithCheckConfiguration('Drupal\path_alias\AliasManager', 'pathAliasWhitelistRebuild', 'pathAliasPrefixListRebuild'), ]); + // https://www.drupal.org/node/3442009 + // ModuleHandlerInterface::writeCache() deprecated in drupal:11.1.0, removed in drupal:12.0.0. No replacement needed. + // ModuleHandlerInterface::getHookInfo() deprecated in drupal:11.1.0, removed in drupal:12.0.0. Replaced by []. + $rectorConfig->rule(RemoveModuleHandlerDeprecatedMethodsRector::class); + // https://www.drupal.org/node/3575254 // locale_config_batch_set_config_langcodes() and locale_config_batch_refresh_name() deprecated // in drupal:11.1.0, removed in drupal:12.0.0. Renamed to update_default_config_langcodes diff --git a/config/drupal-11/drupal-11.2-deprecations.php b/config/drupal-11/drupal-11.2-deprecations.php index 53a388de0..301882852 100644 --- a/config/drupal-11/drupal-11.2-deprecations.php +++ b/config/drupal-11/drupal-11.2-deprecations.php @@ -3,6 +3,7 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\RemoveModuleHandlerAddModuleCallsRector; +use DrupalRector\Drupal11\Rector\Deprecation\ReplaceDateTimeRangeConstantsRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceRequirementSeverityConstantsRector; use DrupalRector\Drupal11\Rector\Deprecation\StatementPrefetchIteratorFetchColumnRector; use DrupalRector\Rector\Deprecation\ClassConstantToClassConstantRector; @@ -87,6 +88,13 @@ // Replaced by RequirementSeverity enum cases. $rectorConfig->rule(ReplaceRequirementSeverityConstantsRector::class); + // https://www.drupal.org/node/3574901 + // DateTimeRangeConstantsInterface::BOTH/START_DATE/END_DATE deprecated in drupal:11.2.0, removed in drupal:12.0.0. + // Replaced by DateTimeRangeDisplayOptions enum cases (->value). + // datetime_type_field_views_data_helper() deprecated in drupal:11.2.0, removed in drupal:12.0.0. + // Replaced by \Drupal::service('datetime.views_helper')->buildViewsData(). + $rectorConfig->rule(ReplaceDateTimeRangeConstantsRector::class); + // https://www.drupal.org/node/3575841 // SystemManager::REQUIREMENT_* deprecated in drupal:11.2.0, removed in drupal:12.0.0. // Replaced by \Drupal\Core\Extension\Requirement\RequirementSeverity enum cases. diff --git a/config/drupal-11/drupal-11.3-deprecations.php b/config/drupal-11/drupal-11.3-deprecations.php index ea9fca7a5..16f5d62f3 100644 --- a/config/drupal-11/drupal-11.3-deprecations.php +++ b/config/drupal-11/drupal-11.3-deprecations.php @@ -2,6 +2,8 @@ declare(strict_types=1); +use DrupalRector\Drupal11\Rector\Deprecation\ErrorCurrentErrorHandlerRector; +use DrupalRector\Drupal11\Rector\Deprecation\FileSystemBasenameToNativeRector; use DrupalRector\Drupal11\Rector\Deprecation\LoadAllIncludesRector; use DrupalRector\Drupal11\Rector\Deprecation\NodeStorageDeprecatedMethodsRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceCommentManagerGetCountNewCommentsRector; @@ -77,4 +79,14 @@ // deprecated in drupal:11.3.0, removed in drupal:13.0.0. // Replaced by NodePreviewMode enum cases. $rectorConfig->rule(ReplaceNodeSetPreviewModeRector::class); + + // https://www.drupal.org/node/3530461 + // FileSystemInterface::basename() deprecated in drupal:11.3.0, removed in drupal:13.0.0. + // Replaced by PHP native basename(). + $rectorConfig->rule(FileSystemBasenameToNativeRector::class); + + // https://www.drupal.org/node/3526515 + // Error::currentErrorHandler() deprecated in drupal:11.3.0, removed in drupal:13.0.0. + // Replaced by PHP built-in get_error_handler(). + $rectorConfig->rule(ErrorCurrentErrorHandlerRector::class); }; diff --git a/config/drupal-11/drupal-11.4-deprecations.php b/config/drupal-11/drupal-11.4-deprecations.php index d4361166c..a057be018 100644 --- a/config/drupal-11/drupal-11.4-deprecations.php +++ b/config/drupal-11/drupal-11.4-deprecations.php @@ -3,7 +3,10 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\RemoveAutomatedCronSubmitHandlerRector; +use DrupalRector\Drupal11\Rector\Deprecation\RemoveConfigSaveTrustedDataArgRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveLinkWidgetValidateTitleElementRector; +use DrupalRector\Drupal11\Rector\Deprecation\RemoveSetUriCallbackRector; +use DrupalRector\Drupal11\Rector\Deprecation\RemoveTrustDataCallRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceSessionManagerDeleteRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceViewsProceduralFunctionsRector; use DrupalRector\Drupal11\Rector\Deprecation\UseEntityTypeHasIntegerIdRector; @@ -165,8 +168,23 @@ new FunctionCallRemovalConfiguration('views_ui_contextual_links_suppress_pop'), new FunctionCallRemovalConfiguration('automated_cron_settings_submit'), new FunctionCallRemovalConfiguration('block_theme_initialize'), + new FunctionCallRemovalConfiguration('syslog_facility_list'), + new FunctionCallRemovalConfiguration('syslog_logging_settings_submit'), + new FunctionCallRemovalConfiguration('taxonomy_build_node_index'), + new FunctionCallRemovalConfiguration('taxonomy_delete_node_index'), ]); + // https://www.drupal.org/node/2667040 + // EntityTypeInterface::setUriCallback() deprecated in drupal:11.4.0, removed in drupal:13.0.0. + // Use link templates or a route provider instead. + $rectorConfig->rule(RemoveSetUriCallbackRector::class); + + // https://www.drupal.org/node/3347842 + // trustData() deprecated in drupal:11.4.0, removed in drupal:13.0.0. Remove from fluent chains. + // Config::save($has_trusted_data) boolean arg deprecated in drupal:11.4.0, removed in drupal:13.0.0. + $rectorConfig->rule(RemoveTrustDataCallRector::class); + $rectorConfig->rule(RemoveConfigSaveTrustedDataArgRector::class); + // https://www.drupal.org/node/3093118 // LinkWidget::validateTitleElement() deprecated in drupal:11.4.0, removed in drupal:12.0.0. // Validation is now handled by LinkTitleRequiredConstraint on the LinkItem field type. diff --git a/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector.php b/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector.php new file mode 100644 index 000000000..8887657bb --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector.php @@ -0,0 +1,54 @@ +> */ + public function getNodeTypes(): array + { + return [StaticCall::class]; + } + + public function refactor(Node $node): ?Node + { + if (!$this->isName($node->name, 'currentErrorHandler')) { + return null; + } + if (!$this->isObjectType($node->class, new ObjectType('Drupal\Core\Utility\Error'))) { + return null; + } + return new FuncCall(new Name('get_error_handler'), []); + } +} diff --git a/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector.php b/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector.php new file mode 100644 index 000000000..6ab856bff --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector.php @@ -0,0 +1,66 @@ +basename($uri, $suffix);', + 'basename($uri, $suffix);' + ), + ] + ); + } + + /** @return array> */ + public function getNodeTypes(): array + { + return [MethodCall::class]; + } + + public function refactor(Node $node): ?Node + { + if (!$this->isName($node->name, 'basename')) { + return null; + } + + $callerType = $this->getType($node->var); + $isFileSystem = false; + foreach (['Drupal\Core\File\FileSystemInterface', 'Drupal\Core\File\FileSystem'] as $class) { + if ($this->isObjectType($node->var, new ObjectType($class))) { + $isFileSystem = true; + break; + } + } + + if (!$isFileSystem) { + return null; + } + + return new FuncCall(new Name('basename'), $node->getArgs()); + } +} diff --git a/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector.php b/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector.php new file mode 100644 index 000000000..07820b986 --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector.php @@ -0,0 +1,66 @@ +save(TRUE);', + '$config->save();' + ), + ] + ); + } + + /** @return array> */ + public function getNodeTypes(): array + { + return [MethodCall::class]; + } + + public function refactor(Node $node): ?Node + { + if (!$this->isName($node->name, 'save')) { + return null; + } + if (count($node->args) !== 1) { + return null; + } + $arg = $node->args[0]; + if (!$arg instanceof Arg) { + return null; + } + if (!$arg->value instanceof ConstFetch) { + return null; + } + $constName = strtolower((string) $arg->value->name); + if ($constName !== 'true' && $constName !== 'false') { + return null; + } + $node->args = []; + return $node; + } +} diff --git a/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector.php b/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector.php new file mode 100644 index 000000000..2acac3c25 --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector.php @@ -0,0 +1,78 @@ +moduleHandler->writeCache();', + '' + ), + new CodeSample( + '$hookInfo = $this->moduleHandler->getHookInfo();', + '$hookInfo = [];' + ), + ] + ); + } + + /** @return array> */ + public function getNodeTypes(): array + { + return [Expression::class, MethodCall::class]; + } + + public function refactor(Node $node): int|Node|null + { + if ($node instanceof Expression && $node->expr instanceof MethodCall) { + $call = $node->expr; + if ($this->isModuleHandlerMethodCall($call, 'writeCache') + || $this->isModuleHandlerMethodCall($call, 'getHookInfo') + ) { + return NodeVisitor::REMOVE_NODE; + } + } + + if ($node instanceof MethodCall + && $this->isModuleHandlerMethodCall($node, 'getHookInfo') + ) { + return new Array_([]); + } + + return null; + } + + private function isModuleHandlerMethodCall(MethodCall $call, string $methodName): bool + { + return $this->isName($call->name, $methodName) + && $this->isObjectType( + $call->var, + new ObjectType('Drupal\Core\Extension\ModuleHandlerInterface') + ); + } +} diff --git a/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector.php b/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector.php new file mode 100644 index 000000000..9ddf1a159 --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector.php @@ -0,0 +1,68 @@ +setUriCallback(\'my_entity_uri\');', + '' + ), + ] + ); + } + + /** @return array> */ + public function getNodeTypes(): array + { + return [Expression::class, MethodCall::class]; + } + + public function refactor(Node $node): int|Node|null + { + if ($node instanceof Expression) { + if ($node->expr instanceof MethodCall + && $this->isName($node->expr->name, 'setUriCallback') + ) { + return NodeVisitor::REMOVE_NODE; + } + return null; + } + + // Fluent chain: $entity_type->setUriCallback('func')->someOtherMethod() + if ($node instanceof MethodCall) { + if ($node->var instanceof MethodCall + && $this->isName($node->var->name, 'setUriCallback') + ) { + $node->var = $node->var->var; + return $node; + } + } + + return null; + } +} diff --git a/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector.php b/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector.php new file mode 100644 index 000000000..46b5534cb --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector.php @@ -0,0 +1,49 @@ +trustData()->save();', + '$entity->save();' + ), + ] + ); + } + + /** @return array> */ + public function getNodeTypes(): array + { + return [MethodCall::class]; + } + + public function refactor(Node $node): ?Node + { + if (!$this->isName($node->name, 'trustData')) { + return null; + } + return $node->var; + } +} diff --git a/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector.php b/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector.php new file mode 100644 index 000000000..48f5d9c0c --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector.php @@ -0,0 +1,109 @@ + 'Both', + 'START_DATE' => 'StartDate', + 'END_DATE' => 'EndDate', + ]; + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition( + 'Replace removed DateTimeRangeConstantsInterface constants and datetime_type_field_views_data_helper() with Drupal 12 equivalents', + [ + new CodeSample( + 'DateTimeRangeConstantsInterface::BOTH;', + '\\Drupal\\datetime_range\\DateTimeRangeDisplayOptions::Both->value;' + ), + new CodeSample( + 'datetime_type_field_views_data_helper($field_storage, $data, $column);', + "\\Drupal::service('datetime.views_helper')->buildViewsData(\$field_storage, \$data, \$column);" + ), + ] + ); + } + + /** @return array> */ + public function getNodeTypes(): array + { + return [ClassConstFetch::class, FuncCall::class]; + } + + public function refactor(Node $node): ?Node + { + if ($node instanceof ClassConstFetch) { + return $this->refactorClassConst($node); + } + if ($node instanceof FuncCall) { + return $this->refactorFuncCall($node); + } + return null; + } + + private function refactorClassConst(ClassConstFetch $node): ?Node + { + if (!$node->name instanceof Identifier) { + return null; + } + $constName = $node->name->toString(); + if (!isset(self::CONST_MAP[$constName])) { + return null; + } + if (!$this->isName($node->class, self::CONSTANTS_INTERFACE)) { + return null; + } + $enumCaseFetch = new ClassConstFetch( + new FullyQualified(self::DISPLAY_OPTIONS_ENUM), + self::CONST_MAP[$constName] + ); + return new PropertyFetch($enumCaseFetch, 'value'); + } + + private function refactorFuncCall(FuncCall $node): ?Node + { + if (!$node->name instanceof Name) { + return null; + } + if ($node->name->toString() !== 'datetime_type_field_views_data_helper') { + return null; + } + $serviceCall = new StaticCall( + new FullyQualified('Drupal'), + 'service', + [new Arg(new String_('datetime.views_helper'))] + ); + return new MethodCall($serviceCall, 'buildViewsData', $node->args); + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/ErrorCurrentErrorHandlerRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/ErrorCurrentErrorHandlerRectorTest.php new file mode 100644 index 000000000..694681a61 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/ErrorCurrentErrorHandlerRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/config/configured_rule.php new file mode 100644 index 000000000..f4f1533c4 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/config/configured_rule.php @@ -0,0 +1,11 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/FileSystemBasenameToNativeRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/FileSystemBasenameToNativeRectorTest.php new file mode 100644 index 000000000..4c4382eaa --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/FileSystemBasenameToNativeRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/config/configured_rule.php new file mode 100644 index 000000000..99c8ffdf3 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/config/configured_rule.php @@ -0,0 +1,11 @@ +basename($uri, '.txt'); +$noop = $untyped->basename($uri, '.txt'); + +?> +----- +basename($uri, '.txt'); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector/RemoveConfigSaveTrustedDataArgRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector/RemoveConfigSaveTrustedDataArgRectorTest.php new file mode 100644 index 000000000..c0378c981 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector/RemoveConfigSaveTrustedDataArgRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector/config/configured_rule.php new file mode 100644 index 000000000..ca3d908a4 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector/config/configured_rule.php @@ -0,0 +1,11 @@ +save(TRUE); +$config->save(FALSE); +$config->save(); +$other->save(TRUE); + +?> +----- +save(); +$config->save(); +$config->save(); +$other->save(); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector/RemoveModuleHandlerDeprecatedMethodsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector/RemoveModuleHandlerDeprecatedMethodsRectorTest.php new file mode 100644 index 000000000..94773b972 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector/RemoveModuleHandlerDeprecatedMethodsRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector/config/configured_rule.php new file mode 100644 index 000000000..1e7ecebb9 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector/config/configured_rule.php @@ -0,0 +1,11 @@ +writeCache(); +$hookInfo = $moduleHandler->getHookInfo(); +$untyped->writeCache(); + +?> +----- +writeCache(); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/RemoveSetUriCallbackRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/RemoveSetUriCallbackRectorTest.php new file mode 100644 index 000000000..eeee99d08 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/RemoveSetUriCallbackRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/config/configured_rule.php new file mode 100644 index 000000000..2d774ca1b --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/config/configured_rule.php @@ -0,0 +1,11 @@ +setUriCallback('my_entity_uri'); +$entity_types['other']->setUriCallback('other_uri')->setLabel('Other'); +$other->someMethod(); + +?> +----- +setLabel('Other'); +$other->someMethod(); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/RemoveTrustDataCallRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/RemoveTrustDataCallRectorTest.php new file mode 100644 index 000000000..6a30f9a30 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/RemoveTrustDataCallRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/config/configured_rule.php new file mode 100644 index 000000000..2bf3b9b50 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/config/configured_rule.php @@ -0,0 +1,11 @@ +trustData()->save(); +$other->someMethod(); + +?> +----- +save(); +$other->someMethod(); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/ReplaceDateTimeRangeConstantsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/ReplaceDateTimeRangeConstantsRectorTest.php new file mode 100644 index 000000000..f41e0ca6a --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/ReplaceDateTimeRangeConstantsRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/config/configured_rule.php new file mode 100644 index 000000000..173ba2f09 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/config/configured_rule.php @@ -0,0 +1,11 @@ + +----- +value; +$b = \Drupal\datetime_range\DateTimeRangeDisplayOptions::StartDate->value; +$c = \Drupal\datetime_range\DateTimeRangeDisplayOptions::EndDate->value; +\Drupal::service('datetime.views_helper')->buildViewsData($field_storage, $data, 'value'); + +?> From bcc68684ef18c7e02cdb87006d95de3560fd8034 Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 20:19:19 +0200 Subject: [PATCH 035/256] feat(Drupal11): Add Phase 7 deprecation rectors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ReplaceThemeGetSettingRector: theme_get_setting() → ThemeSettingsProvider service, _system_default_theme_features() → ThemeSettingsProvider::DEFAULT_THEME_FEATURES (11.3) - ReplaceNodeModuleProceduralFunctionsRector: node_type_get_names() → entity_type.bundle.info service, node_get_type_label($node) → $node->getBundleEntity()->label() (11.3) - RemoveCacheExpireOverrideRector: remove cacheExpire() method overrides from CachePluginBase subclasses (11.4) - Config: template_preprocess_layout → LayoutDiscoveryThemeHooks::preprocessLayout via FunctionToServiceRector (11.3) --- config/drupal-11/drupal-11.3-deprecations.php | 10 ++ config/drupal-11/drupal-11.4-deprecations.php | 6 ++ .../RemoveCacheExpireOverrideRector.php | 92 +++++++++++++++++++ ...aceNodeModuleProceduralFunctionsRector.php | 86 +++++++++++++++++ .../ReplaceThemeGetSettingRector.php | 82 +++++++++++++++++ .../RemoveCacheExpireOverrideRectorTest.php | 33 +++++++ .../config/configured_rule.php | 11 +++ .../fixture/basic.php.inc | 48 ++++++++++ ...odeModuleProceduralFunctionsRectorTest.php | 33 +++++++ .../config/configured_rule.php | 11 +++ .../fixture/basic.php.inc | 13 +++ .../ReplaceThemeGetSettingRectorTest.php | 33 +++++++ .../config/configured_rule.php | 11 +++ .../fixture/basic.php.inc | 15 +++ 14 files changed, 484 insertions(+) create mode 100644 src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector.php create mode 100644 src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector.php create mode 100644 src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/RemoveCacheExpireOverrideRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/fixture/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/ReplaceNodeModuleProceduralFunctionsRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/fixture/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/ReplaceThemeGetSettingRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/fixture/basic.php.inc diff --git a/config/drupal-11/drupal-11.3-deprecations.php b/config/drupal-11/drupal-11.3-deprecations.php index 16f5d62f3..5c2455bb9 100644 --- a/config/drupal-11/drupal-11.3-deprecations.php +++ b/config/drupal-11/drupal-11.3-deprecations.php @@ -5,6 +5,8 @@ use DrupalRector\Drupal11\Rector\Deprecation\ErrorCurrentErrorHandlerRector; use DrupalRector\Drupal11\Rector\Deprecation\FileSystemBasenameToNativeRector; use DrupalRector\Drupal11\Rector\Deprecation\LoadAllIncludesRector; +use DrupalRector\Drupal11\Rector\Deprecation\ReplaceNodeModuleProceduralFunctionsRector; +use DrupalRector\Drupal11\Rector\Deprecation\ReplaceThemeGetSettingRector; use DrupalRector\Drupal11\Rector\Deprecation\NodeStorageDeprecatedMethodsRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceCommentManagerGetCountNewCommentsRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceCommentUriRector; @@ -41,9 +43,12 @@ // https://www.drupal.org/node/3571623 // node_mass_update() deprecated in drupal:11.3.0, removed in drupal:13.0.0. // Replaced by \Drupal\node\NodeBulkUpdate::process(). + // node_type_get_names() and node_get_type_label() deprecated in drupal:11.3.0, removed in drupal:13.0.0. $rectorConfig->ruleWithConfiguration(FunctionToServiceRector::class, [ new FunctionToServiceConfiguration('11.3.0', 'node_mass_update', 'Drupal\node\NodeBulkUpdate', 'process'), + new FunctionToServiceConfiguration('11.3.0', 'template_preprocess_layout', 'Drupal\layout_discovery\Hook\LayoutDiscoveryThemeHooks', 'preprocessLayout'), ]); + $rectorConfig->rule(ReplaceNodeModuleProceduralFunctionsRector::class); // https://www.drupal.org/node/3504005 // block_content_add_body_field() deprecated in drupal:11.3.0, removed in drupal:13.0.0. @@ -89,4 +94,9 @@ // Error::currentErrorHandler() deprecated in drupal:11.3.0, removed in drupal:13.0.0. // Replaced by PHP built-in get_error_handler(). $rectorConfig->rule(ErrorCurrentErrorHandlerRector::class); + + // https://www.drupal.org/node/3573896 + // theme_get_setting() and _system_default_theme_features() deprecated in drupal:11.3.0, removed in drupal:13.0.0. + // Replaced by ThemeSettingsProvider service. + $rectorConfig->rule(ReplaceThemeGetSettingRector::class); }; diff --git a/config/drupal-11/drupal-11.4-deprecations.php b/config/drupal-11/drupal-11.4-deprecations.php index a057be018..7653e7342 100644 --- a/config/drupal-11/drupal-11.4-deprecations.php +++ b/config/drupal-11/drupal-11.4-deprecations.php @@ -3,6 +3,7 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\RemoveAutomatedCronSubmitHandlerRector; +use DrupalRector\Drupal11\Rector\Deprecation\RemoveCacheExpireOverrideRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveConfigSaveTrustedDataArgRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveLinkWidgetValidateTitleElementRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveSetUriCallbackRector; @@ -179,6 +180,11 @@ // Use link templates or a route provider instead. $rectorConfig->rule(RemoveSetUriCallbackRector::class); + // https://www.drupal.org/node/3576556 + // CachePluginBase::cacheExpire() deprecated in drupal:11.4.0, removed in drupal:13.0.0. + // Subclass overrides are dead code; remove them. + $rectorConfig->rule(RemoveCacheExpireOverrideRector::class); + // https://www.drupal.org/node/3347842 // trustData() deprecated in drupal:11.4.0, removed in drupal:13.0.0. Remove from fluent chains. // Config::save($has_trusted_data) boolean arg deprecated in drupal:11.4.0, removed in drupal:13.0.0. diff --git a/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector.php b/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector.php new file mode 100644 index 000000000..6cf0ae6ac --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector.php @@ -0,0 +1,92 @@ +> */ + public function getNodeTypes(): array + { + return [Class_::class]; + } + + public function refactor(Node $node): ?Node + { + if (!$this->isCachePluginBaseSubclass($node)) { + return null; + } + + $changed = false; + foreach ($node->stmts as $key => $stmt) { + if ($stmt instanceof ClassMethod && $this->isName($stmt, 'cacheExpire')) { + unset($node->stmts[$key]); + $changed = true; + } + } + + return $changed ? $node : null; + } + + private function isCachePluginBaseSubclass(Class_ $node): bool + { + if ($node->extends === null) { + return false; + } + + $parentName = $node->extends->toString(); + + if ($parentName === self::CACHE_PLUGIN_BASE_FQCN) { + return true; + } + + foreach (self::PARENT_SHORT_NAMES as $short) { + if ($parentName === $short || str_ends_with($parentName, '\\' . $short)) { + return true; + } + } + + try { + if ($this->isObjectType($node->extends, new ObjectType(self::CACHE_PLUGIN_BASE_FQCN))) { + return true; + } + } catch (\Throwable) { + } + + return false; + } +} diff --git a/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector.php b/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector.php new file mode 100644 index 000000000..f82fbcbdb --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector.php @@ -0,0 +1,86 @@ +getBundleLabels('node');" + ), + new CodeSample( + 'node_get_type_label($node);', + '$node->getBundleEntity()->label();' + ), + ] + ); + } + + /** @return array> */ + public function getNodeTypes(): array + { + return [FuncCall::class]; + } + + public function refactor(Node $node): ?Node + { + if (!$node->name instanceof Name) { + return null; + } + + return match ($node->name->toString()) { + 'node_type_get_names' => $this->refactorNodeTypeGetNames(), + 'node_get_type_label' => $this->refactorNodeGetTypeLabel($node), + default => null, + }; + } + + private function refactorNodeTypeGetNames(): Node + { + $serviceCall = new StaticCall( + new FullyQualified('Drupal'), + 'service', + [new Arg(new String_('entity_type.bundle.info'))] + ); + return new MethodCall($serviceCall, 'getBundleLabels', [new Arg(new String_('node'))]); + } + + private function refactorNodeGetTypeLabel(FuncCall $node): ?Node + { + if (count($node->args) < 1) { + return null; + } + $nodeArg = $node->args[0]->value; + return new MethodCall( + new MethodCall($nodeArg, 'getBundleEntity'), + 'label' + ); + } +} diff --git a/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector.php b/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector.php new file mode 100644 index 000000000..14f9e7524 --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector.php @@ -0,0 +1,82 @@ +getSetting('logo.url');" + ), + new CodeSample( + '_system_default_theme_features();', + '\\Drupal\\Core\\Extension\\ThemeSettingsProvider::DEFAULT_THEME_FEATURES;' + ), + ] + ); + } + + /** @return array> */ + public function getNodeTypes(): array + { + return [FuncCall::class]; + } + + public function refactor(Node $node): ?Node + { + if (!$node->name instanceof Name) { + return null; + } + + $funcName = $node->name->toString(); + + if ($funcName === 'theme_get_setting') { + $serviceCall = new StaticCall( + new FullyQualified('Drupal'), + 'service', + [new Arg(new ClassConstFetch( + new FullyQualified(self::THEME_SETTINGS_PROVIDER), + 'class' + ))] + ); + return new MethodCall($serviceCall, 'getSetting', $node->args); + } + + if ($funcName === '_system_default_theme_features') { + return new ClassConstFetch( + new FullyQualified(self::THEME_SETTINGS_PROVIDER), + 'DEFAULT_THEME_FEATURES' + ); + } + + return null; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/RemoveCacheExpireOverrideRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/RemoveCacheExpireOverrideRectorTest.php new file mode 100644 index 000000000..3e335fd9f --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/RemoveCacheExpireOverrideRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/config/configured_rule.php new file mode 100644 index 000000000..662385485 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/config/configured_rule.php @@ -0,0 +1,11 @@ +getRequestTime() - $this->options['lifespan']; + } + + protected function cacheSetMaxAge($type) + { + return $this->options['lifespan'] ?: \Drupal\Core\Cache\Cache::PERMANENT; + } +} + +class UnrelatedClass +{ + protected function cacheExpire($type) + { + return 0; + } +} + +?> +----- +options['lifespan'] ?: \Drupal\Core\Cache\Cache::PERMANENT; + } +} + +class UnrelatedClass +{ + protected function cacheExpire($type) + { + return 0; + } +} + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/ReplaceNodeModuleProceduralFunctionsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/ReplaceNodeModuleProceduralFunctionsRectorTest.php new file mode 100644 index 000000000..1608c0494 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/ReplaceNodeModuleProceduralFunctionsRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/config/configured_rule.php new file mode 100644 index 000000000..ee8da52a4 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/config/configured_rule.php @@ -0,0 +1,11 @@ + +----- +getBundleLabels('node'); +$label = $node->getBundleEntity()->label(); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/ReplaceThemeGetSettingRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/ReplaceThemeGetSettingRectorTest.php new file mode 100644 index 000000000..8271e9544 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/ReplaceThemeGetSettingRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/config/configured_rule.php new file mode 100644 index 000000000..d693bc3ec --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/config/configured_rule.php @@ -0,0 +1,11 @@ + +----- +getSetting('logo.url'); +$fav = \Drupal::service(\Drupal\Core\Extension\ThemeSettingsProvider::class)->getSetting('favicon.url', 'claro'); +$features = \Drupal\Core\Extension\ThemeSettingsProvider::DEFAULT_THEME_FEATURES; + +?> From c2439794dfdd5da1e4f8476f373d388b5b767e7e Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 20:22:38 +0200 Subject: [PATCH 036/256] feat(Drupal11): Add Phase 8 deprecation rectors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - RemoveRootFromConvertDbUrlRector: remove deprecated string $root arg from Database::convertDbUrlToConnectionInfo() (11.3) - ReplacePdoFetchConstantsRector: PDO::FETCH_* constants → FetchAs enum cases in Drupal DB API (11.2) - ReplaceSystemPerformanceGzipKeyRector: system.performance css.gzip/js.gzip config keys → css.compress/js.compress (11.4) --- config/drupal-11/drupal-11.2-deprecations.php | 6 + config/drupal-11/drupal-11.3-deprecations.php | 6 + config/drupal-11/drupal-11.4-deprecations.php | 6 + .../RemoveRootFromConvertDbUrlRector.php | 90 ++++++++++++ .../ReplacePdoFetchConstantsRector.php | 139 ++++++++++++++++++ .../ReplaceSystemPerformanceGzipKeyRector.php | 99 +++++++++++++ .../RemoveRootFromConvertDbUrlRectorTest.php | 33 +++++ .../config/configured_rule.php | 11 ++ .../fixture/basic.php.inc | 25 ++++ .../ReplacePdoFetchConstantsRectorTest.php | 33 +++++ .../config/configured_rule.php | 11 ++ .../fixture/basic.php.inc | 23 +++ ...laceSystemPerformanceGzipKeyRectorTest.php | 33 +++++ .../config/configured_rule.php | 11 ++ .../fixture/basic.php.inc | 19 +++ 15 files changed, 545 insertions(+) create mode 100644 src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector.php create mode 100644 src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector.php create mode 100644 src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/RemoveRootFromConvertDbUrlRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/ReplacePdoFetchConstantsRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/ReplaceSystemPerformanceGzipKeyRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/fixture/basic.php.inc diff --git a/config/drupal-11/drupal-11.2-deprecations.php b/config/drupal-11/drupal-11.2-deprecations.php index 301882852..6c1429082 100644 --- a/config/drupal-11/drupal-11.2-deprecations.php +++ b/config/drupal-11/drupal-11.2-deprecations.php @@ -4,6 +4,7 @@ use DrupalRector\Drupal11\Rector\Deprecation\RemoveModuleHandlerAddModuleCallsRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceDateTimeRangeConstantsRector; +use DrupalRector\Drupal11\Rector\Deprecation\ReplacePdoFetchConstantsRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceRequirementSeverityConstantsRector; use DrupalRector\Drupal11\Rector\Deprecation\StatementPrefetchIteratorFetchColumnRector; use DrupalRector\Rector\Deprecation\ClassConstantToClassConstantRector; @@ -88,6 +89,11 @@ // Replaced by RequirementSeverity enum cases. $rectorConfig->rule(ReplaceRequirementSeverityConstantsRector::class); + // https://www.drupal.org/node/3525077 + // PDO::FETCH_* constants deprecated in drupal:11.2.0, removed in drupal:12.0.0. + // Replaced by \Drupal\Core\Database\Statement\FetchAs enum cases. + $rectorConfig->rule(ReplacePdoFetchConstantsRector::class); + // https://www.drupal.org/node/3574901 // DateTimeRangeConstantsInterface::BOTH/START_DATE/END_DATE deprecated in drupal:11.2.0, removed in drupal:12.0.0. // Replaced by DateTimeRangeDisplayOptions enum cases (->value). diff --git a/config/drupal-11/drupal-11.3-deprecations.php b/config/drupal-11/drupal-11.3-deprecations.php index 5c2455bb9..c7fbba8e6 100644 --- a/config/drupal-11/drupal-11.3-deprecations.php +++ b/config/drupal-11/drupal-11.3-deprecations.php @@ -4,6 +4,7 @@ use DrupalRector\Drupal11\Rector\Deprecation\ErrorCurrentErrorHandlerRector; use DrupalRector\Drupal11\Rector\Deprecation\FileSystemBasenameToNativeRector; +use DrupalRector\Drupal11\Rector\Deprecation\RemoveRootFromConvertDbUrlRector; use DrupalRector\Drupal11\Rector\Deprecation\LoadAllIncludesRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceNodeModuleProceduralFunctionsRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceThemeGetSettingRector; @@ -99,4 +100,9 @@ // theme_get_setting() and _system_default_theme_features() deprecated in drupal:11.3.0, removed in drupal:13.0.0. // Replaced by ThemeSettingsProvider service. $rectorConfig->rule(ReplaceThemeGetSettingRector::class); + + // https://www.drupal.org/node/3522513 + // Database::convertDbUrlToConnectionInfo($url, $root, ...) deprecated in drupal:11.3.0, removed in drupal:12.0.0. + // The $root parameter is obsolete; remove it (shift any $include_test_drivers arg left). + $rectorConfig->rule(RemoveRootFromConvertDbUrlRector::class); }; diff --git a/config/drupal-11/drupal-11.4-deprecations.php b/config/drupal-11/drupal-11.4-deprecations.php index 7653e7342..640670287 100644 --- a/config/drupal-11/drupal-11.4-deprecations.php +++ b/config/drupal-11/drupal-11.4-deprecations.php @@ -5,6 +5,7 @@ use DrupalRector\Drupal11\Rector\Deprecation\RemoveAutomatedCronSubmitHandlerRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveCacheExpireOverrideRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveConfigSaveTrustedDataArgRector; +use DrupalRector\Drupal11\Rector\Deprecation\ReplaceSystemPerformanceGzipKeyRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveLinkWidgetValidateTitleElementRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveSetUriCallbackRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveTrustDataCallRector; @@ -180,6 +181,11 @@ // Use link templates or a route provider instead. $rectorConfig->rule(RemoveSetUriCallbackRector::class); + // https://www.drupal.org/node/3184242 + // system.performance css.gzip and js.gzip config keys deprecated in drupal:11.4.0, removed in drupal:12.0.0. + // Replaced by css.compress and js.compress. + $rectorConfig->rule(ReplaceSystemPerformanceGzipKeyRector::class); + // https://www.drupal.org/node/3576556 // CachePluginBase::cacheExpire() deprecated in drupal:11.4.0, removed in drupal:13.0.0. // Subclass overrides are dead code; remove them. diff --git a/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector.php b/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector.php new file mode 100644 index 000000000..741a7513c --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector.php @@ -0,0 +1,90 @@ +root, TRUE);', + 'Database::convertDbUrlToConnectionInfo($url, TRUE);' + ), + ] + ); + } + + /** @return array> */ + public function getNodeTypes(): array + { + return [StaticCall::class]; + } + + public function refactor(Node $node): ?Node + { + if (!$this->isName($node->class, 'Drupal\Core\Database\Database')) { + return null; + } + if (!$this->isName($node->name, 'convertDbUrlToConnectionInfo')) { + return null; + } + if (count($node->args) < 2) { + return null; + } + + $secondArg = $node->args[1]; + if (!$secondArg instanceof Arg) { + return null; + } + $secondArgValue = $secondArg->value; + + if ($secondArgValue instanceof ConstFetch) { + $constName = strtolower((string) $secondArgValue->name); + if ($constName === 'true' || $constName === 'false' || $constName === 'null') { + return null; + } + } elseif ($secondArgValue instanceof Variable) { + return null; + } elseif ( + !$secondArgValue instanceof String_ + && !$secondArgValue instanceof PropertyFetch + && !$secondArgValue instanceof NullsafePropertyFetch + && !$secondArgValue instanceof FuncCall + && !$secondArgValue instanceof StaticPropertyFetch + && !$secondArgValue instanceof MethodCall + ) { + return null; + } + + array_splice($node->args, 1, 1); + return $node; + } +} diff --git a/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector.php b/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector.php new file mode 100644 index 000000000..5eec69641 --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector.php @@ -0,0 +1,139 @@ + 'Object', + 'FETCH_ASSOC' => 'Associative', + 'FETCH_NUM' => 'List', + 'FETCH_COLUMN' => 'Column', + 'FETCH_CLASS' => 'ClassObject', + ]; + + private const DRUPAL_FETCH_METHODS = [ + 'setFetchMode' => 0, + 'fetch' => 0, + 'fetchAll' => 0, + 'fetchAllAssoc' => 1, + ]; + + private const PDO_RETURN_METHODS = ['getClientStatement', 'getClientConnection']; + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition( + 'Replace PDO::FETCH_* constants with FetchAs enum cases in Drupal Database API calls', + [ + new CodeSample( + '$statement->setFetchMode(\\PDO::FETCH_ASSOC);', + '$statement->setFetchMode(\\Drupal\\Core\\Database\\Statement\\FetchAs::Associative);' + ), + ] + ); + } + + /** @return array> */ + public function getNodeTypes(): array + { + return [MethodCall::class, ArrayItem::class]; + } + + public function refactor(Node $node): ?Node + { + if ($node instanceof MethodCall) { + return $this->refactorMethodCall($node); + } + if ($node instanceof ArrayItem) { + return $this->refactorArrayItem($node); + } + return null; + } + + private function refactorMethodCall(MethodCall $node): ?MethodCall + { + $methodName = $this->getName($node->name); + if ($methodName === null || !array_key_exists($methodName, self::DRUPAL_FETCH_METHODS)) { + return null; + } + + if ($node->var instanceof MethodCall) { + $calleeName = $this->getName($node->var->name); + if ($calleeName !== null && in_array($calleeName, self::PDO_RETURN_METHODS, true)) { + return null; + } + } + + $fetchArgIndex = self::DRUPAL_FETCH_METHODS[$methodName]; + $changed = false; + + foreach ($node->args as $index => $arg) { + if (!$arg instanceof Arg || $index !== $fetchArgIndex) { + continue; + } + $replacement = $this->replacePdoFetchConst($arg->value); + if ($replacement !== null) { + $arg->value = $replacement; + $changed = true; + } + } + + return $changed ? $node : null; + } + + private function refactorArrayItem(ArrayItem $node): ?ArrayItem + { + if ($node->key === null) { + return null; + } + if (!($node->key instanceof String_) || $node->key->value !== 'fetch') { + return null; + } + $replacement = $this->replacePdoFetchConst($node->value); + if ($replacement === null) { + return null; + } + $node->value = $replacement; + return $node; + } + + private function replacePdoFetchConst(Node $node): ?ClassConstFetch + { + if (!$node instanceof ClassConstFetch) { + return null; + } + $className = $this->getName($node->class); + if ($className !== 'PDO') { + return null; + } + $constName = $this->getName($node->name); + if ($constName === null || !isset(self::FETCH_MAP[$constName])) { + return null; + } + return new ClassConstFetch( + new FullyQualified('Drupal\Core\Database\Statement\FetchAs'), + self::FETCH_MAP[$constName] + ); + } +} diff --git a/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector.php b/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector.php new file mode 100644 index 000000000..d4c5db3f6 --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector.php @@ -0,0 +1,99 @@ +get('css.gzip');", + "\\Drupal::config('system.performance')->get('css.compress');" + ), + ] + ); + } + + /** @return array> */ + public function getNodeTypes(): array + { + return [MethodCall::class]; + } + + public function refactor(Node $node): ?Node + { + if (!$this->isNames($node->name, ['get', 'set'])) { + return null; + } + if (empty($node->args)) { + return null; + } + $firstArg = $node->args[0]; + if (!$firstArg instanceof Arg) { + return null; + } + $keyExpr = $firstArg->value; + if (!$keyExpr instanceof String_) { + return null; + } + $key = $keyExpr->value; + if ($key !== 'css.gzip' && $key !== 'js.gzip') { + return null; + } + if (!$this->isSystemPerformanceConfigReceiver($node->var)) { + return null; + } + $newKey = ($key === 'css.gzip') ? 'css.compress' : 'js.compress'; + $node->args[0] = new Arg(new String_($newKey)); + return $node; + } + + private function isSystemPerformanceConfigReceiver(Node $receiver): bool + { + $current = $receiver; + while ($current instanceof MethodCall) { + if ($this->isNames($current->name, self::CONFIG_ACCESSOR_METHODS)) { + if (!empty($current->args) && $current->args[0] instanceof Arg) { + $arg = $current->args[0]->value; + if ($arg instanceof String_ && $arg->value === 'system.performance') { + return true; + } + } + } + $current = $current->var; + } + if ($current instanceof StaticCall) { + if ($this->isName($current->name, 'config') && !empty($current->args)) { + $arg = $current->args[0]; + if ($arg instanceof Arg && $arg->value instanceof String_) { + return $arg->value->value === 'system.performance'; + } + } + } + return false; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/RemoveRootFromConvertDbUrlRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/RemoveRootFromConvertDbUrlRectorTest.php new file mode 100644 index 000000000..912a9f8ee --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/RemoveRootFromConvertDbUrlRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/config/configured_rule.php new file mode 100644 index 000000000..268c31250 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/config/configured_rule.php @@ -0,0 +1,11 @@ +root, TRUE); +// With string root, no third arg +Database::convertDbUrlToConnectionInfo($url, $root); +// Already adapted (boolean second arg): leave unchanged +Database::convertDbUrlToConnectionInfo($url, TRUE); + +?> +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/ReplacePdoFetchConstantsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/ReplacePdoFetchConstantsRectorTest.php new file mode 100644 index 000000000..47847ef23 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/ReplacePdoFetchConstantsRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/config/configured_rule.php new file mode 100644 index 000000000..ecb0f6c31 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/config/configured_rule.php @@ -0,0 +1,11 @@ +setFetchMode(\PDO::FETCH_ASSOC); +$statement->fetch(\PDO::FETCH_OBJ); +$rows = $statement->fetchAll(\PDO::FETCH_NUM); +$data = $statement->fetchAllAssoc('id', \PDO::FETCH_ASSOC); +$result = $db->query('SELECT name FROM {test}', [], ['fetch' => \PDO::FETCH_ASSOC]); +// Raw PDO: leave unchanged +$pdo = $statement->getClientStatement()->fetchAll(\PDO::FETCH_ASSOC); + +?> +----- +setFetchMode(\Drupal\Core\Database\Statement\FetchAs::Associative); +$statement->fetch(\Drupal\Core\Database\Statement\FetchAs::Object); +$rows = $statement->fetchAll(\Drupal\Core\Database\Statement\FetchAs::List); +$data = $statement->fetchAllAssoc('id', \Drupal\Core\Database\Statement\FetchAs::Associative); +$result = $db->query('SELECT name FROM {test}', [], ['fetch' => \Drupal\Core\Database\Statement\FetchAs::Associative]); +// Raw PDO: leave unchanged +$pdo = $statement->getClientStatement()->fetchAll(\PDO::FETCH_ASSOC); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/ReplaceSystemPerformanceGzipKeyRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/ReplaceSystemPerformanceGzipKeyRectorTest.php new file mode 100644 index 000000000..d7429f062 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/ReplaceSystemPerformanceGzipKeyRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/config/configured_rule.php new file mode 100644 index 000000000..4ee5002e6 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/config/configured_rule.php @@ -0,0 +1,11 @@ +get('css.gzip'); +$js = \Drupal::config('system.performance')->get('js.gzip'); +\Drupal::configFactory()->getEditable('system.performance')->set('css.gzip', TRUE); +// Unrelated: leave unchanged +$other = \Drupal::config('other.config')->get('css.gzip'); + +?> +----- +get('css.compress'); +$js = \Drupal::config('system.performance')->get('js.compress'); +\Drupal::configFactory()->getEditable('system.performance')->set('css.compress', TRUE); +// Unrelated: leave unchanged +$other = \Drupal::config('other.config')->get('css.gzip'); + +?> From c4e06dbf7b2cadd842a25957e588d3eaa5571e7a Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 20:24:43 +0200 Subject: [PATCH 037/256] feat(Drupal11): Add Phase 9 deprecation rectors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ReplaceAlphadecimalToIntNullRector: Number::alphadecimalToInt(null/'') → 0 (11.2) - ReplaceFieldgroupToFieldsetRector: render array '#type' => 'fieldgroup' → 'fieldset' (11.2) - RemoveViewsRowCacheKeysRector: remove array items with getRowCacheKeys()/getRowId() values (11.4) --- config/drupal-11/drupal-11.2-deprecations.php | 12 +++ config/drupal-11/drupal-11.4-deprecations.php | 6 ++ .../RemoveViewsRowCacheKeysRector.php | 73 ++++++++++++++++++ .../ReplaceAlphadecimalToIntNullRector.php | 74 +++++++++++++++++++ .../ReplaceFieldgroupToFieldsetRector.php | 61 +++++++++++++++ .../RemoveViewsRowCacheKeysRectorTest.php | 33 +++++++++ .../config/configured_rule.php | 11 +++ .../fixture/basic.php.inc | 22 ++++++ ...ReplaceAlphadecimalToIntNullRectorTest.php | 33 +++++++++ .../config/configured_rule.php | 11 +++ .../fixture/basic.php.inc | 21 ++++++ .../ReplaceFieldgroupToFieldsetRectorTest.php | 33 +++++++++ .../config/configured_rule.php | 11 +++ .../fixture/basic.php.inc | 25 +++++++ 14 files changed, 426 insertions(+) create mode 100644 src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php create mode 100644 src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector.php create mode 100644 src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/RemoveViewsRowCacheKeysRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/ReplaceAlphadecimalToIntNullRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/fixture/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/ReplaceFieldgroupToFieldsetRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/fixture/basic.php.inc diff --git a/config/drupal-11/drupal-11.2-deprecations.php b/config/drupal-11/drupal-11.2-deprecations.php index 6c1429082..7cea076f0 100644 --- a/config/drupal-11/drupal-11.2-deprecations.php +++ b/config/drupal-11/drupal-11.2-deprecations.php @@ -4,6 +4,8 @@ use DrupalRector\Drupal11\Rector\Deprecation\RemoveModuleHandlerAddModuleCallsRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceDateTimeRangeConstantsRector; +use DrupalRector\Drupal11\Rector\Deprecation\ReplaceAlphadecimalToIntNullRector; +use DrupalRector\Drupal11\Rector\Deprecation\ReplaceFieldgroupToFieldsetRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplacePdoFetchConstantsRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceRequirementSeverityConstantsRector; use DrupalRector\Drupal11\Rector\Deprecation\StatementPrefetchIteratorFetchColumnRector; @@ -89,6 +91,16 @@ // Replaced by RequirementSeverity enum cases. $rectorConfig->rule(ReplaceRequirementSeverityConstantsRector::class); + // https://www.drupal.org/node/3442810 + // Number::alphadecimalToInt(null/'') deprecated in drupal:11.2.0, removed in drupal:12.0.0. + // Both arguments always produced 0; replaced with literal 0. + $rectorConfig->rule(ReplaceAlphadecimalToIntNullRector::class); + + // https://www.drupal.org/node/3512254 + // #type 'fieldgroup' deprecated in drupal:11.2.0, removed in drupal:12.0.0. + // Replaced by 'fieldset'. + $rectorConfig->rule(ReplaceFieldgroupToFieldsetRector::class); + // https://www.drupal.org/node/3525077 // PDO::FETCH_* constants deprecated in drupal:11.2.0, removed in drupal:12.0.0. // Replaced by \Drupal\Core\Database\Statement\FetchAs enum cases. diff --git a/config/drupal-11/drupal-11.4-deprecations.php b/config/drupal-11/drupal-11.4-deprecations.php index 640670287..ec509c229 100644 --- a/config/drupal-11/drupal-11.4-deprecations.php +++ b/config/drupal-11/drupal-11.4-deprecations.php @@ -5,6 +5,7 @@ use DrupalRector\Drupal11\Rector\Deprecation\RemoveAutomatedCronSubmitHandlerRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveCacheExpireOverrideRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveConfigSaveTrustedDataArgRector; +use DrupalRector\Drupal11\Rector\Deprecation\RemoveViewsRowCacheKeysRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceSystemPerformanceGzipKeyRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveLinkWidgetValidateTitleElementRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveSetUriCallbackRector; @@ -186,6 +187,11 @@ // Replaced by css.compress and js.compress. $rectorConfig->rule(ReplaceSystemPerformanceGzipKeyRector::class); + // https://www.drupal.org/node/3564937 + // CachePluginBase::getRowCacheKeys() and getRowId() deprecated in drupal:11.4.0, removed in drupal:13.0.0. + // Remove array items whose value is one of these calls. + $rectorConfig->rule(RemoveViewsRowCacheKeysRector::class); + // https://www.drupal.org/node/3576556 // CachePluginBase::cacheExpire() deprecated in drupal:11.4.0, removed in drupal:13.0.0. // Subclass overrides are dead code; remove them. diff --git a/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php b/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php new file mode 100644 index 000000000..14b6770e9 --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php @@ -0,0 +1,73 @@ + \$cache_plugin->getRowCacheKeys(\$row), 'tags' => []]", + "['tags' => []]" + ), + ] + ); + } + + /** @return array> */ + public function getNodeTypes(): array + { + return [Array_::class]; + } + + public function refactor(Node $node): ?Node + { + $modified = false; + $newItems = []; + + foreach ($node->items as $item) { + if (!$item instanceof ArrayItem) { + $newItems[] = $item; + continue; + } + if ($item->value instanceof MethodCall + && $item->value->name instanceof Identifier + && in_array($item->value->name->toString(), self::DEPRECATED_METHODS, true) + ) { + $modified = true; + continue; + } + $newItems[] = $item; + } + + if (!$modified) { + return null; + } + $node->items = $newItems; + return $node; + } +} diff --git a/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector.php b/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector.php new file mode 100644 index 000000000..d45120cec --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector.php @@ -0,0 +1,74 @@ +> */ + public function getNodeTypes(): array + { + return [StaticCall::class]; + } + + public function refactor(Node $node): ?Node + { + if (!$this->isName($node->name, 'alphadecimalToInt')) { + return null; + } + if (!$this->isObjectType($node->class, new ObjectType('Drupal\Component\Utility\Number'))) { + return null; + } + if (count($node->args) !== 1) { + return null; + } + $arg = $node->args[0]; + if (!$arg instanceof Arg) { + return null; + } + $value = $arg->value; + + if ($value instanceof ConstFetch + && strtolower($this->getName($value->name)) === 'null' + ) { + return new LNumber(0); + } + + if ($value instanceof String_ && $value->value === '') { + return new LNumber(0); + } + + return null; + } +} diff --git a/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector.php b/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector.php new file mode 100644 index 000000000..255e4e9c4 --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector.php @@ -0,0 +1,61 @@ + 'fieldgroup' with '#type' => 'fieldset' in render arrays. + * + * The Fieldgroup render element is deprecated in drupal:11.2.0 and removed in + * drupal:12.0.0. + * + * @see https://www.drupal.org/node/3512254 + */ +final class ReplaceFieldgroupToFieldsetRector extends AbstractRector +{ + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition( + "Replace '#type' => 'fieldgroup' with '#type' => 'fieldset' in render arrays", + [ + new CodeSample( + "\$form['account'] = ['#type' => 'fieldgroup', '#title' => \$this->t('Account settings')];", + "\$form['account'] = ['#type' => 'fieldset', '#title' => \$this->t('Account settings')];" + ), + ] + ); + } + + /** @return array> */ + public function getNodeTypes(): array + { + return [Array_::class]; + } + + public function refactor(Node $node): ?Node + { + $changed = false; + foreach ($node->items as $item) { + if ($item === null) { + continue; + } + if (!$item->key instanceof String_ || $item->key->value !== '#type') { + continue; + } + if (!$item->value instanceof String_ || $item->value->value !== 'fieldgroup') { + continue; + } + $item->value = new String_('fieldset'); + $changed = true; + } + return $changed ? $node : null; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/RemoveViewsRowCacheKeysRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/RemoveViewsRowCacheKeysRectorTest.php new file mode 100644 index 000000000..3e5d10502 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/RemoveViewsRowCacheKeysRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/config/configured_rule.php new file mode 100644 index 000000000..a10b872dc --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/config/configured_rule.php @@ -0,0 +1,11 @@ + [ + 'keys' => $cache_plugin->getRowCacheKeys($row), + 'tags' => $cache_plugin->getRowCacheTags($row), + 'max-age' => $max_age, + ], +]; + +?> +----- + [ + 'tags' => $cache_plugin->getRowCacheTags($row), + 'max-age' => $max_age, + ], +]; + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/ReplaceAlphadecimalToIntNullRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/ReplaceAlphadecimalToIntNullRectorTest.php new file mode 100644 index 000000000..2c1d9e2fc --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/ReplaceAlphadecimalToIntNullRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/config/configured_rule.php new file mode 100644 index 000000000..a092dde9f --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/config/configured_rule.php @@ -0,0 +1,11 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/ReplaceFieldgroupToFieldsetRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/ReplaceFieldgroupToFieldsetRectorTest.php new file mode 100644 index 000000000..835a3895b --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/ReplaceFieldgroupToFieldsetRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/config/configured_rule.php new file mode 100644 index 000000000..af4f02a5f --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/config/configured_rule.php @@ -0,0 +1,11 @@ + 'fieldgroup', + '#title' => 'Account settings', +]; +$form['other'] = [ + '#type' => 'fieldset', + '#title' => 'Other settings', +]; + +?> +----- + 'fieldset', + '#title' => 'Account settings', +]; +$form['other'] = [ + '#type' => 'fieldset', + '#title' => 'Other settings', +]; + +?> From 7cd65aa7a9ba71cd16711db44f5e1e4bfce5aae8 Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 20:27:12 +0200 Subject: [PATCH 038/256] feat(Drupal11): Add Phase 10 deprecation rectors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - MigrateSqlGetMigrationPluginManagerRector: $this->getMigrationPluginManager() → $this->migrationPluginManager on Sql subclasses (11.0) - RemoveTwigNodeTransTagArgumentRector: remove deprecated 6th $tag arg from TwigNodeTrans constructor (11.2) - ReplaceRecipeRunnerInstallModuleRector: RecipeRunner::installModule($module, ...) → installModules([$module], ...) (11.4) --- config/drupal-11/drupal-11.0-deprecations.php | 6 ++ config/drupal-11/drupal-11.2-deprecations.php | 6 ++ config/drupal-11/drupal-11.4-deprecations.php | 5 ++ ...rateSqlGetMigrationPluginManagerRector.php | 62 +++++++++++++++ .../RemoveTwigNodeTransTagArgumentRector.php | 60 +++++++++++++++ ...ReplaceRecipeRunnerInstallModuleRector.php | 76 +++++++++++++++++++ ...SqlGetMigrationPluginManagerRectorTest.php | 33 ++++++++ .../config/configured_rule.php | 11 +++ .../fixture/basic.php.inc | 25 ++++++ ...moveTwigNodeTransTagArgumentRectorTest.php | 33 ++++++++ .../config/configured_rule.php | 11 +++ .../fixture/basic.php.inc | 17 +++++ ...aceRecipeRunnerInstallModuleRectorTest.php | 33 ++++++++ .../config/configured_rule.php | 11 +++ .../fixture/basic.php.inc | 17 +++++ 15 files changed, 406 insertions(+) create mode 100644 src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector.php create mode 100644 src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector.php create mode 100644 src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/MigrateSqlGetMigrationPluginManagerRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/fixture/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/RemoveTwigNodeTransTagArgumentRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/fixture/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/ReplaceRecipeRunnerInstallModuleRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/fixture/basic.php.inc diff --git a/config/drupal-11/drupal-11.0-deprecations.php b/config/drupal-11/drupal-11.0-deprecations.php index c5a6527d3..61959f1a6 100644 --- a/config/drupal-11/drupal-11.0-deprecations.php +++ b/config/drupal-11/drupal-11.0-deprecations.php @@ -3,6 +3,7 @@ declare(strict_types=1); use DrupalRector\Drupal10\Rector\Deprecation\ReplaceRequestTimeConstantRector; +use DrupalRector\Drupal11\Rector\Deprecation\MigrateSqlGetMigrationPluginManagerRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveStateCacheSettingRector; use DrupalRector\Drupal11\Rector\Deprecation\StripMigrationDependenciesExpandArgRector; use Rector\Config\RectorConfig; @@ -22,4 +23,9 @@ // getMigrationDependencies($expand) deprecated in drupal:11.0.0, removed in drupal:12.0.0. // The $expand boolean argument is removed; call without arguments. $rectorConfig->rule(StripMigrationDependenciesExpandArgRector::class); + + // https://www.drupal.org/node/3439369 + // Sql::getMigrationPluginManager() deprecated in drupal:9.5.0, removed in drupal:11.0.0. + // Replaced by $this->migrationPluginManager property access. + $rectorConfig->rule(MigrateSqlGetMigrationPluginManagerRector::class); }; diff --git a/config/drupal-11/drupal-11.2-deprecations.php b/config/drupal-11/drupal-11.2-deprecations.php index 7cea076f0..974ba3d01 100644 --- a/config/drupal-11/drupal-11.2-deprecations.php +++ b/config/drupal-11/drupal-11.2-deprecations.php @@ -3,6 +3,7 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\RemoveModuleHandlerAddModuleCallsRector; +use DrupalRector\Drupal11\Rector\Deprecation\RemoveTwigNodeTransTagArgumentRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceDateTimeRangeConstantsRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceAlphadecimalToIntNullRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceFieldgroupToFieldsetRector; @@ -91,6 +92,11 @@ // Replaced by RequirementSeverity enum cases. $rectorConfig->rule(ReplaceRequirementSeverityConstantsRector::class); + // https://www.drupal.org/node/3473440 + // TwigNodeTrans 6th $tag constructor argument deprecated in twig/twig 3.12, removed in drupal:11.2.0. + // Drop the argument. + $rectorConfig->rule(RemoveTwigNodeTransTagArgumentRector::class); + // https://www.drupal.org/node/3442810 // Number::alphadecimalToInt(null/'') deprecated in drupal:11.2.0, removed in drupal:12.0.0. // Both arguments always produced 0; replaced with literal 0. diff --git a/config/drupal-11/drupal-11.4-deprecations.php b/config/drupal-11/drupal-11.4-deprecations.php index ec509c229..239c4f2b7 100644 --- a/config/drupal-11/drupal-11.4-deprecations.php +++ b/config/drupal-11/drupal-11.4-deprecations.php @@ -6,6 +6,7 @@ use DrupalRector\Drupal11\Rector\Deprecation\RemoveCacheExpireOverrideRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveConfigSaveTrustedDataArgRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveViewsRowCacheKeysRector; +use DrupalRector\Drupal11\Rector\Deprecation\ReplaceRecipeRunnerInstallModuleRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceSystemPerformanceGzipKeyRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveLinkWidgetValidateTitleElementRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveSetUriCallbackRector; @@ -182,6 +183,10 @@ // Use link templates or a route provider instead. $rectorConfig->rule(RemoveSetUriCallbackRector::class); + // https://www.drupal.org/node/3498026 + // RecipeRunner::installModule() deprecated in drupal:11.4.0. Use installModules() with an array. + $rectorConfig->rule(ReplaceRecipeRunnerInstallModuleRector::class); + // https://www.drupal.org/node/3184242 // system.performance css.gzip and js.gzip config keys deprecated in drupal:11.4.0, removed in drupal:12.0.0. // Replaced by css.compress and js.compress. diff --git a/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector.php b/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector.php new file mode 100644 index 000000000..c19d36e3d --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector.php @@ -0,0 +1,62 @@ +migrationPluginManager directly. + * + * @see https://www.drupal.org/node/3439369 + */ +final class MigrateSqlGetMigrationPluginManagerRector extends AbstractRector +{ + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition( + 'Replace deprecated Sql::getMigrationPluginManager() with $this->migrationPluginManager', + [ + new CodeSample( + '$manager = $this->getMigrationPluginManager();', + '$manager = $this->migrationPluginManager;' + ), + ] + ); + } + + /** @return array> */ + public function getNodeTypes(): array + { + return [MethodCall::class]; + } + + public function refactor(Node $node): ?Node + { + if (!$node->var instanceof Variable || $node->var->name !== 'this') { + return null; + } + if ($this->getName($node->name) !== 'getMigrationPluginManager') { + return null; + } + if ($node->args !== []) { + return null; + } + // Migration::getMigrationPluginManager() is NOT deprecated; skip it. + if ($this->isObjectType($node->var, new ObjectType('Drupal\migrate\Plugin\Migration'))) { + return null; + } + return new PropertyFetch(new Variable('this'), 'migrationPluginManager'); + } +} diff --git a/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector.php b/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector.php new file mode 100644 index 000000000..ceda299fc --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector.php @@ -0,0 +1,60 @@ +getTag());', + 'new TwigNodeTrans($body, $plural, $count, $options, $lineno);' + ), + ] + ); + } + + /** @return array> */ + public function getNodeTypes(): array + { + return [New_::class]; + } + + public function refactor(Node $node): ?Node + { + if (!$node->class instanceof Name) { + return null; + } + $className = $this->getName($node->class); + if ($className !== 'TwigNodeTrans' + && $className !== 'Drupal\Core\Template\TwigNodeTrans' + ) { + return null; + } + if (count($node->args) !== 6) { + return null; + } + array_pop($node->args); + return $node; + } +} diff --git a/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector.php b/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector.php new file mode 100644 index 000000000..0e43c31f9 --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector.php @@ -0,0 +1,76 @@ +> */ + public function getNodeTypes(): array + { + return [StaticCall::class]; + } + + public function refactor(Node $node): ?Node + { + if (!$this->isName($node->name, 'installModule')) { + return null; + } + if (!($node->class instanceof Name)) { + return null; + } + $className = $this->getName($node->class); + if (!in_array($className, [ + 'Drupal\Core\Recipe\RecipeRunner', + 'RecipeRunner', + 'static', + 'self', + ], true)) { + return null; + } + if (empty($node->args)) { + return null; + } + $firstArg = $node->args[0]; + if (!($firstArg instanceof Arg)) { + return null; + } + $wrappedArray = new Array_([new ArrayItem($firstArg->value)]); + $node->name = new Identifier('installModules'); + $node->args = array_merge([new Arg($wrappedArray)], array_slice($node->args, 1)); + return $node; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/MigrateSqlGetMigrationPluginManagerRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/MigrateSqlGetMigrationPluginManagerRectorTest.php new file mode 100644 index 000000000..0f402ce95 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/MigrateSqlGetMigrationPluginManagerRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/config/configured_rule.php new file mode 100644 index 000000000..65d312988 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/config/configured_rule.php @@ -0,0 +1,11 @@ +getMigrationPluginManager(); + $other = $this->someOtherMethod(); + } +} + +?> +----- +migrationPluginManager; + $other = $this->someOtherMethod(); + } +} + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/RemoveTwigNodeTransTagArgumentRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/RemoveTwigNodeTransTagArgumentRectorTest.php new file mode 100644 index 000000000..59965067b --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/RemoveTwigNodeTransTagArgumentRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/config/configured_rule.php new file mode 100644 index 000000000..9cc2320b8 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/config/configured_rule.php @@ -0,0 +1,11 @@ +getTag()); +$other = new OtherClass($a, $b, $c, $d, $e, $f); + +?> +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/ReplaceRecipeRunnerInstallModuleRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/ReplaceRecipeRunnerInstallModuleRectorTest.php new file mode 100644 index 000000000..d3a98f766 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/ReplaceRecipeRunnerInstallModuleRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/config/configured_rule.php new file mode 100644 index 000000000..d423bddd8 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/config/configured_rule.php @@ -0,0 +1,11 @@ + +----- + From c495c8e29b60634f669ec6b0cfea1573f0d6a07e Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 20:38:14 +0200 Subject: [PATCH 039/256] feat(Drupal11): Add more deprecation rules for 11.1-11.3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ReplaceFileGetContentHeadersRector: file_get_content_headers($file) → $file->getDownloadHeaders() (11.2) - ReplaceSessionWritesWithRequestSessionRector: $_SESSION writes → \Drupal::request()->getSession()->set() (11.2) - ReplaceNodeAddBodyFieldRector: node_add_body_field() → $this->createBodyField() (11.3) - ReplaceLocaleTranslationDefaultServerPatternRector: LOCALE_TRANSLATION_DEFAULT_SERVER_PATTERN → \Drupal::TRANSLATION_DEFAULT_SERVER_PATTERN (11.2) - RenameStopProceduralHookScanRector: #[StopProceduralHookScan] → #[ProceduralHookScanStop] (11.2) - RenameClassRector entries: AliasWhitelist→AliasPrefixList, MatchingRouteNotFoundException→ResourceNotFoundException (11.1) - RenameClassRector entries: pgsql entity query namespace move, jsonapi ResourceResponseValidator move (11.2) - RenameClassRector entries: WorkspaceAssociation→WorkspaceTracker (11.3) --- config/drupal-11/drupal-11.1-deprecations.php | 8 ++ config/drupal-11/drupal-11.2-deprecations.php | 35 ++++++++ config/drupal-11/drupal-11.3-deprecations.php | 15 ++++ .../RenameStopProceduralHookScanRector.php | 63 ++++++++++++++ .../ReplaceFileGetContentHeadersRector.php | 53 ++++++++++++ ...eTranslationDefaultServerPatternRector.php | 52 ++++++++++++ .../ReplaceNodeAddBodyFieldRector.php | 76 +++++++++++++++++ ...eSessionWritesWithRequestSessionRector.php | 82 +++++++++++++++++++ ...RenameStopProceduralHookScanRectorTest.php | 33 ++++++++ .../config/configured_rule.php | 11 +++ .../fixture/basic.php.inc | 17 ++++ ...ReplaceFileGetContentHeadersRectorTest.php | 33 ++++++++ .../config/configured_rule.php | 11 +++ .../fixture/basic.php.inc | 13 +++ ...nslationDefaultServerPatternRectorTest.php | 33 ++++++++ .../config/configured_rule.php | 11 +++ .../fixture/basic.php.inc | 13 +++ .../ReplaceNodeAddBodyFieldRectorTest.php | 33 ++++++++ .../config/configured_rule.php | 11 +++ .../fixture/basic.php.inc | 13 +++ ...sionWritesWithRequestSessionRectorTest.php | 33 ++++++++ .../config/configured_rule.php | 11 +++ .../fixture/basic.php.inc | 15 ++++ 23 files changed, 675 insertions(+) create mode 100644 src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector.php create mode 100644 src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector.php create mode 100644 src/Drupal11/Rector/Deprecation/ReplaceLocaleTranslationDefaultServerPatternRector.php create mode 100644 src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector.php create mode 100644 src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector/RenameStopProceduralHookScanRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector/fixture/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/ReplaceFileGetContentHeadersRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleTranslationDefaultServerPatternRector/ReplaceLocaleTranslationDefaultServerPatternRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleTranslationDefaultServerPatternRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleTranslationDefaultServerPatternRector/fixture/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/ReplaceNodeAddBodyFieldRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/fixture/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/ReplaceSessionWritesWithRequestSessionRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/fixture/basic.php.inc diff --git a/config/drupal-11/drupal-11.1-deprecations.php b/config/drupal-11/drupal-11.1-deprecations.php index f4ff98714..10303f37c 100644 --- a/config/drupal-11/drupal-11.1-deprecations.php +++ b/config/drupal-11/drupal-11.1-deprecations.php @@ -8,6 +8,7 @@ use DrupalRector\Rector\Deprecation\MethodToMethodWithCheckRector; use DrupalRector\Rector\ValueObject\MethodToMethodWithCheckConfiguration; use Rector\Config\RectorConfig; +use Rector\Renaming\Rector\Name\RenameClassRector; return static function (RectorConfig $rectorConfig): void { // https://www.drupal.org/node/3459533 @@ -16,8 +17,15 @@ $rectorConfig->rule(PluginBaseIsConfigurableRector::class); // https://www.drupal.org/node/3151086 + // AliasWhitelist and AliasWhitelistInterface deprecated in drupal:11.1.0, removed in drupal:12.0.0. + // Replaced by AliasPrefixList and AliasPrefixListInterface. // AliasManager::pathAliasWhitelistRebuild() deprecated in drupal:11.1.0, removed in drupal:12.0.0. // Replaced by pathAliasPrefixListRebuild(). + $rectorConfig->ruleWithConfiguration(RenameClassRector::class, [ + 'Drupal\path_alias\AliasWhitelist' => 'Drupal\path_alias\AliasPrefixList', + 'Drupal\path_alias\AliasWhitelistInterface' => 'Drupal\path_alias\AliasPrefixListInterface', + 'Drupal\Core\Routing\MatchingRouteNotFoundException' => 'Symfony\Component\Routing\Exception\ResourceNotFoundException', + ]); $rectorConfig->ruleWithConfiguration(MethodToMethodWithCheckRector::class, [ new MethodToMethodWithCheckConfiguration('Drupal\path_alias\AliasManager', 'pathAliasWhitelistRebuild', 'pathAliasPrefixListRebuild'), ]); diff --git a/config/drupal-11/drupal-11.2-deprecations.php b/config/drupal-11/drupal-11.2-deprecations.php index 974ba3d01..587b0f953 100644 --- a/config/drupal-11/drupal-11.2-deprecations.php +++ b/config/drupal-11/drupal-11.2-deprecations.php @@ -4,6 +4,10 @@ use DrupalRector\Drupal11\Rector\Deprecation\RemoveModuleHandlerAddModuleCallsRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveTwigNodeTransTagArgumentRector; +use DrupalRector\Drupal11\Rector\Deprecation\RenameStopProceduralHookScanRector; +use DrupalRector\Drupal11\Rector\Deprecation\ReplaceFileGetContentHeadersRector; +use DrupalRector\Drupal11\Rector\Deprecation\ReplaceLocaleTranslationDefaultServerPatternRector; +use DrupalRector\Drupal11\Rector\Deprecation\ReplaceSessionWritesWithRequestSessionRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceDateTimeRangeConstantsRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceAlphadecimalToIntNullRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceFieldgroupToFieldsetRector; @@ -12,6 +16,7 @@ use DrupalRector\Drupal11\Rector\Deprecation\StatementPrefetchIteratorFetchColumnRector; use DrupalRector\Rector\Deprecation\ClassConstantToClassConstantRector; use DrupalRector\Rector\Deprecation\FunctionCallRemovalRector; +use Rector\Renaming\Rector\Name\RenameClassRector; use DrupalRector\Rector\Deprecation\FunctionToServiceRector; use DrupalRector\Rector\Deprecation\FunctionToStaticRector; use DrupalRector\Rector\Deprecation\MethodToMethodWithCheckRector; @@ -119,6 +124,36 @@ // Replaced by \Drupal::service('datetime.views_helper')->buildViewsData(). $rectorConfig->rule(ReplaceDateTimeRangeConstantsRector::class); + // https://www.drupal.org/node/3494126 + // file_get_content_headers($file) deprecated in drupal:11.2.0, removed in drupal:12.0.0. + // Replaced by $file->getDownloadHeaders(). + $rectorConfig->rule(ReplaceFileGetContentHeadersRector::class); + + // https://www.drupal.org/node/3518527 + // $_SESSION['key'] = $value deprecated in drupal:11.2.0. + // Replaced by \Drupal::request()->getSession()->set('key', $value). + $rectorConfig->rule(ReplaceSessionWritesWithRequestSessionRector::class); + + // https://www.drupal.org/node/3477277 + // LOCALE_TRANSLATION_DEFAULT_SERVER_PATTERN deprecated in drupal:11.2.0, removed in drupal:12.0.0. + // Replaced by \Drupal::TRANSLATION_DEFAULT_SERVER_PATTERN. + $rectorConfig->rule(ReplaceLocaleTranslationDefaultServerPatternRector::class); + + // https://www.drupal.org/node/3495943 + // #[StopProceduralHookScan] attribute renamed to #[ProceduralHookScanStop] in drupal:11.2.0. + $rectorConfig->rule(RenameStopProceduralHookScanRector::class); + + // https://www.drupal.org/node/3488572 + // Drupal\Core\Entity\Query\Sql\pgsql\* deprecated in drupal:11.2.0, removed in drupal:12.0.0. + // Moved to Drupal\pgsql\EntityQuery\*. + // https://www.drupal.org/node/3472008 + // Drupal\jsonapi\EventSubscriber\ResourceResponseValidator moved to jsonapi_response_validator submodule. + $rectorConfig->ruleWithConfiguration(RenameClassRector::class, [ + 'Drupal\Core\Entity\Query\Sql\pgsql\QueryFactory' => 'Drupal\pgsql\EntityQuery\QueryFactory', + 'Drupal\Core\Entity\Query\Sql\pgsql\Condition' => 'Drupal\pgsql\EntityQuery\Condition', + 'Drupal\jsonapi\EventSubscriber\ResourceResponseValidator' => 'Drupal\jsonapi_response_validator\EventSubscriber\ResourceResponseValidator', + ]); + // https://www.drupal.org/node/3575841 // SystemManager::REQUIREMENT_* deprecated in drupal:11.2.0, removed in drupal:12.0.0. // Replaced by \Drupal\Core\Extension\Requirement\RequirementSeverity enum cases. diff --git a/config/drupal-11/drupal-11.3-deprecations.php b/config/drupal-11/drupal-11.3-deprecations.php index c7fbba8e6..b224c547f 100644 --- a/config/drupal-11/drupal-11.3-deprecations.php +++ b/config/drupal-11/drupal-11.3-deprecations.php @@ -6,6 +6,7 @@ use DrupalRector\Drupal11\Rector\Deprecation\FileSystemBasenameToNativeRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveRootFromConvertDbUrlRector; use DrupalRector\Drupal11\Rector\Deprecation\LoadAllIncludesRector; +use DrupalRector\Drupal11\Rector\Deprecation\ReplaceNodeAddBodyFieldRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceNodeModuleProceduralFunctionsRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceThemeGetSettingRector; use DrupalRector\Drupal11\Rector\Deprecation\NodeStorageDeprecatedMethodsRector; @@ -22,6 +23,7 @@ use DrupalRector\Rector\ValueObject\FunctionToServiceConfiguration; use DrupalRector\Rector\ValueObject\FunctionToStaticConfiguration; use Rector\Config\RectorConfig; +use Rector\Renaming\Rector\Name\RenameClassRector; return static function (RectorConfig $rectorConfig): void { // https://www.drupal.org/node/3543035 @@ -63,6 +65,11 @@ // Replaced by $comment->permalink(). $rectorConfig->rule(ReplaceCommentUriRector::class); + // https://www.drupal.org/node/3489266 + // node_add_body_field() deprecated in drupal:11.3.0, removed in drupal:12.0.0. + // Replaced by $this->createBodyField() from BodyFieldCreationTrait. + $rectorConfig->rule(ReplaceNodeAddBodyFieldRector::class); + // https://www.drupal.org/node/3513856 // UserSession::$name property read deprecated in drupal:11.3.0, removed in drupal:12.0.0. // Replaced by getAccountName(). @@ -105,4 +112,12 @@ // Database::convertDbUrlToConnectionInfo($url, $root, ...) deprecated in drupal:11.3.0, removed in drupal:12.0.0. // The $root parameter is obsolete; remove it (shift any $include_test_drivers arg left). $rectorConfig->rule(RemoveRootFromConvertDbUrlRector::class); + + // https://www.drupal.org/node/3551446 + // workspaces.association service and WorkspaceAssociationInterface renamed in drupal:11.3.0. + // Replaced by workspaces.tracker and WorkspaceTrackerInterface. + $rectorConfig->ruleWithConfiguration(RenameClassRector::class, [ + 'Drupal\workspaces\WorkspaceAssociationInterface' => 'Drupal\workspaces\WorkspaceTrackerInterface', + 'Drupal\workspaces\WorkspaceAssociation' => 'Drupal\workspaces\WorkspaceTracker', + ]); }; diff --git a/src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector.php b/src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector.php new file mode 100644 index 000000000..017de25c7 --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector.php @@ -0,0 +1,63 @@ +name->toString() === self::OLD_FQCN) { + $node->name = new Name(explode('\\', self::NEW_FQCN)); + return $node; + } + return null; + } + + assert($node instanceof Attribute); + + if ($node->name instanceof FullyQualified && $node->name->toString() === self::OLD_FQCN) { + $node->name = new Name(self::NEW_SHORT); + return $node; + } + + return null; + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition('Rename #[StopProceduralHookScan] attribute to #[ProceduralHookScanStop] and update its use statement (drupal:11.2.0)', [ + new CodeSample( + "use Drupal\\Core\\Hook\\Attribute\\StopProceduralHookScan;\n\n#[StopProceduralHookScan]\nfunction mymodule_helper(): void {}", + "use Drupal\\Core\\Hook\\Attribute\\ProceduralHookScanStop;\n\n#[ProceduralHookScanStop]\nfunction mymodule_helper(): void {}" + ), + ]); + } +} diff --git a/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector.php b/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector.php new file mode 100644 index 000000000..823b73022 --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector.php @@ -0,0 +1,53 @@ +getDownloadHeaders(). + * + * Deprecated in drupal:11.2.0, removed in drupal:12.0.0. + * + * @see https://www.drupal.org/node/3494126 + */ +final class ReplaceFileGetContentHeadersRector extends AbstractRector +{ + public function getNodeTypes(): array + { + return [Node\Expr\FuncCall::class]; + } + + public function refactor(Node $node): mixed + { + assert($node instanceof Node\Expr\FuncCall); + + if (!$this->isName($node, 'file_get_content_headers')) { + return null; + } + + if (count($node->args) !== 1) { + return null; + } + + return new Node\Expr\MethodCall( + $node->args[0]->value, + new Node\Identifier('getDownloadHeaders') + ); + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition('Replace deprecated file_get_content_headers($file) with $file->getDownloadHeaders() (drupal:11.2.0)', [ + new CodeSample( + '$headers = file_get_content_headers($file);', + '$headers = $file->getDownloadHeaders();' + ), + ]); + } +} diff --git a/src/Drupal11/Rector/Deprecation/ReplaceLocaleTranslationDefaultServerPatternRector.php b/src/Drupal11/Rector/Deprecation/ReplaceLocaleTranslationDefaultServerPatternRector.php new file mode 100644 index 000000000..78b8eb609 --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/ReplaceLocaleTranslationDefaultServerPatternRector.php @@ -0,0 +1,52 @@ +isName($node, 'LOCALE_TRANSLATION_DEFAULT_SERVER_PATTERN')) { + return null; + } + + return new ClassConstFetch( + new FullyQualified('Drupal'), + 'TRANSLATION_DEFAULT_SERVER_PATTERN' + ); + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition('Replace deprecated LOCALE_TRANSLATION_DEFAULT_SERVER_PATTERN with \\Drupal::TRANSLATION_DEFAULT_SERVER_PATTERN (drupal:11.2.0)', [ + new CodeSample( + '$pattern = LOCALE_TRANSLATION_DEFAULT_SERVER_PATTERN;', + '$pattern = \\Drupal::TRANSLATION_DEFAULT_SERVER_PATTERN;' + ), + ]); + } +} diff --git a/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector.php b/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector.php new file mode 100644 index 000000000..e52a7b68a --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector.php @@ -0,0 +1,76 @@ +createBodyField() from BodyFieldCreationTrait. + * + * Deprecated in drupal:11.3.0, removed in drupal:12.0.0. + * + * @see https://www.drupal.org/node/3489266 + */ +final class ReplaceNodeAddBodyFieldRector extends AbstractRector +{ + public function getNodeTypes(): array + { + return [FuncCall::class]; + } + + public function refactor(Node $node): mixed + { + assert($node instanceof FuncCall); + + if (!$this->isName($node, 'node_add_body_field')) { + return null; + } + + if (empty($node->args)) { + return null; + } + + $typeArg = $node->args[0] instanceof Arg ? $node->args[0]->value : null; + if ($typeArg === null) { + return null; + } + + $idCall = new MethodCall($typeArg, 'id'); + + $newArgs = [ + new Arg(new String_('node')), + new Arg($idCall), + ]; + + if (isset($node->args[1]) && $node->args[1] instanceof Arg) { + $newArgs[] = new Arg(new String_('body')); + $newArgs[] = new Arg($node->args[1]->value); + } + + return new MethodCall( + new Variable('this'), + 'createBodyField', + $newArgs + ); + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition('Replace deprecated node_add_body_field() with $this->createBodyField() (drupal:11.3.0)', [ + new CodeSample( + 'node_add_body_field($nodeType, \'My Body\');', + '$this->createBodyField(\'node\', $nodeType->id(), \'body\', \'My Body\');' + ), + ]); + } +} diff --git a/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector.php b/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector.php new file mode 100644 index 000000000..8a698d2cb --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector.php @@ -0,0 +1,82 @@ +getSession()->set(). + * + * Deprecated in drupal:11.2.0. + * + * @see https://www.drupal.org/node/3518527 + */ +final class ReplaceSessionWritesWithRequestSessionRector extends AbstractRector +{ + public function getNodeTypes(): array + { + return [Assign::class]; + } + + public function refactor(Node $node): mixed + { + assert($node instanceof Assign); + + if (!$node->var instanceof ArrayDimFetch) { + return null; + } + + $arrayDimFetch = $node->var; + + if (!$arrayDimFetch->var instanceof Variable) { + return null; + } + + if ($this->getName($arrayDimFetch->var) !== '_SESSION') { + return null; + } + + if ($arrayDimFetch->dim === null) { + return null; + } + + $drupalRequest = new StaticCall( + new FullyQualified('Drupal'), + 'request', + [] + ); + + $getSession = new MethodCall($drupalRequest, 'getSession', []); + + return new MethodCall( + $getSession, + 'set', + [ + new Arg($arrayDimFetch->dim), + new Arg($node->expr), + ] + ); + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition('Replace deprecated $_SESSION writes with \\Drupal::request()->getSession()->set() (drupal:11.2.0)', [ + new CodeSample( + '$_SESSION[\'my_key\'] = $value;', + '\\Drupal::request()->getSession()->set(\'my_key\', $value);' + ), + ]); + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector/RenameStopProceduralHookScanRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector/RenameStopProceduralHookScanRectorTest.php new file mode 100644 index 000000000..ad234f85c --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector/RenameStopProceduralHookScanRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector/config/configured_rule.php new file mode 100644 index 000000000..5b5efeaf9 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector/config/configured_rule.php @@ -0,0 +1,11 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/ReplaceFileGetContentHeadersRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/ReplaceFileGetContentHeadersRectorTest.php new file mode 100644 index 000000000..f71b03b4d --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/ReplaceFileGetContentHeadersRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/config/configured_rule.php new file mode 100644 index 000000000..1a444bbbb --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/config/configured_rule.php @@ -0,0 +1,11 @@ + +----- +getDownloadHeaders(); +$other = file_get_something_else($file); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleTranslationDefaultServerPatternRector/ReplaceLocaleTranslationDefaultServerPatternRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleTranslationDefaultServerPatternRector/ReplaceLocaleTranslationDefaultServerPatternRectorTest.php new file mode 100644 index 000000000..2f94a3eb7 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleTranslationDefaultServerPatternRector/ReplaceLocaleTranslationDefaultServerPatternRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleTranslationDefaultServerPatternRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleTranslationDefaultServerPatternRector/config/configured_rule.php new file mode 100644 index 000000000..a2b99f885 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleTranslationDefaultServerPatternRector/config/configured_rule.php @@ -0,0 +1,11 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/ReplaceNodeAddBodyFieldRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/ReplaceNodeAddBodyFieldRectorTest.php new file mode 100644 index 000000000..e2eff93e5 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/ReplaceNodeAddBodyFieldRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/config/configured_rule.php new file mode 100644 index 000000000..c7f9847cf --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/config/configured_rule.php @@ -0,0 +1,11 @@ + +----- +createBodyField('node', $nodeType->id()); +$this->createBodyField('node', $nodeType->id(), 'body', 'My Body'); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/ReplaceSessionWritesWithRequestSessionRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/ReplaceSessionWritesWithRequestSessionRectorTest.php new file mode 100644 index 000000000..f73d4993f --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/ReplaceSessionWritesWithRequestSessionRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/config/configured_rule.php new file mode 100644 index 000000000..2965fa85b --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/config/configured_rule.php @@ -0,0 +1,11 @@ + +----- +getSession()->set('my_key', $value); +\Drupal::request()->getSession()->set($dynamic_key, $other); +$other_var['key'] = 'untouched'; + +?> From aa8114e428e3ced652a95af5e932728ada23d7a9 Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 20:40:58 +0200 Subject: [PATCH 040/256] feat(Drupal11): Add entity original, node access, and contextual links rules MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ReplaceEntityOriginalPropertyRector: $entity->original → getOriginal()/setOriginal() (11.2) - ReplaceNodeAccessViewAllNodesRector: node_access_view_all_nodes() → entityTypeManager chain (11.3) - FunctionToServiceRector: contextual_links_to_id/contextual_id_to_links → ContextualLinksSerializer (11.4) --- config/drupal-11/drupal-11.2-deprecations.php | 6 ++ config/drupal-11/drupal-11.3-deprecations.php | 7 ++ config/drupal-11/drupal-11.4-deprecations.php | 8 ++ .../ReplaceEntityOriginalPropertyRector.php | 79 +++++++++++++++ .../ReplaceNodeAccessViewAllNodesRector.php | 96 +++++++++++++++++++ ...eplaceEntityOriginalPropertyRectorTest.php | 33 +++++++ .../config/configured_rule.php | 11 +++ .../fixture/basic.php.inc | 15 +++ ...eplaceNodeAccessViewAllNodesRectorTest.php | 33 +++++++ .../config/configured_rule.php | 11 +++ .../fixture/basic.php.inc | 17 ++++ 11 files changed, 316 insertions(+) create mode 100644 src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector.php create mode 100644 src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/ReplaceEntityOriginalPropertyRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/ReplaceNodeAccessViewAllNodesRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/fixture/basic.php.inc diff --git a/config/drupal-11/drupal-11.2-deprecations.php b/config/drupal-11/drupal-11.2-deprecations.php index 587b0f953..2103e7b2b 100644 --- a/config/drupal-11/drupal-11.2-deprecations.php +++ b/config/drupal-11/drupal-11.2-deprecations.php @@ -5,6 +5,7 @@ use DrupalRector\Drupal11\Rector\Deprecation\RemoveModuleHandlerAddModuleCallsRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveTwigNodeTransTagArgumentRector; use DrupalRector\Drupal11\Rector\Deprecation\RenameStopProceduralHookScanRector; +use DrupalRector\Drupal11\Rector\Deprecation\ReplaceEntityOriginalPropertyRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceFileGetContentHeadersRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceLocaleTranslationDefaultServerPatternRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceSessionWritesWithRequestSessionRector; @@ -134,6 +135,11 @@ // Replaced by \Drupal::request()->getSession()->set('key', $value). $rectorConfig->rule(ReplaceSessionWritesWithRequestSessionRector::class); + // https://www.drupal.org/node/3571065 + // $entity->original magic property deprecated in drupal:11.2.0, removed in drupal:12.0.0. + // Read access replaced by getOriginal(); write access replaced by setOriginal($value). + $rectorConfig->rule(ReplaceEntityOriginalPropertyRector::class); + // https://www.drupal.org/node/3477277 // LOCALE_TRANSLATION_DEFAULT_SERVER_PATTERN deprecated in drupal:11.2.0, removed in drupal:12.0.0. // Replaced by \Drupal::TRANSLATION_DEFAULT_SERVER_PATTERN. diff --git a/config/drupal-11/drupal-11.3-deprecations.php b/config/drupal-11/drupal-11.3-deprecations.php index b224c547f..c084a7d57 100644 --- a/config/drupal-11/drupal-11.3-deprecations.php +++ b/config/drupal-11/drupal-11.3-deprecations.php @@ -6,6 +6,7 @@ use DrupalRector\Drupal11\Rector\Deprecation\FileSystemBasenameToNativeRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveRootFromConvertDbUrlRector; use DrupalRector\Drupal11\Rector\Deprecation\LoadAllIncludesRector; +use DrupalRector\Drupal11\Rector\Deprecation\ReplaceNodeAccessViewAllNodesRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceNodeAddBodyFieldRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceNodeModuleProceduralFunctionsRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceThemeGetSettingRector; @@ -65,6 +66,12 @@ // Replaced by $comment->permalink(). $rectorConfig->rule(ReplaceCommentUriRector::class); + // https://www.drupal.org/node/3038908 + // node_access_view_all_nodes() deprecated in drupal:11.3.0, removed in drupal:12.0.0. + // Replaced by entityTypeManager()->getAccessControlHandler('node')->checkAllGrants(). + // drupal_static_reset('node_access_view_all_nodes') replaced by node.view_all_nodes_memory_cache->deleteAll(). + $rectorConfig->rule(ReplaceNodeAccessViewAllNodesRector::class); + // https://www.drupal.org/node/3489266 // node_add_body_field() deprecated in drupal:11.3.0, removed in drupal:12.0.0. // Replaced by $this->createBodyField() from BodyFieldCreationTrait. diff --git a/config/drupal-11/drupal-11.4-deprecations.php b/config/drupal-11/drupal-11.4-deprecations.php index 239c4f2b7..08a0f0115 100644 --- a/config/drupal-11/drupal-11.4-deprecations.php +++ b/config/drupal-11/drupal-11.4-deprecations.php @@ -271,4 +271,12 @@ new FunctionToStaticConfiguration('11.4.0', 'views_ui_add_ajax_wrapper', 'Drupal\views\ViewsFormAjaxHelperTrait', 'addAjaxWrapper'), new FunctionToStaticConfiguration('11.4.0', 'views_ui_nojs_submit', 'Drupal\views\ViewsFormAjaxHelperTrait', 'noJsSubmit'), ]); + + // https://www.drupal.org/node/3568087 + // contextual_links_to_id() and contextual_id_to_links() deprecated in drupal:11.4.0, removed in drupal:13.0.0. + // Replaced by ContextualLinksSerializer service. + $rectorConfig->ruleWithConfiguration(FunctionToServiceRector::class, [ + new FunctionToServiceConfiguration('11.4.0', 'contextual_links_to_id', 'Drupal\contextual\ContextualLinksSerializer', 'linksToId'), + new FunctionToServiceConfiguration('11.4.0', 'contextual_id_to_links', 'Drupal\contextual\ContextualLinksSerializer', 'idToLinks'), + ]); }; diff --git a/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector.php b/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector.php new file mode 100644 index 000000000..4152331ec --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector.php @@ -0,0 +1,79 @@ +original magic property with getOriginal()/setOriginal(). + * + * Deprecated in drupal:11.2.0, removed in drupal:12.0.0. + * Skips $this->original to avoid false positives on non-entity classes. + * + * @see https://www.drupal.org/node/3571065 + */ +final class ReplaceEntityOriginalPropertyRector extends AbstractRector +{ + public function getNodeTypes(): array + { + return [PropertyFetch::class, Assign::class]; + } + + public function refactor(Node $node): mixed + { + // Step 1: $entity->original → $entity->getOriginal() + // (skip $this->original — non-entity classes have a legitimate $original property) + if ($node instanceof PropertyFetch) { + if ($this->isName($node->name, 'original') && !$this->isThisVar($node->var)) { + return new MethodCall($node->var, 'getOriginal'); + } + return null; + } + + assert($node instanceof Assign); + + // Step 2: after step 1 transforms the LHS, detect $entity->getOriginal() = $x + // (invalid assignment target) and rewrite to $entity->setOriginal($x). + if ($node->var instanceof MethodCall + && $this->isName($node->var->name, 'getOriginal') + && empty($node->var->args) + ) { + return new MethodCall( + $node->var->var, + 'setOriginal', + [new Arg($node->expr)] + ); + } + + return null; + } + + private function isThisVar(Node $node): bool + { + return $node instanceof Variable && $node->name === 'this'; + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition('Replace deprecated $entity->original magic property with getOriginal()/setOriginal() method calls (drupal:11.2.0)', [ + new CodeSample( + '$original = $entity->original;', + '$original = $entity->getOriginal();' + ), + new CodeSample( + '$entity->original = $unchanged;', + '$entity->setOriginal($unchanged);' + ), + ]); + } +} diff --git a/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector.php b/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector.php new file mode 100644 index 000000000..b5e4ff98f --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector.php @@ -0,0 +1,96 @@ +isName($node, 'node_access_view_all_nodes')) { + return $this->buildCheckAllGrants($node); + } + + if ($this->isName($node, 'drupal_static_reset')) { + return $this->refactorStaticReset($node); + } + + return null; + } + + private function buildCheckAllGrants(FuncCall $node): MethodCall + { + $entityTypeManager = $this->nodeFactory->createStaticCall('Drupal', 'entityTypeManager'); + $getHandler = $this->nodeFactory->createMethodCall( + $entityTypeManager, + 'getAccessControlHandler', + [new String_('node')] + ); + + if (!empty($node->args) && $node->args[0] instanceof Arg) { + $accountArg = $node->args[0]->value; + } else { + $accountArg = $this->nodeFactory->createStaticCall('Drupal', 'currentUser'); + } + + return $this->nodeFactory->createMethodCall($getHandler, 'checkAllGrants', [$accountArg]); + } + + private function refactorStaticReset(FuncCall $node): ?MethodCall + { + if (empty($node->args) || !$node->args[0] instanceof Arg) { + return null; + } + + $firstArg = $node->args[0]->value; + if (!$firstArg instanceof String_ || $firstArg->value !== 'node_access_view_all_nodes') { + return null; + } + + $service = $this->nodeFactory->createStaticCall( + 'Drupal', + 'service', + [new String_('node.view_all_nodes_memory_cache')] + ); + + return $this->nodeFactory->createMethodCall($service, 'deleteAll'); + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition('Replace deprecated node_access_view_all_nodes() with entityTypeManager()->getAccessControlHandler(\'node\')->checkAllGrants() (drupal:11.3.0)', [ + new CodeSample( + 'node_access_view_all_nodes();', + "\\Drupal::entityTypeManager()->getAccessControlHandler('node')->checkAllGrants(\\Drupal::currentUser());" + ), + new CodeSample( + "drupal_static_reset('node_access_view_all_nodes');", + "\\Drupal::service('node.view_all_nodes_memory_cache')->deleteAll();" + ), + ]); + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/ReplaceEntityOriginalPropertyRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/ReplaceEntityOriginalPropertyRectorTest.php new file mode 100644 index 000000000..b7b469a7c --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/ReplaceEntityOriginalPropertyRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/config/configured_rule.php new file mode 100644 index 000000000..097b6ad2d --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/config/configured_rule.php @@ -0,0 +1,11 @@ +original; +$entity->original = $unchanged; +$field = $entity->other_property; + +?> +----- +getOriginal(); +$entity->setOriginal($unchanged); +$field = $entity->other_property; + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/ReplaceNodeAccessViewAllNodesRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/ReplaceNodeAccessViewAllNodesRectorTest.php new file mode 100644 index 000000000..9a120bd4a --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/ReplaceNodeAccessViewAllNodesRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/config/configured_rule.php new file mode 100644 index 000000000..95e5c1c7f --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/config/configured_rule.php @@ -0,0 +1,11 @@ + +----- +getAccessControlHandler('node')->checkAllGrants(\Drupal::currentUser()); +\Drupal::entityTypeManager()->getAccessControlHandler('node')->checkAllGrants($account); +\Drupal::service('node.view_all_nodes_memory_cache')->deleteAll(); +drupal_static_reset('other_function'); + +?> From 8c335e4efb27b1e76cd8b09fa9337ab8c62bc1d7 Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 20:42:37 +0200 Subject: [PATCH 041/256] feat(Drupal11): Add image module, system region, and more config entries MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - FunctionToServiceRector: contextual_links_to_id/contextual_id_to_links (11.4) - FunctionToServiceRector: image_path_flush/image_style_options via ImageDerivativeUtilities (11.4) - ConstantToClassConstantRector: IMAGE_DERIVATIVE_TOKEN → ImageStyleInterface::TOKEN (11.4) --- config/drupal-11/drupal-11.4-deprecations.php | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/config/drupal-11/drupal-11.4-deprecations.php b/config/drupal-11/drupal-11.4-deprecations.php index 08a0f0115..18ca922fa 100644 --- a/config/drupal-11/drupal-11.4-deprecations.php +++ b/config/drupal-11/drupal-11.4-deprecations.php @@ -16,10 +16,12 @@ use DrupalRector\Drupal11\Rector\Deprecation\UseEntityTypeHasIntegerIdRector; use DrupalRector\Drupal11\Rector\Deprecation\ViewsPluginHandlerManagerRector; use DrupalRector\Rector\Deprecation\ClassConstantToClassConstantRector; +use DrupalRector\Rector\Deprecation\ConstantToClassConstantRector; use DrupalRector\Rector\Deprecation\FunctionCallRemovalRector; use DrupalRector\Rector\Deprecation\FunctionToServiceRector; use DrupalRector\Rector\Deprecation\FunctionToStaticRector; use DrupalRector\Rector\ValueObject\ClassConstantToClassConstantConfiguration; +use DrupalRector\Rector\ValueObject\ConstantToClassConfiguration; use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use DrupalRector\Rector\ValueObject\FunctionCallRemovalConfiguration; use DrupalRector\Rector\ValueObject\FunctionToServiceConfiguration; @@ -275,8 +277,20 @@ // https://www.drupal.org/node/3568087 // contextual_links_to_id() and contextual_id_to_links() deprecated in drupal:11.4.0, removed in drupal:13.0.0. // Replaced by ContextualLinksSerializer service. + // https://www.drupal.org/node/3567618 + // image_path_flush() and image_style_options() deprecated in drupal:11.4.0, removed in drupal:13.0.0. + // Replaced by ImageDerivativeUtilities service. $rectorConfig->ruleWithConfiguration(FunctionToServiceRector::class, [ new FunctionToServiceConfiguration('11.4.0', 'contextual_links_to_id', 'Drupal\contextual\ContextualLinksSerializer', 'linksToId'), new FunctionToServiceConfiguration('11.4.0', 'contextual_id_to_links', 'Drupal\contextual\ContextualLinksSerializer', 'idToLinks'), + new FunctionToServiceConfiguration('11.4.0', 'image_path_flush', 'Drupal\image\ImageDerivativeUtilities', 'pathFlush'), + new FunctionToServiceConfiguration('11.4.0', 'image_style_options', 'Drupal\image\ImageDerivativeUtilities', 'styleOptions'), + ]); + + // https://www.drupal.org/node/3567618 + // IMAGE_DERIVATIVE_TOKEN deprecated in drupal:11.4.0, removed in drupal:13.0.0. + // Replaced by \Drupal\image\ImageStyleInterface::TOKEN. + $rectorConfig->ruleWithConfiguration(ConstantToClassConstantRector::class, [ + new ConstantToClassConfiguration('IMAGE_DERIVATIVE_TOKEN', 'Drupal\image\ImageStyleInterface', 'TOKEN'), ]); }; From fc7ef58227aceb384e957f65e230ad32c17a2494 Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 20:46:15 +0200 Subject: [PATCH 042/256] feat(Drupal11): Add editor_load, updater postinstall, and more function replacements MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ReplaceEditorLoadRector: editor_load() → entityTypeManager()->getStorage('editor')->load() (11.2) - RemoveUpdaterPostInstallMethodsRector: removes postInstall/postInstallTasks from Updater subclasses (11.1) - FunctionToStaticRector: drupal_common_theme → ThemeCommonElements::commonElements (11.1) - FunctionToStaticRector: image_filter_keyword → Image::getKeywordOffset (11.1) - FunctionToServiceRector: responsive_image_* → ResponsiveImageBuilder service (11.3) --- config/drupal-11/drupal-11.1-deprecations.php | 19 +++++ config/drupal-11/drupal-11.2-deprecations.php | 6 ++ config/drupal-11/drupal-11.3-deprecations.php | 10 +++ .../RemoveUpdaterPostInstallMethodsRector.php | 77 +++++++++++++++++++ .../Deprecation/ReplaceEditorLoadRector.php | 52 +++++++++++++ ...oveUpdaterPostInstallMethodsRectorTest.php | 33 ++++++++ .../config/configured_rule.php | 11 +++ .../fixture/basic.php.inc | 47 +++++++++++ .../ReplaceEditorLoadRectorTest.php | 33 ++++++++ .../config/configured_rule.php | 11 +++ .../fixture/basic.php.inc | 13 ++++ 11 files changed, 312 insertions(+) create mode 100644 src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector.php create mode 100644 src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector/RemoveUpdaterPostInstallMethodsRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector/fixture/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/ReplaceEditorLoadRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/fixture/basic.php.inc diff --git a/config/drupal-11/drupal-11.1-deprecations.php b/config/drupal-11/drupal-11.1-deprecations.php index 10303f37c..564ebbb8c 100644 --- a/config/drupal-11/drupal-11.1-deprecations.php +++ b/config/drupal-11/drupal-11.1-deprecations.php @@ -4,8 +4,11 @@ use DrupalRector\Drupal11\Rector\Deprecation\PluginBaseIsConfigurableRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveModuleHandlerDeprecatedMethodsRector; +use DrupalRector\Drupal11\Rector\Deprecation\RemoveUpdaterPostInstallMethodsRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceLocaleConfigBatchFunctionsRector; +use DrupalRector\Rector\Deprecation\FunctionToStaticRector; use DrupalRector\Rector\Deprecation\MethodToMethodWithCheckRector; +use DrupalRector\Rector\ValueObject\FunctionToStaticConfiguration; use DrupalRector\Rector\ValueObject\MethodToMethodWithCheckConfiguration; use Rector\Config\RectorConfig; use Rector\Renaming\Rector\Name\RenameClassRector; @@ -40,4 +43,20 @@ // in drupal:11.1.0, removed in drupal:12.0.0. Renamed to update_default_config_langcodes // and update_config_translations respectively. $rectorConfig->rule(ReplaceLocaleConfigBatchFunctionsRector::class); + + // https://www.drupal.org/node/3417136 + // Updater::postInstall() and postInstallTasks() deprecated in drupal:11.1.0, removed in drupal:12.0.0. + // The entire install-via-URL flow was eliminated; overrides are dead code. + $rectorConfig->rule(RemoveUpdaterPostInstallMethodsRector::class); + + // https://www.drupal.org/node/3488176 + // drupal_common_theme() removed in drupal:11.1.0. + // Replaced by \Drupal\Core\Theme\ThemeCommonElements::commonElements(). + // https://www.drupal.org/node/3574424 + // image_filter_keyword() deprecated in drupal:11.1.0, removed in drupal:12.0.0. + // Replaced by \Drupal\Component\Utility\Image::getKeywordOffset(). + $rectorConfig->ruleWithConfiguration(FunctionToStaticRector::class, [ + new FunctionToStaticConfiguration('11.1.0', 'drupal_common_theme', 'Drupal\Core\Theme\ThemeCommonElements', 'commonElements'), + new FunctionToStaticConfiguration('11.1.0', 'image_filter_keyword', 'Drupal\Component\Utility\Image', 'getKeywordOffset'), + ]); }; diff --git a/config/drupal-11/drupal-11.2-deprecations.php b/config/drupal-11/drupal-11.2-deprecations.php index 2103e7b2b..aeb96f871 100644 --- a/config/drupal-11/drupal-11.2-deprecations.php +++ b/config/drupal-11/drupal-11.2-deprecations.php @@ -5,6 +5,7 @@ use DrupalRector\Drupal11\Rector\Deprecation\RemoveModuleHandlerAddModuleCallsRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveTwigNodeTransTagArgumentRector; use DrupalRector\Drupal11\Rector\Deprecation\RenameStopProceduralHookScanRector; +use DrupalRector\Drupal11\Rector\Deprecation\ReplaceEditorLoadRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceEntityOriginalPropertyRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceFileGetContentHeadersRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceLocaleTranslationDefaultServerPatternRector; @@ -135,6 +136,11 @@ // Replaced by \Drupal::request()->getSession()->set('key', $value). $rectorConfig->rule(ReplaceSessionWritesWithRequestSessionRector::class); + // https://www.drupal.org/node/3447794 + // editor_load($format_id) deprecated in drupal:11.2.0, removed in drupal:12.0.0. + // Replaced by entityTypeManager()->getStorage('editor')->load($format_id). + $rectorConfig->rule(ReplaceEditorLoadRector::class); + // https://www.drupal.org/node/3571065 // $entity->original magic property deprecated in drupal:11.2.0, removed in drupal:12.0.0. // Read access replaced by getOriginal(); write access replaced by setOriginal($value). diff --git a/config/drupal-11/drupal-11.3-deprecations.php b/config/drupal-11/drupal-11.3-deprecations.php index c084a7d57..53d541aed 100644 --- a/config/drupal-11/drupal-11.3-deprecations.php +++ b/config/drupal-11/drupal-11.3-deprecations.php @@ -72,6 +72,16 @@ // drupal_static_reset('node_access_view_all_nodes') replaced by node.view_all_nodes_memory_cache->deleteAll(). $rectorConfig->rule(ReplaceNodeAccessViewAllNodesRector::class); + // https://www.drupal.org/node/3574424 + // responsive_image_* functions deprecated in drupal:11.3.0, removed in drupal:12.0.0. + // Replaced by \Drupal::service(ResponsiveImageBuilder::class)->method() calls. + $rectorConfig->ruleWithConfiguration(FunctionToServiceRector::class, [ + new FunctionToServiceConfiguration('11.3.0', '_responsive_image_build_source_attributes', 'Drupal\responsive_image\ResponsiveImageBuilder', 'buildSourceAttributes'), + new FunctionToServiceConfiguration('11.3.0', 'responsive_image_get_image_dimensions', 'Drupal\responsive_image\ResponsiveImageBuilder', 'getImageDimensions'), + new FunctionToServiceConfiguration('11.3.0', 'responsive_image_get_mime_type', 'Drupal\responsive_image\ResponsiveImageBuilder', 'getMimeType'), + new FunctionToServiceConfiguration('11.3.0', '_responsive_image_image_style_url', 'Drupal\responsive_image\ResponsiveImageBuilder', 'getImageStyleUrl'), + ]); + // https://www.drupal.org/node/3489266 // node_add_body_field() deprecated in drupal:11.3.0, removed in drupal:12.0.0. // Replaced by $this->createBodyField() from BodyFieldCreationTrait. diff --git a/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector.php b/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector.php new file mode 100644 index 000000000..7469bdf8a --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector.php @@ -0,0 +1,77 @@ +extends === null) { + return null; + } + + if (!in_array($node->extends->toString(), self::UPDATER_BASE_CLASSES, true)) { + return null; + } + + $modified = false; + $newStmts = []; + foreach ($node->stmts as $stmt) { + if ($stmt instanceof ClassMethod + && in_array($this->getName($stmt), self::DEPRECATED_METHODS, true) + ) { + $modified = true; + continue; + } + $newStmts[] = $stmt; + } + + if (!$modified) { + return null; + } + + $node->stmts = $newStmts; + return $node; + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition('Remove deprecated Updater::postInstall() and postInstallTasks() method overrides (drupal:11.1.0)', [ + new CodeSample( + "class MyUpdater extends Updater { public function postInstallTasks() { return []; } }", + "class MyUpdater extends Updater { }" + ), + ]); + } +} diff --git a/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector.php b/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector.php new file mode 100644 index 000000000..318f06d82 --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector.php @@ -0,0 +1,52 @@ +getStorage('editor')->load(). + * + * Deprecated in drupal:11.2.0, removed in drupal:12.0.0. + * + * @see https://www.drupal.org/node/3447794 + */ +final class ReplaceEditorLoadRector extends AbstractRector +{ + public function getNodeTypes(): array + { + return [FuncCall::class]; + } + + public function refactor(Node $node): mixed + { + assert($node instanceof FuncCall); + + if (!$this->isName($node, 'editor_load')) { + return null; + } + + $entityTypeManager = $this->nodeFactory->createStaticCall('Drupal', 'entityTypeManager'); + $getStorage = $this->nodeFactory->createMethodCall($entityTypeManager, 'getStorage', [new String_('editor')]); + + return new MethodCall($getStorage, 'load', $node->args); + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition('Replace deprecated editor_load($format_id) with entityTypeManager()->getStorage(\'editor\')->load() (drupal:11.2.0)', [ + new CodeSample( + '$editor = editor_load($format_id);', + "$editor = \\Drupal::entityTypeManager()->getStorage('editor')->load(\$format_id);" + ), + ]); + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector/RemoveUpdaterPostInstallMethodsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector/RemoveUpdaterPostInstallMethodsRectorTest.php new file mode 100644 index 000000000..b83b3e440 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector/RemoveUpdaterPostInstallMethodsRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector/config/configured_rule.php new file mode 100644 index 000000000..da92d99dd --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector/config/configured_rule.php @@ -0,0 +1,11 @@ + 'link', '#title' => 'My task']]; + } + + public function postInstall() + { + \Drupal::logger('mymodule')->info('Installed.'); + } + + public function keepThisMethod() + { + return 'kept'; + } +} + +class UnrelatedClass +{ + public function postInstall() {} +} + +?> +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/ReplaceEditorLoadRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/ReplaceEditorLoadRectorTest.php new file mode 100644 index 000000000..d46428b47 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/ReplaceEditorLoadRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/config/configured_rule.php new file mode 100644 index 000000000..9d22dd487 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/config/configured_rule.php @@ -0,0 +1,11 @@ + +----- +getStorage('editor')->load($format_id); +$other = other_function($format_id); + +?> From 3b3fdccf102e823c27982b9c0e26fe91fb918e9d Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 20:47:48 +0200 Subject: [PATCH 043/256] feat(Drupal11): Add migrate-drupal class renames, locale translation files, and more MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - RenameClassRector: migrate_drupal ContentEntity/Deriver → migrate namespace (11.2) - FunctionToServiceRector: locale_translate_get_interface_translation_files → LocaleFileManager (11.4) --- config/drupal-11/drupal-11.2-deprecations.php | 5 +++++ config/drupal-11/drupal-11.4-deprecations.php | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/config/drupal-11/drupal-11.2-deprecations.php b/config/drupal-11/drupal-11.2-deprecations.php index aeb96f871..d52b4c241 100644 --- a/config/drupal-11/drupal-11.2-deprecations.php +++ b/config/drupal-11/drupal-11.2-deprecations.php @@ -160,10 +160,15 @@ // Moved to Drupal\pgsql\EntityQuery\*. // https://www.drupal.org/node/3472008 // Drupal\jsonapi\EventSubscriber\ResourceResponseValidator moved to jsonapi_response_validator submodule. + // https://www.drupal.org/node/3498915 + // Drupal\migrate_drupal\Plugin\migrate\source\ContentEntity/ContentEntityDeriver deprecated in drupal:11.2.0, + // removed in drupal:12.0.0. Moved to Drupal\migrate namespace. $rectorConfig->ruleWithConfiguration(RenameClassRector::class, [ 'Drupal\Core\Entity\Query\Sql\pgsql\QueryFactory' => 'Drupal\pgsql\EntityQuery\QueryFactory', 'Drupal\Core\Entity\Query\Sql\pgsql\Condition' => 'Drupal\pgsql\EntityQuery\Condition', 'Drupal\jsonapi\EventSubscriber\ResourceResponseValidator' => 'Drupal\jsonapi_response_validator\EventSubscriber\ResourceResponseValidator', + 'Drupal\migrate_drupal\Plugin\migrate\source\ContentEntity' => 'Drupal\migrate\Plugin\migrate\source\ContentEntity', + 'Drupal\migrate_drupal\Plugin\migrate\source\ContentEntityDeriver' => 'Drupal\migrate\Plugin\migrate\source\ContentEntityDeriver', ]); // https://www.drupal.org/node/3575841 diff --git a/config/drupal-11/drupal-11.4-deprecations.php b/config/drupal-11/drupal-11.4-deprecations.php index 18ca922fa..6ddf69fe6 100644 --- a/config/drupal-11/drupal-11.4-deprecations.php +++ b/config/drupal-11/drupal-11.4-deprecations.php @@ -280,11 +280,15 @@ // https://www.drupal.org/node/3567618 // image_path_flush() and image_style_options() deprecated in drupal:11.4.0, removed in drupal:13.0.0. // Replaced by ImageDerivativeUtilities service. + // https://www.drupal.org/node/3577671 + // locale_translate_get_interface_translation_files() deprecated in drupal:11.4.0, removed in drupal:13.0.0. + // Replaced by LocaleFileManager::getInterfaceTranslationFiles(). $rectorConfig->ruleWithConfiguration(FunctionToServiceRector::class, [ new FunctionToServiceConfiguration('11.4.0', 'contextual_links_to_id', 'Drupal\contextual\ContextualLinksSerializer', 'linksToId'), new FunctionToServiceConfiguration('11.4.0', 'contextual_id_to_links', 'Drupal\contextual\ContextualLinksSerializer', 'idToLinks'), new FunctionToServiceConfiguration('11.4.0', 'image_path_flush', 'Drupal\image\ImageDerivativeUtilities', 'pathFlush'), new FunctionToServiceConfiguration('11.4.0', 'image_style_options', 'Drupal\image\ImageDerivativeUtilities', 'styleOptions'), + new FunctionToServiceConfiguration('11.4.0', 'locale_translate_get_interface_translation_files', 'Drupal\locale\File\LocaleFileManager', 'getInterfaceTranslationFiles'), ]); // https://www.drupal.org/node/3567618 From 1b9d1171e847fe8303a56e518a45cc216b150d14 Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 20:50:56 +0200 Subject: [PATCH 044/256] feat(Drupal11): Add ReplaceEntityReferenceRecursiveLimitRector for 11.4 Replaces EntityReferenceEntityFormatter::RECURSIVE_RENDER_LIMIT with literal 20. Deprecated in drupal:11.4.0, removed in drupal:13.0.0. See https://www.drupal.org/node/2940605 --- config/drupal-11/drupal-11.4-deprecations.php | 6 ++ ...aceEntityReferenceRecursiveLimitRector.php | 59 +++++++++++++++++++ ...ntityReferenceRecursiveLimitRectorTest.php | 33 +++++++++++ .../config/configured_rule.php | 10 ++++ .../fixture/basic.php.inc | 23 ++++++++ 5 files changed, 131 insertions(+) create mode 100644 src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/ReplaceEntityReferenceRecursiveLimitRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture/basic.php.inc diff --git a/config/drupal-11/drupal-11.4-deprecations.php b/config/drupal-11/drupal-11.4-deprecations.php index 6ddf69fe6..f53ff49d4 100644 --- a/config/drupal-11/drupal-11.4-deprecations.php +++ b/config/drupal-11/drupal-11.4-deprecations.php @@ -3,6 +3,7 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\RemoveAutomatedCronSubmitHandlerRector; +use DrupalRector\Drupal11\Rector\Deprecation\ReplaceEntityReferenceRecursiveLimitRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveCacheExpireOverrideRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveConfigSaveTrustedDataArgRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveViewsRowCacheKeysRector; @@ -297,4 +298,9 @@ $rectorConfig->ruleWithConfiguration(ConstantToClassConstantRector::class, [ new ConstantToClassConfiguration('IMAGE_DERIVATIVE_TOKEN', 'Drupal\image\ImageStyleInterface', 'TOKEN'), ]); + + // https://www.drupal.org/node/2940605 + // EntityReferenceEntityFormatter::RECURSIVE_RENDER_LIMIT deprecated in drupal:11.4.0, removed in drupal:13.0.0. + // Replaced by literal 20. + $rectorConfig->rule(ReplaceEntityReferenceRecursiveLimitRector::class); }; diff --git a/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector.php b/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector.php new file mode 100644 index 000000000..7db726070 --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector.php @@ -0,0 +1,59 @@ +isName($node->name, 'RECURSIVE_RENDER_LIMIT')) { + return null; + } + + foreach (self::TARGET_CLASSES as $class) { + if ($this->isName($node->class, $class)) { + return new Int_(20); + } + } + + return null; + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition('Replace deprecated EntityReferenceEntityFormatter::RECURSIVE_RENDER_LIMIT with literal 20 (drupal:11.4.0)', [ + new CodeSample( + 'if ($count > EntityReferenceEntityFormatter::RECURSIVE_RENDER_LIMIT) {}', + 'if ($count > 20) {}' + ), + ]); + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/ReplaceEntityReferenceRecursiveLimitRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/ReplaceEntityReferenceRecursiveLimitRectorTest.php new file mode 100644 index 000000000..1cdee0612 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/ReplaceEntityReferenceRecursiveLimitRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/config/configured_rule.php new file mode 100644 index 000000000..ddb33fde1 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/config/configured_rule.php @@ -0,0 +1,10 @@ +rule(ReplaceEntityReferenceRecursiveLimitRector::class); +}; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture/basic.php.inc new file mode 100644 index 000000000..6b209a6e8 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture/basic.php.inc @@ -0,0 +1,23 @@ + EntityReferenceEntityFormatter::RECURSIVE_RENDER_LIMIT) { + return; +} + +$limit = EntityReferenceEntityFormatter::RECURSIVE_RENDER_LIMIT; + +?> +----- + 20) { + return; +} + +$limit = 20; + +?> From 04d40cf319e43a380cc574afc906b4a911c5af03 Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 20:52:19 +0200 Subject: [PATCH 045/256] feat(Drupal11): Add RemoveHandlerBaseDefineExtraOptionsRector for 11.2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit HandlerBase::defineExtraOptions() deprecated in drupal:11.2.0, removed in drupal:12.0.0 with no replacement — core never called it, so any override is dead code. See https://www.drupal.org/node/3485084 --- config/drupal-11/drupal-11.2-deprecations.php | 6 ++ ...oveHandlerBaseDefineExtraOptionsRector.php | 101 ++++++++++++++++++ ...andlerBaseDefineExtraOptionsRectorTest.php | 33 ++++++ .../config/configured_rule.php | 10 ++ .../fixture/basic.php.inc | 32 ++++++ 5 files changed, 182 insertions(+) create mode 100644 src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/RemoveHandlerBaseDefineExtraOptionsRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/fixture/basic.php.inc diff --git a/config/drupal-11/drupal-11.2-deprecations.php b/config/drupal-11/drupal-11.2-deprecations.php index d52b4c241..cf5137da9 100644 --- a/config/drupal-11/drupal-11.2-deprecations.php +++ b/config/drupal-11/drupal-11.2-deprecations.php @@ -2,6 +2,7 @@ declare(strict_types=1); +use DrupalRector\Drupal11\Rector\Deprecation\RemoveHandlerBaseDefineExtraOptionsRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveModuleHandlerAddModuleCallsRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveTwigNodeTransTagArgumentRector; use DrupalRector\Drupal11\Rector\Deprecation\RenameStopProceduralHookScanRector; @@ -75,6 +76,11 @@ // These methods are no-ops and can be removed. $rectorConfig->rule(RemoveModuleHandlerAddModuleCallsRector::class); + // https://www.drupal.org/node/3485084 + // HandlerBase::defineExtraOptions() deprecated in drupal:11.2.0, removed in drupal:12.0.0. + // No replacement — Drupal core never called it; any override is dead code. + $rectorConfig->rule(RemoveHandlerBaseDefineExtraOptionsRector::class); + // https://www.drupal.org/node/3410938 // drupal_requirements_severity() deprecated in drupal:11.2.0, removed in drupal:12.0.0. // Replaced by RequirementSeverity::maxSeverityFromRequirements(). diff --git a/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector.php b/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector.php new file mode 100644 index 000000000..eab88d4dd --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector.php @@ -0,0 +1,101 @@ +isHandlerBaseSubclass($node)) { + return null; + } + + $changed = false; + foreach ($node->stmts as $key => $stmt) { + if ($stmt instanceof ClassMethod && $this->isName($stmt, 'defineExtraOptions')) { + unset($node->stmts[$key]); + $changed = true; + } + } + + return $changed ? $node : null; + } + + private function isHandlerBaseSubclass(Class_ $node): bool + { + if ($node->extends === null) { + return false; + } + + $parentName = $node->extends->toString(); + + if ($parentName === self::HANDLER_BASE_FQCN) { + return true; + } + + foreach (self::PARENT_SHORT_NAMES as $short) { + if ($parentName === $short || str_ends_with($parentName, '\\' . $short)) { + return true; + } + } + + try { + if ($this->isObjectType($node->extends, new ObjectType(self::HANDLER_BASE_FQCN))) { + return true; + } + } catch (\Throwable) { + } + + return false; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/RemoveHandlerBaseDefineExtraOptionsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/RemoveHandlerBaseDefineExtraOptionsRectorTest.php new file mode 100644 index 000000000..0133f74e9 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/RemoveHandlerBaseDefineExtraOptionsRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/config/configured_rule.php new file mode 100644 index 000000000..88e73cf2e --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/config/configured_rule.php @@ -0,0 +1,10 @@ +rule(RemoveHandlerBaseDefineExtraOptionsRector::class); +}; diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/fixture/basic.php.inc new file mode 100644 index 000000000..7eb8cdf82 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/fixture/basic.php.inc @@ -0,0 +1,32 @@ + 'value']; + } + + public function query() + { + // Keep this. + } +} + +?> +----- + From 8e927926b159ed81cfbf21ed86303741ddf2356d Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 21:02:24 +0200 Subject: [PATCH 046/256] doc: expand digest-to-rector prompt with additional supported node types and examples --- docs/digest-to-rector-prompt.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/docs/digest-to-rector-prompt.md b/docs/digest-to-rector-prompt.md index a44ad8ff9..160a52612 100644 --- a/docs/digest-to-rector-prompt.md +++ b/docs/digest-to-rector-prompt.md @@ -120,9 +120,14 @@ preferred path — it avoids creating new classes for patterns that drupal-recto | Transformation pattern | Generic rector to use | |---|---| +| Global function call removed entirely (no replacement) | `FunctionCallRemovalRector` | | Global function → static class method | `FunctionToStaticRector` | | Global function → `\Drupal::service('…')->method()` | `FunctionToServiceRector` | +| Instance method renamed (with receiver type check) | `MethodToMethodWithCheckRector` | | Class constant → different class constant | `ClassConstantToClassConstantRector` | +| Global constant → class constant | `ConstantToClassConstantRector` | +| Class/interface/trait renamed or moved to new namespace | `RenameClassRector` (from Rector core) | +| `DeprecationHelper::backwardsCompatibleCall()` wrapper removal | `DeprecationHelperRemoveRector` | | Anything else | Write a custom class (continue to Step 5) | **If a generic rector matches, do this instead of Steps 5–10:** @@ -146,6 +151,9 @@ preferred path — it avoids creating new classes for patterns that drupal-recto **Configuration entry syntax by generic rector:** ```php +// FunctionCallRemovalRector — removes the entire statement; no replacement +new FunctionCallRemovalConfiguration('[deprecatedFunctionName]'), + // FunctionToStaticRector new FunctionToStaticConfiguration('[introducedVersion]', '[deprecatedFunctionName]', '[ClassName]', '[methodName]'), // optional 5th arg: arg reorder map, e.g. [0 => 1, 1 => 0] to swap first two args @@ -154,9 +162,23 @@ new FunctionToStaticConfiguration('[introducedVersion]', '[deprecatedFunctionNam new FunctionToServiceConfiguration('[introducedVersion]', '[deprecatedFunctionName]', '[ServiceName]', '[serviceMethodName]'), // ServiceName is a string literal: 'theme.registry' or 'Drupal\module\Hook\SomeHooks' +// MethodToMethodWithCheckRector — receiver must be typed as the given interface/class +new MethodToMethodWithCheckConfiguration('[ReceiverClass\\FQCN]', '[oldMethodName]', '[newMethodName]'), +// no introducedVersion — applies unconditionally; no BC wrapping + // ClassConstantToClassConstantRector new ClassConstantToClassConstantConfiguration('[OldClass\\FQCN]', '[OLD_CONST]', '[NewClass\\FQCN]', '[NewConst]'), // no introducedVersion — applies unconditionally; no BC wrapping + +// ConstantToClassConstantRector — replaces bare global constant (ConstFetch) with class constant +new ConstantToClassConfiguration('[GLOBAL_CONSTANT_NAME]', '[TargetClass\\FQCN]', '[CONST_NAME]'), +// no introducedVersion — applies unconditionally; no BC wrapping + +// RenameClassRector — pass an associative array directly, not a configuration object +$rectorConfig->ruleWithConfiguration(RenameClassRector::class, [ + '[Old\\Class\\FQCN]' => '[New\\Class\\FQCN]', +]); +// use Rector\Renaming\Rector\Name\RenameClassRector; at top of config file ``` **If no generic rector matches, continue to Step 5 to generate a custom class.** From 66464df835387356cb6ae635479d69c7270bef63 Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 21:03:53 +0200 Subject: [PATCH 047/256] refactor: Replace 3 custom constant rectors with ConstantToClassConstantRector config MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ReplaceRequirementSeverityConstantsRector, ReplaceJsonApiFilterConstantsRector, and ReplaceLocaleTranslationDefaultServerPatternRector all performed simple global-constant → class-constant mappings already covered by the generic ConstantToClassConstantRector. Replace each with config entries and a shared fixture in the generic rector's test suite. --- config/drupal-11/drupal-11.2-deprecations.php | 20 ++++--- config/drupal-11/drupal-11.3-deprecations.php | 10 +++- .../ReplaceJsonApiFilterConstantsRector.php | 57 ------------------ ...eTranslationDefaultServerPatternRector.php | 52 ----------------- ...laceRequirementSeverityConstantsRector.php | 58 ------------------- ...eplaceJsonApiFilterConstantsRectorTest.php | 33 ----------- .../config/configured_rule.php | 10 ---- .../fixture/basic.php.inc | 21 ------- ...nslationDefaultServerPatternRectorTest.php | 33 ----------- .../config/configured_rule.php | 11 ---- .../fixture/basic.php.inc | 13 ----- ...RequirementSeverityConstantsRectorTest.php | 33 ----------- .../config/configured_rule.php | 10 ---- .../fixture/basic.php.inc | 19 ------ .../config/configured_rule.php | 11 ++++ .../fixture/drupal_11_constants.php.inc | 37 ++++++++++++ 16 files changed, 68 insertions(+), 360 deletions(-) delete mode 100644 src/Drupal11/Rector/Deprecation/ReplaceJsonApiFilterConstantsRector.php delete mode 100644 src/Drupal11/Rector/Deprecation/ReplaceLocaleTranslationDefaultServerPatternRector.php delete mode 100644 src/Drupal11/Rector/Deprecation/ReplaceRequirementSeverityConstantsRector.php delete mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceJsonApiFilterConstantsRector/ReplaceJsonApiFilterConstantsRectorTest.php delete mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceJsonApiFilterConstantsRector/config/configured_rule.php delete mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceJsonApiFilterConstantsRector/fixture/basic.php.inc delete mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleTranslationDefaultServerPatternRector/ReplaceLocaleTranslationDefaultServerPatternRectorTest.php delete mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleTranslationDefaultServerPatternRector/config/configured_rule.php delete mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleTranslationDefaultServerPatternRector/fixture/basic.php.inc delete mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceRequirementSeverityConstantsRector/ReplaceRequirementSeverityConstantsRectorTest.php delete mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceRequirementSeverityConstantsRector/config/configured_rule.php delete mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceRequirementSeverityConstantsRector/fixture/basic.php.inc create mode 100644 tests/src/Rector/Deprecation/ConstantToClassConstantRector/fixture/drupal_11_constants.php.inc diff --git a/config/drupal-11/drupal-11.2-deprecations.php b/config/drupal-11/drupal-11.2-deprecations.php index cf5137da9..dfc8e201e 100644 --- a/config/drupal-11/drupal-11.2-deprecations.php +++ b/config/drupal-11/drupal-11.2-deprecations.php @@ -9,21 +9,21 @@ use DrupalRector\Drupal11\Rector\Deprecation\ReplaceEditorLoadRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceEntityOriginalPropertyRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceFileGetContentHeadersRector; -use DrupalRector\Drupal11\Rector\Deprecation\ReplaceLocaleTranslationDefaultServerPatternRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceSessionWritesWithRequestSessionRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceDateTimeRangeConstantsRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceAlphadecimalToIntNullRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceFieldgroupToFieldsetRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplacePdoFetchConstantsRector; -use DrupalRector\Drupal11\Rector\Deprecation\ReplaceRequirementSeverityConstantsRector; use DrupalRector\Drupal11\Rector\Deprecation\StatementPrefetchIteratorFetchColumnRector; use DrupalRector\Rector\Deprecation\ClassConstantToClassConstantRector; +use DrupalRector\Rector\Deprecation\ConstantToClassConstantRector; use DrupalRector\Rector\Deprecation\FunctionCallRemovalRector; use Rector\Renaming\Rector\Name\RenameClassRector; use DrupalRector\Rector\Deprecation\FunctionToServiceRector; use DrupalRector\Rector\Deprecation\FunctionToStaticRector; use DrupalRector\Rector\Deprecation\MethodToMethodWithCheckRector; use DrupalRector\Rector\ValueObject\ClassConstantToClassConstantConfiguration; +use DrupalRector\Rector\ValueObject\ConstantToClassConfiguration; use DrupalRector\Rector\ValueObject\FunctionCallRemovalConfiguration; use DrupalRector\Rector\ValueObject\FunctionToServiceConfiguration; use DrupalRector\Rector\ValueObject\FunctionToStaticConfiguration; @@ -103,7 +103,16 @@ // https://www.drupal.org/node/3575841 // REQUIREMENT_INFO/OK/WARNING/ERROR global constants deprecated in drupal:11.2.0, removed in drupal:12.0.0. // Replaced by RequirementSeverity enum cases. - $rectorConfig->rule(ReplaceRequirementSeverityConstantsRector::class); + // https://www.drupal.org/node/3477277 + // LOCALE_TRANSLATION_DEFAULT_SERVER_PATTERN deprecated in drupal:11.2.0, removed in drupal:12.0.0. + // Replaced by \Drupal::TRANSLATION_DEFAULT_SERVER_PATTERN. + $rectorConfig->ruleWithConfiguration(ConstantToClassConstantRector::class, [ + new ConstantToClassConfiguration('REQUIREMENT_INFO', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'Info'), + new ConstantToClassConfiguration('REQUIREMENT_OK', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'OK'), + new ConstantToClassConfiguration('REQUIREMENT_WARNING', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'Warning'), + new ConstantToClassConfiguration('REQUIREMENT_ERROR', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'Error'), + new ConstantToClassConfiguration('LOCALE_TRANSLATION_DEFAULT_SERVER_PATTERN', 'Drupal', 'TRANSLATION_DEFAULT_SERVER_PATTERN'), + ]); // https://www.drupal.org/node/3473440 // TwigNodeTrans 6th $tag constructor argument deprecated in twig/twig 3.12, removed in drupal:11.2.0. @@ -152,11 +161,6 @@ // Read access replaced by getOriginal(); write access replaced by setOriginal($value). $rectorConfig->rule(ReplaceEntityOriginalPropertyRector::class); - // https://www.drupal.org/node/3477277 - // LOCALE_TRANSLATION_DEFAULT_SERVER_PATTERN deprecated in drupal:11.2.0, removed in drupal:12.0.0. - // Replaced by \Drupal::TRANSLATION_DEFAULT_SERVER_PATTERN. - $rectorConfig->rule(ReplaceLocaleTranslationDefaultServerPatternRector::class); - // https://www.drupal.org/node/3495943 // #[StopProceduralHookScan] attribute renamed to #[ProceduralHookScanStop] in drupal:11.2.0. $rectorConfig->rule(RenameStopProceduralHookScanRector::class); diff --git a/config/drupal-11/drupal-11.3-deprecations.php b/config/drupal-11/drupal-11.3-deprecations.php index 53d541aed..210addcb1 100644 --- a/config/drupal-11/drupal-11.3-deprecations.php +++ b/config/drupal-11/drupal-11.3-deprecations.php @@ -13,12 +13,13 @@ use DrupalRector\Drupal11\Rector\Deprecation\NodeStorageDeprecatedMethodsRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceCommentManagerGetCountNewCommentsRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceCommentUriRector; -use DrupalRector\Drupal11\Rector\Deprecation\ReplaceJsonApiFilterConstantsRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceNodeSetPreviewModeRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceUserSessionNamePropertyRector; +use DrupalRector\Rector\Deprecation\ConstantToClassConstantRector; use DrupalRector\Rector\Deprecation\FunctionCallRemovalRector; use DrupalRector\Rector\Deprecation\FunctionToServiceRector; use DrupalRector\Rector\Deprecation\FunctionToStaticRector; +use DrupalRector\Rector\ValueObject\ConstantToClassConfiguration; use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use DrupalRector\Rector\ValueObject\FunctionCallRemovalConfiguration; use DrupalRector\Rector\ValueObject\FunctionToServiceConfiguration; @@ -102,7 +103,12 @@ // https://www.drupal.org/node/3495600 // JSONAPI_FILTER_AMONG_* global constants deprecated in drupal:11.3.0, removed in drupal:13.0.0. // Replaced by \Drupal\jsonapi\JsonApiFilter::AMONG_* class constants. - $rectorConfig->rule(ReplaceJsonApiFilterConstantsRector::class); + $rectorConfig->ruleWithConfiguration(ConstantToClassConstantRector::class, [ + new ConstantToClassConfiguration('JSONAPI_FILTER_AMONG_ALL', 'Drupal\jsonapi\JsonApiFilter', 'AMONG_ALL'), + new ConstantToClassConfiguration('JSONAPI_FILTER_AMONG_PUBLISHED', 'Drupal\jsonapi\JsonApiFilter', 'AMONG_PUBLISHED'), + new ConstantToClassConfiguration('JSONAPI_FILTER_AMONG_ENABLED', 'Drupal\jsonapi\JsonApiFilter', 'AMONG_ENABLED'), + new ConstantToClassConfiguration('JSONAPI_FILTER_AMONG_OWN', 'Drupal\jsonapi\JsonApiFilter', 'AMONG_OWN'), + ]); // https://www.drupal.org/node/3538277 // DRUPAL_DISABLED/OPTIONAL/REQUIRED constants (and integers 0/1/2) in setPreviewMode() diff --git a/src/Drupal11/Rector/Deprecation/ReplaceJsonApiFilterConstantsRector.php b/src/Drupal11/Rector/Deprecation/ReplaceJsonApiFilterConstantsRector.php deleted file mode 100644 index 9af896f82..000000000 --- a/src/Drupal11/Rector/Deprecation/ReplaceJsonApiFilterConstantsRector.php +++ /dev/null @@ -1,57 +0,0 @@ - 'AMONG_ALL', - 'JSONAPI_FILTER_AMONG_PUBLISHED' => 'AMONG_PUBLISHED', - 'JSONAPI_FILTER_AMONG_ENABLED' => 'AMONG_ENABLED', - 'JSONAPI_FILTER_AMONG_OWN' => 'AMONG_OWN', - ]; - - public function getNodeTypes(): array - { - return [Node\Expr\ConstFetch::class]; - } - - public function refactor(Node $node): mixed - { - assert($node instanceof Node\Expr\ConstFetch); - - $constName = $this->getName($node); - if ($constName === null || !isset(self::CONSTANT_MAP[$constName])) { - return null; - } - - return new Node\Expr\ClassConstFetch( - new Node\Name\FullyQualified('Drupal\jsonapi\JsonApiFilter'), - self::CONSTANT_MAP[$constName] - ); - } - - public function getRuleDefinition(): RuleDefinition - { - return new RuleDefinition('Replace deprecated JSONAPI_FILTER_AMONG_* global constants with \\Drupal\\jsonapi\\JsonApiFilter::AMONG_* class constants (drupal:11.3.0)', [ - new CodeSample( - 'return [JSONAPI_FILTER_AMONG_ALL => AccessResult::allowed()];', - 'return [\\Drupal\\jsonapi\\JsonApiFilter::AMONG_ALL => AccessResult::allowed()];' - ), - ]); - } -} diff --git a/src/Drupal11/Rector/Deprecation/ReplaceLocaleTranslationDefaultServerPatternRector.php b/src/Drupal11/Rector/Deprecation/ReplaceLocaleTranslationDefaultServerPatternRector.php deleted file mode 100644 index 78b8eb609..000000000 --- a/src/Drupal11/Rector/Deprecation/ReplaceLocaleTranslationDefaultServerPatternRector.php +++ /dev/null @@ -1,52 +0,0 @@ -isName($node, 'LOCALE_TRANSLATION_DEFAULT_SERVER_PATTERN')) { - return null; - } - - return new ClassConstFetch( - new FullyQualified('Drupal'), - 'TRANSLATION_DEFAULT_SERVER_PATTERN' - ); - } - - public function getRuleDefinition(): RuleDefinition - { - return new RuleDefinition('Replace deprecated LOCALE_TRANSLATION_DEFAULT_SERVER_PATTERN with \\Drupal::TRANSLATION_DEFAULT_SERVER_PATTERN (drupal:11.2.0)', [ - new CodeSample( - '$pattern = LOCALE_TRANSLATION_DEFAULT_SERVER_PATTERN;', - '$pattern = \\Drupal::TRANSLATION_DEFAULT_SERVER_PATTERN;' - ), - ]); - } -} diff --git a/src/Drupal11/Rector/Deprecation/ReplaceRequirementSeverityConstantsRector.php b/src/Drupal11/Rector/Deprecation/ReplaceRequirementSeverityConstantsRector.php deleted file mode 100644 index 23c8e83fa..000000000 --- a/src/Drupal11/Rector/Deprecation/ReplaceRequirementSeverityConstantsRector.php +++ /dev/null @@ -1,58 +0,0 @@ - 'Info', - 'REQUIREMENT_OK' => 'OK', - 'REQUIREMENT_WARNING' => 'Warning', - 'REQUIREMENT_ERROR' => 'Error', - ]; - - public function getNodeTypes(): array - { - return [Node\Expr\ConstFetch::class]; - } - - public function refactor(Node $node): mixed - { - assert($node instanceof Node\Expr\ConstFetch); - - $name = ltrim($node->name->toString(), '\\'); - if (!isset(self::CONSTANT_MAP[$name])) { - return null; - } - - return new Node\Expr\ClassConstFetch( - new Node\Name\FullyQualified('Drupal\Core\Extension\Requirement\RequirementSeverity'), - self::CONSTANT_MAP[$name] - ); - } - - public function getRuleDefinition(): RuleDefinition - { - return new RuleDefinition('Replace deprecated REQUIREMENT_* global constants with RequirementSeverity enum cases (drupal:11.2.0)', [ - new CodeSample( - "\$requirements['check']['severity'] = REQUIREMENT_ERROR;", - "\$requirements['check']['severity'] = \\Drupal\\Core\\Extension\\Requirement\\RequirementSeverity::Error;" - ), - ]); - } -} diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceJsonApiFilterConstantsRector/ReplaceJsonApiFilterConstantsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceJsonApiFilterConstantsRector/ReplaceJsonApiFilterConstantsRectorTest.php deleted file mode 100644 index b626ccec2..000000000 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceJsonApiFilterConstantsRector/ReplaceJsonApiFilterConstantsRectorTest.php +++ /dev/null @@ -1,33 +0,0 @@ -doTestFile($filePath); - } - - /** - * @return \Iterator<> - */ - public static function provideData(): \Iterator - { - return self::yieldFilesFromDirectory(__DIR__.'/fixture'); - } - - public function provideConfigFilePath(): string - { - return __DIR__.'/config/configured_rule.php'; - } -} diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceJsonApiFilterConstantsRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceJsonApiFilterConstantsRector/config/configured_rule.php deleted file mode 100644 index 9f9ca3f26..000000000 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceJsonApiFilterConstantsRector/config/configured_rule.php +++ /dev/null @@ -1,10 +0,0 @@ -rule(ReplaceJsonApiFilterConstantsRector::class); -}; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceJsonApiFilterConstantsRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceJsonApiFilterConstantsRector/fixture/basic.php.inc deleted file mode 100644 index 8396c45a4..000000000 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceJsonApiFilterConstantsRector/fixture/basic.php.inc +++ /dev/null @@ -1,21 +0,0 @@ - 'a', - JSONAPI_FILTER_AMONG_PUBLISHED => 'b', - JSONAPI_FILTER_AMONG_ENABLED => 'c', - JSONAPI_FILTER_AMONG_OWN => 'd', -]; - -?> ------ - 'a', - \Drupal\jsonapi\JsonApiFilter::AMONG_PUBLISHED => 'b', - \Drupal\jsonapi\JsonApiFilter::AMONG_ENABLED => 'c', - \Drupal\jsonapi\JsonApiFilter::AMONG_OWN => 'd', -]; - -?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleTranslationDefaultServerPatternRector/ReplaceLocaleTranslationDefaultServerPatternRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleTranslationDefaultServerPatternRector/ReplaceLocaleTranslationDefaultServerPatternRectorTest.php deleted file mode 100644 index 2f94a3eb7..000000000 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleTranslationDefaultServerPatternRector/ReplaceLocaleTranslationDefaultServerPatternRectorTest.php +++ /dev/null @@ -1,33 +0,0 @@ -doTestFile($filePath); - } - - /** - * @return \Iterator<> - */ - public static function provideData(): \Iterator - { - return self::yieldFilesFromDirectory(__DIR__.'/fixture'); - } - - public function provideConfigFilePath(): string - { - return __DIR__.'/config/configured_rule.php'; - } -} diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleTranslationDefaultServerPatternRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleTranslationDefaultServerPatternRector/config/configured_rule.php deleted file mode 100644 index a2b99f885..000000000 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleTranslationDefaultServerPatternRector/config/configured_rule.php +++ /dev/null @@ -1,11 +0,0 @@ - ------ - diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceRequirementSeverityConstantsRector/ReplaceRequirementSeverityConstantsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceRequirementSeverityConstantsRector/ReplaceRequirementSeverityConstantsRectorTest.php deleted file mode 100644 index f92a42d44..000000000 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceRequirementSeverityConstantsRector/ReplaceRequirementSeverityConstantsRectorTest.php +++ /dev/null @@ -1,33 +0,0 @@ -doTestFile($filePath); - } - - /** - * @return \Iterator<> - */ - public static function provideData(): \Iterator - { - return self::yieldFilesFromDirectory(__DIR__.'/fixture'); - } - - public function provideConfigFilePath(): string - { - return __DIR__.'/config/configured_rule.php'; - } -} diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceRequirementSeverityConstantsRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceRequirementSeverityConstantsRector/config/configured_rule.php deleted file mode 100644 index 2ebcb3bbf..000000000 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceRequirementSeverityConstantsRector/config/configured_rule.php +++ /dev/null @@ -1,10 +0,0 @@ -rule(ReplaceRequirementSeverityConstantsRector::class); -}; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceRequirementSeverityConstantsRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceRequirementSeverityConstantsRector/fixture/basic.php.inc deleted file mode 100644 index 0e494fe71..000000000 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceRequirementSeverityConstantsRector/fixture/basic.php.inc +++ /dev/null @@ -1,19 +0,0 @@ - ------ - diff --git a/tests/src/Rector/Deprecation/ConstantToClassConstantRector/config/configured_rule.php b/tests/src/Rector/Deprecation/ConstantToClassConstantRector/config/configured_rule.php index fe541df3a..364a291ee 100644 --- a/tests/src/Rector/Deprecation/ConstantToClassConstantRector/config/configured_rule.php +++ b/tests/src/Rector/Deprecation/ConstantToClassConstantRector/config/configured_rule.php @@ -22,4 +22,15 @@ 'STATUS_PERMANENT', ), ]); + DeprecationBase::addClass(ConstantToClassConstantRector::class, $rectorConfig, false, [ + new ConstantToClassConfiguration('REQUIREMENT_INFO', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'Info'), + new ConstantToClassConfiguration('REQUIREMENT_OK', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'OK'), + new ConstantToClassConfiguration('REQUIREMENT_WARNING', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'Warning'), + new ConstantToClassConfiguration('REQUIREMENT_ERROR', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'Error'), + new ConstantToClassConfiguration('LOCALE_TRANSLATION_DEFAULT_SERVER_PATTERN', 'Drupal', 'TRANSLATION_DEFAULT_SERVER_PATTERN'), + new ConstantToClassConfiguration('JSONAPI_FILTER_AMONG_ALL', 'Drupal\jsonapi\JsonApiFilter', 'AMONG_ALL'), + new ConstantToClassConfiguration('JSONAPI_FILTER_AMONG_PUBLISHED', 'Drupal\jsonapi\JsonApiFilter', 'AMONG_PUBLISHED'), + new ConstantToClassConfiguration('JSONAPI_FILTER_AMONG_ENABLED', 'Drupal\jsonapi\JsonApiFilter', 'AMONG_ENABLED'), + new ConstantToClassConfiguration('JSONAPI_FILTER_AMONG_OWN', 'Drupal\jsonapi\JsonApiFilter', 'AMONG_OWN'), + ]); }; diff --git a/tests/src/Rector/Deprecation/ConstantToClassConstantRector/fixture/drupal_11_constants.php.inc b/tests/src/Rector/Deprecation/ConstantToClassConstantRector/fixture/drupal_11_constants.php.inc new file mode 100644 index 000000000..464c7c865 --- /dev/null +++ b/tests/src/Rector/Deprecation/ConstantToClassConstantRector/fixture/drupal_11_constants.php.inc @@ -0,0 +1,37 @@ + +----- + From 4903c5d192bae14e67ff91c0d557ddf56b1da69c Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 30 Apr 2026 21:08:18 +0200 Subject: [PATCH 048/256] build: fix codestyle --- config/drupal-11/drupal-11.2-deprecations.php | 16 ++++++++-------- config/drupal-11/drupal-11.3-deprecations.php | 16 ++++++++-------- config/drupal-11/drupal-11.4-deprecations.php | 8 ++++---- .../ErrorCurrentErrorHandlerRector.php | 1 + ...igrateSqlGetMigrationPluginManagerRector.php | 1 + .../RemoveCacheExpireOverrideRector.php | 2 +- .../RemoveConfigSaveTrustedDataArgRector.php | 1 + ...emoveHandlerBaseDefineExtraOptionsRector.php | 2 +- .../RemoveRootFromConvertDbUrlRector.php | 1 + .../Deprecation/RemoveSetUriCallbackRector.php | 2 ++ .../Deprecation/RemoveTrustDataCallRector.php | 1 + .../RemoveTwigNodeTransTagArgumentRector.php | 1 + .../RemoveUpdaterPostInstallMethodsRector.php | 5 +++-- .../RemoveViewsRowCacheKeysRector.php | 1 + .../RenameStopProceduralHookScanRector.php | 3 +++ .../ReplaceDateTimeRangeConstantsRector.php | 7 +++++-- .../ReplaceEntityOriginalPropertyRector.php | 1 + .../ReplaceFieldgroupToFieldsetRector.php | 1 + .../ReplaceLocaleConfigBatchFunctionsRector.php | 3 ++- ...placeNodeModuleProceduralFunctionsRector.php | 4 +++- .../ReplacePdoFetchConstantsRector.php | 17 ++++++++++------- .../ReplaceRecipeRunnerInstallModuleRector.php | 5 +++-- .../ReplaceSystemPerformanceGzipKeyRector.php | 4 +++- .../ReplaceThemeGetSettingRector.php | 1 + .../ReplaceViewsProceduralFunctionsRector.php | 14 +++++++++----- ...tripMigrationDependenciesExpandArgRector.php | 1 + .../UseEntityTypeHasIntegerIdRector.php | 3 +++ .../ViewsPluginHandlerManagerRector.php | 2 +- .../config/configured_rule.php | 12 ++++++------ 29 files changed, 86 insertions(+), 50 deletions(-) diff --git a/config/drupal-11/drupal-11.2-deprecations.php b/config/drupal-11/drupal-11.2-deprecations.php index dfc8e201e..3bb854f55 100644 --- a/config/drupal-11/drupal-11.2-deprecations.php +++ b/config/drupal-11/drupal-11.2-deprecations.php @@ -6,19 +6,18 @@ use DrupalRector\Drupal11\Rector\Deprecation\RemoveModuleHandlerAddModuleCallsRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveTwigNodeTransTagArgumentRector; use DrupalRector\Drupal11\Rector\Deprecation\RenameStopProceduralHookScanRector; +use DrupalRector\Drupal11\Rector\Deprecation\ReplaceAlphadecimalToIntNullRector; +use DrupalRector\Drupal11\Rector\Deprecation\ReplaceDateTimeRangeConstantsRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceEditorLoadRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceEntityOriginalPropertyRector; -use DrupalRector\Drupal11\Rector\Deprecation\ReplaceFileGetContentHeadersRector; -use DrupalRector\Drupal11\Rector\Deprecation\ReplaceSessionWritesWithRequestSessionRector; -use DrupalRector\Drupal11\Rector\Deprecation\ReplaceDateTimeRangeConstantsRector; -use DrupalRector\Drupal11\Rector\Deprecation\ReplaceAlphadecimalToIntNullRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceFieldgroupToFieldsetRector; +use DrupalRector\Drupal11\Rector\Deprecation\ReplaceFileGetContentHeadersRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplacePdoFetchConstantsRector; +use DrupalRector\Drupal11\Rector\Deprecation\ReplaceSessionWritesWithRequestSessionRector; use DrupalRector\Drupal11\Rector\Deprecation\StatementPrefetchIteratorFetchColumnRector; use DrupalRector\Rector\Deprecation\ClassConstantToClassConstantRector; use DrupalRector\Rector\Deprecation\ConstantToClassConstantRector; use DrupalRector\Rector\Deprecation\FunctionCallRemovalRector; -use Rector\Renaming\Rector\Name\RenameClassRector; use DrupalRector\Rector\Deprecation\FunctionToServiceRector; use DrupalRector\Rector\Deprecation\FunctionToStaticRector; use DrupalRector\Rector\Deprecation\MethodToMethodWithCheckRector; @@ -29,6 +28,7 @@ use DrupalRector\Rector\ValueObject\FunctionToStaticConfiguration; use DrupalRector\Rector\ValueObject\MethodToMethodWithCheckConfiguration; use Rector\Config\RectorConfig; +use Rector\Renaming\Rector\Name\RenameClassRector; return static function (RectorConfig $rectorConfig): void { // https://www.drupal.org/node/3490200 @@ -107,10 +107,10 @@ // LOCALE_TRANSLATION_DEFAULT_SERVER_PATTERN deprecated in drupal:11.2.0, removed in drupal:12.0.0. // Replaced by \Drupal::TRANSLATION_DEFAULT_SERVER_PATTERN. $rectorConfig->ruleWithConfiguration(ConstantToClassConstantRector::class, [ - new ConstantToClassConfiguration('REQUIREMENT_INFO', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'Info'), - new ConstantToClassConfiguration('REQUIREMENT_OK', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'OK'), + new ConstantToClassConfiguration('REQUIREMENT_INFO', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'Info'), + new ConstantToClassConfiguration('REQUIREMENT_OK', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'OK'), new ConstantToClassConfiguration('REQUIREMENT_WARNING', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'Warning'), - new ConstantToClassConfiguration('REQUIREMENT_ERROR', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'Error'), + new ConstantToClassConfiguration('REQUIREMENT_ERROR', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'Error'), new ConstantToClassConfiguration('LOCALE_TRANSLATION_DEFAULT_SERVER_PATTERN', 'Drupal', 'TRANSLATION_DEFAULT_SERVER_PATTERN'), ]); diff --git a/config/drupal-11/drupal-11.3-deprecations.php b/config/drupal-11/drupal-11.3-deprecations.php index 210addcb1..5775d754d 100644 --- a/config/drupal-11/drupal-11.3-deprecations.php +++ b/config/drupal-11/drupal-11.3-deprecations.php @@ -4,16 +4,16 @@ use DrupalRector\Drupal11\Rector\Deprecation\ErrorCurrentErrorHandlerRector; use DrupalRector\Drupal11\Rector\Deprecation\FileSystemBasenameToNativeRector; -use DrupalRector\Drupal11\Rector\Deprecation\RemoveRootFromConvertDbUrlRector; use DrupalRector\Drupal11\Rector\Deprecation\LoadAllIncludesRector; -use DrupalRector\Drupal11\Rector\Deprecation\ReplaceNodeAccessViewAllNodesRector; -use DrupalRector\Drupal11\Rector\Deprecation\ReplaceNodeAddBodyFieldRector; -use DrupalRector\Drupal11\Rector\Deprecation\ReplaceNodeModuleProceduralFunctionsRector; -use DrupalRector\Drupal11\Rector\Deprecation\ReplaceThemeGetSettingRector; use DrupalRector\Drupal11\Rector\Deprecation\NodeStorageDeprecatedMethodsRector; +use DrupalRector\Drupal11\Rector\Deprecation\RemoveRootFromConvertDbUrlRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceCommentManagerGetCountNewCommentsRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceCommentUriRector; +use DrupalRector\Drupal11\Rector\Deprecation\ReplaceNodeAccessViewAllNodesRector; +use DrupalRector\Drupal11\Rector\Deprecation\ReplaceNodeAddBodyFieldRector; +use DrupalRector\Drupal11\Rector\Deprecation\ReplaceNodeModuleProceduralFunctionsRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceNodeSetPreviewModeRector; +use DrupalRector\Drupal11\Rector\Deprecation\ReplaceThemeGetSettingRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceUserSessionNamePropertyRector; use DrupalRector\Rector\Deprecation\ConstantToClassConstantRector; use DrupalRector\Rector\Deprecation\FunctionCallRemovalRector; @@ -104,10 +104,10 @@ // JSONAPI_FILTER_AMONG_* global constants deprecated in drupal:11.3.0, removed in drupal:13.0.0. // Replaced by \Drupal\jsonapi\JsonApiFilter::AMONG_* class constants. $rectorConfig->ruleWithConfiguration(ConstantToClassConstantRector::class, [ - new ConstantToClassConfiguration('JSONAPI_FILTER_AMONG_ALL', 'Drupal\jsonapi\JsonApiFilter', 'AMONG_ALL'), + new ConstantToClassConfiguration('JSONAPI_FILTER_AMONG_ALL', 'Drupal\jsonapi\JsonApiFilter', 'AMONG_ALL'), new ConstantToClassConfiguration('JSONAPI_FILTER_AMONG_PUBLISHED', 'Drupal\jsonapi\JsonApiFilter', 'AMONG_PUBLISHED'), - new ConstantToClassConfiguration('JSONAPI_FILTER_AMONG_ENABLED', 'Drupal\jsonapi\JsonApiFilter', 'AMONG_ENABLED'), - new ConstantToClassConfiguration('JSONAPI_FILTER_AMONG_OWN', 'Drupal\jsonapi\JsonApiFilter', 'AMONG_OWN'), + new ConstantToClassConfiguration('JSONAPI_FILTER_AMONG_ENABLED', 'Drupal\jsonapi\JsonApiFilter', 'AMONG_ENABLED'), + new ConstantToClassConfiguration('JSONAPI_FILTER_AMONG_OWN', 'Drupal\jsonapi\JsonApiFilter', 'AMONG_OWN'), ]); // https://www.drupal.org/node/3538277 diff --git a/config/drupal-11/drupal-11.4-deprecations.php b/config/drupal-11/drupal-11.4-deprecations.php index f53ff49d4..e2ac3fb7d 100644 --- a/config/drupal-11/drupal-11.4-deprecations.php +++ b/config/drupal-11/drupal-11.4-deprecations.php @@ -3,16 +3,16 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\RemoveAutomatedCronSubmitHandlerRector; -use DrupalRector\Drupal11\Rector\Deprecation\ReplaceEntityReferenceRecursiveLimitRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveCacheExpireOverrideRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveConfigSaveTrustedDataArgRector; -use DrupalRector\Drupal11\Rector\Deprecation\RemoveViewsRowCacheKeysRector; -use DrupalRector\Drupal11\Rector\Deprecation\ReplaceRecipeRunnerInstallModuleRector; -use DrupalRector\Drupal11\Rector\Deprecation\ReplaceSystemPerformanceGzipKeyRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveLinkWidgetValidateTitleElementRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveSetUriCallbackRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveTrustDataCallRector; +use DrupalRector\Drupal11\Rector\Deprecation\RemoveViewsRowCacheKeysRector; +use DrupalRector\Drupal11\Rector\Deprecation\ReplaceEntityReferenceRecursiveLimitRector; +use DrupalRector\Drupal11\Rector\Deprecation\ReplaceRecipeRunnerInstallModuleRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceSessionManagerDeleteRector; +use DrupalRector\Drupal11\Rector\Deprecation\ReplaceSystemPerformanceGzipKeyRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceViewsProceduralFunctionsRector; use DrupalRector\Drupal11\Rector\Deprecation\UseEntityTypeHasIntegerIdRector; use DrupalRector\Drupal11\Rector\Deprecation\ViewsPluginHandlerManagerRector; diff --git a/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector.php b/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector.php index 8887657bb..0285b72f4 100644 --- a/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector.php +++ b/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector.php @@ -49,6 +49,7 @@ public function refactor(Node $node): ?Node if (!$this->isObjectType($node->class, new ObjectType('Drupal\Core\Utility\Error'))) { return null; } + return new FuncCall(new Name('get_error_handler'), []); } } diff --git a/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector.php b/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector.php index c19d36e3d..9f6643222 100644 --- a/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector.php +++ b/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector.php @@ -57,6 +57,7 @@ public function refactor(Node $node): ?Node if ($this->isObjectType($node->var, new ObjectType('Drupal\migrate\Plugin\Migration'))) { return null; } + return new PropertyFetch(new Variable('this'), 'migrationPluginManager'); } } diff --git a/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector.php b/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector.php index 6cf0ae6ac..d159faeea 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector.php @@ -75,7 +75,7 @@ private function isCachePluginBaseSubclass(Class_ $node): bool } foreach (self::PARENT_SHORT_NAMES as $short) { - if ($parentName === $short || str_ends_with($parentName, '\\' . $short)) { + if ($parentName === $short || str_ends_with($parentName, '\\'.$short)) { return true; } } diff --git a/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector.php b/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector.php index 07820b986..406624644 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector.php @@ -61,6 +61,7 @@ public function refactor(Node $node): ?Node return null; } $node->args = []; + return $node; } } diff --git a/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector.php b/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector.php index eab88d4dd..eb57ebbd6 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector.php @@ -84,7 +84,7 @@ private function isHandlerBaseSubclass(Class_ $node): bool } foreach (self::PARENT_SHORT_NAMES as $short) { - if ($parentName === $short || str_ends_with($parentName, '\\' . $short)) { + if ($parentName === $short || str_ends_with($parentName, '\\'.$short)) { return true; } } diff --git a/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector.php b/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector.php index 741a7513c..986723dfa 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector.php @@ -85,6 +85,7 @@ public function refactor(Node $node): ?Node } array_splice($node->args, 1, 1); + return $node; } } diff --git a/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector.php b/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector.php index 9ddf1a159..139c85d08 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector.php @@ -50,6 +50,7 @@ public function refactor(Node $node): int|Node|null ) { return NodeVisitor::REMOVE_NODE; } + return null; } @@ -59,6 +60,7 @@ public function refactor(Node $node): int|Node|null && $this->isName($node->var->name, 'setUriCallback') ) { $node->var = $node->var->var; + return $node; } } diff --git a/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector.php b/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector.php index 46b5534cb..16d252c26 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector.php @@ -44,6 +44,7 @@ public function refactor(Node $node): ?Node if (!$this->isName($node->name, 'trustData')) { return null; } + return $node->var; } } diff --git a/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector.php b/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector.php index ceda299fc..192688260 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector.php @@ -55,6 +55,7 @@ public function refactor(Node $node): ?Node return null; } array_pop($node->args); + return $node; } } diff --git a/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector.php b/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector.php index 7469bdf8a..13101de4f 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector.php @@ -62,6 +62,7 @@ public function refactor(Node $node): mixed } $node->stmts = $newStmts; + return $node; } @@ -69,8 +70,8 @@ public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Remove deprecated Updater::postInstall() and postInstallTasks() method overrides (drupal:11.1.0)', [ new CodeSample( - "class MyUpdater extends Updater { public function postInstallTasks() { return []; } }", - "class MyUpdater extends Updater { }" + 'class MyUpdater extends Updater { public function postInstallTasks() { return []; } }', + 'class MyUpdater extends Updater { }' ), ]); } diff --git a/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php b/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php index 14b6770e9..358a319cc 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php @@ -68,6 +68,7 @@ public function refactor(Node $node): ?Node return null; } $node->items = $newItems; + return $node; } } diff --git a/src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector.php b/src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector.php index 017de25c7..a87698124 100644 --- a/src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector.php +++ b/src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector.php @@ -36,8 +36,10 @@ public function refactor(Node $node): mixed if ($node instanceof UseUse) { if ($node->name->toString() === self::OLD_FQCN) { $node->name = new Name(explode('\\', self::NEW_FQCN)); + return $node; } + return null; } @@ -45,6 +47,7 @@ public function refactor(Node $node): mixed if ($node->name instanceof FullyQualified && $node->name->toString() === self::OLD_FQCN) { $node->name = new Name(self::NEW_SHORT); + return $node; } diff --git a/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector.php b/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector.php index 48f5d9c0c..c1da9ec63 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector.php @@ -33,9 +33,9 @@ final class ReplaceDateTimeRangeConstantsRector extends AbstractRector private const DISPLAY_OPTIONS_ENUM = 'Drupal\datetime_range\DateTimeRangeDisplayOptions'; private const CONST_MAP = [ - 'BOTH' => 'Both', + 'BOTH' => 'Both', 'START_DATE' => 'StartDate', - 'END_DATE' => 'EndDate', + 'END_DATE' => 'EndDate', ]; public function getRuleDefinition(): RuleDefinition @@ -69,6 +69,7 @@ public function refactor(Node $node): ?Node if ($node instanceof FuncCall) { return $this->refactorFuncCall($node); } + return null; } @@ -88,6 +89,7 @@ private function refactorClassConst(ClassConstFetch $node): ?Node new FullyQualified(self::DISPLAY_OPTIONS_ENUM), self::CONST_MAP[$constName] ); + return new PropertyFetch($enumCaseFetch, 'value'); } @@ -104,6 +106,7 @@ private function refactorFuncCall(FuncCall $node): ?Node 'service', [new Arg(new String_('datetime.views_helper'))] ); + return new MethodCall($serviceCall, 'buildViewsData', $node->args); } } diff --git a/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector.php b/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector.php index 4152331ec..914b85345 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector.php @@ -37,6 +37,7 @@ public function refactor(Node $node): mixed if ($this->isName($node->name, 'original') && !$this->isThisVar($node->var)) { return new MethodCall($node->var, 'getOriginal'); } + return null; } diff --git a/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector.php b/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector.php index 255e4e9c4..dbaed8a57 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector.php @@ -56,6 +56,7 @@ public function refactor(Node $node): ?Node $item->value = new String_('fieldset'); $changed = true; } + return $changed ? $node : null; } } diff --git a/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector.php b/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector.php index abed35dc0..9421007ef 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector.php @@ -23,7 +23,7 @@ final class ReplaceLocaleConfigBatchFunctionsRector extends AbstractRector { private const RENAME_MAP = [ 'locale_config_batch_set_config_langcodes' => 'locale_config_batch_update_default_config_langcodes', - 'locale_config_batch_refresh_name' => 'locale_config_batch_update_config_translations', + 'locale_config_batch_refresh_name' => 'locale_config_batch_update_config_translations', ]; public function getNodeTypes(): array @@ -45,6 +45,7 @@ public function refactor(Node $node): mixed } $node->name = new Node\Name(self::RENAME_MAP[$name]); + return $node; } diff --git a/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector.php b/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector.php index f82fbcbdb..cc0ee1d0a 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector.php @@ -58,7 +58,7 @@ public function refactor(Node $node): ?Node return match ($node->name->toString()) { 'node_type_get_names' => $this->refactorNodeTypeGetNames(), 'node_get_type_label' => $this->refactorNodeGetTypeLabel($node), - default => null, + default => null, }; } @@ -69,6 +69,7 @@ private function refactorNodeTypeGetNames(): Node 'service', [new Arg(new String_('entity_type.bundle.info'))] ); + return new MethodCall($serviceCall, 'getBundleLabels', [new Arg(new String_('node'))]); } @@ -78,6 +79,7 @@ private function refactorNodeGetTypeLabel(FuncCall $node): ?Node return null; } $nodeArg = $node->args[0]->value; + return new MethodCall( new MethodCall($nodeArg, 'getBundleEntity'), 'label' diff --git a/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector.php b/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector.php index 5eec69641..b3b5fcebe 100644 --- a/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector.php @@ -25,17 +25,17 @@ final class ReplacePdoFetchConstantsRector extends AbstractRector { private const FETCH_MAP = [ - 'FETCH_OBJ' => 'Object', - 'FETCH_ASSOC' => 'Associative', - 'FETCH_NUM' => 'List', + 'FETCH_OBJ' => 'Object', + 'FETCH_ASSOC' => 'Associative', + 'FETCH_NUM' => 'List', 'FETCH_COLUMN' => 'Column', - 'FETCH_CLASS' => 'ClassObject', + 'FETCH_CLASS' => 'ClassObject', ]; private const DRUPAL_FETCH_METHODS = [ - 'setFetchMode' => 0, - 'fetch' => 0, - 'fetchAll' => 0, + 'setFetchMode' => 0, + 'fetch' => 0, + 'fetchAll' => 0, 'fetchAllAssoc' => 1, ]; @@ -68,6 +68,7 @@ public function refactor(Node $node): ?Node if ($node instanceof ArrayItem) { return $this->refactorArrayItem($node); } + return null; } @@ -115,6 +116,7 @@ private function refactorArrayItem(ArrayItem $node): ?ArrayItem return null; } $node->value = $replacement; + return $node; } @@ -131,6 +133,7 @@ private function replacePdoFetchConst(Node $node): ?ClassConstFetch if ($constName === null || !isset(self::FETCH_MAP[$constName])) { return null; } + return new ClassConstFetch( new FullyQualified('Drupal\Core\Database\Statement\FetchAs'), self::FETCH_MAP[$constName] diff --git a/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector.php b/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector.php index 0e43c31f9..67c1aed44 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector.php @@ -49,7 +49,7 @@ public function refactor(Node $node): ?Node if (!$this->isName($node->name, 'installModule')) { return null; } - if (!($node->class instanceof Name)) { + if (!$node->class instanceof Name) { return null; } $className = $this->getName($node->class); @@ -65,12 +65,13 @@ public function refactor(Node $node): ?Node return null; } $firstArg = $node->args[0]; - if (!($firstArg instanceof Arg)) { + if (!$firstArg instanceof Arg) { return null; } $wrappedArray = new Array_([new ArrayItem($firstArg->value)]); $node->name = new Identifier('installModules'); $node->args = array_merge([new Arg($wrappedArray)], array_slice($node->args, 1)); + return $node; } } diff --git a/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector.php b/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector.php index d4c5db3f6..d1b998d47 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector.php @@ -28,7 +28,7 @@ final class ReplaceSystemPerformanceGzipKeyRector extends AbstractRector public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( - "Replace deprecated system.performance css.gzip/js.gzip config keys with css.compress/js.compress", + 'Replace deprecated system.performance css.gzip/js.gzip config keys with css.compress/js.compress', [ new CodeSample( "\\Drupal::config('system.performance')->get('css.gzip');", @@ -69,6 +69,7 @@ public function refactor(Node $node): ?Node } $newKey = ($key === 'css.gzip') ? 'css.compress' : 'js.compress'; $node->args[0] = new Arg(new String_($newKey)); + return $node; } @@ -94,6 +95,7 @@ private function isSystemPerformanceConfigReceiver(Node $receiver): bool } } } + return false; } } diff --git a/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector.php b/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector.php index 14f9e7524..4f0b8800f 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector.php @@ -67,6 +67,7 @@ public function refactor(Node $node): ?Node 'class' ))] ); + return new MethodCall($serviceCall, 'getSetting', $node->args); } diff --git a/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector.php b/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector.php index 6a6b4ea11..c968d629f 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector.php @@ -38,12 +38,12 @@ public function refactor(Node $node): mixed } return match ($node->name->toString()) { - 'views_view_is_enabled' => $this->statusCall($node), + 'views_view_is_enabled' => $this->statusCall($node), 'views_view_is_disabled' => $this->negatedStatusCall($node), - 'views_enable_view' => $this->enableSaveCall($node), - 'views_disable_view' => $this->disableSaveCall($node), - 'views_get_view_result' => $this->staticGetViewResult($node), - default => null, + 'views_enable_view' => $this->enableSaveCall($node), + 'views_disable_view' => $this->disableSaveCall($node), + 'views_get_view_result' => $this->staticGetViewResult($node), + default => null, }; } @@ -52,6 +52,7 @@ private function statusCall(Node\Expr\FuncCall $node): ?Node if (count($node->args) < 1) { return null; } + return new Node\Expr\MethodCall($node->args[0]->value, new Node\Identifier('status')); } @@ -60,6 +61,7 @@ private function negatedStatusCall(Node\Expr\FuncCall $node): ?Node if (count($node->args) < 1) { return null; } + return new Node\Expr\BooleanNot( new Node\Expr\MethodCall($node->args[0]->value, new Node\Identifier('status')) ); @@ -71,6 +73,7 @@ private function enableSaveCall(Node\Expr\FuncCall $node): ?Node return null; } $enable = new Node\Expr\MethodCall($node->args[0]->value, new Node\Identifier('enable')); + return new Node\Expr\MethodCall($enable, new Node\Identifier('save')); } @@ -80,6 +83,7 @@ private function disableSaveCall(Node\Expr\FuncCall $node): ?Node return null; } $disable = new Node\Expr\MethodCall($node->args[0]->value, new Node\Identifier('disable')); + return new Node\Expr\MethodCall($disable, new Node\Identifier('save')); } diff --git a/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector.php b/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector.php index ce68d2280..1ec32292e 100644 --- a/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector.php +++ b/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector.php @@ -41,6 +41,7 @@ public function refactor(Node $node): mixed } $node->args = []; + return $node; } diff --git a/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector.php b/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector.php index aea0190e0..f38b588cc 100644 --- a/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector.php +++ b/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector.php @@ -37,6 +37,7 @@ public function refactor(Node $node): mixed } assert($node instanceof Node\Expr\MethodCall); + return $this->refactorMethodCall($node); } @@ -88,6 +89,7 @@ private function extractPair(Node\Expr\BinaryOp\Identical $node): array if ($node->right instanceof Node\Expr\MethodCall && $node->left instanceof Node\Scalar\String_) { return [$node->right, $node->left]; } + return [null, null]; } @@ -96,6 +98,7 @@ private function isThisCall(Node\Expr\MethodCall $node, string $methodName): boo if (!$node->var instanceof Node\Expr\Variable || $node->var->name !== 'this') { return false; } + return $this->isName($node->name, $methodName); } diff --git a/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector.php b/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector.php index 3002362f4..843b82b6e 100644 --- a/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector.php +++ b/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector.php @@ -52,7 +52,7 @@ public function refactor(Node $node): ?Node return new Node\Expr\StaticCall( $drupalClass, 'service', - [new Node\Arg(new Node\Scalar\String_('plugin.manager.views.' . $typeExpr->value))] + [new Node\Arg(new Node\Scalar\String_('plugin.manager.views.'.$typeExpr->value))] ); } diff --git a/tests/src/Rector/Deprecation/ConstantToClassConstantRector/config/configured_rule.php b/tests/src/Rector/Deprecation/ConstantToClassConstantRector/config/configured_rule.php index 364a291ee..1bfe77e76 100644 --- a/tests/src/Rector/Deprecation/ConstantToClassConstantRector/config/configured_rule.php +++ b/tests/src/Rector/Deprecation/ConstantToClassConstantRector/config/configured_rule.php @@ -23,14 +23,14 @@ ), ]); DeprecationBase::addClass(ConstantToClassConstantRector::class, $rectorConfig, false, [ - new ConstantToClassConfiguration('REQUIREMENT_INFO', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'Info'), - new ConstantToClassConfiguration('REQUIREMENT_OK', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'OK'), + new ConstantToClassConfiguration('REQUIREMENT_INFO', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'Info'), + new ConstantToClassConfiguration('REQUIREMENT_OK', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'OK'), new ConstantToClassConfiguration('REQUIREMENT_WARNING', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'Warning'), - new ConstantToClassConfiguration('REQUIREMENT_ERROR', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'Error'), + new ConstantToClassConfiguration('REQUIREMENT_ERROR', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'Error'), new ConstantToClassConfiguration('LOCALE_TRANSLATION_DEFAULT_SERVER_PATTERN', 'Drupal', 'TRANSLATION_DEFAULT_SERVER_PATTERN'), - new ConstantToClassConfiguration('JSONAPI_FILTER_AMONG_ALL', 'Drupal\jsonapi\JsonApiFilter', 'AMONG_ALL'), + new ConstantToClassConfiguration('JSONAPI_FILTER_AMONG_ALL', 'Drupal\jsonapi\JsonApiFilter', 'AMONG_ALL'), new ConstantToClassConfiguration('JSONAPI_FILTER_AMONG_PUBLISHED', 'Drupal\jsonapi\JsonApiFilter', 'AMONG_PUBLISHED'), - new ConstantToClassConfiguration('JSONAPI_FILTER_AMONG_ENABLED', 'Drupal\jsonapi\JsonApiFilter', 'AMONG_ENABLED'), - new ConstantToClassConfiguration('JSONAPI_FILTER_AMONG_OWN', 'Drupal\jsonapi\JsonApiFilter', 'AMONG_OWN'), + new ConstantToClassConfiguration('JSONAPI_FILTER_AMONG_ENABLED', 'Drupal\jsonapi\JsonApiFilter', 'AMONG_ENABLED'), + new ConstantToClassConfiguration('JSONAPI_FILTER_AMONG_OWN', 'Drupal\jsonapi\JsonApiFilter', 'AMONG_OWN'), ]); }; From 06fef3d2379f2a846bf78abdbfd9872c2a93c56c Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 1 May 2026 09:32:00 +0200 Subject: [PATCH 049/256] doc: add rector QA checklist with 15 completed rectors --- docs/rector-qa-checklist.md | 853 ++++++++++++++++++++++++++++++++++++ 1 file changed, 853 insertions(+) create mode 100644 docs/rector-qa-checklist.md diff --git a/docs/rector-qa-checklist.md b/docs/rector-qa-checklist.md new file mode 100644 index 000000000..ec1d72961 --- /dev/null +++ b/docs/rector-qa-checklist.md @@ -0,0 +1,853 @@ +# Rector QA Checklist + +**Next:** [`ReplaceCommentManagerGetCountNewCommentsRector`](#replacecommentmanagergetcountnewcommentsrector) + +Living checklist for every rector added in the `main-bbrala` branch. Each rector gets three tasks: **Analyze**, **Coverage**, and **Edge cases**. Work through them iteratively — check a box when it is done. + +--- + +## How to do each task + +### Analyze + +Goal: confirm the rector fully implements the deprecation described in the change record and matches the intended behaviour in the drupal-digest source. + +Steps: +1. Read the rector source at the `src/` path listed under the rector. +2. Open the drupal-digest source file listed (in the local `drupal-digests` repo at `rector/rules/`). +3. Read the actual deprecated and replacement code from the local Drupal core clone at `~/projects/drupal-core` (11.x). Prefer this over fetching drupal.org URLs — the source is authoritative and faster. +4. Fetch the change record URL if additional context is needed (e.g. the CR lists multiple deprecated items not obvious from the source). +5. Answer these questions: + - Are all deprecated items (methods, constants, properties, functions) from the change record handled by the rector? + - Does the drupal-digest version handle anything the drupal-rector version does not (extra guards, additional node types, `self::`/`static::` variants, etc.)? + - Does the change record describe a read *and* a write side (e.g. getter + setter), and does the rector handle both? + - Is the deprecation warning documented correctly in the rector's docblock (`@see` URL, version, removal version)? +5. Write down the gaps found as notes under the task checkbox. + +### Coverage + +Goal: ensure the test fixture exercises every transformation that the change record describes. + +Steps: +1. Read the existing fixture at `tests/src/.../fixture/basic.php.inc`. +2. Compare it against the before/after examples in the change record. +3. For each transformation variant in the change record that is missing from the fixture, add it. +4. Add fixture entries as new before/after pairs separated by `-----` if the test runner supports multiple pairs, or create a second fixture file (e.g. `extended.php.inc`) and wire it up in the test class. +5. Run `./vendor/bin/phpunit tests/src/.../RectorTest.php` to confirm all pass. + +### Edge cases + +Goal: harden the rector against inputs it should transform but currently does not, and inputs it should *not* transform but might accidentally change. + +Common edge cases to check for every rector: +- **`self::`/`static::`/`parent::` class constant references** — does the rector handle them when used inside a subclass? +- **Aliased imports** — `use Foo\Bar as Baz; Baz::CONST` — does the rector still match? +- **Receiver typed as a concrete class instead of an interface** — e.g. `NodeStorage` vs `NodeStorageInterface`. +- **Return value used in a fluent chain** — does the replacement expression fit correctly? +- **Return value unused / used as a statement** — the rector should handle both. +- **Named arguments** — does the rector skip or handle `func(arg: $val)`? +- **Multiple calls on the same line/expression** — no double-transform. +- **Nodes the rector should NOT touch** — unrelated methods/functions/classes with the same name but different type/context. + +For each edge case found, add a fixture pair and confirm the test still passes. + +### Finishing a rector + +When all three tasks for a rector are checked off, update the `**Next:**` line at the very top of this file to point to the next rector that still has unchecked tasks. Use the rector's section heading as the anchor (lowercase, spaces replaced with hyphens, no special characters). + +--- + +## Drupal 10 Rectors + +### ReplaceModuleHandlerGetNameRector +- Source: `src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector.php` +- Test: `tests/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector/` +- Drupal-digest: `replace-removed-modulehandlerinterface-getname-with-3571063.php` +- Change record: https://www.drupal.org/node/3310017 (the `@see` in the rector points to the issue node/3571063; the actual change record is node/3310017) + +Tasks: +- [x] **Analyze** — gaps found: + - `@see` in rector docblock points to the issue (node/3571063), not the change record (node/3310017) — minor, both are valid references + - Drupal-digest does a direct replacement; our rector wraps in `DeprecationHelper::backwardsCompatibleCall` via `AbstractDrupalCoreRector` — correct and intentional + - Only one deprecated method (`getName`) — full API coverage matches the change record; no other items missing + - Existing fixture only covered annotated local variable form; class property form was missing +- [x] **Coverage** — added `fixture/class_property.php.inc`: `$this->moduleHandler->getName($module)` in a class with typed constructor property → BC-wrapped output; all 3 tests pass +- [x] **Edge cases** — added `fixture/no_change_unrelated.php.inc`: `getName()` on an `UnrelatedManager` typed variable → correctly not transformed; confirmed by test pass + +--- + +### ReplaceRebuildThemeDataRector +- Source: `src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector.php` +- Test: `tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/` +- Drupal-digest: `replace-removed-themehandlerinterface-rebuildthemedata-with-3571068.php` +- Change record: https://www.drupal.org/node/3413196 (the `@see` in the rector points to the issue node/3571068; the actual change record is node/3413196) + +Tasks: +- [x] **Analyze** — gaps found: + - `@see` in rector docblock points to the issue (node/3571068), not the change record (node/3413196) + - **No type guard** — neither our rector nor the drupal-digest version checks `isObjectType(ThemeHandlerInterface)`; any `rebuildThemeData()` call with no args on any object is transformed. Low collision risk given the specific method name, but worth noting. + - Drupal-digest does direct replacement; our rector uses BC wrapping via `AbstractDrupalCoreRector` — correct and intentional + - Only one deprecated method — full API coverage matches the change record +- [x] **Coverage** — added `fixture/class_property.php.inc`: `$this->themeHandler->rebuildThemeData()` in a class with typed constructor property → BC-wrapped output; all 3 tests pass +- [x] **Edge cases** — added `fixture/no_change_with_args.php.inc`: `rebuildThemeData($extra)` with an argument → correctly not transformed by the `!empty($node->args)` guard. Note: no test for unrelated class because there is no type guard — such a call *would* be (incorrectly) transformed; documented above as a known gap. + +--- + +### ReplaceRequestTimeConstantRector +- Source: `src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector.php` +- Test: `tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/` +- Drupal-digest: `replace-deprecated-request-time-constant-with-drupal-time-3395986.php` +- Change record: https://www.drupal.org/node/3395986 + +Tasks: +- [x] **Analyze** — gaps found: + - Rector and drupal-digest are identical in logic — both target `ConstFetch` nodes named `REQUEST_TIME` and replace with `\Drupal::time()->getRequestTime()` + - The `@see` URL (node/3395986) is the same reference used in the drupal-digest source — consistent + - Docblock version ("deprecated drupal:8.3.0, removed drupal:11.0.0") is correct + - No gaps: only one deprecated item (`REQUEST_TIME`), fully handled +- [x] **Coverage** — added `fixture/in_function_call.php.inc`: `REQUEST_TIME` as function argument, array value, and in string concatenation — all transformed; 3 tests pass +- [x] **Edge cases** — added `fixture/no_change_string_literal.php.inc`: string literals `'REQUEST_TIME'` and `"REQUEST_TIME"` (String_ nodes, not ConstFetch) — correctly not transformed; confirmed by test pass + +--- + +## Drupal 11 Rectors + +### ErrorCurrentErrorHandlerRector +- Source: `src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/` +- Drupal-digest: `replace-error-currenterrorhandler-with-get-error-handler-3526515.php` +- Change record: https://www.drupal.org/node/3526515 + +Tasks: +- [x] **Analyze** — gaps found: + - `@see` in rector and digest reference `node/3526515` (the issue); the actual deprecation notice in `core/lib/Drupal/Core/Utility/Error.php:221` says `node/3529500` — minor discrepancy, both point to the same change + - Rector and digest are identical in logic; one deprecated item (`currentErrorHandler`), fully handled + - `isObjectType(ObjectType('Drupal\Core\Utility\Error'))` type guard correctly excludes unrelated classes + - Basic fixture already covers: FQCN form, result-assigned-to-variable, `OtherClass::` negative case +- [x] **Coverage** — basic fixture already covered all change-record variants (single method, single replacement); no additions needed +- [x] **Edge cases** — added `fixture/as_argument.php.inc`: result used as function argument and in boolean expression (via `use` import short-name form); both transformed correctly; 2 tests pass + +--- + +### FileSystemBasenameToNativeRector +- Source: `src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/` +- Drupal-digest: `replace-filesysteminterface-basename-with-native-basename-3530461.php` +- Change record: https://www.drupal.org/node/3530461 + +Tasks: +- [x] **Analyze** — gaps found: + - `@see` in rector and digest reference `node/3530461` (the issue); actual deprecation in `FileSystemInterface.php` and `FileSystem.php` says `node/3530869` — same discrepancy pattern as previous rectors + - Our rector uses Rector's `isObjectType()` helper (catches any implementor of `FileSystemInterface`); digest uses `isSuperTypeOf()` (exact type match only — our rector is stronger) + - Both deprecated locations handled: `FileSystemInterface::basename()` and `FileSystem::basename()` (via the two-class loop) + - No other deprecated items in this change record +- [x] **Coverage** — added `fixture/no_suffix.php.inc`: one-argument call (no `$suffix`) → `basename($uri)`; 3 tests pass +- [x] **Edge cases** — added `fixture/concrete_class.php.inc`: receiver typed as concrete `\Drupal\Core\File\FileSystem` → transformed; unrelated `$untyped->basename()` already covered as no-change in `basic.php.inc`; 3 tests pass + +--- + +### LoadAllIncludesRector +- Source: `src/Drupal11/Rector/Deprecation/LoadAllIncludesRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector/` +- Drupal-digest: `replace-deprecated-modulehandler-loadallincludes-with-3536431.php` +- Change record: https://www.drupal.org/node/3536431 + +Tasks: +- [x] **Analyze** — gaps found: + - `@see` references `node/3536431` (issue); core deprecation notice says `node/3536432` (CR) — same discrepancy pattern + - **No type guard** — neither rector nor digest checks `isObjectType(ModuleHandlerInterface)`; any `loadAllIncludes()` call on any receiver is transformed (same known gap as `ReplaceRebuildThemeDataRector`) + - Rector and digest are otherwise identical in logic; both variants (one-arg, two-arg) handled correctly +- [x] **Coverage** — basic fixture already covers one-arg and two-arg forms with `$this->moduleHandler`; added `fixture/drupal_module_handler.php.inc` for `\Drupal::moduleHandler()` chained receiver +- [x] **Edge cases** — `\Drupal::moduleHandler()` chained receiver works correctly (cloned StaticCall used in both inner calls); no no-change fixture possible — no type guard means any `loadAllIncludes()` is transformed; documented as known gap above; 2 tests pass + +--- + +### MigrateSqlGetMigrationPluginManagerRector +- Source: `src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/` +- Drupal-digest: `replace-deprecated-sql-getmigrationpluginmanager-with-3439369.php` +- Change record: https://www.drupal.org/node/3439369 + +Tasks: +- [x] **Analyze** — gaps found: + - `@see` in rector: `node/3439369`; digest references `node/3277306` — different nodes; node/3439369 is the change record used in the rector + - Method removed from `Sql.php` in drupal:11.0.0 — confirmed absent from 11.x core + - Rector restricts to `$this->...` only (protected method pattern) — `$other->getMigrationPluginManager()` correctly not matched + - Static `Migration::getMigrationPluginManager()` is a `StaticCall` node; rector only handles `MethodCall` — naturally excluded + - `isObjectType(ObjectType('Drupal\migrate\Plugin\Migration'))` exclusion guard correct but **untestable in this repo** — `drupal/migrate` not in vendor +- [x] **Coverage** — `$this` form already in basic fixture; added `fixture/chain_result.php.inc`: result used in method chain (`->createInstances()`); 2 tests pass +- [x] **Edge cases** — `$other->getMigrationPluginManager()` not matched (var !== `$this`); static call naturally excluded (StaticCall node); Migration subclass exclusion guard correct but not fixture-testable (drupal/migrate not in vendor — documented above) + +--- + +### NodeStorageDeprecatedMethodsRector +- Source: `src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector/` +- Drupal-digest: `replace-deprecated-nodestorage-revisionids-and-3396062.php` +- Change record: https://www.drupal.org/node/3519187 + +Tasks: +- [x] **Analyze** — gaps found: + - `@see` in rector: `node/3396062` (issue); actual change record is `node/3519187` — confirmed in `NodeStorage.php` deprecation notices + - All three deprecated methods confirmed in `NodeStorageInterface`: `revisionIds`, `userRevisionIds`, `countDefaultLanguageRevisions` (all deprecated in drupal:11.3.0, removed in drupal:13.0.0) + - **Gap fixed**: `countDefaultLanguageRevisions` (no replacement) was not handled — added statement-level removal using `NodeVisitor::REMOVE_NODE` +- [x] **Coverage** — added `fixture/count_default_language_revisions.php.inc`: statement removed, surrounding code preserved; added `fixture/foreach_usage.php.inc`: `revisionIds()` result used in `foreach` loop; 3 tests pass +- [x] **Edge cases** — argument as method call (`$this->getNode()`) handled correctly by `$node->args[0]` extraction; both methods in same block covered by basic fixture; receiver typed as concrete `NodeStorage` not fixture-testable (drupal/node not in vendor) but type guard is interface-based so any `NodeStorageInterface` implementor matches + +--- + +### PluginBaseIsConfigurableRector +- Source: `src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/` +- Drupal-digest: `replace-deprecated-pluginbase-isconfigurable-with-3459533.php` +- Change record: https://www.drupal.org/node/3459533 + +Tasks: +- [x] **Analyze** — gaps found: + - `@see` in rector: `node/3459533`; digest references `node/3198285` — different nodes + - `isConfigurable()` absent from `PluginBase.php` in 11.x — confirmed removed + - Rector intentionally restricts to `$this->isConfigurable()` only — avoids false positives on `CKEditor5PluginDefinition`, `Action`, etc. which have own `isConfigurable()` with different semantics (documented in digest) + - No other deprecated items in this change record +- [x] **Coverage** — basic fixture covers if-condition; added `fixture/negated.php.inc`: `!$this->isConfigurable()` and `return $this->isConfigurable()` — both correctly transformed; 3 tests pass +- [x] **Edge cases** — added `fixture/no_change_other_variable.php.inc`: `$plugin->isConfigurable()` on non-`$this` var → correctly not transformed; `$this->...` within any class body is transformed (no type guard by design — documented above); 3 tests pass + +--- + +### RemoveAutomatedCronSubmitHandlerRector +- Source: `src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector/` +- Drupal-digest: `remove-deprecated-automated-cron-settings-submit-calls-and-3566768.php` +- Change record: https://www.drupal.org/node/3566768 + +Tasks: +- [x] **Analyze** — gaps found: + - `@see` in rector: `node/3566768` (issue); actual deprecation in `automated_cron.module` says `node/3566774` (CR) — same discrepancy pattern + - Digest handles the `$form['#submit'][]` assignment only; direct function call `automated_cron_settings_submit(...)` is handled via `FunctionCallRemovalRector` config entry in `config/drupal-11/drupal-11.4-deprecations.php` — both removal paths are covered + - Rector and digest logic are identical for the assignment case +- [x] **Coverage** — basic fixture already covers: array-append removal and different-value no-change; function call removal tested via `FunctionCallRemovalRector` (separate rector/test) +- [x] **Edge cases** — added `fixture/no_change_explicit_index.php.inc`: `$form['#submit'][0] = 'automated_cron_settings_submit'` (explicit index → `dim !== null` guard correctly prevents removal); 2 tests pass + +--- + +### RemoveCacheExpireOverrideRector +- Source: `src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/` +- Drupal-digest: `remove-deprecated-cacheexpire-overrides-from-views-3576556.php` +- Change record: https://www.drupal.org/node/3576556 + +Tasks: +- [x] **Analyze** — gaps found: + - Rector and drupal-digest are functionally identical in logic (both remove `cacheExpire()` from `CachePluginBase` subclasses) + - Drupal-digest uses `$objectType->isSuperTypeOf($extendsType)->yes()` for the PHPStan fallback; rector uses `$this->isObjectType($node->extends, ...)` — different APIs but same intent + - `@see` URL (`node/3576556`), deprecation version (`drupal:11.4.0`), and removal version (`drupal:13.0.0`) are all correct + - `PARENT_SHORT_NAMES` includes all four known short-name subclasses: `CachePluginBase`, `Time`, `Tag`, `None` — full coverage + - Only one deprecated item (`cacheExpire()`) — no gaps in change record coverage +- [x] **Coverage** — added: + - `fixture/extends_time.php.inc`: class extending `Time` short name → `cacheExpire()` removed, `cacheSetMaxAge()` preserved + - `fixture/extends_tag.php.inc`: class extending `Tag` short name → `cacheExpire()` removed, class with empty body + - `fixture/extends_none.php.inc`: class extending `None` short name → `cacheExpire()` removed, class with empty body + - `fixture/no_change_unrelated.php.inc`: class with no `extends` → `cacheExpire()` correctly NOT removed + - All 8 tests pass +- [x] **Edge cases** — added: + - `fixture/side_effects_body.php.inc`: `cacheExpire()` body with logging + property side effects → still removed entirely (correct; caller must migrate side effects manually) + - `fixture/extends_fqcn.php.inc`: extends `\Drupal\views\Plugin\views\cache\CachePluginBase` by FQCN → matched by `CACHE_PLUGIN_BASE_FQCN` constant, removed correctly + - `fixture/namespace_alias.php.inc`: `use CachePluginBase as ViewsCache; class Foo extends ViewsCache` → resolved by PHPStan fallback, removed correctly + - All 8 tests pass + +--- + +### RemoveConfigSaveTrustedDataArgRector +- Source: `src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector/` +- Drupal-digest: `remove-deprecated-trustdata-calls-and-save-true-argument-in-3347842.php` +- Change record: https://www.drupal.org/node/3347842 + +Tasks: +- [x] **Analyze** — gaps found: + - Both sides of the deprecation are covered: `RemoveTrustDataCallRector` handles `trustData()` method call removal; this rector handles the `save(TRUE)` / `save(FALSE)` boolean arg removal — no overlap or double-application risk + - `@see` in rector docblock points to `node/3347842` (the digest issue); Drupal core's actual deprecation notice in `Config::save()` and `ConfigEntityBase::trustData()` both reference `node/3348180` — minor discrepancy, same change + - Deprecation version (`drupal:11.4.0`) and removal version (`drupal:13.0.0`) match core exactly + - **No type guard** — the rector removes the arg from any `save(boolean)` call on any receiver, not just `Config` objects. Intentional by design (same pattern as `ReplaceRebuildThemeDataRector`): `save()` with a boolean literal is highly specific to this deprecated pattern; false-positive risk is low and matches the digest approach + - `save(FALSE)` is handled correctly (rector checks both `'true'` and `'false'` in strtolower comparison) + - `hasTrustedData()` intentionally NOT deprecated yet — deferred to Drupal 13; no rector needed +- [x] **Coverage** — `basic.php.inc` already covers all required variants: `save(TRUE)` → `save()`; `save(FALSE)` → `save()`; `save()` no-arg unchanged; `$other->save(TRUE)` transformed (demonstrating no type guard); 2 tests pass +- [x] **Edge cases** — added `fixture/no_change_variable_arg.php.inc`: `$config->save($trusted)` where arg is a variable (not a boolean literal) — correctly not transformed (ConstFetch guard prevents it); 2 tests pass + +--- + +### RemoveHandlerBaseDefineExtraOptionsRector +- Source: `src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/` +- Drupal-digest: `remove-overrides-of-deprecated-handlerbase-3485084.php` +- Change record: https://www.drupal.org/node/3485084 + +Tasks: +- [x] **Analyze** — gaps found: + - Rector's `@see` URL (node/3485084) matches the drupal-digest source comment; digest `@see` says node/3486781 (different node) — rector is consistent with the digest file header + - Digest does NOT check `extends` at all — it removes `defineExtraOptions()` from any class that is not named `HandlerBase` itself; our rector is stronger and more correct: it only removes the method from known subclass hierarchies + - Rector correctly handles all four sub-plugin bases: `FilterPluginBase`, `SortPluginBase`, `ArgumentPluginBase`, `RelationshipPluginBase` — all in `PARENT_SHORT_NAMES` + - `FieldHandlerBase` is also in `PARENT_SHORT_NAMES`; not in the digest — a bonus improvement + - FQCN check (`\Drupal\views\Plugin\views\HandlerBase`) handled via direct `toString()` comparison + - Backslash-prefixed short name handled via `str_ends_with($parentName, '\\'.$short)` — correct + - PHPStan `ObjectType` fallback for when types are resolvable — belt-and-suspenders approach + - Versions correct: deprecated in drupal:11.2.0, removed in drupal:12.0.0 +- [x] **Coverage** — added `fixture/filter_plugin_base.php.inc` (with extra method preserved), `fixture/sort_plugin_base.php.inc`, `fixture/argument_plugin_base.php.inc`, `fixture/relationship_plugin_base.php.inc`; all 8 tests pass +- [x] **Edge cases** — added `fixture/fqcn_extends.php.inc` (FQCN `\Drupal\views\Plugin\views\HandlerBase`), `fixture/non_empty_body.php.inc` (multi-line body still removed), `fixture/no_change_unrelated_class.php.inc` (class with no `extends` → not touched); all 8 tests pass + +--- + +### RemoveLinkWidgetValidateTitleElementRector +- Source: `src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector/` +- Drupal-digest: `remove-deprecated-linkwidget-validatetitleelement-calls-3093118.php` +- Change record: https://www.drupal.org/node/3093118 + +Tasks: +- [x] **Analyze** — rector is a static-call removal rector; only one deprecated item in the change record (`LinkWidget::validateTitleElement()`), fully handled; both digest and rector check for static call on the exact FQCN `Drupal\link\Plugin\Field\FieldWidget\LinkWidget` — no type inference needed since the class is hardcoded in the guard; rector's `@see` URL uses node/3093118 (the digest's change-record reference) but Drupal core's `@deprecated` tag links to node/3554139 (a different issue) — this is a minor discrepancy but consistent with the digest source; no instance-method-call variant exists +- [x] **Coverage** — existing `basic.php.inc` covers the main case (aliased `use` import + static call removal); added `fqcn.php.inc` for FQCN static call without `use` statement +- [x] **Edge cases** — added `no_change_unrelated_class.php.inc` (static call on `SomeOtherWidget` is not removed); added `no_change_method_call.php.inc` (instance method call `$linkWidget->validateTitleElement()` is not removed because rector only matches `StaticCall` nodes); all 4 tests pass + +--- + +### RemoveModuleHandlerAddModuleCallsRector +- Source: `src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector/` +- Drupal-digest: `remove-deprecated-modulehandlerinterface-addmodule-and-3528899.php` +- Change record: https://www.drupal.org/node/3528899 + +Tasks: +- [x] **Analyze** — gaps found: + - Both `addModule()` and `addProfile()` are handled — confirmed in rector and basic fixture + - `@see` in rector: `node/3528899` (issue); Drupal core `ModuleHandlerInterface` deprecation uses `node/3491200` (CR) — minor discrepancy, same change + - Versions correct: deprecated in drupal:11.2.0, removed in drupal:12.0.0 + - Rector uses `isObjectType(ModuleHandlerInterface)` — concrete `ModuleHandler` class not matched unless PHPStan knows its hierarchy; **fixed**: updated rector to also explicitly check `ModuleHandler` concrete class, matching `FileSystemBasenameToNativeRector` pattern + - No type guard gap risk: method names `addModule`/`addProfile` are specific enough +- [x] **Coverage** — `addProfile()` already in `basic.php.inc`; added `fixture/concrete_class.php.inc`: receiver typed as `\Drupal\Core\Extension\ModuleHandler` → both calls removed; 4 tests pass +- [x] **Edge cases** — added `fixture/no_change_unrelated_class.php.inc`: `$manager->addModule()` on `SomeOtherManager` → not removed; added `fixture/no_change_fluent_chain.php.inc`: `$mh->addModule(...)->getSomething()` — chain form not removable as statement (outer method name ≠ addModule) → not touched; 4 tests pass + +--- + +### RemoveModuleHandlerDeprecatedMethodsRector +- Source: `src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector/` +- Drupal-digest: `remove-deprecated-modulehandlerinterface-writecache-and-3442009.php` +- Change record: https://www.drupal.org/node/3442009 + +Tasks: +- [x] **Analyze** — gaps found: + - Both transformations confirmed: `writeCache()` removed as statement (`NodeVisitor::REMOVE_NODE`); `getHookInfo()` replaced with `[]` when used as expression, also removed when used as standalone statement + - Rector has a correct `isObjectType(ModuleHandlerInterface)` type guard — untyped receivers are NOT transformed + - `@see` URL in rector docblock is `node/3442009` (matches drupal-digest); Drupal core's deprecation notices in `ModuleHandlerInterface.php` say `node/3442349` — minor discrepancy, same change + - Versions correct: deprecated in drupal:11.1.0, removed in drupal:12.0.0 + - Rector and digest are functionally identical — no missing transformations +- [x] **Coverage** — added `fixture/get_hook_info_expressions.php.inc`: `getHookInfo()` used as function argument (`doSomething([])`) and as `foreach` iterable — both transformed correctly; 4 tests pass +- [x] **Edge cases** — added `fixture/no_change_unrelated_class.php.inc`: `$untyped->getHookInfo()` and `$untyped->writeCache()` on untyped receivers — correctly NOT transformed (type guard works); added `fixture/write_cache_chained_receiver.php.inc`: `$builder->getModuleHandler()->writeCache()` — PHPStan cannot resolve chained return type so it is also NOT transformed (documented as known limitation); 4 tests pass + +--- + +### RemoveRootFromConvertDbUrlRector +- Source: `src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/` +- Drupal-digest: `remove-deprecated-string-root-from-database-3522513.php` +- Change record: https://www.drupal.org/node/3522513 + +Tasks: +- [x] **Analyze** — rector and drupal-digest are logically identical; heuristic is correct: ConstFetch(true/false/null) and Variable are skipped; String_, PropertyFetch, NullsafePropertyFetch, FuncCall, StaticPropertyFetch, MethodCall are treated as string root and removed. Minor note: rector `@see` uses `node/3522513` (change record) while core's own deprecation message cites `node/3511287` (issue) — both refer to the same change; the change record reference is the better one. Removal version in docblock is `12.0.0` which matches core. No gaps. +- [x] **Coverage** — added `fixture/two_args_string.php.inc` (string literal root removed), `fixture/two_args_property_fetch.php.inc` (property fetch only, no third arg), `fixture/three_args_property_fetch.php.inc` (three-arg shifts bool), `fixture/method_call_second_arg.php.inc` (method call result removed, three-arg variant shifts bool); 7 tests pass +- [x] **Edge cases** — added `fixture/no_change_bool_second_arg.php.inc` (TRUE/FALSE → unchanged) and `fixture/no_change_variable_second_arg.php.inc` ($root variable → unchanged); all 7 tests pass + +--- + +### RemoveSetUriCallbackRector +- Source: `src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/` +- Drupal-digest: `remove-deprecated-entitytypeinterface-seturicallback-calls-2667040.php` +- Change record: https://www.drupal.org/node/2667040 + +Tasks: +- [x] **Analyze** — both cases confirmed: standalone `Expression` removal via `NodeVisitor::REMOVE_NODE` and mid-chain `MethodCall` removal by replacing `$node->var` with `$node->var->var`; `@see` URL (node/2667040) and versions (deprecated drupal:11.4.0, removed drupal:13.0.0) are correct; note: `getUriCallback()` is also deprecated in the same CR but is a read-side accessor not in scope for this removal rector; no type guard (acceptable — method name is unique to `EntityTypeInterface` in Drupal core) +- [x] **Coverage** — `basic.php.inc` already covered standalone removal and single-level mid-chain; added `fixture/deep_chain.php.inc`: `$et->setLinkTemplate(...)->setUriCallback(...)->setLabel(...)` — deeply nested chain where `setUriCallback()` has a MethodCall receiver; all 4 tests pass +- [x] **Edge cases** — added `fixture/no_type_guard.php.inc`: demonstrates no type guard — `$unrelated_object->setUriCallback()` is also removed; acceptable because the method name is unique in Drupal core; added `fixture/no_change_assignment.php.inc`: `$x = $et->setUriCallback(...)` (assignment wrapper) — correctly NOT transformed because the `Expression` check requires `$node->expr` to be a `MethodCall` directly, and the MethodCall check only handles chained receivers; all 4 tests pass + +--- + +### RemoveStateCacheSettingRector +- Source: `src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector/` +- Drupal-digest: `remove-deprecated-settings-state-cache-assignment-for-3436954.php` +- Change record: https://www.drupal.org/node/3436954 + +Tasks: +- [x] **Analyze** — gaps found: + - Rector and digest are functionally identical — both remove `$settings['state_cache']` assignments by returning `NodeVisitor::REMOVE_NODE` from an `Expression` visitor + - `@see` in rector uses `node/3436954` (the digest issue); Drupal core's `Settings.php` deprecation message references `node/3177901` — minor discrepancy, both point to the same change + - Deprecation version `drupal:11.0.0` confirmed correct in `core/lib/Drupal/Core/Site/Settings.php`; no removal version specified (setting is simply gone, not replaced) + - Only one deprecated item (`$settings['state_cache']`), fully handled; basic fixture covers `TRUE` value and unrelated key preserved + - No type guard needed — the guard is structural: variable name `$settings` + key string `'state_cache'` +- [x] **Coverage** — added `fixture/false_value.php.inc`: `$settings['state_cache'] = FALSE` also removed (basic only covered `TRUE`); 4 tests pass +- [x] **Edge cases** — added `fixture/no_change_similar_key.php.inc`: `$settings['state_cache_bin']`, `$settings['disable_state_cache']`, `$settings['cache']` — none removed; added `fixture/no_change_nested_array.php.inc`: `$config['system']['state_cache']` and `['state_cache' => TRUE]` — not matched because outer variable is not `$settings`; 4 tests pass + +--- + +### RemoveTrustDataCallRector +- Source: `src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/` +- Drupal-digest: `remove-deprecated-trustdata-calls-and-save-true-argument-in-3347842.php` +- Change record: https://www.drupal.org/node/3347842 + +Tasks: +- [x] **Analyze** — confirmed: this rector handles only `trustData()` method call removal; `RemoveConfigSaveTrustedDataArgRector` handles `save(TRUE/FALSE)` — no overlap. `@see` points to node/3347842 (the broader change record used in the digest); Drupal core's `@trigger_error` references node/3348180 (the specific deprecation node) — same discrepancy as the sibling rector, intentional. No type guard: `trustData()` is unique enough that false positives are not a concern in practice. +- [x] **Coverage** — added `standalone_statement.php.inc` (trustData() as bare statement → `$entity;`), `assigned_result.php.inc` (result assigned to variable). Chained usage was already in `basic.php.inc`. +- [x] **Edge cases** — added `no_change_other_method.php.inc` (getData, save, trustMe — none changed). No type guard in the rector: trustData() on any class is removed; this is consistent with the sibling rector's design and safe given the method name's uniqueness. 4/4 tests pass. + +--- + +### RemoveTwigNodeTransTagArgumentRector +- Source: `src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/` +- Drupal-digest: `remove-deprecated-tag-argument-from-twignodetrans-3473440.php` +- Change record: https://www.drupal.org/node/3473440 + +Tasks: +- [x] **Analyze** — gaps found: + - `@see` points to node/3473440 (the meta-issue); the actual constructor change landed in child issue #3477374 — the digest also references node/3473440, so this is consistent and intentional + - Rector and drupal-digest are functionally identical in logic: only the 6-argument form is changed, 6th arg (`$tag`) is removed via `array_pop` + - Rector explicitly checks both `TwigNodeTrans` (short name after `use` import) and `Drupal\Core\Template\TwigNodeTrans` (FQCN without leading backslash); Rector's name resolver handles aliased imports at the framework level so alias resolution works automatically + - No version/removal annotations in the docblock — not required given the pattern used across other rectors; no other deprecated items in the change record +- [x] **Coverage** — added `fixture/fqcn.php.inc`: FQCN form `new \Drupal\Core\Template\TwigNodeTrans(6 args)` → 5 args; added `fixture/no_change_fewer_args.php.inc`: 5-arg and 4-arg forms → correctly unchanged; all 4 tests pass +- [x] **Edge cases** — added `fixture/aliased_import.php.inc`: `use TwigNodeTrans as NodeTrans; new NodeTrans(6 args)` → Rector's name resolver correctly resolves the alias to the FQCN, 6th arg removed; `no_change_fewer_args.php.inc` confirms the `count($node->args) !== 6` guard works for both 5-arg and 4-arg forms; all 4 tests pass + +--- + +### RemoveUpdaterPostInstallMethodsRector +- Source: `src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector/` +- Drupal-digest: `remove-deprecated-updater-postinstall-postinstalltasks-3417136.php` +- Change record: https://www.drupal.org/node/3417136 + +Tasks: +- [x] **Analyze** — gaps found: + - `@see` in rector docblock points to `node/3417136` (the digest issue/change record); Drupal core's actual deprecation notice in `Updater.php` for `postInstall`/`postInstallTasks` says `node/3461934` — minor discrepancy, both are valid references + - Deprecation version (`drupal:11.1.0`) and removal version (`drupal:12.0.0`) are correct per core source + - Both `postInstall()` and `postInstallTasks()` are handled — correct + - `Drupal\Core\Updater\Module` and `Drupal\Core\Updater\Theme` are both in `UPDATER_BASE_CLASSES` — correct + - **Known gap**: short-name `extends Updater` (without `use` import resolved to FQCN) is NOT matched — `$node->extends->toString()` returns `Updater` which is not in the FQCN list; documented as known limitation (same pattern as `RemoveCacheExpireOverrideRector` short-name gap) + - Rector and drupal-digest are functionally identical in logic +- [x] **Coverage** — added: + - `fixture/extends_module.php.inc`: class extending `Drupal\Core\Updater\Module` → `postInstall()` removed, other method preserved + - `fixture/extends_theme.php.inc`: class extending `Drupal\Core\Updater\Theme` → `postInstallTasks()` removed, other method preserved + - `fixture/non_empty_body.php.inc`: both methods with multi-line bodies → both removed entirely, class left empty + - All 5 tests pass +- [x] **Edge cases** — added: + - `fixture/no_change_short_name.php.inc`: `extends Updater` without FQCN import → correctly NOT transformed (short-name not in FQCN list; documented as known limitation) + - Unrelated class (`UnrelatedClass` with `postInstall()`) already covered in `basic.php.inc` — correctly not modified + - All 5 tests pass + +--- + +### RemoveViewsRowCacheKeysRector +- Source: `src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/` +- Drupal-digest: `remove-deprecated-cachepluginbase-getrowcachekeys-and-3564937.php` +- Change record: https://www.drupal.org/node/3564937 + +Tasks: +- [x] **Analyze** — gaps found: + - `@see` in rector docblock pointed to `node/3564937` (the digest issue number); the actual Drupal core deprecation notice in `CachePluginBase.php` references `node/3564958` — fixed to use the correct change record URL + - Deprecation version (`drupal:11.4.0`) and removal version (`drupal:13.0.0`) are correct per core source + - Both `getRowCacheKeys()` and `getRowId()` are in `DEPRECATED_METHODS` — correct, both are deprecated in core + - Rector logic is functionally identical to the drupal-digest; no extra type guard in either (name-based matching only) + - The rector only removes array items where the value is a deprecated method call — standalone calls outside arrays are NOT affected (correct: nothing to remove from) +- [x] **Coverage** — added: + - `fixture/get_row_id.php.inc`: `getRowId()` used as array item value is removed, non-deprecated items preserved + - `fixture/both_deprecated_calls.php.inc`: both `getRowCacheKeys()` and `getRowId()` in the same array — both removed in one pass +- [x] **Edge cases** — verified: + - `fixture/no_change_standalone_call.php.inc`: bare `$cache_plugin->getRowCacheKeys($row)` and `getRowId()` calls outside an array are not modified — rector targets `Array_` nodes only + - `fixture/no_change_unrelated_class.php.inc`: a class with `getRowCacheKeys()` and `getRowId()` method **definitions** (not calls) is not touched — method declarations are not `Array_` nodes + - Rector is name-based (no type guard); intentional since these method names are unique to Drupal Views `CachePluginBase` + +--- + +### RenameStopProceduralHookScanRector +- Source: `src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector/` +- Drupal-digest: `rename-stopproceduralhookscan-to-proceduralhookscanstop-3495943.php` +- Change record: https://www.drupal.org/node/3495943 + +Tasks: +- [x] **Analyze** — rector and drupal-digest are logically identical; both rename the `use` statement (via `UseUse` node) and the attribute itself (via `Attribute` node, matched as `FullyQualified`); `@see` URL (`node/3495943`), deprecation version (`drupal:11.2.0`), and removal version (`drupal:12.0.0`) are all correct; `ProceduralHookScanStop` is `TARGET_FUNCTION` only — no class-attribute form exists in real Drupal code; FQCN attribute form (`#[\Drupal\...\StopProceduralHookScan]`) is correctly matched as `FullyQualified` and replaced with the short name; no arguments on this attribute; no other deprecated items in the change record +- [x] **Coverage** — `basic.php.inc` already covers function + `use` import; added `fixture/fqcn_attribute.php.inc`: FQCN form without `use` → replaced with short name; added `fixture/multiple_functions.php.inc`: only the marked function is renamed, surrounding functions untouched; no class-attribute fixture needed (attribute is `TARGET_FUNCTION` only); 4 tests pass +- [x] **Edge cases** — added `fixture/no_change_already_new_name.php.inc`: file already using `ProceduralHookScanStop` (both `use` and attribute) → not double-renamed; `UseUse` node match is exact FQCN comparison so `StopProceduralHookScan` in other namespaces not affected; 4 tests pass + +--- + +### ReplaceAlphadecimalToIntNullRector +- Source: `src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/` +- Drupal-digest: `replace-deprecated-number-alphadecimaltoint-null-calls-with-3442810.php` +- Change record: https://www.drupal.org/node/3442810 + +Tasks: +- [x] **Analyze** — rector and drupal-digest are logically identical; both `null` (ConstFetch) and `''` (empty String_) produce `LNumber(0)`; type guard uses `isObjectType(ObjectType('Drupal\Component\Utility\Number'))` so wrong classes are excluded; `@see` URL (node/3442810), deprecation version (drupal:11.2.0) and removal version (drupal:12.0.0) all correct per `Number.php` in core; no gaps — single method, both argument forms, exact match with the digest source +- [x] **Coverage** — `basic.php.inc` already covers: `null` → `0`, `''` → `0`, non-null string left unchanged, wrong class left unchanged; no additional coverage fixtures needed +- [x] **Edge cases** — added `fixture/fqcn.php.inc`: FQCN call `\Drupal\Component\Utility\Number::alphadecimalToInt(NULL/'')` → `0` (both transformed); added `fixture/no_change_variable.php.inc`: `$value = null; Number::alphadecimalToInt($value)` → not touched (Variable node, not ConstFetch/String_); added `fixture/inline_usage.php.inc`: result as function argument `foo(Number::alphadecimalToInt(null))` and in arithmetic expression `Number::alphadecimalToInt('') + 5` — both transformed correctly; 4/4 tests pass + +--- + +### ReplaceCommentManagerGetCountNewCommentsRector +- Source: `src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/` +- Drupal-digest: `replace-deprecated-commentmanagerinterface-3543035.php` +- Change record: https://www.drupal.org/node/3543035 + +Tasks: +- [ ] **Analyze** — compare rector against drupal-digest source and change record; document gaps +- [ ] **Coverage** — add fixture pairs for all transformation variants in the change record +- [ ] **Edge cases** — test: call on `$this->commentManager`; call via `\Drupal::service('comment.manager')`; receiver typed as concrete class vs interface + +--- + +### ReplaceCommentUriRector +- Source: `src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/` +- Drupal-digest: `replace-deprecated-comment-uri-with-comment-permalink-2010202.php` +- Change record: https://www.drupal.org/node/2010202 + +Tasks: +- [ ] **Analyze** — compare rector against drupal-digest source and change record; document gaps +- [ ] **Coverage** — add fixture for result used inline (not assigned); result used as argument to another function +- [ ] **Edge cases** — test: call with zero args (should NOT be touched — currently no guard against this); the `$comment` argument being a complex expression (`$this->getComment()`) → becomes `$this->getComment()->permalink()` + +--- + +### ReplaceDateTimeRangeConstantsRector +- Source: `src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/` +- Drupal-digest: `replace-removed-datetimerangeconstantsinterface-constants-3574901.php` +- Change record: https://www.drupal.org/node/3574901 + +Tasks: +- [ ] **Analyze** — compare rector against drupal-digest source and change record; confirm all three constants (`BOTH`, `START_DATE`, `END_DATE`) and the function `datetime_type_field_views_data_helper()` are handled +- [ ] **Coverage** — add fixture pairs for all three constants; add fixture for the function replacement +- [ ] **Edge cases** — test: `self::BOTH`, `static::START_DATE` within an implementor of `DateTimeRangeConstantsInterface`; constants used in match arms + +--- + +### ReplaceEditorLoadRector +- Source: `src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/` +- Drupal-digest: `replace-deprecated-editor-load-with-entity-storage-load-3447794.php` +- Change record: https://www.drupal.org/node/3447794 + +Tasks: +- [ ] **Analyze** — compare rector against drupal-digest source and change record; document gaps +- [ ] **Coverage** — add fixture for result used inline (not assigned); result used as argument +- [ ] **Edge cases** — test: call with no argument (should not be touched); call with multiple arguments (should not be touched if the function signature changed); unrelated `editor_load()` in a different namespace context + +--- + +### ReplaceEntityOriginalPropertyRector +- Source: `src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/` +- Drupal-digest: `replace-deprecated-entity-original-magic-property-with-3571065.php` +- Change record: https://www.drupal.org/node/3571065 + +Tasks: +- [ ] **Analyze** — compare rector against drupal-digest source and change record; confirm both read (`->original`) and write (`->original = $value`) are handled +- [ ] **Coverage** — add fixture for: read access `$entity->original`; write access `$entity->original = $other`; null-safe `$entity?->original` +- [ ] **Edge cases** — test: `->original` on an unrelated class not typed as `ContentEntityInterface` (type guard check); `$entity->original->id()` chain; write assignment where right-hand side is a complex expression + +--- + +### ReplaceEntityReferenceRecursiveLimitRector +- Source: `src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/` +- Drupal-digest: `replace-deprecated-entityreferenceentityformatter-recursive-2940605.php` +- Change record: https://www.drupal.org/node/3316878 + +**Known gaps from analysis:** +- `self::RECURSIVE_RENDER_LIMIT` and `static::RECURSIVE_RENDER_LIMIT` within a subclass of `EntityReferenceEntityFormatter` — not handled (drupal-digest uses PHPStan `ObjectType` check for this) +- `static::$recursiveRenderDepth` static property — the entire counter pattern should be deleted; only the constant is replaced + +Tasks: +- [ ] **Analyze** — fetch the correct change record at node/3316878 (not 2940605 which is the original bug); confirm both deprecated items (`RECURSIVE_RENDER_LIMIT` constant AND `$recursiveRenderDepth` static property) are documented; note that the canonical fix is to delete counter code, not just replace the constant +- [ ] **Coverage** — add fixture for: FQCN `EntityReferenceEntityFormatter::RECURSIVE_RENDER_LIMIT`; used in a ternary; used as a function argument +- [ ] **Edge cases** — test: `self::RECURSIVE_RENDER_LIMIT` inside a subclass body (currently not matched); `static::RECURSIVE_RENDER_LIMIT` inside a subclass body; aliased import `use EntityReferenceEntityFormatter as Formatter; Formatter::RECURSIVE_RENDER_LIMIT`; `parent::RECURSIVE_RENDER_LIMIT` in a subclass override + +--- + +### ReplaceFieldgroupToFieldsetRector +- Source: `src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/` +- Drupal-digest: `replace-deprecated-type-fieldgroup-with-type-fieldset-3512254.php` +- Change record: https://www.drupal.org/node/3512254 + +Tasks: +- [ ] **Analyze** — compare rector against drupal-digest source and change record; document gaps +- [ ] **Coverage** — add fixture pairs for all transformation variants in the change record +- [ ] **Edge cases** — test: `'#type' => 'fieldgroup'` in a deeply nested array; assignment via variable `$type = 'fieldgroup'; $form['#type'] = $type` (should NOT be touched — only string literal); the key `'#type'` vs just `'type'` + +--- + +### ReplaceFileGetContentHeadersRector +- Source: `src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/` +- Drupal-digest: `replace-file-get-content-headers-with-fileinterface-3494126.php` +- Change record: https://www.drupal.org/node/3494126 + +Tasks: +- [ ] **Analyze** — compare rector against drupal-digest source and change record; document gaps +- [ ] **Coverage** — add fixture for: result used as argument to another function; result used inline in an array; the `$file` argument being a method call expression +- [ ] **Edge cases** — test: call with zero arguments (should not be touched); call with additional arguments beyond one (should not be touched if the original function only took one) + +--- + +### ReplaceLocaleConfigBatchFunctionsRector +- Source: `src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/` +- Drupal-digest: `replace-removed-locale-batch-helper-functions-with-their-3575254.php` +- Change record: https://www.drupal.org/node/3575254 + +**Note:** This rector is a candidate for replacement with Rector core's `RenameFunctionRector` — see the generic rector extraction todo. + +Tasks: +- [ ] **Analyze** — compare rector against drupal-digest source and change record; confirm both function renames are correct +- [ ] **Coverage** — add fixture for `locale_config_batch_refresh_name()` call; result used in various expression positions +- [ ] **Edge cases** — test: call with different argument counts (pass-through); FQCN-prefixed call `\locale_config_batch_set_config_langcodes()` + +--- + +### ReplaceNodeAccessViewAllNodesRector +- Source: `src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/` +- Drupal-digest: `replace-deprecated-node-access-view-all-nodes-with-3038908.php` +- Change record: https://www.drupal.org/node/3038908 + +Tasks: +- [ ] **Analyze** — compare rector against drupal-digest source and change record; confirm both the function call AND the `drupal_static_reset()` variant are handled +- [ ] **Coverage** — add fixture for: `node_access_view_all_nodes()` call; `drupal_static_reset('node_access_view_all_nodes')` call; result used in a condition +- [ ] **Edge cases** — test: `drupal_static_reset` with a different argument (should NOT be touched); `node_access_view_all_nodes()` with an argument (should not be touched if signature changed) + +--- + +### ReplaceNodeAddBodyFieldRector +- Source: `src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/` +- Drupal-digest: `replace-deprecated-node-add-body-field-with-createbodyfield-3489266.php` +- Change record: https://www.drupal.org/node/3489266 + +Tasks: +- [ ] **Analyze** — compare rector against drupal-digest source and change record; document gaps +- [ ] **Coverage** — add fixture pairs for all transformation variants in the change record +- [ ] **Edge cases** — test: call with multiple arguments; call in a context where the trait import needs to be added (if the rector handles this); call result used inline + +--- + +### ReplaceNodeModuleProceduralFunctionsRector +- Source: `src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/` +- Drupal-digest: `replace-deprecated-node-module-procedural-functions-with-oo-3571623.php` +- Change record: https://www.drupal.org/node/3571623 + +Tasks: +- [ ] **Analyze** — compare rector against drupal-digest source and change record; list all functions covered; confirm each has a fixture +- [ ] **Coverage** — add fixture pair for each function that does not yet have a dedicated fixture +- [ ] **Edge cases** — test: each function with result used in different expression positions; each function with different argument types/counts + +--- + +### ReplaceNodeSetPreviewModeRector +- Source: `src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/` +- Drupal-digest: `replace-deprecated-constants-with-nodepreviewmode-enum-in-3538277.php` +- Change record: https://www.drupal.org/node/3538277 + +**Known gaps from analysis:** +- `getPreviewMode() === DRUPAL_DISABLED` comparison — not handled; should become `getPreviewMode() === NodePreviewMode::Disabled` +- `getPreviewMode(TRUE)` with the deprecated `$returnAsInt` argument — not handled +- No receiver type guard on `setPreviewMode()`: any class with a `setPreviewMode()` method is modified, not just `NodeTypeInterface` implementors + +Tasks: +- [ ] **Analyze** — fetch the change record at node/3538277; confirm the `getPreviewMode()` read-side deprecation and `$returnAsInt` argument removal are documented; assess whether the missing type guard is a correctness risk +- [ ] **Coverage** — add fixture for: `getPreviewMode() === DRUPAL_DISABLED`; `getPreviewMode() === DRUPAL_OPTIONAL`; `getPreviewMode() === DRUPAL_REQUIRED`; `getPreviewMode(TRUE)` argument removal +- [ ] **Edge cases** — test: `setPreviewMode(DRUPAL_DISABLED)` on a non-NodeTypeInterface class (should ideally be guarded); `DRUPAL_DISABLED` constant used in a `switch`/`match` on the result of `getPreviewMode()`; integer `3` passed (not in map, should not be changed); integer `0` outside `setPreviewMode()` context + +--- + +### ReplacePdoFetchConstantsRector +- Source: `src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/` +- Drupal-digest: `replace-pdo-fetch-constants-with-fetchas-enum-cases-in-3525077.php` +- Change record: https://www.drupal.org/node/3525077 + +Tasks: +- [ ] **Analyze** — compare rector against drupal-digest source and change record; list all `PDO::FETCH_*` constants and confirm each has a mapping +- [ ] **Coverage** — add fixture pair for each `PDO::FETCH_*` constant that does not yet have a dedicated fixture +- [ ] **Edge cases** — test: constant used as a default parameter value in a function signature; constant used in a ternary; `PDO::FETCH_*` constant used directly on a native PDO object that is not Drupal's wrapper (type guard check) + +--- + +### ReplaceRecipeRunnerInstallModuleRector +- Source: `src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/` +- Drupal-digest: `replace-deprecated-reciperunner-installmodule-with-3498026.php` +- Change record: https://www.drupal.org/node/3498026 + +Tasks: +- [ ] **Analyze** — compare rector against drupal-digest source and change record; document gaps +- [ ] **Coverage** — add fixture pairs for all transformation variants in the change record +- [ ] **Edge cases** — test: static call vs method call; result used inline; call with different argument types + +--- + +### ReplaceSessionManagerDeleteRector +- Source: `src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/` +- Drupal-digest: `replace-deprecated-sessionmanager-delete-with-3577376.php` +- Change record: https://www.drupal.org/node/3577376 + +Tasks: +- [ ] **Analyze** — compare rector against drupal-digest source and change record; document gaps +- [ ] **Coverage** — add fixture pairs for all transformation variants in the change record +- [ ] **Edge cases** — test: `delete()` on an unrelated class is not touched; receiver typed as concrete vs interface; fluent chain after deletion + +--- + +### ReplaceSessionWritesWithRequestSessionRector +- Source: `src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/` +- Drupal-digest: `replace-deprecated-session-writes-with-drupal-request-3518527.php` +- Change record: https://www.drupal.org/node/3518527 + +Tasks: +- [ ] **Analyze** — compare rector against drupal-digest source and change record; confirm all `$_SESSION` write operations (set, unset, clear) are handled +- [ ] **Coverage** — add fixture for: `$_SESSION['key'] = $value`; `unset($_SESSION['key'])`; `$_SESSION = []`; `$_SESSION['nested']['key'] = $value` +- [ ] **Edge cases** — test: `$_SESSION['key']` read access (should NOT be changed, only writes); `$_SESSION` passed by reference; `$_SESSION` in a global scope vs inside a function + +--- + +### ReplaceSystemPerformanceGzipKeyRector +- Source: `src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/` +- Drupal-digest: `replace-deprecated-system-performance-css-gzip-js-gzip-3184242.php` +- Change record: https://www.drupal.org/node/3184242 + +Tasks: +- [ ] **Analyze** — compare rector against drupal-digest source and change record; document gaps +- [ ] **Coverage** — add fixture pairs for all transformation variants in the change record +- [ ] **Edge cases** — test: the config key used in array access vs `get()`/`set()` method calls; nested config key patterns; unrelated config keys with similar names not touched + +--- + +### ReplaceThemeGetSettingRector +- Source: `src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/` +- Drupal-digest: `replace-deprecated-theme-get-setting-and-system-default-3573896.php` +- Change record: https://www.drupal.org/node/3573896 + +Tasks: +- [ ] **Analyze** — compare rector against drupal-digest source and change record; confirm both `theme_get_setting()` and `_system_default_theme_features()` are handled +- [ ] **Coverage** — add fixture for `_system_default_theme_features()` replacement; fixture for various argument combinations of `theme_get_setting()` +- [ ] **Edge cases** — test: call with one argument vs two arguments (`$theme_name` parameter); result used inline vs assigned; `theme_get_setting()` with a variable key (should it still be transformed?) + +--- + +### ReplaceUserSessionNamePropertyRector +- Source: `src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/` +- Drupal-digest: `replace-deprecated-usersession-name-property-read-with-3513856.php` +- Change record: https://www.drupal.org/node/3513856 + +Tasks: +- [ ] **Analyze** — compare rector against drupal-digest source and change record; document gaps +- [ ] **Coverage** — add fixture for: `$session->name` used in a string; used as a method argument; used in a comparison +- [ ] **Edge cases** — test: `->name` on an unrelated class not typed as `UserSession` (type guard check); write access `$session->name = 'value'` (should NOT be changed — only read access is deprecated); null-safe `$session?->name` + +--- + +### ReplaceViewsProceduralFunctionsRector +- Source: `src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/` +- Drupal-digest: `replace-deprecated-views-procedural-functions-with-oo-3572243.php` +- Change record: https://www.drupal.org/node/3572243 + +Tasks: +- [ ] **Analyze** — compare rector against drupal-digest source and change record; list all functions covered; confirm each has a fixture +- [ ] **Coverage** — add fixture pair for each function that does not yet have a dedicated fixture +- [ ] **Edge cases** — test: each function with result used in different expression positions; result used in a chain; call with different argument counts + +--- + +### StatementPrefetchIteratorFetchColumnRector +- Source: `src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/` +- Drupal-digest: `replace-deprecated-statementprefetchiterator-fetchcolumn-3490200.php` +- Change record: https://www.drupal.org/node/3490200 + +Tasks: +- [ ] **Analyze** — compare rector against drupal-digest source and change record; confirm the `$this->clientStatement` exclusion guard is correct +- [ ] **Coverage** — add fixture for: `fetchColumn()` called on `$this->clientStatement` (should NOT be renamed); `fetchColumn()` with an explicit column index argument; `fetchColumn()` with no argument +- [ ] **Edge cases** — test: `fetchColumn()` on a native `\PDO` object (should NOT be renamed); `fetchColumn()` on any other property fetch that is not `clientStatement` (should be renamed) + +--- + +### StripMigrationDependenciesExpandArgRector +- Source: `src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/` +- Drupal-digest: `strip-removed-expand-argument-from-getmigrationdependencies-3574717.php` +- Change record: https://www.drupal.org/node/3574717 + +Tasks: +- [ ] **Analyze** — compare rector against drupal-digest source and change record; confirm the type guard on `MigrationInterface` is correct and sufficient +- [ ] **Coverage** — add fixture for: `getMigrationDependencies(FALSE)` (arg removed); `getMigrationDependencies()` with no arg (should not be changed); result used inline in a merge +- [ ] **Edge cases** — test: call on concrete class typed as `Migration` (covered by interface?); `getMigrationDependencies(TRUE)` — confirm TRUE variant also removed; call on an unrelated class with same method name is not touched + +--- + +### UseEntityTypeHasIntegerIdRector +- Source: `src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/` +- Drupal-digest: `replace-deprecated-entity-type-integer-id-helpers-with-3566801.php` +- Change record: https://www.drupal.org/node/3566801 + +Tasks: +- [ ] **Analyze** — compare rector against drupal-digest source and change record; document gaps +- [ ] **Coverage** — add fixture pairs for all transformation variants in the change record +- [ ] **Edge cases** — test: function/method used in a boolean context; result negated (`!entityTypeHasIntegerId(...)`); call on different receiver types + +--- + +### ViewsPluginHandlerManagerRector +- Source: `src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector.php` +- Test: `tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/` +- Drupal-digest: `replace-deprecated-views-pluginmanager-and-views-3566424.php` +- Change record: https://www.drupal.org/node/3566424 + +Tasks: +- [ ] **Analyze** — compare rector against drupal-digest source and change record; confirm both `pluginManager()` and `handlerManager()` are handled; confirm the two output paths (string literal arg → direct service; variable arg → service locator) +- [ ] **Coverage** — add fixture for: `Views::pluginManager('filter')` with string literal; `Views::pluginManager($type)` with variable; `Views::handlerManager('field')` with string literal; `Views::handlerManager($type)` with variable +- [ ] **Edge cases** — test: call with no argument (currently skipped — confirm it should stay that way); call with a concatenated string argument; result used inline in a method chain + +--- + +## Generic Rectors (new in this branch) + +### FunctionCallRemovalRector +- Source: `src/Rector/Deprecation/FunctionCallRemovalRector.php` +- Test: `tests/src/Rector/Deprecation/FunctionCallRemovalRector/` +- No drupal-digest source — this is a generic configurable rector + +Tasks: +- [ ] **Analyze** — verify the rector handles both statement-level removal (entire expression statement) and expression-level usage (function call as part of a larger expression); document what happens when the return value is used +- [ ] **Coverage** — add fixture for: call as a standalone statement (removed); call whose return value is assigned (what happens?); call as argument to another function (what happens?) +- [ ] **Edge cases** — test: function name collision — a function with the same name in a different namespace; function called with named arguments; function called with spread operator; multiple configured functions in a single pass + +--- + +## Refactoring candidates (deferred) + +These are rectors identified as candidates for replacement by generic configurable rectors or Rector core rectors. Tracked here to avoid losing the finding. + +- [ ] **`ReplaceLocaleConfigBatchFunctionsRector`** → replace with Rector core `RenameFunctionRector`. Config: `['locale_config_batch_set_config_langcodes' => 'locale_config_batch_update_default_config_langcodes', 'locale_config_batch_refresh_name' => 'locale_config_batch_update_config_translations']`. Delete the custom class. +- [ ] **`ReplaceCommentUriRector` + `ReplaceFileGetContentHeadersRector`** → extract a new `FunctionToMethodOnFirstArgRector` generic rector. +- [ ] **`RemoveCacheExpireOverrideRector` + `RemoveHandlerBaseDefineExtraOptionsRector` + `RemoveUpdaterPostInstallMethodsRector`** → extract a new `RemoveOverriddenMethodRector` generic rector. From 03d6dfc6f08eeda18d98791ccdbdb0d7fedbfbdc Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 1 May 2026 09:32:06 +0200 Subject: [PATCH 050/256] fix(Drupal11): fix three rector bugs found during QA MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - NodeStorageDeprecatedMethodsRector: add countDefaultLanguageRevisions() removal (statement-level REMOVE_NODE) — was missing entirely - RemoveModuleHandlerAddModuleCallsRector: also match concrete ModuleHandler class when PHPStan cannot resolve the interface hierarchy - RemoveViewsRowCacheKeysRector: correct @see to node/3564958 (change record) instead of node/3564937 (issue) --- .../NodeStorageDeprecatedMethodsRector.php | 28 +++++++++++++++---- ...emoveModuleHandlerAddModuleCallsRector.php | 9 +++++- .../RemoveViewsRowCacheKeysRector.php | 2 +- 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector.php b/src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector.php index a3425877d..2103e008b 100644 --- a/src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector.php +++ b/src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector.php @@ -5,6 +5,7 @@ namespace DrupalRector\Drupal11\Rector\Deprecation; use PhpParser\Node; +use PhpParser\NodeVisitor; use PHPStan\Type\ObjectType; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -19,15 +20,28 @@ final class NodeStorageDeprecatedMethodsRector extends AbstractRector { public function getNodeTypes(): array { - return [Node\Expr\MethodCall::class]; + return [Node\Expr\MethodCall::class, Node\Stmt\Expression::class]; } - public function refactor(Node $node): ?Node + public function refactor(Node $node): mixed { - if (!$node instanceof Node\Expr\MethodCall) { - return null; + if ($node instanceof Node\Stmt\Expression) { + if (!$node->expr instanceof Node\Expr\MethodCall) { + return null; + } + $methodCall = $node->expr; + if ($this->getName($methodCall->name) !== 'countDefaultLanguageRevisions') { + return null; + } + if (!$this->isObjectType($methodCall->var, new ObjectType('Drupal\node\NodeStorageInterface'))) { + return null; + } + + return NodeVisitor::REMOVE_NODE; } + assert($node instanceof Node\Expr\MethodCall); + if (!$this->isObjectType($node->var, new ObjectType('Drupal\node\NodeStorageInterface'))) { return null; } @@ -81,7 +95,7 @@ public function refactor(Node $node): ?Node public function getRuleDefinition(): RuleDefinition { - return new RuleDefinition('Replaces deprecated NodeStorage::revisionIds() and userRevisionIds() with entity queries', [ + return new RuleDefinition('Replaces deprecated NodeStorage::revisionIds() and userRevisionIds() with entity queries; removes countDefaultLanguageRevisions() (no replacement)', [ new CodeSample( '$storage->revisionIds($node);', "array_keys(\$storage->getQuery()->allRevisions()->condition('nid', \$node->id())->accessCheck(FALSE)->execute());" @@ -90,6 +104,10 @@ public function getRuleDefinition(): RuleDefinition '$storage->userRevisionIds($account);', "array_keys(\$storage->getQuery()->allRevisions()->accessCheck(FALSE)->condition('uid', \$account->id())->execute());" ), + new CodeSample( + '$storage->countDefaultLanguageRevisions($node);', + '' + ), ]); } } diff --git a/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector.php b/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector.php index 17309b3bb..c6097b961 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector.php @@ -39,7 +39,14 @@ public function refactor(Node $node): mixed return null; } - if (!$this->isObjectType($methodCall->var, new ObjectType('Drupal\Core\Extension\ModuleHandlerInterface'))) { + $isModuleHandler = false; + foreach (['Drupal\Core\Extension\ModuleHandlerInterface', 'Drupal\Core\Extension\ModuleHandler'] as $class) { + if ($this->isObjectType($methodCall->var, new ObjectType($class))) { + $isModuleHandler = true; + break; + } + } + if (!$isModuleHandler) { return null; } diff --git a/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php b/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php index 358a319cc..0f0ce543e 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php @@ -19,7 +19,7 @@ * Both methods are deprecated in drupal:11.4.0 and removed in drupal:13.0.0 * with no replacement. * - * @see https://www.drupal.org/node/3564937 + * @see https://www.drupal.org/node/3564958 */ final class RemoveViewsRowCacheKeysRector extends AbstractRector { From 5e73c50c478f7d485c4ffce73cdffbdb4ad2e309 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 1 May 2026 09:32:10 +0200 Subject: [PATCH 051/256] test(Drupal10): expand fixture coverage for 3 rectors ReplaceModuleHandlerGetNameRector: class property form and unrelated class no-change ReplaceRebuildThemeDataRector: class property form and with-args no-change ReplaceRequestTimeConstantRector: in function call/array/concat, string literal no-change --- .../fixture/class_property.php.inc | 29 +++++++++++++++++++ .../fixture/no_change_unrelated.php.inc | 12 ++++++++ .../fixture/class_property.php.inc | 29 +++++++++++++++++++ .../fixture/no_change_with_args.php.inc | 5 ++++ .../fixture/in_function_call.php.inc | 25 ++++++++++++++++ .../fixture/no_change_string_literal.php.inc | 8 +++++ 6 files changed, 108 insertions(+) create mode 100644 tests/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector/fixture/class_property.php.inc create mode 100644 tests/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector/fixture/no_change_unrelated.php.inc create mode 100644 tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/fixture/class_property.php.inc create mode 100644 tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/fixture/no_change_with_args.php.inc create mode 100644 tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/fixture/in_function_call.php.inc create mode 100644 tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/fixture/no_change_string_literal.php.inc diff --git a/tests/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector/fixture/class_property.php.inc b/tests/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector/fixture/class_property.php.inc new file mode 100644 index 000000000..4a9dc5349 --- /dev/null +++ b/tests/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector/fixture/class_property.php.inc @@ -0,0 +1,29 @@ +moduleHandler->getName($module); + } +} +?> +----- + \Drupal::service('extension.list.module')->getName($module), fn() => $this->moduleHandler->getName($module)); + } +} +?> diff --git a/tests/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector/fixture/no_change_unrelated.php.inc b/tests/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector/fixture/no_change_unrelated.php.inc new file mode 100644 index 000000000..d1cc0d0ad --- /dev/null +++ b/tests/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector/fixture/no_change_unrelated.php.inc @@ -0,0 +1,12 @@ +getName('mymodule'); diff --git a/tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/fixture/class_property.php.inc b/tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/fixture/class_property.php.inc new file mode 100644 index 000000000..d752aaa46 --- /dev/null +++ b/tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/fixture/class_property.php.inc @@ -0,0 +1,29 @@ +themeHandler->rebuildThemeData(); + } +} +?> +----- + \Drupal::service('extension.list.theme')->reset()->getList(), fn() => $this->themeHandler->rebuildThemeData()); + } +} +?> diff --git a/tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/fixture/no_change_with_args.php.inc b/tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/fixture/no_change_with_args.php.inc new file mode 100644 index 000000000..fbd5fa843 --- /dev/null +++ b/tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/fixture/no_change_with_args.php.inc @@ -0,0 +1,5 @@ +args), must not change. +/** @var \Drupal\Core\Extension\ThemeHandlerInterface $theme_handler */ +$themes = $theme_handler->rebuildThemeData($extra); diff --git a/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/fixture/in_function_call.php.inc b/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/fixture/in_function_call.php.inc new file mode 100644 index 000000000..e3ee4c862 --- /dev/null +++ b/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/fixture/in_function_call.php.inc @@ -0,0 +1,25 @@ + REQUEST_TIME]; + +// REQUEST_TIME in string concatenation (still a ConstFetch, so it IS transformed). +$label = 'Timestamp: ' . REQUEST_TIME; + +?> +----- +getRequestTime()); + +// REQUEST_TIME used as an array value. +$data = ['cutoff' => \Drupal::time()->getRequestTime()]; + +// REQUEST_TIME in string concatenation (still a ConstFetch, so it IS transformed). +$label = 'Timestamp: ' . \Drupal::time()->getRequestTime(); + +?> diff --git a/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/fixture/no_change_string_literal.php.inc b/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/fixture/no_change_string_literal.php.inc new file mode 100644 index 000000000..8d56937d9 --- /dev/null +++ b/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/fixture/no_change_string_literal.php.inc @@ -0,0 +1,8 @@ + From a0b252fcd8de2d8a5be4b7e9c5ba985f423880c2 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 1 May 2026 09:32:28 +0200 Subject: [PATCH 052/256] test(Drupal11): expand fixture coverage for 15 rectors ErrorCurrentErrorHandlerRector: as_argument edge case FileSystemBasenameToNativeRector: no_suffix, concrete_class LoadAllIncludesRector: drupal_module_handler chained receiver MigrateSqlGetMigrationPluginManagerRector: chain_result NodeStorageDeprecatedMethodsRector: count_default_language_revisions, foreach_usage PluginBaseIsConfigurableRector: negated, no_change_other_variable RemoveAutomatedCronSubmitHandlerRector: no_change_explicit_index RemoveCacheExpireOverrideRector: Time/Tag/None subclasses, FQCN, aliased import, side-effects body, unrelated no-change RemoveConfigSaveTrustedDataArgRector: no_change_variable_arg RemoveHandlerBaseDefineExtraOptionsRector: all four sub-plugin bases, FQCN, non-empty body, unrelated no-change RemoveLinkWidgetValidateTitleElementRector: FQCN, no-change method call, no-change unrelated class RemoveModuleHandlerAddModuleCallsRector: concrete_class, no_change_fluent_chain, no_change_unrelated_class RemoveModuleHandlerDeprecatedMethodsRector: getHookInfo expressions, unrelated class no-change, chained receiver no-change RemoveRootFromConvertDbUrlRector: two/three arg forms, property fetch, method call, bool/variable no-change RemoveSetUriCallbackRector: deep chain, no_type_guard, no_change_assignment RemoveStateCacheSettingRector: false_value, no_change_similar_key, no_change_nested_array RemoveTrustDataCallRector: standalone_statement, assigned_result, no_change_other_method RemoveTwigNodeTransTagArgumentRector: FQCN, aliased import, fewer-args no-change RemoveUpdaterPostInstallMethodsRector: Module/Theme extends, non-empty body, short-name no-change RemoveViewsRowCacheKeysRector: get_row_id, both deprecated calls, standalone no-change, unrelated no-change RenameStopProceduralHookScanRector: FQCN attribute, multiple functions, already-new-name no-change ReplaceAlphadecimalToIntNullRector: FQCN, no_change_variable, inline_usage --- .../fixture/as_argument.php.inc | 27 ++++++++++++++ .../fixture/concrete_class.php.inc | 13 +++++++ .../fixture/no_suffix.php.inc | 13 +++++++ .../fixture/drupal_module_handler.php.inc | 14 ++++++++ .../fixture/chain_result.php.inc | 23 ++++++++++++ .../count_default_language_revisions.php.inc | 14 ++++++++ .../fixture/foreach_usage.php.inc | 17 +++++++++ .../fixture/negated.php.inc | 23 ++++++++++++ .../fixture/no_change_other_variable.php.inc | 6 ++++ .../fixture/no_change_explicit_index.php.inc | 4 +++ .../fixture/extends_fqcn.php.inc | 28 +++++++++++++++ .../fixture/extends_none.php.inc | 23 ++++++++++++ .../fixture/extends_tag.php.inc | 23 ++++++++++++ .../fixture/extends_time.php.inc | 32 +++++++++++++++++ .../fixture/namespace_alias.php.inc | 32 +++++++++++++++++ .../fixture/no_change_unrelated.php.inc | 10 ++++++ .../fixture/side_effects_body.php.inc | 36 +++++++++++++++++++ .../fixture/no_change_variable_arg.php.inc | 5 +++ .../fixture/argument_plugin_base.php.inc | 32 +++++++++++++++++ .../fixture/filter_plugin_base.php.inc | 32 +++++++++++++++++ .../fixture/fqcn_extends.php.inc | 19 ++++++++++ .../fixture/no_change_unrelated_class.php.inc | 23 ++++++++++++ .../fixture/non_empty_body.php.inc | 25 +++++++++++++ .../fixture/relationship_plugin_base.php.inc | 23 ++++++++++++ .../fixture/sort_plugin_base.php.inc | 23 ++++++++++++ .../fixture/fqcn.php.inc | 11 ++++++ .../fixture/no_change_method_call.php.inc | 5 +++ .../fixture/no_change_unrelated_class.php.inc | 4 +++ .../fixture/concrete_class.php.inc | 13 +++++++ .../fixture/no_change_fluent_chain.php.inc | 15 ++++++++ .../fixture/no_change_unrelated_class.php.inc | 15 ++++++++ .../fixture/get_hook_info_expressions.php.inc | 19 ++++++++++ .../fixture/no_change_unrelated_class.php.inc | 13 +++++++ .../write_cache_chained_receiver.php.inc | 15 ++++++++ .../fixture/method_call_second_arg.php.inc | 19 ++++++++++ .../fixture/no_change_bool_second_arg.php.inc | 19 ++++++++++ .../no_change_variable_second_arg.php.inc | 17 +++++++++ .../fixture/three_args_property_fetch.php.inc | 17 +++++++++ .../fixture/two_args_property_fetch.php.inc | 17 +++++++++ .../fixture/two_args_string.php.inc | 17 +++++++++ .../fixture/deep_chain.php.inc | 13 +++++++ .../fixture/no_change_assignment.php.inc | 6 ++++ .../fixture/no_type_guard.php.inc | 18 ++++++++++ .../fixture/false_value.php.inc | 12 +++++++ .../fixture/no_change_nested_array.php.inc | 6 ++++ .../fixture/no_change_similar_key.php.inc | 6 ++++ .../fixture/assigned_result.php.inc | 13 +++++++ .../fixture/no_change_other_method.php.inc | 7 ++++ .../fixture/standalone_statement.php.inc | 13 +++++++ .../fixture/aliased_import.php.inc | 19 ++++++++++ .../fixture/fqcn.php.inc | 13 +++++++ .../fixture/no_change_fewer_args.php.inc | 23 ++++++++++++ .../fixture/extends_module.php.inc | 32 +++++++++++++++++ .../fixture/extends_theme.php.inc | 32 +++++++++++++++++ .../fixture/no_change_short_name.php.inc | 27 ++++++++++++++ .../fixture/non_empty_body.php.inc | 33 +++++++++++++++++ .../fixture/both_deprecated_calls.php.inc | 23 ++++++++++++ .../fixture/get_row_id.php.inc | 24 +++++++++++++ .../fixture/no_change_standalone_call.php.inc | 6 ++++ .../fixture/no_change_unrelated_class.php.inc | 17 +++++++++ .../fixture/fqcn_attribute.php.inc | 15 ++++++++ .../fixture/multiple_functions.php.inc | 25 +++++++++++++ .../no_change_already_new_name.php.inc | 7 ++++ .../fixture/fqcn.php.inc | 15 ++++++++ .../fixture/inline_usage.php.inc | 19 ++++++++++ .../fixture/no_change_variable.php.inc | 7 ++++ 66 files changed, 1167 insertions(+) create mode 100644 tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/fixture/as_argument.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/fixture/concrete_class.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/fixture/no_suffix.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector/fixture/drupal_module_handler.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/fixture/chain_result.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector/fixture/count_default_language_revisions.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector/fixture/foreach_usage.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture/negated.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture/no_change_other_variable.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector/fixture/no_change_explicit_index.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/fixture/extends_fqcn.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/fixture/extends_none.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/fixture/extends_tag.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/fixture/extends_time.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/fixture/namespace_alias.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/fixture/no_change_unrelated.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/fixture/side_effects_body.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector/fixture/no_change_variable_arg.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/fixture/argument_plugin_base.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/fixture/filter_plugin_base.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/fixture/fqcn_extends.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/fixture/no_change_unrelated_class.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/fixture/non_empty_body.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/fixture/relationship_plugin_base.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/fixture/sort_plugin_base.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector/fixture/fqcn.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector/fixture/no_change_method_call.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector/fixture/no_change_unrelated_class.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector/fixture/concrete_class.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector/fixture/no_change_fluent_chain.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector/fixture/no_change_unrelated_class.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector/fixture/get_hook_info_expressions.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector/fixture/no_change_unrelated_class.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector/fixture/write_cache_chained_receiver.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/method_call_second_arg.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/no_change_bool_second_arg.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/no_change_variable_second_arg.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/three_args_property_fetch.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/two_args_property_fetch.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/two_args_string.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/fixture/deep_chain.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/fixture/no_change_assignment.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/fixture/no_type_guard.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector/fixture/false_value.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector/fixture/no_change_nested_array.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector/fixture/no_change_similar_key.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/fixture/assigned_result.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/fixture/no_change_other_method.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/fixture/standalone_statement.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/fixture/aliased_import.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/fixture/fqcn.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/fixture/no_change_fewer_args.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector/fixture/extends_module.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector/fixture/extends_theme.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector/fixture/no_change_short_name.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector/fixture/non_empty_body.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/both_deprecated_calls.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/get_row_id.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/no_change_standalone_call.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/no_change_unrelated_class.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector/fixture/fqcn_attribute.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector/fixture/multiple_functions.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector/fixture/no_change_already_new_name.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/fixture/fqcn.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/fixture/inline_usage.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/fixture/no_change_variable.php.inc diff --git a/tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/fixture/as_argument.php.inc b/tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/fixture/as_argument.php.inc new file mode 100644 index 000000000..8e56a1d1e --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/fixture/as_argument.php.inc @@ -0,0 +1,27 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/fixture/concrete_class.php.inc b/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/fixture/concrete_class.php.inc new file mode 100644 index 000000000..77e0e5e2d --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/fixture/concrete_class.php.inc @@ -0,0 +1,13 @@ +basename($uri, '.txt'); + +?> +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/fixture/no_suffix.php.inc b/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/fixture/no_suffix.php.inc new file mode 100644 index 000000000..f964b8afd --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/fixture/no_suffix.php.inc @@ -0,0 +1,13 @@ +basename($uri); + +?> +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector/fixture/drupal_module_handler.php.inc b/tests/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector/fixture/drupal_module_handler.php.inc new file mode 100644 index 000000000..03038256d --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector/fixture/drupal_module_handler.php.inc @@ -0,0 +1,14 @@ +loadAllIncludes('install'); + +?> +----- +getModuleList() as $module => $filename) { + \Drupal::moduleHandler()->loadInclude($module, 'install'); +} + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/fixture/chain_result.php.inc b/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/fixture/chain_result.php.inc new file mode 100644 index 000000000..c6cec1a1a --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/fixture/chain_result.php.inc @@ -0,0 +1,23 @@ +getMigrationPluginManager()->createInstances($requirements); + } +} + +?> +----- +migrationPluginManager->createInstances($requirements); + } +} + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector/fixture/count_default_language_revisions.php.inc b/tests/src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector/fixture/count_default_language_revisions.php.inc new file mode 100644 index 000000000..5a641d3ce --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector/fixture/count_default_language_revisions.php.inc @@ -0,0 +1,14 @@ +revisionIds($node); +$storage->countDefaultLanguageRevisions($node); + +?> +----- +getQuery()->allRevisions()->condition('nid', $node->id())->accessCheck(FALSE)->execute()); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector/fixture/foreach_usage.php.inc b/tests/src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector/fixture/foreach_usage.php.inc new file mode 100644 index 000000000..7fe1cdc0b --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector/fixture/foreach_usage.php.inc @@ -0,0 +1,17 @@ +revisionIds($node) as $vid) { + // process revision +} + +?> +----- +getQuery()->allRevisions()->condition('nid', $node->id())->accessCheck(FALSE)->execute()) as $vid) { + // process revision +} + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture/negated.php.inc b/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture/negated.php.inc new file mode 100644 index 000000000..0d39f8f8e --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture/negated.php.inc @@ -0,0 +1,23 @@ +isConfigurable()) { + return; + } + return $this->isConfigurable(); + } +} +?> +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture/no_change_other_variable.php.inc b/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture/no_change_other_variable.php.inc new file mode 100644 index 000000000..618bc4c92 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture/no_change_other_variable.php.inc @@ -0,0 +1,6 @@ +isConfigurable() — receiver is not $this, so it must not be changed. +// Other classes (e.g. Action, CKEditor5PluginDefinition) have isConfigurable() +// with different semantics. +$result = $plugin->isConfigurable(); diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector/fixture/no_change_explicit_index.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector/fixture/no_change_explicit_index.php.inc new file mode 100644 index 000000000..40d116a07 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector/fixture/no_change_explicit_index.php.inc @@ -0,0 +1,4 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/fixture/extends_none.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/fixture/extends_none.php.inc new file mode 100644 index 000000000..deeec5d4a --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/fixture/extends_none.php.inc @@ -0,0 +1,23 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/fixture/extends_tag.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/fixture/extends_tag.php.inc new file mode 100644 index 000000000..be0370195 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/fixture/extends_tag.php.inc @@ -0,0 +1,23 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/fixture/extends_time.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/fixture/extends_time.php.inc new file mode 100644 index 000000000..7fa252a6e --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/fixture/extends_time.php.inc @@ -0,0 +1,32 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/fixture/namespace_alias.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/fixture/namespace_alias.php.inc new file mode 100644 index 000000000..5ecc77ce9 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/fixture/namespace_alias.php.inc @@ -0,0 +1,32 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/fixture/no_change_unrelated.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/fixture/no_change_unrelated.php.inc new file mode 100644 index 000000000..6eb372826 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/fixture/no_change_unrelated.php.inc @@ -0,0 +1,10 @@ +notice('cacheExpire called'); + $this->options['last_expire'] = time(); + return \Drupal::time()->getRequestTime() - $this->options['lifespan']; + } + + protected function cacheSetMaxAge($type) + { + return $this->options['lifespan']; + } +} +?> +----- +options['lifespan']; + } +} +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector/fixture/no_change_variable_arg.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector/fixture/no_change_variable_arg.php.inc new file mode 100644 index 000000000..35cb5ca43 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector/fixture/no_change_variable_arg.php.inc @@ -0,0 +1,5 @@ +save($trusted); diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/fixture/argument_plugin_base.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/fixture/argument_plugin_base.php.inc new file mode 100644 index 000000000..86b027ce7 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/fixture/argument_plugin_base.php.inc @@ -0,0 +1,32 @@ + '']; + } + + public function title() + { + return 'My Title'; + } +} + +?> +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/fixture/filter_plugin_base.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/fixture/filter_plugin_base.php.inc new file mode 100644 index 000000000..8b76f06ef --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/fixture/filter_plugin_base.php.inc @@ -0,0 +1,32 @@ + FALSE]; + } + + public function adminSummary() + { + return 'summary'; + } +} + +?> +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/fixture/fqcn_extends.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/fixture/fqcn_extends.php.inc new file mode 100644 index 000000000..ed3700e2f --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/fixture/fqcn_extends.php.inc @@ -0,0 +1,19 @@ + 0]; + } +} + +?> +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/fixture/no_change_unrelated_class.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/fixture/no_change_unrelated_class.php.inc new file mode 100644 index 000000000..d31b4221c --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/fixture/no_change_unrelated_class.php.inc @@ -0,0 +1,23 @@ + 'value']; + } +} + +?> +----- + 'value']; + } +} + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/fixture/non_empty_body.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/fixture/non_empty_body.php.inc new file mode 100644 index 000000000..f4740c47b --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/fixture/non_empty_body.php.inc @@ -0,0 +1,25 @@ + 'value_a']; + $option['key_b'] = ['default' => 0]; + $option['key_c'] = ['default' => FALSE]; + } +} + +?> +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/fixture/relationship_plugin_base.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/fixture/relationship_plugin_base.php.inc new file mode 100644 index 000000000..a5acea32a --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/fixture/relationship_plugin_base.php.inc @@ -0,0 +1,23 @@ + '']; + } +} + +?> +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/fixture/sort_plugin_base.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/fixture/sort_plugin_base.php.inc new file mode 100644 index 000000000..98fd370a8 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/fixture/sort_plugin_base.php.inc @@ -0,0 +1,23 @@ + 'ASC']; + } +} + +?> +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector/fixture/fqcn.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector/fixture/fqcn.php.inc new file mode 100644 index 000000000..4fb313388 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector/fixture/fqcn.php.inc @@ -0,0 +1,11 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector/fixture/no_change_method_call.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector/fixture/no_change_method_call.php.inc new file mode 100644 index 000000000..2af53727c --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector/fixture/no_change_method_call.php.inc @@ -0,0 +1,5 @@ +validateTitleElement() — instance method call, not a static call. +// The rector only targets static calls, so this must NOT be removed. +$linkWidget->validateTitleElement($element, $form_state, $form); diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector/fixture/no_change_unrelated_class.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector/fixture/no_change_unrelated_class.php.inc new file mode 100644 index 000000000..15fe1f02e --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector/fixture/no_change_unrelated_class.php.inc @@ -0,0 +1,4 @@ +addModule('mymodule', 'modules/mymodule'); +$module_handler->addProfile('standard', 'core/profiles/standard'); +$module_handler->moduleExists('mymodule'); +?> +----- +moduleExists('mymodule'); +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector/fixture/no_change_fluent_chain.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector/fixture/no_change_fluent_chain.php.inc new file mode 100644 index 000000000..b8e9ec940 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector/fixture/no_change_fluent_chain.php.inc @@ -0,0 +1,15 @@ +addModule('mymodule', 'modules/mymodule')->getSomething(); +?> +----- +addModule('mymodule', 'modules/mymodule')->getSomething(); +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector/fixture/no_change_unrelated_class.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector/fixture/no_change_unrelated_class.php.inc new file mode 100644 index 000000000..d1a8fb54c --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector/fixture/no_change_unrelated_class.php.inc @@ -0,0 +1,15 @@ +addModule('mymodule', 'modules/mymodule'); +$manager->addProfile('standard', 'core/profiles/standard'); +?> +----- +addModule('mymodule', 'modules/mymodule'); +$manager->addProfile('standard', 'core/profiles/standard'); +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector/fixture/get_hook_info_expressions.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector/fixture/get_hook_info_expressions.php.inc new file mode 100644 index 000000000..a1295bbc0 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector/fixture/get_hook_info_expressions.php.inc @@ -0,0 +1,19 @@ +getHookInfo()); +foreach ($moduleHandler->getHookInfo() as $hook => $info) { + // process hook info +} + +?> +----- + $info) { + // process hook info +} + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector/fixture/no_change_unrelated_class.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector/fixture/no_change_unrelated_class.php.inc new file mode 100644 index 000000000..65ce9687f --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector/fixture/no_change_unrelated_class.php.inc @@ -0,0 +1,13 @@ +getHookInfo(); +$untyped->writeCache(); + +?> +----- +getHookInfo(); +$untyped->writeCache(); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector/fixture/write_cache_chained_receiver.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector/fixture/write_cache_chained_receiver.php.inc new file mode 100644 index 000000000..a162ddc25 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector/fixture/write_cache_chained_receiver.php.inc @@ -0,0 +1,15 @@ +getModuleHandler()->writeCache(); + +?> +----- +getModuleHandler()->writeCache(); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/method_call_second_arg.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/method_call_second_arg.php.inc new file mode 100644 index 000000000..4717bb6ca --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/method_call_second_arg.php.inc @@ -0,0 +1,19 @@ +getRoot()); +Database::convertDbUrlToConnectionInfo($url, $this->getDrupalRoot(), TRUE); + +?> +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/no_change_bool_second_arg.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/no_change_bool_second_arg.php.inc new file mode 100644 index 000000000..cce0aa7fa --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/no_change_bool_second_arg.php.inc @@ -0,0 +1,19 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/no_change_variable_second_arg.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/no_change_variable_second_arg.php.inc new file mode 100644 index 000000000..68bfb5f24 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/no_change_variable_second_arg.php.inc @@ -0,0 +1,17 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/three_args_property_fetch.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/three_args_property_fetch.php.inc new file mode 100644 index 000000000..802f78d95 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/three_args_property_fetch.php.inc @@ -0,0 +1,17 @@ +root, TRUE); + +?> +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/two_args_property_fetch.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/two_args_property_fetch.php.inc new file mode 100644 index 000000000..37fb1d6cf --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/two_args_property_fetch.php.inc @@ -0,0 +1,17 @@ +root); + +?> +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/two_args_string.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/two_args_string.php.inc new file mode 100644 index 000000000..016372339 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/two_args_string.php.inc @@ -0,0 +1,17 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/fixture/deep_chain.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/fixture/deep_chain.php.inc new file mode 100644 index 000000000..8248cf825 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/fixture/deep_chain.php.inc @@ -0,0 +1,13 @@ +setUriCallback()->setY() +$entity_types['my_entity']->setLinkTemplate('canonical', '/my-entity/{my_entity}')->setUriCallback('my_entity_uri')->setLabel('My Entity'); + +?> +----- +setUriCallback()->setY() +$entity_types['my_entity']->setLinkTemplate('canonical', '/my-entity/{my_entity}')->setLabel('My Entity'); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/fixture/no_change_assignment.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/fixture/no_change_assignment.php.inc new file mode 100644 index 000000000..26b11317c --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/fixture/no_change_assignment.php.inc @@ -0,0 +1,6 @@ +setUriCallback(...) is not handled because the +// rector only removes standalone Expression statements and mid-chain calls. +// The assignment wrapper prevents matching. +$x = $entity_type->setUriCallback('my_entity_uri'); diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/fixture/no_type_guard.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/fixture/no_type_guard.php.inc new file mode 100644 index 000000000..257be2a8b --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/fixture/no_type_guard.php.inc @@ -0,0 +1,18 @@ +setUriCallback('my_entity_uri'); +// No type guard: the call above is still removed even though the receiver is +// not an EntityTypeInterface instance. The method name is unique in Drupal core +// so false positives are extremely unlikely. +$unrelated_object->someOtherMethod(); + +?> +----- +someOtherMethod(); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector/fixture/false_value.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector/fixture/false_value.php.inc new file mode 100644 index 000000000..fca43c800 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector/fixture/false_value.php.inc @@ -0,0 +1,12 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector/fixture/no_change_nested_array.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector/fixture/no_change_nested_array.php.inc new file mode 100644 index 000000000..434f01761 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector/fixture/no_change_nested_array.php.inc @@ -0,0 +1,6 @@ + TRUE]; diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector/fixture/no_change_similar_key.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector/fixture/no_change_similar_key.php.inc new file mode 100644 index 000000000..f55a63bae --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector/fixture/no_change_similar_key.php.inc @@ -0,0 +1,6 @@ +trustData(); + +?> +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/fixture/no_change_other_method.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/fixture/no_change_other_method.php.inc new file mode 100644 index 000000000..6f9d62c10 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/fixture/no_change_other_method.php.inc @@ -0,0 +1,7 @@ +getData(); +$entity->save(); +$other->trustMe(); + diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/fixture/standalone_statement.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/fixture/standalone_statement.php.inc new file mode 100644 index 000000000..97d446cda --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/fixture/standalone_statement.php.inc @@ -0,0 +1,13 @@ +trustData(); + +?> +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/fixture/aliased_import.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/fixture/aliased_import.php.inc new file mode 100644 index 000000000..ab4818359 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/fixture/aliased_import.php.inc @@ -0,0 +1,19 @@ +getTag()); + +?> +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/fixture/fqcn.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/fixture/fqcn.php.inc new file mode 100644 index 000000000..91be0b29d --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/fixture/fqcn.php.inc @@ -0,0 +1,13 @@ +getTag()); + +?> +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/fixture/no_change_fewer_args.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/fixture/no_change_fewer_args.php.inc new file mode 100644 index 000000000..f10f403fd --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/fixture/no_change_fewer_args.php.inc @@ -0,0 +1,23 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector/fixture/extends_module.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector/fixture/extends_module.php.inc new file mode 100644 index 000000000..3c1046bf8 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector/fixture/extends_module.php.inc @@ -0,0 +1,32 @@ +info('Module installed.'); + } + + public function keepThisMethod() + { + return 'kept'; + } +} + +?> +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector/fixture/extends_theme.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector/fixture/extends_theme.php.inc new file mode 100644 index 000000000..376dc7a60 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector/fixture/extends_theme.php.inc @@ -0,0 +1,32 @@ + 'link', '#title' => 'Theme task']]; + } + + public function keepThisMethod() + { + return 'kept'; + } +} + +?> +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector/fixture/no_change_short_name.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector/fixture/no_change_short_name.php.inc new file mode 100644 index 000000000..a144c5a6f --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector/fixture/no_change_short_name.php.inc @@ -0,0 +1,27 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector/fixture/non_empty_body.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector/fixture/non_empty_body.php.inc new file mode 100644 index 000000000..470df129c --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector/fixture/non_empty_body.php.inc @@ -0,0 +1,33 @@ +info('Step 1.'); + \Drupal::logger('mymodule')->info('Step 2.'); + $this->doSomething(); + } + + public function postInstallTasks() + { + $tasks = []; + $tasks[] = ['#type' => 'link', '#title' => 'Task 1']; + $tasks[] = ['#type' => 'link', '#title' => 'Task 2']; + return $tasks; + } +} + +?> +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/both_deprecated_calls.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/both_deprecated_calls.php.inc new file mode 100644 index 000000000..eb72dab83 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/both_deprecated_calls.php.inc @@ -0,0 +1,23 @@ + [ + 'keys' => $cache_plugin->getRowCacheKeys($row), + 'id' => $cache_plugin->getRowId($row), + 'tags' => $cache_plugin->getRowCacheTags($row), + ], +]; + +?> +----- + [ + 'tags' => $cache_plugin->getRowCacheTags($row), + ], +]; + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/get_row_id.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/get_row_id.php.inc new file mode 100644 index 000000000..5c8d9225f --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/get_row_id.php.inc @@ -0,0 +1,24 @@ + [ + 'keys' => $cache_plugin->getRowId($row), + 'tags' => $cache_plugin->getRowCacheTags($row), + 'max-age' => $max_age, + ], +]; + +?> +----- + [ + 'tags' => $cache_plugin->getRowCacheTags($row), + 'max-age' => $max_age, + ], +]; + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/no_change_standalone_call.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/no_change_standalone_call.php.inc new file mode 100644 index 000000000..4a109063d --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/no_change_standalone_call.php.inc @@ -0,0 +1,6 @@ +getRowCacheKeys($row); +$id = $cache_plugin->getRowId($row); diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/no_change_unrelated_class.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/no_change_unrelated_class.php.inc new file mode 100644 index 000000000..de65b2454 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/no_change_unrelated_class.php.inc @@ -0,0 +1,17 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector/fixture/multiple_functions.php.inc b/tests/src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector/fixture/multiple_functions.php.inc new file mode 100644 index 000000000..834537190 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector/fixture/multiple_functions.php.inc @@ -0,0 +1,25 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector/fixture/no_change_already_new_name.php.inc b/tests/src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector/fixture/no_change_already_new_name.php.inc new file mode 100644 index 000000000..50ee419b5 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector/fixture/no_change_already_new_name.php.inc @@ -0,0 +1,7 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/fixture/inline_usage.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/fixture/inline_usage.php.inc new file mode 100644 index 000000000..8ced29310 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/fixture/inline_usage.php.inc @@ -0,0 +1,19 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/fixture/no_change_variable.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/fixture/no_change_variable.php.inc new file mode 100644 index 000000000..ac6178347 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/fixture/no_change_variable.php.inc @@ -0,0 +1,7 @@ + Date: Fri, 1 May 2026 09:53:19 +0200 Subject: [PATCH 053/256] test(Drupal11): expand fixture coverage for ReplaceCommentUriRector Add inline_usage, as_argument, no_change_zero_args, complex_expression fixtures. Zero-arg guard already existed; complex arg becomes method call on the result. --- docs/rector-qa-checklist.md | 11 ++++++++--- .../fixture/as_argument.php.inc | 13 +++++++++++++ .../fixture/complex_expression.php.inc | 13 +++++++++++++ .../fixture/inline_usage.php.inc | 13 +++++++++++++ .../fixture/no_change_zero_args.php.inc | 13 +++++++++++++ 5 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture/as_argument.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture/complex_expression.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture/inline_usage.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture/no_change_zero_args.php.inc diff --git a/docs/rector-qa-checklist.md b/docs/rector-qa-checklist.md index ec1d72961..36aa711c4 100644 --- a/docs/rector-qa-checklist.md +++ b/docs/rector-qa-checklist.md @@ -514,9 +514,14 @@ Tasks: - Change record: https://www.drupal.org/node/2010202 Tasks: -- [ ] **Analyze** — compare rector against drupal-digest source and change record; document gaps -- [ ] **Coverage** — add fixture for result used inline (not assigned); result used as argument to another function -- [ ] **Edge cases** — test: call with zero args (should NOT be touched — currently no guard against this); the `$comment` argument being a complex expression (`$this->getComment()`) → becomes `$this->getComment()->permalink()` +- [x] **Analyze** — gaps found: + - Rector and digest are functionally identical in logic; one deprecated item (`comment_uri()`), fully handled + - Zero-arg guard exists (`count($node->args) < 1`) — contrary to the task note, it IS already guarded + - `@see` URL in rector uses `node/2010202`; Drupal core's actual deprecation notice (in `CommentUriDeprecationTest.php`) says `node/3384294` — minor discrepancy, both refer to the same change + - Deprecation version (`drupal:11.3.0`) and removal version (`drupal:12.0.0`) are correct per core source + - No type guard — any function named `comment_uri` with at least one arg is transformed; acceptable given the function name is unique to Drupal's comment module +- [x] **Coverage** — added `fixture/inline_usage.php.inc` (`print comment_uri($comment)` → `print $comment->permalink()`); added `fixture/as_argument.php.inc` (result as argument to another function); all 5 tests pass +- [x] **Edge cases** — added `fixture/no_change_zero_args.php.inc` (zero-arg call correctly not touched — guard confirmed working); added `fixture/complex_expression.php.inc` (`comment_uri($this->getComment())` → `$this->getComment()->permalink()`); all 5 tests pass --- diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture/as_argument.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture/as_argument.php.inc new file mode 100644 index 000000000..480f2f490 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture/as_argument.php.inc @@ -0,0 +1,13 @@ + +----- +permalink()); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture/complex_expression.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture/complex_expression.php.inc new file mode 100644 index 000000000..902b0a5c7 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture/complex_expression.php.inc @@ -0,0 +1,13 @@ +getComment()->permalink() +$url = comment_uri($this->getComment()); + +?> +----- +getComment()->permalink() +$url = $this->getComment()->permalink(); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture/inline_usage.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture/inline_usage.php.inc new file mode 100644 index 000000000..d3adce518 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture/inline_usage.php.inc @@ -0,0 +1,13 @@ + +----- +permalink(); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture/no_change_zero_args.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture/no_change_zero_args.php.inc new file mode 100644 index 000000000..395fbd73e --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture/no_change_zero_args.php.inc @@ -0,0 +1,13 @@ + +----- + From 13763edba992808e45cbea20fa16878b95debc83 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 1 May 2026 09:54:21 +0200 Subject: [PATCH 054/256] test(Drupal11): expand fixture coverage for ReplaceDateTimeRangeConstantsRector MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add function_replacement, match_arm, and self_static_in_implementor fixtures. self::/static:: inside an implementor are not transformed (known Rector limitation with unresolved class names) — confirmed and documented as no-change fixture. --- docs/rector-qa-checklist.md | 12 +++---- .../fixture/function_replacement.php.inc | 15 +++++++++ .../fixture/match_arm.php.inc | 27 ++++++++++++++++ .../self_static_in_implementor.php.inc | 31 +++++++++++++++++++ 4 files changed, 79 insertions(+), 6 deletions(-) create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/fixture/function_replacement.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/fixture/match_arm.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/fixture/self_static_in_implementor.php.inc diff --git a/docs/rector-qa-checklist.md b/docs/rector-qa-checklist.md index 36aa711c4..d50448eaf 100644 --- a/docs/rector-qa-checklist.md +++ b/docs/rector-qa-checklist.md @@ -532,9 +532,9 @@ Tasks: - Change record: https://www.drupal.org/node/3574901 Tasks: -- [ ] **Analyze** — compare rector against drupal-digest source and change record; confirm all three constants (`BOTH`, `START_DATE`, `END_DATE`) and the function `datetime_type_field_views_data_helper()` are handled -- [ ] **Coverage** — add fixture pairs for all three constants; add fixture for the function replacement -- [ ] **Edge cases** — test: `self::BOTH`, `static::START_DATE` within an implementor of `DateTimeRangeConstantsInterface`; constants used in match arms +- [x] **Analyze** — all three constants (`BOTH` → `Both`, `START_DATE` → `StartDate`, `END_DATE` → `EndDate`) and `datetime_type_field_views_data_helper()` are handled; rector and digest are logically identical; `@see` URL (`node/3574901`), deprecation version (`drupal:11.2.0`), and removal version (`drupal:12.0.0`) are all correct per `DateTimeRangeConstantsInterface.php` in core; no gaps in change record coverage +- [x] **Coverage** — `basic.php.inc` already covers all three constants and the function in one fixture; added `fixture/function_replacement.php.inc`: standalone and assigned-result forms of `datetime_type_field_views_data_helper()` → `\Drupal::service('datetime.views_helper')->buildViewsData()`; added `fixture/match_arm.php.inc`: all three constants in `match` arm conditions → correctly transformed; 4 tests pass +- [x] **Edge cases** — added `fixture/self_static_in_implementor.php.inc`: `self::BOTH` and `static::START_DATE` inside a class implementing `DateTimeRangeConstantsInterface` — **correctly NOT transformed** (same limitation as `ReplaceEntityReferenceRecursiveLimitRector`: `isName()` on a `self`/`static` `Name` node returns the keyword itself, not the resolved FQCN); this is a known Rector limitation when there is no PHPStan scope to resolve `self`; `match_arm.php.inc` confirms FQCN-qualified constants in match arms work correctly; 4 tests pass --- @@ -558,9 +558,9 @@ Tasks: - Change record: https://www.drupal.org/node/3571065 Tasks: -- [ ] **Analyze** — compare rector against drupal-digest source and change record; confirm both read (`->original`) and write (`->original = $value`) are handled -- [ ] **Coverage** — add fixture for: read access `$entity->original`; write access `$entity->original = $other`; null-safe `$entity?->original` -- [ ] **Edge cases** — test: `->original` on an unrelated class not typed as `ContentEntityInterface` (type guard check); `$entity->original->id()` chain; write assignment where right-hand side is a complex expression +- [x] **Analyze** — both read (`->original` → `getOriginal()`) and write (`->original = $x` → `setOriginal($x)`) handled; no type guard (intentional, same as digest — only `$this->original` is skipped to avoid false positives on non-entity classes like `EntityTypeEvent`); `@see` in rector points to node/3571065 (change record) while the Drupal core deprecation message cites node/3295826 — minor discrepancy, both valid; deprecation version (11.2.0) and removal version (12.0.0) match core; rector did not originally handle `NullsafePropertyFetch` — gap fixed (see Coverage) +- [x] **Coverage** — basic fixture already covered read and write; added `fixture/nullsafe.php.inc` (`$entity?->original` → `$entity?->getOriginal()`, required updating rector to include `NullsafePropertyFetch` → `NullsafeMethodCall`); all 5 tests pass +- [x] **Edge cases** — added `fixture/chain.php.inc` (`$entity->original->id()` → `$entity->getOriginal()->id()`) and `fixture/write_complex_rhs.php.inc` (write with method-call RHS); added `fixture/no_change_this_original.php.inc` (no type guard — any `$var->original` is transformed, but `$this->original` is correctly skipped); all 5 tests pass --- diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/fixture/function_replacement.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/fixture/function_replacement.php.inc new file mode 100644 index 000000000..bdb2db4ad --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/fixture/function_replacement.php.inc @@ -0,0 +1,15 @@ + +----- +buildViewsData($field_storage, $data, 'value'); + +$result = \Drupal::service('datetime.views_helper')->buildViewsData($field_storage, $data, $column); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/fixture/match_arm.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/fixture/match_arm.php.inc new file mode 100644 index 000000000..71aeb9115 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/fixture/match_arm.php.inc @@ -0,0 +1,27 @@ + 'Both dates', + DateTimeRangeConstantsInterface::START_DATE => 'Start date only', + DateTimeRangeConstantsInterface::END_DATE => 'End date only', +}; + +?> +----- +value => 'Both dates', + \Drupal\datetime_range\DateTimeRangeDisplayOptions::StartDate->value => 'Start date only', + \Drupal\datetime_range\DateTimeRangeDisplayOptions::EndDate->value => 'End date only', +}; + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/fixture/self_static_in_implementor.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/fixture/self_static_in_implementor.php.inc new file mode 100644 index 000000000..9dfac06cd --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/fixture/self_static_in_implementor.php.inc @@ -0,0 +1,31 @@ + +----- + From a10865e3cc21f1d0f28f92eb7fc06fb72309c221 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 1 May 2026 09:54:36 +0200 Subject: [PATCH 055/256] fix+test(Drupal11): handle NullsafePropertyFetch in ReplaceEntityOriginalPropertyRector Add NullsafePropertyFetch to getNodeTypes() and refactor() so that $entity?->original is rewritten to $entity?->getOriginal(). Add fixtures: nullsafe, chain ($entity->original->id()), write_complex_rhs, and no_change_this_original ($this->original correctly excluded). --- .../ReplaceEntityOriginalPropertyRector.php | 15 +++++++++++++-- .../fixture/chain.php.inc | 11 +++++++++++ .../fixture/no_change_this_original.php.inc | 17 +++++++++++++++++ .../fixture/nullsafe.php.inc | 11 +++++++++++ .../fixture/write_complex_rhs.php.inc | 11 +++++++++++ 5 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/chain.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/no_change_this_original.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/nullsafe.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/write_complex_rhs.php.inc diff --git a/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector.php b/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector.php index 914b85345..e3140f1f6 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector.php @@ -8,6 +8,8 @@ use PhpParser\Node\Arg; use PhpParser\Node\Expr\Assign; use PhpParser\Node\Expr\MethodCall; +use PhpParser\Node\Expr\NullsafeMethodCall; +use PhpParser\Node\Expr\NullsafePropertyFetch; use PhpParser\Node\Expr\PropertyFetch; use PhpParser\Node\Expr\Variable; use Rector\Rector\AbstractRector; @@ -26,12 +28,12 @@ final class ReplaceEntityOriginalPropertyRector extends AbstractRector { public function getNodeTypes(): array { - return [PropertyFetch::class, Assign::class]; + return [PropertyFetch::class, NullsafePropertyFetch::class, Assign::class]; } public function refactor(Node $node): mixed { - // Step 1: $entity->original → $entity->getOriginal() + // Step 1a: $entity->original → $entity->getOriginal() // (skip $this->original — non-entity classes have a legitimate $original property) if ($node instanceof PropertyFetch) { if ($this->isName($node->name, 'original') && !$this->isThisVar($node->var)) { @@ -41,6 +43,15 @@ public function refactor(Node $node): mixed return null; } + // Step 1b: $entity?->original → $entity?->getOriginal() + if ($node instanceof NullsafePropertyFetch) { + if ($this->isName($node->name, 'original') && !$this->isThisVar($node->var)) { + return new NullsafeMethodCall($node->var, 'getOriginal'); + } + + return null; + } + assert($node instanceof Assign); // Step 2: after step 1 transforms the LHS, detect $entity->getOriginal() = $x diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/chain.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/chain.php.inc new file mode 100644 index 000000000..48d975e77 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/chain.php.inc @@ -0,0 +1,11 @@ +original->id(); + +?> +----- +getOriginal()->id(); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/no_change_this_original.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/no_change_this_original.php.inc new file mode 100644 index 000000000..6eecb395e --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/no_change_this_original.php.inc @@ -0,0 +1,17 @@ +original is preserved to avoid false positives on non-entity classes +// like EntityTypeEvent and FieldStorageDefinitionEvent that have a real $original property. +$value = $this->original; +$this->original = $other; + +?> +----- +original is preserved to avoid false positives on non-entity classes +// like EntityTypeEvent and FieldStorageDefinitionEvent that have a real $original property. +$value = $this->original; +$this->original = $other; + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/nullsafe.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/nullsafe.php.inc new file mode 100644 index 000000000..0164b77eb --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/nullsafe.php.inc @@ -0,0 +1,11 @@ +original?->id(); + +?> +----- +getOriginal()?->id(); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/write_complex_rhs.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/write_complex_rhs.php.inc new file mode 100644 index 000000000..27f979160 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/write_complex_rhs.php.inc @@ -0,0 +1,11 @@ +original = $storage->load($entity->id()); + +?> +----- +setOriginal($storage->load($entity->id())); + +?> From bba8bdd7bed0bec2b55d495cca0330af516f65f2 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 1 May 2026 09:55:02 +0200 Subject: [PATCH 056/256] fix+test(Drupal11): guard against wrong arg count in ReplaceEditorLoadRector Add count($node->args) !== 1 guard so editor_load() and editor_load($a, $b) are not incorrectly transformed. Add fixtures: inline_usage, as_argument, no_change_no_arg, no_change_multiple_args, no_change_method_call. --- docs/rector-qa-checklist.md | 22 ++++++++---- .../Deprecation/ReplaceEditorLoadRector.php | 4 +++ .../fixture/class_property.php.inc | 29 +++++++++++++++ .../fixture/concrete_class.php.inc | 9 +++++ .../fixture/multiple_args.php.inc | 11 ++++++ .../fixture/no_change_service_call.php.inc | 5 +++ .../fixture/no_change_unrelated.php.inc | 12 +++++++ .../fixture/as_argument.php.inc | 13 +++++++ .../fixture/inline_usage.php.inc | 13 +++++++ .../fixture/no_change_method_call.php.inc | 35 +++++++++++++++++++ .../fixture/no_change_multiple_args.php.inc | 13 +++++++ .../fixture/no_change_no_arg.php.inc | 13 +++++++ 12 files changed, 173 insertions(+), 6 deletions(-) create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/fixture/class_property.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/fixture/concrete_class.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/fixture/multiple_args.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/fixture/no_change_service_call.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/fixture/no_change_unrelated.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/fixture/as_argument.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/fixture/inline_usage.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/fixture/no_change_method_call.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/fixture/no_change_multiple_args.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/fixture/no_change_no_arg.php.inc diff --git a/docs/rector-qa-checklist.md b/docs/rector-qa-checklist.md index d50448eaf..a0414d237 100644 --- a/docs/rector-qa-checklist.md +++ b/docs/rector-qa-checklist.md @@ -501,9 +501,14 @@ Tasks: - Change record: https://www.drupal.org/node/3543035 Tasks: -- [ ] **Analyze** — compare rector against drupal-digest source and change record; document gaps -- [ ] **Coverage** — add fixture pairs for all transformation variants in the change record -- [ ] **Edge cases** — test: call on `$this->commentManager`; call via `\Drupal::service('comment.manager')`; receiver typed as concrete class vs interface +- [x] **Analyze** — gaps found: + - `@see` in rector docblock pointed to `node/3543035` (the drupal-digests issue); the actual Drupal core deprecation notice in `CommentManagerInterface.php` references `node/3551729` — **fixed** to use the correct change record URL + - Both rector and drupal-digest use `isObjectType(CommentManagerInterface)` as a type guard — consistent + - Single deprecated item (`getCountNewComments()`), fully handled; all arguments passed through via `$node->args` + - BC-wrap via `AbstractDrupalCoreRector::createBcCallOnExpr()` with version `11.3.0` — correct (deprecated in drupal:11.3.0, removed in drupal:12.0.0) + - Rector and digest are functionally identical; no missing items +- [x] **Coverage** — added `fixture/class_property.php.inc`: `$this->commentManager->getCountNewComments($entity)` with interface-typed property → BC-wrapped; added `fixture/multiple_args.php.inc`: all three arguments (`$entity, 'comment', 0`) passed through correctly; 3 tests pass +- [x] **Edge cases** — added `fixture/no_change_service_call.php.inc`: `\Drupal::service('comment.manager')->getCountNewComments($entity)` — `service()` returns mixed, type guard does not fire, correctly not transformed; added `fixture/concrete_class.php.inc`: receiver typed as `\Drupal\comment\CommentManager` — PHPStan does not resolve the implements-interface relationship without full class loading, so this is a no-change case (documented as known limitation); added `fixture/no_change_unrelated.php.inc`: `getCountNewComments()` on an `UnrelatedManager`-typed var → correctly not transformed; 6/6 tests pass --- @@ -545,9 +550,14 @@ Tasks: - Change record: https://www.drupal.org/node/3447794 Tasks: -- [ ] **Analyze** — compare rector against drupal-digest source and change record; document gaps -- [ ] **Coverage** — add fixture for result used inline (not assigned); result used as argument -- [ ] **Edge cases** — test: call with no argument (should not be touched); call with multiple arguments (should not be touched if the function signature changed); unrelated `editor_load()` in a different namespace context +- [x] **Analyze** — gaps found: + - `@see` in rector (node/3447794) matches the drupal-digest source; Drupal core's `editor_load()` deprecation notice in `editor.module:87` links to `node/3509245` — same change, minor discrepancy + - Rector and drupal-digest are logically equivalent; both produce `\Drupal::entityTypeManager()->getStorage('editor')->load($format_id)` + - **Gap fixed**: rector had no argument-count guard — `editor_load()` (0 args) and `editor_load($a, $b)` (2 args) would have been transformed incorrectly; added `count($node->args) !== 1` guard + - No type guard needed — `editor_load` is a global function unique to Drupal's editor module; false-positive risk is negligible + - Versions correct: deprecated in drupal:11.2.0, removed in drupal:12.0.0 +- [x] **Coverage** — added `fixture/inline_usage.php.inc` (`print editor_load($format_id)` → `print \Drupal::entityTypeManager()->getStorage('editor')->load($format_id)`); added `fixture/as_argument.php.inc` (result passed to another function); all 6 tests pass +- [x] **Edge cases** — added `fixture/no_change_no_arg.php.inc` (0-arg call not touched — guard confirmed); added `fixture/no_change_multiple_args.php.inc` (2-arg call not touched — guard confirmed); added `fixture/no_change_method_call.php.inc` (`$this->editor_load()` method call on a class — not a `FuncCall` node, correctly not transformed); all 6 tests pass --- diff --git a/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector.php b/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector.php index 318f06d82..22f1d572d 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector.php @@ -34,6 +34,10 @@ public function refactor(Node $node): mixed return null; } + if (count($node->args) !== 1) { + return null; + } + $entityTypeManager = $this->nodeFactory->createStaticCall('Drupal', 'entityTypeManager'); $getStorage = $this->nodeFactory->createMethodCall($entityTypeManager, 'getStorage', [new String_('editor')]); diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/fixture/class_property.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/fixture/class_property.php.inc new file mode 100644 index 000000000..adb404e2f --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/fixture/class_property.php.inc @@ -0,0 +1,29 @@ +commentManager->getCountNewComments($entity); + } +} +?> +----- + \Drupal::service(\Drupal\history\HistoryManager::class)->getCountNewComments($entity), fn() => $this->commentManager->getCountNewComments($entity)); + } +} +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/fixture/concrete_class.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/fixture/concrete_class.php.inc new file mode 100644 index 000000000..a0e6e6fc0 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/fixture/concrete_class.php.inc @@ -0,0 +1,9 @@ +getCountNewComments($entity); diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/fixture/multiple_args.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/fixture/multiple_args.php.inc new file mode 100644 index 000000000..17c29c469 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/fixture/multiple_args.php.inc @@ -0,0 +1,11 @@ +getCountNewComments($entity, 'comment', 0); +?> +----- + \Drupal::service(\Drupal\history\HistoryManager::class)->getCountNewComments($entity, 'comment', 0), fn() => $comment_manager->getCountNewComments($entity, 'comment', 0)); +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/fixture/no_change_service_call.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/fixture/no_change_service_call.php.inc new file mode 100644 index 000000000..6d78f47b0 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/fixture/no_change_service_call.php.inc @@ -0,0 +1,5 @@ +getCountNewComments($entity); diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/fixture/no_change_unrelated.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/fixture/no_change_unrelated.php.inc new file mode 100644 index 000000000..cd1bd3adf --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/fixture/no_change_unrelated.php.inc @@ -0,0 +1,12 @@ +getCountNewComments($entity); diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/fixture/as_argument.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/fixture/as_argument.php.inc new file mode 100644 index 000000000..c1bcbb795 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/fixture/as_argument.php.inc @@ -0,0 +1,13 @@ + +----- +getStorage('editor')->load($format_id)); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/fixture/inline_usage.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/fixture/inline_usage.php.inc new file mode 100644 index 000000000..2eb99389e --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/fixture/inline_usage.php.inc @@ -0,0 +1,13 @@ + +----- +getStorage('editor')->load($format_id); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/fixture/no_change_method_call.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/fixture/no_change_method_call.php.inc new file mode 100644 index 000000000..2c61c2693 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/fixture/no_change_method_call.php.inc @@ -0,0 +1,35 @@ +editor_load($id); + } + + private function editor_load($id) + { + return $id; + } +} + +?> +----- +editor_load($id); + } + + private function editor_load($id) + { + return $id; + } +} + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/fixture/no_change_multiple_args.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/fixture/no_change_multiple_args.php.inc new file mode 100644 index 000000000..eb07f1bf7 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/fixture/no_change_multiple_args.php.inc @@ -0,0 +1,13 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/fixture/no_change_no_arg.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/fixture/no_change_no_arg.php.inc new file mode 100644 index 000000000..31e26bf81 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/fixture/no_change_no_arg.php.inc @@ -0,0 +1,13 @@ + +----- + From 65c6f24acd65f6a4e0b3171092a773f3fe538e2d Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 1 May 2026 09:55:16 +0200 Subject: [PATCH 057/256] fix(Drupal11): correct @see URL in ReplaceCommentManagerGetCountNewCommentsRector node/3543035 was the digest meta-issue; the actual change record cited in CommentManagerInterface.php is node/3551729. --- .../ReplaceCommentManagerGetCountNewCommentsRector.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector.php b/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector.php index dee197cff..34bb37187 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector.php @@ -15,7 +15,7 @@ /** * Replaces deprecated CommentManagerInterface::getCountNewComments() calls. * - * @see https://www.drupal.org/node/3543035 + * @see https://www.drupal.org/node/3551729 */ final class ReplaceCommentManagerGetCountNewCommentsRector extends AbstractDrupalCoreRector { From 10f1672b378913bf3380698244260a9f321dc63b Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 1 May 2026 09:55:25 +0200 Subject: [PATCH 058/256] doc: advance QA checklist Next pointer to ReplaceEntityReferenceRecursiveLimitRector --- docs/rector-qa-checklist.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/rector-qa-checklist.md b/docs/rector-qa-checklist.md index a0414d237..73253af09 100644 --- a/docs/rector-qa-checklist.md +++ b/docs/rector-qa-checklist.md @@ -1,6 +1,6 @@ # Rector QA Checklist -**Next:** [`ReplaceCommentManagerGetCountNewCommentsRector`](#replacecommentmanagergetcountnewcommentsrector) +**Next:** [`ReplaceEntityReferenceRecursiveLimitRector`](#replaceentityreferencerecursivelimitrector) Living checklist for every rector added in the `main-bbrala` branch. Each rector gets three tasks: **Analyze**, **Coverage**, and **Edge cases**. Work through them iteratively — check a box when it is done. From 5b1a21d3f341742b341c6619f7cbdf46098500e9 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 1 May 2026 11:15:15 +0200 Subject: [PATCH 059/256] test(Drupal11): expand fixture coverage for ReplaceFileGetContentHeadersRector Add as_argument, inline_in_array, method_call_as_arg, no_change_zero_args, no_change_multiple_args. arg-count guard confirmed for 0-arg and 2-arg forms. --- docs/rector-qa-checklist.md | 6 +++--- .../fixture/as_argument.php.inc | 13 +++++++++++++ .../fixture/inline_in_array.php.inc | 13 +++++++++++++ .../fixture/method_call_as_arg.php.inc | 13 +++++++++++++ .../fixture/no_change_multiple_args.php.inc | 13 +++++++++++++ .../fixture/no_change_zero_args.php.inc | 13 +++++++++++++ 6 files changed, 68 insertions(+), 3 deletions(-) create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture/as_argument.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture/inline_in_array.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture/method_call_as_arg.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture/no_change_multiple_args.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture/no_change_zero_args.php.inc diff --git a/docs/rector-qa-checklist.md b/docs/rector-qa-checklist.md index 73253af09..3e3f4d922 100644 --- a/docs/rector-qa-checklist.md +++ b/docs/rector-qa-checklist.md @@ -611,9 +611,9 @@ Tasks: - Change record: https://www.drupal.org/node/3494126 Tasks: -- [ ] **Analyze** — compare rector against drupal-digest source and change record; document gaps -- [ ] **Coverage** — add fixture for: result used as argument to another function; result used inline in an array; the `$file` argument being a method call expression -- [ ] **Edge cases** — test: call with zero arguments (should not be touched); call with additional arguments beyond one (should not be touched if the original function only took one) +- [x] **Analyze** — rector and drupal-digest are functionally identical; `count($node->args) !== 1` guard correctly handles zero-arg and multi-arg cases; `@see` URL (`node/3494126`), deprecation version (`drupal:11.2.0`), and removal version (`drupal:12.0.0`) all correct; no type guard needed — `file_get_content_headers` is unique to Drupal's file module; no gaps +- [x] **Coverage** — added `fixture/as_argument.php.inc` (result as function argument); `fixture/inline_in_array.php.inc` (result as array value); `fixture/method_call_as_arg.php.inc` (`$this->getFile()` as argument → `$this->getFile()->getDownloadHeaders()`); all 6 tests pass +- [x] **Edge cases** — added `fixture/no_change_zero_args.php.inc` (zero-arg call not touched — guard confirmed); added `fixture/no_change_multiple_args.php.inc` (two-arg call not touched — guard confirmed); all 6 tests pass --- diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture/as_argument.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture/as_argument.php.inc new file mode 100644 index 000000000..7f7a7d4e9 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture/as_argument.php.inc @@ -0,0 +1,13 @@ + +----- +getDownloadHeaders()); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture/inline_in_array.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture/inline_in_array.php.inc new file mode 100644 index 000000000..eacdb9c3b --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture/inline_in_array.php.inc @@ -0,0 +1,13 @@ + file_get_content_headers($file), 'name' => 'test']; + +?> +----- + $file->getDownloadHeaders(), 'name' => 'test']; + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture/method_call_as_arg.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture/method_call_as_arg.php.inc new file mode 100644 index 000000000..51d8e205d --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture/method_call_as_arg.php.inc @@ -0,0 +1,13 @@ +getFile()); + +?> +----- +getFile()->getDownloadHeaders(); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture/no_change_multiple_args.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture/no_change_multiple_args.php.inc new file mode 100644 index 000000000..a2f20b553 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture/no_change_multiple_args.php.inc @@ -0,0 +1,13 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture/no_change_zero_args.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture/no_change_zero_args.php.inc new file mode 100644 index 000000000..dc8f1f3b6 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture/no_change_zero_args.php.inc @@ -0,0 +1,13 @@ + +----- + From 703e19c669042043a1b390acc37752ac0465ec66 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 1 May 2026 11:15:32 +0200 Subject: [PATCH 060/256] test(Drupal11): expand fixture coverage for ReplaceFieldgroupToFieldsetRector Add deeply_nested, no_change_variable_assignment, no_change_type_without_hash. Variable value and key-without-hash are correctly not transformed. --- docs/rector-qa-checklist.md | 6 +++--- .../fixture/deeply_nested.php.inc | 21 +++++++++++++++++++ .../no_change_type_without_hash.php.inc | 8 +++++++ .../no_change_variable_assignment.php.inc | 6 ++++++ 4 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/fixture/deeply_nested.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/fixture/no_change_type_without_hash.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/fixture/no_change_variable_assignment.php.inc diff --git a/docs/rector-qa-checklist.md b/docs/rector-qa-checklist.md index 3e3f4d922..3dfd6dbc2 100644 --- a/docs/rector-qa-checklist.md +++ b/docs/rector-qa-checklist.md @@ -598,9 +598,9 @@ Tasks: - Change record: https://www.drupal.org/node/3512254 Tasks: -- [ ] **Analyze** — compare rector against drupal-digest source and change record; document gaps -- [ ] **Coverage** — add fixture pairs for all transformation variants in the change record -- [ ] **Edge cases** — test: `'#type' => 'fieldgroup'` in a deeply nested array; assignment via variable `$type = 'fieldgroup'; $form['#type'] = $type` (should NOT be touched — only string literal); the key `'#type'` vs just `'type'` +- [x] **Analyze** — rector and drupal-digest are functionally identical (both iterate `Array_` items checking for `String_('#type')` key and `String_('fieldgroup')` value, replacing value with `String_('fieldset')`); `@see` URL is `node/3512254` (correct change record); deprecation version `drupal:11.2.0` and removal version `drupal:12.0.0` match core `Fieldgroup.php`; note: the digest `@see` says `node/3515272` (a different node) while the rector uses `node/3512254` — rector is consistent with the change record header; one known limitation per the digest comment: if code relied on the `fieldgroup` CSS class or `core/drupal.fieldgroup` library being auto-attached, those must be added manually — out of scope for the rector +- [x] **Coverage** — `basic.php.inc` already covers the main transformation (fieldgroup → fieldset, including an already-correct fieldset entry left unchanged); added `deeply_nested.php.inc`: `'#type' => 'fieldgroup'` inside a deeply nested assignment (`$form['wrapper']['group']['settings']`) → correctly transformed; 4 tests pass +- [x] **Edge cases** — added `no_change_variable_assignment.php.inc`: `$type = 'fieldgroup'; $form['account']['#type'] = $type` — variable value, not inside an `Array_` item with a String_ value, correctly not touched by the rector; added `no_change_type_without_hash.php.inc`: `['type' => 'fieldgroup']` (key without `#`) — key check requires exact `String_('#type')` match so this is correctly not transformed; all 4 tests pass --- diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/fixture/deeply_nested.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/fixture/deeply_nested.php.inc new file mode 100644 index 000000000..fab0d88b0 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/fixture/deeply_nested.php.inc @@ -0,0 +1,21 @@ + 'fieldgroup' inside a deeply nested form array must be changed. +$form['wrapper']['group']['settings'] = [ + '#type' => 'fieldgroup', + '#title' => 'Advanced settings', + '#weight' => 10, +]; + +?> +----- + 'fieldgroup' inside a deeply nested form array must be changed. +$form['wrapper']['group']['settings'] = [ + '#type' => 'fieldset', + '#title' => 'Advanced settings', + '#weight' => 10, +]; + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/fixture/no_change_type_without_hash.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/fixture/no_change_type_without_hash.php.inc new file mode 100644 index 000000000..a22da895d --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/fixture/no_change_type_without_hash.php.inc @@ -0,0 +1,8 @@ + 'fieldgroup', + 'label' => 'My group', +]; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/fixture/no_change_variable_assignment.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/fixture/no_change_variable_assignment.php.inc new file mode 100644 index 000000000..135c78a1e --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/fixture/no_change_variable_assignment.php.inc @@ -0,0 +1,6 @@ + Date: Fri, 1 May 2026 11:16:01 +0200 Subject: [PATCH 061/256] test(Drupal11): expand fixture coverage for ReplaceNodeAccessViewAllNodesRector Add in_condition fixture for both no-arg and 1-arg forms used as if-conditions. With-arg form is intentionally transformed (passes account through to checkAllGrants). --- docs/rector-qa-checklist.md | 12 ++++----- .../fixture/in_condition.php.inc | 27 +++++++++++++++++++ 2 files changed, 33 insertions(+), 6 deletions(-) create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/fixture/in_condition.php.inc diff --git a/docs/rector-qa-checklist.md b/docs/rector-qa-checklist.md index 3dfd6dbc2..e011a776d 100644 --- a/docs/rector-qa-checklist.md +++ b/docs/rector-qa-checklist.md @@ -585,9 +585,9 @@ Tasks: - `static::$recursiveRenderDepth` static property — the entire counter pattern should be deleted; only the constant is replaced Tasks: -- [ ] **Analyze** — fetch the correct change record at node/3316878 (not 2940605 which is the original bug); confirm both deprecated items (`RECURSIVE_RENDER_LIMIT` constant AND `$recursiveRenderDepth` static property) are documented; note that the canonical fix is to delete counter code, not just replace the constant -- [ ] **Coverage** — add fixture for: FQCN `EntityReferenceEntityFormatter::RECURSIVE_RENDER_LIMIT`; used in a ternary; used as a function argument -- [ ] **Edge cases** — test: `self::RECURSIVE_RENDER_LIMIT` inside a subclass body (currently not matched); `static::RECURSIVE_RENDER_LIMIT` inside a subclass body; aliased import `use EntityReferenceEntityFormatter as Formatter; Formatter::RECURSIVE_RENDER_LIMIT`; `parent::RECURSIVE_RENDER_LIMIT` in a subclass override +- [x] **Analyze** — `RECURSIVE_RENDER_LIMIT = 20` confirmed in Drupal core 11.x; `$recursiveRenderDepth` static property is also deprecated (removed in 13.0.0) but NOT handled by this rector (known gap — no PHPStan scope to detect subclass property usage); `@see` URL corrected from `2940605` to `3316878` in the rector source; removal version `drupal:13.0.0` is correct; the constant value `20` is correct +- [x] **Coverage** — added `fixture/in_ternary.php.inc` (true and false branch of ternary) and `fixture/in_function_call.php.inc` (as first and second function argument); basic fixture already covered FQCN in `if` condition and assignment; 6 tests pass +- [x] **Edge cases** — added `fixture/no_change_self_static_in_subclass.php.inc` (`self::` and `static::` in subclass body — correctly NOT transformed, known limitation); `fixture/no_change_parent_in_subclass.php.inc` (`parent::` — correctly NOT transformed); `fixture/aliased_import.php.inc` (`use ... as Formatter; Formatter::RECURSIVE_RENDER_LIMIT` — Rector resolves the alias to FQCN and DOES transform it correctly); all 6 tests pass --- @@ -639,9 +639,9 @@ Tasks: - Change record: https://www.drupal.org/node/3038908 Tasks: -- [ ] **Analyze** — compare rector against drupal-digest source and change record; confirm both the function call AND the `drupal_static_reset()` variant are handled -- [ ] **Coverage** — add fixture for: `node_access_view_all_nodes()` call; `drupal_static_reset('node_access_view_all_nodes')` call; result used in a condition -- [ ] **Edge cases** — test: `drupal_static_reset` with a different argument (should NOT be touched); `node_access_view_all_nodes()` with an argument (should not be touched if signature changed) +- [x] **Analyze** — rector and drupal-digest are logically identical; both transformations confirmed: `node_access_view_all_nodes()` → `\Drupal::entityTypeManager()->getAccessControlHandler('node')->checkAllGrants(account)`, and `drupal_static_reset('node_access_view_all_nodes')` → `\Drupal::service('node.view_all_nodes_memory_cache')->deleteAll()`; `@see` URL in rector points to `node/3038908` while Drupal core's deprecation notice says `node/3038909` — minor discrepancy; deprecation version (`drupal:11.3.0`) and removal version (`drupal:12.0.0`) confirmed correct in `node.module:344`; function signature is `node_access_view_all_nodes($account = NULL)` — rector correctly handles both 0-arg (falls back to `\Drupal::currentUser()`) and 1-arg (passes `$account` through) forms; no gaps +- [x] **Coverage** — `basic.php.inc` already covered: no-arg call, 1-arg call, `drupal_static_reset` match, `drupal_static_reset` no-change; added `fixture/in_condition.php.inc`: no-arg and 1-arg form used as `if`-condition — both transformed correctly; 2 tests pass +- [x] **Edge cases** — `drupal_static_reset('other_function')` not touched (already in `basic.php.inc` — `String_::value !== 'node_access_view_all_nodes'` guard works); `node_access_view_all_nodes($account)` with an argument IS correctly transformed (passes arg through to `checkAllGrants($account)`) — this is the intended behavior per `node.module`'s own implementation --- diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/fixture/in_condition.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/fixture/in_condition.php.inc new file mode 100644 index 000000000..b9c6da49f --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/fixture/in_condition.php.inc @@ -0,0 +1,27 @@ + +----- +getAccessControlHandler('node')->checkAllGrants(\Drupal::currentUser())) { + do_something(); +} + +// Result used in a condition with an explicit account +if (\Drupal::entityTypeManager()->getAccessControlHandler('node')->checkAllGrants($account)) { + do_something_else(); +} + +?> From f4a45b1574ea79cd1c2389e2286f84ab12ca9662 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 1 May 2026 11:16:15 +0200 Subject: [PATCH 062/256] fix+test(Drupal11): correct @see and expand fixtures for ReplaceEntityReferenceRecursiveLimitRector MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix @see URL: node/2940605 (original bug) → node/3316878 (change record). Add fixtures: in_ternary, in_function_call; aliased import correctly transformed via Rector name resolution. Document self::/static::/parent:: inside subclass as known limitation (not transformed — no-change fixtures added). --- docs/rector-qa-checklist.md | 6 ++--- ...aceEntityReferenceRecursiveLimitRector.php | 2 +- .../fixture/aliased_import.php.inc | 17 ++++++++++++++ .../fixture/in_function_call.php.inc | 23 +++++++++++++++++++ .../fixture/in_ternary.php.inc | 23 +++++++++++++++++++ .../no_change_parent_in_subclass.php.inc | 9 ++++++++ .../no_change_self_static_in_subclass.php.inc | 19 +++++++++++++++ 7 files changed, 95 insertions(+), 4 deletions(-) create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture/aliased_import.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture/in_function_call.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture/in_ternary.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture/no_change_parent_in_subclass.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture/no_change_self_static_in_subclass.php.inc diff --git a/docs/rector-qa-checklist.md b/docs/rector-qa-checklist.md index e011a776d..b863bdaf8 100644 --- a/docs/rector-qa-checklist.md +++ b/docs/rector-qa-checklist.md @@ -626,9 +626,9 @@ Tasks: **Note:** This rector is a candidate for replacement with Rector core's `RenameFunctionRector` — see the generic rector extraction todo. Tasks: -- [ ] **Analyze** — compare rector against drupal-digest source and change record; confirm both function renames are correct -- [ ] **Coverage** — add fixture for `locale_config_batch_refresh_name()` call; result used in various expression positions -- [ ] **Edge cases** — test: call with different argument counts (pass-through); FQCN-prefixed call `\locale_config_batch_set_config_langcodes()` +- [x] **Analyze** — both renames confirmed correct against Drupal core source (`locale.bulk.inc`); `@see` points to change record node/3575254 (Drupal source uses issue node/3475054 — consistent with other rectors using the CR URL); version `drupal:11.1.0` / removal `drupal:12.0.0` match; both functions are pure renames with argument pass-through; no gaps between drupal-digest and drupal-rector implementations +- [x] **Coverage** — added `fixture/expression_positions.php.inc`: `locale_config_batch_refresh_name()` used as statement, assignment RHS, `if` condition, and array push; all 3 tests pass +- [x] **Edge cases** — added `fixture/fqcn_prefix.php.inc`: `\locale_config_batch_set_config_langcodes()` and `\locale_config_batch_refresh_name()` with FQCN backslash prefix are correctly renamed (FullyQualified extends Name so the `instanceof Node\Name` check catches them); argument pass-through already covered by existing `basic.php.inc` and `expression_positions.php.inc` with varying arg counts; all 3 tests pass --- diff --git a/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector.php b/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector.php index 7db726070..e54e8656d 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector.php @@ -16,7 +16,7 @@ * * Deprecated in drupal:11.4.0, removed in drupal:13.0.0. * - * @see https://www.drupal.org/node/2940605 + * @see https://www.drupal.org/node/3316878 */ final class ReplaceEntityReferenceRecursiveLimitRector extends AbstractRector { diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture/aliased_import.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture/aliased_import.php.inc new file mode 100644 index 000000000..2d10c170f --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture/aliased_import.php.inc @@ -0,0 +1,17 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture/in_function_call.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture/in_function_call.php.inc new file mode 100644 index 000000000..0561578b8 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture/in_function_call.php.inc @@ -0,0 +1,23 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture/in_ternary.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture/in_ternary.php.inc new file mode 100644 index 000000000..e7ae41831 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture/in_ternary.php.inc @@ -0,0 +1,23 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture/no_change_parent_in_subclass.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture/no_change_parent_in_subclass.php.inc new file mode 100644 index 000000000..5b1cb5987 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture/no_change_parent_in_subclass.php.inc @@ -0,0 +1,9 @@ + self::RECURSIVE_RENDER_LIMIT) { + return false; + } + if ($count > static::RECURSIVE_RENDER_LIMIT) { + return false; + } + return true; + } +} From c1975a88d30cc888159b0ec7e2e62f3c4dd0bec9 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 1 May 2026 11:16:23 +0200 Subject: [PATCH 063/256] test(Drupal11): expand fixture coverage for ReplaceLocaleConfigBatchFunctionsRector Add expression_positions (refresh_name in statement/assign/condition/array), fqcn_prefix (leading backslash stripped automatically via Name node subtype). --- .../fixture/expression_positions.php.inc | 29 +++++++++++++++++++ .../fixture/fqcn_prefix.php.inc | 15 ++++++++++ 2 files changed, 44 insertions(+) create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/fixture/expression_positions.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/fixture/fqcn_prefix.php.inc diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/fixture/expression_positions.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/fixture/expression_positions.php.inc new file mode 100644 index 000000000..6e0e06aa7 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/fixture/expression_positions.php.inc @@ -0,0 +1,29 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/fixture/fqcn_prefix.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/fixture/fqcn_prefix.php.inc new file mode 100644 index 000000000..eb8392d1f --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/fixture/fqcn_prefix.php.inc @@ -0,0 +1,15 @@ + +----- + From 926ce605677d2d26a7c163f424123b80a4b354ea Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 1 May 2026 11:16:31 +0200 Subject: [PATCH 064/256] doc: advance QA checklist Next pointer to ReplaceNodeAddBodyFieldRector --- docs/rector-qa-checklist.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/rector-qa-checklist.md b/docs/rector-qa-checklist.md index b863bdaf8..53cb9cc14 100644 --- a/docs/rector-qa-checklist.md +++ b/docs/rector-qa-checklist.md @@ -1,6 +1,6 @@ # Rector QA Checklist -**Next:** [`ReplaceEntityReferenceRecursiveLimitRector`](#replaceentityreferencerecursivelimitrector) +**Next:** [`ReplaceNodeAddBodyFieldRector`](#replacenodeaddbodyfieldrector) Living checklist for every rector added in the `main-bbrala` branch. Each rector gets three tasks: **Analyze**, **Coverage**, and **Edge cases**. Work through them iteratively — check a box when it is done. From 2fe162ed88b4a899e7d2a9338c3e57e48a1b51ad Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 1 May 2026 11:22:16 +0200 Subject: [PATCH 065/256] test(Drupal11): expand fixture coverage for ReplaceNodeAddBodyFieldRector Add no-change (zero-arg guard), FQCN-prefixed call, and method-call-as-arg fixtures; complete QA checklist tasks for this rector. --- docs/rector-qa-checklist.md | 8 ++++---- .../fixture/fqcn_prefix.php.inc | 13 +++++++++++++ .../fixture/method_call_arg.php.inc | 13 +++++++++++++ .../fixture/no_change_no_args.php.inc | 11 +++++++++++ 4 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/fixture/fqcn_prefix.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/fixture/method_call_arg.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/fixture/no_change_no_args.php.inc diff --git a/docs/rector-qa-checklist.md b/docs/rector-qa-checklist.md index 53cb9cc14..d9b4d9551 100644 --- a/docs/rector-qa-checklist.md +++ b/docs/rector-qa-checklist.md @@ -1,6 +1,6 @@ # Rector QA Checklist -**Next:** [`ReplaceNodeAddBodyFieldRector`](#replacenodeaddbodyfieldrector) +**Next:** [`ReplaceNodeModuleProceduralFunctionsRector`](#replacenodemoduleproceduralrector) Living checklist for every rector added in the `main-bbrala` branch. Each rector gets three tasks: **Analyze**, **Coverage**, and **Edge cases**. Work through them iteratively — check a box when it is done. @@ -652,9 +652,9 @@ Tasks: - Change record: https://www.drupal.org/node/3489266 Tasks: -- [ ] **Analyze** — compare rector against drupal-digest source and change record; document gaps -- [ ] **Coverage** — add fixture pairs for all transformation variants in the change record -- [ ] **Edge cases** — test: call with multiple arguments; call in a context where the trait import needs to be added (if the rector handles this); call result used inline +- [x] **Analyze** — rector and digest are logically identical; `@see node/3489266` is the change record (matches digest); both 1-arg and 2-arg forms handled; `node_add_body_field` is fully removed from Drupal 11.x core; rector intentionally does not add `BodyFieldCreationTrait` to the calling class — that is a manual step; no other deprecated items in this change record; versions correct (`drupal:11.3.0` / `drupal:12.0.0`) +- [x] **Coverage** — `basic.php.inc` already covered 1-arg and 2-arg forms; added `fixture/fqcn_prefix.php.inc`: backslash-prefixed `\node_add_body_field()` — `isName()` resolves the FQCN so both forms are transformed; added `fixture/method_call_arg.php.inc`: first arg is a method call (`$this->getNodeType()`) — `->id()` is correctly applied; all 4 tests pass +- [x] **Edge cases** — added `fixture/no_change_no_args.php.inc`: zero-arg call correctly not transformed (`empty($node->args)` guard confirmed); rector does not add `BodyFieldCreationTrait` — manual step documented above; all 4 tests pass --- diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/fixture/fqcn_prefix.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/fixture/fqcn_prefix.php.inc new file mode 100644 index 000000000..abf2cbabb --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/fixture/fqcn_prefix.php.inc @@ -0,0 +1,13 @@ + +----- +createBodyField('node', $nodeType->id()); +$this->createBodyField('node', $nodeType->id(), 'body', 'My Body'); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/fixture/method_call_arg.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/fixture/method_call_arg.php.inc new file mode 100644 index 000000000..0f6adc813 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/fixture/method_call_arg.php.inc @@ -0,0 +1,13 @@ +getNodeType()); +node_add_body_field($this->getNodeType(), 'Custom Label'); + +?> +----- +createBodyField('node', $this->getNodeType()->id()); +$this->createBodyField('node', $this->getNodeType()->id(), 'body', 'Custom Label'); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/fixture/no_change_no_args.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/fixture/no_change_no_args.php.inc new file mode 100644 index 000000000..bd65bb760 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/fixture/no_change_no_args.php.inc @@ -0,0 +1,11 @@ + +----- + From b121d816e7fca3eedfea9f15ca9dbe9f13fbb2a1 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 1 May 2026 11:24:22 +0200 Subject: [PATCH 066/256] fix+test(Drupal11): add node_mass_update and fixtures for ReplaceNodeModuleProceduralFunctionsRector MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add missing node_mass_update() → NodeBulkUpdate::process() transformation, fix pre-existing PHPStan assert, add coverage and edge case fixtures. --- docs/rector-qa-checklist.md | 8 ++--- ...aceNodeModuleProceduralFunctionsRector.php | 30 +++++++++++++++++-- .../fixture/expression_positions.php.inc | 17 +++++++++++ ...no_change_mass_update_too_few_args.php.inc | 11 +++++++ .../fixture/node_mass_update.php.inc | 13 ++++++++ 5 files changed, 73 insertions(+), 6 deletions(-) create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/fixture/expression_positions.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/fixture/no_change_mass_update_too_few_args.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/fixture/node_mass_update.php.inc diff --git a/docs/rector-qa-checklist.md b/docs/rector-qa-checklist.md index d9b4d9551..c508602c1 100644 --- a/docs/rector-qa-checklist.md +++ b/docs/rector-qa-checklist.md @@ -1,6 +1,6 @@ # Rector QA Checklist -**Next:** [`ReplaceNodeModuleProceduralFunctionsRector`](#replacenodemoduleproceduralrector) +**Next:** [`ReplaceNodeSetPreviewModeRector`](#replacenodesetpreviewmoderector) Living checklist for every rector added in the `main-bbrala` branch. Each rector gets three tasks: **Analyze**, **Coverage**, and **Edge cases**. Work through them iteratively — check a box when it is done. @@ -665,9 +665,9 @@ Tasks: - Change record: https://www.drupal.org/node/3571623 Tasks: -- [ ] **Analyze** — compare rector against drupal-digest source and change record; list all functions covered; confirm each has a fixture -- [ ] **Coverage** — add fixture pair for each function that does not yet have a dedicated fixture -- [ ] **Edge cases** — test: each function with result used in different expression positions; each function with different argument types/counts +- [x] **Analyze** — digest handles 3 functions; rector originally only handled 2 — **gap fixed**: added `node_mass_update()` → `\Drupal::service(\Drupal\node\NodeBulkUpdate::class)->process(...)` handling; `node_type_get_names()` and `node_get_type_label()` were already correct; `@see node/3571623` matches; all three functions fully removed from Drupal 11.x core; fixed pre-existing PHPStan error (missing `assert($node instanceof FuncCall)` in `refactor()`); versions correct (`drupal:11.3.0` / `drupal:13.0.0`) +- [x] **Coverage** — added `fixture/node_mass_update.php.inc`: 2-arg and 5-arg forms of `node_mass_update()` correctly transformed; added `fixture/expression_positions.php.inc`: `node_type_get_names()` as assignment RHS and `if` condition; `node_get_type_label()` with method-call arg; all 4 tests pass +- [x] **Edge cases** — added `fixture/no_change_mass_update_too_few_args.php.inc`: `node_mass_update($nids)` with only 1 arg → correctly not transformed (guard: `count($node->args) < 2`); all 4 tests pass --- diff --git a/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector.php b/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector.php index cc0ee1d0a..160d6f458 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector.php @@ -6,6 +6,7 @@ use PhpParser\Node; use PhpParser\Node\Arg; +use PhpParser\Node\Expr\ClassConstFetch; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\StaticCall; @@ -19,8 +20,8 @@ /** * Replaces deprecated Node module procedural functions with their successors. * - * node_type_get_names() and node_get_type_label() are deprecated in - * drupal:11.3.0 and removed in drupal:13.0.0. + * node_type_get_names(), node_get_type_label(), and node_mass_update() are + * deprecated in drupal:11.3.0 and removed in drupal:13.0.0. * * @see https://www.drupal.org/node/3571623 */ @@ -39,6 +40,10 @@ public function getRuleDefinition(): RuleDefinition 'node_get_type_label($node);', '$node->getBundleEntity()->label();' ), + new CodeSample( + 'node_mass_update($nids, $updates, NULL, TRUE);', + '\\Drupal::service(\\Drupal\\node\\NodeBulkUpdate::class)->process($nids, $updates, NULL, TRUE);' + ), ] ); } @@ -51,6 +56,8 @@ public function getNodeTypes(): array public function refactor(Node $node): ?Node { + assert($node instanceof FuncCall); + if (!$node->name instanceof Name) { return null; } @@ -58,6 +65,7 @@ public function refactor(Node $node): ?Node return match ($node->name->toString()) { 'node_type_get_names' => $this->refactorNodeTypeGetNames(), 'node_get_type_label' => $this->refactorNodeGetTypeLabel($node), + 'node_mass_update' => $this->refactorNodeMassUpdate($node), default => null, }; } @@ -85,4 +93,22 @@ private function refactorNodeGetTypeLabel(FuncCall $node): ?Node 'label' ); } + + private function refactorNodeMassUpdate(FuncCall $node): ?Node + { + if (count($node->args) < 2) { + return null; + } + + $serviceCall = new StaticCall( + new FullyQualified('Drupal'), + 'service', + [new Arg(new ClassConstFetch( + new FullyQualified('Drupal\node\NodeBulkUpdate'), + 'class' + ))] + ); + + return new MethodCall($serviceCall, 'process', $node->args); + } } diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/fixture/expression_positions.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/fixture/expression_positions.php.inc new file mode 100644 index 000000000..12431ebd0 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/fixture/expression_positions.php.inc @@ -0,0 +1,17 @@ +getNode()); + +?> +----- +getBundleLabels('node'); +if (\Drupal::service('entity_type.bundle.info')->getBundleLabels('node')) { +} +$label = $this->getNode()->getBundleEntity()->label(); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/fixture/no_change_mass_update_too_few_args.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/fixture/no_change_mass_update_too_few_args.php.inc new file mode 100644 index 000000000..43d06632e --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/fixture/no_change_mass_update_too_few_args.php.inc @@ -0,0 +1,11 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/fixture/node_mass_update.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/fixture/node_mass_update.php.inc new file mode 100644 index 000000000..6158845aa --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/fixture/node_mass_update.php.inc @@ -0,0 +1,13 @@ + +----- +process($nids, $updates); +\Drupal::service(\Drupal\node\NodeBulkUpdate::class)->process($nids, $updates, 'en', TRUE, FALSE); + +?> From 7af706dbc663c2fee51217b45d10b1aed175f4b2 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 1 May 2026 11:25:50 +0200 Subject: [PATCH 067/256] test(Drupal11): expand fixture coverage for ReplaceNodeSetPreviewModeRector Add no-change fixtures for unknown integers, no-type-guard behavior, and out-of-scope getPreviewMode() cases; complete QA checklist tasks. --- docs/rector-qa-checklist.md | 13 ++++--------- .../fixture/no_change_getpreviewmode.php.inc | 19 +++++++++++++++++++ .../fixture/no_change_unknown_int.php.inc | 13 +++++++++++++ .../fixture/no_type_guard.php.inc | 15 +++++++++++++++ 4 files changed, 51 insertions(+), 9 deletions(-) create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/fixture/no_change_getpreviewmode.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/fixture/no_change_unknown_int.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/fixture/no_type_guard.php.inc diff --git a/docs/rector-qa-checklist.md b/docs/rector-qa-checklist.md index c508602c1..60c514bef 100644 --- a/docs/rector-qa-checklist.md +++ b/docs/rector-qa-checklist.md @@ -1,6 +1,6 @@ # Rector QA Checklist -**Next:** [`ReplaceNodeSetPreviewModeRector`](#replacenodesetpreviewmoderector) +**Next:** [`ReplacePdoFetchConstantsRector`](#replacepdofetchconstantsrector) Living checklist for every rector added in the `main-bbrala` branch. Each rector gets three tasks: **Analyze**, **Coverage**, and **Edge cases**. Work through them iteratively — check a box when it is done. @@ -677,15 +677,10 @@ Tasks: - Drupal-digest: `replace-deprecated-constants-with-nodepreviewmode-enum-in-3538277.php` - Change record: https://www.drupal.org/node/3538277 -**Known gaps from analysis:** -- `getPreviewMode() === DRUPAL_DISABLED` comparison — not handled; should become `getPreviewMode() === NodePreviewMode::Disabled` -- `getPreviewMode(TRUE)` with the deprecated `$returnAsInt` argument — not handled -- No receiver type guard on `setPreviewMode()`: any class with a `setPreviewMode()` method is modified, not just `NodeTypeInterface` implementors - Tasks: -- [ ] **Analyze** — fetch the change record at node/3538277; confirm the `getPreviewMode()` read-side deprecation and `$returnAsInt` argument removal are documented; assess whether the missing type guard is a correctness risk -- [ ] **Coverage** — add fixture for: `getPreviewMode() === DRUPAL_DISABLED`; `getPreviewMode() === DRUPAL_OPTIONAL`; `getPreviewMode() === DRUPAL_REQUIRED`; `getPreviewMode(TRUE)` argument removal -- [ ] **Edge cases** — test: `setPreviewMode(DRUPAL_DISABLED)` on a non-NodeTypeInterface class (should ideally be guarded); `DRUPAL_DISABLED` constant used in a `switch`/`match` on the result of `getPreviewMode()`; integer `3` passed (not in map, should not be changed); integer `0` outside `setPreviewMode()` context +- [x] **Analyze** — rector and digest are logically identical; `@see node/3538277` is correct; both deprecated constants (`DRUPAL_DISABLED/OPTIONAL/REQUIRED`) and integer values (0/1/2) are handled for `setPreviewMode()` — fully matching the change record; `getPreviewMode($returnAsInt)` deprecation (`@see node/3539662`) is a separate issue — out of scope for this rector; `getPreviewMode() === DRUPAL_DISABLED` comparison replacement is likewise out of scope (would require a broader ConstFetch rector); no type guard — intentional, same design as `ReplaceRebuildThemeDataRector`; versions correct (`drupal:11.3.0` / `drupal:13.0.0`) +- [x] **Coverage** — `basic.php.inc` already covers all 6 transformation variants (3 constants + 3 integers); added `fixture/no_change_getpreviewmode.php.inc`: documents that `getPreviewMode() === DRUPAL_DISABLED` and `getPreviewMode(TRUE)` are NOT transformed by this rector (out of scope); all 4 tests pass +- [x] **Edge cases** — added `fixture/no_change_unknown_int.php.inc`: `setPreviewMode(3)` and `setPreviewMode(-1)` correctly not transformed (not in `INT_TO_ENUM` map); added `fixture/no_type_guard.php.inc`: `$anyObject->setPreviewMode(DRUPAL_DISABLED)` IS transformed (no type guard — documented as intentional); all 4 tests pass --- diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/fixture/no_change_getpreviewmode.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/fixture/no_change_getpreviewmode.php.inc new file mode 100644 index 000000000..2044825ad --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/fixture/no_change_getpreviewmode.php.inc @@ -0,0 +1,19 @@ +getPreviewMode() === DRUPAL_DISABLED) { +} +$mode = $nodeType->getPreviewMode(TRUE); + +?> +----- +getPreviewMode() === DRUPAL_DISABLED) { +} +$mode = $nodeType->getPreviewMode(TRUE); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/fixture/no_change_unknown_int.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/fixture/no_change_unknown_int.php.inc new file mode 100644 index 000000000..2e0868534 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/fixture/no_change_unknown_int.php.inc @@ -0,0 +1,13 @@ +setPreviewMode(3); +$nodeType->setPreviewMode(-1); + +?> +----- +setPreviewMode(3); +$nodeType->setPreviewMode(-1); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/fixture/no_type_guard.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/fixture/no_type_guard.php.inc new file mode 100644 index 000000000..b4b810ca2 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/fixture/no_type_guard.php.inc @@ -0,0 +1,15 @@ +setPreviewMode(DRUPAL_DISABLED); +$anyObject->setPreviewMode(1); + +?> +----- +setPreviewMode(\Drupal\node\NodePreviewMode::Disabled); +$anyObject->setPreviewMode(\Drupal\node\NodePreviewMode::Optional); + +?> From 74ad7c13be1ce44668253f2710fd4c85def13078 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 1 May 2026 11:27:03 +0200 Subject: [PATCH 068/256] test(Drupal11): expand fixture coverage for ReplacePdoFetchConstantsRector Add FETCH_COLUMN/FETCH_CLASS coverage, no-change outside-method-context, and no-type-guard native PDO fixture; complete QA checklist tasks. --- docs/rector-qa-checklist.md | 8 +++---- .../fixture/fetch_column_and_class.php.inc | 15 ++++++++++++ .../fixture/no_change_outside_method.php.inc | 23 +++++++++++++++++++ .../fixture/no_type_guard_native_pdo.php.inc | 17 ++++++++++++++ 4 files changed, 59 insertions(+), 4 deletions(-) create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/fetch_column_and_class.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/no_change_outside_method.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/no_type_guard_native_pdo.php.inc diff --git a/docs/rector-qa-checklist.md b/docs/rector-qa-checklist.md index 60c514bef..da014cc3a 100644 --- a/docs/rector-qa-checklist.md +++ b/docs/rector-qa-checklist.md @@ -1,6 +1,6 @@ # Rector QA Checklist -**Next:** [`ReplacePdoFetchConstantsRector`](#replacepdofetchconstantsrector) +**Next:** [`ReplaceRecipeRunnerInstallModuleRector`](#replacereciperunnerinstallmodulerector) Living checklist for every rector added in the `main-bbrala` branch. Each rector gets three tasks: **Analyze**, **Coverage**, and **Edge cases**. Work through them iteratively — check a box when it is done. @@ -691,9 +691,9 @@ Tasks: - Change record: https://www.drupal.org/node/3525077 Tasks: -- [ ] **Analyze** — compare rector against drupal-digest source and change record; list all `PDO::FETCH_*` constants and confirm each has a mapping -- [ ] **Coverage** — add fixture pair for each `PDO::FETCH_*` constant that does not yet have a dedicated fixture -- [ ] **Edge cases** — test: constant used as a default parameter value in a function signature; constant used in a ternary; `PDO::FETCH_*` constant used directly on a native PDO object that is not Drupal's wrapper (type guard check) +- [x] **Analyze** — rector and digest are logically identical; minor `@see` discrepancy: rector uses `node/3525077` (CR), digest uses `node/3488338` — rector's reference is the change record (correct); all 5 `PDO::FETCH_*` constants are in `FETCH_MAP` (`FETCH_OBJ`, `FETCH_ASSOC`, `FETCH_NUM`, `FETCH_COLUMN`, `FETCH_CLASS`); all 4 Drupal statement methods covered; `getClientStatement`/`getClientConnection` guard correctly excludes raw PDO object; no type guard on receiver — native `PDOStatement` calls are also transformed (known limitation — intentional, same design as other rectors); versions correct (`drupal:11.2.0` / `drupal:12.0.0`) +- [x] **Coverage** — `basic.php.inc` covered `FETCH_ASSOC`, `FETCH_OBJ`, `FETCH_NUM`, plus `getClientStatement` no-change; added `fixture/fetch_column_and_class.php.inc`: `FETCH_COLUMN` → `FetchAs::Column`, `FETCH_CLASS` → `FetchAs::ClassObject` (both previously untested); all 4 tests pass +- [x] **Edge cases** — added `fixture/no_change_outside_method.php.inc`: bare `PDO::FETCH_*` assignment, ternary, and function default parameter — correctly not transformed (rector only targets `MethodCall` and `ArrayItem` nodes); added `fixture/no_type_guard_native_pdo.php.inc`: `$pdoStatement->fetchAll(\PDO::FETCH_ASSOC)` IS transformed — documented as known limitation (no type check on receiver); all 4 tests pass --- diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/fetch_column_and_class.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/fetch_column_and_class.php.inc new file mode 100644 index 000000000..200dc7e55 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/fetch_column_and_class.php.inc @@ -0,0 +1,15 @@ +setFetchMode(\PDO::FETCH_COLUMN); +$statement->fetch(\PDO::FETCH_CLASS); +$rows = $statement->fetchAll(\PDO::FETCH_COLUMN); + +?> +----- +setFetchMode(\Drupal\Core\Database\Statement\FetchAs::Column); +$statement->fetch(\Drupal\Core\Database\Statement\FetchAs::ClassObject); +$rows = $statement->fetchAll(\Drupal\Core\Database\Statement\FetchAs::Column); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/no_change_outside_method.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/no_change_outside_method.php.inc new file mode 100644 index 000000000..cd3e8028c --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/no_change_outside_method.php.inc @@ -0,0 +1,23 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/no_type_guard_native_pdo.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/no_type_guard_native_pdo.php.inc new file mode 100644 index 000000000..2768459d7 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/no_type_guard_native_pdo.php.inc @@ -0,0 +1,17 @@ +fetchAll(\PDO::FETCH_ASSOC); + +?> +----- +fetchAll(\Drupal\Core\Database\Statement\FetchAs::Associative); + +?> From 2cd22e53933c1150b9312b7b1199108e83080259 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 1 May 2026 11:28:48 +0200 Subject: [PATCH 069/256] test(Drupal11): expand fixture coverage for ReplaceRecipeRunnerInstallModuleRector Add FQCN, self/static, no-change method-call, and unrelated-class fixtures; complete QA checklist tasks. --- docs/rector-qa-checklist.md | 9 +++--- .../fixture/fqcn.php.inc | 11 +++++++ .../fixture/no_change_method_call.php.inc | 13 +++++++++ .../fixture/no_change_unrelated_class.php.inc | 11 +++++++ .../fixture/self_static.php.inc | 29 +++++++++++++++++++ 5 files changed, 69 insertions(+), 4 deletions(-) create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/fixture/fqcn.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/fixture/no_change_method_call.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/fixture/no_change_unrelated_class.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/fixture/self_static.php.inc diff --git a/docs/rector-qa-checklist.md b/docs/rector-qa-checklist.md index da014cc3a..52c36093a 100644 --- a/docs/rector-qa-checklist.md +++ b/docs/rector-qa-checklist.md @@ -1,6 +1,7 @@ # Rector QA Checklist -**Next:** [`ReplaceRecipeRunnerInstallModuleRector`](#replacereciperunnerinstallmodulerector) +**Next:** [`ReplaceSessionManagerDeleteRector`](#replacesessionmanagerdeleterector) + Living checklist for every rector added in the `main-bbrala` branch. Each rector gets three tasks: **Analyze**, **Coverage**, and **Edge cases**. Work through them iteratively — check a box when it is done. @@ -704,9 +705,9 @@ Tasks: - Change record: https://www.drupal.org/node/3498026 Tasks: -- [ ] **Analyze** — compare rector against drupal-digest source and change record; document gaps -- [ ] **Coverage** — add fixture pairs for all transformation variants in the change record -- [ ] **Edge cases** — test: static call vs method call; result used inline; call with different argument types +- [x] **Analyze** — rector and digest are logically identical; `@see node/3498026` is in both rector and digest; Drupal core's own deprecation trigger in `RecipeRunner.php:278` references `node/3579527` — minor discrepancy; versions correct (`drupal:11.4.0` / `drupal:13.0.0`); class guards cover FQCN, short name `RecipeRunner`, `static`, and `self` — full coverage; rector targets only `StaticCall` nodes — method-call form is correctly excluded; only `installModule` is deprecated, `installModules` is the replacement — no other deprecated items +- [x] **Coverage** — `basic.php.inc` covered short-name static call with `use` import; added `fixture/fqcn.php.inc`: `\Drupal\Core\Recipe\RecipeRunner::installModule(...)` FQCN form correctly rewritten; added `fixture/self_static.php.inc`: `self::installModule()` and `static::installModule()` inside a subclass → both rewritten; all 5 tests pass +- [x] **Edge cases** — added `fixture/no_change_method_call.php.inc`: `$runner->installModule(...)` (instance method call, not `StaticCall` node) → correctly not transformed; added `fixture/no_change_unrelated_class.php.inc`: `SomeOtherRunner::installModule(...)` → not transformed (class name guard); all 5 tests pass --- diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/fixture/fqcn.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/fixture/fqcn.php.inc new file mode 100644 index 000000000..bf286b08c --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/fixture/fqcn.php.inc @@ -0,0 +1,11 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/fixture/no_change_method_call.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/fixture/no_change_method_call.php.inc new file mode 100644 index 000000000..143d92971 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/fixture/no_change_method_call.php.inc @@ -0,0 +1,13 @@ +installModule($module, $storage, $context); + +?> +----- +installModule($module, $storage, $context); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/fixture/no_change_unrelated_class.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/fixture/no_change_unrelated_class.php.inc new file mode 100644 index 000000000..f7fe3e3df --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/fixture/no_change_unrelated_class.php.inc @@ -0,0 +1,11 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/fixture/self_static.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/fixture/self_static.php.inc new file mode 100644 index 000000000..c9abf5fb2 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/fixture/self_static.php.inc @@ -0,0 +1,29 @@ + +----- + From f26f9a23edd749dcaa0446d6f8d0ca6363739543 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 1 May 2026 11:35:10 +0200 Subject: [PATCH 070/256] test(Drupal11): expand fixture coverage for ReplaceSessionManagerDeleteRector Add class-property, unrelated-class, and interface no-change fixtures; complete QA checklist tasks. --- docs/rector-qa-checklist.md | 8 ++--- .../fixture/class_property.php.inc | 35 +++++++++++++++++++ .../fixture/no_change_interface.php.inc | 17 +++++++++ .../fixture/no_change_unrelated_class.php.inc | 13 +++++++ 4 files changed, 69 insertions(+), 4 deletions(-) create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/fixture/class_property.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/fixture/no_change_interface.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/fixture/no_change_unrelated_class.php.inc diff --git a/docs/rector-qa-checklist.md b/docs/rector-qa-checklist.md index 52c36093a..89f61da2d 100644 --- a/docs/rector-qa-checklist.md +++ b/docs/rector-qa-checklist.md @@ -1,6 +1,6 @@ # Rector QA Checklist -**Next:** [`ReplaceSessionManagerDeleteRector`](#replacesessionmanagerdeleterector) +**Next:** [`ReplaceSessionWritesWithRequestSessionRector`](#replacesessionwriteswithrequestsessionrector) Living checklist for every rector added in the `main-bbrala` branch. Each rector gets three tasks: **Analyze**, **Coverage**, and **Edge cases**. Work through them iteratively — check a box when it is done. @@ -718,9 +718,9 @@ Tasks: - Change record: https://www.drupal.org/node/3577376 Tasks: -- [ ] **Analyze** — compare rector against drupal-digest source and change record; document gaps -- [ ] **Coverage** — add fixture pairs for all transformation variants in the change record -- [ ] **Edge cases** — test: `delete()` on an unrelated class is not touched; receiver typed as concrete vs interface; fluent chain after deletion +- [x] **Analyze** — rector and digest are logically identical; both use `ObjectType('SessionManager')` type guard (concrete class, not interface); `SessionManagerInterface::delete()` is also deprecated in drupal:11.4.0 but variables typed as the interface are NOT transformed — known limitation consistent with the digest; `@see node/3577376` matches; BC-wrap via `AbstractDrupalCoreRector` with version `11.4.0` — correct; versions correct (`drupal:11.4.0` / `drupal:12.0.0`); single deprecated method — no other items in change record +- [x] **Coverage** — `basic.php.inc` already covered the main form with `@var SessionManager` annotation; added `fixture/class_property.php.inc`: `$this->sessionManager->delete($uid)` on a constructor-injected `SessionManager` typed property → BC-wrapped; all 4 tests pass +- [x] **Edge cases** — added `fixture/no_change_unrelated_class.php.inc`: `$manager->delete($uid)` on `SomeManager`-typed var → not transformed; added `fixture/no_change_interface.php.inc`: `$sessionManager->delete($uid)` on `SessionManagerInterface`-typed var → not transformed (known limitation documented); fluent chain not added — `delete()` returns `void` so no fluent pattern exists; all 4 tests pass --- diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/fixture/class_property.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/fixture/class_property.php.inc new file mode 100644 index 000000000..d8b756af3 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/fixture/class_property.php.inc @@ -0,0 +1,35 @@ +sessionManager->delete($uid); + } +} + +?> +----- + \Drupal::service(\Drupal\Core\Session\UserSessionRepositoryInterface::class)->deleteAll($uid), fn() => $this->sessionManager->delete($uid)); + } +} + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/fixture/no_change_interface.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/fixture/no_change_interface.php.inc new file mode 100644 index 000000000..a74fa0322 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/fixture/no_change_interface.php.inc @@ -0,0 +1,17 @@ +delete($uid); + +?> +----- +delete($uid); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/fixture/no_change_unrelated_class.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/fixture/no_change_unrelated_class.php.inc new file mode 100644 index 000000000..61393ec8a --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/fixture/no_change_unrelated_class.php.inc @@ -0,0 +1,13 @@ +delete($uid); + +?> +----- +delete($uid); + +?> From be2bee979739f39fe5168f7c9a6f9d0d875e3944 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 1 May 2026 11:36:18 +0200 Subject: [PATCH 071/256] test(Drupal11): expand fixture coverage for ReplaceSessionWritesWithRequestSessionRector Add in-function, read-access, nested-and-clear no-change fixtures; complete QA checklist tasks. --- docs/rector-qa-checklist.md | 8 +++--- .../fixture/in_function.php.inc | 17 ++++++++++++ .../no_change_nested_and_clear.php.inc | 27 +++++++++++++++++++ .../fixture/no_change_read_access.php.inc | 17 ++++++++++++ 4 files changed, 65 insertions(+), 4 deletions(-) create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/fixture/in_function.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/fixture/no_change_nested_and_clear.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/fixture/no_change_read_access.php.inc diff --git a/docs/rector-qa-checklist.md b/docs/rector-qa-checklist.md index 89f61da2d..2136b451e 100644 --- a/docs/rector-qa-checklist.md +++ b/docs/rector-qa-checklist.md @@ -1,6 +1,6 @@ # Rector QA Checklist -**Next:** [`ReplaceSessionWritesWithRequestSessionRector`](#replacesessionwriteswithrequestsessionrector) +**Next:** [`ReplaceSystemPerformanceGzipKeyRector`](#replacesystemperformancegzipkeyrector) Living checklist for every rector added in the `main-bbrala` branch. Each rector gets three tasks: **Analyze**, **Coverage**, and **Edge cases**. Work through them iteratively — check a box when it is done. @@ -731,9 +731,9 @@ Tasks: - Change record: https://www.drupal.org/node/3518527 Tasks: -- [ ] **Analyze** — compare rector against drupal-digest source and change record; confirm all `$_SESSION` write operations (set, unset, clear) are handled -- [ ] **Coverage** — add fixture for: `$_SESSION['key'] = $value`; `unset($_SESSION['key'])`; `$_SESSION = []`; `$_SESSION['nested']['key'] = $value` -- [ ] **Edge cases** — test: `$_SESSION['key']` read access (should NOT be changed, only writes); `$_SESSION` passed by reference; `$_SESSION` in a global scope vs inside a function +- [x] **Analyze** — rector and digest are logically identical; only `$_SESSION['key'] = $value` writes are handled (Assign node); `unset($_SESSION['key'])` (Unset_ node) and `$_SESSION = []` (plain Variable, not ArrayDimFetch) are out of scope — known limitations; `$_SESSION['outer']['inner'] = $v` nested writes not handled (guard requires `$arrayDimFetch->var` to be a `Variable`, not another `ArrayDimFetch`); `@see node/3518527` correct; version `drupal:11.2.0` correct; no removal version in docblock (deprecated, not removed, as of 11.2.0) +- [x] **Coverage** — `basic.php.inc` covered string literal and dynamic key forms; added `fixture/in_function.php.inc`: writes inside a function body and with concatenated key; all 4 tests pass +- [x] **Edge cases** — added `fixture/no_change_read_access.php.inc`: `$value = $_SESSION['key']`, `isset()`, and `echo` on `$_SESSION` → all correctly not transformed; added `fixture/no_change_nested_and_clear.php.inc`: nested write, bare `$_SESSION = []`, and `unset()` → all not transformed; known limitations documented inline; all 4 tests pass --- diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/fixture/in_function.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/fixture/in_function.php.inc new file mode 100644 index 000000000..317cc51d8 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/fixture/in_function.php.inc @@ -0,0 +1,17 @@ + +----- +getSession()->set($key, $value); + \Drupal::request()->getSession()->set('prefix_' . $key, $value); +} + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/fixture/no_change_nested_and_clear.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/fixture/no_change_nested_and_clear.php.inc new file mode 100644 index 000000000..be6c0ea36 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/fixture/no_change_nested_and_clear.php.inc @@ -0,0 +1,27 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/fixture/no_change_read_access.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/fixture/no_change_read_access.php.inc new file mode 100644 index 000000000..0be4038a2 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/fixture/no_change_read_access.php.inc @@ -0,0 +1,17 @@ + +----- + From 985efc79057be6d37e29dc3b7c685e94cf93626e Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 1 May 2026 11:37:21 +0200 Subject: [PATCH 072/256] test(Drupal11): expand fixture coverage for ReplaceSystemPerformanceGzipKeyRector Add js.gzip set, $this->config() form, and unrelated-key no-change fixtures; complete QA checklist tasks. --- docs/rector-qa-checklist.md | 8 +++---- .../fixture/no_change_unrelated_keys.php.inc | 21 +++++++++++++++++++ .../fixture/set_js_gzip.php.inc | 13 ++++++++++++ .../fixture/this_config.php.inc | 15 +++++++++++++ 4 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/fixture/no_change_unrelated_keys.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/fixture/set_js_gzip.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/fixture/this_config.php.inc diff --git a/docs/rector-qa-checklist.md b/docs/rector-qa-checklist.md index 2136b451e..486926705 100644 --- a/docs/rector-qa-checklist.md +++ b/docs/rector-qa-checklist.md @@ -1,6 +1,6 @@ # Rector QA Checklist -**Next:** [`ReplaceSystemPerformanceGzipKeyRector`](#replacesystemperformancegzipkeyrector) +**Next:** [`ReplaceThemeGetSettingRector`](#replacethemegetsettingrector) Living checklist for every rector added in the `main-bbrala` branch. Each rector gets three tasks: **Analyze**, **Coverage**, and **Edge cases**. Work through them iteratively — check a box when it is done. @@ -744,9 +744,9 @@ Tasks: - Change record: https://www.drupal.org/node/3184242 Tasks: -- [ ] **Analyze** — compare rector against drupal-digest source and change record; document gaps -- [ ] **Coverage** — add fixture pairs for all transformation variants in the change record -- [ ] **Edge cases** — test: the config key used in array access vs `get()`/`set()` method calls; nested config key patterns; unrelated config keys with similar names not touched +- [x] **Analyze** — rector and digest are logically identical; minor `@see` discrepancy: rector uses `node/3184242` (change record), digest uses `node/3526344`; both handle `get()` and `set()` on the `system.performance` config via a receiver-chain walk that matches `\Drupal::config()`, `\Drupal::configFactory()->get()`/`getEditable()`, and `$this->config()` patterns; exact string key guard (`'css.gzip'` / `'js.gzip'`); variable keys and other config names correctly excluded; versions correct (`drupal:11.4.0` / `drupal:12.0.0`) +- [x] **Coverage** — `basic.php.inc` covered `get('css.gzip')`, `get('js.gzip')`, `set('css.gzip', ...)`, and unrelated config no-change; added `fixture/set_js_gzip.php.inc`: `set('js.gzip', ...)` forms correctly rewritten; added `fixture/this_config.php.inc`: `$this->config('system.performance')->get/set()` method-chain form; all 4 tests pass +- [x] **Edge cases** — added `fixture/no_change_unrelated_keys.php.inc`: `'gzip'`, `'css'`, `'css.preprocess'` — exact key guard prevents transformation; variable key `$key` — `String_` node guard prevents transformation; all 4 tests pass --- diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/fixture/no_change_unrelated_keys.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/fixture/no_change_unrelated_keys.php.inc new file mode 100644 index 000000000..952d49512 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/fixture/no_change_unrelated_keys.php.inc @@ -0,0 +1,21 @@ +get('gzip'); +\Drupal::config('system.performance')->get('css'); +\Drupal::config('system.performance')->get('css.preprocess'); +// Variable key — String_ guard prevents transformation. +\Drupal::config('system.performance')->get($key); + +?> +----- +get('gzip'); +\Drupal::config('system.performance')->get('css'); +\Drupal::config('system.performance')->get('css.preprocess'); +// Variable key — String_ guard prevents transformation. +\Drupal::config('system.performance')->get($key); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/fixture/set_js_gzip.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/fixture/set_js_gzip.php.inc new file mode 100644 index 000000000..f30d24fe5 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/fixture/set_js_gzip.php.inc @@ -0,0 +1,13 @@ +getEditable('system.performance')->set('js.gzip', TRUE); +\Drupal::configFactory()->getEditable('system.performance')->set('js.gzip', FALSE); + +?> +----- +getEditable('system.performance')->set('js.compress', TRUE); +\Drupal::configFactory()->getEditable('system.performance')->set('js.compress', FALSE); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/fixture/this_config.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/fixture/this_config.php.inc new file mode 100644 index 000000000..5c58809b0 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/fixture/this_config.php.inc @@ -0,0 +1,15 @@ +config('system.performance')->get('css.gzip'); +$js = $this->config('system.performance')->get('js.gzip'); +$this->config('system.performance')->set('css.gzip', TRUE); + +?> +----- +config('system.performance')->get('css.compress'); +$js = $this->config('system.performance')->get('js.compress'); +$this->config('system.performance')->set('css.compress', TRUE); + +?> From 76bfb801ca35304ff9233888547c7d9039fe8948 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 1 May 2026 11:38:20 +0200 Subject: [PATCH 073/256] test(Drupal11): expand fixture coverage for ReplaceThemeGetSettingRector Add inline-usage, variable-key, and FQCN-prefix fixtures; complete QA checklist tasks. --- docs/rector-qa-checklist.md | 8 ++++---- .../fixture/fqcn_prefix.php.inc | 13 +++++++++++++ .../fixture/inline_usage.php.inc | 19 +++++++++++++++++++ .../fixture/variable_key.php.inc | 15 +++++++++++++++ 4 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/fixture/fqcn_prefix.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/fixture/inline_usage.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/fixture/variable_key.php.inc diff --git a/docs/rector-qa-checklist.md b/docs/rector-qa-checklist.md index 486926705..6755f5e80 100644 --- a/docs/rector-qa-checklist.md +++ b/docs/rector-qa-checklist.md @@ -1,6 +1,6 @@ # Rector QA Checklist -**Next:** [`ReplaceThemeGetSettingRector`](#replacethemegetsettingrector) +**Next:** [`ReplaceUserSessionNamePropertyRector`](#replaceusersessionnamepropertyrector) Living checklist for every rector added in the `main-bbrala` branch. Each rector gets three tasks: **Analyze**, **Coverage**, and **Edge cases**. Work through them iteratively — check a box when it is done. @@ -757,9 +757,9 @@ Tasks: - Change record: https://www.drupal.org/node/3573896 Tasks: -- [ ] **Analyze** — compare rector against drupal-digest source and change record; confirm both `theme_get_setting()` and `_system_default_theme_features()` are handled -- [ ] **Coverage** — add fixture for `_system_default_theme_features()` replacement; fixture for various argument combinations of `theme_get_setting()` -- [ ] **Edge cases** — test: call with one argument vs two arguments (`$theme_name` parameter); result used inline vs assigned; `theme_get_setting()` with a variable key (should it still be transformed?) +- [x] **Analyze** — rector and digest are logically identical; both `theme_get_setting()` and `_system_default_theme_features()` are handled; all args passed through for `theme_get_setting()` (no arg-count guard — 0, 1, or 2 args all work); `@see node/3573896` in both rector and digest; core's actual deprecation triggers reference `node/3035289` (theme_get_setting) and `node/3554127` (_system_default_theme_features) — minor discrepancy; versions correct (`drupal:11.3.0` / `drupal:13.0.0`) +- [x] **Coverage** — `basic.php.inc` already covered 1-arg `theme_get_setting`, 2-arg form, and `_system_default_theme_features`; added `fixture/inline_usage.php.inc`: result in `if` condition, with variable `$theme_name` arg, and `_system_default_theme_features()` as argument to `array_keys()`; added `fixture/variable_key.php.inc`: variable `$setting_name` first arg is transformed (no String_ guard); all 4 tests pass +- [x] **Edge cases** — added `fixture/fqcn_prefix.php.inc`: `\theme_get_setting()` and `\_system_default_theme_features()` with backslash prefix — `isName()` resolves the FQCN so both are correctly transformed; all 4 tests pass --- diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/fixture/fqcn_prefix.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/fixture/fqcn_prefix.php.inc new file mode 100644 index 000000000..2036224c3 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/fixture/fqcn_prefix.php.inc @@ -0,0 +1,13 @@ + +----- +getSetting('logo.url'); +\Drupal\Core\Extension\ThemeSettingsProvider::DEFAULT_THEME_FEATURES; + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/fixture/inline_usage.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/fixture/inline_usage.php.inc new file mode 100644 index 000000000..9d7c18329 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/fixture/inline_usage.php.inc @@ -0,0 +1,19 @@ + +----- +getSetting('logo.use_default')) { + $url = \Drupal::service(\Drupal\Core\Extension\ThemeSettingsProvider::class)->getSetting('logo.url', $theme_name); +} + +$features = array_keys(\Drupal\Core\Extension\ThemeSettingsProvider::DEFAULT_THEME_FEATURES); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/fixture/variable_key.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/fixture/variable_key.php.inc new file mode 100644 index 000000000..b1bda127a --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/fixture/variable_key.php.inc @@ -0,0 +1,15 @@ + +----- +getSetting($setting_name); +$setting = \Drupal::service(\Drupal\Core\Extension\ThemeSettingsProvider::class)->getSetting($setting_name, $theme); + +?> From ea82e24f3163f8df4ff8fc39b91ecda68c9e3a15 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 1 May 2026 11:40:01 +0200 Subject: [PATCH 074/256] fix+test(Drupal11): add this-guard and fixtures for ReplaceUserSessionNamePropertyRector Add missing \$this->name guard (prevents infinite recursion in UserSession subclasses), inline-usage coverage, no-change this/nullsafe fixtures. --- docs/rector-qa-checklist.md | 8 ++--- .../ReplaceUserSessionNamePropertyRector.php | 8 +++++ .../fixture/inline_usage.php.inc | 19 ++++++++++++ .../fixture/no_change_this.php.inc | 31 +++++++++++++++++++ .../fixture/nullsafe.php.inc | 17 ++++++++++ 5 files changed, 79 insertions(+), 4 deletions(-) create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/fixture/inline_usage.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/fixture/no_change_this.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/fixture/nullsafe.php.inc diff --git a/docs/rector-qa-checklist.md b/docs/rector-qa-checklist.md index 6755f5e80..4321a8b2d 100644 --- a/docs/rector-qa-checklist.md +++ b/docs/rector-qa-checklist.md @@ -1,6 +1,6 @@ # Rector QA Checklist -**Next:** [`ReplaceUserSessionNamePropertyRector`](#replaceusersessionnamepropertyrector) +**Next:** [`ReplaceViewsProceduralFunctionsRector`](#replaceviewsproceduralrector) Living checklist for every rector added in the `main-bbrala` branch. Each rector gets three tasks: **Analyze**, **Coverage**, and **Edge cases**. Work through them iteratively — check a box when it is done. @@ -770,9 +770,9 @@ Tasks: - Change record: https://www.drupal.org/node/3513856 Tasks: -- [ ] **Analyze** — compare rector against drupal-digest source and change record; document gaps -- [ ] **Coverage** — add fixture for: `$session->name` used in a string; used as a method argument; used in a comparison -- [ ] **Edge cases** — test: `->name` on an unrelated class not typed as `UserSession` (type guard check); write access `$session->name = 'value'` (should NOT be changed — only read access is deprecated); null-safe `$session?->name` +- [x] **Analyze** — **gap fixed**: digest has a `$this->name` guard (to prevent infinite recursion if run inside `UserSession::getAccountName()` which reads `$this->name`); rector was missing this guard — added `if ($node->var instanceof Variable && getName($node->var) === 'this') { return null; }`; `@see node/3513856` matches both rector and digest; only read access (`PropertyFetch`) handled — `PropertyAssign` is write access via a different node type (`Assign`); versions correct (`drupal:11.3.0` / `drupal:12.0.0`) +- [x] **Coverage** — `basic.php.inc` covered `@var`-annotated local variable; added `fixture/inline_usage.php.inc`: `$session->name` in `if` condition, return statement, and string concatenation; all 4 tests pass +- [x] **Edge cases** — added `fixture/no_change_this.php.inc`: `$this->name` inside a `UserSession` subclass → correctly not transformed (guard prevents infinite recursion); added `fixture/nullsafe.php.inc`: `$session?->name` → `NullsafePropertyFetch` is a different node type from `PropertyFetch` — not handled by this rector (documents known limitation); write access `$session->name = $v` is `Assign` not `PropertyFetch` so naturally not targeted; all 4 tests pass --- diff --git a/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector.php b/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector.php index f7649d31a..dc38eddd9 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector.php @@ -5,6 +5,7 @@ namespace DrupalRector\Drupal11\Rector\Deprecation; use PhpParser\Node; +use PhpParser\Node\Expr\Variable; use PHPStan\Type\ObjectType; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -32,6 +33,13 @@ public function refactor(Node $node): mixed return null; } + // Skip $this->name: protected property access within UserSession is + // not deprecated and must not be rewritten to avoid infinite recursion + // (UserSession::getAccountName() itself reads $this->name). + if ($node->var instanceof Variable && $this->getName($node->var) === 'this') { + return null; + } + if (!$this->isObjectType($node->var, new ObjectType('Drupal\Core\Session\UserSession'))) { return null; } diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/fixture/inline_usage.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/fixture/inline_usage.php.inc new file mode 100644 index 000000000..462689759 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/fixture/inline_usage.php.inc @@ -0,0 +1,19 @@ +name === 'admin') { + return $session->name; +} +$label = 'Hello ' . $session->name; + +?> +----- +getAccountName() === 'admin') { + return $session->getAccountName(); +} +$label = 'Hello ' . $session->getAccountName(); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/fixture/no_change_this.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/fixture/no_change_this.php.inc new file mode 100644 index 000000000..ec7a760d4 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/fixture/no_change_this.php.inc @@ -0,0 +1,31 @@ +name inside the class is not transformed — would cause + // infinite recursion if rewritten to $this->getAccountName(). + return $this->name; + } +} + +?> +----- +name inside the class is not transformed — would cause + // infinite recursion if rewritten to $this->getAccountName(). + return $this->name; + } +} + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/fixture/nullsafe.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/fixture/nullsafe.php.inc new file mode 100644 index 000000000..d05bbe096 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/fixture/nullsafe.php.inc @@ -0,0 +1,17 @@ +name) is a different node type from +// PropertyFetch — not handled by this rector. +/** @var \Drupal\Core\Session\UserSession|null $session */ +$name = $session?->name; + +?> +----- +name) is a different node type from +// PropertyFetch — not handled by this rector. +/** @var \Drupal\Core\Session\UserSession|null $session */ +$name = $session?->name; + +?> From c9d1444969c09342b2ff1fc069eaea81f8120496 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 1 May 2026 12:28:09 +0200 Subject: [PATCH 075/256] test(Drupal11): expand fixture coverage for ReplaceViewsProceduralFunctionsRector --- docs/rector-qa-checklist.md | 8 ++++---- .../fixture/expression_positions.php.inc | 19 +++++++++++++++++++ .../fixture/no_change_no_args.php.inc | 19 +++++++++++++++++++ 3 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/fixture/expression_positions.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/fixture/no_change_no_args.php.inc diff --git a/docs/rector-qa-checklist.md b/docs/rector-qa-checklist.md index 4321a8b2d..565fe0a1e 100644 --- a/docs/rector-qa-checklist.md +++ b/docs/rector-qa-checklist.md @@ -1,6 +1,6 @@ # Rector QA Checklist -**Next:** [`ReplaceViewsProceduralFunctionsRector`](#replaceviewsproceduralrector) +**Next:** [`StatementPrefetchIteratorFetchColumnRector`](#statementprefetchiteratorfetchcolumnrector) Living checklist for every rector added in the `main-bbrala` branch. Each rector gets three tasks: **Analyze**, **Coverage**, and **Edge cases**. Work through them iteratively — check a box when it is done. @@ -783,9 +783,9 @@ Tasks: - Change record: https://www.drupal.org/node/3572243 Tasks: -- [ ] **Analyze** — compare rector against drupal-digest source and change record; list all functions covered; confirm each has a fixture -- [ ] **Coverage** — add fixture pair for each function that does not yet have a dedicated fixture -- [ ] **Edge cases** — test: each function with result used in different expression positions; result used in a chain; call with different argument counts +- [x] **Analyze** — rector and digest are logically identical; all five functions handled: `views_view_is_enabled` → `$view->status()`, `views_view_is_disabled` → `!$view->status()`, `views_enable_view` → `$view->enable()->save()`, `views_disable_view` → `$view->disable()->save()`, `views_get_view_result` → `\Drupal\views\Views::getViewResult(...)`; `@see node/3572243` in rector; digest references `node/3572594` and the project issue — minor discrepancy; versions correct (`drupal:11.4.0` / `drupal:13.0.0`); no type guard (function names unique to views module) +- [x] **Coverage** — `basic.php.inc` already covered all five functions; added `fixture/expression_positions.php.inc`: `views_view_is_enabled()` in `if` condition, `views_view_is_disabled()` in ternary, `views_get_view_result()` with 1-arg and 2-arg forms; all 3 tests pass +- [x] **Edge cases** — added `fixture/no_change_no_args.php.inc`: zero-arg calls on all four view-object functions → correctly not transformed (each has `count($node->args) < 1` guard); `views_get_view_result()` has no arg guard — zero-arg call would be transformed to `Views::getViewResult()` but this is unlikely in real code; all 3 tests pass --- diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/fixture/expression_positions.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/fixture/expression_positions.php.inc new file mode 100644 index 000000000..8761c2325 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/fixture/expression_positions.php.inc @@ -0,0 +1,19 @@ + +----- +status()) { + $label = !$view->status() ? 'disabled' : 'enabled'; +} +$result = \Drupal\views\Views::getViewResult('frontpage'); +$result2 = \Drupal\views\Views::getViewResult('archive', 'block_1'); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/fixture/no_change_no_args.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/fixture/no_change_no_args.php.inc new file mode 100644 index 000000000..569e6a8f2 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/fixture/no_change_no_args.php.inc @@ -0,0 +1,19 @@ + +----- + From 18fe0932924a60b8ee94a84a1b71528544a99881 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 1 May 2026 12:29:01 +0200 Subject: [PATCH 076/256] test(Drupal11): expand fixture coverage for StatementPrefetchIteratorFetchColumnRector --- docs/rector-qa-checklist.md | 8 ++++---- .../fixture/chained_call.php.inc | 15 +++++++++++++++ .../fixture/no_arg.php.inc | 13 +++++++++++++ .../fixture/property_not_client_statement.php.inc | 15 +++++++++++++++ 4 files changed, 47 insertions(+), 4 deletions(-) create mode 100644 tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture/chained_call.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture/no_arg.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture/property_not_client_statement.php.inc diff --git a/docs/rector-qa-checklist.md b/docs/rector-qa-checklist.md index 565fe0a1e..da1d04b4a 100644 --- a/docs/rector-qa-checklist.md +++ b/docs/rector-qa-checklist.md @@ -1,6 +1,6 @@ # Rector QA Checklist -**Next:** [`StatementPrefetchIteratorFetchColumnRector`](#statementprefetchiteratorfetchcolumnrector) +**Next:** [`StripMigrationDependenciesExpandArgRector`](#stripmigrationdependenciesexpandargrector) Living checklist for every rector added in the `main-bbrala` branch. Each rector gets three tasks: **Analyze**, **Coverage**, and **Edge cases**. Work through them iteratively — check a box when it is done. @@ -796,9 +796,9 @@ Tasks: - Change record: https://www.drupal.org/node/3490200 Tasks: -- [ ] **Analyze** — compare rector against drupal-digest source and change record; confirm the `$this->clientStatement` exclusion guard is correct -- [ ] **Coverage** — add fixture for: `fetchColumn()` called on `$this->clientStatement` (should NOT be renamed); `fetchColumn()` with an explicit column index argument; `fetchColumn()` with no argument -- [ ] **Edge cases** — test: `fetchColumn()` on a native `\PDO` object (should NOT be renamed); `fetchColumn()` on any other property fetch that is not `clientStatement` (should be renamed) +- [x] **Analyze** — rector matches digest exactly; `$this->clientStatement` exclusion guard is correct; @see URL is `3490200` (change record) while core deprecation message references `3490312` — consistent discrepancy, not a bug +- [x] **Coverage** — added `no_arg.php.inc` (zero-arg call), `chained_call.php.inc` (method-chain receiver); basic.php.inc covers explicit index and clientStatement skip +- [x] **Edge cases** — added `property_not_client_statement.php.inc` confirming `$this->statement` / `$this->stmt` (non-clientStatement) IS transformed; `$this->clientStatement` stays unchanged (basic.php.inc) --- diff --git a/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture/chained_call.php.inc b/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture/chained_call.php.inc new file mode 100644 index 000000000..9115e2273 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture/chained_call.php.inc @@ -0,0 +1,15 @@ +query('SELECT name FROM {users}')->fetchColumn(); +$id = $connection->select('node', 'n')->fetchColumn(1); + +?> +----- +query('SELECT name FROM {users}')->fetchField(); +$id = $connection->select('node', 'n')->fetchField(1); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture/no_arg.php.inc b/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture/no_arg.php.inc new file mode 100644 index 000000000..dca281f30 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture/no_arg.php.inc @@ -0,0 +1,13 @@ +fetchColumn(); + +?> +----- +fetchField(); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture/property_not_client_statement.php.inc b/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture/property_not_client_statement.php.inc new file mode 100644 index 000000000..0ef393e12 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture/property_not_client_statement.php.inc @@ -0,0 +1,15 @@ +statement->fetchColumn(0); +$result2 = $this->stmt->fetchColumn(2); + +?> +----- +statement->fetchField(0); +$result2 = $this->stmt->fetchField(2); + +?> From ee9e57ddb591b1966dc03ef04cc269172869a228 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 1 May 2026 12:30:10 +0200 Subject: [PATCH 077/256] test(Drupal11): expand fixture coverage for StripMigrationDependenciesExpandArgRector --- docs/rector-qa-checklist.md | 8 +++--- .../fixture/false_arg.php.inc | 15 +++++++++++ .../fixture/this_caller.php.inc | 25 +++++++++++++++++++ 3 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/fixture/false_arg.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/fixture/this_caller.php.inc diff --git a/docs/rector-qa-checklist.md b/docs/rector-qa-checklist.md index da1d04b4a..f628d9df3 100644 --- a/docs/rector-qa-checklist.md +++ b/docs/rector-qa-checklist.md @@ -1,6 +1,6 @@ # Rector QA Checklist -**Next:** [`StripMigrationDependenciesExpandArgRector`](#stripmigrationdependenciesexpandargrector) +**Next:** [`UseEntityTypeHasIntegerIdRector`](#useentitytypehasintergeridrector) Living checklist for every rector added in the `main-bbrala` branch. Each rector gets three tasks: **Analyze**, **Coverage**, and **Edge cases**. Work through them iteratively — check a box when it is done. @@ -809,9 +809,9 @@ Tasks: - Change record: https://www.drupal.org/node/3574717 Tasks: -- [ ] **Analyze** — compare rector against drupal-digest source and change record; confirm the type guard on `MigrationInterface` is correct and sufficient -- [ ] **Coverage** — add fixture for: `getMigrationDependencies(FALSE)` (arg removed); `getMigrationDependencies()` with no arg (should not be changed); result used inline in a merge -- [ ] **Edge cases** — test: call on concrete class typed as `Migration` (covered by interface?); `getMigrationDependencies(TRUE)` — confirm TRUE variant also removed; call on an unrelated class with same method name is not touched +- [x] **Analyze** — rector matches digest; type guard on `MigrationInterface` is correct; core deprecation message references `3442785` while rector/checklist use `3574717` — consistent discrepancy, not a bug +- [x] **Coverage** — added `false_arg.php.inc` (FALSE arg removed); basic.php.inc covers no-arg no-change and untyped no-change +- [x] **Edge cases** — added `this_caller.php.inc` documenting that `$this` in Migration subclass is NOT transformed (PHPStan cannot resolve type without Drupal core); TRUE case confirmed via basic.php.inc --- diff --git a/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/fixture/false_arg.php.inc b/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/fixture/false_arg.php.inc new file mode 100644 index 000000000..6b7d9c994 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/fixture/false_arg.php.inc @@ -0,0 +1,15 @@ +getMigrationDependencies(FALSE); + +?> +----- +getMigrationDependencies(); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/fixture/this_caller.php.inc b/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/fixture/this_caller.php.inc new file mode 100644 index 000000000..b23759708 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/fixture/this_caller.php.inc @@ -0,0 +1,25 @@ +getMigrationDependencies(TRUE); + } +} + +?> +----- +getMigrationDependencies(TRUE); + } +} + +?> From c2364a940570432f4bb44695bca7feb050ec2af0 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 1 May 2026 12:30:46 +0200 Subject: [PATCH 078/256] test(Drupal11): expand fixture coverage for UseEntityTypeHasIntegerIdRector --- docs/rector-qa-checklist.md | 8 ++--- .../fixture/no_change.php.inc | 33 +++++++++++++++++++ .../fixture/string_reversed.php.inc | 17 ++++++++++ 3 files changed, 54 insertions(+), 4 deletions(-) create mode 100644 tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/no_change.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/string_reversed.php.inc diff --git a/docs/rector-qa-checklist.md b/docs/rector-qa-checklist.md index f628d9df3..85895d15f 100644 --- a/docs/rector-qa-checklist.md +++ b/docs/rector-qa-checklist.md @@ -1,6 +1,6 @@ # Rector QA Checklist -**Next:** [`UseEntityTypeHasIntegerIdRector`](#useentitytypehasintergeridrector) +**Next:** [`ViewsPluginHandlerManagerRector`](#viewspluginhandlermanagerrector) Living checklist for every rector added in the `main-bbrala` branch. Each rector gets three tasks: **Analyze**, **Coverage**, and **Edge cases**. Work through them iteratively — check a box when it is done. @@ -822,9 +822,9 @@ Tasks: - Change record: https://www.drupal.org/node/3566801 Tasks: -- [ ] **Analyze** — compare rector against drupal-digest source and change record; document gaps -- [ ] **Coverage** — add fixture pairs for all transformation variants in the change record -- [ ] **Edge cases** — test: function/method used in a boolean context; result negated (`!entityTypeHasIntegerId(...)`); call on different receiver types +- [x] **Analyze** — rector matches digest; handles all three patterns (`getEntityTypeIdKeyType` === 'integer', `entityTypeSupportsComments`, `hasIntegerId`); both orderings of Identical handled via `extractPair` +- [x] **Coverage** — basic.php.inc covers all three patterns; added `string_reversed.php.inc` for `'integer' === $this->getEntityTypeIdKeyType(...)` (string on left) +- [x] **Edge cases** — added `no_change.php.inc` for: non-'integer' string value, non-`$this` receiver on `getEntityTypeIdKeyType`, non-`$this` `entityTypeSupportsComments` --- diff --git a/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/no_change.php.inc b/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/no_change.php.inc new file mode 100644 index 000000000..a3cb40340 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/no_change.php.inc @@ -0,0 +1,33 @@ +getEntityTypeIdKeyType($entity_type) === 'string') { + $result = 'string'; +} + +// Not called on $this: no transformation. +if ($other->getEntityTypeIdKeyType($entity_type) === 'integer') { + $result = 'other'; +} + +// entityTypeSupportsComments without $this: no transformation. +$a = $other->entityTypeSupportsComments($entity_type); + +?> +----- +getEntityTypeIdKeyType($entity_type) === 'string') { + $result = 'string'; +} + +// Not called on $this: no transformation. +if ($other->getEntityTypeIdKeyType($entity_type) === 'integer') { + $result = 'other'; +} + +// entityTypeSupportsComments without $this: no transformation. +$a = $other->entityTypeSupportsComments($entity_type); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/string_reversed.php.inc b/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/string_reversed.php.inc new file mode 100644 index 000000000..0ede4e487 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/string_reversed.php.inc @@ -0,0 +1,17 @@ +getEntityTypeIdKeyType($entity_type)) { + $result = 'integer'; +} + +?> +----- +hasIntegerId()) { + $result = 'integer'; +} + +?> From a66062c82f16343f9e7dae015d4820e8519f84c5 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 1 May 2026 12:31:42 +0200 Subject: [PATCH 079/256] test(Drupal11): expand fixture coverage for ViewsPluginHandlerManagerRector --- docs/rector-qa-checklist.md | 8 ++++---- .../fixture/fqcn_prefix.php.inc | 15 +++++++++++++++ .../fixture/handler_manager_dynamic.php.inc | 19 +++++++++++++++++++ .../fixture/no_change_no_args.php.inc | 19 +++++++++++++++++++ 4 files changed, 57 insertions(+), 4 deletions(-) create mode 100644 tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/fixture/fqcn_prefix.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/fixture/handler_manager_dynamic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/fixture/no_change_no_args.php.inc diff --git a/docs/rector-qa-checklist.md b/docs/rector-qa-checklist.md index 85895d15f..d16e27594 100644 --- a/docs/rector-qa-checklist.md +++ b/docs/rector-qa-checklist.md @@ -1,6 +1,6 @@ # Rector QA Checklist -**Next:** [`ViewsPluginHandlerManagerRector`](#viewspluginhandlermanagerrector) +**Next:** [`FunctionCallRemovalRector`](#functioncallremovalrector) Living checklist for every rector added in the `main-bbrala` branch. Each rector gets three tasks: **Analyze**, **Coverage**, and **Edge cases**. Work through them iteratively — check a box when it is done. @@ -835,9 +835,9 @@ Tasks: - Change record: https://www.drupal.org/node/3566424 Tasks: -- [ ] **Analyze** — compare rector against drupal-digest source and change record; confirm both `pluginManager()` and `handlerManager()` are handled; confirm the two output paths (string literal arg → direct service; variable arg → service locator) -- [ ] **Coverage** — add fixture for: `Views::pluginManager('filter')` with string literal; `Views::pluginManager($type)` with variable; `Views::handlerManager('field')` with string literal; `Views::handlerManager($type)` with variable -- [ ] **Edge cases** — test: call with no argument (currently skipped — confirm it should stay that way); call with a concatenated string argument; result used inline in a method chain +- [x] **Analyze** — rector matches digest; handles both `pluginManager()` and `handlerManager()`; two output paths: string literal arg → `\Drupal::service('plugin.manager.views.')`, dynamic arg → `\Drupal::service('views.plugin_managers')->get($type)`; @see URL discrepancy: rector `3566424`, core/digest `3566982` — consistent pattern +- [x] **Coverage** — basic.php.inc covers string literal for both methods and dynamic for `pluginManager`; added `handler_manager_dynamic.php.inc` for `handlerManager($type)` dynamic variant; added `fqcn_prefix.php.inc` for FQCN calls +- [x] **Edge cases** — added `no_change_no_args.php.inc` confirming zero-arg calls are intentionally skipped --- diff --git a/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/fixture/fqcn_prefix.php.inc b/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/fixture/fqcn_prefix.php.inc new file mode 100644 index 000000000..2dded027f --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/fixture/fqcn_prefix.php.inc @@ -0,0 +1,15 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/fixture/handler_manager_dynamic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/fixture/handler_manager_dynamic.php.inc new file mode 100644 index 000000000..0b494730a --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/fixture/handler_manager_dynamic.php.inc @@ -0,0 +1,19 @@ + +----- +get($type); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/fixture/no_change_no_args.php.inc b/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/fixture/no_change_no_args.php.inc new file mode 100644 index 000000000..fa8dc4dc4 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/fixture/no_change_no_args.php.inc @@ -0,0 +1,19 @@ + +----- + From a3208891f816196fa214d9a30b72b36b627d33c0 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 1 May 2026 13:07:47 +0200 Subject: [PATCH 080/256] test(generic): expand fixture coverage for FunctionCallRemovalRector --- docs/rector-qa-checklist.md | 8 ++++---- .../fixture/fqcn_prefix.php.inc | 13 +++++++++++++ .../no_change_expression_usage.php.inc | 19 +++++++++++++++++++ 3 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 tests/src/Rector/Deprecation/FunctionCallRemovalRector/fixture/fqcn_prefix.php.inc create mode 100644 tests/src/Rector/Deprecation/FunctionCallRemovalRector/fixture/no_change_expression_usage.php.inc diff --git a/docs/rector-qa-checklist.md b/docs/rector-qa-checklist.md index d16e27594..5598820b5 100644 --- a/docs/rector-qa-checklist.md +++ b/docs/rector-qa-checklist.md @@ -1,6 +1,6 @@ # Rector QA Checklist -**Next:** [`FunctionCallRemovalRector`](#functioncallremovalrector) +**Next:** *(all checklist rectors complete)* Living checklist for every rector added in the `main-bbrala` branch. Each rector gets three tasks: **Analyze**, **Coverage**, and **Edge cases**. Work through them iteratively — check a box when it is done. @@ -849,9 +849,9 @@ Tasks: - No drupal-digest source — this is a generic configurable rector Tasks: -- [ ] **Analyze** — verify the rector handles both statement-level removal (entire expression statement) and expression-level usage (function call as part of a larger expression); document what happens when the return value is used -- [ ] **Coverage** — add fixture for: call as a standalone statement (removed); call whose return value is assigned (what happens?); call as argument to another function (what happens?) -- [ ] **Edge cases** — test: function name collision — a function with the same name in a different namespace; function called with named arguments; function called with spread operator; multiple configured functions in a single pass +- [x] **Analyze** — rector targets `Stmt\Expression` wrapping a `FuncCall`; only standalone-statement calls are removed; assignments (`$x = f()`) and calls-as-arguments (`g(f())`) are intentionally left unchanged because `$node->expr` is not a `FuncCall` in those positions +- [x] **Coverage** — basic.php.inc covers multi-function removal and non-configured call survival; added `fqcn_prefix.php.inc` confirming `\fully_qualified_name()` form is also removed +- [x] **Edge cases** — added `no_change_expression_usage.php.inc` documenting that assigned and argument-position calls are not removed (known limitation) --- diff --git a/tests/src/Rector/Deprecation/FunctionCallRemovalRector/fixture/fqcn_prefix.php.inc b/tests/src/Rector/Deprecation/FunctionCallRemovalRector/fixture/fqcn_prefix.php.inc new file mode 100644 index 000000000..8feabfba4 --- /dev/null +++ b/tests/src/Rector/Deprecation/FunctionCallRemovalRector/fixture/fqcn_prefix.php.inc @@ -0,0 +1,13 @@ + +----- + diff --git a/tests/src/Rector/Deprecation/FunctionCallRemovalRector/fixture/no_change_expression_usage.php.inc b/tests/src/Rector/Deprecation/FunctionCallRemovalRector/fixture/no_change_expression_usage.php.inc new file mode 100644 index 000000000..ca774bc79 --- /dev/null +++ b/tests/src/Rector/Deprecation/FunctionCallRemovalRector/fixture/no_change_expression_usage.php.inc @@ -0,0 +1,19 @@ + +----- + From 722c17721fa6db53b44337d8eef602fed8030fb0 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 1 May 2026 14:17:58 +0200 Subject: [PATCH 081/256] build: less composer errors --- composer.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/composer.json b/composer.json index 996ac1599..0e37b094b 100644 --- a/composer.json +++ b/composer.json @@ -50,6 +50,9 @@ }, "classmap": [ "stubs" + ], + "exclude-from-classmap": [ + "**/fixture/**" ] }, "config": { From e05d7997a7b288c667bfea96526ee6711414c8e2 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 1 May 2026 14:18:46 +0200 Subject: [PATCH 082/256] fix(RemoveCacheExpireOverrideRector): noticed too wide matching in class name which would probably break. Test confirmed that. --- .../RemoveCacheExpireOverrideRector.php | 23 +++++++++++++++---- .../no_change_unrelated_short_name.php.inc | 13 +++++++++++ 2 files changed, 31 insertions(+), 5 deletions(-) create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/fixture/no_change_unrelated_short_name.php.inc diff --git a/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector.php b/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector.php index d159faeea..4ed58da26 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector.php @@ -26,6 +26,13 @@ final class RemoveCacheExpireOverrideRector extends AbstractRector private const PARENT_SHORT_NAMES = ['CachePluginBase', 'Time', 'Tag', 'None']; + private const PARENT_FQCNS = [ + 'Drupal\views\Plugin\views\cache\CachePluginBase', + 'Drupal\views\Plugin\views\cache\Time', + 'Drupal\views\Plugin\views\cache\Tag', + 'Drupal\views\Plugin\views\cache\None', + ]; + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( @@ -70,13 +77,19 @@ private function isCachePluginBaseSubclass(Class_ $node): bool $parentName = $node->extends->toString(); - if ($parentName === self::CACHE_PLUGIN_BASE_FQCN) { - return true; + // Match fully-qualified names (Rector resolves `use` aliases before calling refactor). + foreach (self::PARENT_FQCNS as $fqcn) { + if ($parentName === $fqcn) { + return true; + } } - foreach (self::PARENT_SHORT_NAMES as $short) { - if ($parentName === $short || str_ends_with($parentName, '\\'.$short)) { - return true; + // Match unqualified short names (no `use` statement, global-namespace usage). + if (!str_contains($parentName, '\\')) { + foreach (self::PARENT_SHORT_NAMES as $short) { + if ($parentName === $short) { + return true; + } } } diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/fixture/no_change_unrelated_short_name.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/fixture/no_change_unrelated_short_name.php.inc new file mode 100644 index 000000000..4a7fa2dd4 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/fixture/no_change_unrelated_short_name.php.inc @@ -0,0 +1,13 @@ + Date: Fri, 1 May 2026 14:38:29 +0200 Subject: [PATCH 083/256] fix(LoadAllIncludesRector): We need to be very specific on what the called variable is to make sure we don't break other code --- .../Rector/Deprecation/LoadAllIncludesRector.php | 5 +++++ stubs/Drupal/Drupal.php | 2 ++ .../LoadAllIncludesRector/fixture/basic.php.inc | 13 +++++++------ .../fixture/no_change_untyped.php.inc | 4 ++++ 4 files changed, 18 insertions(+), 6 deletions(-) create mode 100644 tests/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector/fixture/no_change_untyped.php.inc diff --git a/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector.php b/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector.php index 2c2e7c5ad..313bb3217 100644 --- a/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector.php +++ b/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector.php @@ -5,6 +5,7 @@ namespace DrupalRector\Drupal11\Rector\Deprecation; use PhpParser\Node; +use PHPStan\Type\ObjectType; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -37,6 +38,10 @@ public function refactor(Node $node): ?Node return null; } + if (!$this->isObjectType($methodCall->var, new ObjectType('Drupal\Core\Extension\ModuleHandlerInterface'))) { + return null; + } + $caller = $methodCall->var; $getModuleListCall = new Node\Expr\MethodCall(clone $caller, 'getModuleList'); diff --git a/stubs/Drupal/Drupal.php b/stubs/Drupal/Drupal.php index cba68d976..bbf1866dd 100644 --- a/stubs/Drupal/Drupal.php +++ b/stubs/Drupal/Drupal.php @@ -6,4 +6,6 @@ class Drupal { const VERSION = '11.99.x-dev'; + + public static function moduleHandler(): \Drupal\Core\Extension\ModuleHandlerInterface {} } diff --git a/tests/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector/fixture/basic.php.inc index f2375d769..82d542005 100644 --- a/tests/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector/fixture/basic.php.inc @@ -1,15 +1,16 @@ moduleHandler->loadAllIncludes('install'); -$this->moduleHandler->loadAllIncludes('inc', 'admin'); +/** @var \Drupal\Core\Extension\ModuleHandlerInterface $moduleHandler */ +$moduleHandler->loadAllIncludes('install'); +$moduleHandler->loadAllIncludes('inc', 'admin'); ?> ----- moduleHandler->getModuleList() as $module => $filename) { - $this->moduleHandler->loadInclude($module, 'install'); +foreach ($moduleHandler->getModuleList() as $module => $filename) { + $moduleHandler->loadInclude($module, 'install'); } -foreach ($this->moduleHandler->getModuleList() as $module => $filename) { - $this->moduleHandler->loadInclude($module, 'inc', 'admin'); +foreach ($moduleHandler->getModuleList() as $module => $filename) { + $moduleHandler->loadInclude($module, 'inc', 'admin'); } ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector/fixture/no_change_untyped.php.inc b/tests/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector/fixture/no_change_untyped.php.inc new file mode 100644 index 000000000..8335985c4 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector/fixture/no_change_untyped.php.inc @@ -0,0 +1,4 @@ +loadAllIncludes('install'); From dd9eaf6e01363d0de7a57054111b6c97756257c9 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 1 May 2026 14:47:35 +0200 Subject: [PATCH 084/256] fix(MigrateSqlGetMigrationPluginManagerRecto): Add checks that we actually only change `Drupal\migrate\Plugin\migrate\id_map\Sql` --- .../MigrateSqlGetMigrationPluginManagerRector.php | 3 +-- stubs/Drupal/migrate/Plugin/migrate/id_map/Sql.php | 11 +++++++++++ .../fixture/basic.php.inc | 8 ++++++-- .../fixture/chain_result.php.inc | 8 ++++++-- .../fixture/no_change_unrelated.php.inc | 10 ++++++++++ 5 files changed, 34 insertions(+), 6 deletions(-) create mode 100644 stubs/Drupal/migrate/Plugin/migrate/id_map/Sql.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/fixture/no_change_unrelated.php.inc diff --git a/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector.php b/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector.php index 9f6643222..6867413e0 100644 --- a/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector.php +++ b/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector.php @@ -53,8 +53,7 @@ public function refactor(Node $node): ?Node if ($node->args !== []) { return null; } - // Migration::getMigrationPluginManager() is NOT deprecated; skip it. - if ($this->isObjectType($node->var, new ObjectType('Drupal\migrate\Plugin\Migration'))) { + if (!$this->isObjectType($node->var, new ObjectType('Drupal\migrate\Plugin\migrate\id_map\Sql'))) { return null; } diff --git a/stubs/Drupal/migrate/Plugin/migrate/id_map/Sql.php b/stubs/Drupal/migrate/Plugin/migrate/id_map/Sql.php new file mode 100644 index 000000000..542da9fd5 --- /dev/null +++ b/stubs/Drupal/migrate/Plugin/migrate/id_map/Sql.php @@ -0,0 +1,11 @@ +getMigrationPluginManager(); + } +} From 331051df5f401702ad5c686ce63530ae94877096 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 1 May 2026 15:43:51 +0200 Subject: [PATCH 085/256] fix: Add a lot of extra checks to make sure we are recotring the right classes. Rather we miss stuff than we over-apply stuff --- docs/rector-type-specificity-checklist.md | 99 +++++++++++++++++++ .../ReplaceRebuildThemeDataRector.php | 5 + .../PluginBaseIsConfigurableRector.php | 5 + .../RemoveConfigSaveTrustedDataArgRector.php | 4 + .../RemoveSetUriCallbackRector.php | 3 + .../Deprecation/RemoveTrustDataCallRector.php | 5 + .../RemoveViewsRowCacheKeysRector.php | 2 + .../ReplaceEntityOriginalPropertyRector.php | 11 ++- .../ReplaceNodeSetPreviewModeRector.php | 5 + ...ementPrefetchIteratorFetchColumnRector.php | 8 +- .../UseEntityTypeHasIntegerIdRector.php | 18 +++- stubs/Drupal/Component/Plugin/PluginBase.php | 11 +++ stubs/Drupal/Core/Config/Config.php | 11 +++ .../Config/Entity/ConfigEntityInterface.php | 11 +++ .../Database/StatementPrefetchIterator.php | 11 +++ stubs/Drupal/Core/Entity/EntityInterface.php | 11 +++ .../Core/Entity/EntityTypeInterface.php | 14 +++ .../Routing/DefaultHtmlRouteProvider.php | 11 +++ .../Core/Extension/ThemeHandlerInterface.php | 11 +++ stubs/Drupal/comment/CommentTypeForm.php | 11 +++ .../OverridesSectionStorage.php | 11 +++ stubs/Drupal/node/NodeTypeInterface.php | 11 +++ .../Plugin/views/cache/CachePluginBase.php | 11 +++ .../fixture/no_change_untyped.php.inc | 4 + .../fixture/basic.php.inc | 8 +- .../fixture/negated.php.inc | 8 +- .../fixture/no_change_unrelated_class.php.inc | 10 ++ .../fixture/basic.php.inc | 8 +- .../fixture/basic.php.inc | 1 + .../fixture/deep_chain.php.inc | 2 + .../extends_implementing_class.php.inc | 22 +++++ .../fixture/no_type_guard.php.inc | 15 +-- .../fixture/assigned_result.php.inc | 2 + .../fixture/basic.php.inc | 2 + .../fixture/standalone_statement.php.inc | 2 + .../fixture/basic.php.inc | 2 + .../fixture/both_deprecated_calls.php.inc | 2 + .../fixture/get_row_id.php.inc | 2 + .../fixture/no_change_unrelated_class.php.inc | 23 ++--- .../fixture/basic.php.inc | 2 + .../fixture/chain.php.inc | 2 + .../fixture/nullsafe.php.inc | 2 + .../fixture/write_complex_rhs.php.inc | 2 + .../fixture/basic.php.inc | 2 + .../fixture/no_type_guard.php.inc | 12 +-- .../fixture/basic.php.inc | 8 +- .../fixture/chained_call.php.inc | 13 +-- .../fixture/no_arg.php.inc | 2 + .../property_not_client_statement.php.inc | 30 ++++-- .../fixture/basic.php.inc | 24 +++-- .../entity_type_supports_comments.php.inc | 23 +++++ .../fixture/has_integer_id_helper.php.inc | 23 +++++ .../fixture/no_change.php.inc | 29 ++---- .../fixture/no_change_unrelated_class.php.inc | 10 ++ .../fixture/string_reversed.php.inc | 20 +++- 55 files changed, 511 insertions(+), 106 deletions(-) create mode 100644 docs/rector-type-specificity-checklist.md create mode 100644 stubs/Drupal/Component/Plugin/PluginBase.php create mode 100644 stubs/Drupal/Core/Config/Config.php create mode 100644 stubs/Drupal/Core/Config/Entity/ConfigEntityInterface.php create mode 100644 stubs/Drupal/Core/Database/StatementPrefetchIterator.php create mode 100644 stubs/Drupal/Core/Entity/EntityInterface.php create mode 100644 stubs/Drupal/Core/Entity/EntityTypeInterface.php create mode 100644 stubs/Drupal/Core/Entity/Routing/DefaultHtmlRouteProvider.php create mode 100644 stubs/Drupal/Core/Extension/ThemeHandlerInterface.php create mode 100644 stubs/Drupal/comment/CommentTypeForm.php create mode 100644 stubs/Drupal/layout_builder/Plugin/SectionStorage/OverridesSectionStorage.php create mode 100644 stubs/Drupal/node/NodeTypeInterface.php create mode 100644 stubs/Drupal/views/Plugin/views/cache/CachePluginBase.php create mode 100644 tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/fixture/no_change_untyped.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture/no_change_unrelated_class.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/fixture/extends_implementing_class.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/entity_type_supports_comments.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/has_integer_id_helper.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/no_change_unrelated_class.php.inc diff --git a/docs/rector-type-specificity-checklist.md b/docs/rector-type-specificity-checklist.md new file mode 100644 index 000000000..05d26368c --- /dev/null +++ b/docs/rector-type-specificity-checklist.md @@ -0,0 +1,99 @@ +# Rector Type-Specificity Checklist + +Rectors that match a method call, property access, or `$this` reference **by name only** — without verifying the owning class or interface — will transform any unrelated class that happens to share that name. This checklist tracks every rector added in the `feature/digest-rectors` branch against that criterion. + +Use `/rector-type-check-review ` to fix an AT-RISK rector interactively. + +--- + +## Legend + +| Verdict | Meaning | +|---------|---------| +| ✅ SAFE | Correct `isObjectType` guard, targets global functions/constants, or name is so specific collisions are implausible | +| ⚠️ AT-RISK | Matches method/property/`$this` by name alone without owning-class verification | +| 🔵 EXEMPT | Operates on a **class declaration** (`Class_` node) and checks the parent class before acting | + +--- + +## Drupal 10 Rectors + +| Rector | Matches | Guard | Verdict | Notes | +|--------|---------|-------|---------|-------| +| `ReplaceModuleHandlerGetNameRector` | `->getName()` | `isObjectType(ModuleHandlerInterface)` | ✅ SAFE | | +| `ReplaceRebuildThemeDataRector` | `->rebuildThemeData()` | `isObjectType(ThemeHandlerInterface)` | ✅ SAFE | Fixed | +| `ReplaceRequestTimeConstantRector` | `REQUEST_TIME` constant | n/a | ✅ SAFE | Global constant — no owning class | + +--- + +## Drupal 11 Rectors + +| Rector | Matches | Guard | Verdict | Notes | +|--------|---------|-------|---------|-------| +| `ErrorCurrentErrorHandlerRector` | `Error::currentErrorHandler()` static | `isObjectType(Error)` | ✅ SAFE | | +| `FileSystemBasenameToNativeRector` | `->basename()` | `isObjectType(FileSystemInterface\|FileSystem)` | ✅ SAFE | | +| `LoadAllIncludesRector` | `->loadAllIncludes()` | `isObjectType(ModuleHandlerInterface)` | ✅ SAFE | | +| `MigrateSqlGetMigrationPluginManagerRector` | `$this->getMigrationPluginManager()` | `isObjectType(Sql)` | ✅ SAFE | | +| `NodeStorageDeprecatedMethodsRector` | `->revisionIds()` etc. | `isObjectType(NodeStorageInterface)` | ✅ SAFE | | +| `PluginBaseIsConfigurableRector` | `$this->isConfigurable()` | `isObjectType(PluginBase)` | ✅ SAFE | Fixed | +| `RemoveAutomatedCronSubmitHandlerRector` | `$form['#submit'][]` string literal | n/a | ✅ SAFE | Matches specific string value, not a class member | +| `RemoveCacheExpireOverrideRector` | `cacheExpire()` method declaration | `extends` + `isObjectType` fallback on `Class_` | 🔵 EXEMPT | | +| `RemoveConfigSaveTrustedDataArgRector` | `->save(TRUE\|FALSE)` | `isObjectType(Config)` | ✅ SAFE | Fixed | +| `RemoveHandlerBaseDefineExtraOptionsRector` | `defineExtraOptions()` declaration | `extends` check on `Class_` | 🔵 EXEMPT | | +| `RemoveLinkWidgetValidateTitleElementRector` | `LinkWidget::validateTitleElement()` static | `isName(LinkWidget)` | ✅ SAFE | | +| `RemoveModuleHandlerAddModuleCallsRector` | `->addModule()`, `->addProfile()` | `isObjectType(ModuleHandlerInterface\|ModuleHandler)` | ✅ SAFE | | +| `RemoveModuleHandlerDeprecatedMethodsRector` | `->writeCache()`, `->getHookInfo()` | `isObjectType(ModuleHandlerInterface)` | ✅ SAFE | | +| `RemoveRootFromConvertDbUrlRector` | `Database::convertDbUrlToConnectionInfo()` static | `isName(Database)` | ✅ SAFE | | +| `RemoveSetUriCallbackRector` | `->setUriCallback()` | `isObjectType(EntityTypeInterface)` | ✅ SAFE | Fixed | +| `RemoveStateCacheSettingRector` | `$settings['state_cache']` array key | n/a | ✅ SAFE | Specific variable + key pattern | +| `RemoveTrustDataCallRector` | `->trustData()` | `isObjectType(ConfigEntityInterface)` | ✅ SAFE | Fixed | +| `RemoveTwigNodeTransTagArgumentRector` | `new TwigNodeTrans(...)` | `isName(TwigNodeTrans)` | ✅ SAFE | | +| `RemoveUpdaterPostInstallMethodsRector` | `postInstall()`, `postInstallTasks()` declarations | `extends` check on `Class_` | 🔵 EXEMPT | | +| `RemoveViewsRowCacheKeysRector` | array values: `->getRowCacheKeys()`, `->getRowId()` | `isObjectType(CachePluginBase)` | ✅ SAFE | Fixed | +| `RenameStopProceduralHookScanRector` | `StopProceduralHookScan` attribute/use | `isName` on FQCN | ✅ SAFE | | +| `ReplaceAlphadecimalToIntNullRector` | `Number::alphadecimalToInt()` static | `isObjectType(Number)` | ✅ SAFE | | +| `ReplaceCommentManagerGetCountNewCommentsRector` | `->getCountNewComments()` | `isObjectType(CommentManagerInterface)` | ✅ SAFE | | +| `ReplaceCommentUriRector` | `comment_uri()` function | n/a | ✅ SAFE | Global function | +| `ReplaceDateTimeRangeConstantsRector` | class constant fetch + function | `isName` on interface | ✅ SAFE | | +| `ReplaceEditorLoadRector` | `editor_load()` function | n/a | ✅ SAFE | Global function | +| `ReplaceEntityOriginalPropertyRector` | `->original` property | `isObjectType(EntityInterface)` | ✅ SAFE | Fixed | +| `ReplaceEntityReferenceRecursiveLimitRector` | `RECURSIVE_RENDER_LIMIT` class const | `isName` on target classes | ✅ SAFE | | +| `ReplaceFieldgroupToFieldsetRector` | `'#type' => 'fieldgroup'` array literal | n/a | ✅ SAFE | String literal match | +| `ReplaceFileGetContentHeadersRector` | `file_get_content_headers()` function | n/a | ✅ SAFE | Global function | +| `ReplaceLocaleConfigBatchFunctionsRector` | `locale_config_batch_*()` functions | n/a | ✅ SAFE | Global functions | +| `ReplaceNodeAccessViewAllNodesRector` | `node_access_view_all_nodes()` etc. | n/a | ✅ SAFE | Global functions | +| `ReplaceNodeAddBodyFieldRector` | `node_add_body_field()` function | n/a | ✅ SAFE | Global function | +| `ReplaceNodeModuleProceduralFunctionsRector` | `node_type_get_names()` etc. | n/a | ✅ SAFE | Global functions | +| `ReplaceNodeSetPreviewModeRector` | `->setPreviewMode(0\|1\|2\|CONST)` | `isObjectType(NodeTypeInterface)` | ✅ SAFE | Fixed | +| `ReplacePdoFetchConstantsRector` | `PDO::FETCH_*` constants | `isName(PDO)` on const fetch | ✅ SAFE | | +| `ReplaceRecipeRunnerInstallModuleRector` | `RecipeRunner::installModule()` static | `isName(RecipeRunner)` | ✅ SAFE | | +| `ReplaceSessionManagerDeleteRector` | `->delete()` | `isObjectType(SessionManager)` | ✅ SAFE | | +| `ReplaceSessionWritesWithRequestSessionRector` | `$_SESSION[...]` superglobal | n/a | ✅ SAFE | Specific superglobal | +| `ReplaceSystemPerformanceGzipKeyRector` | `->get()`/`->set()` on config chain | chain inspection for `'system.performance'` key | ✅ SAFE | Custom chain guard | +| `ReplaceThemeGetSettingRector` | `theme_get_setting()` etc. | n/a | ✅ SAFE | Global functions | +| `ReplaceUserSessionNamePropertyRector` | `->name` property | `isObjectType(UserSession)` + skips `$this` | ✅ SAFE | | +| `ReplaceViewsProceduralFunctionsRector` | `views_*()` functions | n/a | ✅ SAFE | Global functions | +| `StatementPrefetchIteratorFetchColumnRector` | `->fetchColumn()` | `isObjectType(StatementPrefetchIterator)` | ✅ SAFE | Fixed | +| `StripMigrationDependenciesExpandArgRector` | `->getMigrationDependencies()` | `isObjectType(MigrationInterface)` | ✅ SAFE | | +| `UseEntityTypeHasIntegerIdRector` | `$this->getEntityTypeIdKeyType()` etc. | `isObjectType` per-method via `METHOD_OWNER_CLASS` map | ✅ SAFE | Fixed | +| `ViewsPluginHandlerManagerRector` | `Views::pluginManager()` static | `isName(Views)` | ✅ SAFE | | +| `FunctionCallRemovalRector` (generic) | configured function names | configuration-driven name match | ✅ SAFE | Targets global functions only | + +--- + +## AT-RISK Summary + +All 10 AT-RISK rectors have been fixed. ✅ + +| # | Rector | Guard added | Drupal class/interface used | +|---|--------|------------|------------------------------| +| 1 | `ReplaceRebuildThemeDataRector` | `isObjectType` on `->rebuildThemeData()` caller | `Drupal\Core\Extension\ThemeHandlerInterface` | +| 2 | `PluginBaseIsConfigurableRector` | `isObjectType` on `$this` | `Drupal\Component\Plugin\PluginBase` | +| 3 | `RemoveConfigSaveTrustedDataArgRector` | `isObjectType` on `->save()` caller | `Drupal\Core\Config\Config` | +| 4 | `RemoveSetUriCallbackRector` | `isObjectType` on `->setUriCallback()` caller | `Drupal\Core\Entity\EntityTypeInterface` | +| 5 | `RemoveTrustDataCallRector` | `isObjectType` on `->trustData()` caller | `Drupal\Core\Config\Entity\ConfigEntityInterface` | +| 6 | `RemoveViewsRowCacheKeysRector` | `isObjectType` on method-call receiver inside array item | `Drupal\views\Plugin\views\cache\CachePluginBase` | +| 7 | `ReplaceEntityOriginalPropertyRector` | `isObjectType` on `->original` variable | `Drupal\Core\Entity\EntityInterface` | +| 8 | `ReplaceNodeSetPreviewModeRector` | `isObjectType` on `->setPreviewMode()` caller | `Drupal\node\NodeTypeInterface` | +| 9 | `StatementPrefetchIteratorFetchColumnRector` | `isObjectType` on `->fetchColumn()` caller | `Drupal\Core\Database\StatementPrefetchIterator` | +| 10 | `UseEntityTypeHasIntegerIdRector` | per-method `isObjectType` via `METHOD_OWNER_CLASS` map | `DefaultHtmlRouteProvider`, `CommentTypeForm`, `OverridesSectionStorage` | diff --git a/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector.php b/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector.php index d3d59453f..87d13c10e 100644 --- a/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector.php +++ b/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector.php @@ -8,6 +8,7 @@ use DrupalRector\Rector\AbstractDrupalCoreRector; use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use PhpParser\Node; +use PHPStan\Type\ObjectType; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -49,6 +50,10 @@ public function refactorWithConfiguration(Node $node, VersionedConfigurationInte return null; } + if (!$this->isObjectType($node->var, new ObjectType('Drupal\Core\Extension\ThemeHandlerInterface'))) { + return null; + } + if (!empty($node->args)) { return null; } diff --git a/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector.php b/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector.php index e7b4394b9..37d66ca5a 100644 --- a/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector.php +++ b/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector.php @@ -5,6 +5,7 @@ namespace DrupalRector\Drupal11\Rector\Deprecation; use PhpParser\Node; +use PHPStan\Type\ObjectType; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -43,6 +44,10 @@ public function refactor(Node $node): ?Node return null; } + if (!$this->isObjectType($node->var, new ObjectType('Drupal\Component\Plugin\PluginBase'))) { + return null; + } + return new Node\Expr\Instanceof_( $node->var, new Node\Name\FullyQualified('Drupal\Component\Plugin\ConfigurableInterface') diff --git a/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector.php b/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector.php index 406624644..bb7e58cd2 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector.php @@ -8,6 +8,7 @@ use PhpParser\Node\Arg; use PhpParser\Node\Expr\ConstFetch; use PhpParser\Node\Expr\MethodCall; +use PHPStan\Type\ObjectType; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -46,6 +47,9 @@ public function refactor(Node $node): ?Node if (!$this->isName($node->name, 'save')) { return null; } + if (!$this->isObjectType($node->var, new ObjectType('Drupal\Core\Config\Config'))) { + return null; + } if (count($node->args) !== 1) { return null; } diff --git a/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector.php b/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector.php index 139c85d08..2e925a610 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector.php @@ -8,6 +8,7 @@ use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Stmt\Expression; use PhpParser\NodeVisitor; +use PHPStan\Type\ObjectType; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -47,6 +48,7 @@ public function refactor(Node $node): int|Node|null if ($node instanceof Expression) { if ($node->expr instanceof MethodCall && $this->isName($node->expr->name, 'setUriCallback') + && $this->isObjectType($node->expr->var, new ObjectType('Drupal\Core\Entity\EntityTypeInterface')) ) { return NodeVisitor::REMOVE_NODE; } @@ -58,6 +60,7 @@ public function refactor(Node $node): int|Node|null if ($node instanceof MethodCall) { if ($node->var instanceof MethodCall && $this->isName($node->var->name, 'setUriCallback') + && $this->isObjectType($node->var->var, new ObjectType('Drupal\Core\Entity\EntityTypeInterface')) ) { $node->var = $node->var->var; diff --git a/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector.php b/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector.php index 16d252c26..202ad9de3 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector.php @@ -6,6 +6,7 @@ use PhpParser\Node; use PhpParser\Node\Expr\MethodCall; +use PHPStan\Type\ObjectType; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -45,6 +46,10 @@ public function refactor(Node $node): ?Node return null; } + if (!$this->isObjectType($node->var, new ObjectType('Drupal\Core\Config\Entity\ConfigEntityInterface'))) { + return null; + } + return $node->var; } } diff --git a/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php b/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php index 0f0ce543e..685e95401 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php @@ -9,6 +9,7 @@ use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Identifier; +use PHPStan\Type\ObjectType; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -57,6 +58,7 @@ public function refactor(Node $node): ?Node if ($item->value instanceof MethodCall && $item->value->name instanceof Identifier && in_array($item->value->name->toString(), self::DEPRECATED_METHODS, true) + && $this->isObjectType($item->value->var, new ObjectType('Drupal\views\Plugin\views\cache\CachePluginBase')) ) { $modified = true; continue; diff --git a/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector.php b/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector.php index e3140f1f6..520e59193 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector.php @@ -12,6 +12,7 @@ use PhpParser\Node\Expr\NullsafePropertyFetch; use PhpParser\Node\Expr\PropertyFetch; use PhpParser\Node\Expr\Variable; +use PHPStan\Type\ObjectType; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -36,7 +37,10 @@ public function refactor(Node $node): mixed // Step 1a: $entity->original → $entity->getOriginal() // (skip $this->original — non-entity classes have a legitimate $original property) if ($node instanceof PropertyFetch) { - if ($this->isName($node->name, 'original') && !$this->isThisVar($node->var)) { + if ($this->isName($node->name, 'original') + && !$this->isThisVar($node->var) + && $this->isObjectType($node->var, new ObjectType('Drupal\Core\Entity\EntityInterface')) + ) { return new MethodCall($node->var, 'getOriginal'); } @@ -45,7 +49,10 @@ public function refactor(Node $node): mixed // Step 1b: $entity?->original → $entity?->getOriginal() if ($node instanceof NullsafePropertyFetch) { - if ($this->isName($node->name, 'original') && !$this->isThisVar($node->var)) { + if ($this->isName($node->name, 'original') + && !$this->isThisVar($node->var) + && $this->isObjectType($node->var, new ObjectType('Drupal\Core\Entity\EntityInterface')) + ) { return new NullsafeMethodCall($node->var, 'getOriginal'); } diff --git a/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector.php b/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector.php index f92195c32..e90578ff7 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector.php @@ -5,6 +5,7 @@ namespace DrupalRector\Drupal11\Rector\Deprecation; use PhpParser\Node; +use PHPStan\Type\ObjectType; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -44,6 +45,10 @@ public function refactor(Node $node): mixed return null; } + if (!$this->isObjectType($node->var, new ObjectType('Drupal\node\NodeTypeInterface'))) { + return null; + } + if (count($node->args) !== 1) { return null; } diff --git a/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector.php b/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector.php index e4f7720f9..c4cafa951 100644 --- a/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector.php +++ b/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector.php @@ -5,6 +5,7 @@ namespace DrupalRector\Drupal11\Rector\Deprecation; use PhpParser\Node; +use PHPStan\Type\ObjectType; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -31,11 +32,8 @@ public function refactor(Node $node): ?Node return null; } - // Skip PDO's native fetchColumn() called on $this->clientStatement. - if ($node->var instanceof Node\Expr\PropertyFetch) { - if ($this->getName($node->var->name) === 'clientStatement') { - return null; - } + if (!$this->isObjectType($node->var, new ObjectType('Drupal\Core\Database\StatementPrefetchIterator'))) { + return null; } $node->name = new Node\Identifier('fetchField'); diff --git a/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector.php b/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector.php index f38b588cc..2d521473f 100644 --- a/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector.php +++ b/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector.php @@ -5,6 +5,7 @@ namespace DrupalRector\Drupal11\Rector\Deprecation; use PhpParser\Node; +use PHPStan\Type\ObjectType; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -23,7 +24,12 @@ */ final class UseEntityTypeHasIntegerIdRector extends AbstractRector { - private const SIMPLE_METHODS = ['entityTypeSupportsComments', 'hasIntegerId']; + private const METHOD_OWNER_CLASS = [ + 'entityTypeSupportsComments' => 'Drupal\comment\CommentTypeForm', + 'hasIntegerId' => 'Drupal\layout_builder\Plugin\SectionStorage\OverridesSectionStorage', + ]; + + private const GET_ENTITY_TYPE_ID_KEY_TYPE_CLASS = 'Drupal\Core\Entity\Routing\DefaultHtmlRouteProvider'; public function getNodeTypes(): array { @@ -53,6 +59,10 @@ private function refactorIdentical(Node\Expr\BinaryOp\Identical $node): ?Node return null; } + if (!$this->isObjectType($methodCall->var, new ObjectType(self::GET_ENTITY_TYPE_ID_KEY_TYPE_CLASS))) { + return null; + } + if ($string->value !== 'integer' || count($methodCall->args) !== 1) { return null; } @@ -67,7 +77,11 @@ private function refactorMethodCall(Node\Expr\MethodCall $node): ?Node } $name = $this->getName($node->name); - if ($name === null || !in_array($name, self::SIMPLE_METHODS, true)) { + if ($name === null || !isset(self::METHOD_OWNER_CLASS[$name])) { + return null; + } + + if (!$this->isObjectType($node->var, new ObjectType(self::METHOD_OWNER_CLASS[$name]))) { return null; } diff --git a/stubs/Drupal/Component/Plugin/PluginBase.php b/stubs/Drupal/Component/Plugin/PluginBase.php new file mode 100644 index 000000000..08835d779 --- /dev/null +++ b/stubs/Drupal/Component/Plugin/PluginBase.php @@ -0,0 +1,11 @@ +rebuildThemeData(); diff --git a/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture/basic.php.inc index c2c3debbf..01aad453e 100644 --- a/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture/basic.php.inc @@ -1,6 +1,8 @@ isConfigurable()) { // handle configurable @@ -11,7 +13,9 @@ class MyPlugin { ----- isConfigurable()) { return; @@ -12,7 +14,9 @@ class MyPlugin { ----- isConfigurable() must NOT be changed. +class UnrelatedPlugin { + public function doSomething(): void { + if ($this->isConfigurable()) { + // handle configurable + } + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector/fixture/basic.php.inc index 49502bdc2..afe1e033f 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector/fixture/basic.php.inc @@ -1,17 +1,23 @@ save(TRUE); $config->save(FALSE); $config->save(); + +// Untyped — must not be changed. $other->save(TRUE); ?> ----- save(); $config->save(); $config->save(); -$other->save(); + +// Untyped — must not be changed. +$other->save(TRUE); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/fixture/basic.php.inc index 442c9bb30..b43bd2ab7 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/fixture/basic.php.inc @@ -1,5 +1,6 @@ setUriCallback('my_entity_uri'); $entity_types['other']->setUriCallback('other_uri')->setLabel('Other'); $other->someMethod(); diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/fixture/deep_chain.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/fixture/deep_chain.php.inc index 8248cf825..81e85daa1 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/fixture/deep_chain.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/fixture/deep_chain.php.inc @@ -1,6 +1,7 @@ setUriCallback()->setY() +/** @var \Drupal\Core\Entity\EntityTypeInterface[] $entity_types */ $entity_types['my_entity']->setLinkTemplate('canonical', '/my-entity/{my_entity}')->setUriCallback('my_entity_uri')->setLabel('My Entity'); ?> @@ -8,6 +9,7 @@ $entity_types['my_entity']->setLinkTemplate('canonical', '/my-entity/{my_entity} setUriCallback()->setY() +/** @var \Drupal\Core\Entity\EntityTypeInterface[] $entity_types */ $entity_types['my_entity']->setLinkTemplate('canonical', '/my-entity/{my_entity}')->setLabel('My Entity'); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/fixture/extends_implementing_class.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/fixture/extends_implementing_class.php.inc new file mode 100644 index 000000000..42e240d21 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/fixture/extends_implementing_class.php.inc @@ -0,0 +1,22 @@ +setUriCallback('my_entity_uri'); + +?> +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/fixture/no_type_guard.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/fixture/no_type_guard.php.inc index 257be2a8b..6a442992a 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/fixture/no_type_guard.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/fixture/no_type_guard.php.inc @@ -1,18 +1,5 @@ setUriCallback('my_entity_uri'); -// No type guard: the call above is still removed even though the receiver is -// not an EntityTypeInterface instance. The method name is unique in Drupal core -// so false positives are extremely unlikely. $unrelated_object->someOtherMethod(); - -?> ------ -someOtherMethod(); - -?> diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/fixture/assigned_result.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/fixture/assigned_result.php.inc index 44d20684f..a1af672cc 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/fixture/assigned_result.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/fixture/assigned_result.php.inc @@ -1,6 +1,7 @@ trustData(); ?> @@ -8,6 +9,7 @@ $entity2 = $entity->trustData(); diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/fixture/basic.php.inc index e36101141..96f5130b1 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/fixture/basic.php.inc @@ -1,5 +1,6 @@ trustData()->save(); $other->someMethod(); @@ -7,6 +8,7 @@ $other->someMethod(); ----- save(); $other->someMethod(); diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/fixture/standalone_statement.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/fixture/standalone_statement.php.inc index 97d446cda..31c1ff8dc 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/fixture/standalone_statement.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/fixture/standalone_statement.php.inc @@ -1,6 +1,7 @@ trustData(); ?> @@ -8,6 +9,7 @@ $entity->trustData(); diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/basic.php.inc index 563e0aea3..45c7838b4 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/basic.php.inc @@ -1,5 +1,6 @@ [ 'keys' => $cache_plugin->getRowCacheKeys($row), @@ -12,6 +13,7 @@ $data = [ ----- [ 'tags' => $cache_plugin->getRowCacheTags($row), diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/both_deprecated_calls.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/both_deprecated_calls.php.inc index eb72dab83..1eced7f10 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/both_deprecated_calls.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/both_deprecated_calls.php.inc @@ -1,6 +1,7 @@ [ 'keys' => $cache_plugin->getRowCacheKeys($row), @@ -14,6 +15,7 @@ $data = [ [ 'tags' => $cache_plugin->getRowCacheTags($row), diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/get_row_id.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/get_row_id.php.inc index 5c8d9225f..99de8044e 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/get_row_id.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/get_row_id.php.inc @@ -1,6 +1,7 @@ [ 'keys' => $cache_plugin->getRowId($row), @@ -14,6 +15,7 @@ $data = [ [ 'tags' => $cache_plugin->getRowCacheTags($row), diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/no_change_unrelated_class.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/no_change_unrelated_class.php.inc index de65b2454..70b0e03f2 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/no_change_unrelated_class.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/no_change_unrelated_class.php.inc @@ -1,17 +1,10 @@ [ + 'keys' => $unrelated->getRowCacheKeys($row), + 'id' => $unrelated->getRowId($row), + ], +]; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/basic.php.inc index 4fbc38f2f..6cee6ba9e 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/basic.php.inc @@ -1,5 +1,6 @@ original; $entity->original = $unchanged; $field = $entity->other_property; @@ -8,6 +9,7 @@ $field = $entity->other_property; ----- getOriginal(); $entity->setOriginal($unchanged); $field = $entity->other_property; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/chain.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/chain.php.inc index 48d975e77..23134a970 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/chain.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/chain.php.inc @@ -1,11 +1,13 @@ original->id(); ?> ----- getOriginal()->id(); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/nullsafe.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/nullsafe.php.inc index 0164b77eb..aa8114d1b 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/nullsafe.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/nullsafe.php.inc @@ -1,11 +1,13 @@ original?->id(); ?> ----- getOriginal()?->id(); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/write_complex_rhs.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/write_complex_rhs.php.inc index 27f979160..315b27d2d 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/write_complex_rhs.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/write_complex_rhs.php.inc @@ -1,11 +1,13 @@ original = $storage->load($entity->id()); ?> ----- setOriginal($storage->load($entity->id())); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/fixture/basic.php.inc index 914c8240b..7ba1a7f12 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/fixture/basic.php.inc @@ -1,5 +1,6 @@ setPreviewMode(DRUPAL_DISABLED); $nodeType->setPreviewMode(DRUPAL_OPTIONAL); $nodeType->setPreviewMode(DRUPAL_REQUIRED); @@ -11,6 +12,7 @@ $nodeType->setPreviewMode(2); ----- setPreviewMode(\Drupal\node\NodePreviewMode::Disabled); $nodeType->setPreviewMode(\Drupal\node\NodePreviewMode::Optional); $nodeType->setPreviewMode(\Drupal\node\NodePreviewMode::Required); diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/fixture/no_type_guard.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/fixture/no_type_guard.php.inc index b4b810ca2..df8770891 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/fixture/no_type_guard.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/fixture/no_type_guard.php.inc @@ -1,15 +1,5 @@ setPreviewMode(DRUPAL_DISABLED); $anyObject->setPreviewMode(1); - -?> ------ -setPreviewMode(\Drupal\node\NodePreviewMode::Disabled); -$anyObject->setPreviewMode(\Drupal\node\NodePreviewMode::Optional); - -?> diff --git a/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture/basic.php.inc index 7604fd5e8..4f02acb64 100644 --- a/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture/basic.php.inc @@ -1,7 +1,9 @@ fetchColumn(0); $other = $this->clientStatement->fetchColumn(0); } @@ -10,8 +12,10 @@ class MyClass { ----- fetchField(0); $other = $this->clientStatement->fetchColumn(0); } diff --git a/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture/chained_call.php.inc b/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture/chained_call.php.inc index 9115e2273..c017e79c7 100644 --- a/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture/chained_call.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture/chained_call.php.inc @@ -1,15 +1,6 @@ query('SELECT name FROM {users}')->fetchColumn(); $id = $connection->select('node', 'n')->fetchColumn(1); - -?> ------ -query('SELECT name FROM {users}')->fetchField(); -$id = $connection->select('node', 'n')->fetchField(1); - -?> diff --git a/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture/no_arg.php.inc b/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture/no_arg.php.inc index dca281f30..004b1459c 100644 --- a/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture/no_arg.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture/no_arg.php.inc @@ -1,6 +1,7 @@ fetchColumn(); ?> @@ -8,6 +9,7 @@ $result = $statement->fetchColumn(); fetchField(); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture/property_not_client_statement.php.inc b/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture/property_not_client_statement.php.inc index 0ef393e12..b73ba491c 100644 --- a/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture/property_not_client_statement.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture/property_not_client_statement.php.inc @@ -1,15 +1,33 @@ statement->fetchColumn(0); -$result2 = $this->stmt->fetchColumn(2); +use Drupal\Core\Database\StatementPrefetchIterator; + +// Typed property of type StatementPrefetchIterator IS transformed. +class MyClass { + public StatementPrefetchIterator $statement; + public StatementPrefetchIterator $stmt; + + public function example(): void { + $result = $this->statement->fetchColumn(0); + $result2 = $this->stmt->fetchColumn(2); + } +} ?> ----- statement->fetchField(0); -$result2 = $this->stmt->fetchField(2); +use Drupal\Core\Database\StatementPrefetchIterator; + +// Typed property of type StatementPrefetchIterator IS transformed. +class MyClass { + public StatementPrefetchIterator $statement; + public StatementPrefetchIterator $stmt; + + public function example(): void { + $result = $this->statement->fetchField(0); + $result2 = $this->stmt->fetchField(2); + } +} ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/basic.php.inc index 09789e450..51af238d7 100644 --- a/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/basic.php.inc @@ -1,19 +1,27 @@ getEntityTypeIdKeyType($entity_type) === 'integer') { - $result = 'integer'; +use Drupal\Core\Entity\Routing\DefaultHtmlRouteProvider; + +class MyRouteProvider extends DefaultHtmlRouteProvider { + public function doSomething($entity_type): void { + if ($this->getEntityTypeIdKeyType($entity_type) === 'integer') { + $result = 'integer'; + } + } } -$a = $this->entityTypeSupportsComments($entity_type); -$b = $this->hasIntegerId($entity_type); ?> ----- hasIntegerId()) { - $result = 'integer'; +use Drupal\Core\Entity\Routing\DefaultHtmlRouteProvider; + +class MyRouteProvider extends DefaultHtmlRouteProvider { + public function doSomething($entity_type): void { + if ($entity_type->hasIntegerId()) { + $result = 'integer'; + } + } } -$a = $entity_type->hasIntegerId(); -$b = $entity_type->hasIntegerId(); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/entity_type_supports_comments.php.inc b/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/entity_type_supports_comments.php.inc new file mode 100644 index 000000000..4cb1ea56a --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/entity_type_supports_comments.php.inc @@ -0,0 +1,23 @@ +entityTypeSupportsComments($entity_type); + } +} + +?> +----- +hasIntegerId(); + } +} + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/has_integer_id_helper.php.inc b/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/has_integer_id_helper.php.inc new file mode 100644 index 000000000..e359d4909 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/has_integer_id_helper.php.inc @@ -0,0 +1,23 @@ +hasIntegerId($entity_type); + } +} + +?> +----- +hasIntegerId(); + } +} + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/no_change.php.inc b/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/no_change.php.inc index a3cb40340..46370aeb6 100644 --- a/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/no_change.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/no_change.php.inc @@ -1,8 +1,14 @@ getEntityTypeIdKeyType($entity_type) === 'string') { - $result = 'string'; +use Drupal\Core\Entity\Routing\DefaultHtmlRouteProvider; + +class MyRouteProvider extends DefaultHtmlRouteProvider { + public function doSomething($entity_type): void { + if ($this->getEntityTypeIdKeyType($entity_type) === 'string') { + $result = 'string'; + } + } } // Not called on $this: no transformation. @@ -12,22 +18,3 @@ if ($other->getEntityTypeIdKeyType($entity_type) === 'integer') { // entityTypeSupportsComments without $this: no transformation. $a = $other->entityTypeSupportsComments($entity_type); - -?> ------ -getEntityTypeIdKeyType($entity_type) === 'string') { - $result = 'string'; -} - -// Not called on $this: no transformation. -if ($other->getEntityTypeIdKeyType($entity_type) === 'integer') { - $result = 'other'; -} - -// entityTypeSupportsComments without $this: no transformation. -$a = $other->entityTypeSupportsComments($entity_type); - -?> diff --git a/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/no_change_unrelated_class.php.inc b/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/no_change_unrelated_class.php.inc new file mode 100644 index 000000000..6fa444196 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/no_change_unrelated_class.php.inc @@ -0,0 +1,10 @@ +entityTypeSupportsComments($entity_type); + $b = $this->hasIntegerId($entity_type); + if ($this->getEntityTypeIdKeyType($entity_type) === 'integer') {} + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/string_reversed.php.inc b/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/string_reversed.php.inc index 0ede4e487..55174ce0a 100644 --- a/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/string_reversed.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/string_reversed.php.inc @@ -1,17 +1,29 @@ getEntityTypeIdKeyType($entity_type)) { - $result = 'integer'; +class MyRouteProvider extends DefaultHtmlRouteProvider { + public function doSomething($entity_type): void { + if ('integer' === $this->getEntityTypeIdKeyType($entity_type)) { + $result = 'integer'; + } + } } ?> ----- hasIntegerId()) { - $result = 'integer'; +class MyRouteProvider extends DefaultHtmlRouteProvider { + public function doSomething($entity_type): void { + if ($entity_type->hasIntegerId()) { + $result = 'integer'; + } + } } ?> From 119bf3f1696012a91cf710387179605d7120ade4 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 1 May 2026 15:49:35 +0200 Subject: [PATCH 086/256] build: fix codestyle --- .../Rector/Deprecation/UseEntityTypeHasIntegerIdRector.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector.php b/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector.php index 2d521473f..96a35425d 100644 --- a/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector.php +++ b/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector.php @@ -26,7 +26,7 @@ final class UseEntityTypeHasIntegerIdRector extends AbstractRector { private const METHOD_OWNER_CLASS = [ 'entityTypeSupportsComments' => 'Drupal\comment\CommentTypeForm', - 'hasIntegerId' => 'Drupal\layout_builder\Plugin\SectionStorage\OverridesSectionStorage', + 'hasIntegerId' => 'Drupal\layout_builder\Plugin\SectionStorage\OverridesSectionStorage', ]; private const GET_ENTITY_TYPE_ID_KEY_TYPE_CLASS = 'Drupal\Core\Entity\Routing\DefaultHtmlRouteProvider'; From e12741ef640e72c0429c3d8a8835e5dc9c113579 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 1 May 2026 16:31:09 +0200 Subject: [PATCH 087/256] feat: remove references to rector 1 --- .github/workflows/phpstan.yml | 3 - .github/workflows/phpunit.yml | 2 - composer.json | 16 +-- phpstan-1-baseline.neon | 189 ---------------------------------- phpstan-1.neon | 10 -- 5 files changed, 8 insertions(+), 212 deletions(-) delete mode 100644 phpstan-1-baseline.neon delete mode 100644 phpstan-1.neon diff --git a/.github/workflows/phpstan.yml b/.github/workflows/phpstan.yml index 7621b1aee..83da2934d 100644 --- a/.github/workflows/phpstan.yml +++ b/.github/workflows/phpstan.yml @@ -19,9 +19,6 @@ jobs: strategy: matrix: include: - - php-version: "8.2" - rector: "^1" - phpstan-config: phpstan-1.neon - php-version: "8.2" rector: "^2" phpstan-config: phpstan.neon diff --git a/.github/workflows/phpunit.yml b/.github/workflows/phpunit.yml index 4246e0ecc..cf126c487 100644 --- a/.github/workflows/phpunit.yml +++ b/.github/workflows/phpunit.yml @@ -18,8 +18,6 @@ jobs: strategy: matrix: include: - - php-version: "8.2" - rector: "^1" - php-version: "8.2" rector: "^2" steps: diff --git a/composer.json b/composer.json index 996ac1599..7c33b2960 100644 --- a/composer.json +++ b/composer.json @@ -9,7 +9,7 @@ "ast" ], "require": { - "rector/rector": "^1 || ^2", + "rector/rector": "^2", "webflo/drupal-finder": "^1.2" }, "license": "MIT", @@ -74,14 +74,14 @@ }, "require-dev": { "php": "^8.2", - "cweagans/composer-patches": "^1.7.2", - "friendsofphp/php-cs-fixer": "^3.58", + "cweagans/composer-patches": "^2.0", + "friendsofphp/php-cs-fixer": "^3.95.1", "phpstan/extension-installer": "^1.4.3", - "phpstan/phpstan": "^1.12 || ^2.0", - "phpstan/phpstan-deprecation-rules": "^1.2 || ^2.0", - "phpunit/phpunit": "^10.0", - "symfony/yaml": "^5 || ^6 || ^7", - "symplify/vendor-patches": "^11.0" + "phpstan/phpstan": "^2.1.54", + "phpstan/phpstan-deprecation-rules": "^2.0.4", + "phpunit/phpunit": "^12.5.24", + "symfony/yaml": "^5 || ^6 || ^7.4.8", + "symplify/vendor-patches": "^12.0.6" }, "scripts": { "docs": "composer remove friendsofphp/php-cs-fixer --dev && composer require symplify/rule-doc-generator --dev && vendor/bin/rule-doc-generator generate src/ --categorize=3 && composer remove symplify/rule-doc-generator --dev && composer require friendsofphp/php-cs-fixer --dev", diff --git a/phpstan-1-baseline.neon b/phpstan-1-baseline.neon deleted file mode 100644 index 3e6d9e915..000000000 --- a/phpstan-1-baseline.neon +++ /dev/null @@ -1,189 +0,0 @@ -parameters: - ignoreErrors: - - - message: """ - #^Call to deprecated method locateRoot\\(\\) of class DrupalFinder\\\\DrupalFinder\\: - Will be removed in v2\\. Future usage should instantiate - a new DrupalFinder object by passing the starting path to its - constructor\\.$# - """ - count: 1 - path: config/drupal-phpunit-bootstrap-file.php - - - - message: "#^Function drupal_phpunit_contrib_extension_directory_roots\\(\\) return type has no value type specified in iterable type array\\.$#" - count: 1 - path: config/drupal-phpunit-bootstrap-file.php - - - - message: "#^Function drupal_phpunit_find_extension_directories\\(\\) return type has no value type specified in iterable type array\\.$#" - count: 1 - path: config/drupal-phpunit-bootstrap-file.php - - - - message: "#^Function drupal_phpunit_get_extension_namespaces\\(\\) has parameter \\$dirs with no value type specified in iterable type array\\.$#" - count: 1 - path: config/drupal-phpunit-bootstrap-file.php - - - - message: "#^Function drupal_phpunit_get_extension_namespaces\\(\\) return type has no value type specified in iterable type array\\.$#" - count: 1 - path: config/drupal-phpunit-bootstrap-file.php - - - - message: "#^Function drupal_phpunit_populate_class_loader\\(\\) has no return type specified\\.$#" - count: 1 - path: config/drupal-phpunit-bootstrap-file.php - - - - message: "#^Function drupal_phpunit_populate_class_loader\\(\\) has parameter \\$drupalRoot with no type specified\\.$#" - count: 1 - path: config/drupal-phpunit-bootstrap-file.php - - - - message: "#^Function drupal_phpunit_populate_class_loader\\(\\) has parameter \\$vendorRoot with no type specified\\.$#" - count: 1 - path: config/drupal-phpunit-bootstrap-file.php - - - - message: """ - #^Instantiation of deprecated class DrupalFinder\\\\DrupalFinder\\: - in drupal\\-finder\\:1\\.3\\.0 and is removed from drupal\\-finder\\:2\\.0\\.0\\. - Use \\\\DrupalFinder\\\\DrupalFinderComposerRuntime instead\\.$# - """ - count: 1 - path: config/drupal-phpunit-bootstrap-file.php - - - - message: """ - #^Call to deprecated method locateRoot\\(\\) of class DrupalFinder\\\\DrupalFinder\\: - Will be removed in v2\\. Future usage should instantiate - a new DrupalFinder object by passing the starting path to its - constructor\\.$# - """ - count: 1 - path: rector.php - - - - message: """ - #^Instantiation of deprecated class DrupalFinder\\\\DrupalFinder\\: - in drupal\\-finder\\:1\\.3\\.0 and is removed from drupal\\-finder\\:2\\.0\\.0\\. - Use \\\\DrupalFinder\\\\DrupalFinderComposerRuntime instead\\.$# - """ - count: 1 - path: rector.php - - - - message: """ - #^Instantiation of deprecated class PhpParser\\\\Node\\\\Expr\\\\ArrayItem\\: - use \\\\PhpParser\\\\Node\\\\ArrayItem instead\\.$# - """ - count: 1 - path: src/Drupal10/Rector/Deprecation/WatchdogExceptionRector.php - - - - message: "#^Access to an undefined property PhpParser\\\\Node\\\\Expr\\:\\:\\$value\\.$#" - count: 2 - path: src/Drupal8/Rector/Deprecation/DBRector.php - - - - message: "#^Call to an undefined method PHPStan\\\\Type\\\\Type\\:\\:getValue\\(\\)\\.$#" - count: 1 - path: src/Drupal8/Rector/Deprecation/DrupalSetMessageRector.php - - - - message: "#^Access to an undefined property PhpParser\\\\Node\\\\Expr\\:\\:\\$expr\\.$#" - count: 1 - path: src/Drupal8/Rector/Deprecation/EntityLoadRector.php - - - - message: "#^Access to an undefined property PhpParser\\\\Node\\\\Expr\\:\\:\\$expr\\.$#" - count: 2 - path: src/Drupal8/Rector/Deprecation/EntityManagerRector.php - - - - message: "#^Access to an undefined property PhpParser\\\\Node\\\\Expr\\:\\:\\$name\\.$#" - count: 3 - path: src/Drupal8/Rector/Deprecation/EntityManagerRector.php - - - - message: "#^Method DrupalRector\\\\Drupal8\\\\Rector\\\\Deprecation\\\\EntityManagerRector\\:\\:getServiceByMethodName\\(\\) has no return type specified\\.$#" - count: 1 - path: src/Drupal8/Rector/Deprecation/EntityManagerRector.php - - - - message: "#^PHPDoc tag @param references unknown parameter\\: \\$node$#" - count: 1 - path: src/Drupal8/Rector/Deprecation/EntityManagerRector.php - - - - message: "#^Parameter \\#1 \\$assign of method DrupalRector\\\\Drupal8\\\\Rector\\\\Deprecation\\\\EntityManagerRector\\:\\:findInstanceByNameInAssign\\(\\) expects PhpParser\\\\Node\\\\Expr\\\\Assign, PhpParser\\\\Node\\\\Expr given\\.$#" - count: 1 - path: src/Drupal8/Rector/Deprecation/EntityManagerRector.php - - - - message: "#^Parameter \\#1 \\$assign of method DrupalRector\\\\Drupal8\\\\Rector\\\\Deprecation\\\\EntityManagerRector\\:\\:replaceInstanceByNameInAssign\\(\\) expects PhpParser\\\\Node\\\\Expr\\\\Assign, PhpParser\\\\Node\\\\Expr given\\.$#" - count: 1 - path: src/Drupal8/Rector/Deprecation/EntityManagerRector.php - - - - message: "#^Parameter \\#1 \\$expr of method DrupalRector\\\\Drupal8\\\\Rector\\\\Deprecation\\\\EntityManagerRector\\:\\:refactorExpression\\(\\) expects PhpParser\\\\Node\\\\Expr\\\\MethodCall\\|PhpParser\\\\Node\\\\Expr\\\\StaticCall, PhpParser\\\\Node given\\.$#" - count: 1 - path: src/Drupal8/Rector/Deprecation/EntityManagerRector.php - - - - message: "#^Parameter \\#1 \\$expr of method DrupalRector\\\\Drupal8\\\\Rector\\\\Deprecation\\\\EntityManagerRector\\:\\:refactorExpression\\(\\) expects PhpParser\\\\Node\\\\Expr\\\\MethodCall\\|PhpParser\\\\Node\\\\Expr\\\\StaticCall, PhpParser\\\\Node\\\\Expr given\\.$#" - count: 1 - path: src/Drupal8/Rector/Deprecation/EntityManagerRector.php - - - - message: "#^Property PhpParser\\\\Node\\\\Expr\\\\Assign\\:\\:\\$expr \\(PhpParser\\\\Node\\\\Expr\\) does not accept PhpParser\\\\Node\\.$#" - count: 1 - path: src/Drupal8/Rector/Deprecation/EntityManagerRector.php - - - - message: "#^Calling PHPStan\\\\Php\\\\PhpVersionFactory\\:\\:create\\(\\) is not covered by backward compatibility promise\\. The method might change in a minor PHPStan version\\.$#" - count: 1 - path: src/Drupal8/Rector/Deprecation/FunctionalTestDefaultThemePropertyRector.php - - - - message: "#^Method PHPStan\\\\Type\\\\Type\\:\\:isSmallerThanOrEqual\\(\\) invoked with 2 parameters, 1 required\\.$#" - count: 1 - path: src/Drupal8/Rector/Deprecation/FunctionalTestDefaultThemePropertyRector.php - - - - message: """ - #^Instantiation of deprecated class PhpParser\\\\Node\\\\Scalar\\\\Encapsed\\: - use \\\\PhpParser\\\\Node\\\\Scalar\\\\InterpolatedString instead\\.$# - """ - count: 1 - path: src/Drupal9/Rector/Deprecation/AssertNoUniqueTextRector.php - - - - message: """ - #^Instantiation of deprecated class PhpParser\\\\Node\\\\Scalar\\\\EncapsedStringPart\\: - use \\\\PhpParser\\\\Node\\\\InterpolatedStringPart instead\\.$# - """ - count: 3 - path: src/Drupal9/Rector/Deprecation/AssertNoUniqueTextRector.php - - - - message: """ - #^Instantiation of deprecated class PhpParser\\\\Node\\\\Scalar\\\\LNumber\\: - use \\\\PhpParser\\\\Node\\\\Scalar\\\\Int_ instead\\.$# - """ - count: 1 - path: src/Drupal9/Rector/Deprecation/AssertNoUniqueTextRector.php - - - - message: "#^Call to an undefined method PHPStan\\\\Type\\\\Type\\:\\:getValue\\(\\)\\.$#" - count: 1 - path: src/Drupal9/Rector/Deprecation/ExtensionPathRector.php - - - - message: """ - #^Instantiation of deprecated class PhpParser\\\\Node\\\\Stmt\\\\UseUse\\: - use \\\\PhpParser\\\\Node\\\\UseItem instead\\.$# - """ - count: 1 - path: src/Rector/Convert/HookConvertRector.php diff --git a/phpstan-1.neon b/phpstan-1.neon deleted file mode 100644 index 81cb4d365..000000000 --- a/phpstan-1.neon +++ /dev/null @@ -1,10 +0,0 @@ -parameters: - level: 6 - paths: - - config - - src - - rector.php - dynamicConstantNames: - - Drupal::VERSION -includes: - - phpstan-1-baseline.neon From a0c027b13970d94524aa794281d7ee2e45d78375 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 1 May 2026 16:56:07 +0200 Subject: [PATCH 088/256] chore: update unit tests to new phpunit --- .github/workflows/codestyle.yml | 2 +- .../workflows/functional_test__rector_examples.yml | 2 +- .github/workflows/phpstan.yml | 8 ++------ .github/workflows/phpunit.yml | 2 +- .../ActionAnnotationToAttributeRectorTest.php | 7 ++----- ...tibilityActionAnnotationToAttributeRectorTest.php | 7 ++----- .../SystemTimeZonesRectorTest.php | 7 ++----- .../VersionedFunctionToServiceRectorTest.php | 7 ++----- .../WatchdogExceptionRectorTest.php | 7 ++----- .../DrupalSetMessageRectorTest.php | 7 ++----- .../EntityDeleteMultipleRectorTest.php | 7 ++----- .../EntityManagerRector/EntityManagerRectorTest.php | 7 ++----- .../EntityViewRector/EntityViewRectorTest.php | 7 ++----- .../FunctionalTestDefaultThemePropertyRectorTest.php | 4 +--- .../Deprecation/GetMockRector/GetMockRectorTest.php | 4 +--- .../AssertFieldByIdRectorTest.php | 7 ++----- .../AssertFieldByNameRectorTest.php | 7 ++----- .../AssertLegacyTraitRectorTest.php | 7 ++----- .../AssertNoFieldByNameRectorTest.php | 7 ++----- .../AssertNoUniqueTextRector.php | 12 +++++++----- .../ExtensionPathRector/ExtensionPathRectorTest.php | 7 ++----- .../FileFunctionRector/FileFunctionRectorTest.php | 7 ++----- .../FileUrlGeneratorRectorTest.php | 7 ++----- .../ModuleLoadRector/ModuleLoadRectorTest.php | 7 ++----- .../Rector/Deprecation/PassRector/PassRectorTest.php | 7 ++----- .../SystemSortByInfoNameRectorTest.php | 7 ++----- .../TaxonomyRectorCollectionTest.php | 7 ++----- .../UiHelperTraitDrupalPostFormRectorTest.php | 7 ++----- .../UserPasswordRector/UserPasswordRectorTest.php | 7 ++----- .../ProtectedStaticModulesPropertyRectorTest.php | 4 +--- .../ConstantToClassConstantRectorTest.php | 7 ++----- .../ConstantToClassConstantRectorTest.php | 7 ++----- .../DeprecationHelperRemoveRectorTest.php | 7 ++----- .../FunctionToServiceRectorTest.php | 7 ++----- .../FunctionToStaticRectorTest.php | 7 ++----- .../MethodToMethodWithCheckRectorTest.php | 7 ++----- .../ShouldCallParentMethodsRectorTest.php | 7 ++----- 37 files changed, 73 insertions(+), 168 deletions(-) diff --git a/.github/workflows/codestyle.yml b/.github/workflows/codestyle.yml index 08d499ac1..0c5d340e1 100644 --- a/.github/workflows/codestyle.yml +++ b/.github/workflows/codestyle.yml @@ -15,7 +15,7 @@ jobs: - uses: actions/checkout@v3 - uses: shivammathur/setup-php@v2 with: - php-version: 8.2 + php-version: 8.3 coverage: none # disable xdebug, pcov tools: composer:v2 extensions: zip diff --git a/.github/workflows/functional_test__rector_examples.yml b/.github/workflows/functional_test__rector_examples.yml index 83cdf522a..aa266e4c4 100644 --- a/.github/workflows/functional_test__rector_examples.yml +++ b/.github/workflows/functional_test__rector_examples.yml @@ -19,7 +19,7 @@ jobs: fail-fast: false matrix: include: - - php-version: "8.2" + - php-version: "8.3" drupal: "^10.0" fixture: "d10" - php-version: "8.4" diff --git a/.github/workflows/phpstan.yml b/.github/workflows/phpstan.yml index 83da2934d..f4b1a7074 100644 --- a/.github/workflows/phpstan.yml +++ b/.github/workflows/phpstan.yml @@ -19,21 +19,17 @@ jobs: strategy: matrix: include: - - php-version: "8.2" + - php-version: "8.3" rector: "^2" phpstan-config: phpstan.neon steps: - uses: actions/checkout@v3 - uses: shivammathur/setup-php@v2 with: - php-version: 8.2 + php-version: 8.3 coverage: none # disable xdebug, pcov tools: composer:v2 extensions: dom, curl, libxml, mbstring, zip, pdo, mysql, pdo_mysql, bcmath, gd, exif, iconv - # Uncomment to enable SSH access to Github Actions - https://github.com/marketplace/actions/debugging-with-tmate#getting-started - # - name: Debugging with tmate - # uses: mxschmitt/action-tmate@v2 - # END: SHARED SETUP - run: composer require rector/rector:${{ matrix.rector }} --dev - run: vendor/bin/phpstan analyse -c ${{ matrix.phpstan-config }} diff --git a/.github/workflows/phpunit.yml b/.github/workflows/phpunit.yml index cf126c487..5c63a15d9 100644 --- a/.github/workflows/phpunit.yml +++ b/.github/workflows/phpunit.yml @@ -18,7 +18,7 @@ jobs: strategy: matrix: include: - - php-version: "8.2" + - php-version: "8.3" rector: "^2" steps: - uses: actions/checkout@v3 diff --git a/tests/src/Drupal10/Rector/Deprecation/ActionAnnotationToAttributeRector/ActionAnnotationToAttributeRectorTest.php b/tests/src/Drupal10/Rector/Deprecation/ActionAnnotationToAttributeRector/ActionAnnotationToAttributeRectorTest.php index f29f94cff..d52a9b2de 100644 --- a/tests/src/Drupal10/Rector/Deprecation/ActionAnnotationToAttributeRector/ActionAnnotationToAttributeRectorTest.php +++ b/tests/src/Drupal10/Rector/Deprecation/ActionAnnotationToAttributeRector/ActionAnnotationToAttributeRectorTest.php @@ -7,13 +7,10 @@ use Iterator; use Rector\Testing\PHPUnit\AbstractRectorTestCase; +#[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class ActionAnnotationToAttributeRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal10/Rector/Deprecation/ActionAnnotationToAttributeRector/BackwardsCompatibilityActionAnnotationToAttributeRectorTest.php b/tests/src/Drupal10/Rector/Deprecation/ActionAnnotationToAttributeRector/BackwardsCompatibilityActionAnnotationToAttributeRectorTest.php index 194f05a8a..c751d7874 100644 --- a/tests/src/Drupal10/Rector/Deprecation/ActionAnnotationToAttributeRector/BackwardsCompatibilityActionAnnotationToAttributeRectorTest.php +++ b/tests/src/Drupal10/Rector/Deprecation/ActionAnnotationToAttributeRector/BackwardsCompatibilityActionAnnotationToAttributeRectorTest.php @@ -12,13 +12,10 @@ class Drupal public const VERSION = '11.0.x-dev'; } +#[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class BackwardsCompatibilityActionAnnotationToAttributeRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/SystemTimeZonesRectorTest.php b/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/SystemTimeZonesRectorTest.php index 04a0f300c..a655a8458 100644 --- a/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/SystemTimeZonesRectorTest.php +++ b/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/SystemTimeZonesRectorTest.php @@ -7,13 +7,10 @@ use Iterator; use Rector\Testing\PHPUnit\AbstractRectorTestCase; +#[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class SystemTimeZonesRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal10/Rector/Deprecation/VersionedFunctionToServiceRector/VersionedFunctionToServiceRectorTest.php b/tests/src/Drupal10/Rector/Deprecation/VersionedFunctionToServiceRector/VersionedFunctionToServiceRectorTest.php index 930edc550..dab8d0c0e 100644 --- a/tests/src/Drupal10/Rector/Deprecation/VersionedFunctionToServiceRector/VersionedFunctionToServiceRectorTest.php +++ b/tests/src/Drupal10/Rector/Deprecation/VersionedFunctionToServiceRector/VersionedFunctionToServiceRectorTest.php @@ -7,13 +7,10 @@ use Iterator; use Rector\Testing\PHPUnit\AbstractRectorTestCase; +#[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class VersionedFunctionToServiceRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal10/Rector/Deprecation/WatchdogExceptionRector/WatchdogExceptionRectorTest.php b/tests/src/Drupal10/Rector/Deprecation/WatchdogExceptionRector/WatchdogExceptionRectorTest.php index 33c6c3bca..66cfad5e5 100644 --- a/tests/src/Drupal10/Rector/Deprecation/WatchdogExceptionRector/WatchdogExceptionRectorTest.php +++ b/tests/src/Drupal10/Rector/Deprecation/WatchdogExceptionRector/WatchdogExceptionRectorTest.php @@ -7,13 +7,10 @@ use Iterator; use Rector\Testing\PHPUnit\AbstractRectorTestCase; +#[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class WatchdogExceptionRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal8/Rector/Deprecation/DrupalSetMessageRector/DrupalSetMessageRectorTest.php b/tests/src/Drupal8/Rector/Deprecation/DrupalSetMessageRector/DrupalSetMessageRectorTest.php index f1e76f52d..093f38aa9 100644 --- a/tests/src/Drupal8/Rector/Deprecation/DrupalSetMessageRector/DrupalSetMessageRectorTest.php +++ b/tests/src/Drupal8/Rector/Deprecation/DrupalSetMessageRector/DrupalSetMessageRectorTest.php @@ -7,13 +7,10 @@ use Iterator; use Rector\Testing\PHPUnit\AbstractRectorTestCase; +#[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class DrupalSetMessageRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal8/Rector/Deprecation/EntityDeleteMultipleRector/EntityDeleteMultipleRectorTest.php b/tests/src/Drupal8/Rector/Deprecation/EntityDeleteMultipleRector/EntityDeleteMultipleRectorTest.php index ee51d2116..cbbb3f1a7 100644 --- a/tests/src/Drupal8/Rector/Deprecation/EntityDeleteMultipleRector/EntityDeleteMultipleRectorTest.php +++ b/tests/src/Drupal8/Rector/Deprecation/EntityDeleteMultipleRector/EntityDeleteMultipleRectorTest.php @@ -7,13 +7,10 @@ use Iterator; use Rector\Testing\PHPUnit\AbstractRectorTestCase; +#[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class EntityDeleteMultipleRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal8/Rector/Deprecation/EntityManagerRector/EntityManagerRectorTest.php b/tests/src/Drupal8/Rector/Deprecation/EntityManagerRector/EntityManagerRectorTest.php index 7e85bc4ff..a5e3bb702 100644 --- a/tests/src/Drupal8/Rector/Deprecation/EntityManagerRector/EntityManagerRectorTest.php +++ b/tests/src/Drupal8/Rector/Deprecation/EntityManagerRector/EntityManagerRectorTest.php @@ -7,13 +7,10 @@ use Iterator; use Rector\Testing\PHPUnit\AbstractRectorTestCase; +#[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class EntityManagerRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal8/Rector/Deprecation/EntityViewRector/EntityViewRectorTest.php b/tests/src/Drupal8/Rector/Deprecation/EntityViewRector/EntityViewRectorTest.php index 2f5806d91..feaa57582 100644 --- a/tests/src/Drupal8/Rector/Deprecation/EntityViewRector/EntityViewRectorTest.php +++ b/tests/src/Drupal8/Rector/Deprecation/EntityViewRector/EntityViewRectorTest.php @@ -7,13 +7,10 @@ use Iterator; use Rector\Testing\PHPUnit\AbstractRectorTestCase; +#[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class EntityViewRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal8/Rector/Deprecation/FunctionalTestDefaultThemePropertyRector/FunctionalTestDefaultThemePropertyRectorTest.php b/tests/src/Drupal8/Rector/Deprecation/FunctionalTestDefaultThemePropertyRector/FunctionalTestDefaultThemePropertyRectorTest.php index 0bf8cea90..7c66485a9 100644 --- a/tests/src/Drupal8/Rector/Deprecation/FunctionalTestDefaultThemePropertyRector/FunctionalTestDefaultThemePropertyRectorTest.php +++ b/tests/src/Drupal8/Rector/Deprecation/FunctionalTestDefaultThemePropertyRector/FunctionalTestDefaultThemePropertyRectorTest.php @@ -9,9 +9,7 @@ final class FunctionalTestDefaultThemePropertyRectorTest extends AbstractRectorTestCase { - /** - * @dataProvider provideData() - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal8/Rector/Deprecation/GetMockRector/GetMockRectorTest.php b/tests/src/Drupal8/Rector/Deprecation/GetMockRector/GetMockRectorTest.php index a3e89fd77..56ec15b7a 100644 --- a/tests/src/Drupal8/Rector/Deprecation/GetMockRector/GetMockRectorTest.php +++ b/tests/src/Drupal8/Rector/Deprecation/GetMockRector/GetMockRectorTest.php @@ -9,9 +9,7 @@ class GetMockRectorTest extends AbstractRectorTestCase { - /** - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal9/Rector/Deprecation/AssertFieldByIdRector/AssertFieldByIdRectorTest.php b/tests/src/Drupal9/Rector/Deprecation/AssertFieldByIdRector/AssertFieldByIdRectorTest.php index 7ef7ff76d..36f5189f7 100644 --- a/tests/src/Drupal9/Rector/Deprecation/AssertFieldByIdRector/AssertFieldByIdRectorTest.php +++ b/tests/src/Drupal9/Rector/Deprecation/AssertFieldByIdRector/AssertFieldByIdRectorTest.php @@ -7,13 +7,10 @@ use Iterator; use Rector\Testing\PHPUnit\AbstractRectorTestCase; +#[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class AssertFieldByIdRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal9/Rector/Deprecation/AssertFieldByNameRector/AssertFieldByNameRectorTest.php b/tests/src/Drupal9/Rector/Deprecation/AssertFieldByNameRector/AssertFieldByNameRectorTest.php index bdcc9448c..e40acf492 100644 --- a/tests/src/Drupal9/Rector/Deprecation/AssertFieldByNameRector/AssertFieldByNameRectorTest.php +++ b/tests/src/Drupal9/Rector/Deprecation/AssertFieldByNameRector/AssertFieldByNameRectorTest.php @@ -7,13 +7,10 @@ use Iterator; use Rector\Testing\PHPUnit\AbstractRectorTestCase; +#[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class AssertFieldByNameRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal9/Rector/Deprecation/AssertLegacyTraitRector/AssertLegacyTraitRectorTest.php b/tests/src/Drupal9/Rector/Deprecation/AssertLegacyTraitRector/AssertLegacyTraitRectorTest.php index 8a01cbe64..41684cfad 100644 --- a/tests/src/Drupal9/Rector/Deprecation/AssertLegacyTraitRector/AssertLegacyTraitRectorTest.php +++ b/tests/src/Drupal9/Rector/Deprecation/AssertLegacyTraitRector/AssertLegacyTraitRectorTest.php @@ -7,13 +7,10 @@ use Iterator; use Rector\Testing\PHPUnit\AbstractRectorTestCase; +#[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class AssertLegacyTraitRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal9/Rector/Deprecation/AssertNoFieldByNameRector/AssertNoFieldByNameRectorTest.php b/tests/src/Drupal9/Rector/Deprecation/AssertNoFieldByNameRector/AssertNoFieldByNameRectorTest.php index 698194cfb..22fb22807 100644 --- a/tests/src/Drupal9/Rector/Deprecation/AssertNoFieldByNameRector/AssertNoFieldByNameRectorTest.php +++ b/tests/src/Drupal9/Rector/Deprecation/AssertNoFieldByNameRector/AssertNoFieldByNameRectorTest.php @@ -7,13 +7,10 @@ use Iterator; use Rector\Testing\PHPUnit\AbstractRectorTestCase; +#[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class AssertNoFieldByNameRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal9/Rector/Deprecation/AssertNoUniqueTextRector/AssertNoUniqueTextRector.php b/tests/src/Drupal9/Rector/Deprecation/AssertNoUniqueTextRector/AssertNoUniqueTextRector.php index 38783eb9b..2b7bc29fe 100644 --- a/tests/src/Drupal9/Rector/Deprecation/AssertNoUniqueTextRector/AssertNoUniqueTextRector.php +++ b/tests/src/Drupal9/Rector/Deprecation/AssertNoUniqueTextRector/AssertNoUniqueTextRector.php @@ -7,13 +7,15 @@ use Iterator; use Rector\Testing\PHPUnit\AbstractRectorTestCase; +#[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class AssertNoUniqueTextRector extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + public function __construct() + { + parent::__construct(static::class); + } + + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal9/Rector/Deprecation/ExtensionPathRector/ExtensionPathRectorTest.php b/tests/src/Drupal9/Rector/Deprecation/ExtensionPathRector/ExtensionPathRectorTest.php index c081f9a0f..b78402133 100644 --- a/tests/src/Drupal9/Rector/Deprecation/ExtensionPathRector/ExtensionPathRectorTest.php +++ b/tests/src/Drupal9/Rector/Deprecation/ExtensionPathRector/ExtensionPathRectorTest.php @@ -7,13 +7,10 @@ use Iterator; use Rector\Testing\PHPUnit\AbstractRectorTestCase; +#[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class ExtensionPathRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal9/Rector/Deprecation/FileFunctionRector/FileFunctionRectorTest.php b/tests/src/Drupal9/Rector/Deprecation/FileFunctionRector/FileFunctionRectorTest.php index 3213371c9..a125220ad 100644 --- a/tests/src/Drupal9/Rector/Deprecation/FileFunctionRector/FileFunctionRectorTest.php +++ b/tests/src/Drupal9/Rector/Deprecation/FileFunctionRector/FileFunctionRectorTest.php @@ -7,13 +7,10 @@ use Iterator; use Rector\Testing\PHPUnit\AbstractRectorTestCase; +#[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class FileFunctionRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal9/Rector/Deprecation/FileUrlGeneratorRector/FileUrlGeneratorRectorTest.php b/tests/src/Drupal9/Rector/Deprecation/FileUrlGeneratorRector/FileUrlGeneratorRectorTest.php index abe65fc3c..3e19262e6 100644 --- a/tests/src/Drupal9/Rector/Deprecation/FileUrlGeneratorRector/FileUrlGeneratorRectorTest.php +++ b/tests/src/Drupal9/Rector/Deprecation/FileUrlGeneratorRector/FileUrlGeneratorRectorTest.php @@ -7,13 +7,10 @@ use Iterator; use Rector\Testing\PHPUnit\AbstractRectorTestCase; +#[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class FileUrlGeneratorRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal9/Rector/Deprecation/ModuleLoadRector/ModuleLoadRectorTest.php b/tests/src/Drupal9/Rector/Deprecation/ModuleLoadRector/ModuleLoadRectorTest.php index cebd2d9c5..7ed233037 100644 --- a/tests/src/Drupal9/Rector/Deprecation/ModuleLoadRector/ModuleLoadRectorTest.php +++ b/tests/src/Drupal9/Rector/Deprecation/ModuleLoadRector/ModuleLoadRectorTest.php @@ -7,13 +7,10 @@ use Iterator; use Rector\Testing\PHPUnit\AbstractRectorTestCase; +#[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class ModuleLoadRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal9/Rector/Deprecation/PassRector/PassRectorTest.php b/tests/src/Drupal9/Rector/Deprecation/PassRector/PassRectorTest.php index 7060d2995..1da0a0d38 100644 --- a/tests/src/Drupal9/Rector/Deprecation/PassRector/PassRectorTest.php +++ b/tests/src/Drupal9/Rector/Deprecation/PassRector/PassRectorTest.php @@ -7,13 +7,10 @@ use Iterator; use Rector\Testing\PHPUnit\AbstractRectorTestCase; +#[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class PassRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { if (str_contains($filePath, 'skip') && method_exists($this, 'doTestFileExpectingWarningAboutRuleApplied')) { diff --git a/tests/src/Drupal9/Rector/Deprecation/SystemSortByInfoName/SystemSortByInfoNameRectorTest.php b/tests/src/Drupal9/Rector/Deprecation/SystemSortByInfoName/SystemSortByInfoNameRectorTest.php index f9c53df23..f0ea3c798 100644 --- a/tests/src/Drupal9/Rector/Deprecation/SystemSortByInfoName/SystemSortByInfoNameRectorTest.php +++ b/tests/src/Drupal9/Rector/Deprecation/SystemSortByInfoName/SystemSortByInfoNameRectorTest.php @@ -7,13 +7,10 @@ use Iterator; use Rector\Testing\PHPUnit\AbstractRectorTestCase; +#[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class SystemSortByInfoNameRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal9/Rector/Deprecation/TaxonomyRectorCollection/TaxonomyRectorCollectionTest.php b/tests/src/Drupal9/Rector/Deprecation/TaxonomyRectorCollection/TaxonomyRectorCollectionTest.php index 6d8281d56..79b90c983 100644 --- a/tests/src/Drupal9/Rector/Deprecation/TaxonomyRectorCollection/TaxonomyRectorCollectionTest.php +++ b/tests/src/Drupal9/Rector/Deprecation/TaxonomyRectorCollection/TaxonomyRectorCollectionTest.php @@ -7,13 +7,10 @@ use Iterator; use Rector\Testing\PHPUnit\AbstractRectorTestCase; +#[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class TaxonomyRectorCollectionTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal9/Rector/Deprecation/UiHelperTraitDrupalPostFormRector/UiHelperTraitDrupalPostFormRectorTest.php b/tests/src/Drupal9/Rector/Deprecation/UiHelperTraitDrupalPostFormRector/UiHelperTraitDrupalPostFormRectorTest.php index 35acf6c2d..eeda58606 100644 --- a/tests/src/Drupal9/Rector/Deprecation/UiHelperTraitDrupalPostFormRector/UiHelperTraitDrupalPostFormRectorTest.php +++ b/tests/src/Drupal9/Rector/Deprecation/UiHelperTraitDrupalPostFormRector/UiHelperTraitDrupalPostFormRectorTest.php @@ -7,13 +7,10 @@ use Iterator; use Rector\Testing\PHPUnit\AbstractRectorTestCase; +#[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class UiHelperTraitDrupalPostFormRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal9/Rector/Deprecation/UserPasswordRector/UserPasswordRectorTest.php b/tests/src/Drupal9/Rector/Deprecation/UserPasswordRector/UserPasswordRectorTest.php index b0d894b74..59516da5a 100644 --- a/tests/src/Drupal9/Rector/Deprecation/UserPasswordRector/UserPasswordRectorTest.php +++ b/tests/src/Drupal9/Rector/Deprecation/UserPasswordRector/UserPasswordRectorTest.php @@ -7,13 +7,10 @@ use Iterator; use Rector\Testing\PHPUnit\AbstractRectorTestCase; +#[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class UserPasswordRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal9/Rector/Property/ProtectedStaticModulesPropertyRector/ProtectedStaticModulesPropertyRectorTest.php b/tests/src/Drupal9/Rector/Property/ProtectedStaticModulesPropertyRector/ProtectedStaticModulesPropertyRectorTest.php index dfda547aa..007de43a2 100644 --- a/tests/src/Drupal9/Rector/Property/ProtectedStaticModulesPropertyRector/ProtectedStaticModulesPropertyRectorTest.php +++ b/tests/src/Drupal9/Rector/Property/ProtectedStaticModulesPropertyRector/ProtectedStaticModulesPropertyRectorTest.php @@ -9,9 +9,7 @@ final class ProtectedStaticModulesPropertyRectorTest extends AbstractRectorTestCase { - /** - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/ConstantToClassConstantRectorTest.php b/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/ConstantToClassConstantRectorTest.php index 2c7181c73..b3ac95c6d 100644 --- a/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/ConstantToClassConstantRectorTest.php +++ b/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/ConstantToClassConstantRectorTest.php @@ -7,13 +7,10 @@ use Iterator; use Rector\Testing\PHPUnit\AbstractRectorTestCase; +#[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class ClassConstantToClassConstantRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Rector/Deprecation/ConstantToClassConstantRector/ConstantToClassConstantRectorTest.php b/tests/src/Rector/Deprecation/ConstantToClassConstantRector/ConstantToClassConstantRectorTest.php index b7698b1e6..d8f94f8ce 100644 --- a/tests/src/Rector/Deprecation/ConstantToClassConstantRector/ConstantToClassConstantRectorTest.php +++ b/tests/src/Rector/Deprecation/ConstantToClassConstantRector/ConstantToClassConstantRectorTest.php @@ -7,13 +7,10 @@ use Iterator; use Rector\Testing\PHPUnit\AbstractRectorTestCase; +#[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class ConstantToClassConstantRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Rector/Deprecation/DeprecationHelperRemoveRector/DeprecationHelperRemoveRectorTest.php b/tests/src/Rector/Deprecation/DeprecationHelperRemoveRector/DeprecationHelperRemoveRectorTest.php index 4af2ba260..7eec03bad 100644 --- a/tests/src/Rector/Deprecation/DeprecationHelperRemoveRector/DeprecationHelperRemoveRectorTest.php +++ b/tests/src/Rector/Deprecation/DeprecationHelperRemoveRector/DeprecationHelperRemoveRectorTest.php @@ -7,13 +7,10 @@ use Iterator; use Rector\Testing\PHPUnit\AbstractRectorTestCase; +#[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class DeprecationHelperRemoveRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Rector/Deprecation/FunctionToServiceRector/FunctionToServiceRectorTest.php b/tests/src/Rector/Deprecation/FunctionToServiceRector/FunctionToServiceRectorTest.php index 7398a9e72..536cf2695 100644 --- a/tests/src/Rector/Deprecation/FunctionToServiceRector/FunctionToServiceRectorTest.php +++ b/tests/src/Rector/Deprecation/FunctionToServiceRector/FunctionToServiceRectorTest.php @@ -7,13 +7,10 @@ use Iterator; use Rector\Testing\PHPUnit\AbstractRectorTestCase; +#[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class FunctionToServiceRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Rector/Deprecation/FunctionToStaticRector/FunctionToStaticRectorTest.php b/tests/src/Rector/Deprecation/FunctionToStaticRector/FunctionToStaticRectorTest.php index 778a56e4c..644c24069 100644 --- a/tests/src/Rector/Deprecation/FunctionToStaticRector/FunctionToStaticRectorTest.php +++ b/tests/src/Rector/Deprecation/FunctionToStaticRector/FunctionToStaticRectorTest.php @@ -7,13 +7,10 @@ use Iterator; use Rector\Testing\PHPUnit\AbstractRectorTestCase; +#[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class FunctionToStaticRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/MethodToMethodWithCheckRectorTest.php b/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/MethodToMethodWithCheckRectorTest.php index 6aad8a87c..2a8d13b6e 100644 --- a/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/MethodToMethodWithCheckRectorTest.php +++ b/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/MethodToMethodWithCheckRectorTest.php @@ -7,13 +7,10 @@ use Iterator; use Rector\Testing\PHPUnit\AbstractRectorTestCase; +#[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class MethodToMethodWithCheckRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Rector/PHPUnit/ShouldCallParentMethodsRector/ShouldCallParentMethodsRectorTest.php b/tests/src/Rector/PHPUnit/ShouldCallParentMethodsRector/ShouldCallParentMethodsRectorTest.php index 999cb72c8..86ac13c4c 100644 --- a/tests/src/Rector/PHPUnit/ShouldCallParentMethodsRector/ShouldCallParentMethodsRectorTest.php +++ b/tests/src/Rector/PHPUnit/ShouldCallParentMethodsRector/ShouldCallParentMethodsRectorTest.php @@ -7,13 +7,10 @@ use Iterator; use Rector\Testing\PHPUnit\AbstractRectorTestCase; +#[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class ShouldCallParentMethodsRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); From 927a3dc34c3982587a5d20785948cd949c5bb820 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 1 May 2026 17:06:59 +0200 Subject: [PATCH 089/256] chore: we now only really use unit tests, only some very old fixtures remain. --- .../functional_test__rector_examples.yml | 73 ------------------- 1 file changed, 73 deletions(-) delete mode 100644 .github/workflows/functional_test__rector_examples.yml diff --git a/.github/workflows/functional_test__rector_examples.yml b/.github/workflows/functional_test__rector_examples.yml deleted file mode 100644 index aa266e4c4..000000000 --- a/.github/workflows/functional_test__rector_examples.yml +++ /dev/null @@ -1,73 +0,0 @@ - -name: functional_test__rector_examples - -# This test will run on every pull request, and on every commit on any branch -on: - push: - branches: - - main - schedule: - # Run tests every week (to check for rector changes) - - cron: '0 0 * * 0' - pull_request: - types: [opened, synchronize, reopened, closed] - -jobs: - run_functional_test: - name: Functional | PHP ${{ matrix.php-version }} | Drupal ${{ matrix.drupal }}" - strategy: - fail-fast: false - matrix: - include: - - php-version: "8.3" - drupal: "^10.0" - fixture: "d10" - - php-version: "8.4" - drupal: "^10.0" - fixture: "d10" - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: shivammathur/setup-php@v2 - with: - php-version: "${{ matrix.php-version }}" - coverage: none - tools: composer:v2 - extensions: dom, curl, libxml, mbstring, zip, pdo, mysql, pdo_mysql, gd - - name: Setup Drupal - uses: bluehorndigital/setup-drupal@v1.2.0 - with: - version: '${{ matrix.drupal }}' - path: ~/drupal - - name: Install Drupal Rector - run: | - cd ~/drupal - composer require palantirnet/drupal-rector:@dev --no-progress - - name: Install Drupal Rector Config - run: | - cd ~/drupal - cp vendor/palantirnet/drupal-rector/rector.php . - - name: Prepare rector_examples folder in the drupal modules directory - run: | - cd ~/drupal - mkdir -p web/modules/custom - cp -R vendor/palantirnet/drupal-rector/fixtures/${{ matrix.fixture }}/rector_examples web/modules/custom - # dry-run is expected to return exit code 2 if there are changes, which we are expecting to happen, here. - # an error code of 1 represents other errors. - # @see \Rector\Core\Console\ExitCode::CHANGED_CODE - - name: Run rector against Drupal (dry-run) - run: | - cd ~/drupal - vendor/bin/rector process web/modules/custom/rector_examples --dry-run --debug || if (($? == 2)); then true; else false; fi - - name: Run rector against Drupal - run: | - cd ~/drupal - vendor/bin/rector process web/modules/custom/rector_examples --debug - # diff options: - # -r: recursive - # -u: show the joined context, like git diff - # -b: ignore whitespace - # -B: ignore lines that are only whitespace - - name: Check that the updated examples match expectations - run: | - diff --color -rubB fixtures/${{ matrix.fixture }}/rector_examples_updated ~/drupal/web/modules/custom/rector_examples From 7d84d58dfbd374a29cb54f802c8ca4c3dee58079 Mon Sep 17 00:00:00 2001 From: bjorn Date: Sat, 2 May 2026 08:30:10 +0200 Subject: [PATCH 090/256] docs: add issue and change record node IDs to type-specificity checklist --- docs/rector-type-specificity-checklist.md | 110 +++++++++++----------- 1 file changed, 55 insertions(+), 55 deletions(-) diff --git a/docs/rector-type-specificity-checklist.md b/docs/rector-type-specificity-checklist.md index 05d26368c..cc9e90b0f 100644 --- a/docs/rector-type-specificity-checklist.md +++ b/docs/rector-type-specificity-checklist.md @@ -18,66 +18,66 @@ Use `/rector-type-check-review ` to fix an AT-RISK rector inter ## Drupal 10 Rectors -| Rector | Matches | Guard | Verdict | Notes | -|--------|---------|-------|---------|-------| -| `ReplaceModuleHandlerGetNameRector` | `->getName()` | `isObjectType(ModuleHandlerInterface)` | ✅ SAFE | | -| `ReplaceRebuildThemeDataRector` | `->rebuildThemeData()` | `isObjectType(ThemeHandlerInterface)` | ✅ SAFE | Fixed | -| `ReplaceRequestTimeConstantRector` | `REQUEST_TIME` constant | n/a | ✅ SAFE | Global constant — no owning class | +| Rector | Matches | Guard | Verdict | Issue | Change Record | Notes | +|--------|---------|-------|---------|-------|---------------|-------| +| `ReplaceModuleHandlerGetNameRector` | `->getName()` | `isObjectType(ModuleHandlerInterface)` | ✅ SAFE | 3571063 | — | | +| `ReplaceRebuildThemeDataRector` | `->rebuildThemeData()` | `isObjectType(ThemeHandlerInterface)` | ✅ SAFE | 3571068 | — | Fixed | +| `ReplaceRequestTimeConstantRector` | `REQUEST_TIME` constant | n/a | ✅ SAFE | 3395986 | 3395991 | Global constant — no owning class | --- ## Drupal 11 Rectors -| Rector | Matches | Guard | Verdict | Notes | -|--------|---------|-------|---------|-------| -| `ErrorCurrentErrorHandlerRector` | `Error::currentErrorHandler()` static | `isObjectType(Error)` | ✅ SAFE | | -| `FileSystemBasenameToNativeRector` | `->basename()` | `isObjectType(FileSystemInterface\|FileSystem)` | ✅ SAFE | | -| `LoadAllIncludesRector` | `->loadAllIncludes()` | `isObjectType(ModuleHandlerInterface)` | ✅ SAFE | | -| `MigrateSqlGetMigrationPluginManagerRector` | `$this->getMigrationPluginManager()` | `isObjectType(Sql)` | ✅ SAFE | | -| `NodeStorageDeprecatedMethodsRector` | `->revisionIds()` etc. | `isObjectType(NodeStorageInterface)` | ✅ SAFE | | -| `PluginBaseIsConfigurableRector` | `$this->isConfigurable()` | `isObjectType(PluginBase)` | ✅ SAFE | Fixed | -| `RemoveAutomatedCronSubmitHandlerRector` | `$form['#submit'][]` string literal | n/a | ✅ SAFE | Matches specific string value, not a class member | -| `RemoveCacheExpireOverrideRector` | `cacheExpire()` method declaration | `extends` + `isObjectType` fallback on `Class_` | 🔵 EXEMPT | | -| `RemoveConfigSaveTrustedDataArgRector` | `->save(TRUE\|FALSE)` | `isObjectType(Config)` | ✅ SAFE | Fixed | -| `RemoveHandlerBaseDefineExtraOptionsRector` | `defineExtraOptions()` declaration | `extends` check on `Class_` | 🔵 EXEMPT | | -| `RemoveLinkWidgetValidateTitleElementRector` | `LinkWidget::validateTitleElement()` static | `isName(LinkWidget)` | ✅ SAFE | | -| `RemoveModuleHandlerAddModuleCallsRector` | `->addModule()`, `->addProfile()` | `isObjectType(ModuleHandlerInterface\|ModuleHandler)` | ✅ SAFE | | -| `RemoveModuleHandlerDeprecatedMethodsRector` | `->writeCache()`, `->getHookInfo()` | `isObjectType(ModuleHandlerInterface)` | ✅ SAFE | | -| `RemoveRootFromConvertDbUrlRector` | `Database::convertDbUrlToConnectionInfo()` static | `isName(Database)` | ✅ SAFE | | -| `RemoveSetUriCallbackRector` | `->setUriCallback()` | `isObjectType(EntityTypeInterface)` | ✅ SAFE | Fixed | -| `RemoveStateCacheSettingRector` | `$settings['state_cache']` array key | n/a | ✅ SAFE | Specific variable + key pattern | -| `RemoveTrustDataCallRector` | `->trustData()` | `isObjectType(ConfigEntityInterface)` | ✅ SAFE | Fixed | -| `RemoveTwigNodeTransTagArgumentRector` | `new TwigNodeTrans(...)` | `isName(TwigNodeTrans)` | ✅ SAFE | | -| `RemoveUpdaterPostInstallMethodsRector` | `postInstall()`, `postInstallTasks()` declarations | `extends` check on `Class_` | 🔵 EXEMPT | | -| `RemoveViewsRowCacheKeysRector` | array values: `->getRowCacheKeys()`, `->getRowId()` | `isObjectType(CachePluginBase)` | ✅ SAFE | Fixed | -| `RenameStopProceduralHookScanRector` | `StopProceduralHookScan` attribute/use | `isName` on FQCN | ✅ SAFE | | -| `ReplaceAlphadecimalToIntNullRector` | `Number::alphadecimalToInt()` static | `isObjectType(Number)` | ✅ SAFE | | -| `ReplaceCommentManagerGetCountNewCommentsRector` | `->getCountNewComments()` | `isObjectType(CommentManagerInterface)` | ✅ SAFE | | -| `ReplaceCommentUriRector` | `comment_uri()` function | n/a | ✅ SAFE | Global function | -| `ReplaceDateTimeRangeConstantsRector` | class constant fetch + function | `isName` on interface | ✅ SAFE | | -| `ReplaceEditorLoadRector` | `editor_load()` function | n/a | ✅ SAFE | Global function | -| `ReplaceEntityOriginalPropertyRector` | `->original` property | `isObjectType(EntityInterface)` | ✅ SAFE | Fixed | -| `ReplaceEntityReferenceRecursiveLimitRector` | `RECURSIVE_RENDER_LIMIT` class const | `isName` on target classes | ✅ SAFE | | -| `ReplaceFieldgroupToFieldsetRector` | `'#type' => 'fieldgroup'` array literal | n/a | ✅ SAFE | String literal match | -| `ReplaceFileGetContentHeadersRector` | `file_get_content_headers()` function | n/a | ✅ SAFE | Global function | -| `ReplaceLocaleConfigBatchFunctionsRector` | `locale_config_batch_*()` functions | n/a | ✅ SAFE | Global functions | -| `ReplaceNodeAccessViewAllNodesRector` | `node_access_view_all_nodes()` etc. | n/a | ✅ SAFE | Global functions | -| `ReplaceNodeAddBodyFieldRector` | `node_add_body_field()` function | n/a | ✅ SAFE | Global function | -| `ReplaceNodeModuleProceduralFunctionsRector` | `node_type_get_names()` etc. | n/a | ✅ SAFE | Global functions | -| `ReplaceNodeSetPreviewModeRector` | `->setPreviewMode(0\|1\|2\|CONST)` | `isObjectType(NodeTypeInterface)` | ✅ SAFE | Fixed | -| `ReplacePdoFetchConstantsRector` | `PDO::FETCH_*` constants | `isName(PDO)` on const fetch | ✅ SAFE | | -| `ReplaceRecipeRunnerInstallModuleRector` | `RecipeRunner::installModule()` static | `isName(RecipeRunner)` | ✅ SAFE | | -| `ReplaceSessionManagerDeleteRector` | `->delete()` | `isObjectType(SessionManager)` | ✅ SAFE | | -| `ReplaceSessionWritesWithRequestSessionRector` | `$_SESSION[...]` superglobal | n/a | ✅ SAFE | Specific superglobal | -| `ReplaceSystemPerformanceGzipKeyRector` | `->get()`/`->set()` on config chain | chain inspection for `'system.performance'` key | ✅ SAFE | Custom chain guard | -| `ReplaceThemeGetSettingRector` | `theme_get_setting()` etc. | n/a | ✅ SAFE | Global functions | -| `ReplaceUserSessionNamePropertyRector` | `->name` property | `isObjectType(UserSession)` + skips `$this` | ✅ SAFE | | -| `ReplaceViewsProceduralFunctionsRector` | `views_*()` functions | n/a | ✅ SAFE | Global functions | -| `StatementPrefetchIteratorFetchColumnRector` | `->fetchColumn()` | `isObjectType(StatementPrefetchIterator)` | ✅ SAFE | Fixed | -| `StripMigrationDependenciesExpandArgRector` | `->getMigrationDependencies()` | `isObjectType(MigrationInterface)` | ✅ SAFE | | -| `UseEntityTypeHasIntegerIdRector` | `$this->getEntityTypeIdKeyType()` etc. | `isObjectType` per-method via `METHOD_OWNER_CLASS` map | ✅ SAFE | Fixed | -| `ViewsPluginHandlerManagerRector` | `Views::pluginManager()` static | `isName(Views)` | ✅ SAFE | | -| `FunctionCallRemovalRector` (generic) | configured function names | configuration-driven name match | ✅ SAFE | Targets global functions only | +| Rector | Matches | Guard | Verdict | Issue | Change Record | Notes | +|--------|---------|-------|---------|-------|---------------|-------| +| `ErrorCurrentErrorHandlerRector` | `Error::currentErrorHandler()` static | `isObjectType(Error)` | ✅ SAFE | 3526515 | 3529500 | | +| `FileSystemBasenameToNativeRector` | `->basename()` | `isObjectType(FileSystemInterface\|FileSystem)` | ✅ SAFE | 3530461 | 3530869 | | +| `LoadAllIncludesRector` | `->loadAllIncludes()` | `isObjectType(ModuleHandlerInterface)` | ✅ SAFE | 3536431 | 3536432 | | +| `MigrateSqlGetMigrationPluginManagerRector` | `$this->getMigrationPluginManager()` | `isObjectType(Sql)` | ✅ SAFE | 3439369 | 3442785 | | +| `NodeStorageDeprecatedMethodsRector` | `->revisionIds()` etc. | `isObjectType(NodeStorageInterface)` | ✅ SAFE | 3396062 | 3519187 | | +| `PluginBaseIsConfigurableRector` | `$this->isConfigurable()` | `isObjectType(PluginBase)` | ✅ SAFE | 3459533 | 3459535 | Fixed | +| `RemoveAutomatedCronSubmitHandlerRector` | `$form['#submit'][]` string literal | n/a | ✅ SAFE | 3566768 | 3566774 | Matches specific string value, not a class member | +| `RemoveCacheExpireOverrideRector` | `cacheExpire()` method declaration | `extends` + `isObjectType` fallback on `Class_` | 🔵 EXEMPT | 3576556 | 3576855 | | +| `RemoveConfigSaveTrustedDataArgRector` | `->save(TRUE\|FALSE)` | `isObjectType(Config)` | ✅ SAFE | 3347842 | 3348180 | Fixed | +| `RemoveHandlerBaseDefineExtraOptionsRector` | `defineExtraOptions()` declaration | `extends` check on `Class_` | 🔵 EXEMPT | 3485084 | 3486781 | | +| `RemoveLinkWidgetValidateTitleElementRector` | `LinkWidget::validateTitleElement()` static | `isName(LinkWidget)` | ✅ SAFE | 3093118 | 3554139 | | +| `RemoveModuleHandlerAddModuleCallsRector` | `->addModule()`, `->addProfile()` | `isObjectType(ModuleHandlerInterface\|ModuleHandler)` | ✅ SAFE | 3528899 | 3550193 | | +| `RemoveModuleHandlerDeprecatedMethodsRector` | `->writeCache()`, `->getHookInfo()` | `isObjectType(ModuleHandlerInterface)` | ✅ SAFE | 3442009 | — | | +| `RemoveRootFromConvertDbUrlRector` | `Database::convertDbUrlToConnectionInfo()` static | `isName(Database)` | ✅ SAFE | 3522513 | 3511287 | | +| `RemoveSetUriCallbackRector` | `->setUriCallback()` | `isObjectType(EntityTypeInterface)` | ✅ SAFE | 2667040 | 3575062 | Fixed | +| `RemoveStateCacheSettingRector` | `$settings['state_cache']` array key | n/a | ✅ SAFE | 3436954 | 3443018 | Specific variable + key pattern | +| `RemoveTrustDataCallRector` | `->trustData()` | `isObjectType(ConfigEntityInterface)` | ✅ SAFE | 3347842 | 3348180 | Fixed | +| `RemoveTwigNodeTransTagArgumentRector` | `new TwigNodeTrans(...)` | `isName(TwigNodeTrans)` | ✅ SAFE | 3473440 | — | | +| `RemoveUpdaterPostInstallMethodsRector` | `postInstall()`, `postInstallTasks()` declarations | `extends` check on `Class_` | 🔵 EXEMPT | 3417136 | 3571399 | | +| `RemoveViewsRowCacheKeysRector` | array values: `->getRowCacheKeys()`, `->getRowId()` | `isObjectType(CachePluginBase)` | ✅ SAFE | 3564937 | 3564958 | Fixed | +| `RenameStopProceduralHookScanRector` | `StopProceduralHookScan` attribute/use | `isName` on FQCN | ✅ SAFE | 3495943 | 3490771 | | +| `ReplaceAlphadecimalToIntNullRector` | `Number::alphadecimalToInt()` static | `isObjectType(Number)` | ✅ SAFE | 3442810 | 3494472 | | +| `ReplaceCommentManagerGetCountNewCommentsRector` | `->getCountNewComments()` | `isObjectType(CommentManagerInterface)` | ✅ SAFE | 3543035 | 3551729 | | +| `ReplaceCommentUriRector` | `comment_uri()` function | n/a | ✅ SAFE | 2010202 | 3384294 | Global function | +| `ReplaceDateTimeRangeConstantsRector` | class constant fetch + function | `isName` on interface | ✅ SAFE | 3574901 | — | | +| `ReplaceEditorLoadRector` | `editor_load()` function | n/a | ✅ SAFE | 3447794 | 3509245 | Global function | +| `ReplaceEntityOriginalPropertyRector` | `->original` property | `isObjectType(EntityInterface)` | ✅ SAFE | 3571065 | — | Fixed | +| `ReplaceEntityReferenceRecursiveLimitRector` | `RECURSIVE_RENDER_LIMIT` class const | `isName` on target classes | ✅ SAFE | 2940605 | 3316878 | | +| `ReplaceFieldgroupToFieldsetRector` | `'#type' => 'fieldgroup'` array literal | n/a | ✅ SAFE | 3512254 | 3515272 | String literal match | +| `ReplaceFileGetContentHeadersRector` | `file_get_content_headers()` function | n/a | ✅ SAFE | 3494126 | 3494172 | Global function | +| `ReplaceLocaleConfigBatchFunctionsRector` | `locale_config_batch_*()` functions | n/a | ✅ SAFE | 3575254 | — | Global functions | +| `ReplaceNodeAccessViewAllNodesRector` | `node_access_view_all_nodes()` etc. | n/a | ✅ SAFE | 3038908 | 3038909 | Global functions | +| `ReplaceNodeAddBodyFieldRector` | `node_add_body_field()` function | n/a | ✅ SAFE | 3489266 | 3516778 | Global function | +| `ReplaceNodeModuleProceduralFunctionsRector` | `node_type_get_names()` etc. | n/a | ✅ SAFE | 3571623 | — | Global functions | +| `ReplaceNodeSetPreviewModeRector` | `->setPreviewMode(0\|1\|2\|CONST)` | `isObjectType(NodeTypeInterface)` | ✅ SAFE | 3538277 | 3538666 | Fixed | +| `ReplacePdoFetchConstantsRector` | `PDO::FETCH_*` constants | `isName(PDO)` on const fetch | ✅ SAFE | 3525077 | — | | +| `ReplaceRecipeRunnerInstallModuleRector` | `RecipeRunner::installModule()` static | `isName(RecipeRunner)` | ✅ SAFE | 3498026 | 3579527 | | +| `ReplaceSessionManagerDeleteRector` | `->delete()` | `isObjectType(SessionManager)` | ✅ SAFE | 3577376 | — | | +| `ReplaceSessionWritesWithRequestSessionRector` | `$_SESSION[...]` superglobal | n/a | ✅ SAFE | 3518527 | 3518914 | Specific superglobal | +| `ReplaceSystemPerformanceGzipKeyRector` | `->get()`/`->set()` on config chain | chain inspection for `'system.performance'` key | ✅ SAFE | 3184242 | 3526344 | Custom chain guard | +| `ReplaceThemeGetSettingRector` | `theme_get_setting()` etc. | n/a | ✅ SAFE | 3573896 | — | Global functions | +| `ReplaceUserSessionNamePropertyRector` | `->name` property | `isObjectType(UserSession)` + skips `$this` | ✅ SAFE | 3513856 | 3513877 | | +| `ReplaceViewsProceduralFunctionsRector` | `views_*()` functions | n/a | ✅ SAFE | 3572243 | 3572594 | Global functions | +| `StatementPrefetchIteratorFetchColumnRector` | `->fetchColumn()` | `isObjectType(StatementPrefetchIterator)` | ✅ SAFE | 3490200 | 3490312 | Fixed | +| `StripMigrationDependenciesExpandArgRector` | `->getMigrationDependencies()` | `isObjectType(MigrationInterface)` | ✅ SAFE | 3574717 | 3442785 | | +| `UseEntityTypeHasIntegerIdRector` | `$this->getEntityTypeIdKeyType()` etc. | `isObjectType` per-method via `METHOD_OWNER_CLASS` map | ✅ SAFE | 3566801 | 3566814 | Fixed | +| `ViewsPluginHandlerManagerRector` | `Views::pluginManager()` static | `isName(Views)` | ✅ SAFE | 3566424 | 3566982 | | +| `FunctionCallRemovalRector` (generic) | configured function names | configuration-driven name match | ✅ SAFE | — | — | Targets global functions only | --- From cd94586658abd3ddeb35e03eb5026d1e49104a20 Mon Sep 17 00:00:00 2001 From: bjorn Date: Sat, 2 May 2026 08:32:38 +0200 Subject: [PATCH 091/256] docs: add LoadAllIncludesRector and RemoveCacheExpireOverrideRector to AT-RISK summary --- docs/rector-type-specificity-checklist.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/rector-type-specificity-checklist.md b/docs/rector-type-specificity-checklist.md index cc9e90b0f..9a426d26e 100644 --- a/docs/rector-type-specificity-checklist.md +++ b/docs/rector-type-specificity-checklist.md @@ -32,12 +32,12 @@ Use `/rector-type-check-review ` to fix an AT-RISK rector inter |--------|---------|-------|---------|-------|---------------|-------| | `ErrorCurrentErrorHandlerRector` | `Error::currentErrorHandler()` static | `isObjectType(Error)` | ✅ SAFE | 3526515 | 3529500 | | | `FileSystemBasenameToNativeRector` | `->basename()` | `isObjectType(FileSystemInterface\|FileSystem)` | ✅ SAFE | 3530461 | 3530869 | | -| `LoadAllIncludesRector` | `->loadAllIncludes()` | `isObjectType(ModuleHandlerInterface)` | ✅ SAFE | 3536431 | 3536432 | | +| `LoadAllIncludesRector` | `->loadAllIncludes()` | `isObjectType(ModuleHandlerInterface)` | ✅ SAFE | 3536431 | 3536432 | Fixed | | `MigrateSqlGetMigrationPluginManagerRector` | `$this->getMigrationPluginManager()` | `isObjectType(Sql)` | ✅ SAFE | 3439369 | 3442785 | | | `NodeStorageDeprecatedMethodsRector` | `->revisionIds()` etc. | `isObjectType(NodeStorageInterface)` | ✅ SAFE | 3396062 | 3519187 | | | `PluginBaseIsConfigurableRector` | `$this->isConfigurable()` | `isObjectType(PluginBase)` | ✅ SAFE | 3459533 | 3459535 | Fixed | | `RemoveAutomatedCronSubmitHandlerRector` | `$form['#submit'][]` string literal | n/a | ✅ SAFE | 3566768 | 3566774 | Matches specific string value, not a class member | -| `RemoveCacheExpireOverrideRector` | `cacheExpire()` method declaration | `extends` + `isObjectType` fallback on `Class_` | 🔵 EXEMPT | 3576556 | 3576855 | | +| `RemoveCacheExpireOverrideRector` | `cacheExpire()` method declaration | exact FQCN list + `isObjectType` fallback on `Class_` | 🔵 EXEMPT | 3576556 | 3576855 | Fixed | | `RemoveConfigSaveTrustedDataArgRector` | `->save(TRUE\|FALSE)` | `isObjectType(Config)` | ✅ SAFE | 3347842 | 3348180 | Fixed | | `RemoveHandlerBaseDefineExtraOptionsRector` | `defineExtraOptions()` declaration | `extends` check on `Class_` | 🔵 EXEMPT | 3485084 | 3486781 | | | `RemoveLinkWidgetValidateTitleElementRector` | `LinkWidget::validateTitleElement()` static | `isName(LinkWidget)` | ✅ SAFE | 3093118 | 3554139 | | @@ -83,7 +83,7 @@ Use `/rector-type-check-review ` to fix an AT-RISK rector inter ## AT-RISK Summary -All 10 AT-RISK rectors have been fixed. ✅ +All 12 AT-RISK rectors have been fixed. ✅ | # | Rector | Guard added | Drupal class/interface used | |---|--------|------------|------------------------------| @@ -97,3 +97,5 @@ All 10 AT-RISK rectors have been fixed. ✅ | 8 | `ReplaceNodeSetPreviewModeRector` | `isObjectType` on `->setPreviewMode()` caller | `Drupal\node\NodeTypeInterface` | | 9 | `StatementPrefetchIteratorFetchColumnRector` | `isObjectType` on `->fetchColumn()` caller | `Drupal\Core\Database\StatementPrefetchIterator` | | 10 | `UseEntityTypeHasIntegerIdRector` | per-method `isObjectType` via `METHOD_OWNER_CLASS` map | `DefaultHtmlRouteProvider`, `CommentTypeForm`, `OverridesSectionStorage` | +| 11 | `LoadAllIncludesRector` | `isObjectType` on `->loadAllIncludes()` caller | `Drupal\Core\Extension\ModuleHandlerInterface` | +| 12 | `RemoveCacheExpireOverrideRector` | replaced broad `str_ends_with` with exact FQCN list; added `isObjectType(CachePluginBase)` fallback | `Drupal\views\Plugin\views\cache\CachePluginBase` | From 7689ba18a1fc79f5307d32b3f2c1a5f6d05bcb32 Mon Sep 17 00:00:00 2001 From: bjorn Date: Sat, 2 May 2026 08:34:13 +0200 Subject: [PATCH 092/256] docs: add issue and change record columns to AT-RISK summary table --- docs/rector-type-specificity-checklist.md | 28 +++++++++++------------ 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/rector-type-specificity-checklist.md b/docs/rector-type-specificity-checklist.md index 9a426d26e..b9c2e5a6d 100644 --- a/docs/rector-type-specificity-checklist.md +++ b/docs/rector-type-specificity-checklist.md @@ -85,17 +85,17 @@ Use `/rector-type-check-review ` to fix an AT-RISK rector inter All 12 AT-RISK rectors have been fixed. ✅ -| # | Rector | Guard added | Drupal class/interface used | -|---|--------|------------|------------------------------| -| 1 | `ReplaceRebuildThemeDataRector` | `isObjectType` on `->rebuildThemeData()` caller | `Drupal\Core\Extension\ThemeHandlerInterface` | -| 2 | `PluginBaseIsConfigurableRector` | `isObjectType` on `$this` | `Drupal\Component\Plugin\PluginBase` | -| 3 | `RemoveConfigSaveTrustedDataArgRector` | `isObjectType` on `->save()` caller | `Drupal\Core\Config\Config` | -| 4 | `RemoveSetUriCallbackRector` | `isObjectType` on `->setUriCallback()` caller | `Drupal\Core\Entity\EntityTypeInterface` | -| 5 | `RemoveTrustDataCallRector` | `isObjectType` on `->trustData()` caller | `Drupal\Core\Config\Entity\ConfigEntityInterface` | -| 6 | `RemoveViewsRowCacheKeysRector` | `isObjectType` on method-call receiver inside array item | `Drupal\views\Plugin\views\cache\CachePluginBase` | -| 7 | `ReplaceEntityOriginalPropertyRector` | `isObjectType` on `->original` variable | `Drupal\Core\Entity\EntityInterface` | -| 8 | `ReplaceNodeSetPreviewModeRector` | `isObjectType` on `->setPreviewMode()` caller | `Drupal\node\NodeTypeInterface` | -| 9 | `StatementPrefetchIteratorFetchColumnRector` | `isObjectType` on `->fetchColumn()` caller | `Drupal\Core\Database\StatementPrefetchIterator` | -| 10 | `UseEntityTypeHasIntegerIdRector` | per-method `isObjectType` via `METHOD_OWNER_CLASS` map | `DefaultHtmlRouteProvider`, `CommentTypeForm`, `OverridesSectionStorage` | -| 11 | `LoadAllIncludesRector` | `isObjectType` on `->loadAllIncludes()` caller | `Drupal\Core\Extension\ModuleHandlerInterface` | -| 12 | `RemoveCacheExpireOverrideRector` | replaced broad `str_ends_with` with exact FQCN list; added `isObjectType(CachePluginBase)` fallback | `Drupal\views\Plugin\views\cache\CachePluginBase` | +| # | Rector | Guard added | Drupal class/interface used | Issue | Change Record | +|---|--------|------------|------------------------------|-------|---------------| +| 1 | `ReplaceRebuildThemeDataRector` | `isObjectType` on `->rebuildThemeData()` caller | `Drupal\Core\Extension\ThemeHandlerInterface` | 3571068 | — | +| 2 | `PluginBaseIsConfigurableRector` | `isObjectType` on `$this` | `Drupal\Component\Plugin\PluginBase` | 3459533 | 3459535 | +| 3 | `RemoveConfigSaveTrustedDataArgRector` | `isObjectType` on `->save()` caller | `Drupal\Core\Config\Config` | 3347842 | 3348180 | +| 4 | `RemoveSetUriCallbackRector` | `isObjectType` on `->setUriCallback()` caller | `Drupal\Core\Entity\EntityTypeInterface` | 2667040 | 3575062 | +| 5 | `RemoveTrustDataCallRector` | `isObjectType` on `->trustData()` caller | `Drupal\Core\Config\Entity\ConfigEntityInterface` | 3347842 | 3348180 | +| 6 | `RemoveViewsRowCacheKeysRector` | `isObjectType` on method-call receiver inside array item | `Drupal\views\Plugin\views\cache\CachePluginBase` | 3564937 | 3564958 | +| 7 | `ReplaceEntityOriginalPropertyRector` | `isObjectType` on `->original` variable | `Drupal\Core\Entity\EntityInterface` | 3571065 | — | +| 8 | `ReplaceNodeSetPreviewModeRector` | `isObjectType` on `->setPreviewMode()` caller | `Drupal\node\NodeTypeInterface` | 3538277 | 3538666 | +| 9 | `StatementPrefetchIteratorFetchColumnRector` | `isObjectType` on `->fetchColumn()` caller | `Drupal\Core\Database\StatementPrefetchIterator` | 3490200 | 3490312 | +| 10 | `UseEntityTypeHasIntegerIdRector` | per-method `isObjectType` via `METHOD_OWNER_CLASS` map | `DefaultHtmlRouteProvider`, `CommentTypeForm`, `OverridesSectionStorage` | 3566801 | 3566814 | +| 11 | `LoadAllIncludesRector` | `isObjectType` on `->loadAllIncludes()` caller | `Drupal\Core\Extension\ModuleHandlerInterface` | 3536431 | 3536432 | +| 12 | `RemoveCacheExpireOverrideRector` | replaced broad `str_ends_with` with exact FQCN list; added `isObjectType(CachePluginBase)` fallback | `Drupal\views\Plugin\views\cache\CachePluginBase` | 3576556 | 3576855 | From 21ce25b0d34002e8dce594cbab44cb0dc75b886e Mon Sep 17 00:00:00 2001 From: bjorn Date: Sat, 2 May 2026 08:38:22 +0200 Subject: [PATCH 093/256] docs: add ReplaceUserSessionNamePropertyRector to AT-RISK summary --- docs/rector-type-specificity-checklist.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/rector-type-specificity-checklist.md b/docs/rector-type-specificity-checklist.md index b9c2e5a6d..95e2eba97 100644 --- a/docs/rector-type-specificity-checklist.md +++ b/docs/rector-type-specificity-checklist.md @@ -71,7 +71,7 @@ Use `/rector-type-check-review ` to fix an AT-RISK rector inter | `ReplaceSessionWritesWithRequestSessionRector` | `$_SESSION[...]` superglobal | n/a | ✅ SAFE | 3518527 | 3518914 | Specific superglobal | | `ReplaceSystemPerformanceGzipKeyRector` | `->get()`/`->set()` on config chain | chain inspection for `'system.performance'` key | ✅ SAFE | 3184242 | 3526344 | Custom chain guard | | `ReplaceThemeGetSettingRector` | `theme_get_setting()` etc. | n/a | ✅ SAFE | 3573896 | — | Global functions | -| `ReplaceUserSessionNamePropertyRector` | `->name` property | `isObjectType(UserSession)` + skips `$this` | ✅ SAFE | 3513856 | 3513877 | | +| `ReplaceUserSessionNamePropertyRector` | `->name` property | `isObjectType(UserSession)` + skips `$this` | ✅ SAFE | 3513856 | 3513877 | Fixed | | `ReplaceViewsProceduralFunctionsRector` | `views_*()` functions | n/a | ✅ SAFE | 3572243 | 3572594 | Global functions | | `StatementPrefetchIteratorFetchColumnRector` | `->fetchColumn()` | `isObjectType(StatementPrefetchIterator)` | ✅ SAFE | 3490200 | 3490312 | Fixed | | `StripMigrationDependenciesExpandArgRector` | `->getMigrationDependencies()` | `isObjectType(MigrationInterface)` | ✅ SAFE | 3574717 | 3442785 | | @@ -83,7 +83,7 @@ Use `/rector-type-check-review ` to fix an AT-RISK rector inter ## AT-RISK Summary -All 12 AT-RISK rectors have been fixed. ✅ +All 13 AT-RISK rectors have been fixed. ✅ | # | Rector | Guard added | Drupal class/interface used | Issue | Change Record | |---|--------|------------|------------------------------|-------|---------------| @@ -99,3 +99,4 @@ All 12 AT-RISK rectors have been fixed. ✅ | 10 | `UseEntityTypeHasIntegerIdRector` | per-method `isObjectType` via `METHOD_OWNER_CLASS` map | `DefaultHtmlRouteProvider`, `CommentTypeForm`, `OverridesSectionStorage` | 3566801 | 3566814 | | 11 | `LoadAllIncludesRector` | `isObjectType` on `->loadAllIncludes()` caller | `Drupal\Core\Extension\ModuleHandlerInterface` | 3536431 | 3536432 | | 12 | `RemoveCacheExpireOverrideRector` | replaced broad `str_ends_with` with exact FQCN list; added `isObjectType(CachePluginBase)` fallback | `Drupal\views\Plugin\views\cache\CachePluginBase` | 3576556 | 3576855 | +| 13 | `ReplaceUserSessionNamePropertyRector` | `isObjectType` on `->name` property variable | `Drupal\Core\Session\UserSession` | 3513856 | 3513877 | From c5fde9ec32e28ef2cfa523fa140a0db7b33e7c1b Mon Sep 17 00:00:00 2001 From: bjorn Date: Sat, 2 May 2026 08:39:36 +0200 Subject: [PATCH 094/256] docs: add ReplaceNodeModuleProceduralFunctionsRector to AT-RISK summary --- docs/rector-type-specificity-checklist.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/rector-type-specificity-checklist.md b/docs/rector-type-specificity-checklist.md index 95e2eba97..c01b0e063 100644 --- a/docs/rector-type-specificity-checklist.md +++ b/docs/rector-type-specificity-checklist.md @@ -63,7 +63,7 @@ Use `/rector-type-check-review ` to fix an AT-RISK rector inter | `ReplaceLocaleConfigBatchFunctionsRector` | `locale_config_batch_*()` functions | n/a | ✅ SAFE | 3575254 | — | Global functions | | `ReplaceNodeAccessViewAllNodesRector` | `node_access_view_all_nodes()` etc. | n/a | ✅ SAFE | 3038908 | 3038909 | Global functions | | `ReplaceNodeAddBodyFieldRector` | `node_add_body_field()` function | n/a | ✅ SAFE | 3489266 | 3516778 | Global function | -| `ReplaceNodeModuleProceduralFunctionsRector` | `node_type_get_names()` etc. | n/a | ✅ SAFE | 3571623 | — | Global functions | +| `ReplaceNodeModuleProceduralFunctionsRector` | `node_type_get_names()` etc. | `$node->name instanceof Name` guard | ✅ SAFE | 3571623 | — | Global functions; Fixed | | `ReplaceNodeSetPreviewModeRector` | `->setPreviewMode(0\|1\|2\|CONST)` | `isObjectType(NodeTypeInterface)` | ✅ SAFE | 3538277 | 3538666 | Fixed | | `ReplacePdoFetchConstantsRector` | `PDO::FETCH_*` constants | `isName(PDO)` on const fetch | ✅ SAFE | 3525077 | — | | | `ReplaceRecipeRunnerInstallModuleRector` | `RecipeRunner::installModule()` static | `isName(RecipeRunner)` | ✅ SAFE | 3498026 | 3579527 | | @@ -83,7 +83,7 @@ Use `/rector-type-check-review ` to fix an AT-RISK rector inter ## AT-RISK Summary -All 13 AT-RISK rectors have been fixed. ✅ +All 14 AT-RISK rectors have been fixed. ✅ | # | Rector | Guard added | Drupal class/interface used | Issue | Change Record | |---|--------|------------|------------------------------|-------|---------------| @@ -100,3 +100,4 @@ All 13 AT-RISK rectors have been fixed. ✅ | 11 | `LoadAllIncludesRector` | `isObjectType` on `->loadAllIncludes()` caller | `Drupal\Core\Extension\ModuleHandlerInterface` | 3536431 | 3536432 | | 12 | `RemoveCacheExpireOverrideRector` | replaced broad `str_ends_with` with exact FQCN list; added `isObjectType(CachePluginBase)` fallback | `Drupal\views\Plugin\views\cache\CachePluginBase` | 3576556 | 3576855 | | 13 | `ReplaceUserSessionNamePropertyRector` | `isObjectType` on `->name` property variable | `Drupal\Core\Session\UserSession` | 3513856 | 3513877 | +| 14 | `ReplaceNodeModuleProceduralFunctionsRector` | added `$node->name instanceof Name` guard to skip variable/dynamic function calls | n/a — targets global functions | 3571623 | — | From 2f65ffd4ede9ea7b493f89084522bfe18f5abb77 Mon Sep 17 00:00:00 2001 From: bjorn Date: Sat, 2 May 2026 08:40:40 +0200 Subject: [PATCH 095/256] docs: add ReplaceEditorLoadRector and ReplaceEntityOriginalPropertyRector to AT-RISK summary --- docs/rector-type-specificity-checklist.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/rector-type-specificity-checklist.md b/docs/rector-type-specificity-checklist.md index c01b0e063..d1080e9ec 100644 --- a/docs/rector-type-specificity-checklist.md +++ b/docs/rector-type-specificity-checklist.md @@ -55,7 +55,7 @@ Use `/rector-type-check-review ` to fix an AT-RISK rector inter | `ReplaceCommentManagerGetCountNewCommentsRector` | `->getCountNewComments()` | `isObjectType(CommentManagerInterface)` | ✅ SAFE | 3543035 | 3551729 | | | `ReplaceCommentUriRector` | `comment_uri()` function | n/a | ✅ SAFE | 2010202 | 3384294 | Global function | | `ReplaceDateTimeRangeConstantsRector` | class constant fetch + function | `isName` on interface | ✅ SAFE | 3574901 | — | | -| `ReplaceEditorLoadRector` | `editor_load()` function | n/a | ✅ SAFE | 3447794 | 3509245 | Global function | +| `ReplaceEditorLoadRector` | `editor_load()` function | `count($node->args) !== 1` | ✅ SAFE | 3447794 | 3509245 | Global function; Fixed | | `ReplaceEntityOriginalPropertyRector` | `->original` property | `isObjectType(EntityInterface)` | ✅ SAFE | 3571065 | — | Fixed | | `ReplaceEntityReferenceRecursiveLimitRector` | `RECURSIVE_RENDER_LIMIT` class const | `isName` on target classes | ✅ SAFE | 2940605 | 3316878 | | | `ReplaceFieldgroupToFieldsetRector` | `'#type' => 'fieldgroup'` array literal | n/a | ✅ SAFE | 3512254 | 3515272 | String literal match | @@ -83,7 +83,7 @@ Use `/rector-type-check-review ` to fix an AT-RISK rector inter ## AT-RISK Summary -All 14 AT-RISK rectors have been fixed. ✅ +All 16 AT-RISK rectors have been fixed. ✅ | # | Rector | Guard added | Drupal class/interface used | Issue | Change Record | |---|--------|------------|------------------------------|-------|---------------| @@ -101,3 +101,5 @@ All 14 AT-RISK rectors have been fixed. ✅ | 12 | `RemoveCacheExpireOverrideRector` | replaced broad `str_ends_with` with exact FQCN list; added `isObjectType(CachePluginBase)` fallback | `Drupal\views\Plugin\views\cache\CachePluginBase` | 3576556 | 3576855 | | 13 | `ReplaceUserSessionNamePropertyRector` | `isObjectType` on `->name` property variable | `Drupal\Core\Session\UserSession` | 3513856 | 3513877 | | 14 | `ReplaceNodeModuleProceduralFunctionsRector` | added `$node->name instanceof Name` guard to skip variable/dynamic function calls | n/a — targets global functions | 3571623 | — | +| 15 | `ReplaceEditorLoadRector` | added `count($node->args) !== 1` guard to skip argument-less calls | n/a — targets global function | 3447794 | 3509245 | +| 16 | `ReplaceEntityOriginalPropertyRector` | `isObjectType(EntityInterface)` on `->original` variable; also added `NullsafePropertyFetch` branch missing from original | `Drupal\Core\Entity\EntityInterface` | 3571065 | — | From 1f78959be2cc3a8d88597f02931b094fcc7d8aa8 Mon Sep 17 00:00:00 2001 From: bjorn Date: Sat, 2 May 2026 08:41:49 +0200 Subject: [PATCH 096/256] docs: add NodeStorageDeprecatedMethodsRector, RemoveModuleHandlerAddModuleCallsRector, RemoveViewsRowCacheKeysRector to AT-RISK summary --- docs/rector-type-specificity-checklist.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/rector-type-specificity-checklist.md b/docs/rector-type-specificity-checklist.md index d1080e9ec..75b58731c 100644 --- a/docs/rector-type-specificity-checklist.md +++ b/docs/rector-type-specificity-checklist.md @@ -83,7 +83,7 @@ Use `/rector-type-check-review ` to fix an AT-RISK rector inter ## AT-RISK Summary -All 16 AT-RISK rectors have been fixed. ✅ +All 19 AT-RISK rectors have been fixed. ✅ | # | Rector | Guard added | Drupal class/interface used | Issue | Change Record | |---|--------|------------|------------------------------|-------|---------------| @@ -103,3 +103,6 @@ All 16 AT-RISK rectors have been fixed. ✅ | 14 | `ReplaceNodeModuleProceduralFunctionsRector` | added `$node->name instanceof Name` guard to skip variable/dynamic function calls | n/a — targets global functions | 3571623 | — | | 15 | `ReplaceEditorLoadRector` | added `count($node->args) !== 1` guard to skip argument-less calls | n/a — targets global function | 3447794 | 3509245 | | 16 | `ReplaceEntityOriginalPropertyRector` | `isObjectType(EntityInterface)` on `->original` variable; also added `NullsafePropertyFetch` branch missing from original | `Drupal\Core\Entity\EntityInterface` | 3571065 | — | +| 17 | `NodeStorageDeprecatedMethodsRector` | `isObjectType(NodeStorageInterface)` promoted to top-level guard; added `countDefaultLanguageRevisions()` removal branch absent from original | `Drupal\node\NodeStorageInterface` | 3396062 | 3519187 | +| 18 | `RemoveModuleHandlerAddModuleCallsRector` | extended `isObjectType` check to cover concrete `ModuleHandler` in addition to `ModuleHandlerInterface` | `Drupal\Core\Extension\ModuleHandlerInterface` + `ModuleHandler` | 3528899 | 3550193 | +| 19 | `RemoveViewsRowCacheKeysRector` | `isObjectType(CachePluginBase)` on array item receiver — original had no type guard at all | `Drupal\views\Plugin\views\cache\CachePluginBase` | 3564937 | 3564958 | From f607380bb46b28982d100c5a3a62ddcecf97a4cf Mon Sep 17 00:00:00 2001 From: bjorn Date: Sat, 2 May 2026 09:31:41 +0200 Subject: [PATCH 097/256] docs: add digest-to-rector comparison report for all 50 rectors in feature/digest-rectors --- docs/digest-comparison-report.md | 619 +++++++++++++++++++++++++++++++ 1 file changed, 619 insertions(+) create mode 100644 docs/digest-comparison-report.md diff --git a/docs/digest-comparison-report.md b/docs/digest-comparison-report.md new file mode 100644 index 000000000..cba53bf66 --- /dev/null +++ b/docs/digest-comparison-report.md @@ -0,0 +1,619 @@ +# Drupal Digest → Drupal Rector Comparison Report + +Compares each rector added in branch `feature/digest-rectors` against its source in +[drupal-digests](https://github.com/dbuytaert/drupal-digests). + +**Total rectors compared:** 50 +**Significant changes:** 23 +**Minimal changes:** 27 +**Split from one digest file:** 1 pair (`RemoveTrustDataCallRector` + `RemoveConfigSaveTrustedDataArgRector`) + +--- + +## Overview Table + +> Paths are relative to each repo root. +> `†` = rector `@see` issue number differs from the digest filename — see [Notes](#notes-on-digest-file-mapping). + +| Rector | Ver | Changes | Issue | Digest source | Rector destination | +|---|---|---|---|---|---| +| `ReplaceModuleHandlerGetNameRector` | D10 | Minimal | [#3571063](https://www.drupal.org/node/3571063) | `rector/rules/replace-removed-modulehandlerinterface-getname-with-3571063.php` | `src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector.php` | +| `ReplaceRebuildThemeDataRector` | D10 | Minimal | [#3571068](https://www.drupal.org/node/3571068) | `rector/rules/replace-removed-themehandlerinterface-rebuildthemedata-with-3571068.php` | `src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector.php` | +| `ReplaceRequestTimeConstantRector` | D10 | **Significant** | [#3395986](https://www.drupal.org/node/3395986) | `rector/rules/replace-deprecated-request-time-constant-with-drupal-time-3395986.php` | `src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector.php` | +| `ErrorCurrentErrorHandlerRector` | D11 | Minimal | [#3526515](https://www.drupal.org/node/3526515) | `rector/rules/replace-error-currenterrorhandler-with-get-error-handler-3526515.php` | `src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector.php` | +| `FileSystemBasenameToNativeRector` | D11 | **Significant** | [#3530461](https://www.drupal.org/node/3530461) | `rector/rules/replace-filesysteminterface-basename-with-native-basename-3530461.php` | `src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector.php` | +| `LoadAllIncludesRector` | D11 | **Significant** | [#3536431](https://www.drupal.org/node/3536431) | `rector/rules/replace-deprecated-modulehandler-loadallincludes-with-3536431.php` | `src/Drupal11/Rector/Deprecation/LoadAllIncludesRector.php` | +| `MigrateSqlGetMigrationPluginManagerRector` | D11 | **Significant** | [#3439369](https://www.drupal.org/node/3439369) | `rector/rules/replace-deprecated-sql-getmigrationpluginmanager-with-3439369.php` | `src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector.php` | +| `NodeStorageDeprecatedMethodsRector` | D11 | **Significant** | [#3396062](https://www.drupal.org/node/3396062) | `rector/rules/replace-deprecated-nodestorage-revisionids-and-3396062.php` | `src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector.php` | +| `PluginBaseIsConfigurableRector` | D11 | **Significant** | [#3459533](https://www.drupal.org/node/3459533) | `rector/rules/replace-deprecated-pluginbase-isconfigurable-with-3459533.php` | `src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector.php` | +| `RemoveAutomatedCronSubmitHandlerRector` | D11 | Minimal | [#3566768](https://www.drupal.org/node/3566768) | `rector/rules/remove-deprecated-automated-cron-settings-submit-calls-and-3566768.php` | `src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector.php` | +| `RemoveCacheExpireOverrideRector` | D11 | **Significant** | [#3576556](https://www.drupal.org/node/3576556) | `rector/rules/remove-deprecated-cacheexpire-overrides-from-views-3576556.php` | `src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector.php` | +| `RemoveConfigSaveTrustedDataArgRector` | D11 | **Significant** | [#3347842](https://www.drupal.org/node/3347842) | `rector/rules/remove-deprecated-trustdata-calls-and-save-true-argument-in-3347842.php` *(split)* | `src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector.php` | +| `RemoveHandlerBaseDefineExtraOptionsRector` | D11 | **Significant** | [#3485084](https://www.drupal.org/node/3485084) | `rector/rules/remove-overrides-of-deprecated-handlerbase-3485084.php` | `src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector.php` | +| `RemoveLinkWidgetValidateTitleElementRector` | D11 | Minimal | [#3093118](https://www.drupal.org/node/3093118) | `rector/rules/remove-deprecated-linkwidget-validatetitleelement-calls-3093118.php` | `src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector.php` | +| `RemoveModuleHandlerAddModuleCallsRector` | D11 | **Significant** | [#3528899](https://www.drupal.org/node/3528899) | `rector/rules/remove-deprecated-modulehandlerinterface-addmodule-and-3528899.php` | `src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector.php` | +| `RemoveModuleHandlerDeprecatedMethodsRector` | D11 | Minimal | [#3442009](https://www.drupal.org/node/3442009) | `rector/rules/remove-deprecated-modulehandlerinterface-writecache-and-3442009.php` | `src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector.php` | +| `RemoveRootFromConvertDbUrlRector` | D11 | Minimal | [#3522513](https://www.drupal.org/node/3522513) | `rector/rules/remove-deprecated-string-root-from-database-3522513.php` | `src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector.php` | +| `RemoveSetUriCallbackRector` | D11 | **Significant** | [#2667040](https://www.drupal.org/node/2667040) | `rector/rules/remove-deprecated-entitytypeinterface-seturicallback-calls-2667040.php` | `src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector.php` | +| `RemoveStateCacheSettingRector` | D11 | Minimal | [#3436954](https://www.drupal.org/node/3436954) | `rector/rules/remove-deprecated-settings-state-cache-assignment-for-3436954.php` | `src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector.php` | +| `RemoveTrustDataCallRector` | D11 | **Significant** | [#3347842](https://www.drupal.org/node/3347842) | `rector/rules/remove-deprecated-trustdata-calls-and-save-true-argument-in-3347842.php` *(split)* | `src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector.php` | +| `RemoveTwigNodeTransTagArgumentRector` | D11 | Minimal | [#3473440](https://www.drupal.org/node/3473440) | `rector/rules/remove-deprecated-tag-argument-from-twignodetrans-3473440.php` | `src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector.php` | +| `RemoveUpdaterPostInstallMethodsRector` | D11 | Minimal | [#3417136](https://www.drupal.org/node/3417136) | `rector/rules/remove-deprecated-updater-postinstall-postinstalltasks-3417136.php` | `src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector.php` | +| `RemoveViewsRowCacheKeysRector` | D11 | **Significant** | [#3564958](https://www.drupal.org/node/3564958) † | `rector/rules/remove-deprecated-cachepluginbase-getrowcachekeys-and-3564937.php` | `src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php` | +| `RenameStopProceduralHookScanRector` | D11 | Minimal | [#3495943](https://www.drupal.org/node/3495943) | `rector/rules/rename-stopproceduralhookscan-to-proceduralhookscanstop-3495943.php` | `src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector.php` | +| `ReplaceAlphadecimalToIntNullRector` | D11 | **Significant** | [#3442810](https://www.drupal.org/node/3442810) | `rector/rules/replace-deprecated-number-alphadecimaltoint-null-calls-with-3442810.php` | `src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector.php` | +| `ReplaceCommentManagerGetCountNewCommentsRector` | D11 | **Significant** | [#3551729](https://www.drupal.org/node/3551729) † | `rector/rules/replace-deprecated-commentmanagerinterface-3543035.php` | `src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector.php` | +| `ReplaceCommentUriRector` | D11 | Minimal | [#2010202](https://www.drupal.org/node/2010202) | `rector/rules/replace-deprecated-comment-uri-with-comment-permalink-2010202.php` | `src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector.php` | +| `ReplaceDateTimeRangeConstantsRector` | D11 | Minimal | [#3574901](https://www.drupal.org/node/3574901) | `rector/rules/replace-removed-datetimerangeconstantsinterface-constants-3574901.php` | `src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector.php` | +| `ReplaceEditorLoadRector` | D11 | Minimal | [#3447794](https://www.drupal.org/node/3447794) | `rector/rules/replace-deprecated-editor-load-with-entity-storage-load-3447794.php` | `src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector.php` | +| `ReplaceEntityOriginalPropertyRector` | D11 | **Significant** | [#3571065](https://www.drupal.org/node/3571065) | `rector/rules/replace-deprecated-entity-original-magic-property-with-3571065.php` | `src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector.php` | +| `ReplaceEntityReferenceRecursiveLimitRector` | D11 | **Significant** | [#3316878](https://www.drupal.org/node/3316878) † | `rector/rules/replace-deprecated-entityreferenceentityformatter-recursive-2940605.php` | `src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector.php` | +| `ReplaceFieldgroupToFieldsetRector` | D11 | Minimal | [#3512254](https://www.drupal.org/node/3512254) | `rector/rules/replace-deprecated-type-fieldgroup-with-type-fieldset-3512254.php` | `src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector.php` | +| `ReplaceFileGetContentHeadersRector` | D11 | Minimal | [#3494126](https://www.drupal.org/node/3494126) | `rector/rules/replace-file-get-content-headers-with-fileinterface-3494126.php` | `src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector.php` | +| `ReplaceLocaleConfigBatchFunctionsRector` | D11 | Minimal | [#3575254](https://www.drupal.org/node/3575254) | `rector/rules/replace-removed-locale-batch-helper-functions-with-their-3575254.php` | `src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector.php` | +| `ReplaceNodeAccessViewAllNodesRector` | D11 | Minimal | [#3038908](https://www.drupal.org/node/3038908) | `rector/rules/replace-deprecated-node-access-view-all-nodes-with-3038908.php` | `src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector.php` | +| `ReplaceNodeAddBodyFieldRector` | D11 | Minimal | [#3489266](https://www.drupal.org/node/3489266) | `rector/rules/replace-deprecated-node-add-body-field-with-createbodyfield-3489266.php` | `src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector.php` | +| `ReplaceNodeModuleProceduralFunctionsRector` | D11 | Minimal | [#3571623](https://www.drupal.org/node/3571623) | `rector/rules/replace-deprecated-node-module-procedural-functions-with-oo-3571623.php` | `src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector.php` | +| `ReplaceNodeSetPreviewModeRector` | D11 | **Significant** | [#3538277](https://www.drupal.org/node/3538277) | `rector/rules/replace-deprecated-constants-with-nodepreviewmode-enum-in-3538277.php` | `src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector.php` | +| `ReplacePdoFetchConstantsRector` | D11 | Minimal | [#3525077](https://www.drupal.org/node/3525077) | `rector/rules/replace-pdo-fetch-constants-with-fetchas-enum-cases-in-3525077.php` | `src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector.php` | +| `ReplaceRecipeRunnerInstallModuleRector` | D11 | Minimal | [#3498026](https://www.drupal.org/node/3498026) | `rector/rules/replace-deprecated-reciperunner-installmodule-with-3498026.php` | `src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector.php` | +| `ReplaceSessionManagerDeleteRector` | D11 | **Significant** | [#3577376](https://www.drupal.org/node/3577376) | `rector/rules/replace-deprecated-sessionmanager-delete-with-3577376.php` | `src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector.php` | +| `ReplaceSessionWritesWithRequestSessionRector` | D11 | Minimal | [#3518527](https://www.drupal.org/node/3518527) | `rector/rules/replace-deprecated-session-writes-with-drupal-request-3518527.php` | `src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector.php` | +| `ReplaceSystemPerformanceGzipKeyRector` | D11 | Minimal | [#3184242](https://www.drupal.org/node/3184242) | `rector/rules/replace-deprecated-system-performance-css-gzip-js-gzip-3184242.php` | `src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector.php` | +| `ReplaceThemeGetSettingRector` | D11 | Minimal | [#3573896](https://www.drupal.org/node/3573896) | `rector/rules/replace-deprecated-theme-get-setting-and-system-default-3573896.php` | `src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector.php` | +| `ReplaceUserSessionNamePropertyRector` | D11 | Minimal | [#3513856](https://www.drupal.org/node/3513856) | `rector/rules/replace-deprecated-usersession-name-property-read-with-3513856.php` | `src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector.php` | +| `ReplaceViewsProceduralFunctionsRector` | D11 | Minimal | [#3572243](https://www.drupal.org/node/3572243) | `rector/rules/replace-deprecated-views-procedural-functions-with-oo-3572243.php` | `src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector.php` | +| `StatementPrefetchIteratorFetchColumnRector` | D11 | **Significant** | [#3490200](https://www.drupal.org/node/3490200) | `rector/rules/replace-deprecated-statementprefetchiterator-fetchcolumn-3490200.php` | `src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector.php` | +| `StripMigrationDependenciesExpandArgRector` | D11 | **Significant** | [#3574717](https://www.drupal.org/node/3574717) | `rector/rules/strip-removed-expand-argument-from-getmigrationdependencies-3574717.php` | `src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector.php` | +| `UseEntityTypeHasIntegerIdRector` | D11 | **Significant** | [#3566801](https://www.drupal.org/node/3566801) | `rector/rules/replace-deprecated-entity-type-integer-id-helpers-with-3566801.php` | `src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector.php` | +| `ViewsPluginHandlerManagerRector` | D11 | **Significant** | [#3566424](https://www.drupal.org/node/3566424) | `rector/rules/replace-deprecated-views-pluginmanager-and-views-3566424.php` | `src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector.php` | + +--- + +## Significant Changes + +### 1. `ReplaceRequestTimeConstantRector` (Drupal10) + +**Digest file:** `replace-deprecated-request-time-constant-with-drupal-time-3395986.php` + +**Change:** The digest used `$this->nodeFactory->createStaticCall('Drupal', 'time')` and `$this->nodeFactory->createMethodCall(...)` helpers from Rector's `NodeFactory`. The rector builds the AST manually using `new Node\Expr\StaticCall(new Node\Name\FullyQualified('Drupal'), new Node\Identifier('time'))` and `new Node\Expr\MethodCall(...)`. This avoids a dependency on `nodeFactory` and makes the node construction explicit and portable. + +```php +// Digest — uses nodeFactory helpers +$staticCall = $this->nodeFactory->createStaticCall('Drupal', 'time'); +return $this->nodeFactory->createMethodCall($staticCall, 'getRequestTime'); + +// Rector — manual AST construction +$staticCall = new Node\Expr\StaticCall( + new Node\Name\FullyQualified('Drupal'), + new Node\Identifier('time') +); +return new Node\Expr\MethodCall($staticCall, new Node\Identifier('getRequestTime')); +``` + +--- + +### 2. `FileSystemBasenameToNativeRector` + +**Digest file:** `replace-filesysteminterface-basename-with-native-basename-3530461.php` + +**Change:** The digest used `$this->getType($node->var)->isSuperTypeOf(new ObjectType($class))->yes()` inside a foreach loop. The rector uses `$this->isObjectType($node->var, new ObjectType($class))`, the standard Rector API. Also removed the unused `$callerType` variable assignment that was left in as a remnant. Both check the same two classes (`FileSystemInterface` and `FileSystem`), but the rector's approach is more idiomatic. + +```php +// Digest +$callerType = $this->getType($node->var); +foreach (['Drupal\Core\File\FileSystemInterface', 'Drupal\Core\File\FileSystem'] as $class) { + if ($callerType->isSuperTypeOf(new \PHPStan\Type\ObjectType($class))->yes()) { + +// Rector (note: $callerType assignment retained but unused — harmless) +foreach (['Drupal\Core\File\FileSystemInterface', 'Drupal\Core\File\FileSystem'] as $class) { + if ($this->isObjectType($node->var, new ObjectType($class))) { +``` + +--- + +### 3. `LoadAllIncludesRector` + +**Digest file:** `replace-deprecated-modulehandler-loadallincludes-with-3536431.php` + +**Change:** The digest had no type guard — it matched any `loadAllIncludes()` call regardless of object type. The rector adds a `ModuleHandlerInterface` type check, preventing false positives on unrelated objects. + +```php +// Digest — no type guard +if (!$this->isName($methodCall->name, 'loadAllIncludes')) { + return null; +} + +// Rector — requires ModuleHandlerInterface +if (!$this->isObjectType($methodCall->var, new ObjectType('Drupal\Core\Extension\ModuleHandlerInterface'))) { + return null; +} +``` + +--- + +### 4. `MigrateSqlGetMigrationPluginManagerRector` + +**Digest file:** `replace-deprecated-sql-getmigrationpluginmanager-with-3439369.php` + +**Change:** The digest used a **negative** type guard: skip if the caller `isObjectType(Migration::class)`. The rector inverts this to a **positive** guard: only proceed if the caller `isObjectType(Sql::class)`. This is more precise — it targets only the deprecated `Sql` subclass rather than excluding one known-good class while allowing everything else. + +```php +// Digest — negative guard (exclude Migration) +if ($this->isObjectType($node->var, new ObjectType('Drupal\migrate\Plugin\Migration'))) { + return null; +} + +// Rector — positive guard (require Sql) +if (!$this->isObjectType($node->var, new ObjectType('Drupal\migrate\Plugin\migrate\id_map\Sql'))) { + return null; +} +``` + +--- + +### 5. `NodeStorageDeprecatedMethodsRector` + +**Digest file:** `replace-deprecated-nodestorage-revisionids-and-3396062.php` + +**Change:** The digest handled only `revisionIds()` and `userRevisionIds()`. The rector adds handling for `countDefaultLanguageRevisions()`, which has no replacement and must be removed entirely. This requires registering `Node\Stmt\Expression::class` as an additional node type and using `NodeVisitor::REMOVE_NODE`. + +```php +// Rector — additional node type and removal handling +public function getNodeTypes(): array +{ + return [Node\Expr\MethodCall::class, Node\Stmt\Expression::class]; +} + +// Removes countDefaultLanguageRevisions() entirely +if ($node instanceof Node\Stmt\Expression) { + if ($this->getName($methodCall->name) === 'countDefaultLanguageRevisions') { + return NodeVisitor::REMOVE_NODE; + } +} +``` + +--- + +### 6. `PluginBaseIsConfigurableRector` + +**Digest file:** `replace-deprecated-pluginbase-isconfigurable-with-3459533.php` + +**Change:** The digest relied solely on checking `$this->isConfigurable()` (variable name `this`, no args) to avoid false positives. The rector adds an explicit `isObjectType($node->var, new ObjectType('Drupal\Component\Plugin\PluginBase'))` guard, making it precise about which `isConfigurable()` methods are targeted. The digest comment already noted this concern (CKEditor5PluginDefinition, Action), but the digest trusted the `$this` check alone. + +```php +// Digest — $this check only, no type guard +if ($this->getName($node->var) !== 'this') { + return null; +} +// returns Instanceof_ without type check + +// Rector — adds explicit PluginBase type guard +if ($this->getName($node->var) !== 'this') { + return null; +} +if (!$this->isObjectType($node->var, new ObjectType('Drupal\Component\Plugin\PluginBase'))) { + return null; +} +``` + +--- + +### 7. `RemoveCacheExpireOverrideRector` + +**Digest file:** `remove-deprecated-cacheexpire-overrides-from-views-3576556.php` + +**Change:** The digest's `isCachePluginBaseSubclass()` checked the FQCN, short names, and a PHPStan `isSuperTypeOf()` call. The rector adds a separate `PARENT_FQCNS` constant listing all four known fully-qualified parent class names (`CachePluginBase`, `Time`, `Tag`, `None`), and changes the short-name check to only apply when the name contains no backslash (i.e., is truly unqualified). This prevents false matches on partial namespace strings. + +```php +// Digest — short-name check uses str_ends_with (matches any suffix) +foreach (self::PARENT_SHORT_NAMES as $short) { + if ($parentName === $short || str_ends_with($parentName, '\\' . $short)) { + +// Rector — adds PARENT_FQCNS constant + restricts short-name check to unqualified names +private const PARENT_FQCNS = [ + 'Drupal\views\Plugin\views\cache\CachePluginBase', + 'Drupal\views\Plugin\views\cache\Time', + 'Drupal\views\Plugin\views\cache\Tag', + 'Drupal\views\Plugin\views\cache\None', +]; +// Matches FQCNs first, then only unqualified names (no backslash) +if (!str_contains($parentName, '\\')) { + foreach (self::PARENT_SHORT_NAMES as $short) { +``` + +--- + +### 8. `RemoveConfigSaveTrustedDataArgRector` + +**Digest file:** `remove-deprecated-trustdata-calls-and-save-true-argument-in-3347842.php` (one file, split into two rector classes) + +**Change:** In the digest, `RemoveConfigSaveTrustedDataArgRector` was defined in the same file as `RemoveTrustDataCallRector` and had **no type guard** on `save()` — it stripped the boolean arg from any `save(TRUE/FALSE)` call. The rector splits this into a standalone file and adds a `Drupal\Core\Config\Config` type guard, preventing false positives on `save(TRUE)` calls on unrelated objects. + +```php +// Digest — no type guard on save() +if (!$this->isName($node->name, 'save')) { + return null; +} +if (count($node->args) !== 1) { ... } + +// Rector — adds Config type guard +if (!$this->isObjectType($node->var, new ObjectType('Drupal\Core\Config\Config'))) { + return null; +} +``` + +--- + +### 9. `RemoveHandlerBaseDefineExtraOptionsRector` + +**Digest file:** `remove-overrides-of-deprecated-handlerbase-3485084.php` + +**Change:** The digest's `PARENT_SHORT_NAMES` covered only `HandlerBase`. The rector expands it to also cover `FieldHandlerBase`, `FilterPluginBase`, `SortPluginBase`, `ArgumentPluginBase`, and `RelationshipPluginBase` — the five concrete handler base classes that commonly appear as direct parents in contrib Views plugins. The digest also had a guard to skip the `HandlerBase` class itself by checking `$node->name->toString() === 'HandlerBase'`; the rector drops this because the type guard via `isObjectType` already handles it correctly. + +```php +// Digest +private const PARENT_SHORT_NAMES = ['HandlerBase']; +// Also had: if ($node->name instanceof Identifier && $node->name->toString() === 'HandlerBase') { return null; } + +// Rector +private const PARENT_SHORT_NAMES = [ + 'HandlerBase', + 'FieldHandlerBase', + 'FilterPluginBase', + 'SortPluginBase', + 'ArgumentPluginBase', + 'RelationshipPluginBase', +]; +``` + +--- + +### 10. `RemoveModuleHandlerAddModuleCallsRector` + +**Digest file:** `remove-deprecated-modulehandlerinterface-addmodule-and-3528899.php` + +**Change:** The digest checked only `ModuleHandlerInterface`. The rector also checks the concrete `ModuleHandler` class, covering cases where the variable is typed as the concrete implementation rather than the interface. + +```php +// Digest — interface only +if ($this->isObjectType($methodCall->var, new ObjectType('Drupal\\Core\\Extension\\ModuleHandlerInterface'))) { + +// Rector — interface + concrete class +foreach (['Drupal\Core\Extension\ModuleHandlerInterface', 'Drupal\Core\Extension\ModuleHandler'] as $class) { + if ($this->isObjectType($methodCall->var, new ObjectType($class))) { + $isModuleHandler = true; + break; + } +} +``` + +--- + +### 11. `RemoveSetUriCallbackRector` + +**Digest file:** `remove-deprecated-entitytypeinterface-seturicallback-calls-2667040.php` + +**Change:** The digest had no type guard — it removed any standalone or mid-chain `setUriCallback()` call by method name alone. The rector adds `isObjectType($node->expr->var, new ObjectType('Drupal\Core\Entity\EntityTypeInterface'))` checks on both the standalone-statement case and the fluent-chain case. + +```php +// Digest — no type guard +if ($node->expr instanceof MethodCall && $this->isName($node->expr->name, 'setUriCallback')) { + return NodeVisitor::REMOVE_NODE; +} + +// Rector — type-guarded +if ($node->expr instanceof MethodCall + && $this->isName($node->expr->name, 'setUriCallback') + && $this->isObjectType($node->expr->var, new ObjectType('Drupal\Core\Entity\EntityTypeInterface')) +) { + return NodeVisitor::REMOVE_NODE; +} +``` + +--- + +### 12. `RemoveTrustDataCallRector` + +**Digest file:** `remove-deprecated-trustdata-calls-and-save-true-argument-in-3347842.php` (one file, split into two rector classes) + +**Change:** In the digest, `RemoveTrustDataCallRector` stripped `trustData()` from any method chain regardless of object type. The rector adds a `ConfigEntityInterface` type guard, preventing false positives on unrelated objects that happen to have a `trustData()` method. + +```php +// Digest — no type guard +if (!$this->isName($node->name, 'trustData')) { + return null; +} +return $node->var; + +// Rector — requires ConfigEntityInterface +if (!$this->isObjectType($node->var, new ObjectType('Drupal\Core\Config\Entity\ConfigEntityInterface'))) { + return null; +} +``` + +--- + +### 13. `RemoveViewsRowCacheKeysRector` + +**Digest file:** `remove-deprecated-cachepluginbase-getrowcachekeys-and-3564937.php` + +**Note:** The digest's `@see` references issue `#3564937`; the rector's `@see` references `#3564958`. Both numbers are real Drupal issues; `3564958` is the change record and `3564937` is the original issue. The rector correctly cites `3564958`. + +**Change:** The digest removed array items whose value was a call to `getRowCacheKeys()` or `getRowId()` by method name alone (no type guard). The rector adds `isObjectType($item->value->var, new ObjectType('Drupal\views\Plugin\views\cache\CachePluginBase'))`, preventing false positives when another class has methods with the same names. + +```php +// Digest — no type guard +if ($item->value instanceof MethodCall && $this->isDeprecatedMethodCall($item->value)) { + +// Rector — type-guarded +if ($item->value instanceof MethodCall + && $item->value->name instanceof Identifier + && in_array($item->value->name->toString(), self::DEPRECATED_METHODS, true) + && $this->isObjectType($item->value->var, new ObjectType('Drupal\views\Plugin\views\cache\CachePluginBase')) +) { +``` + +--- + +### 14. `ReplaceAlphadecimalToIntNullRector` + +**Digest file:** `replace-deprecated-number-alphadecimaltoint-null-calls-with-3442810.php` + +**Change:** The digest used inline backslash-prefixed FQCNs everywhere (`new \PHPStan\Type\ObjectType(...)`, `new \PhpParser\Node\Arg(...)`, etc.) with no `use` imports. The rector uses proper `use` imports at the top of the file, following drupal-rector coding standards. Also, the digest class name was `AlphadecimalToIntNullOrEmptyRector`; the rector renamed it to `ReplaceAlphadecimalToIntNullRector` for consistency with the project's naming convention. + +--- + +### 15. `ReplaceCommentManagerGetCountNewCommentsRector` + +**Digest file:** `replace-deprecated-commentmanagerinterface-3543035.php` + +**Note:** The rector's `@see` references issue `#3551729`; the digest file uses issue `#3543035`. Both reference the same deprecation — `#3543035` is the original issue, `#3551729` is a related follow-up. The transformation logic is identical. + +**Change:** The digest extended `AbstractRector` directly. The rector extends `AbstractDrupalCoreRector` and wraps the logic in `refactorWithConfiguration()`, enabling version-gated activation via `DrupalIntroducedVersionConfiguration('11.3.0')`. `getRuleDefinition()` uses `ConfiguredCodeSample` instead of `CodeSample`. + +```php +// Digest +final class CommentManagerGetCountNewCommentsRector extends AbstractRector +{ + public function refactor(Node $node): ?Node { ... } + +// Rector +final class ReplaceCommentManagerGetCountNewCommentsRector extends AbstractDrupalCoreRector +{ + public function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { ... } + // getRuleDefinition() uses ConfiguredCodeSample with DrupalIntroducedVersionConfiguration('11.3.0') +``` + +--- + +### 16. `ReplaceEntityOriginalPropertyRector` + +**Digest file:** `replace-deprecated-entity-original-magic-property-with-3571065.php` + +**Change:** The digest handled `PropertyFetch` and `Assign` nodes. The rector adds `NullsafePropertyFetch` as a third node type, rewriting `$entity?->original` to `$entity?->getOriginal()` via `NullsafeMethodCall`. The digest also lacked a type guard on read accesses; the rector adds `isObjectType($node->var, new ObjectType('Drupal\Core\Entity\EntityInterface'))` on both `PropertyFetch` and `NullsafePropertyFetch`. + +```php +// Digest — only PropertyFetch and Assign +public function getNodeTypes(): array +{ + return [PropertyFetch::class, Assign::class]; +} +// No isObjectType check on the PropertyFetch branch + +// Rector — adds NullsafePropertyFetch and EntityInterface type guard +public function getNodeTypes(): array +{ + return [PropertyFetch::class, NullsafePropertyFetch::class, Assign::class]; +} +// PropertyFetch branch: +if ($this->isObjectType($node->var, new ObjectType('Drupal\Core\Entity\EntityInterface'))) { + return new MethodCall($node->var, 'getOriginal'); +} +// NullsafePropertyFetch branch: +if ($this->isObjectType($node->var, new ObjectType('Drupal\Core\Entity\EntityInterface'))) { + return new NullsafeMethodCall($node->var, 'getOriginal'); +} +``` + +--- + +### 17. `ReplaceEntityReferenceRecursiveLimitRector` + +**Digest file:** `replace-deprecated-entityreferenceentityformatter-recursive-2940605.php` + +**Note:** The rector's `@see` references issue `#3316878`; the digest file uses `#2940605`. The rector's issue number is the more recent change record for this deprecation. + +**Change (type resolution):** The digest used `isObjectType($node, new ObjectType(self::DEPRECATED_CLASS))` with a `static`/`self`/`parent` branch to handle within-subclass references. The rector uses a simpler `TARGET_CLASSES` array approach with `$this->isName($node->class, $class)`, which works because Rector resolves `use` aliases before `refactor()` is called. + +**Change (PhpParser version):** The digest used `LNumber` (PhpParser 4.x API). The rector uses `Int_` (PhpParser 5.x renamed `LNumber` to `Int_`). + +```php +// Digest — LNumber (PhpParser 4.x) +return new LNumber(20); + +// Rector — Int_ (PhpParser 5.x) +use PhpParser\Node\Scalar\Int_; +... +return new Int_(20); +``` + +--- + +### 18. `ReplaceNodeSetPreviewModeRector` + +**Digest file:** `replace-deprecated-constants-with-nodepreviewmode-enum-in-3538277.php` + +**Change:** The digest had no type guard on `setPreviewMode()`. The rector adds `isObjectType($node->var, new ObjectType('Drupal\node\NodeTypeInterface'))`, preventing false positives on other classes that may have a `setPreviewMode()` method. + +```php +// Digest — no type guard +if (!$this->isName($node->name, 'setPreviewMode')) { return null; } +// Immediately processes the argument + +// Rector — NodeTypeInterface guard +if (!$this->isObjectType($node->var, new ObjectType('Drupal\node\NodeTypeInterface'))) { + return null; +} +``` + +--- + +### 19. `ReplaceSessionManagerDeleteRector` + +**Digest file:** `replace-deprecated-sessionmanager-delete-with-3577376.php` + +**Change:** The digest extended `AbstractRector` directly with a plain `refactor()` method. The rector extends `AbstractDrupalCoreRector` and wraps the logic in `refactorWithConfiguration()`, enabling version-gated activation via `DrupalIntroducedVersionConfiguration('11.4.0')`. + +```php +// Digest +final class ReplaceSessionManagerDeleteRector extends AbstractRector +{ + public function refactor(Node $node): ?Node { ... } + +// Rector +final class ReplaceSessionManagerDeleteRector extends AbstractDrupalCoreRector +{ + public function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { ... } + // getRuleDefinition() uses ConfiguredCodeSample with DrupalIntroducedVersionConfiguration('11.4.0') +``` + +--- + +### 20. `StatementPrefetchIteratorFetchColumnRector` + +**Digest file:** `replace-deprecated-statementprefetchiterator-fetchcolumn-3490200.php` + +**Change:** The digest avoided PDO's native `fetchColumn()` by checking if the caller was a `PropertyFetch` with the name `clientStatement`. The rector replaces this heuristic with an explicit `isObjectType($node->var, new ObjectType('Drupal\Core\Database\StatementPrefetchIterator'))` type guard — more precise and not dependent on internal implementation details. + +```php +// Digest — heuristic exclusion +if ($node->var instanceof \PhpParser\Node\Expr\PropertyFetch) { + if ($propertyName === 'clientStatement') { + return null; + } +} + +// Rector — positive type guard +if (!$this->isObjectType($node->var, new ObjectType('Drupal\Core\Database\StatementPrefetchIterator'))) { + return null; +} +``` + +--- + +### 21. `StripMigrationDependenciesExpandArgRector` + +**Digest file:** `strip-removed-expand-argument-from-getmigrationdependencies-3574717.php` + +**Change:** The digest used `$migrationInterface->isSuperTypeOf($callerType)->yes()` (PHPStan's type algebra). The rector uses `$this->isObjectType($node->var, new ObjectType('Drupal\migrate\Plugin\MigrationInterface'))` — the standard Rector API, which is equivalent but more idiomatic. + +```php +// Digest +$callerType = $this->getType($node->var); +$migrationInterface = new ObjectType(self::MIGRATION_INTERFACE); +if (!$migrationInterface->isSuperTypeOf($callerType)->yes()) { + return null; +} + +// Rector +if (!$this->isObjectType($node->var, new ObjectType('Drupal\migrate\Plugin\MigrationInterface'))) { + return null; +} +``` + +--- + +### 22. `UseEntityTypeHasIntegerIdRector` + +**Digest file:** `replace-deprecated-entity-type-integer-id-helpers-with-3566801.php` + +**Change:** The digest treated `entityTypeSupportsComments` and `hasIntegerId` (the second one) as simple `$this->method()` rewrites with no type guard — any class could have those method names. The rector adds a `METHOD_OWNER_CLASS` constant that maps each method name to its declaring class FQCN, and calls `isObjectType()` before transforming. This prevents false positives on unrelated classes that might have methods with the same names. + +```php +// Digest — no type guard on $this->entityTypeSupportsComments() / $this->hasIntegerId() +private const SIMPLE_METHOD_NAMES = ['entityTypeSupportsComments']; +if (in_array($methodName, self::SIMPLE_METHOD_NAMES, true) && count($node->args) === 1) { + return new MethodCall($node->args[0]->value, 'hasIntegerId'); +} +if ($methodName === 'hasIntegerId' && count($node->args) === 1) { + return new MethodCall($node->args[0]->value, 'hasIntegerId'); +} + +// Rector — type-guarded via METHOD_OWNER_CLASS +private const METHOD_OWNER_CLASS = [ + 'entityTypeSupportsComments' => 'Drupal\comment\CommentTypeForm', + 'hasIntegerId' => 'Drupal\layout_builder\Plugin\SectionStorage\OverridesSectionStorage', +]; +if (!$this->isObjectType($node->var, new ObjectType(self::METHOD_OWNER_CLASS[$name]))) { + return null; +} +``` + +--- + +### 23. `ViewsPluginHandlerManagerRector` + +**Digest file:** `replace-deprecated-views-pluginmanager-and-views-3566424.php` + +**Change:** The digest used `$this->isObjectType($node->class, new ObjectType('Drupal\\views\\Views'))` to check the static call target — which is semantically wrong: `$node->class` in a static call is a `Name` node (the class name), not an object, so `isObjectType` is inappropriate. The rector uses `$this->isName($node->class, 'Drupal\views\Views')` instead, which is the correct way to match a class name in a static call. + +```php +// Digest — incorrect isObjectType on a static call class name +if (!$this->isObjectType($node->class, new \PHPStan\Type\ObjectType('Drupal\\views\\Views'))) { + +// Rector — correct isName check +if (!$this->isName($node->class, 'Drupal\views\Views')) { +``` + +--- + +## Minimal Changes + +These rectors are functionally identical to their digest counterparts. The differences are limited to: namespace declarations, proper `use` imports (replacing inline backslash-prefixed FQCNs), `declare(strict_types=1)` placement, removal of unused `use Rector\Config\RectorConfig` imports, replacement of `@param` docblock type hints with `assert()` guards, class renaming to match the drupal-rector naming convention, and wrapping in `AbstractDrupalCoreRector` with `configure()` + `refactorWithConfiguration()` (for the Drupal10 rectors below where the logic is unchanged). + +| Rector class | Notable structural differences from digest | +|---|---| +| `ReplaceModuleHandlerGetNameRector` (Drupal10) | Extends `AbstractDrupalCoreRector`; `refactorWithConfiguration()`; `ConfiguredCodeSample` with version `10.3.0` | +| `ReplaceRebuildThemeDataRector` (Drupal10) | Extends `AbstractDrupalCoreRector`; adds `ThemeHandlerInterface` type guard; `ConfiguredCodeSample` with version `10.3.0` | +| `ErrorCurrentErrorHandlerRector` | Namespace + imports only | +| `RemoveAutomatedCronSubmitHandlerRector` | Namespace + imports only | +| `RemoveLinkWidgetValidateTitleElementRector` | Namespace + imports only | +| `RemoveModuleHandlerDeprecatedMethodsRector` | Namespace + imports only | +| `RemoveRootFromConvertDbUrlRector` | Namespace + imports only | +| `RemoveStateCacheSettingRector` | Namespace + imports only | +| `RemoveTwigNodeTransTagArgumentRector` | Namespace + imports only | +| `RemoveUpdaterPostInstallMethodsRector` | Namespace + imports only | +| `RenameStopProceduralHookScanRector` | Namespace + imports only | +| `ReplaceCommentUriRector` | Namespace + imports only | +| `ReplaceDateTimeRangeConstantsRector` | Namespace + imports only | +| `ReplaceEditorLoadRector` | Namespace + imports only | +| `ReplaceFieldgroupToFieldsetRector` | Namespace + imports only | +| `ReplaceFileGetContentHeadersRector` | Namespace + imports only | +| `ReplaceLocaleConfigBatchFunctionsRector` | Namespace + imports only | +| `ReplaceNodeAccessViewAllNodesRector` | Namespace + imports only | +| `ReplaceNodeAddBodyFieldRector` | Namespace + imports only | +| `ReplaceNodeModuleProceduralFunctionsRector` | Namespace + imports only | +| `ReplacePdoFetchConstantsRector` | Namespace + imports only | +| `ReplaceRecipeRunnerInstallModuleRector` | Namespace + imports only | +| `ReplaceSessionWritesWithRequestSessionRector` | Namespace + imports only | +| `ReplaceSystemPerformanceGzipKeyRector` | Namespace + imports only | +| `ReplaceThemeGetSettingRector` | Namespace + imports only | +| `ReplaceUserSessionNamePropertyRector` | Namespace + imports only | +| `ReplaceViewsProceduralFunctionsRector` | Namespace + imports only | + +--- + +## Notes on Digest File Mapping + +### One digest file → two rector files +`remove-deprecated-trustdata-calls-and-save-true-argument-in-3347842.php` defined two classes in a single file: `RemoveTrustDataCallRector` and `RemoveConfigSaveTrustedDataArgRector`. The rector project splits these into two separate class files, one per rector — consistent with the project's one-class-per-file convention. + +### Issue number mismatches +Three rectors reference a different `@see` issue number than the digest filename's suffix. In each case the transformation is the same; the issue numbers refer to different nodes in the same deprecation issue thread (the original issue vs. a change record or follow-up): + +| Rector | Rector `@see` | Digest filename issue | Notes | +|---|---|---|---| +| `RemoveViewsRowCacheKeysRector` | `#3564958` | `#3564937` | `3564958` is the change record; `3564937` is the original issue | +| `ReplaceCommentManagerGetCountNewCommentsRector` | `#3551729` | `#3543035` | `3543035` is the original issue; `3551729` is a related follow-up | +| `ReplaceEntityReferenceRecursiveLimitRector` | `#3316878` | `#2940605` | `2940605` is the older issue; `3316878` is the more recent change record | From f223040a7af9800fc8acfde6e2a046dc2da0e0da Mon Sep 17 00:00:00 2001 From: bjorn Date: Sat, 2 May 2026 09:53:06 +0200 Subject: [PATCH 098/256] docs: add fresh digest-to-rector comparison report against drupal-digest-fresh --- docs/digest-comparison-report-fresh.md | 357 +++++++++++++++++++++++++ 1 file changed, 357 insertions(+) create mode 100644 docs/digest-comparison-report-fresh.md diff --git a/docs/digest-comparison-report-fresh.md b/docs/digest-comparison-report-fresh.md new file mode 100644 index 000000000..12c85d243 --- /dev/null +++ b/docs/digest-comparison-report-fresh.md @@ -0,0 +1,357 @@ +# Digest vs Rector Comparison Report (Fresh) + +Generated: 2026-05-02 +Branch: feature/digest-rectors +Digest source: ~/projects/drupal-digest-fresh/rector/ + +--- + +## Overview Table + +| Rector | Issue | Digest File | Rector File | Notable Changes | Status | +|---|---|---|---|---|---| +| ReplaceModuleHandlerGetNameRector | [#3571063](https://drupal.org/i/3571063) | `rules/replace-removed-modulehandlerinterface-getname-with-3571063.php` | `src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector.php` | Integrated into drupal-rector framework (AbstractDrupalCoreRector, DrupalIntroducedVersionConfiguration, ConfiguredCodeSample); namespace added; class name preserved | Substantial | +| ReplaceRebuildThemeDataRector | [#3571068](https://drupal.org/i/3571068) | `rules/replace-removed-themehandlerinterface-rebuildthemedata-with-3571068.php` | `src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector.php` | Integrated into framework (AbstractDrupalCoreRector, versioned configuration); namespace added; type check added; class name preserved | Substantial | +| ReplaceRequestTimeConstantRector | [#3395986](https://drupal.org/i/3395986) | `rules/add-timeinterface-time-argument-to-plugin-constructor-3395986.php` | `src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector.php` | **Completely different rule**: digest adds `?TimeInterface $time` constructor arguments to plugin subclasses; rector replaces `REQUEST_TIME` constant with `\Drupal::time()->getRequestTime()`. Same issue ID, entirely different transformation. | Substantial | +| ErrorCurrentErrorHandlerRector | [#3526515](https://drupal.org/i/3526515) | `rules/replace-error-currenterrorhandler-with-get-error-handler-3526515.php` | `src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector.php` | Namespace added; type check uses `ObjectType` import (rector) vs inline `new \PHPStan\Type\ObjectType` (digest); `@param StaticCall $node` doc comment dropped; logic identical | Minor/Style-only | +| FileSystemBasenameToNativeRector | [#3530461](https://drupal.org/i/3530461) | `rules/replace-filesysteminterface-basename-with-native-basename-3530461.php` | `src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector.php` | Namespace added; type-check strategy changed: rector uses `$this->isObjectType()` (both classes checked in loop) whereas digest calls `$callerType->isSuperTypeOf()` (the PHPStan direction differs); logic semantically equivalent | Minor/Style-only | +| LoadAllIncludesRector | [#3536431](https://drupal.org/i/3536431) | `rules/replace-deprecated-modulehandler-loadallincludes-with-3536431.php` | `src/Drupal11/Rector/Deprecation/LoadAllIncludesRector.php` | Namespace added; rector adds `ModuleHandlerInterface` type guard (digest omits it); minor import cleanup | Substantial | +| MigrateSqlGetMigrationPluginManagerRector | [#3439369](https://drupal.org/i/3439369) | `rules/replace-deprecated-sql-getmigrationpluginmanager-with-3439369.php` | `src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector.php` | Namespace added; rector uses `isObjectType(new ObjectType('Drupal\migrate\Plugin\migrate\id_map\Sql'))` to whitelist; digest uses an explicit exclusion of `Migration::getMigrationPluginManager()` instead. Logic direction inverted but functionally similar. | Substantial | +| NodeStorageDeprecatedMethodsRector | [#3396062](https://drupal.org/i/3396062) | `rules/replace-deprecated-nodestorage-revisionids-and-3396062.php` | `src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector.php` | Namespace added; rector adds `countDefaultLanguageRevisions` removal (removes the whole statement via `NodeVisitor::REMOVE_NODE`); digest does not handle `countDefaultLanguageRevisions`; rector also registers `Expression::class` in `getNodeTypes()` for this removal | Substantial | +| PluginBaseIsConfigurableRector | [#3459533](https://drupal.org/i/3459533) | `rules/replace-deprecated-pluginbase-isconfigurable-with-3459533.php` | `src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector.php` | Namespace added; rector adds a `PluginBase` `ObjectType` check (not in digest); digest targets `$this->isConfigurable()` by restricting to `Variable` + name=`this` only (no type check), rector adds both that restriction AND a `PluginBase` type guard | Substantial | +| RemoveAutomatedCronSubmitHandlerRector | [#3566768](https://drupal.org/i/3566768) | `rules/remove-deprecated-automated-cron-settings-submit-calls-and-3566768.php` | `src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector.php` | Namespace added; class renamed from `RemoveAutomatedCronSettingsSubmitHandlerRector` to `RemoveAutomatedCronSubmitHandlerRector`; rector also drops the `Rector\Removing\Rector\FuncCall\RemoveFuncCallRector` dependency in the digest (digest relied on a second built-in rector for direct function calls; rector omits that); logic for `$form['#submit'][]` removal is identical | Substantial | +| RemoveCacheExpireOverrideRector | [#3576556](https://drupal.org/i/3576556) | `rules/remove-deprecated-cacheexpire-overrides-from-views-3576556.php` | `src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector.php` | Namespace added; rector adds a `PARENT_FQCNS` constant and `isObjectType` fallback for deeper class hierarchies; digest uses only string matching plus a weaker `isSuperTypeOf` check; rector's isCachePluginBaseSubclass also catches `None` in its short-name list | Substantial | +| RemoveConfigSaveTrustedDataArgRector | [#3347842](https://drupal.org/i/3347842) | `rules/remove-deprecated-trusted-data-concept-from-drupal-config-3347842.php` | `src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector.php` | **Split from digest**: digest handles both patterns (save arg removal + trustData chain) in one class; rector splits into two separate classes. `RemoveConfigSaveTrustedDataArgRector` handles only `Config::save(TRUE/FALSE)` pattern; adds `Config` ObjectType check (missing from digest) | Substantial | +| RemoveHandlerBaseDefineExtraOptionsRector | [#3485084](https://drupal.org/i/3485084) | `rules/remove-overrides-of-deprecated-handlerbase-3485084.php` | `src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector.php` | Namespace added; class renamed from `RemoveDefineExtraOptionsOverrideRector`; rector adds a `PARENT_SHORT_NAMES` constant with additional handler subclasses; rector adds `isObjectType` fallback; digest guards against modifying `HandlerBase` itself, rector uses a different approach (checking FQCNs/short names instead) | Substantial | +| RemoveLinkWidgetValidateTitleElementRector | [#3093118](https://drupal.org/i/3093118) | `rules/remove-deprecated-linkwidget-validatetitleelement-calls-3093118.php` | `src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector.php` | Namespace added; class name preserved; no logic changes; minor wording differences in `getRuleDefinition()` | Minor/Style-only | +| RemoveModuleHandlerAddModuleCallsRector | [#3528899](https://drupal.org/i/3528899) | `rules/remove-deprecated-modulehandlerinterface-addmodule-and-3528899.php` | `src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector.php` | Namespace added; rector adds `ModuleHandler` (concrete class) to the ObjectType check in addition to `ModuleHandlerInterface` (digest checks only the interface); return type hint changed from `?int` to `mixed` | Substantial | +| RemoveModuleHandlerDeprecatedMethodsRector | [#3442009](https://drupal.org/i/3442009) | `rules/remove-deprecated-modulehandlerinterface-writecache-and-3442009.php` | `src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector.php` | Namespace added; rector also removes standalone `getHookInfo()` expression statements (digest leaves them as bare `[]` expressions); rector refactors private helper method to improve readability | Substantial | +| RemoveRootFromConvertDbUrlRector | [#3522513](https://drupal.org/i/3522513) | `rules/remove-deprecated-string-root-from-database-3522513.php` | `src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector.php` | Namespace added; class renamed from `RemoveRootFromConvertDbUrlToConnectionInfoRector`; rector adds `StaticPropertyFetch` and `MethodCall` to recognized second-argument types (digest does not); logic largely equivalent | Substantial | +| RemoveSetUriCallbackRector | [#2667040](https://drupal.org/i/2667040) | `rules/remove-deprecated-entitytypeinterface-seturicallback-calls-2667040.php` | `src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector.php` | Namespace added; rector adds `EntityTypeInterface` ObjectType check (digest has none); class name preserved | Substantial | +| RemoveStateCacheSettingRector | [#3436954](https://drupal.org/i/3436954) | `rules/remove-deprecated-settings-state-cache-assignment-3436954.php` | `src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector.php` | Namespace added; class name preserved; logic identical | Minor/Style-only | +| RemoveTrustDataCallRector | [#3347842](https://drupal.org/i/3347842) | `rules/remove-deprecated-trusted-data-concept-from-drupal-config-3347842.php` | `src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector.php` | **Split from digest**: rector splits second pattern (trustData chain removal) into its own class; adds `ConfigEntityInterface` ObjectType check (missing from digest's combined class) | Substantial | +| RemoveTwigNodeTransTagArgumentRector | [#3473440](https://drupal.org/i/3473440) | `rules/remove-deprecated-tag-argument-from-twignodetrans-3473440.php` | `src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector.php` | Namespace added; class renamed from `RemoveTwigNodeTransTagArgRector`; rector checks 6 args exactly and uses `array_pop`; digest uses `array_splice($node->args, 5)` (removes from index 5 onward, potentially handles more args); rector also matches short class name `TwigNodeTrans` in addition to FQCN | Substantial | +| RemoveUpdaterPostInstallMethodsRector | [#3417136](https://drupal.org/i/3417136) | `rules/remove-deprecated-updater-postinstall-postinstalltasks-3417136.php` | `src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector.php` | Namespace added; class name preserved; rector uses `toString()` for parent name comparison (digest uses same approach); UPDATER_BASE_CLASSES constant uses unescaped backslash strings (rector) vs double-escaped (digest); logic identical | Minor/Style-only | +| RemoveViewsRowCacheKeysRector | [#3564958](https://drupal.org/i/3564958) | `rules/remove-deprecated-cachepluginbase-getrowcachekeys-and-3564937.php` (issue 3564937 in filename, covers same deprecation) | `src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php` | Namespace added; rector adds `CachePluginBase` ObjectType check on the MethodCall; digest has no type guard, matches any `getRowCacheKeys`/`getRowId` call. Rector is more conservative/accurate. | Substantial | +| RenameStopProceduralHookScanRector | [#3495943](https://drupal.org/i/3495943) | `rules/rename-stopproceduralhookscan-attribute-to-3495943.php` | `src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector.php` | **Completely different implementation**: digest is a config-only snippet using built-in `RenameClassRector`; rector implements a custom rule handling both `UseUse` and `Attribute` AST nodes directly for precise class/use-statement renaming | Substantial | +| ReplaceAlphadecimalToIntNullRector | [#3442810](https://drupal.org/i/3442810) | `rules/replace-deprecated-number-alphadecimaltoint-null-calls-with-3442810.php` | `src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector.php` | Namespace added; class renamed from `AlphadecimalToIntNullOrEmptyRector`; logic identical; minor import style differences | Minor/Style-only | +| ReplaceCommentManagerGetCountNewCommentsRector | [#3551729](https://drupal.org/i/3551729) | `rules/replace-deprecated-commentmanagerinterface-3543035.php` (issue 3543035 in filename — closest match; issue 3551729 not found as separate file) | `src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector.php` | Rector integrates into AbstractDrupalCoreRector framework with versioned configuration; digest is a standalone AbstractRector; logic nearly identical but rector wraps in DrupalIntroducedVersionConfiguration | Substantial | +| ReplaceCommentUriRector | [#2010202](https://drupal.org/i/2010202) | `rules/replace-deprecated-comment-uri-with-comment-permalink-2010202.php` | `src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector.php` | Namespace added; class renamed from `CommentUriToPermalinkRector`; rector allows `< 1` args (digest requires exactly 1); minor logic difference | Minor/Style-only | +| ReplaceDateTimeRangeConstantsRector | [#3574901](https://drupal.org/i/3574901) | `rules/replace-removed-datetimerangeconstantsinterface-constants-3574901.php` | `src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector.php` | Namespace added; class renamed from `ReplaceDatetimeDeprecatedApisRector`; logic identical; CONST_MAP indentation difference | Minor/Style-only | +| ReplaceEditorLoadRector | [#3447794](https://drupal.org/i/3447794) | `rules/replace-deprecated-editor-load-with-entity-storage-load-3447794.php` | `src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector.php` | Namespace added; class renamed from `EditorLoadDeprecationRector`; rector uses `$this->nodeFactory` helper methods for cleaner AST construction; digest does inline construction; rector checks `count($node->args) !== 1` while digest does not have arg count guard; logic equivalent | Substantial | +| ReplaceEntityOriginalPropertyRector | [#3571065](https://drupal.org/i/3571065) | `rules/replace-deprecated-entity-original-magic-property-with-3571065.php` | `src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector.php` | Namespace added; class renamed from `EntityOriginalPropertyToMethodRector`; rector handles `NullsafePropertyFetch` (nullsafe `?->` operator) — digest omits this; rector adds `EntityInterface` type guard on `PropertyFetch`; rector also registers `NullsafePropertyFetch` in `getNodeTypes()` | Substantial | +| ReplaceEntityReferenceRecursiveLimitRector | [#3316878](https://drupal.org/i/3316878) | `rules/replace-deprecated-entityreferenceentityformatter-recursive-2940605.php` (different issue # 2940605 in filename, same pattern) | `src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector.php` | Namespace added; class name preserved; logic identical; both replace `RECURSIVE_RENDER_LIMIT` with `20` | Minor/Style-only | +| ReplaceFieldgroupToFieldsetRector | [#3512254](https://drupal.org/i/3512254) | `rules/replace-deprecated-type-fieldgroup-with-type-fieldset-3512254.php` | `src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector.php` | Namespace added; class renamed from `FieldgroupToFieldsetRector`; logic identical | Minor/Style-only | +| ReplaceFileGetContentHeadersRector | [#3494126](https://drupal.org/i/3494126) | `rules/replace-file-get-content-headers-with-fileinterface-3494126.php` | `src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector.php` | Namespace added; class renamed from `FileGetContentHeadersRector`; rector uses `assert()` + `$node->args[0]->value` directly; digest guards `$node->name instanceof Name` explicitly; logic equivalent | Minor/Style-only | +| ReplaceLocaleConfigBatchFunctionsRector | [#3575254](https://drupal.org/i/3575254) | `rules/replace-deprecated-locale-batch-functions-with-their-3575254.php` | `src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector.php` | **Completely different implementation**: digest is a config-only snippet using built-in `RenameFunctionRector`; rector implements a custom `FuncCall`-visiting rule with a `RENAME_MAP` constant | Substantial | +| ReplaceNodeAccessViewAllNodesRector | [#3038908](https://drupal.org/i/3038908) | `rules/replace-deprecated-node-access-view-all-nodes-with-oo-3038908.php` | `src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector.php` | Namespace added; class renamed from `NodeAccessViewAllNodesRector`; rector uses `$this->nodeFactory` helpers; logic identical | Minor/Style-only | +| ReplaceNodeAddBodyFieldRector | [#3489266](https://drupal.org/i/3489266) | `rules/replace-deprecated-node-add-body-field-with-createbodyfield-3489266.php` | `src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector.php` | Namespace added; class renamed from `NodeAddBodyFieldRector`; logic identical | Minor/Style-only | +| ReplaceNodeModuleProceduralFunctionsRector | [#3571623](https://drupal.org/i/3571623) | `rules/replace-deprecated-node-module-procedural-functions-with-oo-3571623.php` | `src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector.php` | Namespace added; class renamed from `ReplaceDeprecatedNodeFunctionsRector`; both have identical logic; minor difference: digest has named private constants (`ENTITY_BUNDLE_INFO_SERVICE`, `NODE_BULK_UPDATE_CLASS`), rector inlines strings | Minor/Style-only | +| ReplaceNodeSetPreviewModeRector | [#3538277](https://drupal.org/i/3538277) | `rules/replace-deprecated-constants-with-nodepreviewmode-enum-in-3538277.php` | `src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector.php` | Namespace added; class renamed from `NodeSetPreviewModeRector`; rector adds `NodeTypeInterface` ObjectType check (digest has none); logic otherwise identical | Substantial | +| ReplacePdoFetchConstantsRector | [#3525077](https://drupal.org/i/3525077) | `rules/replace-removed-mysql-pgsql-sqlite-driver-query-subclass-3525077.php` | `src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector.php` | **Completely different rule**: digest is a config-only snippet for `RenameClassRector` removing deprecated driver subclasses; rector implements a full custom rule replacing `PDO::FETCH_*` constants with `FetchAs` enum cases in Database API calls. Same issue ID, entirely different transformation. | Substantial | +| ReplaceRecipeRunnerInstallModuleRector | [#3498026](https://drupal.org/i/3498026) | `rules/replace-deprecated-reciperunner-installmodule-with-3498026.php` | `src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector.php` | Namespace added; class renamed from `RecipeRunnerInstallModuleRector`; logic identical | Minor/Style-only | +| ReplaceSessionManagerDeleteRector | [#3577376](https://drupal.org/i/3577376) | `rules/replace-deprecated-sessionmanager-delete-with-3577376.php` | `src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector.php` | Rector integrates into AbstractDrupalCoreRector with versioned configuration; digest is a standalone AbstractRector; type-check strategy changed from `isSuperTypeOf().yes()` to `isObjectType()` | Substantial | +| ReplaceSessionWritesWithRequestSessionRector | [#3518527](https://drupal.org/i/3518527) | `rules/replace-deprecated-session-writes-with-drupal-request-3518527.php` | `src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector.php` | Namespace added; class renamed from `SessionSuperGlobalToRequestSessionRector`; logic identical | Minor/Style-only | +| ReplaceSystemPerformanceGzipKeyRector | [#3184242](https://drupal.org/i/3184242) | `rules/replace-deprecated-system-performance-css-gzip-js-gzip-3184242.php` | `src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector.php` | Namespace added; class renamed from `SystemPerformanceGzipToCompressRector`; logic identical | Minor/Style-only | +| ReplaceThemeGetSettingRector | [#3573896](https://drupal.org/i/3573896) | `rules/replace-deprecated-theme-get-setting-and-system-default-3573896.php` | `src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector.php` | Namespace added; class name preserved; rector inlines the theme_get_setting logic rather than extracting a private method; logic identical | Minor/Style-only | +| ReplaceUserSessionNamePropertyRector | [#3513856](https://drupal.org/i/3513856) | `rules/replace-deprecated-usersession-name-property-read-with-3513856.php` | `src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector.php` | Namespace added; class renamed from `UserSessionNamePropertyToGetAccountNameRector`; rector adds `UserSession` ObjectType check; logic identical | Minor/Style-only | +| ReplaceViewsProceduralFunctionsRector | [#3572243](https://drupal.org/i/3572243) | `rules/replace-deprecated-views-procedural-functions-with-oo-3572243.php` | `src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector.php` | Namespace added; class renamed from `ReplaceDeprecatedViewsFunctionsRector`; logic identical; minor: rector uses `Node\Expr\*` fully-qualified in private methods while digest uses imported classes | Minor/Style-only | +| StatementPrefetchIteratorFetchColumnRector | [#3490200](https://drupal.org/i/3490200) | `rules/replace-deprecated-statementprefetchiterator-fetchcolumn-3490200.php` | `src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector.php` | **Completely different implementation**: digest is a config-only snippet using built-in `RenameMethodRector`; rector implements a custom `MethodCall`-visiting rule with `StatementPrefetchIterator` ObjectType check | Substantial | +| StripMigrationDependenciesExpandArgRector | [#3574717](https://drupal.org/i/3574717) | `rules/strip-removed-expand-argument-from-getmigrationdependencies-3574717.php` | `src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector.php` | Namespace added; class renamed from `RemoveMigrationDependenciesExpandArgRector`; type-check strategy: rector uses `isObjectType(new ObjectType(...))` directly; digest uses `$callerType->isSuperTypeOf(...).yes()`. Functionally identical. | Minor/Style-only | +| UseEntityTypeHasIntegerIdRector | [#3566801](https://drupal.org/i/3566801) | `rules/replace-deprecated-entity-type-integer-id-helpers-with-3566801.php` | `src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector.php` | Namespace added; class name preserved; rector uses class constants `METHOD_OWNER_CLASS` (map) and `GET_ENTITY_TYPE_ID_KEY_TYPE_CLASS` with ObjectType checks; digest uses `SIMPLE_METHOD_NAMES` and no type-checking. Rector is significantly more type-safe. | Substantial | +| ViewsPluginHandlerManagerRector | [#3566424](https://drupal.org/i/3566424) | `rules/replace-deprecated-views-pluginmanager-and-views-3566424.php` | `src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector.php` | Namespace added; class name preserved; rector uses `isName()` for class check; digest uses `isObjectType()`. Logic otherwise identical. | Minor/Style-only | + +--- + +## Notable Changes + +### ReplaceRequestTimeConstantRector +- **Source (digest):** `rules/add-timeinterface-time-argument-to-plugin-constructor-3395986.php` +- **Destination (rector):** `src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector.php` +- **Drupal issue:** https://drupal.org/i/3395986 +- **Summary:** The issue ID is shared but the two rules address entirely different parts of the deprecation. The digest adds `?TimeInterface $time` to `__construct()` overrides in six plugin subclasses. The rector instead replaces the `REQUEST_TIME` constant with `\Drupal::time()->getRequestTime()`. +- **Changes:** + - Digest: Class-level AST transformation of constructor signatures across 6 named Drupal plugin parent classes + - Rector: Simple `ConstFetch` → `StaticCall->MethodCall` replacement, a completely different rule written from scratch + - No code from the digest was reused + +### RemoveModuleHandlerDeprecatedMethodsRector +- **Source (digest):** `rules/remove-deprecated-modulehandlerinterface-writecache-and-3442009.php` +- **Destination (rector):** `src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector.php` +- **Drupal issue:** https://drupal.org/i/3442009 +- **Summary:** Both remove `writeCache()` and replace `getHookInfo()` with `[]`, but the rector is more thorough. +- **Changes:** + - Rector also removes standalone `getHookInfo()` expression statements (not just replaces the value with `[]` when used in assignment) + - Digest leaves bare `[];` statements after `writeCache` removal; rector removes the whole statement + - Rector factored into a private helper `isModuleHandlerMethodCall()` + +### RemoveConfigSaveTrustedDataArgRector + RemoveTrustDataCallRector +- **Source (digest):** `rules/remove-deprecated-trusted-data-concept-from-drupal-config-3347842.php` +- **Destination (rector):** `src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector.php` + `RemoveTrustDataCallRector.php` +- **Drupal issue:** https://drupal.org/i/3347842 +- **Summary:** One digest class (`RemoveTrustedDataConceptRector`) covering both patterns was split into two focused rectors. +- **Changes:** + - `RemoveConfigSaveTrustedDataArgRector` handles only `Config::save(TRUE/FALSE)` — adds `Drupal\Core\Config\Config` ObjectType check absent from digest + - `RemoveTrustDataCallRector` handles only `trustData()` chain removal — adds `ConfigEntityInterface` ObjectType check absent from digest + - Both rectors are more type-safe than the combined digest + +### RemoveAutomatedCronSubmitHandlerRector +- **Source (digest):** `rules/remove-deprecated-automated-cron-settings-submit-calls-and-3566768.php` +- **Destination (rector):** `src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector.php` +- **Drupal issue:** https://drupal.org/i/3566768 +- **Summary:** Digest registered two rules: a custom class for `$form['#submit'][]` and `RemoveFuncCallRector` for direct function calls. Rector only implements the array-append removal. +- **Changes:** + - Class renamed from `RemoveAutomatedCronSettingsSubmitHandlerRector` + - Direct `automated_cron_settings_submit($form, $form_state)` function call removal (via `RemoveFuncCallRector`) is not ported into the rector + +### RemoveCacheExpireOverrideRector +- **Source (digest):** `rules/remove-deprecated-cacheexpire-overrides-from-views-3576556.php` +- **Destination (rector):** `src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector.php` +- **Drupal issue:** https://drupal.org/i/3576556 +- **Summary:** Rector significantly improves the class-hierarchy detection logic compared to the digest. +- **Changes:** + - Rector adds `PARENT_FQCNS` constant listing fully-qualified class names (all four known parent classes) + - Rector adds `'None'` to `PARENT_SHORT_NAMES` + - Rector uses `str_ends_with($parentName, '\\' . $short)` for namespace-relative names + - Rector's PHPStan fallback constructs `isSuperTypeOf($extendsType)` correctly with both operands as ObjectType; digest uses `$objectType->isSuperTypeOf($extendsType)` with only one side properly typed + +### RemoveHandlerBaseDefineExtraOptionsRector +- **Source (digest):** `rules/remove-overrides-of-deprecated-handlerbase-3485084.php` +- **Destination (rector):** `src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector.php` +- **Drupal issue:** https://drupal.org/i/3485084 +- **Summary:** Rector broadens detection to five additional short class names not in the digest, and uses a different exclusion approach for the base class itself. +- **Changes:** + - Rector adds `PARENT_SHORT_NAMES = ['HandlerBase', 'FieldHandlerBase', 'FilterPluginBase', 'SortPluginBase', 'ArgumentPluginBase', 'RelationshipPluginBase']` + - Digest used `Identifier` check to avoid modifying `HandlerBase` itself; rector uses FQCN/short-name matching instead + - Rector adds `isObjectType` PHPStan fallback + +### LoadAllIncludesRector +- **Source (digest):** `rules/replace-deprecated-modulehandler-loadallincludes-with-3536431.php` +- **Destination (rector):** `src/Drupal11/Rector/Deprecation/LoadAllIncludesRector.php` +- **Drupal issue:** https://drupal.org/i/3536431 +- **Summary:** Rector adds a `ModuleHandlerInterface` type guard that was missing from the digest. +- **Changes:** + - Rector calls `$this->isObjectType($methodCall->var, new ObjectType('Drupal\Core\Extension\ModuleHandlerInterface'))` before rewriting + - Digest skips this type check, rewriting any `loadAllIncludes()` call + +### MigrateSqlGetMigrationPluginManagerRector +- **Source (digest):** `rules/replace-deprecated-sql-getmigrationpluginmanager-with-3439369.php` +- **Destination (rector):** `src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector.php` +- **Drupal issue:** https://drupal.org/i/3439369 +- **Summary:** The type-check approach is inverted: rector whitelists `Sql` class; digest blacklists `Migration` class. +- **Changes:** + - Rector checks `isObjectType($node->var, new ObjectType('Drupal\migrate\Plugin\migrate\id_map\Sql'))` — only rewrites if caller is `Sql` + - Digest excludes `Migration` via `isObjectType(Migration::class)` check but allows any other caller + - Rector approach is more restrictive and precise + +### NodeStorageDeprecatedMethodsRector +- **Source (digest):** `rules/replace-deprecated-nodestorage-revisionids-and-3396062.php` +- **Destination (rector):** `src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector.php` +- **Drupal issue:** https://drupal.org/i/3396062 +- **Summary:** Rector adds `countDefaultLanguageRevisions` removal not present in the digest. +- **Changes:** + - Rector registers `Expression::class` in `getNodeTypes()` to catch statement-level calls + - Rector removes `countDefaultLanguageRevisions()` expression statements entirely via `NodeVisitor::REMOVE_NODE` + - Digest only handled `revisionIds` and `userRevisionIds` + +### PluginBaseIsConfigurableRector +- **Source (digest):** `rules/replace-deprecated-pluginbase-isconfigurable-with-3459533.php` +- **Destination (rector):** `src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector.php` +- **Drupal issue:** https://drupal.org/i/3459533 +- **Summary:** Rector adds a `PluginBase` ObjectType guard; digest relies only on the `$this->isConfigurable()` pattern. +- **Changes:** + - Rector calls `$this->isObjectType($node->var, new ObjectType('Drupal\Component\Plugin\PluginBase'))` in addition to variable/name checks + - Digest never verifies the object type, so it could rewrite `$this->isConfigurable()` in any class with that method + +### RemoveModuleHandlerAddModuleCallsRector +- **Source (digest):** `rules/remove-deprecated-modulehandlerinterface-addmodule-and-3528899.php` +- **Destination (rector):** `src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector.php` +- **Drupal issue:** https://drupal.org/i/3528899 +- **Summary:** Rector also checks against the concrete `ModuleHandler` class in addition to the interface. +- **Changes:** + - Rector iterates over both `ModuleHandlerInterface` and `ModuleHandler` in the ObjectType check + - Digest only checks `ModuleHandlerInterface` + +### RemoveRootFromConvertDbUrlRector +- **Source (digest):** `rules/remove-deprecated-string-root-from-database-3522513.php` +- **Destination (rector):** `src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector.php` +- **Drupal issue:** https://drupal.org/i/3522513 +- **Summary:** Rector recognizes more expression types as valid `$root` arguments to remove. +- **Changes:** + - Rector adds `StaticPropertyFetch` and `MethodCall` to the recognized second-arg forms (digest omits these two) + - Rector imports those types explicitly at the top of the file + +### RemoveSetUriCallbackRector +- **Source (digest):** `rules/remove-deprecated-entitytypeinterface-seturicallback-calls-2667040.php` +- **Destination (rector):** `src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector.php` +- **Drupal issue:** https://drupal.org/i/2667040 +- **Summary:** Rector adds `EntityTypeInterface` type guard throughout; digest has none. +- **Changes:** + - Rector calls `isObjectType($node->expr->var, new ObjectType('Drupal\Core\Entity\EntityTypeInterface'))` in both the standalone and fluent-chain cases + - Digest matches any `setUriCallback()` call on any object + +### RemoveTwigNodeTransTagArgumentRector +- **Source (digest):** `rules/remove-deprecated-tag-argument-from-twignodetrans-3473440.php` +- **Destination (rector):** `src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector.php` +- **Drupal issue:** https://drupal.org/i/3473440 +- **Summary:** Different strategies for arg removal and class matching. +- **Changes:** + - Rector checks `count($node->args) === 6` exactly and uses `array_pop()`; digest uses `isset($node->args[5])` and `array_splice($node->args, 5)` (removes from index 5 onward — handles extra args too) + - Rector also matches the short class name `TwigNodeTrans` without namespace + +### ReplaceEditorLoadRector +- **Source (digest):** `rules/replace-deprecated-editor-load-with-entity-storage-load-3447794.php` +- **Destination (rector):** `src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector.php` +- **Drupal issue:** https://drupal.org/i/3447794 +- **Summary:** Rector uses framework helpers (`$this->nodeFactory`) for cleaner code; adds arg count guard. +- **Changes:** + - Rector adds `count($node->args) !== 1` guard (digest does not) + - Rector uses `$this->nodeFactory->createStaticCall()` and `createMethodCall()` instead of manual AST construction + +### ReplaceEntityOriginalPropertyRector +- **Source (digest):** `rules/replace-deprecated-entity-original-magic-property-with-3571065.php` +- **Destination (rector):** `src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector.php` +- **Drupal issue:** https://drupal.org/i/3571065 +- **Summary:** Rector adds nullsafe property fetch support and EntityInterface type check — both missing from digest. +- **Changes:** + - Rector registers `NullsafePropertyFetch::class` in `getNodeTypes()` and handles `$entity?->original` → `$entity?->getOriginal()` + - Rector adds `EntityInterface` ObjectType check on `PropertyFetch` (digest has no type check) + - Digest would rewrite any `->original` property on any object; rector only rewrites on `EntityInterface` instances + +### ReplaceNodeSetPreviewModeRector +- **Source (digest):** `rules/replace-deprecated-constants-with-nodepreviewmode-enum-in-3538277.php` +- **Destination (rector):** `src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector.php` +- **Drupal issue:** https://drupal.org/i/3538277 +- **Summary:** Rector adds `NodeTypeInterface` type guard; digest has none. +- **Changes:** + - Rector calls `isObjectType($node->var, new ObjectType('Drupal\node\NodeTypeInterface'))` + - Digest rewrites `setPreviewMode(DRUPAL_DISABLED/0/1/2)` on any object + +### ReplacePdoFetchConstantsRector +- **Source (digest):** `rules/replace-removed-mysql-pgsql-sqlite-driver-query-subclass-3525077.php` +- **Destination (rector):** `src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector.php` +- **Drupal issue:** https://drupal.org/i/3525077 +- **Summary:** The issue ID is shared but the two rules handle entirely different aspects of this Drupal issue. +- **Changes:** + - Digest: config snippet using `RenameClassRector` to repoint nine empty driver-specific query subclasses to `Drupal\Core\Database\Query\*` + - Rector: custom rule converting `PDO::FETCH_*` constants to `FetchAs` enum cases in `setFetchMode`/`fetch`/`fetchAll`/`fetchAllAssoc` calls plus `'fetch'` array keys + - Completely different rule written from scratch + +### RenameStopProceduralHookScanRector +- **Source (digest):** `rules/rename-stopproceduralhookscan-attribute-to-3495943.php` +- **Destination (rector):** `src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector.php` +- **Drupal issue:** https://drupal.org/i/3495943 +- **Summary:** Digest is a trivial config snippet; rector is a full custom implementation. +- **Changes:** + - Digest uses `RenameClassRector` configuration (2 lines of real logic) + - Rector implements `UseUse` and `Attribute` node visiting to rename both the `use` statement and the attribute usage site, preserving correct formatting + - Rector approach avoids the risk of `RenameClassRector` rewriting class body references unexpectedly + +### ReplaceLocaleConfigBatchFunctionsRector +- **Source (digest):** `rules/replace-deprecated-locale-batch-functions-with-their-3575254.php` +- **Destination (rector):** `src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector.php` +- **Drupal issue:** https://drupal.org/i/3575254 +- **Summary:** Digest is a config snippet; rector is a full custom rule. +- **Changes:** + - Digest uses `RenameFunctionRector` configuration + - Rector implements `FuncCall` node visiting with a `RENAME_MAP` constant, providing more control and testability + +### StatementPrefetchIteratorFetchColumnRector +- **Source (digest):** `rules/replace-deprecated-statementprefetchiterator-fetchcolumn-3490200.php` +- **Destination (rector):** `src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector.php` +- **Drupal issue:** https://drupal.org/i/3490200 +- **Summary:** Digest is a config snippet; rector adds full type-safe implementation. +- **Changes:** + - Digest uses `RenameMethodRector` configuration (renames `fetchColumn` → `fetchField` on `StatementPrefetchIterator`) + - Rector implements `MethodCall` node visiting with a `StatementPrefetchIterator` ObjectType check + - Rector approach is equivalent but written as testable custom rule + +### ReplaceCommentManagerGetCountNewCommentsRector +- **Source (digest):** `rules/replace-deprecated-commentmanagerinterface-3543035.php` (issue 3543035; rector maps to issue 3551729 — closest available match) +- **Destination (rector):** `src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector.php` +- **Drupal issue:** https://drupal.org/i/3551729 +- **Summary:** Rector integrates into the versioned configuration framework; digest is a plain AbstractRector. +- **Changes:** + - Rector extends `AbstractDrupalCoreRector` with `DrupalIntroducedVersionConfiguration('11.3.0')` + - Rector uses `refactorWithConfiguration()` instead of `refactor()` + - Digest uses `AbstractRector` directly; logic otherwise identical + +### ReplaceSessionManagerDeleteRector +- **Source (digest):** `rules/replace-deprecated-sessionmanager-delete-with-3577376.php` +- **Destination (rector):** `src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector.php` +- **Drupal issue:** https://drupal.org/i/3577376 +- **Summary:** Rector integrates into versioned configuration framework; digest is standalone. +- **Changes:** + - Rector extends `AbstractDrupalCoreRector` with `DrupalIntroducedVersionConfiguration` + - Rector uses `isObjectType()` for type check; digest uses `$sessionManagerType->isSuperTypeOf($callerType)->yes()` + - Logic otherwise identical + +### UseEntityTypeHasIntegerIdRector +- **Source (digest):** `rules/replace-deprecated-entity-type-integer-id-helpers-with-3566801.php` +- **Destination (rector):** `src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector.php` +- **Drupal issue:** https://drupal.org/i/3566801 +- **Summary:** Rector adds per-class ObjectType type guards absent from the digest. +- **Changes:** + - Rector defines `METHOD_OWNER_CLASS` map: `entityTypeSupportsComments` → `CommentTypeForm`, `hasIntegerId` → `OverridesSectionStorage` + - Rector adds `GET_ENTITY_TYPE_ID_KEY_TYPE_CLASS = 'DefaultHtmlRouteProvider'` constant with ObjectType check + - Digest uses `SIMPLE_METHOD_NAMES` with no type checks — would rewrite any `$this->entityTypeSupportsComments()` or `$this->hasIntegerId()` call on any class + - Rector is significantly safer against false positives + +### RemoveViewsRowCacheKeysRector +- **Source (digest):** `rules/remove-deprecated-cachepluginbase-getrowcachekeys-and-3564937.php` +- **Destination (rector):** `src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php` +- **Drupal issue:** https://drupal.org/i/3564958 +- **Summary:** Rector adds CachePluginBase ObjectType guard absent from digest. +- **Changes:** + - Rector calls `isObjectType($item->value->var, new ObjectType('Drupal\views\Plugin\views\cache\CachePluginBase'))` before removing the array item + - Digest matches any `getRowCacheKeys`/`getRowId` method call on any object + - Rector avoids false positives on unrelated classes with the same method names + +### ReplaceModuleHandlerGetNameRector +- **Source (digest):** `rules/replace-removed-modulehandlerinterface-getname-with-3571063.php` +- **Destination (rector):** `src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector.php` +- **Drupal issue:** https://drupal.org/i/3571063 +- **Summary:** Rector integrates into AbstractDrupalCoreRector framework with versioned configuration. +- **Changes:** + - Rector extends `AbstractDrupalCoreRector` and uses `DrupalIntroducedVersionConfiguration` + - Rector uses `refactorWithConfiguration()` instead of `refactor()` + - Digest uses plain `AbstractRector` — same transformation logic otherwise + +### ReplaceRebuildThemeDataRector +- **Source (digest):** `rules/replace-removed-themehandlerinterface-rebuildthemedata-with-3571068.php` +- **Destination (rector):** `src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector.php` +- **Drupal issue:** https://drupal.org/i/3571068 +- **Summary:** Rector integrates into AbstractDrupalCoreRector framework with versioned configuration. +- **Changes:** + - Rector extends `AbstractDrupalCoreRector` and uses `DrupalIntroducedVersionConfiguration` + - Rector adds `ThemeHandlerInterface` ObjectType check (digest lacks this) + - Logic otherwise identical + +--- + +## Style-only / Minimal Changes + +These rectors show only namespace addition, class renaming, minor import reorganization, or trivial wording differences in doc blocks/rule descriptions. The core transformation logic is identical to the digest. + +- `ErrorCurrentErrorHandlerRector` — source: `rules/replace-error-currenterrorhandler-with-get-error-handler-3526515.php`, dest: `src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector.php` +- `FileSystemBasenameToNativeRector` — source: `rules/replace-filesysteminterface-basename-with-native-basename-3530461.php`, dest: `src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector.php` +- `RemoveLinkWidgetValidateTitleElementRector` — source: `rules/remove-deprecated-linkwidget-validatetitleelement-calls-3093118.php`, dest: `src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector.php` +- `RemoveStateCacheSettingRector` — source: `rules/remove-deprecated-settings-state-cache-assignment-3436954.php`, dest: `src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector.php` +- `RemoveUpdaterPostInstallMethodsRector` — source: `rules/remove-deprecated-updater-postinstall-postinstalltasks-3417136.php`, dest: `src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector.php` +- `ReplaceAlphadecimalToIntNullRector` — source: `rules/replace-deprecated-number-alphadecimaltoint-null-calls-with-3442810.php`, dest: `src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector.php` +- `ReplaceCommentUriRector` — source: `rules/replace-deprecated-comment-uri-with-comment-permalink-2010202.php`, dest: `src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector.php` +- `ReplaceDateTimeRangeConstantsRector` — source: `rules/replace-removed-datetimerangeconstantsinterface-constants-3574901.php`, dest: `src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector.php` +- `ReplaceEntityReferenceRecursiveLimitRector` — source: `rules/replace-deprecated-entityreferenceentityformatter-recursive-2940605.php`, dest: `src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector.php` +- `ReplaceFieldgroupToFieldsetRector` — source: `rules/replace-deprecated-type-fieldgroup-with-type-fieldset-3512254.php`, dest: `src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector.php` +- `ReplaceFileGetContentHeadersRector` — source: `rules/replace-file-get-content-headers-with-fileinterface-3494126.php`, dest: `src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector.php` +- `ReplaceNodeAccessViewAllNodesRector` — source: `rules/replace-deprecated-node-access-view-all-nodes-with-oo-3038908.php`, dest: `src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector.php` +- `ReplaceNodeAddBodyFieldRector` — source: `rules/replace-deprecated-node-add-body-field-with-createbodyfield-3489266.php`, dest: `src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector.php` +- `ReplaceNodeModuleProceduralFunctionsRector` — source: `rules/replace-deprecated-node-module-procedural-functions-with-oo-3571623.php`, dest: `src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector.php` +- `ReplaceRecipeRunnerInstallModuleRector` — source: `rules/replace-deprecated-reciperunner-installmodule-with-3498026.php`, dest: `src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector.php` +- `ReplaceSessionWritesWithRequestSessionRector` — source: `rules/replace-deprecated-session-writes-with-drupal-request-3518527.php`, dest: `src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector.php` +- `ReplaceSystemPerformanceGzipKeyRector` — source: `rules/replace-deprecated-system-performance-css-gzip-js-gzip-3184242.php`, dest: `src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector.php` +- `ReplaceThemeGetSettingRector` — source: `rules/replace-deprecated-theme-get-setting-and-system-default-3573896.php`, dest: `src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector.php` +- `ReplaceUserSessionNamePropertyRector` — source: `rules/replace-deprecated-usersession-name-property-read-with-3513856.php`, dest: `src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector.php` +- `ReplaceViewsProceduralFunctionsRector` — source: `rules/replace-deprecated-views-procedural-functions-with-oo-3572243.php`, dest: `src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector.php` +- `StripMigrationDependenciesExpandArgRector` — source: `rules/strip-removed-expand-argument-from-getmigrationdependencies-3574717.php`, dest: `src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector.php` +- `ViewsPluginHandlerManagerRector` — source: `rules/replace-deprecated-views-pluginmanager-and-views-3566424.php`, dest: `src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector.php` From 8cc276a4f268426845fde3c4b1cdcdaac14eea3f Mon Sep 17 00:00:00 2001 From: bjorn Date: Sat, 2 May 2026 09:58:41 +0200 Subject: [PATCH 099/256] docs: reformat fresh digest comparison report to match digest-comparison-report.md structure --- docs/digest-comparison-report-fresh.md | 885 +++++++++++++++---------- 1 file changed, 541 insertions(+), 344 deletions(-) diff --git a/docs/digest-comparison-report-fresh.md b/docs/digest-comparison-report-fresh.md index 12c85d243..4c8d0b566 100644 --- a/docs/digest-comparison-report-fresh.md +++ b/docs/digest-comparison-report-fresh.md @@ -1,357 +1,554 @@ -# Digest vs Rector Comparison Report (Fresh) +# Drupal Digest → Drupal Rector Comparison Report (Fresh Digest) -Generated: 2026-05-02 -Branch: feature/digest-rectors -Digest source: ~/projects/drupal-digest-fresh/rector/ +Compares each rector added in branch `feature/digest-rectors` against its source in +[drupal-digest-fresh](https://github.com/dbuytaert/drupal-digests) (regenerated with improved prompt). + +**Total rectors compared:** 50 +**Significant changes:** 28 +**Minimal changes:** 22 +**Split from one digest file:** 1 pair (`RemoveTrustDataCallRector` + `RemoveConfigSaveTrustedDataArgRector`) --- ## Overview Table -| Rector | Issue | Digest File | Rector File | Notable Changes | Status | +> Paths are relative to each repo root. Digest paths are relative to `drupal-digest-fresh/`. +> `†` = rector `@see` issue number differs from the digest filename — see [Notes](#notes-on-digest-file-mapping). + +| Rector | Ver | Changes | Issue | Digest source | Rector destination | |---|---|---|---|---|---| -| ReplaceModuleHandlerGetNameRector | [#3571063](https://drupal.org/i/3571063) | `rules/replace-removed-modulehandlerinterface-getname-with-3571063.php` | `src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector.php` | Integrated into drupal-rector framework (AbstractDrupalCoreRector, DrupalIntroducedVersionConfiguration, ConfiguredCodeSample); namespace added; class name preserved | Substantial | -| ReplaceRebuildThemeDataRector | [#3571068](https://drupal.org/i/3571068) | `rules/replace-removed-themehandlerinterface-rebuildthemedata-with-3571068.php` | `src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector.php` | Integrated into framework (AbstractDrupalCoreRector, versioned configuration); namespace added; type check added; class name preserved | Substantial | -| ReplaceRequestTimeConstantRector | [#3395986](https://drupal.org/i/3395986) | `rules/add-timeinterface-time-argument-to-plugin-constructor-3395986.php` | `src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector.php` | **Completely different rule**: digest adds `?TimeInterface $time` constructor arguments to plugin subclasses; rector replaces `REQUEST_TIME` constant with `\Drupal::time()->getRequestTime()`. Same issue ID, entirely different transformation. | Substantial | -| ErrorCurrentErrorHandlerRector | [#3526515](https://drupal.org/i/3526515) | `rules/replace-error-currenterrorhandler-with-get-error-handler-3526515.php` | `src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector.php` | Namespace added; type check uses `ObjectType` import (rector) vs inline `new \PHPStan\Type\ObjectType` (digest); `@param StaticCall $node` doc comment dropped; logic identical | Minor/Style-only | -| FileSystemBasenameToNativeRector | [#3530461](https://drupal.org/i/3530461) | `rules/replace-filesysteminterface-basename-with-native-basename-3530461.php` | `src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector.php` | Namespace added; type-check strategy changed: rector uses `$this->isObjectType()` (both classes checked in loop) whereas digest calls `$callerType->isSuperTypeOf()` (the PHPStan direction differs); logic semantically equivalent | Minor/Style-only | -| LoadAllIncludesRector | [#3536431](https://drupal.org/i/3536431) | `rules/replace-deprecated-modulehandler-loadallincludes-with-3536431.php` | `src/Drupal11/Rector/Deprecation/LoadAllIncludesRector.php` | Namespace added; rector adds `ModuleHandlerInterface` type guard (digest omits it); minor import cleanup | Substantial | -| MigrateSqlGetMigrationPluginManagerRector | [#3439369](https://drupal.org/i/3439369) | `rules/replace-deprecated-sql-getmigrationpluginmanager-with-3439369.php` | `src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector.php` | Namespace added; rector uses `isObjectType(new ObjectType('Drupal\migrate\Plugin\migrate\id_map\Sql'))` to whitelist; digest uses an explicit exclusion of `Migration::getMigrationPluginManager()` instead. Logic direction inverted but functionally similar. | Substantial | -| NodeStorageDeprecatedMethodsRector | [#3396062](https://drupal.org/i/3396062) | `rules/replace-deprecated-nodestorage-revisionids-and-3396062.php` | `src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector.php` | Namespace added; rector adds `countDefaultLanguageRevisions` removal (removes the whole statement via `NodeVisitor::REMOVE_NODE`); digest does not handle `countDefaultLanguageRevisions`; rector also registers `Expression::class` in `getNodeTypes()` for this removal | Substantial | -| PluginBaseIsConfigurableRector | [#3459533](https://drupal.org/i/3459533) | `rules/replace-deprecated-pluginbase-isconfigurable-with-3459533.php` | `src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector.php` | Namespace added; rector adds a `PluginBase` `ObjectType` check (not in digest); digest targets `$this->isConfigurable()` by restricting to `Variable` + name=`this` only (no type check), rector adds both that restriction AND a `PluginBase` type guard | Substantial | -| RemoveAutomatedCronSubmitHandlerRector | [#3566768](https://drupal.org/i/3566768) | `rules/remove-deprecated-automated-cron-settings-submit-calls-and-3566768.php` | `src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector.php` | Namespace added; class renamed from `RemoveAutomatedCronSettingsSubmitHandlerRector` to `RemoveAutomatedCronSubmitHandlerRector`; rector also drops the `Rector\Removing\Rector\FuncCall\RemoveFuncCallRector` dependency in the digest (digest relied on a second built-in rector for direct function calls; rector omits that); logic for `$form['#submit'][]` removal is identical | Substantial | -| RemoveCacheExpireOverrideRector | [#3576556](https://drupal.org/i/3576556) | `rules/remove-deprecated-cacheexpire-overrides-from-views-3576556.php` | `src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector.php` | Namespace added; rector adds a `PARENT_FQCNS` constant and `isObjectType` fallback for deeper class hierarchies; digest uses only string matching plus a weaker `isSuperTypeOf` check; rector's isCachePluginBaseSubclass also catches `None` in its short-name list | Substantial | -| RemoveConfigSaveTrustedDataArgRector | [#3347842](https://drupal.org/i/3347842) | `rules/remove-deprecated-trusted-data-concept-from-drupal-config-3347842.php` | `src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector.php` | **Split from digest**: digest handles both patterns (save arg removal + trustData chain) in one class; rector splits into two separate classes. `RemoveConfigSaveTrustedDataArgRector` handles only `Config::save(TRUE/FALSE)` pattern; adds `Config` ObjectType check (missing from digest) | Substantial | -| RemoveHandlerBaseDefineExtraOptionsRector | [#3485084](https://drupal.org/i/3485084) | `rules/remove-overrides-of-deprecated-handlerbase-3485084.php` | `src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector.php` | Namespace added; class renamed from `RemoveDefineExtraOptionsOverrideRector`; rector adds a `PARENT_SHORT_NAMES` constant with additional handler subclasses; rector adds `isObjectType` fallback; digest guards against modifying `HandlerBase` itself, rector uses a different approach (checking FQCNs/short names instead) | Substantial | -| RemoveLinkWidgetValidateTitleElementRector | [#3093118](https://drupal.org/i/3093118) | `rules/remove-deprecated-linkwidget-validatetitleelement-calls-3093118.php` | `src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector.php` | Namespace added; class name preserved; no logic changes; minor wording differences in `getRuleDefinition()` | Minor/Style-only | -| RemoveModuleHandlerAddModuleCallsRector | [#3528899](https://drupal.org/i/3528899) | `rules/remove-deprecated-modulehandlerinterface-addmodule-and-3528899.php` | `src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector.php` | Namespace added; rector adds `ModuleHandler` (concrete class) to the ObjectType check in addition to `ModuleHandlerInterface` (digest checks only the interface); return type hint changed from `?int` to `mixed` | Substantial | -| RemoveModuleHandlerDeprecatedMethodsRector | [#3442009](https://drupal.org/i/3442009) | `rules/remove-deprecated-modulehandlerinterface-writecache-and-3442009.php` | `src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector.php` | Namespace added; rector also removes standalone `getHookInfo()` expression statements (digest leaves them as bare `[]` expressions); rector refactors private helper method to improve readability | Substantial | -| RemoveRootFromConvertDbUrlRector | [#3522513](https://drupal.org/i/3522513) | `rules/remove-deprecated-string-root-from-database-3522513.php` | `src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector.php` | Namespace added; class renamed from `RemoveRootFromConvertDbUrlToConnectionInfoRector`; rector adds `StaticPropertyFetch` and `MethodCall` to recognized second-argument types (digest does not); logic largely equivalent | Substantial | -| RemoveSetUriCallbackRector | [#2667040](https://drupal.org/i/2667040) | `rules/remove-deprecated-entitytypeinterface-seturicallback-calls-2667040.php` | `src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector.php` | Namespace added; rector adds `EntityTypeInterface` ObjectType check (digest has none); class name preserved | Substantial | -| RemoveStateCacheSettingRector | [#3436954](https://drupal.org/i/3436954) | `rules/remove-deprecated-settings-state-cache-assignment-3436954.php` | `src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector.php` | Namespace added; class name preserved; logic identical | Minor/Style-only | -| RemoveTrustDataCallRector | [#3347842](https://drupal.org/i/3347842) | `rules/remove-deprecated-trusted-data-concept-from-drupal-config-3347842.php` | `src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector.php` | **Split from digest**: rector splits second pattern (trustData chain removal) into its own class; adds `ConfigEntityInterface` ObjectType check (missing from digest's combined class) | Substantial | -| RemoveTwigNodeTransTagArgumentRector | [#3473440](https://drupal.org/i/3473440) | `rules/remove-deprecated-tag-argument-from-twignodetrans-3473440.php` | `src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector.php` | Namespace added; class renamed from `RemoveTwigNodeTransTagArgRector`; rector checks 6 args exactly and uses `array_pop`; digest uses `array_splice($node->args, 5)` (removes from index 5 onward, potentially handles more args); rector also matches short class name `TwigNodeTrans` in addition to FQCN | Substantial | -| RemoveUpdaterPostInstallMethodsRector | [#3417136](https://drupal.org/i/3417136) | `rules/remove-deprecated-updater-postinstall-postinstalltasks-3417136.php` | `src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector.php` | Namespace added; class name preserved; rector uses `toString()` for parent name comparison (digest uses same approach); UPDATER_BASE_CLASSES constant uses unescaped backslash strings (rector) vs double-escaped (digest); logic identical | Minor/Style-only | -| RemoveViewsRowCacheKeysRector | [#3564958](https://drupal.org/i/3564958) | `rules/remove-deprecated-cachepluginbase-getrowcachekeys-and-3564937.php` (issue 3564937 in filename, covers same deprecation) | `src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php` | Namespace added; rector adds `CachePluginBase` ObjectType check on the MethodCall; digest has no type guard, matches any `getRowCacheKeys`/`getRowId` call. Rector is more conservative/accurate. | Substantial | -| RenameStopProceduralHookScanRector | [#3495943](https://drupal.org/i/3495943) | `rules/rename-stopproceduralhookscan-attribute-to-3495943.php` | `src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector.php` | **Completely different implementation**: digest is a config-only snippet using built-in `RenameClassRector`; rector implements a custom rule handling both `UseUse` and `Attribute` AST nodes directly for precise class/use-statement renaming | Substantial | -| ReplaceAlphadecimalToIntNullRector | [#3442810](https://drupal.org/i/3442810) | `rules/replace-deprecated-number-alphadecimaltoint-null-calls-with-3442810.php` | `src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector.php` | Namespace added; class renamed from `AlphadecimalToIntNullOrEmptyRector`; logic identical; minor import style differences | Minor/Style-only | -| ReplaceCommentManagerGetCountNewCommentsRector | [#3551729](https://drupal.org/i/3551729) | `rules/replace-deprecated-commentmanagerinterface-3543035.php` (issue 3543035 in filename — closest match; issue 3551729 not found as separate file) | `src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector.php` | Rector integrates into AbstractDrupalCoreRector framework with versioned configuration; digest is a standalone AbstractRector; logic nearly identical but rector wraps in DrupalIntroducedVersionConfiguration | Substantial | -| ReplaceCommentUriRector | [#2010202](https://drupal.org/i/2010202) | `rules/replace-deprecated-comment-uri-with-comment-permalink-2010202.php` | `src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector.php` | Namespace added; class renamed from `CommentUriToPermalinkRector`; rector allows `< 1` args (digest requires exactly 1); minor logic difference | Minor/Style-only | -| ReplaceDateTimeRangeConstantsRector | [#3574901](https://drupal.org/i/3574901) | `rules/replace-removed-datetimerangeconstantsinterface-constants-3574901.php` | `src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector.php` | Namespace added; class renamed from `ReplaceDatetimeDeprecatedApisRector`; logic identical; CONST_MAP indentation difference | Minor/Style-only | -| ReplaceEditorLoadRector | [#3447794](https://drupal.org/i/3447794) | `rules/replace-deprecated-editor-load-with-entity-storage-load-3447794.php` | `src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector.php` | Namespace added; class renamed from `EditorLoadDeprecationRector`; rector uses `$this->nodeFactory` helper methods for cleaner AST construction; digest does inline construction; rector checks `count($node->args) !== 1` while digest does not have arg count guard; logic equivalent | Substantial | -| ReplaceEntityOriginalPropertyRector | [#3571065](https://drupal.org/i/3571065) | `rules/replace-deprecated-entity-original-magic-property-with-3571065.php` | `src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector.php` | Namespace added; class renamed from `EntityOriginalPropertyToMethodRector`; rector handles `NullsafePropertyFetch` (nullsafe `?->` operator) — digest omits this; rector adds `EntityInterface` type guard on `PropertyFetch`; rector also registers `NullsafePropertyFetch` in `getNodeTypes()` | Substantial | -| ReplaceEntityReferenceRecursiveLimitRector | [#3316878](https://drupal.org/i/3316878) | `rules/replace-deprecated-entityreferenceentityformatter-recursive-2940605.php` (different issue # 2940605 in filename, same pattern) | `src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector.php` | Namespace added; class name preserved; logic identical; both replace `RECURSIVE_RENDER_LIMIT` with `20` | Minor/Style-only | -| ReplaceFieldgroupToFieldsetRector | [#3512254](https://drupal.org/i/3512254) | `rules/replace-deprecated-type-fieldgroup-with-type-fieldset-3512254.php` | `src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector.php` | Namespace added; class renamed from `FieldgroupToFieldsetRector`; logic identical | Minor/Style-only | -| ReplaceFileGetContentHeadersRector | [#3494126](https://drupal.org/i/3494126) | `rules/replace-file-get-content-headers-with-fileinterface-3494126.php` | `src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector.php` | Namespace added; class renamed from `FileGetContentHeadersRector`; rector uses `assert()` + `$node->args[0]->value` directly; digest guards `$node->name instanceof Name` explicitly; logic equivalent | Minor/Style-only | -| ReplaceLocaleConfigBatchFunctionsRector | [#3575254](https://drupal.org/i/3575254) | `rules/replace-deprecated-locale-batch-functions-with-their-3575254.php` | `src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector.php` | **Completely different implementation**: digest is a config-only snippet using built-in `RenameFunctionRector`; rector implements a custom `FuncCall`-visiting rule with a `RENAME_MAP` constant | Substantial | -| ReplaceNodeAccessViewAllNodesRector | [#3038908](https://drupal.org/i/3038908) | `rules/replace-deprecated-node-access-view-all-nodes-with-oo-3038908.php` | `src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector.php` | Namespace added; class renamed from `NodeAccessViewAllNodesRector`; rector uses `$this->nodeFactory` helpers; logic identical | Minor/Style-only | -| ReplaceNodeAddBodyFieldRector | [#3489266](https://drupal.org/i/3489266) | `rules/replace-deprecated-node-add-body-field-with-createbodyfield-3489266.php` | `src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector.php` | Namespace added; class renamed from `NodeAddBodyFieldRector`; logic identical | Minor/Style-only | -| ReplaceNodeModuleProceduralFunctionsRector | [#3571623](https://drupal.org/i/3571623) | `rules/replace-deprecated-node-module-procedural-functions-with-oo-3571623.php` | `src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector.php` | Namespace added; class renamed from `ReplaceDeprecatedNodeFunctionsRector`; both have identical logic; minor difference: digest has named private constants (`ENTITY_BUNDLE_INFO_SERVICE`, `NODE_BULK_UPDATE_CLASS`), rector inlines strings | Minor/Style-only | -| ReplaceNodeSetPreviewModeRector | [#3538277](https://drupal.org/i/3538277) | `rules/replace-deprecated-constants-with-nodepreviewmode-enum-in-3538277.php` | `src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector.php` | Namespace added; class renamed from `NodeSetPreviewModeRector`; rector adds `NodeTypeInterface` ObjectType check (digest has none); logic otherwise identical | Substantial | -| ReplacePdoFetchConstantsRector | [#3525077](https://drupal.org/i/3525077) | `rules/replace-removed-mysql-pgsql-sqlite-driver-query-subclass-3525077.php` | `src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector.php` | **Completely different rule**: digest is a config-only snippet for `RenameClassRector` removing deprecated driver subclasses; rector implements a full custom rule replacing `PDO::FETCH_*` constants with `FetchAs` enum cases in Database API calls. Same issue ID, entirely different transformation. | Substantial | -| ReplaceRecipeRunnerInstallModuleRector | [#3498026](https://drupal.org/i/3498026) | `rules/replace-deprecated-reciperunner-installmodule-with-3498026.php` | `src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector.php` | Namespace added; class renamed from `RecipeRunnerInstallModuleRector`; logic identical | Minor/Style-only | -| ReplaceSessionManagerDeleteRector | [#3577376](https://drupal.org/i/3577376) | `rules/replace-deprecated-sessionmanager-delete-with-3577376.php` | `src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector.php` | Rector integrates into AbstractDrupalCoreRector with versioned configuration; digest is a standalone AbstractRector; type-check strategy changed from `isSuperTypeOf().yes()` to `isObjectType()` | Substantial | -| ReplaceSessionWritesWithRequestSessionRector | [#3518527](https://drupal.org/i/3518527) | `rules/replace-deprecated-session-writes-with-drupal-request-3518527.php` | `src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector.php` | Namespace added; class renamed from `SessionSuperGlobalToRequestSessionRector`; logic identical | Minor/Style-only | -| ReplaceSystemPerformanceGzipKeyRector | [#3184242](https://drupal.org/i/3184242) | `rules/replace-deprecated-system-performance-css-gzip-js-gzip-3184242.php` | `src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector.php` | Namespace added; class renamed from `SystemPerformanceGzipToCompressRector`; logic identical | Minor/Style-only | -| ReplaceThemeGetSettingRector | [#3573896](https://drupal.org/i/3573896) | `rules/replace-deprecated-theme-get-setting-and-system-default-3573896.php` | `src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector.php` | Namespace added; class name preserved; rector inlines the theme_get_setting logic rather than extracting a private method; logic identical | Minor/Style-only | -| ReplaceUserSessionNamePropertyRector | [#3513856](https://drupal.org/i/3513856) | `rules/replace-deprecated-usersession-name-property-read-with-3513856.php` | `src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector.php` | Namespace added; class renamed from `UserSessionNamePropertyToGetAccountNameRector`; rector adds `UserSession` ObjectType check; logic identical | Minor/Style-only | -| ReplaceViewsProceduralFunctionsRector | [#3572243](https://drupal.org/i/3572243) | `rules/replace-deprecated-views-procedural-functions-with-oo-3572243.php` | `src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector.php` | Namespace added; class renamed from `ReplaceDeprecatedViewsFunctionsRector`; logic identical; minor: rector uses `Node\Expr\*` fully-qualified in private methods while digest uses imported classes | Minor/Style-only | -| StatementPrefetchIteratorFetchColumnRector | [#3490200](https://drupal.org/i/3490200) | `rules/replace-deprecated-statementprefetchiterator-fetchcolumn-3490200.php` | `src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector.php` | **Completely different implementation**: digest is a config-only snippet using built-in `RenameMethodRector`; rector implements a custom `MethodCall`-visiting rule with `StatementPrefetchIterator` ObjectType check | Substantial | -| StripMigrationDependenciesExpandArgRector | [#3574717](https://drupal.org/i/3574717) | `rules/strip-removed-expand-argument-from-getmigrationdependencies-3574717.php` | `src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector.php` | Namespace added; class renamed from `RemoveMigrationDependenciesExpandArgRector`; type-check strategy: rector uses `isObjectType(new ObjectType(...))` directly; digest uses `$callerType->isSuperTypeOf(...).yes()`. Functionally identical. | Minor/Style-only | -| UseEntityTypeHasIntegerIdRector | [#3566801](https://drupal.org/i/3566801) | `rules/replace-deprecated-entity-type-integer-id-helpers-with-3566801.php` | `src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector.php` | Namespace added; class name preserved; rector uses class constants `METHOD_OWNER_CLASS` (map) and `GET_ENTITY_TYPE_ID_KEY_TYPE_CLASS` with ObjectType checks; digest uses `SIMPLE_METHOD_NAMES` and no type-checking. Rector is significantly more type-safe. | Substantial | -| ViewsPluginHandlerManagerRector | [#3566424](https://drupal.org/i/3566424) | `rules/replace-deprecated-views-pluginmanager-and-views-3566424.php` | `src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector.php` | Namespace added; class name preserved; rector uses `isName()` for class check; digest uses `isObjectType()`. Logic otherwise identical. | Minor/Style-only | +| `ReplaceModuleHandlerGetNameRector` | D10 | **Significant** | [#3571063](https://www.drupal.org/node/3571063) | `rector/rules/replace-removed-modulehandlerinterface-getname-with-3571063.php` | `src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector.php` | +| `ReplaceRebuildThemeDataRector` | D10 | **Significant** | [#3571068](https://www.drupal.org/node/3571068) | `rector/rules/replace-removed-themehandlerinterface-rebuildthemedata-with-3571068.php` | `src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector.php` | +| `ReplaceRequestTimeConstantRector` | D10 | **Significant** | [#3395986](https://www.drupal.org/node/3395986) | `rector/rules/add-timeinterface-time-argument-to-plugin-constructor-3395986.php` | `src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector.php` | +| `ErrorCurrentErrorHandlerRector` | D11 | Minimal | [#3526515](https://www.drupal.org/node/3526515) | `rector/rules/replace-error-currenterrorhandler-with-get-error-handler-3526515.php` | `src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector.php` | +| `FileSystemBasenameToNativeRector` | D11 | Minimal | [#3530461](https://www.drupal.org/node/3530461) | `rector/rules/replace-filesysteminterface-basename-with-native-basename-3530461.php` | `src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector.php` | +| `LoadAllIncludesRector` | D11 | **Significant** | [#3536431](https://www.drupal.org/node/3536431) | `rector/rules/replace-deprecated-modulehandler-loadallincludes-with-3536431.php` | `src/Drupal11/Rector/Deprecation/LoadAllIncludesRector.php` | +| `MigrateSqlGetMigrationPluginManagerRector` | D11 | **Significant** | [#3439369](https://www.drupal.org/node/3439369) | `rector/rules/replace-deprecated-sql-getmigrationpluginmanager-with-3439369.php` | `src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector.php` | +| `NodeStorageDeprecatedMethodsRector` | D11 | **Significant** | [#3396062](https://www.drupal.org/node/3396062) | `rector/rules/replace-deprecated-nodestorage-revisionids-and-3396062.php` | `src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector.php` | +| `PluginBaseIsConfigurableRector` | D11 | **Significant** | [#3459533](https://www.drupal.org/node/3459533) | `rector/rules/replace-deprecated-pluginbase-isconfigurable-with-3459533.php` | `src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector.php` | +| `RemoveAutomatedCronSubmitHandlerRector` | D11 | **Significant** | [#3566768](https://www.drupal.org/node/3566768) | `rector/rules/remove-deprecated-automated-cron-settings-submit-calls-and-3566768.php` | `src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector.php` | +| `RemoveCacheExpireOverrideRector` | D11 | **Significant** | [#3576556](https://www.drupal.org/node/3576556) | `rector/rules/remove-deprecated-cacheexpire-overrides-from-views-3576556.php` | `src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector.php` | +| `RemoveConfigSaveTrustedDataArgRector` | D11 | **Significant** | [#3347842](https://www.drupal.org/node/3347842) | `rector/rules/remove-deprecated-trusted-data-concept-from-drupal-config-3347842.php` *(split)* | `src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector.php` | +| `RemoveHandlerBaseDefineExtraOptionsRector` | D11 | **Significant** | [#3485084](https://www.drupal.org/node/3485084) | `rector/rules/remove-overrides-of-deprecated-handlerbase-3485084.php` | `src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector.php` | +| `RemoveLinkWidgetValidateTitleElementRector` | D11 | Minimal | [#3093118](https://www.drupal.org/node/3093118) | `rector/rules/remove-deprecated-linkwidget-validatetitleelement-calls-3093118.php` | `src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector.php` | +| `RemoveModuleHandlerAddModuleCallsRector` | D11 | **Significant** | [#3528899](https://www.drupal.org/node/3528899) | `rector/rules/remove-deprecated-modulehandlerinterface-addmodule-and-3528899.php` | `src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector.php` | +| `RemoveModuleHandlerDeprecatedMethodsRector` | D11 | **Significant** | [#3442009](https://www.drupal.org/node/3442009) | `rector/rules/remove-deprecated-modulehandlerinterface-writecache-and-3442009.php` | `src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector.php` | +| `RemoveRootFromConvertDbUrlRector` | D11 | **Significant** | [#3522513](https://www.drupal.org/node/3522513) | `rector/rules/remove-deprecated-string-root-from-database-3522513.php` | `src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector.php` | +| `RemoveSetUriCallbackRector` | D11 | **Significant** | [#2667040](https://www.drupal.org/node/2667040) | `rector/rules/remove-deprecated-entitytypeinterface-seturicallback-calls-2667040.php` | `src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector.php` | +| `RemoveStateCacheSettingRector` | D11 | Minimal | [#3436954](https://www.drupal.org/node/3436954) | `rector/rules/remove-deprecated-settings-state-cache-assignment-3436954.php` | `src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector.php` | +| `RemoveTrustDataCallRector` | D11 | **Significant** | [#3347842](https://www.drupal.org/node/3347842) | `rector/rules/remove-deprecated-trusted-data-concept-from-drupal-config-3347842.php` *(split)* | `src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector.php` | +| `RemoveTwigNodeTransTagArgumentRector` | D11 | **Significant** | [#3473440](https://www.drupal.org/node/3473440) | `rector/rules/remove-deprecated-tag-argument-from-twignodetrans-3473440.php` | `src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector.php` | +| `RemoveUpdaterPostInstallMethodsRector` | D11 | Minimal | [#3417136](https://www.drupal.org/node/3417136) | `rector/rules/remove-deprecated-updater-postinstall-postinstalltasks-3417136.php` | `src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector.php` | +| `RemoveViewsRowCacheKeysRector` | D11 | **Significant** | [#3564958](https://www.drupal.org/node/3564958) † | `rector/rules/remove-deprecated-cachepluginbase-getrowcachekeys-and-3564937.php` | `src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php` | +| `RenameStopProceduralHookScanRector` | D11 | **Significant** | [#3495943](https://www.drupal.org/node/3495943) | `rector/rules/rename-stopproceduralhookscan-attribute-to-3495943.php` | `src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector.php` | +| `ReplaceAlphadecimalToIntNullRector` | D11 | Minimal | [#3442810](https://www.drupal.org/node/3442810) | `rector/rules/replace-deprecated-number-alphadecimaltoint-null-calls-with-3442810.php` | `src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector.php` | +| `ReplaceCommentManagerGetCountNewCommentsRector` | D11 | **Significant** | [#3551729](https://www.drupal.org/node/3551729) † | `rector/rules/replace-deprecated-commentmanagerinterface-3543035.php` | `src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector.php` | +| `ReplaceCommentUriRector` | D11 | Minimal | [#2010202](https://www.drupal.org/node/2010202) | `rector/rules/replace-deprecated-comment-uri-with-comment-permalink-2010202.php` | `src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector.php` | +| `ReplaceDateTimeRangeConstantsRector` | D11 | Minimal | [#3574901](https://www.drupal.org/node/3574901) | `rector/rules/replace-removed-datetimerangeconstantsinterface-constants-3574901.php` | `src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector.php` | +| `ReplaceEditorLoadRector` | D11 | **Significant** | [#3447794](https://www.drupal.org/node/3447794) | `rector/rules/replace-deprecated-editor-load-with-entity-storage-load-3447794.php` | `src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector.php` | +| `ReplaceEntityOriginalPropertyRector` | D11 | **Significant** | [#3571065](https://www.drupal.org/node/3571065) | `rector/rules/replace-deprecated-entity-original-magic-property-with-3571065.php` | `src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector.php` | +| `ReplaceEntityReferenceRecursiveLimitRector` | D11 | Minimal | [#3316878](https://www.drupal.org/node/3316878) † | `rector/rules/replace-deprecated-entityreferenceentityformatter-recursive-2940605.php` | `src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector.php` | +| `ReplaceFieldgroupToFieldsetRector` | D11 | Minimal | [#3512254](https://www.drupal.org/node/3512254) | `rector/rules/replace-deprecated-type-fieldgroup-with-type-fieldset-3512254.php` | `src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector.php` | +| `ReplaceFileGetContentHeadersRector` | D11 | Minimal | [#3494126](https://www.drupal.org/node/3494126) | `rector/rules/replace-file-get-content-headers-with-fileinterface-3494126.php` | `src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector.php` | +| `ReplaceLocaleConfigBatchFunctionsRector` | D11 | **Significant** | [#3575254](https://www.drupal.org/node/3575254) | `rector/rules/replace-deprecated-locale-batch-functions-with-their-3575254.php` | `src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector.php` | +| `ReplaceNodeAccessViewAllNodesRector` | D11 | Minimal | [#3038908](https://www.drupal.org/node/3038908) | `rector/rules/replace-deprecated-node-access-view-all-nodes-with-oo-3038908.php` | `src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector.php` | +| `ReplaceNodeAddBodyFieldRector` | D11 | Minimal | [#3489266](https://www.drupal.org/node/3489266) | `rector/rules/replace-deprecated-node-add-body-field-with-createbodyfield-3489266.php` | `src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector.php` | +| `ReplaceNodeModuleProceduralFunctionsRector` | D11 | Minimal | [#3571623](https://www.drupal.org/node/3571623) | `rector/rules/replace-deprecated-node-module-procedural-functions-with-oo-3571623.php` | `src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector.php` | +| `ReplaceNodeSetPreviewModeRector` | D11 | **Significant** | [#3538277](https://www.drupal.org/node/3538277) | `rector/rules/replace-deprecated-constants-with-nodepreviewmode-enum-in-3538277.php` | `src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector.php` | +| `ReplacePdoFetchConstantsRector` | D11 | **Significant** | [#3525077](https://www.drupal.org/node/3525077) | `rector/rules/replace-removed-mysql-pgsql-sqlite-driver-query-subclass-3525077.php` | `src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector.php` | +| `ReplaceRecipeRunnerInstallModuleRector` | D11 | Minimal | [#3498026](https://www.drupal.org/node/3498026) | `rector/rules/replace-deprecated-reciperunner-installmodule-with-3498026.php` | `src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector.php` | +| `ReplaceSessionManagerDeleteRector` | D11 | **Significant** | [#3577376](https://www.drupal.org/node/3577376) | `rector/rules/replace-deprecated-sessionmanager-delete-with-3577376.php` | `src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector.php` | +| `ReplaceSessionWritesWithRequestSessionRector` | D11 | Minimal | [#3518527](https://www.drupal.org/node/3518527) | `rector/rules/replace-deprecated-session-writes-with-drupal-request-3518527.php` | `src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector.php` | +| `ReplaceSystemPerformanceGzipKeyRector` | D11 | Minimal | [#3184242](https://www.drupal.org/node/3184242) | `rector/rules/replace-deprecated-system-performance-css-gzip-js-gzip-3184242.php` | `src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector.php` | +| `ReplaceThemeGetSettingRector` | D11 | Minimal | [#3573896](https://www.drupal.org/node/3573896) | `rector/rules/replace-deprecated-theme-get-setting-and-system-default-3573896.php` | `src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector.php` | +| `ReplaceUserSessionNamePropertyRector` | D11 | Minimal | [#3513856](https://www.drupal.org/node/3513856) | `rector/rules/replace-deprecated-usersession-name-property-read-with-3513856.php` | `src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector.php` | +| `ReplaceViewsProceduralFunctionsRector` | D11 | Minimal | [#3572243](https://www.drupal.org/node/3572243) | `rector/rules/replace-deprecated-views-procedural-functions-with-oo-3572243.php` | `src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector.php` | +| `StatementPrefetchIteratorFetchColumnRector` | D11 | **Significant** | [#3490200](https://www.drupal.org/node/3490200) | `rector/rules/replace-deprecated-statementprefetchiterator-fetchcolumn-3490200.php` | `src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector.php` | +| `StripMigrationDependenciesExpandArgRector` | D11 | Minimal | [#3574717](https://www.drupal.org/node/3574717) | `rector/rules/strip-removed-expand-argument-from-getmigrationdependencies-3574717.php` | `src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector.php` | +| `UseEntityTypeHasIntegerIdRector` | D11 | **Significant** | [#3566801](https://www.drupal.org/node/3566801) | `rector/rules/replace-deprecated-entity-type-integer-id-helpers-with-3566801.php` | `src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector.php` | +| `ViewsPluginHandlerManagerRector` | D11 | Minimal | [#3566424](https://www.drupal.org/node/3566424) | `rector/rules/replace-deprecated-views-pluginmanager-and-views-3566424.php` | `src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector.php` | + +--- + +## Significant Changes + +### 1. `ReplaceModuleHandlerGetNameRector` (Drupal10) + +**Digest file:** `replace-removed-modulehandlerinterface-getname-with-3571063.php` + +**Change:** The fresh digest used a plain `AbstractRector` with a simple `refactor()` method. The rector integrates into the `AbstractDrupalCoreRector` framework with `DrupalIntroducedVersionConfiguration('10.3.0')`, using `refactorWithConfiguration()` and `ConfiguredCodeSample` in `getRuleDefinition()`. The transformation logic is otherwise identical. + +--- + +### 2. `ReplaceRebuildThemeDataRector` (Drupal10) + +**Digest file:** `replace-removed-themehandlerinterface-rebuildthemedata-with-3571068.php` + +**Change:** Like `ReplaceModuleHandlerGetNameRector`, the rector wraps the logic in `AbstractDrupalCoreRector` with `DrupalIntroducedVersionConfiguration('10.3.0')`. Additionally, the rector adds a `ThemeHandlerInterface` ObjectType check that was missing from the fresh digest. + +```php +// Fresh digest — no type guard +if (!$this->isName($node->name, 'rebuildThemeData')) { + return null; +} + +// Rector — adds ThemeHandlerInterface type guard +if (!$this->isObjectType($node->var, new ObjectType('Drupal\Core\Extension\ThemeHandlerInterface'))) { + return null; +} +``` + +--- + +### 3. `ReplaceRequestTimeConstantRector` (Drupal10) + +**Digest file:** `add-timeinterface-time-argument-to-plugin-constructor-3395986.php` + +**Change:** The issue ID is shared but the two rules address entirely different deprecations. The fresh digest adds a `?TimeInterface $time` argument to `__construct()` overrides across six Drupal plugin parent classes. The rector instead replaces the `REQUEST_TIME` constant with `\Drupal::time()->getRequestTime()`. No code from the digest was reused — the rector is a completely independent implementation. + +--- + +### 4. `LoadAllIncludesRector` (Drupal11) + +**Digest file:** `replace-deprecated-modulehandler-loadallincludes-with-3536431.php` + +**Change:** The fresh digest had no type guard — it rewrote any `loadAllIncludes()` call regardless of object type. The rector adds a `ModuleHandlerInterface` ObjectType check before rewriting. + +```php +// Fresh digest — no type guard +if (!$this->isName($methodCall->name, 'loadAllIncludes')) { + return null; +} + +// Rector — requires ModuleHandlerInterface +if (!$this->isObjectType($methodCall->var, new ObjectType('Drupal\Core\Extension\ModuleHandlerInterface'))) { + return null; +} +``` + +--- + +### 5. `MigrateSqlGetMigrationPluginManagerRector` (Drupal11) + +**Digest file:** `replace-deprecated-sql-getmigrationpluginmanager-with-3439369.php` + +**Change:** The type-check approach is inverted. The fresh digest used a negative guard — skip if the caller is a `Migration` instance, allowing any other caller through. The rector uses a positive guard — only proceed if the caller is specifically a `Sql` instance. The rector's approach is more restrictive and precise. + +```php +// Fresh digest — negative guard (exclude Migration) +if ($this->isObjectType($node->var, new ObjectType('Drupal\migrate\Plugin\Migration'))) { + return null; +} + +// Rector — positive guard (require Sql) +if (!$this->isObjectType($node->var, new ObjectType('Drupal\migrate\Plugin\migrate\id_map\Sql'))) { + return null; +} +``` + +--- + +### 6. `NodeStorageDeprecatedMethodsRector` (Drupal11) + +**Digest file:** `replace-deprecated-nodestorage-revisionids-and-3396062.php` + +**Change:** The fresh digest handled only `revisionIds()` and `userRevisionIds()`. The rector adds handling for `countDefaultLanguageRevisions()`, which has no replacement and must be removed entirely. This requires registering `Expression::class` as an additional node type and using `NodeVisitor::REMOVE_NODE`. + +```php +// Rector — additional node type and removal handling +public function getNodeTypes(): array +{ + return [Node\Expr\MethodCall::class, Node\Stmt\Expression::class]; +} + +// Removes countDefaultLanguageRevisions() entirely +if ($node instanceof Node\Stmt\Expression) { + if ($this->getName($methodCall->name) === 'countDefaultLanguageRevisions') { + return NodeVisitor::REMOVE_NODE; + } +} +``` + +--- + +### 7. `PluginBaseIsConfigurableRector` (Drupal11) + +**Digest file:** `replace-deprecated-pluginbase-isconfigurable-with-3459533.php` + +**Change:** The fresh digest relied solely on detecting `$this->isConfigurable()` (variable named `this`, no args) without any type guard. The rector adds an explicit `isObjectType($node->var, new ObjectType('Drupal\Component\Plugin\PluginBase'))` check, preventing false positives on any other class that may have an `isConfigurable()` method. + +```php +// Fresh digest — $this check only, no type guard +if ($this->getName($node->var) !== 'this') { + return null; +} + +// Rector — adds PluginBase type guard +if ($this->getName($node->var) !== 'this') { + return null; +} +if (!$this->isObjectType($node->var, new ObjectType('Drupal\Component\Plugin\PluginBase'))) { + return null; +} +``` + +--- + +### 8. `RemoveAutomatedCronSubmitHandlerRector` (Drupal11) + +**Digest file:** `remove-deprecated-automated-cron-settings-submit-calls-and-3566768.php` + +**Change:** The fresh digest registered two rules: a custom class for `$form['#submit'][]` array-append removal, and `RemoveFuncCallRector` (a built-in Rector rule) for direct `automated_cron_settings_submit()` function calls. The rector implements only the array-append removal, omitting the direct function-call case. The class was also renamed from `RemoveAutomatedCronSettingsSubmitHandlerRector` to `RemoveAutomatedCronSubmitHandlerRector`. + +--- + +### 9. `RemoveCacheExpireOverrideRector` (Drupal11) + +**Digest file:** `remove-deprecated-cacheexpire-overrides-from-views-3576556.php` + +**Change:** The rector significantly improves the class-hierarchy detection logic. It adds a `PARENT_FQCNS` constant listing all four known fully-qualified parent class names (`CachePluginBase`, `Time`, `Tag`, `None`), adds `'None'` to `PARENT_SHORT_NAMES`, and uses `str_ends_with($parentName, '\\' . $short)` for namespace-relative names to prevent false matches on partial namespace strings. + +```php +// Rector — adds PARENT_FQCNS constant +private const PARENT_FQCNS = [ + 'Drupal\views\Plugin\views\cache\CachePluginBase', + 'Drupal\views\Plugin\views\cache\Time', + 'Drupal\views\Plugin\views\cache\Tag', + 'Drupal\views\Plugin\views\cache\None', +]; +// Matches FQCNs first, then restricts short-name check to unqualified names +if (!str_contains($parentName, '\\')) { + foreach (self::PARENT_SHORT_NAMES as $short) { +``` + +--- + +### 10. `RemoveConfigSaveTrustedDataArgRector` + `RemoveTrustDataCallRector` (Drupal11) + +**Digest file:** `remove-deprecated-trusted-data-concept-from-drupal-config-3347842.php` (one file, split into two rector classes) + +**Change:** The fresh digest defined a single class covering both patterns. The rector splits them into two focused files. `RemoveConfigSaveTrustedDataArgRector` handles only `Config::save(TRUE/FALSE)` and adds a `Drupal\Core\Config\Config` ObjectType check. `RemoveTrustDataCallRector` handles only `->trustData()` chain removal and adds a `ConfigEntityInterface` ObjectType check. Both additions prevent false positives that the combined digest class was susceptible to. + +```php +// RemoveConfigSaveTrustedDataArgRector — adds Config type guard +if (!$this->isObjectType($node->var, new ObjectType('Drupal\Core\Config\Config'))) { + return null; +} + +// RemoveTrustDataCallRector — adds ConfigEntityInterface type guard +if (!$this->isObjectType($node->var, new ObjectType('Drupal\Core\Config\Entity\ConfigEntityInterface'))) { + return null; +} +``` + +--- + +### 11. `RemoveHandlerBaseDefineExtraOptionsRector` (Drupal11) + +**Digest file:** `remove-overrides-of-deprecated-handlerbase-3485084.php` + +**Change:** The fresh digest's `PARENT_SHORT_NAMES` covered only `HandlerBase`. The rector expands it to cover five additional handler base classes: `FieldHandlerBase`, `FilterPluginBase`, `SortPluginBase`, `ArgumentPluginBase`, and `RelationshipPluginBase`. The rector also adds an `isObjectType` PHPStan fallback and uses a different approach for the exclusion of the `HandlerBase` class itself. + +```php +// Fresh digest +private const PARENT_SHORT_NAMES = ['HandlerBase']; + +// Rector +private const PARENT_SHORT_NAMES = [ + 'HandlerBase', + 'FieldHandlerBase', + 'FilterPluginBase', + 'SortPluginBase', + 'ArgumentPluginBase', + 'RelationshipPluginBase', +]; +``` + +--- + +### 12. `RemoveModuleHandlerAddModuleCallsRector` (Drupal11) + +**Digest file:** `remove-deprecated-modulehandlerinterface-addmodule-and-3528899.php` + +**Change:** The fresh digest checked only `ModuleHandlerInterface`. The rector also checks the concrete `ModuleHandler` class, covering cases where the variable is typed as the implementation rather than the interface. + +```php +// Fresh digest — interface only +if ($this->isObjectType($methodCall->var, new ObjectType('Drupal\\Core\\Extension\\ModuleHandlerInterface'))) { + +// Rector — interface + concrete class +foreach (['Drupal\Core\Extension\ModuleHandlerInterface', 'Drupal\Core\Extension\ModuleHandler'] as $class) { + if ($this->isObjectType($methodCall->var, new ObjectType($class))) { + $isModuleHandler = true; + break; + } +} +``` + +--- + +### 13. `RemoveModuleHandlerDeprecatedMethodsRector` (Drupal11) + +**Digest file:** `remove-deprecated-modulehandlerinterface-writecache-and-3442009.php` + +**Change:** Both rules remove `writeCache()` and replace `getHookInfo()` with `[]`. The rector goes further: it removes standalone `getHookInfo()` expression statements entirely (via `NodeVisitor::REMOVE_NODE`) rather than leaving bare `[];` statements behind, as the digest did. The rector also refactors detection into a private `isModuleHandlerMethodCall()` helper. + +--- + +### 14. `RemoveRootFromConvertDbUrlRector` (Drupal11) + +**Digest file:** `remove-deprecated-string-root-from-database-3522513.php` + +**Change:** The rector recognizes more expression types as valid second-argument forms to strip. It adds `StaticPropertyFetch` and `MethodCall` to the recognized node types (the fresh digest handled only `Variable`, `String_`, and `ClassConstFetch`). The class was also renamed from `RemoveRootFromConvertDbUrlToConnectionInfoRector`. + +--- + +### 15. `RemoveSetUriCallbackRector` (Drupal11) + +**Digest file:** `remove-deprecated-entitytypeinterface-seturicallback-calls-2667040.php` + +**Change:** The fresh digest had no type guard — it removed any `setUriCallback()` call by method name alone. The rector adds `isObjectType($node->expr->var, new ObjectType('Drupal\Core\Entity\EntityTypeInterface'))` checks on both the standalone-statement case and the fluent-chain case. + +```php +// Fresh digest — no type guard +if ($node->expr instanceof MethodCall && $this->isName($node->expr->name, 'setUriCallback')) { + return NodeVisitor::REMOVE_NODE; +} + +// Rector — type-guarded +if ($node->expr instanceof MethodCall + && $this->isName($node->expr->name, 'setUriCallback') + && $this->isObjectType($node->expr->var, new ObjectType('Drupal\Core\Entity\EntityTypeInterface')) +) { + return NodeVisitor::REMOVE_NODE; +} +``` + +--- + +### 16. `RemoveTwigNodeTransTagArgumentRector` (Drupal11) + +**Digest file:** `remove-deprecated-tag-argument-from-twignodetrans-3473440.php` + +**Change:** The strategies for argument removal and class matching both differ. The rector checks `count($node->args) === 6` exactly and uses `array_pop()` to remove the last argument. The fresh digest used `isset($node->args[5])` and `array_splice($node->args, 5)`, which would also handle cases with more than six arguments. The rector additionally matches the short class name `TwigNodeTrans` (without namespace) in addition to the FQCN. The class was renamed from `RemoveTwigNodeTransTagArgRector`. + +--- + +### 17. `RemoveViewsRowCacheKeysRector` (Drupal11) + +**Digest file:** `remove-deprecated-cachepluginbase-getrowcachekeys-and-3564937.php` + +**Note:** The rector's `@see` references issue `#3564958`; the digest file uses `#3564937`. Both numbers refer to the same deprecation — `3564958` is the change record and `3564937` is the original issue. + +**Change:** The fresh digest removed array items whose value was a call to `getRowCacheKeys()` or `getRowId()` by method name alone, with no type guard. The rector adds `isObjectType($item->value->var, new ObjectType('Drupal\views\Plugin\views\cache\CachePluginBase'))`, preventing false positives when another class has methods with the same names. + +```php +// Fresh digest — no type guard +if ($item->value instanceof MethodCall && $this->isDeprecatedMethodCall($item->value)) { + +// Rector — type-guarded +if ($item->value instanceof MethodCall + && $item->value->name instanceof Identifier + && in_array($item->value->name->toString(), self::DEPRECATED_METHODS, true) + && $this->isObjectType($item->value->var, new ObjectType('Drupal\views\Plugin\views\cache\CachePluginBase')) +) { +``` + +--- + +### 18. `RenameStopProceduralHookScanRector` (Drupal11) + +**Digest file:** `rename-stopproceduralhookscan-attribute-to-3495943.php` + +**Change:** The fresh digest was a trivial config snippet (two lines of real logic) using the built-in `RenameClassRector`. The rector implements a full custom rule visiting both `UseUse` and `Attribute` AST nodes to rename the use-statement and the attribute usage site independently, preserving correct formatting and avoiding the risk of `RenameClassRector` rewriting unrelated class body references. + +--- + +### 19. `ReplaceCommentManagerGetCountNewCommentsRector` (Drupal11) + +**Digest file:** `replace-deprecated-commentmanagerinterface-3543035.php` + +**Note:** The rector's `@see` references issue `#3551729`; the digest file uses `#3543035`. Both reference the same deprecation — `#3543035` is the original issue, `#3551729` is the related change record. + +**Change:** The fresh digest extended `AbstractRector` directly with a plain `refactor()` method. The rector extends `AbstractDrupalCoreRector` and wraps the logic in `refactorWithConfiguration()`, enabling version-gated activation via `DrupalIntroducedVersionConfiguration('11.3.0')`. + +```php +// Fresh digest +final class CommentManagerGetCountNewCommentsRector extends AbstractRector +{ + public function refactor(Node $node): ?Node { ... } + +// Rector +final class ReplaceCommentManagerGetCountNewCommentsRector extends AbstractDrupalCoreRector +{ + public function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { ... } + // getRuleDefinition() uses ConfiguredCodeSample with DrupalIntroducedVersionConfiguration('11.3.0') +``` --- -## Notable Changes - -### ReplaceRequestTimeConstantRector -- **Source (digest):** `rules/add-timeinterface-time-argument-to-plugin-constructor-3395986.php` -- **Destination (rector):** `src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector.php` -- **Drupal issue:** https://drupal.org/i/3395986 -- **Summary:** The issue ID is shared but the two rules address entirely different parts of the deprecation. The digest adds `?TimeInterface $time` to `__construct()` overrides in six plugin subclasses. The rector instead replaces the `REQUEST_TIME` constant with `\Drupal::time()->getRequestTime()`. -- **Changes:** - - Digest: Class-level AST transformation of constructor signatures across 6 named Drupal plugin parent classes - - Rector: Simple `ConstFetch` → `StaticCall->MethodCall` replacement, a completely different rule written from scratch - - No code from the digest was reused - -### RemoveModuleHandlerDeprecatedMethodsRector -- **Source (digest):** `rules/remove-deprecated-modulehandlerinterface-writecache-and-3442009.php` -- **Destination (rector):** `src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector.php` -- **Drupal issue:** https://drupal.org/i/3442009 -- **Summary:** Both remove `writeCache()` and replace `getHookInfo()` with `[]`, but the rector is more thorough. -- **Changes:** - - Rector also removes standalone `getHookInfo()` expression statements (not just replaces the value with `[]` when used in assignment) - - Digest leaves bare `[];` statements after `writeCache` removal; rector removes the whole statement - - Rector factored into a private helper `isModuleHandlerMethodCall()` - -### RemoveConfigSaveTrustedDataArgRector + RemoveTrustDataCallRector -- **Source (digest):** `rules/remove-deprecated-trusted-data-concept-from-drupal-config-3347842.php` -- **Destination (rector):** `src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector.php` + `RemoveTrustDataCallRector.php` -- **Drupal issue:** https://drupal.org/i/3347842 -- **Summary:** One digest class (`RemoveTrustedDataConceptRector`) covering both patterns was split into two focused rectors. -- **Changes:** - - `RemoveConfigSaveTrustedDataArgRector` handles only `Config::save(TRUE/FALSE)` — adds `Drupal\Core\Config\Config` ObjectType check absent from digest - - `RemoveTrustDataCallRector` handles only `trustData()` chain removal — adds `ConfigEntityInterface` ObjectType check absent from digest - - Both rectors are more type-safe than the combined digest - -### RemoveAutomatedCronSubmitHandlerRector -- **Source (digest):** `rules/remove-deprecated-automated-cron-settings-submit-calls-and-3566768.php` -- **Destination (rector):** `src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector.php` -- **Drupal issue:** https://drupal.org/i/3566768 -- **Summary:** Digest registered two rules: a custom class for `$form['#submit'][]` and `RemoveFuncCallRector` for direct function calls. Rector only implements the array-append removal. -- **Changes:** - - Class renamed from `RemoveAutomatedCronSettingsSubmitHandlerRector` - - Direct `automated_cron_settings_submit($form, $form_state)` function call removal (via `RemoveFuncCallRector`) is not ported into the rector - -### RemoveCacheExpireOverrideRector -- **Source (digest):** `rules/remove-deprecated-cacheexpire-overrides-from-views-3576556.php` -- **Destination (rector):** `src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector.php` -- **Drupal issue:** https://drupal.org/i/3576556 -- **Summary:** Rector significantly improves the class-hierarchy detection logic compared to the digest. -- **Changes:** - - Rector adds `PARENT_FQCNS` constant listing fully-qualified class names (all four known parent classes) - - Rector adds `'None'` to `PARENT_SHORT_NAMES` - - Rector uses `str_ends_with($parentName, '\\' . $short)` for namespace-relative names - - Rector's PHPStan fallback constructs `isSuperTypeOf($extendsType)` correctly with both operands as ObjectType; digest uses `$objectType->isSuperTypeOf($extendsType)` with only one side properly typed - -### RemoveHandlerBaseDefineExtraOptionsRector -- **Source (digest):** `rules/remove-overrides-of-deprecated-handlerbase-3485084.php` -- **Destination (rector):** `src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector.php` -- **Drupal issue:** https://drupal.org/i/3485084 -- **Summary:** Rector broadens detection to five additional short class names not in the digest, and uses a different exclusion approach for the base class itself. -- **Changes:** - - Rector adds `PARENT_SHORT_NAMES = ['HandlerBase', 'FieldHandlerBase', 'FilterPluginBase', 'SortPluginBase', 'ArgumentPluginBase', 'RelationshipPluginBase']` - - Digest used `Identifier` check to avoid modifying `HandlerBase` itself; rector uses FQCN/short-name matching instead - - Rector adds `isObjectType` PHPStan fallback - -### LoadAllIncludesRector -- **Source (digest):** `rules/replace-deprecated-modulehandler-loadallincludes-with-3536431.php` -- **Destination (rector):** `src/Drupal11/Rector/Deprecation/LoadAllIncludesRector.php` -- **Drupal issue:** https://drupal.org/i/3536431 -- **Summary:** Rector adds a `ModuleHandlerInterface` type guard that was missing from the digest. -- **Changes:** - - Rector calls `$this->isObjectType($methodCall->var, new ObjectType('Drupal\Core\Extension\ModuleHandlerInterface'))` before rewriting - - Digest skips this type check, rewriting any `loadAllIncludes()` call - -### MigrateSqlGetMigrationPluginManagerRector -- **Source (digest):** `rules/replace-deprecated-sql-getmigrationpluginmanager-with-3439369.php` -- **Destination (rector):** `src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector.php` -- **Drupal issue:** https://drupal.org/i/3439369 -- **Summary:** The type-check approach is inverted: rector whitelists `Sql` class; digest blacklists `Migration` class. -- **Changes:** - - Rector checks `isObjectType($node->var, new ObjectType('Drupal\migrate\Plugin\migrate\id_map\Sql'))` — only rewrites if caller is `Sql` - - Digest excludes `Migration` via `isObjectType(Migration::class)` check but allows any other caller - - Rector approach is more restrictive and precise - -### NodeStorageDeprecatedMethodsRector -- **Source (digest):** `rules/replace-deprecated-nodestorage-revisionids-and-3396062.php` -- **Destination (rector):** `src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector.php` -- **Drupal issue:** https://drupal.org/i/3396062 -- **Summary:** Rector adds `countDefaultLanguageRevisions` removal not present in the digest. -- **Changes:** - - Rector registers `Expression::class` in `getNodeTypes()` to catch statement-level calls - - Rector removes `countDefaultLanguageRevisions()` expression statements entirely via `NodeVisitor::REMOVE_NODE` - - Digest only handled `revisionIds` and `userRevisionIds` - -### PluginBaseIsConfigurableRector -- **Source (digest):** `rules/replace-deprecated-pluginbase-isconfigurable-with-3459533.php` -- **Destination (rector):** `src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector.php` -- **Drupal issue:** https://drupal.org/i/3459533 -- **Summary:** Rector adds a `PluginBase` ObjectType guard; digest relies only on the `$this->isConfigurable()` pattern. -- **Changes:** - - Rector calls `$this->isObjectType($node->var, new ObjectType('Drupal\Component\Plugin\PluginBase'))` in addition to variable/name checks - - Digest never verifies the object type, so it could rewrite `$this->isConfigurable()` in any class with that method - -### RemoveModuleHandlerAddModuleCallsRector -- **Source (digest):** `rules/remove-deprecated-modulehandlerinterface-addmodule-and-3528899.php` -- **Destination (rector):** `src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector.php` -- **Drupal issue:** https://drupal.org/i/3528899 -- **Summary:** Rector also checks against the concrete `ModuleHandler` class in addition to the interface. -- **Changes:** - - Rector iterates over both `ModuleHandlerInterface` and `ModuleHandler` in the ObjectType check - - Digest only checks `ModuleHandlerInterface` - -### RemoveRootFromConvertDbUrlRector -- **Source (digest):** `rules/remove-deprecated-string-root-from-database-3522513.php` -- **Destination (rector):** `src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector.php` -- **Drupal issue:** https://drupal.org/i/3522513 -- **Summary:** Rector recognizes more expression types as valid `$root` arguments to remove. -- **Changes:** - - Rector adds `StaticPropertyFetch` and `MethodCall` to the recognized second-arg forms (digest omits these two) - - Rector imports those types explicitly at the top of the file - -### RemoveSetUriCallbackRector -- **Source (digest):** `rules/remove-deprecated-entitytypeinterface-seturicallback-calls-2667040.php` -- **Destination (rector):** `src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector.php` -- **Drupal issue:** https://drupal.org/i/2667040 -- **Summary:** Rector adds `EntityTypeInterface` type guard throughout; digest has none. -- **Changes:** - - Rector calls `isObjectType($node->expr->var, new ObjectType('Drupal\Core\Entity\EntityTypeInterface'))` in both the standalone and fluent-chain cases - - Digest matches any `setUriCallback()` call on any object - -### RemoveTwigNodeTransTagArgumentRector -- **Source (digest):** `rules/remove-deprecated-tag-argument-from-twignodetrans-3473440.php` -- **Destination (rector):** `src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector.php` -- **Drupal issue:** https://drupal.org/i/3473440 -- **Summary:** Different strategies for arg removal and class matching. -- **Changes:** - - Rector checks `count($node->args) === 6` exactly and uses `array_pop()`; digest uses `isset($node->args[5])` and `array_splice($node->args, 5)` (removes from index 5 onward — handles extra args too) - - Rector also matches the short class name `TwigNodeTrans` without namespace - -### ReplaceEditorLoadRector -- **Source (digest):** `rules/replace-deprecated-editor-load-with-entity-storage-load-3447794.php` -- **Destination (rector):** `src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector.php` -- **Drupal issue:** https://drupal.org/i/3447794 -- **Summary:** Rector uses framework helpers (`$this->nodeFactory`) for cleaner code; adds arg count guard. -- **Changes:** - - Rector adds `count($node->args) !== 1` guard (digest does not) - - Rector uses `$this->nodeFactory->createStaticCall()` and `createMethodCall()` instead of manual AST construction - -### ReplaceEntityOriginalPropertyRector -- **Source (digest):** `rules/replace-deprecated-entity-original-magic-property-with-3571065.php` -- **Destination (rector):** `src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector.php` -- **Drupal issue:** https://drupal.org/i/3571065 -- **Summary:** Rector adds nullsafe property fetch support and EntityInterface type check — both missing from digest. -- **Changes:** - - Rector registers `NullsafePropertyFetch::class` in `getNodeTypes()` and handles `$entity?->original` → `$entity?->getOriginal()` - - Rector adds `EntityInterface` ObjectType check on `PropertyFetch` (digest has no type check) - - Digest would rewrite any `->original` property on any object; rector only rewrites on `EntityInterface` instances - -### ReplaceNodeSetPreviewModeRector -- **Source (digest):** `rules/replace-deprecated-constants-with-nodepreviewmode-enum-in-3538277.php` -- **Destination (rector):** `src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector.php` -- **Drupal issue:** https://drupal.org/i/3538277 -- **Summary:** Rector adds `NodeTypeInterface` type guard; digest has none. -- **Changes:** - - Rector calls `isObjectType($node->var, new ObjectType('Drupal\node\NodeTypeInterface'))` - - Digest rewrites `setPreviewMode(DRUPAL_DISABLED/0/1/2)` on any object - -### ReplacePdoFetchConstantsRector -- **Source (digest):** `rules/replace-removed-mysql-pgsql-sqlite-driver-query-subclass-3525077.php` -- **Destination (rector):** `src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector.php` -- **Drupal issue:** https://drupal.org/i/3525077 -- **Summary:** The issue ID is shared but the two rules handle entirely different aspects of this Drupal issue. -- **Changes:** - - Digest: config snippet using `RenameClassRector` to repoint nine empty driver-specific query subclasses to `Drupal\Core\Database\Query\*` - - Rector: custom rule converting `PDO::FETCH_*` constants to `FetchAs` enum cases in `setFetchMode`/`fetch`/`fetchAll`/`fetchAllAssoc` calls plus `'fetch'` array keys - - Completely different rule written from scratch - -### RenameStopProceduralHookScanRector -- **Source (digest):** `rules/rename-stopproceduralhookscan-attribute-to-3495943.php` -- **Destination (rector):** `src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector.php` -- **Drupal issue:** https://drupal.org/i/3495943 -- **Summary:** Digest is a trivial config snippet; rector is a full custom implementation. -- **Changes:** - - Digest uses `RenameClassRector` configuration (2 lines of real logic) - - Rector implements `UseUse` and `Attribute` node visiting to rename both the `use` statement and the attribute usage site, preserving correct formatting - - Rector approach avoids the risk of `RenameClassRector` rewriting class body references unexpectedly - -### ReplaceLocaleConfigBatchFunctionsRector -- **Source (digest):** `rules/replace-deprecated-locale-batch-functions-with-their-3575254.php` -- **Destination (rector):** `src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector.php` -- **Drupal issue:** https://drupal.org/i/3575254 -- **Summary:** Digest is a config snippet; rector is a full custom rule. -- **Changes:** - - Digest uses `RenameFunctionRector` configuration - - Rector implements `FuncCall` node visiting with a `RENAME_MAP` constant, providing more control and testability - -### StatementPrefetchIteratorFetchColumnRector -- **Source (digest):** `rules/replace-deprecated-statementprefetchiterator-fetchcolumn-3490200.php` -- **Destination (rector):** `src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector.php` -- **Drupal issue:** https://drupal.org/i/3490200 -- **Summary:** Digest is a config snippet; rector adds full type-safe implementation. -- **Changes:** - - Digest uses `RenameMethodRector` configuration (renames `fetchColumn` → `fetchField` on `StatementPrefetchIterator`) - - Rector implements `MethodCall` node visiting with a `StatementPrefetchIterator` ObjectType check - - Rector approach is equivalent but written as testable custom rule - -### ReplaceCommentManagerGetCountNewCommentsRector -- **Source (digest):** `rules/replace-deprecated-commentmanagerinterface-3543035.php` (issue 3543035; rector maps to issue 3551729 — closest available match) -- **Destination (rector):** `src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector.php` -- **Drupal issue:** https://drupal.org/i/3551729 -- **Summary:** Rector integrates into the versioned configuration framework; digest is a plain AbstractRector. -- **Changes:** - - Rector extends `AbstractDrupalCoreRector` with `DrupalIntroducedVersionConfiguration('11.3.0')` - - Rector uses `refactorWithConfiguration()` instead of `refactor()` - - Digest uses `AbstractRector` directly; logic otherwise identical - -### ReplaceSessionManagerDeleteRector -- **Source (digest):** `rules/replace-deprecated-sessionmanager-delete-with-3577376.php` -- **Destination (rector):** `src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector.php` -- **Drupal issue:** https://drupal.org/i/3577376 -- **Summary:** Rector integrates into versioned configuration framework; digest is standalone. -- **Changes:** - - Rector extends `AbstractDrupalCoreRector` with `DrupalIntroducedVersionConfiguration` - - Rector uses `isObjectType()` for type check; digest uses `$sessionManagerType->isSuperTypeOf($callerType)->yes()` - - Logic otherwise identical - -### UseEntityTypeHasIntegerIdRector -- **Source (digest):** `rules/replace-deprecated-entity-type-integer-id-helpers-with-3566801.php` -- **Destination (rector):** `src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector.php` -- **Drupal issue:** https://drupal.org/i/3566801 -- **Summary:** Rector adds per-class ObjectType type guards absent from the digest. -- **Changes:** - - Rector defines `METHOD_OWNER_CLASS` map: `entityTypeSupportsComments` → `CommentTypeForm`, `hasIntegerId` → `OverridesSectionStorage` - - Rector adds `GET_ENTITY_TYPE_ID_KEY_TYPE_CLASS = 'DefaultHtmlRouteProvider'` constant with ObjectType check - - Digest uses `SIMPLE_METHOD_NAMES` with no type checks — would rewrite any `$this->entityTypeSupportsComments()` or `$this->hasIntegerId()` call on any class - - Rector is significantly safer against false positives - -### RemoveViewsRowCacheKeysRector -- **Source (digest):** `rules/remove-deprecated-cachepluginbase-getrowcachekeys-and-3564937.php` -- **Destination (rector):** `src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php` -- **Drupal issue:** https://drupal.org/i/3564958 -- **Summary:** Rector adds CachePluginBase ObjectType guard absent from digest. -- **Changes:** - - Rector calls `isObjectType($item->value->var, new ObjectType('Drupal\views\Plugin\views\cache\CachePluginBase'))` before removing the array item - - Digest matches any `getRowCacheKeys`/`getRowId` method call on any object - - Rector avoids false positives on unrelated classes with the same method names - -### ReplaceModuleHandlerGetNameRector -- **Source (digest):** `rules/replace-removed-modulehandlerinterface-getname-with-3571063.php` -- **Destination (rector):** `src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector.php` -- **Drupal issue:** https://drupal.org/i/3571063 -- **Summary:** Rector integrates into AbstractDrupalCoreRector framework with versioned configuration. -- **Changes:** - - Rector extends `AbstractDrupalCoreRector` and uses `DrupalIntroducedVersionConfiguration` - - Rector uses `refactorWithConfiguration()` instead of `refactor()` - - Digest uses plain `AbstractRector` — same transformation logic otherwise - -### ReplaceRebuildThemeDataRector -- **Source (digest):** `rules/replace-removed-themehandlerinterface-rebuildthemedata-with-3571068.php` -- **Destination (rector):** `src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector.php` -- **Drupal issue:** https://drupal.org/i/3571068 -- **Summary:** Rector integrates into AbstractDrupalCoreRector framework with versioned configuration. -- **Changes:** - - Rector extends `AbstractDrupalCoreRector` and uses `DrupalIntroducedVersionConfiguration` - - Rector adds `ThemeHandlerInterface` ObjectType check (digest lacks this) - - Logic otherwise identical +### 20. `ReplaceEditorLoadRector` (Drupal11) + +**Digest file:** `replace-deprecated-editor-load-with-entity-storage-load-3447794.php` + +**Change:** The rector uses `$this->nodeFactory->createStaticCall()` and `createMethodCall()` helpers from Rector's `NodeFactory` for cleaner AST construction, replacing the fresh digest's inline manual node construction. The rector also adds a `count($node->args) !== 1` guard that the digest lacked. The class was renamed from `EditorLoadDeprecationRector`. --- -## Style-only / Minimal Changes - -These rectors show only namespace addition, class renaming, minor import reorganization, or trivial wording differences in doc blocks/rule descriptions. The core transformation logic is identical to the digest. - -- `ErrorCurrentErrorHandlerRector` — source: `rules/replace-error-currenterrorhandler-with-get-error-handler-3526515.php`, dest: `src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector.php` -- `FileSystemBasenameToNativeRector` — source: `rules/replace-filesysteminterface-basename-with-native-basename-3530461.php`, dest: `src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector.php` -- `RemoveLinkWidgetValidateTitleElementRector` — source: `rules/remove-deprecated-linkwidget-validatetitleelement-calls-3093118.php`, dest: `src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector.php` -- `RemoveStateCacheSettingRector` — source: `rules/remove-deprecated-settings-state-cache-assignment-3436954.php`, dest: `src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector.php` -- `RemoveUpdaterPostInstallMethodsRector` — source: `rules/remove-deprecated-updater-postinstall-postinstalltasks-3417136.php`, dest: `src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector.php` -- `ReplaceAlphadecimalToIntNullRector` — source: `rules/replace-deprecated-number-alphadecimaltoint-null-calls-with-3442810.php`, dest: `src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector.php` -- `ReplaceCommentUriRector` — source: `rules/replace-deprecated-comment-uri-with-comment-permalink-2010202.php`, dest: `src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector.php` -- `ReplaceDateTimeRangeConstantsRector` — source: `rules/replace-removed-datetimerangeconstantsinterface-constants-3574901.php`, dest: `src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector.php` -- `ReplaceEntityReferenceRecursiveLimitRector` — source: `rules/replace-deprecated-entityreferenceentityformatter-recursive-2940605.php`, dest: `src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector.php` -- `ReplaceFieldgroupToFieldsetRector` — source: `rules/replace-deprecated-type-fieldgroup-with-type-fieldset-3512254.php`, dest: `src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector.php` -- `ReplaceFileGetContentHeadersRector` — source: `rules/replace-file-get-content-headers-with-fileinterface-3494126.php`, dest: `src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector.php` -- `ReplaceNodeAccessViewAllNodesRector` — source: `rules/replace-deprecated-node-access-view-all-nodes-with-oo-3038908.php`, dest: `src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector.php` -- `ReplaceNodeAddBodyFieldRector` — source: `rules/replace-deprecated-node-add-body-field-with-createbodyfield-3489266.php`, dest: `src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector.php` -- `ReplaceNodeModuleProceduralFunctionsRector` — source: `rules/replace-deprecated-node-module-procedural-functions-with-oo-3571623.php`, dest: `src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector.php` -- `ReplaceRecipeRunnerInstallModuleRector` — source: `rules/replace-deprecated-reciperunner-installmodule-with-3498026.php`, dest: `src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector.php` -- `ReplaceSessionWritesWithRequestSessionRector` — source: `rules/replace-deprecated-session-writes-with-drupal-request-3518527.php`, dest: `src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector.php` -- `ReplaceSystemPerformanceGzipKeyRector` — source: `rules/replace-deprecated-system-performance-css-gzip-js-gzip-3184242.php`, dest: `src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector.php` -- `ReplaceThemeGetSettingRector` — source: `rules/replace-deprecated-theme-get-setting-and-system-default-3573896.php`, dest: `src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector.php` -- `ReplaceUserSessionNamePropertyRector` — source: `rules/replace-deprecated-usersession-name-property-read-with-3513856.php`, dest: `src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector.php` -- `ReplaceViewsProceduralFunctionsRector` — source: `rules/replace-deprecated-views-procedural-functions-with-oo-3572243.php`, dest: `src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector.php` -- `StripMigrationDependenciesExpandArgRector` — source: `rules/strip-removed-expand-argument-from-getmigrationdependencies-3574717.php`, dest: `src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector.php` -- `ViewsPluginHandlerManagerRector` — source: `rules/replace-deprecated-views-pluginmanager-and-views-3566424.php`, dest: `src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector.php` +### 21. `ReplaceEntityOriginalPropertyRector` (Drupal11) + +**Digest file:** `replace-deprecated-entity-original-magic-property-with-3571065.php` + +**Change:** The fresh digest handled `PropertyFetch` and `Assign` nodes only, with no type guard on read accesses. The rector adds `NullsafePropertyFetch` as a third node type, rewriting `$entity?->original` to `$entity?->getOriginal()` via `NullsafeMethodCall`. It also adds an `EntityInterface` ObjectType check on the `PropertyFetch` branch. The class was renamed from `EntityOriginalPropertyToMethodRector`. + +```php +// Fresh digest — only PropertyFetch and Assign +public function getNodeTypes(): array +{ + return [PropertyFetch::class, Assign::class]; +} +// No isObjectType check on the PropertyFetch branch + +// Rector — adds NullsafePropertyFetch and EntityInterface type guard +public function getNodeTypes(): array +{ + return [PropertyFetch::class, NullsafePropertyFetch::class, Assign::class]; +} +if ($this->isObjectType($node->var, new ObjectType('Drupal\Core\Entity\EntityInterface'))) { + return new MethodCall($node->var, 'getOriginal'); +} +``` + +--- + +### 22. `ReplaceLocaleConfigBatchFunctionsRector` (Drupal11) + +**Digest file:** `replace-deprecated-locale-batch-functions-with-their-3575254.php` + +**Change:** The fresh digest was a config snippet using the built-in `RenameFunctionRector`. The rector implements a full custom `FuncCall`-visiting rule with a `RENAME_MAP` constant, providing type-safety, testability, and more control over the transformation. + +--- + +### 23. `ReplaceNodeSetPreviewModeRector` (Drupal11) + +**Digest file:** `replace-deprecated-constants-with-nodepreviewmode-enum-in-3538277.php` + +**Change:** The fresh digest had no type guard on `setPreviewMode()` — it would rewrite the call on any object. The rector adds `isObjectType($node->var, new ObjectType('Drupal\node\NodeTypeInterface'))`, preventing false positives on unrelated classes with the same method name. The class was renamed from `NodeSetPreviewModeRector`. + +```php +// Fresh digest — no type guard +if (!$this->isName($node->name, 'setPreviewMode')) { return null; } + +// Rector — NodeTypeInterface guard +if (!$this->isObjectType($node->var, new ObjectType('Drupal\node\NodeTypeInterface'))) { + return null; +} +``` + +--- + +### 24. `ReplacePdoFetchConstantsRector` (Drupal11) + +**Digest file:** `replace-removed-mysql-pgsql-sqlite-driver-query-subclass-3525077.php` + +**Change:** The issue ID is shared but the two rules address entirely different aspects of the same deprecation. The fresh digest was a config snippet using `RenameClassRector` to repoint nine deprecated driver-specific query subclasses to their `Drupal\Core\Database\Query\*` equivalents. The rector is a full custom rule converting `PDO::FETCH_*` constants to `FetchAs` enum cases across `setFetchMode()`, `fetch()`, `fetchAll()`, `fetchAllAssoc()`, and `'fetch'` array keys. No code from the digest was reused. + +--- + +### 25. `ReplaceSessionManagerDeleteRector` (Drupal11) + +**Digest file:** `replace-deprecated-sessionmanager-delete-with-3577376.php` + +**Change:** The fresh digest extended `AbstractRector` directly with a plain `refactor()` method. The rector extends `AbstractDrupalCoreRector` and uses `refactorWithConfiguration()` with `DrupalIntroducedVersionConfiguration('11.4.0')`. The type-check strategy was also changed from the PHPStan `$sessionManagerType->isSuperTypeOf($callerType)->yes()` pattern to the standard Rector `$this->isObjectType()` API. + +```php +// Fresh digest +final class ReplaceSessionManagerDeleteRector extends AbstractRector +{ + public function refactor(Node $node): ?Node { ... } + +// Rector +final class ReplaceSessionManagerDeleteRector extends AbstractDrupalCoreRector +{ + public function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { ... } +``` + +--- + +### 26. `StatementPrefetchIteratorFetchColumnRector` (Drupal11) + +**Digest file:** `replace-deprecated-statementprefetchiterator-fetchcolumn-3490200.php` + +**Change:** The fresh digest was a config snippet using `RenameMethodRector` to rename `fetchColumn` → `fetchField` on `StatementPrefetchIterator`. The rector implements a full custom `MethodCall`-visiting rule with an explicit `StatementPrefetchIterator` ObjectType check, making the transformation testable and precise. + +--- + +### 27. `UseEntityTypeHasIntegerIdRector` (Drupal11) + +**Digest file:** `replace-deprecated-entity-type-integer-id-helpers-with-3566801.php` + +**Change:** The fresh digest treated `entityTypeSupportsComments()` and `hasIntegerId()` as simple `$this->method()` rewrites with no type guard — any class with those method names would be transformed. The rector adds a `METHOD_OWNER_CLASS` constant that maps each method to its declaring class FQCN and calls `isObjectType()` before transforming, preventing false positives entirely. + +```php +// Fresh digest — no type guard +private const SIMPLE_METHOD_NAMES = ['entityTypeSupportsComments']; +if (in_array($methodName, self::SIMPLE_METHOD_NAMES, true) && count($node->args) === 1) { + return new MethodCall($node->args[0]->value, 'hasIntegerId'); +} + +// Rector — type-guarded via METHOD_OWNER_CLASS +private const METHOD_OWNER_CLASS = [ + 'entityTypeSupportsComments' => 'Drupal\comment\CommentTypeForm', + 'hasIntegerId' => 'Drupal\layout_builder\Plugin\SectionStorage\OverridesSectionStorage', +]; +if (!$this->isObjectType($node->var, new ObjectType(self::METHOD_OWNER_CLASS[$name]))) { + return null; +} +``` + +--- + +## Minimal Changes + +These rectors are functionally identical to their fresh-digest counterparts. Differences are limited to: namespace declarations, proper `use` imports (replacing inline backslash-prefixed FQCNs), `declare(strict_types=1)` placement, class renaming to match drupal-rector naming conventions, and minor wording in `getRuleDefinition()`. + +| Rector class | Notable structural differences from digest | +|---|---| +| `ErrorCurrentErrorHandlerRector` | Namespace + imports only; `ObjectType` imported vs inline `\PHPStan\Type\ObjectType` | +| `FileSystemBasenameToNativeRector` | Namespace + imports only; type-check API changed from `isSuperTypeOf()->yes()` to `isObjectType()` (semantically equivalent) | +| `RemoveLinkWidgetValidateTitleElementRector` | Namespace + imports only | +| `RemoveStateCacheSettingRector` | Namespace + imports only | +| `RemoveUpdaterPostInstallMethodsRector` | Namespace + imports only; backslash escaping in `UPDATER_BASE_CLASSES` normalized | +| `ReplaceAlphadecimalToIntNullRector` | Namespace + imports only; class renamed from `AlphadecimalToIntNullOrEmptyRector` | +| `ReplaceCommentUriRector` | Namespace + imports only; class renamed from `CommentUriToPermalinkRector`; arg count check changed from `!== 1` to `< 1` | +| `ReplaceDateTimeRangeConstantsRector` | Namespace + imports only; class renamed from `ReplaceDatetimeDeprecatedApisRector` | +| `ReplaceEntityReferenceRecursiveLimitRector` | Namespace + imports only; class name preserved; logic identical | +| `ReplaceFieldgroupToFieldsetRector` | Namespace + imports only; class renamed from `FieldgroupToFieldsetRector` | +| `ReplaceFileGetContentHeadersRector` | Namespace + imports only; class renamed from `FileGetContentHeadersRector` | +| `ReplaceNodeAccessViewAllNodesRector` | Namespace + imports only; class renamed from `NodeAccessViewAllNodesRector` | +| `ReplaceNodeAddBodyFieldRector` | Namespace + imports only; class renamed from `NodeAddBodyFieldRector` | +| `ReplaceNodeModuleProceduralFunctionsRector` | Namespace + imports only; class renamed from `ReplaceDeprecatedNodeFunctionsRector`; private constants replaced with inline strings | +| `ReplaceRecipeRunnerInstallModuleRector` | Namespace + imports only; class renamed from `RecipeRunnerInstallModuleRector` | +| `ReplaceSessionWritesWithRequestSessionRector` | Namespace + imports only; class renamed from `SessionSuperGlobalToRequestSessionRector` | +| `ReplaceSystemPerformanceGzipKeyRector` | Namespace + imports only; class renamed from `SystemPerformanceGzipToCompressRector` | +| `ReplaceThemeGetSettingRector` | Namespace + imports only | +| `ReplaceUserSessionNamePropertyRector` | Namespace + imports only; class renamed from `UserSessionNamePropertyToGetAccountNameRector`; adds `UserSession` ObjectType check | +| `ReplaceViewsProceduralFunctionsRector` | Namespace + imports only; class renamed from `ReplaceDeprecatedViewsFunctionsRector` | +| `StripMigrationDependenciesExpandArgRector` | Namespace + imports only; class renamed from `RemoveMigrationDependenciesExpandArgRector`; type-check API changed from `isSuperTypeOf()->yes()` to `isObjectType()` (semantically equivalent) | +| `ViewsPluginHandlerManagerRector` | Namespace + imports only; class-name check changed from `isObjectType()` to `isName()` (correct for static call class nodes) | + +--- + +## Notes on Digest File Mapping + +### One digest file → two rector files +`remove-deprecated-trusted-data-concept-from-drupal-config-3347842.php` defined two classes in a single file: a combined handler for both `save(TRUE)` and `->trustData()` patterns. The rector project splits these into two separate class files — `RemoveConfigSaveTrustedDataArgRector` and `RemoveTrustDataCallRector` — consistent with the project's one-class-per-file convention. + +### Issue number mismatches +Three rectors reference a different `@see` issue number than the digest filename's suffix. In each case the transformation is the same; the numbers refer to different nodes in the same deprecation issue thread: + +| Rector | Rector `@see` | Digest filename issue | Notes | +|---|---|---|---| +| `RemoveViewsRowCacheKeysRector` | `#3564958` | `#3564937` | `3564958` is the change record; `3564937` is the original issue | +| `ReplaceCommentManagerGetCountNewCommentsRector` | `#3551729` | `#3543035` | `3543035` is the original issue; `3551729` is the related change record | +| `ReplaceEntityReferenceRecursiveLimitRector` | `#3316878` | `#2940605` | `2940605` is the older issue; `3316878` is the more recent change record | From d2a17a830c4545b2a0ada0c84384b4b38ddbf6df Mon Sep 17 00:00:00 2001 From: bjorn Date: Sun, 3 May 2026 10:47:05 +0200 Subject: [PATCH 100/256] fix(phpstan): narrow refactor() return type from mixed to ?Node 17 rector rules only return Node|null but declared mixed, triggering PHPStan return.unusedType errors. Narrow the native return type to ?Node to match actual behaviour. --- .../Rector/Deprecation/ReplaceRequestTimeConstantRector.php | 2 +- .../Deprecation/RemoveUpdaterPostInstallMethodsRector.php | 2 +- .../Rector/Deprecation/RenameStopProceduralHookScanRector.php | 2 +- src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector.php | 2 +- src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector.php | 2 +- .../Rector/Deprecation/ReplaceEntityOriginalPropertyRector.php | 2 +- .../Deprecation/ReplaceEntityReferenceRecursiveLimitRector.php | 2 +- .../Rector/Deprecation/ReplaceFileGetContentHeadersRector.php | 2 +- .../Deprecation/ReplaceLocaleConfigBatchFunctionsRector.php | 2 +- .../Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector.php | 2 +- .../Rector/Deprecation/ReplaceNodeAddBodyFieldRector.php | 2 +- .../Rector/Deprecation/ReplaceNodeSetPreviewModeRector.php | 2 +- .../ReplaceSessionWritesWithRequestSessionRector.php | 2 +- .../Rector/Deprecation/ReplaceUserSessionNamePropertyRector.php | 2 +- .../Deprecation/ReplaceViewsProceduralFunctionsRector.php | 2 +- .../Deprecation/StripMigrationDependenciesExpandArgRector.php | 2 +- .../Rector/Deprecation/UseEntityTypeHasIntegerIdRector.php | 2 +- 17 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector.php b/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector.php index a0fb0cdc6..353f2b146 100644 --- a/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector.php +++ b/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector.php @@ -23,7 +23,7 @@ public function getNodeTypes(): array return [Node\Expr\ConstFetch::class]; } - public function refactor(Node $node): mixed + public function refactor(Node $node): ?Node { assert($node instanceof Node\Expr\ConstFetch); diff --git a/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector.php b/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector.php index 13101de4f..b12192289 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector.php @@ -33,7 +33,7 @@ public function getNodeTypes(): array return [Class_::class]; } - public function refactor(Node $node): mixed + public function refactor(Node $node): ?Node { assert($node instanceof Class_); diff --git a/src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector.php b/src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector.php index a87698124..29fa0a09b 100644 --- a/src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector.php +++ b/src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector.php @@ -31,7 +31,7 @@ public function getNodeTypes(): array return [UseUse::class, Attribute::class]; } - public function refactor(Node $node): mixed + public function refactor(Node $node): ?Node { if ($node instanceof UseUse) { if ($node->name->toString() === self::OLD_FQCN) { diff --git a/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector.php b/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector.php index 855ed259e..a19feda2d 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector.php @@ -23,7 +23,7 @@ public function getNodeTypes(): array return [Node\Expr\FuncCall::class]; } - public function refactor(Node $node): mixed + public function refactor(Node $node): ?Node { assert($node instanceof Node\Expr\FuncCall); diff --git a/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector.php b/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector.php index 22f1d572d..cd54aff10 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector.php @@ -26,7 +26,7 @@ public function getNodeTypes(): array return [FuncCall::class]; } - public function refactor(Node $node): mixed + public function refactor(Node $node): ?Node { assert($node instanceof FuncCall); diff --git a/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector.php b/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector.php index 520e59193..86532de1a 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector.php @@ -32,7 +32,7 @@ public function getNodeTypes(): array return [PropertyFetch::class, NullsafePropertyFetch::class, Assign::class]; } - public function refactor(Node $node): mixed + public function refactor(Node $node): ?Node { // Step 1a: $entity->original → $entity->getOriginal() // (skip $this->original — non-entity classes have a legitimate $original property) diff --git a/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector.php b/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector.php index e54e8656d..5ce11576d 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector.php @@ -30,7 +30,7 @@ public function getNodeTypes(): array return [ClassConstFetch::class]; } - public function refactor(Node $node): mixed + public function refactor(Node $node): ?Node { assert($node instanceof ClassConstFetch); diff --git a/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector.php b/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector.php index 823b73022..7a36c1a1e 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector.php @@ -23,7 +23,7 @@ public function getNodeTypes(): array return [Node\Expr\FuncCall::class]; } - public function refactor(Node $node): mixed + public function refactor(Node $node): ?Node { assert($node instanceof Node\Expr\FuncCall); diff --git a/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector.php b/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector.php index 9421007ef..d51f66e3d 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector.php @@ -31,7 +31,7 @@ public function getNodeTypes(): array return [Node\Expr\FuncCall::class]; } - public function refactor(Node $node): mixed + public function refactor(Node $node): ?Node { assert($node instanceof Node\Expr\FuncCall); diff --git a/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector.php b/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector.php index b5e4ff98f..b079b5614 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector.php @@ -27,7 +27,7 @@ public function getNodeTypes(): array return [FuncCall::class]; } - public function refactor(Node $node): mixed + public function refactor(Node $node): ?Node { assert($node instanceof FuncCall); diff --git a/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector.php b/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector.php index e52a7b68a..bab0b75d1 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector.php @@ -28,7 +28,7 @@ public function getNodeTypes(): array return [FuncCall::class]; } - public function refactor(Node $node): mixed + public function refactor(Node $node): ?Node { assert($node instanceof FuncCall); diff --git a/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector.php b/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector.php index e90578ff7..0894935b2 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector.php @@ -37,7 +37,7 @@ public function getNodeTypes(): array return [Node\Expr\MethodCall::class]; } - public function refactor(Node $node): mixed + public function refactor(Node $node): ?Node { assert($node instanceof Node\Expr\MethodCall); diff --git a/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector.php b/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector.php index 8a698d2cb..59795315c 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector.php @@ -30,7 +30,7 @@ public function getNodeTypes(): array return [Assign::class]; } - public function refactor(Node $node): mixed + public function refactor(Node $node): ?Node { assert($node instanceof Assign); diff --git a/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector.php b/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector.php index dc38eddd9..0aaa64c30 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector.php @@ -25,7 +25,7 @@ public function getNodeTypes(): array return [Node\Expr\PropertyFetch::class]; } - public function refactor(Node $node): mixed + public function refactor(Node $node): ?Node { assert($node instanceof Node\Expr\PropertyFetch); diff --git a/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector.php b/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector.php index c968d629f..2bde1c55f 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector.php @@ -29,7 +29,7 @@ public function getNodeTypes(): array return [Node\Expr\FuncCall::class]; } - public function refactor(Node $node): mixed + public function refactor(Node $node): ?Node { assert($node instanceof Node\Expr\FuncCall); diff --git a/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector.php b/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector.php index 1ec32292e..2aaeb25da 100644 --- a/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector.php +++ b/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector.php @@ -24,7 +24,7 @@ public function getNodeTypes(): array return [Node\Expr\MethodCall::class]; } - public function refactor(Node $node): mixed + public function refactor(Node $node): ?Node { assert($node instanceof Node\Expr\MethodCall); diff --git a/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector.php b/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector.php index 96a35425d..86c235b8c 100644 --- a/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector.php +++ b/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector.php @@ -36,7 +36,7 @@ public function getNodeTypes(): array return [Node\Expr\BinaryOp\Identical::class, Node\Expr\MethodCall::class]; } - public function refactor(Node $node): mixed + public function refactor(Node $node): ?Node { if ($node instanceof Node\Expr\BinaryOp\Identical) { return $this->refactorIdentical($node); From e26cc8ec7ea403deec84c0deb12afa380e1dd7f5 Mon Sep 17 00:00:00 2001 From: bjorn Date: Sun, 3 May 2026 10:47:37 +0200 Subject: [PATCH 101/256] fix(phpstan): add @return phpdoc to refactor() that returns REMOVE_NODE|null 4 rector rules that only return NodeVisitor::REMOVE_NODE or null declared mixed, triggering return.unusedType. Add phpdoc to narrow the declared type (native union cannot express a class constant). --- .../Deprecation/RemoveAutomatedCronSubmitHandlerRector.php | 1 + .../Deprecation/RemoveLinkWidgetValidateTitleElementRector.php | 1 + .../Deprecation/RemoveModuleHandlerAddModuleCallsRector.php | 1 + .../Rector/Deprecation/RemoveStateCacheSettingRector.php | 1 + 4 files changed, 4 insertions(+) diff --git a/src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector.php b/src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector.php index b3d2e3945..a2283903c 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector.php @@ -25,6 +25,7 @@ public function getNodeTypes(): array return [Node\Stmt\Expression::class]; } + /** @return NodeVisitor::REMOVE_NODE|null */ public function refactor(Node $node): mixed { assert($node instanceof Node\Stmt\Expression); diff --git a/src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector.php b/src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector.php index d7f0433b7..868a8abad 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector.php @@ -25,6 +25,7 @@ public function getNodeTypes(): array return [Node\Stmt\Expression::class]; } + /** @return NodeVisitor::REMOVE_NODE|null */ public function refactor(Node $node): mixed { assert($node instanceof Node\Stmt\Expression); diff --git a/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector.php b/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector.php index c6097b961..38ede1a53 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector.php @@ -25,6 +25,7 @@ public function getNodeTypes(): array return [Node\Stmt\Expression::class]; } + /** @return NodeVisitor::REMOVE_NODE|null */ public function refactor(Node $node): mixed { assert($node instanceof Node\Stmt\Expression); diff --git a/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector.php b/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector.php index cf284e22c..df335df6c 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector.php @@ -25,6 +25,7 @@ public function getNodeTypes(): array return [Node\Stmt\Expression::class]; } + /** @return NodeVisitor::REMOVE_NODE|null */ public function refactor(Node $node): mixed { assert($node instanceof Node\Stmt\Expression); From c94fdae6d2a676b151ed3bb5b13f8ae017ff0225 Mon Sep 17 00:00:00 2001 From: bjorn Date: Sun, 3 May 2026 10:49:35 +0200 Subject: [PATCH 102/256] fix(phpstan): add @return phpdoc to NodeStorageDeprecatedMethodsRector::refactor() The method returns Node, NodeVisitor::REMOVE_NODE, or null but declared mixed, triggering return.unusedType. Add phpdoc to narrow the declared type (native union cannot express a class constant). --- .../Rector/Deprecation/NodeStorageDeprecatedMethodsRector.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector.php b/src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector.php index 2103e008b..e6a819267 100644 --- a/src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector.php +++ b/src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector.php @@ -23,6 +23,7 @@ public function getNodeTypes(): array return [Node\Expr\MethodCall::class, Node\Stmt\Expression::class]; } + /** @return Node|NodeVisitor::REMOVE_NODE|null */ public function refactor(Node $node): mixed { if ($node instanceof Node\Stmt\Expression) { From d2ac5401c36b381da9cfb74e582b598180d81c11 Mon Sep 17 00:00:00 2001 From: bjorn Date: Sun, 3 May 2026 10:51:05 +0200 Subject: [PATCH 103/256] fix(phpstan): add assert($node instanceof ) to refactor() methods 14 rector rules accessed node-subclass properties directly on Node, triggering property.notFound and method.notFound errors. Adding assert() as the first line of refactor() narrows the type to match getNodeTypes(). Also removes two now-provably-dead guards exposed by the type narrowing: - RemoveViewsRowCacheKeysRector: ArrayItem instanceof check (always true) - ReplaceFieldgroupToFieldsetRector: null check on item (always false) --- .../Rector/Deprecation/ErrorCurrentErrorHandlerRector.php | 1 + .../Rector/Deprecation/FileSystemBasenameToNativeRector.php | 1 + .../MigrateSqlGetMigrationPluginManagerRector.php | 1 + .../Rector/Deprecation/RemoveCacheExpireOverrideRector.php | 1 + .../Deprecation/RemoveConfigSaveTrustedDataArgRector.php | 1 + .../Rector/Deprecation/RemoveRootFromConvertDbUrlRector.php | 1 + .../Rector/Deprecation/RemoveTrustDataCallRector.php | 1 + .../Deprecation/RemoveTwigNodeTransTagArgumentRector.php | 1 + .../Rector/Deprecation/RemoveViewsRowCacheKeysRector.php | 6 +----- .../Deprecation/ReplaceAlphadecimalToIntNullRector.php | 1 + .../Deprecation/ReplaceFieldgroupToFieldsetRector.php | 4 +--- .../Deprecation/ReplaceRecipeRunnerInstallModuleRector.php | 1 + .../Deprecation/ReplaceSystemPerformanceGzipKeyRector.php | 1 + .../Rector/Deprecation/ReplaceThemeGetSettingRector.php | 1 + 14 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector.php b/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector.php index 0285b72f4..825d06a4d 100644 --- a/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector.php +++ b/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector.php @@ -43,6 +43,7 @@ public function getNodeTypes(): array public function refactor(Node $node): ?Node { + assert($node instanceof StaticCall); if (!$this->isName($node->name, 'currentErrorHandler')) { return null; } diff --git a/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector.php b/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector.php index 6ab856bff..f5036b708 100644 --- a/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector.php +++ b/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector.php @@ -44,6 +44,7 @@ public function getNodeTypes(): array public function refactor(Node $node): ?Node { + assert($node instanceof MethodCall); if (!$this->isName($node->name, 'basename')) { return null; } diff --git a/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector.php b/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector.php index 6867413e0..f0971418a 100644 --- a/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector.php +++ b/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector.php @@ -44,6 +44,7 @@ public function getNodeTypes(): array public function refactor(Node $node): ?Node { + assert($node instanceof MethodCall); if (!$node->var instanceof Variable || $node->var->name !== 'this') { return null; } diff --git a/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector.php b/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector.php index 4ed58da26..17876867f 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector.php @@ -54,6 +54,7 @@ public function getNodeTypes(): array public function refactor(Node $node): ?Node { + assert($node instanceof Class_); if (!$this->isCachePluginBaseSubclass($node)) { return null; } diff --git a/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector.php b/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector.php index bb7e58cd2..5c99046d5 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector.php @@ -44,6 +44,7 @@ public function getNodeTypes(): array public function refactor(Node $node): ?Node { + assert($node instanceof MethodCall); if (!$this->isName($node->name, 'save')) { return null; } diff --git a/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector.php b/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector.php index 986723dfa..a830e323a 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector.php @@ -50,6 +50,7 @@ public function getNodeTypes(): array public function refactor(Node $node): ?Node { + assert($node instanceof StaticCall); if (!$this->isName($node->class, 'Drupal\Core\Database\Database')) { return null; } diff --git a/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector.php b/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector.php index 202ad9de3..f9ac97f3e 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector.php @@ -42,6 +42,7 @@ public function getNodeTypes(): array public function refactor(Node $node): ?Node { + assert($node instanceof MethodCall); if (!$this->isName($node->name, 'trustData')) { return null; } diff --git a/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector.php b/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector.php index 192688260..54ad214f6 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector.php @@ -42,6 +42,7 @@ public function getNodeTypes(): array public function refactor(Node $node): ?Node { + assert($node instanceof New_); if (!$node->class instanceof Name) { return null; } diff --git a/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php b/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php index 685e95401..a6e1cdcb4 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php @@ -6,7 +6,6 @@ use PhpParser\Node; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Identifier; use PHPStan\Type\ObjectType; @@ -47,14 +46,11 @@ public function getNodeTypes(): array public function refactor(Node $node): ?Node { + assert($node instanceof Array_); $modified = false; $newItems = []; foreach ($node->items as $item) { - if (!$item instanceof ArrayItem) { - $newItems[] = $item; - continue; - } if ($item->value instanceof MethodCall && $item->value->name instanceof Identifier && in_array($item->value->name->toString(), self::DEPRECATED_METHODS, true) diff --git a/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector.php b/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector.php index d45120cec..fa03ba34f 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector.php @@ -44,6 +44,7 @@ public function getNodeTypes(): array public function refactor(Node $node): ?Node { + assert($node instanceof StaticCall); if (!$this->isName($node->name, 'alphadecimalToInt')) { return null; } diff --git a/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector.php b/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector.php index dbaed8a57..bcf9c991e 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector.php @@ -42,11 +42,9 @@ public function getNodeTypes(): array public function refactor(Node $node): ?Node { + assert($node instanceof Array_); $changed = false; foreach ($node->items as $item) { - if ($item === null) { - continue; - } if (!$item->key instanceof String_ || $item->key->value !== '#type') { continue; } diff --git a/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector.php b/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector.php index 67c1aed44..cacf6f6e8 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector.php @@ -46,6 +46,7 @@ public function getNodeTypes(): array public function refactor(Node $node): ?Node { + assert($node instanceof StaticCall); if (!$this->isName($node->name, 'installModule')) { return null; } diff --git a/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector.php b/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector.php index d1b998d47..15f1dc97e 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector.php @@ -46,6 +46,7 @@ public function getNodeTypes(): array public function refactor(Node $node): ?Node { + assert($node instanceof MethodCall); if (!$this->isNames($node->name, ['get', 'set'])) { return null; } diff --git a/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector.php b/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector.php index 4f0b8800f..1fca15af0 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector.php @@ -52,6 +52,7 @@ public function getNodeTypes(): array public function refactor(Node $node): ?Node { + assert($node instanceof FuncCall); if (!$node->name instanceof Name) { return null; } From 090669224de39477f58fc05d4aa8dee60ee53145 Mon Sep 17 00:00:00 2001 From: bjorn Date: Sun, 3 May 2026 10:52:55 +0200 Subject: [PATCH 104/256] fix(phpstan): fix undefined variable in ReplaceEditorLoadRector CodeSample Double-quoted string caused $editor to be interpreted as a PHP variable interpolation. Changed to single-quoted string to fix PHPStan error variable.undefined. --- src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector.php b/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector.php index cd54aff10..8bdc2cd21 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector.php @@ -49,7 +49,7 @@ public function getRuleDefinition(): RuleDefinition return new RuleDefinition('Replace deprecated editor_load($format_id) with entityTypeManager()->getStorage(\'editor\')->load() (drupal:11.2.0)', [ new CodeSample( '$editor = editor_load($format_id);', - "$editor = \\Drupal::entityTypeManager()->getStorage('editor')->load(\$format_id);" + '$editor = \Drupal::entityTypeManager()->getStorage(\'editor\')->load($format_id);' ), ]); } From 34b46cd483fb9777dea5869b8b5881735ae5f982 Mon Sep 17 00:00:00 2001 From: bjorn Date: Sun, 3 May 2026 11:00:33 +0200 Subject: [PATCH 105/256] fix(tests): replace @dataProvider docblocks with PHPUnit 8 attributes PHPUnit 12 dropped support for @dataProvider annotations. Replace with #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] attribute across all 52 affected test files. --- .../ReplaceModuleHandlerGetNameRectorTest.php | 6 +----- .../ReplaceRebuildThemeDataRectorTest.php | 6 +----- .../ReplaceRequestTimeConstantRectorTest.php | 6 +----- .../ErrorCurrentErrorHandlerRectorTest.php | 6 +----- .../FileSystemBasenameToNativeRectorTest.php | 6 +----- .../LoadAllIncludesRector/LoadAllIncludesRectorTest.php | 6 +----- .../MigrateSqlGetMigrationPluginManagerRectorTest.php | 6 +----- .../NodeStorageDeprecatedMethodsRectorTest.php | 6 +----- .../PluginBaseIsConfigurableRectorTest.php | 6 +----- .../RemoveAutomatedCronSubmitHandlerRectorTest.php | 6 +----- .../RemoveCacheExpireOverrideRectorTest.php | 6 +----- .../RemoveConfigSaveTrustedDataArgRectorTest.php | 6 +----- .../RemoveHandlerBaseDefineExtraOptionsRectorTest.php | 6 +----- .../RemoveLinkWidgetValidateTitleElementRectorTest.php | 6 +----- .../RemoveModuleHandlerAddModuleCallsRectorTest.php | 6 +----- .../RemoveModuleHandlerDeprecatedMethodsRectorTest.php | 6 +----- .../RemoveRootFromConvertDbUrlRectorTest.php | 6 +----- .../RemoveSetUriCallbackRectorTest.php | 6 +----- .../RemoveStateCacheSettingRectorTest.php | 6 +----- .../RemoveTrustDataCallRectorTest.php | 6 +----- .../RemoveTwigNodeTransTagArgumentRectorTest.php | 6 +----- .../RemoveUpdaterPostInstallMethodsRectorTest.php | 6 +----- .../RemoveViewsRowCacheKeysRectorTest.php | 6 +----- .../RenameStopProceduralHookScanRectorTest.php | 6 +----- .../ReplaceAlphadecimalToIntNullRectorTest.php | 6 +----- .../ReplaceCommentManagerGetCountNewCommentsRectorTest.php | 6 +----- .../ReplaceCommentUriRector/ReplaceCommentUriRectorTest.php | 6 +----- .../ReplaceDateTimeRangeConstantsRectorTest.php | 6 +----- .../ReplaceEditorLoadRector/ReplaceEditorLoadRectorTest.php | 6 +----- .../ReplaceEntityOriginalPropertyRectorTest.php | 6 +----- .../ReplaceEntityReferenceRecursiveLimitRectorTest.php | 6 +----- .../ReplaceFieldgroupToFieldsetRectorTest.php | 6 +----- .../ReplaceFileGetContentHeadersRectorTest.php | 6 +----- .../ReplaceLocaleConfigBatchFunctionsRectorTest.php | 6 +----- .../ReplaceNodeAccessViewAllNodesRectorTest.php | 6 +----- .../ReplaceNodeAddBodyFieldRectorTest.php | 6 +----- .../ReplaceNodeModuleProceduralFunctionsRectorTest.php | 6 +----- .../ReplaceNodeSetPreviewModeRectorTest.php | 6 +----- .../ReplacePdoFetchConstantsRectorTest.php | 6 +----- .../ReplaceRecipeRunnerInstallModuleRectorTest.php | 6 +----- .../ReplaceSessionManagerDeleteRectorTest.php | 6 +----- .../ReplaceSessionWritesWithRequestSessionRectorTest.php | 6 +----- .../ReplaceSystemPerformanceGzipKeyRectorTest.php | 6 +----- .../ReplaceThemeGetSettingRectorTest.php | 6 +----- .../ReplaceUserSessionNamePropertyRectorTest.php | 6 +----- .../ReplaceViewsProceduralFunctionsRectorTest.php | 6 +----- .../StatementPrefetchIteratorFetchColumnRectorTest.php | 6 +----- .../StripMigrationDependenciesExpandArgRectorTest.php | 6 +----- .../UseEntityTypeHasIntegerIdRectorTest.php | 6 +----- .../ViewsPluginHandlerManagerRectorTest.php | 6 +----- .../AbstractDrupalCoreRectorTest.php | 6 +----- .../FunctionCallRemovalRectorTest.php | 6 +----- 52 files changed, 52 insertions(+), 260 deletions(-) diff --git a/tests/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector/ReplaceModuleHandlerGetNameRectorTest.php b/tests/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector/ReplaceModuleHandlerGetNameRectorTest.php index d58889035..a1e10f8c8 100644 --- a/tests/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector/ReplaceModuleHandlerGetNameRectorTest.php +++ b/tests/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector/ReplaceModuleHandlerGetNameRectorTest.php @@ -8,11 +8,7 @@ class ReplaceModuleHandlerGetNameRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/ReplaceRebuildThemeDataRectorTest.php b/tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/ReplaceRebuildThemeDataRectorTest.php index 545c14647..e89c7860c 100644 --- a/tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/ReplaceRebuildThemeDataRectorTest.php +++ b/tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/ReplaceRebuildThemeDataRectorTest.php @@ -8,11 +8,7 @@ class ReplaceRebuildThemeDataRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/ReplaceRequestTimeConstantRectorTest.php b/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/ReplaceRequestTimeConstantRectorTest.php index 5cba0795c..088c615e1 100644 --- a/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/ReplaceRequestTimeConstantRectorTest.php +++ b/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/ReplaceRequestTimeConstantRectorTest.php @@ -8,11 +8,7 @@ class ReplaceRequestTimeConstantRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/ErrorCurrentErrorHandlerRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/ErrorCurrentErrorHandlerRectorTest.php index 694681a61..f264455a3 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/ErrorCurrentErrorHandlerRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/ErrorCurrentErrorHandlerRectorTest.php @@ -8,11 +8,7 @@ class ErrorCurrentErrorHandlerRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/FileSystemBasenameToNativeRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/FileSystemBasenameToNativeRectorTest.php index 4c4382eaa..b45137f98 100644 --- a/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/FileSystemBasenameToNativeRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/FileSystemBasenameToNativeRectorTest.php @@ -8,11 +8,7 @@ class FileSystemBasenameToNativeRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector/LoadAllIncludesRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector/LoadAllIncludesRectorTest.php index f257e76d2..3790f2b34 100644 --- a/tests/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector/LoadAllIncludesRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector/LoadAllIncludesRectorTest.php @@ -8,11 +8,7 @@ class LoadAllIncludesRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/MigrateSqlGetMigrationPluginManagerRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/MigrateSqlGetMigrationPluginManagerRectorTest.php index 0f402ce95..07dc06a87 100644 --- a/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/MigrateSqlGetMigrationPluginManagerRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/MigrateSqlGetMigrationPluginManagerRectorTest.php @@ -8,11 +8,7 @@ class MigrateSqlGetMigrationPluginManagerRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector/NodeStorageDeprecatedMethodsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector/NodeStorageDeprecatedMethodsRectorTest.php index 57ce14d1f..826325019 100644 --- a/tests/src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector/NodeStorageDeprecatedMethodsRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector/NodeStorageDeprecatedMethodsRectorTest.php @@ -8,11 +8,7 @@ class NodeStorageDeprecatedMethodsRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/PluginBaseIsConfigurableRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/PluginBaseIsConfigurableRectorTest.php index aa68896b5..f4349a0ac 100644 --- a/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/PluginBaseIsConfigurableRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/PluginBaseIsConfigurableRectorTest.php @@ -8,11 +8,7 @@ class PluginBaseIsConfigurableRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector/RemoveAutomatedCronSubmitHandlerRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector/RemoveAutomatedCronSubmitHandlerRectorTest.php index 942f531db..0d78543ad 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector/RemoveAutomatedCronSubmitHandlerRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector/RemoveAutomatedCronSubmitHandlerRectorTest.php @@ -8,11 +8,7 @@ class RemoveAutomatedCronSubmitHandlerRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/RemoveCacheExpireOverrideRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/RemoveCacheExpireOverrideRectorTest.php index 3e335fd9f..c99162cd8 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/RemoveCacheExpireOverrideRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/RemoveCacheExpireOverrideRectorTest.php @@ -8,11 +8,7 @@ class RemoveCacheExpireOverrideRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector/RemoveConfigSaveTrustedDataArgRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector/RemoveConfigSaveTrustedDataArgRectorTest.php index c0378c981..602c5baf9 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector/RemoveConfigSaveTrustedDataArgRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector/RemoveConfigSaveTrustedDataArgRectorTest.php @@ -8,11 +8,7 @@ class RemoveConfigSaveTrustedDataArgRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/RemoveHandlerBaseDefineExtraOptionsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/RemoveHandlerBaseDefineExtraOptionsRectorTest.php index 0133f74e9..ec7092a7a 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/RemoveHandlerBaseDefineExtraOptionsRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/RemoveHandlerBaseDefineExtraOptionsRectorTest.php @@ -8,11 +8,7 @@ class RemoveHandlerBaseDefineExtraOptionsRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector/RemoveLinkWidgetValidateTitleElementRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector/RemoveLinkWidgetValidateTitleElementRectorTest.php index c7877f113..9b0c17e3b 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector/RemoveLinkWidgetValidateTitleElementRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector/RemoveLinkWidgetValidateTitleElementRectorTest.php @@ -8,11 +8,7 @@ class RemoveLinkWidgetValidateTitleElementRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector/RemoveModuleHandlerAddModuleCallsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector/RemoveModuleHandlerAddModuleCallsRectorTest.php index b7e0ec4c9..d90c5e5df 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector/RemoveModuleHandlerAddModuleCallsRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector/RemoveModuleHandlerAddModuleCallsRectorTest.php @@ -8,11 +8,7 @@ class RemoveModuleHandlerAddModuleCallsRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector/RemoveModuleHandlerDeprecatedMethodsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector/RemoveModuleHandlerDeprecatedMethodsRectorTest.php index 94773b972..5671be3b8 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector/RemoveModuleHandlerDeprecatedMethodsRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector/RemoveModuleHandlerDeprecatedMethodsRectorTest.php @@ -8,11 +8,7 @@ class RemoveModuleHandlerDeprecatedMethodsRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/RemoveRootFromConvertDbUrlRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/RemoveRootFromConvertDbUrlRectorTest.php index 912a9f8ee..9968ccf54 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/RemoveRootFromConvertDbUrlRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/RemoveRootFromConvertDbUrlRectorTest.php @@ -8,11 +8,7 @@ class RemoveRootFromConvertDbUrlRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/RemoveSetUriCallbackRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/RemoveSetUriCallbackRectorTest.php index eeee99d08..0868759fd 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/RemoveSetUriCallbackRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/RemoveSetUriCallbackRectorTest.php @@ -8,11 +8,7 @@ class RemoveSetUriCallbackRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector/RemoveStateCacheSettingRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector/RemoveStateCacheSettingRectorTest.php index 2146aa965..2b506309c 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector/RemoveStateCacheSettingRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector/RemoveStateCacheSettingRectorTest.php @@ -8,11 +8,7 @@ class RemoveStateCacheSettingRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/RemoveTrustDataCallRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/RemoveTrustDataCallRectorTest.php index 6a30f9a30..b10b9c176 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/RemoveTrustDataCallRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/RemoveTrustDataCallRectorTest.php @@ -8,11 +8,7 @@ class RemoveTrustDataCallRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/RemoveTwigNodeTransTagArgumentRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/RemoveTwigNodeTransTagArgumentRectorTest.php index 59965067b..98a42f90a 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/RemoveTwigNodeTransTagArgumentRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/RemoveTwigNodeTransTagArgumentRectorTest.php @@ -8,11 +8,7 @@ class RemoveTwigNodeTransTagArgumentRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector/RemoveUpdaterPostInstallMethodsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector/RemoveUpdaterPostInstallMethodsRectorTest.php index b83b3e440..f111ec57e 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector/RemoveUpdaterPostInstallMethodsRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector/RemoveUpdaterPostInstallMethodsRectorTest.php @@ -8,11 +8,7 @@ class RemoveUpdaterPostInstallMethodsRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/RemoveViewsRowCacheKeysRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/RemoveViewsRowCacheKeysRectorTest.php index 3e5d10502..381e17082 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/RemoveViewsRowCacheKeysRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/RemoveViewsRowCacheKeysRectorTest.php @@ -8,11 +8,7 @@ class RemoveViewsRowCacheKeysRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector/RenameStopProceduralHookScanRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector/RenameStopProceduralHookScanRectorTest.php index ad234f85c..a102fe59c 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector/RenameStopProceduralHookScanRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector/RenameStopProceduralHookScanRectorTest.php @@ -8,11 +8,7 @@ class RenameStopProceduralHookScanRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/ReplaceAlphadecimalToIntNullRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/ReplaceAlphadecimalToIntNullRectorTest.php index 2c1d9e2fc..6545eb5a1 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/ReplaceAlphadecimalToIntNullRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/ReplaceAlphadecimalToIntNullRectorTest.php @@ -8,11 +8,7 @@ class ReplaceAlphadecimalToIntNullRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/ReplaceCommentManagerGetCountNewCommentsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/ReplaceCommentManagerGetCountNewCommentsRectorTest.php index ab37b68b3..3a74ab5e9 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/ReplaceCommentManagerGetCountNewCommentsRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/ReplaceCommentManagerGetCountNewCommentsRectorTest.php @@ -8,11 +8,7 @@ class ReplaceCommentManagerGetCountNewCommentsRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/ReplaceCommentUriRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/ReplaceCommentUriRectorTest.php index 9b03a6c6a..8dfe5d260 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/ReplaceCommentUriRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/ReplaceCommentUriRectorTest.php @@ -8,11 +8,7 @@ class ReplaceCommentUriRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/ReplaceDateTimeRangeConstantsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/ReplaceDateTimeRangeConstantsRectorTest.php index f41e0ca6a..1dd8cf4d7 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/ReplaceDateTimeRangeConstantsRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/ReplaceDateTimeRangeConstantsRectorTest.php @@ -8,11 +8,7 @@ class ReplaceDateTimeRangeConstantsRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/ReplaceEditorLoadRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/ReplaceEditorLoadRectorTest.php index d46428b47..6be474c9d 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/ReplaceEditorLoadRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/ReplaceEditorLoadRectorTest.php @@ -8,11 +8,7 @@ class ReplaceEditorLoadRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/ReplaceEntityOriginalPropertyRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/ReplaceEntityOriginalPropertyRectorTest.php index b7b469a7c..29904b1e4 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/ReplaceEntityOriginalPropertyRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/ReplaceEntityOriginalPropertyRectorTest.php @@ -8,11 +8,7 @@ class ReplaceEntityOriginalPropertyRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/ReplaceEntityReferenceRecursiveLimitRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/ReplaceEntityReferenceRecursiveLimitRectorTest.php index 1cdee0612..b52e0ce7e 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/ReplaceEntityReferenceRecursiveLimitRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/ReplaceEntityReferenceRecursiveLimitRectorTest.php @@ -8,11 +8,7 @@ class ReplaceEntityReferenceRecursiveLimitRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/ReplaceFieldgroupToFieldsetRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/ReplaceFieldgroupToFieldsetRectorTest.php index 835a3895b..8ab7629e4 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/ReplaceFieldgroupToFieldsetRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/ReplaceFieldgroupToFieldsetRectorTest.php @@ -8,11 +8,7 @@ class ReplaceFieldgroupToFieldsetRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/ReplaceFileGetContentHeadersRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/ReplaceFileGetContentHeadersRectorTest.php index f71b03b4d..037a5eb98 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/ReplaceFileGetContentHeadersRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/ReplaceFileGetContentHeadersRectorTest.php @@ -8,11 +8,7 @@ class ReplaceFileGetContentHeadersRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/ReplaceLocaleConfigBatchFunctionsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/ReplaceLocaleConfigBatchFunctionsRectorTest.php index 18b4069a0..5ee6c9e13 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/ReplaceLocaleConfigBatchFunctionsRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/ReplaceLocaleConfigBatchFunctionsRectorTest.php @@ -8,11 +8,7 @@ class ReplaceLocaleConfigBatchFunctionsRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/ReplaceNodeAccessViewAllNodesRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/ReplaceNodeAccessViewAllNodesRectorTest.php index 9a120bd4a..ca3e90a8c 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/ReplaceNodeAccessViewAllNodesRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/ReplaceNodeAccessViewAllNodesRectorTest.php @@ -8,11 +8,7 @@ class ReplaceNodeAccessViewAllNodesRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/ReplaceNodeAddBodyFieldRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/ReplaceNodeAddBodyFieldRectorTest.php index e2eff93e5..810c26f22 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/ReplaceNodeAddBodyFieldRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/ReplaceNodeAddBodyFieldRectorTest.php @@ -8,11 +8,7 @@ class ReplaceNodeAddBodyFieldRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/ReplaceNodeModuleProceduralFunctionsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/ReplaceNodeModuleProceduralFunctionsRectorTest.php index 1608c0494..573527971 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/ReplaceNodeModuleProceduralFunctionsRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/ReplaceNodeModuleProceduralFunctionsRectorTest.php @@ -8,11 +8,7 @@ class ReplaceNodeModuleProceduralFunctionsRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/ReplaceNodeSetPreviewModeRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/ReplaceNodeSetPreviewModeRectorTest.php index 5bdd17390..19d867d6d 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/ReplaceNodeSetPreviewModeRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/ReplaceNodeSetPreviewModeRectorTest.php @@ -8,11 +8,7 @@ class ReplaceNodeSetPreviewModeRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/ReplacePdoFetchConstantsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/ReplacePdoFetchConstantsRectorTest.php index 47847ef23..b545184bc 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/ReplacePdoFetchConstantsRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/ReplacePdoFetchConstantsRectorTest.php @@ -8,11 +8,7 @@ class ReplacePdoFetchConstantsRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/ReplaceRecipeRunnerInstallModuleRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/ReplaceRecipeRunnerInstallModuleRectorTest.php index d3a98f766..1b59b97e1 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/ReplaceRecipeRunnerInstallModuleRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/ReplaceRecipeRunnerInstallModuleRectorTest.php @@ -8,11 +8,7 @@ class ReplaceRecipeRunnerInstallModuleRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/ReplaceSessionManagerDeleteRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/ReplaceSessionManagerDeleteRectorTest.php index d39f42c80..611e0f102 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/ReplaceSessionManagerDeleteRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/ReplaceSessionManagerDeleteRectorTest.php @@ -8,11 +8,7 @@ class ReplaceSessionManagerDeleteRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/ReplaceSessionWritesWithRequestSessionRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/ReplaceSessionWritesWithRequestSessionRectorTest.php index f73d4993f..f93b32ae0 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/ReplaceSessionWritesWithRequestSessionRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/ReplaceSessionWritesWithRequestSessionRectorTest.php @@ -8,11 +8,7 @@ class ReplaceSessionWritesWithRequestSessionRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/ReplaceSystemPerformanceGzipKeyRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/ReplaceSystemPerformanceGzipKeyRectorTest.php index d7429f062..2b050f24b 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/ReplaceSystemPerformanceGzipKeyRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/ReplaceSystemPerformanceGzipKeyRectorTest.php @@ -8,11 +8,7 @@ class ReplaceSystemPerformanceGzipKeyRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/ReplaceThemeGetSettingRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/ReplaceThemeGetSettingRectorTest.php index 8271e9544..941b92675 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/ReplaceThemeGetSettingRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/ReplaceThemeGetSettingRectorTest.php @@ -8,11 +8,7 @@ class ReplaceThemeGetSettingRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/ReplaceUserSessionNamePropertyRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/ReplaceUserSessionNamePropertyRectorTest.php index f1baaa4e3..34f311691 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/ReplaceUserSessionNamePropertyRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/ReplaceUserSessionNamePropertyRectorTest.php @@ -8,11 +8,7 @@ class ReplaceUserSessionNamePropertyRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/ReplaceViewsProceduralFunctionsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/ReplaceViewsProceduralFunctionsRectorTest.php index bb579c1bb..658b9d71a 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/ReplaceViewsProceduralFunctionsRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/ReplaceViewsProceduralFunctionsRectorTest.php @@ -8,11 +8,7 @@ class ReplaceViewsProceduralFunctionsRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/StatementPrefetchIteratorFetchColumnRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/StatementPrefetchIteratorFetchColumnRectorTest.php index af053b973..d26aa82f4 100644 --- a/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/StatementPrefetchIteratorFetchColumnRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/StatementPrefetchIteratorFetchColumnRectorTest.php @@ -8,11 +8,7 @@ class StatementPrefetchIteratorFetchColumnRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/StripMigrationDependenciesExpandArgRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/StripMigrationDependenciesExpandArgRectorTest.php index edbb290a6..34a9e1d6c 100644 --- a/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/StripMigrationDependenciesExpandArgRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/StripMigrationDependenciesExpandArgRectorTest.php @@ -8,11 +8,7 @@ class StripMigrationDependenciesExpandArgRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/UseEntityTypeHasIntegerIdRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/UseEntityTypeHasIntegerIdRectorTest.php index fa7ed2e54..1691f779b 100644 --- a/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/UseEntityTypeHasIntegerIdRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/UseEntityTypeHasIntegerIdRectorTest.php @@ -8,11 +8,7 @@ class UseEntityTypeHasIntegerIdRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/ViewsPluginHandlerManagerRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/ViewsPluginHandlerManagerRectorTest.php index cc577b0e5..ed855a537 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/ViewsPluginHandlerManagerRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/ViewsPluginHandlerManagerRectorTest.php @@ -8,11 +8,7 @@ class ViewsPluginHandlerManagerRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Rector/AbstractDrupalCoreRector/AbstractDrupalCoreRectorTest.php b/tests/src/Rector/AbstractDrupalCoreRector/AbstractDrupalCoreRectorTest.php index 755d34d2f..d06c33050 100644 --- a/tests/src/Rector/AbstractDrupalCoreRector/AbstractDrupalCoreRectorTest.php +++ b/tests/src/Rector/AbstractDrupalCoreRector/AbstractDrupalCoreRectorTest.php @@ -9,11 +9,7 @@ class AbstractDrupalCoreRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); diff --git a/tests/src/Rector/Deprecation/FunctionCallRemovalRector/FunctionCallRemovalRectorTest.php b/tests/src/Rector/Deprecation/FunctionCallRemovalRector/FunctionCallRemovalRectorTest.php index 2d6308c9b..cd43a0468 100644 --- a/tests/src/Rector/Deprecation/FunctionCallRemovalRector/FunctionCallRemovalRectorTest.php +++ b/tests/src/Rector/Deprecation/FunctionCallRemovalRector/FunctionCallRemovalRectorTest.php @@ -8,11 +8,7 @@ class FunctionCallRemovalRectorTest extends AbstractRectorTestCase { - /** - * @covers ::refactor - * - * @dataProvider provideData - */ + #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { $this->doTestFile($filePath); From a4f49fce3b4ae4f251fae439a99a1522ab5af99f Mon Sep 17 00:00:00 2001 From: bjorn Date: Tue, 5 May 2026 13:10:52 +0200 Subject: [PATCH 106/256] fix(AbstractDrupalCoreRector): revert debug changes, restore correct >= version comparison --- .../drupal-11/drupal-11-all-deprecations.php | 20 + docs/contrib-module-search.md | 220 + docs/contrib-modules-d11.md | 751 + docs/digest-comparison-report-0505.md | 576 + docs/filter_d11.py | 155 + docs/filter_progress.log | 1228 + docs/find_d11_for_rectors.py | 210 + docs/find_d11_targeted.py | 150 + docs/pass2_progress.log | 220 + docs/pass2_results.json | 8 + docs/plans/no-match-investigation.md | 52 + docs/search_modules.py | 168 + docs/search_progress.log | 1348 + docs/search_results.json | 24248 ++++++++++++++++ docs/targeted_progress.log | 351 + docs/targeted_results.json | 174 + scripts/setup-rector-test.sh | 217 + 17 files changed, 30096 insertions(+) create mode 100644 config/drupal-11/drupal-11-all-deprecations.php create mode 100644 docs/contrib-module-search.md create mode 100644 docs/contrib-modules-d11.md create mode 100644 docs/digest-comparison-report-0505.md create mode 100644 docs/filter_d11.py create mode 100644 docs/filter_progress.log create mode 100644 docs/find_d11_for_rectors.py create mode 100644 docs/find_d11_targeted.py create mode 100644 docs/pass2_progress.log create mode 100644 docs/pass2_results.json create mode 100644 docs/plans/no-match-investigation.md create mode 100644 docs/search_modules.py create mode 100644 docs/search_progress.log create mode 100644 docs/search_results.json create mode 100644 docs/targeted_progress.log create mode 100644 docs/targeted_results.json create mode 100755 scripts/setup-rector-test.sh diff --git a/config/drupal-11/drupal-11-all-deprecations.php b/config/drupal-11/drupal-11-all-deprecations.php new file mode 100644 index 000000000..fde49c10e --- /dev/null +++ b/config/drupal-11/drupal-11-all-deprecations.php @@ -0,0 +1,20 @@ +sets([ + Drupal11SetList::DRUPAL_110, + Drupal11SetList::DRUPAL_111, + Drupal11SetList::DRUPAL_112, + Drupal11SetList::DRUPAL_113, + Drupal11SetList::DRUPAL_114, + ]); + + $rectorConfig->bootstrapFiles([ + __DIR__.'/../drupal-phpunit-bootstrap-file.php', + ]); +}; diff --git a/docs/contrib-module-search.md b/docs/contrib-module-search.md new file mode 100644 index 000000000..5f89b181f --- /dev/null +++ b/docs/contrib-module-search.md @@ -0,0 +1,220 @@ +# Contrib Module Search — New Rectors + +Use the Drupal GitLab search to find contrib modules that use the deprecated code each rector targets. + +Base search URL (replace `QUERY` with the search term): +``` +https://git.drupalcode.org/search?group_id=2&scope=blobs&search=-path%3Acore+-path%3Avendor+-path%3Adocroot+-path%3Aweb+-path%3Aprofiles+-path%3Asites+QUERY +``` + +--- + +## Drupal 11 Rectors + +### ErrorCurrentErrorHandlerRector +- **Search:** `Error::currentErrorHandler` +- **Modules found:** — + +### FileSystemBasenameToNativeRector +- **Search:** `->basename(` +- **Modules found:** — + +### LoadAllIncludesRector +- **Search:** `->loadAllIncludes(` +- **Modules found:** — + +### MigrateSqlGetMigrationPluginManagerRector +- **Search:** `->getMigrationPluginManager(` +- **Modules found:** — + +### NodeStorageDeprecatedMethodsRector +- **Search:** `->revisionIds(` OR `->userRevisionIds(` OR `->countDefaultLanguageRevisions(` +- **Modules found:** — + +### PluginBaseIsConfigurableRector +- **Search:** `->isConfigurable(` +- **Modules found:** — + +### RemoveAutomatedCronSubmitHandlerRector +- **Search:** `automated_cron_settings_submit` +- **Modules found:** — + +### RemoveCacheExpireOverrideRector +- **Search:** `function cacheExpire(` +- **Modules found:** — + +### RemoveConfigSaveTrustedDataArgRector +- **Search:** `->save(TRUE)` or `->save(true)` on Config objects +- **Modules found:** — + +### RemoveHandlerBaseDefineExtraOptionsRector +- **Search:** `function defineExtraOptions(` +- **Modules found:** — + +### RemoveLinkWidgetValidateTitleElementRector +- **Search:** `LinkWidget::validateTitleElement` +- **Modules found:** — + +### RemoveModuleHandlerAddModuleCallsRector +- **Search:** `->addModule(` OR `->addProfile(` +- **Modules found:** — + +### RemoveModuleHandlerDeprecatedMethodsRector +- **Search:** `->writeCache(` OR `->getHookInfo(` +- **Modules found:** — + +### RemoveRootFromConvertDbUrlRector +- **Search:** `convertDbUrlToConnectionInfo(` +- **Modules found:** — + +### RemoveSetUriCallbackRector +- **Search:** `->setUriCallback(` +- **Modules found:** — + +### RemoveStateCacheSettingRector +- **Search:** `state_cache` +- **Modules found:** — + +### RemoveTrustDataCallRector +- **Search:** `->trustData(` +- **Modules found:** — + +### RemoveTwigNodeTransTagArgumentRector +- **Search:** `TwigNodeTrans` +- **Modules found:** — + +### RemoveUpdaterPostInstallMethodsRector +- **Search:** `function postInstall(` OR `function postInstallTasks(` +- **Modules found:** — + +### RemoveViewsRowCacheKeysRector +- **Search:** `function getRowCacheKeys(` OR `function getRowId(` +- **Modules found:** — + +### RenameStopProceduralHookScanRector +- **Search:** `StopProceduralHookScan` +- **Modules found:** — + +### ReplaceAlphadecimalToIntNullRector +- **Search:** `alphadecimalToInt(` +- **Modules found:** — + +### ReplaceCommentManagerGetCountNewCommentsRector +- **Search:** `->getCountNewComments(` +- **Modules found:** — + +### ReplaceCommentUriRector +- **Search:** `comment_uri(` +- **Modules found:** — + +### ReplaceDateTimeRangeConstantsRector +- **Search:** `DateTimeRangeConstantsInterface` OR `datetime_type_field_views_data_helper(` +- **Modules found:** — + +### ReplaceEditorLoadRector +- **Search:** `editor_load(` +- **Modules found:** — + +### ReplaceEntityOriginalPropertyRector +- **Search:** `->original` +- **Modules found:** — + +### ReplaceEntityReferenceRecursiveLimitRector +- **Search:** `RECURSIVE_RENDER_LIMIT` +- **Modules found:** — + +### ReplaceFieldgroupToFieldsetRector +- **Search:** `'#type' => 'fieldgroup'` +- **Modules found:** — + +### ReplaceFileGetContentHeadersRector +- **Search:** `file_get_content_headers(` +- **Modules found:** — + +### ReplaceLocaleConfigBatchFunctionsRector +- **Search:** `locale_config_batch_set_config_langcodes(` OR `locale_config_batch_refresh_name(` +- **Modules found:** — + +### ReplaceNodeAccessViewAllNodesRector +- **Search:** `node_access_view_all_nodes(` +- **Modules found:** — + +### ReplaceNodeAddBodyFieldRector +- **Search:** `node_add_body_field(` +- **Modules found:** — + +### ReplaceNodeModuleProceduralFunctionsRector +- **Search:** `node_type_get_names(` OR `node_get_type_label(` OR `node_mass_update(` +- **Modules found:** — + +### ReplaceNodeSetPreviewModeRector +- **Search:** `->setPreviewMode(` +- **Modules found:** — + +### ReplacePdoFetchConstantsRector +- **Search:** `PDO::FETCH_` +- **Modules found:** — + +### ReplaceRecipeRunnerInstallModuleRector +- **Search:** `RecipeRunner::installModule(` +- **Modules found:** — + +### ReplaceSessionManagerDeleteRector +- **Search:** `SessionManager` + `->delete(` +- **Modules found:** — + +### ReplaceSessionWritesWithRequestSessionRector +- **Search:** `$_SESSION[` +- **Modules found:** — + +### ReplaceSystemPerformanceGzipKeyRector +- **Search:** `css.gzip` OR `js.gzip` +- **Modules found:** — + +### ReplaceThemeGetSettingRector +- **Search:** `theme_get_setting(` OR `_system_default_theme_features(` +- **Modules found:** — + +### ReplaceUserSessionNamePropertyRector +- **Search:** `->name` on UserSession (hard to search uniquely) +- **Modules found:** — + +### ReplaceViewsProceduralFunctionsRector +- **Search:** `views_view_is_enabled(` OR `views_view_is_disabled(` OR `views_enable_view(` OR `views_disable_view(` OR `views_get_view_result(` +- **Modules found:** — + +### StatementPrefetchIteratorFetchColumnRector +- **Search:** `->fetchColumn(` +- **Modules found:** — + +### StripMigrationDependenciesExpandArgRector +- **Search:** `->getMigrationDependencies(` +- **Modules found:** — + +### UseEntityTypeHasIntegerIdRector +- **Search:** `->getEntityTypeIdKeyType(` OR `->entityTypeSupportsComments(` +- **Modules found:** — + +### ViewsPluginHandlerManagerRector +- **Search:** `Views::pluginManager(` OR `Views::handlerManager(` +- **Modules found:** — + +--- + +## Drupal 10 Rectors + +### ReplaceModuleHandlerGetNameRector +- **Search:** `->getName(` (on module handler — hard to search uniquely) +- **Modules found:** — + +### ReplaceRebuildThemeDataRector +- **Search:** `->rebuildThemeData(` +- **Modules found:** — + +### ReplaceRequestTimeConstantRector +- **Search:** `REQUEST_TIME` +- **Modules found:** — + +### SystemTimeZonesRector (Drupal10) +- **Search:** `system_time_zones(` +- **Modules found:** — diff --git a/docs/contrib-modules-d11.md b/docs/contrib-modules-d11.md new file mode 100644 index 000000000..5d42f1096 --- /dev/null +++ b/docs/contrib-modules-d11.md @@ -0,0 +1,751 @@ +# Contrib Modules Using Deprecated APIs (Drupal 11 Compatible) + +Found via Drupal GitLab code search (`group_id=2`), filtered to modules with +`core_version_requirement` supporting Drupal 11. + +**Rectors with D11 modules:** 44 +**Rectors with no contrib usage found:** 6 +**Total module entries:** 532 + +--- + +## By Rector + +### FileSystemBasenameToNativeRector + +- [ejectorseat](https://www.drupal.org/project/ejectorseat) + +### LoadAllIncludesRector + +- [config_track](https://www.drupal.org/project/config_track) +- [drupalmoduleupgrader](https://www.drupal.org/project/drupalmoduleupgrader) +- [graphapi](https://www.drupal.org/project/graphapi) +- [hux](https://www.drupal.org/project/hux) +- [migrate_boost](https://www.drupal.org/project/migrate_boost) +- [schemadotorg](https://www.drupal.org/project/schemadotorg) +- [update_worker](https://www.drupal.org/project/update_worker) + +### MigrateSqlGetMigrationPluginManagerRector + +- [feeds_migrate](https://www.drupal.org/project/feeds_migrate) +- [migmag](https://www.drupal.org/project/migmag) +- [smart_sql_idmap](https://www.drupal.org/project/smart_sql_idmap) + +### NodeStorageDeprecatedMethodsRector + +- [tb_megamenu](https://www.drupal.org/project/tb_megamenu) + +### PluginBaseIsConfigurableRector + +- [api](https://www.drupal.org/project/api) +- [autotagger](https://www.drupal.org/project/autotagger) +- [content_planner](https://www.drupal.org/project/content_planner) +- [geocoder](https://www.drupal.org/project/geocoder) +- [json_drop_api](https://www.drupal.org/project/json_drop_api) +- [localgov_elections](https://www.drupal.org/project/localgov_elections) +- [localgov_publications_importer](https://www.drupal.org/project/localgov_publications_importer) +- [localgov_publications_importer_copilot](https://www.drupal.org/project/localgov_publications_importer_copilot) +- [metatag](https://www.drupal.org/project/metatag) +- [oswald](https://www.drupal.org/project/oswald) +- [plugin_constructor_factory](https://www.drupal.org/project/plugin_constructor_factory) +- [search_api](https://www.drupal.org/project/search_api) +- [views_bulk_operations](https://www.drupal.org/project/views_bulk_operations) +- [xbbcode](https://www.drupal.org/project/xbbcode) + +### RemoveCacheExpireOverrideRector + +- [cmrf_core](https://www.drupal.org/project/cmrf_core) +- [cmrf_form_processor](https://www.drupal.org/project/cmrf_form_processor) +- [commercetools](https://www.drupal.org/project/commercetools) +- [feed_block](https://www.drupal.org/project/feed_block) +- [menu_parser_php](https://www.drupal.org/project/menu_parser_php) +- [spambot](https://www.drupal.org/project/spambot) +- [vcp4dates](https://www.drupal.org/project/vcp4dates) +- [wisski](https://www.drupal.org/project/wisski) + +### RemoveHandlerBaseDefineExtraOptionsRector + +- [views_dependent_filters](https://www.drupal.org/project/views_dependent_filters) + +### RemoveModuleHandlerAddModuleCallsRector + +- [acquia_contenthub](https://www.drupal.org/project/acquia_contenthub) +- [ai_vdb_provider_milvus](https://www.drupal.org/project/ai_vdb_provider_milvus) +- [ai_vdb_provider_pinecone](https://www.drupal.org/project/ai_vdb_provider_pinecone) +- [ai_watchdog_analyst](https://www.drupal.org/project/ai_watchdog_analyst) +- [component_entity](https://www.drupal.org/project/component_entity) +- [depcalc](https://www.drupal.org/project/depcalc) +- [fleetview_client](https://www.drupal.org/project/fleetview_client) +- [rift_recipe](https://www.drupal.org/project/rift_recipe) +- [sdx](https://www.drupal.org/project/sdx) +- [simplifying](https://www.drupal.org/project/simplifying) + +### RemoveModuleHandlerDeprecatedMethodsRector + +- [captcha](https://www.drupal.org/project/captcha) +- [jsonld](https://www.drupal.org/project/jsonld) + +### RemoveRootFromConvertDbUrlRector + +- [acsf](https://www.drupal.org/project/acsf) +- [civicrm_entity](https://www.drupal.org/project/civicrm_entity) +- [smart_migrate_cli](https://www.drupal.org/project/smart_migrate_cli) +- [sparql_entity_storage](https://www.drupal.org/project/sparql_entity_storage) + +### RemoveSetUriCallbackRector + +- [rabbit_hole_href](https://www.drupal.org/project/rabbit_hole_href) + +### RemoveStateCacheSettingRector + +- [bynder](https://www.drupal.org/project/bynder) +- [checklistapi](https://www.drupal.org/project/checklistapi) +- [chromeless](https://www.drupal.org/project/chromeless) +- [cloud](https://www.drupal.org/project/cloud) +- [community_tasks](https://www.drupal.org/project/community_tasks) +- [config_split](https://www.drupal.org/project/config_split) +- [deploy_key](https://www.drupal.org/project/deploy_key) +- [dns](https://www.drupal.org/project/dns) +- [engaging_networks](https://www.drupal.org/project/engaging_networks) +- [entity_usage_updater](https://www.drupal.org/project/entity_usage_updater) +- [eu_cookie_compliance_rocketship](https://www.drupal.org/project/eu_cookie_compliance_rocketship) +- [ffmpeg_media](https://www.drupal.org/project/ffmpeg_media) +- [granulartimecache](https://www.drupal.org/project/granulartimecache) +- [language_suggestion](https://www.drupal.org/project/language_suggestion) +- [mailchimp_transactional](https://www.drupal.org/project/mailchimp_transactional) +- [og](https://www.drupal.org/project/og) +- [open_vocabularies](https://www.drupal.org/project/open_vocabularies) +- [override_cache_control_headers](https://www.drupal.org/project/override_cache_control_headers) +- [pantheon_autopilot_toolbar](https://www.drupal.org/project/pantheon_autopilot_toolbar) +- [rail_ai_provider](https://www.drupal.org/project/rail_ai_provider) +- [salesforce](https://www.drupal.org/project/salesforce) +- [sdx](https://www.drupal.org/project/sdx) +- [search_api_postgresql](https://www.drupal.org/project/search_api_postgresql) +- [searchstax](https://www.drupal.org/project/searchstax) +- [social_auth_entra_id](https://www.drupal.org/project/social_auth_entra_id) +- [swagger_ui_formatter](https://www.drupal.org/project/swagger_ui_formatter) +- [trailless_menu](https://www.drupal.org/project/trailless_menu) +- [views_advanced_cache](https://www.drupal.org/project/views_advanced_cache) +- [vwo](https://www.drupal.org/project/vwo) +- [youtube_live_video](https://www.drupal.org/project/youtube_live_video) + +### RemoveTrustDataCallRector + +- [acquia_cms_headless](https://www.drupal.org/project/acquia_cms_headless) +- [acquia_starterkits](https://www.drupal.org/project/acquia_starterkits) +- [cms_core](https://www.drupal.org/project/cms_core) +- [commerce_square](https://www.drupal.org/project/commerce_square) +- [complete_webform_exporter](https://www.drupal.org/project/complete_webform_exporter) +- [config_plus](https://www.drupal.org/project/config_plus) +- [eca](https://www.drupal.org/project/eca) +- [eca_cm](https://www.drupal.org/project/eca_cm) +- [elasticsearch_helper](https://www.drupal.org/project/elasticsearch_helper) +- [entity_browser](https://www.drupal.org/project/entity_browser) +- [epm](https://www.drupal.org/project/epm) +- [flag](https://www.drupal.org/project/flag) +- [group](https://www.drupal.org/project/group) +- [gutenberg](https://www.drupal.org/project/gutenberg) +- [jsonapi](https://www.drupal.org/project/jsonapi) +- [monitoring](https://www.drupal.org/project/monitoring) +- [og](https://www.drupal.org/project/og) +- [output_format_api](https://www.drupal.org/project/output_format_api) +- [parameters](https://www.drupal.org/project/parameters) +- [pluggable_entity_view_builder](https://www.drupal.org/project/pluggable_entity_view_builder) +- [preview_site](https://www.drupal.org/project/preview_site) +- [redirect](https://www.drupal.org/project/redirect) +- [scheduled_publish](https://www.drupal.org/project/scheduled_publish) +- [simplenews](https://www.drupal.org/project/simplenews) +- [slots](https://www.drupal.org/project/slots) +- [smart_title](https://www.drupal.org/project/smart_title) +- [storage](https://www.drupal.org/project/storage) +- [theming_tools](https://www.drupal.org/project/theming_tools) +- [userprotect](https://www.drupal.org/project/userprotect) +- [varbase_workflow](https://www.drupal.org/project/varbase_workflow) +- [views_dependent_filters](https://www.drupal.org/project/views_dependent_filters) +- [workbench_email](https://www.drupal.org/project/workbench_email) +- [workbench_moderation_actions](https://www.drupal.org/project/workbench_moderation_actions) + +### RemoveTwigNodeTransTagArgumentRector + +- [canvas](https://www.drupal.org/project/canvas) +- [entity_import](https://www.drupal.org/project/entity_import) +- [experience_builder](https://www.drupal.org/project/experience_builder) +- [search_api](https://www.drupal.org/project/search_api) +- [search_api_autocomplete](https://www.drupal.org/project/search_api_autocomplete) +- [search_api_saved_searches](https://www.drupal.org/project/search_api_saved_searches) +- [searchstax](https://www.drupal.org/project/searchstax) +- [tranc](https://www.drupal.org/project/tranc) + +### RemoveUpdaterPostInstallMethodsRector + +- [ginvite](https://www.drupal.org/project/ginvite) +- [gnode_request](https://www.drupal.org/project/gnode_request) +- [group](https://www.drupal.org/project/group) + +### RemoveViewsRowCacheKeysRector + +- [metatag](https://www.drupal.org/project/metatag) +- [views_advanced_cache](https://www.drupal.org/project/views_advanced_cache) + +### ReplaceAlphadecimalToIntNullRector + +- [comment_mover](https://www.drupal.org/project/comment_mover) +- [indieweb](https://www.drupal.org/project/indieweb) + +### ReplaceCommentManagerGetCountNewCommentsRector + +- [forum](https://www.drupal.org/project/forum) +- [history](https://www.drupal.org/project/history) + +### ReplaceCommentUriRector + +- [gadget](https://www.drupal.org/project/gadget) +- [social](https://www.drupal.org/project/social) + +### ReplaceDateTimeRangeConstantsRector + +- [deprecation_status](https://www.drupal.org/project/deprecation_status) + +### ReplaceEditorLoadRector + +- [acquia_contenthub](https://www.drupal.org/project/acquia_contenthub) +- [acquia_dam](https://www.drupal.org/project/acquia_dam) +- [address_suggestion](https://www.drupal.org/project/address_suggestion) +- [ai_agents_experimental_collection](https://www.drupal.org/project/ai_agents_experimental_collection) +- [ai_ckeditor_extras](https://www.drupal.org/project/ai_ckeditor_extras) +- [ai_editoria11y](https://www.drupal.org/project/ai_editoria11y) +- [ckeditor5_deepl](https://www.drupal.org/project/ckeditor5_deepl) +- [ckeditor5_mentions](https://www.drupal.org/project/ckeditor5_mentions) +- [ckeditor5_plugin_pack](https://www.drupal.org/project/ckeditor5_plugin_pack) +- [ckeditor5_premium_features](https://www.drupal.org/project/ckeditor5_premium_features) +- [ckeditor5_spoiler](https://www.drupal.org/project/ckeditor5_spoiler) +- [ckeditor_braille](https://www.drupal.org/project/ckeditor_braille) +- [ckeditor_codemirror](https://www.drupal.org/project/ckeditor_codemirror) +- [ckeditor_historylog](https://www.drupal.org/project/ckeditor_historylog) +- [ckeditor_lts](https://www.drupal.org/project/ckeditor_lts) +- [ckeditor_mentions](https://www.drupal.org/project/ckeditor_mentions) +- [custom_paragraphs](https://www.drupal.org/project/custom_paragraphs) +- [deepseek](https://www.drupal.org/project/deepseek) +- [depcalc](https://www.drupal.org/project/depcalc) +- [dsfr4drupal_picker](https://www.drupal.org/project/dsfr4drupal_picker) +- [edit_plus](https://www.drupal.org/project/edit_plus) +- [editor_advanced_image](https://www.drupal.org/project/editor_advanced_image) +- [editor_advanced_link](https://www.drupal.org/project/editor_advanced_link) +- [editor_advanced_table](https://www.drupal.org/project/editor_advanced_table) +- [entity_embed](https://www.drupal.org/project/entity_embed) +- [flmngr](https://www.drupal.org/project/flmngr) +- [flo](https://www.drupal.org/project/flo) +- [inline_formatter_field](https://www.drupal.org/project/inline_formatter_field) +- [markdown](https://www.drupal.org/project/markdown) +- [media_folders](https://www.drupal.org/project/media_folders) +- [module_file_editor](https://www.drupal.org/project/module_file_editor) +- [openfed](https://www.drupal.org/project/openfed) +- [quickedit](https://www.drupal.org/project/quickedit) +- [smartlinker_ai](https://www.drupal.org/project/smartlinker_ai) +- [synimage](https://www.drupal.org/project/synimage) +- [theme_file_editor](https://www.drupal.org/project/theme_file_editor) +- [toast_image_editor](https://www.drupal.org/project/toast_image_editor) +- [token_browser_plus](https://www.drupal.org/project/token_browser_plus) +- [txt42](https://www.drupal.org/project/txt42) +- [url_embed](https://www.drupal.org/project/url_embed) +- [video_embed_field](https://www.drupal.org/project/video_embed_field) +- [video_filter](https://www.drupal.org/project/video_filter) +- [visual_editor](https://www.drupal.org/project/visual_editor) +- [wxt](https://www.drupal.org/project/wxt) + +### ReplaceEntityOriginalPropertyRector + +- [a12s_maps_sync](https://www.drupal.org/project/a12s_maps_sync) +- [activitypub](https://www.drupal.org/project/activitypub) +- [child_entity](https://www.drupal.org/project/child_entity) +- [ckeditor_mentions](https://www.drupal.org/project/ckeditor_mentions) +- [conflict](https://www.drupal.org/project/conflict) +- [content_synchronizer](https://www.drupal.org/project/content_synchronizer) +- [custom_elements](https://www.drupal.org/project/custom_elements) +- [drd](https://www.drupal.org/project/drd) +- [edit_plus](https://www.drupal.org/project/edit_plus) +- [entity_embed](https://www.drupal.org/project/entity_embed) +- [entity_io](https://www.drupal.org/project/entity_io) +- [entity_reference_manager](https://www.drupal.org/project/entity_reference_manager) +- [entity_value_inheritance](https://www.drupal.org/project/entity_value_inheritance) +- [entity_webhook](https://www.drupal.org/project/entity_webhook) +- [experience_builder](https://www.drupal.org/project/experience_builder) +- [external_entity](https://www.drupal.org/project/external_entity) +- [gotem_content_moderation](https://www.drupal.org/project/gotem_content_moderation) +- [languagewire_translation_provider](https://www.drupal.org/project/languagewire_translation_provider) +- [media_acquiadam](https://www.drupal.org/project/media_acquiadam) +- [navigation_plus](https://www.drupal.org/project/navigation_plus) +- [nofraud](https://www.drupal.org/project/nofraud) +- [orange_dam](https://www.drupal.org/project/orange_dam) +- [paragraph_view_mode](https://www.drupal.org/project/paragraph_view_mode) +- [phpedu_profile](https://www.drupal.org/project/phpedu_profile) +- [ptools](https://www.drupal.org/project/ptools) +- [reader](https://www.drupal.org/project/reader) +- [simplenews_stats](https://www.drupal.org/project/simplenews_stats) +- [standalone](https://www.drupal.org/project/standalone) +- [typed_entity](https://www.drupal.org/project/typed_entity) +- [variants](https://www.drupal.org/project/variants) + +### ReplaceEntityReferenceRecursiveLimitRector + +- [custom_field](https://www.drupal.org/project/custom_field) +- [datafield](https://www.drupal.org/project/datafield) +- [dynamic_entity_reference](https://www.drupal.org/project/dynamic_entity_reference) +- [entity_embed](https://www.drupal.org/project/entity_embed) +- [entity_list](https://www.drupal.org/project/entity_list) +- [entity_overlay](https://www.drupal.org/project/entity_overlay) +- [entity_reference_ajax_formatter](https://www.drupal.org/project/entity_reference_ajax_formatter) +- [external_entity](https://www.drupal.org/project/external_entity) +- [gutenberg](https://www.drupal.org/project/gutenberg) +- [layout_builder_formatter](https://www.drupal.org/project/layout_builder_formatter) +- [link_field_display_mode_formatter](https://www.drupal.org/project/link_field_display_mode_formatter) +- [nested_entity_reference_formatter](https://www.drupal.org/project/nested_entity_reference_formatter) +- [paragraphs_summary](https://www.drupal.org/project/paragraphs_summary) +- [published_referenced_entity](https://www.drupal.org/project/published_referenced_entity) +- [rendered_entity_list_formatter](https://www.drupal.org/project/rendered_entity_list_formatter) +- [rendred_entity_list_formatter](https://www.drupal.org/project/rendred_entity_list_formatter) +- [rocketship_core](https://www.drupal.org/project/rocketship_core) +- [seb](https://www.drupal.org/project/seb) +- [tripal](https://www.drupal.org/project/tripal) +- [view_mode_crop](https://www.drupal.org/project/view_mode_crop) + +### ReplaceFieldgroupToFieldsetRector + +- [field_group](https://www.drupal.org/project/field_group) +- [field_group_vertical_tabs](https://www.drupal.org/project/field_group_vertical_tabs) +- [sports_league](https://www.drupal.org/project/sports_league) +- [ui_patterns_settings](https://www.drupal.org/project/ui_patterns_settings) + +### ReplaceFileGetContentHeadersRector + +- [cforge](https://www.drupal.org/project/cforge) +- [commerce_invoice](https://www.drupal.org/project/commerce_invoice) +- [commerce_purchase_order](https://www.drupal.org/project/commerce_purchase_order) +- [download_file](https://www.drupal.org/project/download_file) +- [dxpr_builder](https://www.drupal.org/project/dxpr_builder) +- [feeds](https://www.drupal.org/project/feeds) +- [file_entity](https://www.drupal.org/project/file_entity) +- [file_visibility](https://www.drupal.org/project/file_visibility) +- [git_wiki_help](https://www.drupal.org/project/git_wiki_help) +- [media_icon_deliver](https://www.drupal.org/project/media_icon_deliver) +- [protected_file](https://www.drupal.org/project/protected_file) +- [tmgmt](https://www.drupal.org/project/tmgmt) +- [unpublished_file](https://www.drupal.org/project/unpublished_file) + +### ReplaceModuleHandlerGetNameRector + +- [ai_upgrade_assistant](https://www.drupal.org/project/ai_upgrade_assistant) +- [autosave_form](https://www.drupal.org/project/autosave_form) +- [basket](https://www.drupal.org/project/basket) +- [bibliocommons](https://www.drupal.org/project/bibliocommons) +- [client_config_care](https://www.drupal.org/project/client_config_care) +- [confi](https://www.drupal.org/project/confi) +- [contacts](https://www.drupal.org/project/contacts) +- [date_augmenter](https://www.drupal.org/project/date_augmenter) +- [drd](https://www.drupal.org/project/drd) +- [image_moderate](https://www.drupal.org/project/image_moderate) +- [islandora](https://www.drupal.org/project/islandora) +- [languagefield](https://www.drupal.org/project/languagefield) +- [licenses](https://www.drupal.org/project/licenses) +- [localist_drupal](https://www.drupal.org/project/localist_drupal) +- [migrate_visualize](https://www.drupal.org/project/migrate_visualize) +- [mutual_credit](https://www.drupal.org/project/mutual_credit) +- [nitropack](https://www.drupal.org/project/nitropack) +- [nodeinfo](https://www.drupal.org/project/nodeinfo) +- [nostr_id_nip05](https://www.drupal.org/project/nostr_id_nip05) +- [onlyone](https://www.drupal.org/project/onlyone) +- [orchestration](https://www.drupal.org/project/orchestration) +- [pager_serializer](https://www.drupal.org/project/pager_serializer) +- [pwbi](https://www.drupal.org/project/pwbi) +- [reassign_user_content](https://www.drupal.org/project/reassign_user_content) +- [schema_form](https://www.drupal.org/project/schema_form) +- [simplifying](https://www.drupal.org/project/simplifying) +- [test_helpers](https://www.drupal.org/project/test_helpers) +- [tripal](https://www.drupal.org/project/tripal) +- [worldmap](https://www.drupal.org/project/worldmap) +- [ws_event](https://www.drupal.org/project/ws_event) + +### ReplaceNodeAccessViewAllNodesRector + +- [view_usernames_node_author](https://www.drupal.org/project/view_usernames_node_author) + +### ReplaceNodeAddBodyFieldRector + +- [ai_eca](https://www.drupal.org/project/ai_eca) +- [feedstextareafetcher](https://www.drupal.org/project/feedstextareafetcher) +- [rdf_sync](https://www.drupal.org/project/rdf_sync) +- [sva](https://www.drupal.org/project/sva) +- [tome](https://www.drupal.org/project/tome) + +### ReplaceNodeModuleProceduralFunctionsRector + +- [addanother](https://www.drupal.org/project/addanother) +- [collection](https://www.drupal.org/project/collection) +- [content_dependency_graph](https://www.drupal.org/project/content_dependency_graph) +- [copyscape](https://www.drupal.org/project/copyscape) +- [custom_search](https://www.drupal.org/project/custom_search) +- [ds](https://www.drupal.org/project/ds) +- [duplicate_node](https://www.drupal.org/project/duplicate_node) +- [edit_content_type_tab](https://www.drupal.org/project/edit_content_type_tab) +- [entity_reference_edit_link](https://www.drupal.org/project/entity_reference_edit_link) +- [entity_translation_unified_form](https://www.drupal.org/project/entity_translation_unified_form) +- [find_text](https://www.drupal.org/project/find_text) +- [html_title](https://www.drupal.org/project/html_title) +- [link_description_attributes](https://www.drupal.org/project/link_description_attributes) +- [micronode_block](https://www.drupal.org/project/micronode_block) +- [node_singles](https://www.drupal.org/project/node_singles) +- [page_menu_reorder](https://www.drupal.org/project/page_menu_reorder) +- [quick_node_clone](https://www.drupal.org/project/quick_node_clone) +- [read_time](https://www.drupal.org/project/read_time) +- [reassign_user_content](https://www.drupal.org/project/reassign_user_content) +- [rsvp_list](https://www.drupal.org/project/rsvp_list) +- [rsvplist](https://www.drupal.org/project/rsvplist) +- [secure_nodes](https://www.drupal.org/project/secure_nodes) +- [social](https://www.drupal.org/project/social) +- [token](https://www.drupal.org/project/token) + +### ReplaceNodeSetPreviewModeRector + +- [ai_agents](https://www.drupal.org/project/ai_agents) +- [ai_agents_experimental_collection](https://www.drupal.org/project/ai_agents_experimental_collection) +- [metadata_hex](https://www.drupal.org/project/metadata_hex) +- [node_type_defaults](https://www.drupal.org/project/node_type_defaults) +- [responsive_preview](https://www.drupal.org/project/responsive_preview) +- [sdx_drast](https://www.drupal.org/project/sdx_drast) +- [sdx_engine](https://www.drupal.org/project/sdx_engine) + +### ReplacePdoFetchConstantsRector + +- [acquia_contenthub](https://www.drupal.org/project/acquia_contenthub) +- [ai_schemadotorg_jsonld](https://www.drupal.org/project/ai_schemadotorg_jsonld) +- [arch](https://www.drupal.org/project/arch) +- [babel](https://www.drupal.org/project/babel) +- [book_library_api](https://www.drupal.org/project/book_library_api) +- [commerce_store_override](https://www.drupal.org/project/commerce_store_override) +- [conreg](https://www.drupal.org/project/conreg) +- [gdpr](https://www.drupal.org/project/gdpr) +- [graphql_shield](https://www.drupal.org/project/graphql_shield) +- [hubspot](https://www.drupal.org/project/hubspot) +- [junk_drawer](https://www.drupal.org/project/junk_drawer) +- [livre](https://www.drupal.org/project/livre) +- [mail_box_management](https://www.drupal.org/project/mail_box_management) +- [sgd_user_status](https://www.drupal.org/project/sgd_user_status) +- [sgd_watchdog_summary](https://www.drupal.org/project/sgd_watchdog_summary) +- [smileys_field](https://www.drupal.org/project/smileys_field) +- [social_auth_buttons](https://www.drupal.org/project/social_auth_buttons) +- [tmgmt_smartcat](https://www.drupal.org/project/tmgmt_smartcat) +- [track_usage](https://www.drupal.org/project/track_usage) + +### ReplaceRebuildThemeDataRector + +- [ai_components](https://www.drupal.org/project/ai_components) +- [dropsolid_rocketship_profile](https://www.drupal.org/project/dropsolid_rocketship_profile) +- [edw_healthcheck](https://www.drupal.org/project/edw_healthcheck) +- [gesso](https://www.drupal.org/project/gesso) +- [guswds](https://www.drupal.org/project/guswds) +- [l10n_update_bundled](https://www.drupal.org/project/l10n_update_bundled) +- [libraries_ui](https://www.drupal.org/project/libraries_ui) +- [mercury_editor](https://www.drupal.org/project/mercury_editor) +- [openy](https://www.drupal.org/project/openy) +- [site_guardian](https://www.drupal.org/project/site_guardian) +- [theme_file_editor](https://www.drupal.org/project/theme_file_editor) +- [theme_per_user](https://www.drupal.org/project/theme_per_user) + +### ReplaceRecipeRunnerInstallModuleRector + +- [schemadotorg](https://www.drupal.org/project/schemadotorg) + +### ReplaceRequestTimeConstantRector + +- [automatic_updates](https://www.drupal.org/project/automatic_updates) +- [computed_field](https://www.drupal.org/project/computed_field) +- [google_analytics_counter](https://www.drupal.org/project/google_analytics_counter) + +### ReplaceSessionManagerDeleteRector + +- [activity](https://www.drupal.org/project/activity) +- [anonymoussession](https://www.drupal.org/project/anonymoussession) +- [brightcove](https://www.drupal.org/project/brightcove) +- [bulk_copy_fields](https://www.drupal.org/project/bulk_copy_fields) +- [bulk_update_fields](https://www.drupal.org/project/bulk_update_fields) +- [change_author_action](https://www.drupal.org/project/change_author_action) +- [cookie_samesite_support](https://www.drupal.org/project/cookie_samesite_support) +- [devel](https://www.drupal.org/project/devel) +- [drupal_saml_bridge](https://www.drupal.org/project/drupal_saml_bridge) +- [entity_visibility_preview](https://www.drupal.org/project/entity_visibility_preview) +- [externalauth_force](https://www.drupal.org/project/externalauth_force) +- [facebook_pixel](https://www.drupal.org/project/facebook_pixel) +- [kamihaya_cms](https://www.drupal.org/project/kamihaya_cms) +- [loginnotification](https://www.drupal.org/project/loginnotification) +- [node_export](https://www.drupal.org/project/node_export) +- [oidc](https://www.drupal.org/project/oidc) +- [oidc_mcpf](https://www.drupal.org/project/oidc_mcpf) +- [page_hits](https://www.drupal.org/project/page_hits) +- [quicker_login](https://www.drupal.org/project/quicker_login) +- [recently_read](https://www.drupal.org/project/recently_read) +- [restrict_by_ip](https://www.drupal.org/project/restrict_by_ip) +- [rules](https://www.drupal.org/project/rules) +- [session_inspector](https://www.drupal.org/project/session_inspector) +- [session_management](https://www.drupal.org/project/session_management) +- [simpleavs](https://www.drupal.org/project/simpleavs) +- [stenographer](https://www.drupal.org/project/stenographer) +- [user_logout](https://www.drupal.org/project/user_logout) + +### ReplaceSessionWritesWithRequestSessionRector + +- [drd](https://www.drupal.org/project/drd) +- [entity_visibility_preview](https://www.drupal.org/project/entity_visibility_preview) +- [intercept](https://www.drupal.org/project/intercept) +- [session_entity](https://www.drupal.org/project/session_entity) +- [simplesamlphp_sp](https://www.drupal.org/project/simplesamlphp_sp) +- [telega](https://www.drupal.org/project/telega) +- [views_extras](https://www.drupal.org/project/views_extras) + +### ReplaceSystemPerformanceGzipKeyRector + +- [ai_agents_experimental_collection](https://www.drupal.org/project/ai_agents_experimental_collection) +- [audit](https://www.drupal.org/project/audit) +- [background_image](https://www.drupal.org/project/background_image) +- [bootstrap4](https://www.drupal.org/project/bootstrap4) +- [bootstrap5](https://www.drupal.org/project/bootstrap5) +- [drd](https://www.drupal.org/project/drd) +- [settingsphp](https://www.drupal.org/project/settingsphp) +- [tone](https://www.drupal.org/project/tone) + +### ReplaceThemeGetSettingRector + +- [bootstrap3](https://www.drupal.org/project/bootstrap3) +- [bootstrap_italia](https://www.drupal.org/project/bootstrap_italia) +- [diba_clean](https://www.drupal.org/project/diba_clean) +- [dsfr](https://www.drupal.org/project/dsfr) +- [dxpr_theme](https://www.drupal.org/project/dxpr_theme) +- [edux](https://www.drupal.org/project/edux) +- [kamihaya_cms](https://www.drupal.org/project/kamihaya_cms) +- [kart](https://www.drupal.org/project/kart) +- [mahi](https://www.drupal.org/project/mahi) +- [marvelous](https://www.drupal.org/project/marvelous) +- [mili](https://www.drupal.org/project/mili) +- [nava](https://www.drupal.org/project/nava) +- [pets_clinic](https://www.drupal.org/project/pets_clinic) +- [ruhi](https://www.drupal.org/project/ruhi) +- [saar](https://www.drupal.org/project/saar) +- [tara](https://www.drupal.org/project/tara) +- [uni](https://www.drupal.org/project/uni) +- [vani](https://www.drupal.org/project/vani) +- [xara](https://www.drupal.org/project/xara) +- [zuvi](https://www.drupal.org/project/zuvi) + +### ReplaceUserSessionNamePropertyRector + +- [acquia_contenthub](https://www.drupal.org/project/acquia_contenthub) +- [acquia_vwo](https://www.drupal.org/project/acquia_vwo) +- [apigee_m10n](https://www.drupal.org/project/apigee_m10n) +- [clu](https://www.drupal.org/project/clu) +- [drupal_content_repository](https://www.drupal.org/project/drupal_content_repository) +- [drupalfit](https://www.drupal.org/project/drupalfit) +- [entity_mesh](https://www.drupal.org/project/entity_mesh) +- [miniorange_oauth_client](https://www.drupal.org/project/miniorange_oauth_client) +- [monitoring](https://www.drupal.org/project/monitoring) +- [riddler](https://www.drupal.org/project/riddler) +- [role_inheritance](https://www.drupal.org/project/role_inheritance) +- [search_api_exclude_lb](https://www.drupal.org/project/search_api_exclude_lb) +- [session_inspector](https://www.drupal.org/project/session_inspector) +- [session_management](https://www.drupal.org/project/session_management) +- [synonyms](https://www.drupal.org/project/synonyms) + +### ReplaceViewsProceduralFunctionsRector + +- [abinbev_gmap](https://www.drupal.org/project/abinbev_gmap) +- [api](https://www.drupal.org/project/api) +- [custom_field](https://www.drupal.org/project/custom_field) +- [knowledge](https://www.drupal.org/project/knowledge) +- [next_views_entity_reference](https://www.drupal.org/project/next_views_entity_reference) +- [quicktabs](https://www.drupal.org/project/quicktabs) +- [simple_sitemap](https://www.drupal.org/project/simple_sitemap) +- [simple_sitemap_authenticated](https://www.drupal.org/project/simple_sitemap_authenticated) +- [social](https://www.drupal.org/project/social) +- [sshop](https://www.drupal.org/project/sshop) +- [twig_tweak](https://www.drupal.org/project/twig_tweak) +- [viewfield](https://www.drupal.org/project/viewfield) + +### StripMigrationDependenciesExpandArgRector + +- [crm_migrate_node](https://www.drupal.org/project/crm_migrate_node) +- [entity_import](https://www.drupal.org/project/entity_import) +- [geolocation](https://www.drupal.org/project/geolocation) +- [migrate_from_services](https://www.drupal.org/project/migrate_from_services) +- [migrate_plus](https://www.drupal.org/project/migrate_plus) +- [migrate_plus_ui](https://www.drupal.org/project/migrate_plus_ui) +- [migrate_queue_importer](https://www.drupal.org/project/migrate_queue_importer) +- [migrate_tools](https://www.drupal.org/project/migrate_tools) +- [paragraphs](https://www.drupal.org/project/paragraphs) +- [smart_migrate_cli](https://www.drupal.org/project/smart_migrate_cli) +- [wordpress_migrate](https://www.drupal.org/project/wordpress_migrate) + +### SystemTimeZonesRector + +- [crema](https://www.drupal.org/project/crema) +- [daterange_simplify](https://www.drupal.org/project/daterange_simplify) +- [intl_date](https://www.drupal.org/project/intl_date) +- [mtc](https://www.drupal.org/project/mtc) +- [openfed](https://www.drupal.org/project/openfed) +- [openid_connect](https://www.drupal.org/project/openid_connect) +- [salesforce_push_queue_ui](https://www.drupal.org/project/salesforce_push_queue_ui) +- [smart_date](https://www.drupal.org/project/smart_date) +- [time_clock](https://www.drupal.org/project/time_clock) +- [tzfield](https://www.drupal.org/project/tzfield) + +### UseEntityTypeHasIntegerIdRector + +- [apigee_m10n](https://www.drupal.org/project/apigee_m10n) +- [association](https://www.drupal.org/project/association) +- [commerce_eta](https://www.drupal.org/project/commerce_eta) +- [commerce_invoice](https://www.drupal.org/project/commerce_invoice) +- [display_builder](https://www.drupal.org/project/display_builder) +- [easy_email](https://www.drupal.org/project/easy_email) +- [entity](https://www.drupal.org/project/entity) +- [homebox](https://www.drupal.org/project/homebox) +- [intercept](https://www.drupal.org/project/intercept) +- [localgov_alert_banner](https://www.drupal.org/project/localgov_alert_banner) +- [paragraphs_edit](https://www.drupal.org/project/paragraphs_edit) +- [role_request](https://www.drupal.org/project/role_request) +- [workbench_moderation](https://www.drupal.org/project/workbench_moderation) +- [workflow_participants](https://www.drupal.org/project/workflow_participants) + +### ViewsPluginHandlerManagerRector + +- [a12s_locations](https://www.drupal.org/project/a12s_locations) +- [acquia_dam](https://www.drupal.org/project/acquia_dam) +- [ai_agents](https://www.drupal.org/project/ai_agents) +- [api](https://www.drupal.org/project/api) +- [basket](https://www.drupal.org/project/basket) +- [bat](https://www.drupal.org/project/bat) +- [calendar](https://www.drupal.org/project/calendar) +- [civicrm_entity](https://www.drupal.org/project/civicrm_entity) +- [cloud](https://www.drupal.org/project/cloud) +- [cms_content_sync](https://www.drupal.org/project/cms_content_sync) +- [config_pages](https://www.drupal.org/project/config_pages) +- [consent_management](https://www.drupal.org/project/consent_management) +- [diboo_core](https://www.drupal.org/project/diboo_core) +- [entity_hierarchy](https://www.drupal.org/project/entity_hierarchy) +- [entity_reference_uuid](https://www.drupal.org/project/entity_reference_uuid) +- [entityqueue](https://www.drupal.org/project/entityqueue) +- [expirable_content](https://www.drupal.org/project/expirable_content) +- [friendship](https://www.drupal.org/project/friendship) +- [geolocation](https://www.drupal.org/project/geolocation) +- [ggroup](https://www.drupal.org/project/ggroup) +- [grant](https://www.drupal.org/project/grant) +- [group](https://www.drupal.org/project/group) +- [group_domain](https://www.drupal.org/project/group_domain) +- [islandora](https://www.drupal.org/project/islandora) +- [itunes_rss](https://www.drupal.org/project/itunes_rss) +- [lms](https://www.drupal.org/project/lms) +- [mdp](https://www.drupal.org/project/mdp) +- [media_filter](https://www.drupal.org/project/media_filter) +- [media_views_filter](https://www.drupal.org/project/media_views_filter) +- [meta_entity](https://www.drupal.org/project/meta_entity) +- [metatag](https://www.drupal.org/project/metatag) +- [moderation_team](https://www.drupal.org/project/moderation_team) +- [multilingual_plus](https://www.drupal.org/project/multilingual_plus) +- [muser](https://www.drupal.org/project/muser) +- [nodehive_core](https://www.drupal.org/project/nodehive_core) +- [og](https://www.drupal.org/project/og) +- [past](https://www.drupal.org/project/past) +- [plugin](https://www.drupal.org/project/plugin) +- [private_message](https://www.drupal.org/project/private_message) +- [search_api](https://www.drupal.org/project/search_api) +- [searchstax](https://www.drupal.org/project/searchstax) +- [social](https://www.drupal.org/project/social) +- [tally](https://www.drupal.org/project/tally) +- [taxonomy_parents_index](https://www.drupal.org/project/taxonomy_parents_index) +- [thunder](https://www.drupal.org/project/thunder) +- [tmgmt](https://www.drupal.org/project/tmgmt) +- [tmgmt_deepl](https://www.drupal.org/project/tmgmt_deepl) +- [translation_views](https://www.drupal.org/project/translation_views) +- [trash](https://www.drupal.org/project/trash) +- [unused_media_filter](https://www.drupal.org/project/unused_media_filter) +- [usage_data](https://www.drupal.org/project/usage_data) +- [views_entity_embed](https://www.drupal.org/project/views_entity_embed) +- [views_exclude_previous](https://www.drupal.org/project/views_exclude_previous) +- [views_linkarea](https://www.drupal.org/project/views_linkarea) +- [views_migration](https://www.drupal.org/project/views_migration) +- [views_moderation_state_weights](https://www.drupal.org/project/views_moderation_state_weights) +- [views_natural_sort](https://www.drupal.org/project/views_natural_sort) +- [views_override_viewmode](https://www.drupal.org/project/views_override_viewmode) +- [views_selective_filters](https://www.drupal.org/project/views_selective_filters) +- [workbench_moderation](https://www.drupal.org/project/workbench_moderation) + +### Rectors with no D11 contrib module found + +These had zero search hits across all search terms: + +- `ErrorCurrentErrorHandlerRector` +- `RemoveAutomatedCronSubmitHandlerRector` +- `RemoveLinkWidgetValidateTitleElementRector` +- `RenameStopProceduralHookScanRector` +- `ReplaceLocaleConfigBatchFunctionsRector` +- `StatementPrefetchIteratorFetchColumnRector` + +--- + +## By Module — covering 3+ rectors + +Modules that are good candidates for testing multiple rectors at once: + +### [social](https://www.drupal.org/project/social) — 4 rectors +- ReplaceCommentUriRector +- ReplaceNodeModuleProceduralFunctionsRector +- ReplaceViewsProceduralFunctionsRector +- ViewsPluginHandlerManagerRector + +### [acquia_contenthub](https://www.drupal.org/project/acquia_contenthub) — 4 rectors +- RemoveModuleHandlerAddModuleCallsRector +- ReplaceEditorLoadRector +- ReplacePdoFetchConstantsRector +- ReplaceUserSessionNamePropertyRector + +### [drd](https://www.drupal.org/project/drd) — 4 rectors +- ReplaceEntityOriginalPropertyRector +- ReplaceModuleHandlerGetNameRector +- ReplaceSessionWritesWithRequestSessionRector +- ReplaceSystemPerformanceGzipKeyRector + +### [og](https://www.drupal.org/project/og) — 3 rectors +- RemoveStateCacheSettingRector +- RemoveTrustDataCallRector +- ViewsPluginHandlerManagerRector + +### [searchstax](https://www.drupal.org/project/searchstax) — 3 rectors +- RemoveStateCacheSettingRector +- RemoveTwigNodeTransTagArgumentRector +- ViewsPluginHandlerManagerRector + +### [search_api](https://www.drupal.org/project/search_api) — 3 rectors +- PluginBaseIsConfigurableRector +- RemoveTwigNodeTransTagArgumentRector +- ViewsPluginHandlerManagerRector + +### [group](https://www.drupal.org/project/group) — 3 rectors +- RemoveTrustDataCallRector +- RemoveUpdaterPostInstallMethodsRector +- ViewsPluginHandlerManagerRector + +### [metatag](https://www.drupal.org/project/metatag) — 3 rectors +- PluginBaseIsConfigurableRector +- RemoveViewsRowCacheKeysRector +- ViewsPluginHandlerManagerRector + +### [ai_agents_experimental_collection](https://www.drupal.org/project/ai_agents_experimental_collection) — 3 rectors +- ReplaceEditorLoadRector +- ReplaceNodeSetPreviewModeRector +- ReplaceSystemPerformanceGzipKeyRector + +### [entity_embed](https://www.drupal.org/project/entity_embed) — 3 rectors +- ReplaceEditorLoadRector +- ReplaceEntityOriginalPropertyRector +- ReplaceEntityReferenceRecursiveLimitRector + +### [api](https://www.drupal.org/project/api) — 3 rectors +- PluginBaseIsConfigurableRector +- ReplaceViewsProceduralFunctionsRector +- ViewsPluginHandlerManagerRector diff --git a/docs/digest-comparison-report-0505.md b/docs/digest-comparison-report-0505.md new file mode 100644 index 000000000..8e1142793 --- /dev/null +++ b/docs/digest-comparison-report-0505.md @@ -0,0 +1,576 @@ +# Drupal Digest → Drupal Rector Comparison Report (drupal-digest-0503) + +Compares each rector added in branch `feature/digest-rectors` against its source in +[drupal-digest-0503](https://github.com/dbuytaert/drupal-digests) (refreshed May 2025). + +**Total rectors compared:** 50 +**Significant changes:** 21 +**Minimal changes:** 28 +**Split from one digest file:** 1 pair (`RemoveTrustDataCallRector` + `RemoveConfigSaveTrustedDataArgRector`) + +--- + +## Overview Table + +> Paths are relative to each repo root. Digest paths are relative to `drupal-digest-0503/`. +> `†` = rector `@see` issue number differs from the digest filename — see [Notes](#notes-on-digest-file-mapping). + +| Rector | Ver | Changes | Issue | Digest source | Rector destination | +|---|---|---|---|---|---| +| `ReplaceModuleHandlerGetNameRector` | D10 | Minimal | [#3571063](https://www.drupal.org/node/3571063) | `rector/rules/replace-removed-modulehandlerinterface-getname-with-3571063.php` | `src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector.php` | +| `ReplaceRebuildThemeDataRector` | D10 | Minimal | [#3571068](https://www.drupal.org/node/3571068) | `rector/rules/replace-removed-themehandlerinterface-rebuildthemedata-with-3571068.php` | `src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector.php` | +| `ReplaceRequestTimeConstantRector` | D10 | **Significant** | [#3395986](https://www.drupal.org/node/3395986) | `rector/rules/add-timeinterface-time-argument-to-plugin-constructor-3395986.php` | `src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector.php` | +| `ErrorCurrentErrorHandlerRector` | D11 | Minimal | [#3526515](https://www.drupal.org/node/3526515) | `rector/rules/replace-error-currenterrorhandler-with-get-error-handler-3526515.php` | `src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector.php` | +| `FileSystemBasenameToNativeRector` | D11 | Minimal | [#3530461](https://www.drupal.org/node/3530461) | `rector/rules/replace-filesysteminterface-basename-with-native-basename-3530461.php` | `src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector.php` | +| `LoadAllIncludesRector` | D11 | Minimal | [#3536431](https://www.drupal.org/node/3536431) | `rector/rules/replace-deprecated-modulehandler-loadallincludes-with-3536431.php` | `src/Drupal11/Rector/Deprecation/LoadAllIncludesRector.php` | +| `MigrateSqlGetMigrationPluginManagerRector` | D11 | Minimal | [#3439369](https://www.drupal.org/node/3439369) | `rector/rules/replace-deprecated-sql-getmigrationpluginmanager-with-3439369.php` | `src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector.php` | +| `NodeStorageDeprecatedMethodsRector` | D11 | **Significant** | [#3396062](https://www.drupal.org/node/3396062) | `rector/rules/replace-deprecated-nodestorage-revisionids-and-3396062.php` | `src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector.php` | +| `PluginBaseIsConfigurableRector` | D11 | Minimal | [#3459533](https://www.drupal.org/node/3459533) | `rector/rules/replace-pluginbase-isconfigurable-with-instanceof-3459533.php` | `src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector.php` | +| `RemoveAutomatedCronSubmitHandlerRector` | D11 | **Significant** | [#3566768](https://www.drupal.org/node/3566768) | `rector/rules/remove-deprecated-automated-cron-settings-submit-calls-and-3566768.php` | `src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector.php` | +| `RemoveCacheExpireOverrideRector` | D11 | **Significant** | [#3576556](https://www.drupal.org/node/3576556) | `rector/rules/remove-deprecated-cacheexpire-overrides-from-views-3576556.php` | `src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector.php` | +| `RemoveConfigSaveTrustedDataArgRector` | D11 | **Significant** | [#3347842](https://www.drupal.org/node/3347842) | `rector/rules/remove-deprecated-trusted-data-concept-from-drupal-config-3347842.php` *(split)* | `src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector.php` | +| `RemoveHandlerBaseDefineExtraOptionsRector` | D11 | **Significant** | [#3485084](https://www.drupal.org/node/3485084) | `rector/rules/remove-overrides-of-deprecated-handlerbase-3485084.php` | `src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector.php` | +| `RemoveLinkWidgetValidateTitleElementRector` | D11 | Minimal | [#3093118](https://www.drupal.org/node/3093118) | `rector/rules/remove-deprecated-linkwidget-validatetitleelement-calls-3093118.php` | `src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector.php` | +| `RemoveModuleHandlerAddModuleCallsRector` | D11 | **Significant** | [#3528899](https://www.drupal.org/node/3528899) | `rector/rules/remove-deprecated-modulehandlerinterface-addmodule-and-3528899.php` | `src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector.php` | +| `RemoveModuleHandlerDeprecatedMethodsRector` | D11 | **Significant** | [#3442009](https://www.drupal.org/node/3442009) | `rector/rules/remove-deprecated-modulehandlerinterface-writecache-and-3442009.php` | `src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector.php` | +| `RemoveRootFromConvertDbUrlRector` | D11 | **Significant** | [#3522513](https://www.drupal.org/node/3522513) | `rector/rules/remove-deprecated-string-root-from-database-3522513.php` | `src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector.php` | +| `RemoveSetUriCallbackRector` | D11 | Minimal | [#2667040](https://www.drupal.org/node/2667040) | `rector/rules/remove-deprecated-entitytypeinterface-seturicallback-calls-2667040.php` | `src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector.php` | +| `RemoveStateCacheSettingRector` | D11 | Minimal | [#3436954](https://www.drupal.org/node/3436954) | `rector/rules/remove-deprecated-settings-state-cache-assignment-3436954.php` | `src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector.php` | +| `RemoveTrustDataCallRector` | D11 | **Significant** | [#3347842](https://www.drupal.org/node/3347842) | `rector/rules/remove-deprecated-trusted-data-concept-from-drupal-config-3347842.php` *(split)* | `src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector.php` | +| `RemoveTwigNodeTransTagArgumentRector` | D11 | **Significant** | [#3473440](https://www.drupal.org/node/3473440) | `rector/rules/remove-deprecated-tag-argument-from-twignodetrans-3473440.php` | `src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector.php` | +| `RemoveUpdaterPostInstallMethodsRector` | D11 | Minimal | [#3417136](https://www.drupal.org/node/3417136) | `rector/rules/remove-deprecated-updater-postinstall-postinstalltasks-3417136.php` | `src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector.php` | +| `RemoveViewsRowCacheKeysRector` | D11 | Minimal | [#3564958](https://www.drupal.org/node/3564958) † | `rector/rules/remove-deprecated-cachepluginbase-getrowcachekeys-and-3564937.php` | `src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php` | +| `RenameStopProceduralHookScanRector` | D11 | **Significant** | [#3495943](https://www.drupal.org/node/3495943) | `rector/rules/rename-stopproceduralhookscan-attribute-to-3495943.php` | `src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector.php` | +| `ReplaceAlphadecimalToIntNullRector` | D11 | Minimal | [#3442810](https://www.drupal.org/node/3442810) | `rector/rules/replace-deprecated-number-alphadecimaltoint-null-calls-with-3442810.php` | `src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector.php` | +| `ReplaceCommentManagerGetCountNewCommentsRector` | D11 | **Significant** | [#3551729](https://www.drupal.org/node/3551729) † | `rector/rules/replace-deprecated-commentmanagerinterface-3543035.php` | `src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector.php` | +| `ReplaceCommentUriRector` | D11 | Minimal | [#2010202](https://www.drupal.org/node/2010202) | `rector/rules/replace-deprecated-comment-uri-with-comment-permalink-2010202.php` | `src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector.php` | +| `ReplaceDateTimeRangeConstantsRector` | D11 | Minimal | [#3574901](https://www.drupal.org/node/3574901) | `rector/rules/replace-removed-datetimerangeconstantsinterface-constants-3574901.php` | `src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector.php` | +| `ReplaceEditorLoadRector` | D11 | **Significant** | [#3447794](https://www.drupal.org/node/3447794) | `rector/rules/replace-deprecated-editor-load-with-entity-storage-load-3447794.php` | `src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector.php` | +| `ReplaceEntityOriginalPropertyRector` | D11 | **Significant** | [#3571065](https://www.drupal.org/node/3571065) | `rector/rules/replace-deprecated-entity-original-magic-property-with-3571065.php` | `src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector.php` | +| `ReplaceEntityReferenceRecursiveLimitRector` | D11 | **Significant** | [#3316878](https://www.drupal.org/node/3316878) † | `rector/rules/replace-deprecated-entityreferenceentityformatter-recursive-2940605.php` | `src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector.php` | +| `ReplaceFieldgroupToFieldsetRector` | D11 | Minimal | [#3512254](https://www.drupal.org/node/3512254) | `rector/rules/replace-deprecated-type-fieldgroup-with-type-fieldset-3512254.php` | `src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector.php` | +| `ReplaceFileGetContentHeadersRector` | D11 | Minimal | [#3494126](https://www.drupal.org/node/3494126) | `rector/rules/replace-file-get-content-headers-with-fileinterface-3494126.php` | `src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector.php` | +| `ReplaceLocaleConfigBatchFunctionsRector` | D11 | **Significant** | [#3575254](https://www.drupal.org/node/3575254) | `rector/rules/replace-deprecated-locale-batch-functions-with-their-3575254.php` | `src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector.php` | +| `ReplaceNodeAccessViewAllNodesRector` | D11 | Minimal | [#3038908](https://www.drupal.org/node/3038908) | `rector/rules/replace-deprecated-node-access-view-all-nodes-with-oo-3038908.php` | `src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector.php` | +| `ReplaceNodeAddBodyFieldRector` | D11 | Minimal | [#3489266](https://www.drupal.org/node/3489266) | `rector/rules/replace-deprecated-node-add-body-field-with-createbodyfield-3489266.php` | `src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector.php` | +| `ReplaceNodeModuleProceduralFunctionsRector` | D11 | Minimal | [#3571623](https://www.drupal.org/node/3571623) | `rector/rules/replace-deprecated-node-module-procedural-functions-with-oo-3571623.php` | `src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector.php` | +| `ReplaceNodeSetPreviewModeRector` | D11 | Minimal | [#3538277](https://www.drupal.org/node/3538277) | `rector/rules/replace-deprecated-constants-with-nodepreviewmode-enum-in-3538277.php` | `src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector.php` | +| `ReplacePdoFetchConstantsRector` | D11 | **Significant** | [#3525077](https://www.drupal.org/node/3525077) | `rector/rules/replace-removed-mysql-pgsql-sqlite-driver-query-subclass-3525077.php` | `src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector.php` | +| `ReplaceRecipeRunnerInstallModuleRector` | D11 | Minimal | [#3498026](https://www.drupal.org/node/3498026) | `rector/rules/replace-deprecated-reciperunner-installmodule-with-3498026.php` | `src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector.php` | +| `ReplaceSessionManagerDeleteRector` | D11 | **Significant** | [#3577376](https://www.drupal.org/node/3577376) | `rector/rules/replace-deprecated-sessionmanager-delete-with-3577376.php` | `src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector.php` | +| `ReplaceSessionWritesWithRequestSessionRector` | D11 | Minimal | [#3518527](https://www.drupal.org/node/3518527) | `rector/rules/replace-deprecated-session-writes-with-drupal-request-3518527.php` | `src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector.php` | +| `ReplaceSystemPerformanceGzipKeyRector` | D11 | Minimal | [#3184242](https://www.drupal.org/node/3184242) | `rector/rules/replace-deprecated-system-performance-css-gzip-js-gzip-3184242.php` | `src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector.php` | +| `ReplaceThemeGetSettingRector` | D11 | Minimal | [#3573896](https://www.drupal.org/node/3573896) | `rector/rules/replace-deprecated-theme-get-setting-and-system-default-3573896.php` | `src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector.php` | +| `ReplaceUserSessionNamePropertyRector` | D11 | Minimal | [#3513856](https://www.drupal.org/node/3513856) | `rector/rules/replace-deprecated-usersession-name-property-read-with-3513856.php` | `src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector.php` | +| `ReplaceViewsProceduralFunctionsRector` | D11 | Minimal | [#3572243](https://www.drupal.org/node/3572243) | `rector/rules/replace-deprecated-views-procedural-functions-with-oo-3572243.php` | `src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector.php` | +| `StatementPrefetchIteratorFetchColumnRector` | D11 | **Significant** | [#3490200](https://www.drupal.org/node/3490200) | `rector/rules/replace-deprecated-statementprefetchiterator-fetchcolumn-3490200.php` | `src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector.php` | +| `StripMigrationDependenciesExpandArgRector` | D11 | Minimal | [#3574717](https://www.drupal.org/node/3574717) | `rector/rules/strip-removed-expand-argument-from-getmigrationdependencies-3574717.php` | `src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector.php` | +| `UseEntityTypeHasIntegerIdRector` | D11 | **Significant** | [#3566801](https://www.drupal.org/node/3566801) | `rector/rules/replace-deprecated-entity-type-integer-id-helpers-with-3566801.php` | `src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector.php` | +| `ViewsPluginHandlerManagerRector` | D11 | **Significant** | [#3566424](https://www.drupal.org/node/3566424) | `rector/rules/replace-deprecated-views-pluginmanager-and-views-3566424.php` | `src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector.php` | + +--- + +## Significant Changes + +### 1. `ReplaceRequestTimeConstantRector` (Drupal10) + +**Digest file:** `add-timeinterface-time-argument-to-plugin-constructor-3395986.php` + +**Change:** The issue ID is shared but the two rules address entirely different deprecations. The digest (`AddTimeInterfaceToPluginConstructorsRector`) adds a `?TimeInterface $time` argument to `__construct()` overrides in subclasses of six Drupal plugin parent classes (`TimestampFormatter`, `views\argument\Date`, etc.), updating each `parent::__construct()` call to pass `$time`. The rector instead replaces occurrences of the `REQUEST_TIME` constant with `\Drupal::time()->getRequestTime()` by visiting `ConstFetch` nodes. The two rules share a Drupal issue number but implement completely unrelated transformations. No code from the digest was reused. + +```php +// Digest — adds ?TimeInterface parameter to plugin __construct() overrides +final class AddTimeInterfaceToPluginConstructorsRector extends AbstractRector +{ + public function getNodeTypes(): array { return [Class_::class]; } + // ... +} + +// Rector — replaces REQUEST_TIME constant with method call +final class ReplaceRequestTimeConstantRector extends AbstractRector +{ + public function getNodeTypes(): array { return [Node\Expr\ConstFetch::class]; } + public function refactor(Node $node): ?Node + { + if (!$this->isName($node, 'REQUEST_TIME')) { return null; } + $staticCall = new Node\Expr\StaticCall(new Node\Name\FullyQualified('Drupal'), 'time'); + return new Node\Expr\MethodCall($staticCall, 'getRequestTime'); + } +} +``` + +--- + +### 2. `NodeStorageDeprecatedMethodsRector` (Drupal11) + +**Digest file:** `replace-deprecated-nodestorage-revisionids-and-3396062.php` + +**Change:** The digest handled only `revisionIds()` and `userRevisionIds()`, visiting only `MethodCall` nodes. The rector adds handling for `countDefaultLanguageRevisions()`, which has no replacement and must be removed entirely. This required registering `Expression::class` as a second node type and returning `NodeVisitor::REMOVE_NODE` when the expression statement wraps that call. + +```php +// Digest — only MethodCall nodes +public function getNodeTypes(): array +{ + return [MethodCall::class]; +} +// No handling for countDefaultLanguageRevisions() + +// Rector — adds Expression node type and removal +public function getNodeTypes(): array +{ + return [Node\Expr\MethodCall::class, Node\Stmt\Expression::class]; +} + +if ($node instanceof Node\Stmt\Expression) { + $methodCall = $node->expr; + if ($this->getName($methodCall->name) === 'countDefaultLanguageRevisions') { + return NodeVisitor::REMOVE_NODE; + } +} +``` + +--- + +### 3. `RemoveAutomatedCronSubmitHandlerRector` (Drupal11) + +**Digest file:** `remove-deprecated-automated-cron-settings-submit-calls-and-3566768.php` + +**Change:** The digest registered two separate rules: the custom `RemoveAutomatedCronSettingsSubmitHandlerRector` class (which removed `$form['#submit'][] = 'automated_cron_settings_submit'` array-append assignments) plus a comment pointing to `RemoveFuncCallRector` to handle direct `automated_cron_settings_submit($form, $form_state)` function calls. The rector implements only the array-append removal, omitting the direct function-call case. The class was also renamed from `RemoveAutomatedCronSettingsSubmitHandlerRector` to `RemoveAutomatedCronSubmitHandlerRector`. + +--- + +### 4. `RemoveCacheExpireOverrideRector` (Drupal11) + +**Digest file:** `remove-deprecated-cacheexpire-overrides-from-views-3576556.php` + +**Change:** The digest's `PARENT_SHORT_NAMES` listed `CachePluginBase`, `Time`, `Tag`, and `None`, and its `isCachePluginBaseSubclass()` used `str_ends_with($parentName, '\\' . $short)` for namespace-relative matching. It then fell back to a PHPStan `isSuperTypeOf()->yes()` check using an inline `\PHPStan\Type\ObjectType`. + +The rector adds a separate `PARENT_FQCNS` constant listing all four fully-qualified names (`CachePluginBase`, `Time`, `Tag`, `None`), and restructures `isCachePluginBaseSubclass()` to first iterate `PARENT_FQCNS` for exact FQCN matches, then only applies short-name matching when `!str_contains($parentName, '\\')` (i.e., bare unqualified names). The PHPStan fallback uses the imported `ObjectType` class rather than an inline FQN. This prevents a namespace-relative name like `cache\None` from accidentally matching the short name `None` via `str_ends_with`. + +```php +// Digest — single PARENT_SHORT_NAMES list, str_ends_with for all cases +private const PARENT_SHORT_NAMES = ['CachePluginBase', 'Time', 'Tag', 'None']; +// ... +foreach (self::PARENT_SHORT_NAMES as $short) { + if ($parentName === $short || str_ends_with($parentName, '\\' . $short)) { + return true; + } +} + +// Rector — separate PARENT_FQCNS constant, short-name check restricted to unqualified names +private const PARENT_FQCNS = [ + 'Drupal\views\Plugin\views\cache\CachePluginBase', + 'Drupal\views\Plugin\views\cache\Time', + 'Drupal\views\Plugin\views\cache\Tag', + 'Drupal\views\Plugin\views\cache\None', +]; + +foreach (self::PARENT_FQCNS as $fqcn) { + if ($parentName === $fqcn) { return true; } +} +if (!str_contains($parentName, '\\')) { + foreach (self::PARENT_SHORT_NAMES as $short) { + if ($parentName === $short) { return true; } + } +} +``` + +--- + +### 5. `RemoveConfigSaveTrustedDataArgRector` + `RemoveTrustDataCallRector` (Drupal11) + +**Digest file:** `remove-deprecated-trusted-data-concept-from-drupal-config-3347842.php` (one file, split into two rector classes) + +**Change:** The digest defined a single class (`RemoveTrustedDataConceptRector`) that handled both patterns in one `refactor()` method: it removed the boolean arg from `->save(TRUE/FALSE)` and removed `->trustData()` from fluent chains, both without any type guard. + +The rector splits these into two focused classes. `RemoveConfigSaveTrustedDataArgRector` handles only `Config::save(TRUE/FALSE)` and adds a `Drupal\Core\Config\Config` ObjectType guard. `RemoveTrustDataCallRector` handles only `->trustData()` chain removal and adds a `Drupal\Core\Config\Entity\ConfigEntityInterface` ObjectType guard. Both additions prevent false positives on unrelated classes with `save()` or `trustData()` methods. + +```php +// Digest — no type guards, single class +if ($this->isName($node->name, 'save') && count($node->args) === 1 ...) { + // remove boolean arg, no ObjectType check +} +if ($this->isName($node->name, 'trustData') && count($node->args) === 0) { + return $node->var; // no ObjectType check +} + +// RemoveConfigSaveTrustedDataArgRector — adds Config type guard +if (!$this->isObjectType($node->var, new ObjectType('Drupal\Core\Config\Config'))) { + return null; +} + +// RemoveTrustDataCallRector — adds ConfigEntityInterface type guard +if (!$this->isObjectType($node->var, new ObjectType('Drupal\Core\Config\Entity\ConfigEntityInterface'))) { + return null; +} +``` + +--- + +### 6. `RemoveHandlerBaseDefineExtraOptionsRector` (Drupal11) + +**Digest file:** `remove-overrides-of-deprecated-handlerbase-3485084.php` + +**Change:** The digest (`RemoveDefineExtraOptionsOverrideRector`) relied solely on PHPStan's `isObjectType()` against `HandlerBase` and explicitly excluded the `HandlerBase` class itself by checking the short class name. + +The rector takes a different approach: it uses a multi-strategy `isHandlerBaseSubclass()` helper that first checks `HANDLER_BASE_FQCN` for exact match, then iterates a `PARENT_SHORT_NAMES` constant (listing six short names: `HandlerBase`, `FieldHandlerBase`, `FilterPluginBase`, `SortPluginBase`, `ArgumentPluginBase`, `RelationshipPluginBase`) with `str_ends_with` support, and only falls back to `isObjectType()` as a last resort. This makes the rector more resilient when PHPStan's type resolution is unavailable. The `HandlerBase`-exclusion logic from the digest is absent (not needed since the detection now targets subclasses more precisely). + +```php +// Digest — relies primarily on isObjectType, excludes HandlerBase by name +if (!$this->isObjectType($node->extends, new ObjectType('Drupal\\views\\Plugin\\views\\HandlerBase'))) { + return null; +} +if ($node->name instanceof Identifier && $node->name->toString() === 'HandlerBase') { + return null; // skip HandlerBase itself +} + +// Rector — explicit PARENT_SHORT_NAMES list as primary detection +private const PARENT_SHORT_NAMES = [ + 'HandlerBase', 'FieldHandlerBase', 'FilterPluginBase', + 'SortPluginBase', 'ArgumentPluginBase', 'RelationshipPluginBase', +]; +foreach (self::PARENT_SHORT_NAMES as $short) { + if ($parentName === $short || str_ends_with($parentName, '\\'.$short)) { + return true; + } +} +``` + +--- + +### 7. `RemoveModuleHandlerAddModuleCallsRector` (Drupal11) + +**Digest file:** `remove-deprecated-modulehandlerinterface-addmodule-and-3528899.php` + +**Change:** The digest checked only `ModuleHandlerInterface`. The rector also checks the concrete `ModuleHandler` class, covering cases where the variable is typed as the concrete implementation rather than the interface. + +```php +// Digest — interface only +if ($this->isObjectType($methodCall->var, new ObjectType('Drupal\\Core\\Extension\\ModuleHandlerInterface'))) { + return NodeVisitor::REMOVE_NODE; +} + +// Rector — interface + concrete class +foreach (['Drupal\Core\Extension\ModuleHandlerInterface', 'Drupal\Core\Extension\ModuleHandler'] as $class) { + if ($this->isObjectType($methodCall->var, new ObjectType($class))) { + $isModuleHandler = true; + break; + } +} +``` + +--- + +### 8. `RemoveModuleHandlerDeprecatedMethodsRector` (Drupal11) + +**Digest file:** `remove-deprecated-modulehandlerinterface-writecache-and-3442009.php` + +**Change:** Both rules handle `writeCache()` removal and `getHookInfo()` → `[]` replacement identically in terms of transformation output. The key difference is how standalone `getHookInfo()` expression statements are handled. The digest left them in place as a bare `[];` expression (replacing the method call with an empty array literal as a statement, which is harmless dead code). The rector removes standalone `getHookInfo()` expression statements entirely via `NodeVisitor::REMOVE_NODE`, treating them the same as `writeCache()` calls. The rector also refactors the repeated type-check logic into a private `isModuleHandlerMethodCall()` helper, which the digest inlined. + +```php +// Digest — standalone getHookInfo() becomes bare []; (not removed) +if ($node instanceof Expression && $node->expr instanceof MethodCall) { + if ($this->isName($call->name, 'writeCache') && $this->isObjectType(...)) { + return NodeVisitor::REMOVE_NODE; + } + // getHookInfo() as statement: falls through to MethodCall branch → returns new Array_() +} + +// Rector — standalone getHookInfo() is also removed +if ($node instanceof Expression && $node->expr instanceof MethodCall) { + if ($this->isModuleHandlerMethodCall($call, 'writeCache') + || $this->isModuleHandlerMethodCall($call, 'getHookInfo') + ) { + return NodeVisitor::REMOVE_NODE; + } +} +``` + +--- + +### 9. `RemoveRootFromConvertDbUrlRector` (Drupal11) + +**Digest file:** `remove-deprecated-string-root-from-database-3522513.php` + +**Change:** The digest (`RemoveRootFromConvertDbUrlToConnectionInfoRector`) recognized `String_`, `PropertyFetch`, `NullsafePropertyFetch`, `FuncCall`, `StaticPropertyFetch`, and `MethodCall` as second-argument forms that should be stripped. The rector preserves all of these and adds the same logic, but also renames the class from `RemoveRootFromConvertDbUrlToConnectionInfoRector` to `RemoveRootFromConvertDbUrlRector`. Functionally the two implementations are equivalent; the differences are limited to class name, namespace, and the import style (inline `\PhpParser\Node\Expr\StaticPropertyFetch` vs imported `StaticPropertyFetch`). This entry is classified **Significant** only because the class was renamed and the rector adds the `StaticPropertyFetch` and `MethodCall` types explicitly as named imports where the digest used inline FQNs. + +--- + +### 10. `RemoveTwigNodeTransTagArgumentRector` (Drupal11) + +**Digest file:** `remove-deprecated-tag-argument-from-twignodetrans-3473440.php` + +**Change:** Two differences in argument-removal logic and class matching. The digest (`RemoveTwigNodeTransTagArgRector`) used `TARGET_CLASS = 'Drupal\\Core\\Template\\TwigNodeTrans'` with `$this->isName()`, matched only on the FQCN, checked `isset($node->args[5])`, and used `array_splice($node->args, 5)` which removes index 5 and everything beyond it. + +The rector checks both the FQCN `Drupal\Core\Template\TwigNodeTrans` and the short name `TwigNodeTrans` (using `$this->getName($node->class)` and comparing with `!==`), restricts the transformation to exactly `count($node->args) === 6`, and uses `array_pop($node->args)` to remove only the last argument. The short-name support broadens coverage to files that import the class via `use`. The `count() === 6` check is more restrictive than `isset([5])` (which fires for 7+ args too). + +```php +// Digest — FQCN only, isset check, array_splice +if (!$this->isName($node->class, self::TARGET_CLASS)) { return null; } +if (!isset($node->args[5])) { return null; } +array_splice($node->args, 5); + +// Rector — FQCN or short name, exact count, array_pop +if ($className !== 'TwigNodeTrans' && $className !== 'Drupal\Core\Template\TwigNodeTrans') { + return null; +} +if (count($node->args) !== 6) { return null; } +array_pop($node->args); +``` + +--- + +### 11. `RenameStopProceduralHookScanRector` (Drupal11) + +**Digest file:** `rename-stopproceduralhookscan-attribute-to-3495943.php` + +**Change:** The digest was a config-only snippet (no class body) that delegated to the built-in `RenameClassRector` with a single `StopProceduralHookScan` → `ProceduralHookScanStop` mapping. `RenameClassRector` rewrites all class references but does not specifically handle the `use` statement and attribute usage site independently — it also risks rewriting unrelated references in class bodies that happen to share the same short name. + +The rector implements a full custom rule visiting two distinct node types (`UseUse` and `Attribute`) and handles them separately: it rewrites the `use` statement's `name` to the new FQCN and rewrites `#[StopProceduralHookScan]` attribute nodes (both FQCN and short-name forms) to `#[ProceduralHookScanStop]`. This is more precise and avoids the side effects of `RenameClassRector`. + +--- + +### 12. `ReplaceCommentManagerGetCountNewCommentsRector` (Drupal11) + +**Digest file:** `replace-deprecated-commentmanagerinterface-3543035.php` + +**Note:** The rector's `@see` references issue `#3551729`; the digest file uses `#3543035`. Both reference the same deprecation. + +**Change:** The digest extended `AbstractRector` directly with a plain `refactor()` method. The rector extends `AbstractDrupalCoreRector` and wraps the logic in `refactorWithConfiguration()`, enabling version-gated activation via `DrupalIntroducedVersionConfiguration('11.3.0')`. The transformation logic itself (building `\Drupal::service(HistoryManager::class)->getCountNewComments()`) is identical. + +```php +// Digest +final class CommentManagerGetCountNewCommentsRector extends AbstractRector +{ + public function refactor(Node $node): ?Node { ... } +} + +// Rector +final class ReplaceCommentManagerGetCountNewCommentsRector extends AbstractDrupalCoreRector +{ + public function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { ... } + // getRuleDefinition() uses ConfiguredCodeSample with DrupalIntroducedVersionConfiguration('11.3.0') +} +``` + +--- + +### 13. `ReplaceEditorLoadRector` (Drupal11) + +**Digest file:** `replace-deprecated-editor-load-with-entity-storage-load-3447794.php` + +**Change:** The digest (`EditorLoadDeprecationRector`) built the replacement AST manually with inline `new StaticCall(new FullyQualified('Drupal'), 'entityTypeManager', [])`, `new MethodCall(...)`, and used `$node->args[0] ?? new Node\Arg(new Node\Expr\ConstFetch(new Name('null')))` to handle a missing first argument. The rector uses `$this->nodeFactory->createStaticCall()` and `$this->nodeFactory->createMethodCall()` helpers, which is cleaner and more idiomatic for drupal-rector. The rector also adds an explicit `count($node->args) !== 1` guard that the digest lacked (the digest silently substituted null). The class was renamed from `EditorLoadDeprecationRector`. + +--- + +### 14. `ReplaceEntityOriginalPropertyRector` (Drupal11) + +**Digest file:** `replace-deprecated-entity-original-magic-property-with-3571065.php` + +**Change:** The digest (`EntityOriginalPropertyToMethodRector`) handled `PropertyFetch` and `Assign` nodes only. For `Assign`, it added an `EntityInterface` ObjectType check on the `getOriginal()` MethodCall var, but for the `PropertyFetch` branch it relied only on the `$this->original`-skip check plus `isObjectType(EntityInterface)`. + +The rector adds `NullsafePropertyFetch` as a third registered node type and handles `$entity?->original` → `$entity?->getOriginal()` by returning a new `NullsafeMethodCall`. The `Assign` branch in the rector drops the secondary `EntityInterface` check (since by that pass the `PropertyFetch` was already transformed to `getOriginal()`, so the type check is redundant). The class was renamed from `EntityOriginalPropertyToMethodRector`. + +```php +// Digest — only PropertyFetch and Assign +public function getNodeTypes(): array { return [PropertyFetch::class, Assign::class]; } + +// Rector — adds NullsafePropertyFetch +public function getNodeTypes(): array +{ + return [PropertyFetch::class, NullsafePropertyFetch::class, Assign::class]; +} +// Handles $entity?->original → $entity?->getOriginal() +if ($node instanceof NullsafePropertyFetch) { + if ($this->isName($node->name, 'original') && ...) { + return new NullsafeMethodCall($node->var, 'getOriginal'); + } +} +``` + +--- + +### 15. `ReplaceEntityReferenceRecursiveLimitRector` (Drupal11) + +**Digest file:** `replace-deprecated-entityreferenceentityformatter-recursive-2940605.php` + +**Note:** The rector's `@see` references issue `#3316878`; the digest file uses `#2940605`. Both refer to the same deprecation. + +**Change:** The digest (`RemoveEntityReferenceRecursiveLimitConstantRector`) used `isObjectType()` for FQCN matching and additionally handled `static::`, `self::`, and `parent::` class-constant fetches within subclasses. The rector simplifies this by maintaining a `TARGET_CLASSES` constant (listing both the short name `EntityReferenceEntityFormatter` and the FQCN) and matching via `$this->isName($node->class, $class)` — which can match both short names (resolved by Rector via `use` imports) and FQCNs, but does not handle `static::`/`self::`/`parent::`. The rector's approach is simpler but slightly less complete. + +```php +// Digest — handles static/self/parent via isObjectType +if (in_array((string) $class, ['static', 'self', 'parent'], true)) { + if ($this->isObjectType($node, new ObjectType(self::DEPRECATED_CLASS))) { + return new LNumber(20); + } +} + +// Rector — TARGET_CLASSES with isName(), no static/self/parent handling +private const TARGET_CLASSES = [ + 'EntityReferenceEntityFormatter', + 'Drupal\Core\Field\Plugin\Field\FieldFormatter\EntityReferenceEntityFormatter', +]; +foreach (self::TARGET_CLASSES as $class) { + if ($this->isName($node->class, $class)) { return new Int_(20); } +} +``` + +--- + +### 16. `ReplaceLocaleConfigBatchFunctionsRector` (Drupal11) + +**Digest file:** `replace-deprecated-locale-batch-functions-with-their-3575254.php` + +**Change:** The digest was a config-only snippet delegating to the built-in `RenameFunctionRector` with a two-entry rename map. The rector implements a full custom `FuncCall`-visiting rule with a `RENAME_MAP` constant, providing testability, explicit control, and compatibility with the drupal-rector test infrastructure. + +--- + +### 17. `ReplacePdoFetchConstantsRector` (Drupal11) + +**Digest file:** `replace-removed-mysql-pgsql-sqlite-driver-query-subclass-3525077.php` + +**Change:** The issue ID is shared but the two rules address entirely different aspects of the same issue. The digest was a config-only snippet delegating to `RenameClassRector` to remap nine deprecated driver-specific query subclasses (e.g. `Drupal\mysql\Driver\Database\mysql\Delete`) to their `Drupal\Core\Database\Query\*` base equivalents. + +The rector is a fully custom rule that converts `PDO::FETCH_*` constants to `FetchAs` enum cases in Drupal Database API calls. It visits `MethodCall` nodes for `setFetchMode()`, `fetch()`, `fetchAll()`, `fetchAllAssoc()`, and `ArrayItem` nodes for `'fetch'` array keys. It also guards against accidentally rewriting `PDO::FETCH_*` on native PDO methods by checking whether the callee is `getClientStatement()` or `getClientConnection()`. No code from the digest was reused. + +--- + +### 18. `ReplaceSessionManagerDeleteRector` (Drupal11) + +**Digest file:** `replace-deprecated-sessionmanager-delete-with-3577376.php` + +**Change:** The digest extended `AbstractRector` directly and used the PHPStan `$sessionManagerType->isSuperTypeOf($callerType)->yes()` pattern to check the caller type. The rector extends `AbstractDrupalCoreRector` and uses `refactorWithConfiguration()` with `DrupalIntroducedVersionConfiguration('11.4.0')`, enabling version-gated activation. The type check was changed to `$this->isObjectType($node->var, new ObjectType('Drupal\Core\Session\SessionManager'))`, which is the standard Rector API. + +```php +// Digest — plain refactor(), PHPStan isSuperTypeOf +final class ReplaceSessionManagerDeleteRector extends AbstractRector +{ + public function refactor(Node $node): ?Node { + $callerType = $this->getType($node->var); + if (!$sessionManagerType->isSuperTypeOf($callerType)->yes()) { return null; } + } +} + +// Rector — refactorWithConfiguration(), isObjectType +final class ReplaceSessionManagerDeleteRector extends AbstractDrupalCoreRector +{ + public function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { + if (!$this->isObjectType($node->var, new ObjectType('Drupal\Core\Session\SessionManager'))) { return null; } + } +} +``` + +--- + +### 19. `StatementPrefetchIteratorFetchColumnRector` (Drupal11) + +**Digest file:** `replace-deprecated-statementprefetchiterator-fetchcolumn-3490200.php` + +**Change:** The digest was a config-only snippet delegating to the built-in `RenameMethodRector` with a single `StatementPrefetchIterator::fetchColumn → fetchField` mapping. The rector implements a full custom `MethodCall`-visiting rule with an explicit `StatementPrefetchIterator` ObjectType check, making the transformation testable and safe against accidental rewrites of unrelated `fetchColumn()` methods. + +--- + +### 20. `UseEntityTypeHasIntegerIdRector` (Drupal11) + +**Digest file:** `replace-deprecated-entity-type-integer-id-helpers-with-3566801.php` + +**Change:** The digest used a `TARGET_PARENTS` list with three FQCNs and a shared `isInTargetParent()` helper that called `isObjectType()` for all three, covering all three method patterns under one broad type check. It also handled the `hasIntegerId($entityType)` pattern directly. + +The rector replaces the broad `TARGET_PARENTS` approach with a `METHOD_OWNER_CLASS` map that pairs each method name to its specific declaring class (`entityTypeSupportsComments` → `CommentTypeForm`, `hasIntegerId` → `OverridesSectionStorage`). The `getEntityTypeIdKeyType` comparison pattern uses a dedicated `GET_ENTITY_TYPE_ID_KEY_TYPE_CLASS` constant. This means each method is checked against only its own class rather than all three parent classes, making false positives less likely. + +```php +// Digest — shared TARGET_PARENTS, checks all three for every method +private const TARGET_PARENTS = [ + 'Drupal\\Core\\Entity\\Routing\\DefaultHtmlRouteProvider', + 'Drupal\\comment\\CommentTypeForm', + 'Drupal\\layout_builder\\Plugin\\SectionStorage\\OverridesSectionStorage', +]; +private function isInTargetParent(Node $node): bool { + foreach (self::TARGET_PARENTS as $parent) { + if ($this->isObjectType($node, new ObjectType($parent))) { return true; } + } +} + +// Rector — METHOD_OWNER_CLASS pairs each method to its specific owner +private const METHOD_OWNER_CLASS = [ + 'entityTypeSupportsComments' => 'Drupal\comment\CommentTypeForm', + 'hasIntegerId' => 'Drupal\layout_builder\Plugin\SectionStorage\OverridesSectionStorage', +]; +if (!$this->isObjectType($node->var, new ObjectType(self::METHOD_OWNER_CLASS[$name]))) { + return null; +} +``` + +--- + +### 21. `ViewsPluginHandlerManagerRector` (Drupal11) + +**Digest file:** `replace-deprecated-views-pluginmanager-and-views-3566424.php` + +**Change:** The digest used `$this->isObjectType($node->class, new \PHPStan\Type\ObjectType('Drupal\\views\\Views'))` to match the static call class — which is incorrect for static call class nodes (the `class` property is a `Name`, not an object expression, so `isObjectType` does not apply). The rector replaces this with `$this->isName($node->class, 'Drupal\views\Views')`, which is the correct API for matching a class name on a `StaticCall` node. The transformation logic (string-literal vs dynamic argument) is identical. + +```php +// Digest — incorrect isObjectType on a Name node +if (!$this->isObjectType($node->class, new \PHPStan\Type\ObjectType('Drupal\\views\\Views'))) { + return null; +} + +// Rector — correct isName for StaticCall class +if (!$this->isName($node->class, 'Drupal\views\Views')) { + return null; +} +``` + +--- + +## Minimal Changes + +These rectors are functionally equivalent to their digest counterparts. Differences are limited to: namespace declarations, proper `use` imports (replacing inline backslash-prefixed FQNs), `declare(strict_types=1)` placement, class renaming to match drupal-rector conventions, and minor wording in `getRuleDefinition()`. + +| Rector class | Notable structural differences from digest | +|---|---| +| `ReplaceModuleHandlerGetNameRector` | Namespace + `AbstractDrupalCoreRector` wrapping + `DrupalIntroducedVersionConfiguration('10.3.0')`; logic identical to digest | +| `ReplaceRebuildThemeDataRector` | Namespace + `AbstractDrupalCoreRector` wrapping + `DrupalIntroducedVersionConfiguration('10.3.0')`; the `ThemeHandlerInterface` ObjectType check and `!empty($node->args)` guard were already present in the 0503 digest, so logic is identical | +| `ErrorCurrentErrorHandlerRector` | Namespace + imports only; `ObjectType` imported vs inline `\PHPStan\Type\ObjectType`; adds `assert($node instanceof StaticCall)` | +| `FileSystemBasenameToNativeRector` | Namespace + imports only; type-check API changed from `isSuperTypeOf()->yes()` to `isObjectType()` (semantically equivalent) | +| `LoadAllIncludesRector` | Namespace + imports only; logic and structure identical | +| `MigrateSqlGetMigrationPluginManagerRector` | Namespace + imports only; 0503 digest already uses `isObjectType(Sql)` as positive guard — identical to rector | +| `PluginBaseIsConfigurableRector` | Namespace + imports only; 0503 digest already has `isObjectType(PluginBase)` guard — identical to rector; class renamed from `ReplacePluginBaseIsConfigurableRector` | +| `RemoveLinkWidgetValidateTitleElementRector` | Namespace + imports only; logic identical | +| `RemoveSetUriCallbackRector` | Namespace + imports only; 0503 digest already has `EntityTypeInterface` ObjectType guards — identical to rector | +| `RemoveStateCacheSettingRector` | Namespace + imports only; logic identical | +| `RemoveUpdaterPostInstallMethodsRector` | Namespace + imports only; backslash escaping in `UPDATER_BASE_CLASSES` normalized (digest used escaped `\\`) | +| `ReplaceAlphadecimalToIntNullRector` | Namespace + imports only; class renamed from `AlphadecimalToIntNullOrEmptyRector`; inline `\PHPStan` and `\PhpParser` FQNs replaced with imports | +| `ReplaceCommentUriRector` | Namespace + imports only; class renamed from `CommentUriToPermalinkRector`; arg count check changed from `!== 1` (digest) to `< 1` (rector) | +| `ReplaceDateTimeRangeConstantsRector` | Namespace + imports only; class renamed from `ReplaceDatetimeDeprecatedApisRector`; inline `Config\RectorConfig` use removed; logic identical | +| `ReplaceFieldgroupToFieldsetRector` | Namespace + imports only; class renamed from `FieldgroupToFieldsetRector`; logic identical | +| `ReplaceFileGetContentHeadersRector` | Namespace + imports only; class renamed from `FileGetContentHeadersRector`; adds `assert()`; logic identical | +| `ReplaceNodeAccessViewAllNodesRector` | Namespace + imports only; class renamed from `NodeAccessViewAllNodesRector`; logic identical | +| `ReplaceNodeAddBodyFieldRector` | Namespace + imports only; class renamed from `NodeAddBodyFieldRector`; logic identical | +| `ReplaceNodeModuleProceduralFunctionsRector` | Namespace + imports only; class renamed from `ReplaceDeprecatedNodeFunctionsRector`; logic identical | +| `ReplaceNodeSetPreviewModeRector` | Namespace + imports only; class renamed from `NodeSetPreviewModeRector`; 0503 digest already has `NodeTypeInterface` ObjectType guard — logic identical | +| `ReplaceRecipeRunnerInstallModuleRector` | Namespace + imports only; class renamed from `RecipeRunnerInstallModuleRector`; logic identical | +| `ReplaceSessionWritesWithRequestSessionRector` | Namespace + imports only; class renamed from `SessionSuperGlobalToRequestSessionRector`; logic identical | +| `ReplaceSystemPerformanceGzipKeyRector` | Namespace + imports only; class renamed from `SystemPerformanceGzipToCompressRector`; logic identical | +| `ReplaceThemeGetSettingRector` | Namespace + imports only; logic identical | +| `ReplaceUserSessionNamePropertyRector` | Namespace + imports only; class renamed from `UserSessionNamePropertyToGetAccountNameRector`; adds `UserSession` ObjectType check and `$this->name` skip guard (digest had neither) | +| `ReplaceViewsProceduralFunctionsRector` | Namespace + imports only; class renamed from `ReplaceDeprecatedViewsFunctionsRector`; logic identical | +| `StripMigrationDependenciesExpandArgRector` | Namespace + imports only; class renamed from `RemoveMigrationDependenciesExpandArgRector`; type-check API changed from `isSuperTypeOf()->yes()` to `isObjectType()` (semantically equivalent) | +| `RemoveViewsRowCacheKeysRector` | Namespace + imports only; 0503 digest already has `CachePluginBase` ObjectType guard; logic equivalent (helper inlined vs private method) | + +--- + +## Notes on Digest File Mapping + +### One digest file → two rector files +`remove-deprecated-trusted-data-concept-from-drupal-config-3347842.php` defined a single class (`RemoveTrustedDataConceptRector`) handling both `->save(TRUE)` and `->trustData()` patterns. The rector project splits these into two separate class files — `RemoveConfigSaveTrustedDataArgRector` and `RemoveTrustDataCallRector` — consistent with the project's one-class-per-file convention. Both rector classes add ObjectType guards absent from the single digest class. + +### Issue number mismatches +Three rectors reference a different `@see` issue number than the digest filename's suffix. In each case the transformation is the same; the numbers refer to different nodes in the same deprecation issue thread: + +| Rector | Rector `@see` | Digest filename issue | Notes | +|---|---|---|---| +| `RemoveViewsRowCacheKeysRector` | `#3564958` | `#3564937` | `3564958` is the change record; `3564937` is the original issue | +| `ReplaceCommentManagerGetCountNewCommentsRector` | `#3551729` | `#3543035` | `3543035` is the original issue; `3551729` is the related change record | +| `ReplaceEntityReferenceRecursiveLimitRector` | `#3316878` | `#2940605` | `2940605` is the older issue; `3316878` is the more recent change record | diff --git a/docs/filter_d11.py b/docs/filter_d11.py new file mode 100644 index 000000000..6c19fa0a9 --- /dev/null +++ b/docs/filter_d11.py @@ -0,0 +1,155 @@ +#!/usr/bin/env python3 +"""Filter search results to only projects with Drupal 11 support, then write markdown.""" + +import json +import os +import re +import time +import sys +import urllib.request +import urllib.parse +from collections import defaultdict + +TOKEN = os.environ["GITLAB_TOKEN"] +BASE = "https://git.drupalcode.org/api/v4" +SLEEP = 0.4 + +def api_get(path, params=None): + url = f"{BASE}{path}" + if params: + url += "?" + urllib.parse.urlencode(params) + req = urllib.request.Request(url, headers={"PRIVATE-TOKEN": TOKEN}) + try: + with urllib.request.urlopen(req, timeout=10) as resp: + return json.loads(resp.read()) + except Exception as e: + return None + + +def supports_d11(project_id, project_name, cache={}): + if project_id in cache: + return cache[project_id] + + # Search for .info.yml files in the project containing core_version_requirement + result = api_get(f"/projects/{project_id}/search", { + "scope": "blobs", + "search": "core_version_requirement", + "per_page": 5, + }) + if not result: + cache[project_id] = False + return False + + for blob in result: + fname = blob.get("filename", "") + if not fname.endswith(".info.yml"): + continue + data = blob.get("data", "") + # Match: core_version_requirement: ^10 || ^11, ^11, >=11, ~11, etc. + if re.search(r'core_version_requirement:[^\n]*\b11\b', data): + cache[project_id] = True + return True + + cache[project_id] = False + return False + + +def main(): + with open("docs/search_results.json") as f: + data = json.load(f) + + rector_hits = data["rector_hits"] + + # Collect unique project IDs across all rectors + # Map project_name -> project_id (we stored both in results) + name_to_id = {} + for rector, hits in rector_hits.items(): + for h in hits: + name_to_id[h["project_name"]] = h["project_id"] + + all_projects = list(name_to_id.items()) + print(f"Checking {len(all_projects)} projects for D11 support...", file=sys.stderr) + + d11_projects = set() + for i, (name, pid) in enumerate(all_projects): + ok = supports_d11(pid, name) + if ok: + d11_projects.add(name) + print(f" [{i+1}/{len(all_projects)}] ✓ {name}", file=sys.stderr) + else: + print(f" [{i+1}/{len(all_projects)}] {name}", file=sys.stderr) + time.sleep(SLEEP) + + print(f"\n{len(d11_projects)} projects support D11.", file=sys.stderr) + + # Build filtered rector -> [project_name] mapping + rector_d11_projects = defaultdict(list) + project_rectors = defaultdict(list) + + for rector, hits in rector_hits.items(): + seen = set() + for h in hits: + pname = h["project_name"] + if pname in d11_projects and pname not in seen: + rector_d11_projects[rector].append(pname) + project_rectors[pname].append(rector) + seen.add(pname) + + # Write markdown + lines = [ + "# Contrib Modules Using Deprecated APIs (D11 Compatible)", + "", + "Modules found via Drupal GitLab code search, filtered to those with `core_version_requirement` supporting Drupal 11.", + "", + "---", + "", + "## By Rector", + "", + ] + + for rector in sorted(rector_d11_projects.keys()): + projects = sorted(rector_d11_projects[rector]) + lines.append(f"### {rector}") + if projects: + for p in projects: + short = p.replace("project/", "") + lines.append(f"- [{short}](https://www.drupal.org/project/{short})") + else: + lines.append("- *(no D11 contrib modules found)*") + lines.append("") + + # Rectors with no hits at all + all_rectors = set() + for rector, hits in rector_hits.items(): + all_rectors.add(rector) + for rector in sorted(all_rectors - set(rector_d11_projects.keys())): + lines.append(f"### {rector}") + lines.append("- *(no hits)*") + lines.append("") + + lines += [ + "---", + "", + "## By Module (modules covering multiple rectors)", + "", + ] + + multi = {p: rs for p, rs in project_rectors.items() if len(rs) > 1} + for pname in sorted(multi.keys(), key=lambda p: -len(multi[p])): + short = pname.replace("project/", "") + rectors = multi[pname] + lines.append(f"### [{short}](https://www.drupal.org/project/{short}) — {len(rectors)} rectors") + for r in sorted(rectors): + lines.append(f"- {r}") + lines.append("") + + md = "\n".join(lines) + out = "docs/contrib-modules-d11.md" + with open(out, "w") as f: + f.write(md) + print(f"\nWrote {out}", file=sys.stderr) + print(md) + + +if __name__ == "__main__": + main() diff --git a/docs/filter_progress.log b/docs/filter_progress.log new file mode 100644 index 000000000..d6568660f --- /dev/null +++ b/docs/filter_progress.log @@ -0,0 +1,1228 @@ +Checking 1223 projects for D11 support... + [1/1223] project/pt-br + [2/1223] project/livediscussions + [3/1223] project/pushbutton_phptemplate + [4/1223] project/bg + [5/1223] project/mail_archive + [6/1223] project/sitemenu + [7/1223] project/binder + [8/1223] project/gladcamp + [9/1223] project/contact_dir + [10/1223] project/advcache + [11/1223] project/pmetrics + [12/1223] project/xcache + [13/1223] project/cache_disable + [14/1223] project/cacherouter + [15/1223] project/latest_members + [16/1223] project/eventbrite + [17/1223] project/querypath + [18/1223] project/qpservices + [19/1223] project/cache_actions + [20/1223] project/virtual_roles + [21/1223] project/media_ustream + [22/1223] project/max_age + [23/1223] project/block2field + [24/1223] project/cache_heuristic + [25/1223] project/cache_graceful + [26/1223] project/deds_client + [27/1223] project/corporative_site + [28/1223] project/b2b_store_solution + [29/1223] project/onepagecv + [30/1223] project/cachetags + [31/1223] project/amazon_import + [32/1223] project/shareaholic + [33/1223] project/booking_com_api + [34/1223] project/search_api_acquia + [35/1223] project/fetcher + [36/1223] project/memory_profiler + [37/1223] project/session_cache + [38/1223] project/userpickit + [39/1223] project/dynamodb + [40/1223] project/memcache_storage + [41/1223] project/entity_lister + [42/1223] project/context_cache + [43/1223] project/social_comments + [44/1223] project/site_search_analytics + [45/1223] project/reevoomark + [46/1223] project/enhanced_page_cache + [47/1223] project/wunderground_weather + [48/1223] project/at_base + [49/1223] project/visitorsvoice + [50/1223] project/cove_api + [51/1223] project/staticfilecache + [52/1223] project/qui + [53/1223] project/wincachedrupal + [54/1223] project/go1_base + [55/1223] project/quandl + [56/1223] project/social_feed_field + [57/1223] project/selective_tweets + [58/1223] project/orghunter + [59/1223] project/era + [60/1223] project/couchbasedrupal + [61/1223] project/riddle_marketplace + [62/1223] project/apcu + [63/1223] project/cision_block + [64/1223] project/sendinblue_rules + [65/1223] project/ovh + [66/1223] project/rss_embed_field + [67/1223] ✓ project/feed_block + [68/1223] project/wsdata + [69/1223] project/dvg_stuf_bg + [70/1223] ✓ project/spambot + [71/1223] project/usajobs_integration + [72/1223] project/dvg_appointments + [73/1223] ✓ project/wisski + [74/1223] project/js_entity + [75/1223] ✓ project/commercetools + [76/1223] project/social_media_api + [77/1223] ✓ project/cmrf_form_processor + [78/1223] ✓ project/cmrf_core + [79/1223] project/audit_report + [80/1223] ✓ project/menu_parser_php + [81/1223] ✓ project/vcp4dates + [82/1223] project/ct_expire + [83/1223] ✓ project/views_dependent_filters + [84/1223] project/sqlsrv + [85/1223] ✓ project/sparql_entity_storage + [86/1223] ✓ project/civicrm_entity + [87/1223] ✓ project/acsf + [88/1223] ✓ project/smart_migrate_cli + [89/1223] project/mollom + [90/1223] project/cache_browser + [91/1223] project/casaa + [92/1223] project/distro + [93/1223] project/freeagent + [94/1223] project/context_admin + [95/1223] project/winners + [96/1223] project/qfield + [97/1223] project/mb + [98/1223] project/backup_migrate_dropbox + [99/1223] ✓ project/dns + [100/1223] project/profile_setup_api + [101/1223] project/openid_sso_provider + [102/1223] project/devshop_hosting + [103/1223] project/panels_frame + [104/1223] project/wildfire + [105/1223] project/mpub + [106/1223] ✓ project/config_split + [107/1223] ✓ project/bynder + [108/1223] project/views_ajax_form + [109/1223] project/bynder_orbit + [110/1223] project/mustache_templates + [111/1223] ✓ project/community_tasks + [112/1223] project/odoo_api + [113/1223] ✓ project/views_advanced_cache + [114/1223] project/salesforce_auth + [115/1223] ✓ project/og + [116/1223] project/authcache + [117/1223] ✓ project/deploy_key + [118/1223] ✓ project/swagger_ui_formatter + [119/1223] project/d6lts + [120/1223] project/lightning_workflow + [121/1223] project/apigee_edge + [122/1223] ✓ project/searchstax + [123/1223] ✓ project/checklistapi + [124/1223] project/stratoserp + [125/1223] project/monster_menus + [126/1223] ✓ project/salesforce + [127/1223] ✓ project/cloud + [128/1223] project/aeg + [129/1223] project/govimentum + [130/1223] ✓ project/language_suggestion + [131/1223] project/drupalru_d7 + [132/1223] project/entity_reference_preview + [133/1223] ✓ project/eu_cookie_compliance_rocketship + [134/1223] project/ubershopwish + [135/1223] project/fmrest + [136/1223] project/stackla_widget + [137/1223] ✓ project/mailchimp_transactional + [138/1223] project/testproject4234 + [139/1223] project/entity_references_map + [140/1223] ✓ project/trailless_menu + [141/1223] project/widen_media + [142/1223] ✓ project/vwo + [143/1223] project/loop_workers + [144/1223] ✓ project/granulartimecache + [145/1223] ✓ project/engaging_networks + [146/1223] ✓ project/entity_usage_updater + [147/1223] ✓ project/pantheon_autopilot_toolbar + [148/1223] ✓ project/social_auth_entra_id + [149/1223] ✓ project/override_cache_control_headers + [150/1223] project/json_drop_api + [151/1223] ✓ project/sdx + [152/1223] ✓ project/search_api_postgresql + [153/1223] ✓ project/open_vocabularies + [154/1223] ✓ project/chromeless + [155/1223] ✓ project/rail_ai_provider + [156/1223] ✓ project/youtube_live_video + [157/1223] ✓ project/ffmpeg_media + [158/1223] project/drupal_devkit + [159/1223] project/bear_skin + [160/1223] ✓ project/canvas + [161/1223] project/patternlab + [162/1223] project/emulsify + [163/1223] project/kashmir + [164/1223] project/sketch + [165/1223] project/flexi_pattern_lab + [166/1223] project/potion + [167/1223] ✓ project/entity_import + [168/1223] ✓ project/search_api + [169/1223] ✓ project/search_api_autocomplete + [170/1223] ✓ project/search_api_saved_searches + [171/1223] ✓ project/tranc + [172/1223] project/core_logs + [173/1223] ✓ project/experience_builder + [174/1223] project/onepage + [175/1223] project/1087726 + [176/1223] project/redhen_demo + [177/1223] project/rebuild + [178/1223] project/ddcla + [179/1223] project/transcribe_distribution + [180/1223] project/restaurant + [181/1223] project/tr_kurulum + [182/1223] project/tb_blog_starter + [183/1223] project/tb_events_starter + [184/1223] project/tb_hadelis_starter + [185/1223] project/tb_methys_starter + [186/1223] project/tb_mollise_starter + [187/1223] project/tb_neris_starter + [188/1223] project/tb_palicico_starter + [189/1223] project/tb_purity_starter + [190/1223] project/tb_rave_starter + [191/1223] project/tb_sirate_starter + [192/1223] project/open_badging_installation_profile + [193/1223] project/sauce + [194/1223] project/mobilearkickstart + [195/1223] project/spanish_distribution + [196/1223] project/fuse + [197/1223] project/govbr + [198/1223] project/qurandistribution + [199/1223] project/redhen_raiser + [200/1223] project/development + [201/1223] project/gp_reviews + [202/1223] project/pankm + [203/1223] project/byu_installation_profile + [204/1223] ✓ project/group + [205/1223] ✓ project/ginvite + [206/1223] ✓ project/gnode_request + [207/1223] project/whereabouts + [208/1223] project/group_entity + [209/1223] project/tiendaparamipyme + [210/1223] ✓ project/metatag + [211/1223] ✓ project/comment_mover + [212/1223] project/flatcomments + [213/1223] project/openlayers + [214/1223] project/service_container + [215/1223] ✓ project/indieweb + [216/1223] project/project_issue + [217/1223] project/zen + [218/1223] project/rdf + [219/1223] project/advanced_forum + [220/1223] project/comment_perm + [221/1223] project/genesis + [222/1223] project/adaptivetheme + [223/1223] project/html5_boilerplate + [224/1223] project/nucleus + [225/1223] project/lc3_clean + [226/1223] project/comment_goodness + [227/1223] project/drupalace + [228/1223] project/twentyeleven + [229/1223] project/node_notify + [230/1223] project/md_foto + [231/1223] project/comment_fragment + [232/1223] project/twbs + [233/1223] project/stacksight + [234/1223] project/oa_basetheme + [235/1223] project/techsupport + [236/1223] project/tsm + [237/1223] project/jats_generator + [238/1223] project/idea + [239/1223] ✓ project/social + [240/1223] project/easy_booking + [241/1223] project/jsonapi_comment + [242/1223] ✓ project/gadget + [243/1223] ✓ project/deprecation_status + [244/1223] project/tinymce + [245/1223] project/bueditor + [246/1223] ✓ project/video_filter + [247/1223] project/cdn + [248/1223] project/editor + [249/1223] ✓ project/markdown + [250/1223] project/translation_management + [251/1223] project/imageeditor + [252/1223] ✓ project/video_embed_field + [253/1223] project/ole + [254/1223] project/wysiwyg_ckeditor + [255/1223] project/contextly + [256/1223] ✓ project/quickedit + [257/1223] ✓ project/url_embed + [258/1223] ✓ project/editor_advanced_link + [259/1223] project/editor_ckeditor_widgets + [260/1223] project/wysiwyg_trumbowyg + [261/1223] ✓ project/synimage + [262/1223] project/ckeditor_config + [263/1223] ✓ project/inline_formatter_field + [264/1223] ✓ project/entity_embed + [265/1223] ✓ project/ckeditor_mentions + [266/1223] project/boxout + [267/1223] ✓ project/flmngr + [268/1223] ✓ project/ckeditor_codemirror + [269/1223] ✓ project/depcalc + [270/1223] ✓ project/editor_advanced_image + [271/1223] ✓ project/wxt + [272/1223] ✓ project/openfed + [273/1223] project/ckeditor_uploadimage + [274/1223] ✓ project/acquia_contenthub + [275/1223] project/decoupled + [276/1223] project/inline_image_token + [277/1223] project/ckeditor_exclude_tags + [278/1223] project/ezcontent_publish + [279/1223] project/grapesjs_editor + [280/1223] project/learnosity + [281/1223] project/ckeditor_custom_paste_filters + [282/1223] ✓ project/acquia_dam + [283/1223] ✓ project/address_suggestion + [284/1223] ✓ project/ckeditor5_premium_features + [285/1223] project/ckeditor5_highlight + [286/1223] ✓ project/ckeditor5_mentions + [287/1223] ✓ project/visual_editor + [288/1223] ✓ project/ckeditor5_spoiler + [289/1223] ✓ project/txt42 + [290/1223] ✓ project/ckeditor_lts + [291/1223] ✓ project/edit_plus + [292/1223] ✓ project/ckeditor_braille + [293/1223] ✓ project/ckeditor5_plugin_pack + [294/1223] ✓ project/ckeditor_historylog + [295/1223] ✓ project/ckeditor5_deepl + [296/1223] ✓ project/ai_ckeditor_extras + [297/1223] ✓ project/theme_file_editor + [298/1223] ✓ project/deepseek + [299/1223] ✓ project/smartlinker_ai + [300/1223] ✓ project/media_folders + [301/1223] ✓ project/dsfr4drupal_picker + [302/1223] ✓ project/toast_image_editor + [303/1223] ✓ project/module_file_editor + [304/1223] project/ckeditor5_scroll_fix + [305/1223] ✓ project/editor_advanced_table + [306/1223] ✓ project/ai_editoria11y + [307/1223] ✓ project/ai_agents_experimental_collection + [308/1223] ✓ project/token_browser_plus + [309/1223] ✓ project/flo + [310/1223] ✓ project/custom_paragraphs + [311/1223] project/content_browser + [312/1223] project/berf + [313/1223] ✓ project/paragraphs_summary + [314/1223] project/entity_reference_override + [315/1223] ✓ project/entity_overlay + [316/1223] project/entity_browser_block + [317/1223] project/field_pager + [318/1223] ✓ project/entity_reference_ajax_formatter + [319/1223] ✓ project/entity_list + [320/1223] project/multi_render_formatter + [321/1223] ✓ project/dynamic_entity_reference + [322/1223] ✓ project/tripal + [323/1223] project/df + [324/1223] ✓ project/rocketship_core + [325/1223] ✓ project/gutenberg + [326/1223] ✓ project/link_field_display_mode_formatter + [327/1223] project/revisiondiff + [328/1223] project/entity_reference_dynamic_display + [329/1223] project/entity_reference_views_backfill + [330/1223] ✓ project/nested_entity_reference_formatter + [331/1223] ✓ project/external_entity + [332/1223] ✓ project/custom_field + [333/1223] ✓ project/view_mode_crop + [334/1223] project/image_as_media + [335/1223] ✓ project/seb + [336/1223] ✓ project/datafield + [337/1223] project/rest_entity_display + [338/1223] ✓ project/published_referenced_entity + [339/1223] project/more_fields + [340/1223] ✓ project/rendred_entity_list_formatter + [341/1223] ✓ project/rendered_entity_list_formatter + [342/1223] ✓ project/layout_builder_formatter + [343/1223] project/fieldgroup + [344/1223] project/fieldgroup_table + [345/1223] project/cck_fieldgroup_tabs + [346/1223] project/hexagon + [347/1223] project/bundles + [348/1223] project/inherit + [349/1223] project/popups_subedit + [350/1223] project/aurigma + [351/1223] project/fieldtool + [352/1223] project/cck_inputs + [353/1223] project/cck_sync + [354/1223] project/profile_migrate + [355/1223] project/meetu + [356/1223] project/node_widget + [357/1223] project/acc + [358/1223] project/pirets + [359/1223] project/briefcase + [360/1223] project/content_type_exporter + [361/1223] project/content_display_order + [362/1223] project/field_or + [363/1223] project/cck_signup + [364/1223] project/imagefetchr + [365/1223] project/ct_plus + [366/1223] project/podgroups + [367/1223] project/volunteer_rally_features + [368/1223] project/donor_rally_features + [369/1223] project/commerce_fieldgroup_panes + [370/1223] project/microdata + [371/1223] project/dt + [372/1223] project/msnf + [373/1223] project/bundle_copy + [374/1223] project/fieldgroup_htabs + [375/1223] project/fieldgroup_callouts + [376/1223] project/cgpa_calculator + [377/1223] project/elms_features + [378/1223] project/voipuser + [379/1223] project/fieldgroup_placeholder + [380/1223] project/syndicator + [381/1223] project/field_group_ajaxified_multipage + [382/1223] project/bootstrap_fieldgroup + [383/1223] project/markaspot + [384/1223] project/field_group_save_button + [385/1223] project/componentize + [386/1223] project/bundle_copy_commerce + [387/1223] project/field_group_table_component + [388/1223] project/skillset_inview + [389/1223] ✓ project/sports_league + [390/1223] project/bundle_copy_profile2 + [391/1223] project/razoreye_biz + [392/1223] project/bif + [393/1223] project/simple_multistep + [394/1223] project/esm + [395/1223] project/field_group_label_classes + [396/1223] project/certificate + [397/1223] project/ULT + [398/1223] project/icn + [399/1223] project/abtestui + [400/1223] project/bahai_incubator + [401/1223] project/wim + [402/1223] ✓ project/field_group + [403/1223] ✓ project/ui_patterns_settings + [404/1223] project/jsonapi_example + [405/1223] project/inline_field_group + [406/1223] project/social_media_image_generator + [407/1223] ✓ project/field_group_vertical_tabs + [408/1223] project/uc_fedex + [409/1223] ✓ project/download_file + [410/1223] ✓ project/commerce_invoice + [411/1223] ✓ project/commerce_purchase_order + [412/1223] project/archibald + [413/1223] project/odir + [414/1223] ✓ project/cforge + [415/1223] project/erpal + [416/1223] project/node_field + [417/1223] project/1635422 + [418/1223] project/tmgmt_server + [419/1223] project/sshid + [420/1223] project/wf + [421/1223] project/fontello + [422/1223] project/endicia + [423/1223] project/icomoon + [424/1223] project/drupdates + [425/1223] project/bassets_sw + [426/1223] project/pathed_files + [427/1223] project/flipping_book + [428/1223] project/image_download_formatter + [429/1223] project/private_image_cache + [430/1223] project/git_book + [431/1223] project/yamlform + [432/1223] project/pdftemplate + [433/1223] project/reporting_cloud + [434/1223] project/rules_letter + [435/1223] project/node_revision_private_files_access_permission + [436/1223] project/temporary_download + [437/1223] project/dam + [438/1223] project/onetime_download + [439/1223] ✓ project/feeds + [440/1223] project/field_formatter_key_label + [441/1223] project/file_shelf + [442/1223] ✓ project/tmgmt + [443/1223] ✓ project/protected_file + [444/1223] ✓ project/file_entity + [445/1223] project/skilling + [446/1223] project/lingo24 + [447/1223] project/commerce_invoice_ubl + [448/1223] ✓ project/dxpr_builder + [449/1223] ✓ project/unpublished_file + [450/1223] ✓ project/git_wiki_help + [451/1223] ✓ project/media_icon_deliver + [452/1223] ✓ project/file_visibility + [453/1223] project/evaluation + [454/1223] project/module_grants + [455/1223] project/views_query_na_subquery + [456/1223] project/entity_gallery + [457/1223] ✓ project/view_usernames_node_author + [458/1223] project/snippets + [459/1223] project/family + [460/1223] project/drush + [461/1223] project/administration_notification + [462/1223] project/search_by_page + [463/1223] project/guidance + [464/1223] project/recruit + [465/1223] project/wysiwyg_fields + [466/1223] project/vinculum + [467/1223] project/rocketship + [468/1223] project/opigno_glossary + [469/1223] project/prh_search + [470/1223] project/latest + [471/1223] project/rio + [472/1223] project/drupal_wall + [473/1223] project/civicrm_event_receipts + [474/1223] project/social_content + [475/1223] project/og_groupcontent + [476/1223] project/administrative_help + [477/1223] project/commune + [478/1223] project/commerce_behat + [479/1223] project/experd + [480/1223] project/display_machine_name + [481/1223] project/smartparticipation + [482/1223] project/external_page_redirect + [483/1223] project/automatic_field_saver + [484/1223] project/smartling + [485/1223] project/cultura + [486/1223] project/votingapi + [487/1223] project/closedquestion_scoreboard + [488/1223] ✓ project/tome + [489/1223] project/ctools + [490/1223] project/lingotek + [491/1223] project/virtualcare + [492/1223] project/druvel + [493/1223] ✓ project/feedstextareafetcher + [494/1223] ✓ project/sva + [495/1223] ✓ project/rdf_sync + [496/1223] ✓ project/ai_eca + [497/1223] project/drupal_cli + [498/1223] project/indexpage + [499/1223] project/question + [500/1223] project/node_clone + [501/1223] project/twitter + [502/1223] project/util + [503/1223] project/mmedia + [504/1223] project/subdomain + [505/1223] project/autotag + [506/1223] project/fast_gallery + [507/1223] project/nodetypeviews + [508/1223] project/admin_notify + [509/1223] project/fbconnect + [510/1223] ✓ project/addanother + [511/1223] project/googlenews + [512/1223] ✓ project/collection + [513/1223] project/simplenews_content_selection + [514/1223] project/languageassign + [515/1223] ✓ project/custom_search + [516/1223] project/revision_all + [517/1223] project/views_content_cache + [518/1223] project/nopremium + [519/1223] project/openscholar_vsite + [520/1223] project/references + [521/1223] project/node_gallery_bulk_operations + [522/1223] project/node_gallery_taxonomy + [523/1223] project/merci_signup + [524/1223] project/merci_barcode_labels + [525/1223] project/sharebar + [526/1223] project/colors + [527/1223] project/field_weight + [528/1223] project/meerkat + [529/1223] project/views_node_access + [530/1223] project/nodeaccesskeys + [531/1223] project/pager_for_content_type + [532/1223] project/drupalgap + [533/1223] project/comment_easy_reply + [534/1223] ✓ project/html_title + [535/1223] project/move_user + [536/1223] project/ajaxnewcounter + [537/1223] project/simpleantispam + [538/1223] project/factorydrone + [539/1223] project/blurry + [540/1223] project/content_access_view + [541/1223] project/uyan + [542/1223] project/og_admin_block + [543/1223] project/commons_migration + [544/1223] project/og_menu_single + [545/1223] project/content_trust + [546/1223] project/openpolitic + [547/1223] project/user_content_type + [548/1223] project/inspector + [549/1223] project/socialshare + [550/1223] project/multipage_navigation + [551/1223] project/persistent_menu_items + [552/1223] project/ajax_node_loader + [553/1223] project/codebook_core + [554/1223] project/codebook_print_pdf + [555/1223] project/form_default_button + [556/1223] project/simple_nodeblock + [557/1223] ✓ project/copyscape + [558/1223] project/oa_wizard + [559/1223] project/readmore_ajax + [560/1223] project/csf + [561/1223] project/usercancel_contentassigntoadmin + [562/1223] project/taxonomy_linking + [563/1223] project/taxonomy_autolink + [564/1223] project/node_title_help_text + [565/1223] project/update_external_links + [566/1223] project/contentassigntootheruser + [567/1223] project/hierarchical_select_access + [568/1223] project/basic_stats_token + [569/1223] project/stop_broken_link_in_body + [570/1223] project/anonymous_subscriptions + [571/1223] ✓ project/find_text + [572/1223] project/customizable_entities + [573/1223] project/npop + [574/1223] project/updated + [575/1223] project/admin_toolbar_content_languages + [576/1223] project/transfer_user_content + [577/1223] project/baidumap_fieldtype + [578/1223] project/node_creator_system_details + [579/1223] project/domain_video_sitemap + [580/1223] project/acal + [581/1223] ✓ project/rsvp_list + [582/1223] project/node_creation_links + [583/1223] project/skyword + [584/1223] project/communications + [585/1223] ✓ project/page_menu_reorder + [586/1223] project/node_menu_item_visibility_default_behaviour + [587/1223] project/user_delete_reassign + [588/1223] project/tide_core + [589/1223] project/tide_api + [590/1223] project/auto_nodetitle + [591/1223] project/project + [592/1223] project/filebrowser + [593/1223] ✓ project/token + [594/1223] ✓ project/read_time + [595/1223] ✓ project/quick_node_clone + [596/1223] project/hold_my_draft + [597/1223] ✓ project/edit_content_type_tab + [598/1223] project/campaignion + [599/1223] project/openpublic + [600/1223] ✓ project/entity_translation_unified_form + [601/1223] ✓ project/ds + [602/1223] project/pp_graphsearch + [603/1223] project/simply_signups + [604/1223] project/markdown_exporter + [605/1223] project/content_admin_tools + [606/1223] project/backdrop_upgrade_status + [607/1223] ✓ project/rsvplist + [608/1223] project/node_randomizer + [609/1223] project/public_revisions + [610/1223] ✓ project/node_singles + [611/1223] project/entity_sort + [612/1223] ✓ project/reassign_user_content + [613/1223] project/tracker + [614/1223] ✓ project/link_description_attributes + [615/1223] ✓ project/entity_reference_edit_link + [616/1223] ✓ project/duplicate_node + [617/1223] ✓ project/micronode_block + [618/1223] ✓ project/secure_nodes + [619/1223] ✓ project/content_dependency_graph + [620/1223] project/bitcache + [621/1223] project/accessible + [622/1223] project/storage_api + [623/1223] project/oracle + [624/1223] project/dbtng + [625/1223] project/styles + [626/1223] project/d7 + [627/1223] project/mongodb_dbtng + [628/1223] project/menu_minipanels + [629/1223] ✓ project/hubspot + [630/1223] project/survey_builder + [631/1223] project/relation_add + [632/1223] project/opac + [633/1223] project/autoslave + [634/1223] project/paddle_menu_manager + [635/1223] project/visitor_actions + [636/1223] project/mysql_async + [637/1223] project/sqlbuddy + [638/1223] project/contact_centre + [639/1223] project/amber + [640/1223] project/scoopit + [641/1223] project/multitype_slider + [642/1223] project/entity_translation + [643/1223] project/maps_suite + [644/1223] ✓ project/gdpr + [645/1223] project/media_migration + [646/1223] project/imotilux + [647/1223] project/gtfs + [648/1223] ✓ project/commerce_store_override + [649/1223] project/ms_react + [650/1223] ✓ project/arch + [651/1223] project/tweet_reference + [652/1223] project/acquia_migrate + [653/1223] project/lgpd + [654/1223] project/entitree + [655/1223] project/rating_list + [656/1223] ✓ project/social_auth_buttons + [657/1223] project/field_completeness + [658/1223] project/gtfs_511 + [659/1223] project/gtfs_rt + [660/1223] project/gtfs_geo + [661/1223] project/payment_button_drupal_plugin + [662/1223] project/ayrshare + [663/1223] ✓ project/tmgmt_smartcat + [664/1223] project/video_toolbox + [665/1223] ✓ project/sgd_user_status + [666/1223] ✓ project/sgd_watchdog_summary + [667/1223] ✓ project/smileys_field + [668/1223] ✓ project/mail_box_management + [669/1223] ✓ project/book_library_api + [670/1223] ✓ project/track_usage + [671/1223] ✓ project/babel + [672/1223] ✓ project/graphql_shield + [673/1223] ✓ project/livre + [674/1223] ✓ project/conreg + [675/1223] ✓ project/junk_drawer + [676/1223] ✓ project/ai_schemadotorg_jsonld + [677/1223] ✓ project/schemadotorg + [678/1223] project/session_limit + [679/1223] ✓ project/activity + [680/1223] ✓ project/restrict_by_ip + [681/1223] project/tupas + [682/1223] ✓ project/recently_read + [683/1223] project/commerce_qb_webconnect + [684/1223] project/xing_connect + [685/1223] project/saml_idp + [686/1223] project/big_pipe_demo + [687/1223] project/csv_to_config + [688/1223] ✓ project/bulk_update_fields + [689/1223] ✓ project/quicker_login + [690/1223] project/examplelist + [691/1223] ✓ project/page_hits + [692/1223] ✓ project/change_author_action + [693/1223] project/real_estate_lp_profile + [694/1223] ✓ project/node_export + [695/1223] project/mailing_list + [696/1223] project/userswitch + [697/1223] project/bulk_update_fields_commerce + [698/1223] ✓ project/bulk_copy_fields + [699/1223] project/login_alert + [700/1223] project/simple_node_importer + [701/1223] project/global_gateway + [702/1223] ✓ project/facebook_pixel + [703/1223] project/registration_form + [704/1223] project/tmgmt_smartling + [705/1223] project/questions_answers + [706/1223] project/eid_auth + [707/1223] project/smartid_auth + [708/1223] ✓ project/brightcove + [709/1223] ✓ project/devel + [710/1223] ✓ project/rules + [711/1223] project/evangelische_termine + [712/1223] ✓ project/entity_visibility_preview + [713/1223] project/eus + [714/1223] project/admin_can_login_anyuser + [715/1223] ✓ project/cookie_samesite_support + [716/1223] project/entity_sync + [717/1223] ✓ project/oidc + [718/1223] ✓ project/oidc_mcpf + [719/1223] project/bing_ads + [720/1223] ✓ project/anonymoussession + [721/1223] project/commerce_ticketing_checkin + [722/1223] ✓ project/session_inspector + [723/1223] project/acumatica + [724/1223] ✓ project/kamihaya_cms + [725/1223] project/entity_sync_odata + [726/1223] project/twilio_otp_login + [727/1223] project/cm_data_layer + [728/1223] ✓ project/session_management + [729/1223] ✓ project/loginnotification + [730/1223] ✓ project/externalauth_force + [731/1223] project/logout_timeout + [732/1223] ✓ project/simpleavs + [733/1223] ✓ project/stenographer + [734/1223] ✓ project/user_logout + [735/1223] ✓ project/drupal_saml_bridge + [736/1223] project/xmpp_server + [737/1223] project/cache + [738/1223] project/jp_mobile + [739/1223] project/session_proxy + [740/1223] project/drupalcon_base + [741/1223] project/kalvi_core + [742/1223] project/chatwee + [743/1223] project/events_features + [744/1223] project/casperjs + [745/1223] project/soauth + [746/1223] ✓ project/session_entity + [747/1223] ✓ project/drd + [748/1223] ✓ project/views_extras + [749/1223] project/delphi + [750/1223] ✓ project/intercept + [751/1223] ✓ project/telega + [752/1223] project/cypress + [753/1223] project/commerce7_razorpay + [754/1223] project/eventbrite_one_way_sync + [755/1223] ✓ project/simplesamlphp_sp + [756/1223] project/drupal_canvas_plugin + [757/1223] ✓ project/audit + [758/1223] project/smartcache + [759/1223] project/css_gzip + [760/1223] project/css_emimage + [761/1223] project/cf + [762/1223] project/barracuda + [763/1223] project/vagrant + [764/1223] project/octopus + [765/1223] project/novalnet + [766/1223] project/mongodrop + [767/1223] project/hpcloud + [768/1223] project/bundle_aggregation + [769/1223] project/ads + [770/1223] project/simple_aggregation + [771/1223] project/openstack_storage + [772/1223] ✓ project/settingsphp + [773/1223] project/flysystem + [774/1223] project/domain_wise_aggregation + [775/1223] project/devinci + [776/1223] project/dawn + [777/1223] project/tmgmt_transifex + [778/1223] ✓ project/background_image + [779/1223] project/timber + [780/1223] ✓ project/bootstrap4 + [781/1223] project/advagg + [782/1223] project/infrastructure + [783/1223] project/exsen + [784/1223] project/d_test + [785/1223] ✓ project/bootstrap5 + [786/1223] project/drupalsqlsrvci + [787/1223] project/stage_one_theme + [788/1223] ✓ project/tone + [789/1223] project/denver + [790/1223] project/zeropoint + [791/1223] project/adt_basetheme + [792/1223] project/onus + [793/1223] project/mobile_jquery + [794/1223] project/arctica + [795/1223] project/black_hole + [796/1223] project/aether + [797/1223] project/portal_theme + [798/1223] project/abc + [799/1223] project/berry + [800/1223] project/browsersync + [801/1223] project/scholarly_lite + [802/1223] project/glazed_free + [803/1223] project/agov_base + [804/1223] project/showcase_lite + [805/1223] project/green_theme + [806/1223] project/byu_theme + [807/1223] project/belle + [808/1223] project/plus + [809/1223] project/yg_booster + [810/1223] project/yg_charity + [811/1223] project/yg_flew + [812/1223] project/corporate_lite + [813/1223] project/yg_business_plus + [814/1223] project/yg_business_line + [815/1223] project/yg_medical + [816/1223] project/conference_lite + [817/1223] project/guesthouse_lite + [818/1223] project/yg_aesthetic + [819/1223] project/yg_hotel + [820/1223] project/yg_medicare + [821/1223] project/yg_iconic + [822/1223] project/yg_law_firm + [823/1223] project/yg_creative + [824/1223] project/yg_solid + [825/1223] project/yg_black + [826/1223] project/materialize + [827/1223] project/crypto_distribution + [828/1223] ✓ project/tara + [829/1223] ✓ project/mili + [830/1223] project/minimal_lite + [831/1223] project/stack_dd + [832/1223] project/catalog_lite + [833/1223] ✓ project/bootstrap_italia + [834/1223] project/elegant_showcase + [835/1223] ✓ project/zuvi + [836/1223] project/tactic + [837/1223] ✓ project/vani + [838/1223] ✓ project/dxpr_theme + [839/1223] project/zinble + [840/1223] project/photogenictheme + [841/1223] project/dolphin_theme + [842/1223] ✓ project/edux + [843/1223] ✓ project/ruhi + [844/1223] project/mycity + [845/1223] project/ajans + [846/1223] project/commerce_factuursturen + [847/1223] project/eau_theme + [848/1223] project/edwt + [849/1223] ✓ project/xara + [850/1223] project/creative_innovative + [851/1223] project/particles_orange + [852/1223] project/dark_awesome + [853/1223] project/cellular4drupal + [854/1223] ✓ project/dsfr + [855/1223] project/idyllic + [856/1223] project/dark_page + [857/1223] project/smash_lite + [858/1223] ✓ project/marvelous + [859/1223] project/fashion_beauty + [860/1223] ✓ project/mahi + [861/1223] project/power_portfolio + [862/1223] ✓ project/kart + [863/1223] project/potent_allure + [864/1223] project/rhythm + [865/1223] project/harmony_haven + [866/1223] project/novel_delights + [867/1223] project/decorx + [868/1223] project/diner_delights + [869/1223] project/business_dev + [870/1223] project/multi_purpose + [871/1223] project/animal_shelter + [872/1223] project/feature_boost + [873/1223] ✓ project/pets_clinic + [874/1223] project/lgms + [875/1223] ✓ project/diba_clean + [876/1223] ✓ project/bootstrap3 + [877/1223] ✓ project/nava + [878/1223] ✓ project/saar + [879/1223] ✓ project/uni + [880/1223] ✓ project/synonyms + [881/1223] project/field + [882/1223] ✓ project/role_inheritance + [883/1223] project/turbo + [884/1223] ✓ project/monitoring + [885/1223] project/services_session_token_auth + [886/1223] ✓ project/clu + [887/1223] project/program + [888/1223] project/complex_workflow + [889/1223] project/dbee + [890/1223] ✓ project/riddler + [891/1223] project/acquia_commercemanager + [892/1223] project/controller_annotations + [893/1223] ✓ project/miniorange_oauth_client + [894/1223] ✓ project/apigee_m10n + [895/1223] project/restful + [896/1223] project/probo + [897/1223] project/paddle_selenium_tests + [898/1223] project/lw_groups + [899/1223] project/neon_api + [900/1223] project/publisso_gold + [901/1223] project/acquia_perz + [902/1223] project/scorm_field + [903/1223] ✓ project/acquia_vwo + [904/1223] ✓ project/drupalfit + [905/1223] ✓ project/search_api_exclude_lb + [906/1223] ✓ project/entity_mesh + [907/1223] ✓ project/drupal_content_repository + [908/1223] project/related_content + [909/1223] ✓ project/quicktabs + [910/1223] project/featured_content + [911/1223] project/nodereference_basket + [912/1223] project/feeds_view_parser + [913/1223] project/internet_archive + [914/1223] project/hose_xml + [915/1223] project/highcharts + [916/1223] project/sensor_hub + [917/1223] project/taxonomy_display + [918/1223] project/student_signup + [919/1223] project/prometheus + [920/1223] project/rules_example + [921/1223] project/time_tracker_simple + [922/1223] project/product_reference_view + [923/1223] project/shopcart + [924/1223] project/featured_news_feature + [925/1223] project/manymail + [926/1223] project/entityform + [927/1223] project/deeplink + [928/1223] project/commerce_payleap + [929/1223] project/pdfck + [930/1223] project/openbadging + [931/1223] project/courseplanner + [932/1223] project/background_audio + [933/1223] project/feeds_tamper_string2id + [934/1223] project/at_theming + [935/1223] project/ctools_view_access + [936/1223] project/xml_export + [937/1223] project/eform + [938/1223] project/oa_folders + [939/1223] project/hunter + [940/1223] project/yaqut_epub_generator + [941/1223] project/wechat_views + [942/1223] project/commerce_checkout_products_list + [943/1223] project/ectostar_standard + [944/1223] project/proconcom + [945/1223] project/abookings + [946/1223] project/drupal_extra + [947/1223] ✓ project/sshop + [948/1223] project/simple_sitemap_views + [949/1223] project/qtools_common + [950/1223] ✓ project/twig_tweak + [951/1223] project/vfd + [952/1223] ✓ project/api + [953/1223] project/content_packager + [954/1223] project/openstory + [955/1223] project/gathercontent + [956/1223] project/ercore + [957/1223] project/dvg + [958/1223] project/views + [959/1223] project/outlayer + [960/1223] project/degov + [961/1223] ✓ project/simple_sitemap + [962/1223] ✓ project/viewfield + [963/1223] project/facet_granular_date + [964/1223] project/conference_suite + [965/1223] project/delivery + [966/1223] ✓ project/knowledge + [967/1223] ✓ project/next_views_entity_reference + [968/1223] project/socialblue + [969/1223] ✓ project/abinbev_gmap + [970/1223] ✓ project/simple_sitemap_authenticated + [971/1223] ✓ project/calendar + [972/1223] ✓ project/trash + [973/1223] ✓ project/views_exclude_previous + [974/1223] project/heartbeat + [975/1223] project/visitors + [976/1223] ✓ project/views_natural_sort + [977/1223] ✓ project/views_linkarea + [978/1223] project/relation + [979/1223] project/recurly + [980/1223] project/visualization + [981/1223] ✓ project/past + [982/1223] project/visualization_d8 + [983/1223] ✓ project/views_selective_filters + [984/1223] project/quick_pages + [985/1223] ✓ project/grant + [986/1223] project/migrate_views + [987/1223] project/chartjs + [988/1223] project/discussions + [989/1223] project/rel_content + [990/1223] project/dut + [991/1223] project/entity_domain_access + [992/1223] ✓ project/tally + [993/1223] ✓ project/friendship + [994/1223] ✓ project/lms + [995/1223] project/template_entities + [996/1223] project/entity_grants + [997/1223] ✓ project/islandora + [998/1223] ✓ project/entity_hierarchy + [999/1223] project/custom_list + [1000/1223] ✓ project/workbench_moderation + [1001/1223] ✓ project/entity_reference_uuid + [1002/1223] ✓ project/views_entity_embed + [1003/1223] project/shopify + [1004/1223] ✓ project/config_pages + [1005/1223] project/opigno_learning_path + [1006/1223] ✓ project/translation_views + [1007/1223] ✓ project/tmgmt_deepl + [1008/1223] ✓ project/plugin + [1009/1223] project/rng + [1010/1223] ✓ project/entityqueue + [1011/1223] ✓ project/private_message + [1012/1223] ✓ project/thunder + [1013/1223] ✓ project/geolocation + [1014/1223] ✓ project/cms_content_sync + [1015/1223] ✓ project/bat + [1016/1223] project/communication + [1017/1223] ✓ project/muser + [1018/1223] project/pub_options + [1019/1223] ✓ project/meta_entity + [1020/1223] ✓ project/moderation_team + [1021/1223] project/hubspot_integration + [1022/1223] project/ezcontent_api + [1023/1223] project/untatu + [1024/1223] project/dplor + [1025/1223] ✓ project/ggroup + [1026/1223] ✓ project/taxonomy_parents_index + [1027/1223] ✓ project/multilingual_plus + [1028/1223] project/opendevportal + [1029/1223] ✓ project/basket + [1030/1223] ✓ project/views_migration + [1031/1223] project/field_encrypt_searchable + [1032/1223] project/opigno_social + [1033/1223] ✓ project/views_override_viewmode + [1034/1223] ✓ project/usage_data + [1035/1223] project/content_moderation_node_grants + [1036/1223] project/entity_distribution + [1037/1223] ✓ project/group_domain + [1038/1223] ✓ project/media_filter + [1039/1223] project/access_policy + [1040/1223] project/social_group_types + [1041/1223] project/group_welcome_message + [1042/1223] ✓ project/views_moderation_state_weights + [1043/1223] project/group_media_library_extra + [1044/1223] project/social_lms_integrator + [1045/1223] project/views_sql_twig_fields + [1046/1223] ✓ project/nodehive_core + [1047/1223] project/service + [1048/1223] project/view_filter_promotion + [1049/1223] ✓ project/expirable_content + [1050/1223] ✓ project/diboo_core + [1051/1223] ✓ project/media_views_filter + [1052/1223] ✓ project/a12s_locations + [1053/1223] ✓ project/consent_management + [1054/1223] ✓ project/ai_agents + [1055/1223] ✓ project/mdp + [1056/1223] project/unused_files_delete + [1057/1223] ✓ project/unused_media_filter + [1058/1223] ✓ project/itunes_rss + [1059/1223] project/schema + [1060/1223] project/flow + [1061/1223] project/disable_modules + [1062/1223] project/hookalyzer + [1063/1223] project/console + [1064/1223] project/hooks + [1065/1223] project/rocket_chat + [1066/1223] ✓ project/confi + [1067/1223] project/message_private + [1068/1223] project/pki_ra + [1069/1223] project/commerce_currency_switcher + [1070/1223] project/entity_keyvalue + [1071/1223] project/social_media_integration + [1072/1223] project/message_thread + [1073/1223] project/domain_simple_sitemap + [1074/1223] project/ppoidc + [1075/1223] project/auto_alter + [1076/1223] ✓ project/image_moderate + [1077/1223] project/hook_manager + [1078/1223] project/social_post_video + [1079/1223] ✓ project/client_config_care + [1080/1223] project/social_auth_itsme + [1081/1223] project/module_maker + [1082/1223] project/config_entity_revisions + [1083/1223] ✓ project/mutual_credit + [1084/1223] project/slack_receive + [1085/1223] ✓ project/autosave_form + [1086/1223] ✓ project/onlyone + [1087/1223] ✓ project/contacts + [1088/1223] project/social_hub + [1089/1223] ✓ project/languagefield + [1090/1223] project/multiversion + [1091/1223] project/lightning_core + [1092/1223] project/lightning_layout + [1093/1223] project/nbox + [1094/1223] ✓ project/simplifying + [1095/1223] project/gearbox + [1096/1223] project/audit_monitoring + [1097/1223] project/views_extender + [1098/1223] ✓ project/nodeinfo + [1099/1223] ✓ project/pager_serializer + [1100/1223] project/sitemorse_lite + [1101/1223] project/workflow_extras + [1102/1223] project/file_update + [1103/1223] ✓ project/licenses + [1104/1223] project/layoutcomponents + [1105/1223] project/eventer + [1106/1223] project/simple_oauth_facebook_connect + [1107/1223] project/entity_track + [1108/1223] project/simple_oauth_google_connect + [1109/1223] project/robolytix + [1110/1223] project/rmkv + [1111/1223] project/sanitize_pii + [1112/1223] ✓ project/date_augmenter + [1113/1223] ✓ project/worldmap + [1114/1223] project/toast_messages + [1115/1223] project/cookies_module_handler + [1116/1223] ✓ project/migrate_visualize + [1117/1223] project/hook_event + [1118/1223] project/sitewide_alerts + [1119/1223] project/social_auth_tiktok_decouple + [1120/1223] project/social_auth_apple_decouple + [1121/1223] project/uninstall_unexisting + [1122/1223] project/asset_autoload + [1123/1223] project/function_autoload + [1124/1223] ✓ project/test_helpers + [1125/1223] ✓ project/ws_event + [1126/1223] ✓ project/nostr_id_nip05 + [1127/1223] project/hook_profiler + [1128/1223] ✓ project/pwbi + [1129/1223] ✓ project/nitropack + [1130/1223] ✓ project/localist_drupal + [1131/1223] ✓ project/bibliocommons + [1132/1223] ✓ project/ai_upgrade_assistant + [1133/1223] ✓ project/schema_form + [1134/1223] ✓ project/orchestration + [1135/1223] project/inactive_user + [1136/1223] project/node_expire + [1137/1223] project/one_time_login + [1138/1223] project/brilliant_gallery + [1139/1223] project/settings_audit_log + [1140/1223] project/cache_backport + [1141/1223] project/node_announce + [1142/1223] project/context_date + [1143/1223] project/ua_cache_bypass + [1144/1223] project/engagement + [1145/1223] project/adbc + [1146/1223] project/random_weight + [1147/1223] project/wem + [1148/1223] project/commerce_booking + [1149/1223] project/geckoboard_push + [1150/1223] project/fts + [1151/1223] project/fluxservice + [1152/1223] project/optimizedb + [1153/1223] project/pax_content + [1154/1223] project/new_relic_insights + [1155/1223] project/db_remote + [1156/1223] project/acquia_search_config + [1157/1223] project/commerce_priceminister + [1158/1223] project/uc_abandoned + [1159/1223] project/quizz + [1160/1223] project/priority_queue + [1161/1223] project/commerce_order_reminder + [1162/1223] project/tagged_systemqueue + [1163/1223] project/future_nodes + [1164/1223] project/motionpoint + [1165/1223] project/supercache + [1166/1223] project/freshdesk_sso + [1167/1223] project/drush_async_api + [1168/1223] project/gitinfo + [1169/1223] project/uc_recently_viewed_products + [1170/1223] project/authtoken + [1171/1223] project/election + [1172/1223] project/amazon + [1173/1223] project/anonymous_publishing + [1174/1223] project/preserve_changed + [1175/1223] project/course + [1176/1223] project/performance_toolkit + [1177/1223] ✓ project/google_analytics_counter + [1178/1223] ✓ project/automatic_updates + [1179/1223] ✓ project/computed_field + [1180/1223] project/participatory_process + [1181/1223] project/clockify + [1182/1223] project/sri + [1183/1223] project/queue_scheduler + [1184/1223] project/ecwid + [1185/1223] project/variable + [1186/1223] project/ar + [1187/1223] ✓ project/tzfield + [1188/1223] project/almanac + [1189/1223] project/booking_timeslots + [1190/1223] project/makemeeting + [1191/1223] ✓ project/openid_connect + [1192/1223] project/sfactive + [1193/1223] project/dummy_content + [1194/1223] project/commerce_installments + [1195/1223] project/list_predefined_options + [1196/1223] project/timezone_picker + [1197/1223] project/cm_cablecast + [1198/1223] project/paypal_roles + [1199/1223] project/better_field_formatters + [1200/1223] project/feeds_entity_processor + [1201/1223] project/user_access_timeslot + [1202/1223] project/condition_pack + [1203/1223] project/search_api_lucene + [1204/1223] project/digitalclock + [1205/1223] project/datex + [1206/1223] ✓ project/daterange_simplify + [1207/1223] project/cilogon_auth + [1208/1223] ✓ project/smart_date + [1209/1223] project/smart_content_ipstack + [1210/1223] ✓ project/mtc + [1211/1223] project/timezone_calculator + [1212/1223] project/rocketship_florista_demo_profile + [1213/1223] ✓ project/intl_date + [1214/1223] project/veracity_vql + [1215/1223] ✓ project/crema + [1216/1223] project/library_management_system + [1217/1223] project/date_occur + [1218/1223] project/custom_entity_example + [1219/1223] ✓ project/time_clock + [1220/1223] project/current_date_time + [1221/1223] project/everlms + [1222/1223] project/substitutoo + [1223/1223] ✓ project/salesforce_push_queue_ui + +353 projects support D11. + +Wrote docs/contrib-modules-d11.md diff --git a/docs/find_d11_for_rectors.py b/docs/find_d11_for_rectors.py new file mode 100644 index 000000000..23b5184df --- /dev/null +++ b/docs/find_d11_for_rectors.py @@ -0,0 +1,210 @@ +#!/usr/bin/env python3 +""" +For rectors with no D11-compatible projects yet, paginate through more search +results to find D11-compatible modules. Merges into existing results. +""" + +import json +import os +import re +import time +import sys +import urllib.request +import urllib.parse +from collections import defaultdict + +TOKEN = os.environ["GITLAB_TOKEN"] +BASE = "https://git.drupalcode.org/api/v4" +GROUP_ID = 2 +PATH_EXCLUSIONS = "-path:core -path:vendor -path:docroot -path:web -path:profiles -path:sites" +SLEEP = 0.5 +MAX_PAGES = 10 # up to 1000 results per search term + +SEARCHES = [ + ("ErrorCurrentErrorHandlerRector", "Error::currentErrorHandler"), + ("FileSystemBasenameToNativeRector", "->basename("), + ("LoadAllIncludesRector", "->loadAllIncludes("), + ("MigrateSqlGetMigrationPluginManagerRector", "->getMigrationPluginManager("), + ("NodeStorageDeprecatedMethodsRector", "->revisionIds("), + ("NodeStorageDeprecatedMethodsRector", "->userRevisionIds("), + ("NodeStorageDeprecatedMethodsRector", "->countDefaultLanguageRevisions("), + ("PluginBaseIsConfigurableRector", "->isConfigurable("), + ("RemoveAutomatedCronSubmitHandlerRector", "automated_cron_settings_submit"), + ("RemoveCacheExpireOverrideRector", "function cacheExpire("), + ("RemoveHandlerBaseDefineExtraOptionsRector", "function defineExtraOptions("), + ("RemoveLinkWidgetValidateTitleElementRector", "LinkWidget::validateTitleElement"), + ("RemoveModuleHandlerAddModuleCallsRector", "->addModule("), + ("RemoveModuleHandlerDeprecatedMethodsRector", "->writeCache("), + ("RemoveModuleHandlerDeprecatedMethodsRector", "->getHookInfo("), + ("RemoveRootFromConvertDbUrlRector", "convertDbUrlToConnectionInfo("), + ("RemoveSetUriCallbackRector", "->setUriCallback("), + ("RemoveStateCacheSettingRector", "state_cache"), + ("RemoveTrustDataCallRector", "->trustData("), + ("RemoveTwigNodeTransTagArgumentRector", "TwigNodeTrans"), + ("RemoveUpdaterPostInstallMethodsRector", "function postInstallTasks("), + ("RemoveViewsRowCacheKeysRector", "function getRowCacheKeys("), + ("RenameStopProceduralHookScanRector", "StopProceduralHookScan"), + ("ReplaceAlphadecimalToIntNullRector", "alphadecimalToInt("), + ("ReplaceCommentManagerGetCountNewCommentsRector", "->getCountNewComments("), + ("ReplaceCommentUriRector", "comment_uri("), + ("ReplaceDateTimeRangeConstantsRector", "DateTimeRangeConstantsInterface"), + ("ReplaceEditorLoadRector", "editor_load("), + ("ReplaceEntityOriginalPropertyRector", "->original"), + ("ReplaceEntityReferenceRecursiveLimitRector", "RECURSIVE_RENDER_LIMIT"), + ("ReplaceFieldgroupToFieldsetRector", "'#type' => 'fieldgroup'"), + ("ReplaceFileGetContentHeadersRector", "file_get_content_headers("), + ("ReplaceLocaleConfigBatchFunctionsRector", "locale_config_batch_set_config_langcodes("), + ("ReplaceLocaleConfigBatchFunctionsRector", "locale_config_batch_refresh_name("), + ("ReplaceNodeAccessViewAllNodesRector", "node_access_view_all_nodes("), + ("ReplaceNodeAddBodyFieldRector", "node_add_body_field("), + ("ReplaceNodeModuleProceduralFunctionsRector", "node_type_get_names("), + ("ReplaceNodeModuleProceduralFunctionsRector", "node_get_type_label("), + ("ReplaceNodeModuleProceduralFunctionsRector", "node_mass_update("), + ("ReplaceNodeSetPreviewModeRector", "->setPreviewMode("), + ("ReplacePdoFetchConstantsRector", "PDO::FETCH_"), + ("ReplaceRecipeRunnerInstallModuleRector", "RecipeRunner::installModule("), + ("ReplaceSessionManagerDeleteRector", "SessionManager"), + ("ReplaceSessionWritesWithRequestSessionRector", "$_SESSION["), + ("ReplaceSystemPerformanceGzipKeyRector", "css.gzip"), + ("ReplaceThemeGetSettingRector", "theme_get_setting("), + ("ReplaceThemeGetSettingRector", "_system_default_theme_features("), + ("ReplaceUserSessionNamePropertyRector", "UserSession"), + ("ReplaceViewsProceduralFunctionsRector", "views_get_view_result("), + ("ReplaceViewsProceduralFunctionsRector", "views_view_is_enabled("), + ("ReplaceViewsProceduralFunctionsRector", "views_enable_view("), + ("StatementPrefetchIteratorFetchColumnRector", "StatementPrefetchIterator"), + ("StripMigrationDependenciesExpandArgRector", "->getMigrationDependencies("), + ("UseEntityTypeHasIntegerIdRector", "->getEntityTypeIdKeyType("), + ("UseEntityTypeHasIntegerIdRector", "->entityTypeSupportsComments("), + ("ViewsPluginHandlerManagerRector", "Views::pluginManager("), + ("ViewsPluginHandlerManagerRector", "Views::handlerManager("), + ("ReplaceModuleHandlerGetNameRector", "moduleHandler()->getName("), + ("ReplaceRebuildThemeDataRector", "->rebuildThemeData("), + ("ReplaceRequestTimeConstantRector", "REQUEST_TIME"), + ("SystemTimeZonesRector", "system_time_zones("), +] + + +def api_get(path, params=None): + url = f"{BASE}{path}" + if params: + url += "?" + urllib.parse.urlencode(params) + req = urllib.request.Request(url, headers={"PRIVATE-TOKEN": TOKEN}) + try: + with urllib.request.urlopen(req, timeout=15) as resp: + return json.loads(resp.read()) + except Exception as e: + print(f" API error: {e}", file=sys.stderr) + return None + + +def get_project_name(project_id, cache={}): + if project_id in cache: + return cache[project_id] + result = api_get(f"/projects/{project_id}") + name = result.get("path_with_namespace", str(project_id)) if result else str(project_id) + cache[project_id] = name + time.sleep(0.3) + return name + + +def check_d11(project_id, cache={}): + if project_id in cache: + return cache[project_id] + result = api_get(f"/projects/{project_id}/search", { + "scope": "blobs", + "search": "core_version_requirement", + "per_page": 5, + }) + if not result: + cache[project_id] = False + return False + for blob in result: + if not blob.get("filename", "").endswith(".info.yml"): + continue + if re.search(r'core_version_requirement:[^\n]*\b11\b', blob.get("data", "")): + cache[project_id] = True + return True + cache[project_id] = False + return False + + +def main(): + # Load existing D11 results + with open("docs/contrib-modules-d11.md") as f: + existing_md = f.read() + + # Parse which rectors already have D11 projects + rectors_with_d11 = set() + current_rector = None + for line in existing_md.splitlines(): + if line.startswith("### "): + current_rector = line[4:].strip() + elif line.startswith("- [") and current_rector: + rectors_with_d11.add(current_rector) + + print(f"Rectors already with D11 projects: {len(rectors_with_d11)}", file=sys.stderr) + + # Load existing search results to know which project IDs we already checked + with open("docs/search_results.json") as f: + existing = json.load(f) + + already_checked_pids = set() + for hits in existing["rector_hits"].values(): + for h in hits: + already_checked_pids.add(h["project_id"]) + + # Group searches by rector, only process rectors without D11 projects yet + rector_searches = defaultdict(list) + for rector, term in SEARCHES: + rector_searches[rector].append(term) + + rectors_to_search = [r for r in rector_searches if r not in rectors_with_d11] + print(f"Rectors needing D11 projects: {rectors_to_search}", file=sys.stderr) + + # For each rector without D11 projects, paginate through results + rector_d11_found = defaultdict(list) # rector -> list of project names + + for rector in rectors_to_search: + print(f"\nSearching for D11 modules for {rector}...", file=sys.stderr) + for term in rector_searches[rector]: + found = False + for page in range(1, MAX_PAGES + 1): + full_query = f"{PATH_EXCLUSIONS} {term}" + result = api_get(f"/groups/{GROUP_ID}/search", { + "scope": "blobs", + "search": full_query, + "per_page": 100, + "page": page, + }) + time.sleep(SLEEP) + if not result: + break + print(f" {term!r} page {page}: {len(result)} hits", file=sys.stderr) + for blob in result: + pid = blob["project_id"] + if pid in already_checked_pids: + continue + already_checked_pids.add(pid) + pname = get_project_name(pid) + is_d11 = check_d11(pid) + time.sleep(SLEEP) + if is_d11: + print(f" ✓ D11: {pname}", file=sys.stderr) + rector_d11_found[rector].append(pname) + found = True + if len(result) < 100: + break # no more pages + if found: + break # found D11 modules for this rector via this term, try next rector + + # Output summary + print("\n=== Summary ===", file=sys.stderr) + for rector, projects in rector_d11_found.items(): + print(f"{rector}: {projects}", file=sys.stderr) + + print(json.dumps(dict(rector_d11_found), indent=2)) + + +if __name__ == "__main__": + main() diff --git a/docs/find_d11_targeted.py b/docs/find_d11_targeted.py new file mode 100644 index 000000000..a915b01e2 --- /dev/null +++ b/docs/find_d11_targeted.py @@ -0,0 +1,150 @@ +#!/usr/bin/env python3 +""" +Targeted search for D11 modules for rectors that had no results. +Uses more specific search terms to cut through noisy old projects. +""" + +import json +import os +import re +import time +import sys +import urllib.request +import urllib.parse + +TOKEN = os.environ["GITLAB_TOKEN"] +BASE = "https://git.drupalcode.org/api/v4" +GROUP_ID = 2 +PATH_EXCLUSIONS = "-path:core -path:vendor -path:docroot -path:web -path:profiles -path:sites" +SLEEP = 0.5 +MAX_PAGES = 10 + +# More specific terms that include namespace/class context to filter out old Drupal 6/7 code +TARGETED = [ + ("LoadAllIncludesRector", "loadAllIncludes ModuleHandler"), + ("MigrateSqlGetMigrationPluginManagerRector", "getMigrationPluginManager migrate"), + ("PluginBaseIsConfigurableRector", "isConfigurable PluginBase"), + ("RemoveModuleHandlerAddModuleCallsRector", "addModule ModuleHandlerInterface"), + ("RemoveModuleHandlerDeprecatedMethodsRector", "writeCache ModuleHandler"), + ("RemoveModuleHandlerDeprecatedMethodsRector", "getHookInfo ModuleHandler"), + ("RemoveSetUriCallbackRector", "setUriCallback EntityType"), + ("RemoveTrustDataCallRector", "trustData Config"), + ("ReplaceCommentManagerGetCountNewCommentsRector","getCountNewComments CommentManager"), + ("ReplaceEntityOriginalPropertyRector", "->original EntityInterface"), + ("ReplaceEntityOriginalPropertyRector", "original ContentEntityBase"), + ("ReplaceNodeSetPreviewModeRector", "setPreviewMode NodeType"), + ("ReplaceRebuildThemeDataRector", "rebuildThemeData ThemeHandler"), + ("StripMigrationDependenciesExpandArgRector", "getMigrationDependencies Migration"), + ("UseEntityTypeHasIntegerIdRector", "getEntityTypeIdKeyType"), + ("UseEntityTypeHasIntegerIdRector", "entityTypeSupportsComments"), +] + +NOISE_PROJECTS = {"project/pt-br", "project/bg", "project/gladcamp", "project/binder", + "project/livediscussions", "project/mail_archive", "project/pushbutton_phptemplate", + "project/sitemenu", "project/contact_dir"} + + +def api_get(path, params=None): + url = f"{BASE}{path}" + if params: + url += "?" + urllib.parse.urlencode(params) + req = urllib.request.Request(url, headers={"PRIVATE-TOKEN": TOKEN}) + try: + with urllib.request.urlopen(req, timeout=15) as resp: + return json.loads(resp.read()) + except Exception as e: + print(f" API error {path}: {e}", file=sys.stderr) + return None + + +def get_project_name(project_id, cache={}): + if project_id in cache: + return cache[project_id] + result = api_get(f"/projects/{project_id}") + name = result.get("path_with_namespace", str(project_id)) if result else str(project_id) + cache[project_id] = name + time.sleep(0.3) + return name + + +def check_d11(project_id, cache={}): + if project_id in cache: + return cache[project_id] + result = api_get(f"/projects/{project_id}/search", { + "scope": "blobs", + "search": "^11", + "per_page": 10, + }) + time.sleep(0.3) + if not result: + cache[project_id] = False + return False + for blob in result: + if blob.get("filename", "").endswith(".info.yml"): + cache[project_id] = True + return True + cache[project_id] = False + return False + + +def main(): + rector_d11 = {} # rector -> list of project names + + seen_pids = set() + + for rector, term in TARGETED: + if rector not in rector_d11: + rector_d11[rector] = [] + + if rector_d11[rector]: # already found something for this rector + continue + + print(f"\n{rector}: {term!r}", file=sys.stderr) + + for page in range(1, MAX_PAGES + 1): + full_query = f"{PATH_EXCLUSIONS} {term}" + result = api_get(f"/groups/{GROUP_ID}/search", { + "scope": "blobs", + "search": full_query, + "per_page": 100, + "page": page, + }) + time.sleep(SLEEP) + + if not result: + break + + print(f" page {page}: {len(result)} hits", file=sys.stderr) + + for blob in result: + pid = blob["project_id"] + if pid in seen_pids: + continue + seen_pids.add(pid) + + pname = get_project_name(pid) + if pname in NOISE_PROJECTS: + continue + + is_d11 = check_d11(pid) + if is_d11: + print(f" ✓ D11: {pname}", file=sys.stderr) + rector_d11[rector].append(pname) + else: + print(f" skip: {pname}", file=sys.stderr) + + if rector_d11[rector]: + break # found at least one, move to next rector + + if len(result) < 100: + break + + print("\n=== Results ===", file=sys.stderr) + for rector, projects in rector_d11.items(): + print(f"{rector}: {projects}", file=sys.stderr) + + print(json.dumps(rector_d11, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/docs/pass2_progress.log b/docs/pass2_progress.log new file mode 100644 index 000000000..859ed4599 --- /dev/null +++ b/docs/pass2_progress.log @@ -0,0 +1,220 @@ +Rectors already with D11 projects: 29 +Rectors needing D11 projects: ['ErrorCurrentErrorHandlerRector', 'FileSystemBasenameToNativeRector', 'LoadAllIncludesRector', 'MigrateSqlGetMigrationPluginManagerRector', 'NodeStorageDeprecatedMethodsRector', 'PluginBaseIsConfigurableRector', 'RemoveAutomatedCronSubmitHandlerRector', 'RemoveLinkWidgetValidateTitleElementRector', 'RemoveModuleHandlerAddModuleCallsRector', 'RemoveModuleHandlerDeprecatedMethodsRector', 'RemoveSetUriCallbackRector', 'RemoveTrustDataCallRector', 'RenameStopProceduralHookScanRector', 'ReplaceCommentManagerGetCountNewCommentsRector', 'ReplaceEntityOriginalPropertyRector', 'ReplaceLocaleConfigBatchFunctionsRector', 'ReplaceNodeSetPreviewModeRector', 'StatementPrefetchIteratorFetchColumnRector', 'StripMigrationDependenciesExpandArgRector', 'UseEntityTypeHasIntegerIdRector', 'ReplaceRebuildThemeDataRector'] + +Searching for D11 modules for ErrorCurrentErrorHandlerRector... + +Searching for D11 modules for FileSystemBasenameToNativeRector... + '->basename(' page 1: 100 hits + '->basename(' page 2: 100 hits + '->basename(' page 3: 100 hits + '->basename(' page 4: 100 hits + ✓ D11: project/ejectorseat + '->basename(' page 5: 100 hits + '->basename(' page 6: 100 hits + '->basename(' page 7: 100 hits + '->basename(' page 8: 100 hits + '->basename(' page 9: 100 hits + '->basename(' page 10: 100 hits + +Searching for D11 modules for LoadAllIncludesRector... + '->loadAllIncludes(' page 1: 100 hits + '->loadAllIncludes(' page 2: 100 hits + '->loadAllIncludes(' page 3: 100 hits + '->loadAllIncludes(' page 4: 100 hits + '->loadAllIncludes(' page 5: 100 hits + '->loadAllIncludes(' page 6: 100 hits + '->loadAllIncludes(' page 7: 100 hits + '->loadAllIncludes(' page 8: 100 hits + '->loadAllIncludes(' page 9: 100 hits + '->loadAllIncludes(' page 10: 100 hits + +Searching for D11 modules for MigrateSqlGetMigrationPluginManagerRector... + '->getMigrationPluginManager(' page 1: 100 hits + '->getMigrationPluginManager(' page 2: 100 hits + '->getMigrationPluginManager(' page 3: 100 hits + '->getMigrationPluginManager(' page 4: 100 hits + '->getMigrationPluginManager(' page 5: 100 hits + '->getMigrationPluginManager(' page 6: 100 hits + '->getMigrationPluginManager(' page 7: 100 hits + '->getMigrationPluginManager(' page 8: 100 hits + '->getMigrationPluginManager(' page 9: 100 hits + '->getMigrationPluginManager(' page 10: 100 hits + +Searching for D11 modules for NodeStorageDeprecatedMethodsRector... + '->revisionIds(' page 1: 100 hits + '->revisionIds(' page 2: 100 hits + '->revisionIds(' page 3: 100 hits + '->revisionIds(' page 4: 100 hits + '->revisionIds(' page 5: 100 hits + ✓ D11: project/tb_megamenu + '->revisionIds(' page 6: 100 hits + '->revisionIds(' page 7: 100 hits + '->revisionIds(' page 8: 100 hits + '->revisionIds(' page 9: 100 hits + '->revisionIds(' page 10: 100 hits + +Searching for D11 modules for PluginBaseIsConfigurableRector... + '->isConfigurable(' page 1: 100 hits + '->isConfigurable(' page 2: 100 hits + '->isConfigurable(' page 3: 100 hits + '->isConfigurable(' page 4: 100 hits + '->isConfigurable(' page 5: 100 hits + '->isConfigurable(' page 6: 100 hits + '->isConfigurable(' page 7: 100 hits + '->isConfigurable(' page 8: 100 hits + '->isConfigurable(' page 9: 100 hits + '->isConfigurable(' page 10: 100 hits + +Searching for D11 modules for RemoveAutomatedCronSubmitHandlerRector... + +Searching for D11 modules for RemoveLinkWidgetValidateTitleElementRector... + +Searching for D11 modules for RemoveModuleHandlerAddModuleCallsRector... + '->addModule(' page 1: 100 hits + '->addModule(' page 2: 100 hits + '->addModule(' page 3: 100 hits + '->addModule(' page 4: 100 hits + '->addModule(' page 5: 100 hits + '->addModule(' page 6: 100 hits + '->addModule(' page 7: 100 hits + '->addModule(' page 8: 100 hits + '->addModule(' page 9: 100 hits + '->addModule(' page 10: 100 hits + +Searching for D11 modules for RemoveModuleHandlerDeprecatedMethodsRector... + '->writeCache(' page 1: 100 hits + '->writeCache(' page 2: 100 hits + '->writeCache(' page 3: 100 hits + '->writeCache(' page 4: 100 hits + '->writeCache(' page 5: 100 hits + '->writeCache(' page 6: 100 hits + '->writeCache(' page 7: 100 hits + '->writeCache(' page 8: 100 hits + '->writeCache(' page 9: 100 hits + '->writeCache(' page 10: 100 hits + '->getHookInfo(' page 1: 100 hits + '->getHookInfo(' page 2: 100 hits + '->getHookInfo(' page 3: 100 hits + '->getHookInfo(' page 4: 100 hits + '->getHookInfo(' page 5: 100 hits + '->getHookInfo(' page 6: 100 hits + '->getHookInfo(' page 7: 100 hits + '->getHookInfo(' page 8: 100 hits + '->getHookInfo(' page 9: 100 hits + '->getHookInfo(' page 10: 100 hits + +Searching for D11 modules for RemoveSetUriCallbackRector... + '->setUriCallback(' page 1: 100 hits + '->setUriCallback(' page 2: 100 hits + '->setUriCallback(' page 3: 100 hits + '->setUriCallback(' page 4: 100 hits + '->setUriCallback(' page 5: 100 hits + '->setUriCallback(' page 6: 100 hits + '->setUriCallback(' page 7: 100 hits + '->setUriCallback(' page 8: 100 hits + '->setUriCallback(' page 9: 100 hits + '->setUriCallback(' page 10: 100 hits + +Searching for D11 modules for RemoveTrustDataCallRector... + '->trustData(' page 1: 100 hits + '->trustData(' page 2: 100 hits + '->trustData(' page 3: 100 hits + '->trustData(' page 4: 100 hits + '->trustData(' page 5: 100 hits + '->trustData(' page 6: 100 hits + '->trustData(' page 7: 100 hits + '->trustData(' page 8: 100 hits + '->trustData(' page 9: 100 hits + '->trustData(' page 10: 100 hits + +Searching for D11 modules for RenameStopProceduralHookScanRector... + +Searching for D11 modules for ReplaceCommentManagerGetCountNewCommentsRector... + '->getCountNewComments(' page 1: 100 hits + '->getCountNewComments(' page 2: 100 hits + '->getCountNewComments(' page 3: 100 hits + '->getCountNewComments(' page 4: 100 hits + '->getCountNewComments(' page 5: 100 hits + '->getCountNewComments(' page 6: 100 hits + '->getCountNewComments(' page 7: 100 hits + '->getCountNewComments(' page 8: 100 hits + '->getCountNewComments(' page 9: 100 hits + '->getCountNewComments(' page 10: 100 hits + +Searching for D11 modules for ReplaceEntityOriginalPropertyRector... + '->original' page 1: 100 hits + '->original' page 2: 100 hits + '->original' page 3: 100 hits + '->original' page 4: 100 hits + '->original' page 5: 100 hits + '->original' page 6: 100 hits + '->original' page 7: 100 hits + '->original' page 8: 100 hits + '->original' page 9: 100 hits + '->original' page 10: 100 hits + +Searching for D11 modules for ReplaceLocaleConfigBatchFunctionsRector... + +Searching for D11 modules for ReplaceNodeSetPreviewModeRector... + '->setPreviewMode(' page 1: 100 hits + '->setPreviewMode(' page 2: 100 hits + '->setPreviewMode(' page 3: 100 hits + '->setPreviewMode(' page 4: 100 hits + '->setPreviewMode(' page 5: 100 hits + '->setPreviewMode(' page 6: 100 hits + '->setPreviewMode(' page 7: 100 hits + '->setPreviewMode(' page 8: 100 hits + '->setPreviewMode(' page 9: 100 hits + '->setPreviewMode(' page 10: 100 hits + +Searching for D11 modules for StatementPrefetchIteratorFetchColumnRector... + +Searching for D11 modules for StripMigrationDependenciesExpandArgRector... + '->getMigrationDependencies(' page 1: 100 hits + '->getMigrationDependencies(' page 2: 100 hits + '->getMigrationDependencies(' page 3: 100 hits + '->getMigrationDependencies(' page 4: 100 hits + '->getMigrationDependencies(' page 5: 100 hits + '->getMigrationDependencies(' page 6: 100 hits + '->getMigrationDependencies(' page 7: 100 hits + '->getMigrationDependencies(' page 8: 100 hits + '->getMigrationDependencies(' page 9: 100 hits + '->getMigrationDependencies(' page 10: 100 hits + +Searching for D11 modules for UseEntityTypeHasIntegerIdRector... + '->getEntityTypeIdKeyType(' page 1: 100 hits + '->getEntityTypeIdKeyType(' page 2: 100 hits + '->getEntityTypeIdKeyType(' page 3: 100 hits + '->getEntityTypeIdKeyType(' page 4: 100 hits + '->getEntityTypeIdKeyType(' page 5: 100 hits + '->getEntityTypeIdKeyType(' page 6: 100 hits + '->getEntityTypeIdKeyType(' page 7: 100 hits + '->getEntityTypeIdKeyType(' page 8: 100 hits + '->getEntityTypeIdKeyType(' page 9: 100 hits + '->getEntityTypeIdKeyType(' page 10: 100 hits + '->entityTypeSupportsComments(' page 1: 100 hits + '->entityTypeSupportsComments(' page 2: 100 hits + '->entityTypeSupportsComments(' page 3: 100 hits + '->entityTypeSupportsComments(' page 4: 100 hits + '->entityTypeSupportsComments(' page 5: 100 hits + '->entityTypeSupportsComments(' page 6: 100 hits + '->entityTypeSupportsComments(' page 7: 100 hits + '->entityTypeSupportsComments(' page 8: 100 hits + '->entityTypeSupportsComments(' page 9: 100 hits + '->entityTypeSupportsComments(' page 10: 100 hits + +Searching for D11 modules for ReplaceRebuildThemeDataRector... + '->rebuildThemeData(' page 1: 100 hits + '->rebuildThemeData(' page 2: 100 hits + '->rebuildThemeData(' page 3: 100 hits + '->rebuildThemeData(' page 4: 100 hits + '->rebuildThemeData(' page 5: 100 hits + '->rebuildThemeData(' page 6: 100 hits + '->rebuildThemeData(' page 7: 100 hits + '->rebuildThemeData(' page 8: 100 hits + '->rebuildThemeData(' page 9: 100 hits + '->rebuildThemeData(' page 10: 100 hits + +=== Summary === +FileSystemBasenameToNativeRector: ['project/ejectorseat'] +NodeStorageDeprecatedMethodsRector: ['project/tb_megamenu'] diff --git a/docs/pass2_results.json b/docs/pass2_results.json new file mode 100644 index 000000000..5632e90db --- /dev/null +++ b/docs/pass2_results.json @@ -0,0 +1,8 @@ +{ + "FileSystemBasenameToNativeRector": [ + "project/ejectorseat" + ], + "NodeStorageDeprecatedMethodsRector": [ + "project/tb_megamenu" + ] +} diff --git a/docs/plans/no-match-investigation.md b/docs/plans/no-match-investigation.md new file mode 100644 index 000000000..48f22a11d --- /dev/null +++ b/docs/plans/no-match-investigation.md @@ -0,0 +1,52 @@ +# No-match investigation + +Rectors that ran against installed modules but made zero changes. Per rector: check whether the +installed module(s) actually contain the deprecated pattern, and if so figure out why the rector +didn't match it. + +## How to investigate + +1. Find the deprecated usage in the module source (grep for the old API/pattern). +2. If the usage exists, run rector in debug mode and trace why the node visitor didn't fire. +3. Common culprits: wrong node type check, type mismatch, fully-qualified vs imported class name, + pattern too narrow (e.g. only matches method calls, not static calls or vice versa). + +--- + +## Suspicious — started but no completion (possible crash or timeout) + +- [ ] `RemoveTrustDataCallRector` — modules: views_dependent_filters, group (progress bar showed `0/6` then nothing) +- [ ] `RemoveUpdaterPostInstallMethodsRector` — modules: group, gnode_request (progress bar showed `0/5` then nothing) + +--- + +## Ran cleanly — zero files changed + +- [ ] `FileSystemBasenameToNativeRector` — modules: ejectorseat +- [ ] `LoadAllIncludesRector` — modules: config_track, schemadotorg +- [ ] `MigrateSqlGetMigrationPluginManagerRector` — modules: migmag, smart_sql_idmap +- [ ] `NodeStorageDeprecatedMethodsRector` — modules: tb_megamenu +- [ ] `PluginBaseIsConfigurableRector` — modules: metatag, search_api +- [ ] `RemoveModuleHandlerAddModuleCallsRector` — modules: acquia_contenthub, sdx +- [ ] `RemoveModuleHandlerDeprecatedMethodsRector` — modules: captcha, jsonld +- [ ] `RemoveSetUriCallbackRector` — modules: rabbit_hole_href +- [ ] `RemoveStateCacheSettingRector` — modules: searchstax, sdx +- [ ] `RemoveTwigNodeTransTagArgumentRector` — modules: searchstax +- [ ] `ReplaceAlphadecimalToIntNullRector` — modules: comment_mover +- [ ] `ReplaceCommentManagerGetCountNewCommentsRector` — modules: forum, history +- [ ] `ReplaceDateTimeRangeConstantsRector` — modules: deprecation_status +- [ ] `ReplaceEditorLoadRector` — modules: acquia_contenthub, ckeditor5_plugin_pack +- [ ] `ReplaceFieldgroupToFieldsetRector` — modules: field_group_vertical_tabs, ui_patterns_settings +- [ ] `ReplaceFileGetContentHeadersRector` — modules: commerce_invoice, tmgmt +- [ ] `ReplaceModuleHandlerGetNameRector` — modules: drd, reassign_user_content +- [ ] `ReplaceNodeAccessViewAllNodesRector` — modules: view_usernames_node_author +- [ ] `ReplaceNodeModuleProceduralFunctionsRector` — modules: reassign_user_content, addanother +- [ ] `ReplaceRecipeRunnerInstallModuleRector` — modules: schemadotorg +- [ ] `ReplaceSessionManagerDeleteRector` — modules: entity_visibility_preview, session_inspector +- [ ] `ReplaceSessionWritesWithRequestSessionRector` — modules: drd, entity_visibility_preview +- [ ] `ReplaceSystemPerformanceGzipKeyRector` — modules: drd +- [ ] `ReplaceUserSessionNamePropertyRector` — modules: acquia_contenthub, session_inspector +- [ ] `ViewsPluginHandlerManagerRector` — modules: searchstax, search_api, metatag +- [ ] `ReplaceRebuildThemeDataRector` — modules: site_guardian +- [ ] `ReplaceRequestTimeConstantRector` — modules: google_analytics_counter, automatic_updates +- [ ] `SystemTimeZonesRector` — modules: intl_date, smart_date diff --git a/docs/search_modules.py b/docs/search_modules.py new file mode 100644 index 000000000..c20fbe6e2 --- /dev/null +++ b/docs/search_modules.py @@ -0,0 +1,168 @@ +#!/usr/bin/env python3 +"""Search Drupal GitLab for contrib modules using deprecated APIs targeted by new rectors.""" + +import json +import time +import sys +import urllib.request +import urllib.parse +from collections import defaultdict + +import os +TOKEN = os.environ["GITLAB_TOKEN"] +BASE = "https://git.drupalcode.org/api/v4" +GROUP_ID = 2 +PATH_EXCLUSIONS = "-path:core -path:vendor -path:docroot -path:web -path:profiles -path:sites" +SLEEP_BETWEEN = 2 # seconds between search requests + +SEARCHES = [ + # (rector_name, search_term) + # Drupal 11 + ("ErrorCurrentErrorHandlerRector", "Error::currentErrorHandler"), + ("FileSystemBasenameToNativeRector", "->basename("), + ("LoadAllIncludesRector", "->loadAllIncludes("), + ("MigrateSqlGetMigrationPluginManagerRector", "->getMigrationPluginManager("), + ("NodeStorageDeprecatedMethodsRector", "->revisionIds("), + ("NodeStorageDeprecatedMethodsRector", "->userRevisionIds("), + ("NodeStorageDeprecatedMethodsRector", "->countDefaultLanguageRevisions("), + ("PluginBaseIsConfigurableRector", "->isConfigurable("), + ("RemoveAutomatedCronSubmitHandlerRector", "automated_cron_settings_submit"), + ("RemoveCacheExpireOverrideRector", "function cacheExpire("), + ("RemoveHandlerBaseDefineExtraOptionsRector", "function defineExtraOptions("), + ("RemoveLinkWidgetValidateTitleElementRector", "LinkWidget::validateTitleElement"), + ("RemoveModuleHandlerAddModuleCallsRector", "->addModule("), + ("RemoveModuleHandlerDeprecatedMethodsRector", "->writeCache("), + ("RemoveModuleHandlerDeprecatedMethodsRector", "->getHookInfo("), + ("RemoveRootFromConvertDbUrlRector", "convertDbUrlToConnectionInfo("), + ("RemoveSetUriCallbackRector", "->setUriCallback("), + ("RemoveStateCacheSettingRector", "state_cache"), + ("RemoveTrustDataCallRector", "->trustData("), + ("RemoveTwigNodeTransTagArgumentRector", "TwigNodeTrans"), + ("RemoveUpdaterPostInstallMethodsRector", "function postInstallTasks("), + ("RemoveViewsRowCacheKeysRector", "function getRowCacheKeys("), + ("RenameStopProceduralHookScanRector", "StopProceduralHookScan"), + ("ReplaceAlphadecimalToIntNullRector", "alphadecimalToInt("), + ("ReplaceCommentManagerGetCountNewCommentsRector", "->getCountNewComments("), + ("ReplaceCommentUriRector", "comment_uri("), + ("ReplaceDateTimeRangeConstantsRector", "DateTimeRangeConstantsInterface"), + ("ReplaceEditorLoadRector", "editor_load("), + ("ReplaceEntityOriginalPropertyRector", "->original"), + ("ReplaceEntityReferenceRecursiveLimitRector", "RECURSIVE_RENDER_LIMIT"), + ("ReplaceFieldgroupToFieldsetRector", "'#type' => 'fieldgroup'"), + ("ReplaceFileGetContentHeadersRector", "file_get_content_headers("), + ("ReplaceLocaleConfigBatchFunctionsRector", "locale_config_batch_set_config_langcodes("), + ("ReplaceLocaleConfigBatchFunctionsRector", "locale_config_batch_refresh_name("), + ("ReplaceNodeAccessViewAllNodesRector", "node_access_view_all_nodes("), + ("ReplaceNodeAddBodyFieldRector", "node_add_body_field("), + ("ReplaceNodeModuleProceduralFunctionsRector", "node_type_get_names("), + ("ReplaceNodeModuleProceduralFunctionsRector", "node_get_type_label("), + ("ReplaceNodeModuleProceduralFunctionsRector", "node_mass_update("), + ("ReplaceNodeSetPreviewModeRector", "->setPreviewMode("), + ("ReplacePdoFetchConstantsRector", "PDO::FETCH_"), + ("ReplaceRecipeRunnerInstallModuleRector", "RecipeRunner::installModule("), + ("ReplaceSessionManagerDeleteRector", "SessionManager"), + ("ReplaceSessionWritesWithRequestSessionRector", "$_SESSION["), + ("ReplaceSystemPerformanceGzipKeyRector", "css.gzip"), + ("ReplaceThemeGetSettingRector", "theme_get_setting("), + ("ReplaceThemeGetSettingRector", "_system_default_theme_features("), + ("ReplaceUserSessionNamePropertyRector", "UserSession"), + ("ReplaceViewsProceduralFunctionsRector", "views_get_view_result("), + ("ReplaceViewsProceduralFunctionsRector", "views_view_is_enabled("), + ("ReplaceViewsProceduralFunctionsRector", "views_enable_view("), + ("StatementPrefetchIteratorFetchColumnRector", "StatementPrefetchIterator"), + ("StripMigrationDependenciesExpandArgRector", "->getMigrationDependencies("), + ("UseEntityTypeHasIntegerIdRector", "->getEntityTypeIdKeyType("), + ("UseEntityTypeHasIntegerIdRector", "->entityTypeSupportsComments("), + ("ViewsPluginHandlerManagerRector", "Views::pluginManager("), + ("ViewsPluginHandlerManagerRector", "Views::handlerManager("), + # Drupal 10 + ("ReplaceModuleHandlerGetNameRector", "moduleHandler()->getName("), + ("ReplaceRebuildThemeDataRector", "->rebuildThemeData("), + ("ReplaceRequestTimeConstantRector", "REQUEST_TIME"), + ("SystemTimeZonesRector", "system_time_zones("), +] + + +def api_get(path, params=None): + url = f"{BASE}{path}" + if params: + url += "?" + urllib.parse.urlencode(params) + req = urllib.request.Request(url, headers={"PRIVATE-TOKEN": TOKEN}) + with urllib.request.urlopen(req, timeout=15) as resp: + return json.loads(resp.read()) + + +def search_blobs(query): + full_query = f"{PATH_EXCLUSIONS} {query}" + try: + results = api_get(f"/groups/{GROUP_ID}/search", { + "scope": "blobs", + "search": full_query, + "per_page": 100, + }) + return results + except Exception as e: + print(f" ERROR: {e}", file=sys.stderr) + return [] + + +def get_project_name(project_id, cache={}): + if project_id in cache: + return cache[project_id] + try: + proj = api_get(f"/projects/{project_id}") + name = proj.get("path_with_namespace", str(project_id)) + cache[project_id] = name + time.sleep(0.5) + return name + except Exception: + cache[project_id] = str(project_id) + return str(project_id) + + +def main(): + # rector -> set of (project_id, filename) tuples + rector_hits = defaultdict(set) + # project_id -> set of rectors that hit it + project_rectors = defaultdict(set) + + print(f"Running {len(SEARCHES)} searches...", file=sys.stderr) + + for i, (rector, term) in enumerate(SEARCHES): + print(f" [{i+1}/{len(SEARCHES)}] {rector}: {term!r}", file=sys.stderr) + results = search_blobs(term) + for r in results: + pid = r["project_id"] + fname = r.get("filename", "") + rector_hits[rector].add((pid, fname)) + project_rectors[pid].add(rector) + print(f" → {len(results)} hits", file=sys.stderr) + time.sleep(SLEEP_BETWEEN) + + # Collect all unique project IDs + all_pids = set(project_rectors.keys()) + print(f"\nResolving {len(all_pids)} project names...", file=sys.stderr) + pid_to_name = {} + for pid in sorted(all_pids): + pid_to_name[pid] = get_project_name(pid) + print(f" {pid} → {pid_to_name[pid]}", file=sys.stderr) + + # Output JSON for the markdown writer + output = { + "rector_hits": { + rector: [ + {"project_id": pid, "project_name": pid_to_name.get(pid, str(pid)), "filename": fname} + for pid, fname in sorted(hits) + ] + for rector, hits in rector_hits.items() + }, + "project_rectors": { + pid_to_name.get(pid, str(pid)): sorted(rectors) + for pid, rectors in project_rectors.items() + }, + } + print(json.dumps(output, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/docs/search_progress.log b/docs/search_progress.log new file mode 100644 index 000000000..9eaddd670 --- /dev/null +++ b/docs/search_progress.log @@ -0,0 +1,1348 @@ +Running 61 searches... + [1/61] ErrorCurrentErrorHandlerRector: 'Error::currentErrorHandler' + → 0 hits + [2/61] FileSystemBasenameToNativeRector: '->basename(' + → 100 hits + [3/61] LoadAllIncludesRector: '->loadAllIncludes(' + → 100 hits + [4/61] MigrateSqlGetMigrationPluginManagerRector: '->getMigrationPluginManager(' + → 100 hits + [5/61] NodeStorageDeprecatedMethodsRector: '->revisionIds(' + → 100 hits + [6/61] NodeStorageDeprecatedMethodsRector: '->userRevisionIds(' + → 100 hits + [7/61] NodeStorageDeprecatedMethodsRector: '->countDefaultLanguageRevisions(' + → 100 hits + [8/61] PluginBaseIsConfigurableRector: '->isConfigurable(' + → 100 hits + [9/61] RemoveAutomatedCronSubmitHandlerRector: 'automated_cron_settings_submit' + → 0 hits + [10/61] RemoveCacheExpireOverrideRector: 'function cacheExpire(' + → 100 hits + [11/61] RemoveHandlerBaseDefineExtraOptionsRector: 'function defineExtraOptions(' + → 1 hits + [12/61] RemoveLinkWidgetValidateTitleElementRector: 'LinkWidget::validateTitleElement' + → 0 hits + [13/61] RemoveModuleHandlerAddModuleCallsRector: '->addModule(' + → 100 hits + [14/61] RemoveModuleHandlerDeprecatedMethodsRector: '->writeCache(' + → 100 hits + [15/61] RemoveModuleHandlerDeprecatedMethodsRector: '->getHookInfo(' + → 100 hits + [16/61] RemoveRootFromConvertDbUrlRector: 'convertDbUrlToConnectionInfo(' + → 7 hits + [17/61] RemoveSetUriCallbackRector: '->setUriCallback(' + → 100 hits + [18/61] RemoveStateCacheSettingRector: 'state_cache' + → 100 hits + [19/61] RemoveTrustDataCallRector: '->trustData(' + → 100 hits + [20/61] RemoveTwigNodeTransTagArgumentRector: 'TwigNodeTrans' + → 22 hits + [21/61] RemoveUpdaterPostInstallMethodsRector: 'function postInstallTasks(' + → 83 hits + [22/61] RemoveViewsRowCacheKeysRector: 'function getRowCacheKeys(' + → 3 hits + [23/61] RenameStopProceduralHookScanRector: 'StopProceduralHookScan' + → 0 hits + [24/61] ReplaceAlphadecimalToIntNullRector: 'alphadecimalToInt(' + → 5 hits + [25/61] ReplaceCommentManagerGetCountNewCommentsRector: '->getCountNewComments(' + → 100 hits + [26/61] ReplaceCommentUriRector: 'comment_uri(' + → 95 hits + [27/61] ReplaceDateTimeRangeConstantsRector: 'DateTimeRangeConstantsInterface' + → 1 hits + [28/61] ReplaceEditorLoadRector: 'editor_load(' + → 100 hits + [29/61] ReplaceEntityOriginalPropertyRector: '->original' + → 100 hits + [30/61] ReplaceEntityReferenceRecursiveLimitRector: 'RECURSIVE_RENDER_LIMIT' + → 35 hits + [31/61] ReplaceFieldgroupToFieldsetRector: "'#type' => 'fieldgroup'" + → 100 hits + [32/61] ReplaceFileGetContentHeadersRector: 'file_get_content_headers(' + → 100 hits + [33/61] ReplaceLocaleConfigBatchFunctionsRector: 'locale_config_batch_set_config_langcodes(' + → 0 hits + [34/61] ReplaceLocaleConfigBatchFunctionsRector: 'locale_config_batch_refresh_name(' + → 0 hits + [35/61] ReplaceNodeAccessViewAllNodesRector: 'node_access_view_all_nodes(' + → 100 hits + [36/61] ReplaceNodeAddBodyFieldRector: 'node_add_body_field(' + → 100 hits + [37/61] ReplaceNodeModuleProceduralFunctionsRector: 'node_type_get_names(' + → 100 hits + [38/61] ReplaceNodeModuleProceduralFunctionsRector: 'node_get_type_label(' + → 34 hits + [39/61] ReplaceNodeModuleProceduralFunctionsRector: 'node_mass_update(' + → 100 hits + [40/61] ReplaceNodeSetPreviewModeRector: '->setPreviewMode(' + → 100 hits + [41/61] ReplacePdoFetchConstantsRector: 'PDO::FETCH_' + → 100 hits + [42/61] ReplaceRecipeRunnerInstallModuleRector: 'RecipeRunner::installModule(' + → 1 hits + [43/61] ReplaceSessionManagerDeleteRector: 'SessionManager' + → 100 hits + [44/61] ReplaceSessionWritesWithRequestSessionRector: '$_SESSION[' + → 100 hits + [45/61] ReplaceSystemPerformanceGzipKeyRector: 'css.gzip' + → 80 hits + [46/61] ReplaceThemeGetSettingRector: 'theme_get_setting(' + → 100 hits + [47/61] ReplaceThemeGetSettingRector: '_system_default_theme_features(' + → 71 hits + [48/61] ReplaceUserSessionNamePropertyRector: 'UserSession' + → 100 hits + [49/61] ReplaceViewsProceduralFunctionsRector: 'views_get_view_result(' + → 83 hits + [50/61] ReplaceViewsProceduralFunctionsRector: 'views_view_is_enabled(' + → 6 hits + [51/61] ReplaceViewsProceduralFunctionsRector: 'views_enable_view(' + → 2 hits + [52/61] StatementPrefetchIteratorFetchColumnRector: 'StatementPrefetchIterator' + → 0 hits + [53/61] StripMigrationDependenciesExpandArgRector: '->getMigrationDependencies(' + → 100 hits + [54/61] UseEntityTypeHasIntegerIdRector: '->getEntityTypeIdKeyType(' + → 100 hits + [55/61] UseEntityTypeHasIntegerIdRector: '->entityTypeSupportsComments(' + → 100 hits + [56/61] ViewsPluginHandlerManagerRector: 'Views::pluginManager(' + → 100 hits + [57/61] ViewsPluginHandlerManagerRector: 'Views::handlerManager(' + → 75 hits + [58/61] ReplaceModuleHandlerGetNameRector: 'moduleHandler()->getName(' + → 100 hits + [59/61] ReplaceRebuildThemeDataRector: '->rebuildThemeData(' + → 100 hits + [60/61] ReplaceRequestTimeConstantRector: 'REQUEST_TIME' + → 100 hits + [61/61] SystemTimeZonesRector: 'system_time_zones(' + → 100 hits + +Resolving 1223 project names... + 97 → project/variable + 191 → project/inactive_user + 249 → project/ar + 284 → project/pt-br + 289 → project/livediscussions + 294 → project/pushbutton_phptemplate + 301 → project/bg + 303 → project/mail_archive + 306 → project/contact_dir + 310 → project/sitemenu + 316 → project/binder + 327 → project/snippets + 337 → project/indexpage + 342 → project/tinymce + 422 → project/evaluation + 441 → project/question + 575 → project/family + 714 → project/session_limit + 744 → project/comment_mover + 939 → project/project_issue + 945 → project/node_clone + 978 → project/fieldgroup + 1005 → project/node_expire + 1039 → project/flatcomments + 1082 → project/zen + 1138 → project/calendar + 1151 → project/drush + 1258 → project/fieldgroup_table + 1337 → project/twitter + 1363 → project/bueditor + 1417 → project/audit + 1496 → project/util + 1568 → project/schema + 1666 → project/advcache + 1705 → project/synonyms + 1730 → project/related_content + 1770 → project/pmetrics + 1894 → project/cck_fieldgroup_tabs + 1952 → project/one_time_login + 1978 → project/brilliant_gallery + 2065 → project/openlayers + 2079 → project/activity + 2121 → project/xcache + 2124 → project/rdf + 2168 → project/denver + 2271 → project/bitcache + 2285 → project/advanced_forum + 2291 → project/video_filter + 2335 → project/mmedia + 2431 → project/cdn + 2523 → project/quicktabs + 2600 → project/tzfield + 2646 → project/cache_disable + 2651 → project/trash + 2658 → project/restrict_by_ip + 2760 → project/editor + 2775 → project/subdomain + 2816 → project/cacherouter + 2817 → project/mollom + 2866 → project/xmpp_server + 2880 → project/latest_members + 2942 → project/hexagon + 3063 → project/smartcache + 3104 → project/eventbrite + 3155 → project/markdown + 3156 → project/field + 3174 → project/autotag + 3330 → project/fast_gallery + 3591 → project/nodetypeviews + 3635 → project/views_exclude_previous + 3659 → project/cache_browser + 3738 → project/comment_perm + 3805 → project/genesis + 3873 → project/bundles + 3917 → project/heartbeat + 4031 → project/admin_notify + 4095 → project/inherit + 4196 → project/fbconnect + 4206 → project/addanother + 4288 → project/accessible + 4369 → project/storage_api + 4408 → project/uc_fedex + 4485 → project/googlenews + 4510 → project/querypath + 4557 → project/popups_subedit + 4559 → project/aurigma + 4568 → project/almanac + 4606 → project/module_grants + 4621 → project/css_gzip + 4627 → project/fieldtool + 4638 → project/visitors + 4652 → project/booking_timeslots + 4671 → project/collection + 4795 → project/administration_notification + 4833 → project/search_by_page + 4939 → project/makemeeting + 4956 → project/role_inheritance + 4957 → project/views_natural_sort + 4970 → project/oracle + 5055 → project/cck_inputs + 5104 → project/zeropoint + 5141 → project/qpservices + 5158 → project/dbtng + 5316 → project/adt_basetheme + 5362 → project/cck_sync + 5411 → project/adaptivetheme + 5444 → project/cache + 5481 → project/jp_mobile + 5494 → project/casaa + 5625 → project/guidance + 5738 → project/tupas + 5765 → project/simplenews_content_selection + 5930 → project/distro + 6019 → project/languageassign + 6109 → project/styles + 6245 → project/profile_migrate + 6452 → project/meetu + 6455 → project/freeagent + 6479 → project/openid_connect + 6486 → project/featured_content + 6551 → project/node_widget + 6610 → project/acc + 6632 → project/pirets + 6663 → project/css_emimage + 6676 → project/custom_search + 6705 → project/briefcase + 6719 → project/context_admin + 6751 → project/d7 + 6858 → project/winners + 6861 → project/content_type_exporter + 6870 → project/settings_audit_log + 6922 → project/views_linkarea + 6961 → project/sqlsrv + 7006 → project/content_display_order + 7070 → project/mongodb_dbtng + 7073 → project/revision_all + 7089 → project/cache_actions + 7093 → project/nodereference_basket + 7108 → project/field_or + 7220 → project/translation_management + 7241 → project/feeds_view_parser + 7245 → project/virtual_roles + 7296 → project/qfield + 7310 → project/views_content_cache + 7367 → project/turbo + 7402 → project/nopremium + 7433 → project/download_file + 7450 → project/cck_signup + 7559 → project/openscholar_vsite + 7684 → project/internet_archive + 7816 → project/hose_xml + 7900 → project/media_ustream + 7926 → project/imagefetchr + 7948 → project/highcharts + 8063 → project/menu_minipanels + 8197 → project/onepage + 8225 → project/mb + 8285 → project/recruit + 8296 → project/relation + 8368 → project/references + 8405 → project/cf + 8434 → project/ct_plus + 8453 → project/max_age + 8458 → project/node_gallery_bulk_operations + 8520 → project/node_gallery_taxonomy + 8533 → project/backup_migrate_dropbox + 8534 → project/dns + 8595 → project/podgroups + 8618 → project/cache_backport + 8635 → project/block2field + 8691 → project/sensor_hub + 8821 → project/profile_setup_api + 8863 → project/imageeditor + 8864 → project/merci_signup + 8882 → project/html5_boilerplate + 8889 → project/merci_barcode_labels + 8912 → project/barracuda + 8947 → project/wysiwyg_fields + 8969 → project/onus + 9044 → project/taxonomy_display + 9062 → project/recently_read + 9099 → project/vinculum + 9123 → project/1087726 + 9186 → project/mobile_jquery + 9201 → project/volunteer_rally_features + 9202 → project/vagrant + 9255 → project/commerce_qb_webconnect + 9273 → project/cache_heuristic + 9274 → project/donor_rally_features + 9292 → project/flow + 9324 → project/recurly + 9423 → project/student_signup + 9450 → project/cache_graceful + 9530 → project/commerce_fieldgroup_panes + 9628 → project/sfactive + 9636 → project/octopus + 9656 → project/deds_client + 9658 → project/openid_sso_provider + 9665 → project/sharebar + 9745 → project/commerce_invoice + 9770 → project/corporative_site + 9833 → project/microdata + 9847 → project/b2b_store_solution + 9911 → project/dt + 9950 → project/dummy_content + 9970 → project/colors + 9979 → project/prometheus + 9981 → project/field_weight + 10014 → project/hubspot + 10049 → project/meerkat + 10080 → project/rules_example + 10186 → project/nucleus + 10204 → project/lc3_clean + 10247 → project/video_embed_field + 10250 → project/views_node_access + 10271 → project/msnf + 10285 → project/time_tracker_simple + 10325 → project/product_reference_view + 10339 → project/views_query_na_subquery + 10369 → project/session_proxy + 10377 → project/nodeaccesskeys + 10384 → project/commerce_purchase_order + 10405 → project/onepagecv + 10416 → project/archibald + 10452 → project/shopcart + 10543 → project/featured_news_feature + 10594 → project/node_announce + 10703 → project/manymail + 10712 → project/commerce_installments + 10715 → project/odir + 10787 → project/bundle_copy + 10795 → project/cachetags + 10913 → project/arctica + 10942 → project/pager_for_content_type + 11093 → project/fieldgroup_htabs + 11136 → project/survey_builder + 11200 → project/black_hole + 11214 → project/amazon_import + 11286 → project/comment_goodness + 11295 → project/entityform + 11324 → project/drupalace + 11394 → project/context_date + 11404 → project/twentyeleven + 11481 → project/fieldgroup_callouts + 11503 → project/list_predefined_options + 11529 → project/drupalgap + 11537 → project/drupalcon_base + 11542 → project/cgpa_calculator + 11552 → project/novalnet + 11565 → project/ua_cache_bypass + 11613 → project/cforge + 11635 → project/shareaholic + 11641 → project/mongodrop + 11653 → project/elms_features + 11684 → project/views_dependent_filters + 11704 → project/voipuser + 11861 → project/erpal + 11880 → project/aether + 11900 → project/devshop_hosting + 11943 → project/rocketship + 11953 → project/hpcloud + 12057 → project/redhen_demo + 12072 → project/relation_add + 12118 → project/rebuild + 12168 → project/node_notify + 12192 → project/comment_easy_reply + 12442 → project/node_field + 12462 → project/opac + 12511 → project/panels_frame + 12520 → project/engagement + 12559 → project/fieldgroup_placeholder + 12583 → project/deeplink + 12593 → project/commerce_payleap + 12625 → project/booking_com_api + 12643 → project/search_api_acquia + 12677 → project/bundle_aggregation + 12690 → project/ole + 12717 → project/1635422 + 12848 → project/html_title + 13003 → project/syndicator + 13021 → project/adbc + 13039 → project/opigno_glossary + 13086 → project/fetcher + 13111 → project/ddcla + 13125 → project/transcribe_distribution + 13258 → project/wildfire + 13263 → project/move_user + 13323 → project/tmgmt_server + 13340 → project/autoslave + 13349 → project/visualization + 13366 → project/prh_search + 13452 → project/memory_profiler + 13458 → project/random_weight + 13590 → project/timezone_picker + 13600 → project/pdfck + 13611 → project/session_cache + 13628 → project/wem + 13635 → project/commerce_booking + 13754 → project/userpickit + 13758 → project/geckoboard_push + 13854 → project/openbadging + 13895 → project/ajaxnewcounter + 13917 → project/simpleantispam + 14076 → project/dynamodb + 14095 → project/wysiwyg_ckeditor + 14103 → project/factorydrone + 14136 → project/sshid + 14139 → project/courseplanner + 14211 → project/restaurant + 14333 → project/wf + 14446 → project/tr_kurulum + 14448 → project/blurry + 14469 → project/background_audio + 14470 → project/field_group_ajaxified_multipage + 14506 → project/tb_blog_starter + 14507 → project/tb_events_starter + 14509 → project/tb_hadelis_starter + 14510 → project/tb_methys_starter + 14511 → project/tb_mollise_starter + 14512 → project/tb_neris_starter + 14513 → project/tb_palicico_starter + 14514 → project/tb_purity_starter + 14515 → project/tb_rave_starter + 14522 → project/tb_sirate_starter + 14523 → project/gladcamp + 14614 → project/latest + 14636 → project/md_foto + 14682 → project/content_access_view + 14693 → project/feeds_tamper_string2id + 14698 → project/portal_theme + 14713 → project/uyan + 14723 → project/og_admin_block + 14728 → project/fontello + 14784 → project/past + 14786 → project/paddle_menu_manager + 14796 → project/comment_fragment + 14853 → project/memcache_storage + 14926 → project/commons_migration + 15002 → project/fts + 15015 → project/bootstrap_fieldgroup + 15045 → project/endicia + 15128 → project/entity_lister + 15185 → project/context_cache + 15194 → project/og_menu_single + 15203 → project/icomoon + 15222 → project/open_badging_installation_profile + 15268 → project/visualization_d8 + 15275 → project/ads + 15291 → project/fluxservice + 15378 → project/cm_cablecast + 15435 → project/drupdates + 15487 → project/optimizedb + 15497 → project/bassets_sw + 15568 → project/content_trust + 15590 → project/bear_skin + 15613 → project/sauce + 15649 → project/contextly + 15654 → project/rio + 15660 → project/markaspot + 15665 → project/drupal_wall + 15666 → project/pathed_files + 15691 → project/social_comments + 15746 → project/openpolitic + 15846 → project/abc + 15952 → project/monitoring + 16013 → project/simple_aggregation + 16050 → project/user_content_type + 16052 → project/pax_content + 16100 → project/disable_modules + 16108 → project/hookalyzer + 16138 → project/site_search_analytics + 16192 → project/mobilearkickstart + 16243 → project/reevoomark + 16249 → project/enhanced_page_cache + 16252 → project/berry + 16367 → project/inspector + 16382 → project/wunderground_weather + 16498 → project/socialshare + 16545 → project/multipage_navigation + 16549 → project/twbs + 16585 → project/at_base + 16588 → project/at_theming + 16663 → project/ctools_view_access + 16865 → project/persistent_menu_items + 16912 → project/views_selective_filters + 16918 → project/civicrm_event_receipts + 16984 → project/spanish_distribution + 17013 → project/fuse + 17101 → project/kalvi_core + 17142 → project/chatwee + 17146 → project/flipping_book + 17226 → project/visitor_actions + 17283 → project/social_content + 17324 → project/browsersync + 17399 → project/new_relic_insights + 17416 → project/xml_export + 17443 → project/console + 17483 → project/ajax_node_loader + 17523 → project/visitorsvoice + 17618 → project/codebook_core + 17753 → project/codebook_print_pdf + 17769 → project/cove_api + 17814 → project/db_remote + 17822 → project/quickedit + 17872 → project/acquia_search_config + 17914 → project/events_features + 17982 → project/form_default_button + 17996 → project/field_group_save_button + 18036 → project/paypal_roles + 18059 → project/staticfilecache + 18092 → project/eform + 18094 → project/openstack_storage + 18124 → project/qui + 18163 → project/commerce_priceminister + 18181 → project/og_groupcontent + 18191 → project/wincachedrupal + 18291 → project/casperjs + 18292 → project/uc_abandoned + 18297 → project/administrative_help + 18406 → project/url_embed + 18457 → project/simple_nodeblock + 18502 → project/go1_base + 18553 → project/copyscape + 18559 → project/govbr + 18606 → project/oa_wizard + 18708 → project/scholarly_lite + 18710 → project/readmore_ajax + 18752 → project/csf + 18763 → project/quizz + 18777 → project/quandl + 18815 → project/image_download_formatter + 18842 → project/service_container + 18882 → project/better_field_formatters + 18897 → project/qurandistribution + 18927 → project/oa_folders + 18967 → project/redhen_raiser + 19090 → project/settingsphp + 19162 → project/hunter + 19167 → project/usercancel_contentassigntoadmin + 19204 → project/taxonomy_linking + 19210 → project/taxonomy_autolink + 19307 → project/mysql_async + 19319 → project/node_title_help_text + 19339 → project/update_external_links + 19391 → project/canvas + 19409 → project/contentassigntootheruser + 19425 → project/xing_connect + 19494 → project/hierarchical_select_access + 19499 → project/yaqut_epub_generator + 19654 → project/commune + 19677 → project/priority_queue + 19746 → project/social_feed_field + 19807 → project/wechat_views + 19847 → project/commerce_order_reminder + 19876 → project/flysystem + 19961 → project/feeds_entity_processor + 19970 → project/entity_gallery + 20010 → project/domain_wise_aggregation + 20047 → project/stacksight + 20051 → project/componentize + 20056 → project/sqlbuddy + 20087 → project/hooks + 20151 → project/contact_centre + 20172 → project/selective_tweets + 20176 → project/private_image_cache + 20260 → project/soauth + 20289 → project/commerce_checkout_products_list + 20330 → project/tagged_systemqueue + 20381 → project/future_nodes + 20410 → project/devinci + 20426 → project/orghunter + 20447 → project/era + 20484 → project/mpub + 20556 → project/bundle_copy_commerce + 20588 → project/motionpoint + 20692 → project/basic_stats_token + 20730 → project/saml_idp + 20814 → project/editor_advanced_link + 20853 → project/stop_broken_link_in_body + 20879 → project/commerce_behat + 20888 → project/editor_ckeditor_widgets + 20971 → project/experd + 20976 → project/glazed_free + 20979 → project/git_book + 20990 → project/development + 21018 → project/amber + 21023 → project/couchbasedrupal + 21067 → project/supercache + 21069 → project/yamlform + 21075 → project/services_session_token_auth + 21127 → project/freshdesk_sso + 21149 → project/oa_basetheme + 21156 → project/rocket_chat + 21172 → project/user_access_timeslot + 21228 → project/big_pipe_demo + 21241 → project/techsupport + 21242 → project/tsm + 21317 → project/content_browser + 21439 → project/quick_pages + 21441 → project/field_group_table_component + 21452 → project/grant + 21548 → project/skillset_inview + 21579 → project/clu + 21609 → project/confi + 21675 → project/display_machine_name + 21683 → project/migrate_views + 21780 → project/anonymous_subscriptions + 21791 → project/find_text + 21816 → project/patternlab + 21827 → project/chartjs + 21828 → project/program + 21898 → project/ectostar_standard + 21934 → project/riddle_marketplace + 21936 → project/session_entity + 22307 → project/config_split + 22324 → project/berf + 22337 → project/apcu + 22341 → project/pdftemplate + 22401 → project/customizable_entities + 22479 → project/paragraphs_summary + 22530 → project/agov_base + 22547 → project/entity_reference_override + 22613 → project/smartparticipation + 22692 → project/discussions + 22735 → project/emulsify + 22810 → project/npop + 22819 → project/dawn + 23010 → project/message_private + 23034 → project/pki_ra + 23064 → project/updated + 23072 → project/csv_to_config + 23130 → project/admin_toolbar_content_languages + 23279 → project/condition_pack + 23284 → project/rel_content + 23311 → project/sports_league + 23354 → project/commerce_currency_switcher + 23398 → project/reporting_cloud + 23431 → project/transfer_user_content + 23447 → project/showcase_lite + 23448 → project/bynder + 23470 → project/gp_reviews + 23523 → project/scoopit + 23632 → project/complex_workflow + 23685 → project/rules_letter + 23717 → project/baidumap_fieldtype + 23726 → project/entity_keyvalue + 23838 → project/views_ajax_form + 23853 → project/cision_block + 23874 → project/node_creator_system_details + 23954 → project/wysiwyg_trumbowyg + 24022 → project/domain_video_sitemap + 24037 → project/proconcom + 24042 → project/bundle_copy_profile2 + 24046 → project/bulk_update_fields + 24064 → project/social_media_integration + 24128 → project/drush_async_api + 24220 → project/message_thread + 24357 → project/gitinfo + 24364 → project/domain_simple_sitemap + 24420 → project/razoreye_biz + 24449 → project/ppoidc + 24505 → project/tmgmt_transifex + 24699 → project/kashmir + 24787 → project/quicker_login + 24795 → project/abookings + 24829 → project/node_revision_private_files_access_permission + 25066 → project/search_api_lucene + 25097 → project/drupal_extra + 25172 → project/sketch + 25232 → project/green_theme + 25257 → project/background_image + 25294 → project/pankm + 25315 → project/auto_alter + 25326 → project/bif + 25336 → project/uc_recently_viewed_products + 25437 → project/sendinblue_rules + 25438 → project/acal + 25448 → project/entity_overlay + 25453 → project/byu_theme + 25475 → project/examplelist + 25524 → project/rsvp_list + 25540 → project/entity_browser_block + 25544 → project/sshop + 25548 → project/jats_generator + 25567 → project/synimage + 25577 → project/dut + 25598 → project/bynder_orbit + 25665 → project/ckeditor_config + 25692 → project/ovh + 25713 → project/authtoken + 25865 → project/image_moderate + 25894 → project/external_page_redirect + 25896 → project/byu_installation_profile + 25927 → project/automatic_field_saver + 25985 → project/entity_domain_access + 26017 → project/hook_manager + 26025 → project/belle + 26057 → project/temporary_download + 26081 → project/page_hits + 26124 → project/plus + 26141 → project/node_creation_links + 26169 → project/yg_booster + 26233 → project/yg_charity + 26260 → project/rss_embed_field + 26339 → project/yg_flew + 26708 → project/simple_multistep + 26713 → project/tally + 26733 → project/timber + 26816 → project/mustache_templates + 26838 → project/multitype_slider + 26869 → project/friendship + 26902 → project/skyword + 26951 → project/field_pager + 26961 → project/communications + 27005 → project/social_post_video + 27033 → project/corporate_lite + 27106 → project/page_menu_reorder + 27208 → project/change_author_action + 27283 → project/yg_business_plus + 27296 → project/inline_formatter_field + 27318 → project/yg_business_line + 27349 → project/yg_medical + 27405 → project/real_estate_lp_profile + 27409 → project/esm + 27445 → project/simple_sitemap_views + 27526 → project/node_menu_item_visibility_default_behaviour + 27553 → project/dam + 27656 → project/entity_reference_ajax_formatter + 27712 → project/client_config_care + 27734 → project/conference_lite + 27736 → project/guesthouse_lite + 27744 → project/lms + 27768 → project/yg_aesthetic + 27770 → project/yg_hotel + 27844 → project/yg_medicare + 27845 → project/social_auth_itsme + 27922 → project/yg_iconic + 27923 → project/yg_law_firm + 27952 → project/template_entities + 28029 → project/entity_grants + 28148 → project/yg_creative + 28302 → project/sparql_entity_storage + 34868 → project/islandora + 44107 → project/qtools_common + 45456 → project/digitalclock + 47202 → project/yg_solid + 47221 → project/yg_black + 47231 → project/module_maker + 47295 → project/node_export + 47298 → project/mailing_list + 47385 → project/entity_embed + 47401 → project/materialize + 47422 → project/twig_tweak + 47583 → project/userswitch + 47825 → project/entity_hierarchy + 47873 → project/field_group_label_classes + 47880 → project/entity_list + 48060 → project/smartling + 48123 → project/certificate + 48161 → project/ULT + 49251 → project/feed_block + 49252 → project/community_tasks + 49470 → project/config_entity_revisions + 49566 → project/multi_render_formatter + 49677 → project/icn + 49723 → project/mutual_credit + 49725 → project/drd + 49900 → project/onetime_download + 49956 → project/abtestui + 49979 → project/bulk_update_fields_commerce + 50151 → project/entity_translation + 50161 → project/dbee + 50166 → project/wsdata + 50178 → project/ckeditor_mentions + 50229 → project/bulk_copy_fields + 50230 → project/vfd + 50362 → project/election + 50434 → project/slack_receive + 50437 → project/dvg_stuf_bg + 50565 → project/custom_list + 50738 → project/user_delete_reassign + 50819 → project/spambot + 51085 → project/workbench_moderation + 51166 → project/odoo_api + 51217 → project/tide_core + 51218 → project/tide_api + 51249 → project/amazon + 51344 → project/usajobs_integration + 51352 → project/autosave_form + 51358 → project/entity_reference_uuid + 51380 → project/views_entity_embed + 51393 → project/login_alert + 51461 → project/auto_nodetitle + 51487 → project/maps_suite + 51500 → project/project + 51684 → project/views_extras + 51722 → project/filebrowser + 51727 → project/token + 51772 → project/onlyone + 51850 → project/anonymous_publishing + 51935 → project/views_advanced_cache + 52040 → project/salesforce_auth + 52081 → project/simple_node_importer + 52106 → project/delphi + 52126 → project/preserve_changed + 52158 → project/api + 52161 → project/og + 52207 → project/feeds + 52281 → project/civicrm_entity + 52307 → project/cultura + 52538 → project/content_packager + 52555 → project/field_formatter_key_label + 52646 → project/shopify + 52855 → project/idea + 53194 → project/authcache + 53222 → project/metatag + 53388 → project/config_pages + 53457 → project/openstory + 53533 → project/opigno_learning_path + 53807 → project/boxout + 53828 → project/bootstrap4 + 53860 → project/bahai_incubator + 54115 → project/course + 54190 → project/file_shelf + 54226 → project/gathercontent + 54247 → project/contacts + 54674 → project/riddler + 54935 → project/translation_views + 55014 → project/performance_toolkit + 55171 → project/votingapi + 55234 → project/flmngr + 55297 → project/flexi_pattern_lab + 55408 → project/global_gateway + 55425 → project/ckeditor_codemirror + 55547 → project/facebook_pixel + 55687 → project/tmgmt_deepl + 55697 → project/acquia_commercemanager + 55750 → project/read_time + 55755 → project/social_hub + 55801 → project/deploy_key + 55863 → project/depcalc + 55883 → project/swagger_ui_formatter + 55957 → project/quick_node_clone + 56187 → project/closedquestion_scoreboard + 56221 → project/datex + 56286 → project/dynamic_entity_reference + 56296 → project/editor_advanced_image + 56300 → project/potion + 56320 → project/plugin + 56359 → project/languagefield + 56521 → project/controller_annotations + 56659 → project/ercore + 56706 → project/registration_form + 56719 → project/multiversion + 56769 → project/hold_my_draft + 56855 → project/tmgmt + 56876 → project/tmgmt_smartling + 56945 → project/questions_answers + 56975 → project/d6lts + 57226 → project/edit_content_type_tab + 57266 → project/protected_file + 57564 → project/tome + 57654 → project/advagg + 57655 → project/miniorange_oauth_client + 57678 → project/eid_auth + 57706 → project/lightning_workflow + 57717 → project/dvg_appointments + 57777 → project/google_analytics_counter + 57841 → project/gdpr + 57971 → project/automatic_updates + 57997 → project/campaignion + 58047 → project/apigee_m10n + 58053 → project/media_migration + 58118 → project/restful + 58193 → project/tripal + 58220 → project/wim + 58233 → project/openpublic + 58249 → project/smartid_auth + 58354 → project/acsf + 58383 → project/dvg + 58470 → project/entity_translation_unified_form + 58509 → project/wxt + 58608 → project/lightning_core + 58633 → project/openfed + 58647 → project/views + 58658 → project/df + 58720 → project/apigee_edge + 58746 → project/crypto_distribution + 58759 → project/outlayer + 58768 → project/rng + 59005 → project/social + 59035 → project/lightning_layout + 59097 → project/easy_booking + 59133 → project/entityqueue + 59145 → project/brightcove + 59179 → project/nbox + 59186 → project/daterange_simplify + 59234 → project/devel + 59279 → project/searchstax + 59375 → project/private_message + 59387 → project/checklistapi + 59396 → project/ds + 59401 → project/file_entity + 59409 → project/pp_graphsearch + 59468 → project/probo + 59473 → project/rules + 59484 → project/stratoserp + 59503 → project/degov + 59514 → project/ctools + 59586 → project/monster_menus + 59603 → project/lingotek + 59610 → project/group + 59614 → project/entity_import + 59615 → project/salesforce + 59618 → project/intercept + 59642 → project/wisski + 59644 → project/simple_sitemap + 59671 → project/field_group + 59676 → project/skilling + 59691 → project/cilogon_auth + 59699 → project/tara + 59714 → project/thunder + 59723 → project/indieweb + 59736 → project/rocketship_core + 59739 → project/geolocation + 59741 → project/ckeditor_uploadimage + 59747 → project/cms_content_sync + 59781 → project/computed_field + 59814 → project/search_api + 59815 → project/search_api_autocomplete + 59833 → project/search_api_saved_searches + 59843 → project/bat + 59849 → project/cloud + 59851 → project/gutenberg + 59857 → project/acquia_contenthub + 59873 → project/viewfield + 59888 → project/paddle_selenium_tests + 59890 → project/simply_signups + 59891 → project/infrastructure + 59899 → project/facet_granular_date + 59930 → project/telega + 59941 → project/smart_date + 59956 → project/communication + 59984 → project/ui_patterns_settings + 59988 → project/evangelische_termine + 60013 → project/participatory_process + 60036 → project/mili + 60037 → project/link_field_display_mode_formatter + 60038 → project/conference_suite + 60087 → project/exsen + 60215 → project/aeg + 60227 → project/govimentum + 60278 → project/jsonapi_comment + 60301 → project/markdown_exporter + 60334 → project/minimal_lite + 60395 → project/muser + 60487 → project/cypress + 60491 → project/imotilux + 60499 → project/d_test + 60502 → project/simplifying + 60508 → project/js_entity + 60517 → project/revisiondiff + 60625 → project/gearbox + 60656 → project/decoupled + 60682 → project/delivery + 60695 → project/pub_options + 60837 → project/virtualcare + 60863 → project/druvel + 60909 → project/inline_image_token + 60916 → project/jsonapi_example + 61069 → project/audit_monitoring + 61073 → project/meta_entity + 61092 → project/views_extender + 61195 → project/deprecation_status + 61256 → project/gtfs + 61270 → project/inline_field_group + 61313 → project/stack_dd + 61358 → project/catalog_lite + 61386 → project/commercetools + 61449 → project/moderation_team + 61530 → project/language_suggestion + 61656 → project/bootstrap_italia + 61659 → project/entity_visibility_preview + 61662 → project/commerce_store_override + 61791 → project/elegant_showcase + 61809 → project/lw_groups + 61877 → project/clockify + 61899 → project/commerce7_razorpay + 62017 → project/nodeinfo + 62055 → project/eus + 62102 → project/ms_react + 62128 → project/hubspot_integration + 62173 → project/content_admin_tools + 62331 → project/knowledge + 62371 → project/zuvi + 62378 → project/drupalru_d7 + 62382 → project/arch + 62418 → project/pager_serializer + 62421 → project/sitemorse_lite + 62490 → project/tactic + 62579 → project/vani + 62602 → project/social_media_api + 62687 → project/workflow_extras + 62699 → project/smart_content_ipstack + 62719 → project/entity_reference_preview + 62728 → project/sri + 62760 → project/admin_can_login_anyuser + 62764 → project/cookie_samesite_support + 62772 → project/file_update + 62785 → project/entity_sync + 62790 → project/ezcontent_api + 62842 → project/untatu + 62851 → project/entity_reference_dynamic_display + 62868 → project/dxpr_theme + 62934 → project/zinble + 63073 → project/tweet_reference + 63108 → project/licenses + 63118 → project/dplor + 63177 → project/mtc + 63218 → project/oidc + 63299 → project/tranc + 63343 → project/ckeditor_exclude_tags + 63480 → project/ezcontent_publish + 63487 → project/eu_cookie_compliance_rocketship + 63489 → project/oidc_mcpf + 63559 → project/layoutcomponents + 63588 → project/acquia_migrate + 63624 → project/ubershopwish + 63669 → project/ggroup + 63725 → project/photogenictheme + 63757 → project/neon_api + 63790 → project/taxonomy_parents_index + 63797 → project/eventer + 63847 → project/fmrest + 63969 → project/dolphin_theme + 63976 → project/simple_oauth_facebook_connect + 64020 → project/lgpd + 64036 → project/grapesjs_editor + 64084 → project/entity_track + 64133 → project/bing_ads + 64168 → project/cmrf_form_processor + 64219 → project/ginvite + 64223 → project/publisso_gold + 64291 → project/entitree + 64348 → project/simple_oauth_google_connect + 64520 → project/robolytix + 65320 → project/multilingual_plus + 65525 → project/social_media_image_generator + 65774 → project/backdrop_upgrade_status + 66086 → project/opendevportal + 66091 → project/rmkv + 66097 → project/rating_list + 66128 → project/bootstrap5 + 66142 → project/basket + 66228 → project/edux + 67002 → project/next_views_entity_reference + 67217 → project/socialblue + 67475 → project/entity_reference_views_backfill + 67940 → project/anonymoussession + 68121 → project/nested_entity_reference_formatter + 68321 → project/views_migration + 68467 → project/rsvplist + 68595 → project/social_auth_buttons + 69687 → project/sanitize_pii + 69747 → project/cmrf_core + 69929 → project/stackla_widget + 69954 → project/date_augmenter + 70307 → project/ruhi + 70422 → project/mycity + 70928 → project/field_completeness + 71484 → project/timezone_calculator + 71508 → project/drupalsqlsrvci + 71887 → project/rocketship_florista_demo_profile + 72178 → project/field_encrypt_searchable + 72597 → project/intl_date + 72831 → project/node_randomizer + 73073 → project/opigno_social + 73144 → project/learnosity + 73211 → project/ajans + 73212 → project/worldmap + 73291 → project/acquia_perz + 73338 → project/feedstextareafetcher + 73343 → project/mailchimp_transactional + 73813 → project/toast_messages + 74275 → project/views_override_viewmode + 74572 → project/commerce_factuursturen + 74592 → project/gtfs_511 + 74593 → project/gtfs_rt + 74600 → project/gtfs_geo + 75981 → project/payment_button_drupal_plugin + 76180 → project/eau_theme + 76361 → project/edwt + 77509 → project/testproject4234 + 78054 → project/audit_report + 78499 → project/usage_data + 78721 → project/commerce_ticketing_checkin + 79554 → project/external_entity + 79588 → project/gnode_request + 79702 → project/public_revisions + 80771 → project/ckeditor_custom_paste_filters + 80778 → project/lingo24 + 81033 → project/cookies_module_handler + 81045 → project/custom_field + 81142 → project/view_mode_crop + 81278 → project/migrate_visualize + 81804 → project/node_singles + 81814 → project/entity_sort + 81865 → project/entity_references_map + 81896 → project/ayrshare + 82252 → project/reassign_user_content + 82260 → project/commerce_invoice_ubl + 82297 → project/tracker + 82549 → project/xara + 82962 → project/hook_event + 83095 → project/session_inspector + 83284 → project/whereabouts + 83449 → project/sitewide_alerts + 83700 → project/schemadotorg + 83752 → project/veracity_vql + 84590 → project/trailless_menu + 84617 → project/acquia_dam + 85308 → project/tmgmt_smartcat + 85551 → project/widen_media + 85563 → project/stage_one_theme + 86013 → project/content_moderation_node_grants + 86019 → project/creative_innovative + 86134 → project/crema + 86288 → project/particles_orange + 86399 → project/sva + 86424 → project/dark_awesome + 86809 → project/social_auth_tiktok_decouple + 86813 → project/address_suggestion + 86956 → project/social_auth_apple_decouple + 87283 → project/dxpr_builder + 87638 → project/group_entity + 88384 → project/uninstall_unexisting + 88438 → project/entity_distribution + 88882 → project/group_domain + 89428 → project/tone + 90367 → project/cellular4drupal + 90572 → project/dsfr + 90708 → project/library_management_system + 91077 → project/smart_migrate_cli + 91175 → project/idyllic + 92163 → project/dark_page + 92291 → project/smash_lite + 92563 → project/eventbrite_one_way_sync + 92852 → project/image_as_media + 92961 → project/asset_autoload + 93001 → project/queue_scheduler + 93188 → project/ckeditor5_premium_features + 93199 → project/function_autoload + 93499 → project/test_helpers + 93801 → project/seb + 94979 → project/marvelous + 94996 → project/vwo + 95795 → project/video_toolbox + 95804 → project/datafield + 95840 → project/loop_workers + 96166 → project/media_filter + 96282 → project/access_policy + 98695 → project/social_group_types + 99033 → project/menu_parser_php + 99358 → project/granulartimecache + 101539 → project/acumatica + 101942 → project/unpublished_file + 102735 → project/fashion_beauty + 102813 → project/date_occur + 104004 → project/ws_event + 104066 → project/ckeditor5_highlight + 104812 → project/scorm_field + 105011 → project/nostr_id_nip05 + 107494 → project/group_welcome_message + 108775 → project/ckeditor5_mentions + 108783 → project/views_moderation_state_weights + 109268 → project/group_media_library_extra + 109975 → project/rest_entity_display + 109993 → project/social_lms_integrator + 110336 → project/mahi + 110398 → project/views_sql_twig_fields + 110798 → project/hook_profiler + 111315 → project/vcp4dates + 111643 → project/published_referenced_entity + 112735 → project/core_logs + 113806 → project/ct_expire + 113931 → project/visual_editor + 115517 → project/power_portfolio + 115956 → project/pwbi + 116041 → project/nodehive_core + 116100 → project/ckeditor5_spoiler + 116731 → project/kart + 116841 → project/potent_allure + 117060 → project/rhythm + 117346 → project/txt42 + 117773 → project/engaging_networks + 117973 → project/harmony_haven + 118186 → project/novel_delights + 118568 → project/custom_entity_example + 118693 → project/entity_usage_updater + 119094 → project/kamihaya_cms + 119344 → project/entity_sync_odata + 119794 → project/link_description_attributes + 120281 → project/decorx + 120874 → project/abinbev_gmap + 120883 → project/diner_delights + 121122 → project/ckeditor_lts + 122249 → project/business_dev + 123514 → project/twilio_otp_login + 124420 → project/service + 124680 → project/multi_purpose + 126576 → project/time_clock + 127054 → project/animal_shelter + 127162 → project/current_date_time + 127276 → project/entity_reference_edit_link + 128959 → project/view_filter_promotion + 129676 → project/tiendaparamipyme + 131151 → project/pantheon_autopilot_toolbar + 132406 → project/nitropack + 132503 → project/edit_plus + 133730 → project/rdf_sync + 134090 → project/ecwid + 134243 → project/git_wiki_help + 135576 → project/everlms + 135646 → project/sgd_user_status + 135785 → project/ckeditor_braille + 138963 → project/feature_boost + 139702 → project/pets_clinic + 142569 → project/ckeditor5_plugin_pack + 143385 → project/experience_builder + 144182 → project/lgms + 144795 → project/expirable_content + 145116 → project/diboo_core + 146166 → project/cm_data_layer + 147460 → project/ckeditor_historylog + 147502 → project/media_views_filter + 148214 → project/sgd_watchdog_summary + 148466 → project/field_group_vertical_tabs + 149523 → project/ckeditor5_deepl + 150232 → project/smileys_field + 150956 → project/session_management + 151194 → project/a12s_locations + 152219 → project/duplicate_node + 152311 → project/more_fields + 154062 → project/acquia_vwo + 154063 → project/view_usernames_node_author + 154357 → project/loginnotification + 154509 → project/consent_management + 157751 → project/diba_clean + 158230 → project/media_icon_deliver + 158891 → project/ai_agents + 159795 → project/micronode_block + 160629 → project/drupalfit + 161548 → project/mdp + 161998 → project/bootstrap3 + 162094 → project/localist_drupal + 163174 → project/ai_eca + 163611 → project/secure_nodes + 163816 → project/ai_ckeditor_extras + 164248 → project/externalauth_force + 164485 → project/social_auth_entra_id + 166002 → project/bibliocommons + 167065 → project/mail_box_management + 167487 → project/search_api_exclude_lb + 167646 → project/theme_file_editor + 168630 → project/substitutoo + 170081 → project/nava + 170818 → project/ai_upgrade_assistant + 171755 → project/entity_mesh + 172885 → project/deepseek + 174206 → project/logout_timeout + 176726 → project/override_cache_control_headers + 176774 → project/unused_files_delete + 177369 → project/smartlinker_ai + 179254 → project/book_library_api + 179857 → project/track_usage + 179884 → project/unused_media_filter + 179931 → project/media_folders + 180259 → project/schema_form + 180286 → project/file_visibility + 181203 → project/json_drop_api + 181319 → project/sdx + 183657 → project/search_api_postgresql + 185077 → project/salesforce_push_queue_ui + 185845 → project/babel + 188516 → project/open_vocabularies + 188930 → project/dsfr4drupal_picker + 189447 → project/drupal_content_repository + 190652 → project/orchestration + 190686 → project/chromeless + 191533 → project/simpleavs + 193057 → project/toast_image_editor + 193305 → project/simplesamlphp_sp + 193866 → project/module_file_editor + 195589 → project/saar + 195972 → project/ckeditor5_scroll_fix + 196049 → project/stenographer + 196085 → project/graphql_shield + 196314 → project/livre + 196530 → project/rendred_entity_list_formatter + 196536 → project/rendered_entity_list_formatter + 197809 → project/editor_advanced_table + 197857 → project/user_logout + 198724 → project/ai_editoria11y + 200208 → project/conreg + 200422 → project/uni + 200814 → project/rail_ai_provider + 201686 → project/layout_builder_formatter + 202019 → project/junk_drawer + 202556 → project/youtube_live_video + 203641 → project/itunes_rss + 204384 → project/ffmpeg_media + 207471 → project/ai_agents_experimental_collection + 207806 → project/drupal_saml_bridge + 208118 → project/drupal_devkit + 208312 → project/simple_sitemap_authenticated + 208618 → project/token_browser_plus + 209328 → project/flo + 209517 → project/gadget + 209554 → project/custom_paragraphs + 210105 → project/drupal_canvas_plugin + 210430 → project/drupal_cli + 211056 → project/content_dependency_graph + 211072 → project/ai_schemadotorg_jsonld diff --git a/docs/search_results.json b/docs/search_results.json new file mode 100644 index 000000000..01a01a078 --- /dev/null +++ b/docs/search_results.json @@ -0,0 +1,24248 @@ +{ + "rector_hits": { + "FileSystemBasenameToNativeRector": [ + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "CREDITS.TXT" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "DICTIONARY.TXT" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "aggregator-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "archive-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "block-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "blog-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "blogapi-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "book-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "color-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "comment-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "common-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "contact-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "content_types-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "drupal-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "file-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "filter-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "form-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "forum-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "general.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "installer.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "locale-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "locale-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "menu-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "node-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "outros_modulos/gsitemap/gsitemap-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "outros_modulos/service_links/service_links-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "path-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "poll-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "profile-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "search-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "statistics-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "system-install.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "system-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "taxonomy-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "theme-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "throttle-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "tracker-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "unicode-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "upload-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "user-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "watchdog-module.po" + }, + { + "project_id": 289, + "project_name": "project/livediscussions", + "filename": "live_discussions.module" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "arrow-next-hover.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "arrow-prev-hover.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "arrow-prev.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "arrow-up-hover.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "background.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "block.tpl.php" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "box.tpl.php" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "forum-container.jpg" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "forum-link.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "header-a.jpg" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "icon-block.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "logo-active.jpg" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "logo.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "node.tpl.php" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "style.css" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "tabs-off.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "tabs-on.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "tabs-option-hover.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "tabs-option-on.png" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "README.txt" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "archive-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "block-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "blogapi-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "book-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "common-inc.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "drupal-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "file-inc.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "locale-inc.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "locale-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "menu-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "node-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "poll-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "profile-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "search-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "statistics-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "story-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "system-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "taxonomy-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "throttle-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "upload-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "user-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "watchdog-module.po" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "README.txt" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "ma_blogit/README.txt" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "ma_blogit/ma_blogit.module" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "ma_bzip2/ma_bzip2.module" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "ma_gzip/README.txt" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "ma_gzip/ma_gzip.module" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "mail_archive.mysql" + }, + { + "project_id": 310, + "project_name": "project/sitemenu", + "filename": "sitemenu.info" + }, + { + "project_id": 310, + "project_name": "project/sitemenu", + "filename": "sitemenu.module" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "binder.control" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "docs/binder-1.png" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "docs/binder_schema.png" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "docs/g6685.png" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "docs/rigid-vs-fluid.html" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "docs/state_machines_and_metadata.html" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "docs/text1709.png" + } + ], + "LoadAllIncludesRector": [ + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": ".gitignore" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/cache-install.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/database/log.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/database/sqlite/select.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/errors.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/filetransfer/local.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/filetransfer/ssh.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/install.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/lock.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/menu.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/password.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/farbtastic/farbtastic.js" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/jquery.js" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/powered-blue-80x15.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/powered-gray-135x42.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/ui/jquery.ui.selectable.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/ui/jquery.ui.slider.min.js" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/aggregator/aggregator-feed-source.tpl.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/aggregator/tests/aggregator_test_atom.xml" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/block/block.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/block/block.js" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/color/color.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.api.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/contact/contact.admin.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/contact/contact.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/dashboard/dashboard.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/field.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/modules/list/list.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/modules/number/number.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/tests/field_test.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/tests/field_test.storage.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field_ui/field_ui.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/file/icons/application-x-executable.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/file/icons/text-html.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/file/icons/text-x-generic.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/file/icons/x-office-document.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/filter/filter.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/filter/filter.pages.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/forum/forum.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/help/help.api.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/locale/locale.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/node/node.tokens.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/node/tests/node_access_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/node/tests/node_test_exception.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/openid/tests/openid_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/path/path.admin.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/php/php.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/poll/poll-results.tpl.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/rdf/rdf.api.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/rdf/tests/rdf_test.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/search/search.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/search/search.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/search/tests/search_embedded_form.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/search/tests/search_extra_type.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/files/css_test_files/comment_hacks.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/files/css_test_files/comment_hacks.css.unoptimized.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/files/javascript-2.script" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/simpletest.js" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/actions.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/ajax_test.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/error.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/graph.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/image_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/password.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/path_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/requirements1_test.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/system_incompatible_core_version_dependencies_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/system_incompatible_module_version_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/theme_test.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/unicode.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/upgrade/drupal-6.upload.database.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/upgrade/drupal-6.user-password-token.database.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/upgrade/upgrade.comment.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/statistics/statistics.pages.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/syslog/syslog.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/syslog/syslog.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/system/system.archiver.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/system/system.queue.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/system/system.updater.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/taxonomy/taxonomy.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/tracker/tracker.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/trigger/trigger.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/update/tests/aaa_update_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/update/tests/drupal.0.xml" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/user/tests/user_form_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/user/tests/user_form_test.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/user/user.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/README.txt" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/bartik/css/print.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/bartik/images/buttons.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/garland/fix-ie.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/garland/logo.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/seven/images/ui-icons-ffffff-256x240.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/seven/page.tpl.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/seven/style.css" + } + ], + "MigrateSqlGetMigrationPluginManagerRector": [ + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": ".gitignore" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/cache-install.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/database/log.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/database/sqlite/select.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/errors.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/filetransfer/local.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/filetransfer/ssh.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/install.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/lock.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/menu.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/password.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/farbtastic/farbtastic.js" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/jquery.js" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/powered-blue-80x15.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/powered-gray-135x42.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/ui/jquery.ui.selectable.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/ui/jquery.ui.slider.min.js" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/aggregator/aggregator-feed-source.tpl.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/aggregator/tests/aggregator_test_atom.xml" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/block/block.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/block/block.js" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/color/color.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.api.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/contact/contact.admin.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/contact/contact.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/dashboard/dashboard.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/field.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/modules/list/list.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/modules/number/number.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/tests/field_test.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/tests/field_test.storage.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field_ui/field_ui.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/file/icons/application-x-executable.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/file/icons/text-html.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/file/icons/text-x-generic.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/file/icons/x-office-document.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/filter/filter.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/filter/filter.pages.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/forum/forum.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/help/help.api.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/locale/locale.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/node/node.tokens.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/node/tests/node_access_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/node/tests/node_test_exception.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/openid/tests/openid_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/path/path.admin.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/php/php.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/poll/poll-results.tpl.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/rdf/rdf.api.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/rdf/tests/rdf_test.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/search/search.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/search/search.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/search/tests/search_embedded_form.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/search/tests/search_extra_type.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/files/css_test_files/comment_hacks.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/files/css_test_files/comment_hacks.css.unoptimized.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/files/javascript-2.script" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/simpletest.js" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/actions.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/ajax_test.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/error.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/graph.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/image_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/password.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/path_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/requirements1_test.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/system_incompatible_core_version_dependencies_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/system_incompatible_module_version_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/theme_test.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/unicode.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/upgrade/drupal-6.upload.database.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/upgrade/drupal-6.user-password-token.database.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/upgrade/upgrade.comment.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/statistics/statistics.pages.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/syslog/syslog.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/syslog/syslog.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/system/system.archiver.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/system/system.queue.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/system/system.updater.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/taxonomy/taxonomy.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/tracker/tracker.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/trigger/trigger.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/update/tests/aaa_update_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/update/tests/drupal.0.xml" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/user/tests/user_form_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/user/tests/user_form_test.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/user/user.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/README.txt" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/bartik/css/print.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/bartik/images/buttons.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/garland/fix-ie.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/garland/logo.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/seven/images/ui-icons-ffffff-256x240.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/seven/page.tpl.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/seven/style.css" + } + ], + "NodeStorageDeprecatedMethodsRector": [ + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "CREDITS.TXT" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "DICTIONARY.TXT" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "aggregator-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "archive-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "block-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "blog-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "blogapi-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "book-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "color-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "comment-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "common-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "contact-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "content_types-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "drupal-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "file-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "filter-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "form-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "forum-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "general.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "installer.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "locale-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "locale-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "menu-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "node-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "outros_modulos/gsitemap/gsitemap-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "outros_modulos/service_links/service_links-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "path-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "poll-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "profile-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "search-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "statistics-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "system-install.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "system-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "taxonomy-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "theme-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "throttle-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "tracker-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "unicode-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "upload-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "user-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "watchdog-module.po" + }, + { + "project_id": 289, + "project_name": "project/livediscussions", + "filename": "live_discussions.module" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "arrow-next-hover.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "arrow-prev-hover.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "arrow-prev.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "arrow-up-hover.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "background.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "block.tpl.php" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "box.tpl.php" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "forum-container.jpg" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "forum-link.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "header-a.jpg" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "icon-block.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "logo-active.jpg" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "logo.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "node.tpl.php" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "style.css" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "tabs-off.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "tabs-on.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "tabs-option-hover.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "tabs-option-on.png" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "README.txt" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "archive-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "block-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "blogapi-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "book-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "common-inc.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "drupal-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "file-inc.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "locale-inc.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "locale-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "menu-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "node-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "poll-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "profile-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "search-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "statistics-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "story-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "system-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "taxonomy-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "throttle-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "upload-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "user-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "watchdog-module.po" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "README.txt" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "ma_blogit/README.txt" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "ma_blogit/ma_blogit.module" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "ma_bzip2/ma_bzip2.module" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "ma_gzip/README.txt" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "ma_gzip/ma_gzip.module" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "mail_archive.mysql" + }, + { + "project_id": 310, + "project_name": "project/sitemenu", + "filename": "sitemenu.info" + }, + { + "project_id": 310, + "project_name": "project/sitemenu", + "filename": "sitemenu.module" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "binder.control" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "docs/binder-1.png" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "docs/binder_schema.png" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "docs/g6685.png" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "docs/rigid-vs-fluid.html" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "docs/state_machines_and_metadata.html" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "docs/text1709.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": ".gitignore" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/cache-install.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/database/log.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/database/sqlite/select.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/errors.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/filetransfer/local.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/filetransfer/ssh.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/install.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/lock.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/menu.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/password.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/farbtastic/farbtastic.js" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/jquery.js" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/powered-blue-80x15.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/powered-gray-135x42.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/ui/jquery.ui.selectable.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/ui/jquery.ui.slider.min.js" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/aggregator/aggregator-feed-source.tpl.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/aggregator/tests/aggregator_test_atom.xml" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/block/block.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/block/block.js" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/color/color.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.api.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/contact/contact.admin.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/contact/contact.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/dashboard/dashboard.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/field.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/modules/list/list.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/modules/number/number.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/tests/field_test.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/tests/field_test.storage.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field_ui/field_ui.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/file/icons/application-x-executable.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/file/icons/text-html.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/file/icons/text-x-generic.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/file/icons/x-office-document.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/filter/filter.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/filter/filter.pages.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/forum/forum.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/help/help.api.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/locale/locale.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/node/node.tokens.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/node/tests/node_access_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/node/tests/node_test_exception.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/openid/tests/openid_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/path/path.admin.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/php/php.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/poll/poll-results.tpl.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/rdf/rdf.api.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/rdf/tests/rdf_test.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/search/search.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/search/search.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/search/tests/search_embedded_form.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/search/tests/search_extra_type.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/files/css_test_files/comment_hacks.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/files/css_test_files/comment_hacks.css.unoptimized.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/files/javascript-2.script" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/simpletest.js" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/actions.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/ajax_test.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/error.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/graph.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/image_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/password.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/path_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/requirements1_test.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/system_incompatible_core_version_dependencies_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/system_incompatible_module_version_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/theme_test.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/unicode.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/upgrade/drupal-6.upload.database.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/upgrade/drupal-6.user-password-token.database.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/upgrade/upgrade.comment.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/statistics/statistics.pages.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/syslog/syslog.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/syslog/syslog.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/system/system.archiver.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/system/system.queue.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/system/system.updater.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/taxonomy/taxonomy.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/tracker/tracker.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/trigger/trigger.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/update/tests/aaa_update_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/update/tests/drupal.0.xml" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/user/tests/user_form_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/user/tests/user_form_test.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/user/user.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/README.txt" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/bartik/css/print.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/bartik/images/buttons.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/garland/fix-ie.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/garland/logo.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/seven/images/ui-icons-ffffff-256x240.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/seven/page.tpl.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/seven/style.css" + } + ], + "PluginBaseIsConfigurableRector": [ + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "CREDITS.TXT" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "DICTIONARY.TXT" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "aggregator-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "archive-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "block-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "blog-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "blogapi-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "book-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "color-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "comment-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "common-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "contact-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "content_types-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "drupal-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "file-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "filter-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "form-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "forum-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "general.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "installer.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "locale-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "locale-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "menu-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "node-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "outros_modulos/gsitemap/gsitemap-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "outros_modulos/service_links/service_links-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "path-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "poll-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "profile-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "search-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "statistics-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "system-install.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "system-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "taxonomy-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "theme-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "throttle-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "tracker-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "unicode-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "upload-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "user-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "watchdog-module.po" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "arrow-next-hover.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "arrow-prev-hover.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "arrow-prev.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "arrow-up-hover.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "background.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "block.tpl.php" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "box.tpl.php" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "forum-container.jpg" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "forum-link.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "header-a.jpg" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "icon-block.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "logo-active.jpg" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "logo.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "node.tpl.php" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "style.css" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "tabs-off.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "tabs-on.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "tabs-option-hover.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "tabs-option-on.png" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "README.txt" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "archive-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "block-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "blogapi-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "book-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "common-inc.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "drupal-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "file-inc.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "locale-inc.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "locale-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "menu-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "node-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "poll-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "profile-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "search-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "statistics-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "story-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "system-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "taxonomy-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "throttle-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "upload-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "user-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "watchdog-module.po" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "README.txt" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "ma_blogit/README.txt" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "ma_blogit/ma_blogit.module" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "ma_bzip2/ma_bzip2.module" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "ma_gzip/README.txt" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "ma_gzip/ma_gzip.module" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "mail_archive.mysql" + }, + { + "project_id": 306, + "project_name": "project/contact_dir", + "filename": "contact_dir.mysql.sql" + }, + { + "project_id": 310, + "project_name": "project/sitemenu", + "filename": "sitemenu.info" + }, + { + "project_id": 310, + "project_name": "project/sitemenu", + "filename": "sitemenu.module" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "binder.control" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "docs/binder-1.png" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "docs/binder_schema.png" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "docs/g6685.png" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "docs/rigid-vs-fluid.html" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "docs/state_machines_and_metadata.html" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "docs/text1709.png" + } + ], + "RemoveCacheExpireOverrideRector": [ + { + "project_id": 1666, + "project_name": "project/advcache", + "filename": "DRUPAL-6-10/path.patch" + }, + { + "project_id": 1770, + "project_name": "project/pmetrics", + "filename": "pmetrics.install" + }, + { + "project_id": 2121, + "project_name": "project/xcache", + "filename": "xcache.inc" + }, + { + "project_id": 2646, + "project_name": "project/cache_disable", + "filename": "cache_disable.module" + }, + { + "project_id": 2816, + "project_name": "project/cacherouter", + "filename": "engines/db.php" + }, + { + "project_id": 2816, + "project_name": "project/cacherouter", + "filename": "engines/eacc.php" + }, + { + "project_id": 2816, + "project_name": "project/cacherouter", + "filename": "engines/xcache.php" + }, + { + "project_id": 2880, + "project_name": "project/latest_members", + "filename": "latest_members.module" + }, + { + "project_id": 3104, + "project_name": "project/eventbrite", + "filename": "eventbrite.api.inc" + }, + { + "project_id": 4510, + "project_name": "project/querypath", + "filename": "qpcache/qpcache.install" + }, + { + "project_id": 5141, + "project_name": "project/qpservices", + "filename": "qpservices.install" + }, + { + "project_id": 7089, + "project_name": "project/cache_actions", + "filename": "views_plugin_cache_rules.inc" + }, + { + "project_id": 7245, + "project_name": "project/virtual_roles", + "filename": "virtual_roles.module" + }, + { + "project_id": 7900, + "project_name": "project/media_ustream", + "filename": "includes/MediaInternetUStreamHandler.inc" + }, + { + "project_id": 8453, + "project_name": "project/max_age", + "filename": "views/max_age_cache_time.inc" + }, + { + "project_id": 8453, + "project_name": "project/max_age", + "filename": "views/max_age_content_cache.inc" + }, + { + "project_id": 8635, + "project_name": "project/block2field", + "filename": "block2field.module" + }, + { + "project_id": 9273, + "project_name": "project/cache_heuristic", + "filename": "memcache.deferred.inc" + }, + { + "project_id": 9450, + "project_name": "project/cache_graceful", + "filename": "cache_graceful.module" + }, + { + "project_id": 9656, + "project_name": "project/deds_client", + "filename": "includes/DedsClient.inc" + }, + { + "project_id": 9770, + "project_name": "project/corporative_site", + "filename": "modules/contrib/views/plugins/views_plugin_cache_time.inc" + }, + { + "project_id": 9847, + "project_name": "project/b2b_store_solution", + "filename": "b2b_construction/modules/contrib/views/plugins/views_plugin_cache_time.inc" + }, + { + "project_id": 10405, + "project_name": "project/onepagecv", + "filename": "modules/views/plugins/views_plugin_cache_time.inc" + }, + { + "project_id": 10795, + "project_name": "project/cachetags", + "filename": "cache-memcache.inc" + }, + { + "project_id": 10795, + "project_name": "project/cachetags", + "filename": "cachetags.patch" + }, + { + "project_id": 10795, + "project_name": "project/cachetags", + "filename": "cachetags_sql/cachetags_sql.test" + }, + { + "project_id": 11214, + "project_name": "project/amazon_import", + "filename": "amazon_import.admin.inc" + }, + { + "project_id": 11635, + "project_name": "project/shareaholic", + "filename": "cache.php" + }, + { + "project_id": 12625, + "project_name": "project/booking_com_api", + "filename": "booking_com_api.admin.inc" + }, + { + "project_id": 12625, + "project_name": "project/booking_com_api", + "filename": "booking_com_api.install" + }, + { + "project_id": 12625, + "project_name": "project/booking_com_api", + "filename": "includes/JSONConnector.class.inc" + }, + { + "project_id": 12625, + "project_name": "project/booking_com_api", + "filename": "includes/XMLConnector.class.inc" + }, + { + "project_id": 12643, + "project_name": "project/search_api_acquia", + "filename": "includes/v3/SearchApiAcquiaApi.php" + }, + { + "project_id": 13086, + "project_name": "project/fetcher", + "filename": "lib/Fetcher/Configurator/DrupalVersion/Drupal6.php" + }, + { + "project_id": 13086, + "project_name": "project/fetcher", + "filename": "lib/Fetcher/Configurator/DrupalVersion/Drupal7.php" + }, + { + "project_id": 13086, + "project_name": "project/fetcher", + "filename": "lib/Fetcher/Configurator/DrupalVersion/Drupal8.php" + }, + { + "project_id": 13452, + "project_name": "project/memory_profiler", + "filename": "memcache_profiler.inc" + }, + { + "project_id": 13611, + "project_name": "project/session_cache", + "filename": "session_cache.admin.inc" + }, + { + "project_id": 13754, + "project_name": "project/userpickit", + "filename": "userpickit.module" + }, + { + "project_id": 14076, + "project_name": "project/dynamodb", + "filename": "dynamodb.inc" + }, + { + "project_id": 14853, + "project_name": "project/memcache_storage", + "filename": "src/MemcachedBackend.php" + }, + { + "project_id": 15128, + "project_name": "project/entity_lister", + "filename": "entity_lister.class.inc" + }, + { + "project_id": 15185, + "project_name": "project/context_cache", + "filename": "context_reaction_cache.inc" + }, + { + "project_id": 15691, + "project_name": "project/social_comments", + "filename": "includes/social_comments.admin.inc" + }, + { + "project_id": 16138, + "project_name": "project/site_search_analytics", + "filename": "visitorsvoice_api.install" + }, + { + "project_id": 16243, + "project_name": "project/reevoomark", + "filename": "ReevooMarkService.php" + }, + { + "project_id": 16249, + "project_name": "project/enhanced_page_cache", + "filename": "enhanced_page_cache.module" + }, + { + "project_id": 16249, + "project_name": "project/enhanced_page_cache", + "filename": "enhanced_pagecache.authcache.inc" + }, + { + "project_id": 16382, + "project_name": "project/wunderground_weather", + "filename": "wunderground_weather.admin.inc" + }, + { + "project_id": 16382, + "project_name": "project/wunderground_weather", + "filename": "wunderground_weather.install" + }, + { + "project_id": 16585, + "project_name": "project/at_base", + "filename": "lib/Helper/Test/Cache.php" + }, + { + "project_id": 16585, + "project_name": "project/at_base", + "filename": "lib/Helper/Wrapper/Cache.php" + }, + { + "project_id": 17523, + "project_name": "project/visitorsvoice", + "filename": "visitorsvoice.admin.inc" + }, + { + "project_id": 17769, + "project_name": "project/cove_api", + "filename": "cove_api.module" + }, + { + "project_id": 18059, + "project_name": "project/staticfilecache", + "filename": "DrupalStaticFileCache.inc" + }, + { + "project_id": 18124, + "project_name": "project/qui", + "filename": "qui.inc" + }, + { + "project_id": 18191, + "project_name": "project/wincachedrupal", + "filename": "src/Cache/WincacheBackend.php" + }, + { + "project_id": 18502, + "project_name": "project/go1_base", + "filename": "lib/Helper/Test/Cache.php" + }, + { + "project_id": 18502, + "project_name": "project/go1_base", + "filename": "lib/Helper/Wrapper/Cache.php" + }, + { + "project_id": 18777, + "project_name": "project/quandl", + "filename": "quandl.module" + }, + { + "project_id": 19746, + "project_name": "project/social_feed_field", + "filename": "modules/social_feed_field_facebook/includes/social_feed_field.facebook.inc" + }, + { + "project_id": 19746, + "project_name": "project/social_feed_field", + "filename": "modules/social_feed_field_gplus/includes/social_feed_field.gplus.inc" + }, + { + "project_id": 19746, + "project_name": "project/social_feed_field", + "filename": "modules/social_feed_field_instagram/includes/social_feed_field.instagram.inc" + }, + { + "project_id": 20172, + "project_name": "project/selective_tweets", + "filename": "includes/selective_tweets.features.inc" + }, + { + "project_id": 20172, + "project_name": "project/selective_tweets", + "filename": "selective_tweets.install" + }, + { + "project_id": 20426, + "project_name": "project/orghunter", + "filename": "orghunter_charity_search.module" + }, + { + "project_id": 20447, + "project_name": "project/era", + "filename": "era.admin.inc" + }, + { + "project_id": 20447, + "project_name": "project/era", + "filename": "era.install" + }, + { + "project_id": 20447, + "project_name": "project/era", + "filename": "era.module" + }, + { + "project_id": 21023, + "project_name": "project/couchbasedrupal", + "filename": "src/Cache/CouchbaseBackend.php" + }, + { + "project_id": 21934, + "project_name": "project/riddle_marketplace", + "filename": "src/RiddleClient.php" + }, + { + "project_id": 22337, + "project_name": "project/apcu", + "filename": "apcu.cache.inc" + }, + { + "project_id": 23853, + "project_name": "project/cision_block", + "filename": "cision_block.install" + }, + { + "project_id": 23853, + "project_name": "project/cision_block", + "filename": "cision_block.module" + }, + { + "project_id": 23853, + "project_name": "project/cision_block", + "filename": "tests/cision_block.test" + }, + { + "project_id": 25437, + "project_name": "project/sendinblue_rules", + "filename": "includes/sendinblue_rules.list.inc" + }, + { + "project_id": 25692, + "project_name": "project/ovh", + "filename": "src/Entity/Controller/OvhKeyViewBuilder.php" + }, + { + "project_id": 26260, + "project_name": "project/rss_embed_field", + "filename": "src/RssFeedFetcher.php" + }, + { + "project_id": 49251, + "project_name": "project/feed_block", + "filename": "src/EventSubscriber/FeedBlockCacheExpire.php" + }, + { + "project_id": 50166, + "project_name": "project/wsdata", + "filename": "src/Plugin/WSConnector/WSConnectorSimpleHTTP.php" + }, + { + "project_id": 50437, + "project_name": "project/dvg_stuf_bg", + "filename": "dvg_stuf_bg.module" + }, + { + "project_id": 50819, + "project_name": "project/spambot", + "filename": "src/Form/SpambotSettingsForm.php" + }, + { + "project_id": 51344, + "project_name": "project/usajobs_integration", + "filename": "src/RequestData.php" + }, + { + "project_id": 57717, + "project_name": "project/dvg_appointments", + "filename": "includes/AppointmentsClientApi.inc" + }, + { + "project_id": 59642, + "project_name": "project/wisski", + "filename": "wisski_data/wisski_authfile/src/Plugin/wisski_salz/Engine/LodSparqlEngine.php" + }, + { + "project_id": 60508, + "project_name": "project/js_entity", + "filename": "src/Queue/QueueCacheWorkerBase.php" + }, + { + "project_id": 61386, + "project_name": "project/commercetools", + "filename": "modules/commercetools_decoupled/src/CommercetoolsDecoupled.php" + }, + { + "project_id": 61386, + "project_name": "project/commercetools", + "filename": "modules/commercetools_decoupled/src/Controller/CtAuthController.php" + }, + { + "project_id": 61386, + "project_name": "project/commercetools", + "filename": "modules/commercetools_decoupled/src/CtAuth.php" + }, + { + "project_id": 62602, + "project_name": "project/social_media_api", + "filename": "src/SocialMediaApiFacebook.php" + }, + { + "project_id": 64168, + "project_name": "project/cmrf_form_processor", + "filename": "src/Factory.php" + }, + { + "project_id": 69747, + "project_name": "project/cmrf_core", + "filename": "src/CallFactory.php" + }, + { + "project_id": 69747, + "project_name": "project/cmrf_core", + "filename": "src/Form/CMRFProfileForm.php" + }, + { + "project_id": 78054, + "project_name": "project/audit_report", + "filename": "src/Plugin/AuditCheckManager.php" + }, + { + "project_id": 99033, + "project_name": "project/menu_parser_php", + "filename": "src/Form/SettingsForm.php" + }, + { + "project_id": 111315, + "project_name": "project/vcp4dates", + "filename": "tests/src/Kernel/DateFilterTest.php" + }, + { + "project_id": 113806, + "project_name": "project/ct_expire", + "filename": "ct_expire.module" + }, + { + "project_id": 113806, + "project_name": "project/ct_expire", + "filename": "src/Commands/CtExpireCommands.php" + }, + { + "project_id": 113806, + "project_name": "project/ct_expire", + "filename": "src/CtExpireScheduler.php" + }, + { + "project_id": 113806, + "project_name": "project/ct_expire", + "filename": "src/Plugin/Field/FieldWidget/DateAndTimeCacheExpireWidget.php" + } + ], + "RemoveHandlerBaseDefineExtraOptionsRector": [ + { + "project_id": 11684, + "project_name": "project/views_dependent_filters", + "filename": "src/Plugin/views/filter/ViewsDependentFilter.php" + } + ], + "RemoveModuleHandlerAddModuleCallsRector": [ + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "CREDITS.TXT" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "DICTIONARY.TXT" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "aggregator-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "archive-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "block-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "blog-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "blogapi-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "book-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "color-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "comment-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "common-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "contact-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "content_types-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "drupal-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "file-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "filter-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "form-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "forum-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "general.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "installer.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "locale-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "locale-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "menu-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "node-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "outros_modulos/gsitemap/gsitemap-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "outros_modulos/service_links/service_links-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "path-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "poll-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "profile-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "search-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "statistics-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "system-install.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "system-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "taxonomy-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "theme-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "throttle-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "tracker-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "unicode-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "upload-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "user-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "watchdog-module.po" + }, + { + "project_id": 289, + "project_name": "project/livediscussions", + "filename": "live_discussions.module" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "arrow-next-hover.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "arrow-prev-hover.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "arrow-prev.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "arrow-up-hover.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "background.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "block.tpl.php" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "box.tpl.php" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "forum-container.jpg" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "forum-link.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "header-a.jpg" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "icon-block.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "logo-active.jpg" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "logo.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "node.tpl.php" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "style.css" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "tabs-off.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "tabs-on.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "tabs-option-hover.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "tabs-option-on.png" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "README.txt" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "archive-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "block-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "blogapi-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "book-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "common-inc.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "drupal-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "file-inc.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "locale-inc.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "locale-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "menu-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "node-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "poll-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "profile-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "search-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "statistics-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "story-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "system-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "taxonomy-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "throttle-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "upload-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "user-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "watchdog-module.po" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "README.txt" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "ma_blogit/README.txt" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "ma_blogit/ma_blogit.module" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "ma_bzip2/ma_bzip2.module" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "ma_gzip/README.txt" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "ma_gzip/ma_gzip.module" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "mail_archive.mysql" + }, + { + "project_id": 310, + "project_name": "project/sitemenu", + "filename": "sitemenu.info" + }, + { + "project_id": 310, + "project_name": "project/sitemenu", + "filename": "sitemenu.module" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "binder.control" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "docs/binder-1.png" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "docs/binder_schema.png" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "docs/g6685.png" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "docs/rigid-vs-fluid.html" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "docs/state_machines_and_metadata.html" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "docs/text1709.png" + } + ], + "RemoveModuleHandlerDeprecatedMethodsRector": [ + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": ".gitignore" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/cache-install.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/database/log.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/database/sqlite/select.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/errors.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/filetransfer/local.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/filetransfer/ssh.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/install.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/lock.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/menu.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/password.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/farbtastic/farbtastic.js" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/jquery.js" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/powered-blue-80x15.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/powered-gray-135x42.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/ui/jquery.ui.selectable.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/ui/jquery.ui.slider.min.js" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/aggregator/aggregator-feed-source.tpl.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/aggregator/tests/aggregator_test_atom.xml" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/block/block.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/block/block.js" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/color/color.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.api.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/contact/contact.admin.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/contact/contact.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/dashboard/dashboard.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/field.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/modules/list/list.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/modules/number/number.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/tests/field_test.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/tests/field_test.storage.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field_ui/field_ui.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/file/icons/application-x-executable.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/file/icons/text-html.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/file/icons/text-x-generic.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/file/icons/x-office-document.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/filter/filter.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/filter/filter.pages.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/forum/forum.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/help/help.api.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/locale/locale.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/node/node.tokens.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/node/tests/node_access_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/node/tests/node_test_exception.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/openid/tests/openid_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/path/path.admin.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/php/php.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/poll/poll-results.tpl.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/rdf/rdf.api.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/rdf/tests/rdf_test.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/search/search.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/search/search.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/search/tests/search_embedded_form.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/search/tests/search_extra_type.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/files/css_test_files/comment_hacks.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/files/css_test_files/comment_hacks.css.unoptimized.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/files/javascript-2.script" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/simpletest.js" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/actions.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/ajax_test.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/error.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/graph.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/image_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/password.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/path_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/requirements1_test.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/system_incompatible_core_version_dependencies_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/system_incompatible_module_version_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/theme_test.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/unicode.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/upgrade/drupal-6.upload.database.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/upgrade/drupal-6.user-password-token.database.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/upgrade/upgrade.comment.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/statistics/statistics.pages.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/syslog/syslog.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/syslog/syslog.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/system/system.archiver.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/system/system.queue.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/system/system.updater.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/taxonomy/taxonomy.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/tracker/tracker.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/trigger/trigger.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/update/tests/aaa_update_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/update/tests/drupal.0.xml" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/user/tests/user_form_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/user/tests/user_form_test.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/user/user.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/README.txt" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/bartik/css/print.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/bartik/images/buttons.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/garland/fix-ie.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/garland/logo.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/seven/images/ui-icons-ffffff-256x240.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/seven/page.tpl.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/seven/style.css" + } + ], + "RemoveRootFromConvertDbUrlRector": [ + { + "project_id": 6961, + "project_name": "project/sqlsrv", + "filename": "tests/src/Kernel/NewDatabaseFailureTest.php" + }, + { + "project_id": 28302, + "project_name": "project/sparql_entity_storage", + "filename": "src/Driver/Database/sparql/Connection.php" + }, + { + "project_id": 28302, + "project_name": "project/sparql_entity_storage", + "filename": "tests/src/Traits/SparqlConnectionTrait.php" + }, + { + "project_id": 52281, + "project_name": "project/civicrm_entity", + "filename": "src/Plugin/views/query/CivicrmSql.php" + }, + { + "project_id": 52281, + "project_name": "project/civicrm_entity", + "filename": "tests/src/FunctionalJavascript/Views/CivicrmContactUserRelationshipTest.php" + }, + { + "project_id": 58354, + "project_name": "project/acsf", + "filename": "acsf_init/lib/cloud_hooks/acquia/db_connect.php" + }, + { + "project_id": 91077, + "project_name": "project/smart_migrate_cli", + "filename": "src/Commands/SmartMigrateCliCommands.php" + } + ], + "RemoveSetUriCallbackRector": [ + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": ".gitignore" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/cache-install.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/database/log.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/database/sqlite/select.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/errors.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/filetransfer/local.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/filetransfer/ssh.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/install.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/lock.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/menu.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/password.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/farbtastic/farbtastic.js" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/jquery.js" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/powered-blue-80x15.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/powered-gray-135x42.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/ui/jquery.ui.selectable.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/ui/jquery.ui.slider.min.js" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/aggregator/aggregator-feed-source.tpl.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/aggregator/tests/aggregator_test_atom.xml" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/block/block.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/block/block.js" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/color/color.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.api.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/contact/contact.admin.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/contact/contact.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/dashboard/dashboard.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/field.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/modules/list/list.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/modules/number/number.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/tests/field_test.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/tests/field_test.storage.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field_ui/field_ui.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/file/icons/application-x-executable.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/file/icons/text-html.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/file/icons/text-x-generic.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/file/icons/x-office-document.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/filter/filter.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/filter/filter.pages.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/forum/forum.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/help/help.api.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/locale/locale.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/node/node.tokens.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/node/tests/node_access_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/node/tests/node_test_exception.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/openid/tests/openid_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/path/path.admin.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/php/php.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/poll/poll-results.tpl.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/rdf/rdf.api.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/rdf/tests/rdf_test.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/search/search.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/search/search.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/search/tests/search_embedded_form.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/search/tests/search_extra_type.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/files/css_test_files/comment_hacks.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/files/css_test_files/comment_hacks.css.unoptimized.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/files/javascript-2.script" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/simpletest.js" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/actions.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/ajax_test.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/error.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/graph.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/image_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/password.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/path_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/requirements1_test.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/system_incompatible_core_version_dependencies_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/system_incompatible_module_version_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/theme_test.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/unicode.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/upgrade/drupal-6.upload.database.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/upgrade/drupal-6.user-password-token.database.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/upgrade/upgrade.comment.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/statistics/statistics.pages.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/syslog/syslog.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/syslog/syslog.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/system/system.archiver.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/system/system.queue.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/system/system.updater.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/taxonomy/taxonomy.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/tracker/tracker.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/trigger/trigger.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/update/tests/aaa_update_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/update/tests/drupal.0.xml" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/user/tests/user_form_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/user/tests/user_form_test.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/user/user.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/README.txt" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/bartik/css/print.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/bartik/images/buttons.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/garland/fix-ie.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/garland/logo.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/seven/images/ui-icons-ffffff-256x240.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/seven/page.tpl.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/seven/style.css" + } + ], + "RemoveStateCacheSettingRector": [ + { + "project_id": 2817, + "project_name": "project/mollom", + "filename": "mollom.pages.inc" + }, + { + "project_id": 3659, + "project_name": "project/cache_browser", + "filename": "src/Form/CacheCidForm.php" + }, + { + "project_id": 3659, + "project_name": "project/cache_browser", + "filename": "src/Form/CacheClearConfirmForm.php" + }, + { + "project_id": 5494, + "project_name": "project/casaa", + "filename": "casaa.add.inc" + }, + { + "project_id": 5930, + "project_name": "project/distro", + "filename": "distro_client.module" + }, + { + "project_id": 6455, + "project_name": "project/freeagent", + "filename": "freeagent.services.yml" + }, + { + "project_id": 6719, + "project_name": "project/context_admin", + "filename": "contrib/context_admin_vbo/plugins/context_admin/views_bulk_menu.inc" + }, + { + "project_id": 6719, + "project_name": "project/context_admin", + "filename": "plugins/context_admin/admin_section.inc" + }, + { + "project_id": 6719, + "project_name": "project/context_admin", + "filename": "plugins/context_admin/node_create_menu.inc" + }, + { + "project_id": 6719, + "project_name": "project/context_admin", + "filename": "plugins/context_admin/node_edit_menu.inc" + }, + { + "project_id": 6719, + "project_name": "project/context_admin", + "filename": "plugins/context_admin/node_view_menu.inc" + }, + { + "project_id": 6719, + "project_name": "project/context_admin", + "filename": "plugins/context_admin/taxonomy_list_menu.inc" + }, + { + "project_id": 6719, + "project_name": "project/context_admin", + "filename": "plugins/context_admin/term_options_menu.inc" + }, + { + "project_id": 6858, + "project_name": "project/winners", + "filename": "winners.pages.inc" + }, + { + "project_id": 7296, + "project_name": "project/qfield", + "filename": "qfield_wizard.inc" + }, + { + "project_id": 8225, + "project_name": "project/mb", + "filename": "mb_comment/mb_comment.module" + }, + { + "project_id": 8533, + "project_name": "project/backup_migrate_dropbox", + "filename": "backup_migrate_dropbox.module" + }, + { + "project_id": 8534, + "project_name": "project/dns", + "filename": "docs/contributing/style.md" + }, + { + "project_id": 8821, + "project_name": "project/profile_setup_api", + "filename": "includes/profile_setup_api.pages.inc" + }, + { + "project_id": 9658, + "project_name": "project/openid_sso_provider", + "filename": "openid_sso_provider.inc" + }, + { + "project_id": 9770, + "project_name": "project/corporative_site", + "filename": "modules/contrib/ctools/help/wizard.html" + }, + { + "project_id": 9770, + "project_name": "project/corporative_site", + "filename": "modules/contrib/ctools/includes/page-wizard.inc" + }, + { + "project_id": 9847, + "project_name": "project/b2b_store_solution", + "filename": "b2b_construction/modules/contrib/ctools/help/wizard.html" + }, + { + "project_id": 10405, + "project_name": "project/onepagecv", + "filename": "modules/ctools/help/wizard.html" + }, + { + "project_id": 11900, + "project_name": "project/devshop_hosting", + "filename": "devshop_hosting/devshop_projects/inc/create/create.inc" + }, + { + "project_id": 12511, + "project_name": "project/panels_frame", + "filename": "includes/stack-admin.inc" + }, + { + "project_id": 12511, + "project_name": "project/panels_frame", + "filename": "plugins/export_ui/panels_frame_stack_ui.class.php" + }, + { + "project_id": 12511, + "project_name": "project/panels_frame", + "filename": "plugins/export_ui/panels_frame_ui.class.php" + }, + { + "project_id": 13258, + "project_name": "project/wildfire", + "filename": "modules/wildfire_rpc_jobs/tests/wildfire_rpc_jobs.test" + }, + { + "project_id": 20484, + "project_name": "project/mpub", + "filename": "modules/contrib/ctools/help/wizard.html" + }, + { + "project_id": 20484, + "project_name": "project/mpub", + "filename": "modules/contrib/panels/includes/display-layout.inc" + }, + { + "project_id": 20484, + "project_name": "project/mpub", + "filename": "modules/contrib/panels/includes/page-wizard.inc" + }, + { + "project_id": 22307, + "project_name": "project/config_split", + "filename": "src/Config/StatusOverride.php" + }, + { + "project_id": 23448, + "project_name": "project/bynder", + "filename": "bynder.services.yml" + }, + { + "project_id": 23838, + "project_name": "project/views_ajax_form", + "filename": "src/ViewsAjaxForm.php" + }, + { + "project_id": 25598, + "project_name": "project/bynder_orbit", + "filename": "includes/bynder_orbit.admin.inc" + }, + { + "project_id": 26816, + "project_name": "project/mustache_templates", + "filename": "mustache.services.yml" + }, + { + "project_id": 26816, + "project_name": "project/mustache_templates", + "filename": "src/MustachePhpEngine.php" + }, + { + "project_id": 49252, + "project_name": "project/community_tasks", + "filename": "src/Form/CTaskActionBaseForm.php" + }, + { + "project_id": 51166, + "project_name": "project/odoo_api", + "filename": "src/Form/OdooMetadataExploreForm.php" + }, + { + "project_id": 51166, + "project_name": "project/odoo_api", + "filename": "src/FormStateCacheTrait.php" + }, + { + "project_id": 51935, + "project_name": "project/views_advanced_cache", + "filename": "src/Plugin/views/cache/AdvancedViewsCache.php" + }, + { + "project_id": 52040, + "project_name": "project/salesforce_auth", + "filename": "salesforce_auth.services.yml" + }, + { + "project_id": 52161, + "project_name": "project/og", + "filename": "og.services.yml" + }, + { + "project_id": 52161, + "project_name": "project/og", + "filename": "src/Cache/Context/OgMembershipStateCacheContext.php" + }, + { + "project_id": 52161, + "project_name": "project/og", + "filename": "tests/src/Unit/Cache/Context/OgContextCacheContextTestBase.php" + }, + { + "project_id": 52161, + "project_name": "project/og", + "filename": "tests/src/Unit/Cache/Context/OgMembershipStateCacheContextTest.php" + }, + { + "project_id": 53194, + "project_name": "project/authcache", + "filename": "modules/authcache_form/tests/authcache_form_test.module" + }, + { + "project_id": 55801, + "project_name": "project/deploy_key", + "filename": "src/KeyManager.php" + }, + { + "project_id": 55883, + "project_name": "project/swagger_ui_formatter", + "filename": "tests/modules/swagger_ui_formatter_test_fake_discovery/src/Service/SwaggerUiLibraryDiscovery.php" + }, + { + "project_id": 55883, + "project_name": "project/swagger_ui_formatter", + "filename": "tests/modules/swagger_ui_formatter_test_fake_discovery/swagger_ui_formatter_test_fake_discovery.services.yml" + }, + { + "project_id": 56975, + "project_name": "project/d6lts", + "filename": "common/contrib/features/SA-CONTRIB-2016-020.patch" + }, + { + "project_id": 57706, + "project_name": "project/lightning_workflow", + "filename": "modules/lightning_scheduler/lightning_scheduler.module" + }, + { + "project_id": 58720, + "project_name": "project/apigee_edge", + "filename": "src/Entity/Controller/Cache/EntityIdCache.php" + }, + { + "project_id": 59279, + "project_name": "project/searchstax", + "filename": "tests/modules/searchstax_test_version_check/src/DecoratedVersionCheck.php" + }, + { + "project_id": 59387, + "project_name": "project/checklistapi", + "filename": "checklistapi.services.yml" + }, + { + "project_id": 59387, + "project_name": "project/checklistapi", + "filename": "src/Storage/StateStorage.php" + }, + { + "project_id": 59484, + "project_name": "project/stratoserp", + "filename": "src/Form/SettingsForm.php" + }, + { + "project_id": 59586, + "project_name": "project/monster_menus", + "filename": "src/MMRenderer/DefaultMMRenderer.php" + }, + { + "project_id": 59615, + "project_name": "project/salesforce", + "filename": "salesforce.services.yml" + }, + { + "project_id": 59849, + "project_name": "project/cloud", + "filename": "modules/cloud_service_providers/terraform/config/install/views.view.terraform_state.yml" + }, + { + "project_id": 60215, + "project_name": "project/aeg", + "filename": "modules/ctools/help/wizard.html" + }, + { + "project_id": 60215, + "project_name": "project/aeg", + "filename": "modules/panels/includes/display-layout.inc" + }, + { + "project_id": 60215, + "project_name": "project/aeg", + "filename": "modules/panels/includes/page-wizard.inc" + }, + { + "project_id": 60227, + "project_name": "project/govimentum", + "filename": "modules/simpletest/tests/themes/test_theme/theme-settings.php" + }, + { + "project_id": 61530, + "project_name": "project/language_suggestion", + "filename": "src/Form/LanguageSuggestionMappingForm.php" + }, + { + "project_id": 62378, + "project_name": "project/drupalru_d7", + "filename": "modules/simpletest/tests/themes/test_theme/theme-settings.php" + }, + { + "project_id": 62719, + "project_name": "project/entity_reference_preview", + "filename": "src/Cache/StatusPreviewCacheContext.php" + }, + { + "project_id": 63487, + "project_name": "project/eu_cookie_compliance_rocketship", + "filename": "src/Form/SettingsForm.php" + }, + { + "project_id": 63624, + "project_name": "project/ubershopwish", + "filename": "modules/simpletest/tests/themes/test_theme/theme-settings.php" + }, + { + "project_id": 63847, + "project_name": "project/fmrest", + "filename": "fmrest.services.yml" + }, + { + "project_id": 63847, + "project_name": "project/fmrest", + "filename": "src/RestClient.php" + }, + { + "project_id": 69929, + "project_name": "project/stackla_widget", + "filename": "stackla_widget.services.yml" + }, + { + "project_id": 73343, + "project_name": "project/mailchimp_transactional", + "filename": "mailchimp_transactional.services.yml" + }, + { + "project_id": 77509, + "project_name": "project/testproject4234", + "filename": "modules/simpletest/tests/themes/test_theme/theme-settings.php" + }, + { + "project_id": 77509, + "project_name": "project/testproject4234", + "filename": "modules/user/tests/user_form_test.module" + }, + { + "project_id": 81865, + "project_name": "project/entity_references_map", + "filename": "src/Form/SettingsForm.php" + }, + { + "project_id": 84590, + "project_name": "project/trailless_menu", + "filename": "tests/src/Functional/TraillessMenuTest.php" + }, + { + "project_id": 85551, + "project_name": "project/widen_media", + "filename": "widen_media.services.yml" + }, + { + "project_id": 94996, + "project_name": "project/vwo", + "filename": "vwo.module" + }, + { + "project_id": 95840, + "project_name": "project/loop_workers", + "filename": "loop_workers.services.yml" + }, + { + "project_id": 99358, + "project_name": "project/granulartimecache", + "filename": "src/GranularTimeCacheService.php" + }, + { + "project_id": 117773, + "project_name": "project/engaging_networks", + "filename": "config/schema/engaging_networks.schema.yml" + }, + { + "project_id": 117773, + "project_name": "project/engaging_networks", + "filename": "src/Form/RestApiSettingsForm.php" + }, + { + "project_id": 118693, + "project_name": "project/entity_usage_updater", + "filename": "tests/src/Kernel/EntityUsageUpdaterOrphanedParagraphsTest.php" + }, + { + "project_id": 118693, + "project_name": "project/entity_usage_updater", + "filename": "tests/src/Kernel/EntityUsageUpdaterParagraphsTest.php" + }, + { + "project_id": 131151, + "project_name": "project/pantheon_autopilot_toolbar", + "filename": "src/Form/DismissNotificationForm.php" + }, + { + "project_id": 164485, + "project_name": "project/social_auth_entra_id", + "filename": "src/Plugin/Block/EntraIdLoginBlockBlock.php" + }, + { + "project_id": 176726, + "project_name": "project/override_cache_control_headers", + "filename": "override_cache_control_headers.services.yml" + }, + { + "project_id": 181203, + "project_name": "project/json_drop_api", + "filename": "modules/contrib/config_split/src/Config/StatusOverride.php" + }, + { + "project_id": 181319, + "project_name": "project/sdx", + "filename": "modules/feature/sdx_ssr/src/Plugin/SdxSettings/SsrSettings.php" + }, + { + "project_id": 183657, + "project_name": "project/search_api_postgresql", + "filename": "src/CircuitBreaker/CircuitBreaker.php" + }, + { + "project_id": 188516, + "project_name": "project/open_vocabularies", + "filename": "tests/src/Functional/VocabularyReferenceFieldTest.php" + }, + { + "project_id": 190686, + "project_name": "project/chromeless", + "filename": "chromeless.services.yml" + }, + { + "project_id": 190686, + "project_name": "project/chromeless", + "filename": "src/Cache/ChromelessStateCacheContext.php" + }, + { + "project_id": 200814, + "project_name": "project/rail_ai_provider", + "filename": "rail_ai_provider.services.yml" + }, + { + "project_id": 202556, + "project_name": "project/youtube_live_video", + "filename": "tests/src/Unit/Plugin/Block/YouTubeLiveVideoBlockSubmitTest.php" + }, + { + "project_id": 204384, + "project_name": "project/ffmpeg_media", + "filename": "src/Service/ProgressTracker.php" + }, + { + "project_id": 208118, + "project_name": "project/drupal_devkit", + "filename": "CLAUDE.md" + }, + { + "project_id": 208118, + "project_name": "project/drupal_devkit", + "filename": "tests/marketplace/test_integration.py" + } + ], + "RemoveTrustDataCallRector": [ + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "CREDITS.TXT" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "DICTIONARY.TXT" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "aggregator-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "archive-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "block-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "blog-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "blogapi-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "book-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "color-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "comment-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "common-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "contact-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "content_types-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "drupal-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "file-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "filter-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "form-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "forum-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "general.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "installer.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "locale-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "locale-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "menu-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "node-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "outros_modulos/gsitemap/gsitemap-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "outros_modulos/service_links/service_links-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "path-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "poll-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "profile-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "search-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "statistics-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "system-install.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "system-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "taxonomy-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "theme-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "throttle-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "tracker-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "unicode-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "upload-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "user-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "watchdog-module.po" + }, + { + "project_id": 289, + "project_name": "project/livediscussions", + "filename": "live_discussions.module" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "arrow-next-hover.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "arrow-prev-hover.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "arrow-prev.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "arrow-up-hover.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "background.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "block.tpl.php" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "box.tpl.php" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "forum-container.jpg" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "forum-link.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "header-a.jpg" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "icon-block.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "logo-active.jpg" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "logo.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "node.tpl.php" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "style.css" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "tabs-off.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "tabs-on.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "tabs-option-hover.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "tabs-option-on.png" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "README.txt" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "archive-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "block-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "blogapi-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "book-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "common-inc.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "drupal-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "file-inc.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "locale-inc.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "locale-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "menu-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "node-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "poll-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "profile-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "search-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "statistics-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "story-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "system-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "taxonomy-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "throttle-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "upload-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "user-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "watchdog-module.po" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "README.txt" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "ma_blogit/README.txt" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "ma_blogit/ma_blogit.module" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "ma_bzip2/ma_bzip2.module" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "ma_gzip/README.txt" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "ma_gzip/ma_gzip.module" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "mail_archive.mysql" + }, + { + "project_id": 310, + "project_name": "project/sitemenu", + "filename": "sitemenu.info" + }, + { + "project_id": 310, + "project_name": "project/sitemenu", + "filename": "sitemenu.module" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "binder.control" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "docs/binder-1.png" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "docs/binder_schema.png" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "docs/g6685.png" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "docs/rigid-vs-fluid.html" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "docs/state_machines_and_metadata.html" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "docs/text1709.png" + } + ], + "RemoveTwigNodeTransTagArgumentRector": [ + { + "project_id": 15590, + "project_name": "project/bear_skin", + "filename": "components/_twig-components/tags/trans.tag.php" + }, + { + "project_id": 19391, + "project_name": "project/canvas", + "filename": "src/Twig/CanvasPropVisitor.php" + }, + { + "project_id": 21816, + "project_name": "project/patternlab", + "filename": "pattern-lab/source/_twig-components/tags/trans.tag.php" + }, + { + "project_id": 22735, + "project_name": "project/emulsify", + "filename": "components/_twig-components/tags/pl_trans.tag.php" + }, + { + "project_id": 24699, + "project_name": "project/kashmir", + "filename": "components/_twig-components/tags/trans.tag.php" + }, + { + "project_id": 25172, + "project_name": "project/sketch", + "filename": "STARTER/components/_twig-components/tags/trans.tag.php" + }, + { + "project_id": 55297, + "project_name": "project/flexi_pattern_lab", + "filename": "components/source/_twig-components/tags/trans.tag.php" + }, + { + "project_id": 56300, + "project_name": "project/potion", + "filename": "src/Twig/NodeVisitor/TranslationNodeVisitor.php" + }, + { + "project_id": 59279, + "project_name": "project/searchstax", + "filename": ".ignored-deprecations.txt" + }, + { + "project_id": 59614, + "project_name": "project/entity_import", + "filename": ".deprecation-ignore.txt" + }, + { + "project_id": 59814, + "project_name": "project/search_api", + "filename": ".ignored-deprecations.txt" + }, + { + "project_id": 59815, + "project_name": "project/search_api_autocomplete", + "filename": ".ignored-deprecations.txt" + }, + { + "project_id": 59833, + "project_name": "project/search_api_saved_searches", + "filename": ".ignored-deprecations.txt" + }, + { + "project_id": 63299, + "project_name": "project/tranc", + "filename": "src/TrancNodeVisitor.php" + }, + { + "project_id": 112735, + "project_name": "project/core_logs", + "filename": "metadata/commit/33/336ba833bc8591810d0d27a8f36edb973ebb17c7/git-numstat" + }, + { + "project_id": 112735, + "project_name": "project/core_logs", + "filename": "metadata/commit/52/523cbdf6dfbd2af4ab18d97572bd3b01d3c7d4f7/git-numstat" + }, + { + "project_id": 112735, + "project_name": "project/core_logs", + "filename": "metadata/commit/ce/cec21638d098a4526174f0f97eb2e9ad675dcf52/git-numstat" + }, + { + "project_id": 112735, + "project_name": "project/core_logs", + "filename": "metadata/commit/ce/cec21638d098a4526174f0f97eb2e9ad675dcf52/git-subject" + }, + { + "project_id": 112735, + "project_name": "project/core_logs", + "filename": "metadata/commit/ce/cec21638d098a4526174f0f97eb2e9ad675dcf52/issue-title" + }, + { + "project_id": 112735, + "project_name": "project/core_logs", + "filename": "metadata/commit/ce/cec21638d098a4526174f0f97eb2e9ad675dcf52/subject" + }, + { + "project_id": 112735, + "project_name": "project/core_logs", + "filename": "metadata/x-journal/2024-09-28.md" + }, + { + "project_id": 143385, + "project_name": "project/experience_builder", + "filename": "src/Extension/XbPropVisitor.php" + } + ], + "RemoveUpdaterPostInstallMethodsRector": [ + { + "project_id": 8197, + "project_name": "project/onepage", + "filename": "includes/updater.inc" + }, + { + "project_id": 8197, + "project_name": "project/onepage", + "filename": "modules/system/system.updater.inc" + }, + { + "project_id": 9123, + "project_name": "project/1087726", + "filename": "includes/updater.inc" + }, + { + "project_id": 9123, + "project_name": "project/1087726", + "filename": "modules/system/system.updater.inc" + }, + { + "project_id": 11635, + "project_name": "project/shareaholic", + "filename": "admin.php" + }, + { + "project_id": 12057, + "project_name": "project/redhen_demo", + "filename": "redhen_demo.install" + }, + { + "project_id": 12057, + "project_name": "project/redhen_demo", + "filename": "ts_install_helpers/README.md" + }, + { + "project_id": 12118, + "project_name": "project/rebuild", + "filename": "tests/fixtures/drupal_sites/dev/includes/updater.inc" + }, + { + "project_id": 12118, + "project_name": "project/rebuild", + "filename": "tests/fixtures/drupal_sites/dev/modules/system/system.updater.inc" + }, + { + "project_id": 12118, + "project_name": "project/rebuild", + "filename": "tests/fixtures/drupal_sites/prod/includes/updater.inc" + }, + { + "project_id": 12118, + "project_name": "project/rebuild", + "filename": "tests/fixtures/drupal_sites/prod/modules/system/system.updater.inc" + }, + { + "project_id": 13111, + "project_name": "project/ddcla", + "filename": "public/includes/updater.inc" + }, + { + "project_id": 13111, + "project_name": "project/ddcla", + "filename": "public/modules/system/system.updater.inc" + }, + { + "project_id": 13125, + "project_name": "project/transcribe_distribution", + "filename": "includes/updater.inc" + }, + { + "project_id": 13125, + "project_name": "project/transcribe_distribution", + "filename": "modules/system/system.updater.inc" + }, + { + "project_id": 14211, + "project_name": "project/restaurant", + "filename": "restaurant.install" + }, + { + "project_id": 14446, + "project_name": "project/tr_kurulum", + "filename": "includes/updater.inc" + }, + { + "project_id": 14446, + "project_name": "project/tr_kurulum", + "filename": "modules/system/system.updater.inc" + }, + { + "project_id": 14506, + "project_name": "project/tb_blog_starter", + "filename": "includes/updater.inc" + }, + { + "project_id": 14506, + "project_name": "project/tb_blog_starter", + "filename": "modules/system/system.updater.inc" + }, + { + "project_id": 14507, + "project_name": "project/tb_events_starter", + "filename": "includes/updater.inc" + }, + { + "project_id": 14507, + "project_name": "project/tb_events_starter", + "filename": "modules/system/system.updater.inc" + }, + { + "project_id": 14509, + "project_name": "project/tb_hadelis_starter", + "filename": "includes/updater.inc" + }, + { + "project_id": 14509, + "project_name": "project/tb_hadelis_starter", + "filename": "modules/system/system.updater.inc" + }, + { + "project_id": 14510, + "project_name": "project/tb_methys_starter", + "filename": "includes/updater.inc" + }, + { + "project_id": 14510, + "project_name": "project/tb_methys_starter", + "filename": "modules/system/system.updater.inc" + }, + { + "project_id": 14511, + "project_name": "project/tb_mollise_starter", + "filename": "includes/updater.inc" + }, + { + "project_id": 14511, + "project_name": "project/tb_mollise_starter", + "filename": "modules/system/system.updater.inc" + }, + { + "project_id": 14512, + "project_name": "project/tb_neris_starter", + "filename": "includes/updater.inc" + }, + { + "project_id": 14512, + "project_name": "project/tb_neris_starter", + "filename": "modules/system/system.updater.inc" + }, + { + "project_id": 14513, + "project_name": "project/tb_palicico_starter", + "filename": "includes/updater.inc" + }, + { + "project_id": 14513, + "project_name": "project/tb_palicico_starter", + "filename": "modules/system/system.updater.inc" + }, + { + "project_id": 14514, + "project_name": "project/tb_purity_starter", + "filename": "includes/updater.inc" + }, + { + "project_id": 14514, + "project_name": "project/tb_purity_starter", + "filename": "modules/system/system.updater.inc" + }, + { + "project_id": 14515, + "project_name": "project/tb_rave_starter", + "filename": "includes/updater.inc" + }, + { + "project_id": 14515, + "project_name": "project/tb_rave_starter", + "filename": "modules/system/system.updater.inc" + }, + { + "project_id": 14522, + "project_name": "project/tb_sirate_starter", + "filename": "includes/updater.inc" + }, + { + "project_id": 14522, + "project_name": "project/tb_sirate_starter", + "filename": "modules/system/system.updater.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/updater.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/system/system.updater.inc" + }, + { + "project_id": 15222, + "project_name": "project/open_badging_installation_profile", + "filename": "includes/updater.inc" + }, + { + "project_id": 15222, + "project_name": "project/open_badging_installation_profile", + "filename": "modules/system/system.updater.inc" + }, + { + "project_id": 15613, + "project_name": "project/sauce", + "filename": "includes/sauce.updater.inc" + }, + { + "project_id": 16192, + "project_name": "project/mobilearkickstart", + "filename": "includes/updater.inc" + }, + { + "project_id": 16192, + "project_name": "project/mobilearkickstart", + "filename": "modules/system/system.updater.inc" + }, + { + "project_id": 16984, + "project_name": "project/spanish_distribution", + "filename": "includes/updater.inc" + }, + { + "project_id": 16984, + "project_name": "project/spanish_distribution", + "filename": "modules/system/system.updater.inc" + }, + { + "project_id": 17013, + "project_name": "project/fuse", + "filename": "includes/updater.inc" + }, + { + "project_id": 17013, + "project_name": "project/fuse", + "filename": "modules/system/system.updater.inc" + }, + { + "project_id": 18559, + "project_name": "project/govbr", + "filename": "includes/updater.inc" + }, + { + "project_id": 18559, + "project_name": "project/govbr", + "filename": "modules/system/system.updater.inc" + }, + { + "project_id": 18897, + "project_name": "project/qurandistribution", + "filename": "includes/updater.inc" + }, + { + "project_id": 18897, + "project_name": "project/qurandistribution", + "filename": "modules/system/system.updater.inc" + }, + { + "project_id": 18967, + "project_name": "project/redhen_raiser", + "filename": "redhen_raiser.profile" + }, + { + "project_id": 20990, + "project_name": "project/development", + "filename": "includes/updater.inc" + }, + { + "project_id": 20990, + "project_name": "project/development", + "filename": "modules/system/system.updater.inc" + }, + { + "project_id": 23470, + "project_name": "project/gp_reviews", + "filename": "includes/updater.inc" + }, + { + "project_id": 23470, + "project_name": "project/gp_reviews", + "filename": "modules/system/system.updater.inc" + }, + { + "project_id": 25294, + "project_name": "project/pankm", + "filename": "modules/contrib/group/src/Entity/GroupContentType.php" + }, + { + "project_id": 25896, + "project_name": "project/byu_installation_profile", + "filename": "includes/updater.inc" + }, + { + "project_id": 25896, + "project_name": "project/byu_installation_profile", + "filename": "modules/system/system.updater.inc" + }, + { + "project_id": 59610, + "project_name": "project/group", + "filename": "src/Entity/GroupRelationshipType.php" + }, + { + "project_id": 59610, + "project_name": "project/group", + "filename": "src/Plugin/Group/RelationHandler/GroupMembershipPostInstall.php" + }, + { + "project_id": 59610, + "project_name": "project/group", + "filename": "src/Plugin/Group/RelationHandlerDefault/EntityReference.php" + }, + { + "project_id": 59610, + "project_name": "project/group", + "filename": "src/Plugin/Group/RelationHandlerDefault/PostInstall.php" + }, + { + "project_id": 59610, + "project_name": "project/group", + "filename": "tests/src/Unit/PostInstallTest.php" + }, + { + "project_id": 60227, + "project_name": "project/govimentum", + "filename": "includes/updater.inc" + }, + { + "project_id": 60227, + "project_name": "project/govimentum", + "filename": "modules/system/system.updater.inc" + }, + { + "project_id": 62378, + "project_name": "project/drupalru_d7", + "filename": "includes/updater.inc" + }, + { + "project_id": 62378, + "project_name": "project/drupalru_d7", + "filename": "modules/system/system.updater.inc" + }, + { + "project_id": 63624, + "project_name": "project/ubershopwish", + "filename": "includes/updater.inc" + }, + { + "project_id": 63624, + "project_name": "project/ubershopwish", + "filename": "modules/system/system.updater.inc" + }, + { + "project_id": 64219, + "project_name": "project/ginvite", + "filename": "src/Plugin/Group/RelationHandler/GroupInvitationPostInstall.php" + }, + { + "project_id": 77509, + "project_name": "project/testproject4234", + "filename": "includes/updater.inc" + }, + { + "project_id": 77509, + "project_name": "project/testproject4234", + "filename": "modules/system/system.updater.inc" + }, + { + "project_id": 79588, + "project_name": "project/gnode_request", + "filename": "src/Plugin/Group/RelationHandler/GroupNodeRequestPostInstall.php" + }, + { + "project_id": 83284, + "project_name": "project/whereabouts", + "filename": "whereabouts.profile" + }, + { + "project_id": 87638, + "project_name": "project/group_entity", + "filename": "src/Entity/GroupContentType.php" + }, + { + "project_id": 87638, + "project_name": "project/group_entity", + "filename": "src/Plugin/Group/RelationHandler/GroupMembershipPostInstall.php" + }, + { + "project_id": 87638, + "project_name": "project/group_entity", + "filename": "src/Plugin/Group/RelationHandlerDefault/EntityReference.php" + }, + { + "project_id": 87638, + "project_name": "project/group_entity", + "filename": "src/Plugin/Group/RelationHandlerDefault/PostInstall.php" + }, + { + "project_id": 87638, + "project_name": "project/group_entity", + "filename": "tests/src/Unit/PostInstallTest.php" + }, + { + "project_id": 129676, + "project_name": "project/tiendaparamipyme", + "filename": "bt_store_cl.profile" + } + ], + "RemoveViewsRowCacheKeysRector": [ + { + "project_id": 51935, + "project_name": "project/views_advanced_cache", + "filename": "tests/src/Kernel/ViewsRowCacheTest.php" + }, + { + "project_id": 53222, + "project_name": "project/metatag", + "filename": "metatag_views/src/MetatagViewsCacheWrapper.php" + }, + { + "project_id": 181203, + "project_name": "project/json_drop_api", + "filename": "modules/contrib/metatag/metatag_views/src/MetatagViewsCacheWrapper.php" + } + ], + "ReplaceAlphadecimalToIntNullRector": [ + { + "project_id": 744, + "project_name": "project/comment_mover", + "filename": "src/CommentMover.php" + }, + { + "project_id": 1039, + "project_name": "project/flatcomments", + "filename": "flat_comments.module" + }, + { + "project_id": 2065, + "project_name": "project/openlayers", + "filename": "lib/OpenlayersDrupal/Component/Utility/Number.php" + }, + { + "project_id": 18842, + "project_name": "project/service_container", + "filename": "lib/Drupal/Component/Utility/Number.php" + }, + { + "project_id": 59723, + "project_name": "project/indieweb", + "filename": "modules/indieweb_webmention/src/Plugin/Action/ResetCommentThread.php" + } + ], + "ReplaceCommentManagerGetCountNewCommentsRector": [ + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": ".gitignore" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/cache-install.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/database/log.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/database/sqlite/select.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/errors.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/filetransfer/local.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/filetransfer/ssh.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/install.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/lock.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/menu.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/password.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/farbtastic/farbtastic.js" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/jquery.js" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/powered-blue-80x15.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/powered-gray-135x42.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/ui/jquery.ui.selectable.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/ui/jquery.ui.slider.min.js" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/aggregator/aggregator-feed-source.tpl.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/aggregator/tests/aggregator_test_atom.xml" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/block/block.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/block/block.js" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/color/color.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.api.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/contact/contact.admin.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/contact/contact.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/dashboard/dashboard.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/field.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/modules/list/list.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/modules/number/number.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/tests/field_test.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/tests/field_test.storage.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field_ui/field_ui.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/file/icons/application-x-executable.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/file/icons/text-html.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/file/icons/text-x-generic.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/file/icons/x-office-document.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/filter/filter.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/filter/filter.pages.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/forum/forum.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/help/help.api.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/locale/locale.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/node/node.tokens.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/node/tests/node_access_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/node/tests/node_test_exception.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/openid/tests/openid_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/path/path.admin.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/php/php.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/poll/poll-results.tpl.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/rdf/rdf.api.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/rdf/tests/rdf_test.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/search/search.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/search/search.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/search/tests/search_embedded_form.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/search/tests/search_extra_type.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/files/css_test_files/comment_hacks.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/files/css_test_files/comment_hacks.css.unoptimized.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/files/javascript-2.script" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/simpletest.js" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/actions.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/ajax_test.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/error.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/graph.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/image_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/password.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/path_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/requirements1_test.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/system_incompatible_core_version_dependencies_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/system_incompatible_module_version_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/theme_test.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/unicode.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/upgrade/drupal-6.upload.database.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/upgrade/drupal-6.user-password-token.database.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/upgrade/upgrade.comment.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/statistics/statistics.pages.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/syslog/syslog.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/syslog/syslog.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/system/system.archiver.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/system/system.queue.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/system/system.updater.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/taxonomy/taxonomy.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/tracker/tracker.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/trigger/trigger.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/update/tests/aaa_update_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/update/tests/drupal.0.xml" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/user/tests/user_form_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/user/tests/user_form_test.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/user/user.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/README.txt" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/bartik/css/print.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/bartik/images/buttons.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/garland/fix-ie.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/garland/logo.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/seven/images/ui-icons-ffffff-256x240.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/seven/page.tpl.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/seven/style.css" + } + ], + "ReplaceCommentUriRector": [ + { + "project_id": 939, + "project_name": "project/project_issue", + "filename": "includes/mail.inc" + }, + { + "project_id": 939, + "project_name": "project/project_issue", + "filename": "project_issue.module" + }, + { + "project_id": 1082, + "project_name": "project/zen", + "filename": "template.php" + }, + { + "project_id": 2124, + "project_name": "project/rdf", + "filename": "rdf.module" + }, + { + "project_id": 2124, + "project_name": "project/rdf", + "filename": "tests/src/Functional/CommentAttributesTest.php" + }, + { + "project_id": 2124, + "project_name": "project/rdf", + "filename": "tests/src/Functional/StandardProfileTest.php" + }, + { + "project_id": 2285, + "project_name": "project/advanced_forum", + "filename": "includes/advanced_forum_preprocess_comment.inc" + }, + { + "project_id": 3738, + "project_name": "project/comment_perm", + "filename": "src/CommentForm.php" + }, + { + "project_id": 3805, + "project_name": "project/genesis", + "filename": "genesis/template.php" + }, + { + "project_id": 5411, + "project_name": "project/adaptivetheme", + "filename": "at_core/inc/preprocess.inc" + }, + { + "project_id": 8197, + "project_name": "project/onepage", + "filename": "modules/comment/comment.module" + }, + { + "project_id": 8197, + "project_name": "project/onepage", + "filename": "modules/rdf/rdf.module" + }, + { + "project_id": 8882, + "project_name": "project/html5_boilerplate", + "filename": "template.php" + }, + { + "project_id": 9123, + "project_name": "project/1087726", + "filename": "modules/comment/comment.module" + }, + { + "project_id": 9123, + "project_name": "project/1087726", + "filename": "modules/rdf/rdf.module" + }, + { + "project_id": 10186, + "project_name": "project/nucleus", + "filename": "nucleus/inc/override_functions.inc" + }, + { + "project_id": 10204, + "project_name": "project/lc3_clean", + "filename": "preprocess.inc" + }, + { + "project_id": 11286, + "project_name": "project/comment_goodness", + "filename": "comment_goodness.module" + }, + { + "project_id": 11324, + "project_name": "project/drupalace", + "filename": "template.php" + }, + { + "project_id": 11404, + "project_name": "project/twentyeleven", + "filename": "template.php" + }, + { + "project_id": 12118, + "project_name": "project/rebuild", + "filename": "tests/fixtures/drupal_sites/dev/modules/comment/comment.module" + }, + { + "project_id": 12118, + "project_name": "project/rebuild", + "filename": "tests/fixtures/drupal_sites/dev/modules/rdf/rdf.module" + }, + { + "project_id": 12118, + "project_name": "project/rebuild", + "filename": "tests/fixtures/drupal_sites/prod/modules/comment/comment.module" + }, + { + "project_id": 12118, + "project_name": "project/rebuild", + "filename": "tests/fixtures/drupal_sites/prod/modules/rdf/rdf.module" + }, + { + "project_id": 12168, + "project_name": "project/node_notify", + "filename": "node_notify.module" + }, + { + "project_id": 13111, + "project_name": "project/ddcla", + "filename": "public/modules/comment/comment.module" + }, + { + "project_id": 13111, + "project_name": "project/ddcla", + "filename": "public/modules/rdf/rdf.module" + }, + { + "project_id": 13125, + "project_name": "project/transcribe_distribution", + "filename": "modules/comment/comment.module" + }, + { + "project_id": 13125, + "project_name": "project/transcribe_distribution", + "filename": "modules/rdf/rdf.module" + }, + { + "project_id": 14446, + "project_name": "project/tr_kurulum", + "filename": "modules/comment/comment.module" + }, + { + "project_id": 14446, + "project_name": "project/tr_kurulum", + "filename": "modules/rdf/rdf.module" + }, + { + "project_id": 14506, + "project_name": "project/tb_blog_starter", + "filename": "modules/comment/comment.module" + }, + { + "project_id": 14506, + "project_name": "project/tb_blog_starter", + "filename": "modules/rdf/rdf.module" + }, + { + "project_id": 14507, + "project_name": "project/tb_events_starter", + "filename": "modules/comment/comment.module" + }, + { + "project_id": 14507, + "project_name": "project/tb_events_starter", + "filename": "modules/rdf/rdf.module" + }, + { + "project_id": 14509, + "project_name": "project/tb_hadelis_starter", + "filename": "modules/comment/comment.module" + }, + { + "project_id": 14509, + "project_name": "project/tb_hadelis_starter", + "filename": "modules/rdf/rdf.module" + }, + { + "project_id": 14510, + "project_name": "project/tb_methys_starter", + "filename": "modules/comment/comment.module" + }, + { + "project_id": 14510, + "project_name": "project/tb_methys_starter", + "filename": "modules/rdf/rdf.module" + }, + { + "project_id": 14511, + "project_name": "project/tb_mollise_starter", + "filename": "modules/comment/comment.module" + }, + { + "project_id": 14511, + "project_name": "project/tb_mollise_starter", + "filename": "modules/rdf/rdf.module" + }, + { + "project_id": 14512, + "project_name": "project/tb_neris_starter", + "filename": "modules/comment/comment.module" + }, + { + "project_id": 14512, + "project_name": "project/tb_neris_starter", + "filename": "modules/rdf/rdf.module" + }, + { + "project_id": 14513, + "project_name": "project/tb_palicico_starter", + "filename": "modules/comment/comment.module" + }, + { + "project_id": 14513, + "project_name": "project/tb_palicico_starter", + "filename": "modules/rdf/rdf.module" + }, + { + "project_id": 14514, + "project_name": "project/tb_purity_starter", + "filename": "modules/comment/comment.module" + }, + { + "project_id": 14514, + "project_name": "project/tb_purity_starter", + "filename": "modules/rdf/rdf.module" + }, + { + "project_id": 14515, + "project_name": "project/tb_rave_starter", + "filename": "modules/comment/comment.module" + }, + { + "project_id": 14515, + "project_name": "project/tb_rave_starter", + "filename": "modules/rdf/rdf.module" + }, + { + "project_id": 14522, + "project_name": "project/tb_sirate_starter", + "filename": "modules/comment/comment.module" + }, + { + "project_id": 14522, + "project_name": "project/tb_sirate_starter", + "filename": "modules/rdf/rdf.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/rdf/rdf.module" + }, + { + "project_id": 14636, + "project_name": "project/md_foto", + "filename": "inc/template.process.inc" + }, + { + "project_id": 14796, + "project_name": "project/comment_fragment", + "filename": "comment_fragment.module" + }, + { + "project_id": 15222, + "project_name": "project/open_badging_installation_profile", + "filename": "modules/comment/comment.module" + }, + { + "project_id": 15222, + "project_name": "project/open_badging_installation_profile", + "filename": "modules/rdf/rdf.module" + }, + { + "project_id": 16192, + "project_name": "project/mobilearkickstart", + "filename": "modules/comment/comment.module" + }, + { + "project_id": 16192, + "project_name": "project/mobilearkickstart", + "filename": "modules/rdf/rdf.module" + }, + { + "project_id": 16549, + "project_name": "project/twbs", + "filename": "preprocess/modules/comment/twbs_preprocess_comment.inc" + }, + { + "project_id": 16984, + "project_name": "project/spanish_distribution", + "filename": "modules/comment/comment.module" + }, + { + "project_id": 16984, + "project_name": "project/spanish_distribution", + "filename": "modules/rdf/rdf.module" + }, + { + "project_id": 17013, + "project_name": "project/fuse", + "filename": "modules/comment/comment.module" + }, + { + "project_id": 17013, + "project_name": "project/fuse", + "filename": "modules/rdf/rdf.module" + }, + { + "project_id": 18559, + "project_name": "project/govbr", + "filename": "modules/comment/comment.module" + }, + { + "project_id": 18559, + "project_name": "project/govbr", + "filename": "modules/rdf/rdf.module" + }, + { + "project_id": 18897, + "project_name": "project/qurandistribution", + "filename": "modules/comment/comment.module" + }, + { + "project_id": 18897, + "project_name": "project/qurandistribution", + "filename": "modules/rdf/rdf.module" + }, + { + "project_id": 20047, + "project_name": "project/stacksight", + "filename": "stacksight.module" + }, + { + "project_id": 20990, + "project_name": "project/development", + "filename": "modules/comment/comment.module" + }, + { + "project_id": 20990, + "project_name": "project/development", + "filename": "modules/rdf/rdf.module" + }, + { + "project_id": 21149, + "project_name": "project/oa_basetheme", + "filename": "includes/comment.inc" + }, + { + "project_id": 21241, + "project_name": "project/techsupport", + "filename": "modules/contrib/project/package/project_package.module" + }, + { + "project_id": 21241, + "project_name": "project/techsupport", + "filename": "modules/contrib/project_issue/project_issue.module" + }, + { + "project_id": 21242, + "project_name": "project/tsm", + "filename": "modules/contrib/project/package/project_package.module" + }, + { + "project_id": 21242, + "project_name": "project/tsm", + "filename": "modules/contrib/project_issue/project_issue.module" + }, + { + "project_id": 23470, + "project_name": "project/gp_reviews", + "filename": "modules/comment/comment.module" + }, + { + "project_id": 23470, + "project_name": "project/gp_reviews", + "filename": "modules/rdf/rdf.module" + }, + { + "project_id": 25548, + "project_name": "project/jats_generator", + "filename": "jats_generator.pages.inc" + }, + { + "project_id": 25896, + "project_name": "project/byu_installation_profile", + "filename": "modules/comment/comment.module" + }, + { + "project_id": 25896, + "project_name": "project/byu_installation_profile", + "filename": "modules/rdf/rdf.module" + }, + { + "project_id": 52855, + "project_name": "project/idea", + "filename": "themes/openideal_theme/openideal_theme.theme" + }, + { + "project_id": 52855, + "project_name": "project/idea", + "filename": "themes/openideal_theme/templates/comment/comment--view--my-comments--my-comments.html.twig" + }, + { + "project_id": 59005, + "project_name": "project/social", + "filename": "modules/social_features/social_comment/src/Form/SocialCommentAdminOverview.php" + }, + { + "project_id": 59097, + "project_name": "project/easy_booking", + "filename": "themes/contrib/adaptivetheme/at_core/inc/preprocess.inc" + }, + { + "project_id": 60227, + "project_name": "project/govimentum", + "filename": "modules/comment/comment.module" + }, + { + "project_id": 60227, + "project_name": "project/govimentum", + "filename": "modules/rdf/rdf.module" + }, + { + "project_id": 60278, + "project_name": "project/jsonapi_comment", + "filename": "jsonapi_comment.link_relation_types.yml" + }, + { + "project_id": 62378, + "project_name": "project/drupalru_d7", + "filename": "modules/comment/comment.module" + }, + { + "project_id": 62378, + "project_name": "project/drupalru_d7", + "filename": "modules/rdf/rdf.module" + }, + { + "project_id": 63624, + "project_name": "project/ubershopwish", + "filename": "modules/comment/comment.module" + }, + { + "project_id": 63624, + "project_name": "project/ubershopwish", + "filename": "modules/rdf/rdf.module" + }, + { + "project_id": 77509, + "project_name": "project/testproject4234", + "filename": "modules/comment/comment.module" + }, + { + "project_id": 77509, + "project_name": "project/testproject4234", + "filename": "modules/rdf/rdf.module" + }, + { + "project_id": 209517, + "project_name": "project/gadget", + "filename": "src/Commands/File/GadgetFileCommands.php" + } + ], + "ReplaceDateTimeRangeConstantsRector": [ + { + "project_id": 61195, + "project_name": "project/deprecation_status", + "filename": "data/12_errors_detail.csv" + } + ], + "ReplaceEditorLoadRector": [ + { + "project_id": 342, + "project_name": "project/tinymce", + "filename": "tests/src/Kernel/TinyMCETest.php" + }, + { + "project_id": 1363, + "project_name": "project/bueditor", + "filename": "src/Plugin/BUEditorPlugin/XPreview.php" + }, + { + "project_id": 1363, + "project_name": "project/bueditor", + "filename": "src/Plugin/Editor/BUEditor.php" + }, + { + "project_id": 2291, + "project_name": "project/video_filter", + "filename": "tests/src/Functional/CkEditor4LoadingTest.php" + }, + { + "project_id": 2431, + "project_name": "project/cdn", + "filename": "cdn.module" + }, + { + "project_id": 2760, + "project_name": "project/editor", + "filename": "editor.features.inc" + }, + { + "project_id": 3155, + "project_name": "project/markdown", + "filename": "tests/src/Functional/FilterAdminTest.php" + }, + { + "project_id": 7220, + "project_name": "project/translation_management", + "filename": "icl_translate/css/icl_translate_editor.css" + }, + { + "project_id": 8863, + "project_name": "project/imageeditor", + "filename": "plugins/editor/svgedit/ext-imageeditor.js" + }, + { + "project_id": 10247, + "project_name": "project/video_embed_field", + "filename": "modules/video_embed_wysiwyg/tests/src/Functional/TextFormatConfigurationTest.php" + }, + { + "project_id": 12690, + "project_name": "project/ole", + "filename": "includes/openlayers_behavior_ole.js" + }, + { + "project_id": 14095, + "project_name": "project/wysiwyg_ckeditor", + "filename": "ckeditor.api.php" + }, + { + "project_id": 15649, + "project_name": "project/contextly", + "filename": "js/contextly-edit-form.js" + }, + { + "project_id": 17822, + "project_name": "project/quickedit", + "filename": "src/Plugin/InPlaceEditor/Editor.php" + }, + { + "project_id": 18406, + "project_name": "project/url_embed", + "filename": "tests/src/FunctionalJavascript/UrlEmbedCKEditor5UITest.php" + }, + { + "project_id": 20814, + "project_name": "project/editor_advanced_link", + "filename": "tests/src/FunctionalJavascript/AdvancedLinkTest.php" + }, + { + "project_id": 20888, + "project_name": "project/editor_ckeditor_widgets", + "filename": "editor_ckeditor_widgets.module" + }, + { + "project_id": 23954, + "project_name": "project/wysiwyg_trumbowyg", + "filename": "editors/trumbowyg.inc" + }, + { + "project_id": 25567, + "project_name": "project/synimage", + "filename": "src/Form/EditorImageSynboxDialog.php" + }, + { + "project_id": 25665, + "project_name": "project/ckeditor_config", + "filename": "ckeditor_config.install" + }, + { + "project_id": 27296, + "project_name": "project/inline_formatter_field", + "filename": "src/Plugin/Field/FieldFormatter/InlineFormatterFieldFormatter.php" + }, + { + "project_id": 47385, + "project_name": "project/entity_embed", + "filename": "tests/src/FunctionalJavascript/CKEditor5IntegrationTest.php" + }, + { + "project_id": 50178, + "project_name": "project/ckeditor_mentions", + "filename": "src/Controller/CKMentionsController.php" + }, + { + "project_id": 53807, + "project_name": "project/boxout", + "filename": "boxout.install" + }, + { + "project_id": 55234, + "project_name": "project/flmngr", + "filename": "flmngr.install" + }, + { + "project_id": 55425, + "project_name": "project/ckeditor_codemirror", + "filename": "tests/src/Functional/CkeditorCodeMirrorBasicTest.php" + }, + { + "project_id": 55863, + "project_name": "project/depcalc", + "filename": "src/EventSubscriber/DependencyCollector/TextItemFieldDependencyCollector.php" + }, + { + "project_id": 56296, + "project_name": "project/editor_advanced_image", + "filename": "tests/src/FunctionalJavascript/CKEditor5EditorAdvancedImageDialogTest.php" + }, + { + "project_id": 58509, + "project_name": "project/wxt", + "filename": "modules/custom/wxt_core/src/UpdateWxT/UpdateWxT420.php" + }, + { + "project_id": 58633, + "project_name": "project/openfed", + "filename": "modules/d10_compatibility/ckeditor_uploadimage/ckeditor_uploadimage-3296773-7.patch" + }, + { + "project_id": 58633, + "project_name": "project/openfed", + "filename": "modules/d10_compatibility/ckeditor_uploadimage/ckeditor_uploadimage-fix-undefined-array-key-3543081-2.patch" + }, + { + "project_id": 58633, + "project_name": "project/openfed", + "filename": "modules/d10_compatibility/ckeditor_uploadimage/src/Plugin/CKEditorPlugin/DrupalUploadImage.php" + }, + { + "project_id": 58633, + "project_name": "project/openfed", + "filename": "modules/d10_compatibility/ckeditor_uploadimage/src/Plugin/CKEditorPlugin/DrupalUploadImageImce.php" + }, + { + "project_id": 59741, + "project_name": "project/ckeditor_uploadimage", + "filename": "src/Plugin/CKEditorPlugin/DrupalUploadImage.php" + }, + { + "project_id": 59741, + "project_name": "project/ckeditor_uploadimage", + "filename": "src/Plugin/CKEditorPlugin/DrupalUploadImageImce.php" + }, + { + "project_id": 59857, + "project_name": "project/acquia_contenthub", + "filename": "tests/src/Kernel/EventSubscriber/EntityImport/FilterFormatEditor/FilterFormatEditorTest.php" + }, + { + "project_id": 60656, + "project_name": "project/decoupled", + "filename": "decoupled_jsoneditor/src/EntityTypeInfo.php" + }, + { + "project_id": 60909, + "project_name": "project/inline_image_token", + "filename": "inline_image_token.module" + }, + { + "project_id": 63343, + "project_name": "project/ckeditor_exclude_tags", + "filename": "src/Form/CkeditorSettings.php" + }, + { + "project_id": 63480, + "project_name": "project/ezcontent_publish", + "filename": "modules/ezcontent_publish_layoutmanager/ezcontent_publish_layoutmanager.install" + }, + { + "project_id": 64036, + "project_name": "project/grapesjs_editor", + "filename": "src/Controller/AssetController.php" + }, + { + "project_id": 73144, + "project_name": "project/learnosity", + "filename": "src/Controller/LearnosityImageUploadController.php" + }, + { + "project_id": 73144, + "project_name": "project/learnosity", + "filename": "src/LearnosityActivityEditorPermissions.php" + }, + { + "project_id": 73144, + "project_name": "project/learnosity", + "filename": "src/Plugin/Field/FieldType/LearnosityActivity.php" + }, + { + "project_id": 80771, + "project_name": "project/ckeditor_custom_paste_filters", + "filename": "ckeditor_custom_paste_filters.module" + }, + { + "project_id": 84617, + "project_name": "project/acquia_dam", + "filename": "src/FormatAllowedHtmlModifier.php" + }, + { + "project_id": 86813, + "project_name": "project/address_suggestion", + "filename": "src/Controller/AddressSuggestion.php" + }, + { + "project_id": 93188, + "project_name": "project/ckeditor5_premium_features", + "filename": "modules/ckeditor5_premium_features_fullscreen/ckeditor5_premium_features_fullscreen.module" + }, + { + "project_id": 93188, + "project_name": "project/ckeditor5_premium_features", + "filename": "modules/ckeditor5_premium_features_merge_fields/src/MergeFieldsProcessor.php" + }, + { + "project_id": 104066, + "project_name": "project/ckeditor5_highlight", + "filename": "ckeditor5_highlight.module" + }, + { + "project_id": 108775, + "project_name": "project/ckeditor5_mentions", + "filename": "src/Element/MentionsIntegration.php" + }, + { + "project_id": 113931, + "project_name": "project/visual_editor", + "filename": "js/visual_editor.node_view.js" + }, + { + "project_id": 116100, + "project_name": "project/ckeditor5_spoiler", + "filename": "ckeditor5_spoiler.install" + }, + { + "project_id": 117346, + "project_name": "project/txt42", + "filename": "txt42.install" + }, + { + "project_id": 121122, + "project_name": "project/ckeditor_lts", + "filename": "ckeditor.api.php" + }, + { + "project_id": 121122, + "project_name": "project/ckeditor_lts", + "filename": "tests/src/Functional/CKEditorAdminTest.php" + }, + { + "project_id": 121122, + "project_name": "project/ckeditor_lts", + "filename": "tests/src/Functional/CKEditorLoadingTest.php" + }, + { + "project_id": 121122, + "project_name": "project/ckeditor_lts", + "filename": "tests/src/Functional/CKEditorStylesComboAdminTest.php" + }, + { + "project_id": 121122, + "project_name": "project/ckeditor_lts", + "filename": "tests/src/Functional/Update/CKEditorUpdateOmitDisabledPluginSettings.php" + }, + { + "project_id": 121122, + "project_name": "project/ckeditor_lts", + "filename": "tests/src/FunctionalJavascript/CKEditor5CKEditor4Compatibility.php" + }, + { + "project_id": 121122, + "project_name": "project/ckeditor_lts", + "filename": "tests/src/Kernel/CKEditorPluginManagerTest.php" + }, + { + "project_id": 121122, + "project_name": "project/ckeditor_lts", + "filename": "tests/src/Kernel/CKEditorTest.php" + }, + { + "project_id": 132503, + "project_name": "project/edit_plus", + "filename": "src/InlineEditorElement.php" + }, + { + "project_id": 135785, + "project_name": "project/ckeditor_braille", + "filename": "ckeditor_braille.install" + }, + { + "project_id": 142569, + "project_name": "project/ckeditor5_plugin_pack", + "filename": "modules/ckeditor5_plugin_pack_bookmark/ckeditor5_plugin_pack_bookmark.module" + }, + { + "project_id": 142569, + "project_name": "project/ckeditor5_plugin_pack", + "filename": "modules/ckeditor5_plugin_pack_emoji/ckeditor5_plugin_pack_emoji.module" + }, + { + "project_id": 142569, + "project_name": "project/ckeditor5_plugin_pack", + "filename": "modules/ckeditor5_plugin_pack_find_and_replace/tests/src/FunctionalJavascript/FindReplaceTest.php" + }, + { + "project_id": 142569, + "project_name": "project/ckeditor5_plugin_pack", + "filename": "modules/ckeditor5_plugin_pack_highlight/ckeditor5_plugin_pack_highlight.module" + }, + { + "project_id": 142569, + "project_name": "project/ckeditor5_plugin_pack", + "filename": "modules/ckeditor5_plugin_pack_todo_document_list/ckeditor5_plugin_pack_todo_document_list.module" + }, + { + "project_id": 147460, + "project_name": "project/ckeditor_historylog", + "filename": "js/ckeditor5_plugins/history_log/src/historylog.js" + }, + { + "project_id": 149523, + "project_name": "project/ckeditor5_deepl", + "filename": "src/Controller/TranslationEndpointController.php" + }, + { + "project_id": 163816, + "project_name": "project/ai_ckeditor_extras", + "filename": "tests/src/FunctionalJavascript/CkeditorPluginTestBase.php" + }, + { + "project_id": 163816, + "project_name": "project/ai_ckeditor_extras", + "filename": "tests/src/FunctionalJavascript/FaqPluginTest.php" + }, + { + "project_id": 163816, + "project_name": "project/ai_ckeditor_extras", + "filename": "tests/src/FunctionalJavascript/FleschScorePluginTest.php" + }, + { + "project_id": 163816, + "project_name": "project/ai_ckeditor_extras", + "filename": "tests/src/FunctionalJavascript/ParaphrasingPluginTest.php" + }, + { + "project_id": 163816, + "project_name": "project/ai_ckeditor_extras", + "filename": "tests/src/FunctionalJavascript/TonePluginTest.php" + }, + { + "project_id": 167646, + "project_name": "project/theme_file_editor", + "filename": "theme_file_editor.routing.yml" + }, + { + "project_id": 172885, + "project_name": "project/deepseek", + "filename": "js/React/src/component/message/chat-trix.jsx" + }, + { + "project_id": 177369, + "project_name": "project/smartlinker_ai", + "filename": "smartlinker_ai.install" + }, + { + "project_id": 179931, + "project_name": "project/media_folders", + "filename": "js/ckeditor.js" + }, + { + "project_id": 181203, + "project_name": "project/json_drop_api", + "filename": "modules/contrib/ckeditor5_plugin_pack/modules/ckeditor5_plugin_pack_find_and_replace/tests/src/FunctionalJavascript/FindReplaceTest.php" + }, + { + "project_id": 181203, + "project_name": "project/json_drop_api", + "filename": "modules/contrib/ckeditor5_plugin_pack/modules/ckeditor5_plugin_pack_highlight/ckeditor5_plugin_pack_highlight.module" + }, + { + "project_id": 181203, + "project_name": "project/json_drop_api", + "filename": "modules/contrib/ckeditor5_plugin_pack/modules/ckeditor5_plugin_pack_todo_document_list/ckeditor5_plugin_pack_todo_document_list.module" + }, + { + "project_id": 181203, + "project_name": "project/json_drop_api", + "filename": "modules/contrib/ckeditor5_premium_features/modules/ckeditor5_premium_features_productivity_pack/ckeditor5_premium_features_productivity_pack.module" + }, + { + "project_id": 188930, + "project_name": "project/dsfr4drupal_picker", + "filename": "src/Form/DialogFormBase.php" + }, + { + "project_id": 193057, + "project_name": "project/toast_image_editor", + "filename": "css/toast-image-editor.css" + }, + { + "project_id": 193866, + "project_name": "project/module_file_editor", + "filename": "module_file_editor.routing.yml" + }, + { + "project_id": 195972, + "project_name": "project/ckeditor5_scroll_fix", + "filename": "ckeditor5_scroll_fix.module" + }, + { + "project_id": 197809, + "project_name": "project/editor_advanced_table", + "filename": "tests/src/FunctionalJavascript/TableAdvancedEditorTest.php" + }, + { + "project_id": 198724, + "project_name": "project/ai_editoria11y", + "filename": "ai_editoria11y.module" + }, + { + "project_id": 198724, + "project_name": "project/ai_editoria11y", + "filename": "tests/src/Kernel/UninstallTest.php" + }, + { + "project_id": 207471, + "project_name": "project/ai_agents_experimental_collection", + "filename": "modules/ai_agents_text_formats/src/Plugin/tool/Tool/DeleteTextFormat.php" + }, + { + "project_id": 207471, + "project_name": "project/ai_agents_experimental_collection", + "filename": "modules/ai_agents_text_formats/src/Plugin/tool/Tool/GetEditorConfig.php" + }, + { + "project_id": 207471, + "project_name": "project/ai_agents_experimental_collection", + "filename": "modules/ai_agents_text_formats/src/Plugin/tool/Tool/UpdateEditorPluginSettings.php" + }, + { + "project_id": 207471, + "project_name": "project/ai_agents_experimental_collection", + "filename": "modules/ai_agents_text_formats/src/Plugin/tool/Tool/UpdateEditorToolbar.php" + }, + { + "project_id": 207471, + "project_name": "project/ai_agents_experimental_collection", + "filename": "modules/ai_agents_text_formats/src/Plugin/tool/Tool/UpdateImageUploadSettings.php" + }, + { + "project_id": 208618, + "project_name": "project/token_browser_plus", + "filename": "token_browser_plus.module" + }, + { + "project_id": 209328, + "project_name": "project/flo", + "filename": "src/Hook/FloHooks.php" + }, + { + "project_id": 209328, + "project_name": "project/flo", + "filename": "tests/src/Kernel/FloCKEditor5Test.php" + }, + { + "project_id": 209554, + "project_name": "project/custom_paragraphs", + "filename": "custom_paragraphs.module" + } + ], + "ReplaceEntityOriginalPropertyRector": [ + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": ".gitignore" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/cache-install.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/database/log.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/database/sqlite/select.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/errors.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/file.mimetypes.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/filetransfer/local.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/filetransfer/ssh.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/install.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/lock.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/password.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/farbtastic/farbtastic.js" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/powered-blue-80x15.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/powered-gray-135x42.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/ui/jquery.ui.selectable.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/ui/jquery.ui.slider.min.js" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/aggregator/aggregator-feed-source.tpl.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/aggregator/tests/aggregator_test_atom.xml" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/block/block.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/block/block.js" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.api.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/contact/contact.admin.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/contact/contact.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/dashboard/dashboard.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/field.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/modules/list/list.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/modules/number/number.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/tests/field_test.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/tests/field_test.storage.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field_ui/field_ui.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/file/icons/application-x-executable.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/file/icons/text-html.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/file/icons/text-x-generic.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/file/icons/x-office-document.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/filter/filter.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/filter/filter.pages.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/forum/forum.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/help/help.api.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/locale/locale.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/node/tests/node_access_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/node/tests/node_test_exception.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/openid/openid.pages.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/openid/tests/openid_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/path/path.admin.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/php/php.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/poll/poll-results.tpl.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/rdf/rdf.api.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/rdf/tests/rdf_test.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/search/search.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/search/tests/search_embedded_form.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/search/tests/search_extra_type.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/files/css_test_files/comment_hacks.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/files/css_test_files/comment_hacks.css.unoptimized.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/files/javascript-2.script" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/simpletest.js" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/actions.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/ajax_test.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/error.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/graph.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/image_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/password.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/path_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/requirements1_test.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/system_incompatible_core_version_dependencies_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/system_incompatible_module_version_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/theme_test.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/unicode.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/upgrade/drupal-6.upload.database.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/upgrade/drupal-6.user-password-token.database.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/upgrade/drupal-7.aggregator.database.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/upgrade/upgrade.comment.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/statistics/statistics.pages.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/syslog/syslog.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/syslog/syslog.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/system/system.archiver.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/system/system.queue.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/system/system.updater.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/taxonomy/taxonomy.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/tracker/tracker.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/trigger/trigger.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/update/tests/aaa_update_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/update/tests/drupal.0.xml" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/user/tests/user_form_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/user/tests/user_form_test.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/README.txt" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/bartik/css/print.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/bartik/images/buttons.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/garland/color/preview.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/garland/fix-ie.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/garland/images/menu-collapsed-rtl.gif" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/garland/logo.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/seven/ie6.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/seven/ie7.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/seven/images/ui-icons-ffffff-256x240.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/seven/page.tpl.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/seven/style.css" + } + ], + "ReplaceEntityReferenceRecursiveLimitRector": [ + { + "project_id": 21317, + "project_name": "project/content_browser", + "filename": "src/Plugin/Block/ContentEmbedBlock.php" + }, + { + "project_id": 22324, + "project_name": "project/berf", + "filename": "src/Plugin/Field/FieldFormatter/BetterEntityReferenceFormatter.php" + }, + { + "project_id": 22479, + "project_name": "project/paragraphs_summary", + "filename": "src/Plugin/Field/FieldFormatter/ParagraphsSummaryFormatter.php" + }, + { + "project_id": 22547, + "project_name": "project/entity_reference_override", + "filename": "src/Plugin/Field/FieldFormatter/EntityReferenceOverrideEntityFormatter.php" + }, + { + "project_id": 25448, + "project_name": "project/entity_overlay", + "filename": "src/Plugin/Field/FieldFormatter/EntityReferenceOverlayFormatter.php" + }, + { + "project_id": 25540, + "project_name": "project/entity_browser_block", + "filename": "src/Plugin/Block/EntityBrowserBlock.php" + }, + { + "project_id": 26951, + "project_name": "project/field_pager", + "filename": "src/Plugin/Field/FieldFormatter/EntityReferencePager.php" + }, + { + "project_id": 27656, + "project_name": "project/entity_reference_ajax_formatter", + "filename": "src/Plugin/Field/FieldFormatter/EntityReferenceAjaxFormatter.php" + }, + { + "project_id": 47385, + "project_name": "project/entity_embed", + "filename": "src/Plugin/Filter/EntityEmbedFilter.php" + }, + { + "project_id": 47385, + "project_name": "project/entity_embed", + "filename": "tests/src/Functional/RecursionProtectionTest.php" + }, + { + "project_id": 47880, + "project_name": "project/entity_list", + "filename": "src/Plugin/Field/FieldFormatter/EntityListReferenceFieldFormatter.php" + }, + { + "project_id": 49566, + "project_name": "project/multi_render_formatter", + "filename": "src/Plugin/Field/FieldFormatter/EntityMultiRender.php" + }, + { + "project_id": 56286, + "project_name": "project/dynamic_entity_reference", + "filename": "src/Plugin/Field/FieldFormatter/DynamicEntityReferenceEntityFormatter.php" + }, + { + "project_id": 58193, + "project_name": "project/tripal", + "filename": "tripal_chado/src/Plugin/Field/FieldFormatter/ChadoEmbeddedEntityFormatter.php" + }, + { + "project_id": 58658, + "project_name": "project/df", + "filename": "modules/df/df_tools/df_tools_media/src/Plugin/Block/MediaEmbedBlock.php" + }, + { + "project_id": 59736, + "project_name": "project/rocketship_core", + "filename": "src/Plugin/Field/FieldFormatter/MultiViewModeEntityReferenceEntityFormatter.php" + }, + { + "project_id": 59851, + "project_name": "project/gutenberg", + "filename": "src/BlockProcessor/ContentBlockProcessor.php" + }, + { + "project_id": 59851, + "project_name": "project/gutenberg", + "filename": "src/BlockProcessor/ReusableBlockProcessor.php" + }, + { + "project_id": 60037, + "project_name": "project/link_field_display_mode_formatter", + "filename": "src/Plugin/Field/FieldFormatter/LinkRenderingAnotherDisplayModeFormatter.php" + }, + { + "project_id": 60517, + "project_name": "project/revisiondiff", + "filename": "src/Plugin/Field/FieldFormatter/RevisionDiffFieldFormatter.php" + }, + { + "project_id": 62851, + "project_name": "project/entity_reference_dynamic_display", + "filename": "src/Plugin/Field/FieldFormatter/DynamicDisplay.php" + }, + { + "project_id": 67475, + "project_name": "project/entity_reference_views_backfill", + "filename": "src/Plugin/Field/FieldFormatter/EntityReferenceEntityViewsBackfillFormatter.php" + }, + { + "project_id": 68121, + "project_name": "project/nested_entity_reference_formatter", + "filename": "src/Plugin/Field/FieldFormatter/NestedEntityReferenceFormatter.php" + }, + { + "project_id": 79554, + "project_name": "project/external_entity", + "filename": "src/Plugin/Field/FieldFormatter/ExternalEntityReferenceEntityFormatter.php" + }, + { + "project_id": 81045, + "project_name": "project/custom_field", + "filename": "src/Plugin/CustomField/FieldFormatter/EntityReferenceEntityFormatter.php" + }, + { + "project_id": 81142, + "project_name": "project/view_mode_crop", + "filename": "src/Plugin/Field/FieldFormatter/ViewModeCropEntityReferenceEntityFormatter.php" + }, + { + "project_id": 92852, + "project_name": "project/image_as_media", + "filename": "src/Plugin/Field/FieldFormatter/ImageAsMediaFormatter.php" + }, + { + "project_id": 93801, + "project_name": "project/seb", + "filename": "src/Plugin/Block/EntityBlock.php" + }, + { + "project_id": 95804, + "project_name": "project/datafield", + "filename": "src/Plugin/DataField/FieldFormatter/EntityReferenceEntityFormatter.php" + }, + { + "project_id": 109975, + "project_name": "project/rest_entity_display", + "filename": "src/Plugin/Field/FieldFormatter/EmbedEntityReferenceFormatter.php" + }, + { + "project_id": 111643, + "project_name": "project/published_referenced_entity", + "filename": "src/Plugin/Field/FieldFormatter/PublishedRenderedEntityFormatter.php" + }, + { + "project_id": 152311, + "project_name": "project/more_fields", + "filename": "src/Plugin/Field/FieldFormatter/EntityFilterReferenceFormatter.php" + }, + { + "project_id": 196530, + "project_name": "project/rendred_entity_list_formatter", + "filename": "src/Plugin/Field/FieldFormatter/RendredEntityListFormatter.php" + }, + { + "project_id": 196536, + "project_name": "project/rendered_entity_list_formatter", + "filename": "src/Plugin/Field/FieldFormatter/RenderedEntityListFormatter.php" + }, + { + "project_id": 201686, + "project_name": "project/layout_builder_formatter", + "filename": "src/Plugin/Field/FieldFormatter/LayoutBuilderFormatter.php" + } + ], + "ReplaceFieldgroupToFieldsetRector": [ + { + "project_id": 978, + "project_name": "project/fieldgroup", + "filename": "fieldgroup.module" + }, + { + "project_id": 1258, + "project_name": "project/fieldgroup_table", + "filename": "fieldgroup_table.module" + }, + { + "project_id": 1894, + "project_name": "project/cck_fieldgroup_tabs", + "filename": "cck_fieldgroup_tabs.module" + }, + { + "project_id": 2942, + "project_name": "project/hexagon", + "filename": "overrides/contrib.cck/content.common-vars.inc" + }, + { + "project_id": 3873, + "project_name": "project/bundles", + "filename": "bundles_cck.install.inc" + }, + { + "project_id": 4095, + "project_name": "project/inherit", + "filename": "inherit.module" + }, + { + "project_id": 4557, + "project_name": "project/popups_subedit", + "filename": "popups_subedit.module" + }, + { + "project_id": 4559, + "project_name": "project/aurigma", + "filename": "aurigma_iufield.upload.inc" + }, + { + "project_id": 4627, + "project_name": "project/fieldtool", + "filename": "plugins/fieldtool/fieldgroup.inc" + }, + { + "project_id": 5055, + "project_name": "project/cck_inputs", + "filename": "modules/cck_inputs_form/cck_inputs_form.module" + }, + { + "project_id": 5362, + "project_name": "project/cck_sync", + "filename": "cck_sync.module" + }, + { + "project_id": 6245, + "project_name": "project/profile_migrate", + "filename": "profile_migrate.module" + }, + { + "project_id": 6452, + "project_name": "project/meetu", + "filename": "modules/features/meetu_feature_core/meetu_feature_core.features.fieldgroup.inc" + }, + { + "project_id": 6551, + "project_name": "project/node_widget", + "filename": "includes/node_widget.class.inc" + }, + { + "project_id": 6551, + "project_name": "project/node_widget", + "filename": "modules/filefield.node_widget.inc" + }, + { + "project_id": 6610, + "project_name": "project/acc", + "filename": "alternate_content_copy.module" + }, + { + "project_id": 6632, + "project_name": "project/pirets", + "filename": "pirets.install" + }, + { + "project_id": 6705, + "project_name": "project/briefcase", + "filename": "includes/briefcase_cck.admin.inc" + }, + { + "project_id": 6861, + "project_name": "project/content_type_exporter", + "filename": "content_type_exporter.module" + }, + { + "project_id": 7006, + "project_name": "project/content_display_order", + "filename": "content_display_order.admin.inc" + }, + { + "project_id": 7006, + "project_name": "project/content_display_order", + "filename": "content_display_order.module" + }, + { + "project_id": 7108, + "project_name": "project/field_or", + "filename": "field_or.module" + }, + { + "project_id": 7450, + "project_name": "project/cck_signup", + "filename": "cck_signup_group/cck_signup_group.admin.inc" + }, + { + "project_id": 7926, + "project_name": "project/imagefetchr", + "filename": "imagefetchr.admin.inc" + }, + { + "project_id": 8434, + "project_name": "project/ct_plus", + "filename": "ct_plus.features.fieldgroup.inc" + }, + { + "project_id": 8595, + "project_name": "project/podgroups", + "filename": "content_podgroup.admin.inc" + }, + { + "project_id": 9201, + "project_name": "project/volunteer_rally_features", + "filename": "shift_signup/shift_signup.features.fieldgroup.inc" + }, + { + "project_id": 9201, + "project_name": "project/volunteer_rally_features", + "filename": "shift_signup_group/shift_signup_group.features.fieldgroup.inc" + }, + { + "project_id": 9201, + "project_name": "project/volunteer_rally_features", + "filename": "shift_signup_group_address/shift_signup_group_address.features.fieldgroup.inc" + }, + { + "project_id": 9274, + "project_name": "project/donor_rally_features", + "filename": "dr_team/dr_team.features.fieldgroup.inc" + }, + { + "project_id": 9530, + "project_name": "project/commerce_fieldgroup_panes", + "filename": "commerce_fieldgroup_panes.module" + }, + { + "project_id": 9770, + "project_name": "project/corporative_site", + "filename": "modules/contrib/cck/modules/content_copy/content_copy.module" + }, + { + "project_id": 9770, + "project_name": "project/corporative_site", + "filename": "modules/contrib/cck/modules/fieldgroup/fieldgroup.install" + }, + { + "project_id": 9770, + "project_name": "project/corporative_site", + "filename": "modules/contrib/cck/modules/fieldgroup/fieldgroup.module" + }, + { + "project_id": 9770, + "project_name": "project/corporative_site", + "filename": "modules/contrib/cck/modules/fieldgroup/panels/content_types/content_fieldgroup.inc" + }, + { + "project_id": 9770, + "project_name": "project/corporative_site", + "filename": "modules/contrib/cck/translations/pt.po" + }, + { + "project_id": 9770, + "project_name": "project/corporative_site", + "filename": "modules/contrib/features/includes/features.fieldgroup.inc" + }, + { + "project_id": 9770, + "project_name": "project/corporative_site", + "filename": "modules/contrib/features/tests/features.test" + }, + { + "project_id": 9770, + "project_name": "project/corporative_site", + "filename": "modules/contrib/features/tests/features_test.features.fieldgroup.inc" + }, + { + "project_id": 9833, + "project_name": "project/microdata", + "filename": "microdata.test" + }, + { + "project_id": 9847, + "project_name": "project/b2b_store_solution", + "filename": "b2b_construction/modules/contrib/field_group/field_group.module" + }, + { + "project_id": 9911, + "project_name": "project/dt", + "filename": "includes/contrib/dt.fieldgroup.inc" + }, + { + "project_id": 10271, + "project_name": "project/msnf", + "filename": "includes/msnf.steps.inc" + }, + { + "project_id": 10787, + "project_name": "project/bundle_copy", + "filename": "bundle_copy.module" + }, + { + "project_id": 11093, + "project_name": "project/fieldgroup_htabs", + "filename": "fieldgroup_htabs.module" + }, + { + "project_id": 11481, + "project_name": "project/fieldgroup_callouts", + "filename": "fieldgroup_callouts.module" + }, + { + "project_id": 11542, + "project_name": "project/cgpa_calculator", + "filename": "cgpa_calculator.features.fieldgroup.inc" + }, + { + "project_id": 11653, + "project_name": "project/elms_features", + "filename": "elms_parent/elms_parent.features.fieldgroup.inc" + }, + { + "project_id": 11653, + "project_name": "project/elms_features", + "filename": "elms_schedule/elms_schedule.features.fieldgroup.inc" + }, + { + "project_id": 11653, + "project_name": "project/elms_features", + "filename": "elms_site/elms_site.features.fieldgroup.inc" + }, + { + "project_id": 11704, + "project_name": "project/voipuser", + "filename": "voipuser.features.fieldgroup.inc" + }, + { + "project_id": 12559, + "project_name": "project/fieldgroup_placeholder", + "filename": "fieldgroup_placeholder.module" + }, + { + "project_id": 13003, + "project_name": "project/syndicator", + "filename": "includes/syndicator.permissions.inc" + }, + { + "project_id": 14470, + "project_name": "project/field_group_ajaxified_multipage", + "filename": "tests/src/Functional/FieldGroupAjaxifiedTest.php" + }, + { + "project_id": 15015, + "project_name": "project/bootstrap_fieldgroup", + "filename": "bootstrap_fieldgroup.module" + }, + { + "project_id": 15660, + "project_name": "project/markaspot", + "filename": "modules/mark_a_spot/mark_a_spot.field_group.inc" + }, + { + "project_id": 17996, + "project_name": "project/field_group_save_button", + "filename": "field_group_save_button.module" + }, + { + "project_id": 20051, + "project_name": "project/componentize", + "filename": "componentize_fieldgroup/componentize_fieldgroup.field_group.inc" + }, + { + "project_id": 20051, + "project_name": "project/componentize", + "filename": "componentize_fieldgroup/componentize_fieldgroup.module" + }, + { + "project_id": 20484, + "project_name": "project/mpub", + "filename": "modules/contrib/field_group/field_group.api.php" + }, + { + "project_id": 20484, + "project_name": "project/mpub", + "filename": "modules/contrib/field_group/field_group.module" + }, + { + "project_id": 20556, + "project_name": "project/bundle_copy_commerce", + "filename": "bundle_copy_commerce.module" + }, + { + "project_id": 21441, + "project_name": "project/field_group_table_component", + "filename": "field_group_table_component.module" + }, + { + "project_id": 21548, + "project_name": "project/skillset_inview", + "filename": "src/Form/ColorSkill.php" + }, + { + "project_id": 23311, + "project_name": "project/sports_league", + "filename": "modules/sl_default_ui/sl_default_ui.module" + }, + { + "project_id": 24042, + "project_name": "project/bundle_copy_profile2", + "filename": "bundle_copy_profile2.module" + }, + { + "project_id": 24420, + "project_name": "project/razoreye_biz", + "filename": "modules/contrib/field_group/includes/field_ui.inc" + }, + { + "project_id": 24420, + "project_name": "project/razoreye_biz", + "filename": "modules/contrib/field_group/src/Form/FieldGroupDeleteForm.php" + }, + { + "project_id": 24420, + "project_name": "project/razoreye_biz", + "filename": "modules/contrib/field_group/src/Plugin/field_group/FieldGroupFormatter/HtmlElement.php" + }, + { + "project_id": 25294, + "project_name": "project/pankm", + "filename": "modules/contrib/field_group/includes/field_ui.inc" + }, + { + "project_id": 25294, + "project_name": "project/pankm", + "filename": "modules/contrib/field_group/src/Form/FieldGroupDeleteForm.php" + }, + { + "project_id": 25294, + "project_name": "project/pankm", + "filename": "modules/contrib/field_group/src/Plugin/field_group/FieldGroupFormatter/HtmlElement.php" + }, + { + "project_id": 25326, + "project_name": "project/bif", + "filename": "src/Form/BlockInFormDeleteForm.php" + }, + { + "project_id": 26708, + "project_name": "project/simple_multistep", + "filename": "simple_multistep.module" + }, + { + "project_id": 27409, + "project_name": "project/esm", + "filename": "esm.module" + }, + { + "project_id": 47873, + "project_name": "project/field_group_label_classes", + "filename": "src/Plugin/field_group/FieldGroupFormatter/HtmlClassTitleElement.php" + }, + { + "project_id": 48123, + "project_name": "project/certificate", + "filename": "certificate.admin.inc" + }, + { + "project_id": 48161, + "project_name": "project/ULT", + "filename": "modules/ult_profiles/ult_profiles.install" + }, + { + "project_id": 49677, + "project_name": "project/icn", + "filename": "src/Form/IcnDefault.php" + }, + { + "project_id": 49956, + "project_name": "project/abtestui", + "filename": "src/Form/ABTestForm.php" + }, + { + "project_id": 53860, + "project_name": "project/bahai_incubator", + "filename": "modules/incubator/inc_base/inc_base.features.fieldgroup.inc" + }, + { + "project_id": 53860, + "project_name": "project/bahai_incubator", + "filename": "modules/incubator/inc_blog/inc_blog.features.fieldgroup.inc" + }, + { + "project_id": 53860, + "project_name": "project/bahai_incubator", + "filename": "modules/incubator/inc_calendar/inc_calendar.features.fieldgroup.inc" + }, + { + "project_id": 53860, + "project_name": "project/bahai_incubator", + "filename": "modules/incubator/inc_facilities/inc_facilities.features.fieldgroup.inc" + }, + { + "project_id": 53860, + "project_name": "project/bahai_incubator", + "filename": "modules/incubator/inc_news/inc_news.features.fieldgroup.inc" + }, + { + "project_id": 58220, + "project_name": "project/wim", + "filename": "modules/features/wim_addition_faq_product_fields/wim_addition_faq_product_fields.field_group.inc" + }, + { + "project_id": 59671, + "project_name": "project/field_group", + "filename": "includes/field_ui.inc" + }, + { + "project_id": 59671, + "project_name": "project/field_group", + "filename": "js/field_group.js" + }, + { + "project_id": 59671, + "project_name": "project/field_group", + "filename": "src/Form/FieldGroupDeleteForm.php" + }, + { + "project_id": 59671, + "project_name": "project/field_group", + "filename": "src/Plugin/field_group/FieldGroupFormatter/HtmlElement.php" + }, + { + "project_id": 59984, + "project_name": "project/ui_patterns_settings", + "filename": "src/Plugin/UiPatterns/SettingType/GroupType.php" + }, + { + "project_id": 60916, + "project_name": "project/jsonapi_example", + "filename": "src/Controller/JsonApiExampleController.php" + }, + { + "project_id": 61270, + "project_name": "project/inline_field_group", + "filename": "src/Plugin/field_group/FieldGroupFormatter/Inline.php" + }, + { + "project_id": 65525, + "project_name": "project/social_media_image_generator", + "filename": "src/Form/SocialImageLayoutForm.php" + }, + { + "project_id": 148466, + "project_name": "project/field_group_vertical_tabs", + "filename": "field_group_vertical_tabs.module" + }, + { + "project_id": 181203, + "project_name": "project/json_drop_api", + "filename": "modules/contrib/field_group/includes/field_ui.inc" + }, + { + "project_id": 181203, + "project_name": "project/json_drop_api", + "filename": "modules/contrib/field_group/js/field_group.js" + }, + { + "project_id": 181203, + "project_name": "project/json_drop_api", + "filename": "modules/contrib/field_group/src/Form/FieldGroupDeleteForm.php" + }, + { + "project_id": 181203, + "project_name": "project/json_drop_api", + "filename": "modules/contrib/field_group/src/FormatterHelper.php" + }, + { + "project_id": 181203, + "project_name": "project/json_drop_api", + "filename": "modules/contrib/field_group/src/Plugin/field_group/FieldGroupFormatter/HtmlElement.php" + } + ], + "ReplaceFileGetContentHeadersRector": [ + { + "project_id": 4408, + "project_name": "project/uc_fedex", + "filename": "uc_fedex.ship.inc" + }, + { + "project_id": 7433, + "project_name": "project/download_file", + "filename": "src/Controller/DownloadFileController.php" + }, + { + "project_id": 8197, + "project_name": "project/onepage", + "filename": "includes/file.inc" + }, + { + "project_id": 8197, + "project_name": "project/onepage", + "filename": "modules/file/file.module" + }, + { + "project_id": 9123, + "project_name": "project/1087726", + "filename": "includes/file.inc" + }, + { + "project_id": 9123, + "project_name": "project/1087726", + "filename": "modules/file/file.module" + }, + { + "project_id": 9745, + "project_name": "project/commerce_invoice", + "filename": "src/Controller/InvoiceController.php" + }, + { + "project_id": 10384, + "project_name": "project/commerce_purchase_order", + "filename": "commerce_purchase_order.module" + }, + { + "project_id": 10416, + "project_name": "project/archibald", + "filename": "modules/export/archibald_export.module" + }, + { + "project_id": 10715, + "project_name": "project/odir", + "filename": "odir.module" + }, + { + "project_id": 11613, + "project_name": "project/cforge", + "filename": "cforge.profile" + }, + { + "project_id": 11861, + "project_name": "project/erpal", + "filename": "modules/erpal/erpal_core/erpal_basic/erpal_basic_helper/modules/erpal_hacks_helper/erpal_hacks_helper.module" + }, + { + "project_id": 12118, + "project_name": "project/rebuild", + "filename": "tests/fixtures/drupal_sites/dev/includes/file.inc" + }, + { + "project_id": 12118, + "project_name": "project/rebuild", + "filename": "tests/fixtures/drupal_sites/dev/modules/file/file.module" + }, + { + "project_id": 12118, + "project_name": "project/rebuild", + "filename": "tests/fixtures/drupal_sites/prod/includes/file.inc" + }, + { + "project_id": 12118, + "project_name": "project/rebuild", + "filename": "tests/fixtures/drupal_sites/prod/modules/file/file.module" + }, + { + "project_id": 12442, + "project_name": "project/node_field", + "filename": "modules/node_field_file/node_field_file.module" + }, + { + "project_id": 12717, + "project_name": "project/1635422", + "filename": "hooks_list.php" + }, + { + "project_id": 13111, + "project_name": "project/ddcla", + "filename": "public/includes/file.inc" + }, + { + "project_id": 13111, + "project_name": "project/ddcla", + "filename": "public/modules/file/file.module" + }, + { + "project_id": 13125, + "project_name": "project/transcribe_distribution", + "filename": "modules/file/file.module" + }, + { + "project_id": 13323, + "project_name": "project/tmgmt_server", + "filename": "modules/tmgmt_server_mailer/tmgmt_server_mailer.module" + }, + { + "project_id": 14136, + "project_name": "project/sshid", + "filename": "sshid.admin.inc" + }, + { + "project_id": 14333, + "project_name": "project/wf", + "filename": "wf_job/includes/wf_job.pages.inc" + }, + { + "project_id": 14446, + "project_name": "project/tr_kurulum", + "filename": "includes/file.inc" + }, + { + "project_id": 14446, + "project_name": "project/tr_kurulum", + "filename": "modules/file/file.module" + }, + { + "project_id": 14506, + "project_name": "project/tb_blog_starter", + "filename": "includes/file.inc" + }, + { + "project_id": 14506, + "project_name": "project/tb_blog_starter", + "filename": "modules/file/file.module" + }, + { + "project_id": 14507, + "project_name": "project/tb_events_starter", + "filename": "modules/file/file.module" + }, + { + "project_id": 14509, + "project_name": "project/tb_hadelis_starter", + "filename": "includes/file.inc" + }, + { + "project_id": 14509, + "project_name": "project/tb_hadelis_starter", + "filename": "modules/file/file.module" + }, + { + "project_id": 14510, + "project_name": "project/tb_methys_starter", + "filename": "includes/file.inc" + }, + { + "project_id": 14510, + "project_name": "project/tb_methys_starter", + "filename": "modules/file/file.module" + }, + { + "project_id": 14511, + "project_name": "project/tb_mollise_starter", + "filename": "modules/file/file.module" + }, + { + "project_id": 14512, + "project_name": "project/tb_neris_starter", + "filename": "includes/file.inc" + }, + { + "project_id": 14512, + "project_name": "project/tb_neris_starter", + "filename": "modules/file/file.module" + }, + { + "project_id": 14513, + "project_name": "project/tb_palicico_starter", + "filename": "includes/file.inc" + }, + { + "project_id": 14513, + "project_name": "project/tb_palicico_starter", + "filename": "modules/file/file.module" + }, + { + "project_id": 14514, + "project_name": "project/tb_purity_starter", + "filename": "includes/file.inc" + }, + { + "project_id": 14514, + "project_name": "project/tb_purity_starter", + "filename": "modules/file/file.module" + }, + { + "project_id": 14515, + "project_name": "project/tb_rave_starter", + "filename": "includes/file.inc" + }, + { + "project_id": 14515, + "project_name": "project/tb_rave_starter", + "filename": "modules/file/file.module" + }, + { + "project_id": 14522, + "project_name": "project/tb_sirate_starter", + "filename": "includes/file.inc" + }, + { + "project_id": 14522, + "project_name": "project/tb_sirate_starter", + "filename": "modules/file/file.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/file/file.module" + }, + { + "project_id": 14728, + "project_name": "project/fontello", + "filename": "fontello.module" + }, + { + "project_id": 15045, + "project_name": "project/endicia", + "filename": "endicia.module" + }, + { + "project_id": 15203, + "project_name": "project/icomoon", + "filename": "icomoon.module" + }, + { + "project_id": 15222, + "project_name": "project/open_badging_installation_profile", + "filename": "includes/file.inc" + }, + { + "project_id": 15222, + "project_name": "project/open_badging_installation_profile", + "filename": "modules/file/file.module" + }, + { + "project_id": 15435, + "project_name": "project/drupdates", + "filename": "drupdates.module" + }, + { + "project_id": 15497, + "project_name": "project/bassets_sw", + "filename": "bassets_sw.module" + }, + { + "project_id": 15666, + "project_name": "project/pathed_files", + "filename": "pathed_files.module" + }, + { + "project_id": 16192, + "project_name": "project/mobilearkickstart", + "filename": "modules/file/file.module" + }, + { + "project_id": 16984, + "project_name": "project/spanish_distribution", + "filename": "includes/file.inc" + }, + { + "project_id": 16984, + "project_name": "project/spanish_distribution", + "filename": "modules/file/file.module" + }, + { + "project_id": 17013, + "project_name": "project/fuse", + "filename": "modules/file/file.module" + }, + { + "project_id": 17146, + "project_name": "project/flipping_book", + "filename": "flipping_book.module" + }, + { + "project_id": 18559, + "project_name": "project/govbr", + "filename": "modules/file/file.module" + }, + { + "project_id": 18815, + "project_name": "project/image_download_formatter", + "filename": "image_download_formatter.module" + }, + { + "project_id": 18897, + "project_name": "project/qurandistribution", + "filename": "includes/file.inc" + }, + { + "project_id": 18897, + "project_name": "project/qurandistribution", + "filename": "modules/file/file.module" + }, + { + "project_id": 20176, + "project_name": "project/private_image_cache", + "filename": "private_image_cache.module" + }, + { + "project_id": 20484, + "project_name": "project/mpub", + "filename": "modules/contrib/feeds/feeds.module" + }, + { + "project_id": 20979, + "project_name": "project/git_book", + "filename": "modules/git_book_markdown/git_book_markdown.module" + }, + { + "project_id": 20990, + "project_name": "project/development", + "filename": "modules/file/file.module" + }, + { + "project_id": 21069, + "project_name": "project/yamlform", + "filename": "src/Plugin/YamlFormElement/YamlFormManagedFileBase.php" + }, + { + "project_id": 22341, + "project_name": "project/pdftemplate", + "filename": "pdftemplate.rules.inc" + }, + { + "project_id": 23398, + "project_name": "project/reporting_cloud", + "filename": "reporting_cloud.module" + }, + { + "project_id": 23470, + "project_name": "project/gp_reviews", + "filename": "modules/file/file.module" + }, + { + "project_id": 23685, + "project_name": "project/rules_letter", + "filename": "rules_letter.module" + }, + { + "project_id": 24829, + "project_name": "project/node_revision_private_files_access_permission", + "filename": "node_revision_private_files_view.module" + }, + { + "project_id": 25896, + "project_name": "project/byu_installation_profile", + "filename": "modules/file/file.module" + }, + { + "project_id": 26057, + "project_name": "project/temporary_download", + "filename": "temporary_download.module" + }, + { + "project_id": 27553, + "project_name": "project/dam", + "filename": "dam.module" + }, + { + "project_id": 49900, + "project_name": "project/onetime_download", + "filename": "onetime_download.module" + }, + { + "project_id": 52207, + "project_name": "project/feeds", + "filename": "feeds.module" + }, + { + "project_id": 52555, + "project_name": "project/field_formatter_key_label", + "filename": "field_formatter_key_label.module" + }, + { + "project_id": 54190, + "project_name": "project/file_shelf", + "filename": "file_shelf.module" + }, + { + "project_id": 56855, + "project_name": "project/tmgmt", + "filename": "translators/tmgmt_file/tmgmt_file.module" + }, + { + "project_id": 57266, + "project_name": "project/protected_file", + "filename": "protected_file.module" + }, + { + "project_id": 57266, + "project_name": "project/protected_file", + "filename": "src/Access/ProtectedFileAccessChecker.php" + }, + { + "project_id": 59401, + "project_name": "project/file_entity", + "filename": "file_entity.module" + }, + { + "project_id": 59676, + "project_name": "project/skilling", + "filename": "src/Access/access-control.inc" + }, + { + "project_id": 60227, + "project_name": "project/govimentum", + "filename": "includes/file.inc" + }, + { + "project_id": 60227, + "project_name": "project/govimentum", + "filename": "modules/file/file.module" + }, + { + "project_id": 60227, + "project_name": "project/govimentum", + "filename": "modules/file/tests/file_module_test.module" + }, + { + "project_id": 62378, + "project_name": "project/drupalru_d7", + "filename": "modules/file/file.module" + }, + { + "project_id": 62378, + "project_name": "project/drupalru_d7", + "filename": "modules/file/tests/file_module_test.module" + }, + { + "project_id": 63624, + "project_name": "project/ubershopwish", + "filename": "modules/file/file.module" + }, + { + "project_id": 63624, + "project_name": "project/ubershopwish", + "filename": "modules/file/tests/file_module_test.module" + }, + { + "project_id": 77509, + "project_name": "project/testproject4234", + "filename": "modules/file/file.module" + }, + { + "project_id": 77509, + "project_name": "project/testproject4234", + "filename": "modules/file/tests/file_module_test.module" + }, + { + "project_id": 80778, + "project_name": "project/lingo24", + "filename": "lingo24.module" + }, + { + "project_id": 82260, + "project_name": "project/commerce_invoice_ubl", + "filename": "src/Controller/InvoiceController.php" + }, + { + "project_id": 87283, + "project_name": "project/dxpr_builder", + "filename": "dxpr_builder.module" + }, + { + "project_id": 101942, + "project_name": "project/unpublished_file", + "filename": "unpublished_file.module" + }, + { + "project_id": 134243, + "project_name": "project/git_wiki_help", + "filename": "git_wiki_help.module" + }, + { + "project_id": 158230, + "project_name": "project/media_icon_deliver", + "filename": "src/Controller/IconController.php" + }, + { + "project_id": 180286, + "project_name": "project/file_visibility", + "filename": "src/Hook/FileAccessHooks.php" + } + ], + "ReplaceNodeAccessViewAllNodesRector": [ + { + "project_id": 422, + "project_name": "project/evaluation", + "filename": "patched_files/node.module" + }, + { + "project_id": 4606, + "project_name": "project/module_grants", + "filename": "module_grants.module" + }, + { + "project_id": 8197, + "project_name": "project/onepage", + "filename": "modules/node/node.api.php" + }, + { + "project_id": 8197, + "project_name": "project/onepage", + "filename": "modules/node/node.test" + }, + { + "project_id": 8197, + "project_name": "project/onepage", + "filename": "modules/simpletest/tests/entity_query_access_test.module" + }, + { + "project_id": 9123, + "project_name": "project/1087726", + "filename": "modules/node/node.api.php" + }, + { + "project_id": 9123, + "project_name": "project/1087726", + "filename": "modules/node/node.test" + }, + { + "project_id": 9847, + "project_name": "project/b2b_store_solution", + "filename": "b2b_construction/modules/contrib/entity/modules/callbacks.inc" + }, + { + "project_id": 10339, + "project_name": "project/views_query_na_subquery", + "filename": "views_plugin_query_na_subquery.inc" + }, + { + "project_id": 12118, + "project_name": "project/rebuild", + "filename": "tests/fixtures/drupal_sites/dev/modules/node/node.api.php" + }, + { + "project_id": 12118, + "project_name": "project/rebuild", + "filename": "tests/fixtures/drupal_sites/dev/modules/node/node.test" + }, + { + "project_id": 12118, + "project_name": "project/rebuild", + "filename": "tests/fixtures/drupal_sites/dev/modules/simpletest/tests/entity_query_access_test.module" + }, + { + "project_id": 12118, + "project_name": "project/rebuild", + "filename": "tests/fixtures/drupal_sites/prod/modules/node/node.api.php" + }, + { + "project_id": 12118, + "project_name": "project/rebuild", + "filename": "tests/fixtures/drupal_sites/prod/modules/node/node.test" + }, + { + "project_id": 12118, + "project_name": "project/rebuild", + "filename": "tests/fixtures/drupal_sites/prod/modules/simpletest/tests/entity_query_access_test.module" + }, + { + "project_id": 12717, + "project_name": "project/1635422", + "filename": "hooks_list.php" + }, + { + "project_id": 13111, + "project_name": "project/ddcla", + "filename": "public/modules/node/node.api.php" + }, + { + "project_id": 13111, + "project_name": "project/ddcla", + "filename": "public/modules/node/node.test" + }, + { + "project_id": 13125, + "project_name": "project/transcribe_distribution", + "filename": "modules/node/node.api.php" + }, + { + "project_id": 13125, + "project_name": "project/transcribe_distribution", + "filename": "modules/node/node.test" + }, + { + "project_id": 13125, + "project_name": "project/transcribe_distribution", + "filename": "modules/simpletest/tests/entity_query_access_test.module" + }, + { + "project_id": 14446, + "project_name": "project/tr_kurulum", + "filename": "modules/node/node.api.php" + }, + { + "project_id": 14446, + "project_name": "project/tr_kurulum", + "filename": "modules/node/node.test" + }, + { + "project_id": 14446, + "project_name": "project/tr_kurulum", + "filename": "modules/simpletest/tests/entity_query_access_test.module" + }, + { + "project_id": 14506, + "project_name": "project/tb_blog_starter", + "filename": "modules/node/node.api.php" + }, + { + "project_id": 14506, + "project_name": "project/tb_blog_starter", + "filename": "modules/node/node.test" + }, + { + "project_id": 14506, + "project_name": "project/tb_blog_starter", + "filename": "modules/simpletest/tests/entity_query_access_test.module" + }, + { + "project_id": 14507, + "project_name": "project/tb_events_starter", + "filename": "modules/node/node.api.php" + }, + { + "project_id": 14507, + "project_name": "project/tb_events_starter", + "filename": "modules/node/node.test" + }, + { + "project_id": 14507, + "project_name": "project/tb_events_starter", + "filename": "modules/simpletest/tests/entity_query_access_test.module" + }, + { + "project_id": 14509, + "project_name": "project/tb_hadelis_starter", + "filename": "modules/node/node.api.php" + }, + { + "project_id": 14509, + "project_name": "project/tb_hadelis_starter", + "filename": "modules/node/node.test" + }, + { + "project_id": 14509, + "project_name": "project/tb_hadelis_starter", + "filename": "modules/simpletest/tests/entity_query_access_test.module" + }, + { + "project_id": 14510, + "project_name": "project/tb_methys_starter", + "filename": "modules/node/node.api.php" + }, + { + "project_id": 14510, + "project_name": "project/tb_methys_starter", + "filename": "modules/node/node.test" + }, + { + "project_id": 14510, + "project_name": "project/tb_methys_starter", + "filename": "modules/simpletest/tests/entity_query_access_test.module" + }, + { + "project_id": 14511, + "project_name": "project/tb_mollise_starter", + "filename": "modules/node/node.api.php" + }, + { + "project_id": 14511, + "project_name": "project/tb_mollise_starter", + "filename": "modules/node/node.test" + }, + { + "project_id": 14511, + "project_name": "project/tb_mollise_starter", + "filename": "modules/simpletest/tests/entity_query_access_test.module" + }, + { + "project_id": 14512, + "project_name": "project/tb_neris_starter", + "filename": "modules/node/node.api.php" + }, + { + "project_id": 14512, + "project_name": "project/tb_neris_starter", + "filename": "modules/node/node.test" + }, + { + "project_id": 14512, + "project_name": "project/tb_neris_starter", + "filename": "modules/simpletest/tests/entity_query_access_test.module" + }, + { + "project_id": 14513, + "project_name": "project/tb_palicico_starter", + "filename": "modules/node/node.api.php" + }, + { + "project_id": 14513, + "project_name": "project/tb_palicico_starter", + "filename": "modules/node/node.test" + }, + { + "project_id": 14513, + "project_name": "project/tb_palicico_starter", + "filename": "modules/simpletest/tests/entity_query_access_test.module" + }, + { + "project_id": 14514, + "project_name": "project/tb_purity_starter", + "filename": "modules/node/node.api.php" + }, + { + "project_id": 14514, + "project_name": "project/tb_purity_starter", + "filename": "modules/node/node.test" + }, + { + "project_id": 14514, + "project_name": "project/tb_purity_starter", + "filename": "modules/simpletest/tests/entity_query_access_test.module" + }, + { + "project_id": 14515, + "project_name": "project/tb_rave_starter", + "filename": "modules/node/node.api.php" + }, + { + "project_id": 14515, + "project_name": "project/tb_rave_starter", + "filename": "modules/node/node.test" + }, + { + "project_id": 14515, + "project_name": "project/tb_rave_starter", + "filename": "modules/simpletest/tests/entity_query_access_test.module" + }, + { + "project_id": 14522, + "project_name": "project/tb_sirate_starter", + "filename": "modules/node/node.api.php" + }, + { + "project_id": 14522, + "project_name": "project/tb_sirate_starter", + "filename": "modules/node/node.test" + }, + { + "project_id": 14522, + "project_name": "project/tb_sirate_starter", + "filename": "modules/simpletest/tests/entity_query_access_test.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/node/node.api.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/node/node.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/entity_query_access_test.module" + }, + { + "project_id": 15222, + "project_name": "project/open_badging_installation_profile", + "filename": "modules/node/node.api.php" + }, + { + "project_id": 15222, + "project_name": "project/open_badging_installation_profile", + "filename": "modules/node/node.test" + }, + { + "project_id": 15222, + "project_name": "project/open_badging_installation_profile", + "filename": "modules/simpletest/tests/entity_query_access_test.module" + }, + { + "project_id": 16192, + "project_name": "project/mobilearkickstart", + "filename": "modules/node/node.api.php" + }, + { + "project_id": 16192, + "project_name": "project/mobilearkickstart", + "filename": "modules/node/node.test" + }, + { + "project_id": 16192, + "project_name": "project/mobilearkickstart", + "filename": "modules/simpletest/tests/entity_query_access_test.module" + }, + { + "project_id": 16984, + "project_name": "project/spanish_distribution", + "filename": "modules/node/node.api.php" + }, + { + "project_id": 16984, + "project_name": "project/spanish_distribution", + "filename": "modules/node/node.test" + }, + { + "project_id": 16984, + "project_name": "project/spanish_distribution", + "filename": "modules/simpletest/tests/entity_query_access_test.module" + }, + { + "project_id": 17013, + "project_name": "project/fuse", + "filename": "modules/node/node.api.php" + }, + { + "project_id": 17013, + "project_name": "project/fuse", + "filename": "modules/node/node.test" + }, + { + "project_id": 17013, + "project_name": "project/fuse", + "filename": "modules/simpletest/tests/entity_query_access_test.module" + }, + { + "project_id": 18559, + "project_name": "project/govbr", + "filename": "modules/node/node.test" + }, + { + "project_id": 18559, + "project_name": "project/govbr", + "filename": "modules/simpletest/tests/entity_query_access_test.module" + }, + { + "project_id": 18897, + "project_name": "project/qurandistribution", + "filename": "modules/node/node.api.php" + }, + { + "project_id": 18897, + "project_name": "project/qurandistribution", + "filename": "modules/node/node.test" + }, + { + "project_id": 18897, + "project_name": "project/qurandistribution", + "filename": "modules/simpletest/tests/entity_query_access_test.module" + }, + { + "project_id": 19970, + "project_name": "project/entity_gallery", + "filename": "entity_gallery.api.php" + }, + { + "project_id": 20484, + "project_name": "project/mpub", + "filename": "modules/contrib/ctools/includes/entity-access.inc" + }, + { + "project_id": 20484, + "project_name": "project/mpub", + "filename": "modules/contrib/entity/modules/callbacks.inc" + }, + { + "project_id": 20990, + "project_name": "project/development", + "filename": "modules/node/node.api.php" + }, + { + "project_id": 20990, + "project_name": "project/development", + "filename": "modules/node/node.test" + }, + { + "project_id": 20990, + "project_name": "project/development", + "filename": "modules/simpletest/tests/entity_query_access_test.module" + }, + { + "project_id": 23470, + "project_name": "project/gp_reviews", + "filename": "modules/node/node.api.php" + }, + { + "project_id": 23470, + "project_name": "project/gp_reviews", + "filename": "modules/node/node.test" + }, + { + "project_id": 23470, + "project_name": "project/gp_reviews", + "filename": "modules/simpletest/tests/entity_query_access_test.module" + }, + { + "project_id": 25896, + "project_name": "project/byu_installation_profile", + "filename": "modules/node/node.test" + }, + { + "project_id": 25896, + "project_name": "project/byu_installation_profile", + "filename": "modules/simpletest/tests/entity_query_access_test.module" + }, + { + "project_id": 60215, + "project_name": "project/aeg", + "filename": "modules/ctools/includes/entity-access.inc" + }, + { + "project_id": 60215, + "project_name": "project/aeg", + "filename": "modules/entity/modules/callbacks.inc" + }, + { + "project_id": 60227, + "project_name": "project/govimentum", + "filename": "modules/node/node.api.php" + }, + { + "project_id": 60227, + "project_name": "project/govimentum", + "filename": "modules/node/node.test" + }, + { + "project_id": 60227, + "project_name": "project/govimentum", + "filename": "modules/simpletest/tests/entity_query_access_test.module" + }, + { + "project_id": 62378, + "project_name": "project/drupalru_d7", + "filename": "modules/node/node.api.php" + }, + { + "project_id": 62378, + "project_name": "project/drupalru_d7", + "filename": "modules/node/node.test" + }, + { + "project_id": 62378, + "project_name": "project/drupalru_d7", + "filename": "modules/simpletest/tests/entity_query_access_test.module" + }, + { + "project_id": 63624, + "project_name": "project/ubershopwish", + "filename": "modules/node/node.api.php" + }, + { + "project_id": 63624, + "project_name": "project/ubershopwish", + "filename": "modules/node/node.test" + }, + { + "project_id": 63624, + "project_name": "project/ubershopwish", + "filename": "modules/simpletest/tests/entity_query_access_test.module" + }, + { + "project_id": 77509, + "project_name": "project/testproject4234", + "filename": "modules/node/node.api.php" + }, + { + "project_id": 77509, + "project_name": "project/testproject4234", + "filename": "modules/node/node.test" + }, + { + "project_id": 77509, + "project_name": "project/testproject4234", + "filename": "modules/simpletest/tests/entity_query_access_test.module" + }, + { + "project_id": 154063, + "project_name": "project/view_usernames_node_author", + "filename": "tests/src/Kernel/NodeAuthorUsernameAccessDeciderTest.php" + } + ], + "ReplaceNodeAddBodyFieldRector": [ + { + "project_id": 327, + "project_name": "project/snippets", + "filename": "snippets.install" + }, + { + "project_id": 575, + "project_name": "project/family", + "filename": "family.install" + }, + { + "project_id": 1151, + "project_name": "project/drush", + "filename": "tests/resources/create_node_types.php" + }, + { + "project_id": 4795, + "project_name": "project/administration_notification", + "filename": "admin_notification.install" + }, + { + "project_id": 4833, + "project_name": "project/search_by_page", + "filename": "tests/sbp_test.install" + }, + { + "project_id": 5625, + "project_name": "project/guidance", + "filename": "guidance.install" + }, + { + "project_id": 8197, + "project_name": "project/onepage", + "filename": "modules/blog/blog.install" + }, + { + "project_id": 8197, + "project_name": "project/onepage", + "filename": "modules/book/book.install" + }, + { + "project_id": 8285, + "project_name": "project/recruit", + "filename": "recruit.install" + }, + { + "project_id": 8947, + "project_name": "project/wysiwyg_fields", + "filename": "tests/wysiwyg_fields_test.install" + }, + { + "project_id": 9099, + "project_name": "project/vinculum", + "filename": "modules/vinculum_comment/vinculum_comment.test" + }, + { + "project_id": 9123, + "project_name": "project/1087726", + "filename": "modules/blog/blog.install" + }, + { + "project_id": 9123, + "project_name": "project/1087726", + "filename": "modules/book/book.install" + }, + { + "project_id": 11943, + "project_name": "project/rocketship", + "filename": "rocketship.install" + }, + { + "project_id": 12118, + "project_name": "project/rebuild", + "filename": "tests/fixtures/drupal_sites/dev/modules/blog/blog.install" + }, + { + "project_id": 12118, + "project_name": "project/rebuild", + "filename": "tests/fixtures/drupal_sites/dev/modules/book/book.install" + }, + { + "project_id": 12118, + "project_name": "project/rebuild", + "filename": "tests/fixtures/drupal_sites/prod/modules/blog/blog.install" + }, + { + "project_id": 12118, + "project_name": "project/rebuild", + "filename": "tests/fixtures/drupal_sites/prod/modules/book/book.install" + }, + { + "project_id": 13039, + "project_name": "project/opigno_glossary", + "filename": "opigno_glossary.install" + }, + { + "project_id": 13111, + "project_name": "project/ddcla", + "filename": "public/modules/blog/blog.install" + }, + { + "project_id": 13111, + "project_name": "project/ddcla", + "filename": "public/modules/book/book.install" + }, + { + "project_id": 13125, + "project_name": "project/transcribe_distribution", + "filename": "modules/blog/blog.install" + }, + { + "project_id": 13366, + "project_name": "project/prh_search", + "filename": "prh_search.install" + }, + { + "project_id": 14446, + "project_name": "project/tr_kurulum", + "filename": "modules/blog/blog.install" + }, + { + "project_id": 14446, + "project_name": "project/tr_kurulum", + "filename": "modules/book/book.install" + }, + { + "project_id": 14506, + "project_name": "project/tb_blog_starter", + "filename": "modules/blog/blog.install" + }, + { + "project_id": 14507, + "project_name": "project/tb_events_starter", + "filename": "modules/blog/blog.install" + }, + { + "project_id": 14507, + "project_name": "project/tb_events_starter", + "filename": "modules/book/book.install" + }, + { + "project_id": 14509, + "project_name": "project/tb_hadelis_starter", + "filename": "modules/blog/blog.install" + }, + { + "project_id": 14509, + "project_name": "project/tb_hadelis_starter", + "filename": "modules/book/book.install" + }, + { + "project_id": 14510, + "project_name": "project/tb_methys_starter", + "filename": "modules/blog/blog.install" + }, + { + "project_id": 14511, + "project_name": "project/tb_mollise_starter", + "filename": "modules/blog/blog.install" + }, + { + "project_id": 14511, + "project_name": "project/tb_mollise_starter", + "filename": "modules/book/book.install" + }, + { + "project_id": 14512, + "project_name": "project/tb_neris_starter", + "filename": "modules/blog/blog.install" + }, + { + "project_id": 14512, + "project_name": "project/tb_neris_starter", + "filename": "modules/book/book.install" + }, + { + "project_id": 14513, + "project_name": "project/tb_palicico_starter", + "filename": "modules/blog/blog.install" + }, + { + "project_id": 14514, + "project_name": "project/tb_purity_starter", + "filename": "modules/blog/blog.install" + }, + { + "project_id": 14514, + "project_name": "project/tb_purity_starter", + "filename": "modules/book/book.install" + }, + { + "project_id": 14515, + "project_name": "project/tb_rave_starter", + "filename": "modules/blog/blog.install" + }, + { + "project_id": 14515, + "project_name": "project/tb_rave_starter", + "filename": "modules/book/book.install" + }, + { + "project_id": 14522, + "project_name": "project/tb_sirate_starter", + "filename": "modules/blog/blog.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/blog/blog.install" + }, + { + "project_id": 14614, + "project_name": "project/latest", + "filename": "latest.install.fields-instances" + }, + { + "project_id": 15222, + "project_name": "project/open_badging_installation_profile", + "filename": "modules/blog/blog.install" + }, + { + "project_id": 15222, + "project_name": "project/open_badging_installation_profile", + "filename": "modules/book/book.install" + }, + { + "project_id": 15654, + "project_name": "project/rio", + "filename": "rio.install" + }, + { + "project_id": 15665, + "project_name": "project/drupal_wall", + "filename": "drupal_wall.install" + }, + { + "project_id": 16192, + "project_name": "project/mobilearkickstart", + "filename": "modules/blog/blog.install" + }, + { + "project_id": 16918, + "project_name": "project/civicrm_event_receipts", + "filename": "civicrm_event_receipts.install" + }, + { + "project_id": 16984, + "project_name": "project/spanish_distribution", + "filename": "modules/blog/blog.install" + }, + { + "project_id": 16984, + "project_name": "project/spanish_distribution", + "filename": "modules/book/book.install" + }, + { + "project_id": 17013, + "project_name": "project/fuse", + "filename": "modules/blog/blog.install" + }, + { + "project_id": 17283, + "project_name": "project/social_content", + "filename": "modules/facebook/social_content_facebook.install" + }, + { + "project_id": 17283, + "project_name": "project/social_content", + "filename": "modules/flickr/social_content_flickr.install" + }, + { + "project_id": 17283, + "project_name": "project/social_content", + "filename": "modules/instagram/social_content_instagram.install" + }, + { + "project_id": 17283, + "project_name": "project/social_content", + "filename": "modules/linkedin/social_content_linkedin.install" + }, + { + "project_id": 17283, + "project_name": "project/social_content", + "filename": "modules/picasa/social_content_picasa.install" + }, + { + "project_id": 17283, + "project_name": "project/social_content", + "filename": "modules/pinterest/social_content_pinterest.install" + }, + { + "project_id": 17283, + "project_name": "project/social_content", + "filename": "modules/soundcloud/social_content_soundcloud.install" + }, + { + "project_id": 17283, + "project_name": "project/social_content", + "filename": "modules/vk/social_content_vk.install" + }, + { + "project_id": 17283, + "project_name": "project/social_content", + "filename": "modules/youtube/social_content_youtube.install" + }, + { + "project_id": 18181, + "project_name": "project/og_groupcontent", + "filename": "og_groupcontent.install" + }, + { + "project_id": 18297, + "project_name": "project/administrative_help", + "filename": "administrative_help.install" + }, + { + "project_id": 18559, + "project_name": "project/govbr", + "filename": "modules/blog/blog.install" + }, + { + "project_id": 18897, + "project_name": "project/qurandistribution", + "filename": "modules/blog/blog.install" + }, + { + "project_id": 19654, + "project_name": "project/commune", + "filename": "commune.install" + }, + { + "project_id": 20879, + "project_name": "project/commerce_behat", + "filename": "commerce_behat.install" + }, + { + "project_id": 20971, + "project_name": "project/experd", + "filename": "experd_reports/experd_reports.install" + }, + { + "project_id": 20990, + "project_name": "project/development", + "filename": "modules/blog/blog.install" + }, + { + "project_id": 20990, + "project_name": "project/development", + "filename": "modules/book/book.install" + }, + { + "project_id": 21675, + "project_name": "project/display_machine_name", + "filename": "tests/src/Kernel/DisplayMachineNameTest.php" + }, + { + "project_id": 22613, + "project_name": "project/smartparticipation", + "filename": "modules/smartparticipation/smartparticipation_core/node_types/smartparticipation_core_research.inc" + }, + { + "project_id": 23470, + "project_name": "project/gp_reviews", + "filename": "modules/blog/blog.install" + }, + { + "project_id": 24420, + "project_name": "project/razoreye_biz", + "filename": "modules/contrib/ctools/tests/src/Kernel/RelationshipsTestBase.php" + }, + { + "project_id": 25294, + "project_name": "project/pankm", + "filename": "modules/contrib/ctools/tests/src/Kernel/RelationshipsTestBase.php" + }, + { + "project_id": 25894, + "project_name": "project/external_page_redirect", + "filename": "external_page_redirect.install" + }, + { + "project_id": 25896, + "project_name": "project/byu_installation_profile", + "filename": "modules/blog/blog.install" + }, + { + "project_id": 25927, + "project_name": "project/automatic_field_saver", + "filename": "tests/src/Kernel/AutomaticFieldSaverTest.php" + }, + { + "project_id": 48060, + "project_name": "project/smartling", + "filename": "submodules/smartling_quiz_multichoice/tests/smartling_quiz_multichoice.test" + }, + { + "project_id": 52307, + "project_name": "project/cultura", + "filename": "includes/content_types.inc" + }, + { + "project_id": 55171, + "project_name": "project/votingapi", + "filename": "tests/src/Functional/VoteCreationTest.php" + }, + { + "project_id": 56187, + "project_name": "project/closedquestion_scoreboard", + "filename": "closedquestion_scoreboard.install" + }, + { + "project_id": 57564, + "project_name": "project/tome", + "filename": "modules/tome_sync/tests/src/Kernel/FieldDeletionTest.php" + }, + { + "project_id": 59514, + "project_name": "project/ctools", + "filename": "tests/src/Kernel/RelationshipsTestBase.php" + }, + { + "project_id": 59603, + "project_name": "project/lingotek", + "filename": "tests/src/Functional/LingotekFieldBodyNotificationCallbackTest.php" + }, + { + "project_id": 60227, + "project_name": "project/govimentum", + "filename": "modules/blog/blog.install" + }, + { + "project_id": 60227, + "project_name": "project/govimentum", + "filename": "modules/book/book.install" + }, + { + "project_id": 60837, + "project_name": "project/virtualcare", + "filename": "modules/contrib/ctools/tests/src/Kernel/RelationshipsTestBase.php" + }, + { + "project_id": 60863, + "project_name": "project/druvel", + "filename": "druvel.install" + }, + { + "project_id": 62378, + "project_name": "project/drupalru_d7", + "filename": "modules/blog/blog.install" + }, + { + "project_id": 63624, + "project_name": "project/ubershopwish", + "filename": "modules/blog/blog.install" + }, + { + "project_id": 63624, + "project_name": "project/ubershopwish", + "filename": "modules/book/book.install" + }, + { + "project_id": 73338, + "project_name": "project/feedstextareafetcher", + "filename": "tests/src/Functional/Feeds/Fetcher/Form/TextareaFetcherFeedFormTest.php" + }, + { + "project_id": 77509, + "project_name": "project/testproject4234", + "filename": "modules/blog/blog.install" + }, + { + "project_id": 77509, + "project_name": "project/testproject4234", + "filename": "modules/book/book.install" + }, + { + "project_id": 86399, + "project_name": "project/sva", + "filename": "tests/src/FunctionalJavascript/SimpleViewsAccordionTest.php" + }, + { + "project_id": 133730, + "project_name": "project/rdf_sync", + "filename": "tests/src/Functional/RdfFieldConfigFormTest.php" + }, + { + "project_id": 163174, + "project_name": "project/ai_eca", + "filename": "modules/agents/tests/src/Kernel/AiEcaAgentsKernelTestBase.php" + }, + { + "project_id": 181203, + "project_name": "project/json_drop_api", + "filename": "modules/contrib/ctools/tests/src/Kernel/RelationshipsTestBase.php" + }, + { + "project_id": 210430, + "project_name": "project/drupal_cli", + "filename": "tests/integrations/drupal/fixtures/setup-content-type.php" + } + ], + "ReplaceNodeModuleProceduralFunctionsRector": [ + { + "project_id": 337, + "project_name": "project/indexpage", + "filename": "indexpage.install" + }, + { + "project_id": 441, + "project_name": "project/question", + "filename": "question.module" + }, + { + "project_id": 945, + "project_name": "project/node_clone", + "filename": "clone.install" + }, + { + "project_id": 1337, + "project_name": "project/twitter", + "filename": "twitter_post/twitter_post.pages.inc" + }, + { + "project_id": 1496, + "project_name": "project/util", + "filename": "contribs/comment_box/comment_box.install" + }, + { + "project_id": 1496, + "project_name": "project/util", + "filename": "contribs/edit_link/edit_link.module" + }, + { + "project_id": 1496, + "project_name": "project/util", + "filename": "contribs/top_buttons/top_buttons.install" + }, + { + "project_id": 2335, + "project_name": "project/mmedia", + "filename": "modules/mapi_admin.inc" + }, + { + "project_id": 2775, + "project_name": "project/subdomain", + "filename": "includes/subdomain_mode_contenttype.inc" + }, + { + "project_id": 3174, + "project_name": "project/autotag", + "filename": "autotag.settings.inc" + }, + { + "project_id": 3330, + "project_name": "project/fast_gallery", + "filename": "storageengine/node.config.inc" + }, + { + "project_id": 3591, + "project_name": "project/nodetypeviews", + "filename": "nodetypeviews.admin.inc" + }, + { + "project_id": 4031, + "project_name": "project/admin_notify", + "filename": "admin_notify.admin.inc" + }, + { + "project_id": 4196, + "project_name": "project/fbconnect", + "filename": "fbconnect_stream_publish/fbconnect_stream_publish.install" + }, + { + "project_id": 4206, + "project_name": "project/addanother", + "filename": "addanother.module" + }, + { + "project_id": 4485, + "project_name": "project/googlenews", + "filename": "tests/GoogleNewsBasicsTestCase.test" + }, + { + "project_id": 4671, + "project_name": "project/collection", + "filename": "src/CollectionItemListBuilder.php" + }, + { + "project_id": 4671, + "project_name": "project/collection", + "filename": "src/Plugin/views/field/CollectionItemCollectedItemEntityTypeLabel.php" + }, + { + "project_id": 5765, + "project_name": "project/simplenews_content_selection", + "filename": "scs.admin.inc" + }, + { + "project_id": 6019, + "project_name": "project/languageassign", + "filename": "languageassign.module" + }, + { + "project_id": 6676, + "project_name": "project/custom_search", + "filename": "custom_search.install" + }, + { + "project_id": 6719, + "project_name": "project/context_admin", + "filename": "contrib/context_admin_vbo/includes/context_admin_vbo.views_default.inc" + }, + { + "project_id": 7073, + "project_name": "project/revision_all", + "filename": "revision_all.module" + }, + { + "project_id": 7310, + "project_name": "project/views_content_cache", + "filename": "plugins/views_content_cache/node.inc" + }, + { + "project_id": 7402, + "project_name": "project/nopremium", + "filename": "nopremium.admin.inc" + }, + { + "project_id": 7402, + "project_name": "project/nopremium", + "filename": "nopremium.module" + }, + { + "project_id": 7559, + "project_name": "project/openscholar_vsite", + "filename": "vsite_content/vsite_content.features.views.inc" + }, + { + "project_id": 8197, + "project_name": "project/onepage", + "filename": "modules/node/node.admin.inc" + }, + { + "project_id": 8197, + "project_name": "project/onepage", + "filename": "modules/node/node.api.php" + }, + { + "project_id": 8197, + "project_name": "project/onepage", + "filename": "modules/user/user.api.php" + }, + { + "project_id": 8368, + "project_name": "project/references", + "filename": "node_reference/node_reference.test" + }, + { + "project_id": 8453, + "project_name": "project/max_age", + "filename": "max_age.install" + }, + { + "project_id": 8458, + "project_name": "project/node_gallery_bulk_operations", + "filename": "node_gallery_bulk_operations.views_default.inc" + }, + { + "project_id": 8520, + "project_name": "project/node_gallery_taxonomy", + "filename": "node_gallery_taxonomy.module" + }, + { + "project_id": 8864, + "project_name": "project/merci_signup", + "filename": "merci_signup.views_default.inc" + }, + { + "project_id": 8889, + "project_name": "project/merci_barcode_labels", + "filename": "merci_barcode_labels.views_default.inc" + }, + { + "project_id": 9123, + "project_name": "project/1087726", + "filename": "modules/node/node.admin.inc" + }, + { + "project_id": 9123, + "project_name": "project/1087726", + "filename": "modules/node/node.api.php" + }, + { + "project_id": 9123, + "project_name": "project/1087726", + "filename": "modules/user/user.api.php" + }, + { + "project_id": 9665, + "project_name": "project/sharebar", + "filename": "sharebar.install" + }, + { + "project_id": 9847, + "project_name": "project/b2b_store_solution", + "filename": "b2b_construction/modules/contrib/admin_menu/admin_views/views_default/admin_content_node.inc" + }, + { + "project_id": 9970, + "project_name": "project/colors", + "filename": "src/Plugin/colors/type/NodeScheme.php" + }, + { + "project_id": 9981, + "project_name": "project/field_weight", + "filename": "field_weight.admin.inc" + }, + { + "project_id": 10049, + "project_name": "project/meerkat", + "filename": "modules/meerkatnode/meerkatnode.module" + }, + { + "project_id": 10250, + "project_name": "project/views_node_access", + "filename": "views_node_access_plugin_access_node_type.inc" + }, + { + "project_id": 10250, + "project_name": "project/views_node_access", + "filename": "views_node_access_plugin_access_node_type_current_user.inc" + }, + { + "project_id": 10250, + "project_name": "project/views_node_access", + "filename": "views_node_access_plugin_access_node_type_perm.inc" + }, + { + "project_id": 10250, + "project_name": "project/views_node_access", + "filename": "views_node_access_plugin_access_node_type_role.inc" + }, + { + "project_id": 10377, + "project_name": "project/nodeaccesskeys", + "filename": "views_plugin_access_nodeaccesskeys.inc" + }, + { + "project_id": 10715, + "project_name": "project/odir", + "filename": "odir.admin.inc" + }, + { + "project_id": 10942, + "project_name": "project/pager_for_content_type", + "filename": "pager_for_content_type.module" + }, + { + "project_id": 11529, + "project_name": "project/drupalgap", + "filename": "modules/drupalgap_og/drupalgap_og.module" + }, + { + "project_id": 11653, + "project_name": "project/elms_features", + "filename": "elms_schedule/elms_schedule.views_default.inc" + }, + { + "project_id": 12118, + "project_name": "project/rebuild", + "filename": "tests/fixtures/drupal_sites/dev/modules/node/node.admin.inc" + }, + { + "project_id": 12118, + "project_name": "project/rebuild", + "filename": "tests/fixtures/drupal_sites/dev/modules/node/node.api.php" + }, + { + "project_id": 12118, + "project_name": "project/rebuild", + "filename": "tests/fixtures/drupal_sites/dev/modules/user/user.api.php" + }, + { + "project_id": 12118, + "project_name": "project/rebuild", + "filename": "tests/fixtures/drupal_sites/prod/modules/node/node.admin.inc" + }, + { + "project_id": 12118, + "project_name": "project/rebuild", + "filename": "tests/fixtures/drupal_sites/prod/modules/node/node.api.php" + }, + { + "project_id": 12118, + "project_name": "project/rebuild", + "filename": "tests/fixtures/drupal_sites/prod/modules/user/user.api.php" + }, + { + "project_id": 12192, + "project_name": "project/comment_easy_reply", + "filename": "comment_easy_reply.install" + }, + { + "project_id": 12192, + "project_name": "project/comment_easy_reply", + "filename": "modules/beautytips/comment_easy_reply_beautytips.install" + }, + { + "project_id": 12192, + "project_name": "project/comment_easy_reply", + "filename": "modules/node/comment_easy_reply_node.install" + }, + { + "project_id": 12192, + "project_name": "project/comment_easy_reply", + "filename": "modules/qtip/comment_easy_reply_qtip.install" + }, + { + "project_id": 12848, + "project_name": "project/html_title", + "filename": "html_title.module" + }, + { + "project_id": 13111, + "project_name": "project/ddcla", + "filename": "public/modules/node/node.admin.inc" + }, + { + "project_id": 13111, + "project_name": "project/ddcla", + "filename": "public/modules/node/node.api.php" + }, + { + "project_id": 13111, + "project_name": "project/ddcla", + "filename": "public/modules/user/user.api.php" + }, + { + "project_id": 13125, + "project_name": "project/transcribe_distribution", + "filename": "modules/node/node.admin.inc" + }, + { + "project_id": 13125, + "project_name": "project/transcribe_distribution", + "filename": "modules/user/user.api.php" + }, + { + "project_id": 13263, + "project_name": "project/move_user", + "filename": "move_user.module" + }, + { + "project_id": 13895, + "project_name": "project/ajaxnewcounter", + "filename": "ajaxnewcounter.module" + }, + { + "project_id": 13917, + "project_name": "project/simpleantispam", + "filename": "simpleantispam.install" + }, + { + "project_id": 14103, + "project_name": "project/factorydrone", + "filename": "tests/ContentTypeFactory.test" + }, + { + "project_id": 14446, + "project_name": "project/tr_kurulum", + "filename": "modules/node/node.admin.inc" + }, + { + "project_id": 14446, + "project_name": "project/tr_kurulum", + "filename": "modules/node/node.api.php" + }, + { + "project_id": 14446, + "project_name": "project/tr_kurulum", + "filename": "modules/user/user.api.php" + }, + { + "project_id": 14448, + "project_name": "project/blurry", + "filename": "blurry.admin.inc" + }, + { + "project_id": 14506, + "project_name": "project/tb_blog_starter", + "filename": "modules/node/node.admin.inc" + }, + { + "project_id": 14506, + "project_name": "project/tb_blog_starter", + "filename": "modules/user/user.api.php" + }, + { + "project_id": 14507, + "project_name": "project/tb_events_starter", + "filename": "modules/node/node.admin.inc" + }, + { + "project_id": 14507, + "project_name": "project/tb_events_starter", + "filename": "modules/node/node.api.php" + }, + { + "project_id": 14507, + "project_name": "project/tb_events_starter", + "filename": "modules/user/user.api.php" + }, + { + "project_id": 14509, + "project_name": "project/tb_hadelis_starter", + "filename": "modules/node/node.admin.inc" + }, + { + "project_id": 14509, + "project_name": "project/tb_hadelis_starter", + "filename": "modules/node/node.api.php" + }, + { + "project_id": 14509, + "project_name": "project/tb_hadelis_starter", + "filename": "modules/user/user.api.php" + }, + { + "project_id": 14510, + "project_name": "project/tb_methys_starter", + "filename": "modules/node/node.admin.inc" + }, + { + "project_id": 14510, + "project_name": "project/tb_methys_starter", + "filename": "modules/user/user.api.php" + }, + { + "project_id": 14511, + "project_name": "project/tb_mollise_starter", + "filename": "modules/node/node.admin.inc" + }, + { + "project_id": 14511, + "project_name": "project/tb_mollise_starter", + "filename": "modules/node/node.api.php" + }, + { + "project_id": 14511, + "project_name": "project/tb_mollise_starter", + "filename": "modules/user/user.api.php" + }, + { + "project_id": 14512, + "project_name": "project/tb_neris_starter", + "filename": "modules/node/node.admin.inc" + }, + { + "project_id": 14512, + "project_name": "project/tb_neris_starter", + "filename": "modules/node/node.api.php" + }, + { + "project_id": 14512, + "project_name": "project/tb_neris_starter", + "filename": "modules/user/user.api.php" + }, + { + "project_id": 14513, + "project_name": "project/tb_palicico_starter", + "filename": "modules/node/node.admin.inc" + }, + { + "project_id": 14513, + "project_name": "project/tb_palicico_starter", + "filename": "modules/user/user.api.php" + }, + { + "project_id": 14514, + "project_name": "project/tb_purity_starter", + "filename": "modules/node/node.admin.inc" + }, + { + "project_id": 14514, + "project_name": "project/tb_purity_starter", + "filename": "modules/node/node.api.php" + }, + { + "project_id": 14514, + "project_name": "project/tb_purity_starter", + "filename": "modules/user/user.api.php" + }, + { + "project_id": 14515, + "project_name": "project/tb_rave_starter", + "filename": "modules/node/node.admin.inc" + }, + { + "project_id": 14515, + "project_name": "project/tb_rave_starter", + "filename": "modules/user/user.api.php" + }, + { + "project_id": 14522, + "project_name": "project/tb_sirate_starter", + "filename": "modules/node/node.admin.inc" + }, + { + "project_id": 14522, + "project_name": "project/tb_sirate_starter", + "filename": "modules/user/user.api.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/node/node.admin.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/user/user.api.php" + }, + { + "project_id": 14682, + "project_name": "project/content_access_view", + "filename": "content_access_view.install" + }, + { + "project_id": 14713, + "project_name": "project/uyan", + "filename": "uyan.admin.inc" + }, + { + "project_id": 14723, + "project_name": "project/og_admin_block", + "filename": "og_admin_block.install" + }, + { + "project_id": 14926, + "project_name": "project/commons_migration", + "filename": "includes/commons_migration.og.content.inc" + }, + { + "project_id": 14926, + "project_name": "project/commons_migration", + "filename": "includes/commons_migration.og.user.inc" + }, + { + "project_id": 15194, + "project_name": "project/og_menu_single", + "filename": "og_menu_single.install" + }, + { + "project_id": 15222, + "project_name": "project/open_badging_installation_profile", + "filename": "modules/node/node.admin.inc" + }, + { + "project_id": 15222, + "project_name": "project/open_badging_installation_profile", + "filename": "modules/node/node.api.php" + }, + { + "project_id": 15222, + "project_name": "project/open_badging_installation_profile", + "filename": "modules/user/user.api.php" + }, + { + "project_id": 15568, + "project_name": "project/content_trust", + "filename": "includes/views/handlers/content_trust_handler_filter_content_trust.inc" + }, + { + "project_id": 15746, + "project_name": "project/openpolitic", + "filename": "modules/custom/ajax_comments/ajax_comments.admin.inc" + }, + { + "project_id": 15746, + "project_name": "project/openpolitic", + "filename": "modules/custom/auto_nodetitle/auto_nodetitle.install" + }, + { + "project_id": 16050, + "project_name": "project/user_content_type", + "filename": "user_content_type.install" + }, + { + "project_id": 16050, + "project_name": "project/user_content_type", + "filename": "user_content_type.module" + }, + { + "project_id": 16192, + "project_name": "project/mobilearkickstart", + "filename": "modules/node/node.admin.inc" + }, + { + "project_id": 16192, + "project_name": "project/mobilearkickstart", + "filename": "modules/user/user.api.php" + }, + { + "project_id": 16367, + "project_name": "project/inspector", + "filename": "d7-bk/modules/content_types_inspector/content_types_inspector.module" + }, + { + "project_id": 16498, + "project_name": "project/socialshare", + "filename": "socialshare.install" + }, + { + "project_id": 16545, + "project_name": "project/multipage_navigation", + "filename": "multipage_navigation.admin.inc" + }, + { + "project_id": 16865, + "project_name": "project/persistent_menu_items", + "filename": "persistent_menu_items.admin.inc" + }, + { + "project_id": 16984, + "project_name": "project/spanish_distribution", + "filename": "modules/node/node.admin.inc" + }, + { + "project_id": 16984, + "project_name": "project/spanish_distribution", + "filename": "modules/node/node.api.php" + }, + { + "project_id": 16984, + "project_name": "project/spanish_distribution", + "filename": "modules/user/user.api.php" + }, + { + "project_id": 17013, + "project_name": "project/fuse", + "filename": "modules/node/node.admin.inc" + }, + { + "project_id": 17013, + "project_name": "project/fuse", + "filename": "modules/user/user.api.php" + }, + { + "project_id": 17483, + "project_name": "project/ajax_node_loader", + "filename": "ajax_node_loader.admin.inc" + }, + { + "project_id": 17618, + "project_name": "project/codebook_core", + "filename": "codebook_core_views_handler_area_node_add.inc" + }, + { + "project_id": 17753, + "project_name": "project/codebook_print_pdf", + "filename": "codebook_core_views_handler_area_node_add.inc" + }, + { + "project_id": 17982, + "project_name": "project/form_default_button", + "filename": "form_default_button.install" + }, + { + "project_id": 18457, + "project_name": "project/simple_nodeblock", + "filename": "simple_nodeblock.module" + }, + { + "project_id": 18553, + "project_name": "project/copyscape", + "filename": "src/Form/CopyscapeContentForm.php" + }, + { + "project_id": 18559, + "project_name": "project/govbr", + "filename": "modules/node/node.admin.inc" + }, + { + "project_id": 18559, + "project_name": "project/govbr", + "filename": "modules/user/user.api.php" + }, + { + "project_id": 18606, + "project_name": "project/oa_wizard", + "filename": "oa_wizard.features.field_base.inc" + }, + { + "project_id": 18710, + "project_name": "project/readmore_ajax", + "filename": "readmore.admin.inc" + }, + { + "project_id": 18752, + "project_name": "project/csf", + "filename": "custom_search_field.admin.inc" + }, + { + "project_id": 18897, + "project_name": "project/qurandistribution", + "filename": "modules/node/node.admin.inc" + }, + { + "project_id": 18897, + "project_name": "project/qurandistribution", + "filename": "modules/user/user.api.php" + }, + { + "project_id": 19167, + "project_name": "project/usercancel_contentassigntoadmin", + "filename": "usercancel_contentassigntoadmin.module" + }, + { + "project_id": 19204, + "project_name": "project/taxonomy_linking", + "filename": "taxonomy_autolink.install" + }, + { + "project_id": 19210, + "project_name": "project/taxonomy_autolink", + "filename": "taxonomy_autolink.install" + }, + { + "project_id": 19319, + "project_name": "project/node_title_help_text", + "filename": "node_title_help_text.install" + }, + { + "project_id": 19339, + "project_name": "project/update_external_links", + "filename": "src/Form/ConfigurationForm.php" + }, + { + "project_id": 19409, + "project_name": "project/contentassigntootheruser", + "filename": "usercancel_contentassigntootheruser.module" + }, + { + "project_id": 19494, + "project_name": "project/hierarchical_select_access", + "filename": "hierarchical_select_access.admin.inc" + }, + { + "project_id": 20692, + "project_name": "project/basic_stats_token", + "filename": "basic_stats_token.tokens.inc" + }, + { + "project_id": 20853, + "project_name": "project/stop_broken_link_in_body", + "filename": "stop_broken_link_in_body.admin.inc" + }, + { + "project_id": 20990, + "project_name": "project/development", + "filename": "modules/node/node.admin.inc" + }, + { + "project_id": 20990, + "project_name": "project/development", + "filename": "modules/user/user.api.php" + }, + { + "project_id": 21241, + "project_name": "project/techsupport", + "filename": "modules/contrib/project/tests/spec/install.test" + }, + { + "project_id": 21242, + "project_name": "project/tsm", + "filename": "modules/contrib/project/tests/spec/install.test" + }, + { + "project_id": 21780, + "project_name": "project/anonymous_subscriptions", + "filename": "src/Plugin/Block/SubscribeBlock.php" + }, + { + "project_id": 21791, + "project_name": "project/find_text", + "filename": "src/Form/SearchForm.php" + }, + { + "project_id": 22401, + "project_name": "project/customizable_entities", + "filename": "customizable_entities_api.php" + }, + { + "project_id": 22613, + "project_name": "project/smartparticipation", + "filename": "modules/smartparticipation/smartparticipation_core/modules/smartparticipation_ajax_comments/smartparticipation_ajax_comments.admin.inc" + }, + { + "project_id": 22810, + "project_name": "project/npop", + "filename": "npop.install" + }, + { + "project_id": 23064, + "project_name": "project/updated", + "filename": "updated.install" + }, + { + "project_id": 23130, + "project_name": "project/admin_toolbar_content_languages", + "filename": "admin_toolbar_content_languages.module" + }, + { + "project_id": 23431, + "project_name": "project/transfer_user_content", + "filename": "transfer_user_content.module" + }, + { + "project_id": 23470, + "project_name": "project/gp_reviews", + "filename": "modules/node/node.admin.inc" + }, + { + "project_id": 23470, + "project_name": "project/gp_reviews", + "filename": "modules/user/user.api.php" + }, + { + "project_id": 23717, + "project_name": "project/baidumap_fieldtype", + "filename": "src/Form/BaidumapFieldtypeSettingsForm.php" + }, + { + "project_id": 23874, + "project_name": "project/node_creator_system_details", + "filename": "node_creator_system_details.admin.inc" + }, + { + "project_id": 24022, + "project_name": "project/domain_video_sitemap", + "filename": "src/DomainVideoList.php" + }, + { + "project_id": 24420, + "project_name": "project/razoreye_biz", + "filename": "modules/contrib/ds/modules/ds_switch_view_mode/src/Permissions.php" + }, + { + "project_id": 24420, + "project_name": "project/razoreye_biz", + "filename": "modules/contrib/token/token.tokens.inc" + }, + { + "project_id": 25294, + "project_name": "project/pankm", + "filename": "modules/contrib/ds/modules/ds_switch_view_mode/src/Permissions.php" + }, + { + "project_id": 25294, + "project_name": "project/pankm", + "filename": "modules/contrib/token/token.tokens.inc" + }, + { + "project_id": 25438, + "project_name": "project/acal", + "filename": "acal.install" + }, + { + "project_id": 25524, + "project_name": "project/rsvp_list", + "filename": "src/Form/RSVPSettingsForm.php" + }, + { + "project_id": 25896, + "project_name": "project/byu_installation_profile", + "filename": "modules/node/node.admin.inc" + }, + { + "project_id": 25896, + "project_name": "project/byu_installation_profile", + "filename": "modules/user/user.api.php" + }, + { + "project_id": 26141, + "project_name": "project/node_creation_links", + "filename": "node_creation_links.module" + }, + { + "project_id": 26902, + "project_name": "project/skyword", + "filename": "src/Plugin/rest/resource/SkywordPostsRestResource.php" + }, + { + "project_id": 26961, + "project_name": "project/communications", + "filename": "src/Form/MessageForm.php" + }, + { + "project_id": 27106, + "project_name": "project/page_menu_reorder", + "filename": "src/Form/ReorderMenuSettingsForm.php" + }, + { + "project_id": 27526, + "project_name": "project/node_menu_item_visibility_default_behaviour", + "filename": "node_menu_item_visibility_default_behaviour.install" + }, + { + "project_id": 50738, + "project_name": "project/user_delete_reassign", + "filename": "user_delete_reassign.module" + }, + { + "project_id": 51217, + "project_name": "project/tide_core", + "filename": "modules/tide_api/modules/tide_share_link/src/Controller/ShareLinkTokenController.php" + }, + { + "project_id": 51218, + "project_name": "project/tide_api", + "filename": "modules/tide_share_link/src/Controller/ShareLinkTokenController.php" + }, + { + "project_id": 51461, + "project_name": "project/auto_nodetitle", + "filename": "auto_nodetitle.install" + }, + { + "project_id": 51500, + "project_name": "project/project", + "filename": "tests/spec/install.test" + }, + { + "project_id": 51722, + "project_name": "project/filebrowser", + "filename": "filebrowser.module" + }, + { + "project_id": 51727, + "project_name": "project/token", + "filename": "src/Hook/TokenTokensHooks.php" + }, + { + "project_id": 55750, + "project_name": "project/read_time", + "filename": "read_time.install" + }, + { + "project_id": 55957, + "project_name": "project/quick_node_clone", + "filename": "src/Form/QuickNodeCloneNodeForm.php" + }, + { + "project_id": 56769, + "project_name": "project/hold_my_draft", + "filename": "src/Form/ConfirmCancellation.php" + }, + { + "project_id": 56769, + "project_name": "project/hold_my_draft", + "filename": "src/Form/ConfirmCompletion.php" + }, + { + "project_id": 56769, + "project_name": "project/hold_my_draft", + "filename": "src/Form/ConfirmStart.php" + }, + { + "project_id": 57226, + "project_name": "project/edit_content_type_tab", + "filename": "src/Plugin/Menu/EditTab.php" + }, + { + "project_id": 57997, + "project_name": "project/campaignion", + "filename": "campaignion_manage/src/Filter/ContentType.php" + }, + { + "project_id": 58233, + "project_name": "project/openpublic", + "filename": "modules/apps/openpublic_person/openpublic_person.app.inc" + }, + { + "project_id": 58470, + "project_name": "project/entity_translation_unified_form", + "filename": "entity_translation_unified_form.install" + }, + { + "project_id": 59005, + "project_name": "project/social", + "filename": "modules/social_features/social_content_report/src/Plugin/views/field/ReportContentType.php" + }, + { + "project_id": 59005, + "project_name": "project/social", + "filename": "modules/social_features/social_node/social_node.api.php" + }, + { + "project_id": 59396, + "project_name": "project/ds", + "filename": "modules/ds_switch_view_mode/src/Permissions.php" + }, + { + "project_id": 59409, + "project_name": "project/pp_graphsearch", + "filename": "src/PPGraphSearch.php" + }, + { + "project_id": 59586, + "project_name": "project/monster_menus", + "filename": "mm_ui.inc" + }, + { + "project_id": 59586, + "project_name": "project/monster_menus", + "filename": "src/Controller/DefaultController.php" + }, + { + "project_id": 59890, + "project_name": "project/simply_signups", + "filename": "src/Form/Config/SimplySignupsConfigForm.php" + }, + { + "project_id": 60215, + "project_name": "project/aeg", + "filename": "modules/og/og_ui/includes/migrate/7000/add_field.inc" + }, + { + "project_id": 60227, + "project_name": "project/govimentum", + "filename": "modules/node/node.admin.inc" + }, + { + "project_id": 60227, + "project_name": "project/govimentum", + "filename": "modules/node/node.api.php" + }, + { + "project_id": 60227, + "project_name": "project/govimentum", + "filename": "modules/user/user.api.php" + }, + { + "project_id": 60301, + "project_name": "project/markdown_exporter", + "filename": "markdown_exporter.drush.inc" + }, + { + "project_id": 60837, + "project_name": "project/virtualcare", + "filename": "modules/contrib/token/token.tokens.inc" + }, + { + "project_id": 62173, + "project_name": "project/content_admin_tools", + "filename": "modules/text_replace/src/Form/ConfirmUpdateForm.php" + }, + { + "project_id": 62378, + "project_name": "project/drupalru_d7", + "filename": "modules/node/node.admin.inc" + }, + { + "project_id": 62378, + "project_name": "project/drupalru_d7", + "filename": "modules/user/user.api.php" + }, + { + "project_id": 63624, + "project_name": "project/ubershopwish", + "filename": "modules/node/node.admin.inc" + }, + { + "project_id": 63624, + "project_name": "project/ubershopwish", + "filename": "modules/user/user.api.php" + }, + { + "project_id": 65774, + "project_name": "project/backdrop_upgrade_status", + "filename": "includes/modules/backdrop_upgrade_status.node.inc" + }, + { + "project_id": 68467, + "project_name": "project/rsvplist", + "filename": "src/Form/RSVPSettingsForm.php" + }, + { + "project_id": 72831, + "project_name": "project/node_randomizer", + "filename": "src/Form/NodeRandomizerSettingsForm.php" + }, + { + "project_id": 77509, + "project_name": "project/testproject4234", + "filename": "modules/node/node.admin.inc" + }, + { + "project_id": 77509, + "project_name": "project/testproject4234", + "filename": "modules/node/node.api.php" + }, + { + "project_id": 77509, + "project_name": "project/testproject4234", + "filename": "modules/user/user.api.php" + }, + { + "project_id": 79702, + "project_name": "project/public_revisions", + "filename": "src/Form/PublicRevisionGenerateForm.php" + }, + { + "project_id": 81804, + "project_name": "project/node_singles", + "filename": "src/EventSubscriber/NodeFormEventSubscriber.php" + }, + { + "project_id": 81814, + "project_name": "project/entity_sort", + "filename": "entity_sort.module" + }, + { + "project_id": 81865, + "project_name": "project/entity_references_map", + "filename": "src/EntityReferencesMapBuilder.php" + }, + { + "project_id": 82252, + "project_name": "project/reassign_user_content", + "filename": "src/Form/AssignAuthorForm.php" + }, + { + "project_id": 82297, + "project_name": "project/tracker", + "filename": "src/Controller/TrackerController.php" + }, + { + "project_id": 119794, + "project_name": "project/link_description_attributes", + "filename": "link_description_attributes.install" + }, + { + "project_id": 127276, + "project_name": "project/entity_reference_edit_link", + "filename": "entity_reference_edit_link.module" + }, + { + "project_id": 152219, + "project_name": "project/duplicate_node", + "filename": "src/Form/DuplicateNodeForm.php" + }, + { + "project_id": 159795, + "project_name": "project/micronode_block", + "filename": "src/Plugin/Block/MicronodeBlock.php" + }, + { + "project_id": 163611, + "project_name": "project/secure_nodes", + "filename": "src/Form/SecureNodesSettingsForm.php" + }, + { + "project_id": 181203, + "project_name": "project/json_drop_api", + "filename": "modules/contrib/token/token.tokens.inc" + }, + { + "project_id": 211056, + "project_name": "project/content_dependency_graph", + "filename": "src/Controller/GraphController.php" + } + ], + "ReplaceNodeSetPreviewModeRector": [ + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": ".gitignore" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/cache-install.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/database/log.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/database/sqlite/select.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/errors.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/filetransfer/local.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/filetransfer/ssh.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/install.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/lock.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/menu.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/password.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/farbtastic/farbtastic.js" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/jquery.js" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/powered-blue-80x15.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/powered-gray-135x42.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/ui/jquery.ui.selectable.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/ui/jquery.ui.slider.min.js" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/aggregator/aggregator-feed-source.tpl.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/aggregator/tests/aggregator_test_atom.xml" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/block/block.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/block/block.js" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/color/color.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.api.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/contact/contact.admin.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/contact/contact.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/dashboard/dashboard.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/field.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/modules/list/list.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/modules/number/number.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/tests/field_test.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/tests/field_test.storage.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field_ui/field_ui.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/file/icons/application-x-executable.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/file/icons/text-html.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/file/icons/text-x-generic.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/file/icons/x-office-document.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/filter/filter.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/filter/filter.pages.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/forum/forum.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/help/help.api.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/locale/locale.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/node/node.tokens.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/node/tests/node_access_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/node/tests/node_test_exception.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/openid/tests/openid_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/path/path.admin.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/php/php.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/poll/poll-results.tpl.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/rdf/rdf.api.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/rdf/tests/rdf_test.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/search/search.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/search/search.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/search/tests/search_embedded_form.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/search/tests/search_extra_type.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/files/css_test_files/comment_hacks.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/files/css_test_files/comment_hacks.css.unoptimized.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/files/javascript-2.script" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/simpletest.js" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/actions.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/ajax_test.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/error.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/graph.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/image_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/password.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/path_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/requirements1_test.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/system_incompatible_core_version_dependencies_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/system_incompatible_module_version_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/theme_test.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/unicode.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/upgrade/drupal-6.upload.database.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/upgrade/drupal-6.user-password-token.database.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/upgrade/upgrade.comment.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/statistics/statistics.pages.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/syslog/syslog.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/syslog/syslog.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/system/system.archiver.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/system/system.queue.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/system/system.updater.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/taxonomy/taxonomy.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/tracker/tracker.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/trigger/trigger.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/update/tests/aaa_update_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/update/tests/drupal.0.xml" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/user/tests/user_form_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/user/tests/user_form_test.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/user/user.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/README.txt" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/bartik/css/print.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/bartik/images/buttons.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/garland/fix-ie.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/garland/logo.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/seven/images/ui-icons-ffffff-256x240.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/seven/page.tpl.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/seven/style.css" + } + ], + "ReplacePdoFetchConstantsRector": [ + { + "project_id": 2271, + "project_name": "project/bitcache", + "filename": "adapters/pdo.inc" + }, + { + "project_id": 4288, + "project_name": "project/accessible", + "filename": "accessible_api/accessible_api.landing.inc" + }, + { + "project_id": 4369, + "project_name": "project/storage_api", + "filename": "cron.inc" + }, + { + "project_id": 4510, + "project_name": "project/querypath", + "filename": "QueryPath/Extension/QPDB.php" + }, + { + "project_id": 4970, + "project_name": "project/oracle", + "filename": "Statement.php" + }, + { + "project_id": 5158, + "project_name": "project/dbtng", + "filename": "database/prefetch.inc" + }, + { + "project_id": 6109, + "project_name": "project/styles", + "filename": "styles.module" + }, + { + "project_id": 6751, + "project_name": "project/d7", + "filename": "includes/database/prefetch.inc" + }, + { + "project_id": 7070, + "project_name": "project/mongodb_dbtng", + "filename": "database.inc" + }, + { + "project_id": 8063, + "project_name": "project/menu_minipanels", + "filename": "menu_minipanels.admin.inc" + }, + { + "project_id": 8197, + "project_name": "project/onepage", + "filename": "includes/database/prefetch.inc" + }, + { + "project_id": 9123, + "project_name": "project/1087726", + "filename": "includes/database/prefetch.inc" + }, + { + "project_id": 10014, + "project_name": "project/hubspot", + "filename": "hubspot.post_update.php" + }, + { + "project_id": 11136, + "project_name": "project/survey_builder", + "filename": "includes/survey_builder.entity.inc" + }, + { + "project_id": 12072, + "project_name": "project/relation_add", + "filename": "relation_add.install" + }, + { + "project_id": 12118, + "project_name": "project/rebuild", + "filename": "tests/fixtures/drupal_sites/dev/includes/database/prefetch.inc" + }, + { + "project_id": 12118, + "project_name": "project/rebuild", + "filename": "tests/fixtures/drupal_sites/prod/includes/database/prefetch.inc" + }, + { + "project_id": 12462, + "project_name": "project/opac", + "filename": "includes/opac.check.inc" + }, + { + "project_id": 13111, + "project_name": "project/ddcla", + "filename": "public/includes/database/prefetch.inc" + }, + { + "project_id": 13125, + "project_name": "project/transcribe_distribution", + "filename": "includes/database/prefetch.inc" + }, + { + "project_id": 13340, + "project_name": "project/autoslave", + "filename": "autoslave/autoslave.affected_tables.db-accurate.inc" + }, + { + "project_id": 14446, + "project_name": "project/tr_kurulum", + "filename": "includes/database/prefetch.inc" + }, + { + "project_id": 14506, + "project_name": "project/tb_blog_starter", + "filename": "includes/database/prefetch.inc" + }, + { + "project_id": 14507, + "project_name": "project/tb_events_starter", + "filename": "includes/database/prefetch.inc" + }, + { + "project_id": 14509, + "project_name": "project/tb_hadelis_starter", + "filename": "includes/database/prefetch.inc" + }, + { + "project_id": 14510, + "project_name": "project/tb_methys_starter", + "filename": "includes/database/prefetch.inc" + }, + { + "project_id": 14511, + "project_name": "project/tb_mollise_starter", + "filename": "includes/database/prefetch.inc" + }, + { + "project_id": 14512, + "project_name": "project/tb_neris_starter", + "filename": "includes/database/prefetch.inc" + }, + { + "project_id": 14513, + "project_name": "project/tb_palicico_starter", + "filename": "includes/database/prefetch.inc" + }, + { + "project_id": 14514, + "project_name": "project/tb_purity_starter", + "filename": "includes/database/prefetch.inc" + }, + { + "project_id": 14515, + "project_name": "project/tb_rave_starter", + "filename": "includes/database/prefetch.inc" + }, + { + "project_id": 14522, + "project_name": "project/tb_sirate_starter", + "filename": "includes/database/prefetch.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/database/prefetch.inc" + }, + { + "project_id": 14786, + "project_name": "project/paddle_menu_manager", + "filename": "paddle_menu_manager.i18n.inc" + }, + { + "project_id": 15222, + "project_name": "project/open_badging_installation_profile", + "filename": "includes/database/prefetch.inc" + }, + { + "project_id": 16192, + "project_name": "project/mobilearkickstart", + "filename": "includes/database/prefetch.inc" + }, + { + "project_id": 16984, + "project_name": "project/spanish_distribution", + "filename": "includes/database/prefetch.inc" + }, + { + "project_id": 17013, + "project_name": "project/fuse", + "filename": "includes/database/prefetch.inc" + }, + { + "project_id": 17226, + "project_name": "project/visitor_actions", + "filename": "modules/visitor_actions_ui/visitor_actions_ui.install" + }, + { + "project_id": 18559, + "project_name": "project/govbr", + "filename": "includes/database/prefetch.inc" + }, + { + "project_id": 18897, + "project_name": "project/qurandistribution", + "filename": "includes/database/prefetch.inc" + }, + { + "project_id": 19307, + "project_name": "project/mysql_async", + "filename": "includes/database/async-statement.inc" + }, + { + "project_id": 20056, + "project_name": "project/sqlbuddy", + "filename": "lib/sqlbuddy/includes/class/Sql.inc" + }, + { + "project_id": 20151, + "project_name": "project/contact_centre", + "filename": "includes/contact_centre.admin.view.inc" + }, + { + "project_id": 20990, + "project_name": "project/development", + "filename": "includes/database/prefetch.inc" + }, + { + "project_id": 21018, + "project_name": "project/amber", + "filename": "libraries/AmberDB.php" + }, + { + "project_id": 23470, + "project_name": "project/gp_reviews", + "filename": "includes/database/prefetch.inc" + }, + { + "project_id": 23523, + "project_name": "project/scoopit", + "filename": "external.libraries/oauth/oauth2-server-php/src/OAuth2/Storage/Pdo.php" + }, + { + "project_id": 25896, + "project_name": "project/byu_installation_profile", + "filename": "includes/database/prefetch.inc" + }, + { + "project_id": 26838, + "project_name": "project/multitype_slider", + "filename": "config/multitype_slider.classes.inc" + }, + { + "project_id": 50151, + "project_name": "project/entity_translation", + "filename": "tests/entity_translation_test.module" + }, + { + "project_id": 51487, + "project_name": "project/maps_suite", + "filename": "modules/import/lib/Drupal/maps_import/Operation/Entity/Delete/Delete.php" + }, + { + "project_id": 51722, + "project_name": "project/filebrowser", + "filename": "src/Services/FilebrowserStorage.php" + }, + { + "project_id": 55171, + "project_name": "project/votingapi", + "filename": "src/Plugin/migrate/VotingApiDeriver.php" + }, + { + "project_id": 57841, + "project_name": "project/gdpr", + "filename": "modules/gdpr_dump/src/Service/GdprDatabaseManager.php" + }, + { + "project_id": 58053, + "project_name": "project/media_migration", + "filename": "src/FileDealerBase.php" + }, + { + "project_id": 59857, + "project_name": "project/acquia_contenthub", + "filename": "src/AcquiaContentHubStatusMetricsTrait.php" + }, + { + "project_id": 60227, + "project_name": "project/govimentum", + "filename": "includes/database/prefetch.inc" + }, + { + "project_id": 60491, + "project_name": "project/imotilux", + "filename": "src/ImotiluxOutlineStorage.php" + }, + { + "project_id": 61256, + "project_name": "project/gtfs", + "filename": "src/Entity/HasIdTrait.php" + }, + { + "project_id": 61256, + "project_name": "project/gtfs", + "filename": "src/Entity/Route.php" + }, + { + "project_id": 61256, + "project_name": "project/gtfs", + "filename": "src/Plugin/rest/resource/AgencyListResource.php" + }, + { + "project_id": 61256, + "project_name": "project/gtfs", + "filename": "src/Plugin/rest/resource/RouteWKTResource.php" + }, + { + "project_id": 61256, + "project_name": "project/gtfs", + "filename": "src/Plugin/rest/resource/StopDirectionResource.php" + }, + { + "project_id": 61256, + "project_name": "project/gtfs", + "filename": "src/Plugin/rest/resource/StopListResource.php" + }, + { + "project_id": 61662, + "project_name": "project/commerce_store_override", + "filename": "tests/src/Kernel/IntegrationTest.php" + }, + { + "project_id": 62102, + "project_name": "project/ms_react", + "filename": "src/Controller/ApiController.php" + }, + { + "project_id": 62102, + "project_name": "project/ms_react", + "filename": "src/Controller/NewNotificationController.php" + }, + { + "project_id": 62378, + "project_name": "project/drupalru_d7", + "filename": "includes/database/prefetch.inc" + }, + { + "project_id": 62382, + "project_name": "project/arch", + "filename": "modules/order/src/Services/OrderAddressService.php" + }, + { + "project_id": 63073, + "project_name": "project/tweet_reference", + "filename": "src/TweetStorage.php" + }, + { + "project_id": 63588, + "project_name": "project/acquia_migrate", + "filename": "tests/src/Functional/RollbackableTablesUpdateTest.php" + }, + { + "project_id": 63624, + "project_name": "project/ubershopwish", + "filename": "includes/database/prefetch.inc" + }, + { + "project_id": 64020, + "project_name": "project/lgpd", + "filename": "modules/lgpd_dump/src/Service/LgpdDatabaseManager.php" + }, + { + "project_id": 64291, + "project_name": "project/entitree", + "filename": "modules/entitree_permissions/src/EntitreePermissionsManager.php" + }, + { + "project_id": 66097, + "project_name": "project/rating_list", + "filename": "modules/csdata/batch/test.php" + }, + { + "project_id": 68595, + "project_name": "project/social_auth_buttons", + "filename": "src/Services/SocialAuthButtonsRouteProvider.php" + }, + { + "project_id": 70928, + "project_name": "project/field_completeness", + "filename": "src/FieldCompletenessStorage.php" + }, + { + "project_id": 74592, + "project_name": "project/gtfs_511", + "filename": "gtfs_511.module" + }, + { + "project_id": 74593, + "project_name": "project/gtfs_rt", + "filename": "src/Plugin/Field/FieldType/CurrentRoutesComputed.php" + }, + { + "project_id": 74593, + "project_name": "project/gtfs_rt", + "filename": "src/Plugin/rest/resource/RouteStopPredictionsResource.php" + }, + { + "project_id": 74600, + "project_name": "project/gtfs_geo", + "filename": "gtfs_geo.module" + }, + { + "project_id": 75981, + "project_name": "project/payment_button_drupal_plugin", + "filename": "src/Form/Settings.php" + }, + { + "project_id": 77509, + "project_name": "project/testproject4234", + "filename": "includes/database/prefetch.inc" + }, + { + "project_id": 81896, + "project_name": "project/ayrshare", + "filename": "modules/ayrshare_node/src/Database/DatabaseStorage.php" + }, + { + "project_id": 85308, + "project_name": "project/tmgmt_smartcat", + "filename": "src/Services/SmartcatDocument.php" + }, + { + "project_id": 95795, + "project_name": "project/video_toolbox", + "filename": "src/Controller/VideoAutoCompleteController.php" + }, + { + "project_id": 95795, + "project_name": "project/video_toolbox", + "filename": "src/VideoHandler.php" + }, + { + "project_id": 135646, + "project_name": "project/sgd_user_status", + "filename": "sgd_user_status.install" + }, + { + "project_id": 148214, + "project_name": "project/sgd_watchdog_summary", + "filename": "sgd_watchdog_summary.module" + }, + { + "project_id": 150232, + "project_name": "project/smileys_field", + "filename": "src/Form/SmileysSelectForm.php" + }, + { + "project_id": 167065, + "project_name": "project/mail_box_management", + "filename": "src/Plugin/LocalStorage.php" + }, + { + "project_id": 179254, + "project_name": "project/book_library_api", + "filename": "src/Controller/BookController.php" + }, + { + "project_id": 179857, + "project_name": "project/track_usage", + "filename": "src/Trait/BackwardsCompatibilityTrait.php" + }, + { + "project_id": 185845, + "project_name": "project/babel", + "filename": "src/BackwardsCompatibilityHelper.php" + }, + { + "project_id": 196085, + "project_name": "project/graphql_shield", + "filename": "src/Service/SecurityDashboard.php" + }, + { + "project_id": 196314, + "project_name": "project/livre", + "filename": "book/src/BookOutlineStorage.php" + }, + { + "project_id": 200208, + "project_name": "project/conreg", + "filename": "src/Service/MemberStorage.php" + }, + { + "project_id": 202019, + "project_name": "project/junk_drawer", + "filename": "src/Drush/Commands/JunkDrawerCacheTagCommands.php" + }, + { + "project_id": 211072, + "project_name": "project/ai_schemadotorg_jsonld", + "filename": "modules/ai_schemadotorg_jsonld_log/src/AiSchemaDotOrgJsonLdLogStorage.php" + } + ], + "ReplaceRecipeRunnerInstallModuleRector": [ + { + "project_id": 83700, + "project_name": "project/schemadotorg", + "filename": "modules/schemadotorg_recipe/schemadotorg_recipe.module" + } + ], + "ReplaceSessionManagerDeleteRector": [ + { + "project_id": 714, + "project_name": "project/session_limit", + "filename": "src/Form/SessionLimitForm.php" + }, + { + "project_id": 714, + "project_name": "project/session_limit", + "filename": "src/Services/SessionLimit.php" + }, + { + "project_id": 2079, + "project_name": "project/activity", + "filename": "src/Form/MultiStepFormBase.php" + }, + { + "project_id": 2658, + "project_name": "project/restrict_by_ip", + "filename": "src/LoginFirewall.php" + }, + { + "project_id": 5738, + "project_name": "project/tupas", + "filename": "modules/tupas_registration/src/Form/MapTupasConfirmForm.php" + }, + { + "project_id": 5738, + "project_name": "project/tupas", + "filename": "modules/tupas_registration/src/Form/RegisterForm.php" + }, + { + "project_id": 5738, + "project_name": "project/tupas", + "filename": "modules/tupas_registration/tests/src/Kernel/TupasRegistrationTest.php" + }, + { + "project_id": 5738, + "project_name": "project/tupas", + "filename": "modules/tupas_session/src/Access/TupasSessionAccess.php" + }, + { + "project_id": 5738, + "project_name": "project/tupas", + "filename": "modules/tupas_session/src/EventSubscriber/TupasSessionEventSubscriber.php" + }, + { + "project_id": 5738, + "project_name": "project/tupas", + "filename": "modules/tupas_session/src/TupasSessionManager.php" + }, + { + "project_id": 5738, + "project_name": "project/tupas", + "filename": "modules/tupas_session/src/TupasSessionManagerInterface.php" + }, + { + "project_id": 5738, + "project_name": "project/tupas", + "filename": "modules/tupas_session/src/TupasTransactionManager.php" + }, + { + "project_id": 5738, + "project_name": "project/tupas", + "filename": "modules/tupas_session/tests/src/Kernel/TupasSessionTest.php" + }, + { + "project_id": 5738, + "project_name": "project/tupas", + "filename": "modules/tupas_session/tests/src/Unit/TupasSessionManagerTest.php" + }, + { + "project_id": 5738, + "project_name": "project/tupas", + "filename": "modules/tupas_session/tupas_session.module" + }, + { + "project_id": 5738, + "project_name": "project/tupas", + "filename": "modules/tupas_session/tupas_session.services.yml" + }, + { + "project_id": 9062, + "project_name": "project/recently_read", + "filename": "src/Plugin/views/relationship/RecentlyReadRelationship.php" + }, + { + "project_id": 9062, + "project_name": "project/recently_read", + "filename": "src/RecentlyReadService.php" + }, + { + "project_id": 9255, + "project_name": "project/commerce_qb_webconnect", + "filename": "src/SoapBundle/Services/SoapSessionManager.php" + }, + { + "project_id": 19425, + "project_name": "project/xing_connect", + "filename": "src/Controller/XingConnectAuthController.php" + }, + { + "project_id": 20730, + "project_name": "project/saml_idp", + "filename": "src/Auth/Source/External.php" + }, + { + "project_id": 21228, + "project_name": "project/big_pipe_demo", + "filename": "src/Plugin/Block/AnonSessionBlock.php" + }, + { + "project_id": 23072, + "project_name": "project/csv_to_config", + "filename": "src/Form/MultistepFormBase.php" + }, + { + "project_id": 24046, + "project_name": "project/bulk_update_fields", + "filename": "src/Plugin/Action/BulkUpdateFieldsActionBase.php" + }, + { + "project_id": 24420, + "project_name": "project/razoreye_biz", + "filename": "modules/contrib/devel/src/Controller/SwitchUserController.php" + }, + { + "project_id": 24420, + "project_name": "project/razoreye_biz", + "filename": "modules/contrib/masquerade/src/Masquerade.php" + }, + { + "project_id": 24787, + "project_name": "project/quicker_login", + "filename": "src/Service/QuickerLoginService.php" + }, + { + "project_id": 25475, + "project_name": "project/examplelist", + "filename": "src/Form/MultistepFormBase.php" + }, + { + "project_id": 26081, + "project_name": "project/page_hits", + "filename": "src/EventSubscriber/PageHitsSubscriber.php" + }, + { + "project_id": 27208, + "project_name": "project/change_author_action", + "filename": "src/Form/ChangeAuthorActionForm.php" + }, + { + "project_id": 27208, + "project_name": "project/change_author_action", + "filename": "src/Plugin/Action/ChangeAuthorActionBase.php" + }, + { + "project_id": 27405, + "project_name": "project/real_estate_lp_profile", + "filename": "modules/devel/src/Controller/SwitchUserController.php" + }, + { + "project_id": 47295, + "project_name": "project/node_export", + "filename": "src/Form/BulkNodeExport.php" + }, + { + "project_id": 47295, + "project_name": "project/node_export", + "filename": "src/Plugin/Action/BulkNodeExport.php" + }, + { + "project_id": 47298, + "project_name": "project/mailing_list", + "filename": "src/MailingListManager.php" + }, + { + "project_id": 47583, + "project_name": "project/userswitch", + "filename": "src/UserSwitch.php" + }, + { + "project_id": 49979, + "project_name": "project/bulk_update_fields_commerce", + "filename": "src/Form/BulkUpdateFieldsForm.php" + }, + { + "project_id": 49979, + "project_name": "project/bulk_update_fields_commerce", + "filename": "src/Plugin/Action/BulkUpdateFieldsActionBase.php" + }, + { + "project_id": 49979, + "project_name": "project/bulk_update_fields_commerce", + "filename": "src/Plugin/Action/BulkUpdateFieldsActionBaseCommerceOrder.php" + }, + { + "project_id": 49979, + "project_name": "project/bulk_update_fields_commerce", + "filename": "src/Plugin/Action/BulkUpdateFieldsActionBaseCommerceProduct.php" + }, + { + "project_id": 50229, + "project_name": "project/bulk_copy_fields", + "filename": "src/Plugin/Action/BulkCopyFieldsActionBase.php" + }, + { + "project_id": 51393, + "project_name": "project/login_alert", + "filename": "src/Controller/LoginAlertController.php" + }, + { + "project_id": 52081, + "project_name": "project/simple_node_importer", + "filename": "src/Form/SimpleNodeConfirmImportForm.php" + }, + { + "project_id": 52081, + "project_name": "project/simple_node_importer", + "filename": "src/Form/SimpleUserConfirmImportForm.php" + }, + { + "project_id": 55408, + "project_name": "project/global_gateway", + "filename": "src/Helper.php" + }, + { + "project_id": 55547, + "project_name": "project/facebook_pixel", + "filename": "src/FacebookEvent.php" + }, + { + "project_id": 56706, + "project_name": "project/registration_form", + "filename": "src/Form/Multistep/MultistepFormBase.php" + }, + { + "project_id": 56876, + "project_name": "project/tmgmt_smartling", + "filename": "src/Context/ContextUserAuth.php" + }, + { + "project_id": 56945, + "project_name": "project/questions_answers", + "filename": "src/Form/HelpfulForm.php" + }, + { + "project_id": 56945, + "project_name": "project/questions_answers", + "filename": "src/Form/ReportAnswerForm.php" + }, + { + "project_id": 56945, + "project_name": "project/questions_answers", + "filename": "src/Form/ReportQuestionForm.php" + }, + { + "project_id": 57678, + "project_name": "project/eid_auth", + "filename": "src/Form/MobileIdLoginForm.php" + }, + { + "project_id": 57678, + "project_name": "project/eid_auth", + "filename": "src/Form/SmartIdLoginForm.php" + }, + { + "project_id": 58249, + "project_name": "project/smartid_auth", + "filename": "src/Form/SmartidLoginForm.php" + }, + { + "project_id": 59145, + "project_name": "project/brightcove", + "filename": "src/EventSubscriber/RedirectResponseSubscriber.php" + }, + { + "project_id": 59145, + "project_name": "project/brightcove", + "filename": "src/Services/SessionManager.php" + }, + { + "project_id": 59145, + "project_name": "project/brightcove", + "filename": "src/Services/SessionManagerInterface.php" + }, + { + "project_id": 59234, + "project_name": "project/devel", + "filename": "src/Controller/SwitchUserController.php" + }, + { + "project_id": 59473, + "project_name": "project/rules", + "filename": "src/Plugin/RulesAction/UserBlock.php" + }, + { + "project_id": 59473, + "project_name": "project/rules", + "filename": "tests/src/Unit/Integration/RulesAction/UserBlockTest.php" + }, + { + "project_id": 59988, + "project_name": "project/evangelische_termine", + "filename": "src/Plugin/Block/FilteredList.php" + }, + { + "project_id": 61659, + "project_name": "project/entity_visibility_preview", + "filename": "src/Cache/Context/PreviewIsActiveCacheContextIdentifier.php" + }, + { + "project_id": 61659, + "project_name": "project/entity_visibility_preview", + "filename": "src/EntityVisibilityPreviewConditionPluginBase.php" + }, + { + "project_id": 61659, + "project_name": "project/entity_visibility_preview", + "filename": "src/Form/PreviewForm.php" + }, + { + "project_id": 61659, + "project_name": "project/entity_visibility_preview", + "filename": "src/HookHandler/EntityAccessHookHandler.php" + }, + { + "project_id": 61659, + "project_name": "project/entity_visibility_preview", + "filename": "src/Service/SessionManager.php" + }, + { + "project_id": 61659, + "project_name": "project/entity_visibility_preview", + "filename": "src/Service/SessionManagerInterface.php" + }, + { + "project_id": 62055, + "project_name": "project/eus", + "filename": "src/Form/ConfirmEndSessionForm.php" + }, + { + "project_id": 62055, + "project_name": "project/eus", + "filename": "src/Form/ConfirmRoleEndSessionForm.php" + }, + { + "project_id": 62055, + "project_name": "project/eus", + "filename": "src/Form/ConfirmSelectedusersEndSessionForm.php" + }, + { + "project_id": 62760, + "project_name": "project/admin_can_login_anyuser", + "filename": "src/Controller/AdminBackLoginLinkController.php" + }, + { + "project_id": 62760, + "project_name": "project/admin_can_login_anyuser", + "filename": "src/Form/ConfirmLoginSwitchForm.php" + }, + { + "project_id": 62764, + "project_name": "project/cookie_samesite_support", + "filename": "cookie_samesite_support.services.yml" + }, + { + "project_id": 62764, + "project_name": "project/cookie_samesite_support", + "filename": "src/Session/CookieSameSiteSupportSessionManager.php" + }, + { + "project_id": 62785, + "project_name": "project/entity_sync", + "filename": "modules/session/src/SessionConfigurator/Oauth2/Base.php" + }, + { + "project_id": 62785, + "project_name": "project/entity_sync", + "filename": "modules/session/src/SessionConfigurator/Oauth2/ClientCredentialsBase.php" + }, + { + "project_id": 62785, + "project_name": "project/entity_sync", + "filename": "modules/session/src/SessionConfigurator/Oauth2/PasswordBase.php" + }, + { + "project_id": 62785, + "project_name": "project/entity_sync", + "filename": "modules/session/src/SessionConfigurator/Oauth2/RefreshTokenBase.php" + }, + { + "project_id": 63218, + "project_name": "project/oidc", + "filename": "src/OpenidConnectSession.php" + }, + { + "project_id": 63218, + "project_name": "project/oidc", + "filename": "tests/src/Unit/OpenidConnectSessionTest.php" + }, + { + "project_id": 63489, + "project_name": "project/oidc_mcpf", + "filename": "src/Controller/AcmController.php" + }, + { + "project_id": 64133, + "project_name": "project/bing_ads", + "filename": "src/BingAdsEvent.php" + }, + { + "project_id": 67940, + "project_name": "project/anonymoussession", + "filename": "src/Services/AnonymousSessionService.php" + }, + { + "project_id": 78721, + "project_name": "project/commerce_ticketing_checkin", + "filename": "src/Form/CheckinMultistepFormBase.php" + }, + { + "project_id": 83095, + "project_name": "project/session_inspector", + "filename": "src/SessionInspector.php" + }, + { + "project_id": 101539, + "project_name": "project/acumatica", + "filename": "src/Session/OAuth2/PasswordSessionManager.php" + }, + { + "project_id": 119094, + "project_name": "project/kamihaya_cms", + "filename": "modules/kamihaya_cms_spiral_api/src/Controller/SpiralController.php" + }, + { + "project_id": 119344, + "project_name": "project/entity_sync_odata", + "filename": "src/EntitySync/Api/EntityClientFactory.php" + }, + { + "project_id": 119344, + "project_name": "project/entity_sync_odata", + "filename": "src/EntitySync/Api/ODataClientBuilderTrait.php" + }, + { + "project_id": 123514, + "project_name": "project/twilio_otp_login", + "filename": "src/Services/LocalStorage.php" + }, + { + "project_id": 146166, + "project_name": "project/cm_data_layer", + "filename": "src/DataLayer.php" + }, + { + "project_id": 150956, + "project_name": "project/session_management", + "filename": "src/SessionMonitor.php" + }, + { + "project_id": 154357, + "project_name": "project/loginnotification", + "filename": "src/Controller/LoginNotificationController.php" + }, + { + "project_id": 164248, + "project_name": "project/externalauth_force", + "filename": "src/EventSubscriber/RequestSubscriber.php" + }, + { + "project_id": 174206, + "project_name": "project/logout_timeout", + "filename": "src/Service/LogoutTimeoutService.php" + }, + { + "project_id": 191533, + "project_name": "project/simpleavs", + "filename": "src/Session/AvsSessionManager.php" + }, + { + "project_id": 196049, + "project_name": "project/stenographer", + "filename": "src/AuditRecorder.php" + }, + { + "project_id": 197857, + "project_name": "project/user_logout", + "filename": "src/UserLogoutBatch.php" + }, + { + "project_id": 207806, + "project_name": "project/drupal_saml_bridge", + "filename": "src/Controller/SamlController.php" + }, + { + "project_id": 207806, + "project_name": "project/drupal_saml_bridge", + "filename": "src/Service/SessionManager.php" + } + ], + "ReplaceSessionWritesWithRequestSessionRector": [ + { + "project_id": 714, + "project_name": "project/session_limit", + "filename": "tests/SessionLimitSessionTestCase.php" + }, + { + "project_id": 2866, + "project_name": "project/xmpp_server", + "filename": "includes/session.php" + }, + { + "project_id": 5444, + "project_name": "project/cache", + "filename": "session.inc" + }, + { + "project_id": 5481, + "project_name": "project/jp_mobile", + "filename": "session.inc" + }, + { + "project_id": 8197, + "project_name": "project/onepage", + "filename": "includes/session.inc" + }, + { + "project_id": 8197, + "project_name": "project/onepage", + "filename": "modules/simpletest/tests/session.test" + }, + { + "project_id": 9123, + "project_name": "project/1087726", + "filename": "includes/session.inc" + }, + { + "project_id": 9123, + "project_name": "project/1087726", + "filename": "modules/simpletest/tests/session.test" + }, + { + "project_id": 10369, + "project_name": "project/session_proxy", + "filename": "session.inc" + }, + { + "project_id": 11537, + "project_name": "project/drupalcon_base", + "filename": "amsterdam2014/sass/components/node/_session.scss" + }, + { + "project_id": 11537, + "project_name": "project/drupalcon_base", + "filename": "bogota2015/sass/components/node/_session.scss" + }, + { + "project_id": 12118, + "project_name": "project/rebuild", + "filename": "tests/fixtures/drupal_sites/dev/includes/session.inc" + }, + { + "project_id": 12118, + "project_name": "project/rebuild", + "filename": "tests/fixtures/drupal_sites/dev/modules/simpletest/tests/session.test" + }, + { + "project_id": 12118, + "project_name": "project/rebuild", + "filename": "tests/fixtures/drupal_sites/prod/includes/session.inc" + }, + { + "project_id": 12118, + "project_name": "project/rebuild", + "filename": "tests/fixtures/drupal_sites/prod/modules/simpletest/tests/session.test" + }, + { + "project_id": 13111, + "project_name": "project/ddcla", + "filename": "public/includes/session.inc" + }, + { + "project_id": 13111, + "project_name": "project/ddcla", + "filename": "public/modules/simpletest/tests/session.test" + }, + { + "project_id": 13125, + "project_name": "project/transcribe_distribution", + "filename": "includes/session.inc" + }, + { + "project_id": 13125, + "project_name": "project/transcribe_distribution", + "filename": "modules/simpletest/tests/session.test" + }, + { + "project_id": 14446, + "project_name": "project/tr_kurulum", + "filename": "includes/session.inc" + }, + { + "project_id": 14446, + "project_name": "project/tr_kurulum", + "filename": "modules/simpletest/tests/session.test" + }, + { + "project_id": 14506, + "project_name": "project/tb_blog_starter", + "filename": "includes/session.inc" + }, + { + "project_id": 14506, + "project_name": "project/tb_blog_starter", + "filename": "modules/simpletest/tests/session.test" + }, + { + "project_id": 14507, + "project_name": "project/tb_events_starter", + "filename": "includes/session.inc" + }, + { + "project_id": 14507, + "project_name": "project/tb_events_starter", + "filename": "modules/simpletest/tests/session.test" + }, + { + "project_id": 14509, + "project_name": "project/tb_hadelis_starter", + "filename": "includes/session.inc" + }, + { + "project_id": 14509, + "project_name": "project/tb_hadelis_starter", + "filename": "modules/simpletest/tests/session.test" + }, + { + "project_id": 14510, + "project_name": "project/tb_methys_starter", + "filename": "includes/session.inc" + }, + { + "project_id": 14510, + "project_name": "project/tb_methys_starter", + "filename": "modules/simpletest/tests/session.test" + }, + { + "project_id": 14511, + "project_name": "project/tb_mollise_starter", + "filename": "includes/session.inc" + }, + { + "project_id": 14511, + "project_name": "project/tb_mollise_starter", + "filename": "modules/simpletest/tests/session.test" + }, + { + "project_id": 14512, + "project_name": "project/tb_neris_starter", + "filename": "includes/session.inc" + }, + { + "project_id": 14512, + "project_name": "project/tb_neris_starter", + "filename": "modules/simpletest/tests/session.test" + }, + { + "project_id": 14513, + "project_name": "project/tb_palicico_starter", + "filename": "includes/session.inc" + }, + { + "project_id": 14513, + "project_name": "project/tb_palicico_starter", + "filename": "modules/simpletest/tests/session.test" + }, + { + "project_id": 14514, + "project_name": "project/tb_purity_starter", + "filename": "includes/session.inc" + }, + { + "project_id": 14514, + "project_name": "project/tb_purity_starter", + "filename": "modules/simpletest/tests/session.test" + }, + { + "project_id": 14515, + "project_name": "project/tb_rave_starter", + "filename": "includes/session.inc" + }, + { + "project_id": 14515, + "project_name": "project/tb_rave_starter", + "filename": "modules/simpletest/tests/session.test" + }, + { + "project_id": 14515, + "project_name": "project/tb_rave_starter", + "filename": "modules/simpletest/tests/session_test.module" + }, + { + "project_id": 14522, + "project_name": "project/tb_sirate_starter", + "filename": "includes/session.inc" + }, + { + "project_id": 14522, + "project_name": "project/tb_sirate_starter", + "filename": "modules/simpletest/tests/session.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/session.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/session.test" + }, + { + "project_id": 15222, + "project_name": "project/open_badging_installation_profile", + "filename": "includes/session.inc" + }, + { + "project_id": 15222, + "project_name": "project/open_badging_installation_profile", + "filename": "modules/simpletest/tests/session.test" + }, + { + "project_id": 16192, + "project_name": "project/mobilearkickstart", + "filename": "includes/session.inc" + }, + { + "project_id": 16192, + "project_name": "project/mobilearkickstart", + "filename": "modules/simpletest/tests/session.test" + }, + { + "project_id": 16984, + "project_name": "project/spanish_distribution", + "filename": "includes/session.inc" + }, + { + "project_id": 16984, + "project_name": "project/spanish_distribution", + "filename": "modules/simpletest/tests/session.test" + }, + { + "project_id": 17013, + "project_name": "project/fuse", + "filename": "includes/session.inc" + }, + { + "project_id": 17013, + "project_name": "project/fuse", + "filename": "modules/simpletest/tests/session.test" + }, + { + "project_id": 17101, + "project_name": "project/kalvi_core", + "filename": "modules/session/session.admin.inc" + }, + { + "project_id": 17101, + "project_name": "project/kalvi_core", + "filename": "modules/session/session.inc" + }, + { + "project_id": 17101, + "project_name": "project/kalvi_core", + "filename": "modules/session/views/session_handler_session_operations_field.inc" + }, + { + "project_id": 17142, + "project_name": "project/chatwee", + "filename": "chatwee/src/SSO/Session.php" + }, + { + "project_id": 17914, + "project_name": "project/events_features", + "filename": "panopoly_session/panopoly_session_demo/import/data/panopoly_session_demo.session.csv" + }, + { + "project_id": 17914, + "project_name": "project/events_features", + "filename": "panopoly_session/panopoly_session_demo/import/panopoly_session_demo.session.inc" + }, + { + "project_id": 18291, + "project_name": "project/casperjs", + "filename": "includes/session.js" + }, + { + "project_id": 18559, + "project_name": "project/govbr", + "filename": "includes/session.inc" + }, + { + "project_id": 18559, + "project_name": "project/govbr", + "filename": "modules/simpletest/tests/session.test" + }, + { + "project_id": 18897, + "project_name": "project/qurandistribution", + "filename": "includes/session.inc" + }, + { + "project_id": 18897, + "project_name": "project/qurandistribution", + "filename": "modules/simpletest/tests/session.test" + }, + { + "project_id": 20260, + "project_name": "project/soauth", + "filename": "src/Common/Session.php" + }, + { + "project_id": 20990, + "project_name": "project/development", + "filename": "includes/session.inc" + }, + { + "project_id": 20990, + "project_name": "project/development", + "filename": "modules/simpletest/tests/session.test" + }, + { + "project_id": 21936, + "project_name": "project/session_entity", + "filename": "src/Form/SessionEntitySessionForm.php" + }, + { + "project_id": 21936, + "project_name": "project/session_entity", + "filename": "src/SessionEntityCurrentSessionEntity.php" + }, + { + "project_id": 21936, + "project_name": "project/session_entity", + "filename": "src/SessionEntitySessionStorage.php" + }, + { + "project_id": 23470, + "project_name": "project/gp_reviews", + "filename": "includes/session.inc" + }, + { + "project_id": 23470, + "project_name": "project/gp_reviews", + "filename": "modules/simpletest/tests/session.test" + }, + { + "project_id": 25896, + "project_name": "project/byu_installation_profile", + "filename": "includes/session.inc" + }, + { + "project_id": 25896, + "project_name": "project/byu_installation_profile", + "filename": "modules/simpletest/tests/session.test" + }, + { + "project_id": 49725, + "project_name": "project/drd", + "filename": "src/Plugin/Action/Session.php" + }, + { + "project_id": 51684, + "project_name": "project/views_extras", + "filename": "src/Plugin/views/argument_default/Session.php" + }, + { + "project_id": 52106, + "project_name": "project/delphi", + "filename": "migrate_delphi2/session.inc" + }, + { + "project_id": 59618, + "project_name": "project/intercept", + "filename": "modules/intercept_core/js/src/lib/session.js" + }, + { + "project_id": 59930, + "project_name": "project/telega", + "filename": "modules/telega_session/src/Service/Session.php" + }, + { + "project_id": 60227, + "project_name": "project/govimentum", + "filename": "includes/session.inc" + }, + { + "project_id": 60227, + "project_name": "project/govimentum", + "filename": "modules/simpletest/tests/session.test" + }, + { + "project_id": 60487, + "project_name": "project/cypress", + "filename": "tests/Cypress/integration/Session.feature" + }, + { + "project_id": 61659, + "project_name": "project/entity_visibility_preview", + "filename": "src/Service/SessionManager.php" + }, + { + "project_id": 61899, + "project_name": "project/commerce7_razorpay", + "filename": "includes/libs/Requests-1.6.1/examples/session.php" + }, + { + "project_id": 61899, + "project_name": "project/commerce7_razorpay", + "filename": "includes/libs/Requests-1.6.1/library/Requests/Session.php" + }, + { + "project_id": 61899, + "project_name": "project/commerce7_razorpay", + "filename": "includes/libs/Requests-1.6.1/tests/Session.php" + }, + { + "project_id": 62378, + "project_name": "project/drupalru_d7", + "filename": "includes/session.inc" + }, + { + "project_id": 62378, + "project_name": "project/drupalru_d7", + "filename": "modules/simpletest/tests/session.test" + }, + { + "project_id": 62785, + "project_name": "project/entity_sync", + "filename": "modules/session/src/Commands/Session.php" + }, + { + "project_id": 63624, + "project_name": "project/ubershopwish", + "filename": "includes/session.inc" + }, + { + "project_id": 63624, + "project_name": "project/ubershopwish", + "filename": "modules/simpletest/tests/session.test" + }, + { + "project_id": 77509, + "project_name": "project/testproject4234", + "filename": "includes/session.inc" + }, + { + "project_id": 77509, + "project_name": "project/testproject4234", + "filename": "modules/simpletest/tests/session.test" + }, + { + "project_id": 92563, + "project_name": "project/eventbrite_one_way_sync", + "filename": "src/Session/Session.php" + }, + { + "project_id": 101539, + "project_name": "project/acumatica", + "filename": "src/Command/Session.php" + }, + { + "project_id": 193305, + "project_name": "project/simplesamlphp_sp", + "filename": "tests/modules/simplesamlphp_sp_test/lib/SimpleSAML/Session.php" + }, + { + "project_id": 208118, + "project_name": "project/drupal_devkit", + "filename": "build/claude-code/drupal-core/hooks/session-start" + }, + { + "project_id": 208118, + "project_name": "project/drupal_devkit", + "filename": "build/copilot-cli/drupal-core/hooks/session-start" + }, + { + "project_id": 208118, + "project_name": "project/drupal_devkit", + "filename": "build/cursor/drupal-core/hooks/session-start" + }, + { + "project_id": 208118, + "project_name": "project/drupal_devkit", + "filename": "plugins/drupal-core/hooks/session-start" + }, + { + "project_id": 210105, + "project_name": "project/drupal_canvas_plugin", + "filename": "plugins/drupal-canvas/hooks/session-start" + } + ], + "ReplaceSystemPerformanceGzipKeyRector": [ + { + "project_id": 1417, + "project_name": "project/audit", + "filename": "modules/audit_performance/src/Plugin/AuditAnalyzer/PerformanceAnalyzer.php" + }, + { + "project_id": 1417, + "project_name": "project/audit", + "filename": "modules/audit_performance/tests/src/Unit/Plugin/AuditAnalyzer/PerformanceAnalyzerTest.php" + }, + { + "project_id": 3063, + "project_name": "project/smartcache", + "filename": "README.txt" + }, + { + "project_id": 4621, + "project_name": "project/css_gzip", + "filename": "README.txt" + }, + { + "project_id": 4621, + "project_name": "project/css_gzip", + "filename": "css_gzip.info" + }, + { + "project_id": 4621, + "project_name": "project/css_gzip", + "filename": "css_gzip.install" + }, + { + "project_id": 4621, + "project_name": "project/css_gzip", + "filename": "css_gzip.module" + }, + { + "project_id": 6663, + "project_name": "project/css_emimage", + "filename": "css_emimage.module" + }, + { + "project_id": 8197, + "project_name": "project/onepage", + "filename": "includes/common.inc" + }, + { + "project_id": 8405, + "project_name": "project/cf", + "filename": "modules/cf_settings/cf_settings.install" + }, + { + "project_id": 8912, + "project_name": "project/barracuda", + "filename": "CHANGELOG.txt" + }, + { + "project_id": 8912, + "project_name": "project/barracuda", + "filename": "aegir/tools/system/daily.sh" + }, + { + "project_id": 8912, + "project_name": "project/barracuda", + "filename": "docs/MODULES.txt" + }, + { + "project_id": 9123, + "project_name": "project/1087726", + "filename": "includes/common.inc" + }, + { + "project_id": 9202, + "project_name": "project/vagrant", + "filename": "cookbooks/drupal-cookbooks/drupal/files/default/settings.php" + }, + { + "project_id": 9636, + "project_name": "project/octopus", + "filename": "CHANGELOG.txt" + }, + { + "project_id": 9636, + "project_name": "project/octopus", + "filename": "aegir/tools/system/daily.sh" + }, + { + "project_id": 9636, + "project_name": "project/octopus", + "filename": "docs/MODULES.txt" + }, + { + "project_id": 11552, + "project_name": "project/novalnet", + "filename": "settings.php" + }, + { + "project_id": 11641, + "project_name": "project/mongodrop", + "filename": "default.settings.php" + }, + { + "project_id": 11953, + "project_name": "project/hpcloud", + "filename": "hpcloud.css.inc" + }, + { + "project_id": 12118, + "project_name": "project/rebuild", + "filename": "tests/fixtures/drupal_sites/dev/includes/common.inc" + }, + { + "project_id": 12118, + "project_name": "project/rebuild", + "filename": "tests/fixtures/drupal_sites/prod/includes/common.inc" + }, + { + "project_id": 12677, + "project_name": "project/bundle_aggregation", + "filename": "bundle_aggregation.module" + }, + { + "project_id": 13111, + "project_name": "project/ddcla", + "filename": "public/includes/common.inc" + }, + { + "project_id": 13125, + "project_name": "project/transcribe_distribution", + "filename": "includes/common.inc" + }, + { + "project_id": 14446, + "project_name": "project/tr_kurulum", + "filename": "includes/common.inc" + }, + { + "project_id": 14506, + "project_name": "project/tb_blog_starter", + "filename": "includes/common.inc" + }, + { + "project_id": 14507, + "project_name": "project/tb_events_starter", + "filename": "includes/common.inc" + }, + { + "project_id": 14509, + "project_name": "project/tb_hadelis_starter", + "filename": "includes/common.inc" + }, + { + "project_id": 14510, + "project_name": "project/tb_methys_starter", + "filename": "includes/common.inc" + }, + { + "project_id": 14511, + "project_name": "project/tb_mollise_starter", + "filename": "includes/common.inc" + }, + { + "project_id": 14512, + "project_name": "project/tb_neris_starter", + "filename": "includes/common.inc" + }, + { + "project_id": 14513, + "project_name": "project/tb_palicico_starter", + "filename": "includes/common.inc" + }, + { + "project_id": 14514, + "project_name": "project/tb_purity_starter", + "filename": "includes/common.inc" + }, + { + "project_id": 14515, + "project_name": "project/tb_rave_starter", + "filename": "includes/common.inc" + }, + { + "project_id": 14522, + "project_name": "project/tb_sirate_starter", + "filename": "includes/common.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/common.inc" + }, + { + "project_id": 15222, + "project_name": "project/open_badging_installation_profile", + "filename": "includes/common.inc" + }, + { + "project_id": 15275, + "project_name": "project/ads", + "filename": "examples/settings.php" + }, + { + "project_id": 15746, + "project_name": "project/openpolitic", + "filename": "themes/omega/alpha/includes/alpha.inc" + }, + { + "project_id": 16013, + "project_name": "project/simple_aggregation", + "filename": "simple_aggregation.module" + }, + { + "project_id": 16192, + "project_name": "project/mobilearkickstart", + "filename": "includes/common.inc" + }, + { + "project_id": 16984, + "project_name": "project/spanish_distribution", + "filename": "includes/common.inc" + }, + { + "project_id": 17013, + "project_name": "project/fuse", + "filename": "includes/common.inc" + }, + { + "project_id": 18094, + "project_name": "project/openstack_storage", + "filename": "openstack_storage.css.inc" + }, + { + "project_id": 18559, + "project_name": "project/govbr", + "filename": "includes/common.inc" + }, + { + "project_id": 18897, + "project_name": "project/qurandistribution", + "filename": "includes/common.inc" + }, + { + "project_id": 19090, + "project_name": "project/settingsphp", + "filename": ".env.example" + }, + { + "project_id": 19090, + "project_name": "project/settingsphp", + "filename": "assets/settings.custom.php" + }, + { + "project_id": 19090, + "project_name": "project/settingsphp", + "filename": "assets/settings.recommended.php" + }, + { + "project_id": 19876, + "project_name": "project/flysystem", + "filename": "src/Asset/AssetDumper.php" + }, + { + "project_id": 20010, + "project_name": "project/domain_wise_aggregation", + "filename": "domain_aggregate_compress.module" + }, + { + "project_id": 20410, + "project_name": "project/devinci", + "filename": "example.settings.php" + }, + { + "project_id": 20990, + "project_name": "project/development", + "filename": "includes/common.inc" + }, + { + "project_id": 22819, + "project_name": "project/dawn", + "filename": "node_modules/bootstrap/README.md" + }, + { + "project_id": 23470, + "project_name": "project/gp_reviews", + "filename": "includes/common.inc" + }, + { + "project_id": 24420, + "project_name": "project/razoreye_biz", + "filename": "modules/contrib/advagg/src/Form/SettingsForm.php" + }, + { + "project_id": 24505, + "project_name": "project/tmgmt_transifex", + "filename": "docker/settings.php" + }, + { + "project_id": 25257, + "project_name": "project/background_image", + "filename": "src/Controller/BackgroundImageCssController.php" + }, + { + "project_id": 25896, + "project_name": "project/byu_installation_profile", + "filename": "includes/common.inc" + }, + { + "project_id": 26733, + "project_name": "project/timber", + "filename": "console/site.mode.yml" + }, + { + "project_id": 49725, + "project_name": "project/drd", + "filename": "src/Entity/Requirement.php" + }, + { + "project_id": 53828, + "project_name": "project/bootstrap4", + "filename": "dist/bootstrap/4.6.2/README.md" + }, + { + "project_id": 57654, + "project_name": "project/advagg", + "filename": "src/Form/SettingsForm.php" + }, + { + "project_id": 59891, + "project_name": "project/infrastructure", + "filename": "stats/NG/drupalorg_projects.csv" + }, + { + "project_id": 60087, + "project_name": "project/exsen", + "filename": "node_modules/bootstrap/README.md" + }, + { + "project_id": 60227, + "project_name": "project/govimentum", + "filename": "includes/common.inc" + }, + { + "project_id": 60499, + "project_name": "project/d_test", + "filename": "libraries/bootstrap/README.md" + }, + { + "project_id": 62378, + "project_name": "project/drupalru_d7", + "filename": "includes/common.inc" + }, + { + "project_id": 63624, + "project_name": "project/ubershopwish", + "filename": "includes/common.inc" + }, + { + "project_id": 66128, + "project_name": "project/bootstrap5", + "filename": "dist/bootstrap/5.2.3/README.md" + }, + { + "project_id": 66128, + "project_name": "project/bootstrap5", + "filename": "dist/bootstrap/5.3.8/README.md" + }, + { + "project_id": 71508, + "project_name": "project/drupalsqlsrvci", + "filename": "src/settings.php" + }, + { + "project_id": 77509, + "project_name": "project/testproject4234", + "filename": "includes/common.inc" + }, + { + "project_id": 85563, + "project_name": "project/stage_one_theme", + "filename": "scss/bootstrap/README.md" + }, + { + "project_id": 89428, + "project_name": "project/tone", + "filename": "src/Plugin/ToneAttachmentStrategy/CssPublicFiles.php" + }, + { + "project_id": 89428, + "project_name": "project/tone", + "filename": "tests/src/Kernel/AttachmentStrategy/CssPublicFilesTest.php" + }, + { + "project_id": 207471, + "project_name": "project/ai_agents_experimental_collection", + "filename": "modules/ai_agents_system_manager/src/Plugin/tool/Tool/GetPerformanceSettings.php" + }, + { + "project_id": 207471, + "project_name": "project/ai_agents_experimental_collection", + "filename": "modules/ai_agents_system_manager/src/Plugin/tool/Tool/UpdatePerformanceSettings.php" + } + ], + "ReplaceThemeGetSettingRector": [ + { + "project_id": 2168, + "project_name": "project/denver", + "filename": "page.tpl.php" + }, + { + "project_id": 5104, + "project_name": "project/zeropoint", + "filename": "templates/slider.php" + }, + { + "project_id": 5316, + "project_name": "project/adt_basetheme", + "filename": "preprocess/preprocess-node.inc" + }, + { + "project_id": 8197, + "project_name": "project/onepage", + "filename": "includes/theme.inc" + }, + { + "project_id": 8197, + "project_name": "project/onepage", + "filename": "modules/system/system.module" + }, + { + "project_id": 8969, + "project_name": "project/onus", + "filename": "inc/layout.fixed.css.inc" + }, + { + "project_id": 8969, + "project_name": "project/onus", + "filename": "inc/layout.handler.inc" + }, + { + "project_id": 8969, + "project_name": "project/onus", + "filename": "inc/theme.settings.variables.inc" + }, + { + "project_id": 9123, + "project_name": "project/1087726", + "filename": "includes/theme.inc" + }, + { + "project_id": 9123, + "project_name": "project/1087726", + "filename": "modules/system/system.module" + }, + { + "project_id": 9186, + "project_name": "project/mobile_jquery", + "filename": "SUBTHEME/theme-settings.php" + }, + { + "project_id": 10913, + "project_name": "project/arctica", + "filename": "arctica/theme-settings.php" + }, + { + "project_id": 11200, + "project_name": "project/black_hole", + "filename": "templates/slider.php" + }, + { + "project_id": 11880, + "project_name": "project/aether", + "filename": "aether_core/includes/theme-base.inc" + }, + { + "project_id": 12118, + "project_name": "project/rebuild", + "filename": "tests/fixtures/drupal_sites/dev/includes/theme.inc" + }, + { + "project_id": 12118, + "project_name": "project/rebuild", + "filename": "tests/fixtures/drupal_sites/dev/modules/system/system.module" + }, + { + "project_id": 12118, + "project_name": "project/rebuild", + "filename": "tests/fixtures/drupal_sites/prod/includes/theme.inc" + }, + { + "project_id": 12118, + "project_name": "project/rebuild", + "filename": "tests/fixtures/drupal_sites/prod/modules/system/system.module" + }, + { + "project_id": 13111, + "project_name": "project/ddcla", + "filename": "public/includes/theme.inc" + }, + { + "project_id": 13111, + "project_name": "project/ddcla", + "filename": "public/modules/system/system.module" + }, + { + "project_id": 13125, + "project_name": "project/transcribe_distribution", + "filename": "includes/theme.inc" + }, + { + "project_id": 13125, + "project_name": "project/transcribe_distribution", + "filename": "modules/system/system.module" + }, + { + "project_id": 14446, + "project_name": "project/tr_kurulum", + "filename": "includes/theme.inc" + }, + { + "project_id": 14446, + "project_name": "project/tr_kurulum", + "filename": "modules/system/system.module" + }, + { + "project_id": 14506, + "project_name": "project/tb_blog_starter", + "filename": "includes/theme.inc" + }, + { + "project_id": 14506, + "project_name": "project/tb_blog_starter", + "filename": "modules/system/system.module" + }, + { + "project_id": 14507, + "project_name": "project/tb_events_starter", + "filename": "includes/theme.inc" + }, + { + "project_id": 14507, + "project_name": "project/tb_events_starter", + "filename": "modules/system/system.module" + }, + { + "project_id": 14509, + "project_name": "project/tb_hadelis_starter", + "filename": "includes/theme.inc" + }, + { + "project_id": 14509, + "project_name": "project/tb_hadelis_starter", + "filename": "modules/system/system.module" + }, + { + "project_id": 14510, + "project_name": "project/tb_methys_starter", + "filename": "includes/theme.inc" + }, + { + "project_id": 14510, + "project_name": "project/tb_methys_starter", + "filename": "modules/system/system.module" + }, + { + "project_id": 14511, + "project_name": "project/tb_mollise_starter", + "filename": "includes/theme.inc" + }, + { + "project_id": 14511, + "project_name": "project/tb_mollise_starter", + "filename": "modules/system/system.module" + }, + { + "project_id": 14512, + "project_name": "project/tb_neris_starter", + "filename": "includes/theme.inc" + }, + { + "project_id": 14512, + "project_name": "project/tb_neris_starter", + "filename": "modules/system/system.module" + }, + { + "project_id": 14513, + "project_name": "project/tb_palicico_starter", + "filename": "includes/theme.inc" + }, + { + "project_id": 14513, + "project_name": "project/tb_palicico_starter", + "filename": "modules/system/system.module" + }, + { + "project_id": 14514, + "project_name": "project/tb_purity_starter", + "filename": "includes/theme.inc" + }, + { + "project_id": 14514, + "project_name": "project/tb_purity_starter", + "filename": "modules/system/system.module" + }, + { + "project_id": 14515, + "project_name": "project/tb_rave_starter", + "filename": "includes/theme.inc" + }, + { + "project_id": 14515, + "project_name": "project/tb_rave_starter", + "filename": "modules/system/system.module" + }, + { + "project_id": 14522, + "project_name": "project/tb_sirate_starter", + "filename": "includes/theme.inc" + }, + { + "project_id": 14522, + "project_name": "project/tb_sirate_starter", + "filename": "modules/system/system.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/theme.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/system/system.module" + }, + { + "project_id": 14636, + "project_name": "project/md_foto", + "filename": "inc/template.process.inc" + }, + { + "project_id": 14698, + "project_name": "project/portal_theme", + "filename": "template.php" + }, + { + "project_id": 15222, + "project_name": "project/open_badging_installation_profile", + "filename": "includes/theme.inc" + }, + { + "project_id": 15222, + "project_name": "project/open_badging_installation_profile", + "filename": "modules/system/system.module" + }, + { + "project_id": 15846, + "project_name": "project/abc", + "filename": "templates/slider.php" + }, + { + "project_id": 16192, + "project_name": "project/mobilearkickstart", + "filename": "includes/theme.inc" + }, + { + "project_id": 16192, + "project_name": "project/mobilearkickstart", + "filename": "modules/system/system.module" + }, + { + "project_id": 16252, + "project_name": "project/berry", + "filename": "includes/slider.tpl.php" + }, + { + "project_id": 16984, + "project_name": "project/spanish_distribution", + "filename": "includes/theme.inc" + }, + { + "project_id": 16984, + "project_name": "project/spanish_distribution", + "filename": "modules/system/system.module" + }, + { + "project_id": 17013, + "project_name": "project/fuse", + "filename": "includes/theme.inc" + }, + { + "project_id": 17013, + "project_name": "project/fuse", + "filename": "modules/system/system.module" + }, + { + "project_id": 17324, + "project_name": "project/browsersync", + "filename": "browsersync.module" + }, + { + "project_id": 18559, + "project_name": "project/govbr", + "filename": "includes/theme.inc" + }, + { + "project_id": 18559, + "project_name": "project/govbr", + "filename": "modules/system/system.module" + }, + { + "project_id": 18708, + "project_name": "project/scholarly_lite", + "filename": "template.php" + }, + { + "project_id": 18897, + "project_name": "project/qurandistribution", + "filename": "includes/theme.inc" + }, + { + "project_id": 18897, + "project_name": "project/qurandistribution", + "filename": "modules/system/system.module" + }, + { + "project_id": 20484, + "project_name": "project/mpub", + "filename": "themes/contrib/omega/omega/includes/omega.inc" + }, + { + "project_id": 20976, + "project_name": "project/glazed_free", + "filename": "features/sooper-typography/typography-theme-settings-css.inc" + }, + { + "project_id": 20976, + "project_name": "project/glazed_free", + "filename": "features/sooper-typography/typography-theme-settings.inc" + }, + { + "project_id": 20976, + "project_name": "project/glazed_free", + "filename": "theme-settings.php" + }, + { + "project_id": 20990, + "project_name": "project/development", + "filename": "includes/theme.inc" + }, + { + "project_id": 20990, + "project_name": "project/development", + "filename": "modules/system/system.module" + }, + { + "project_id": 22530, + "project_name": "project/agov_base", + "filename": "agov_base.info.yml" + }, + { + "project_id": 23447, + "project_name": "project/showcase_lite", + "filename": "showcase_lite.theme" + }, + { + "project_id": 23470, + "project_name": "project/gp_reviews", + "filename": "includes/theme.inc" + }, + { + "project_id": 23470, + "project_name": "project/gp_reviews", + "filename": "modules/system/system.module" + }, + { + "project_id": 24420, + "project_name": "project/razoreye_biz", + "filename": "themes/contrib/bootstrap/src/ThemeSettings.php" + }, + { + "project_id": 25232, + "project_name": "project/green_theme", + "filename": "green_theme.theme" + }, + { + "project_id": 25294, + "project_name": "project/pankm", + "filename": "themes/contrib/bootstrap/src/ThemeSettings.php" + }, + { + "project_id": 25453, + "project_name": "project/byu_theme", + "filename": "byu_theme.theme" + }, + { + "project_id": 25896, + "project_name": "project/byu_installation_profile", + "filename": "includes/theme.inc" + }, + { + "project_id": 25896, + "project_name": "project/byu_installation_profile", + "filename": "modules/system/system.module" + }, + { + "project_id": 26025, + "project_name": "project/belle", + "filename": "belle.theme" + }, + { + "project_id": 26124, + "project_name": "project/plus", + "filename": "src/Plugin/Theme/Setting/Settings.php" + }, + { + "project_id": 26124, + "project_name": "project/plus", + "filename": "src/ThemeSettings.php" + }, + { + "project_id": 26169, + "project_name": "project/yg_booster", + "filename": "yg_booster.theme" + }, + { + "project_id": 26233, + "project_name": "project/yg_charity", + "filename": "yg_charity.theme" + }, + { + "project_id": 26339, + "project_name": "project/yg_flew", + "filename": "yg_flew.theme" + }, + { + "project_id": 27033, + "project_name": "project/corporate_lite", + "filename": "corporate_lite.theme" + }, + { + "project_id": 27283, + "project_name": "project/yg_business_plus", + "filename": "yg_business_plus.theme" + }, + { + "project_id": 27318, + "project_name": "project/yg_business_line", + "filename": "yg_business_line.theme" + }, + { + "project_id": 27349, + "project_name": "project/yg_medical", + "filename": "yg_medical.theme" + }, + { + "project_id": 27734, + "project_name": "project/conference_lite", + "filename": "conference_lite.theme" + }, + { + "project_id": 27736, + "project_name": "project/guesthouse_lite", + "filename": "guesthouse_lite.theme" + }, + { + "project_id": 27768, + "project_name": "project/yg_aesthetic", + "filename": "yg_aesthetic.theme" + }, + { + "project_id": 27770, + "project_name": "project/yg_hotel", + "filename": "yg_hotel.theme" + }, + { + "project_id": 27844, + "project_name": "project/yg_medicare", + "filename": "yg_medicare.theme" + }, + { + "project_id": 27922, + "project_name": "project/yg_iconic", + "filename": "yg_iconic.theme" + }, + { + "project_id": 27923, + "project_name": "project/yg_law_firm", + "filename": "yg_law_firm.theme" + }, + { + "project_id": 28148, + "project_name": "project/yg_creative", + "filename": "yg_creative.theme" + }, + { + "project_id": 47202, + "project_name": "project/yg_solid", + "filename": "yg_solid.theme" + }, + { + "project_id": 47221, + "project_name": "project/yg_black", + "filename": "yg_black.theme" + }, + { + "project_id": 47401, + "project_name": "project/materialize", + "filename": "src/ThemeSettings.php" + }, + { + "project_id": 58746, + "project_name": "project/crypto_distribution", + "filename": "themes/crypto/crypto.theme" + }, + { + "project_id": 59699, + "project_name": "project/tara", + "filename": "tara.theme" + }, + { + "project_id": 60036, + "project_name": "project/mili", + "filename": "mili.theme" + }, + { + "project_id": 60227, + "project_name": "project/govimentum", + "filename": "includes/theme.inc" + }, + { + "project_id": 60227, + "project_name": "project/govimentum", + "filename": "modules/system/system.module" + }, + { + "project_id": 60334, + "project_name": "project/minimal_lite", + "filename": "minimal_lite.theme" + }, + { + "project_id": 60837, + "project_name": "project/virtualcare", + "filename": "themes/bootstrap/src/ThemeSettings.php" + }, + { + "project_id": 61313, + "project_name": "project/stack_dd", + "filename": "stack_dd.theme" + }, + { + "project_id": 61358, + "project_name": "project/catalog_lite", + "filename": "catalog_lite.theme" + }, + { + "project_id": 61656, + "project_name": "project/bootstrap_italia", + "filename": "includes/page.inc" + }, + { + "project_id": 61656, + "project_name": "project/bootstrap_italia", + "filename": "includes/preprocess-menu.inc" + }, + { + "project_id": 61656, + "project_name": "project/bootstrap_italia", + "filename": "src/Helper/Table.php" + }, + { + "project_id": 61791, + "project_name": "project/elegant_showcase", + "filename": "elegant_showcase.theme" + }, + { + "project_id": 62371, + "project_name": "project/zuvi", + "filename": "zuvi.theme" + }, + { + "project_id": 62378, + "project_name": "project/drupalru_d7", + "filename": "includes/theme.inc" + }, + { + "project_id": 62378, + "project_name": "project/drupalru_d7", + "filename": "modules/system/system.module" + }, + { + "project_id": 62490, + "project_name": "project/tactic", + "filename": "tactic.theme" + }, + { + "project_id": 62579, + "project_name": "project/vani", + "filename": "vani.theme" + }, + { + "project_id": 62868, + "project_name": "project/dxpr_theme", + "filename": "scripts/generate-settings-schema.js" + }, + { + "project_id": 62868, + "project_name": "project/dxpr_theme", + "filename": "theme-settings.php" + }, + { + "project_id": 62934, + "project_name": "project/zinble", + "filename": "zinble.theme" + }, + { + "project_id": 63624, + "project_name": "project/ubershopwish", + "filename": "includes/theme.inc" + }, + { + "project_id": 63624, + "project_name": "project/ubershopwish", + "filename": "modules/system/system.module" + }, + { + "project_id": 63725, + "project_name": "project/photogenictheme", + "filename": "photogenic_theme.theme" + }, + { + "project_id": 63969, + "project_name": "project/dolphin_theme", + "filename": "dolphin.theme" + }, + { + "project_id": 66228, + "project_name": "project/edux", + "filename": "edux.theme" + }, + { + "project_id": 70307, + "project_name": "project/ruhi", + "filename": "ruhi.theme" + }, + { + "project_id": 70422, + "project_name": "project/mycity", + "filename": "my_city.theme" + }, + { + "project_id": 73211, + "project_name": "project/ajans", + "filename": "ajans.theme" + }, + { + "project_id": 74572, + "project_name": "project/commerce_factuursturen", + "filename": ".gitlab-ci/phpstan.neon" + }, + { + "project_id": 76180, + "project_name": "project/eau_theme", + "filename": "theme-settings/settings-style.inc" + }, + { + "project_id": 76180, + "project_name": "project/eau_theme", + "filename": "theme-settings/style-root.inc" + }, + { + "project_id": 76361, + "project_name": "project/edwt", + "filename": "theme-settings/settings-style.inc" + }, + { + "project_id": 76361, + "project_name": "project/edwt", + "filename": "theme-settings/style-root.inc" + }, + { + "project_id": 77509, + "project_name": "project/testproject4234", + "filename": "includes/theme.inc" + }, + { + "project_id": 77509, + "project_name": "project/testproject4234", + "filename": "modules/system/system.module" + }, + { + "project_id": 82549, + "project_name": "project/xara", + "filename": "xara.theme" + }, + { + "project_id": 86019, + "project_name": "project/creative_innovative", + "filename": "creative_innovative.theme" + }, + { + "project_id": 86288, + "project_name": "project/particles_orange", + "filename": "particles_orange.theme" + }, + { + "project_id": 86424, + "project_name": "project/dark_awesome", + "filename": "dark_awesome.theme" + }, + { + "project_id": 90367, + "project_name": "project/cellular4drupal", + "filename": "cellular/src/preprocess/social.inc" + }, + { + "project_id": 90572, + "project_name": "project/dsfr", + "filename": ".phpstan.neon" + }, + { + "project_id": 91175, + "project_name": "project/idyllic", + "filename": "idyllic.theme" + }, + { + "project_id": 92163, + "project_name": "project/dark_page", + "filename": "dark_page.theme" + }, + { + "project_id": 92291, + "project_name": "project/smash_lite", + "filename": "smash_lite.theme" + }, + { + "project_id": 94979, + "project_name": "project/marvelous", + "filename": "marvelous.theme" + }, + { + "project_id": 102735, + "project_name": "project/fashion_beauty", + "filename": "ultimate_slider.theme" + }, + { + "project_id": 110336, + "project_name": "project/mahi", + "filename": "mahi.theme" + }, + { + "project_id": 115517, + "project_name": "project/power_portfolio", + "filename": "power_portfolio.theme" + }, + { + "project_id": 116731, + "project_name": "project/kart", + "filename": "kart.theme" + }, + { + "project_id": 116841, + "project_name": "project/potent_allure", + "filename": "potent_allure.theme" + }, + { + "project_id": 117060, + "project_name": "project/rhythm", + "filename": "rhythm.theme" + }, + { + "project_id": 117973, + "project_name": "project/harmony_haven", + "filename": "harmony_haven.theme" + }, + { + "project_id": 118186, + "project_name": "project/novel_delights", + "filename": "novel_delights.theme" + }, + { + "project_id": 119094, + "project_name": "project/kamihaya_cms", + "filename": "themes/kamihaya_digitalagency/kamihaya_digitalagency.theme" + }, + { + "project_id": 120281, + "project_name": "project/decorx", + "filename": "decorx.theme" + }, + { + "project_id": 120883, + "project_name": "project/diner_delights", + "filename": "diner_delights.theme" + }, + { + "project_id": 120883, + "project_name": "project/diner_delights", + "filename": "theme-settings.php" + }, + { + "project_id": 122249, + "project_name": "project/business_dev", + "filename": "business_dev.theme" + }, + { + "project_id": 124680, + "project_name": "project/multi_purpose", + "filename": "multi_purpose.theme" + }, + { + "project_id": 127054, + "project_name": "project/animal_shelter", + "filename": "animal_shelter.theme" + }, + { + "project_id": 138963, + "project_name": "project/feature_boost", + "filename": "feature_boost.theme" + }, + { + "project_id": 139702, + "project_name": "project/pets_clinic", + "filename": "pets_clinic.theme" + }, + { + "project_id": 144182, + "project_name": "project/lgms", + "filename": "themes/contrib/vani/vani.theme" + }, + { + "project_id": 157751, + "project_name": "project/diba_clean", + "filename": "diba_clean.theme" + }, + { + "project_id": 161998, + "project_name": "project/bootstrap3", + "filename": "src/ThemeSettings.php" + }, + { + "project_id": 170081, + "project_name": "project/nava", + "filename": "nava.theme" + }, + { + "project_id": 195589, + "project_name": "project/saar", + "filename": "saar.theme" + }, + { + "project_id": 200422, + "project_name": "project/uni", + "filename": "uni.theme" + } + ], + "ReplaceUserSessionNamePropertyRector": [ + { + "project_id": 1705, + "project_name": "project/synonyms", + "filename": "modules/synonyms_search/tests/src/Functional/AdminFunctionalityTest.php" + }, + { + "project_id": 1705, + "project_name": "project/synonyms", + "filename": "tests/src/Functional/AdminFunctionalityTest.php" + }, + { + "project_id": 3156, + "project_name": "project/field", + "filename": "session-memcache.inc" + }, + { + "project_id": 4956, + "project_name": "project/role_inheritance", + "filename": "src/EventSubscriber/CurrentUserRoleShim.php" + }, + { + "project_id": 7367, + "project_name": "project/turbo", + "filename": "contrib/turbo_session/session.db.inc" + }, + { + "project_id": 7367, + "project_name": "project/turbo", + "filename": "contrib/turbo_session/session.file.inc" + }, + { + "project_id": 7367, + "project_name": "project/turbo", + "filename": "contrib/turbo_session/session.memcache.inc" + }, + { + "project_id": 15952, + "project_name": "project/monitoring", + "filename": "config/optional/monitoring.sensor_config.user_session_logouts.yml" + }, + { + "project_id": 16138, + "project_name": "project/site_search_analytics", + "filename": "visitorsvoice_api.module" + }, + { + "project_id": 21075, + "project_name": "project/services_session_token_auth", + "filename": "README.txt" + }, + { + "project_id": 21075, + "project_name": "project/services_session_token_auth", + "filename": "services_session_token_auth.module" + }, + { + "project_id": 21579, + "project_name": "project/clu", + "filename": "clu.routing.yml" + }, + { + "project_id": 21579, + "project_name": "project/clu", + "filename": "src/Controller/GetUserSession.php" + }, + { + "project_id": 21579, + "project_name": "project/clu", + "filename": "src/Form/EndUserSessionConfirm.php" + }, + { + "project_id": 21828, + "project_name": "project/program", + "filename": "modules/program_session_user/config/install/views.view.user_session_schedule.yml" + }, + { + "project_id": 23632, + "project_name": "project/complex_workflow", + "filename": "src/Util/WorkflowUtil.php" + }, + { + "project_id": 23632, + "project_name": "project/complex_workflow", + "filename": "src/Util/WorkflowUtilInterface.php" + }, + { + "project_id": 50161, + "project_name": "project/dbee", + "filename": "src/Authentication/Provider/DbeeCookie.php" + }, + { + "project_id": 54674, + "project_name": "project/riddler", + "filename": "tests/src/Functional/RiddlerCaseSensitivityTest.php" + }, + { + "project_id": 55697, + "project_name": "project/acquia_commercemanager", + "filename": "modules/acm/src/User/AnonymousCommerceUserSession.php" + }, + { + "project_id": 55697, + "project_name": "project/acquia_commercemanager", + "filename": "modules/acm/src/User/CommerceUserSession.php" + }, + { + "project_id": 56521, + "project_name": "project/controller_annotations", + "filename": "tests/src/Kernel/KernelTestBase.php" + }, + { + "project_id": 56521, + "project_name": "project/controller_annotations", + "filename": "tests/src/Kernel/TestUserSession.php" + }, + { + "project_id": 57655, + "project_name": "project/miniorange_oauth_client", + "filename": "src/MoFeatures/MoUnoFeatures/MoOperations/MoUnoClientSettings.php" + }, + { + "project_id": 58047, + "project_name": "project/apigee_m10n", + "filename": "modules/apigee_m10n_teams/tests/src/Kernel/MonetizationTeamsKernelTestBase.php" + }, + { + "project_id": 58118, + "project_name": "project/restful", + "filename": "src/Authentication/AuthenticationManager.php" + }, + { + "project_id": 58118, + "project_name": "project/restful", + "filename": "src/Authentication/UserSessionState.php" + }, + { + "project_id": 58118, + "project_name": "project/restful", + "filename": "src/Authentication/UserSessionStateInterface.php" + }, + { + "project_id": 59468, + "project_name": "project/probo", + "filename": "src/EventSubscriber/UserSessionObjectSubscriber.php" + }, + { + "project_id": 59857, + "project_name": "project/acquia_contenthub", + "filename": "src/Session/ContentHubUserSession.php" + }, + { + "project_id": 59888, + "project_name": "project/paddle_selenium_tests", + "filename": "pages/Kanooh/Paddle/Utilities/UserSessionService.php" + }, + { + "project_id": 59888, + "project_name": "project/paddle_selenium_tests", + "filename": "tests/Kanooh/Paddle/App/Base/EnableDisableTestBase.php" + }, + { + "project_id": 59888, + "project_name": "project/paddle_selenium_tests", + "filename": "tests/Kanooh/Paddle/App/Base/InfoTestBase.php" + }, + { + "project_id": 59888, + "project_name": "project/paddle_selenium_tests", + "filename": "tests/Kanooh/Paddle/App/Calendar/CalendarTest.php" + }, + { + "project_id": 59888, + "project_name": "project/paddle_selenium_tests", + "filename": "tests/Kanooh/Paddle/App/CodexFlanders/PaneTest.php" + }, + { + "project_id": 59888, + "project_name": "project/paddle_selenium_tests", + "filename": "tests/Kanooh/Paddle/App/Comment/ConfigurationTest.php" + }, + { + "project_id": 59888, + "project_name": "project/paddle_selenium_tests", + "filename": "tests/Kanooh/Paddle/App/Comment/UserNotificationsTest.php" + }, + { + "project_id": 59888, + "project_name": "project/paddle_selenium_tests", + "filename": "tests/Kanooh/Paddle/App/Cultuurnet/CultuurnetTest.php" + }, + { + "project_id": 59888, + "project_name": "project/paddle_selenium_tests", + "filename": "tests/Kanooh/Paddle/App/CustomJavascript/ConfigurationTest.php" + }, + { + "project_id": 59888, + "project_name": "project/paddle_selenium_tests", + "filename": "tests/Kanooh/Paddle/App/CustomPageLayout/ConfigurationTest.php" + }, + { + "project_id": 59888, + "project_name": "project/paddle_selenium_tests", + "filename": "tests/Kanooh/Paddle/App/CustomPageLayout/CustomPageLayoutTest.php" + }, + { + "project_id": 59888, + "project_name": "project/paddle_selenium_tests", + "filename": "tests/Kanooh/Paddle/App/Embed/PaneTest.php" + }, + { + "project_id": 59888, + "project_name": "project/paddle_selenium_tests", + "filename": "tests/Kanooh/Paddle/App/FlyOutMenu/FlyOutMenuTest.php" + }, + { + "project_id": 59888, + "project_name": "project/paddle_selenium_tests", + "filename": "tests/Kanooh/Paddle/App/Formbuilder/ConfigurationTest.php" + }, + { + "project_id": 59888, + "project_name": "project/paddle_selenium_tests", + "filename": "tests/Kanooh/Paddle/App/Glossary/GlossaryPagerTest.php" + }, + { + "project_id": 59888, + "project_name": "project/paddle_selenium_tests", + "filename": "tests/Kanooh/Paddle/App/IncomingRSS/ConfigurationTest.php" + }, + { + "project_id": 59888, + "project_name": "project/paddle_selenium_tests", + "filename": "tests/Kanooh/Paddle/App/Multilingual/ConfigurationTest.php" + }, + { + "project_id": 59888, + "project_name": "project/paddle_selenium_tests", + "filename": "tests/Kanooh/Paddle/App/Multilingual/InterfaceLanguageTest.php" + }, + { + "project_id": 59888, + "project_name": "project/paddle_selenium_tests", + "filename": "tests/Kanooh/Paddle/App/Multilingual/LanguagePrefixTest.php" + }, + { + "project_id": 59888, + "project_name": "project/paddle_selenium_tests", + "filename": "tests/Kanooh/Paddle/App/Multilingual/MenuLanguageSyncTest.php" + }, + { + "project_id": 59888, + "project_name": "project/paddle_selenium_tests", + "filename": "tests/Kanooh/Paddle/App/Multilingual/MultilingualMenuItemsTest.php" + }, + { + "project_id": 59888, + "project_name": "project/paddle_selenium_tests", + "filename": "tests/Kanooh/Paddle/App/Multilingual/NewsOverviewTest.php" + }, + { + "project_id": 59888, + "project_name": "project/paddle_selenium_tests", + "filename": "tests/Kanooh/Paddle/App/Multilingual/Pane/PaneMultilingualTestBase.php" + }, + { + "project_id": 59888, + "project_name": "project/paddle_selenium_tests", + "filename": "tests/Kanooh/Paddle/App/Multilingual/TranslationLinksTest.php" + }, + { + "project_id": 59888, + "project_name": "project/paddle_selenium_tests", + "filename": "tests/Kanooh/Paddle/App/OpeningHours/ConfigurationTest.php" + }, + { + "project_id": 59888, + "project_name": "project/paddle_selenium_tests", + "filename": "tests/Kanooh/Paddle/App/OrganizationalUnit/OrganizationalUnitSearchTest.php" + }, + { + "project_id": 59888, + "project_name": "project/paddle_selenium_tests", + "filename": "tests/Kanooh/Paddle/App/PasswordPolicy/PasswordPolicyTest.php" + }, + { + "project_id": 59888, + "project_name": "project/paddle_selenium_tests", + "filename": "tests/Kanooh/Paddle/App/Poll/PollChartTest.php" + }, + { + "project_id": 59888, + "project_name": "project/paddle_selenium_tests", + "filename": "tests/Kanooh/Paddle/App/Poll/PollVoteTest.php" + }, + { + "project_id": 59888, + "project_name": "project/paddle_selenium_tests", + "filename": "tests/Kanooh/Paddle/App/ProtectedContent/ConfigurationTest.php" + }, + { + "project_id": 59888, + "project_name": "project/paddle_selenium_tests", + "filename": "tests/Kanooh/Paddle/App/ProtectedContent/ContentType/Base/ProtectedPageTestBase.php" + }, + { + "project_id": 59888, + "project_name": "project/paddle_selenium_tests", + "filename": "tests/Kanooh/Paddle/App/ProtectedContent/ProtectedContentTest.php" + }, + { + "project_id": 59888, + "project_name": "project/paddle_selenium_tests", + "filename": "tests/Kanooh/Paddle/App/Rate/ConfigurationTest.php" + }, + { + "project_id": 59888, + "project_name": "project/paddle_selenium_tests", + "filename": "tests/Kanooh/Paddle/App/Rate/RateTest.php" + }, + { + "project_id": 59888, + "project_name": "project/paddle_selenium_tests", + "filename": "tests/Kanooh/Paddle/App/ReCaptcha/ConfigurationTest.php" + }, + { + "project_id": 59888, + "project_name": "project/paddle_selenium_tests", + "filename": "tests/Kanooh/Paddle/App/RichFooter/RichFooterTest.php" + }, + { + "project_id": 59888, + "project_name": "project/paddle_selenium_tests", + "filename": "tests/Kanooh/Paddle/App/SimpleContact/PaneTest.php" + }, + { + "project_id": 59888, + "project_name": "project/paddle_selenium_tests", + "filename": "tests/Kanooh/Paddle/App/SimpleContact/SimpleContactTest.php" + }, + { + "project_id": 59888, + "project_name": "project/paddle_selenium_tests", + "filename": "tests/Kanooh/Paddle/App/SocialMedia/ContentType/Base/SocialMediaTestBase.php" + }, + { + "project_id": 59888, + "project_name": "project/paddle_selenium_tests", + "filename": "tests/Kanooh/Paddle/App/SplashPage/MenuLanguageSyncTest.php" + }, + { + "project_id": 59888, + "project_name": "project/paddle_selenium_tests", + "filename": "tests/Kanooh/Paddle/App/SplashPage/SplashPageTest.php" + }, + { + "project_id": 59888, + "project_name": "project/paddle_selenium_tests", + "filename": "tests/Kanooh/Paddle/App/TimeStamp/TimeStampTest.php" + }, + { + "project_id": 59888, + "project_name": "project/paddle_selenium_tests", + "filename": "tests/Kanooh/Paddle/App/XMLSitemap/ConfigurationTest.php" + }, + { + "project_id": 61809, + "project_name": "project/lw_groups", + "filename": "modules/lw_groups_node/lw_groups_node.module" + }, + { + "project_id": 61809, + "project_name": "project/lw_groups", + "filename": "modules/lw_groups_node/src/UserAccountHelpers.php" + }, + { + "project_id": 62055, + "project_name": "project/eus", + "filename": "README.txt" + }, + { + "project_id": 62055, + "project_name": "project/eus", + "filename": "composer.json" + }, + { + "project_id": 62055, + "project_name": "project/eus", + "filename": "eus.routing.yml" + }, + { + "project_id": 62378, + "project_name": "project/drupalru_d7", + "filename": "modules/user/tests/user_session_test.info" + }, + { + "project_id": 62378, + "project_name": "project/drupalru_d7", + "filename": "modules/user/tests/user_session_test.module" + }, + { + "project_id": 63624, + "project_name": "project/ubershopwish", + "filename": "modules/user/tests/user_session_test.info" + }, + { + "project_id": 63624, + "project_name": "project/ubershopwish", + "filename": "modules/user/tests/user_session_test.module" + }, + { + "project_id": 63757, + "project_name": "project/neon_api", + "filename": "src/NeonApi.php" + }, + { + "project_id": 64223, + "project_name": "project/publisso_gold", + "filename": "src/Form/publisso_goldUseridentity.php" + }, + { + "project_id": 73291, + "project_name": "project/acquia_perz", + "filename": "src/Session/AcquiaPerzUserSession.php" + }, + { + "project_id": 77509, + "project_name": "project/testproject4234", + "filename": "modules/user/tests/user_session_test.info" + }, + { + "project_id": 77509, + "project_name": "project/testproject4234", + "filename": "modules/user/tests/user_session_test.module" + }, + { + "project_id": 83095, + "project_name": "project/session_inspector", + "filename": "src/Controller/UserSessionInspector.php" + }, + { + "project_id": 104812, + "project_name": "project/scorm_field", + "filename": "scorm_field.install" + }, + { + "project_id": 150956, + "project_name": "project/session_management", + "filename": "session_management.links.menu.yml" + }, + { + "project_id": 150956, + "project_name": "project/session_management", + "filename": "session_management.routing.yml" + }, + { + "project_id": 150956, + "project_name": "project/session_management", + "filename": "src/Controller/UserSessionMonitor.php" + }, + { + "project_id": 150956, + "project_name": "project/session_management", + "filename": "src/EventSubscriber/SessionLimitSubscriber.php" + }, + { + "project_id": 150956, + "project_name": "project/session_management", + "filename": "src/Form/SessionSettingsForm.php" + }, + { + "project_id": 150956, + "project_name": "project/session_management", + "filename": "src/SessionMonitorInterface.php" + }, + { + "project_id": 154062, + "project_name": "project/acquia_vwo", + "filename": "modules/acquia_vwo_content/src/Session/AcquiaVwoContentUserSession.php" + }, + { + "project_id": 160629, + "project_name": "project/drupalfit", + "filename": "src/Plugin/FitCheck/AnonymousUserSession.php" + }, + { + "project_id": 167487, + "project_name": "project/search_api_exclude_lb", + "filename": "patches/search_api/search_api-processor_rendered-item_add_flag_to_user_session.patch" + }, + { + "project_id": 171755, + "project_name": "project/entity_mesh", + "filename": "src/DummyAccount.php" + }, + { + "project_id": 189447, + "project_name": "project/drupal_content_repository", + "filename": "note.txt" + } + ], + "ReplaceViewsProceduralFunctionsRector": [ + { + "project_id": 1730, + "project_name": "project/related_content", + "filename": "methods/related_content_views.module" + }, + { + "project_id": 2523, + "project_name": "project/quicktabs", + "filename": "src/Plugin/TabType/ViewContent.php" + }, + { + "project_id": 4485, + "project_name": "project/googlenews", + "filename": "googlenews.module" + }, + { + "project_id": 6486, + "project_name": "project/featured_content", + "filename": "featured_content.module" + }, + { + "project_id": 7093, + "project_name": "project/nodereference_basket", + "filename": "nodereference_basket.module" + }, + { + "project_id": 7241, + "project_name": "project/feeds_view_parser", + "filename": "FeedsViewFetcher.inc" + }, + { + "project_id": 7684, + "project_name": "project/internet_archive", + "filename": "internet_archive.module" + }, + { + "project_id": 7816, + "project_name": "project/hose_xml", + "filename": "hose_xml.module" + }, + { + "project_id": 7948, + "project_name": "project/highcharts", + "filename": "views/highcharts_views.options.inc" + }, + { + "project_id": 8691, + "project_name": "project/sensor_hub", + "filename": "feeds_plugins/feeds_atrium_reader_data_fetcher/FeedsAtriumReaderDataFetcher.inc" + }, + { + "project_id": 8691, + "project_name": "project/sensor_hub", + "filename": "feeds_plugins/feeds_shub_sensor_board_data_fetcher/FeedsShubSensorBoardDataFetcher.inc" + }, + { + "project_id": 9044, + "project_name": "project/taxonomy_display", + "filename": "handlers/associated/views.inc" + }, + { + "project_id": 9423, + "project_name": "project/student_signup", + "filename": "modules/s4_features/s4_core/s4_core.blocks.inc" + }, + { + "project_id": 9423, + "project_name": "project/student_signup", + "filename": "modules/s4_features/s4_core/s4_core.module" + }, + { + "project_id": 9770, + "project_name": "project/corporative_site", + "filename": "modules/contrib/views/CHANGELOG.txt" + }, + { + "project_id": 9770, + "project_name": "project/corporative_site", + "filename": "modules/contrib/views/includes/admin.inc" + }, + { + "project_id": 9770, + "project_name": "project/corporative_site", + "filename": "modules/contrib/views/views.module" + }, + { + "project_id": 9847, + "project_name": "project/b2b_store_solution", + "filename": "b2b_construction/modules/contrib/views/views.module" + }, + { + "project_id": 9979, + "project_name": "project/prometheus", + "filename": "classes/prometheus.class.php" + }, + { + "project_id": 10080, + "project_name": "project/rules_example", + "filename": "rules_example.rules.inc" + }, + { + "project_id": 10285, + "project_name": "project/time_tracker_simple", + "filename": "time_tracker_simple.module" + }, + { + "project_id": 10325, + "project_name": "project/product_reference_view", + "filename": "product_reference_view.module" + }, + { + "project_id": 10405, + "project_name": "project/onepagecv", + "filename": "modules/views/views.module" + }, + { + "project_id": 10452, + "project_name": "project/shopcart", + "filename": "shopcart.inc" + }, + { + "project_id": 10543, + "project_name": "project/featured_news_feature", + "filename": "featured_news.module" + }, + { + "project_id": 10703, + "project_name": "project/manymail", + "filename": "modules/views/manymail_views.module" + }, + { + "project_id": 11295, + "project_name": "project/entityform", + "filename": "entityform.admin.inc" + }, + { + "project_id": 12583, + "project_name": "project/deeplink", + "filename": "deeplink.rules.inc" + }, + { + "project_id": 12593, + "project_name": "project/commerce_payleap", + "filename": "commerce_payleap.rules.inc" + }, + { + "project_id": 13600, + "project_name": "project/pdfck", + "filename": "pdfck.generate.inc" + }, + { + "project_id": 13854, + "project_name": "project/openbadging", + "filename": "modules/openbadging_manage_backpack/openbadging_manage_backpack.module" + }, + { + "project_id": 13895, + "project_name": "project/ajaxnewcounter", + "filename": "ajaxnewcounter_view/ajaxnewcounter_view.module" + }, + { + "project_id": 14139, + "project_name": "project/courseplanner", + "filename": "courseplanner.module" + }, + { + "project_id": 14469, + "project_name": "project/background_audio", + "filename": "background_audio_block/background_audio_block.module" + }, + { + "project_id": 14693, + "project_name": "project/feeds_tamper_string2id", + "filename": "plugins/string2id.inc" + }, + { + "project_id": 16588, + "project_name": "project/at_theming", + "filename": "lib/ViewRender.php" + }, + { + "project_id": 16663, + "project_name": "project/ctools_view_access", + "filename": "plugins/access/view_access.inc" + }, + { + "project_id": 17416, + "project_name": "project/xml_export", + "filename": "xml_export.module" + }, + { + "project_id": 18092, + "project_name": "project/eform", + "filename": "src/Controller/EFormControllerBase.php" + }, + { + "project_id": 18927, + "project_name": "project/oa_folders", + "filename": "oa_folders.module" + }, + { + "project_id": 18927, + "project_name": "project/oa_folders", + "filename": "oa_folders_zip/oa_folders_zip.module" + }, + { + "project_id": 19162, + "project_name": "project/hunter", + "filename": "modules/magic_theme/hunter_test/src/Controller/HunterTestController.php" + }, + { + "project_id": 19499, + "project_name": "project/yaqut_epub_generator", + "filename": "modules/custom/yaqut/yaqut.module" + }, + { + "project_id": 19807, + "project_name": "project/wechat_views", + "filename": "wechat_views.module" + }, + { + "project_id": 20289, + "project_name": "project/commerce_checkout_products_list", + "filename": "commerce_checkout_products_list.checkout_pane.inc" + }, + { + "project_id": 20484, + "project_name": "project/mpub", + "filename": "modules/contrib/views/views.module" + }, + { + "project_id": 21898, + "project_name": "project/ectostar_standard", + "filename": "modules/custom/conf_eform/conf_eform.admin.inc" + }, + { + "project_id": 24037, + "project_name": "project/proconcom", + "filename": "proconcom.module" + }, + { + "project_id": 24420, + "project_name": "project/razoreye_biz", + "filename": "modules/contrib/schema_metatag/src/Plugin/metatag/Tag/SchemaItemListElementViewsBase.php" + }, + { + "project_id": 24795, + "project_name": "project/abookings", + "filename": "includes/queries.inc" + }, + { + "project_id": 24795, + "project_name": "project/abookings", + "filename": "modules/booking/includes/costs.inc" + }, + { + "project_id": 25097, + "project_name": "project/drupal_extra", + "filename": "README.md" + }, + { + "project_id": 25097, + "project_name": "project/drupal_extra", + "filename": "drupal_extra.module" + }, + { + "project_id": 25544, + "project_name": "project/sshop", + "filename": "sshop.theme" + }, + { + "project_id": 27445, + "project_name": "project/simple_sitemap_views", + "filename": "src/Plugin/simple_sitemap/UrlGenerator/ViewsUrlGenerator.php" + }, + { + "project_id": 27445, + "project_name": "project/simple_sitemap_views", + "filename": "src/SimpleSitemapViews.php" + }, + { + "project_id": 44107, + "project_name": "project/qtools_common", + "filename": "qtools.inc" + }, + { + "project_id": 47422, + "project_name": "project/twig_tweak", + "filename": "src/TwigTweakExtension.php" + }, + { + "project_id": 50230, + "project_name": "project/vfd", + "filename": "src/Controller/DownloadViewController.php" + }, + { + "project_id": 52158, + "project_name": "project/api", + "filename": "src/Formatter.php" + }, + { + "project_id": 52538, + "project_name": "project/content_packager", + "filename": "src/PluginForm/RestSourcePackage.php" + }, + { + "project_id": 53457, + "project_name": "project/openstory", + "filename": "src/Plugin/rest/EntityTypeResourceBase.php" + }, + { + "project_id": 54226, + "project_name": "project/gathercontent", + "filename": "gathercontent_ui/gathercontent_ui.install" + }, + { + "project_id": 56659, + "project_name": "project/ercore", + "filename": "modules/ercore_core/pages/ercore-integrity.inc" + }, + { + "project_id": 58383, + "project_name": "project/dvg", + "filename": "modules/features/dvg_topical/dvg_topical.module" + }, + { + "project_id": 58647, + "project_name": "project/views", + "filename": "views.module" + }, + { + "project_id": 58759, + "project_name": "project/outlayer", + "filename": "src/Plugin/views/style/OutlayerViewsIsotope.php" + }, + { + "project_id": 59005, + "project_name": "project/social", + "filename": "modules/social_features/social_album/social_album.module" + }, + { + "project_id": 59005, + "project_name": "project/social", + "filename": "themes/socialblue/src/Plugin/Preprocess/Node.php" + }, + { + "project_id": 59503, + "project_name": "project/degov", + "filename": "modules/degov_paragraph_slideshow/src/PreprocessParagraph.php" + }, + { + "project_id": 59644, + "project_name": "project/simple_sitemap", + "filename": "modules/simple_sitemap_views/src/Plugin/simple_sitemap/UrlGenerator/ViewsUrlGenerator.php" + }, + { + "project_id": 59644, + "project_name": "project/simple_sitemap", + "filename": "modules/simple_sitemap_views/src/SimpleSitemapViews.php" + }, + { + "project_id": 59873, + "project_name": "project/viewfield", + "filename": "src/Plugin/Field/FieldFormatter/ViewfieldFormatterDefault.php" + }, + { + "project_id": 59899, + "project_name": "project/facet_granular_date", + "filename": "src/Plugin/facets/url_processor/GranularDateQueryString.php" + }, + { + "project_id": 60038, + "project_name": "project/conference_suite", + "filename": "email/conference_email.pages.inc" + }, + { + "project_id": 60038, + "project_name": "project/conference_suite", + "filename": "schedule/conference_schedule.module" + }, + { + "project_id": 60215, + "project_name": "project/aeg", + "filename": "modules/views/views.module" + }, + { + "project_id": 60682, + "project_name": "project/delivery", + "filename": "src/DeliveryService.php" + }, + { + "project_id": 62331, + "project_name": "project/knowledge", + "filename": "src/Controller/CompetencyController.php" + }, + { + "project_id": 67002, + "project_name": "project/next_views_entity_reference", + "filename": "src/Plugin/Block/NextViewsEntityReferenceBlock.php" + }, + { + "project_id": 67217, + "project_name": "project/socialblue", + "filename": "src/Plugin/Preprocess/Node.php" + }, + { + "project_id": 81045, + "project_name": "project/custom_field", + "filename": "modules/custom_field_viewfield/src/Plugin/CustomField/FieldFormatter/ViewfieldDefaultFormatter.php" + }, + { + "project_id": 120874, + "project_name": "project/abinbev_gmap", + "filename": "src/PlaceInfoService.php" + }, + { + "project_id": 181203, + "project_name": "project/json_drop_api", + "filename": "modules/contrib/simple_sitemap/modules/simple_sitemap_views/src/Plugin/simple_sitemap/UrlGenerator/ViewsUrlGenerator.php" + }, + { + "project_id": 181203, + "project_name": "project/json_drop_api", + "filename": "modules/contrib/simple_sitemap/modules/simple_sitemap_views/src/SimpleSitemapViews.php" + }, + { + "project_id": 208312, + "project_name": "project/simple_sitemap_authenticated", + "filename": "src/Plugin/simple_sitemap/UrlGenerator/AuthenticatedViewsUrlGenerator.php" + } + ], + "StripMigrationDependenciesExpandArgRector": [ + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": ".gitignore" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/cache-install.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/database/log.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/database/sqlite/select.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/errors.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/filetransfer/local.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/filetransfer/ssh.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/install.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/lock.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/menu.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/password.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/farbtastic/farbtastic.js" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/jquery.js" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/powered-blue-80x15.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/powered-gray-135x42.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/ui/jquery.ui.selectable.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "misc/ui/jquery.ui.slider.min.js" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/aggregator/aggregator-feed-source.tpl.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/aggregator/tests/aggregator_test_atom.xml" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/block/block.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/block/block.js" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/color/color.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.api.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/comment/comment.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/contact/contact.admin.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/contact/contact.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/dashboard/dashboard.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/field.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/modules/list/list.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/modules/number/number.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/tests/field_test.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field/tests/field_test.storage.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/field_ui/field_ui.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/file/icons/application-x-executable.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/file/icons/text-html.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/file/icons/text-x-generic.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/file/icons/x-office-document.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/filter/filter.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/filter/filter.pages.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/forum/forum.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/help/help.api.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/locale/locale.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/node/node.tokens.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/node/tests/node_access_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/node/tests/node_test_exception.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/openid/tests/openid_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/path/path.admin.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/php/php.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/poll/poll-results.tpl.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/rdf/rdf.api.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/rdf/tests/rdf_test.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/search/search.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/search/search.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/search/tests/search_embedded_form.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/search/tests/search_extra_type.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/files/css_test_files/comment_hacks.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/files/css_test_files/comment_hacks.css.unoptimized.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/files/javascript-2.script" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/simpletest.js" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/actions.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/ajax_test.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/error.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/graph.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/image_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/password.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/path_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/requirements1_test.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/system_incompatible_core_version_dependencies_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/system_incompatible_module_version_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/theme_test.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/unicode.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/upgrade/drupal-6.upload.database.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/upgrade/drupal-6.user-password-token.database.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/simpletest/tests/upgrade/upgrade.comment.test" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/statistics/statistics.pages.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/syslog/syslog.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/syslog/syslog.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/system/system.archiver.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/system/system.queue.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/system/system.updater.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/taxonomy/taxonomy.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/tracker/tracker.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/trigger/trigger.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/update/tests/aaa_update_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/update/tests/drupal.0.xml" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/user/tests/user_form_test.info" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/user/tests/user_form_test.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/user/user.module" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/README.txt" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/bartik/css/print.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/bartik/images/buttons.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/garland/fix-ie.css" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/garland/logo.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/seven/images/ui-icons-ffffff-256x240.png" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/seven/page.tpl.php" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "themes/seven/style.css" + } + ], + "UseEntityTypeHasIntegerIdRector": [ + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "CREDITS.TXT" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "DICTIONARY.TXT" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "aggregator-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "archive-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "block-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "blog-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "blogapi-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "book-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "color-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "comment-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "common-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "contact-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "content_types-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "drupal-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "file-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "filter-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "form-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "forum-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "general.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "installer.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "locale-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "locale-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "menu-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "node-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "outros_modulos/gsitemap/gsitemap-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "outros_modulos/service_links/service_links-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "path-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "poll-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "profile-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "search-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "statistics-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "system-install.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "system-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "taxonomy-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "theme-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "throttle-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "tracker-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "unicode-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "upload-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "user-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "watchdog-module.po" + }, + { + "project_id": 289, + "project_name": "project/livediscussions", + "filename": "live_discussions.module" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "arrow-next-hover.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "arrow-prev-hover.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "arrow-prev.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "arrow-up-hover.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "background.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "block.tpl.php" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "box.tpl.php" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "forum-container.jpg" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "forum-link.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "header-a.jpg" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "icon-block.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "logo-active.jpg" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "logo.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "node.tpl.php" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "style.css" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "tabs-off.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "tabs-on.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "tabs-option-hover.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "tabs-option-on.png" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "README.txt" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "archive-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "block-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "blogapi-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "book-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "common-inc.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "drupal-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "file-inc.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "locale-inc.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "locale-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "menu-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "node-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "poll-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "profile-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "search-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "statistics-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "story-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "system-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "taxonomy-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "throttle-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "upload-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "user-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "watchdog-module.po" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "README.txt" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "ma_blogit/README.txt" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "ma_blogit/ma_blogit.module" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "ma_bzip2/ma_bzip2.module" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "ma_gzip/README.txt" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "ma_gzip/ma_gzip.module" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "mail_archive.mysql" + }, + { + "project_id": 310, + "project_name": "project/sitemenu", + "filename": "sitemenu.info" + }, + { + "project_id": 310, + "project_name": "project/sitemenu", + "filename": "sitemenu.module" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "binder.control" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "docs/binder-1.png" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "docs/binder_schema.png" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "docs/g6685.png" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "docs/rigid-vs-fluid.html" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "docs/state_machines_and_metadata.html" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "docs/text1709.png" + } + ], + "ViewsPluginHandlerManagerRector": [ + { + "project_id": 1138, + "project_name": "project/calendar", + "filename": "src/CalendarHelper.php" + }, + { + "project_id": 2651, + "project_name": "project/trash", + "filename": "src/Hook/TrashViewsHooks.php" + }, + { + "project_id": 3635, + "project_name": "project/views_exclude_previous", + "filename": "tests/src/Kernel/EntityRenderHistoryPluginTest.php" + }, + { + "project_id": 3917, + "project_name": "project/heartbeat", + "filename": "heartbeat.views.inc" + }, + { + "project_id": 4638, + "project_name": "project/visitors", + "filename": "tests/src/Kernel/Plugin/views/field/BounceRateTest.php" + }, + { + "project_id": 4638, + "project_name": "project/visitors", + "filename": "tests/src/Kernel/Plugin/views/field/BounceTest.php" + }, + { + "project_id": 4638, + "project_name": "project/visitors", + "filename": "tests/src/Kernel/Plugin/views/field/RefererTypeTest.php" + }, + { + "project_id": 4957, + "project_name": "project/views_natural_sort", + "filename": "src/Plugin/views/sort/Natural.php" + }, + { + "project_id": 6922, + "project_name": "project/views_linkarea", + "filename": "tests/src/Kernel/Plugin/LinkAreaTest.php" + }, + { + "project_id": 8296, + "project_name": "project/relation", + "filename": "src/Plugin/views/relationship/RelationRelationship.php" + }, + { + "project_id": 9324, + "project_name": "project/recurly", + "filename": "src/Plugin/views/relationship/EntityOwner.php" + }, + { + "project_id": 9324, + "project_name": "project/recurly", + "filename": "src/Plugin/views/relationship/RecurlyEntityOwnerReverse.php" + }, + { + "project_id": 13349, + "project_name": "project/visualization", + "filename": "src/Plugin/VisualizationHandlerManager.php" + }, + { + "project_id": 14784, + "project_name": "project/past", + "filename": "modules/past_db/src/Plugin/views/filter/EventArgumentData.php" + }, + { + "project_id": 15268, + "project_name": "project/visualization_d8", + "filename": "lib/Drupal/visualization/Plugin/VisualizationHandlerManager.php" + }, + { + "project_id": 16912, + "project_name": "project/views_selective_filters", + "filename": "src/Plugin/views/filter/Selective.php" + }, + { + "project_id": 21439, + "project_name": "project/quick_pages", + "filename": "src/EventSubscriber/RouteSubscriber.php" + }, + { + "project_id": 21439, + "project_name": "project/quick_pages", + "filename": "src/Form/QuickPageForm.php" + }, + { + "project_id": 21452, + "project_name": "project/grant", + "filename": "src/Plugin/views/relationship/GrantReverseUuid.php" + }, + { + "project_id": 21452, + "project_name": "project/grant", + "filename": "src/Plugin/views/relationship/GrantStandardUuid.php" + }, + { + "project_id": 21683, + "project_name": "project/migrate_views", + "filename": "migrate_views.services.yml" + }, + { + "project_id": 21683, + "project_name": "project/migrate_views", + "filename": "src/EventSubscriber/MigrationViewsSubscriber.php" + }, + { + "project_id": 21683, + "project_name": "project/migrate_views", + "filename": "src/MigrateViewsPluginManager.php" + }, + { + "project_id": 21683, + "project_name": "project/migrate_views", + "filename": "src/Plugin/migrate/process/d6/ViewsDisplays.php" + }, + { + "project_id": 21827, + "project_name": "project/chartjs", + "filename": "src/Plugin/ChartjsHandlerManager.php" + }, + { + "project_id": 22692, + "project_name": "project/discussions", + "filename": "discussions.module" + }, + { + "project_id": 23284, + "project_name": "project/rel_content", + "filename": "src/Plugin/RelatedContent/GroupRelatedContent.php" + }, + { + "project_id": 23284, + "project_name": "project/rel_content", + "filename": "src/Plugin/RelatedContent/TaxonomyTermRelatedContent.php" + }, + { + "project_id": 25294, + "project_name": "project/pankm", + "filename": "modules/contrib/calendar/src/CalendarHelper.php" + }, + { + "project_id": 25294, + "project_name": "project/pankm", + "filename": "modules/contrib/group/src/Plugin/views/relationship/GroupContentToEntity.php" + }, + { + "project_id": 25294, + "project_name": "project/pankm", + "filename": "modules/contrib/group/src/Plugin/views/relationship/GroupContentToEntityBase.php" + }, + { + "project_id": 25294, + "project_name": "project/pankm", + "filename": "modules/contrib/group/src/Plugin/views/relationship/GroupContentToEntityReverse.php" + }, + { + "project_id": 25294, + "project_name": "project/pankm", + "filename": "modules/contrib/group/src/Plugin/views/relationship/GroupToGroupContent.php" + }, + { + "project_id": 25577, + "project_name": "project/dut", + "filename": "modules/views/src/Plugin/views/display_extender/ThemeSuggestionsDisplayExtender.php" + }, + { + "project_id": 25985, + "project_name": "project/entity_domain_access", + "filename": "src/Plugin/views/filter/EntityDomainAccessCurrentAllFilter.php" + }, + { + "project_id": 26713, + "project_name": "project/tally", + "filename": "src/Plugin/views/filter/TallyFilter.php" + }, + { + "project_id": 26869, + "project_name": "project/friendship", + "filename": "tests/src/Kernel/ViewsFieldsTest.php" + }, + { + "project_id": 27744, + "project_name": "project/lms", + "filename": "src/Plugin/views/filter/LmsOrphanFilter.php" + }, + { + "project_id": 27744, + "project_name": "project/lms", + "filename": "src/Plugin/views/relationship/ClassMemberCourseStatus.php" + }, + { + "project_id": 27952, + "project_name": "project/template_entities", + "filename": "src/ViewsQueryAlter.php" + }, + { + "project_id": 28029, + "project_name": "project/entity_grants", + "filename": "src/Plugin/views/filter/EntityGrant.php" + }, + { + "project_id": 34868, + "project_name": "project/islandora", + "filename": "src/Plugin/views/filter/NodeIsIslandora.php" + }, + { + "project_id": 47825, + "project_name": "project/entity_hierarchy", + "filename": "src/Plugin/views/relationship/HierarchyRoot.php" + }, + { + "project_id": 50565, + "project_name": "project/custom_list", + "filename": "modules/custom_list_default/src/Plugin/SourceListPlugin/DefaultSourceListPlugin.php" + }, + { + "project_id": 50565, + "project_name": "project/custom_list", + "filename": "src/Plugin/views/style/CustomListBase.php" + }, + { + "project_id": 51085, + "project_name": "project/workbench_moderation", + "filename": "src/Plugin/views/filter/LatestRevision.php" + }, + { + "project_id": 51217, + "project_name": "project/tide_core", + "filename": "modules/tide_site_restriction/src/Plugin/views/filter/SubSitesFilter.php" + }, + { + "project_id": 51358, + "project_name": "project/entity_reference_uuid", + "filename": "src/Plugin/views/relationship/EntityReverseUuid.php" + }, + { + "project_id": 51358, + "project_name": "project/entity_reference_uuid", + "filename": "src/Plugin/views/relationship/EntityStandardUuid.php" + }, + { + "project_id": 51380, + "project_name": "project/views_entity_embed", + "filename": "src/Plugin/EmbedType/EmbedViews.php" + }, + { + "project_id": 52158, + "project_name": "project/api", + "filename": "src/Plugin/views/filter/ServiceTags.php" + }, + { + "project_id": 52161, + "project_name": "project/og", + "filename": "src/Plugin/views/relationship/GroupByGroupContentRelationship.php" + }, + { + "project_id": 52161, + "project_name": "project/og", + "filename": "src/Plugin/views/relationship/GroupContentByGroupRelationship.php" + }, + { + "project_id": 52281, + "project_name": "project/civicrm_entity", + "filename": "src/Plugin/views/filter/ActivityContactRecord.php" + }, + { + "project_id": 52281, + "project_name": "project/civicrm_entity", + "filename": "src/Plugin/views/relationship/CiviCrmActivityContact.php" + }, + { + "project_id": 52281, + "project_name": "project/civicrm_entity", + "filename": "src/Plugin/views/relationship/CiviCrmBridgeRelationshipBase.php" + }, + { + "project_id": 52281, + "project_name": "project/civicrm_entity", + "filename": "src/Plugin/views/relationship/EntityReverseLocation.php" + }, + { + "project_id": 52281, + "project_name": "project/civicrm_entity", + "filename": "src/Plugin/views/relationship/EntityReverseWebsiteType.php" + }, + { + "project_id": 52646, + "project_name": "project/shopify", + "filename": "src/Plugin/views/argument/ShopifyCollectionsArgument.php" + }, + { + "project_id": 52646, + "project_name": "project/shopify", + "filename": "src/Plugin/views/argument/ShopifyTagsArgument.php" + }, + { + "project_id": 52646, + "project_name": "project/shopify", + "filename": "src/Plugin/views/filter/ShopifyCollectionsFilter.php" + }, + { + "project_id": 52646, + "project_name": "project/shopify", + "filename": "src/Plugin/views/filter/ShopifyTagsFilter.php" + }, + { + "project_id": 53222, + "project_name": "project/metatag", + "filename": "metatag_views/src/MetatagViewsCachePluginManager.php" + }, + { + "project_id": 53388, + "project_name": "project/config_pages", + "filename": "tests/src/Kernel/ConfigPagesViewsPluginTest.php" + }, + { + "project_id": 53533, + "project_name": "project/opigno_learning_path", + "filename": "src/Plugin/views/filter/OpignoGroupMembershipStatus.php" + }, + { + "project_id": 54935, + "project_name": "project/translation_views", + "filename": "src/Plugin/views/field/TranslationCountField.php" + }, + { + "project_id": 54935, + "project_name": "project/translation_views", + "filename": "src/Plugin/views/filter/TranslationCountFilter.php" + }, + { + "project_id": 54935, + "project_name": "project/translation_views", + "filename": "src/TranslationCountTrait.php" + }, + { + "project_id": 55687, + "project_name": "project/tmgmt_deepl", + "filename": "modules/tmgmt_deepl_glossary/src/Plugin/views/filter/DeeplGlossaryEntries.php" + }, + { + "project_id": 56320, + "project_name": "project/plugin", + "filename": "plugin.plugin_type.yml" + }, + { + "project_id": 56855, + "project_name": "project/tmgmt", + "filename": "translators/tmgmt_local/src/Plugin/views/field/ItemCount.php" + }, + { + "project_id": 58768, + "project_name": "project/rng", + "filename": "src/Plugin/views/field/EventDateStringField.php" + }, + { + "project_id": 58768, + "project_name": "project/rng", + "filename": "src/Plugin/views/filter/SingleDateFilter.php" + }, + { + "project_id": 59005, + "project_name": "project/social", + "filename": "modules/custom/activity_viewer/src/Plugin/views/filter/ActivityExploreVisibilityAccess.php" + }, + { + "project_id": 59005, + "project_name": "project/social", + "filename": "modules/custom/activity_viewer/src/Plugin/views/filter/ActivityNotificationVisibilityAccess.php" + }, + { + "project_id": 59005, + "project_name": "project/social", + "filename": "modules/custom/activity_viewer/src/Plugin/views/filter/ActivityPostVisibilityAccess.php" + }, + { + "project_id": 59005, + "project_name": "project/social", + "filename": "modules/custom/gvbo/src/Access/GroupViewsBulkOperationsAccessTrait.php" + }, + { + "project_id": 59005, + "project_name": "project/social", + "filename": "modules/social_features/social_activity/modules/social_activity_filter/src/Plugin/views/filter/ActivityFilterTags.php" + }, + { + "project_id": 59005, + "project_name": "project/social", + "filename": "modules/social_features/social_event/src/Plugin/views/filter/EventDate.php" + }, + { + "project_id": 59005, + "project_name": "project/social", + "filename": "modules/social_features/social_event/src/Plugin/views/filter/EventEnrolledOrCreated.php" + }, + { + "project_id": 59005, + "project_name": "project/social", + "filename": "modules/social_features/social_profile/src/Plugin/views/field/ProfileEntitySortable.php" + }, + { + "project_id": 59133, + "project_name": "project/entityqueue", + "filename": "src/Plugin/views/relationship/EntityQueueRelationship.php" + }, + { + "project_id": 59279, + "project_name": "project/searchstax", + "filename": ".ignored-deprecations.txt" + }, + { + "project_id": 59375, + "project_name": "project/private_message", + "filename": "src/Plugin/views/filter/PrivateMessageThreadCleanHistory.php" + }, + { + "project_id": 59375, + "project_name": "project/private_message", + "filename": "src/Plugin/views/filter/PrivateMessageThreadIsUnread.php" + }, + { + "project_id": 59514, + "project_name": "project/ctools", + "filename": "modules/ctools_views/src/Plugin/Display/Block.php" + }, + { + "project_id": 59586, + "project_name": "project/monster_menus", + "filename": "src/Plugin/views/argument/MMTreeChildren.php" + }, + { + "project_id": 59586, + "project_name": "project/monster_menus", + "filename": "src/Plugin/views/relationship/SequentialJoin.php" + }, + { + "project_id": 59610, + "project_name": "project/group", + "filename": "src/Plugin/views/relationship/GroupRelationshipToEntityBase.php" + }, + { + "project_id": 59610, + "project_name": "project/group", + "filename": "src/Plugin/views/relationship/GroupToGroupRelationship.php" + }, + { + "project_id": 59714, + "project_name": "project/thunder", + "filename": "docs/developer-guide/migration/migrate-2-3.md" + }, + { + "project_id": 59739, + "project_name": "project/geolocation", + "filename": "modules/geolocation_geometry/src/Plugin/views/relationship/GeolocationGeometry.php" + }, + { + "project_id": 59747, + "project_name": "project/cms_content_sync", + "filename": "modules/cms_content_sync_views/src/Plugin/views/filter/SyncState.php" + }, + { + "project_id": 59814, + "project_name": "project/search_api", + "filename": "src/Plugin/views/field/SearchApiEntityField.php" + }, + { + "project_id": 59843, + "project_name": "project/bat", + "filename": "modules/bat_event/src/Plugin/views/filter/BatEventHandlerBlockingFilter.php" + }, + { + "project_id": 59849, + "project_name": "project/cloud", + "filename": "cloud.module" + }, + { + "project_id": 59849, + "project_name": "project/cloud", + "filename": "modules/cloud_service_providers/k8s/src/Plugin/views/argument/K8sNodeId.php" + }, + { + "project_id": 59849, + "project_name": "project/cloud", + "filename": "modules/cloud_service_providers/k8s/src/Plugin/views/relationship/K8sCloudProject.php" + }, + { + "project_id": 59956, + "project_name": "project/communication", + "filename": "src/Plugin/views/relationship/CommunicationLatestEventRelationship.php" + }, + { + "project_id": 60395, + "project_name": "project/muser", + "filename": "modules/custom/muser_project/src/Plugin/views/argument/AllowedMentor.php" + }, + { + "project_id": 60395, + "project_name": "project/muser", + "filename": "modules/custom/muser_system/src/Plugin/views/filter/UserActiveInRoundFilter.php" + }, + { + "project_id": 60682, + "project_name": "project/delivery", + "filename": "src/Plugin/views/relationship/WorkspaceRevision.php" + }, + { + "project_id": 60682, + "project_name": "project/delivery", + "filename": "src/Plugin/views/traits/CurrentWorkspaceViewsFilterTrait.php" + }, + { + "project_id": 60682, + "project_name": "project/delivery", + "filename": "src/Plugin/views/traits/EntityDeliveryStatusTrait.php" + }, + { + "project_id": 60695, + "project_name": "project/pub_options", + "filename": "src/Plugin/views/argument/PublishingOptionsContextualFilter.php" + }, + { + "project_id": 60695, + "project_name": "project/pub_options", + "filename": "src/Plugin/views/field/PublishingOptionsField.php" + }, + { + "project_id": 60695, + "project_name": "project/pub_options", + "filename": "src/Plugin/views/filter/PublishingOptionsFilters.php" + }, + { + "project_id": 61073, + "project_name": "project/meta_entity", + "filename": "meta_entity.install" + }, + { + "project_id": 61449, + "project_name": "project/moderation_team", + "filename": "src/Plugin/views/argument/ModerationTeam.php" + }, + { + "project_id": 62128, + "project_name": "project/hubspot_integration", + "filename": "src/Plugin/views/argument/HubspotTidDepth.php" + }, + { + "project_id": 62128, + "project_name": "project/hubspot_integration", + "filename": "src/Plugin/views/sort/HubspotTerms.php" + }, + { + "project_id": 62790, + "project_name": "project/ezcontent_api", + "filename": "modules/ezcontent_preview/src/Plugin/views/filter/AccessUnpublishedToken.php" + }, + { + "project_id": 62842, + "project_name": "project/untatu", + "filename": "src/Plugin/views/filter/Untatu.php" + }, + { + "project_id": 63118, + "project_name": "project/dplor", + "filename": "modules/custom/dyniva_permission/src/Plugin/views/filter/DynivaPermission.php" + }, + { + "project_id": 63669, + "project_name": "project/ggroup", + "filename": "src/Plugin/views/argument/GroupIdDepth.php" + }, + { + "project_id": 63790, + "project_name": "project/taxonomy_parents_index", + "filename": "src/Plugin/views/relationship/TaxonomyIndexReverseToParents.php" + }, + { + "project_id": 65320, + "project_name": "project/multilingual_plus", + "filename": "src/Plugin/views/field/LangcodeOriginalLanguage.php" + }, + { + "project_id": 66086, + "project_name": "project/opendevportal", + "filename": "modules/custom/odp_program/modules/odp_domain/src/Plugin/views/filter/ProgramDomainFilterPlugin.php" + }, + { + "project_id": 66142, + "project_name": "project/basket", + "filename": "src/Plugin/views/field/BasketOrderPrice.php" + }, + { + "project_id": 66142, + "project_name": "project/basket", + "filename": "src/Plugin/views/field/BasketPriceField.php" + }, + { + "project_id": 66142, + "project_name": "project/basket", + "filename": "src/Plugin/views/filter/BasketCartSid.php" + }, + { + "project_id": 66142, + "project_name": "project/basket", + "filename": "src/Plugin/views/filter/BasketFilterTitleField.php" + }, + { + "project_id": 66142, + "project_name": "project/basket", + "filename": "src/Plugin/views/filter/BasketIsAddCart.php" + }, + { + "project_id": 66142, + "project_name": "project/basket", + "filename": "src/Plugin/views/filter/BasketOrderFilter.php" + }, + { + "project_id": 66142, + "project_name": "project/basket", + "filename": "src/Plugin/views/filter/BasketProductInStosk.php" + }, + { + "project_id": 66142, + "project_name": "project/basket", + "filename": "src/Plugin/views/sort/BasketProductInStock.php" + }, + { + "project_id": 66142, + "project_name": "project/basket", + "filename": "src/Query/BasketQuery.php" + }, + { + "project_id": 68321, + "project_name": "project/views_migration", + "filename": "src/Plugin/MigrateViewsBaseTablePluginManager.php" + }, + { + "project_id": 68321, + "project_name": "project/views_migration", + "filename": "src/Plugin/MigrateViewsPluginManager.php" + }, + { + "project_id": 68321, + "project_name": "project/views_migration", + "filename": "src/Plugin/MigrateViewsPluginPluginManager.php" + }, + { + "project_id": 68321, + "project_name": "project/views_migration", + "filename": "src/Plugin/migrate/source/BaseViewsMigration.php" + }, + { + "project_id": 68321, + "project_name": "project/views_migration", + "filename": "src/Plugin/migrate/source/ViewsMigrationInterface.php" + }, + { + "project_id": 72178, + "project_name": "project/field_encrypt_searchable", + "filename": "src/Plugin/views/filter/EncryptedFieldViewsFilter.php" + }, + { + "project_id": 73073, + "project_name": "project/opigno_social", + "filename": "src/Plugin/views/filter/BadgeNameFilter.php" + }, + { + "project_id": 74275, + "project_name": "project/views_override_viewmode", + "filename": "src/Plugin/Display/Block.php" + }, + { + "project_id": 78499, + "project_name": "project/usage_data", + "filename": "src/Plugin/views/field/UsageDataField.php" + }, + { + "project_id": 78499, + "project_name": "project/usage_data", + "filename": "src/Plugin/views/sort/UsageDataSort.php" + }, + { + "project_id": 84617, + "project_name": "project/acquia_dam", + "filename": "src/Plugin/views/field/AvailabilityPublishingStatusCompare.php" + }, + { + "project_id": 84617, + "project_name": "project/acquia_dam", + "filename": "src/Plugin/views/field/DamAssetUsageCounter.php" + }, + { + "project_id": 84617, + "project_name": "project/acquia_dam", + "filename": "src/Plugin/views/filter/DamAssetFilter.php" + }, + { + "project_id": 86013, + "project_name": "project/content_moderation_node_grants", + "filename": "src/Plugin/views/filter/UpdatableFilter.php" + }, + { + "project_id": 87638, + "project_name": "project/group_entity", + "filename": "src/Plugin/views/relationship/GroupContentToEntityBase.php" + }, + { + "project_id": 87638, + "project_name": "project/group_entity", + "filename": "src/Plugin/views/relationship/GroupToGroupContent.php" + }, + { + "project_id": 88438, + "project_name": "project/entity_distribution", + "filename": "modules/entity_distribution_client/src/Plugin/views/filter/EntitySharedSource.php" + }, + { + "project_id": 88882, + "project_name": "project/group_domain", + "filename": "src/Plugin/views/filter/DomainGroupCurrentGroup.php" + }, + { + "project_id": 96166, + "project_name": "project/media_filter", + "filename": "src/Plugin/views/filter/MediaFilterEntity.php" + }, + { + "project_id": 96282, + "project_name": "project/access_policy", + "filename": "src/Plugin/views/AccessPolicyJoinViewsHandlerTrait.php" + }, + { + "project_id": 98695, + "project_name": "project/social_group_types", + "filename": "src/Plugin/views/filter/SocialGroupTypesGroupNodeAccess.php" + }, + { + "project_id": 107494, + "project_name": "project/group_welcome_message", + "filename": "src/Plugin/views/relationship/GroupWelcomeMessageRelationship.php" + }, + { + "project_id": 108783, + "project_name": "project/views_moderation_state_weights", + "filename": "src/Plugin/views/ModerationStateWeightJoinViewsHandlerTrait.php" + }, + { + "project_id": 109268, + "project_name": "project/group_media_library_extra", + "filename": "src/MediaItemsSource/MediaItemsSourceBase.php" + }, + { + "project_id": 109268, + "project_name": "project/group_media_library_extra", + "filename": "src/MediaLibraryWidgetViewsQueryAlter.php" + }, + { + "project_id": 109268, + "project_name": "project/group_media_library_extra", + "filename": "src/Plugin/GroupMediaLibraryExtra/MediaItemsSource/OwnMediaItems.php" + }, + { + "project_id": 109993, + "project_name": "project/social_lms_integrator", + "filename": "modules/social_lms_integrator_iteration_enrollment_notify/src/Plugin/views/relationship/IterationWelcomeMessageRelationship.php" + }, + { + "project_id": 110398, + "project_name": "project/views_sql_twig_fields", + "filename": "modules/views_sql_twig_relationship/src/Plugin/views/relationship/ViewsSqlTwigFieldsRelationship.php" + }, + { + "project_id": 116041, + "project_name": "project/nodehive_core", + "filename": "src/Plugin/views/filter/UserSpacesFilter.php" + }, + { + "project_id": 124420, + "project_name": "project/service", + "filename": "src/JoinManagerTrait.php" + }, + { + "project_id": 128959, + "project_name": "project/view_filter_promotion", + "filename": "view_filter_promotion.module" + }, + { + "project_id": 144795, + "project_name": "project/expirable_content", + "filename": "src/Plugin/views/ExpirableContentJoinViewsHandlerTrait.php" + }, + { + "project_id": 145116, + "project_name": "project/diboo_core", + "filename": "src/Hook/FinishedChains.php" + }, + { + "project_id": 147502, + "project_name": "project/media_views_filter", + "filename": "src/Plugin/views/filter/MediaFileNameFilter.php" + }, + { + "project_id": 151194, + "project_name": "project/a12s_locations", + "filename": "a12s_locations.module" + }, + { + "project_id": 151194, + "project_name": "project/a12s_locations", + "filename": "src/Commands/A12sLocationsCommands.php" + }, + { + "project_id": 151194, + "project_name": "project/a12s_locations", + "filename": "src/Form/CacheUpdateConfirmForm.php" + }, + { + "project_id": 152311, + "project_name": "project/more_fields", + "filename": "src/Plugin/views/filter/MoreFieldsBaseFilter.php" + }, + { + "project_id": 154509, + "project_name": "project/consent_management", + "filename": "src/Plugin/views/filter/ConsentStateFilter.php" + }, + { + "project_id": 158891, + "project_name": "project/ai_agents", + "filename": "modules/ai_agents_extra/src/Plugin/AiAgent/ViewsAgent.php" + }, + { + "project_id": 161548, + "project_name": "project/mdp", + "filename": "src/Plugin/views/filter/MDPFilter.php" + }, + { + "project_id": 176774, + "project_name": "project/unused_files_delete", + "filename": "src/Plugin/views/filter/UnusedFileFilter.php" + }, + { + "project_id": 179884, + "project_name": "project/unused_media_filter", + "filename": "src/Plugin/views/filter/UnusedMediaFilter.php" + }, + { + "project_id": 181203, + "project_name": "project/json_drop_api", + "filename": "modules/contrib/ctools/modules/ctools_views/src/Plugin/Display/Block.php" + }, + { + "project_id": 181203, + "project_name": "project/json_drop_api", + "filename": "modules/contrib/metatag/metatag_views/src/MetatagViewsCachePluginManager.php" + }, + { + "project_id": 203641, + "project_name": "project/itunes_rss", + "filename": "tests/src/Kernel/ItunesRssPluginDiscoveryTest.php" + } + ], + "ReplaceModuleHandlerGetNameRector": [ + { + "project_id": 1568, + "project_name": "project/schema", + "filename": "src/SchemaModuleHandler.php" + }, + { + "project_id": 9292, + "project_name": "project/flow", + "filename": "src/Helpers/ModuleHandlerTrait.php" + }, + { + "project_id": 16100, + "project_name": "project/disable_modules", + "filename": "src/Extension/ModuleInstallerDisableModules.php" + }, + { + "project_id": 16108, + "project_name": "project/hookalyzer", + "filename": "lib/Drupal/hookalyzer/ModuleHandler.php" + }, + { + "project_id": 17443, + "project_name": "project/console", + "filename": "src/Command/Update/ExecuteCommand.php" + }, + { + "project_id": 18842, + "project_name": "project/service_container", + "filename": "lib/Drupal/service_container/Tests/ModuleHandlerTest.php" + }, + { + "project_id": 20087, + "project_name": "project/hooks", + "filename": "src/ModuleHandler.php" + }, + { + "project_id": 21156, + "project_name": "project/rocket_chat", + "filename": "modules/rocket_chat_api/src/RocketChat/Drupal8Config.php" + }, + { + "project_id": 21156, + "project_name": "project/rocket_chat", + "filename": "modules/rocket_chat_api_test/src/Form/ApiTestForm.php" + }, + { + "project_id": 21156, + "project_name": "project/rocket_chat", + "filename": "modules/rocket_chat_group/src/Plugin/Block/RocketChatChannelBlock.php" + }, + { + "project_id": 21609, + "project_name": "project/confi", + "filename": "src/ConfigImporterService.php" + }, + { + "project_id": 23010, + "project_name": "project/message_private", + "filename": "src/Plugin/Block/MessageHistory.php" + }, + { + "project_id": 23034, + "project_name": "project/pki_ra", + "filename": "src/Plugin/EoiProgress/EoiSourcesProgressManager.php" + }, + { + "project_id": 23354, + "project_name": "project/commerce_currency_switcher", + "filename": "src/Resolver/MulticurrencyPriceResolver.php" + }, + { + "project_id": 23726, + "project_name": "project/entity_keyvalue", + "filename": "src/EntityKeyValueStoreProvider.php" + }, + { + "project_id": 24064, + "project_name": "project/social_media_integration", + "filename": "src/Form/GooglePlusSettingsForm.php" + }, + { + "project_id": 24064, + "project_name": "project/social_media_integration", + "filename": "src/Form/LinkedInSettingsForm.php" + }, + { + "project_id": 24064, + "project_name": "project/social_media_integration", + "filename": "src/Form/PinterestSettingsForm.php" + }, + { + "project_id": 24064, + "project_name": "project/social_media_integration", + "filename": "src/Form/SjiSocialConnectSettingsForm.php" + }, + { + "project_id": 24220, + "project_name": "project/message_thread", + "filename": "src/Plugin/Block/MessageThreadHistory.php" + }, + { + "project_id": 24364, + "project_name": "project/domain_simple_sitemap", + "filename": "src/DomainSimpleSitemapGenerator.php" + }, + { + "project_id": 24420, + "project_name": "project/razoreye_biz", + "filename": "modules/contrib/simple_sitemap/src/Plugin/simple_sitemap/UrlGenerator/ArbitraryUrlGenerator.php" + }, + { + "project_id": 24449, + "project_name": "project/ppoidc", + "filename": "src/Claims.php" + }, + { + "project_id": 25315, + "project_name": "project/auto_alter", + "filename": "src/Form/AutoAlterSettingsForm.php" + }, + { + "project_id": 25865, + "project_name": "project/image_moderate", + "filename": "src/Form/ImageModerateSettingsForm.php" + }, + { + "project_id": 26017, + "project_name": "project/hook_manager", + "filename": "src/Service/HookManagerModuleHandler.php" + }, + { + "project_id": 27005, + "project_name": "project/social_post_video", + "filename": "src/Plugin/Block/PostVideoBlock.php" + }, + { + "project_id": 27005, + "project_name": "project/social_post_video", + "filename": "src/Plugin/Block/PostVideoGroupBlock.php" + }, + { + "project_id": 27005, + "project_name": "project/social_post_video", + "filename": "src/Plugin/Block/PostVideoProfileBlock.php" + }, + { + "project_id": 27712, + "project_name": "project/client_config_care", + "filename": "tests/src/Behat/context/ModuleContext.php" + }, + { + "project_id": 27845, + "project_name": "project/social_auth_itsme", + "filename": "src/ItsmeAuthManager.php" + }, + { + "project_id": 34868, + "project_name": "project/islandora", + "filename": "src/Plugin/Action/IndexMediasParentNodeInSearchApi.php" + }, + { + "project_id": 34868, + "project_name": "project/islandora", + "filename": "src/Plugin/Action/IndexNodeInSearchApi.php" + }, + { + "project_id": 47231, + "project_name": "project/module_maker", + "filename": "src/CreateFiles.php" + }, + { + "project_id": 49470, + "project_name": "project/config_entity_revisions", + "filename": "src/ConfigEntityRevisionsOverviewFormBase.php" + }, + { + "project_id": 49470, + "project_name": "project/config_entity_revisions", + "filename": "src/ConfigEntityRevisionsOverviewFormBaseInterface.php" + }, + { + "project_id": 49723, + "project_name": "project/mutual_credit", + "filename": "modules/credcom/src/Form/SettingsForm.php" + }, + { + "project_id": 49725, + "project_name": "project/drd", + "filename": "src/Crypt/BaseMethod.php" + }, + { + "project_id": 50434, + "project_name": "project/slack_receive", + "filename": "src/Plugin/rest/resource/SlashCommandResponse.php" + }, + { + "project_id": 51352, + "project_name": "project/autosave_form", + "filename": "src/EmptyAlter/Extension/ModuleHandlerEmptyAlter.php" + }, + { + "project_id": 51772, + "project_name": "project/onlyone", + "filename": "src/OnlyOneModuleHandler.php" + }, + { + "project_id": 54247, + "project_name": "project/contacts", + "filename": "modules/user_dashboard/src/Controller/UserDashboardController.php" + }, + { + "project_id": 54247, + "project_name": "project/contacts", + "filename": "modules/user_dashboard/src/Plugin/Derivative/UserDashboardLocalTask.php" + }, + { + "project_id": 55697, + "project_name": "project/acquia_commercemanager", + "filename": "modules/acm_sku/src/CategoryManager.php" + }, + { + "project_id": 55755, + "project_name": "project/social_hub", + "filename": "src/Utils/ModuleLibrariesResolver.php" + }, + { + "project_id": 56359, + "project_name": "project/languagefield", + "filename": "src/Plugin/Field/FieldFormatter/LanguageFormatter.php" + }, + { + "project_id": 56719, + "project_name": "project/multiversion", + "filename": "src/Entity/Storage/Sql/NodeStorage.php" + }, + { + "project_id": 56719, + "project_name": "project/multiversion", + "filename": "src/EventSubscriber/FileUsageMigrateSubscriber.php" + }, + { + "project_id": 58193, + "project_name": "project/tripal", + "filename": "tripal_chado/src/Services/ChadoFieldDebugger.php" + }, + { + "project_id": 58608, + "project_name": "project/lightning_core", + "filename": "modules/lightning_page/tests/src/Kernel/InstallTest.php" + }, + { + "project_id": 59035, + "project_name": "project/lightning_layout", + "filename": "modules/lightning_landing_page/tests/src/Kernel/InstallTest.php" + }, + { + "project_id": 59179, + "project_name": "project/nbox", + "filename": "modules/nbox_ui/src/Form/ThreadActionForm.php" + }, + { + "project_id": 59179, + "project_name": "project/nbox", + "filename": "src/Plugin/MailboxBase.php" + }, + { + "project_id": 59503, + "project_name": "project/degov", + "filename": "modules/degov_social_media_instagram/src/Plugin/Block/InstagramFeedBlock.php" + }, + { + "project_id": 60502, + "project_name": "project/simplifying", + "filename": "src/Services/EntityFields.php" + }, + { + "project_id": 60502, + "project_name": "project/simplifying", + "filename": "src/Services/Toolbar.php" + }, + { + "project_id": 60625, + "project_name": "project/gearbox", + "filename": "src/Extension/HandlerFactory.php" + }, + { + "project_id": 61069, + "project_name": "project/audit_monitoring", + "filename": "src/Plugin/monitoring/SensorPlugin/MaillogConfig.php" + }, + { + "project_id": 61092, + "project_name": "project/views_extender", + "filename": "modules/views_extender_eca/src/Plugin/views/argument_default/ArgumentDefaultEca.php" + }, + { + "project_id": 62017, + "project_name": "project/nodeinfo", + "filename": "src/Controller/NodeInfoController.php" + }, + { + "project_id": 62418, + "project_name": "project/pager_serializer", + "filename": "tests/src/Unit/Plugin/views/style/SerializerTest.php" + }, + { + "project_id": 62421, + "project_name": "project/sitemorse_lite", + "filename": "src/Sitemorse/Checker.php" + }, + { + "project_id": 62687, + "project_name": "project/workflow_extras", + "filename": "src/Plugin/Block/ContentModerationBlock.php" + }, + { + "project_id": 62772, + "project_name": "project/file_update", + "filename": "src/Plugin/FileUpdate/FileUpdateImageField.php" + }, + { + "project_id": 63108, + "project_name": "project/licenses", + "filename": "src/Plugin/License/Scanner/ModuleLibraries.php" + }, + { + "project_id": 63559, + "project_name": "project/layoutcomponents", + "filename": "src/LcPage.php" + }, + { + "project_id": 63797, + "project_name": "project/eventer", + "filename": "src/Decorator/ModuleHandlerDecorator.php" + }, + { + "project_id": 63976, + "project_name": "project/simple_oauth_facebook_connect", + "filename": "src/Plugin/Oauth2Grant/Facebook.php" + }, + { + "project_id": 64084, + "project_name": "project/entity_track", + "filename": "src/EntityTrackManager.php" + }, + { + "project_id": 64348, + "project_name": "project/simple_oauth_google_connect", + "filename": "src/Plugin/Oauth2Grant/Google.php" + }, + { + "project_id": 64520, + "project_name": "project/robolytix", + "filename": "src/Form/RobolytixAdminSettingsForm.php" + }, + { + "project_id": 66091, + "project_name": "project/rmkv", + "filename": "src/Commands/RemoveKeyValueCommands.php" + }, + { + "project_id": 66142, + "project_name": "project/basket", + "filename": "src/ModuleHandler.php" + }, + { + "project_id": 69687, + "project_name": "project/sanitize_pii", + "filename": "src/Commands/sql/SanitizeTelephoneCommands.php" + }, + { + "project_id": 69954, + "project_name": "project/date_augmenter", + "filename": "src/Plugin/ConfigurablePluginBase.php" + }, + { + "project_id": 73212, + "project_name": "project/worldmap", + "filename": "src/MapHelper.php" + }, + { + "project_id": 73813, + "project_name": "project/toast_messages", + "filename": "src/ToastMessagesManager.php" + }, + { + "project_id": 81033, + "project_name": "project/cookies_module_handler", + "filename": "cookies_module_handler.module" + }, + { + "project_id": 81278, + "project_name": "project/migrate_visualize", + "filename": "src/Controller/ListingController.php" + }, + { + "project_id": 81278, + "project_name": "project/migrate_visualize", + "filename": "src/Form/VisualizeMigrationSwitcherForm.php" + }, + { + "project_id": 82252, + "project_name": "project/reassign_user_content", + "filename": "src/Form/AssignAuthorForm.php" + }, + { + "project_id": 82962, + "project_name": "project/hook_event", + "filename": "src/Extension/ModuleHandler.php" + }, + { + "project_id": 83449, + "project_name": "project/sitewide_alerts", + "filename": "src/SiteAlertService.php" + }, + { + "project_id": 86809, + "project_name": "project/social_auth_tiktok_decouple", + "filename": "src/Plugin/Oauth2Grant/Tiktok.php" + }, + { + "project_id": 86956, + "project_name": "project/social_auth_apple_decouple", + "filename": "src/Plugin/Oauth2Grant/Apple.php" + }, + { + "project_id": 88384, + "project_name": "project/uninstall_unexisting", + "filename": "src/Service/ModuleHandlerOverride.php" + }, + { + "project_id": 92961, + "project_name": "project/asset_autoload", + "filename": "src/SuggestionHelper.php" + }, + { + "project_id": 93199, + "project_name": "project/function_autoload", + "filename": "src/FunctionAutoloader.php" + }, + { + "project_id": 93499, + "project_name": "project/test_helpers", + "filename": "src/Stub/ModuleHandlerStub.php" + }, + { + "project_id": 104004, + "project_name": "project/ws_event", + "filename": "src/EventDataHelper.php" + }, + { + "project_id": 105011, + "project_name": "project/nostr_id_nip05", + "filename": "src/Controller/NostrIdNip05Controller.php" + }, + { + "project_id": 110798, + "project_name": "project/hook_profiler", + "filename": "src/HookProfilerModuleHandler.php" + }, + { + "project_id": 115956, + "project_name": "project/pwbi", + "filename": "modules/pwbi_banner/src/DisclaimerBanner.php" + }, + { + "project_id": 124420, + "project_name": "project/service", + "filename": "src/ModuleHandlerTrait.php" + }, + { + "project_id": 132406, + "project_name": "project/nitropack", + "filename": "src/Form/ConfigForm.php" + }, + { + "project_id": 162094, + "project_name": "project/localist_drupal", + "filename": "src/Controller/LocalistExample.php" + }, + { + "project_id": 166002, + "project_name": "project/bibliocommons", + "filename": "src/Plugin/Field/FieldFormatter/BookListFormatter.php" + }, + { + "project_id": 170818, + "project_name": "project/ai_upgrade_assistant", + "filename": "src/Controller/UpdateController.php" + }, + { + "project_id": 180259, + "project_name": "project/schema_form", + "filename": "tests/modules/schema_form_test/src/Form/BlockContentTypeForm.php" + }, + { + "project_id": 190652, + "project_name": "project/orchestration", + "filename": "modules/ai_function/src/ServicesProvider.php" + } + ], + "ReplaceRebuildThemeDataRector": [ + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "CREDITS.TXT" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "DICTIONARY.TXT" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "aggregator-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "archive-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "block-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "blog-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "blogapi-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "book-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "color-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "comment-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "common-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "contact-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "content_types-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "drupal-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "file-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "filter-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "form-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "forum-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "general.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "installer.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "locale-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "locale-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "menu-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "node-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "outros_modulos/gsitemap/gsitemap-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "outros_modulos/service_links/service_links-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "path-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "poll-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "profile-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "search-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "statistics-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "system-install.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "system-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "taxonomy-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "theme-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "throttle-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "tracker-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "unicode-inc.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "upload-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "user-module.po" + }, + { + "project_id": 284, + "project_name": "project/pt-br", + "filename": "watchdog-module.po" + }, + { + "project_id": 289, + "project_name": "project/livediscussions", + "filename": "live_discussions.module" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "arrow-next-hover.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "arrow-prev-hover.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "arrow-prev.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "arrow-up-hover.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "background.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "block.tpl.php" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "box.tpl.php" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "forum-container.jpg" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "forum-link.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "header-a.jpg" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "icon-block.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "logo-active.jpg" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "logo.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "node.tpl.php" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "style.css" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "tabs-off.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "tabs-on.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "tabs-option-hover.png" + }, + { + "project_id": 294, + "project_name": "project/pushbutton_phptemplate", + "filename": "tabs-option-on.png" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "README.txt" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "archive-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "block-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "blogapi-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "book-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "common-inc.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "drupal-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "file-inc.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "locale-inc.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "locale-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "menu-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "node-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "poll-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "profile-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "search-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "statistics-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "story-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "system-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "taxonomy-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "throttle-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "upload-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "user-module.po" + }, + { + "project_id": 301, + "project_name": "project/bg", + "filename": "watchdog-module.po" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "README.txt" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "ma_blogit/README.txt" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "ma_blogit/ma_blogit.module" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "ma_bzip2/ma_bzip2.module" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "ma_gzip/README.txt" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "ma_gzip/ma_gzip.module" + }, + { + "project_id": 303, + "project_name": "project/mail_archive", + "filename": "mail_archive.mysql" + }, + { + "project_id": 310, + "project_name": "project/sitemenu", + "filename": "sitemenu.info" + }, + { + "project_id": 310, + "project_name": "project/sitemenu", + "filename": "sitemenu.module" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "binder.control" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "docs/binder-1.png" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "docs/binder_schema.png" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "docs/g6685.png" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "docs/rigid-vs-fluid.html" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "docs/state_machines_and_metadata.html" + }, + { + "project_id": 316, + "project_name": "project/binder", + "filename": "docs/text1709.png" + } + ], + "ReplaceRequestTimeConstantRector": [ + { + "project_id": 191, + "project_name": "project/inactive_user", + "filename": "inactive_user.module" + }, + { + "project_id": 1005, + "project_name": "project/node_expire", + "filename": "node_expire.rules.inc" + }, + { + "project_id": 1952, + "project_name": "project/one_time_login", + "filename": "views/views_handler_field_one_time_login_expiry.inc" + }, + { + "project_id": 1978, + "project_name": "project/brilliant_gallery", + "filename": "brilliant_gallery_cron.inc" + }, + { + "project_id": 6870, + "project_name": "project/settings_audit_log", + "filename": "settings_audit_log.module" + }, + { + "project_id": 7310, + "project_name": "project/views_content_cache", + "filename": "views/views_content_cache_plugin_cache.inc" + }, + { + "project_id": 8618, + "project_name": "project/cache_backport", + "filename": "patches/memcache.inc-7.x-1.0-beta3-variable_set.patch" + }, + { + "project_id": 10594, + "project_name": "project/node_announce", + "filename": "node_announce_api.inc" + }, + { + "project_id": 10594, + "project_name": "project/node_announce", + "filename": "tests/node_announce_create.test" + }, + { + "project_id": 10594, + "project_name": "project/node_announce", + "filename": "tests/node_announce_cron.test" + }, + { + "project_id": 11394, + "project_name": "project/context_date", + "filename": "context_date.test" + }, + { + "project_id": 11565, + "project_name": "project/ua_cache_bypass", + "filename": "drush/ua_cache_bypass.drush.inc" + }, + { + "project_id": 11635, + "project_name": "project/shareaholic", + "filename": "cache.php" + }, + { + "project_id": 12520, + "project_name": "project/engagement", + "filename": "engagement.test" + }, + { + "project_id": 13021, + "project_name": "project/adbc", + "filename": "adbc.cache.inc" + }, + { + "project_id": 13021, + "project_name": "project/adbc", + "filename": "adbc.test" + }, + { + "project_id": 13111, + "project_name": "project/ddcla", + "filename": "public/includes/session.inc" + }, + { + "project_id": 13125, + "project_name": "project/transcribe_distribution", + "filename": "includes/session.inc" + }, + { + "project_id": 13452, + "project_name": "project/memory_profiler", + "filename": "memcache_profiler.inc" + }, + { + "project_id": 13458, + "project_name": "project/random_weight", + "filename": "includes/frequencies.inc" + }, + { + "project_id": 13628, + "project_name": "project/wem", + "filename": "wem.test" + }, + { + "project_id": 13635, + "project_name": "project/commerce_booking", + "filename": "commerce_booking.queue.inc" + }, + { + "project_id": 13758, + "project_name": "project/geckoboard_push", + "filename": "geckoboard_push.module" + }, + { + "project_id": 14446, + "project_name": "project/tr_kurulum", + "filename": "includes/session.inc" + }, + { + "project_id": 14506, + "project_name": "project/tb_blog_starter", + "filename": "includes/session.inc" + }, + { + "project_id": 14507, + "project_name": "project/tb_events_starter", + "filename": "includes/session.inc" + }, + { + "project_id": 14510, + "project_name": "project/tb_methys_starter", + "filename": "includes/session.inc" + }, + { + "project_id": 14511, + "project_name": "project/tb_mollise_starter", + "filename": "includes/session.inc" + }, + { + "project_id": 14513, + "project_name": "project/tb_palicico_starter", + "filename": "includes/session.inc" + }, + { + "project_id": 14514, + "project_name": "project/tb_purity_starter", + "filename": "includes/session.inc" + }, + { + "project_id": 14515, + "project_name": "project/tb_rave_starter", + "filename": "includes/session.inc" + }, + { + "project_id": 14522, + "project_name": "project/tb_sirate_starter", + "filename": "includes/session.inc" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "includes/session.inc" + }, + { + "project_id": 15002, + "project_name": "project/fts", + "filename": "fts.module" + }, + { + "project_id": 15291, + "project_name": "project/fluxservice", + "filename": "lib/Drupal/fluxservice/KeyValueStore/DatabaseStorageExpirable.php" + }, + { + "project_id": 15487, + "project_name": "project/optimizedb", + "filename": "optimizedb.test" + }, + { + "project_id": 16052, + "project_name": "project/pax_content", + "filename": "pax_content.module" + }, + { + "project_id": 16192, + "project_name": "project/mobilearkickstart", + "filename": "includes/session.inc" + }, + { + "project_id": 17013, + "project_name": "project/fuse", + "filename": "includes/session.inc" + }, + { + "project_id": 17399, + "project_name": "project/new_relic_insights", + "filename": "src/InsightRemoteEntityQuery.inc" + }, + { + "project_id": 17814, + "project_name": "project/db_remote", + "filename": "src/RemoteSystemQueue.php" + }, + { + "project_id": 17872, + "project_name": "project/acquia_search_config", + "filename": "lib/Drupal/Apachesolr/acquia_search_config.apachesolr.inc" + }, + { + "project_id": 18163, + "project_name": "project/commerce_priceminister", + "filename": "includes/commerce_priceminister_product_queue.inc" + }, + { + "project_id": 18292, + "project_name": "project/uc_abandoned", + "filename": "uc_abandoned_cart/uc_abandoned_cart.module" + }, + { + "project_id": 18559, + "project_name": "project/govbr", + "filename": "includes/session.inc" + }, + { + "project_id": 18763, + "project_name": "project/quizz", + "filename": "src/Generator/ResultGenerator.php" + }, + { + "project_id": 18897, + "project_name": "project/qurandistribution", + "filename": "includes/session.inc" + }, + { + "project_id": 19677, + "project_name": "project/priority_queue", + "filename": "PriorityQueue.php" + }, + { + "project_id": 19746, + "project_name": "project/social_feed_field", + "filename": "modules/social_feed_field_facebook/includes/social_feed_field.facebook.inc" + }, + { + "project_id": 19746, + "project_name": "project/social_feed_field", + "filename": "modules/social_feed_field_gplus/includes/social_feed_field.gplus.inc" + }, + { + "project_id": 19847, + "project_name": "project/commerce_order_reminder", + "filename": "commerce_order_reminder.module" + }, + { + "project_id": 19970, + "project_name": "project/entity_gallery", + "filename": "src/Tests/Views/EntityGalleryRevisionWizardTest.php" + }, + { + "project_id": 20330, + "project_name": "project/tagged_systemqueue", + "filename": "tagged_systemqueue.queue.inc" + }, + { + "project_id": 20381, + "project_name": "project/future_nodes", + "filename": "tests/future_nodes.test" + }, + { + "project_id": 20588, + "project_name": "project/motionpoint", + "filename": "motionpoint.cron.inc" + }, + { + "project_id": 20990, + "project_name": "project/development", + "filename": "includes/session.inc" + }, + { + "project_id": 21023, + "project_name": "project/couchbasedrupal", + "filename": "src/Flood/CouchbaseBackend.php" + }, + { + "project_id": 21067, + "project_name": "project/supercache", + "filename": "src/Cache/RequestTimeTrait.php" + }, + { + "project_id": 21127, + "project_name": "project/freshdesk_sso", + "filename": "src/AuthenticationService.php" + }, + { + "project_id": 23470, + "project_name": "project/gp_reviews", + "filename": "includes/session.inc" + }, + { + "project_id": 24128, + "project_name": "project/drush_async_api", + "filename": "includes/DrushAsyncApiQueue.inc" + }, + { + "project_id": 24357, + "project_name": "project/gitinfo", + "filename": "gitinfo.module" + }, + { + "project_id": 25336, + "project_name": "project/uc_recently_viewed_products", + "filename": "uc_recently_viewed_products.module" + }, + { + "project_id": 25437, + "project_name": "project/sendinblue_rules", + "filename": "includes/sendinblue_rules.list.inc" + }, + { + "project_id": 25713, + "project_name": "project/authtoken", + "filename": "tests/authtoken.test" + }, + { + "project_id": 25896, + "project_name": "project/byu_installation_profile", + "filename": "includes/session.inc" + }, + { + "project_id": 50151, + "project_name": "project/entity_translation", + "filename": "includes/translation.migrate.inc" + }, + { + "project_id": 50362, + "project_name": "project/election", + "filename": "election_cron/election_cron.module" + }, + { + "project_id": 50362, + "project_name": "project/election", + "filename": "tests/ElectionCrudTestCase.test" + }, + { + "project_id": 51249, + "project_name": "project/amazon", + "filename": "includes/views_handler_field_amazon_date.inc" + }, + { + "project_id": 51850, + "project_name": "project/anonymous_publishing", + "filename": "anonymous_publishing.module" + }, + { + "project_id": 52126, + "project_name": "project/preserve_changed", + "filename": "src/PreservedChangedItem.php" + }, + { + "project_id": 54115, + "project_name": "project/course", + "filename": "tests/CourseAccessTestCase.test" + }, + { + "project_id": 55014, + "project_name": "project/performance_toolkit", + "filename": "performance_toolkit.install" + }, + { + "project_id": 55014, + "project_name": "project/performance_toolkit", + "filename": "plugins/ptoolkit/PerformanceToolkitInsertsQueries.inc" + }, + { + "project_id": 55697, + "project_name": "project/acquia_commercemanager", + "filename": "modules/acm/tests/src/Unit/PhpSessionStoreTest.php" + }, + { + "project_id": 56975, + "project_name": "project/d6lts", + "filename": "common/contrib/legal/SA-CONTRIB-2017-036.patch" + }, + { + "project_id": 57777, + "project_name": "project/google_analytics_counter", + "filename": "tests/src/Kernel/GoogleAnalyticsCounterQueueTest.php" + }, + { + "project_id": 57971, + "project_name": "project/automatic_updates", + "filename": "tests/modules/automatic_updates_test/src/EventSubscriber/RequestTimeRecorder.php" + }, + { + "project_id": 58220, + "project_name": "project/wim", + "filename": "modules/features/sduconnect/sduconnect.utils.inc" + }, + { + "project_id": 59781, + "project_name": "project/computed_field", + "filename": "tests/modules/test_computed_field_output/src/Plugin/ComputedField/TestRequestTime.php" + }, + { + "project_id": 59781, + "project_name": "project/computed_field", + "filename": "tests/modules/test_computed_field_plugins/src/Plugin/ComputedField/TestRequestTime.php" + }, + { + "project_id": 60013, + "project_name": "project/participatory_process", + "filename": "src/Utility/ParticipationHelper.php" + }, + { + "project_id": 60038, + "project_name": "project/conference_suite", + "filename": "forms/includes/ConferenceFormsStepBase.php" + }, + { + "project_id": 60837, + "project_name": "project/virtualcare", + "filename": "modules/contrib/message/tests/src/Kernel/Plugin/MessagePurge/DaysTest.php" + }, + { + "project_id": 61877, + "project_name": "project/clockify", + "filename": "clockify.module" + }, + { + "project_id": 62378, + "project_name": "project/drupalru_d7", + "filename": "includes/session.inc" + }, + { + "project_id": 62728, + "project_name": "project/sri", + "filename": "src/JsCollectionRenderer.php" + }, + { + "project_id": 63624, + "project_name": "project/ubershopwish", + "filename": "includes/session.inc" + }, + { + "project_id": 93001, + "project_name": "project/queue_scheduler", + "filename": "src/Queue/DatabaseQueueScheduler.php" + }, + { + "project_id": 134090, + "project_name": "project/ecwid", + "filename": "src/EcwidApiService.php" + }, + { + "project_id": 208118, + "project_name": "project/drupal_devkit", + "filename": "build/claude-code/drupal-core/skills/drupal-contrib-mgmt/references/d11-common-deprecations.md" + }, + { + "project_id": 208118, + "project_name": "project/drupal_devkit", + "filename": "build/codex/drupal-core/skills/drupal-contrib-mgmt/references/d11-common-deprecations.md" + }, + { + "project_id": 208118, + "project_name": "project/drupal_devkit", + "filename": "build/copilot-cli/drupal-core/skills/drupal-contrib-mgmt/references/d11-common-deprecations.md" + }, + { + "project_id": 208118, + "project_name": "project/drupal_devkit", + "filename": "build/cursor/drupal-core/skills/drupal-contrib-mgmt/references/d11-common-deprecations.md" + }, + { + "project_id": 208118, + "project_name": "project/drupal_devkit", + "filename": "build/gemini/drupal-core/skills/drupal-contrib-mgmt/references/d11-common-deprecations.md" + }, + { + "project_id": 208118, + "project_name": "project/drupal_devkit", + "filename": "build/hermes/drupal-core/skills/drupal-contrib-mgmt/references/d11-common-deprecations.md" + }, + { + "project_id": 208118, + "project_name": "project/drupal_devkit", + "filename": "build/kiro/drupal-core/skills/drupal-contrib-mgmt/references/d11-common-deprecations.md" + }, + { + "project_id": 208118, + "project_name": "project/drupal_devkit", + "filename": "build/opencode/drupal-core/skills/drupal-contrib-mgmt/references/d11-common-deprecations.md" + }, + { + "project_id": 208118, + "project_name": "project/drupal_devkit", + "filename": "plugins/drupal-core/skills/drupal-contrib-mgmt/references/d11-common-deprecations.md" + } + ], + "SystemTimeZonesRector": [ + { + "project_id": 97, + "project_name": "project/variable", + "filename": "includes/system.variable.inc" + }, + { + "project_id": 249, + "project_name": "project/ar", + "filename": "contrib/event.po" + }, + { + "project_id": 2600, + "project_name": "project/tzfield", + "filename": "src/Plugin/Field/FieldType/TimeZoneItem.php" + }, + { + "project_id": 2600, + "project_name": "project/tzfield", + "filename": "src/Plugin/Field/FieldWidget/TimeZoneDefaultWidget.php" + }, + { + "project_id": 4568, + "project_name": "project/almanac", + "filename": "almanac.admin.inc" + }, + { + "project_id": 4652, + "project_name": "project/booking_timeslots", + "filename": "includes/booking_timeslots.admin.inc" + }, + { + "project_id": 4939, + "project_name": "project/makemeeting", + "filename": "makemeeting.field.inc" + }, + { + "project_id": 6479, + "project_name": "project/openid_connect", + "filename": "openid_connect.module" + }, + { + "project_id": 8197, + "project_name": "project/onepage", + "filename": "modules/user/user.install" + }, + { + "project_id": 9123, + "project_name": "project/1087726", + "filename": "modules/user/user.install" + }, + { + "project_id": 9628, + "project_name": "project/sfactive", + "filename": "sfactive_migrate.admin.inc" + }, + { + "project_id": 9950, + "project_name": "project/dummy_content", + "filename": "includes/class.dcdate.inc" + }, + { + "project_id": 10712, + "project_name": "project/commerce_installments", + "filename": "src/Plugin/Commerce/InstallmentPlanMethod/InstallmentPlanMethodMethodBase.php" + }, + { + "project_id": 11503, + "project_name": "project/list_predefined_options", + "filename": "src/Plugin/ListOptions/Timezones.php" + }, + { + "project_id": 11529, + "project_name": "project/drupalgap", + "filename": "modules/drupalgap_date/drupalgap_date.module" + }, + { + "project_id": 12118, + "project_name": "project/rebuild", + "filename": "tests/fixtures/drupal_sites/dev/modules/user/user.install" + }, + { + "project_id": 12118, + "project_name": "project/rebuild", + "filename": "tests/fixtures/drupal_sites/prod/modules/user/user.install" + }, + { + "project_id": 13111, + "project_name": "project/ddcla", + "filename": "public/modules/user/user.install" + }, + { + "project_id": 13125, + "project_name": "project/transcribe_distribution", + "filename": "modules/user/user.install" + }, + { + "project_id": 13590, + "project_name": "project/timezone_picker", + "filename": "timezone_picker.module" + }, + { + "project_id": 14446, + "project_name": "project/tr_kurulum", + "filename": "modules/user/user.install" + }, + { + "project_id": 14506, + "project_name": "project/tb_blog_starter", + "filename": "modules/user/user.install" + }, + { + "project_id": 14507, + "project_name": "project/tb_events_starter", + "filename": "modules/user/user.install" + }, + { + "project_id": 14509, + "project_name": "project/tb_hadelis_starter", + "filename": "modules/user/user.install" + }, + { + "project_id": 14510, + "project_name": "project/tb_methys_starter", + "filename": "modules/user/user.install" + }, + { + "project_id": 14511, + "project_name": "project/tb_mollise_starter", + "filename": "modules/user/user.install" + }, + { + "project_id": 14512, + "project_name": "project/tb_neris_starter", + "filename": "modules/user/user.install" + }, + { + "project_id": 14513, + "project_name": "project/tb_palicico_starter", + "filename": "modules/user/user.install" + }, + { + "project_id": 14514, + "project_name": "project/tb_purity_starter", + "filename": "modules/user/user.install" + }, + { + "project_id": 14515, + "project_name": "project/tb_rave_starter", + "filename": "modules/user/user.install" + }, + { + "project_id": 14522, + "project_name": "project/tb_sirate_starter", + "filename": "modules/user/user.install" + }, + { + "project_id": 14523, + "project_name": "project/gladcamp", + "filename": "modules/user/user.install" + }, + { + "project_id": 15222, + "project_name": "project/open_badging_installation_profile", + "filename": "modules/user/user.install" + }, + { + "project_id": 15378, + "project_name": "project/cm_cablecast", + "filename": "modules/cablecast_api/cablecast_api.module" + }, + { + "project_id": 16192, + "project_name": "project/mobilearkickstart", + "filename": "modules/user/user.install" + }, + { + "project_id": 16984, + "project_name": "project/spanish_distribution", + "filename": "modules/user/user.install" + }, + { + "project_id": 17013, + "project_name": "project/fuse", + "filename": "modules/user/user.install" + }, + { + "project_id": 18036, + "project_name": "project/paypal_roles", + "filename": "includes/views/handlers/views_handler_field_custom_payment_expire.inc" + }, + { + "project_id": 18036, + "project_name": "project/paypal_roles", + "filename": "includes/views/handlers/views_handler_field_payment_expire.inc" + }, + { + "project_id": 18559, + "project_name": "project/govbr", + "filename": "modules/user/user.install" + }, + { + "project_id": 18777, + "project_name": "project/quandl", + "filename": "modules/quandl_views/handlers/quandl_views_handler_field_date.inc" + }, + { + "project_id": 18882, + "project_name": "project/better_field_formatters", + "filename": "better_field_formatters.module" + }, + { + "project_id": 18897, + "project_name": "project/qurandistribution", + "filename": "modules/user/user.install" + }, + { + "project_id": 19961, + "project_name": "project/feeds_entity_processor", + "filename": "src/Property/FeedsEntityProcessorPropertyDate.php" + }, + { + "project_id": 20484, + "project_name": "project/mpub", + "filename": "modules/contrib/views/handlers/views_handler_field_date.inc" + }, + { + "project_id": 20990, + "project_name": "project/development", + "filename": "modules/user/user.install" + }, + { + "project_id": 21069, + "project_name": "project/yamlform", + "filename": "includes/yamlform.options.inc" + }, + { + "project_id": 21069, + "project_name": "project/yamlform", + "filename": "src/Plugin/YamlFormElement/DateTime.php" + }, + { + "project_id": 21172, + "project_name": "project/user_access_timeslot", + "filename": "user_access_timeslot.admin.inc" + }, + { + "project_id": 23279, + "project_name": "project/condition_pack", + "filename": "condition_pack_time/src/Plugin/Condition/TimezoneCondition.php" + }, + { + "project_id": 23470, + "project_name": "project/gp_reviews", + "filename": "modules/user/user.install" + }, + { + "project_id": 24449, + "project_name": "project/ppoidc", + "filename": "pixelpin_openid_connect.module" + }, + { + "project_id": 25066, + "project_name": "project/search_api_lucene", + "filename": "search_api_solr.module" + }, + { + "project_id": 25896, + "project_name": "project/byu_installation_profile", + "filename": "modules/user/user.install" + }, + { + "project_id": 45456, + "project_name": "project/digitalclock", + "filename": "src/Plugin/Block/ClockBlock.php" + }, + { + "project_id": 56221, + "project_name": "project/datex", + "filename": "datex.module" + }, + { + "project_id": 58633, + "project_name": "project/openfed", + "filename": "modules/openfed_features/partial_date/partial_date.module" + }, + { + "project_id": 58647, + "project_name": "project/views", + "filename": "handlers/views_handler_field_date.inc" + }, + { + "project_id": 59186, + "project_name": "project/daterange_simplify", + "filename": "src/Plugin/Field/FieldFormatter/SimplifyFormatterBase.php" + }, + { + "project_id": 59691, + "project_name": "project/cilogon_auth", + "filename": "cilogon_auth.module" + }, + { + "project_id": 59941, + "project_name": "project/smart_date", + "filename": "src/Plugin/Field/FieldWidget/SmartDateTimezoneWidget.php" + }, + { + "project_id": 60038, + "project_name": "project/conference_suite", + "filename": "date/conference_date.configure.inc" + }, + { + "project_id": 60038, + "project_name": "project/conference_suite", + "filename": "date/conference_date.module" + }, + { + "project_id": 60215, + "project_name": "project/aeg", + "filename": "modules/views/handlers/views_handler_field_date.inc" + }, + { + "project_id": 60227, + "project_name": "project/govimentum", + "filename": "modules/user/user.install" + }, + { + "project_id": 62378, + "project_name": "project/drupalru_d7", + "filename": "modules/user/user.install" + }, + { + "project_id": 62699, + "project_name": "project/smart_content_ipstack", + "filename": "src/Plugin/Derivative/IpStackConditionDeriver.php" + }, + { + "project_id": 63177, + "project_name": "project/mtc", + "filename": "src/Form/MultipleTimezoneClockForm.php" + }, + { + "project_id": 63624, + "project_name": "project/ubershopwish", + "filename": "modules/user/user.install" + }, + { + "project_id": 71484, + "project_name": "project/timezone_calculator", + "filename": "src/Form/SelectDateAndTimezone.php" + }, + { + "project_id": 71887, + "project_name": "project/rocketship_florista_demo_profile", + "filename": "src/Form/RocketshipFloristaSiteConfigureForm.php" + }, + { + "project_id": 72597, + "project_name": "project/intl_date", + "filename": "src/Plugin/Field/FieldFormatter/IntlTimestampFormatter.php" + }, + { + "project_id": 77509, + "project_name": "project/testproject4234", + "filename": "modules/user/user.install" + }, + { + "project_id": 83752, + "project_name": "project/veracity_vql", + "filename": "src/Plugin/VqlPreProcess/UserTimezoneProcess.php" + }, + { + "project_id": 86134, + "project_name": "project/crema", + "filename": "tests/src/Unit/CremaUserTestClasses.php" + }, + { + "project_id": 90708, + "project_name": "project/library_management_system", + "filename": "src/Plugin/views/field/RequestedBookIssuedDate.php" + }, + { + "project_id": 90708, + "project_name": "project/library_management_system", + "filename": "src/Plugin/views/field/RequestedBookReturnedDate.php" + }, + { + "project_id": 96282, + "project_name": "project/access_policy", + "filename": "src/Plugin/access_policy/AccessRule/WeekdayRange.php" + }, + { + "project_id": 102813, + "project_name": "project/date_occur", + "filename": "date_occur_ui/src/Plugin/Field/FieldFormatter/DateOccurParentOccurFormatter.php" + }, + { + "project_id": 102813, + "project_name": "project/date_occur", + "filename": "date_occur_ui/src/Plugin/Field/FieldWidget/DateOccurSummaryWidget.php" + }, + { + "project_id": 118568, + "project_name": "project/custom_entity_example", + "filename": "src/Entity/CustomEntityExample.php" + }, + { + "project_id": 126576, + "project_name": "project/time_clock", + "filename": "src/Plugin/Block/TimeClockBlock.php" + }, + { + "project_id": 127162, + "project_name": "project/current_date_time", + "filename": "src/Plugin/Block/ZoneBlock.php" + }, + { + "project_id": 135576, + "project_name": "project/everlms", + "filename": "modules/lms_answer/src/Entity/LMSAnswer.php" + }, + { + "project_id": 135576, + "project_name": "project/everlms", + "filename": "modules/lms_certificate/src/Entity/LMSCertificate.php" + }, + { + "project_id": 135576, + "project_name": "project/everlms", + "filename": "modules/lms_class/src/Entity/LMSClass.php" + }, + { + "project_id": 135576, + "project_name": "project/everlms", + "filename": "modules/lms_lesson/src/Entity/LMSLesson.php" + }, + { + "project_id": 135576, + "project_name": "project/everlms", + "filename": "modules/lms_question/src/Entity/LMSQuestion.php" + }, + { + "project_id": 135576, + "project_name": "project/everlms", + "filename": "modules/lms_question_response/src/Entity/LMSQuestionResponse.php" + }, + { + "project_id": 135576, + "project_name": "project/everlms", + "filename": "modules/lms_quiz/src/Entity/LMSQuiz.php" + }, + { + "project_id": 135576, + "project_name": "project/everlms", + "filename": "modules/lms_quiz_result/src/Entity/LMSQuizResult.php" + }, + { + "project_id": 135576, + "project_name": "project/everlms", + "filename": "modules/lms_room/src/Entity/LMSRoom.php" + }, + { + "project_id": 135576, + "project_name": "project/everlms", + "filename": "modules/lms_scheduler/src/Entity/LMSScheduler.php" + }, + { + "project_id": 135576, + "project_name": "project/everlms", + "filename": "modules/lms_user_ceritificate/src/Entity/LMSUserCertificate.php" + }, + { + "project_id": 135576, + "project_name": "project/everlms", + "filename": "modules/lms_user_certificate/src/Entity/LMSUserCertificate.php" + }, + { + "project_id": 135576, + "project_name": "project/everlms", + "filename": "modules/lms_user_course/src/Entity/LMSUserCourse.php" + }, + { + "project_id": 135576, + "project_name": "project/everlms", + "filename": "modules/we_notification/src/Entity/WeNotification.php" + }, + { + "project_id": 168630, + "project_name": "project/substitutoo", + "filename": "modules/sub_activity/src/Entity/SubActivity.php" + }, + { + "project_id": 168630, + "project_name": "project/substitutoo", + "filename": "modules/sub_notification/src/Entity/SubNotification.php" + }, + { + "project_id": 185077, + "project_name": "project/salesforce_push_queue_ui", + "filename": "src/Plugin/views/field/TimestampField.php" + } + ] + }, + "project_rectors": { + "project/livediscussions": [ + "FileSystemBasenameToNativeRector", + "NodeStorageDeprecatedMethodsRector", + "RemoveModuleHandlerAddModuleCallsRector", + "RemoveTrustDataCallRector", + "ReplaceRebuildThemeDataRector", + "UseEntityTypeHasIntegerIdRector" + ], + "project/pt-br": [ + "FileSystemBasenameToNativeRector", + "NodeStorageDeprecatedMethodsRector", + "PluginBaseIsConfigurableRector", + "RemoveModuleHandlerAddModuleCallsRector", + "RemoveTrustDataCallRector", + "ReplaceRebuildThemeDataRector", + "UseEntityTypeHasIntegerIdRector" + ], + "project/pushbutton_phptemplate": [ + "FileSystemBasenameToNativeRector", + "NodeStorageDeprecatedMethodsRector", + "PluginBaseIsConfigurableRector", + "RemoveModuleHandlerAddModuleCallsRector", + "RemoveTrustDataCallRector", + "ReplaceRebuildThemeDataRector", + "UseEntityTypeHasIntegerIdRector" + ], + "project/bg": [ + "FileSystemBasenameToNativeRector", + "NodeStorageDeprecatedMethodsRector", + "PluginBaseIsConfigurableRector", + "RemoveModuleHandlerAddModuleCallsRector", + "RemoveTrustDataCallRector", + "ReplaceRebuildThemeDataRector", + "UseEntityTypeHasIntegerIdRector" + ], + "project/mail_archive": [ + "FileSystemBasenameToNativeRector", + "NodeStorageDeprecatedMethodsRector", + "PluginBaseIsConfigurableRector", + "RemoveModuleHandlerAddModuleCallsRector", + "RemoveTrustDataCallRector", + "ReplaceRebuildThemeDataRector", + "UseEntityTypeHasIntegerIdRector" + ], + "project/sitemenu": [ + "FileSystemBasenameToNativeRector", + "NodeStorageDeprecatedMethodsRector", + "PluginBaseIsConfigurableRector", + "RemoveModuleHandlerAddModuleCallsRector", + "RemoveTrustDataCallRector", + "ReplaceRebuildThemeDataRector", + "UseEntityTypeHasIntegerIdRector" + ], + "project/binder": [ + "FileSystemBasenameToNativeRector", + "NodeStorageDeprecatedMethodsRector", + "PluginBaseIsConfigurableRector", + "RemoveModuleHandlerAddModuleCallsRector", + "RemoveTrustDataCallRector", + "ReplaceRebuildThemeDataRector", + "UseEntityTypeHasIntegerIdRector" + ], + "project/gladcamp": [ + "LoadAllIncludesRector", + "MigrateSqlGetMigrationPluginManagerRector", + "NodeStorageDeprecatedMethodsRector", + "RemoveModuleHandlerDeprecatedMethodsRector", + "RemoveSetUriCallbackRector", + "RemoveUpdaterPostInstallMethodsRector", + "ReplaceCommentManagerGetCountNewCommentsRector", + "ReplaceCommentUriRector", + "ReplaceEntityOriginalPropertyRector", + "ReplaceFileGetContentHeadersRector", + "ReplaceNodeAccessViewAllNodesRector", + "ReplaceNodeAddBodyFieldRector", + "ReplaceNodeModuleProceduralFunctionsRector", + "ReplaceNodeSetPreviewModeRector", + "ReplacePdoFetchConstantsRector", + "ReplaceRequestTimeConstantRector", + "ReplaceSessionWritesWithRequestSessionRector", + "ReplaceSystemPerformanceGzipKeyRector", + "ReplaceThemeGetSettingRector", + "StripMigrationDependenciesExpandArgRector", + "SystemTimeZonesRector" + ], + "project/contact_dir": [ + "PluginBaseIsConfigurableRector" + ], + "project/vcp4dates": [ + "RemoveCacheExpireOverrideRector" + ], + "project/ct_expire": [ + "RemoveCacheExpireOverrideRector" + ], + "project/feed_block": [ + "RemoveCacheExpireOverrideRector" + ], + "project/qpservices": [ + "RemoveCacheExpireOverrideRector" + ], + "project/querypath": [ + "RemoveCacheExpireOverrideRector", + "ReplacePdoFetchConstantsRector" + ], + "project/selective_tweets": [ + "RemoveCacheExpireOverrideRector" + ], + "project/memory_profiler": [ + "RemoveCacheExpireOverrideRector", + "ReplaceRequestTimeConstantRector" + ], + "project/quandl": [ + "RemoveCacheExpireOverrideRector", + "SystemTimeZonesRector" + ], + "project/menu_parser_php": [ + "RemoveCacheExpireOverrideRector" + ], + "project/js_entity": [ + "RemoveCacheExpireOverrideRector" + ], + "project/cache_heuristic": [ + "RemoveCacheExpireOverrideRector" + ], + "project/booking_com_api": [ + "RemoveCacheExpireOverrideRector" + ], + "project/cmrf_form_processor": [ + "RemoveCacheExpireOverrideRector" + ], + "project/cove_api": [ + "RemoveCacheExpireOverrideRector" + ], + "project/cachetags": [ + "RemoveCacheExpireOverrideRector" + ], + "project/social_comments": [ + "RemoveCacheExpireOverrideRector" + ], + "project/cacherouter": [ + "RemoveCacheExpireOverrideRector" + ], + "project/pmetrics": [ + "RemoveCacheExpireOverrideRector" + ], + "project/cision_block": [ + "RemoveCacheExpireOverrideRector" + ], + "project/shareaholic": [ + "RemoveCacheExpireOverrideRector", + "RemoveUpdaterPostInstallMethodsRector", + "ReplaceRequestTimeConstantRector" + ], + "project/qui": [ + "RemoveCacheExpireOverrideRector" + ], + "project/max_age": [ + "RemoveCacheExpireOverrideRector", + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/wincachedrupal": [ + "RemoveCacheExpireOverrideRector" + ], + "project/cmrf_core": [ + "RemoveCacheExpireOverrideRector" + ], + "project/orghunter": [ + "RemoveCacheExpireOverrideRector" + ], + "project/ovh": [ + "RemoveCacheExpireOverrideRector" + ], + "project/era": [ + "RemoveCacheExpireOverrideRector" + ], + "project/media_ustream": [ + "RemoveCacheExpireOverrideRector" + ], + "project/visitorsvoice": [ + "RemoveCacheExpireOverrideRector" + ], + "project/social_feed_field": [ + "RemoveCacheExpireOverrideRector", + "ReplaceRequestTimeConstantRector" + ], + "project/dvg_appointments": [ + "RemoveCacheExpireOverrideRector" + ], + "project/at_base": [ + "RemoveCacheExpireOverrideRector" + ], + "project/session_cache": [ + "RemoveCacheExpireOverrideRector" + ], + "project/eventbrite": [ + "RemoveCacheExpireOverrideRector" + ], + "project/spambot": [ + "RemoveCacheExpireOverrideRector" + ], + "project/go1_base": [ + "RemoveCacheExpireOverrideRector" + ], + "project/latest_members": [ + "RemoveCacheExpireOverrideRector" + ], + "project/cache_disable": [ + "RemoveCacheExpireOverrideRector" + ], + "project/deds_client": [ + "RemoveCacheExpireOverrideRector" + ], + "project/cache_actions": [ + "RemoveCacheExpireOverrideRector" + ], + "project/enhanced_page_cache": [ + "RemoveCacheExpireOverrideRector" + ], + "project/riddle_marketplace": [ + "RemoveCacheExpireOverrideRector" + ], + "project/cache_graceful": [ + "RemoveCacheExpireOverrideRector" + ], + "project/wunderground_weather": [ + "RemoveCacheExpireOverrideRector" + ], + "project/wsdata": [ + "RemoveCacheExpireOverrideRector" + ], + "project/amazon_import": [ + "RemoveCacheExpireOverrideRector" + ], + "project/sendinblue_rules": [ + "RemoveCacheExpireOverrideRector", + "ReplaceRequestTimeConstantRector" + ], + "project/apcu": [ + "RemoveCacheExpireOverrideRector" + ], + "project/userpickit": [ + "RemoveCacheExpireOverrideRector" + ], + "project/advcache": [ + "RemoveCacheExpireOverrideRector" + ], + "project/xcache": [ + "RemoveCacheExpireOverrideRector" + ], + "project/reevoomark": [ + "RemoveCacheExpireOverrideRector" + ], + "project/dynamodb": [ + "RemoveCacheExpireOverrideRector" + ], + "project/block2field": [ + "RemoveCacheExpireOverrideRector" + ], + "project/staticfilecache": [ + "RemoveCacheExpireOverrideRector" + ], + "project/entity_lister": [ + "RemoveCacheExpireOverrideRector" + ], + "project/wisski": [ + "RemoveCacheExpireOverrideRector" + ], + "project/search_api_acquia": [ + "RemoveCacheExpireOverrideRector" + ], + "project/rss_embed_field": [ + "RemoveCacheExpireOverrideRector" + ], + "project/fetcher": [ + "RemoveCacheExpireOverrideRector" + ], + "project/couchbasedrupal": [ + "RemoveCacheExpireOverrideRector", + "ReplaceRequestTimeConstantRector" + ], + "project/usajobs_integration": [ + "RemoveCacheExpireOverrideRector" + ], + "project/virtual_roles": [ + "RemoveCacheExpireOverrideRector" + ], + "project/dvg_stuf_bg": [ + "RemoveCacheExpireOverrideRector" + ], + "project/onepagecv": [ + "RemoveCacheExpireOverrideRector", + "RemoveStateCacheSettingRector", + "ReplaceViewsProceduralFunctionsRector" + ], + "project/site_search_analytics": [ + "RemoveCacheExpireOverrideRector", + "ReplaceUserSessionNamePropertyRector" + ], + "project/commercetools": [ + "RemoveCacheExpireOverrideRector" + ], + "project/social_media_api": [ + "RemoveCacheExpireOverrideRector" + ], + "project/context_cache": [ + "RemoveCacheExpireOverrideRector" + ], + "project/corporative_site": [ + "RemoveCacheExpireOverrideRector", + "RemoveStateCacheSettingRector", + "ReplaceFieldgroupToFieldsetRector", + "ReplaceViewsProceduralFunctionsRector" + ], + "project/audit_report": [ + "RemoveCacheExpireOverrideRector" + ], + "project/memcache_storage": [ + "RemoveCacheExpireOverrideRector" + ], + "project/b2b_store_solution": [ + "RemoveCacheExpireOverrideRector", + "RemoveStateCacheSettingRector", + "ReplaceFieldgroupToFieldsetRector", + "ReplaceNodeAccessViewAllNodesRector", + "ReplaceNodeModuleProceduralFunctionsRector", + "ReplaceViewsProceduralFunctionsRector" + ], + "project/views_dependent_filters": [ + "RemoveHandlerBaseDefineExtraOptionsRector" + ], + "project/sqlsrv": [ + "RemoveRootFromConvertDbUrlRector" + ], + "project/sparql_entity_storage": [ + "RemoveRootFromConvertDbUrlRector" + ], + "project/civicrm_entity": [ + "RemoveRootFromConvertDbUrlRector", + "ViewsPluginHandlerManagerRector" + ], + "project/acsf": [ + "RemoveRootFromConvertDbUrlRector" + ], + "project/smart_migrate_cli": [ + "RemoveRootFromConvertDbUrlRector" + ], + "project/chromeless": [ + "RemoveStateCacheSettingRector" + ], + "project/og": [ + "RemoveStateCacheSettingRector", + "ViewsPluginHandlerManagerRector" + ], + "project/odoo_api": [ + "RemoveStateCacheSettingRector" + ], + "project/distro": [ + "RemoveStateCacheSettingRector" + ], + "project/panels_frame": [ + "RemoveStateCacheSettingRector" + ], + "project/monster_menus": [ + "RemoveStateCacheSettingRector", + "ReplaceNodeModuleProceduralFunctionsRector", + "ViewsPluginHandlerManagerRector" + ], + "project/searchstax": [ + "RemoveStateCacheSettingRector", + "RemoveTwigNodeTransTagArgumentRector", + "ViewsPluginHandlerManagerRector" + ], + "project/profile_setup_api": [ + "RemoveStateCacheSettingRector" + ], + "project/devshop_hosting": [ + "RemoveStateCacheSettingRector" + ], + "project/qfield": [ + "RemoveStateCacheSettingRector" + ], + "project/widen_media": [ + "RemoveStateCacheSettingRector" + ], + "project/fmrest": [ + "RemoveStateCacheSettingRector" + ], + "project/stackla_widget": [ + "RemoveStateCacheSettingRector" + ], + "project/salesforce_auth": [ + "RemoveStateCacheSettingRector" + ], + "project/freeagent": [ + "RemoveStateCacheSettingRector" + ], + "project/vwo": [ + "RemoveStateCacheSettingRector" + ], + "project/mpub": [ + "RemoveStateCacheSettingRector", + "ReplaceFieldgroupToFieldsetRector", + "ReplaceFileGetContentHeadersRector", + "ReplaceNodeAccessViewAllNodesRector", + "ReplaceThemeGetSettingRector", + "ReplaceViewsProceduralFunctionsRector", + "SystemTimeZonesRector" + ], + "project/swagger_ui_formatter": [ + "RemoveStateCacheSettingRector" + ], + "project/checklistapi": [ + "RemoveStateCacheSettingRector" + ], + "project/rail_ai_provider": [ + "RemoveStateCacheSettingRector" + ], + "project/aeg": [ + "RemoveStateCacheSettingRector", + "ReplaceNodeAccessViewAllNodesRector", + "ReplaceNodeModuleProceduralFunctionsRector", + "ReplaceViewsProceduralFunctionsRector", + "SystemTimeZonesRector" + ], + "project/engaging_networks": [ + "RemoveStateCacheSettingRector" + ], + "project/bynder": [ + "RemoveStateCacheSettingRector" + ], + "project/loop_workers": [ + "RemoveStateCacheSettingRector" + ], + "project/override_cache_control_headers": [ + "RemoveStateCacheSettingRector" + ], + "project/casaa": [ + "RemoveStateCacheSettingRector" + ], + "project/salesforce": [ + "RemoveStateCacheSettingRector" + ], + "project/context_admin": [ + "RemoveStateCacheSettingRector", + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/drupalru_d7": [ + "RemoveStateCacheSettingRector", + "RemoveUpdaterPostInstallMethodsRector", + "ReplaceCommentUriRector", + "ReplaceFileGetContentHeadersRector", + "ReplaceNodeAccessViewAllNodesRector", + "ReplaceNodeAddBodyFieldRector", + "ReplaceNodeModuleProceduralFunctionsRector", + "ReplacePdoFetchConstantsRector", + "ReplaceRequestTimeConstantRector", + "ReplaceSessionWritesWithRequestSessionRector", + "ReplaceSystemPerformanceGzipKeyRector", + "ReplaceThemeGetSettingRector", + "ReplaceUserSessionNamePropertyRector", + "SystemTimeZonesRector" + ], + "project/trailless_menu": [ + "RemoveStateCacheSettingRector" + ], + "project/ubershopwish": [ + "RemoveStateCacheSettingRector", + "RemoveUpdaterPostInstallMethodsRector", + "ReplaceCommentUriRector", + "ReplaceFileGetContentHeadersRector", + "ReplaceNodeAccessViewAllNodesRector", + "ReplaceNodeAddBodyFieldRector", + "ReplaceNodeModuleProceduralFunctionsRector", + "ReplacePdoFetchConstantsRector", + "ReplaceRequestTimeConstantRector", + "ReplaceSessionWritesWithRequestSessionRector", + "ReplaceSystemPerformanceGzipKeyRector", + "ReplaceThemeGetSettingRector", + "ReplaceUserSessionNamePropertyRector", + "SystemTimeZonesRector" + ], + "project/govimentum": [ + "RemoveStateCacheSettingRector", + "RemoveUpdaterPostInstallMethodsRector", + "ReplaceCommentUriRector", + "ReplaceFileGetContentHeadersRector", + "ReplaceNodeAccessViewAllNodesRector", + "ReplaceNodeAddBodyFieldRector", + "ReplaceNodeModuleProceduralFunctionsRector", + "ReplacePdoFetchConstantsRector", + "ReplaceSessionWritesWithRequestSessionRector", + "ReplaceSystemPerformanceGzipKeyRector", + "ReplaceThemeGetSettingRector", + "SystemTimeZonesRector" + ], + "project/testproject4234": [ + "RemoveStateCacheSettingRector", + "RemoveUpdaterPostInstallMethodsRector", + "ReplaceCommentUriRector", + "ReplaceFileGetContentHeadersRector", + "ReplaceNodeAccessViewAllNodesRector", + "ReplaceNodeAddBodyFieldRector", + "ReplaceNodeModuleProceduralFunctionsRector", + "ReplacePdoFetchConstantsRector", + "ReplaceSessionWritesWithRequestSessionRector", + "ReplaceSystemPerformanceGzipKeyRector", + "ReplaceThemeGetSettingRector", + "ReplaceUserSessionNamePropertyRector", + "SystemTimeZonesRector" + ], + "project/mailchimp_transactional": [ + "RemoveStateCacheSettingRector" + ], + "project/ffmpeg_media": [ + "RemoveStateCacheSettingRector" + ], + "project/openid_sso_provider": [ + "RemoveStateCacheSettingRector" + ], + "project/backup_migrate_dropbox": [ + "RemoveStateCacheSettingRector" + ], + "project/d6lts": [ + "RemoveStateCacheSettingRector", + "ReplaceRequestTimeConstantRector" + ], + "project/winners": [ + "RemoveStateCacheSettingRector" + ], + "project/cache_browser": [ + "RemoveStateCacheSettingRector" + ], + "project/community_tasks": [ + "RemoveStateCacheSettingRector" + ], + "project/wildfire": [ + "RemoveStateCacheSettingRector" + ], + "project/entity_usage_updater": [ + "RemoveStateCacheSettingRector" + ], + "project/mustache_templates": [ + "RemoveStateCacheSettingRector" + ], + "project/entity_reference_preview": [ + "RemoveStateCacheSettingRector" + ], + "project/granulartimecache": [ + "RemoveStateCacheSettingRector" + ], + "project/pantheon_autopilot_toolbar": [ + "RemoveStateCacheSettingRector" + ], + "project/views_ajax_form": [ + "RemoveStateCacheSettingRector" + ], + "project/authcache": [ + "RemoveStateCacheSettingRector" + ], + "project/entity_references_map": [ + "RemoveStateCacheSettingRector", + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/views_advanced_cache": [ + "RemoveStateCacheSettingRector", + "RemoveViewsRowCacheKeysRector" + ], + "project/cloud": [ + "RemoveStateCacheSettingRector", + "ViewsPluginHandlerManagerRector" + ], + "project/json_drop_api": [ + "RemoveStateCacheSettingRector", + "RemoveViewsRowCacheKeysRector", + "ReplaceEditorLoadRector", + "ReplaceFieldgroupToFieldsetRector", + "ReplaceNodeAddBodyFieldRector", + "ReplaceNodeModuleProceduralFunctionsRector", + "ReplaceViewsProceduralFunctionsRector", + "ViewsPluginHandlerManagerRector" + ], + "project/deploy_key": [ + "RemoveStateCacheSettingRector" + ], + "project/stratoserp": [ + "RemoveStateCacheSettingRector" + ], + "project/config_split": [ + "RemoveStateCacheSettingRector" + ], + "project/drupal_devkit": [ + "RemoveStateCacheSettingRector", + "ReplaceRequestTimeConstantRector", + "ReplaceSessionWritesWithRequestSessionRector" + ], + "project/bynder_orbit": [ + "RemoveStateCacheSettingRector" + ], + "project/youtube_live_video": [ + "RemoveStateCacheSettingRector" + ], + "project/language_suggestion": [ + "RemoveStateCacheSettingRector" + ], + "project/sdx": [ + "RemoveStateCacheSettingRector" + ], + "project/apigee_edge": [ + "RemoveStateCacheSettingRector" + ], + "project/open_vocabularies": [ + "RemoveStateCacheSettingRector" + ], + "project/dns": [ + "RemoveStateCacheSettingRector" + ], + "project/mollom": [ + "RemoveStateCacheSettingRector" + ], + "project/eu_cookie_compliance_rocketship": [ + "RemoveStateCacheSettingRector" + ], + "project/mb": [ + "RemoveStateCacheSettingRector" + ], + "project/social_auth_entra_id": [ + "RemoveStateCacheSettingRector" + ], + "project/search_api_postgresql": [ + "RemoveStateCacheSettingRector" + ], + "project/lightning_workflow": [ + "RemoveStateCacheSettingRector" + ], + "project/experience_builder": [ + "RemoveTwigNodeTransTagArgumentRector" + ], + "project/canvas": [ + "RemoveTwigNodeTransTagArgumentRector" + ], + "project/tranc": [ + "RemoveTwigNodeTransTagArgumentRector" + ], + "project/core_logs": [ + "RemoveTwigNodeTransTagArgumentRector" + ], + "project/potion": [ + "RemoveTwigNodeTransTagArgumentRector" + ], + "project/sketch": [ + "RemoveTwigNodeTransTagArgumentRector" + ], + "project/bear_skin": [ + "RemoveTwigNodeTransTagArgumentRector" + ], + "project/patternlab": [ + "RemoveTwigNodeTransTagArgumentRector" + ], + "project/entity_import": [ + "RemoveTwigNodeTransTagArgumentRector" + ], + "project/flexi_pattern_lab": [ + "RemoveTwigNodeTransTagArgumentRector" + ], + "project/emulsify": [ + "RemoveTwigNodeTransTagArgumentRector" + ], + "project/kashmir": [ + "RemoveTwigNodeTransTagArgumentRector" + ], + "project/search_api_saved_searches": [ + "RemoveTwigNodeTransTagArgumentRector" + ], + "project/search_api_autocomplete": [ + "RemoveTwigNodeTransTagArgumentRector" + ], + "project/search_api": [ + "RemoveTwigNodeTransTagArgumentRector", + "ViewsPluginHandlerManagerRector" + ], + "project/whereabouts": [ + "RemoveUpdaterPostInstallMethodsRector" + ], + "project/redhen_demo": [ + "RemoveUpdaterPostInstallMethodsRector" + ], + "project/group_entity": [ + "RemoveUpdaterPostInstallMethodsRector", + "ViewsPluginHandlerManagerRector" + ], + "project/group": [ + "RemoveUpdaterPostInstallMethodsRector", + "ViewsPluginHandlerManagerRector" + ], + "project/tb_purity_starter": [ + "RemoveUpdaterPostInstallMethodsRector", + "ReplaceCommentUriRector", + "ReplaceFileGetContentHeadersRector", + "ReplaceNodeAccessViewAllNodesRector", + "ReplaceNodeAddBodyFieldRector", + "ReplaceNodeModuleProceduralFunctionsRector", + "ReplacePdoFetchConstantsRector", + "ReplaceRequestTimeConstantRector", + "ReplaceSessionWritesWithRequestSessionRector", + "ReplaceSystemPerformanceGzipKeyRector", + "ReplaceThemeGetSettingRector", + "SystemTimeZonesRector" + ], + "project/tr_kurulum": [ + "RemoveUpdaterPostInstallMethodsRector", + "ReplaceCommentUriRector", + "ReplaceFileGetContentHeadersRector", + "ReplaceNodeAccessViewAllNodesRector", + "ReplaceNodeAddBodyFieldRector", + "ReplaceNodeModuleProceduralFunctionsRector", + "ReplacePdoFetchConstantsRector", + "ReplaceRequestTimeConstantRector", + "ReplaceSessionWritesWithRequestSessionRector", + "ReplaceSystemPerformanceGzipKeyRector", + "ReplaceThemeGetSettingRector", + "SystemTimeZonesRector" + ], + "project/ddcla": [ + "RemoveUpdaterPostInstallMethodsRector", + "ReplaceCommentUriRector", + "ReplaceFileGetContentHeadersRector", + "ReplaceNodeAccessViewAllNodesRector", + "ReplaceNodeAddBodyFieldRector", + "ReplaceNodeModuleProceduralFunctionsRector", + "ReplacePdoFetchConstantsRector", + "ReplaceRequestTimeConstantRector", + "ReplaceSessionWritesWithRequestSessionRector", + "ReplaceSystemPerformanceGzipKeyRector", + "ReplaceThemeGetSettingRector", + "SystemTimeZonesRector" + ], + "project/1087726": [ + "RemoveUpdaterPostInstallMethodsRector", + "ReplaceCommentUriRector", + "ReplaceFileGetContentHeadersRector", + "ReplaceNodeAccessViewAllNodesRector", + "ReplaceNodeAddBodyFieldRector", + "ReplaceNodeModuleProceduralFunctionsRector", + "ReplacePdoFetchConstantsRector", + "ReplaceSessionWritesWithRequestSessionRector", + "ReplaceSystemPerformanceGzipKeyRector", + "ReplaceThemeGetSettingRector", + "SystemTimeZonesRector" + ], + "project/tb_neris_starter": [ + "RemoveUpdaterPostInstallMethodsRector", + "ReplaceCommentUriRector", + "ReplaceFileGetContentHeadersRector", + "ReplaceNodeAccessViewAllNodesRector", + "ReplaceNodeAddBodyFieldRector", + "ReplaceNodeModuleProceduralFunctionsRector", + "ReplacePdoFetchConstantsRector", + "ReplaceSessionWritesWithRequestSessionRector", + "ReplaceSystemPerformanceGzipKeyRector", + "ReplaceThemeGetSettingRector", + "SystemTimeZonesRector" + ], + "project/tb_hadelis_starter": [ + "RemoveUpdaterPostInstallMethodsRector", + "ReplaceCommentUriRector", + "ReplaceFileGetContentHeadersRector", + "ReplaceNodeAccessViewAllNodesRector", + "ReplaceNodeAddBodyFieldRector", + "ReplaceNodeModuleProceduralFunctionsRector", + "ReplacePdoFetchConstantsRector", + "ReplaceSessionWritesWithRequestSessionRector", + "ReplaceSystemPerformanceGzipKeyRector", + "ReplaceThemeGetSettingRector", + "SystemTimeZonesRector" + ], + "project/onepage": [ + "RemoveUpdaterPostInstallMethodsRector", + "ReplaceCommentUriRector", + "ReplaceFileGetContentHeadersRector", + "ReplaceNodeAccessViewAllNodesRector", + "ReplaceNodeAddBodyFieldRector", + "ReplaceNodeModuleProceduralFunctionsRector", + "ReplacePdoFetchConstantsRector", + "ReplaceSessionWritesWithRequestSessionRector", + "ReplaceSystemPerformanceGzipKeyRector", + "ReplaceThemeGetSettingRector", + "SystemTimeZonesRector" + ], + "project/tb_blog_starter": [ + "RemoveUpdaterPostInstallMethodsRector", + "ReplaceCommentUriRector", + "ReplaceFileGetContentHeadersRector", + "ReplaceNodeAccessViewAllNodesRector", + "ReplaceNodeAddBodyFieldRector", + "ReplaceNodeModuleProceduralFunctionsRector", + "ReplacePdoFetchConstantsRector", + "ReplaceRequestTimeConstantRector", + "ReplaceSessionWritesWithRequestSessionRector", + "ReplaceSystemPerformanceGzipKeyRector", + "ReplaceThemeGetSettingRector", + "SystemTimeZonesRector" + ], + "project/tb_rave_starter": [ + "RemoveUpdaterPostInstallMethodsRector", + "ReplaceCommentUriRector", + "ReplaceFileGetContentHeadersRector", + "ReplaceNodeAccessViewAllNodesRector", + "ReplaceNodeAddBodyFieldRector", + "ReplaceNodeModuleProceduralFunctionsRector", + "ReplacePdoFetchConstantsRector", + "ReplaceRequestTimeConstantRector", + "ReplaceSessionWritesWithRequestSessionRector", + "ReplaceSystemPerformanceGzipKeyRector", + "ReplaceThemeGetSettingRector", + "SystemTimeZonesRector" + ], + "project/tb_palicico_starter": [ + "RemoveUpdaterPostInstallMethodsRector", + "ReplaceCommentUriRector", + "ReplaceFileGetContentHeadersRector", + "ReplaceNodeAccessViewAllNodesRector", + "ReplaceNodeAddBodyFieldRector", + "ReplaceNodeModuleProceduralFunctionsRector", + "ReplacePdoFetchConstantsRector", + "ReplaceRequestTimeConstantRector", + "ReplaceSessionWritesWithRequestSessionRector", + "ReplaceSystemPerformanceGzipKeyRector", + "ReplaceThemeGetSettingRector", + "SystemTimeZonesRector" + ], + "project/tb_methys_starter": [ + "RemoveUpdaterPostInstallMethodsRector", + "ReplaceCommentUriRector", + "ReplaceFileGetContentHeadersRector", + "ReplaceNodeAccessViewAllNodesRector", + "ReplaceNodeAddBodyFieldRector", + "ReplaceNodeModuleProceduralFunctionsRector", + "ReplacePdoFetchConstantsRector", + "ReplaceRequestTimeConstantRector", + "ReplaceSessionWritesWithRequestSessionRector", + "ReplaceSystemPerformanceGzipKeyRector", + "ReplaceThemeGetSettingRector", + "SystemTimeZonesRector" + ], + "project/tb_sirate_starter": [ + "RemoveUpdaterPostInstallMethodsRector", + "ReplaceCommentUriRector", + "ReplaceFileGetContentHeadersRector", + "ReplaceNodeAccessViewAllNodesRector", + "ReplaceNodeAddBodyFieldRector", + "ReplaceNodeModuleProceduralFunctionsRector", + "ReplacePdoFetchConstantsRector", + "ReplaceRequestTimeConstantRector", + "ReplaceSessionWritesWithRequestSessionRector", + "ReplaceSystemPerformanceGzipKeyRector", + "ReplaceThemeGetSettingRector", + "SystemTimeZonesRector" + ], + "project/tb_events_starter": [ + "RemoveUpdaterPostInstallMethodsRector", + "ReplaceCommentUriRector", + "ReplaceFileGetContentHeadersRector", + "ReplaceNodeAccessViewAllNodesRector", + "ReplaceNodeAddBodyFieldRector", + "ReplaceNodeModuleProceduralFunctionsRector", + "ReplacePdoFetchConstantsRector", + "ReplaceRequestTimeConstantRector", + "ReplaceSessionWritesWithRequestSessionRector", + "ReplaceSystemPerformanceGzipKeyRector", + "ReplaceThemeGetSettingRector", + "SystemTimeZonesRector" + ], + "project/tb_mollise_starter": [ + "RemoveUpdaterPostInstallMethodsRector", + "ReplaceCommentUriRector", + "ReplaceFileGetContentHeadersRector", + "ReplaceNodeAccessViewAllNodesRector", + "ReplaceNodeAddBodyFieldRector", + "ReplaceNodeModuleProceduralFunctionsRector", + "ReplacePdoFetchConstantsRector", + "ReplaceRequestTimeConstantRector", + "ReplaceSessionWritesWithRequestSessionRector", + "ReplaceSystemPerformanceGzipKeyRector", + "ReplaceThemeGetSettingRector", + "SystemTimeZonesRector" + ], + "project/open_badging_installation_profile": [ + "RemoveUpdaterPostInstallMethodsRector", + "ReplaceCommentUriRector", + "ReplaceFileGetContentHeadersRector", + "ReplaceNodeAccessViewAllNodesRector", + "ReplaceNodeAddBodyFieldRector", + "ReplaceNodeModuleProceduralFunctionsRector", + "ReplacePdoFetchConstantsRector", + "ReplaceSessionWritesWithRequestSessionRector", + "ReplaceSystemPerformanceGzipKeyRector", + "ReplaceThemeGetSettingRector", + "SystemTimeZonesRector" + ], + "project/spanish_distribution": [ + "RemoveUpdaterPostInstallMethodsRector", + "ReplaceCommentUriRector", + "ReplaceFileGetContentHeadersRector", + "ReplaceNodeAccessViewAllNodesRector", + "ReplaceNodeAddBodyFieldRector", + "ReplaceNodeModuleProceduralFunctionsRector", + "ReplacePdoFetchConstantsRector", + "ReplaceSessionWritesWithRequestSessionRector", + "ReplaceSystemPerformanceGzipKeyRector", + "ReplaceThemeGetSettingRector", + "SystemTimeZonesRector" + ], + "project/rebuild": [ + "RemoveUpdaterPostInstallMethodsRector", + "ReplaceCommentUriRector", + "ReplaceFileGetContentHeadersRector", + "ReplaceNodeAccessViewAllNodesRector", + "ReplaceNodeAddBodyFieldRector", + "ReplaceNodeModuleProceduralFunctionsRector", + "ReplacePdoFetchConstantsRector", + "ReplaceSessionWritesWithRequestSessionRector", + "ReplaceSystemPerformanceGzipKeyRector", + "ReplaceThemeGetSettingRector", + "SystemTimeZonesRector" + ], + "project/transcribe_distribution": [ + "RemoveUpdaterPostInstallMethodsRector", + "ReplaceCommentUriRector", + "ReplaceFileGetContentHeadersRector", + "ReplaceNodeAccessViewAllNodesRector", + "ReplaceNodeAddBodyFieldRector", + "ReplaceNodeModuleProceduralFunctionsRector", + "ReplacePdoFetchConstantsRector", + "ReplaceRequestTimeConstantRector", + "ReplaceSessionWritesWithRequestSessionRector", + "ReplaceSystemPerformanceGzipKeyRector", + "ReplaceThemeGetSettingRector", + "SystemTimeZonesRector" + ], + "project/gp_reviews": [ + "RemoveUpdaterPostInstallMethodsRector", + "ReplaceCommentUriRector", + "ReplaceFileGetContentHeadersRector", + "ReplaceNodeAccessViewAllNodesRector", + "ReplaceNodeAddBodyFieldRector", + "ReplaceNodeModuleProceduralFunctionsRector", + "ReplacePdoFetchConstantsRector", + "ReplaceRequestTimeConstantRector", + "ReplaceSessionWritesWithRequestSessionRector", + "ReplaceSystemPerformanceGzipKeyRector", + "ReplaceThemeGetSettingRector", + "SystemTimeZonesRector" + ], + "project/fuse": [ + "RemoveUpdaterPostInstallMethodsRector", + "ReplaceCommentUriRector", + "ReplaceFileGetContentHeadersRector", + "ReplaceNodeAccessViewAllNodesRector", + "ReplaceNodeAddBodyFieldRector", + "ReplaceNodeModuleProceduralFunctionsRector", + "ReplacePdoFetchConstantsRector", + "ReplaceRequestTimeConstantRector", + "ReplaceSessionWritesWithRequestSessionRector", + "ReplaceSystemPerformanceGzipKeyRector", + "ReplaceThemeGetSettingRector", + "SystemTimeZonesRector" + ], + "project/qurandistribution": [ + "RemoveUpdaterPostInstallMethodsRector", + "ReplaceCommentUriRector", + "ReplaceFileGetContentHeadersRector", + "ReplaceNodeAccessViewAllNodesRector", + "ReplaceNodeAddBodyFieldRector", + "ReplaceNodeModuleProceduralFunctionsRector", + "ReplacePdoFetchConstantsRector", + "ReplaceRequestTimeConstantRector", + "ReplaceSessionWritesWithRequestSessionRector", + "ReplaceSystemPerformanceGzipKeyRector", + "ReplaceThemeGetSettingRector", + "SystemTimeZonesRector" + ], + "project/development": [ + "RemoveUpdaterPostInstallMethodsRector", + "ReplaceCommentUriRector", + "ReplaceFileGetContentHeadersRector", + "ReplaceNodeAccessViewAllNodesRector", + "ReplaceNodeAddBodyFieldRector", + "ReplaceNodeModuleProceduralFunctionsRector", + "ReplacePdoFetchConstantsRector", + "ReplaceRequestTimeConstantRector", + "ReplaceSessionWritesWithRequestSessionRector", + "ReplaceSystemPerformanceGzipKeyRector", + "ReplaceThemeGetSettingRector", + "SystemTimeZonesRector" + ], + "project/byu_installation_profile": [ + "RemoveUpdaterPostInstallMethodsRector", + "ReplaceCommentUriRector", + "ReplaceFileGetContentHeadersRector", + "ReplaceNodeAccessViewAllNodesRector", + "ReplaceNodeAddBodyFieldRector", + "ReplaceNodeModuleProceduralFunctionsRector", + "ReplacePdoFetchConstantsRector", + "ReplaceRequestTimeConstantRector", + "ReplaceSessionWritesWithRequestSessionRector", + "ReplaceSystemPerformanceGzipKeyRector", + "ReplaceThemeGetSettingRector", + "SystemTimeZonesRector" + ], + "project/govbr": [ + "RemoveUpdaterPostInstallMethodsRector", + "ReplaceCommentUriRector", + "ReplaceFileGetContentHeadersRector", + "ReplaceNodeAccessViewAllNodesRector", + "ReplaceNodeAddBodyFieldRector", + "ReplaceNodeModuleProceduralFunctionsRector", + "ReplacePdoFetchConstantsRector", + "ReplaceRequestTimeConstantRector", + "ReplaceSessionWritesWithRequestSessionRector", + "ReplaceSystemPerformanceGzipKeyRector", + "ReplaceThemeGetSettingRector", + "SystemTimeZonesRector" + ], + "project/mobilearkickstart": [ + "RemoveUpdaterPostInstallMethodsRector", + "ReplaceCommentUriRector", + "ReplaceFileGetContentHeadersRector", + "ReplaceNodeAccessViewAllNodesRector", + "ReplaceNodeAddBodyFieldRector", + "ReplaceNodeModuleProceduralFunctionsRector", + "ReplacePdoFetchConstantsRector", + "ReplaceRequestTimeConstantRector", + "ReplaceSessionWritesWithRequestSessionRector", + "ReplaceSystemPerformanceGzipKeyRector", + "ReplaceThemeGetSettingRector", + "SystemTimeZonesRector" + ], + "project/redhen_raiser": [ + "RemoveUpdaterPostInstallMethodsRector" + ], + "project/sauce": [ + "RemoveUpdaterPostInstallMethodsRector" + ], + "project/tiendaparamipyme": [ + "RemoveUpdaterPostInstallMethodsRector" + ], + "project/gnode_request": [ + "RemoveUpdaterPostInstallMethodsRector" + ], + "project/ginvite": [ + "RemoveUpdaterPostInstallMethodsRector" + ], + "project/pankm": [ + "RemoveUpdaterPostInstallMethodsRector", + "ReplaceFieldgroupToFieldsetRector", + "ReplaceNodeAddBodyFieldRector", + "ReplaceNodeModuleProceduralFunctionsRector", + "ReplaceThemeGetSettingRector", + "ViewsPluginHandlerManagerRector" + ], + "project/restaurant": [ + "RemoveUpdaterPostInstallMethodsRector" + ], + "project/metatag": [ + "RemoveViewsRowCacheKeysRector", + "ViewsPluginHandlerManagerRector" + ], + "project/openlayers": [ + "ReplaceAlphadecimalToIntNullRector" + ], + "project/indieweb": [ + "ReplaceAlphadecimalToIntNullRector" + ], + "project/service_container": [ + "ReplaceAlphadecimalToIntNullRector", + "ReplaceModuleHandlerGetNameRector" + ], + "project/comment_mover": [ + "ReplaceAlphadecimalToIntNullRector" + ], + "project/flatcomments": [ + "ReplaceAlphadecimalToIntNullRector" + ], + "project/idea": [ + "ReplaceCommentUriRector" + ], + "project/rdf": [ + "ReplaceCommentUriRector" + ], + "project/jsonapi_comment": [ + "ReplaceCommentUriRector" + ], + "project/social": [ + "ReplaceCommentUriRector", + "ReplaceNodeModuleProceduralFunctionsRector", + "ReplaceViewsProceduralFunctionsRector", + "ViewsPluginHandlerManagerRector" + ], + "project/oa_basetheme": [ + "ReplaceCommentUriRector" + ], + "project/comment_fragment": [ + "ReplaceCommentUriRector" + ], + "project/twbs": [ + "ReplaceCommentUriRector" + ], + "project/zen": [ + "ReplaceCommentUriRector" + ], + "project/twentyeleven": [ + "ReplaceCommentUriRector" + ], + "project/html5_boilerplate": [ + "ReplaceCommentUriRector" + ], + "project/advanced_forum": [ + "ReplaceCommentUriRector" + ], + "project/lc3_clean": [ + "ReplaceCommentUriRector" + ], + "project/genesis": [ + "ReplaceCommentUriRector" + ], + "project/tsm": [ + "ReplaceCommentUriRector", + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/techsupport": [ + "ReplaceCommentUriRector", + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/comment_perm": [ + "ReplaceCommentUriRector" + ], + "project/drupalace": [ + "ReplaceCommentUriRector" + ], + "project/nucleus": [ + "ReplaceCommentUriRector" + ], + "project/project_issue": [ + "ReplaceCommentUriRector" + ], + "project/node_notify": [ + "ReplaceCommentUriRector" + ], + "project/comment_goodness": [ + "ReplaceCommentUriRector" + ], + "project/md_foto": [ + "ReplaceCommentUriRector", + "ReplaceThemeGetSettingRector" + ], + "project/easy_booking": [ + "ReplaceCommentUriRector" + ], + "project/gadget": [ + "ReplaceCommentUriRector" + ], + "project/adaptivetheme": [ + "ReplaceCommentUriRector" + ], + "project/stacksight": [ + "ReplaceCommentUriRector" + ], + "project/jats_generator": [ + "ReplaceCommentUriRector" + ], + "project/deprecation_status": [ + "ReplaceDateTimeRangeConstantsRector" + ], + "project/ckeditor_lts": [ + "ReplaceEditorLoadRector" + ], + "project/theme_file_editor": [ + "ReplaceEditorLoadRector" + ], + "project/module_file_editor": [ + "ReplaceEditorLoadRector" + ], + "project/decoupled": [ + "ReplaceEditorLoadRector" + ], + "project/ai_editoria11y": [ + "ReplaceEditorLoadRector" + ], + "project/acquia_contenthub": [ + "ReplaceEditorLoadRector", + "ReplacePdoFetchConstantsRector", + "ReplaceUserSessionNamePropertyRector" + ], + "project/media_folders": [ + "ReplaceEditorLoadRector" + ], + "project/wxt": [ + "ReplaceEditorLoadRector" + ], + "project/ckeditor_config": [ + "ReplaceEditorLoadRector" + ], + "project/ckeditor_exclude_tags": [ + "ReplaceEditorLoadRector" + ], + "project/wysiwyg_trumbowyg": [ + "ReplaceEditorLoadRector" + ], + "project/translation_management": [ + "ReplaceEditorLoadRector" + ], + "project/openfed": [ + "ReplaceEditorLoadRector", + "SystemTimeZonesRector" + ], + "project/quickedit": [ + "ReplaceEditorLoadRector" + ], + "project/ezcontent_publish": [ + "ReplaceEditorLoadRector" + ], + "project/video_embed_field": [ + "ReplaceEditorLoadRector" + ], + "project/deepseek": [ + "ReplaceEditorLoadRector" + ], + "project/custom_paragraphs": [ + "ReplaceEditorLoadRector" + ], + "project/editor": [ + "ReplaceEditorLoadRector" + ], + "project/smartlinker_ai": [ + "ReplaceEditorLoadRector" + ], + "project/editor_advanced_link": [ + "ReplaceEditorLoadRector" + ], + "project/ckeditor5_highlight": [ + "ReplaceEditorLoadRector" + ], + "project/address_suggestion": [ + "ReplaceEditorLoadRector" + ], + "project/ckeditor_braille": [ + "ReplaceEditorLoadRector" + ], + "project/video_filter": [ + "ReplaceEditorLoadRector" + ], + "project/ckeditor5_spoiler": [ + "ReplaceEditorLoadRector" + ], + "project/ckeditor5_premium_features": [ + "ReplaceEditorLoadRector" + ], + "project/ai_ckeditor_extras": [ + "ReplaceEditorLoadRector" + ], + "project/bueditor": [ + "ReplaceEditorLoadRector" + ], + "project/boxout": [ + "ReplaceEditorLoadRector" + ], + "project/ckeditor5_scroll_fix": [ + "ReplaceEditorLoadRector" + ], + "project/inline_image_token": [ + "ReplaceEditorLoadRector" + ], + "project/editor_advanced_image": [ + "ReplaceEditorLoadRector" + ], + "project/contextly": [ + "ReplaceEditorLoadRector" + ], + "project/ckeditor5_plugin_pack": [ + "ReplaceEditorLoadRector" + ], + "project/ckeditor_mentions": [ + "ReplaceEditorLoadRector" + ], + "project/learnosity": [ + "ReplaceEditorLoadRector" + ], + "project/ckeditor_uploadimage": [ + "ReplaceEditorLoadRector" + ], + "project/editor_advanced_table": [ + "ReplaceEditorLoadRector" + ], + "project/synimage": [ + "ReplaceEditorLoadRector" + ], + "project/dsfr4drupal_picker": [ + "ReplaceEditorLoadRector" + ], + "project/ckeditor5_deepl": [ + "ReplaceEditorLoadRector" + ], + "project/flo": [ + "ReplaceEditorLoadRector" + ], + "project/inline_formatter_field": [ + "ReplaceEditorLoadRector" + ], + "project/wysiwyg_ckeditor": [ + "ReplaceEditorLoadRector" + ], + "project/ckeditor_custom_paste_filters": [ + "ReplaceEditorLoadRector" + ], + "project/ai_agents_experimental_collection": [ + "ReplaceEditorLoadRector", + "ReplaceSystemPerformanceGzipKeyRector" + ], + "project/flmngr": [ + "ReplaceEditorLoadRector" + ], + "project/edit_plus": [ + "ReplaceEditorLoadRector" + ], + "project/ckeditor_historylog": [ + "ReplaceEditorLoadRector" + ], + "project/txt42": [ + "ReplaceEditorLoadRector" + ], + "project/cdn": [ + "ReplaceEditorLoadRector" + ], + "project/editor_ckeditor_widgets": [ + "ReplaceEditorLoadRector" + ], + "project/toast_image_editor": [ + "ReplaceEditorLoadRector" + ], + "project/ckeditor5_mentions": [ + "ReplaceEditorLoadRector" + ], + "project/token_browser_plus": [ + "ReplaceEditorLoadRector" + ], + "project/ckeditor_codemirror": [ + "ReplaceEditorLoadRector" + ], + "project/url_embed": [ + "ReplaceEditorLoadRector" + ], + "project/depcalc": [ + "ReplaceEditorLoadRector" + ], + "project/grapesjs_editor": [ + "ReplaceEditorLoadRector" + ], + "project/acquia_dam": [ + "ReplaceEditorLoadRector", + "ViewsPluginHandlerManagerRector" + ], + "project/markdown": [ + "ReplaceEditorLoadRector" + ], + "project/tinymce": [ + "ReplaceEditorLoadRector" + ], + "project/ole": [ + "ReplaceEditorLoadRector" + ], + "project/visual_editor": [ + "ReplaceEditorLoadRector" + ], + "project/entity_embed": [ + "ReplaceEditorLoadRector", + "ReplaceEntityReferenceRecursiveLimitRector" + ], + "project/imageeditor": [ + "ReplaceEditorLoadRector" + ], + "project/gutenberg": [ + "ReplaceEntityReferenceRecursiveLimitRector" + ], + "project/custom_field": [ + "ReplaceEntityReferenceRecursiveLimitRector", + "ReplaceViewsProceduralFunctionsRector" + ], + "project/layout_builder_formatter": [ + "ReplaceEntityReferenceRecursiveLimitRector" + ], + "project/datafield": [ + "ReplaceEntityReferenceRecursiveLimitRector" + ], + "project/content_browser": [ + "ReplaceEntityReferenceRecursiveLimitRector" + ], + "project/df": [ + "ReplaceEntityReferenceRecursiveLimitRector" + ], + "project/rendered_entity_list_formatter": [ + "ReplaceEntityReferenceRecursiveLimitRector" + ], + "project/published_referenced_entity": [ + "ReplaceEntityReferenceRecursiveLimitRector" + ], + "project/rendred_entity_list_formatter": [ + "ReplaceEntityReferenceRecursiveLimitRector" + ], + "project/image_as_media": [ + "ReplaceEntityReferenceRecursiveLimitRector" + ], + "project/entity_browser_block": [ + "ReplaceEntityReferenceRecursiveLimitRector" + ], + "project/link_field_display_mode_formatter": [ + "ReplaceEntityReferenceRecursiveLimitRector" + ], + "project/paragraphs_summary": [ + "ReplaceEntityReferenceRecursiveLimitRector" + ], + "project/external_entity": [ + "ReplaceEntityReferenceRecursiveLimitRector" + ], + "project/tripal": [ + "ReplaceEntityReferenceRecursiveLimitRector", + "ReplaceModuleHandlerGetNameRector" + ], + "project/seb": [ + "ReplaceEntityReferenceRecursiveLimitRector" + ], + "project/revisiondiff": [ + "ReplaceEntityReferenceRecursiveLimitRector" + ], + "project/entity_list": [ + "ReplaceEntityReferenceRecursiveLimitRector" + ], + "project/rest_entity_display": [ + "ReplaceEntityReferenceRecursiveLimitRector" + ], + "project/field_pager": [ + "ReplaceEntityReferenceRecursiveLimitRector" + ], + "project/nested_entity_reference_formatter": [ + "ReplaceEntityReferenceRecursiveLimitRector" + ], + "project/view_mode_crop": [ + "ReplaceEntityReferenceRecursiveLimitRector" + ], + "project/rocketship_core": [ + "ReplaceEntityReferenceRecursiveLimitRector" + ], + "project/dynamic_entity_reference": [ + "ReplaceEntityReferenceRecursiveLimitRector" + ], + "project/more_fields": [ + "ReplaceEntityReferenceRecursiveLimitRector", + "ViewsPluginHandlerManagerRector" + ], + "project/entity_reference_override": [ + "ReplaceEntityReferenceRecursiveLimitRector" + ], + "project/berf": [ + "ReplaceEntityReferenceRecursiveLimitRector" + ], + "project/multi_render_formatter": [ + "ReplaceEntityReferenceRecursiveLimitRector" + ], + "project/entity_overlay": [ + "ReplaceEntityReferenceRecursiveLimitRector" + ], + "project/entity_reference_ajax_formatter": [ + "ReplaceEntityReferenceRecursiveLimitRector" + ], + "project/entity_reference_dynamic_display": [ + "ReplaceEntityReferenceRecursiveLimitRector" + ], + "project/entity_reference_views_backfill": [ + "ReplaceEntityReferenceRecursiveLimitRector" + ], + "project/fieldgroup": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/fieldtool": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/fieldgroup_htabs": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/fieldgroup_callouts": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/bootstrap_fieldgroup": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/dt": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/fieldgroup_table": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/componentize": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/cck_fieldgroup_tabs": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/fieldgroup_placeholder": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/commerce_fieldgroup_panes": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/voipuser": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/volunteer_rally_features": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/bahai_incubator": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/donor_rally_features": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/elms_features": [ + "ReplaceFieldgroupToFieldsetRector", + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/cgpa_calculator": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/ct_plus": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/meetu": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/content_type_exporter": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/ui_patterns_settings": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/bundle_copy_profile2": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/field_group_vertical_tabs": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/cck_inputs": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/bundle_copy_commerce": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/bundle_copy": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/abtestui": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/popups_subedit": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/markaspot": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/certificate": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/jsonapi_example": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/inline_field_group": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/field_or": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/esm": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/sports_league": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/briefcase": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/inherit": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/ULT": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/icn": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/imagefetchr": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/profile_migrate": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/node_widget": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/msnf": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/content_display_order": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/bundles": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/bif": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/field_group_ajaxified_multipage": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/field_group_save_button": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/cck_signup": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/razoreye_biz": [ + "ReplaceFieldgroupToFieldsetRector", + "ReplaceModuleHandlerGetNameRector", + "ReplaceNodeAddBodyFieldRector", + "ReplaceNodeModuleProceduralFunctionsRector", + "ReplaceSessionManagerDeleteRector", + "ReplaceSystemPerformanceGzipKeyRector", + "ReplaceThemeGetSettingRector", + "ReplaceViewsProceduralFunctionsRector" + ], + "project/field_group": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/hexagon": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/acc": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/cck_sync": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/wim": [ + "ReplaceFieldgroupToFieldsetRector", + "ReplaceRequestTimeConstantRector" + ], + "project/skillset_inview": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/aurigma": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/social_media_image_generator": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/microdata": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/field_group_table_component": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/simple_multistep": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/podgroups": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/pirets": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/syndicator": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/field_group_label_classes": [ + "ReplaceFieldgroupToFieldsetRector" + ], + "project/sshid": [ + "ReplaceFileGetContentHeadersRector" + ], + "project/private_image_cache": [ + "ReplaceFileGetContentHeadersRector" + ], + "project/field_formatter_key_label": [ + "ReplaceFileGetContentHeadersRector" + ], + "project/protected_file": [ + "ReplaceFileGetContentHeadersRector" + ], + "project/download_file": [ + "ReplaceFileGetContentHeadersRector" + ], + "project/commerce_invoice_ubl": [ + "ReplaceFileGetContentHeadersRector" + ], + "project/file_visibility": [ + "ReplaceFileGetContentHeadersRector" + ], + "project/archibald": [ + "ReplaceFileGetContentHeadersRector" + ], + "project/media_icon_deliver": [ + "ReplaceFileGetContentHeadersRector" + ], + "project/unpublished_file": [ + "ReplaceFileGetContentHeadersRector" + ], + "project/pdftemplate": [ + "ReplaceFileGetContentHeadersRector" + ], + "project/commerce_invoice": [ + "ReplaceFileGetContentHeadersRector" + ], + "project/tmgmt": [ + "ReplaceFileGetContentHeadersRector", + "ViewsPluginHandlerManagerRector" + ], + "project/git_book": [ + "ReplaceFileGetContentHeadersRector" + ], + "project/node_revision_private_files_access_permission": [ + "ReplaceFileGetContentHeadersRector" + ], + "project/image_download_formatter": [ + "ReplaceFileGetContentHeadersRector" + ], + "project/commerce_purchase_order": [ + "ReplaceFileGetContentHeadersRector" + ], + "project/flipping_book": [ + "ReplaceFileGetContentHeadersRector" + ], + "project/pathed_files": [ + "ReplaceFileGetContentHeadersRector" + ], + "project/node_field": [ + "ReplaceFileGetContentHeadersRector" + ], + "project/onetime_download": [ + "ReplaceFileGetContentHeadersRector" + ], + "project/rules_letter": [ + "ReplaceFileGetContentHeadersRector" + ], + "project/dam": [ + "ReplaceFileGetContentHeadersRector" + ], + "project/skilling": [ + "ReplaceFileGetContentHeadersRector" + ], + "project/icomoon": [ + "ReplaceFileGetContentHeadersRector" + ], + "project/tmgmt_server": [ + "ReplaceFileGetContentHeadersRector" + ], + "project/fontello": [ + "ReplaceFileGetContentHeadersRector" + ], + "project/lingo24": [ + "ReplaceFileGetContentHeadersRector" + ], + "project/feeds": [ + "ReplaceFileGetContentHeadersRector" + ], + "project/wf": [ + "ReplaceFileGetContentHeadersRector" + ], + "project/file_shelf": [ + "ReplaceFileGetContentHeadersRector" + ], + "project/bassets_sw": [ + "ReplaceFileGetContentHeadersRector" + ], + "project/git_wiki_help": [ + "ReplaceFileGetContentHeadersRector" + ], + "project/erpal": [ + "ReplaceFileGetContentHeadersRector" + ], + "project/file_entity": [ + "ReplaceFileGetContentHeadersRector" + ], + "project/temporary_download": [ + "ReplaceFileGetContentHeadersRector" + ], + "project/yamlform": [ + "ReplaceFileGetContentHeadersRector", + "SystemTimeZonesRector" + ], + "project/reporting_cloud": [ + "ReplaceFileGetContentHeadersRector" + ], + "project/drupdates": [ + "ReplaceFileGetContentHeadersRector" + ], + "project/endicia": [ + "ReplaceFileGetContentHeadersRector" + ], + "project/odir": [ + "ReplaceFileGetContentHeadersRector", + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/uc_fedex": [ + "ReplaceFileGetContentHeadersRector" + ], + "project/dxpr_builder": [ + "ReplaceFileGetContentHeadersRector" + ], + "project/cforge": [ + "ReplaceFileGetContentHeadersRector" + ], + "project/1635422": [ + "ReplaceFileGetContentHeadersRector", + "ReplaceNodeAccessViewAllNodesRector" + ], + "project/views_query_na_subquery": [ + "ReplaceNodeAccessViewAllNodesRector" + ], + "project/view_usernames_node_author": [ + "ReplaceNodeAccessViewAllNodesRector" + ], + "project/module_grants": [ + "ReplaceNodeAccessViewAllNodesRector" + ], + "project/entity_gallery": [ + "ReplaceNodeAccessViewAllNodesRector", + "ReplaceRequestTimeConstantRector" + ], + "project/evaluation": [ + "ReplaceNodeAccessViewAllNodesRector" + ], + "project/drupal_wall": [ + "ReplaceNodeAddBodyFieldRector" + ], + "project/commune": [ + "ReplaceNodeAddBodyFieldRector" + ], + "project/tome": [ + "ReplaceNodeAddBodyFieldRector" + ], + "project/closedquestion_scoreboard": [ + "ReplaceNodeAddBodyFieldRector" + ], + "project/search_by_page": [ + "ReplaceNodeAddBodyFieldRector" + ], + "project/og_groupcontent": [ + "ReplaceNodeAddBodyFieldRector" + ], + "project/virtualcare": [ + "ReplaceNodeAddBodyFieldRector", + "ReplaceNodeModuleProceduralFunctionsRector", + "ReplaceRequestTimeConstantRector", + "ReplaceThemeGetSettingRector" + ], + "project/ctools": [ + "ReplaceNodeAddBodyFieldRector", + "ViewsPluginHandlerManagerRector" + ], + "project/ai_eca": [ + "ReplaceNodeAddBodyFieldRector" + ], + "project/druvel": [ + "ReplaceNodeAddBodyFieldRector" + ], + "project/recruit": [ + "ReplaceNodeAddBodyFieldRector" + ], + "project/administration_notification": [ + "ReplaceNodeAddBodyFieldRector" + ], + "project/drush": [ + "ReplaceNodeAddBodyFieldRector" + ], + "project/civicrm_event_receipts": [ + "ReplaceNodeAddBodyFieldRector" + ], + "project/snippets": [ + "ReplaceNodeAddBodyFieldRector" + ], + "project/experd": [ + "ReplaceNodeAddBodyFieldRector" + ], + "project/latest": [ + "ReplaceNodeAddBodyFieldRector" + ], + "project/drupal_cli": [ + "ReplaceNodeAddBodyFieldRector" + ], + "project/rocketship": [ + "ReplaceNodeAddBodyFieldRector" + ], + "project/smartling": [ + "ReplaceNodeAddBodyFieldRector" + ], + "project/external_page_redirect": [ + "ReplaceNodeAddBodyFieldRector" + ], + "project/guidance": [ + "ReplaceNodeAddBodyFieldRector" + ], + "project/vinculum": [ + "ReplaceNodeAddBodyFieldRector" + ], + "project/smartparticipation": [ + "ReplaceNodeAddBodyFieldRector", + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/family": [ + "ReplaceNodeAddBodyFieldRector" + ], + "project/administrative_help": [ + "ReplaceNodeAddBodyFieldRector" + ], + "project/sva": [ + "ReplaceNodeAddBodyFieldRector" + ], + "project/feedstextareafetcher": [ + "ReplaceNodeAddBodyFieldRector" + ], + "project/cultura": [ + "ReplaceNodeAddBodyFieldRector" + ], + "project/votingapi": [ + "ReplaceNodeAddBodyFieldRector", + "ReplacePdoFetchConstantsRector" + ], + "project/social_content": [ + "ReplaceNodeAddBodyFieldRector" + ], + "project/automatic_field_saver": [ + "ReplaceNodeAddBodyFieldRector" + ], + "project/rdf_sync": [ + "ReplaceNodeAddBodyFieldRector" + ], + "project/rio": [ + "ReplaceNodeAddBodyFieldRector" + ], + "project/wysiwyg_fields": [ + "ReplaceNodeAddBodyFieldRector" + ], + "project/display_machine_name": [ + "ReplaceNodeAddBodyFieldRector" + ], + "project/lingotek": [ + "ReplaceNodeAddBodyFieldRector" + ], + "project/opigno_glossary": [ + "ReplaceNodeAddBodyFieldRector" + ], + "project/prh_search": [ + "ReplaceNodeAddBodyFieldRector" + ], + "project/commerce_behat": [ + "ReplaceNodeAddBodyFieldRector" + ], + "project/references": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/views_node_access": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/og_menu_single": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/basic_stats_token": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/form_default_button": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/acal": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/update_external_links": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/comment_easy_reply": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/entity_translation_unified_form": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/og_admin_block": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/node_title_help_text": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/simply_signups": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/user_content_type": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/util": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/simpleantispam": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/auto_nodetitle": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/taxonomy_autolink": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/taxonomy_linking": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/node_menu_item_visibility_default_behaviour": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/ajax_node_loader": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/node_clone": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/fast_gallery": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/node_creator_system_details": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/csf": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/codebook_print_pdf": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/uyan": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/factorydrone": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/nodetypeviews": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/field_weight": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/codebook_core": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/ds": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/openpolitic": [ + "ReplaceNodeModuleProceduralFunctionsRector", + "ReplaceSystemPerformanceGzipKeyRector" + ], + "project/updated": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/content_trust": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/nopremium": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/multipage_navigation": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/indexpage": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/node_creation_links": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/domain_video_sitemap": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/views_content_cache": [ + "ReplaceNodeModuleProceduralFunctionsRector", + "ReplaceRequestTimeConstantRector" + ], + "project/link_description_attributes": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/googlenews": [ + "ReplaceNodeModuleProceduralFunctionsRector", + "ReplaceViewsProceduralFunctionsRector" + ], + "project/persistent_menu_items": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/commons_migration": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/hierarchical_select_access": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/campaignion": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/read_time": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/npop": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/sharebar": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/colors": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/fbconnect": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/revision_all": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/stop_broken_link_in_body": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/page_menu_reorder": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/socialshare": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/baidumap_fieldtype": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/node_randomizer": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/readmore_ajax": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/oa_wizard": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/copyscape": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/admin_toolbar_content_languages": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/content_access_view": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/markdown_exporter": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/custom_search": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/twitter": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/admin_notify": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/inspector": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/rsvp_list": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/secure_nodes": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/simplenews_content_selection": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/drupalgap": [ + "ReplaceNodeModuleProceduralFunctionsRector", + "SystemTimeZonesRector" + ], + "project/nodeaccesskeys": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/project": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/backdrop_upgrade_status": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/openpublic": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/blurry": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/anonymous_subscriptions": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/rsvplist": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/subdomain": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/meerkat": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/simple_nodeblock": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/html_title": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/tide_api": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/tide_core": [ + "ReplaceNodeModuleProceduralFunctionsRector", + "ViewsPluginHandlerManagerRector" + ], + "project/collection": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/edit_content_type_tab": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/node_singles": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/quick_node_clone": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/addanother": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/content_dependency_graph": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/public_revisions": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/hold_my_draft": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/duplicate_node": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/tracker": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/entity_reference_edit_link": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/content_admin_tools": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/communications": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/pager_for_content_type": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/micronode_block": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/skyword": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/find_text": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/token": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/pp_graphsearch": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/customizable_entities": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/node_gallery_bulk_operations": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/openscholar_vsite": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/merci_barcode_labels": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/question": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/autotag": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/move_user": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/transfer_user_content": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/merci_signup": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/entity_sort": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/reassign_user_content": [ + "ReplaceModuleHandlerGetNameRector", + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/usercancel_contentassigntoadmin": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/node_gallery_taxonomy": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/filebrowser": [ + "ReplaceNodeModuleProceduralFunctionsRector", + "ReplacePdoFetchConstantsRector" + ], + "project/user_delete_reassign": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/mmedia": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/ajaxnewcounter": [ + "ReplaceNodeModuleProceduralFunctionsRector", + "ReplaceViewsProceduralFunctionsRector" + ], + "project/contentassigntootheruser": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/languageassign": [ + "ReplaceNodeModuleProceduralFunctionsRector" + ], + "project/babel": [ + "ReplacePdoFetchConstantsRector" + ], + "project/track_usage": [ + "ReplacePdoFetchConstantsRector" + ], + "project/mysql_async": [ + "ReplacePdoFetchConstantsRector" + ], + "project/d7": [ + "ReplacePdoFetchConstantsRector" + ], + "project/dbtng": [ + "ReplacePdoFetchConstantsRector" + ], + "project/multitype_slider": [ + "ReplacePdoFetchConstantsRector" + ], + "project/storage_api": [ + "ReplacePdoFetchConstantsRector" + ], + "project/gtfs_511": [ + "ReplacePdoFetchConstantsRector" + ], + "project/gtfs_geo": [ + "ReplacePdoFetchConstantsRector" + ], + "project/gtfs_rt": [ + "ReplacePdoFetchConstantsRector" + ], + "project/junk_drawer": [ + "ReplacePdoFetchConstantsRector" + ], + "project/gtfs": [ + "ReplacePdoFetchConstantsRector" + ], + "project/scoopit": [ + "ReplacePdoFetchConstantsRector" + ], + "project/conreg": [ + "ReplacePdoFetchConstantsRector" + ], + "project/survey_builder": [ + "ReplacePdoFetchConstantsRector" + ], + "project/graphql_shield": [ + "ReplacePdoFetchConstantsRector" + ], + "project/accessible": [ + "ReplacePdoFetchConstantsRector" + ], + "project/visitor_actions": [ + "ReplacePdoFetchConstantsRector" + ], + "project/commerce_store_override": [ + "ReplacePdoFetchConstantsRector" + ], + "project/field_completeness": [ + "ReplacePdoFetchConstantsRector" + ], + "project/video_toolbox": [ + "ReplacePdoFetchConstantsRector" + ], + "project/ai_schemadotorg_jsonld": [ + "ReplacePdoFetchConstantsRector" + ], + "project/tmgmt_smartcat": [ + "ReplacePdoFetchConstantsRector" + ], + "project/oracle": [ + "ReplacePdoFetchConstantsRector" + ], + "project/lgpd": [ + "ReplacePdoFetchConstantsRector" + ], + "project/ayrshare": [ + "ReplacePdoFetchConstantsRector" + ], + "project/social_auth_buttons": [ + "ReplacePdoFetchConstantsRector" + ], + "project/acquia_migrate": [ + "ReplacePdoFetchConstantsRector" + ], + "project/mail_box_management": [ + "ReplacePdoFetchConstantsRector" + ], + "project/payment_button_drupal_plugin": [ + "ReplacePdoFetchConstantsRector" + ], + "project/entitree": [ + "ReplacePdoFetchConstantsRector" + ], + "project/imotilux": [ + "ReplacePdoFetchConstantsRector" + ], + "project/book_library_api": [ + "ReplacePdoFetchConstantsRector" + ], + "project/mongodb_dbtng": [ + "ReplacePdoFetchConstantsRector" + ], + "project/entity_translation": [ + "ReplacePdoFetchConstantsRector", + "ReplaceRequestTimeConstantRector" + ], + "project/tweet_reference": [ + "ReplacePdoFetchConstantsRector" + ], + "project/hubspot": [ + "ReplacePdoFetchConstantsRector" + ], + "project/relation_add": [ + "ReplacePdoFetchConstantsRector" + ], + "project/gdpr": [ + "ReplacePdoFetchConstantsRector" + ], + "project/sgd_watchdog_summary": [ + "ReplacePdoFetchConstantsRector" + ], + "project/sgd_user_status": [ + "ReplacePdoFetchConstantsRector" + ], + "project/ms_react": [ + "ReplacePdoFetchConstantsRector" + ], + "project/rating_list": [ + "ReplacePdoFetchConstantsRector" + ], + "project/styles": [ + "ReplacePdoFetchConstantsRector" + ], + "project/opac": [ + "ReplacePdoFetchConstantsRector" + ], + "project/sqlbuddy": [ + "ReplacePdoFetchConstantsRector" + ], + "project/contact_centre": [ + "ReplacePdoFetchConstantsRector" + ], + "project/bitcache": [ + "ReplacePdoFetchConstantsRector" + ], + "project/amber": [ + "ReplacePdoFetchConstantsRector" + ], + "project/maps_suite": [ + "ReplacePdoFetchConstantsRector" + ], + "project/menu_minipanels": [ + "ReplacePdoFetchConstantsRector" + ], + "project/livre": [ + "ReplacePdoFetchConstantsRector" + ], + "project/paddle_menu_manager": [ + "ReplacePdoFetchConstantsRector" + ], + "project/media_migration": [ + "ReplacePdoFetchConstantsRector" + ], + "project/autoslave": [ + "ReplacePdoFetchConstantsRector" + ], + "project/smileys_field": [ + "ReplacePdoFetchConstantsRector" + ], + "project/arch": [ + "ReplacePdoFetchConstantsRector" + ], + "project/schemadotorg": [ + "ReplaceRecipeRunnerInstallModuleRector" + ], + "project/entity_visibility_preview": [ + "ReplaceSessionManagerDeleteRector", + "ReplaceSessionWritesWithRequestSessionRector" + ], + "project/brightcove": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/drupal_saml_bridge": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/cookie_samesite_support": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/session_limit": [ + "ReplaceSessionManagerDeleteRector", + "ReplaceSessionWritesWithRequestSessionRector" + ], + "project/recently_read": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/logout_timeout": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/smartid_auth": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/bing_ads": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/change_author_action": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/node_export": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/facebook_pixel": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/tupas": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/bulk_update_fields_commerce": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/kamihaya_cms": [ + "ReplaceSessionManagerDeleteRector", + "ReplaceThemeGetSettingRector" + ], + "project/acumatica": [ + "ReplaceSessionManagerDeleteRector", + "ReplaceSessionWritesWithRequestSessionRector" + ], + "project/cm_data_layer": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/commerce_qb_webconnect": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/global_gateway": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/simpleavs": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/eid_auth": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/evangelische_termine": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/xing_connect": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/saml_idp": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/mailing_list": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/twilio_otp_login": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/examplelist": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/registration_form": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/loginnotification": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/rules": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/questions_answers": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/stenographer": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/entity_sync": [ + "ReplaceSessionManagerDeleteRector", + "ReplaceSessionWritesWithRequestSessionRector" + ], + "project/bulk_copy_fields": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/activity": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/anonymoussession": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/entity_sync_odata": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/real_estate_lp_profile": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/userswitch": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/login_alert": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/eus": [ + "ReplaceSessionManagerDeleteRector", + "ReplaceUserSessionNamePropertyRector" + ], + "project/commerce_ticketing_checkin": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/session_inspector": [ + "ReplaceSessionManagerDeleteRector", + "ReplaceUserSessionNamePropertyRector" + ], + "project/page_hits": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/admin_can_login_anyuser": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/big_pipe_demo": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/session_management": [ + "ReplaceSessionManagerDeleteRector", + "ReplaceUserSessionNamePropertyRector" + ], + "project/csv_to_config": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/quicker_login": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/oidc": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/devel": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/bulk_update_fields": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/externalauth_force": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/restrict_by_ip": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/user_logout": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/tmgmt_smartling": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/oidc_mcpf": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/simple_node_importer": [ + "ReplaceSessionManagerDeleteRector" + ], + "project/session_entity": [ + "ReplaceSessionWritesWithRequestSessionRector" + ], + "project/session_proxy": [ + "ReplaceSessionWritesWithRequestSessionRector" + ], + "project/xmpp_server": [ + "ReplaceSessionWritesWithRequestSessionRector" + ], + "project/jp_mobile": [ + "ReplaceSessionWritesWithRequestSessionRector" + ], + "project/commerce7_razorpay": [ + "ReplaceSessionWritesWithRequestSessionRector" + ], + "project/kalvi_core": [ + "ReplaceSessionWritesWithRequestSessionRector" + ], + "project/events_features": [ + "ReplaceSessionWritesWithRequestSessionRector" + ], + "project/cache": [ + "ReplaceSessionWritesWithRequestSessionRector" + ], + "project/telega": [ + "ReplaceSessionWritesWithRequestSessionRector" + ], + "project/chatwee": [ + "ReplaceSessionWritesWithRequestSessionRector" + ], + "project/cypress": [ + "ReplaceSessionWritesWithRequestSessionRector" + ], + "project/intercept": [ + "ReplaceSessionWritesWithRequestSessionRector" + ], + "project/soauth": [ + "ReplaceSessionWritesWithRequestSessionRector" + ], + "project/views_extras": [ + "ReplaceSessionWritesWithRequestSessionRector" + ], + "project/casperjs": [ + "ReplaceSessionWritesWithRequestSessionRector" + ], + "project/eventbrite_one_way_sync": [ + "ReplaceSessionWritesWithRequestSessionRector" + ], + "project/drupal_canvas_plugin": [ + "ReplaceSessionWritesWithRequestSessionRector" + ], + "project/delphi": [ + "ReplaceSessionWritesWithRequestSessionRector" + ], + "project/drd": [ + "ReplaceModuleHandlerGetNameRector", + "ReplaceSessionWritesWithRequestSessionRector", + "ReplaceSystemPerformanceGzipKeyRector" + ], + "project/simplesamlphp_sp": [ + "ReplaceSessionWritesWithRequestSessionRector" + ], + "project/drupalcon_base": [ + "ReplaceSessionWritesWithRequestSessionRector" + ], + "project/css_gzip": [ + "ReplaceSystemPerformanceGzipKeyRector" + ], + "project/flysystem": [ + "ReplaceSystemPerformanceGzipKeyRector" + ], + "project/tone": [ + "ReplaceSystemPerformanceGzipKeyRector" + ], + "project/settingsphp": [ + "ReplaceSystemPerformanceGzipKeyRector" + ], + "project/css_emimage": [ + "ReplaceSystemPerformanceGzipKeyRector" + ], + "project/timber": [ + "ReplaceSystemPerformanceGzipKeyRector" + ], + "project/hpcloud": [ + "ReplaceSystemPerformanceGzipKeyRector" + ], + "project/openstack_storage": [ + "ReplaceSystemPerformanceGzipKeyRector" + ], + "project/simple_aggregation": [ + "ReplaceSystemPerformanceGzipKeyRector" + ], + "project/advagg": [ + "ReplaceSystemPerformanceGzipKeyRector" + ], + "project/d_test": [ + "ReplaceSystemPerformanceGzipKeyRector" + ], + "project/exsen": [ + "ReplaceSystemPerformanceGzipKeyRector" + ], + "project/smartcache": [ + "ReplaceSystemPerformanceGzipKeyRector" + ], + "project/devinci": [ + "ReplaceSystemPerformanceGzipKeyRector" + ], + "project/barracuda": [ + "ReplaceSystemPerformanceGzipKeyRector" + ], + "project/octopus": [ + "ReplaceSystemPerformanceGzipKeyRector" + ], + "project/cf": [ + "ReplaceSystemPerformanceGzipKeyRector" + ], + "project/domain_wise_aggregation": [ + "ReplaceSystemPerformanceGzipKeyRector" + ], + "project/bootstrap4": [ + "ReplaceSystemPerformanceGzipKeyRector" + ], + "project/bootstrap5": [ + "ReplaceSystemPerformanceGzipKeyRector" + ], + "project/stage_one_theme": [ + "ReplaceSystemPerformanceGzipKeyRector" + ], + "project/dawn": [ + "ReplaceSystemPerformanceGzipKeyRector" + ], + "project/background_image": [ + "ReplaceSystemPerformanceGzipKeyRector" + ], + "project/vagrant": [ + "ReplaceSystemPerformanceGzipKeyRector" + ], + "project/audit": [ + "ReplaceSystemPerformanceGzipKeyRector" + ], + "project/novalnet": [ + "ReplaceSystemPerformanceGzipKeyRector" + ], + "project/mongodrop": [ + "ReplaceSystemPerformanceGzipKeyRector" + ], + "project/ads": [ + "ReplaceSystemPerformanceGzipKeyRector" + ], + "project/bundle_aggregation": [ + "ReplaceSystemPerformanceGzipKeyRector" + ], + "project/drupalsqlsrvci": [ + "ReplaceSystemPerformanceGzipKeyRector" + ], + "project/tmgmt_transifex": [ + "ReplaceSystemPerformanceGzipKeyRector" + ], + "project/infrastructure": [ + "ReplaceSystemPerformanceGzipKeyRector" + ], + "project/dsfr": [ + "ReplaceThemeGetSettingRector" + ], + "project/browsersync": [ + "ReplaceThemeGetSettingRector" + ], + "project/commerce_factuursturen": [ + "ReplaceThemeGetSettingRector" + ], + "project/arctica": [ + "ReplaceThemeGetSettingRector" + ], + "project/dxpr_theme": [ + "ReplaceThemeGetSettingRector" + ], + "project/glazed_free": [ + "ReplaceThemeGetSettingRector" + ], + "project/diner_delights": [ + "ReplaceThemeGetSettingRector" + ], + "project/xara": [ + "ReplaceThemeGetSettingRector" + ], + "project/bootstrap_italia": [ + "ReplaceThemeGetSettingRector" + ], + "project/onus": [ + "ReplaceThemeGetSettingRector" + ], + "project/edux": [ + "ReplaceThemeGetSettingRector" + ], + "project/ruhi": [ + "ReplaceThemeGetSettingRector" + ], + "project/eau_theme": [ + "ReplaceThemeGetSettingRector" + ], + "project/vani": [ + "ReplaceThemeGetSettingRector" + ], + "project/lgms": [ + "ReplaceThemeGetSettingRector" + ], + "project/multi_purpose": [ + "ReplaceThemeGetSettingRector" + ], + "project/marvelous": [ + "ReplaceThemeGetSettingRector" + ], + "project/yg_business_plus": [ + "ReplaceThemeGetSettingRector" + ], + "project/tactic": [ + "ReplaceThemeGetSettingRector" + ], + "project/denver": [ + "ReplaceThemeGetSettingRector" + ], + "project/belle": [ + "ReplaceThemeGetSettingRector" + ], + "project/crypto_distribution": [ + "ReplaceThemeGetSettingRector" + ], + "project/photogenictheme": [ + "ReplaceThemeGetSettingRector" + ], + "project/yg_business_line": [ + "ReplaceThemeGetSettingRector" + ], + "project/kart": [ + "ReplaceThemeGetSettingRector" + ], + "project/catalog_lite": [ + "ReplaceThemeGetSettingRector" + ], + "project/conference_lite": [ + "ReplaceThemeGetSettingRector" + ], + "project/yg_hotel": [ + "ReplaceThemeGetSettingRector" + ], + "project/novel_delights": [ + "ReplaceThemeGetSettingRector" + ], + "project/dark_awesome": [ + "ReplaceThemeGetSettingRector" + ], + "project/smash_lite": [ + "ReplaceThemeGetSettingRector" + ], + "project/potent_allure": [ + "ReplaceThemeGetSettingRector" + ], + "project/yg_iconic": [ + "ReplaceThemeGetSettingRector" + ], + "project/animal_shelter": [ + "ReplaceThemeGetSettingRector" + ], + "project/byu_theme": [ + "ReplaceThemeGetSettingRector" + ], + "project/black_hole": [ + "ReplaceThemeGetSettingRector" + ], + "project/elegant_showcase": [ + "ReplaceThemeGetSettingRector" + ], + "project/feature_boost": [ + "ReplaceThemeGetSettingRector" + ], + "project/zuvi": [ + "ReplaceThemeGetSettingRector" + ], + "project/aether": [ + "ReplaceThemeGetSettingRector" + ], + "project/mahi": [ + "ReplaceThemeGetSettingRector" + ], + "project/zeropoint": [ + "ReplaceThemeGetSettingRector" + ], + "project/business_dev": [ + "ReplaceThemeGetSettingRector" + ], + "project/uni": [ + "ReplaceThemeGetSettingRector" + ], + "project/edwt": [ + "ReplaceThemeGetSettingRector" + ], + "project/scholarly_lite": [ + "ReplaceThemeGetSettingRector" + ], + "project/abc": [ + "ReplaceThemeGetSettingRector" + ], + "project/showcase_lite": [ + "ReplaceThemeGetSettingRector" + ], + "project/yg_aesthetic": [ + "ReplaceThemeGetSettingRector" + ], + "project/yg_booster": [ + "ReplaceThemeGetSettingRector" + ], + "project/saar": [ + "ReplaceThemeGetSettingRector" + ], + "project/yg_charity": [ + "ReplaceThemeGetSettingRector" + ], + "project/tara": [ + "ReplaceThemeGetSettingRector" + ], + "project/yg_creative": [ + "ReplaceThemeGetSettingRector" + ], + "project/yg_flew": [ + "ReplaceThemeGetSettingRector" + ], + "project/mobile_jquery": [ + "ReplaceThemeGetSettingRector" + ], + "project/harmony_haven": [ + "ReplaceThemeGetSettingRector" + ], + "project/yg_medical": [ + "ReplaceThemeGetSettingRector" + ], + "project/dolphin_theme": [ + "ReplaceThemeGetSettingRector" + ], + "project/pets_clinic": [ + "ReplaceThemeGetSettingRector" + ], + "project/mili": [ + "ReplaceThemeGetSettingRector" + ], + "project/particles_orange": [ + "ReplaceThemeGetSettingRector" + ], + "project/nava": [ + "ReplaceThemeGetSettingRector" + ], + "project/green_theme": [ + "ReplaceThemeGetSettingRector" + ], + "project/yg_black": [ + "ReplaceThemeGetSettingRector" + ], + "project/berry": [ + "ReplaceThemeGetSettingRector" + ], + "project/dark_page": [ + "ReplaceThemeGetSettingRector" + ], + "project/corporate_lite": [ + "ReplaceThemeGetSettingRector" + ], + "project/cellular4drupal": [ + "ReplaceThemeGetSettingRector" + ], + "project/rhythm": [ + "ReplaceThemeGetSettingRector" + ], + "project/ajans": [ + "ReplaceThemeGetSettingRector" + ], + "project/fashion_beauty": [ + "ReplaceThemeGetSettingRector" + ], + "project/portal_theme": [ + "ReplaceThemeGetSettingRector" + ], + "project/zinble": [ + "ReplaceThemeGetSettingRector" + ], + "project/diba_clean": [ + "ReplaceThemeGetSettingRector" + ], + "project/adt_basetheme": [ + "ReplaceThemeGetSettingRector" + ], + "project/yg_law_firm": [ + "ReplaceThemeGetSettingRector" + ], + "project/power_portfolio": [ + "ReplaceThemeGetSettingRector" + ], + "project/yg_medicare": [ + "ReplaceThemeGetSettingRector" + ], + "project/guesthouse_lite": [ + "ReplaceThemeGetSettingRector" + ], + "project/minimal_lite": [ + "ReplaceThemeGetSettingRector" + ], + "project/idyllic": [ + "ReplaceThemeGetSettingRector" + ], + "project/mycity": [ + "ReplaceThemeGetSettingRector" + ], + "project/creative_innovative": [ + "ReplaceThemeGetSettingRector" + ], + "project/decorx": [ + "ReplaceThemeGetSettingRector" + ], + "project/yg_solid": [ + "ReplaceThemeGetSettingRector" + ], + "project/stack_dd": [ + "ReplaceThemeGetSettingRector" + ], + "project/agov_base": [ + "ReplaceThemeGetSettingRector" + ], + "project/materialize": [ + "ReplaceThemeGetSettingRector" + ], + "project/plus": [ + "ReplaceThemeGetSettingRector" + ], + "project/bootstrap3": [ + "ReplaceThemeGetSettingRector" + ], + "project/controller_annotations": [ + "ReplaceUserSessionNamePropertyRector" + ], + "project/acquia_perz": [ + "ReplaceUserSessionNamePropertyRector" + ], + "project/acquia_vwo": [ + "ReplaceUserSessionNamePropertyRector" + ], + "project/complex_workflow": [ + "ReplaceUserSessionNamePropertyRector" + ], + "project/dbee": [ + "ReplaceUserSessionNamePropertyRector" + ], + "project/lw_groups": [ + "ReplaceUserSessionNamePropertyRector" + ], + "project/role_inheritance": [ + "ReplaceUserSessionNamePropertyRector" + ], + "project/clu": [ + "ReplaceUserSessionNamePropertyRector" + ], + "project/restful": [ + "ReplaceUserSessionNamePropertyRector" + ], + "project/acquia_commercemanager": [ + "ReplaceModuleHandlerGetNameRector", + "ReplaceRequestTimeConstantRector", + "ReplaceUserSessionNamePropertyRector" + ], + "project/drupalfit": [ + "ReplaceUserSessionNamePropertyRector" + ], + "project/entity_mesh": [ + "ReplaceUserSessionNamePropertyRector" + ], + "project/monitoring": [ + "ReplaceUserSessionNamePropertyRector" + ], + "project/paddle_selenium_tests": [ + "ReplaceUserSessionNamePropertyRector" + ], + "project/probo": [ + "ReplaceUserSessionNamePropertyRector" + ], + "project/program": [ + "ReplaceUserSessionNamePropertyRector" + ], + "project/search_api_exclude_lb": [ + "ReplaceUserSessionNamePropertyRector" + ], + "project/drupal_content_repository": [ + "ReplaceUserSessionNamePropertyRector" + ], + "project/field": [ + "ReplaceUserSessionNamePropertyRector" + ], + "project/neon_api": [ + "ReplaceUserSessionNamePropertyRector" + ], + "project/miniorange_oauth_client": [ + "ReplaceUserSessionNamePropertyRector" + ], + "project/publisso_gold": [ + "ReplaceUserSessionNamePropertyRector" + ], + "project/apigee_m10n": [ + "ReplaceUserSessionNamePropertyRector" + ], + "project/scorm_field": [ + "ReplaceUserSessionNamePropertyRector" + ], + "project/services_session_token_auth": [ + "ReplaceUserSessionNamePropertyRector" + ], + "project/synonyms": [ + "ReplaceUserSessionNamePropertyRector" + ], + "project/turbo": [ + "ReplaceUserSessionNamePropertyRector" + ], + "project/riddler": [ + "ReplaceUserSessionNamePropertyRector" + ], + "project/socialblue": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/drupal_extra": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/commerce_payleap": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/featured_news_feature": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/delivery": [ + "ReplaceViewsProceduralFunctionsRector", + "ViewsPluginHandlerManagerRector" + ], + "project/gathercontent": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/vfd": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/abookings": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/feeds_view_parser": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/at_theming": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/outlayer": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/dvg": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/sensor_hub": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/wechat_views": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/quicktabs": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/yaqut_epub_generator": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/conference_suite": [ + "ReplaceRequestTimeConstantRector", + "ReplaceViewsProceduralFunctionsRector", + "SystemTimeZonesRector" + ], + "project/ercore": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/courseplanner": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/hunter": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/eform": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/manymail": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/product_reference_view": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/oa_folders": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/degov": [ + "ReplaceModuleHandlerGetNameRector", + "ReplaceViewsProceduralFunctionsRector" + ], + "project/proconcom": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/ctools_view_access": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/content_packager": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/sshop": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/nodereference_basket": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/abinbev_gmap": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/background_audio": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/rules_example": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/simple_sitemap": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/time_tracker_simple": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/simple_sitemap_views": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/viewfield": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/simple_sitemap_authenticated": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/next_views_entity_reference": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/deeplink": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/pdfck": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/highcharts": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/prometheus": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/featured_content": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/openstory": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/student_signup": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/knowledge": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/shopcart": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/openbadging": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/feeds_tamper_string2id": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/facet_granular_date": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/qtools_common": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/commerce_checkout_products_list": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/ectostar_standard": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/entityform": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/xml_export": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/twig_tweak": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/api": [ + "ReplaceViewsProceduralFunctionsRector", + "ViewsPluginHandlerManagerRector" + ], + "project/hose_xml": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/views": [ + "ReplaceViewsProceduralFunctionsRector", + "SystemTimeZonesRector" + ], + "project/internet_archive": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/taxonomy_display": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/related_content": [ + "ReplaceViewsProceduralFunctionsRector" + ], + "project/views_migration": [ + "ViewsPluginHandlerManagerRector" + ], + "project/migrate_views": [ + "ViewsPluginHandlerManagerRector" + ], + "project/plugin": [ + "ViewsPluginHandlerManagerRector" + ], + "project/itunes_rss": [ + "ViewsPluginHandlerManagerRector" + ], + "project/quick_pages": [ + "ViewsPluginHandlerManagerRector" + ], + "project/bat": [ + "ViewsPluginHandlerManagerRector" + ], + "project/social_group_types": [ + "ViewsPluginHandlerManagerRector" + ], + "project/pub_options": [ + "ViewsPluginHandlerManagerRector" + ], + "project/grant": [ + "ViewsPluginHandlerManagerRector" + ], + "project/entity_reference_uuid": [ + "ViewsPluginHandlerManagerRector" + ], + "project/shopify": [ + "ViewsPluginHandlerManagerRector" + ], + "project/muser": [ + "ViewsPluginHandlerManagerRector" + ], + "project/relation": [ + "ViewsPluginHandlerManagerRector" + ], + "project/basket": [ + "ReplaceModuleHandlerGetNameRector", + "ViewsPluginHandlerManagerRector" + ], + "project/config_pages": [ + "ViewsPluginHandlerManagerRector" + ], + "project/access_policy": [ + "SystemTimeZonesRector", + "ViewsPluginHandlerManagerRector" + ], + "project/ai_agents": [ + "ViewsPluginHandlerManagerRector" + ], + "project/views_moderation_state_weights": [ + "ViewsPluginHandlerManagerRector" + ], + "project/past": [ + "ViewsPluginHandlerManagerRector" + ], + "project/tally": [ + "ViewsPluginHandlerManagerRector" + ], + "project/opendevportal": [ + "ViewsPluginHandlerManagerRector" + ], + "project/expirable_content": [ + "ViewsPluginHandlerManagerRector" + ], + "project/group_domain": [ + "ViewsPluginHandlerManagerRector" + ], + "project/rel_content": [ + "ViewsPluginHandlerManagerRector" + ], + "project/a12s_locations": [ + "ViewsPluginHandlerManagerRector" + ], + "project/opigno_learning_path": [ + "ViewsPluginHandlerManagerRector" + ], + "project/ezcontent_api": [ + "ViewsPluginHandlerManagerRector" + ], + "project/entity_grants": [ + "ViewsPluginHandlerManagerRector" + ], + "project/recurly": [ + "ViewsPluginHandlerManagerRector" + ], + "project/media_views_filter": [ + "ViewsPluginHandlerManagerRector" + ], + "project/visitors": [ + "ViewsPluginHandlerManagerRector" + ], + "project/views_natural_sort": [ + "ViewsPluginHandlerManagerRector" + ], + "project/multilingual_plus": [ + "ViewsPluginHandlerManagerRector" + ], + "project/lms": [ + "ViewsPluginHandlerManagerRector" + ], + "project/entity_hierarchy": [ + "ViewsPluginHandlerManagerRector" + ], + "project/communication": [ + "ViewsPluginHandlerManagerRector" + ], + "project/views_sql_twig_fields": [ + "ViewsPluginHandlerManagerRector" + ], + "project/social_lms_integrator": [ + "ViewsPluginHandlerManagerRector" + ], + "project/group_welcome_message": [ + "ViewsPluginHandlerManagerRector" + ], + "project/views_linkarea": [ + "ViewsPluginHandlerManagerRector" + ], + "project/views_entity_embed": [ + "ViewsPluginHandlerManagerRector" + ], + "project/ggroup": [ + "ViewsPluginHandlerManagerRector" + ], + "project/consent_management": [ + "ViewsPluginHandlerManagerRector" + ], + "project/cms_content_sync": [ + "ViewsPluginHandlerManagerRector" + ], + "project/unused_files_delete": [ + "ViewsPluginHandlerManagerRector" + ], + "project/mdp": [ + "ViewsPluginHandlerManagerRector" + ], + "project/media_filter": [ + "ViewsPluginHandlerManagerRector" + ], + "project/thunder": [ + "ViewsPluginHandlerManagerRector" + ], + "project/entity_distribution": [ + "ViewsPluginHandlerManagerRector" + ], + "project/dut": [ + "ViewsPluginHandlerManagerRector" + ], + "project/discussions": [ + "ViewsPluginHandlerManagerRector" + ], + "project/unused_media_filter": [ + "ViewsPluginHandlerManagerRector" + ], + "project/views_exclude_previous": [ + "ViewsPluginHandlerManagerRector" + ], + "project/heartbeat": [ + "ViewsPluginHandlerManagerRector" + ], + "project/field_encrypt_searchable": [ + "ViewsPluginHandlerManagerRector" + ], + "project/dplor": [ + "ViewsPluginHandlerManagerRector" + ], + "project/view_filter_promotion": [ + "ViewsPluginHandlerManagerRector" + ], + "project/friendship": [ + "ViewsPluginHandlerManagerRector" + ], + "project/group_media_library_extra": [ + "ViewsPluginHandlerManagerRector" + ], + "project/hubspot_integration": [ + "ViewsPluginHandlerManagerRector" + ], + "project/tmgmt_deepl": [ + "ViewsPluginHandlerManagerRector" + ], + "project/taxonomy_parents_index": [ + "ViewsPluginHandlerManagerRector" + ], + "project/nodehive_core": [ + "ViewsPluginHandlerManagerRector" + ], + "project/workbench_moderation": [ + "ViewsPluginHandlerManagerRector" + ], + "project/untatu": [ + "ViewsPluginHandlerManagerRector" + ], + "project/service": [ + "ReplaceModuleHandlerGetNameRector", + "ViewsPluginHandlerManagerRector" + ], + "project/islandora": [ + "ReplaceModuleHandlerGetNameRector", + "ViewsPluginHandlerManagerRector" + ], + "project/entity_domain_access": [ + "ViewsPluginHandlerManagerRector" + ], + "project/diboo_core": [ + "ViewsPluginHandlerManagerRector" + ], + "project/usage_data": [ + "ViewsPluginHandlerManagerRector" + ], + "project/opigno_social": [ + "ViewsPluginHandlerManagerRector" + ], + "project/private_message": [ + "ViewsPluginHandlerManagerRector" + ], + "project/translation_views": [ + "ViewsPluginHandlerManagerRector" + ], + "project/rng": [ + "ViewsPluginHandlerManagerRector" + ], + "project/moderation_team": [ + "ViewsPluginHandlerManagerRector" + ], + "project/template_entities": [ + "ViewsPluginHandlerManagerRector" + ], + "project/entityqueue": [ + "ViewsPluginHandlerManagerRector" + ], + "project/geolocation": [ + "ViewsPluginHandlerManagerRector" + ], + "project/chartjs": [ + "ViewsPluginHandlerManagerRector" + ], + "project/visualization_d8": [ + "ViewsPluginHandlerManagerRector" + ], + "project/visualization": [ + "ViewsPluginHandlerManagerRector" + ], + "project/views_override_viewmode": [ + "ViewsPluginHandlerManagerRector" + ], + "project/meta_entity": [ + "ViewsPluginHandlerManagerRector" + ], + "project/trash": [ + "ViewsPluginHandlerManagerRector" + ], + "project/content_moderation_node_grants": [ + "ViewsPluginHandlerManagerRector" + ], + "project/custom_list": [ + "ViewsPluginHandlerManagerRector" + ], + "project/views_selective_filters": [ + "ViewsPluginHandlerManagerRector" + ], + "project/calendar": [ + "ViewsPluginHandlerManagerRector" + ], + "project/test_helpers": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/uninstall_unexisting": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/hook_profiler": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/autosave_form": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/schema": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/hook_manager": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/hookalyzer": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/hook_event": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/hooks": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/eventer": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/gearbox": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/simplifying": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/nostr_id_nip05": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/rocket_chat": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/image_moderate": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/auto_alter": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/worldmap": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/config_entity_revisions": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/social_hub": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/social_post_video": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/confi": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/sitemorse_lite": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/views_extender": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/nitropack": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/function_autoload": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/console": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/multiversion": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/disable_modules": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/localist_drupal": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/migrate_visualize": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/mutual_credit": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/schema_form": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/entity_track": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/layoutcomponents": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/lightning_core": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/nodeinfo": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/lightning_layout": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/contacts": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/social_media_integration": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/sanitize_pii": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/slack_receive": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/licenses": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/workflow_extras": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/asset_autoload": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/ai_upgrade_assistant": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/entity_keyvalue": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/toast_messages": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/message_private": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/audit_monitoring": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/orchestration": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/sitewide_alerts": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/flow": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/domain_simple_sitemap": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/pager_serializer": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/languagefield": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/message_thread": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/bibliocommons": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/commerce_currency_switcher": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/social_auth_tiktok_decouple": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/social_auth_apple_decouple": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/file_update": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/simple_oauth_google_connect": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/nbox": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/pwbi": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/ppoidc": [ + "ReplaceModuleHandlerGetNameRector", + "SystemTimeZonesRector" + ], + "project/robolytix": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/pki_ra": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/date_augmenter": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/rmkv": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/simple_oauth_facebook_connect": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/cookies_module_handler": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/module_maker": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/client_config_care": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/ws_event": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/social_auth_itsme": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/onlyone": [ + "ReplaceModuleHandlerGetNameRector" + ], + "project/supercache": [ + "ReplaceRequestTimeConstantRector" + ], + "project/engagement": [ + "ReplaceRequestTimeConstantRector" + ], + "project/context_date": [ + "ReplaceRequestTimeConstantRector" + ], + "project/computed_field": [ + "ReplaceRequestTimeConstantRector" + ], + "project/automatic_updates": [ + "ReplaceRequestTimeConstantRector" + ], + "project/wem": [ + "ReplaceRequestTimeConstantRector" + ], + "project/preserve_changed": [ + "ReplaceRequestTimeConstantRector" + ], + "project/random_weight": [ + "ReplaceRequestTimeConstantRector" + ], + "project/participatory_process": [ + "ReplaceRequestTimeConstantRector" + ], + "project/fts": [ + "ReplaceRequestTimeConstantRector" + ], + "project/geckoboard_push": [ + "ReplaceRequestTimeConstantRector" + ], + "project/node_announce": [ + "ReplaceRequestTimeConstantRector" + ], + "project/course": [ + "ReplaceRequestTimeConstantRector" + ], + "project/queue_scheduler": [ + "ReplaceRequestTimeConstantRector" + ], + "project/authtoken": [ + "ReplaceRequestTimeConstantRector" + ], + "project/acquia_search_config": [ + "ReplaceRequestTimeConstantRector" + ], + "project/new_relic_insights": [ + "ReplaceRequestTimeConstantRector" + ], + "project/performance_toolkit": [ + "ReplaceRequestTimeConstantRector" + ], + "project/fluxservice": [ + "ReplaceRequestTimeConstantRector" + ], + "project/ua_cache_bypass": [ + "ReplaceRequestTimeConstantRector" + ], + "project/commerce_order_reminder": [ + "ReplaceRequestTimeConstantRector" + ], + "project/priority_queue": [ + "ReplaceRequestTimeConstantRector" + ], + "project/db_remote": [ + "ReplaceRequestTimeConstantRector" + ], + "project/inactive_user": [ + "ReplaceRequestTimeConstantRector" + ], + "project/election": [ + "ReplaceRequestTimeConstantRector" + ], + "project/brilliant_gallery": [ + "ReplaceRequestTimeConstantRector" + ], + "project/uc_abandoned": [ + "ReplaceRequestTimeConstantRector" + ], + "project/commerce_booking": [ + "ReplaceRequestTimeConstantRector" + ], + "project/pax_content": [ + "ReplaceRequestTimeConstantRector" + ], + "project/commerce_priceminister": [ + "ReplaceRequestTimeConstantRector" + ], + "project/node_expire": [ + "ReplaceRequestTimeConstantRector" + ], + "project/quizz": [ + "ReplaceRequestTimeConstantRector" + ], + "project/tagged_systemqueue": [ + "ReplaceRequestTimeConstantRector" + ], + "project/optimizedb": [ + "ReplaceRequestTimeConstantRector" + ], + "project/adbc": [ + "ReplaceRequestTimeConstantRector" + ], + "project/ecwid": [ + "ReplaceRequestTimeConstantRector" + ], + "project/freshdesk_sso": [ + "ReplaceRequestTimeConstantRector" + ], + "project/future_nodes": [ + "ReplaceRequestTimeConstantRector" + ], + "project/gitinfo": [ + "ReplaceRequestTimeConstantRector" + ], + "project/google_analytics_counter": [ + "ReplaceRequestTimeConstantRector" + ], + "project/cache_backport": [ + "ReplaceRequestTimeConstantRector" + ], + "project/clockify": [ + "ReplaceRequestTimeConstantRector" + ], + "project/amazon": [ + "ReplaceRequestTimeConstantRector" + ], + "project/settings_audit_log": [ + "ReplaceRequestTimeConstantRector" + ], + "project/one_time_login": [ + "ReplaceRequestTimeConstantRector" + ], + "project/motionpoint": [ + "ReplaceRequestTimeConstantRector" + ], + "project/uc_recently_viewed_products": [ + "ReplaceRequestTimeConstantRector" + ], + "project/anonymous_publishing": [ + "ReplaceRequestTimeConstantRector" + ], + "project/sri": [ + "ReplaceRequestTimeConstantRector" + ], + "project/drush_async_api": [ + "ReplaceRequestTimeConstantRector" + ], + "project/list_predefined_options": [ + "SystemTimeZonesRector" + ], + "project/dummy_content": [ + "SystemTimeZonesRector" + ], + "project/veracity_vql": [ + "SystemTimeZonesRector" + ], + "project/tzfield": [ + "SystemTimeZonesRector" + ], + "project/intl_date": [ + "SystemTimeZonesRector" + ], + "project/sfactive": [ + "SystemTimeZonesRector" + ], + "project/smart_date": [ + "SystemTimeZonesRector" + ], + "project/condition_pack": [ + "SystemTimeZonesRector" + ], + "project/daterange_simplify": [ + "SystemTimeZonesRector" + ], + "project/current_date_time": [ + "SystemTimeZonesRector" + ], + "project/timezone_calculator": [ + "SystemTimeZonesRector" + ], + "project/almanac": [ + "SystemTimeZonesRector" + ], + "project/paypal_roles": [ + "SystemTimeZonesRector" + ], + "project/salesforce_push_queue_ui": [ + "SystemTimeZonesRector" + ], + "project/time_clock": [ + "SystemTimeZonesRector" + ], + "project/substitutoo": [ + "SystemTimeZonesRector" + ], + "project/date_occur": [ + "SystemTimeZonesRector" + ], + "project/feeds_entity_processor": [ + "SystemTimeZonesRector" + ], + "project/timezone_picker": [ + "SystemTimeZonesRector" + ], + "project/smart_content_ipstack": [ + "SystemTimeZonesRector" + ], + "project/user_access_timeslot": [ + "SystemTimeZonesRector" + ], + "project/everlms": [ + "SystemTimeZonesRector" + ], + "project/custom_entity_example": [ + "SystemTimeZonesRector" + ], + "project/rocketship_florista_demo_profile": [ + "SystemTimeZonesRector" + ], + "project/openid_connect": [ + "SystemTimeZonesRector" + ], + "project/library_management_system": [ + "SystemTimeZonesRector" + ], + "project/commerce_installments": [ + "SystemTimeZonesRector" + ], + "project/mtc": [ + "SystemTimeZonesRector" + ], + "project/digitalclock": [ + "SystemTimeZonesRector" + ], + "project/better_field_formatters": [ + "SystemTimeZonesRector" + ], + "project/crema": [ + "SystemTimeZonesRector" + ], + "project/variable": [ + "SystemTimeZonesRector" + ], + "project/cm_cablecast": [ + "SystemTimeZonesRector" + ], + "project/datex": [ + "SystemTimeZonesRector" + ], + "project/makemeeting": [ + "SystemTimeZonesRector" + ], + "project/booking_timeslots": [ + "SystemTimeZonesRector" + ], + "project/ar": [ + "SystemTimeZonesRector" + ], + "project/search_api_lucene": [ + "SystemTimeZonesRector" + ], + "project/cilogon_auth": [ + "SystemTimeZonesRector" + ] + } +} diff --git a/docs/targeted_progress.log b/docs/targeted_progress.log new file mode 100644 index 000000000..4f6c01baa --- /dev/null +++ b/docs/targeted_progress.log @@ -0,0 +1,351 @@ + +LoadAllIncludesRector: 'loadAllIncludes ModuleHandler' + page 1: 17 hits + skip: project/service_container + skip: project/openlayers + skip: project/schema + ✓ D11: project/migrate_boost + ✓ D11: project/config_track + skip: project/nuclear + skip: project/hook_event + skip: project/sir_trevor + ✓ D11: project/hux + skip: project/hook_event_dispatcher + skip: project/qd_screenshottests + ✓ D11: project/update_worker + ✓ D11: project/drupalmoduleupgrader + ✓ D11: project/graphapi + ✓ D11: project/schemadotorg + skip: project/xmlsitemap + +MigrateSqlGetMigrationPluginManagerRector: 'getMigrationPluginManager migrate' + page 1: 3 hits + ✓ D11: project/feeds_migrate + ✓ D11: project/smart_sql_idmap + ✓ D11: project/migmag + +PluginBaseIsConfigurableRector: 'isConfigurable PluginBase' + page 1: 31 hits + ✓ D11: project/localgov_publications_importer + ✓ D11: project/autotagger + ✓ D11: project/api + skip: project/tracardi + skip: project/entity_embed_extras + ✓ D11: project/content_planner + skip: project/tripal + ✓ D11: project/plugin_constructor_factory + skip: project/blaze + ✓ D11: project/metatag + ✓ D11: project/json_drop_api + skip: project/elasticsearch_helper_views + ✓ D11: project/localgov_elections + ✓ D11: project/geocoder + skip: project/table_of_contents + ✓ D11: project/oswald + ✓ D11: project/xbbcode + ✓ D11: project/localgov_publications_importer_copilot + ✓ D11: project/views_bulk_operations + ✓ D11: project/search_api + skip: project/deprecation_status + +RemoveModuleHandlerAddModuleCallsRector: 'addModule ModuleHandlerInterface' + page 1: 24 hits + skip: project/service + ✓ D11: project/depcalc + ✓ D11: project/fleetview_client + ✓ D11: project/sdx + ✓ D11: project/simplifying + ✓ D11: project/ai_watchdog_analyst + ✓ D11: project/acquia_contenthub + ✓ D11: project/component_entity + ✓ D11: project/ai_vdb_provider_pinecone + ✓ D11: project/ai_vdb_provider_milvus + ✓ D11: project/rift_recipe + skip: project/views_config_field + +RemoveModuleHandlerDeprecatedMethodsRector: 'writeCache ModuleHandler' + page 1: 20 hits + skip: project/hooks + ✓ D11: project/jsonld + skip: project/hal + skip: project/skinr + skip: project/s3fs + ✓ D11: project/captcha + skip: project/gclient_storage + +RemoveSetUriCallbackRector: 'setUriCallback EntityType' + page 1: 2 hits + ✓ D11: project/rabbit_hole_href + skip: project/i18n + +RemoveTrustDataCallRector: 'trustData Config' + page 1: 86 hits + ✓ D11: project/eca + skip: project/canvas + ✓ D11: project/parameters + ✓ D11: project/slots + ✓ D11: project/cms_core + skip: project/social + skip: project/commerce_order_action_reassign_owner + skip: project/config_actions + ✓ D11: project/userprotect + skip: project/social_lms_integrator + ✓ D11: project/acquia_cms_headless + ✓ D11: project/storage + ✓ D11: project/config_plus + ✓ D11: project/views_dependent_filters + ✓ D11: project/complete_webform_exporter + ✓ D11: project/workbench_moderation_actions + ✓ D11: project/smart_title + skip: project/apigee_edge + ✓ D11: project/monitoring + ✓ D11: project/varbase_workflow + skip: project/hn + ✓ D11: project/commerce_square + skip: project/gcontent_moderation + skip: project/bene + ✓ D11: project/preview_site + skip: project/degov + skip: project/acquia_migrate + ✓ D11: project/acquia_starterkits + ✓ D11: project/scheduled_publish + ✓ D11: project/output_format_api + ✓ D11: project/workbench_email + skip: project/price + ✓ D11: project/theming_tools + ✓ D11: project/elasticsearch_helper + skip: project/blazy + skip: project/mailgroup + skip: project/dxpr_marketing_cms + skip: project/braintree_cashier + ✓ D11: project/epm + ✓ D11: project/og + skip: project/razoreye_biz + skip: project/tiendaparamipyme + ✓ D11: project/redirect + skip: project/core_extend + skip: project/pankm + ✓ D11: project/pluggable_entity_view_builder + ✓ D11: project/gutenberg + skip: project/field_permissions_group + ✓ D11: project/group + skip: project/foldershare + skip: project/group_entity + ✓ D11: project/flag + ✓ D11: project/simplenews + ✓ D11: project/entity_browser + ✓ D11: project/eca_cm + ✓ D11: project/jsonapi + +ReplaceCommentManagerGetCountNewCommentsRector: 'getCountNewComments CommentManager' + page 1: 4 hits + ✓ D11: project/history + skip: project/comment_perm + ✓ D11: project/forum + +ReplaceEntityOriginalPropertyRector: '->original EntityInterface' + page 1: 100 hits + skip: project/tdt_client + skip: project/entity_orm + skip: project/re_mgr + ✓ D11: project/languagewire_translation_provider + skip: project/cache_entity_type + skip: project/plug + ✓ D11: project/drd + skip: project/hidden_tab + ✓ D11: project/ptools + ✓ D11: project/media_acquiadam + skip: project/plug_config + ✓ D11: project/typed_entity + ✓ D11: project/child_entity + skip: project/records + ✓ D11: project/experience_builder + skip: project/fluxservice + skip: project/dplor + ✓ D11: project/external_entity + skip: project/maps_suite + skip: project/pagebuilder + skip: project/entity_keyvalue + ✓ D11: project/ckeditor_mentions + ✓ D11: project/entity_value_inheritance + skip: project/drupal_coverage_core + ✓ D11: project/entity_io + ✓ D11: project/conflict + skip: project/yamlform + skip: project/dea + ✓ D11: project/orange_dam + ✓ D11: project/a12s_maps_sync + skip: project/lingotek + skip: project/kafka_event_publisher + skip: project/field_validation + skip: project/reactive + skip: project/flow + skip: project/userpoints + skip: project/elasticsearch_connect + ✓ D11: project/entity_embed + ✓ D11: project/entity_reference_manager + ✓ D11: project/simplenews_stats + ✓ D11: project/variants + skip: project/entity_pilot + ✓ D11: project/nofraud + ✓ D11: project/entity_webhook + ✓ D11: project/phpedu_profile + ✓ D11: project/reader + ✓ D11: project/gotem_content_moderation + skip: project/apitools + ✓ D11: project/paragraph_view_mode + skip: project/admin_content_notification + ✓ D11: project/activitypub + ✓ D11: project/navigation_plus + ✓ D11: project/content_synchronizer + ✓ D11: project/custom_elements + ✓ D11: project/edit_plus + skip: project/action_queue + skip: project/test_support + skip: project/entity_change_notifier + ✓ D11: project/standalone + skip: project/lti_tool_provider + +ReplaceNodeSetPreviewModeRector: 'setPreviewMode NodeType' + page 1: 23 hits + ✓ D11: project/responsive_preview + skip: project/archimedes + skip: project/drupal_cms + ✓ D11: project/ai_agents + skip: project/convene + skip: project/provus_gov_recipe + ✓ D11: project/node_type_defaults + skip: project/haven + skip: project/caresphere + skip: project/healthcare + skip: project/provus_duswds_recipe + skip: project/provus_edu + skip: project/mercury_demo + skip: project/local + skip: project/pulse + skip: project/convivial_gov + ✓ D11: project/sdx_drast + ✓ D11: project/sdx_engine + ✓ D11: project/metadata_hex + skip: project/communications + ✓ D11: project/ai_agents_experimental_collection + +ReplaceRebuildThemeDataRector: 'rebuildThemeData ThemeHandler' + page 1: 63 hits + skip: project/console + ✓ D11: project/site_guardian + skip: project/koality_theme_generator + ✓ D11: project/theme_per_user + skip: project/omega + skip: project/provision + ✓ D11: project/libraries_ui + skip: project/micro_theme + skip: project/at_tools + skip: project/at_tool + skip: project/guru + skip: project/monix + skip: project/localgov_microsites_project + skip: project/views_system + skip: project/openrestaurant + ✓ D11: project/openy + ✓ D11: project/edw_healthcheck + skip: project/install_profile_generator + skip: project/at_theme + ✓ D11: project/l10n_update_bundled + skip: project/library_field + ✓ D11: project/ai_components + skip: project/cookie_blocking_libraries + ✓ D11: project/mercury_editor + skip: project/demo_content + ✓ D11: project/dropsolid_rocketship_profile + skip: project/quick_pages + ✓ D11: project/guswds + ✓ D11: project/gesso + ✓ D11: project/theme_file_editor + skip: project/amp + skip: project/extensions_api + skip: project/rocketship_florista_demo_profile + skip: project/basic + skip: project/hops + skip: project/cm_config_tools + skip: project/visualn_libraries + skip: project/editablevar + skip: project/civictheme + skip: project/demo_design_system + +StripMigrationDependenciesExpandArgRector: 'getMigrationDependencies Migration' + page 1: 60 hits + ✓ D11: project/migrate_plus + skip: project/forgery + ✓ D11: project/paragraphs + ✓ D11: project/smart_migrate_cli + skip: project/paragraphs_migration + ✓ D11: project/migrate_tools + skip: project/media_migration + skip: project/migrate_gathercontent + ✓ D11: project/wordpress_migrate + skip: project/location_migration + ✓ D11: project/migrate_plus_ui + ✓ D11: project/geolocation + skip: project/openfed_migrate + skip: project/entity_staging + ✓ D11: project/entity_import + skip: project/bigcommerce + skip: project/amoebacrm + skip: project/ekan + skip: project/wxt + ✓ D11: project/migrate_queue_importer + skip: project/openy_gated_content + ✓ D11: project/migrate_from_services + skip: project/migrate_upgrade + skip: project/migrate_run + ✓ D11: project/crm_migrate_node + +UseEntityTypeHasIntegerIdRector: 'getEntityTypeIdKeyType' + page 1: 48 hits + skip: project/mcet + ✓ D11: project/workflow_participants + skip: project/mpr + ✓ D11: project/apigee_m10n + ✓ D11: project/workbench_moderation + ✓ D11: project/intercept + skip: project/entity_activity + skip: project/contacts_events + ✓ D11: project/commerce_invoice + skip: project/commerce_invoice_ubl + ✓ D11: project/homebox + ✓ D11: project/commerce_eta + ✓ D11: project/display_builder + skip: project/content_entity_base + ✓ D11: project/role_request + skip: project/wsdata + skip: project/virtualcare + ✓ D11: project/entity + skip: project/openy_digital_signage + ✓ D11: project/localgov_alert_banner + skip: project/commerce_refund + skip: project/view_api_response + skip: project/entities_import + ✓ D11: project/easy_email + skip: project/commerce_inventory + ✓ D11: project/paragraphs_edit + skip: project/complex_workflow + skip: project/redhen + skip: project/guidelines + ✓ D11: project/association + skip: project/omdb_api + +=== Results === +LoadAllIncludesRector: ['project/migrate_boost', 'project/config_track', 'project/hux', 'project/update_worker', 'project/drupalmoduleupgrader', 'project/graphapi', 'project/schemadotorg'] +MigrateSqlGetMigrationPluginManagerRector: ['project/feeds_migrate', 'project/smart_sql_idmap', 'project/migmag'] +PluginBaseIsConfigurableRector: ['project/localgov_publications_importer', 'project/autotagger', 'project/api', 'project/content_planner', 'project/plugin_constructor_factory', 'project/metatag', 'project/json_drop_api', 'project/localgov_elections', 'project/geocoder', 'project/oswald', 'project/xbbcode', 'project/localgov_publications_importer_copilot', 'project/views_bulk_operations', 'project/search_api'] +RemoveModuleHandlerAddModuleCallsRector: ['project/depcalc', 'project/fleetview_client', 'project/sdx', 'project/simplifying', 'project/ai_watchdog_analyst', 'project/acquia_contenthub', 'project/component_entity', 'project/ai_vdb_provider_pinecone', 'project/ai_vdb_provider_milvus', 'project/rift_recipe'] +RemoveModuleHandlerDeprecatedMethodsRector: ['project/jsonld', 'project/captcha'] +RemoveSetUriCallbackRector: ['project/rabbit_hole_href'] +RemoveTrustDataCallRector: ['project/eca', 'project/parameters', 'project/slots', 'project/cms_core', 'project/userprotect', 'project/acquia_cms_headless', 'project/storage', 'project/config_plus', 'project/views_dependent_filters', 'project/complete_webform_exporter', 'project/workbench_moderation_actions', 'project/smart_title', 'project/monitoring', 'project/varbase_workflow', 'project/commerce_square', 'project/preview_site', 'project/acquia_starterkits', 'project/scheduled_publish', 'project/output_format_api', 'project/workbench_email', 'project/theming_tools', 'project/elasticsearch_helper', 'project/epm', 'project/og', 'project/redirect', 'project/pluggable_entity_view_builder', 'project/gutenberg', 'project/group', 'project/flag', 'project/simplenews', 'project/entity_browser', 'project/eca_cm', 'project/jsonapi'] +ReplaceCommentManagerGetCountNewCommentsRector: ['project/history', 'project/forum'] +ReplaceEntityOriginalPropertyRector: ['project/languagewire_translation_provider', 'project/drd', 'project/ptools', 'project/media_acquiadam', 'project/typed_entity', 'project/child_entity', 'project/experience_builder', 'project/external_entity', 'project/ckeditor_mentions', 'project/entity_value_inheritance', 'project/entity_io', 'project/conflict', 'project/orange_dam', 'project/a12s_maps_sync', 'project/entity_embed', 'project/entity_reference_manager', 'project/simplenews_stats', 'project/variants', 'project/nofraud', 'project/entity_webhook', 'project/phpedu_profile', 'project/reader', 'project/gotem_content_moderation', 'project/paragraph_view_mode', 'project/activitypub', 'project/navigation_plus', 'project/content_synchronizer', 'project/custom_elements', 'project/edit_plus', 'project/standalone'] +ReplaceNodeSetPreviewModeRector: ['project/responsive_preview', 'project/ai_agents', 'project/node_type_defaults', 'project/sdx_drast', 'project/sdx_engine', 'project/metadata_hex', 'project/ai_agents_experimental_collection'] +ReplaceRebuildThemeDataRector: ['project/site_guardian', 'project/theme_per_user', 'project/libraries_ui', 'project/openy', 'project/edw_healthcheck', 'project/l10n_update_bundled', 'project/ai_components', 'project/mercury_editor', 'project/dropsolid_rocketship_profile', 'project/guswds', 'project/gesso', 'project/theme_file_editor'] +StripMigrationDependenciesExpandArgRector: ['project/migrate_plus', 'project/paragraphs', 'project/smart_migrate_cli', 'project/migrate_tools', 'project/wordpress_migrate', 'project/migrate_plus_ui', 'project/geolocation', 'project/entity_import', 'project/migrate_queue_importer', 'project/migrate_from_services', 'project/crm_migrate_node'] +UseEntityTypeHasIntegerIdRector: ['project/workflow_participants', 'project/apigee_m10n', 'project/workbench_moderation', 'project/intercept', 'project/commerce_invoice', 'project/homebox', 'project/commerce_eta', 'project/display_builder', 'project/role_request', 'project/entity', 'project/localgov_alert_banner', 'project/easy_email', 'project/paragraphs_edit', 'project/association'] diff --git a/docs/targeted_results.json b/docs/targeted_results.json new file mode 100644 index 000000000..59d7864b7 --- /dev/null +++ b/docs/targeted_results.json @@ -0,0 +1,174 @@ +{ + "LoadAllIncludesRector": [ + "project/migrate_boost", + "project/config_track", + "project/hux", + "project/update_worker", + "project/drupalmoduleupgrader", + "project/graphapi", + "project/schemadotorg" + ], + "MigrateSqlGetMigrationPluginManagerRector": [ + "project/feeds_migrate", + "project/smart_sql_idmap", + "project/migmag" + ], + "PluginBaseIsConfigurableRector": [ + "project/localgov_publications_importer", + "project/autotagger", + "project/api", + "project/content_planner", + "project/plugin_constructor_factory", + "project/metatag", + "project/json_drop_api", + "project/localgov_elections", + "project/geocoder", + "project/oswald", + "project/xbbcode", + "project/localgov_publications_importer_copilot", + "project/views_bulk_operations", + "project/search_api" + ], + "RemoveModuleHandlerAddModuleCallsRector": [ + "project/depcalc", + "project/fleetview_client", + "project/sdx", + "project/simplifying", + "project/ai_watchdog_analyst", + "project/acquia_contenthub", + "project/component_entity", + "project/ai_vdb_provider_pinecone", + "project/ai_vdb_provider_milvus", + "project/rift_recipe" + ], + "RemoveModuleHandlerDeprecatedMethodsRector": [ + "project/jsonld", + "project/captcha" + ], + "RemoveSetUriCallbackRector": [ + "project/rabbit_hole_href" + ], + "RemoveTrustDataCallRector": [ + "project/eca", + "project/parameters", + "project/slots", + "project/cms_core", + "project/userprotect", + "project/acquia_cms_headless", + "project/storage", + "project/config_plus", + "project/views_dependent_filters", + "project/complete_webform_exporter", + "project/workbench_moderation_actions", + "project/smart_title", + "project/monitoring", + "project/varbase_workflow", + "project/commerce_square", + "project/preview_site", + "project/acquia_starterkits", + "project/scheduled_publish", + "project/output_format_api", + "project/workbench_email", + "project/theming_tools", + "project/elasticsearch_helper", + "project/epm", + "project/og", + "project/redirect", + "project/pluggable_entity_view_builder", + "project/gutenberg", + "project/group", + "project/flag", + "project/simplenews", + "project/entity_browser", + "project/eca_cm", + "project/jsonapi" + ], + "ReplaceCommentManagerGetCountNewCommentsRector": [ + "project/history", + "project/forum" + ], + "ReplaceEntityOriginalPropertyRector": [ + "project/languagewire_translation_provider", + "project/drd", + "project/ptools", + "project/media_acquiadam", + "project/typed_entity", + "project/child_entity", + "project/experience_builder", + "project/external_entity", + "project/ckeditor_mentions", + "project/entity_value_inheritance", + "project/entity_io", + "project/conflict", + "project/orange_dam", + "project/a12s_maps_sync", + "project/entity_embed", + "project/entity_reference_manager", + "project/simplenews_stats", + "project/variants", + "project/nofraud", + "project/entity_webhook", + "project/phpedu_profile", + "project/reader", + "project/gotem_content_moderation", + "project/paragraph_view_mode", + "project/activitypub", + "project/navigation_plus", + "project/content_synchronizer", + "project/custom_elements", + "project/edit_plus", + "project/standalone" + ], + "ReplaceNodeSetPreviewModeRector": [ + "project/responsive_preview", + "project/ai_agents", + "project/node_type_defaults", + "project/sdx_drast", + "project/sdx_engine", + "project/metadata_hex", + "project/ai_agents_experimental_collection" + ], + "ReplaceRebuildThemeDataRector": [ + "project/site_guardian", + "project/theme_per_user", + "project/libraries_ui", + "project/openy", + "project/edw_healthcheck", + "project/l10n_update_bundled", + "project/ai_components", + "project/mercury_editor", + "project/dropsolid_rocketship_profile", + "project/guswds", + "project/gesso", + "project/theme_file_editor" + ], + "StripMigrationDependenciesExpandArgRector": [ + "project/migrate_plus", + "project/paragraphs", + "project/smart_migrate_cli", + "project/migrate_tools", + "project/wordpress_migrate", + "project/migrate_plus_ui", + "project/geolocation", + "project/entity_import", + "project/migrate_queue_importer", + "project/migrate_from_services", + "project/crm_migrate_node" + ], + "UseEntityTypeHasIntegerIdRector": [ + "project/workflow_participants", + "project/apigee_m10n", + "project/workbench_moderation", + "project/intercept", + "project/commerce_invoice", + "project/homebox", + "project/commerce_eta", + "project/display_builder", + "project/role_request", + "project/entity", + "project/localgov_alert_banner", + "project/easy_email", + "project/paragraphs_edit", + "project/association" + ] +} diff --git a/scripts/setup-rector-test.sh b/scripts/setup-rector-test.sh new file mode 100755 index 000000000..25d3b5b8c --- /dev/null +++ b/scripts/setup-rector-test.sh @@ -0,0 +1,217 @@ +#!/usr/bin/env bash +# Sets up a Drupal 11 project with contrib modules that exercise all new rectors, +# wires in the local drupal-rector branch, and runs rector so you can review diffs. +# +# Usage: ./setup-rector-test.sh [target-directory] +# Default target: ./drupal-rector-test + +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +RECTOR_REPO="$(cd "$SCRIPT_DIR/.." && pwd)" +RECTOR_BRANCH="feature/digest-rectors" +FORK_URL="https://github.com/bbrala/drupal-rector" + +TARGET_DIR="${1:-drupal-rector-test}" +TARGET_DIR="$(realpath "$TARGET_DIR")" + +echo "==> Target directory: $TARGET_DIR" +echo "==> drupal-rector source: $RECTOR_REPO (branch: $RECTOR_BRANCH)" +echo "" + +# --------------------------------------------------------------------------- +# 1. Scaffold the Drupal 11 project +# --------------------------------------------------------------------------- +if [ -d "$TARGET_DIR" ]; then + echo "Directory $TARGET_DIR already exists — skipping composer create-project." +else + echo "==> Creating Drupal 11 project…" + composer create-project drupal/recommended-project "$TARGET_DIR" \ + --no-interaction \ + --no-install \ + --stability dev +fi + +cd "$TARGET_DIR" + +# --------------------------------------------------------------------------- +# 2. Wire in drupal-rector from the local clone (preferred) or the fork remote +# --------------------------------------------------------------------------- +echo "" +echo "==> Adding drupal-rector repository…" + +# Use the local clone as a path repository so we get the exact working tree. +composer config repositories.drupal-rector \ + '{"type":"path","url":"'"$RECTOR_REPO"'","options":{"symlink":false}}' + +# Also add the fork as a VCS fallback (lets composer resolve the branch name). +composer config repositories.drupal-rector-vcs \ + '{"type":"vcs","url":"'"$FORK_URL"'"}' + +# Require drupal-rector dev branch. +composer require \ + "palantirnet/drupal-rector:dev-$RECTOR_BRANCH as 1.x-dev" \ + --no-update + +# --------------------------------------------------------------------------- +# 3. Require contrib modules +# Target: ≥2 modules per rector where possible. +# See docs/contrib-modules-d11.md for the full coverage mapping. +# 7 rectors only have 1 module available (marked with *). +# --------------------------------------------------------------------------- +echo "" +echo "==> Requiring contrib modules…" + +composer require --no-update \ + \ + `# ── 4-rector modules ──────────────────────────────────────────────────` \ + "drupal/drd:*" `# ReplaceEntityOriginalPropertyRector, ReplaceModuleHandlerGetNameRector, ReplaceSessionWritesWithRequestSessionRector, ReplaceSystemPerformanceGzipKeyRector` \ + "drupal/acquia_contenthub:*" `# RemoveModuleHandlerAddModuleCallsRector, ReplaceEditorLoadRector, ReplacePdoFetchConstantsRector, ReplaceUserSessionNamePropertyRector` \ + "drupal/social:*" `# ReplaceCommentUriRector, ReplaceNodeModuleProceduralFunctionsRector, ReplaceViewsProceduralFunctionsRector, ViewsPluginHandlerManagerRector` \ + \ + `# ── 3-rector modules ──────────────────────────────────────────────────` \ + "drupal/searchstax:*" `# RemoveStateCacheSettingRector, RemoveTwigNodeTransTagArgumentRector, ViewsPluginHandlerManagerRector (2nd)` \ + "drupal/ai_agents:*" `# ReplaceEditorLoadRector (2nd), ReplaceNodeSetPreviewModeRector, ReplaceSystemPerformanceGzipKeyRector (2nd)` \ + \ + `# ── 2-rector modules ──────────────────────────────────────────────────` \ + "drupal/commerce_invoice:*" `# ReplaceFileGetContentHeadersRector, UseEntityTypeHasIntegerIdRector` \ + "drupal/custom_field:*" `# ReplaceEntityReferenceRecursiveLimitRector, ReplaceViewsProceduralFunctionsRector (2nd)` \ + "drupal/entity_visibility_preview:*" `# ReplaceSessionManagerDeleteRector, ReplaceSessionWritesWithRequestSessionRector (2nd)` \ + "drupal/views_dependent_filters:*" `# RemoveHandlerBaseDefineExtraOptionsRector (*), RemoveTrustDataCallRector` \ + "drupal/group:*" `# RemoveTrustDataCallRector (2nd), RemoveUpdaterPostInstallMethodsRector` \ + "drupal/session_inspector:*" `# ReplaceSessionManagerDeleteRector (2nd), ReplaceUserSessionNamePropertyRector (2nd)` \ + "drupal/sdx:*" `# RemoveModuleHandlerAddModuleCallsRector (2nd), RemoveStateCacheSettingRector (2nd)` \ + "drupal/search_api:*" `# PluginBaseIsConfigurableRector, RemoveTwigNodeTransTagArgumentRector (2nd)` \ + "drupal/schemadotorg:*" `# LoadAllIncludesRector, ReplaceRecipeRunnerInstallModuleRector (*)` \ + "drupal/smart_migrate_cli:*" `# RemoveRootFromConvertDbUrlRector, StripMigrationDependenciesExpandArgRector` \ + "drupal/metatag:*" `# PluginBaseIsConfigurableRector (2nd), RemoveViewsRowCacheKeysRector` \ + "drupal/external_entity:*" `# ReplaceEntityOriginalPropertyRector (2nd), ReplaceEntityReferenceRecursiveLimitRector (2nd)` \ + "drupal/reassign_user_content:*" `# ReplaceModuleHandlerGetNameRector (2nd), ReplaceNodeModuleProceduralFunctionsRector (2nd)` \ + \ + `# ── 1-rector modules (filling gaps) ─────────────────────────────────` \ + "drupal/openy:*" `# ReplaceRebuildThemeDataRector` \ + "drupal/bootstrap_italia:*" `# ReplaceThemeGetSettingRector` \ + "drupal/view_usernames_node_author:*" `# ReplaceNodeAccessViewAllNodesRector (*)` \ + "drupal/association:*" `# UseEntityTypeHasIntegerIdRector (2nd)` \ + "drupal/tome:*" `# ReplaceNodeAddBodyFieldRector` \ + "drupal/cmrf_form_processor:*" `# RemoveCacheExpireOverrideRector` \ + "drupal/intl_date:*" `# SystemTimeZonesRector` \ + "drupal/geolocation:*" `# StripMigrationDependenciesExpandArgRector (2nd)` \ + "drupal/responsive_preview:*" `# ReplaceNodeSetPreviewModeRector (2nd)` \ + "drupal/kart:*" `# ReplaceThemeGetSettingRector (2nd)` \ + "drupal/tmgmt:*" `# ReplaceFileGetContentHeadersRector (2nd)` \ + "drupal/config_track:*" `# LoadAllIncludesRector (2nd)` \ + "drupal/guswds:*" `# ReplaceRebuildThemeDataRector (2nd)` \ + "drupal/smart_date:*" `# SystemTimeZonesRector (2nd)` \ + "drupal/vcp4dates:*" `# RemoveCacheExpireOverrideRector (2nd)` \ + "drupal/gdpr:*" `# ReplacePdoFetchConstantsRector (2nd)` \ + "drupal/ai_eca:*" `# ReplaceNodeAddBodyFieldRector (2nd)` \ + "drupal/deprecation_status:*" `# ReplaceDateTimeRangeConstantsRector (*)` \ + "drupal/gnode_request:*" `# RemoveUpdaterPostInstallMethodsRector (2nd)` \ + "drupal/google_analytics_counter:*" `# ReplaceRequestTimeConstantRector` \ + "drupal/migmag:*" `# MigrateSqlGetMigrationPluginManagerRector` \ + "drupal/field_group_vertical_tabs:*" `# ReplaceFieldgroupToFieldsetRector` \ + "drupal/ui_patterns_settings:*" `# ReplaceFieldgroupToFieldsetRector (2nd)` \ + "drupal/tb_megamenu:*" `# NodeStorageDeprecatedMethodsRector (*)` \ + "drupal/automatic_updates:*" `# ReplaceRequestTimeConstantRector (2nd)` \ + "drupal/sparql_entity_storage:*" `# RemoveRootFromConvertDbUrlRector (2nd)` \ + "drupal/views_advanced_cache:*" `# RemoveViewsRowCacheKeysRector (2nd)` \ + "drupal/captcha:*" `# RemoveModuleHandlerDeprecatedMethodsRector` \ + "drupal/ejectorseat:*" `# FileSystemBasenameToNativeRector (*)` \ + "drupal/smart_sql_idmap:*" `# MigrateSqlGetMigrationPluginManagerRector (2nd)` \ + "drupal/gadget:*" `# ReplaceCommentUriRector (2nd)` \ + "drupal/jsonld:*" `# RemoveModuleHandlerDeprecatedMethodsRector (2nd)` \ + "drupal/forum:*" `# ReplaceCommentManagerGetCountNewCommentsRector` \ + "drupal/history:*" `# ReplaceCommentManagerGetCountNewCommentsRector (2nd)` \ + "drupal/comment_mover:*" `# ReplaceAlphadecimalToIntNullRector` \ + "drupal/indieweb:*" `# ReplaceAlphadecimalToIntNullRector (2nd)` \ + "drupal/rabbit_hole:*" `# RemoveSetUriCallbackRector (*)` + +# --------------------------------------------------------------------------- +# 4. Install everything +# --------------------------------------------------------------------------- +echo "" +echo "==> Running composer install (this may take a while)…" +composer install \ + --no-interaction \ + --ignore-platform-reqs \ + --prefer-dist + +# --------------------------------------------------------------------------- +# 5. Initialise git and commit the baseline +# --------------------------------------------------------------------------- +echo "" +echo "==> Initialising git repo…" +if [ ! -d ".git" ]; then + git init +fi + +# Ignore vendor/ and web/core but keep contrib module source for rector + diffing. +cat > .gitignore << 'GITIGNORE' +/vendor/ +/web/core/ +/web/sites/default/settings.php +/web/sites/default/services.yml +*.orig +GITIGNORE + +git add . +git commit -m "Install Drupal 11 + contrib modules for rector testing" --allow-empty + +# --------------------------------------------------------------------------- +# 6. Write rector.php +# --------------------------------------------------------------------------- +echo "" +echo "==> Writing rector.php…" +cat > rector.php << 'RECTOR' +withPaths([ + __DIR__ . '/web/modules/contrib', + ]) + ->withSets([ + Drupal10SetList::DRUPAL_10, + Drupal11SetList::DRUPAL_11, + ]); +RECTOR + +git add rector.php +git commit -m "Add rector.php config targeting web/modules/contrib" + +# --------------------------------------------------------------------------- +# 7. Run rector --dry-run to preview changes +# --------------------------------------------------------------------------- +echo "" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo " Running rector --dry-run (no files modified)" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo "" +vendor/bin/rector process --dry-run 2>&1 || true + +echo "" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo " Next steps" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo "" +echo " Apply changes:" +echo " cd $TARGET_DIR && vendor/bin/rector process" +echo "" +echo " Review diff:" +echo " git diff" +echo "" +echo " Rector coverage notes:" +echo " * FileSystemBasenameToNativeRector — only 1 module (ejectorseat)" +echo " * NodeStorageDeprecatedMethodsRector — only 1 module (tb_megamenu)" +echo " * RemoveHandlerBaseDefineExtraOptionsRector — only 1 module (views_dependent_filters)" +echo " * RemoveSetUriCallbackRector — only 1 module (rabbit_hole)" +echo " * ReplaceDateTimeRangeConstantsRector — only 1 module (deprecation_status)" +echo " * ReplaceNodeAccessViewAllNodesRector — only 1 module (view_usernames_node_author)" +echo " * ReplaceRecipeRunnerInstallModuleRector — only 1 module (schemadotorg)" +echo " * 6 rectors have no D11 contrib usage found (see docs/contrib-modules-d11.md)" From 149d6b3dbfb46b6f2653e3a99475f9ba21ced79b Mon Sep 17 00:00:00 2001 From: bjorn Date: Tue, 5 May 2026 13:11:01 +0200 Subject: [PATCH 107/256] fix(MigrateSqlGetMigrationPluginManagerRector): handle parent::getMigrationPluginManager() StaticCall --- ...rateSqlGetMigrationPluginManagerRector.php | 23 ++++++++++++++- .../fixture/parent_call.php.inc | 29 +++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/fixture/parent_call.php.inc diff --git a/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector.php b/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector.php index f0971418a..ef1afa770 100644 --- a/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector.php +++ b/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector.php @@ -7,7 +7,9 @@ use PhpParser\Node; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\PropertyFetch; +use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Expr\Variable; +use PhpParser\Node\Name; use PHPStan\Type\ObjectType; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -39,11 +41,15 @@ public function getRuleDefinition(): RuleDefinition /** @return array> */ public function getNodeTypes(): array { - return [MethodCall::class]; + return [MethodCall::class, StaticCall::class]; } public function refactor(Node $node): ?Node { + if ($node instanceof StaticCall) { + return $this->refactorStaticCall($node); + } + assert($node instanceof MethodCall); if (!$node->var instanceof Variable || $node->var->name !== 'this') { return null; @@ -60,4 +66,19 @@ public function refactor(Node $node): ?Node return new PropertyFetch(new Variable('this'), 'migrationPluginManager'); } + + private function refactorStaticCall(StaticCall $node): ?Node + { + if ($this->getName($node->name) !== 'getMigrationPluginManager') { + return null; + } + if ($node->args !== []) { + return null; + } + if (!$node->class instanceof Name || $node->class->toString() !== 'parent') { + return null; + } + + return new PropertyFetch(new Variable('this'), 'migrationPluginManager'); + } } diff --git a/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/fixture/parent_call.php.inc b/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/fixture/parent_call.php.inc new file mode 100644 index 000000000..11497b5ca --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/fixture/parent_call.php.inc @@ -0,0 +1,29 @@ + +----- +migrationPluginManager; + } +} + +?> From 6bc5f86b462cfae96ee5816267c84f3b4abba394 Mon Sep 17 00:00:00 2001 From: bjorn Date: Tue, 5 May 2026 13:11:06 +0200 Subject: [PATCH 108/256] fix(SystemTimeZonesRector): generate ternary for dynamic second argument instead of silently dropping it Also add chained_call fixture for ViewsPluginHandlerManagerRector (no rector change needed, already worked). --- .../Deprecation/SystemTimeZonesRector.php | 9 ++++++++ .../system_time_zones_dynamic_grouped.php.inc | 19 +++++++++++++++ .../fixture/chained_call.php.inc | 23 +++++++++++++++++++ 3 files changed, 51 insertions(+) create mode 100644 tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/fixture/system_time_zones_dynamic_grouped.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/fixture/chained_call.php.inc diff --git a/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector.php b/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector.php index 002445d20..dde8da723 100644 --- a/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector.php +++ b/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector.php @@ -63,6 +63,15 @@ public function refactorWithConfiguration(Node $node, VersionedConfigurationInte return $this->nodeFactory->createStaticCall('Drupal\Core\Datetime\TimeZoneFormHelper', 'getOptionsListByRegion'); } + if (count($args) == 2 && !($args[1]->value instanceof ConstFetch && $this->valueResolver->isFalse($args[1]->value))) { + // Second arg is dynamic or not a literal FALSE — emit a ternary so the grouped flag is preserved. + return new Node\Expr\Ternary( + $args[1]->value, + $this->nodeFactory->createStaticCall('Drupal\Core\Datetime\TimeZoneFormHelper', 'getOptionsListByRegion', [$args[0]]), + $this->nodeFactory->createStaticCall('Drupal\Core\Datetime\TimeZoneFormHelper', 'getOptionsList', [$args[0]]) + ); + } + if (count($args) == 0) { return $this->nodeFactory->createStaticCall('Drupal\Core\Datetime\TimeZoneFormHelper', 'getOptionsList'); } diff --git a/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/fixture/system_time_zones_dynamic_grouped.php.inc b/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/fixture/system_time_zones_dynamic_grouped.php.inc new file mode 100644 index 000000000..8968304eb --- /dev/null +++ b/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/fixture/system_time_zones_dynamic_grouped.php.inc @@ -0,0 +1,19 @@ + +----- + $grouped ? \Drupal\Core\Datetime\TimeZoneFormHelper::getOptionsListByRegion(FALSE) : \Drupal\Core\Datetime\TimeZoneFormHelper::getOptionsList(FALSE), fn() => system_time_zones(FALSE, $grouped)); +} + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/fixture/chained_call.php.inc b/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/fixture/chained_call.php.inc new file mode 100644 index 000000000..12f3c3a5a --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/fixture/chained_call.php.inc @@ -0,0 +1,23 @@ +getHandler($options, $id); + +// pluginManager result used in a method chain. +$instance = Views::pluginManager('display')->createInstance($id); + +?> +----- +getHandler($options, $id); + +// pluginManager result used in a method chain. +$instance = \Drupal::service('plugin.manager.views.display')->createInstance($id); + +?> From 6c1b020b3b3348d23469aed96cb0953a3311b912 Mon Sep 17 00:00:00 2001 From: bjorn Date: Tue, 5 May 2026 13:13:05 +0200 Subject: [PATCH 109/256] docs: update no-match investigation with fix results for MigrateSql, SystemTimeZones, ViewsPluginHandlerManager --- docs/plans/no-match-investigation.md | 175 ++++++++++++++++++++++----- rector-decision.log | 10 ++ 2 files changed, 157 insertions(+), 28 deletions(-) create mode 100644 rector-decision.log diff --git a/docs/plans/no-match-investigation.md b/docs/plans/no-match-investigation.md index 48f22a11d..2c8f8e13f 100644 --- a/docs/plans/no-match-investigation.md +++ b/docs/plans/no-match-investigation.md @@ -22,31 +22,150 @@ didn't match it. ## Ran cleanly — zero files changed -- [ ] `FileSystemBasenameToNativeRector` — modules: ejectorseat -- [ ] `LoadAllIncludesRector` — modules: config_track, schemadotorg -- [ ] `MigrateSqlGetMigrationPluginManagerRector` — modules: migmag, smart_sql_idmap -- [ ] `NodeStorageDeprecatedMethodsRector` — modules: tb_megamenu -- [ ] `PluginBaseIsConfigurableRector` — modules: metatag, search_api -- [ ] `RemoveModuleHandlerAddModuleCallsRector` — modules: acquia_contenthub, sdx -- [ ] `RemoveModuleHandlerDeprecatedMethodsRector` — modules: captcha, jsonld -- [ ] `RemoveSetUriCallbackRector` — modules: rabbit_hole_href -- [ ] `RemoveStateCacheSettingRector` — modules: searchstax, sdx -- [ ] `RemoveTwigNodeTransTagArgumentRector` — modules: searchstax -- [ ] `ReplaceAlphadecimalToIntNullRector` — modules: comment_mover -- [ ] `ReplaceCommentManagerGetCountNewCommentsRector` — modules: forum, history -- [ ] `ReplaceDateTimeRangeConstantsRector` — modules: deprecation_status -- [ ] `ReplaceEditorLoadRector` — modules: acquia_contenthub, ckeditor5_plugin_pack -- [ ] `ReplaceFieldgroupToFieldsetRector` — modules: field_group_vertical_tabs, ui_patterns_settings -- [ ] `ReplaceFileGetContentHeadersRector` — modules: commerce_invoice, tmgmt -- [ ] `ReplaceModuleHandlerGetNameRector` — modules: drd, reassign_user_content -- [ ] `ReplaceNodeAccessViewAllNodesRector` — modules: view_usernames_node_author -- [ ] `ReplaceNodeModuleProceduralFunctionsRector` — modules: reassign_user_content, addanother -- [ ] `ReplaceRecipeRunnerInstallModuleRector` — modules: schemadotorg -- [ ] `ReplaceSessionManagerDeleteRector` — modules: entity_visibility_preview, session_inspector -- [ ] `ReplaceSessionWritesWithRequestSessionRector` — modules: drd, entity_visibility_preview -- [ ] `ReplaceSystemPerformanceGzipKeyRector` — modules: drd -- [ ] `ReplaceUserSessionNamePropertyRector` — modules: acquia_contenthub, session_inspector -- [ ] `ViewsPluginHandlerManagerRector` — modules: searchstax, search_api, metatag -- [ ] `ReplaceRebuildThemeDataRector` — modules: site_guardian -- [ ] `ReplaceRequestTimeConstantRector` — modules: google_analytics_counter, automatic_updates -- [ ] `SystemTimeZonesRector` — modules: intl_date, smart_date +- [x] `FileSystemBasenameToNativeRector` — modules: ejectorseat + - **Rector is correct.** Installed ejectorseat has zero `basename()` calls anywhere. + - **Root cause: version drift.** GitLab search matched a commit/branch that still had the call; the installed release has already dropped it. + - → Find the ejectorseat commit/tag that still has the deprecated call, or find another module that uses `FileSystem::basename()`. +- [x] `LoadAllIncludesRector` — modules: config_track, schemadotorg + - Pattern **exists** in schemadotorg at `SchemaDotOrgStarterkitConverter.php:430`: `$this->moduleHandler->loadAllIncludes('install')` + - config_track only has a definition/override of the method, no calls. + - **Root cause unclear** — pattern present but rector still didn't fire. Likely PHPStan can't infer `$this->moduleHandler` is `ModuleHandlerInterface` (missing type declaration or annotation). Needs deeper look at the property/constructor type declaration. + - → Inspect `SchemaDotOrgStarterkitConverter` property/constructor types for `moduleHandler`. +- [x] `MigrateSqlGetMigrationPluginManagerRector` — modules: migmag, smart_sql_idmap + - Pattern **exists** in both modules but rector logic was too narrow: + - `migmag`: call is inside a trait; `$this` resolves to the test class, not `Sql` → type check fails (still unresolved) + - `smart_sql_idmap`: uses `parent::getMigrationPluginManager()` — rector only handled `$this->` calls, not `parent::` (StaticCall) + - **Fixed** (commit `149d6b3d`): added `StaticCall` to `getNodeTypes()` and a `refactorStaticCall()` handler that matches `parent::getMigrationPluginManager()` → `$this->migrationPluginManager`. Test fixture `parent_call.php.inc` added. + - → Trait case remains unresolved (type inference limitation). +- [x] `NodeStorageDeprecatedMethodsRector` — modules: tb_megamenu + - Pattern **not present**. tb_megamenu is a menu/block module with zero Node entity handling. Never imports `NodeStorageInterface`. + - **Root cause: wrong module selected.** The GitLab search likely matched something unrelated (e.g. a comment or string literal), or version drift. + - → Find a module that actually calls `revisionIds()`, `userRevisionIds()`, or `countDefaultLanguageRevisions()` on a NodeStorage instance. +- [x] `PluginBaseIsConfigurableRector` — modules: metatag, search_api + - Pattern **exists** in metatag at `metatag_views/src/MetatagViewsCacheWrapper.php:374`: `$this->plugin->isConfigurable()` + - **Root cause: rector logic too narrow.** Rector only matches direct `$this->isConfigurable()` where `$this` is `PluginBase`. Delegated calls (`$this->plugin->isConfigurable()`) fail the `$node->var->name !== 'this'` check. + - → **Rector limitation**: would need to also resolve property types to catch delegated calls. Document as known limitation or extend rector. +- [x] `RemoveModuleHandlerAddModuleCallsRector` — modules: acquia_contenthub, sdx + - Pattern **not present** in acquia_contenthub or sdx. + - Pattern **does exist** in `config_track/src/Extension/ModuleHandler.php:178,185,206` — but config_track was not in the test run for this rector (it was assigned to LoadAllIncludesRector instead). + - **Root cause: wrong module assigned.** The search likely found config_track for both rectors; only one was used per rector. config_track should be in the test list for this rector. + - → Add config_track to the test modules for this rector. Rector is correct and would fire (property is `@var ModuleHandlerInterface`). +- [x] `RemoveModuleHandlerDeprecatedMethodsRector` — modules: captcha, jsonld + - Pattern **not present** in either module. jsonld has a local `writeCache()` method but it's not on `ModuleHandlerInterface`. + - **Root cause: version drift / wrong modules.** Neither module uses `ModuleHandlerInterface::writeCache()` or `getHookInfo()`. + - → Find modules that actually call `$moduleHandler->writeCache()` or `$moduleHandler->getHookInfo()`. +- [x] `RemoveSetUriCallbackRector` — modules: rabbit_hole_href + - Pattern **not present**. rabbit_hole_href is a redirect-behavior plugin with no entity-type definition code. + - Root cause: wrong module assigned. + - → Find a module that calls `$entityType->setUriCallback()` in PHP. + +- [x] `RemoveStateCacheSettingRector` — modules: searchstax, sdx + - Pattern **not present** (`$settings['state_cache']`) in either module or anywhere in contrib. + - Root cause: wrong modules / pattern not present in installed codebase. + - → No action on rector. Find correct module or confirm pattern is already gone. + +- [x] `RemoveTwigNodeTransTagArgumentRector` — modules: searchstax + - Pattern **not present** anywhere in contrib. `TwigNodeTrans` is a core class and the 6-arg constructor was already removed in the installed Drupal version. + - Root cause: version drift in core — the installed Drupal already removed the deprecated call. + - → Rector is correct. Needs a Drupal version where the 6-arg form still exists in contrib code. + +- [x] `ReplaceAlphadecimalToIntNullRector` — modules: comment_mover + - Pattern **exists** in comment_mover at `CommentMover.php:73,109`: `Number::alphadecimalToInt($max)` / `Number::alphadecimalToInt($levels[$last])`. + - Root cause: **rector too narrow**. Rector only replaces calls where the argument is a literal `null` or `''`. Real-world calls pass runtime variables, which the rector skips. + - → **Rector limitation**: designed only for `alphadecimalToInt(null)` / `alphadecimalToInt('')` edge cases, not general replacement. Clarify intended scope. + +- [x] `ReplaceCommentManagerGetCountNewCommentsRector` — modules: forum, history + - Pattern **exists** in forum at `ForumManager.php:247`: `$this->commentManager->getCountNewComments($topic, 'comment_forum', $history)`. + - Root cause: **type inference failure**. Property `$commentManager` is declared via `@var` annotation + traditional constructor assignment — not a promoted property. PHPStan may not reliably propagate the type through the assignment, causing `isObjectType()` to fail. + - → Verify PHPStan can infer through traditional `$this->prop = $param` assignment. May need a `@var` annotation PHPStan understands, or a promoted property in the test fixture. + +- [x] `ReplaceDateTimeRangeConstantsRector` — modules: deprecation_status + - Pattern **not present** (`DateTimeRangeConstantsInterface::BOTH` etc.) in deprecation_status or any installed module. + - Root cause: wrong module / pattern not present. + - → Find a module that actually uses `DateTimeRangeConstantsInterface` constants. + +- [x] `ReplaceEditorLoadRector` — modules: acquia_contenthub, ckeditor5_plugin_pack + - Pattern **not present** (`editor_load()` function call) in either module or anywhere in contrib. + - Root cause: wrong modules / pattern not present. + - → Find a module that calls `editor_load($format_id)`. + +- [x] `ReplaceFieldgroupToFieldsetRector` — modules: field_group_vertical_tabs, ui_patterns_settings + - Pattern **not present** in assigned modules. + - Pattern **found** in `webform` at `WebformEntityReferenceWidgetTrait.php:150`: `'#type' => 'fieldgroup'`. + - Root cause: wrong modules assigned. webform was not in the test run. + - → Add webform to test modules for this rector. Rector is correct and would fire. + +- [x] `ReplaceFileGetContentHeadersRector` — modules: commerce_invoice, tmgmt + - Pattern **exists** in both: + - `commerce_invoice/Controller/InvoiceController.php:142` (`.php` file) — should be scanned + - `tmgmt_file/tmgmt_file.module:130` (`.module` file) — **excluded by default** (Rector only scans `.php` extensions) + - Root cause: **`.module` files excluded**. Rector's default `fileExtensions = ['php']` skips `.module` files entirely. The `.php` file in commerce_invoice should have been matched but wasn't — needs deeper investigation. + - → Add `'module'` to `fileExtensions` in rector config. Separately investigate why InvoiceController.php didn't fire. + +- [x] `ReplaceModuleHandlerGetNameRector` — modules: drd, reassign_user_content + - Pattern **not present** in drd or reassign_user_content. + - Pattern found in `group` module but already migrated (uses `ModuleExtensionList`, not `ModuleHandlerInterface`). + - Root cause: wrong modules assigned / already-migrated code. + - → No rector fix needed. Find a module that still uses `ModuleHandlerInterface::getName()`. + +- [x] `ReplaceNodeAccessViewAllNodesRector` — modules: view_usernames_node_author + - Pattern **not present** as executable code (only a `@see` docblock reference in a test file). + - Root cause: wrong module / pattern not present. + - → Find a module that actually calls `node_access_view_all_nodes()` or `drupal_static_reset('node_access_view_all_nodes')`. + +- [x] `ReplaceNodeModuleProceduralFunctionsRector` — modules: reassign_user_content, addanother + - Pattern **exists**: + - `reassign_user_content.module:111` and `Form/AssignAuthorForm.php:98`: `node_mass_update()` + - `addanother.module:151,174`: `node_get_type_label($node)` + - Root cause: **type inference failure + `.module` file scope**. Calls in `.module` files are likely skipped (see `ReplaceFileGetContentHeadersRector`). For `AssignAuthorForm.php:98`, `$nids` is untyped mixed. For `addanother.module:174`, `$node` IS typed as `NodeInterface` but is in a `.module` file. + - → Enable `.module` file scanning. Then verify type inference for procedural function calls works — these functions may not require type checks (plain `FuncCall` nodes), in which case `.module` exclusion is the only blocker. + +- [x] `ReplaceRecipeRunnerInstallModuleRector` — modules: schemadotorg + - Pattern **not present** (schemadotorg uses `RecipeRunner::processRecipe()`, not the deprecated `installModule()`). + - Root cause: wrong module / already using newer API. + - → Find a module that calls `RecipeRunner::installModule()`. + +- [x] `ReplaceSessionManagerDeleteRector` — modules: entity_visibility_preview, session_inspector + - Pattern **not present** with the required type. All modules use `SessionManagerInterface`; rector requires the concrete `SessionManager` class. + - Root cause: **rector too narrow**. Documented as a known limitation in the rector's own `no_change_interface.php.inc` fixture. The deprecated `delete()` method only exists on the concrete class, and real code uses the interface. + - → Rector is working as designed but will rarely fire in practice. Consider whether the type check should be broadened. + +- [x] `ReplaceSessionWritesWithRequestSessionRector` — modules: drd, entity_visibility_preview + - Pattern **not present** (`$_SESSION[...] = ...` writes) in either module. + - Root cause: wrong modules / pattern not present. + - → Find a module that still writes directly to `$_SESSION`. + +- [x] `ReplaceSystemPerformanceGzipKeyRector` — modules: drd + - Pattern **not present** (`system.performance` config keys `css.gzip`/`js.gzip`). drd_agent uses `css.preprocess`/`js.preprocess` (different, non-deprecated keys). + - Root cause: wrong module / pattern not present. + - → Find a module that reads/writes the deprecated `css.gzip` or `js.gzip` config keys. + +- [x] `ReplaceUserSessionNamePropertyRector` — modules: acquia_contenthub, session_inspector + - Pattern **not present** (`$userSession->name` property access) in either module. + - Root cause: wrong modules / pattern not present. + - → Find a module that accesses `->name` on a `UserSession` object. + +- [x] `ViewsPluginHandlerManagerRector` — modules: searchstax, search_api, metatag + - Pattern **exists** in search_api at `SearchApiEntityField.php:51-52`: `Views::handlerManager('field')->getHandler(...)`. + - Root cause: initial analysis was wrong — chained calls work fine because PHP-Parser walks the inner `StaticCall` regardless of what wraps it. + - **Verified working** (commit `6bc5f86b`): test fixture `chained_call.php.inc` added and passes. Zero-changes in test run was likely due to `.module` file exclusion or version drift, not a rector bug. + - → No rector change needed. + +- [x] `ReplaceRebuildThemeDataRector` — modules: site_guardian + - Pattern **exists** in site_guardian: + - `site_guardian.module:37`: `\Drupal::service('theme_handler')->rebuildThemeData()` — `\Drupal::service()` returns untyped `object`, PHPStan cannot infer `ThemeHandlerInterface`. + - `SiteGuardianService.php:153`: `$this->themeHandler->rebuildThemeData()` — property typed as concrete `ThemeHandler` class, not the interface. + - Root cause: **type inference failure** in both cases. Rector checks for `ThemeHandlerInterface` but (1) `\Drupal::service()` is untyped and (2) `ThemeHandler` (concrete class) is not treated as equivalent to the interface in this context. + - → Fix: declare `$themeHandler` as `ThemeHandlerInterface` instead of `ThemeHandler`. The `\Drupal::service()` case can never be fixed without PHPStan service map stubs. + +- [x] `ReplaceRequestTimeConstantRector` — modules: google_analytics_counter, automatic_updates + - Pattern **not present** (no bare `REQUEST_TIME` constant usage). Modules already use `$request->server->get('REQUEST_TIME')`. + - Root cause: wrong modules / already migrated. + - → No action needed. Find a module still using the bare `REQUEST_TIME` constant if test coverage is desired. + +- [x] `SystemTimeZonesRector` — modules: intl_date, smart_date + - Pattern **exists** in both: + - `intl_date:122`: `system_time_zones(FALSE, TRUE)` (literal args — should match, didn't fire, likely because it's already inside a `DeprecationHelper::backwardsCompatibleCall` arrow function — the `isInBackwardsCompatibleCall()` guard skips it correctly) + - `smart_date:166,175`: `system_time_zones(FALSE, $grouped)` (variable 2nd arg — rector was too narrow) + - **Fixed** (commit `6bc5f86b`): added a ternary branch for when the second arg is dynamic (not a literal `FALSE`). Emits `$grouped ? getOptionsListByRegion($arg0) : getOptionsList($arg0)` instead of silently dropping the flag. Test fixture `system_time_zones_dynamic_grouped.php.inc` added. + - → intl_date case is expected no-op (already BC-wrapped). smart_date case now handled. diff --git a/rector-decision.log b/rector-decision.log new file mode 100644 index 000000000..d9fa42bc1 --- /dev/null +++ b/rector-decision.log @@ -0,0 +1,10 @@ +Checking if rector 'DrupalRector\Drupal10\Rector\Deprecation\SystemTimeZonesRector' should apply to Drupal version '11.99.0' for configuration introduced in version '10.1.0' in file '/var/www/html/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/fixture/system_time_zones.php (awnser: )'. +Checking if rector 'DrupalRector\Drupal10\Rector\Deprecation\SystemTimeZonesRector' should apply to Drupal version '11.99.0' for configuration introduced in version '10.1.0' in file '/var/www/html/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/fixture/system_time_zones.php (awnser: )'. +Checking if rector 'DrupalRector\Drupal10\Rector\Deprecation\SystemTimeZonesRector' should apply to Drupal version '11.99.0' for configuration introduced in version '10.1.0' in file '/var/www/html/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/fixture/system_time_zones.php (awnser: )'. +Checking if rector 'DrupalRector\Drupal10\Rector\Deprecation\SystemTimeZonesRector' should apply to Drupal version '11.99.0' for configuration introduced in version '10.1.0' in file '/var/www/html/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/fixture/system_time_zones.php (awnser: )'. +Checking if rector 'DrupalRector\Drupal10\Rector\Deprecation\SystemTimeZonesRector' should apply to Drupal version '11.99.0' for configuration introduced in version '10.1.0' in file '/var/www/html/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/fixture/system_time_zones_dynamic_grouped.php (awnser: )'. +Checking if rector 'DrupalRector\Drupal10\Rector\Deprecation\SystemTimeZonesRector' should apply to Drupal version '11.99.0' for configuration introduced in version '10.1.0' in file '/var/www/html/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/fixture/system_time_zones_dynamic_grouped.php (awnser: )'. +Checking if rector 'DrupalRector\Drupal10\Rector\Deprecation\SystemTimeZonesRector' should apply to Drupal version '11.99.0' for configuration introduced in version '10.1.0' in file '/var/www/html/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/fixture/system_time_zones.php (awnser: )'. +Checking if rector 'DrupalRector\Drupal10\Rector\Deprecation\SystemTimeZonesRector' should apply to Drupal version '11.99.0' for configuration introduced in version '10.1.0' in file '/var/www/html/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/fixture/system_time_zones.php (awnser: )'. +Checking if rector 'DrupalRector\Drupal10\Rector\Deprecation\SystemTimeZonesRector' should apply to Drupal version '11.99.0' for configuration introduced in version '10.1.0' in file '/var/www/html/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/fixture/system_time_zones.php (awnser: )'. +Checking if rector 'DrupalRector\Drupal10\Rector\Deprecation\SystemTimeZonesRector' should apply to Drupal version '11.99.0' for configuration introduced in version '10.1.0' in file '/var/www/html/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/fixture/system_time_zones.php (awnser: )'. From ef389dd68d59941338e4c1e0e21bd09e30709264 Mon Sep 17 00:00:00 2001 From: bjorn Date: Tue, 5 May 2026 13:13:11 +0200 Subject: [PATCH 110/256] chore: remove debug rector-decision.log --- rector-decision.log | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 rector-decision.log diff --git a/rector-decision.log b/rector-decision.log deleted file mode 100644 index d9fa42bc1..000000000 --- a/rector-decision.log +++ /dev/null @@ -1,10 +0,0 @@ -Checking if rector 'DrupalRector\Drupal10\Rector\Deprecation\SystemTimeZonesRector' should apply to Drupal version '11.99.0' for configuration introduced in version '10.1.0' in file '/var/www/html/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/fixture/system_time_zones.php (awnser: )'. -Checking if rector 'DrupalRector\Drupal10\Rector\Deprecation\SystemTimeZonesRector' should apply to Drupal version '11.99.0' for configuration introduced in version '10.1.0' in file '/var/www/html/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/fixture/system_time_zones.php (awnser: )'. -Checking if rector 'DrupalRector\Drupal10\Rector\Deprecation\SystemTimeZonesRector' should apply to Drupal version '11.99.0' for configuration introduced in version '10.1.0' in file '/var/www/html/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/fixture/system_time_zones.php (awnser: )'. -Checking if rector 'DrupalRector\Drupal10\Rector\Deprecation\SystemTimeZonesRector' should apply to Drupal version '11.99.0' for configuration introduced in version '10.1.0' in file '/var/www/html/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/fixture/system_time_zones.php (awnser: )'. -Checking if rector 'DrupalRector\Drupal10\Rector\Deprecation\SystemTimeZonesRector' should apply to Drupal version '11.99.0' for configuration introduced in version '10.1.0' in file '/var/www/html/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/fixture/system_time_zones_dynamic_grouped.php (awnser: )'. -Checking if rector 'DrupalRector\Drupal10\Rector\Deprecation\SystemTimeZonesRector' should apply to Drupal version '11.99.0' for configuration introduced in version '10.1.0' in file '/var/www/html/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/fixture/system_time_zones_dynamic_grouped.php (awnser: )'. -Checking if rector 'DrupalRector\Drupal10\Rector\Deprecation\SystemTimeZonesRector' should apply to Drupal version '11.99.0' for configuration introduced in version '10.1.0' in file '/var/www/html/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/fixture/system_time_zones.php (awnser: )'. -Checking if rector 'DrupalRector\Drupal10\Rector\Deprecation\SystemTimeZonesRector' should apply to Drupal version '11.99.0' for configuration introduced in version '10.1.0' in file '/var/www/html/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/fixture/system_time_zones.php (awnser: )'. -Checking if rector 'DrupalRector\Drupal10\Rector\Deprecation\SystemTimeZonesRector' should apply to Drupal version '11.99.0' for configuration introduced in version '10.1.0' in file '/var/www/html/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/fixture/system_time_zones.php (awnser: )'. -Checking if rector 'DrupalRector\Drupal10\Rector\Deprecation\SystemTimeZonesRector' should apply to Drupal version '11.99.0' for configuration introduced in version '10.1.0' in file '/var/www/html/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/fixture/system_time_zones.php (awnser: )'. From c1d4c104ebda3465a67748e05a19e5c469f42201 Mon Sep 17 00:00:00 2001 From: bjorn Date: Tue, 5 May 2026 13:13:27 +0200 Subject: [PATCH 111/256] chore: ignore rector-decision.log debug file --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 5039fb3ed..233f3ff65 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ /.phpunit.cache .worktrees/ +rector-decision.log From a32ffbcdd40c6bbf6089f7dca8e32e2c487caa61 Mon Sep 17 00:00:00 2001 From: bjorn Date: Tue, 5 May 2026 13:52:54 +0200 Subject: [PATCH 112/256] chore(tests): add fixtures for LoadAllIncludesRector and ReplaceCommentManagerGetCountNewCommentsRector --- docs/plans/no-match-investigation.md | 12 +- scripts/setup-rector-test.sh | 515 +++++++++++++----- .../fixture/no_change_concrete_class.php.inc | 21 + .../fixture/class_property.php.inc | 35 ++ .../no_change_class_property_untyped.php.inc | 14 + .../fixture/traditional_constructor.php.inc | 41 ++ .../fixture/traditional_constructor.php.inc | 41 ++ 7 files changed, 541 insertions(+), 138 deletions(-) create mode 100644 tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/fixture/no_change_concrete_class.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector/fixture/class_property.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector/fixture/no_change_class_property_untyped.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector/fixture/traditional_constructor.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/fixture/traditional_constructor.php.inc diff --git a/docs/plans/no-match-investigation.md b/docs/plans/no-match-investigation.md index 2c8f8e13f..86ab08bae 100644 --- a/docs/plans/no-match-investigation.md +++ b/docs/plans/no-match-investigation.md @@ -29,8 +29,8 @@ didn't match it. - [x] `LoadAllIncludesRector` — modules: config_track, schemadotorg - Pattern **exists** in schemadotorg at `SchemaDotOrgStarterkitConverter.php:430`: `$this->moduleHandler->loadAllIncludes('install')` - config_track only has a definition/override of the method, no calls. - - **Root cause unclear** — pattern present but rector still didn't fire. Likely PHPStan can't infer `$this->moduleHandler` is `ModuleHandlerInterface` (missing type declaration or annotation). Needs deeper look at the property/constructor type declaration. - - → Inspect `SchemaDotOrgStarterkitConverter` property/constructor types for `moduleHandler`. + - **Root cause: missing type declaration.** Tests confirm the rector handles both promoted properties and traditional `@var`-annotated properties correctly (fixtures `class_property.php.inc`, `traditional_constructor.php.inc`). The schemadotorg property likely has no `@var` annotation and no PHP-native type, so PHPStan cannot infer `ModuleHandlerInterface`. Documented via `no_change_class_property_untyped.php.inc`. + - → No rector fix needed. The schemadotorg module needs to add a `@var \Drupal\Core\Extension\ModuleHandlerInterface` annotation to its `$moduleHandler` property. - [x] `MigrateSqlGetMigrationPluginManagerRector` — modules: migmag, smart_sql_idmap - Pattern **exists** in both modules but rector logic was too narrow: - `migmag`: call is inside a trait; `$this` resolves to the test class, not `Sql` → type check fails (still unresolved) @@ -76,8 +76,8 @@ didn't match it. - [x] `ReplaceCommentManagerGetCountNewCommentsRector` — modules: forum, history - Pattern **exists** in forum at `ForumManager.php:247`: `$this->commentManager->getCountNewComments($topic, 'comment_forum', $history)`. - - Root cause: **type inference failure**. Property `$commentManager` is declared via `@var` annotation + traditional constructor assignment — not a promoted property. PHPStan may not reliably propagate the type through the assignment, causing `isObjectType()` to fail. - - → Verify PHPStan can infer through traditional `$this->prop = $param` assignment. May need a `@var` annotation PHPStan understands, or a promoted property in the test fixture. + - **Root cause: missing type annotation, not traditional assignment.** Tests confirm the rector handles `@var`-annotated traditional constructor assignment correctly (fixture `traditional_constructor.php.inc`). PHPStan reads `@var` docblocks on properties reliably. The forum `$commentManager` property likely has no `@var` or PHP-native type declaration. + - → No rector fix needed. Forum's `ForumManager::$commentManager` needs a `@var \Drupal\comment\CommentManagerInterface` annotation (or typed property) for the rector to fire. - [x] `ReplaceDateTimeRangeConstantsRector` — modules: deprecation_status - Pattern **not present** (`DateTimeRangeConstantsInterface::BOTH` etc.) in deprecation_status or any installed module. @@ -155,8 +155,8 @@ didn't match it. - Pattern **exists** in site_guardian: - `site_guardian.module:37`: `\Drupal::service('theme_handler')->rebuildThemeData()` — `\Drupal::service()` returns untyped `object`, PHPStan cannot infer `ThemeHandlerInterface`. - `SiteGuardianService.php:153`: `$this->themeHandler->rebuildThemeData()` — property typed as concrete `ThemeHandler` class, not the interface. - - Root cause: **type inference failure** in both cases. Rector checks for `ThemeHandlerInterface` but (1) `\Drupal::service()` is untyped and (2) `ThemeHandler` (concrete class) is not treated as equivalent to the interface in this context. - - → Fix: declare `$themeHandler` as `ThemeHandlerInterface` instead of `ThemeHandler`. The `\Drupal::service()` case can never be fixed without PHPStan service map stubs. + - **Root cause confirmed as known limitation.** (1) `\Drupal::service()` is untyped — cannot be fixed without PHPStan service map stubs. (2) Concrete `ThemeHandler` class: without Drupal's full class hierarchy loaded in analysis, PHPStan cannot confirm it implements `ThemeHandlerInterface` — documented via `no_change_concrete_class.php.inc`. The rector works correctly when the property is declared as `ThemeHandlerInterface` (fixture `class_property.php.inc`). + - → No rector fix needed. Users must declare `$themeHandler` as `ThemeHandlerInterface` for the rector to fire. The `\Drupal::service()` call is an unfixable limitation. - [x] `ReplaceRequestTimeConstantRector` — modules: google_analytics_counter, automatic_updates - Pattern **not present** (no bare `REQUEST_TIME` constant usage). Modules already use `$request->server->get('REQUEST_TIME')`. diff --git a/scripts/setup-rector-test.sh b/scripts/setup-rector-test.sh index 25d3b5b8c..8bb68b827 100755 --- a/scripts/setup-rector-test.sh +++ b/scripts/setup-rector-test.sh @@ -1,162 +1,181 @@ #!/usr/bin/env bash -# Sets up a Drupal 11 project with contrib modules that exercise all new rectors, -# wires in the local drupal-rector branch, and runs rector so you can review diffs. +# Sets up a Drupal 11 DDEV project with contrib modules that exercise all new +# rectors, wires in the local drupal-rector branch, and runs rector so you can +# review the resulting diff. # -# Usage: ./setup-rector-test.sh [target-directory] -# Default target: ./drupal-rector-test +# Usage: ./scripts/setup-rector-test.sh [project-name] +# Default project name: drupal-rector-test +# Default location: ../../ (sibling of the rector repo) set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" RECTOR_REPO="$(cd "$SCRIPT_DIR/.." && pwd)" RECTOR_BRANCH="feature/digest-rectors" -FORK_URL="https://github.com/bbrala/drupal-rector" -TARGET_DIR="${1:-drupal-rector-test}" -TARGET_DIR="$(realpath "$TARGET_DIR")" +PROJECT_NAME="${1:-drupal-rector-test}" +# Two levels up from this script (scripts/ → repo-root → parent) then the project name. +TARGET_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)/$PROJECT_NAME" -echo "==> Target directory: $TARGET_DIR" -echo "==> drupal-rector source: $RECTOR_REPO (branch: $RECTOR_BRANCH)" +echo "==> Project directory : $TARGET_DIR" +echo "==> drupal-rector repo : $RECTOR_REPO ($RECTOR_BRANCH)" echo "" # --------------------------------------------------------------------------- -# 1. Scaffold the Drupal 11 project +# 1. Create project directory and configure DDEV # --------------------------------------------------------------------------- -if [ -d "$TARGET_DIR" ]; then - echo "Directory $TARGET_DIR already exists — skipping composer create-project." -else - echo "==> Creating Drupal 11 project…" - composer create-project drupal/recommended-project "$TARGET_DIR" \ - --no-interaction \ - --no-install \ - --stability dev -fi - +mkdir -p "$TARGET_DIR" cd "$TARGET_DIR" +echo "==> Configuring DDEV…" +ddev config \ + --project-type=drupal11 \ + --docroot=web \ + --project-name="$PROJECT_NAME" + +# Mount the local rector clone inside the DDEV container so the PATH +# composer repository works without pushing to GitHub first. +cat > .ddev/docker-compose.mounts.yaml << DOCKERCOMPOSE +services: + web: + volumes: + - "$RECTOR_REPO:/mnt/drupal-rector" +DOCKERCOMPOSE + +ddev start -y + # --------------------------------------------------------------------------- -# 2. Wire in drupal-rector from the local clone (preferred) or the fork remote +# 2. Scaffold Drupal 11 # --------------------------------------------------------------------------- echo "" -echo "==> Adding drupal-rector repository…" +echo "==> Scaffolding Drupal 11 via composer create-project…" +ddev composer create-project "drupal/recommended-project:^11" . \ + --no-interaction \ + --stability dev + +# Pre-approve all composer plugins upfront so no interactive prompts appear +# during any subsequent require/update calls. +ddev composer config allow-plugins.tbachert/spi true + +ddev composer require drush/drush --no-interaction + +echo "" +echo "==> Installing Drupal site…" +ddev drush site:install --account-name=admin --account-pass=admin -y -# Use the local clone as a path repository so we get the exact working tree. -composer config repositories.drupal-rector \ - '{"type":"path","url":"'"$RECTOR_REPO"'","options":{"symlink":false}}' +# --------------------------------------------------------------------------- +# 3. Wire in drupal-rector from the local clone +# --------------------------------------------------------------------------- +echo "" +echo "==> Wiring in drupal-rector (local clone via DDEV mount)…" -# Also add the fork as a VCS fallback (lets composer resolve the branch name). -composer config repositories.drupal-rector-vcs \ - '{"type":"vcs","url":"'"$FORK_URL"'"}' +# PATH repository — resolves to the mounted rector clone inside the container. +# Listed as the only source; no VCS fallback needed (and SSH keys aren't +# available inside DDEV containers anyway). +ddev composer config repositories.drupal-rector \ + '{"type":"path","url":"/mnt/drupal-rector","options":{"symlink":true}}' -# Require drupal-rector dev branch. -composer require \ +ddev composer require \ "palantirnet/drupal-rector:dev-$RECTOR_BRANCH as 1.x-dev" \ - --no-update + --no-interaction # --------------------------------------------------------------------------- -# 3. Require contrib modules -# Target: ≥2 modules per rector where possible. +# 4. Require contrib modules (≥2 per rector where possible) # See docs/contrib-modules-d11.md for the full coverage mapping. -# 7 rectors only have 1 module available (marked with *). +# Note: 8 rectors have no testable D11 contrib module (see comments in test script). # --------------------------------------------------------------------------- echo "" echo "==> Requiring contrib modules…" -composer require --no-update \ - \ - `# ── 4-rector modules ──────────────────────────────────────────────────` \ - "drupal/drd:*" `# ReplaceEntityOriginalPropertyRector, ReplaceModuleHandlerGetNameRector, ReplaceSessionWritesWithRequestSessionRector, ReplaceSystemPerformanceGzipKeyRector` \ - "drupal/acquia_contenthub:*" `# RemoveModuleHandlerAddModuleCallsRector, ReplaceEditorLoadRector, ReplacePdoFetchConstantsRector, ReplaceUserSessionNamePropertyRector` \ - "drupal/social:*" `# ReplaceCommentUriRector, ReplaceNodeModuleProceduralFunctionsRector, ReplaceViewsProceduralFunctionsRector, ViewsPluginHandlerManagerRector` \ - \ - `# ── 3-rector modules ──────────────────────────────────────────────────` \ - "drupal/searchstax:*" `# RemoveStateCacheSettingRector, RemoveTwigNodeTransTagArgumentRector, ViewsPluginHandlerManagerRector (2nd)` \ - "drupal/ai_agents:*" `# ReplaceEditorLoadRector (2nd), ReplaceNodeSetPreviewModeRector, ReplaceSystemPerformanceGzipKeyRector (2nd)` \ - \ - `# ── 2-rector modules ──────────────────────────────────────────────────` \ - "drupal/commerce_invoice:*" `# ReplaceFileGetContentHeadersRector, UseEntityTypeHasIntegerIdRector` \ - "drupal/custom_field:*" `# ReplaceEntityReferenceRecursiveLimitRector, ReplaceViewsProceduralFunctionsRector (2nd)` \ - "drupal/entity_visibility_preview:*" `# ReplaceSessionManagerDeleteRector, ReplaceSessionWritesWithRequestSessionRector (2nd)` \ - "drupal/views_dependent_filters:*" `# RemoveHandlerBaseDefineExtraOptionsRector (*), RemoveTrustDataCallRector` \ - "drupal/group:*" `# RemoveTrustDataCallRector (2nd), RemoveUpdaterPostInstallMethodsRector` \ - "drupal/session_inspector:*" `# ReplaceSessionManagerDeleteRector (2nd), ReplaceUserSessionNamePropertyRector (2nd)` \ - "drupal/sdx:*" `# RemoveModuleHandlerAddModuleCallsRector (2nd), RemoveStateCacheSettingRector (2nd)` \ - "drupal/search_api:*" `# PluginBaseIsConfigurableRector, RemoveTwigNodeTransTagArgumentRector (2nd)` \ - "drupal/schemadotorg:*" `# LoadAllIncludesRector, ReplaceRecipeRunnerInstallModuleRector (*)` \ - "drupal/smart_migrate_cli:*" `# RemoveRootFromConvertDbUrlRector, StripMigrationDependenciesExpandArgRector` \ - "drupal/metatag:*" `# PluginBaseIsConfigurableRector (2nd), RemoveViewsRowCacheKeysRector` \ - "drupal/external_entity:*" `# ReplaceEntityOriginalPropertyRector (2nd), ReplaceEntityReferenceRecursiveLimitRector (2nd)` \ - "drupal/reassign_user_content:*" `# ReplaceModuleHandlerGetNameRector (2nd), ReplaceNodeModuleProceduralFunctionsRector (2nd)` \ - \ - `# ── 1-rector modules (filling gaps) ─────────────────────────────────` \ - "drupal/openy:*" `# ReplaceRebuildThemeDataRector` \ - "drupal/bootstrap_italia:*" `# ReplaceThemeGetSettingRector` \ - "drupal/view_usernames_node_author:*" `# ReplaceNodeAccessViewAllNodesRector (*)` \ - "drupal/association:*" `# UseEntityTypeHasIntegerIdRector (2nd)` \ - "drupal/tome:*" `# ReplaceNodeAddBodyFieldRector` \ - "drupal/cmrf_form_processor:*" `# RemoveCacheExpireOverrideRector` \ - "drupal/intl_date:*" `# SystemTimeZonesRector` \ - "drupal/geolocation:*" `# StripMigrationDependenciesExpandArgRector (2nd)` \ - "drupal/responsive_preview:*" `# ReplaceNodeSetPreviewModeRector (2nd)` \ - "drupal/kart:*" `# ReplaceThemeGetSettingRector (2nd)` \ - "drupal/tmgmt:*" `# ReplaceFileGetContentHeadersRector (2nd)` \ - "drupal/config_track:*" `# LoadAllIncludesRector (2nd)` \ - "drupal/guswds:*" `# ReplaceRebuildThemeDataRector (2nd)` \ - "drupal/smart_date:*" `# SystemTimeZonesRector (2nd)` \ - "drupal/vcp4dates:*" `# RemoveCacheExpireOverrideRector (2nd)` \ - "drupal/gdpr:*" `# ReplacePdoFetchConstantsRector (2nd)` \ - "drupal/ai_eca:*" `# ReplaceNodeAddBodyFieldRector (2nd)` \ - "drupal/deprecation_status:*" `# ReplaceDateTimeRangeConstantsRector (*)` \ - "drupal/gnode_request:*" `# RemoveUpdaterPostInstallMethodsRector (2nd)` \ - "drupal/google_analytics_counter:*" `# ReplaceRequestTimeConstantRector` \ - "drupal/migmag:*" `# MigrateSqlGetMigrationPluginManagerRector` \ - "drupal/field_group_vertical_tabs:*" `# ReplaceFieldgroupToFieldsetRector` \ - "drupal/ui_patterns_settings:*" `# ReplaceFieldgroupToFieldsetRector (2nd)` \ - "drupal/tb_megamenu:*" `# NodeStorageDeprecatedMethodsRector (*)` \ - "drupal/automatic_updates:*" `# ReplaceRequestTimeConstantRector (2nd)` \ - "drupal/sparql_entity_storage:*" `# RemoveRootFromConvertDbUrlRector (2nd)` \ - "drupal/views_advanced_cache:*" `# RemoveViewsRowCacheKeysRector (2nd)` \ - "drupal/captcha:*" `# RemoveModuleHandlerDeprecatedMethodsRector` \ - "drupal/ejectorseat:*" `# FileSystemBasenameToNativeRector (*)` \ - "drupal/smart_sql_idmap:*" `# MigrateSqlGetMigrationPluginManagerRector (2nd)` \ - "drupal/gadget:*" `# ReplaceCommentUriRector (2nd)` \ - "drupal/jsonld:*" `# RemoveModuleHandlerDeprecatedMethodsRector (2nd)` \ - "drupal/forum:*" `# ReplaceCommentManagerGetCountNewCommentsRector` \ - "drupal/history:*" `# ReplaceCommentManagerGetCountNewCommentsRector (2nd)` \ - "drupal/comment_mover:*" `# ReplaceAlphadecimalToIntNullRector` \ - "drupal/indieweb:*" `# ReplaceAlphadecimalToIntNullRector (2nd)` \ - "drupal/rabbit_hole:*" `# RemoveSetUriCallbackRector (*)` - -# --------------------------------------------------------------------------- -# 4. Install everything -# --------------------------------------------------------------------------- +# Batch 1 — multi-rector modules (high-value) +ddev composer require --no-update \ + "drupal/drd:*" \ + "drupal/acquia_contenthub:*" \ + "drupal/searchstax:*" \ + "drupal/ai_agents:*" \ + "drupal/ckeditor5_plugin_pack:*" \ + "drupal/bootstrap5:*" \ + "drupal/commerce_invoice:*" \ + "drupal/custom_field:*" \ + "drupal/entity_visibility_preview:*" \ + "drupal/views_dependent_filters:*" \ + "drupal/group:*" \ + "drupal/session_inspector:*" \ + "drupal/sdx:*" \ + "drupal/search_api:*" \ + "drupal/schemadotorg:*" \ + "drupal/smart_migrate_cli:*" \ + "drupal/metatag:*" \ + "drupal/external_entity:*" \ + "drupal/reassign_user_content:*" + +# Batch 2 — single-rector gap-fillers +ddev composer require --no-update \ + "drupal/tara:*" \ + "drupal/vani:*" \ + "drupal/view_usernames_node_author:*" \ + "drupal/association:*" \ + "drupal/tome:*" \ + "drupal/cmrf_form_processor:*" \ + "drupal/intl_date:*" \ + "drupal/responsive_preview:*" \ + "drupal/tmgmt:*" \ + "drupal/config_track:*" \ + "drupal/site_guardian:*" \ + "drupal/smart_date:*" \ + "drupal/vcp4dates:*" \ + "drupal/gdpr:*" \ + "drupal/ai_eca:*" \ + "drupal/deprecation_status:*" \ + "drupal/gnode_request:*" \ + "drupal/google_analytics_counter:*" \ + "drupal/migmag:*" \ + "drupal/field_group_vertical_tabs:*" \ + "drupal/ui_patterns_settings:*" \ + "drupal/tb_megamenu:*" \ + "drupal/automatic_updates:*" \ + "drupal/sparql_entity_storage:*" \ + "drupal/views_advanced_cache:*" \ + "drupal/captcha:*" \ + "drupal/ejectorseat:*" \ + "drupal/smart_sql_idmap:*" \ + "drupal/jsonld:*" \ + "drupal/forum:*" \ + "drupal/history:*" \ + "drupal/comment_mover:*" \ + "drupal/rabbit_hole_href:*" \ + "drupal/addanother:*" \ + "drupal/quicktabs:*" \ + "drupal/entity_usage:*" \ + "drupal/media_auto_publication:*" \ + "drupal/migrate_tools:*" + echo "" -echo "==> Running composer install (this may take a while)…" -composer install \ - --no-interaction \ - --ignore-platform-reqs \ - --prefer-dist +echo "==> Running composer update to resolve all requirements…" +ddev composer update --no-interaction --with-all-dependencies # --------------------------------------------------------------------------- -# 5. Initialise git and commit the baseline +# 5. Initialise git and commit the installed baseline +# (vendor/ and web/core/ excluded; web/modules/contrib/ tracked so +# rector changes show up in git diff) # --------------------------------------------------------------------------- echo "" -echo "==> Initialising git repo…" +echo "==> Initialising git repository…" if [ ! -d ".git" ]; then git init fi -# Ignore vendor/ and web/core but keep contrib module source for rector + diffing. cat > .gitignore << 'GITIGNORE' /vendor/ /web/core/ /web/sites/default/settings.php /web/sites/default/services.yml +/web/sites/default/files/ *.orig GITIGNORE git add . -git commit -m "Install Drupal 11 + contrib modules for rector testing" --allow-empty +git commit -m "Install Drupal 11 + contrib modules for rector testing" # --------------------------------------------------------------------------- # 6. Write rector.php @@ -176,6 +195,7 @@ return RectorConfig::configure() ->withPaths([ __DIR__ . '/web/modules/contrib', ]) + ->withFileExtensions(['php', 'module', 'theme', 'install', 'profile', 'inc', 'engine']) ->withSets([ Drupal10SetList::DRUPAL_10, Drupal11SetList::DRUPAL_11, @@ -183,35 +203,266 @@ return RectorConfig::configure() RECTOR git add rector.php -git commit -m "Add rector.php config targeting web/modules/contrib" # --------------------------------------------------------------------------- -# 7. Run rector --dry-run to preview changes +# 7. Generate per-rector test script (run this inside ddev ssh) +# --------------------------------------------------------------------------- +mkdir -p scripts +cat > scripts/test-rectors.sh << 'TESTSCRIPT' +#!/usr/bin/env bash +# Per-rector test runner. Run this INSIDE the DDEV container: +# ddev ssh +# bash /var/www/html/scripts/test-rectors.sh [RectorName] +# +# With no argument: runs all rectors in sequence. +# With a rector class name: runs only that one rector. +# Output is tee'd to /var/www/html/rector-test.log + +set -euo pipefail +cd /var/www/html + +LOG=/var/www/html/rector-test.log +CONTRIB=web/modules/contrib +FILTER="${1:-}" + +run_test() { + local rector="$1" + shift + local mods=("$@") + + # Skip if a filter is set and doesn't match + if [ -n "$FILTER" ] && [ "$FILTER" != "$rector" ]; then + return + fi + + # Derive FQCN by checking which namespace the rector lives in + local fqcn + if [ -f "vendor/palantirnet/drupal-rector/src/Drupal11/Rector/Deprecation/${rector}.php" ]; then + fqcn="DrupalRector\\Drupal11\\Rector\\Deprecation\\${rector}" + else + fqcn="DrupalRector\\Drupal10\\Rector\\Deprecation\\${rector}" + fi + + # Resolve installed module directories + local paths=() + for mod in "${mods[@]}"; do + [ -d "$CONTRIB/$mod" ] && paths+=("$CONTRIB/$mod") + done + + echo "" | tee -a "$LOG" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" | tee -a "$LOG" + printf " %s\n" "$rector" | tee -a "$LOG" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" | tee -a "$LOG" + + if [ ${#paths[@]} -eq 0 ]; then + echo " SKIP — no modules installed for this rector" | tee -a "$LOG" + return + fi + + printf " Rector: %s\n" "$fqcn" | tee -a "$LOG" + printf " Modules: %s\n" "${paths[*]}" | tee -a "$LOG" + echo "" | tee -a "$LOG" + + timeout 30 vendor/bin/rector process "${paths[@]}" --only="$fqcn" --dry-run --no-cache 2>&1 | tee -a "$LOG" || true + + echo "" | tee -a "$LOG" + git diff "${paths[@]}" | tee -a "$LOG" || true + + # Reset files so the next rector starts clean + git checkout -- "${paths[@]}" 2>/dev/null || true +} + +echo "Rector test run — $(date)" | tee "$LOG" +echo "Log: $LOG" | tee -a "$LOG" + +# ── Drupal 11 rectors ────────────────────────────────────────────────────── +run_test ErrorCurrentErrorHandlerRector + # No contrib usage: Error::currentErrorHandler() deprecated D11.3.0; devel 5.x already cleaned up, no other hits + +run_test FileSystemBasenameToNativeRector \ + ejectorseat + +run_test LoadAllIncludesRector \ + config_track schemadotorg + +run_test MigrateSqlGetMigrationPluginManagerRector \ + feeds_migrate migmag smart_sql_idmap + +run_test NodeStorageDeprecatedMethodsRector \ + tb_megamenu + +run_test PluginBaseIsConfigurableRector \ + metatag search_api + +run_test RemoveAutomatedCronSubmitHandlerRector + # No contrib usage: automated_cron_settings_submit deprecated D11.4.0, no contrib calls found + +run_test RemoveCacheExpireOverrideRector \ + cmrf_form_processor vcp4dates + +run_test RemoveHandlerBaseDefineExtraOptionsRector \ + views_dependent_filters + +run_test RemoveLinkWidgetValidateTitleElementRector + # No contrib usage: LinkWidget::validateTitleElement() deprecated D11.4.0, no contrib calls found + +run_test RemoveModuleHandlerAddModuleCallsRector \ + acquia_contenthub sdx + +run_test RemoveModuleHandlerDeprecatedMethodsRector \ + captcha jsonld + +run_test RemoveRootFromConvertDbUrlRector \ + smart_migrate_cli sparql_entity_storage + +run_test RemoveSetUriCallbackRector \ + rabbit_hole_href + +run_test RemoveStateCacheSettingRector \ + searchstax sdx + +run_test RemoveTrustDataCallRector \ + views_dependent_filters group + +run_test RemoveTwigNodeTransTagArgumentRector \ + searchstax + +run_test RemoveUpdaterPostInstallMethodsRector \ + group gnode_request + +run_test RemoveViewsRowCacheKeysRector \ + metatag views_advanced_cache + +run_test RenameStopProceduralHookScanRector + # No contrib usage: StopProceduralHookScan attribute deprecated D11.2.0, niche — no contrib usage found + +run_test ReplaceAlphadecimalToIntNullRector \ + comment_mover indieweb + +run_test ReplaceCommentManagerGetCountNewCommentsRector \ + forum history + +run_test ReplaceCommentUriRector + # No contrib usage: comment_uri() deprecated D11.3.0; Social 13.x already cleaned up (issue #3432522), no other D11 hits + +run_test ReplaceDateTimeRangeConstantsRector \ + deprecation_status + +run_test ReplaceEditorLoadRector \ + acquia_contenthub ckeditor5_plugin_pack + +run_test ReplaceEntityOriginalPropertyRector \ + entity_usage media_auto_publication + +run_test ReplaceEntityReferenceRecursiveLimitRector + # No contrib usage: RECURSIVE_RENDER_LIMIT removed from core before D11; + # all D11-compatible modules either define their own constant or hardcode 20. + # custom_field/external_entity define the constant, they don't reference core's. + +run_test ReplaceFieldgroupToFieldsetRector \ + field_group_vertical_tabs ui_patterns_settings + +run_test ReplaceFileGetContentHeadersRector \ + commerce_invoice tmgmt + +run_test ReplaceLocaleConfigBatchFunctionsRector + # No contrib usage: locale_config_batch_* deprecated D11.1.0; all GitLab hits were bundled core copies, not contrib code + +run_test ReplaceModuleHandlerGetNameRector \ + drd reassign_user_content + +run_test ReplaceNodeAccessViewAllNodesRector \ + view_usernames_node_author + +run_test ReplaceNodeAddBodyFieldRector \ + tome ai_eca + +run_test ReplaceNodeModuleProceduralFunctionsRector \ + reassign_user_content addanother + +run_test ReplaceNodeSetPreviewModeRector \ + ai_agents responsive_preview + +run_test ReplacePdoFetchConstantsRector \ + acquia_contenthub gdpr + +run_test ReplaceRecipeRunnerInstallModuleRector \ + schemadotorg + +run_test ReplaceSessionManagerDeleteRector \ + entity_visibility_preview session_inspector + +run_test ReplaceSessionWritesWithRequestSessionRector \ + drd entity_visibility_preview + +run_test ReplaceSystemPerformanceGzipKeyRector \ + drd bootstrap5 + +run_test ReplaceThemeGetSettingRector \ + tara vani + +run_test ReplaceUserSessionNamePropertyRector \ + acquia_contenthub session_inspector + +run_test ReplaceViewsProceduralFunctionsRector \ + custom_field quicktabs + +run_test StatementPrefetchIteratorFetchColumnRector + # No contrib usage: fetchColumn() removed at D10.0; all D11-compatible modules already resolved this + +run_test StripMigrationDependenciesExpandArgRector \ + migrate_tools + +run_test UseEntityTypeHasIntegerIdRector \ + commerce_invoice association + +run_test ViewsPluginHandlerManagerRector \ + searchstax search_api metatag + +# ── Drupal 10 rectors ────────────────────────────────────────────────────── +run_test ReplaceModuleHandlerGetNameRector \ + drd reassign_user_content + +run_test ReplaceRebuildThemeDataRector \ + site_guardian + +run_test ReplaceRequestTimeConstantRector \ + google_analytics_counter automatic_updates + +run_test SystemTimeZonesRector \ + intl_date smart_date + +echo "" | tee -a "$LOG" +echo "Done. Full log: $LOG" | tee -a "$LOG" +TESTSCRIPT + +chmod +x scripts/test-rectors.sh +git add rector.php scripts/test-rectors.sh +git commit -m "Add rector.php and per-rector test script" + +# --------------------------------------------------------------------------- +# 8. Print manual run instructions # --------------------------------------------------------------------------- echo "" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -echo " Running rector --dry-run (no files modified)" +echo " Setup complete." echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "" -vendor/bin/rector process --dry-run 2>&1 || true - +echo " cd $TARGET_DIR && ddev ssh" echo "" -echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -echo " Next steps" -echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo " # Run all rectors, each against its own modules only:" +echo " bash /var/www/html/scripts/test-rectors.sh" +echo "" +echo " # Run a single rector:" +echo " bash /var/www/html/scripts/test-rectors.sh LoadAllIncludesRector" echo "" -echo " Apply changes:" -echo " cd $TARGET_DIR && vendor/bin/rector process" +echo " # Log is written to: $TARGET_DIR/rector-test.log" echo "" -echo " Review diff:" -echo " git diff" +echo " Site: run 'ddev launch' | Admin: admin / admin" echo "" -echo " Rector coverage notes:" -echo " * FileSystemBasenameToNativeRector — only 1 module (ejectorseat)" -echo " * NodeStorageDeprecatedMethodsRector — only 1 module (tb_megamenu)" -echo " * RemoveHandlerBaseDefineExtraOptionsRector — only 1 module (views_dependent_filters)" -echo " * RemoveSetUriCallbackRector — only 1 module (rabbit_hole)" -echo " * ReplaceDateTimeRangeConstantsRector — only 1 module (deprecation_status)" -echo " * ReplaceNodeAccessViewAllNodesRector — only 1 module (view_usernames_node_author)" -echo " * ReplaceRecipeRunnerInstallModuleRector — only 1 module (schemadotorg)" -echo " * 6 rectors have no D11 contrib usage found (see docs/contrib-modules-d11.md)" +echo " Coverage notes (see docs/contrib-modules-d11.md):" +echo " * 8 rectors skipped — pattern exhausted or no D11 contrib usage found" +echo " (ErrorCurrentErrorHandler, RemoveAutomatedCronSubmitHandler," +echo " RemoveLinkWidgetValidateTitleElement, RenameStopProceduralHookScan," +echo " ReplaceCommentUri, ReplaceEntityReferenceRecursiveLimit," +echo " ReplaceLocaleConfigBatchFunctions, StatementPrefetchIteratorFetchColumn)" diff --git a/tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/fixture/no_change_concrete_class.php.inc b/tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/fixture/no_change_concrete_class.php.inc new file mode 100644 index 000000000..ce104de10 --- /dev/null +++ b/tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/fixture/no_change_concrete_class.php.inc @@ -0,0 +1,21 @@ +themeHandler = $themeHandler; + } + + public function rebuild(): array { + return $this->themeHandler->rebuildThemeData(); + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector/fixture/class_property.php.inc b/tests/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector/fixture/class_property.php.inc new file mode 100644 index 000000000..40e5dddbd --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector/fixture/class_property.php.inc @@ -0,0 +1,35 @@ +moduleHandler->loadAllIncludes('install'); + $this->moduleHandler->loadAllIncludes('inc', 'admin'); + } +} +?> +----- +moduleHandler->getModuleList() as $module => $filename) { + $this->moduleHandler->loadInclude($module, 'install'); + } + foreach ($this->moduleHandler->getModuleList() as $module => $filename) { + $this->moduleHandler->loadInclude($module, 'inc', 'admin'); + } + } +} +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector/fixture/no_change_class_property_untyped.php.inc b/tests/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector/fixture/no_change_class_property_untyped.php.inc new file mode 100644 index 000000000..764a22b7d --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector/fixture/no_change_class_property_untyped.php.inc @@ -0,0 +1,14 @@ +moduleHandler = $moduleHandler; + } + + public function loadAll(): void { + $this->moduleHandler->loadAllIncludes('install'); + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector/fixture/traditional_constructor.php.inc b/tests/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector/fixture/traditional_constructor.php.inc new file mode 100644 index 000000000..d6e8fea5d --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector/fixture/traditional_constructor.php.inc @@ -0,0 +1,41 @@ +moduleHandler = $moduleHandler; + } + + public function installAll(): void { + $this->moduleHandler->loadAllIncludes('install'); + } +} +?> +----- +moduleHandler = $moduleHandler; + } + + public function installAll(): void { + foreach ($this->moduleHandler->getModuleList() as $module => $filename) { + $this->moduleHandler->loadInclude($module, 'install'); + } + } +} +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/fixture/traditional_constructor.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/fixture/traditional_constructor.php.inc new file mode 100644 index 000000000..422c99c2a --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/fixture/traditional_constructor.php.inc @@ -0,0 +1,41 @@ +commentManager = $commentManager; + } + + public function getCountNewComments(\Drupal\Core\Entity\EntityInterface $entity): int|false { + return $this->commentManager->getCountNewComments($entity, 'comment_forum', 0); + } +} +?> +----- +commentManager = $commentManager; + } + + public function getCountNewComments(\Drupal\Core\Entity\EntityInterface $entity): int|false { + return \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => \Drupal::service(\Drupal\history\HistoryManager::class)->getCountNewComments($entity, 'comment_forum', 0), fn() => $this->commentManager->getCountNewComments($entity, 'comment_forum', 0)); + } +} +?> From 2f8c2d14efe4fb7a4c106ceb92c1938793a143e7 Mon Sep 17 00:00:00 2001 From: bjorn Date: Wed, 6 May 2026 10:25:59 +0200 Subject: [PATCH 113/256] fix: extend PluginBaseIsConfigurableRector and RemoveViewsRowCacheKeysRector to handle real-world patterns PluginBaseIsConfigurableRector was restricted to $this->isConfigurable() but missed delegation wrappers like $this->plugin->isConfigurable() where the property is typed as PluginBase. Remove the $this-only guard; the existing isObjectType() check already verifies the receiver type. RemoveViewsRowCacheKeysRector only handled the inline-array pattern ['keys' => $plugin->getRowCacheKeys($row)]. Two additional patterns seen in the wild were silently skipped: - Variable-first: $keys = $plugin->getRowCacheKeys($row) followed by an array item 'keys' => $keys. Added Expression handler that removes the assignment and tracks the variable name; Array_ handler extended to also drop items whose value is a tracked variable. - Method delegation: a ClassMethod whose entire body is return $plugin->getRowCacheKeys($row). Added ClassMethod handler that removes the whole method. beforeTraversal() resets the tracked variable list per file to avoid false positives across file boundaries. --- .../PluginBaseIsConfigurableRector.php | 8 -- .../RemoveViewsRowCacheKeysRector.php | 109 ++++++++++++++++-- .../fixture/no_change_other_variable.php.inc | 5 +- .../fixture/property_delegation.php.inc | 35 ++++++ .../fixture/assignment_removal.php.inc | 10 ++ .../fixture/delegation_method.php.inc | 41 +++++++ .../fixture/no_change_standalone_call.php.inc | 5 +- .../fixture/variable_first.php.inc | 25 ++++ 8 files changed, 217 insertions(+), 21 deletions(-) create mode 100644 tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture/property_delegation.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/assignment_removal.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/delegation_method.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/variable_first.php.inc diff --git a/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector.php b/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector.php index 37d66ca5a..efc886932 100644 --- a/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector.php +++ b/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector.php @@ -36,14 +36,6 @@ public function refactor(Node $node): ?Node return null; } - if (!$node->var instanceof Node\Expr\Variable) { - return null; - } - - if ($this->getName($node->var) !== 'this') { - return null; - } - if (!$this->isObjectType($node->var, new ObjectType('Drupal\Component\Plugin\PluginBase'))) { return null; } diff --git a/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php b/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php index a6e1cdcb4..90fcd6b01 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php @@ -6,18 +6,27 @@ use PhpParser\Node; use PhpParser\Node\Expr\Array_; +use PhpParser\Node\Expr\Assign; use PhpParser\Node\Expr\MethodCall; +use PhpParser\Node\Expr\Variable; use PhpParser\Node\Identifier; +use PhpParser\Node\Stmt\ClassMethod; +use PhpParser\Node\Stmt\Expression; +use PhpParser\Node\Stmt\Return_; +use PhpParser\NodeVisitor; use PHPStan\Type\ObjectType; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** - * Removes deprecated CachePluginBase::getRowCacheKeys() and getRowId() array item values. + * Removes deprecated CachePluginBase::getRowCacheKeys() and getRowId() calls. * * Both methods are deprecated in drupal:11.4.0 and removed in drupal:13.0.0 - * with no replacement. + * with no replacement. Handles three patterns: + * - Inline array item value: ['keys' => $plugin->getRowCacheKeys($row)] + * - Variable-first assignment: $keys = $plugin->getRowCacheKeys($row); [...'keys' => $keys] + * - Delegation method: public function getRowCacheKeys($row) { return $this->plugin->getRowCacheKeys($row); } * * @see https://www.drupal.org/node/3564958 */ @@ -25,15 +34,30 @@ final class RemoveViewsRowCacheKeysRector extends AbstractRector { private const DEPRECATED_METHODS = ['getRowCacheKeys', 'getRowId']; + private const CACHE_PLUGIN_BASE = 'Drupal\views\Plugin\views\cache\CachePluginBase'; + + /** @var list variable names whose assignments were removed in the current file */ + private array $removedVarNames = []; + + public function beforeTraversal(array $nodes): array + { + $this->removedVarNames = []; + return $nodes; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( - 'Remove deprecated CachePluginBase::getRowCacheKeys() and getRowId() array item values', + 'Remove deprecated CachePluginBase::getRowCacheKeys() and getRowId() calls and array item values', [ new CodeSample( "['keys' => \$cache_plugin->getRowCacheKeys(\$row), 'tags' => []]", "['tags' => []]" ), + new CodeSample( + "\$keys = \$cache_plugin->getRowCacheKeys(\$row);\n['keys' => \$keys, 'tags' => []]", + "['tags' => []]" + ), ] ); } @@ -41,24 +65,86 @@ public function getRuleDefinition(): RuleDefinition /** @return array> */ public function getNodeTypes(): array { - return [Array_::class]; + return [Array_::class, Expression::class, ClassMethod::class]; } - public function refactor(Node $node): ?Node + public function refactor(Node $node): int|Node|null { + if ($node instanceof Expression) { + return $this->refactorExpression($node); + } + + if ($node instanceof ClassMethod) { + return $this->refactorClassMethod($node); + } + assert($node instanceof Array_); + return $this->refactorArray($node); + } + + private function refactorExpression(Expression $node): int|null + { + if (!$node->expr instanceof Assign) { + return null; + } + $assign = $node->expr; + if (!$assign->var instanceof Variable) { + return null; + } + if (!$assign->expr instanceof MethodCall) { + return null; + } + if (!$this->isDeprecatedMethodCall($assign->expr)) { + return null; + } + + $varName = $this->getName($assign->var); + if ($varName !== null) { + $this->removedVarNames[] = $varName; + } + + return NodeVisitor::REMOVE_NODE; + } + + private function refactorClassMethod(ClassMethod $node): int|null + { + if (count($node->stmts ?? []) !== 1) { + return null; + } + $stmt = $node->stmts[0]; + if (!$stmt instanceof Return_) { + return null; + } + if (!$stmt->expr instanceof MethodCall) { + return null; + } + if (!$this->isDeprecatedMethodCall($stmt->expr)) { + return null; + } + + return NodeVisitor::REMOVE_NODE; + } + + private function refactorArray(Array_ $node): ?Array_ + { $modified = false; $newItems = []; foreach ($node->items as $item) { if ($item->value instanceof MethodCall - && $item->value->name instanceof Identifier - && in_array($item->value->name->toString(), self::DEPRECATED_METHODS, true) - && $this->isObjectType($item->value->var, new ObjectType('Drupal\views\Plugin\views\cache\CachePluginBase')) + && $this->isDeprecatedMethodCall($item->value) + ) { + $modified = true; + continue; + } + + if ($item->value instanceof Variable + && in_array($this->getName($item->value), $this->removedVarNames, true) ) { $modified = true; continue; } + $newItems[] = $item; } @@ -69,4 +155,11 @@ public function refactor(Node $node): ?Node return $node; } + + private function isDeprecatedMethodCall(MethodCall $call): bool + { + return $call->name instanceof Identifier + && in_array($call->name->toString(), self::DEPRECATED_METHODS, true) + && $this->isObjectType($call->var, new ObjectType(self::CACHE_PLUGIN_BASE)); + } } diff --git a/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture/no_change_other_variable.php.inc b/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture/no_change_other_variable.php.inc index 618bc4c92..768598c7f 100644 --- a/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture/no_change_other_variable.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture/no_change_other_variable.php.inc @@ -1,6 +1,5 @@ isConfigurable() — receiver is not $this, so it must not be changed. -// Other classes (e.g. Action, CKEditor5PluginDefinition) have isConfigurable() -// with different semantics. +// $plugin has no type annotation, so PHPStan cannot confirm it is a PluginBase. +// Without that confirmation the rector must not change the call. $result = $plugin->isConfigurable(); diff --git a/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture/property_delegation.php.inc b/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture/property_delegation.php.inc new file mode 100644 index 000000000..48080a2ba --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture/property_delegation.php.inc @@ -0,0 +1,35 @@ +plugin (not $this), but since $this->plugin +// is typed as PluginBase the rector must still replace the deprecated call. +class PluginWrapper extends CachePluginBase { + /** @var \Drupal\Component\Plugin\PluginBase */ + protected $plugin; + + public function isConfigurable(): bool { + return $this->plugin->isConfigurable(); + } +} +?> +----- +plugin (not $this), but since $this->plugin +// is typed as PluginBase the rector must still replace the deprecated call. +class PluginWrapper extends CachePluginBase { + /** @var \Drupal\Component\Plugin\PluginBase */ + protected $plugin; + + public function isConfigurable(): bool { + return $this->plugin instanceof \Drupal\Component\Plugin\ConfigurableInterface; + } +} +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/assignment_removal.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/assignment_removal.php.inc new file mode 100644 index 000000000..666cc8568 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/assignment_removal.php.inc @@ -0,0 +1,10 @@ +getRowCacheKeys($row); +$id = $cache_plugin->getRowId($row); + +?> +----- +plugin->getRowCacheKeys($row); + } + + public function getRowId(ResultRow $row) { + return $this->plugin->getRowId($row); + } + + public function getCacheMaxAge(): int { + return $this->plugin->getCacheMaxAge(); + } +} +?> +----- +plugin->getCacheMaxAge(); + } +} +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/no_change_standalone_call.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/no_change_standalone_call.php.inc index 4a109063d..afa1ced3a 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/no_change_standalone_call.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/no_change_standalone_call.php.inc @@ -1,6 +1,7 @@ getRowCacheKeys($row); $id = $cache_plugin->getRowId($row); diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/variable_first.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/variable_first.php.inc new file mode 100644 index 000000000..bdd500678 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/fixture/variable_first.php.inc @@ -0,0 +1,25 @@ +getRowCacheKeys($row); +$cache = [ + '#cache' => [ + 'keys' => $keys, + 'contexts' => ['languages:language_interface', 'theme', 'user.permissions'], + ], +]; + +?> +----- + [ + 'contexts' => ['languages:language_interface', 'theme', 'user.permissions'], + ], +]; + +?> From 7d9d3375fccbc1e04097e07d7ee209907df01351 Mon Sep 17 00:00:00 2001 From: bjorn Date: Wed, 6 May 2026 17:19:03 +0200 Subject: [PATCH 114/256] fix(test-setup): replace wrong test modules for cases 3-5 after contrib search MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ReplaceAlphadecimalToIntNullRector (case 3): search.tresbien.tech confirms 0 contrib modules call alphadecimalToInt() with a literal null or empty string. Pattern genuinely exhausted. Removed comment_mover; added to skipped list with explanation. ReplaceDateTimeRangeConstantsRector (case 4): optional_end_date 8.x-1.4 already migrated away from DateTimeRangeConstantsInterface constants (version drift). For the datetime_type_field_views_data_helper() pattern, scheduler_field is confirmed to call it twice (D11-compatible ^8||^9||^10||^11). Added scheduler_field as second test module alongside optional_end_date. ReplaceSessionManagerDeleteRector (case 5): entity_visibility_preview and session_inspector use their own custom SessionManager or raw DB queries — neither calls Drupal core's SessionManager::delete(). role_expire/src/RoleExpireApiService.php declares @var Drupal\Core\Session\SessionManager (concrete class) and calls $this->sessionManager->delete($uid), satisfying the rector's isObjectType check. D11-compatible (^10.2||^11). Replaced both modules with role_expire. Also added search.tresbien.tech as step 1 in the investigation methodology. --- docs/plans/no-match-investigation.md | 79 +++++++++----------- scripts/setup-rector-test.sh | 107 +++++++++++++-------------- 2 files changed, 87 insertions(+), 99 deletions(-) diff --git a/docs/plans/no-match-investigation.md b/docs/plans/no-match-investigation.md index 86ab08bae..adacb9d59 100644 --- a/docs/plans/no-match-investigation.md +++ b/docs/plans/no-match-investigation.md @@ -6,10 +6,14 @@ didn't match it. ## How to investigate -1. Find the deprecated usage in the module source (grep for the old API/pattern). -2. If the usage exists, run rector in debug mode and trace why the node visitor didn't fire. -3. Common culprits: wrong node type check, type mismatch, fully-qualified vs imported class name, - pattern too narrow (e.g. only matches method calls, not static calls or vice versa). +1. **Search contrib first** at https://search.tresbien.tech — use `-r:core` to exclude core. + Confirm the pattern actually exists in contrib before installing anything locally. + If 0 results: document as "pattern exhausted" and skip the test run entry. +2. Find the deprecated usage in the installed module source (grep for the old API/pattern). +3. If the usage exists but rector doesn't fire, run rector in debug mode and trace why the node visitor didn't fire. +4. Common culprits: wrong node type check, type mismatch, fully-qualified vs imported class name, + pattern too narrow (e.g. only matches method calls, not static calls or vice versa), + version drift (module already patched in installed release — check an older version or find another module). --- @@ -24,8 +28,8 @@ didn't match it. - [x] `FileSystemBasenameToNativeRector` — modules: ejectorseat - **Rector is correct.** Installed ejectorseat has zero `basename()` calls anywhere. - - **Root cause: version drift.** GitLab search matched a commit/branch that still had the call; the installed release has already dropped it. - - → Find the ejectorseat commit/tag that still has the deprecated call, or find another module that uses `FileSystem::basename()`. + - **Root cause: wrong module.** ejectorseat is a session/autologout module — it has never had any file system calls in any version or branch. The original GitLab search hit was a false positive. + - **Fixed:** Replaced with `stage_file_proxy ^3.1` — confirmed caller at `src/DownloadManager.php:76`: `$this->fileSystem->basename($relative_path)`. D11-compatible (`^10.3 || ^11`), present through 3.1.6. Pinned to `^3.1` to guard against a future 4.x that removes the call. - [x] `LoadAllIncludesRector` — modules: config_track, schemadotorg - Pattern **exists** in schemadotorg at `SchemaDotOrgStarterkitConverter.php:430`: `$this->moduleHandler->loadAllIncludes('install')` - config_track only has a definition/override of the method, no calls. @@ -39,8 +43,7 @@ didn't match it. - → Trait case remains unresolved (type inference limitation). - [x] `NodeStorageDeprecatedMethodsRector` — modules: tb_megamenu - Pattern **not present**. tb_megamenu is a menu/block module with zero Node entity handling. Never imports `NodeStorageInterface`. - - **Root cause: wrong module selected.** The GitLab search likely matched something unrelated (e.g. a comment or string literal), or version drift. - - → Find a module that actually calls `revisionIds()`, `userRevisionIds()`, or `countDefaultLanguageRevisions()` on a NodeStorage instance. + - **Fixed:** Updated to `workflow_buttons:^1` — 8.x-1.x calls `$node_storage->revisionIds($variables['node'])` in `workflow_buttons.module` with `@var \Drupal\node\NodeStorage`. D11-compatible (`^9 || ^10 || ^11`). Pinned to `^1` because 2.0.x already migrated. - [x] `PluginBaseIsConfigurableRector` — modules: metatag, search_api - Pattern **exists** in metatag at `metatag_views/src/MetatagViewsCacheWrapper.php:374`: `$this->plugin->isConfigurable()` - **Root cause: rector logic too narrow.** Rector only matches direct `$this->isConfigurable()` where `$this` is `PluginBase`. Delegated calls (`$this->plugin->isConfigurable()`) fail the `$node->var->name !== 'this'` check. @@ -48,52 +51,47 @@ didn't match it. - [x] `RemoveModuleHandlerAddModuleCallsRector` — modules: acquia_contenthub, sdx - Pattern **not present** in acquia_contenthub or sdx. - Pattern **does exist** in `config_track/src/Extension/ModuleHandler.php:178,185,206` — but config_track was not in the test run for this rector (it was assigned to LoadAllIncludesRector instead). - - **Root cause: wrong module assigned.** The search likely found config_track for both rectors; only one was used per rector. config_track should be in the test list for this rector. - - → Add config_track to the test modules for this rector. Rector is correct and would fire (property is `@var ModuleHandlerInterface`). + - **Fixed:** Updated test assignment to `config_track`. Rector is correct and would fire (property is `@var ModuleHandlerInterface`). - [x] `RemoveModuleHandlerDeprecatedMethodsRector` — modules: captcha, jsonld - Pattern **not present** in either module. jsonld has a local `writeCache()` method but it's not on `ModuleHandlerInterface`. - - **Root cause: version drift / wrong modules.** Neither module uses `ModuleHandlerInterface::writeCache()` or `getHookInfo()`. - - → Find modules that actually call `$moduleHandler->writeCache()` or `$moduleHandler->getHookInfo()`. + - **Root cause: pattern exhausted.** Neither module uses `ModuleHandlerInterface::writeCache()` or `getHookInfo()`. Web search of D11 contrib found no caller. Module removed from test run (no replacement found). - [x] `RemoveSetUriCallbackRector` — modules: rabbit_hole_href - Pattern **not present**. rabbit_hole_href is a redirect-behavior plugin with no entity-type definition code. - - Root cause: wrong module assigned. - - → Find a module that calls `$entityType->setUriCallback()` in PHP. + - **Root cause: pattern exhausted.** Web search of D11 contrib found no `setUriCallback()` caller. Module removed from test run (no replacement found). - [x] `RemoveStateCacheSettingRector` — modules: searchstax, sdx - Pattern **not present** (`$settings['state_cache']`) in either module or anywhere in contrib. - - Root cause: wrong modules / pattern not present in installed codebase. - - → No action on rector. Find correct module or confirm pattern is already gone. + - **Root cause: pattern exhausted.** Confirmed gone from all D11 contrib. Module removed from test run. - [x] `RemoveTwigNodeTransTagArgumentRector` — modules: searchstax - Pattern **not present** anywhere in contrib. `TwigNodeTrans` is a core class and the 6-arg constructor was already removed in the installed Drupal version. - - Root cause: version drift in core — the installed Drupal already removed the deprecated call. - - → Rector is correct. Needs a Drupal version where the 6-arg form still exists in contrib code. + - **Root cause: version drift.** Core removed the 6-arg constructor before any D11 contrib module could call it. Module removed from test run. - [x] `ReplaceAlphadecimalToIntNullRector` — modules: comment_mover - Pattern **exists** in comment_mover at `CommentMover.php:73,109`: `Number::alphadecimalToInt($max)` / `Number::alphadecimalToInt($levels[$last])`. - Root cause: **rector too narrow**. Rector only replaces calls where the argument is a literal `null` or `''`. Real-world calls pass runtime variables, which the rector skips. - - → **Rector limitation**: designed only for `alphadecimalToInt(null)` / `alphadecimalToInt('')` edge cases, not general replacement. Clarify intended scope. + - **Confirmed pattern exhausted** (search.tresbien.tech): 0 results across all contrib for `alphadecimalToInt(null)` or `alphadecimalToInt('')`. The literal-null/empty-string edge case never appeared in contrib — only custom code or core tests. + - **Fixed:** Removed `comment_mover` from test run. Added to "pattern exhausted" list. - [x] `ReplaceCommentManagerGetCountNewCommentsRector` — modules: forum, history - Pattern **exists** in forum at `ForumManager.php:247`: `$this->commentManager->getCountNewComments($topic, 'comment_forum', $history)`. - **Root cause: missing type annotation, not traditional assignment.** Tests confirm the rector handles `@var`-annotated traditional constructor assignment correctly (fixture `traditional_constructor.php.inc`). PHPStan reads `@var` docblocks on properties reliably. The forum `$commentManager` property likely has no `@var` or PHP-native type declaration. - → No rector fix needed. Forum's `ForumManager::$commentManager` needs a `@var \Drupal\comment\CommentManagerInterface` annotation (or typed property) for the rector to fire. -- [x] `ReplaceDateTimeRangeConstantsRector` — modules: deprecation_status +- [x] `ReplaceDateTimeRangeConstantsRector` — modules: deprecation_status → optional_end_date - Pattern **not present** (`DateTimeRangeConstantsInterface::BOTH` etc.) in deprecation_status or any installed module. - - Root cause: wrong module / pattern not present. - - → Find a module that actually uses `DateTimeRangeConstantsInterface` constants. + - Previous fix (optional_end_date) hit version drift: the search index confirmed `DateTimeRangeConstantsInterface::BOTH` at `OptionalEndDateDateTimeRangeTrait.php:29`, but installed 8.x-1.4 has already migrated to the new enum. Pattern still present in the search index (not all branches updated). + - For `datetime_type_field_views_data_helper()`: confirmed in `scheduler_field` (calls it twice for field columns, D11-compatible `^8||^9||^10||^11`), plus quiz, civicrm_entity, computed_token_field, optional_end_month_year_range. + - **Fixed:** Added `scheduler_field` as second test module. Retained `optional_end_date` in case a future install picks up an unpatched version. - [x] `ReplaceEditorLoadRector` — modules: acquia_contenthub, ckeditor5_plugin_pack - Pattern **not present** (`editor_load()` function call) in either module or anywhere in contrib. - - Root cause: wrong modules / pattern not present. - - → Find a module that calls `editor_load($format_id)`. + - **Root cause: pattern exhausted.** Not called in any D11 contrib module found. Module removed from test run. - [x] `ReplaceFieldgroupToFieldsetRector` — modules: field_group_vertical_tabs, ui_patterns_settings - Pattern **not present** in assigned modules. - Pattern **found** in `webform` at `WebformEntityReferenceWidgetTrait.php:150`: `'#type' => 'fieldgroup'`. - - Root cause: wrong modules assigned. webform was not in the test run. - - → Add webform to test modules for this rector. Rector is correct and would fire. + - **Fixed:** Updated test assignment to `webform`. Rector is correct and would fire. - [x] `ReplaceFileGetContentHeadersRector` — modules: commerce_invoice, tmgmt - Pattern **exists** in both: @@ -105,13 +103,11 @@ didn't match it. - [x] `ReplaceModuleHandlerGetNameRector` — modules: drd, reassign_user_content - Pattern **not present** in drd or reassign_user_content. - Pattern found in `group` module but already migrated (uses `ModuleExtensionList`, not `ModuleHandlerInterface`). - - Root cause: wrong modules assigned / already-migrated code. - - → No rector fix needed. Find a module that still uses `ModuleHandlerInterface::getName()`. + - **Fixed:** Updated test assignment to `mailsystem` — confirmed caller at `src/Form/AdminForm.php:206,211` (`$this->moduleHandler->getName($module)`), issue #3566556 active as of Jan 2026. - [x] `ReplaceNodeAccessViewAllNodesRector` — modules: view_usernames_node_author - Pattern **not present** as executable code (only a `@see` docblock reference in a test file). - - Root cause: wrong module / pattern not present. - - → Find a module that actually calls `node_access_view_all_nodes()` or `drupal_static_reset('node_access_view_all_nodes')`. + - **Root cause: pattern not yet present in contrib.** `node_access_view_all_nodes()` was only deprecated in D11.3.0 (late 2025); no D11 contrib caller found. Module removed from test run. - [x] `ReplaceNodeModuleProceduralFunctionsRector` — modules: reassign_user_content, addanother - Pattern **exists**: @@ -122,28 +118,24 @@ didn't match it. - [x] `ReplaceRecipeRunnerInstallModuleRector` — modules: schemadotorg - Pattern **not present** (schemadotorg uses `RecipeRunner::processRecipe()`, not the deprecated `installModule()`). - - Root cause: wrong module / already using newer API. - - → Find a module that calls `RecipeRunner::installModule()`. + - **Updated:** Replaced with `recipe_installer_kit` (primary contrib recipe-wrapping module, deprecated D11.4.0). Needs verification in live test run. -- [x] `ReplaceSessionManagerDeleteRector` — modules: entity_visibility_preview, session_inspector - - Pattern **not present** with the required type. All modules use `SessionManagerInterface`; rector requires the concrete `SessionManager` class. - - Root cause: **rector too narrow**. Documented as a known limitation in the rector's own `no_change_interface.php.inc` fixture. The deprecated `delete()` method only exists on the concrete class, and real code uses the interface. - - → Rector is working as designed but will rarely fire in practice. Consider whether the type check should be broadened. +- [x] `ReplaceSessionManagerDeleteRector` — modules: entity_visibility_preview, session_inspector → role_expire + - Pattern **not present** with the required type in either original module. entity_visibility_preview has its own unrelated `SessionManager` service; session_inspector uses a raw DB delete. Both use the interface, not the concrete class. + - **Found via search.tresbien.tech**: `role_expire/src/RoleExpireApiService.php` declares `@var Drupal\Core\Session\SessionManager` on its `$sessionManager` property (concrete class) and calls `$this->sessionManager->delete($uid)`. D11-compatible (`^10.2||^11`). + - **Fixed:** Replaced both modules with `role_expire`. The `@var` annotation naming the concrete class satisfies the rector's `isObjectType(SessionManager)` check. - [x] `ReplaceSessionWritesWithRequestSessionRector` — modules: drd, entity_visibility_preview - Pattern **not present** (`$_SESSION[...] = ...` writes) in either module. - - Root cause: wrong modules / pattern not present. - - → Find a module that still writes directly to `$_SESSION`. + - **Root cause: pattern exhausted.** Direct `$_SESSION` writes gone from all D11-compatible contrib found (openid_connect fixed in 2021). Module removed from test run. - [x] `ReplaceSystemPerformanceGzipKeyRector` — modules: drd - Pattern **not present** (`system.performance` config keys `css.gzip`/`js.gzip`). drd_agent uses `css.preprocess`/`js.preprocess` (different, non-deprecated keys). - - Root cause: wrong module / pattern not present. - - → Find a module that reads/writes the deprecated `css.gzip` or `js.gzip` config keys. + - **Root cause: no D11-compatible module.** advagg (5.x/6.0.0-alpha1) confirmed has the pattern at `src/Form/SettingsForm.php`, but declares `core_version_requirement: ^9.3 || ^10` — won't install against D11. Module removed from test run. - [x] `ReplaceUserSessionNamePropertyRector` — modules: acquia_contenthub, session_inspector - Pattern **not present** (`$userSession->name` property access) in either module. - - Root cause: wrong modules / pattern not present. - - → Find a module that accesses `->name` on a `UserSession` object. + - **Root cause: pattern exhausted.** `->name` property access on `UserSession` objects gone from all D11-compatible contrib found (broke in Drupal 8). Module removed from test run. - [x] `ViewsPluginHandlerManagerRector` — modules: searchstax, search_api, metatag - Pattern **exists** in search_api at `SearchApiEntityField.php:51-52`: `Views::handlerManager('field')->getHandler(...)`. @@ -160,8 +152,7 @@ didn't match it. - [x] `ReplaceRequestTimeConstantRector` — modules: google_analytics_counter, automatic_updates - Pattern **not present** (no bare `REQUEST_TIME` constant usage). Modules already use `$request->server->get('REQUEST_TIME')`. - - Root cause: wrong modules / already migrated. - - → No action needed. Find a module still using the bare `REQUEST_TIME` constant if test coverage is desired. + - **Root cause: pattern exhausted.** Already migrated in all D11-compatible modules found. Module removed from test run. - [x] `SystemTimeZonesRector` — modules: intl_date, smart_date - Pattern **exists** in both: diff --git a/scripts/setup-rector-test.sh b/scripts/setup-rector-test.sh index 8bb68b827..1cca30b8b 100755 --- a/scripts/setup-rector-test.sh +++ b/scripts/setup-rector-test.sh @@ -89,19 +89,14 @@ echo "==> Requiring contrib modules…" # Batch 1 — multi-rector modules (high-value) ddev composer require --no-update \ - "drupal/drd:*" \ "drupal/acquia_contenthub:*" \ "drupal/searchstax:*" \ "drupal/ai_agents:*" \ - "drupal/ckeditor5_plugin_pack:*" \ - "drupal/bootstrap5:*" \ "drupal/commerce_invoice:*" \ "drupal/custom_field:*" \ - "drupal/entity_visibility_preview:*" \ + "drupal/role_expire:*" \ "drupal/views_dependent_filters:*" \ "drupal/group:*" \ - "drupal/session_inspector:*" \ - "drupal/sdx:*" \ "drupal/search_api:*" \ "drupal/schemadotorg:*" \ "drupal/smart_migrate_cli:*" \ @@ -113,7 +108,6 @@ ddev composer require --no-update \ ddev composer require --no-update \ "drupal/tara:*" \ "drupal/vani:*" \ - "drupal/view_usernames_node_author:*" \ "drupal/association:*" \ "drupal/tome:*" \ "drupal/cmrf_form_processor:*" \ @@ -126,29 +120,25 @@ ddev composer require --no-update \ "drupal/vcp4dates:*" \ "drupal/gdpr:*" \ "drupal/ai_eca:*" \ - "drupal/deprecation_status:*" \ "drupal/gnode_request:*" \ - "drupal/google_analytics_counter:*" \ "drupal/migmag:*" \ - "drupal/field_group_vertical_tabs:*" \ - "drupal/ui_patterns_settings:*" \ - "drupal/tb_megamenu:*" \ - "drupal/automatic_updates:*" \ "drupal/sparql_entity_storage:*" \ "drupal/views_advanced_cache:*" \ - "drupal/captcha:*" \ - "drupal/ejectorseat:*" \ "drupal/smart_sql_idmap:*" \ - "drupal/jsonld:*" \ "drupal/forum:*" \ "drupal/history:*" \ - "drupal/comment_mover:*" \ - "drupal/rabbit_hole_href:*" \ "drupal/addanother:*" \ "drupal/quicktabs:*" \ "drupal/entity_usage:*" \ "drupal/media_auto_publication:*" \ - "drupal/migrate_tools:*" + "drupal/migrate_tools:*" \ + "drupal/stage_file_proxy:^3.1" \ + "drupal/workflow_buttons:^1" \ + "drupal/optional_end_date:*" \ + "drupal/scheduler_field:*" \ + "drupal/mailsystem:*" \ + "drupal/webform:*" \ + "drupal/recipe_installer_kit:*" echo "" echo "==> Running composer update to resolve all requirements…" @@ -263,7 +253,7 @@ run_test() { printf " Modules: %s\n" "${paths[*]}" | tee -a "$LOG" echo "" | tee -a "$LOG" - timeout 30 vendor/bin/rector process "${paths[@]}" --only="$fqcn" --dry-run --no-cache 2>&1 | tee -a "$LOG" || true + timeout 30 vendor/bin/rector process "${paths[@]}" --only="$fqcn" --dry-run --clear-cache 2>&1 | tee -a "$LOG" || true echo "" | tee -a "$LOG" git diff "${paths[@]}" | tee -a "$LOG" || true @@ -280,7 +270,7 @@ run_test ErrorCurrentErrorHandlerRector # No contrib usage: Error::currentErrorHandler() deprecated D11.3.0; devel 5.x already cleaned up, no other hits run_test FileSystemBasenameToNativeRector \ - ejectorseat + stage_file_proxy run_test LoadAllIncludesRector \ config_track schemadotorg @@ -289,7 +279,7 @@ run_test MigrateSqlGetMigrationPluginManagerRector \ feeds_migrate migmag smart_sql_idmap run_test NodeStorageDeprecatedMethodsRector \ - tb_megamenu + workflow_buttons run_test PluginBaseIsConfigurableRector \ metatag search_api @@ -307,25 +297,25 @@ run_test RemoveLinkWidgetValidateTitleElementRector # No contrib usage: LinkWidget::validateTitleElement() deprecated D11.4.0, no contrib calls found run_test RemoveModuleHandlerAddModuleCallsRector \ - acquia_contenthub sdx + config_track -run_test RemoveModuleHandlerDeprecatedMethodsRector \ - captcha jsonld +run_test RemoveModuleHandlerDeprecatedMethodsRector + # No contrib usage: writeCache()/getHookInfo() on ModuleHandlerInterface not called in any D11 contrib module found run_test RemoveRootFromConvertDbUrlRector \ smart_migrate_cli sparql_entity_storage -run_test RemoveSetUriCallbackRector \ - rabbit_hole_href +run_test RemoveSetUriCallbackRector + # No contrib usage: $entityType->setUriCallback() not called in any D11 contrib module found -run_test RemoveStateCacheSettingRector \ - searchstax sdx +run_test RemoveStateCacheSettingRector + # No contrib usage: $settings['state_cache'] pattern not found in any D11 contrib module; likely already gone from codebase run_test RemoveTrustDataCallRector \ views_dependent_filters group -run_test RemoveTwigNodeTransTagArgumentRector \ - searchstax +run_test RemoveTwigNodeTransTagArgumentRector + # No contrib usage: TwigNodeTrans 6-arg constructor removed from core before D11 contrib caught up (version drift) run_test RemoveUpdaterPostInstallMethodsRector \ group gnode_request @@ -336,8 +326,10 @@ run_test RemoveViewsRowCacheKeysRector \ run_test RenameStopProceduralHookScanRector # No contrib usage: StopProceduralHookScan attribute deprecated D11.2.0, niche — no contrib usage found -run_test ReplaceAlphadecimalToIntNullRector \ - comment_mover indieweb +run_test ReplaceAlphadecimalToIntNullRector + # No contrib usage: alphadecimalToInt(null/'') — both values always returned 0, + # so this was only ever passed as a literal in custom code or tests. No D11 contrib + # module calls the function with a literal null or empty string. run_test ReplaceCommentManagerGetCountNewCommentsRector \ forum history @@ -346,10 +338,10 @@ run_test ReplaceCommentUriRector # No contrib usage: comment_uri() deprecated D11.3.0; Social 13.x already cleaned up (issue #3432522), no other D11 hits run_test ReplaceDateTimeRangeConstantsRector \ - deprecation_status + optional_end_date scheduler_field -run_test ReplaceEditorLoadRector \ - acquia_contenthub ckeditor5_plugin_pack +run_test ReplaceEditorLoadRector + # No contrib usage: editor_load() deprecated D11; not called in any D11 contrib module found run_test ReplaceEntityOriginalPropertyRector \ entity_usage media_auto_publication @@ -360,7 +352,7 @@ run_test ReplaceEntityReferenceRecursiveLimitRector # custom_field/external_entity define the constant, they don't reference core's. run_test ReplaceFieldgroupToFieldsetRector \ - field_group_vertical_tabs ui_patterns_settings + webform run_test ReplaceFileGetContentHeadersRector \ commerce_invoice tmgmt @@ -369,10 +361,10 @@ run_test ReplaceLocaleConfigBatchFunctionsRector # No contrib usage: locale_config_batch_* deprecated D11.1.0; all GitLab hits were bundled core copies, not contrib code run_test ReplaceModuleHandlerGetNameRector \ - drd reassign_user_content + mailsystem -run_test ReplaceNodeAccessViewAllNodesRector \ - view_usernames_node_author +run_test ReplaceNodeAccessViewAllNodesRector + # No contrib usage: node_access_view_all_nodes() deprecated D11.3.0; no D11 contrib caller found (newly deprecated) run_test ReplaceNodeAddBodyFieldRector \ tome ai_eca @@ -387,22 +379,22 @@ run_test ReplacePdoFetchConstantsRector \ acquia_contenthub gdpr run_test ReplaceRecipeRunnerInstallModuleRector \ - schemadotorg + recipe_installer_kit run_test ReplaceSessionManagerDeleteRector \ - entity_visibility_preview session_inspector + role_expire -run_test ReplaceSessionWritesWithRequestSessionRector \ - drd entity_visibility_preview +run_test ReplaceSessionWritesWithRequestSessionRector + # No contrib usage: direct $_SESSION writes not present in any D11-compatible contrib module found -run_test ReplaceSystemPerformanceGzipKeyRector \ - drd bootstrap5 +run_test ReplaceSystemPerformanceGzipKeyRector + # No contrib usage: advagg (only known caller) declares "core_version_requirement: ^9.3 || ^10" — not D11-compatible run_test ReplaceThemeGetSettingRector \ tara vani -run_test ReplaceUserSessionNamePropertyRector \ - acquia_contenthub session_inspector +run_test ReplaceUserSessionNamePropertyRector + # No contrib usage: $userSession->name property access not present in any D11 contrib module found run_test ReplaceViewsProceduralFunctionsRector \ custom_field quicktabs @@ -421,13 +413,13 @@ run_test ViewsPluginHandlerManagerRector \ # ── Drupal 10 rectors ────────────────────────────────────────────────────── run_test ReplaceModuleHandlerGetNameRector \ - drd reassign_user_content + mailsystem run_test ReplaceRebuildThemeDataRector \ site_guardian -run_test ReplaceRequestTimeConstantRector \ - google_analytics_counter automatic_updates +run_test ReplaceRequestTimeConstantRector + # No contrib usage: REQUEST_TIME constant usage already migrated in all D11-compatible modules found run_test SystemTimeZonesRector \ intl_date smart_date @@ -461,8 +453,13 @@ echo "" echo " Site: run 'ddev launch' | Admin: admin / admin" echo "" echo " Coverage notes (see docs/contrib-modules-d11.md):" -echo " * 8 rectors skipped — pattern exhausted or no D11 contrib usage found" +echo " * 18 rectors skipped — pattern exhausted or no D11 contrib usage found" echo " (ErrorCurrentErrorHandler, RemoveAutomatedCronSubmitHandler," -echo " RemoveLinkWidgetValidateTitleElement, RenameStopProceduralHookScan," -echo " ReplaceCommentUri, ReplaceEntityReferenceRecursiveLimit," -echo " ReplaceLocaleConfigBatchFunctions, StatementPrefetchIteratorFetchColumn)" +echo " RemoveLinkWidgetValidateTitleElement, RemoveModuleHandlerDeprecatedMethods," +echo " RemoveSetUriCallback, RemoveStateCacheSetting," +echo " RemoveTwigNodeTransTagArgument, RenameStopProceduralHookScan," +echo " ReplaceAlphadecimalToIntNull, ReplaceCommentUri, ReplaceEditorLoad," +echo " ReplaceEntityReferenceRecursiveLimit, ReplaceLocaleConfigBatchFunctions," +echo " ReplaceNodeAccessViewAllNodes, ReplaceRequestTimeConstant," +echo " ReplaceSessionWritesWithRequestSession, ReplaceSystemPerformanceGzipKey," +echo " ReplaceUserSessionNameProperty, StatementPrefetchIteratorFetchColumn)" From 6115d92157be214565ce8ae9988443da14d97d3b Mon Sep 17 00:00:00 2001 From: bjorn Date: Wed, 6 May 2026 18:34:25 +0200 Subject: [PATCH 115/256] docs(investigation): ReplaceSessionManagerDeleteRector blocked by Drupal 11.4.0 version gate role_expire is the correct test module (RoleExpireApiService.php:168 calls $this->sessionManager->delete($uid) with the right concrete type), but AbstractDrupalCoreRector gates on Drupal::VERSION >= 11.4.0 and 11.4.0 has not been released yet (latest stable: 11.3.9). Disable the module in the test script with an explanatory comment. Re-enable once the test site is upgraded to Drupal 11.4.0+. Also add mglaman/phpstan-drupal to composer.json require. --- composer.json | 3 ++- docs/plans/no-match-investigation.md | 4 +++- scripts/setup-rector-test.sh | 9 +++++++-- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/composer.json b/composer.json index b149881f6..9e6ecee11 100644 --- a/composer.json +++ b/composer.json @@ -10,6 +10,7 @@ ], "require": { "rector/rector": "^2", + "mglaman/phpstan-drupal": "^2.0", "webflo/drupal-finder": "^1.2" }, "license": "MIT", @@ -92,5 +93,5 @@ "phpstan": "vendor/bin/phpstan analyse --memory-limit=2G", "check-style": "vendor/bin/php-cs-fixer check", "fix-style": "vendor/bin/php-cs-fixer fix" - } + } } diff --git a/docs/plans/no-match-investigation.md b/docs/plans/no-match-investigation.md index adacb9d59..48d8a6d8c 100644 --- a/docs/plans/no-match-investigation.md +++ b/docs/plans/no-match-investigation.md @@ -123,7 +123,9 @@ didn't match it. - [x] `ReplaceSessionManagerDeleteRector` — modules: entity_visibility_preview, session_inspector → role_expire - Pattern **not present** with the required type in either original module. entity_visibility_preview has its own unrelated `SessionManager` service; session_inspector uses a raw DB delete. Both use the interface, not the concrete class. - **Found via search.tresbien.tech**: `role_expire/src/RoleExpireApiService.php` declares `@var Drupal\Core\Session\SessionManager` on its `$sessionManager` property (concrete class) and calls `$this->sessionManager->delete($uid)`. D11-compatible (`^10.2||^11`). - - **Fixed:** Replaced both modules with `role_expire`. The `@var` annotation naming the concrete class satisfies the rector's `isObjectType(SessionManager)` check. + - **Updated:** Replaced both modules with `role_expire`. The `@var` annotation naming the concrete class satisfies the rector's `isObjectType(SessionManager)` check. + - **Still NO_CHANGES** — blocked by version gate. `AbstractDrupalCoreRector::rectorShouldApplyToDrupalVersion()` compares `Drupal::VERSION` against the rector's `DrupalIntroducedVersionConfiguration('11.4.0')`. Test site runs Drupal 11.3.9. `SessionManager::delete()` was deprecated in Drupal 11.4.0 which has not been released yet (latest stable: 11.3.x). + - **Status:** `role_expire` is the correct test module. Re-enable in the test script once the test site is upgraded to Drupal 11.4.0+. - [x] `ReplaceSessionWritesWithRequestSessionRector` — modules: drd, entity_visibility_preview - Pattern **not present** (`$_SESSION[...] = ...` writes) in either module. diff --git a/scripts/setup-rector-test.sh b/scripts/setup-rector-test.sh index 1cca30b8b..257271604 100755 --- a/scripts/setup-rector-test.sh +++ b/scripts/setup-rector-test.sh @@ -381,8 +381,11 @@ run_test ReplacePdoFetchConstantsRector \ run_test ReplaceRecipeRunnerInstallModuleRector \ recipe_installer_kit -run_test ReplaceSessionManagerDeleteRector \ - role_expire +run_test ReplaceSessionManagerDeleteRector + # role_expire confirmed caller at RoleExpireApiService.php:168 ($this->sessionManager->delete($uid)) + # but AbstractDrupalCoreRector version gate requires Drupal >= 11.4.0 — SessionManager::delete() + # was deprecated in 11.4.0 which is not yet released (latest stable: 11.3.x). + # Re-enable with "role_expire" once the test site runs Drupal 11.4.0+. run_test ReplaceSessionWritesWithRequestSessionRector # No contrib usage: direct $_SESSION writes not present in any D11-compatible contrib module found @@ -463,3 +466,5 @@ echo " ReplaceEntityReferenceRecursiveLimit, ReplaceLocaleConfigBatchFunctio echo " ReplaceNodeAccessViewAllNodes, ReplaceRequestTimeConstant," echo " ReplaceSessionWritesWithRequestSession, ReplaceSystemPerformanceGzipKey," echo " ReplaceUserSessionNameProperty, StatementPrefetchIteratorFetchColumn)" +echo " * 1 rector skipped — version gate requires Drupal >= 11.4.0 (not yet released):" +echo " ReplaceSessionManagerDeleteRector (role_expire is valid test module; re-enable after upgrade)" From 895d1f772f329898449554e6b8291ca0d0f6a7ae Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 7 May 2026 00:57:15 +0200 Subject: [PATCH 116/256] feat: wire DeprecationHelper BC wrapping into 14 Group A rectors Migrates 14 Drupal 11 rectors from AbstractRector to AbstractDrupalCoreRector by renaming refactor() to refactorWithConfiguration(). This lets the parent automatically wrap replacement expressions in DeprecationHelper::backwardsCompatibleCall() so code emitted by rector works on both the old and new Drupal API during the transition period. Also adds DrupalIntroducedVersionConfiguration to the rector set configs for all 14 rectors (drupal-11.2/11.3/11.4-deprecations.php), and fixes two node-mutation bugs in StatementPrefetchIteratorFetchColumnRector and ReplaceRecipeRunnerInstallModuleRector where in-place node mutation would corrupt the BC "old callable" snapshot. Fixes PHPStan errors in RemoveViewsRowCacheKeysRector (pre-existing): adds @param/@return array to beforeTraversal() and @return NodeVisitor::REMOVE_NODE|null to the two private helper methods. --- config/drupal-11/drupal-11.2-deprecations.php | 13 +++++-- config/drupal-11/drupal-11.3-deprecations.php | 20 +++++++--- config/drupal-11/drupal-11.4-deprecations.php | 16 ++++++-- .../ErrorCurrentErrorHandlerRector.php | 30 ++++++++++++--- .../FileSystemBasenameToNativeRector.php | 31 ++++++++++++---- .../Deprecation/RemoveTrustDataCallRector.php | 30 ++++++++++++--- .../RemoveViewsRowCacheKeysRector.php | 10 ++++- .../Deprecation/ReplaceCommentUriRector.php | 30 ++++++++++++--- .../Deprecation/ReplaceEditorLoadRector.php | 30 ++++++++++++--- .../ReplaceFileGetContentHeadersRector.php | 30 ++++++++++++--- .../ReplaceNodeAddBodyFieldRector.php | 30 ++++++++++++--- ...ReplaceRecipeRunnerInstallModuleRector.php | 37 ++++++++++++++----- .../ReplaceUserSessionNamePropertyRector.php | 30 ++++++++++++--- ...ementPrefetchIteratorFetchColumnRector.php | 37 +++++++++++++++---- .../UseEntityTypeHasIntegerIdRector.php | 30 ++++++++++++--- .../ViewsPluginHandlerManagerRector.php | 32 +++++++++++++--- .../config/configured_rule.php | 5 ++- .../fixture/as_argument.php.inc | 4 +- .../fixture/basic.php.inc | 2 +- .../config/configured_rule.php | 5 ++- .../fixture/basic.php.inc | 2 +- .../fixture/concrete_class.php.inc | 2 +- .../fixture/no_suffix.php.inc | 2 +- .../config/configured_rule.php | 5 ++- .../fixture/assigned_result.php.inc | 2 +- .../fixture/basic.php.inc | 2 +- .../fixture/standalone_statement.php.inc | 2 +- .../config/configured_rule.php | 6 ++- .../fixture/as_argument.php.inc | 2 +- .../fixture/basic.php.inc | 2 +- .../fixture/complex_expression.php.inc | 2 +- .../fixture/inline_usage.php.inc | 2 +- .../config/configured_rule.php | 5 ++- .../fixture/as_argument.php.inc | 2 +- .../fixture/basic.php.inc | 2 +- .../fixture/inline_usage.php.inc | 2 +- .../config/configured_rule.php | 5 ++- .../fixture/as_argument.php.inc | 2 +- .../fixture/basic.php.inc | 2 +- .../fixture/inline_in_array.php.inc | 2 +- .../fixture/method_call_as_arg.php.inc | 2 +- .../config/configured_rule.php | 5 ++- .../fixture/basic.php.inc | 4 +- .../fixture/fqcn_prefix.php.inc | 4 +- .../fixture/method_call_arg.php.inc | 4 +- .../config/configured_rule.php | 5 ++- .../fixture/basic.php.inc | 2 +- .../fixture/fqcn.php.inc | 2 +- .../fixture/self_static.php.inc | 4 +- .../config/configured_rule.php | 6 ++- .../fixture/basic.php.inc | 2 +- .../fixture/inline_usage.php.inc | 6 +-- .../config/configured_rule.php | 5 ++- .../fixture/basic.php.inc | 2 +- .../fixture/no_arg.php.inc | 2 +- .../property_not_client_statement.php.inc | 4 +- .../config/configured_rule.php | 6 ++- .../fixture/basic.php.inc | 2 +- .../entity_type_supports_comments.php.inc | 2 +- .../fixture/has_integer_id_helper.php.inc | 2 +- .../fixture/string_reversed.php.inc | 2 +- .../config/configured_rule.php | 5 ++- .../fixture/basic.php.inc | 6 +-- .../fixture/chained_call.php.inc | 4 +- .../fixture/fqcn_prefix.php.inc | 4 +- .../fixture/handler_manager_dynamic.php.inc | 2 +- 66 files changed, 445 insertions(+), 154 deletions(-) diff --git a/config/drupal-11/drupal-11.2-deprecations.php b/config/drupal-11/drupal-11.2-deprecations.php index 3bb854f55..759195a74 100644 --- a/config/drupal-11/drupal-11.2-deprecations.php +++ b/config/drupal-11/drupal-11.2-deprecations.php @@ -23,6 +23,7 @@ use DrupalRector\Rector\Deprecation\MethodToMethodWithCheckRector; use DrupalRector\Rector\ValueObject\ClassConstantToClassConstantConfiguration; use DrupalRector\Rector\ValueObject\ConstantToClassConfiguration; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use DrupalRector\Rector\ValueObject\FunctionCallRemovalConfiguration; use DrupalRector\Rector\ValueObject\FunctionToServiceConfiguration; use DrupalRector\Rector\ValueObject\FunctionToStaticConfiguration; @@ -34,7 +35,9 @@ // https://www.drupal.org/node/3490200 // StatementPrefetchIterator::fetchColumn() deprecated in drupal:11.2.0, removed in drupal:12.0.0. // Replaced by fetchField(). - $rectorConfig->rule(StatementPrefetchIteratorFetchColumnRector::class); + $rectorConfig->ruleWithConfiguration(StatementPrefetchIteratorFetchColumnRector::class, [ + new DrupalIntroducedVersionConfiguration('11.2.0'), + ]); // https://www.drupal.org/node/3498947 // CacheBackendInterface::invalidateAll() deprecated in drupal:11.2.0, removed in drupal:12.0.0. @@ -144,7 +147,9 @@ // https://www.drupal.org/node/3494126 // file_get_content_headers($file) deprecated in drupal:11.2.0, removed in drupal:12.0.0. // Replaced by $file->getDownloadHeaders(). - $rectorConfig->rule(ReplaceFileGetContentHeadersRector::class); + $rectorConfig->ruleWithConfiguration(ReplaceFileGetContentHeadersRector::class, [ + new DrupalIntroducedVersionConfiguration('11.2.0'), + ]); // https://www.drupal.org/node/3518527 // $_SESSION['key'] = $value deprecated in drupal:11.2.0. @@ -154,7 +159,9 @@ // https://www.drupal.org/node/3447794 // editor_load($format_id) deprecated in drupal:11.2.0, removed in drupal:12.0.0. // Replaced by entityTypeManager()->getStorage('editor')->load($format_id). - $rectorConfig->rule(ReplaceEditorLoadRector::class); + $rectorConfig->ruleWithConfiguration(ReplaceEditorLoadRector::class, [ + new DrupalIntroducedVersionConfiguration('11.2.0'), + ]); // https://www.drupal.org/node/3571065 // $entity->original magic property deprecated in drupal:11.2.0, removed in drupal:12.0.0. diff --git a/config/drupal-11/drupal-11.3-deprecations.php b/config/drupal-11/drupal-11.3-deprecations.php index 5775d754d..10260019c 100644 --- a/config/drupal-11/drupal-11.3-deprecations.php +++ b/config/drupal-11/drupal-11.3-deprecations.php @@ -65,7 +65,9 @@ // https://www.drupal.org/node/2010202 // comment_uri($comment) deprecated in drupal:11.3.0, removed in drupal:12.0.0. // Replaced by $comment->permalink(). - $rectorConfig->rule(ReplaceCommentUriRector::class); + $rectorConfig->ruleWithConfiguration(ReplaceCommentUriRector::class, [ + new DrupalIntroducedVersionConfiguration('11.3.0'), + ]); // https://www.drupal.org/node/3038908 // node_access_view_all_nodes() deprecated in drupal:11.3.0, removed in drupal:12.0.0. @@ -86,12 +88,16 @@ // https://www.drupal.org/node/3489266 // node_add_body_field() deprecated in drupal:11.3.0, removed in drupal:12.0.0. // Replaced by $this->createBodyField() from BodyFieldCreationTrait. - $rectorConfig->rule(ReplaceNodeAddBodyFieldRector::class); + $rectorConfig->ruleWithConfiguration(ReplaceNodeAddBodyFieldRector::class, [ + new DrupalIntroducedVersionConfiguration('11.3.0'), + ]); // https://www.drupal.org/node/3513856 // UserSession::$name property read deprecated in drupal:11.3.0, removed in drupal:12.0.0. // Replaced by getAccountName(). - $rectorConfig->rule(ReplaceUserSessionNamePropertyRector::class); + $rectorConfig->ruleWithConfiguration(ReplaceUserSessionNamePropertyRector::class, [ + new DrupalIntroducedVersionConfiguration('11.3.0'), + ]); // https://www.drupal.org/node/3534092 // file_system_settings_submit() deprecated in drupal:11.3.0, removed in drupal:13.0.0. @@ -119,12 +125,16 @@ // https://www.drupal.org/node/3530461 // FileSystemInterface::basename() deprecated in drupal:11.3.0, removed in drupal:13.0.0. // Replaced by PHP native basename(). - $rectorConfig->rule(FileSystemBasenameToNativeRector::class); + $rectorConfig->ruleWithConfiguration(FileSystemBasenameToNativeRector::class, [ + new DrupalIntroducedVersionConfiguration('11.3.0'), + ]); // https://www.drupal.org/node/3526515 // Error::currentErrorHandler() deprecated in drupal:11.3.0, removed in drupal:13.0.0. // Replaced by PHP built-in get_error_handler(). - $rectorConfig->rule(ErrorCurrentErrorHandlerRector::class); + $rectorConfig->ruleWithConfiguration(ErrorCurrentErrorHandlerRector::class, [ + new DrupalIntroducedVersionConfiguration('11.3.0'), + ]); // https://www.drupal.org/node/3573896 // theme_get_setting() and _system_default_theme_features() deprecated in drupal:11.3.0, removed in drupal:13.0.0. diff --git a/config/drupal-11/drupal-11.4-deprecations.php b/config/drupal-11/drupal-11.4-deprecations.php index e2ac3fb7d..c87d52670 100644 --- a/config/drupal-11/drupal-11.4-deprecations.php +++ b/config/drupal-11/drupal-11.4-deprecations.php @@ -33,7 +33,9 @@ // https://www.drupal.org/node/3566424 // Views::pluginManager() and Views::handlerManager() deprecated in drupal:11.4.0, removed in drupal:13.0.0. // Replaced by \Drupal::service('plugin.manager.views.*') or views.plugin_managers service. - $rectorConfig->rule(ViewsPluginHandlerManagerRector::class); + $rectorConfig->ruleWithConfiguration(ViewsPluginHandlerManagerRector::class, [ + new DrupalIntroducedVersionConfiguration('11.4.0'), + ]); // https://www.drupal.org/node/3577376 // SessionManager::delete() deprecated in drupal:11.4.0, removed in drupal:12.0.0. @@ -188,7 +190,9 @@ // https://www.drupal.org/node/3498026 // RecipeRunner::installModule() deprecated in drupal:11.4.0. Use installModules() with an array. - $rectorConfig->rule(ReplaceRecipeRunnerInstallModuleRector::class); + $rectorConfig->ruleWithConfiguration(ReplaceRecipeRunnerInstallModuleRector::class, [ + new DrupalIntroducedVersionConfiguration('11.4.0'), + ]); // https://www.drupal.org/node/3184242 // system.performance css.gzip and js.gzip config keys deprecated in drupal:11.4.0, removed in drupal:12.0.0. @@ -208,7 +212,9 @@ // https://www.drupal.org/node/3347842 // trustData() deprecated in drupal:11.4.0, removed in drupal:13.0.0. Remove from fluent chains. // Config::save($has_trusted_data) boolean arg deprecated in drupal:11.4.0, removed in drupal:13.0.0. - $rectorConfig->rule(RemoveTrustDataCallRector::class); + $rectorConfig->ruleWithConfiguration(RemoveTrustDataCallRector::class, [ + new DrupalIntroducedVersionConfiguration('11.4.0'), + ]); $rectorConfig->rule(RemoveConfigSaveTrustedDataArgRector::class); // https://www.drupal.org/node/3093118 @@ -231,7 +237,9 @@ // getEntityTypeIdKeyType() === 'integer', entityTypeSupportsComments(), and hasIntegerId($entityType) // deprecated in drupal:11.4.0, removed in drupal:13.0.0. // Replaced by EntityTypeInterface::hasIntegerId() called on the entity type object. - $rectorConfig->rule(UseEntityTypeHasIntegerIdRector::class); + $rectorConfig->ruleWithConfiguration(UseEntityTypeHasIntegerIdRector::class, [ + new DrupalIntroducedVersionConfiguration('11.4.0'), + ]); // https://www.drupal.org/node/3568144 // editor_filter_xss() deprecated in drupal:11.4.0, removed in drupal:13.0.0. diff --git a/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector.php b/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector.php index 825d06a4d..a593e2cf6 100644 --- a/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector.php +++ b/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector.php @@ -4,13 +4,15 @@ namespace DrupalRector\Drupal11\Rector\Deprecation; +use DrupalRector\Contract\VersionedConfigurationInterface; +use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use PhpParser\Node; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Name; use PHPStan\Type\ObjectType; -use Rector\Rector\AbstractRector; -use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; +use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -20,16 +22,32 @@ * * @see https://www.drupal.org/node/3526515 */ -final class ErrorCurrentErrorHandlerRector extends AbstractRector +final class ErrorCurrentErrorHandlerRector extends AbstractDrupalCoreRector { + /** + * @var array|DrupalIntroducedVersionConfiguration[] + */ + protected array $configuration; + + public function configure(array $configuration): void + { + foreach ($configuration as $value) { + if (!$value instanceof DrupalIntroducedVersionConfiguration) { + throw new \InvalidArgumentException(sprintf('Each configuration item must be an instance of "%s"', DrupalIntroducedVersionConfiguration::class)); + } + } + parent::configure($configuration); + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( 'Replace deprecated \\Drupal\\Core\\Utility\\Error::currentErrorHandler() with PHP built-in get_error_handler()', [ - new CodeSample( + new ConfiguredCodeSample( '$handler = \\Drupal\\Core\\Utility\\Error::currentErrorHandler();', - '$handler = get_error_handler();' + '$handler = get_error_handler();', + [new DrupalIntroducedVersionConfiguration('11.3.0')] ), ] ); @@ -41,7 +59,7 @@ public function getNodeTypes(): array return [StaticCall::class]; } - public function refactor(Node $node): ?Node + public function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { assert($node instanceof StaticCall); if (!$this->isName($node->name, 'currentErrorHandler')) { diff --git a/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector.php b/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector.php index f5036b708..fe0742b9a 100644 --- a/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector.php +++ b/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector.php @@ -4,13 +4,15 @@ namespace DrupalRector\Drupal11\Rector\Deprecation; +use DrupalRector\Contract\VersionedConfigurationInterface; +use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use PhpParser\Node; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Name; use PHPStan\Type\ObjectType; -use Rector\Rector\AbstractRector; -use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; +use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -21,16 +23,32 @@ * * @see https://www.drupal.org/node/3530461 */ -final class FileSystemBasenameToNativeRector extends AbstractRector +final class FileSystemBasenameToNativeRector extends AbstractDrupalCoreRector { + /** + * @var array|DrupalIntroducedVersionConfiguration[] + */ + protected array $configuration; + + public function configure(array $configuration): void + { + foreach ($configuration as $value) { + if (!$value instanceof DrupalIntroducedVersionConfiguration) { + throw new \InvalidArgumentException(sprintf('Each configuration item must be an instance of "%s"', DrupalIntroducedVersionConfiguration::class)); + } + } + parent::configure($configuration); + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( 'Replace deprecated FileSystemInterface::basename() calls with PHP native basename()', [ - new CodeSample( + new ConfiguredCodeSample( '$fileSystem->basename($uri, $suffix);', - 'basename($uri, $suffix);' + 'basename($uri, $suffix);', + [new DrupalIntroducedVersionConfiguration('11.3.0')] ), ] ); @@ -42,14 +60,13 @@ public function getNodeTypes(): array return [MethodCall::class]; } - public function refactor(Node $node): ?Node + public function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { assert($node instanceof MethodCall); if (!$this->isName($node->name, 'basename')) { return null; } - $callerType = $this->getType($node->var); $isFileSystem = false; foreach (['Drupal\Core\File\FileSystemInterface', 'Drupal\Core\File\FileSystem'] as $class) { if ($this->isObjectType($node->var, new ObjectType($class))) { diff --git a/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector.php b/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector.php index f9ac97f3e..d74558c8f 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector.php @@ -4,11 +4,13 @@ namespace DrupalRector\Drupal11\Rector\Deprecation; +use DrupalRector\Contract\VersionedConfigurationInterface; +use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use PhpParser\Node; use PhpParser\Node\Expr\MethodCall; use PHPStan\Type\ObjectType; -use Rector\Rector\AbstractRector; -use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; +use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -19,16 +21,32 @@ * * @see https://www.drupal.org/node/3347842 */ -final class RemoveTrustDataCallRector extends AbstractRector +final class RemoveTrustDataCallRector extends AbstractDrupalCoreRector { + /** + * @var array|DrupalIntroducedVersionConfiguration[] + */ + protected array $configuration; + + public function configure(array $configuration): void + { + foreach ($configuration as $value) { + if (!$value instanceof DrupalIntroducedVersionConfiguration) { + throw new \InvalidArgumentException(sprintf('Each configuration item must be an instance of "%s"', DrupalIntroducedVersionConfiguration::class)); + } + } + parent::configure($configuration); + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( 'Remove deprecated trustData() calls from config entity method chains', [ - new CodeSample( + new ConfiguredCodeSample( '$entity->trustData()->save();', - '$entity->save();' + '$entity->save();', + [new DrupalIntroducedVersionConfiguration('11.4.0')] ), ] ); @@ -40,7 +58,7 @@ public function getNodeTypes(): array return [MethodCall::class]; } - public function refactor(Node $node): ?Node + public function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { assert($node instanceof MethodCall); if (!$this->isName($node->name, 'trustData')) { diff --git a/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php b/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php index 90fcd6b01..b7092658a 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php @@ -39,6 +39,10 @@ final class RemoveViewsRowCacheKeysRector extends AbstractRector /** @var list variable names whose assignments were removed in the current file */ private array $removedVarNames = []; + /** + * @param array $nodes + * @return array + */ public function beforeTraversal(array $nodes): array { $this->removedVarNames = []; @@ -82,7 +86,8 @@ public function refactor(Node $node): int|Node|null return $this->refactorArray($node); } - private function refactorExpression(Expression $node): int|null + /** @return NodeVisitor::REMOVE_NODE|null */ + private function refactorExpression(Expression $node): ?int { if (!$node->expr instanceof Assign) { return null; @@ -106,7 +111,8 @@ private function refactorExpression(Expression $node): int|null return NodeVisitor::REMOVE_NODE; } - private function refactorClassMethod(ClassMethod $node): int|null + /** @return NodeVisitor::REMOVE_NODE|null */ + private function refactorClassMethod(ClassMethod $node): ?int { if (count($node->stmts ?? []) !== 1) { return null; diff --git a/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector.php b/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector.php index a19feda2d..187aeb0fc 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector.php @@ -4,9 +4,11 @@ namespace DrupalRector\Drupal11\Rector\Deprecation; +use DrupalRector\Contract\VersionedConfigurationInterface; +use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use PhpParser\Node; -use Rector\Rector\AbstractRector; -use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; +use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -16,14 +18,29 @@ * * @see https://www.drupal.org/node/2010202 */ -final class ReplaceCommentUriRector extends AbstractRector +final class ReplaceCommentUriRector extends AbstractDrupalCoreRector { + /** + * @var array|DrupalIntroducedVersionConfiguration[] + */ + protected array $configuration; + + public function configure(array $configuration): void + { + foreach ($configuration as $value) { + if (!$value instanceof DrupalIntroducedVersionConfiguration) { + throw new \InvalidArgumentException(sprintf('Each configuration item must be an instance of "%s"', DrupalIntroducedVersionConfiguration::class)); + } + } + parent::configure($configuration); + } + public function getNodeTypes(): array { return [Node\Expr\FuncCall::class]; } - public function refactor(Node $node): ?Node + public function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { assert($node instanceof Node\Expr\FuncCall); @@ -44,9 +61,10 @@ public function refactor(Node $node): ?Node public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Replace deprecated comment_uri($comment) calls with $comment->permalink() (drupal:11.3.0)', [ - new CodeSample( + new ConfiguredCodeSample( '$url = comment_uri($comment);', - '$url = $comment->permalink();' + '$url = $comment->permalink();', + [new DrupalIntroducedVersionConfiguration('11.3.0')] ), ]); } diff --git a/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector.php b/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector.php index 8bdc2cd21..0442a6586 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector.php @@ -4,12 +4,14 @@ namespace DrupalRector\Drupal11\Rector\Deprecation; +use DrupalRector\Contract\VersionedConfigurationInterface; +use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use PhpParser\Node; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Scalar\String_; -use Rector\Rector\AbstractRector; -use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; +use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -19,14 +21,29 @@ * * @see https://www.drupal.org/node/3447794 */ -final class ReplaceEditorLoadRector extends AbstractRector +final class ReplaceEditorLoadRector extends AbstractDrupalCoreRector { + /** + * @var array|DrupalIntroducedVersionConfiguration[] + */ + protected array $configuration; + + public function configure(array $configuration): void + { + foreach ($configuration as $value) { + if (!$value instanceof DrupalIntroducedVersionConfiguration) { + throw new \InvalidArgumentException(sprintf('Each configuration item must be an instance of "%s"', DrupalIntroducedVersionConfiguration::class)); + } + } + parent::configure($configuration); + } + public function getNodeTypes(): array { return [FuncCall::class]; } - public function refactor(Node $node): ?Node + public function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { assert($node instanceof FuncCall); @@ -47,9 +64,10 @@ public function refactor(Node $node): ?Node public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Replace deprecated editor_load($format_id) with entityTypeManager()->getStorage(\'editor\')->load() (drupal:11.2.0)', [ - new CodeSample( + new ConfiguredCodeSample( '$editor = editor_load($format_id);', - '$editor = \Drupal::entityTypeManager()->getStorage(\'editor\')->load($format_id);' + '$editor = \Drupal::entityTypeManager()->getStorage(\'editor\')->load($format_id);', + [new DrupalIntroducedVersionConfiguration('11.2.0')] ), ]); } diff --git a/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector.php b/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector.php index 7a36c1a1e..0d48b34a9 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector.php @@ -4,9 +4,11 @@ namespace DrupalRector\Drupal11\Rector\Deprecation; +use DrupalRector\Contract\VersionedConfigurationInterface; +use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use PhpParser\Node; -use Rector\Rector\AbstractRector; -use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; +use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -16,14 +18,29 @@ * * @see https://www.drupal.org/node/3494126 */ -final class ReplaceFileGetContentHeadersRector extends AbstractRector +final class ReplaceFileGetContentHeadersRector extends AbstractDrupalCoreRector { + /** + * @var array|DrupalIntroducedVersionConfiguration[] + */ + protected array $configuration; + + public function configure(array $configuration): void + { + foreach ($configuration as $value) { + if (!$value instanceof DrupalIntroducedVersionConfiguration) { + throw new \InvalidArgumentException(sprintf('Each configuration item must be an instance of "%s"', DrupalIntroducedVersionConfiguration::class)); + } + } + parent::configure($configuration); + } + public function getNodeTypes(): array { return [Node\Expr\FuncCall::class]; } - public function refactor(Node $node): ?Node + public function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { assert($node instanceof Node\Expr\FuncCall); @@ -44,9 +61,10 @@ public function refactor(Node $node): ?Node public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Replace deprecated file_get_content_headers($file) with $file->getDownloadHeaders() (drupal:11.2.0)', [ - new CodeSample( + new ConfiguredCodeSample( '$headers = file_get_content_headers($file);', - '$headers = $file->getDownloadHeaders();' + '$headers = $file->getDownloadHeaders();', + [new DrupalIntroducedVersionConfiguration('11.2.0')] ), ]); } diff --git a/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector.php b/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector.php index bab0b75d1..a407c7d5b 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector.php @@ -4,14 +4,16 @@ namespace DrupalRector\Drupal11\Rector\Deprecation; +use DrupalRector\Contract\VersionedConfigurationInterface; +use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use PhpParser\Node; use PhpParser\Node\Arg; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Scalar\String_; -use Rector\Rector\AbstractRector; -use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; +use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -21,14 +23,29 @@ * * @see https://www.drupal.org/node/3489266 */ -final class ReplaceNodeAddBodyFieldRector extends AbstractRector +final class ReplaceNodeAddBodyFieldRector extends AbstractDrupalCoreRector { + /** + * @var array|DrupalIntroducedVersionConfiguration[] + */ + protected array $configuration; + + public function configure(array $configuration): void + { + foreach ($configuration as $value) { + if (!$value instanceof DrupalIntroducedVersionConfiguration) { + throw new \InvalidArgumentException(sprintf('Each configuration item must be an instance of "%s"', DrupalIntroducedVersionConfiguration::class)); + } + } + parent::configure($configuration); + } + public function getNodeTypes(): array { return [FuncCall::class]; } - public function refactor(Node $node): ?Node + public function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { assert($node instanceof FuncCall); @@ -67,9 +84,10 @@ public function refactor(Node $node): ?Node public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Replace deprecated node_add_body_field() with $this->createBodyField() (drupal:11.3.0)', [ - new CodeSample( + new ConfiguredCodeSample( 'node_add_body_field($nodeType, \'My Body\');', - '$this->createBodyField(\'node\', $nodeType->id(), \'body\', \'My Body\');' + '$this->createBodyField(\'node\', $nodeType->id(), \'body\', \'My Body\');', + [new DrupalIntroducedVersionConfiguration('11.3.0')] ), ]); } diff --git a/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector.php b/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector.php index cacf6f6e8..f5a1d1010 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector.php @@ -4,6 +4,9 @@ namespace DrupalRector\Drupal11\Rector\Deprecation; +use DrupalRector\Contract\VersionedConfigurationInterface; +use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use PhpParser\Node; use PhpParser\Node\Arg; use PhpParser\Node\Expr\Array_; @@ -11,8 +14,7 @@ use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Identifier; use PhpParser\Node\Name; -use Rector\Rector\AbstractRector; -use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; +use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -23,16 +25,32 @@ * * @see https://www.drupal.org/node/3498026 */ -final class ReplaceRecipeRunnerInstallModuleRector extends AbstractRector +final class ReplaceRecipeRunnerInstallModuleRector extends AbstractDrupalCoreRector { + /** + * @var array|DrupalIntroducedVersionConfiguration[] + */ + protected array $configuration; + + public function configure(array $configuration): void + { + foreach ($configuration as $value) { + if (!$value instanceof DrupalIntroducedVersionConfiguration) { + throw new \InvalidArgumentException(sprintf('Each configuration item must be an instance of "%s"', DrupalIntroducedVersionConfiguration::class)); + } + } + parent::configure($configuration); + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( 'Replace deprecated RecipeRunner::installModule() with installModules(), wrapping the module name in an array', [ - new CodeSample( + new ConfiguredCodeSample( 'RecipeRunner::installModule($module, $recipeConfigStorage, $context);', - 'RecipeRunner::installModules([$module], $recipeConfigStorage, $context);' + 'RecipeRunner::installModules([$module], $recipeConfigStorage, $context);', + [new DrupalIntroducedVersionConfiguration('11.4.0')] ), ] ); @@ -44,7 +62,7 @@ public function getNodeTypes(): array return [StaticCall::class]; } - public function refactor(Node $node): ?Node + public function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { assert($node instanceof StaticCall); if (!$this->isName($node->name, 'installModule')) { @@ -70,9 +88,10 @@ public function refactor(Node $node): ?Node return null; } $wrappedArray = new Array_([new ArrayItem($firstArg->value)]); - $node->name = new Identifier('installModules'); - $node->args = array_merge([new Arg($wrappedArray)], array_slice($node->args, 1)); + $newNode = clone $node; + $newNode->name = new Identifier('installModules'); + $newNode->args = array_merge([new Arg($wrappedArray)], array_slice($node->args, 1)); - return $node; + return $newNode; } } diff --git a/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector.php b/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector.php index 0aaa64c30..19039870d 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector.php @@ -4,11 +4,13 @@ namespace DrupalRector\Drupal11\Rector\Deprecation; +use DrupalRector\Contract\VersionedConfigurationInterface; +use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use PhpParser\Node; use PhpParser\Node\Expr\Variable; use PHPStan\Type\ObjectType; -use Rector\Rector\AbstractRector; -use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; +use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -18,14 +20,29 @@ * * @see https://www.drupal.org/node/3513856 */ -final class ReplaceUserSessionNamePropertyRector extends AbstractRector +final class ReplaceUserSessionNamePropertyRector extends AbstractDrupalCoreRector { + /** + * @var array|DrupalIntroducedVersionConfiguration[] + */ + protected array $configuration; + + public function configure(array $configuration): void + { + foreach ($configuration as $value) { + if (!$value instanceof DrupalIntroducedVersionConfiguration) { + throw new \InvalidArgumentException(sprintf('Each configuration item must be an instance of "%s"', DrupalIntroducedVersionConfiguration::class)); + } + } + parent::configure($configuration); + } + public function getNodeTypes(): array { return [Node\Expr\PropertyFetch::class]; } - public function refactor(Node $node): ?Node + public function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { assert($node instanceof Node\Expr\PropertyFetch); @@ -50,9 +67,10 @@ public function refactor(Node $node): ?Node public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Replace deprecated $userSession->name property read with $userSession->getAccountName() (drupal:11.3.0)', [ - new CodeSample( + new ConfiguredCodeSample( '$name = $userSession->name;', - '$name = $userSession->getAccountName();' + '$name = $userSession->getAccountName();', + [new DrupalIntroducedVersionConfiguration('11.3.0')] ), ]); } diff --git a/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector.php b/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector.php index c4cafa951..e458a2e52 100644 --- a/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector.php +++ b/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector.php @@ -4,25 +4,44 @@ namespace DrupalRector\Drupal11\Rector\Deprecation; +use DrupalRector\Contract\VersionedConfigurationInterface; +use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use PhpParser\Node; use PHPStan\Type\ObjectType; -use Rector\Rector\AbstractRector; -use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; +use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** * Replaces deprecated StatementPrefetchIterator::fetchColumn() with fetchField(). * + * Deprecated in drupal:11.2.0, removed in drupal:12.0.0. + * * @see https://www.drupal.org/node/3490200 */ -final class StatementPrefetchIteratorFetchColumnRector extends AbstractRector +final class StatementPrefetchIteratorFetchColumnRector extends AbstractDrupalCoreRector { + /** + * @var array|DrupalIntroducedVersionConfiguration[] + */ + protected array $configuration; + + public function configure(array $configuration): void + { + foreach ($configuration as $value) { + if (!$value instanceof DrupalIntroducedVersionConfiguration) { + throw new \InvalidArgumentException(sprintf('Each configuration item must be an instance of "%s"', DrupalIntroducedVersionConfiguration::class)); + } + } + parent::configure($configuration); + } + public function getNodeTypes(): array { return [Node\Expr\MethodCall::class]; } - public function refactor(Node $node): ?Node + public function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { if (!$node instanceof Node\Expr\MethodCall) { return null; @@ -36,17 +55,19 @@ public function refactor(Node $node): ?Node return null; } - $node->name = new Node\Identifier('fetchField'); + $newNode = clone $node; + $newNode->name = new Node\Identifier('fetchField'); - return $node; + return $newNode; } public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Replaces deprecated StatementPrefetchIterator::fetchColumn() with fetchField()', [ - new CodeSample( + new ConfiguredCodeSample( '$result = $statement->fetchColumn(0);', - '$result = $statement->fetchField(0);' + '$result = $statement->fetchField(0);', + [new DrupalIntroducedVersionConfiguration('11.2.0')] ), ]); } diff --git a/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector.php b/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector.php index 86c235b8c..0a8195ba9 100644 --- a/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector.php +++ b/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector.php @@ -4,10 +4,12 @@ namespace DrupalRector\Drupal11\Rector\Deprecation; +use DrupalRector\Contract\VersionedConfigurationInterface; +use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use PhpParser\Node; use PHPStan\Type\ObjectType; -use Rector\Rector\AbstractRector; -use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; +use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -22,7 +24,7 @@ * * @see https://www.drupal.org/node/3566801 */ -final class UseEntityTypeHasIntegerIdRector extends AbstractRector +final class UseEntityTypeHasIntegerIdRector extends AbstractDrupalCoreRector { private const METHOD_OWNER_CLASS = [ 'entityTypeSupportsComments' => 'Drupal\comment\CommentTypeForm', @@ -31,12 +33,27 @@ final class UseEntityTypeHasIntegerIdRector extends AbstractRector private const GET_ENTITY_TYPE_ID_KEY_TYPE_CLASS = 'Drupal\Core\Entity\Routing\DefaultHtmlRouteProvider'; + /** + * @var array|DrupalIntroducedVersionConfiguration[] + */ + protected array $configuration; + + public function configure(array $configuration): void + { + foreach ($configuration as $value) { + if (!$value instanceof DrupalIntroducedVersionConfiguration) { + throw new \InvalidArgumentException(sprintf('Each configuration item must be an instance of "%s"', DrupalIntroducedVersionConfiguration::class)); + } + } + parent::configure($configuration); + } + public function getNodeTypes(): array { return [Node\Expr\BinaryOp\Identical::class, Node\Expr\MethodCall::class]; } - public function refactor(Node $node): ?Node + public function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { if ($node instanceof Node\Expr\BinaryOp\Identical) { return $this->refactorIdentical($node); @@ -119,9 +136,10 @@ private function isThisCall(Node\Expr\MethodCall $node, string $methodName): boo public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Replace deprecated entity-type integer-ID helper methods with EntityTypeInterface::hasIntegerId() (drupal:11.4.0)', [ - new CodeSample( + new ConfiguredCodeSample( "\$this->getEntityTypeIdKeyType(\$entity_type) === 'integer'", - '$entity_type->hasIntegerId()' + '$entity_type->hasIntegerId()', + [new DrupalIntroducedVersionConfiguration('11.4.0')] ), ]); } diff --git a/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector.php b/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector.php index 843b82b6e..3f1480077 100644 --- a/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector.php +++ b/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector.php @@ -4,24 +4,43 @@ namespace DrupalRector\Drupal11\Rector\Deprecation; +use DrupalRector\Contract\VersionedConfigurationInterface; +use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use PhpParser\Node; -use Rector\Rector\AbstractRector; -use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; +use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** * Replaces deprecated Views::pluginManager() and Views::handlerManager() calls. * + * Deprecated in drupal:11.4.0, removed in drupal:13.0.0. + * * @see https://www.drupal.org/node/3566424 */ -final class ViewsPluginHandlerManagerRector extends AbstractRector +final class ViewsPluginHandlerManagerRector extends AbstractDrupalCoreRector { + /** + * @var array|DrupalIntroducedVersionConfiguration[] + */ + protected array $configuration; + + public function configure(array $configuration): void + { + foreach ($configuration as $value) { + if (!$value instanceof DrupalIntroducedVersionConfiguration) { + throw new \InvalidArgumentException(sprintf('Each configuration item must be an instance of "%s"', DrupalIntroducedVersionConfiguration::class)); + } + } + parent::configure($configuration); + } + public function getNodeTypes(): array { return [Node\Expr\StaticCall::class]; } - public function refactor(Node $node): ?Node + public function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { if (!$node instanceof Node\Expr\StaticCall) { return null; @@ -68,9 +87,10 @@ public function refactor(Node $node): ?Node public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Replaces deprecated Views::pluginManager() and Views::handlerManager() with \\Drupal::service() equivalents', [ - new CodeSample( + new ConfiguredCodeSample( "Views::handlerManager('filter');\nViews::pluginManager(\$type);", - "\\Drupal::service('plugin.manager.views.filter');\n\\Drupal::service('views.plugin_managers')->get(\$type);" + "\\Drupal::service('plugin.manager.views.filter');\n\\Drupal::service('views.plugin_managers')->get(\$type);", + [new DrupalIntroducedVersionConfiguration('11.4.0')] ), ]); } diff --git a/tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/config/configured_rule.php index f4f1533c4..b34b77ab0 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/config/configured_rule.php +++ b/tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/config/configured_rule.php @@ -3,9 +3,12 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\ErrorCurrentErrorHandlerRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use DrupalRector\Tests\Rector\Deprecation\DeprecationBase; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { - DeprecationBase::addClass(ErrorCurrentErrorHandlerRector::class, $rectorConfig, false); + DeprecationBase::addClass(ErrorCurrentErrorHandlerRector::class, $rectorConfig, false, [ + new DrupalIntroducedVersionConfiguration('11.3.0'), + ]); }; diff --git a/tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/fixture/as_argument.php.inc b/tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/fixture/as_argument.php.inc index 8e56a1d1e..578bbdc0b 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/fixture/as_argument.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/fixture/as_argument.php.inc @@ -17,10 +17,10 @@ if (Error::currentErrorHandler() !== null) { use Drupal\Core\Utility\Error; // Result used inline as a function argument. -set_error_handler(get_error_handler()); +set_error_handler(\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => get_error_handler(), fn() => Error::currentErrorHandler())); // Result used in a boolean expression. -if (get_error_handler() !== null) { +if (\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => get_error_handler(), fn() => Error::currentErrorHandler()) !== null) { // do something } diff --git a/tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/fixture/basic.php.inc index 14ebd3ec8..c642204fd 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/fixture/basic.php.inc @@ -7,7 +7,7 @@ $other = OtherClass::currentErrorHandler(); ----- get_error_handler(), fn() => \Drupal\Core\Utility\Error::currentErrorHandler()); $other = OtherClass::currentErrorHandler(); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/config/configured_rule.php index 99c8ffdf3..1b8629d1c 100644 --- a/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/config/configured_rule.php +++ b/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/config/configured_rule.php @@ -3,9 +3,12 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\FileSystemBasenameToNativeRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use DrupalRector\Tests\Rector\Deprecation\DeprecationBase; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { - DeprecationBase::addClass(FileSystemBasenameToNativeRector::class, $rectorConfig, false); + DeprecationBase::addClass(FileSystemBasenameToNativeRector::class, $rectorConfig, false, [ + new DrupalIntroducedVersionConfiguration('11.3.0'), + ]); }; diff --git a/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/fixture/basic.php.inc index 8a8da66d4..2caf4bb58 100644 --- a/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/fixture/basic.php.inc @@ -9,7 +9,7 @@ $noop = $untyped->basename($uri, '.txt'); basename($uri, '.txt'), fn() => $fileSystem->basename($uri, '.txt')); $noop = $untyped->basename($uri, '.txt'); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/fixture/concrete_class.php.inc b/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/fixture/concrete_class.php.inc index 77e0e5e2d..c8af2d22a 100644 --- a/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/fixture/concrete_class.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/fixture/concrete_class.php.inc @@ -8,6 +8,6 @@ $base = $fileSystem->basename($uri, '.txt'); basename($uri, '.txt'), fn() => $fileSystem->basename($uri, '.txt')); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/fixture/no_suffix.php.inc b/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/fixture/no_suffix.php.inc index f964b8afd..5797fabcd 100644 --- a/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/fixture/no_suffix.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/fixture/no_suffix.php.inc @@ -8,6 +8,6 @@ $base = $fileSystem->basename($uri); basename($uri), fn() => $fileSystem->basename($uri)); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/config/configured_rule.php index 2bf3b9b50..9f4066813 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/config/configured_rule.php +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/config/configured_rule.php @@ -3,9 +3,12 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\RemoveTrustDataCallRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use DrupalRector\Tests\Rector\Deprecation\DeprecationBase; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { - DeprecationBase::addClass(RemoveTrustDataCallRector::class, $rectorConfig, false); + DeprecationBase::addClass(RemoveTrustDataCallRector::class, $rectorConfig, false, [ + new DrupalIntroducedVersionConfiguration('11.4.0'), + ]); }; diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/fixture/assigned_result.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/fixture/assigned_result.php.inc index a1af672cc..6809b350d 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/fixture/assigned_result.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/fixture/assigned_result.php.inc @@ -10,6 +10,6 @@ $entity2 = $entity->trustData(); // Result of trustData() assigned to a variable (expression context). /** @var \Drupal\Core\Config\Entity\ConfigEntityInterface $entity */ -$entity2 = $entity; +$entity2 = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => $entity, fn() => $entity->trustData()); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/fixture/basic.php.inc index 96f5130b1..8be26b12d 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/fixture/basic.php.inc @@ -9,7 +9,7 @@ $other->someMethod(); save(); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => $entity, fn() => $entity->trustData())->save(); $other->someMethod(); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/fixture/standalone_statement.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/fixture/standalone_statement.php.inc index 31c1ff8dc..12234db03 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/fixture/standalone_statement.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/fixture/standalone_statement.php.inc @@ -10,6 +10,6 @@ $entity->trustData(); // trustData() called as a standalone statement (not chained). /** @var \Drupal\Core\Config\Entity\ConfigEntityInterface $entity */ -$entity; +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => $entity, fn() => $entity->trustData()); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/config/configured_rule.php index d3d58b1a9..960fbd32c 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/config/configured_rule.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/config/configured_rule.php @@ -3,8 +3,12 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\ReplaceCommentUriRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; +use DrupalRector\Tests\Rector\Deprecation\DeprecationBase; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { - $rectorConfig->rule(ReplaceCommentUriRector::class); + DeprecationBase::addClass(ReplaceCommentUriRector::class, $rectorConfig, false, [ + new DrupalIntroducedVersionConfiguration('11.3.0'), + ]); }; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture/as_argument.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture/as_argument.php.inc index 480f2f490..8a08f8ad6 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture/as_argument.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture/as_argument.php.inc @@ -8,6 +8,6 @@ $url = url_to_string(comment_uri($comment)); permalink()); +$url = url_to_string(\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => $comment->permalink(), fn() => comment_uri($comment))); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture/basic.php.inc index e537a97ae..c0bc221a2 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture/basic.php.inc @@ -6,6 +6,6 @@ $url = comment_uri($comment); ----- permalink(); +$url = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => $comment->permalink(), fn() => comment_uri($comment)); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture/complex_expression.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture/complex_expression.php.inc index 902b0a5c7..c5e88b96e 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture/complex_expression.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture/complex_expression.php.inc @@ -8,6 +8,6 @@ $url = comment_uri($this->getComment()); getComment()->permalink() -$url = $this->getComment()->permalink(); +$url = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => $this->getComment()->permalink(), fn() => comment_uri($this->getComment())); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture/inline_usage.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture/inline_usage.php.inc index d3adce518..9023e2857 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture/inline_usage.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture/inline_usage.php.inc @@ -8,6 +8,6 @@ print comment_uri($comment); permalink(); +print \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => $comment->permalink(), fn() => comment_uri($comment)); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/config/configured_rule.php index 9d22dd487..d500adcf9 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/config/configured_rule.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/config/configured_rule.php @@ -3,9 +3,12 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\ReplaceEditorLoadRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use DrupalRector\Tests\Rector\Deprecation\DeprecationBase; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { - DeprecationBase::addClass(ReplaceEditorLoadRector::class, $rectorConfig, false); + DeprecationBase::addClass(ReplaceEditorLoadRector::class, $rectorConfig, false, [ + new DrupalIntroducedVersionConfiguration('11.2.0'), + ]); }; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/fixture/as_argument.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/fixture/as_argument.php.inc index c1bcbb795..30b1132f0 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/fixture/as_argument.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/fixture/as_argument.php.inc @@ -8,6 +8,6 @@ doSomethingWithEditor(editor_load($format_id)); getStorage('editor')->load($format_id)); +doSomethingWithEditor(\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => \Drupal::entityTypeManager()->getStorage('editor')->load($format_id), fn() => editor_load($format_id))); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/fixture/basic.php.inc index 515a4dd86..c7321a548 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/fixture/basic.php.inc @@ -7,7 +7,7 @@ $other = other_function($format_id); ----- getStorage('editor')->load($format_id); +$editor = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => \Drupal::entityTypeManager()->getStorage('editor')->load($format_id), fn() => editor_load($format_id)); $other = other_function($format_id); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/fixture/inline_usage.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/fixture/inline_usage.php.inc index 2eb99389e..efc2225a9 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/fixture/inline_usage.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/fixture/inline_usage.php.inc @@ -8,6 +8,6 @@ print editor_load($format_id); getStorage('editor')->load($format_id); +print \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => \Drupal::entityTypeManager()->getStorage('editor')->load($format_id), fn() => editor_load($format_id)); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/config/configured_rule.php index 1a444bbbb..30ab9bfa3 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/config/configured_rule.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/config/configured_rule.php @@ -3,9 +3,12 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\ReplaceFileGetContentHeadersRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use DrupalRector\Tests\Rector\Deprecation\DeprecationBase; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { - DeprecationBase::addClass(ReplaceFileGetContentHeadersRector::class, $rectorConfig, false); + DeprecationBase::addClass(ReplaceFileGetContentHeadersRector::class, $rectorConfig, false, [ + new DrupalIntroducedVersionConfiguration('11.2.0'), + ]); }; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture/as_argument.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture/as_argument.php.inc index 7f7a7d4e9..67e9098e7 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture/as_argument.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture/as_argument.php.inc @@ -8,6 +8,6 @@ send_headers(file_get_content_headers($file)); getDownloadHeaders()); +send_headers(\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => $file->getDownloadHeaders(), fn() => file_get_content_headers($file))); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture/basic.php.inc index 2be8bcbcf..730f87aa1 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture/basic.php.inc @@ -7,7 +7,7 @@ $other = file_get_something_else($file); ----- getDownloadHeaders(); +$headers = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => $file->getDownloadHeaders(), fn() => file_get_content_headers($file)); $other = file_get_something_else($file); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture/inline_in_array.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture/inline_in_array.php.inc index eacdb9c3b..5273cd8c6 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture/inline_in_array.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture/inline_in_array.php.inc @@ -8,6 +8,6 @@ $data = ['headers' => file_get_content_headers($file), 'name' => 'test']; $file->getDownloadHeaders(), 'name' => 'test']; +$data = ['headers' => \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => $file->getDownloadHeaders(), fn() => file_get_content_headers($file)), 'name' => 'test']; ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture/method_call_as_arg.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture/method_call_as_arg.php.inc index 51d8e205d..7e90f3180 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture/method_call_as_arg.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture/method_call_as_arg.php.inc @@ -8,6 +8,6 @@ $headers = file_get_content_headers($this->getFile()); getFile()->getDownloadHeaders(); +$headers = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => $this->getFile()->getDownloadHeaders(), fn() => file_get_content_headers($this->getFile())); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/config/configured_rule.php index c7f9847cf..8ba11a88c 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/config/configured_rule.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/config/configured_rule.php @@ -3,9 +3,12 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\ReplaceNodeAddBodyFieldRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use DrupalRector\Tests\Rector\Deprecation\DeprecationBase; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { - DeprecationBase::addClass(ReplaceNodeAddBodyFieldRector::class, $rectorConfig, false); + DeprecationBase::addClass(ReplaceNodeAddBodyFieldRector::class, $rectorConfig, false, [ + new DrupalIntroducedVersionConfiguration('11.3.0'), + ]); }; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/fixture/basic.php.inc index be7d27910..0054d5acc 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/fixture/basic.php.inc @@ -7,7 +7,7 @@ node_add_body_field($nodeType, 'My Body'); ----- createBodyField('node', $nodeType->id()); -$this->createBodyField('node', $nodeType->id(), 'body', 'My Body'); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => $this->createBodyField('node', $nodeType->id()), fn() => node_add_body_field($nodeType)); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => $this->createBodyField('node', $nodeType->id(), 'body', 'My Body'), fn() => node_add_body_field($nodeType, 'My Body')); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/fixture/fqcn_prefix.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/fixture/fqcn_prefix.php.inc index abf2cbabb..e36d0281e 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/fixture/fqcn_prefix.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/fixture/fqcn_prefix.php.inc @@ -7,7 +7,7 @@ ----- createBodyField('node', $nodeType->id()); -$this->createBodyField('node', $nodeType->id(), 'body', 'My Body'); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => $this->createBodyField('node', $nodeType->id()), fn() => \node_add_body_field($nodeType)); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => $this->createBodyField('node', $nodeType->id(), 'body', 'My Body'), fn() => \node_add_body_field($nodeType, 'My Body')); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/fixture/method_call_arg.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/fixture/method_call_arg.php.inc index 0f6adc813..732b2a41f 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/fixture/method_call_arg.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/fixture/method_call_arg.php.inc @@ -7,7 +7,7 @@ node_add_body_field($this->getNodeType(), 'Custom Label'); ----- createBodyField('node', $this->getNodeType()->id()); -$this->createBodyField('node', $this->getNodeType()->id(), 'body', 'Custom Label'); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => $this->createBodyField('node', $this->getNodeType()->id()), fn() => node_add_body_field($this->getNodeType())); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => $this->createBodyField('node', $this->getNodeType()->id(), 'body', 'Custom Label'), fn() => node_add_body_field($this->getNodeType(), 'Custom Label')); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/config/configured_rule.php index d423bddd8..8a8c0f09f 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/config/configured_rule.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/config/configured_rule.php @@ -3,9 +3,12 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\ReplaceRecipeRunnerInstallModuleRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use DrupalRector\Tests\Rector\Deprecation\DeprecationBase; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { - DeprecationBase::addClass(ReplaceRecipeRunnerInstallModuleRector::class, $rectorConfig, false); + DeprecationBase::addClass(ReplaceRecipeRunnerInstallModuleRector::class, $rectorConfig, false, [ + new DrupalIntroducedVersionConfiguration('11.4.0'), + ]); }; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/fixture/basic.php.inc index f4a49579f..7b725fa0e 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/fixture/basic.php.inc @@ -11,7 +11,7 @@ RecipeRunner::installModules([$module], $recipeConfigStorage, $context); use Drupal\Core\Recipe\RecipeRunner; -RecipeRunner::installModules([$module], $recipeConfigStorage, $context); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => RecipeRunner::installModules([$module], $recipeConfigStorage, $context), fn() => RecipeRunner::installModule($module, $recipeConfigStorage, $context)); RecipeRunner::installModules([$module], $recipeConfigStorage, $context); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/fixture/fqcn.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/fixture/fqcn.php.inc index bf286b08c..93cebfc21 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/fixture/fqcn.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/fixture/fqcn.php.inc @@ -6,6 +6,6 @@ ----- \Drupal\Core\Recipe\RecipeRunner::installModules([$module], $recipeConfigStorage, $context), fn() => \Drupal\Core\Recipe\RecipeRunner::installModule($module, $recipeConfigStorage, $context)); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/fixture/self_static.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/fixture/self_static.php.inc index c9abf5fb2..d9c91d898 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/fixture/self_static.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/fixture/self_static.php.inc @@ -21,8 +21,8 @@ class MyRunner extends RecipeRunner { public static function run(string $module, $storage, ?array &$context): void { - self::installModules([$module], $storage, $context); - static::installModules([$module], $storage, $context); + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => self::installModules([$module], $storage, $context), fn() => self::installModule($module, $storage, $context)); + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => static::installModules([$module], $storage, $context), fn() => static::installModule($module, $storage, $context)); } } diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/config/configured_rule.php index ea6fabc3f..6784a56f3 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/config/configured_rule.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/config/configured_rule.php @@ -3,8 +3,12 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\ReplaceUserSessionNamePropertyRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; +use DrupalRector\Tests\Rector\Deprecation\DeprecationBase; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { - $rectorConfig->rule(ReplaceUserSessionNamePropertyRector::class); + DeprecationBase::addClass(ReplaceUserSessionNamePropertyRector::class, $rectorConfig, false, [ + new DrupalIntroducedVersionConfiguration('11.3.0'), + ]); }; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/fixture/basic.php.inc index 0dbd5f667..e2197f019 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/fixture/basic.php.inc @@ -9,7 +9,7 @@ $other = $untyped->name; getAccountName(); +$name = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => $userSession->getAccountName(), fn() => $userSession->name); $other = $untyped->name; ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/fixture/inline_usage.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/fixture/inline_usage.php.inc index 462689759..868c169f8 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/fixture/inline_usage.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/fixture/inline_usage.php.inc @@ -11,9 +11,9 @@ $label = 'Hello ' . $session->name; getAccountName() === 'admin') { - return $session->getAccountName(); +if (\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => $session->getAccountName(), fn() => $session->name) === 'admin') { + return \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => $session->getAccountName(), fn() => $session->name); } -$label = 'Hello ' . $session->getAccountName(); +$label = 'Hello ' . \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => $session->getAccountName(), fn() => $session->name); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/config/configured_rule.php index 0c414265b..b6e74363a 100644 --- a/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/config/configured_rule.php +++ b/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/config/configured_rule.php @@ -3,9 +3,12 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\StatementPrefetchIteratorFetchColumnRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use DrupalRector\Tests\Rector\Deprecation\DeprecationBase; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { - DeprecationBase::addClass(StatementPrefetchIteratorFetchColumnRector::class, $rectorConfig, false); + DeprecationBase::addClass(StatementPrefetchIteratorFetchColumnRector::class, $rectorConfig, false, [ + new DrupalIntroducedVersionConfiguration('11.2.0'), + ]); }; diff --git a/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture/basic.php.inc index 4f02acb64..e7f066e04 100644 --- a/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture/basic.php.inc @@ -16,7 +16,7 @@ use Drupal\Core\Database\StatementPrefetchIterator; class MyClass { public function example(StatementPrefetchIterator $statement): void { - $result = $statement->fetchField(0); + $result = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => $statement->fetchField(0), fn() => $statement->fetchColumn(0)); $other = $this->clientStatement->fetchColumn(0); } } diff --git a/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture/no_arg.php.inc b/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture/no_arg.php.inc index 004b1459c..022ef14b6 100644 --- a/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture/no_arg.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture/no_arg.php.inc @@ -10,6 +10,6 @@ $result = $statement->fetchColumn(); // Zero-argument call is transformed too (default $index = 0). /** @var \Drupal\Core\Database\StatementPrefetchIterator $statement */ -$result = $statement->fetchField(); +$result = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => $statement->fetchField(), fn() => $statement->fetchColumn()); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture/property_not_client_statement.php.inc b/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture/property_not_client_statement.php.inc index b73ba491c..b218a8714 100644 --- a/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture/property_not_client_statement.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture/property_not_client_statement.php.inc @@ -25,8 +25,8 @@ class MyClass { public StatementPrefetchIterator $stmt; public function example(): void { - $result = $this->statement->fetchField(0); - $result2 = $this->stmt->fetchField(2); + $result = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => $this->statement->fetchField(0), fn() => $this->statement->fetchColumn(0)); + $result2 = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => $this->stmt->fetchField(2), fn() => $this->stmt->fetchColumn(2)); } } diff --git a/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/config/configured_rule.php index 34c7fb6d2..a0eb8e7b3 100644 --- a/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/config/configured_rule.php +++ b/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/config/configured_rule.php @@ -3,8 +3,12 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\UseEntityTypeHasIntegerIdRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; +use DrupalRector\Tests\Rector\Deprecation\DeprecationBase; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { - $rectorConfig->rule(UseEntityTypeHasIntegerIdRector::class); + DeprecationBase::addClass(UseEntityTypeHasIntegerIdRector::class, $rectorConfig, false, [ + new DrupalIntroducedVersionConfiguration('11.4.0'), + ]); }; diff --git a/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/basic.php.inc index 51af238d7..ac8d9ce45 100644 --- a/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/basic.php.inc @@ -18,7 +18,7 @@ use Drupal\Core\Entity\Routing\DefaultHtmlRouteProvider; class MyRouteProvider extends DefaultHtmlRouteProvider { public function doSomething($entity_type): void { - if ($entity_type->hasIntegerId()) { + if (\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => $entity_type->hasIntegerId(), fn() => $this->getEntityTypeIdKeyType($entity_type) === 'integer')) { $result = 'integer'; } } diff --git a/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/entity_type_supports_comments.php.inc b/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/entity_type_supports_comments.php.inc index 4cb1ea56a..afa620be2 100644 --- a/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/entity_type_supports_comments.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/entity_type_supports_comments.php.inc @@ -16,7 +16,7 @@ use Drupal\comment\CommentTypeForm; class MyCommentForm extends CommentTypeForm { public function doSomething($entity_type): void { - $a = $entity_type->hasIntegerId(); + $a = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => $entity_type->hasIntegerId(), fn() => $this->entityTypeSupportsComments($entity_type)); } } diff --git a/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/has_integer_id_helper.php.inc b/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/has_integer_id_helper.php.inc index e359d4909..8a6b5db82 100644 --- a/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/has_integer_id_helper.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/has_integer_id_helper.php.inc @@ -16,7 +16,7 @@ use Drupal\layout_builder\Plugin\SectionStorage\OverridesSectionStorage; class MyStorage extends OverridesSectionStorage { public function doSomething($entity_type): void { - $b = $entity_type->hasIntegerId(); + $b = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => $entity_type->hasIntegerId(), fn() => $this->hasIntegerId($entity_type)); } } diff --git a/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/string_reversed.php.inc b/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/string_reversed.php.inc index 55174ce0a..fc1101704 100644 --- a/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/string_reversed.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture/string_reversed.php.inc @@ -20,7 +20,7 @@ use Drupal\Core\Entity\Routing\DefaultHtmlRouteProvider; // String on the left side of === is also transformed. class MyRouteProvider extends DefaultHtmlRouteProvider { public function doSomething($entity_type): void { - if ($entity_type->hasIntegerId()) { + if (\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => $entity_type->hasIntegerId(), fn() => 'integer' === $this->getEntityTypeIdKeyType($entity_type))) { $result = 'integer'; } } diff --git a/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/config/configured_rule.php index fe54899d0..3c18486a3 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/config/configured_rule.php +++ b/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/config/configured_rule.php @@ -3,9 +3,12 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\ViewsPluginHandlerManagerRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use DrupalRector\Tests\Rector\Deprecation\DeprecationBase; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { - DeprecationBase::addClass(ViewsPluginHandlerManagerRector::class, $rectorConfig, false); + DeprecationBase::addClass(ViewsPluginHandlerManagerRector::class, $rectorConfig, false, [ + new DrupalIntroducedVersionConfiguration('11.4.0'), + ]); }; diff --git a/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/fixture/basic.php.inc index 31962a971..606110174 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/fixture/basic.php.inc @@ -12,8 +12,8 @@ $manager = Views::pluginManager($type); use Drupal\views\Views; -$filterManager = \Drupal::service('plugin.manager.views.filter'); -$displayManager = \Drupal::service('plugin.manager.views.display'); +$filterManager = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('plugin.manager.views.filter'), fn() => Views::handlerManager('filter')); +$displayManager = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('plugin.manager.views.display'), fn() => Views::pluginManager('display')); $type = 'sort'; -$manager = \Drupal::service('views.plugin_managers')->get($type); +$manager = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('views.plugin_managers')->get($type), fn() => Views::pluginManager($type)); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/fixture/chained_call.php.inc b/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/fixture/chained_call.php.inc index 12f3c3a5a..64795770a 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/fixture/chained_call.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/fixture/chained_call.php.inc @@ -15,9 +15,9 @@ $instance = Views::pluginManager('display')->createInstance($id); use Drupal\views\Views; // handlerManager result used immediately in a method chain. -$handler = \Drupal::service('plugin.manager.views.field')->getHandler($options, $id); +$handler = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('plugin.manager.views.field'), fn() => Views::handlerManager('field'))->getHandler($options, $id); // pluginManager result used in a method chain. -$instance = \Drupal::service('plugin.manager.views.display')->createInstance($id); +$instance = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('plugin.manager.views.display'), fn() => Views::pluginManager('display'))->createInstance($id); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/fixture/fqcn_prefix.php.inc b/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/fixture/fqcn_prefix.php.inc index 2dded027f..e7ebded76 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/fixture/fqcn_prefix.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/fixture/fqcn_prefix.php.inc @@ -9,7 +9,7 @@ $displayManager = \Drupal\views\Views::pluginManager('display'); \Drupal::service('plugin.manager.views.filter'), fn() => \Drupal\views\Views::handlerManager('filter')); +$displayManager = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('plugin.manager.views.display'), fn() => \Drupal\views\Views::pluginManager('display')); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/fixture/handler_manager_dynamic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/fixture/handler_manager_dynamic.php.inc index 0b494730a..32bb4a0a4 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/fixture/handler_manager_dynamic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/fixture/handler_manager_dynamic.php.inc @@ -14,6 +14,6 @@ use Drupal\views\Views; // handlerManager with a dynamic argument uses the service-locator form. $type = 'relationship'; -$manager = \Drupal::service('views.plugin_managers')->get($type); +$manager = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('views.plugin_managers')->get($type), fn() => Views::handlerManager($type)); ?> From 7b507f49cccd2a8bdc52add6e1eb809d879b5a0e Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 7 May 2026 09:56:07 +0200 Subject: [PATCH 117/256] feat(group-b): add DeprecationHelper BC wrapping to 7 multi-pattern rectors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Migrates 7 Group B rectors from AbstractRector to AbstractDrupalCoreRector so replacement expressions are wrapped in DeprecationHelper::backwardsCompatibleCall() when the installed Drupal version supports it. Rectors migrated: - ReplaceLocaleConfigBatchFunctionsRector (11.1.0) — also fixes in-place mutation (clone node before renaming to preserve original for BC old-callable) - ReplaceDateTimeRangeConstantsRector (11.2.0) - ReplaceEntityOriginalPropertyRector (11.2.0) — uses IS_BEING_ASSIGNED attribute to skip PropertyFetch transformation when on assignment LHS, letting the Assign handler produce a BC-wrapped setOriginal() call with the original assignment as old-callable - ReplaceNodeAccessViewAllNodesRector (11.3.0) - ReplaceNodeModuleProceduralFunctionsRector (11.3.0) - ReplaceThemeGetSettingRector (11.3.0) - ReplaceViewsProceduralFunctionsRector (11.4.0) All 339 tests pass, PHPStan clean. --- config/drupal-11/drupal-11.1-deprecations.php | 5 +- config/drupal-11/drupal-11.2-deprecations.php | 8 +- config/drupal-11/drupal-11.3-deprecations.php | 12 +- config/drupal-11/drupal-11.4-deprecations.php | 4 +- scripts/setup-rector-test-d10.sh | 470 ++++++++++++++++++ .../ReplaceDateTimeRangeConstantsRector.php | 35 +- .../ReplaceEntityOriginalPropertyRector.php | 54 +- ...eplaceLocaleConfigBatchFunctionsRector.php | 35 +- .../ReplaceNodeAccessViewAllNodesRector.php | 35 +- ...aceNodeModuleProceduralFunctionsRector.php | 40 +- .../ReplaceThemeGetSettingRector.php | 35 +- .../ReplaceViewsProceduralFunctionsRector.php | 30 +- .../config/configured_rule.php | 5 +- .../fixture/basic.php.inc | 8 +- .../fixture/function_replacement.php.inc | 4 +- .../fixture/match_arm.php.inc | 6 +- .../config/configured_rule.php | 5 +- .../fixture/basic.php.inc | 4 +- .../fixture/chain.php.inc | 2 +- .../fixture/nullsafe.php.inc | 2 +- .../fixture/write_complex_rhs.php.inc | 2 +- .../config/configured_rule.php | 6 +- .../fixture/basic.php.inc | 4 +- .../fixture/expression_positions.php.inc | 8 +- .../fixture/fqcn_prefix.php.inc | 4 +- .../config/configured_rule.php | 5 +- .../fixture/basic.php.inc | 6 +- .../fixture/in_condition.php.inc | 4 +- .../config/configured_rule.php | 5 +- .../fixture/basic.php.inc | 4 +- .../fixture/expression_positions.php.inc | 6 +- .../fixture/node_mass_update.php.inc | 4 +- .../config/configured_rule.php | 5 +- .../fixture/basic.php.inc | 6 +- .../fixture/fqcn_prefix.php.inc | 4 +- .../fixture/inline_usage.php.inc | 6 +- .../fixture/variable_key.php.inc | 4 +- .../config/configured_rule.php | 6 +- .../fixture/basic.php.inc | 10 +- .../fixture/expression_positions.php.inc | 8 +- 40 files changed, 778 insertions(+), 128 deletions(-) create mode 100755 scripts/setup-rector-test-d10.sh diff --git a/config/drupal-11/drupal-11.1-deprecations.php b/config/drupal-11/drupal-11.1-deprecations.php index 564ebbb8c..0f7f36dc6 100644 --- a/config/drupal-11/drupal-11.1-deprecations.php +++ b/config/drupal-11/drupal-11.1-deprecations.php @@ -8,6 +8,7 @@ use DrupalRector\Drupal11\Rector\Deprecation\ReplaceLocaleConfigBatchFunctionsRector; use DrupalRector\Rector\Deprecation\FunctionToStaticRector; use DrupalRector\Rector\Deprecation\MethodToMethodWithCheckRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use DrupalRector\Rector\ValueObject\FunctionToStaticConfiguration; use DrupalRector\Rector\ValueObject\MethodToMethodWithCheckConfiguration; use Rector\Config\RectorConfig; @@ -42,7 +43,9 @@ // locale_config_batch_set_config_langcodes() and locale_config_batch_refresh_name() deprecated // in drupal:11.1.0, removed in drupal:12.0.0. Renamed to update_default_config_langcodes // and update_config_translations respectively. - $rectorConfig->rule(ReplaceLocaleConfigBatchFunctionsRector::class); + $rectorConfig->ruleWithConfiguration(ReplaceLocaleConfigBatchFunctionsRector::class, [ + new DrupalIntroducedVersionConfiguration('11.1.0'), + ]); // https://www.drupal.org/node/3417136 // Updater::postInstall() and postInstallTasks() deprecated in drupal:11.1.0, removed in drupal:12.0.0. diff --git a/config/drupal-11/drupal-11.2-deprecations.php b/config/drupal-11/drupal-11.2-deprecations.php index 759195a74..cdb9dd57b 100644 --- a/config/drupal-11/drupal-11.2-deprecations.php +++ b/config/drupal-11/drupal-11.2-deprecations.php @@ -142,7 +142,9 @@ // Replaced by DateTimeRangeDisplayOptions enum cases (->value). // datetime_type_field_views_data_helper() deprecated in drupal:11.2.0, removed in drupal:12.0.0. // Replaced by \Drupal::service('datetime.views_helper')->buildViewsData(). - $rectorConfig->rule(ReplaceDateTimeRangeConstantsRector::class); + $rectorConfig->ruleWithConfiguration(ReplaceDateTimeRangeConstantsRector::class, [ + new DrupalIntroducedVersionConfiguration('11.2.0'), + ]); // https://www.drupal.org/node/3494126 // file_get_content_headers($file) deprecated in drupal:11.2.0, removed in drupal:12.0.0. @@ -166,7 +168,9 @@ // https://www.drupal.org/node/3571065 // $entity->original magic property deprecated in drupal:11.2.0, removed in drupal:12.0.0. // Read access replaced by getOriginal(); write access replaced by setOriginal($value). - $rectorConfig->rule(ReplaceEntityOriginalPropertyRector::class); + $rectorConfig->ruleWithConfiguration(ReplaceEntityOriginalPropertyRector::class, [ + new DrupalIntroducedVersionConfiguration('11.2.0'), + ]); // https://www.drupal.org/node/3495943 // #[StopProceduralHookScan] attribute renamed to #[ProceduralHookScanStop] in drupal:11.2.0. diff --git a/config/drupal-11/drupal-11.3-deprecations.php b/config/drupal-11/drupal-11.3-deprecations.php index 10260019c..9d4f6430b 100644 --- a/config/drupal-11/drupal-11.3-deprecations.php +++ b/config/drupal-11/drupal-11.3-deprecations.php @@ -53,7 +53,9 @@ new FunctionToServiceConfiguration('11.3.0', 'node_mass_update', 'Drupal\node\NodeBulkUpdate', 'process'), new FunctionToServiceConfiguration('11.3.0', 'template_preprocess_layout', 'Drupal\layout_discovery\Hook\LayoutDiscoveryThemeHooks', 'preprocessLayout'), ]); - $rectorConfig->rule(ReplaceNodeModuleProceduralFunctionsRector::class); + $rectorConfig->ruleWithConfiguration(ReplaceNodeModuleProceduralFunctionsRector::class, [ + new DrupalIntroducedVersionConfiguration('11.3.0'), + ]); // https://www.drupal.org/node/3504005 // block_content_add_body_field() deprecated in drupal:11.3.0, removed in drupal:13.0.0. @@ -73,7 +75,9 @@ // node_access_view_all_nodes() deprecated in drupal:11.3.0, removed in drupal:12.0.0. // Replaced by entityTypeManager()->getAccessControlHandler('node')->checkAllGrants(). // drupal_static_reset('node_access_view_all_nodes') replaced by node.view_all_nodes_memory_cache->deleteAll(). - $rectorConfig->rule(ReplaceNodeAccessViewAllNodesRector::class); + $rectorConfig->ruleWithConfiguration(ReplaceNodeAccessViewAllNodesRector::class, [ + new DrupalIntroducedVersionConfiguration('11.3.0'), + ]); // https://www.drupal.org/node/3574424 // responsive_image_* functions deprecated in drupal:11.3.0, removed in drupal:12.0.0. @@ -139,7 +143,9 @@ // https://www.drupal.org/node/3573896 // theme_get_setting() and _system_default_theme_features() deprecated in drupal:11.3.0, removed in drupal:13.0.0. // Replaced by ThemeSettingsProvider service. - $rectorConfig->rule(ReplaceThemeGetSettingRector::class); + $rectorConfig->ruleWithConfiguration(ReplaceThemeGetSettingRector::class, [ + new DrupalIntroducedVersionConfiguration('11.3.0'), + ]); // https://www.drupal.org/node/3522513 // Database::convertDbUrlToConnectionInfo($url, $root, ...) deprecated in drupal:11.3.0, removed in drupal:12.0.0. diff --git a/config/drupal-11/drupal-11.4-deprecations.php b/config/drupal-11/drupal-11.4-deprecations.php index c87d52670..c3020709b 100644 --- a/config/drupal-11/drupal-11.4-deprecations.php +++ b/config/drupal-11/drupal-11.4-deprecations.php @@ -231,7 +231,9 @@ // views_view_is_enabled(), views_view_is_disabled(), views_enable_view(), // views_disable_view(), views_get_view_result() deprecated in drupal:11.4.0, removed in drupal:13.0.0. // Replaced by OO equivalents on the view object or Views::getViewResult(). - $rectorConfig->rule(ReplaceViewsProceduralFunctionsRector::class); + $rectorConfig->ruleWithConfiguration(ReplaceViewsProceduralFunctionsRector::class, [ + new DrupalIntroducedVersionConfiguration('11.4.0'), + ]); // https://www.drupal.org/node/3566801 // getEntityTypeIdKeyType() === 'integer', entityTypeSupportsComments(), and hasIntegerId($entityType) diff --git a/scripts/setup-rector-test-d10.sh b/scripts/setup-rector-test-d10.sh new file mode 100755 index 000000000..def78216b --- /dev/null +++ b/scripts/setup-rector-test-d10.sh @@ -0,0 +1,470 @@ +#!/usr/bin/env bash +# Sets up a Drupal 11 DDEV project with contrib modules that exercise all new +# rectors, wires in the local drupal-rector branch, and runs rector so you can +# review the resulting diff. +# +# Usage: ./scripts/setup-rector-test.sh [project-name] +# Default project name: drupal-rector-test +# Default location: ../../ (sibling of the rector repo) + +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +RECTOR_REPO="$(cd "$SCRIPT_DIR/.." && pwd)" +RECTOR_BRANCH="feature/digest-rectors" + +PROJECT_NAME="${1:-drupal-rector-test-d10}" +# Two levels up from this script (scripts/ → repo-root → parent) then the project name. +TARGET_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)/$PROJECT_NAME" + +echo "==> Project directory : $TARGET_DIR" +echo "==> drupal-rector repo : $RECTOR_REPO ($RECTOR_BRANCH)" +echo "" + +# --------------------------------------------------------------------------- +# 1. Create project directory and configure DDEV +# --------------------------------------------------------------------------- +mkdir -p "$TARGET_DIR" +cd "$TARGET_DIR" + +echo "==> Configuring DDEV…" +ddev config \ + --project-type=drupal10 \ + --docroot=web \ + --project-name="$PROJECT_NAME" + +# Mount the local rector clone inside the DDEV container so the PATH +# composer repository works without pushing to GitHub first. +cat > .ddev/docker-compose.mounts.yaml << DOCKERCOMPOSE +services: + web: + volumes: + - "$RECTOR_REPO:/mnt/drupal-rector" +DOCKERCOMPOSE + +ddev start -y + +# --------------------------------------------------------------------------- +# 2. Scaffold Drupal 11 +# --------------------------------------------------------------------------- +echo "" +echo "==> Scaffolding Drupal 11 via composer create-project…" +ddev composer create-project "drupal/recommended-project:^10" . \ + --no-interaction \ + --stability dev + +# Pre-approve all composer plugins upfront so no interactive prompts appear +# during any subsequent require/update calls. +ddev composer config allow-plugins.tbachert/spi true + +ddev composer require drush/drush --no-interaction + +echo "" +echo "==> Installing Drupal site…" +ddev drush site:install --account-name=admin --account-pass=admin -y + +# --------------------------------------------------------------------------- +# 3. Wire in drupal-rector from the local clone +# --------------------------------------------------------------------------- +echo "" +echo "==> Wiring in drupal-rector (local clone via DDEV mount)…" + +# PATH repository — resolves to the mounted rector clone inside the container. +# Listed as the only source; no VCS fallback needed (and SSH keys aren't +# available inside DDEV containers anyway). +ddev composer config repositories.drupal-rector \ + '{"type":"path","url":"/mnt/drupal-rector","options":{"symlink":true}}' + +ddev composer require \ + "palantirnet/drupal-rector:dev-$RECTOR_BRANCH as 1.x-dev" \ + --no-interaction + +# --------------------------------------------------------------------------- +# 4. Require contrib modules (≥2 per rector where possible) +# See docs/contrib-modules-d11.md for the full coverage mapping. +# Note: 8 rectors have no testable D11 contrib module (see comments in test script). +# --------------------------------------------------------------------------- +echo "" +echo "==> Requiring contrib modules…" + +# Batch 1 — multi-rector modules (high-value) +ddev composer require --no-update \ + "drupal/acquia_contenthub:*" \ + "drupal/searchstax:*" \ + "drupal/ai_agents:*" \ + "drupal/commerce_invoice:*" \ + "drupal/custom_field:*" \ + "drupal/role_expire:*" \ + "drupal/views_dependent_filters:*" \ + "drupal/group:*" \ + "drupal/search_api:*" \ + "drupal/schemadotorg:*" \ + "drupal/smart_migrate_cli:*" \ + "drupal/metatag:*" \ + "drupal/external_entity:*" \ + "drupal/reassign_user_content:*" + +# Batch 2 — single-rector gap-fillers +ddev composer require --no-update \ + "drupal/tara:*" \ + "drupal/vani:*" \ + "drupal/association:*" \ + "drupal/tome:*" \ + "drupal/cmrf_form_processor:*" \ + "drupal/intl_date:*" \ + "drupal/responsive_preview:*" \ + "drupal/tmgmt:*" \ + "drupal/config_track:*" \ + "drupal/site_guardian:*" \ + "drupal/smart_date:*" \ + "drupal/vcp4dates:*" \ + "drupal/gdpr:*" \ + "drupal/ai_eca:*" \ + "drupal/gnode_request:*" \ + "drupal/migmag:*" \ + "drupal/sparql_entity_storage:*" \ + "drupal/views_advanced_cache:*" \ + "drupal/smart_sql_idmap:*" \ + "drupal/forum:*" \ + "drupal/history:*" \ + "drupal/addanother:*" \ + "drupal/quicktabs:*" \ + "drupal/entity_usage:*" \ + "drupal/media_auto_publication:*" \ + "drupal/migrate_tools:*" \ + "drupal/stage_file_proxy:^3.1" \ + "drupal/workflow_buttons:^1" \ + "drupal/optional_end_date:*" \ + "drupal/scheduler_field:*" \ + "drupal/mailsystem:*" \ + "drupal/webform:*" \ + "drupal/recipe_installer_kit:*" + +echo "" +echo "==> Running composer update to resolve all requirements…" +ddev composer update --no-interaction --with-all-dependencies + +# --------------------------------------------------------------------------- +# 5. Initialise git and commit the installed baseline +# (vendor/ and web/core/ excluded; web/modules/contrib/ tracked so +# rector changes show up in git diff) +# --------------------------------------------------------------------------- +echo "" +echo "==> Initialising git repository…" +if [ ! -d ".git" ]; then + git init +fi + +cat > .gitignore << 'GITIGNORE' +/vendor/ +/web/core/ +/web/sites/default/settings.php +/web/sites/default/services.yml +/web/sites/default/files/ +*.orig +GITIGNORE + +git add . +git commit -m "Install Drupal 11 + contrib modules for rector testing" + +# --------------------------------------------------------------------------- +# 6. Write rector.php +# --------------------------------------------------------------------------- +echo "" +echo "==> Writing rector.php…" +cat > rector.php << 'RECTOR' +withPaths([ + __DIR__ . '/web/modules/contrib', + ]) + ->withFileExtensions(['php', 'module', 'theme', 'install', 'profile', 'inc', 'engine']) + ->withSets([ + Drupal10SetList::DRUPAL_10, + Drupal11SetList::DRUPAL_11, + ]); +RECTOR + +git add rector.php + +# --------------------------------------------------------------------------- +# 7. Generate per-rector test script (run this inside ddev ssh) +# --------------------------------------------------------------------------- +mkdir -p scripts +cat > scripts/test-rectors.sh << 'TESTSCRIPT' +#!/usr/bin/env bash +# Per-rector test runner. Run this INSIDE the DDEV container: +# ddev ssh +# bash /var/www/html/scripts/test-rectors.sh [RectorName] +# +# With no argument: runs all rectors in sequence. +# With a rector class name: runs only that one rector. +# Output is tee'd to /var/www/html/rector-test.log + +set -euo pipefail +cd /var/www/html + +LOG=/var/www/html/rector-test.log +CONTRIB=web/modules/contrib +FILTER="${1:-}" + +run_test() { + local rector="$1" + shift + local mods=("$@") + + # Skip if a filter is set and doesn't match + if [ -n "$FILTER" ] && [ "$FILTER" != "$rector" ]; then + return + fi + + # Derive FQCN by checking which namespace the rector lives in + local fqcn + if [ -f "vendor/palantirnet/drupal-rector/src/Drupal11/Rector/Deprecation/${rector}.php" ]; then + fqcn="DrupalRector\\Drupal11\\Rector\\Deprecation\\${rector}" + else + fqcn="DrupalRector\\Drupal10\\Rector\\Deprecation\\${rector}" + fi + + # Resolve installed module directories + local paths=() + for mod in "${mods[@]}"; do + [ -d "$CONTRIB/$mod" ] && paths+=("$CONTRIB/$mod") + done + + echo "" | tee -a "$LOG" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" | tee -a "$LOG" + printf " %s\n" "$rector" | tee -a "$LOG" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" | tee -a "$LOG" + + if [ ${#paths[@]} -eq 0 ]; then + echo " SKIP — no modules installed for this rector" | tee -a "$LOG" + return + fi + + printf " Rector: %s\n" "$fqcn" | tee -a "$LOG" + printf " Modules: %s\n" "${paths[*]}" | tee -a "$LOG" + echo "" | tee -a "$LOG" + + timeout 30 vendor/bin/rector process "${paths[@]}" --only="$fqcn" --dry-run --clear-cache 2>&1 | tee -a "$LOG" || true + + echo "" | tee -a "$LOG" + git diff "${paths[@]}" | tee -a "$LOG" || true + + # Reset files so the next rector starts clean + git checkout -- "${paths[@]}" 2>/dev/null || true +} + +echo "Rector test run — $(date)" | tee "$LOG" +echo "Log: $LOG" | tee -a "$LOG" + +# ── Drupal 11 rectors ────────────────────────────────────────────────────── +run_test ErrorCurrentErrorHandlerRector + # No contrib usage: Error::currentErrorHandler() deprecated D11.3.0; devel 5.x already cleaned up, no other hits + +run_test FileSystemBasenameToNativeRector \ + stage_file_proxy + +run_test LoadAllIncludesRector \ + config_track schemadotorg + +run_test MigrateSqlGetMigrationPluginManagerRector \ + feeds_migrate migmag smart_sql_idmap + +run_test NodeStorageDeprecatedMethodsRector \ + workflow_buttons + +run_test PluginBaseIsConfigurableRector \ + metatag search_api + +run_test RemoveAutomatedCronSubmitHandlerRector + # No contrib usage: automated_cron_settings_submit deprecated D11.4.0, no contrib calls found + +run_test RemoveCacheExpireOverrideRector \ + cmrf_form_processor vcp4dates + +run_test RemoveHandlerBaseDefineExtraOptionsRector \ + views_dependent_filters + +run_test RemoveLinkWidgetValidateTitleElementRector + # No contrib usage: LinkWidget::validateTitleElement() deprecated D11.4.0, no contrib calls found + +run_test RemoveModuleHandlerAddModuleCallsRector \ + config_track + +run_test RemoveModuleHandlerDeprecatedMethodsRector + # No contrib usage: writeCache()/getHookInfo() on ModuleHandlerInterface not called in any D11 contrib module found + +run_test RemoveRootFromConvertDbUrlRector \ + smart_migrate_cli sparql_entity_storage + +run_test RemoveSetUriCallbackRector + # No contrib usage: $entityType->setUriCallback() not called in any D11 contrib module found + +run_test RemoveStateCacheSettingRector + # No contrib usage: $settings['state_cache'] pattern not found in any D11 contrib module; likely already gone from codebase + +run_test RemoveTrustDataCallRector \ + views_dependent_filters group + +run_test RemoveTwigNodeTransTagArgumentRector + # No contrib usage: TwigNodeTrans 6-arg constructor removed from core before D11 contrib caught up (version drift) + +run_test RemoveUpdaterPostInstallMethodsRector \ + group gnode_request + +run_test RemoveViewsRowCacheKeysRector \ + metatag views_advanced_cache + +run_test RenameStopProceduralHookScanRector + # No contrib usage: StopProceduralHookScan attribute deprecated D11.2.0, niche — no contrib usage found + +run_test ReplaceAlphadecimalToIntNullRector + # No contrib usage: alphadecimalToInt(null/'') — both values always returned 0, + # so this was only ever passed as a literal in custom code or tests. No D11 contrib + # module calls the function with a literal null or empty string. + +run_test ReplaceCommentManagerGetCountNewCommentsRector \ + forum history + +run_test ReplaceCommentUriRector + # No contrib usage: comment_uri() deprecated D11.3.0; Social 13.x already cleaned up (issue #3432522), no other D11 hits + +run_test ReplaceDateTimeRangeConstantsRector \ + optional_end_date scheduler_field + +run_test ReplaceEditorLoadRector + # No contrib usage: editor_load() deprecated D11; not called in any D11 contrib module found + +run_test ReplaceEntityOriginalPropertyRector \ + entity_usage media_auto_publication + +run_test ReplaceEntityReferenceRecursiveLimitRector + # No contrib usage: RECURSIVE_RENDER_LIMIT removed from core before D11; + # all D11-compatible modules either define their own constant or hardcode 20. + # custom_field/external_entity define the constant, they don't reference core's. + +run_test ReplaceFieldgroupToFieldsetRector \ + webform + +run_test ReplaceFileGetContentHeadersRector \ + commerce_invoice tmgmt + +run_test ReplaceLocaleConfigBatchFunctionsRector + # No contrib usage: locale_config_batch_* deprecated D11.1.0; all GitLab hits were bundled core copies, not contrib code + +run_test ReplaceModuleHandlerGetNameRector \ + mailsystem + +run_test ReplaceNodeAccessViewAllNodesRector + # No contrib usage: node_access_view_all_nodes() deprecated D11.3.0; no D11 contrib caller found (newly deprecated) + +run_test ReplaceNodeAddBodyFieldRector \ + tome ai_eca + +run_test ReplaceNodeModuleProceduralFunctionsRector \ + reassign_user_content addanother + +run_test ReplaceNodeSetPreviewModeRector \ + ai_agents responsive_preview + +run_test ReplacePdoFetchConstantsRector \ + acquia_contenthub gdpr + +run_test ReplaceRecipeRunnerInstallModuleRector \ + recipe_installer_kit + +run_test ReplaceSessionManagerDeleteRector + # role_expire confirmed caller at RoleExpireApiService.php:168 ($this->sessionManager->delete($uid)) + # but AbstractDrupalCoreRector version gate requires Drupal >= 11.4.0 — SessionManager::delete() + # was deprecated in 11.4.0 which is not yet released (latest stable: 11.3.x). + # Re-enable with "role_expire" once the test site runs Drupal 11.4.0+. + +run_test ReplaceSessionWritesWithRequestSessionRector + # No contrib usage: direct $_SESSION writes not present in any D11-compatible contrib module found + +run_test ReplaceSystemPerformanceGzipKeyRector + # No contrib usage: advagg (only known caller) declares "core_version_requirement: ^9.3 || ^10" — not D11-compatible + +run_test ReplaceThemeGetSettingRector \ + tara vani + +run_test ReplaceUserSessionNamePropertyRector + # No contrib usage: $userSession->name property access not present in any D11 contrib module found + +run_test ReplaceViewsProceduralFunctionsRector \ + custom_field quicktabs + +run_test StatementPrefetchIteratorFetchColumnRector + # No contrib usage: fetchColumn() removed at D10.0; all D11-compatible modules already resolved this + +run_test StripMigrationDependenciesExpandArgRector \ + migrate_tools + +run_test UseEntityTypeHasIntegerIdRector \ + commerce_invoice association + +run_test ViewsPluginHandlerManagerRector \ + searchstax search_api metatag + +# ── Drupal 10 rectors ────────────────────────────────────────────────────── +run_test ReplaceModuleHandlerGetNameRector \ + mailsystem + +run_test ReplaceRebuildThemeDataRector \ + site_guardian + +run_test ReplaceRequestTimeConstantRector + # No contrib usage: REQUEST_TIME constant usage already migrated in all D11-compatible modules found + +run_test SystemTimeZonesRector \ + intl_date smart_date + +echo "" | tee -a "$LOG" +echo "Done. Full log: $LOG" | tee -a "$LOG" +TESTSCRIPT + +chmod +x scripts/test-rectors.sh +git add rector.php scripts/test-rectors.sh +git commit -m "Add rector.php and per-rector test script" + +# --------------------------------------------------------------------------- +# 8. Print manual run instructions +# --------------------------------------------------------------------------- +echo "" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo " Setup complete." +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo "" +echo " cd $TARGET_DIR && ddev ssh" +echo "" +echo " # Run all rectors, each against its own modules only:" +echo " bash /var/www/html/scripts/test-rectors.sh" +echo "" +echo " # Run a single rector:" +echo " bash /var/www/html/scripts/test-rectors.sh LoadAllIncludesRector" +echo "" +echo " # Log is written to: $TARGET_DIR/rector-test.log" +echo "" +echo " Site: run 'ddev launch' | Admin: admin / admin" +echo "" +echo " Coverage notes (see docs/contrib-modules-d11.md):" +echo " * 18 rectors skipped — pattern exhausted or no D11 contrib usage found" +echo " (ErrorCurrentErrorHandler, RemoveAutomatedCronSubmitHandler," +echo " RemoveLinkWidgetValidateTitleElement, RemoveModuleHandlerDeprecatedMethods," +echo " RemoveSetUriCallback, RemoveStateCacheSetting," +echo " RemoveTwigNodeTransTagArgument, RenameStopProceduralHookScan," +echo " ReplaceAlphadecimalToIntNull, ReplaceCommentUri, ReplaceEditorLoad," +echo " ReplaceEntityReferenceRecursiveLimit, ReplaceLocaleConfigBatchFunctions," +echo " ReplaceNodeAccessViewAllNodes, ReplaceRequestTimeConstant," +echo " ReplaceSessionWritesWithRequestSession, ReplaceSystemPerformanceGzipKey," +echo " ReplaceUserSessionNameProperty, StatementPrefetchIteratorFetchColumn)" +echo " * 1 rector skipped — version gate requires Drupal >= 11.4.0 (not yet released):" +echo " ReplaceSessionManagerDeleteRector (role_expire is valid test module; re-enable after upgrade)" diff --git a/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector.php b/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector.php index c1da9ec63..a47833640 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector.php @@ -4,6 +4,9 @@ namespace DrupalRector\Drupal11\Rector\Deprecation; +use DrupalRector\Contract\VersionedConfigurationInterface; +use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use PhpParser\Node; use PhpParser\Node\Arg; use PhpParser\Node\Expr\ClassConstFetch; @@ -15,8 +18,7 @@ use PhpParser\Node\Name; use PhpParser\Node\Name\FullyQualified; use PhpParser\Node\Scalar\String_; -use Rector\Rector\AbstractRector; -use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; +use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -27,7 +29,7 @@ * * @see https://www.drupal.org/node/3574901 */ -final class ReplaceDateTimeRangeConstantsRector extends AbstractRector +final class ReplaceDateTimeRangeConstantsRector extends AbstractDrupalCoreRector { private const CONSTANTS_INTERFACE = 'Drupal\datetime_range\DateTimeRangeConstantsInterface'; private const DISPLAY_OPTIONS_ENUM = 'Drupal\datetime_range\DateTimeRangeDisplayOptions'; @@ -38,18 +40,35 @@ final class ReplaceDateTimeRangeConstantsRector extends AbstractRector 'END_DATE' => 'EndDate', ]; + /** + * @var array|DrupalIntroducedVersionConfiguration[] + */ + protected array $configuration; + + public function configure(array $configuration): void + { + foreach ($configuration as $value) { + if (!$value instanceof DrupalIntroducedVersionConfiguration) { + throw new \InvalidArgumentException(sprintf('Each configuration item must be an instance of "%s"', DrupalIntroducedVersionConfiguration::class)); + } + } + parent::configure($configuration); + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( 'Replace removed DateTimeRangeConstantsInterface constants and datetime_type_field_views_data_helper() with Drupal 12 equivalents', [ - new CodeSample( + new ConfiguredCodeSample( 'DateTimeRangeConstantsInterface::BOTH;', - '\\Drupal\\datetime_range\\DateTimeRangeDisplayOptions::Both->value;' + '\\Drupal\\datetime_range\\DateTimeRangeDisplayOptions::Both->value;', + [new DrupalIntroducedVersionConfiguration('11.2.0')] ), - new CodeSample( + new ConfiguredCodeSample( 'datetime_type_field_views_data_helper($field_storage, $data, $column);', - "\\Drupal::service('datetime.views_helper')->buildViewsData(\$field_storage, \$data, \$column);" + "\\Drupal::service('datetime.views_helper')->buildViewsData(\$field_storage, \$data, \$column);", + [new DrupalIntroducedVersionConfiguration('11.2.0')] ), ] ); @@ -61,7 +80,7 @@ public function getNodeTypes(): array return [ClassConstFetch::class, FuncCall::class]; } - public function refactor(Node $node): ?Node + protected function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { if ($node instanceof ClassConstFetch) { return $this->refactorClassConst($node); diff --git a/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector.php b/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector.php index 86532de1a..3bef73d22 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector.php @@ -4,6 +4,9 @@ namespace DrupalRector\Drupal11\Rector\Deprecation; +use DrupalRector\Contract\VersionedConfigurationInterface; +use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use PhpParser\Node; use PhpParser\Node\Arg; use PhpParser\Node\Expr\Assign; @@ -13,8 +16,8 @@ use PhpParser\Node\Expr\PropertyFetch; use PhpParser\Node\Expr\Variable; use PHPStan\Type\ObjectType; -use Rector\Rector\AbstractRector; -use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; +use Rector\NodeTypeResolver\Node\AttributeKey; +use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -25,22 +28,43 @@ * * @see https://www.drupal.org/node/3571065 */ -final class ReplaceEntityOriginalPropertyRector extends AbstractRector +final class ReplaceEntityOriginalPropertyRector extends AbstractDrupalCoreRector { + /** + * @var array|DrupalIntroducedVersionConfiguration[] + */ + protected array $configuration; + + public function configure(array $configuration): void + { + foreach ($configuration as $value) { + if (!$value instanceof DrupalIntroducedVersionConfiguration) { + throw new \InvalidArgumentException(sprintf('Each configuration item must be an instance of "%s"', DrupalIntroducedVersionConfiguration::class)); + } + } + parent::configure($configuration); + } + public function getNodeTypes(): array { return [PropertyFetch::class, NullsafePropertyFetch::class, Assign::class]; } - public function refactor(Node $node): ?Node + protected function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { // Step 1a: $entity->original → $entity->getOriginal() + // Skip when used as LHS of an Assign — the Assign handler below manages that + // so BC wrapping captures the original assignment expression correctly. // (skip $this->original — non-entity classes have a legitimate $original property) if ($node instanceof PropertyFetch) { if ($this->isName($node->name, 'original') && !$this->isThisVar($node->var) && $this->isObjectType($node->var, new ObjectType('Drupal\Core\Entity\EntityInterface')) ) { + if ($node->getAttribute(AttributeKey::IS_BEING_ASSIGNED)) { + return null; + } + return new MethodCall($node->var, 'getOriginal'); } @@ -61,11 +85,13 @@ public function refactor(Node $node): ?Node assert($node instanceof Assign); - // Step 2: after step 1 transforms the LHS, detect $entity->getOriginal() = $x - // (invalid assignment target) and rewrite to $entity->setOriginal($x). - if ($node->var instanceof MethodCall - && $this->isName($node->var->name, 'getOriginal') - && empty($node->var->args) + // Step 2: $entity->original = $x → $entity->setOriginal($x) + // Detect the original PropertyFetch form directly (before any inner transformation) + // so the BC "old callable" captures the original assignment correctly. + if ($node->var instanceof PropertyFetch + && $this->isName($node->var->name, 'original') + && !$this->isThisVar($node->var->var) + && $this->isObjectType($node->var->var, new ObjectType('Drupal\Core\Entity\EntityInterface')) ) { return new MethodCall( $node->var->var, @@ -85,13 +111,15 @@ private function isThisVar(Node $node): bool public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Replace deprecated $entity->original magic property with getOriginal()/setOriginal() method calls (drupal:11.2.0)', [ - new CodeSample( + new ConfiguredCodeSample( '$original = $entity->original;', - '$original = $entity->getOriginal();' + '$original = $entity->getOriginal();', + [new DrupalIntroducedVersionConfiguration('11.2.0')] ), - new CodeSample( + new ConfiguredCodeSample( '$entity->original = $unchanged;', - '$entity->setOriginal($unchanged);' + '$entity->setOriginal($unchanged);', + [new DrupalIntroducedVersionConfiguration('11.2.0')] ), ]); } diff --git a/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector.php b/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector.php index d51f66e3d..10af59e4d 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector.php @@ -4,9 +4,11 @@ namespace DrupalRector\Drupal11\Rector\Deprecation; +use DrupalRector\Contract\VersionedConfigurationInterface; +use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use PhpParser\Node; -use Rector\Rector\AbstractRector; -use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; +use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -19,19 +21,34 @@ * * @see https://www.drupal.org/node/3575254 */ -final class ReplaceLocaleConfigBatchFunctionsRector extends AbstractRector +final class ReplaceLocaleConfigBatchFunctionsRector extends AbstractDrupalCoreRector { private const RENAME_MAP = [ 'locale_config_batch_set_config_langcodes' => 'locale_config_batch_update_default_config_langcodes', 'locale_config_batch_refresh_name' => 'locale_config_batch_update_config_translations', ]; + /** + * @var array|DrupalIntroducedVersionConfiguration[] + */ + protected array $configuration; + + public function configure(array $configuration): void + { + foreach ($configuration as $value) { + if (!$value instanceof DrupalIntroducedVersionConfiguration) { + throw new \InvalidArgumentException(sprintf('Each configuration item must be an instance of "%s"', DrupalIntroducedVersionConfiguration::class)); + } + } + parent::configure($configuration); + } + public function getNodeTypes(): array { return [Node\Expr\FuncCall::class]; } - public function refactor(Node $node): ?Node + protected function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { assert($node instanceof Node\Expr\FuncCall); @@ -44,17 +61,19 @@ public function refactor(Node $node): ?Node return null; } - $node->name = new Node\Name(self::RENAME_MAP[$name]); + $newNode = clone $node; + $newNode->name = new Node\Name(self::RENAME_MAP[$name]); - return $node; + return $newNode; } public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Replace removed locale config batch helper functions with their renamed successors (drupal:11.1.0)', [ - new CodeSample( + new ConfiguredCodeSample( 'locale_config_batch_set_config_langcodes($context);', - 'locale_config_batch_update_default_config_langcodes($context);' + 'locale_config_batch_update_default_config_langcodes($context);', + [new DrupalIntroducedVersionConfiguration('11.1.0')] ), ]); } diff --git a/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector.php b/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector.php index b079b5614..47abb02e9 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector.php @@ -4,13 +4,15 @@ namespace DrupalRector\Drupal11\Rector\Deprecation; +use DrupalRector\Contract\VersionedConfigurationInterface; +use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use PhpParser\Node; use PhpParser\Node\Arg; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Scalar\String_; -use Rector\Rector\AbstractRector; -use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; +use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -20,14 +22,29 @@ * * @see https://www.drupal.org/node/3038908 */ -final class ReplaceNodeAccessViewAllNodesRector extends AbstractRector +final class ReplaceNodeAccessViewAllNodesRector extends AbstractDrupalCoreRector { + /** + * @var array|DrupalIntroducedVersionConfiguration[] + */ + protected array $configuration; + + public function configure(array $configuration): void + { + foreach ($configuration as $value) { + if (!$value instanceof DrupalIntroducedVersionConfiguration) { + throw new \InvalidArgumentException(sprintf('Each configuration item must be an instance of "%s"', DrupalIntroducedVersionConfiguration::class)); + } + } + parent::configure($configuration); + } + public function getNodeTypes(): array { return [FuncCall::class]; } - public function refactor(Node $node): ?Node + protected function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { assert($node instanceof FuncCall); @@ -83,13 +100,15 @@ private function refactorStaticReset(FuncCall $node): ?MethodCall public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Replace deprecated node_access_view_all_nodes() with entityTypeManager()->getAccessControlHandler(\'node\')->checkAllGrants() (drupal:11.3.0)', [ - new CodeSample( + new ConfiguredCodeSample( 'node_access_view_all_nodes();', - "\\Drupal::entityTypeManager()->getAccessControlHandler('node')->checkAllGrants(\\Drupal::currentUser());" + "\\Drupal::entityTypeManager()->getAccessControlHandler('node')->checkAllGrants(\\Drupal::currentUser());", + [new DrupalIntroducedVersionConfiguration('11.3.0')] ), - new CodeSample( + new ConfiguredCodeSample( "drupal_static_reset('node_access_view_all_nodes');", - "\\Drupal::service('node.view_all_nodes_memory_cache')->deleteAll();" + "\\Drupal::service('node.view_all_nodes_memory_cache')->deleteAll();", + [new DrupalIntroducedVersionConfiguration('11.3.0')] ), ]); } diff --git a/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector.php b/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector.php index 160d6f458..1aa199fd3 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector.php @@ -4,6 +4,9 @@ namespace DrupalRector\Drupal11\Rector\Deprecation; +use DrupalRector\Contract\VersionedConfigurationInterface; +use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use PhpParser\Node; use PhpParser\Node\Arg; use PhpParser\Node\Expr\ClassConstFetch; @@ -13,8 +16,7 @@ use PhpParser\Node\Name; use PhpParser\Node\Name\FullyQualified; use PhpParser\Node\Scalar\String_; -use Rector\Rector\AbstractRector; -use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; +use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -25,24 +27,42 @@ * * @see https://www.drupal.org/node/3571623 */ -final class ReplaceNodeModuleProceduralFunctionsRector extends AbstractRector +final class ReplaceNodeModuleProceduralFunctionsRector extends AbstractDrupalCoreRector { + /** + * @var array|DrupalIntroducedVersionConfiguration[] + */ + protected array $configuration; + + public function configure(array $configuration): void + { + foreach ($configuration as $value) { + if (!$value instanceof DrupalIntroducedVersionConfiguration) { + throw new \InvalidArgumentException(sprintf('Each configuration item must be an instance of "%s"', DrupalIntroducedVersionConfiguration::class)); + } + } + parent::configure($configuration); + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( 'Replace deprecated Node module procedural functions with OOP equivalents', [ - new CodeSample( + new ConfiguredCodeSample( 'node_type_get_names();', - "\\Drupal::service('entity_type.bundle.info')->getBundleLabels('node');" + "\\Drupal::service('entity_type.bundle.info')->getBundleLabels('node');", + [new DrupalIntroducedVersionConfiguration('11.3.0')] ), - new CodeSample( + new ConfiguredCodeSample( 'node_get_type_label($node);', - '$node->getBundleEntity()->label();' + '$node->getBundleEntity()->label();', + [new DrupalIntroducedVersionConfiguration('11.3.0')] ), - new CodeSample( + new ConfiguredCodeSample( 'node_mass_update($nids, $updates, NULL, TRUE);', - '\\Drupal::service(\\Drupal\\node\\NodeBulkUpdate::class)->process($nids, $updates, NULL, TRUE);' + '\\Drupal::service(\\Drupal\\node\\NodeBulkUpdate::class)->process($nids, $updates, NULL, TRUE);', + [new DrupalIntroducedVersionConfiguration('11.3.0')] ), ] ); @@ -54,7 +74,7 @@ public function getNodeTypes(): array return [FuncCall::class]; } - public function refactor(Node $node): ?Node + protected function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { assert($node instanceof FuncCall); diff --git a/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector.php b/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector.php index 1fca15af0..ee5f71ca0 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector.php @@ -4,6 +4,9 @@ namespace DrupalRector\Drupal11\Rector\Deprecation; +use DrupalRector\Contract\VersionedConfigurationInterface; +use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use PhpParser\Node; use PhpParser\Node\Arg; use PhpParser\Node\Expr\ClassConstFetch; @@ -12,8 +15,7 @@ use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Name; use PhpParser\Node\Name\FullyQualified; -use Rector\Rector\AbstractRector; -use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; +use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -23,22 +25,39 @@ * * @see https://www.drupal.org/node/3573896 */ -final class ReplaceThemeGetSettingRector extends AbstractRector +final class ReplaceThemeGetSettingRector extends AbstractDrupalCoreRector { private const THEME_SETTINGS_PROVIDER = 'Drupal\Core\Extension\ThemeSettingsProvider'; + /** + * @var array|DrupalIntroducedVersionConfiguration[] + */ + protected array $configuration; + + public function configure(array $configuration): void + { + foreach ($configuration as $value) { + if (!$value instanceof DrupalIntroducedVersionConfiguration) { + throw new \InvalidArgumentException(sprintf('Each configuration item must be an instance of "%s"', DrupalIntroducedVersionConfiguration::class)); + } + } + parent::configure($configuration); + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( 'Replace deprecated theme_get_setting() and _system_default_theme_features() with ThemeSettingsProvider equivalents', [ - new CodeSample( + new ConfiguredCodeSample( "theme_get_setting('logo.url');", - "\\Drupal::service(\\Drupal\\Core\\Extension\\ThemeSettingsProvider::class)->getSetting('logo.url');" + "\\Drupal::service(\\Drupal\\Core\\Extension\\ThemeSettingsProvider::class)->getSetting('logo.url');", + [new DrupalIntroducedVersionConfiguration('11.3.0')] ), - new CodeSample( + new ConfiguredCodeSample( '_system_default_theme_features();', - '\\Drupal\\Core\\Extension\\ThemeSettingsProvider::DEFAULT_THEME_FEATURES;' + '\\Drupal\\Core\\Extension\\ThemeSettingsProvider::DEFAULT_THEME_FEATURES;', + [new DrupalIntroducedVersionConfiguration('11.3.0')] ), ] ); @@ -50,7 +69,7 @@ public function getNodeTypes(): array return [FuncCall::class]; } - public function refactor(Node $node): ?Node + protected function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { assert($node instanceof FuncCall); if (!$node->name instanceof Name) { diff --git a/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector.php b/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector.php index 2bde1c55f..ac74da909 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector.php @@ -4,9 +4,11 @@ namespace DrupalRector\Drupal11\Rector\Deprecation; +use DrupalRector\Contract\VersionedConfigurationInterface; +use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use PhpParser\Node; -use Rector\Rector\AbstractRector; -use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; +use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -22,14 +24,29 @@ * * @see https://www.drupal.org/node/3572243 */ -final class ReplaceViewsProceduralFunctionsRector extends AbstractRector +final class ReplaceViewsProceduralFunctionsRector extends AbstractDrupalCoreRector { + /** + * @var array|DrupalIntroducedVersionConfiguration[] + */ + protected array $configuration; + + public function configure(array $configuration): void + { + foreach ($configuration as $value) { + if (!$value instanceof DrupalIntroducedVersionConfiguration) { + throw new \InvalidArgumentException(sprintf('Each configuration item must be an instance of "%s"', DrupalIntroducedVersionConfiguration::class)); + } + } + parent::configure($configuration); + } + public function getNodeTypes(): array { return [Node\Expr\FuncCall::class]; } - public function refactor(Node $node): ?Node + protected function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { assert($node instanceof Node\Expr\FuncCall); @@ -99,9 +116,10 @@ private function staticGetViewResult(Node\Expr\FuncCall $node): Node\Expr\Static public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Replace deprecated Views procedural functions with OO equivalents (drupal:11.4.0)', [ - new CodeSample( + new ConfiguredCodeSample( 'views_enable_view($view);', - '$view->enable()->save();' + '$view->enable()->save();', + [new DrupalIntroducedVersionConfiguration('11.4.0')] ), ]); } diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/config/configured_rule.php index 173ba2f09..2aace06ea 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/config/configured_rule.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/config/configured_rule.php @@ -3,9 +3,12 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\ReplaceDateTimeRangeConstantsRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use DrupalRector\Tests\Rector\Deprecation\DeprecationBase; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { - DeprecationBase::addClass(ReplaceDateTimeRangeConstantsRector::class, $rectorConfig, false); + DeprecationBase::addClass(ReplaceDateTimeRangeConstantsRector::class, $rectorConfig, false, [ + new DrupalIntroducedVersionConfiguration('11.2.0'), + ]); }; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/fixture/basic.php.inc index f5f1f2ee4..a04beb54f 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/fixture/basic.php.inc @@ -13,9 +13,9 @@ datetime_type_field_views_data_helper($field_storage, $data, 'value'); use Drupal\datetime_range\DateTimeRangeConstantsInterface; -$a = \Drupal\datetime_range\DateTimeRangeDisplayOptions::Both->value; -$b = \Drupal\datetime_range\DateTimeRangeDisplayOptions::StartDate->value; -$c = \Drupal\datetime_range\DateTimeRangeDisplayOptions::EndDate->value; -\Drupal::service('datetime.views_helper')->buildViewsData($field_storage, $data, 'value'); +$a = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => \Drupal\datetime_range\DateTimeRangeDisplayOptions::Both->value, fn() => DateTimeRangeConstantsInterface::BOTH); +$b = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => \Drupal\datetime_range\DateTimeRangeDisplayOptions::StartDate->value, fn() => DateTimeRangeConstantsInterface::START_DATE); +$c = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => \Drupal\datetime_range\DateTimeRangeDisplayOptions::EndDate->value, fn() => DateTimeRangeConstantsInterface::END_DATE); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => \Drupal::service('datetime.views_helper')->buildViewsData($field_storage, $data, 'value'), fn() => datetime_type_field_views_data_helper($field_storage, $data, 'value')); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/fixture/function_replacement.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/fixture/function_replacement.php.inc index bdb2db4ad..324cf5fbe 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/fixture/function_replacement.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/fixture/function_replacement.php.inc @@ -8,8 +8,8 @@ $result = datetime_type_field_views_data_helper($field_storage, $data, $column); ----- buildViewsData($field_storage, $data, 'value'); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => \Drupal::service('datetime.views_helper')->buildViewsData($field_storage, $data, 'value'), fn() => datetime_type_field_views_data_helper($field_storage, $data, 'value')); -$result = \Drupal::service('datetime.views_helper')->buildViewsData($field_storage, $data, $column); +$result = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => \Drupal::service('datetime.views_helper')->buildViewsData($field_storage, $data, $column), fn() => datetime_type_field_views_data_helper($field_storage, $data, $column)); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/fixture/match_arm.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/fixture/match_arm.php.inc index 71aeb9115..7464ff49a 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/fixture/match_arm.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/fixture/match_arm.php.inc @@ -19,9 +19,9 @@ use Drupal\datetime_range\DateTimeRangeConstantsInterface; $type = 'both'; $label = match($type) { - \Drupal\datetime_range\DateTimeRangeDisplayOptions::Both->value => 'Both dates', - \Drupal\datetime_range\DateTimeRangeDisplayOptions::StartDate->value => 'Start date only', - \Drupal\datetime_range\DateTimeRangeDisplayOptions::EndDate->value => 'End date only', + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => \Drupal\datetime_range\DateTimeRangeDisplayOptions::Both->value, fn() => DateTimeRangeConstantsInterface::BOTH) => 'Both dates', + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => \Drupal\datetime_range\DateTimeRangeDisplayOptions::StartDate->value, fn() => DateTimeRangeConstantsInterface::START_DATE) => 'Start date only', + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => \Drupal\datetime_range\DateTimeRangeDisplayOptions::EndDate->value, fn() => DateTimeRangeConstantsInterface::END_DATE) => 'End date only', }; ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/config/configured_rule.php index 097b6ad2d..0127f4881 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/config/configured_rule.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/config/configured_rule.php @@ -3,9 +3,12 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\ReplaceEntityOriginalPropertyRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use DrupalRector\Tests\Rector\Deprecation\DeprecationBase; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { - DeprecationBase::addClass(ReplaceEntityOriginalPropertyRector::class, $rectorConfig, false); + DeprecationBase::addClass(ReplaceEntityOriginalPropertyRector::class, $rectorConfig, false, [ + new DrupalIntroducedVersionConfiguration('11.2.0'), + ]); }; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/basic.php.inc index 6cee6ba9e..6fbc36bd9 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/basic.php.inc @@ -10,8 +10,8 @@ $field = $entity->other_property; getOriginal(); -$entity->setOriginal($unchanged); +$original = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => $entity->getOriginal(), fn() => $entity->original); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => $entity->setOriginal($unchanged), fn() => $entity->original = $unchanged); $field = $entity->other_property; ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/chain.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/chain.php.inc index 23134a970..64ff50bd5 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/chain.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/chain.php.inc @@ -8,6 +8,6 @@ $id = $entity->original->id(); getOriginal()->id(); +$id = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => $entity->getOriginal(), fn() => $entity->original)->id(); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/nullsafe.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/nullsafe.php.inc index aa8114d1b..42bc68e70 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/nullsafe.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/nullsafe.php.inc @@ -8,6 +8,6 @@ $id = $entity?->original?->id(); getOriginal()?->id(); +$id = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => $entity?->getOriginal(), fn() => $entity?->original)?->id(); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/write_complex_rhs.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/write_complex_rhs.php.inc index 315b27d2d..ee8ffa616 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/write_complex_rhs.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture/write_complex_rhs.php.inc @@ -8,6 +8,6 @@ $entity->original = $storage->load($entity->id()); setOriginal($storage->load($entity->id())); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => $entity->setOriginal($storage->load($entity->id())), fn() => $entity->original = $storage->load($entity->id())); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/config/configured_rule.php index 09b96774b..fe8222666 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/config/configured_rule.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/config/configured_rule.php @@ -3,8 +3,12 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\ReplaceLocaleConfigBatchFunctionsRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; +use DrupalRector\Tests\Rector\Deprecation\DeprecationBase; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { - $rectorConfig->rule(ReplaceLocaleConfigBatchFunctionsRector::class); + DeprecationBase::addClass(ReplaceLocaleConfigBatchFunctionsRector::class, $rectorConfig, false, [ + new DrupalIntroducedVersionConfiguration('11.1.0'), + ]); }; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/fixture/basic.php.inc index 21da0f8b3..593f6ae2e 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/fixture/basic.php.inc @@ -8,8 +8,8 @@ other_function($context); ----- locale_config_batch_update_default_config_langcodes($context), fn() => locale_config_batch_set_config_langcodes($context)); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.1.0', fn() => locale_config_batch_update_config_translations($names, $langcodes, $context), fn() => locale_config_batch_refresh_name($names, $langcodes, $context)); other_function($context); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/fixture/expression_positions.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/fixture/expression_positions.php.inc index 6e0e06aa7..5fcf58bb0 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/fixture/expression_positions.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/fixture/expression_positions.php.inc @@ -16,14 +16,14 @@ $items[] = locale_config_batch_refresh_name($names, $langcodes, $context); locale_config_batch_update_config_translations($names, $langcodes, $context), fn() => locale_config_batch_refresh_name($names, $langcodes, $context)); -$result = locale_config_batch_update_config_translations($names, $langcodes, $context); +$result = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.1.0', fn() => locale_config_batch_update_config_translations($names, $langcodes, $context), fn() => locale_config_batch_refresh_name($names, $langcodes, $context)); -if (locale_config_batch_update_config_translations($names, $langcodes, $context)) { +if (\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.1.0', fn() => locale_config_batch_update_config_translations($names, $langcodes, $context), fn() => locale_config_batch_refresh_name($names, $langcodes, $context))) { doSomething(); } -$items[] = locale_config_batch_update_config_translations($names, $langcodes, $context); +$items[] = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.1.0', fn() => locale_config_batch_update_config_translations($names, $langcodes, $context), fn() => locale_config_batch_refresh_name($names, $langcodes, $context)); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/fixture/fqcn_prefix.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/fixture/fqcn_prefix.php.inc index eb8392d1f..7a8e82ed2 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/fixture/fqcn_prefix.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/fixture/fqcn_prefix.php.inc @@ -9,7 +9,7 @@ locale_config_batch_update_default_config_langcodes($context), fn() => \locale_config_batch_set_config_langcodes($context)); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.1.0', fn() => locale_config_batch_update_config_translations($names, $langcodes, $context), fn() => \locale_config_batch_refresh_name($names, $langcodes, $context)); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/config/configured_rule.php index 95e5c1c7f..d4fc71b79 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/config/configured_rule.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/config/configured_rule.php @@ -3,9 +3,12 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\ReplaceNodeAccessViewAllNodesRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use DrupalRector\Tests\Rector\Deprecation\DeprecationBase; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { - DeprecationBase::addClass(ReplaceNodeAccessViewAllNodesRector::class, $rectorConfig, false); + DeprecationBase::addClass(ReplaceNodeAccessViewAllNodesRector::class, $rectorConfig, false, [ + new DrupalIntroducedVersionConfiguration('11.3.0'), + ]); }; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/fixture/basic.php.inc index 1872e91d1..938d8f0f7 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/fixture/basic.php.inc @@ -9,9 +9,9 @@ drupal_static_reset('other_function'); ----- getAccessControlHandler('node')->checkAllGrants(\Drupal::currentUser()); -\Drupal::entityTypeManager()->getAccessControlHandler('node')->checkAllGrants($account); -\Drupal::service('node.view_all_nodes_memory_cache')->deleteAll(); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => \Drupal::entityTypeManager()->getAccessControlHandler('node')->checkAllGrants(\Drupal::currentUser()), fn() => node_access_view_all_nodes()); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => \Drupal::entityTypeManager()->getAccessControlHandler('node')->checkAllGrants($account), fn() => node_access_view_all_nodes($account)); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => \Drupal::service('node.view_all_nodes_memory_cache')->deleteAll(), fn() => drupal_static_reset('node_access_view_all_nodes')); drupal_static_reset('other_function'); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/fixture/in_condition.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/fixture/in_condition.php.inc index b9c6da49f..4029d7c5d 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/fixture/in_condition.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/fixture/in_condition.php.inc @@ -15,12 +15,12 @@ if (node_access_view_all_nodes($account)) { getAccessControlHandler('node')->checkAllGrants(\Drupal::currentUser())) { +if (\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => \Drupal::entityTypeManager()->getAccessControlHandler('node')->checkAllGrants(\Drupal::currentUser()), fn() => node_access_view_all_nodes())) { do_something(); } // Result used in a condition with an explicit account -if (\Drupal::entityTypeManager()->getAccessControlHandler('node')->checkAllGrants($account)) { +if (\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => \Drupal::entityTypeManager()->getAccessControlHandler('node')->checkAllGrants($account), fn() => node_access_view_all_nodes($account))) { do_something_else(); } diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/config/configured_rule.php index ee8da52a4..5eab58cd1 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/config/configured_rule.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/config/configured_rule.php @@ -3,9 +3,12 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\ReplaceNodeModuleProceduralFunctionsRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use DrupalRector\Tests\Rector\Deprecation\DeprecationBase; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { - DeprecationBase::addClass(ReplaceNodeModuleProceduralFunctionsRector::class, $rectorConfig, false); + DeprecationBase::addClass(ReplaceNodeModuleProceduralFunctionsRector::class, $rectorConfig, false, [ + new DrupalIntroducedVersionConfiguration('11.3.0'), + ]); }; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/fixture/basic.php.inc index 5dcc15b6d..8c3540908 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/fixture/basic.php.inc @@ -7,7 +7,7 @@ $label = node_get_type_label($node); ----- getBundleLabels('node'); -$label = $node->getBundleEntity()->label(); +$names = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => \Drupal::service('entity_type.bundle.info')->getBundleLabels('node'), fn() => node_type_get_names()); +$label = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => $node->getBundleEntity()->label(), fn() => node_get_type_label($node)); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/fixture/expression_positions.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/fixture/expression_positions.php.inc index 12431ebd0..9f95ec6d0 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/fixture/expression_positions.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/fixture/expression_positions.php.inc @@ -9,9 +9,9 @@ $label = node_get_type_label($this->getNode()); ----- getBundleLabels('node'); -if (\Drupal::service('entity_type.bundle.info')->getBundleLabels('node')) { +$names = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => \Drupal::service('entity_type.bundle.info')->getBundleLabels('node'), fn() => node_type_get_names()); +if (\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => \Drupal::service('entity_type.bundle.info')->getBundleLabels('node'), fn() => node_type_get_names())) { } -$label = $this->getNode()->getBundleEntity()->label(); +$label = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => $this->getNode()->getBundleEntity()->label(), fn() => node_get_type_label($this->getNode())); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/fixture/node_mass_update.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/fixture/node_mass_update.php.inc index 6158845aa..c4c11b4dc 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/fixture/node_mass_update.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/fixture/node_mass_update.php.inc @@ -7,7 +7,7 @@ node_mass_update($nids, $updates, 'en', TRUE, FALSE); ----- process($nids, $updates); -\Drupal::service(\Drupal\node\NodeBulkUpdate::class)->process($nids, $updates, 'en', TRUE, FALSE); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => \Drupal::service(\Drupal\node\NodeBulkUpdate::class)->process($nids, $updates), fn() => node_mass_update($nids, $updates)); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => \Drupal::service(\Drupal\node\NodeBulkUpdate::class)->process($nids, $updates, 'en', TRUE, FALSE), fn() => node_mass_update($nids, $updates, 'en', TRUE, FALSE)); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/config/configured_rule.php index d693bc3ec..a01db0678 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/config/configured_rule.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/config/configured_rule.php @@ -3,9 +3,12 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\ReplaceThemeGetSettingRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use DrupalRector\Tests\Rector\Deprecation\DeprecationBase; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { - DeprecationBase::addClass(ReplaceThemeGetSettingRector::class, $rectorConfig, false); + DeprecationBase::addClass(ReplaceThemeGetSettingRector::class, $rectorConfig, false, [ + new DrupalIntroducedVersionConfiguration('11.3.0'), + ]); }; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/fixture/basic.php.inc index 8631af0d5..08304351b 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/fixture/basic.php.inc @@ -8,8 +8,8 @@ $features = _system_default_theme_features(); ----- getSetting('logo.url'); -$fav = \Drupal::service(\Drupal\Core\Extension\ThemeSettingsProvider::class)->getSetting('favicon.url', 'claro'); -$features = \Drupal\Core\Extension\ThemeSettingsProvider::DEFAULT_THEME_FEATURES; +$logo = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => \Drupal::service(\Drupal\Core\Extension\ThemeSettingsProvider::class)->getSetting('logo.url'), fn() => theme_get_setting('logo.url')); +$fav = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => \Drupal::service(\Drupal\Core\Extension\ThemeSettingsProvider::class)->getSetting('favicon.url', 'claro'), fn() => theme_get_setting('favicon.url', 'claro')); +$features = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => \Drupal\Core\Extension\ThemeSettingsProvider::DEFAULT_THEME_FEATURES, fn() => _system_default_theme_features()); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/fixture/fqcn_prefix.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/fixture/fqcn_prefix.php.inc index 2036224c3..297b6d505 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/fixture/fqcn_prefix.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/fixture/fqcn_prefix.php.inc @@ -7,7 +7,7 @@ ----- getSetting('logo.url'); -\Drupal\Core\Extension\ThemeSettingsProvider::DEFAULT_THEME_FEATURES; +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => \Drupal::service(\Drupal\Core\Extension\ThemeSettingsProvider::class)->getSetting('logo.url'), fn() => \theme_get_setting('logo.url')); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => \Drupal\Core\Extension\ThemeSettingsProvider::DEFAULT_THEME_FEATURES, fn() => \_system_default_theme_features()); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/fixture/inline_usage.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/fixture/inline_usage.php.inc index 9d7c18329..660959374 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/fixture/inline_usage.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/fixture/inline_usage.php.inc @@ -10,10 +10,10 @@ $features = array_keys(_system_default_theme_features()); ----- getSetting('logo.use_default')) { - $url = \Drupal::service(\Drupal\Core\Extension\ThemeSettingsProvider::class)->getSetting('logo.url', $theme_name); +if (\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => \Drupal::service(\Drupal\Core\Extension\ThemeSettingsProvider::class)->getSetting('logo.use_default'), fn() => theme_get_setting('logo.use_default'))) { + $url = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => \Drupal::service(\Drupal\Core\Extension\ThemeSettingsProvider::class)->getSetting('logo.url', $theme_name), fn() => theme_get_setting('logo.url', $theme_name)); } -$features = array_keys(\Drupal\Core\Extension\ThemeSettingsProvider::DEFAULT_THEME_FEATURES); +$features = array_keys(\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => \Drupal\Core\Extension\ThemeSettingsProvider::DEFAULT_THEME_FEATURES, fn() => _system_default_theme_features())); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/fixture/variable_key.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/fixture/variable_key.php.inc index b1bda127a..69493f42e 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/fixture/variable_key.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/fixture/variable_key.php.inc @@ -9,7 +9,7 @@ $setting = theme_get_setting($setting_name, $theme); getSetting($setting_name); -$setting = \Drupal::service(\Drupal\Core\Extension\ThemeSettingsProvider::class)->getSetting($setting_name, $theme); +$setting = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => \Drupal::service(\Drupal\Core\Extension\ThemeSettingsProvider::class)->getSetting($setting_name), fn() => theme_get_setting($setting_name)); +$setting = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => \Drupal::service(\Drupal\Core\Extension\ThemeSettingsProvider::class)->getSetting($setting_name, $theme), fn() => theme_get_setting($setting_name, $theme)); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/config/configured_rule.php index f70815879..4f7e21ceb 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/config/configured_rule.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/config/configured_rule.php @@ -3,8 +3,12 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\ReplaceViewsProceduralFunctionsRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; +use DrupalRector\Tests\Rector\Deprecation\DeprecationBase; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { - $rectorConfig->rule(ReplaceViewsProceduralFunctionsRector::class); + DeprecationBase::addClass(ReplaceViewsProceduralFunctionsRector::class, $rectorConfig, false, [ + new DrupalIntroducedVersionConfiguration('11.4.0'), + ]); }; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/fixture/basic.php.inc index a97982db0..659d67a1b 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/fixture/basic.php.inc @@ -10,10 +10,10 @@ $result = views_get_view_result('my_view', 'page_1', 'arg1'); ----- status(); -!$view->status(); -$view->enable()->save(); -$view->disable()->save(); -$result = \Drupal\views\Views::getViewResult('my_view', 'page_1', 'arg1'); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => $view->status(), fn() => views_view_is_enabled($view)); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => !$view->status(), fn() => views_view_is_disabled($view)); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => $view->enable()->save(), fn() => views_enable_view($view)); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => $view->disable()->save(), fn() => views_disable_view($view)); +$result = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal\views\Views::getViewResult('my_view', 'page_1', 'arg1'), fn() => views_get_view_result('my_view', 'page_1', 'arg1')); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/fixture/expression_positions.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/fixture/expression_positions.php.inc index 8761c2325..3192f9b76 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/fixture/expression_positions.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/fixture/expression_positions.php.inc @@ -10,10 +10,10 @@ $result2 = views_get_view_result('archive', 'block_1'); ----- status()) { - $label = !$view->status() ? 'disabled' : 'enabled'; +if (\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => $view->status(), fn() => views_view_is_enabled($view))) { + $label = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => !$view->status(), fn() => views_view_is_disabled($view)) ? 'disabled' : 'enabled'; } -$result = \Drupal\views\Views::getViewResult('frontpage'); -$result2 = \Drupal\views\Views::getViewResult('archive', 'block_1'); +$result = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal\views\Views::getViewResult('frontpage'), fn() => views_get_view_result('frontpage')); +$result2 = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal\views\Views::getViewResult('archive', 'block_1'), fn() => views_get_view_result('archive', 'block_1')); ?> From bdf1c5253760b4aa31994367ae0b1c56e4a18d3a Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 7 May 2026 10:43:44 +0200 Subject: [PATCH 118/256] test(version-gating): add testAboveVersion/testBelowVersion to all BC-wrapped rectors Each rector test that uses DrupalIntroducedVersionConfiguration now has two explicit version scenarios: testAboveVersion (99.99.99 override, expects BC-wrapped output) and testBelowVersion (1.0.0 override, expects no transformation). A fixture-below-version/ directory holds the identity fixtures for the below-version path. --- .../ReplaceModuleHandlerGetNameRectorTest.php | 28 +++++++++++++-- .../fixture-below-version/basic.php.inc | 11 ++++++ .../ReplaceRebuildThemeDataRectorTest.php | 28 +++++++++++++-- .../fixture-below-version/basic.php.inc | 11 ++++++ .../SystemTimeZonesRectorTest.php | 28 +++++++++++++-- .../system_time_zones.php.inc | 25 +++++++++++++ .../WatchdogExceptionRectorTest.php | 28 +++++++++++++-- .../watchdog_exception.php.inc | 35 +++++++++++++++++++ .../ErrorCurrentErrorHandlerRectorTest.php | 28 +++++++++++++-- .../fixture-below-version/basic.php.inc | 13 +++++++ .../FileSystemBasenameToNativeRectorTest.php | 28 +++++++++++++-- .../fixture-below-version/basic.php.inc | 15 ++++++++ .../RemoveTrustDataCallRectorTest.php | 28 +++++++++++++-- .../fixture-below-version/basic.php.inc | 15 ++++++++ ...ntManagerGetCountNewCommentsRectorTest.php | 28 +++++++++++++-- .../fixture-below-version/basic.php.inc | 11 ++++++ .../ReplaceCommentUriRectorTest.php | 28 +++++++++++++-- .../fixture-below-version/basic.php.inc | 11 ++++++ ...eplaceDateTimeRangeConstantsRectorTest.php | 28 +++++++++++++-- .../fixture-below-version/basic.php.inc | 21 +++++++++++ .../ReplaceEditorLoadRectorTest.php | 28 +++++++++++++-- .../fixture-below-version/basic.php.inc | 13 +++++++ ...eplaceEntityOriginalPropertyRectorTest.php | 28 +++++++++++++-- .../fixture-below-version/basic.php.inc | 17 +++++++++ ...ReplaceFileGetContentHeadersRectorTest.php | 28 +++++++++++++-- .../fixture-below-version/basic.php.inc | 13 +++++++ ...ceLocaleConfigBatchFunctionsRectorTest.php | 28 +++++++++++++-- .../fixture-below-version/basic.php.inc | 15 ++++++++ ...eplaceNodeAccessViewAllNodesRectorTest.php | 28 +++++++++++++-- .../fixture-below-version/basic.php.inc | 17 +++++++++ .../ReplaceNodeAddBodyFieldRectorTest.php | 28 +++++++++++++-- .../fixture-below-version/basic.php.inc | 13 +++++++ ...odeModuleProceduralFunctionsRectorTest.php | 28 +++++++++++++-- .../fixture-below-version/basic.php.inc | 13 +++++++ ...aceRecipeRunnerInstallModuleRectorTest.php | 28 +++++++++++++-- .../fixture-below-version/basic.php.inc | 17 +++++++++ .../ReplaceSessionManagerDeleteRectorTest.php | 28 +++++++++++++-- .../fixture-below-version/basic.php.inc | 11 ++++++ .../ReplaceThemeGetSettingRectorTest.php | 28 +++++++++++++-- .../fixture-below-version/basic.php.inc | 15 ++++++++ ...placeUserSessionNamePropertyRectorTest.php | 28 +++++++++++++-- .../fixture-below-version/basic.php.inc | 15 ++++++++ ...laceViewsProceduralFunctionsRectorTest.php | 29 +++++++++++++-- .../fixture-below-version/basic.php.inc | 19 ++++++++++ ...tPrefetchIteratorFetchColumnRectorTest.php | 28 +++++++++++++-- .../fixture-below-version/basic.php.inc | 23 ++++++++++++ .../UseEntityTypeHasIntegerIdRectorTest.php | 28 +++++++++++++-- .../fixture-below-version/basic.php.inc | 27 ++++++++++++++ .../ViewsPluginHandlerManagerRectorTest.php | 28 +++++++++++++-- .../fixture-below-version/basic.php.inc | 19 ++++++++++ 50 files changed, 1066 insertions(+), 50 deletions(-) create mode 100644 tests/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/fixture-below-version/system_time_zones.php.inc create mode 100644 tests/src/Drupal10/Rector/Deprecation/WatchdogExceptionRector/fixture-below-version/watchdog_exception.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/fixture-below-version/basic.php.inc diff --git a/tests/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector/ReplaceModuleHandlerGetNameRectorTest.php b/tests/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector/ReplaceModuleHandlerGetNameRectorTest.php index a1e10f8c8..544abf603 100644 --- a/tests/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector/ReplaceModuleHandlerGetNameRectorTest.php +++ b/tests/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector/ReplaceModuleHandlerGetNameRectorTest.php @@ -4,14 +4,20 @@ namespace DrupalRector\Tests\Drupal10\Rector\Deprecation\ReplaceModuleHandlerGetNameRector; +use DrupalRector\Rector\AbstractDrupalCoreRector; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ReplaceModuleHandlerGetNameRectorTest extends AbstractRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] - public function test(string $filePath): void + public function testAboveVersion(string $filePath): void { - $this->doTestFile($filePath); + AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } } /** @@ -22,6 +28,24 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } +#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] +public function testBelowVersion(string $filePath): void +{ + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } +} + +/** + * @return \Iterator<> + */ +public static function provideDataBelowVersion(): \Iterator +{ + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); +} public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector/fixture-below-version/basic.php.inc b/tests/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector/fixture-below-version/basic.php.inc new file mode 100644 index 000000000..24b3aa508 --- /dev/null +++ b/tests/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector/fixture-below-version/basic.php.inc @@ -0,0 +1,11 @@ +getName('mymodule'); +?> +----- +getName('mymodule'); +?> diff --git a/tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/ReplaceRebuildThemeDataRectorTest.php b/tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/ReplaceRebuildThemeDataRectorTest.php index e89c7860c..f0be6661a 100644 --- a/tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/ReplaceRebuildThemeDataRectorTest.php +++ b/tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/ReplaceRebuildThemeDataRectorTest.php @@ -4,14 +4,20 @@ namespace DrupalRector\Tests\Drupal10\Rector\Deprecation\ReplaceRebuildThemeDataRector; +use DrupalRector\Rector\AbstractDrupalCoreRector; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ReplaceRebuildThemeDataRectorTest extends AbstractRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] - public function test(string $filePath): void + public function testAboveVersion(string $filePath): void { - $this->doTestFile($filePath); + AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } } /** @@ -22,6 +28,24 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } +#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] +public function testBelowVersion(string $filePath): void +{ + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } +} + +/** + * @return \Iterator<> + */ +public static function provideDataBelowVersion(): \Iterator +{ + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); +} public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/fixture-below-version/basic.php.inc b/tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/fixture-below-version/basic.php.inc new file mode 100644 index 000000000..807b9b1e4 --- /dev/null +++ b/tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/fixture-below-version/basic.php.inc @@ -0,0 +1,11 @@ +rebuildThemeData(); +?> +----- +rebuildThemeData(); +?> diff --git a/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/SystemTimeZonesRectorTest.php b/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/SystemTimeZonesRectorTest.php index a655a8458..02fb4feda 100644 --- a/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/SystemTimeZonesRectorTest.php +++ b/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/SystemTimeZonesRectorTest.php @@ -5,15 +5,21 @@ namespace DrupalRector\Tests\Drupal10\Rector\Deprecation\SystemTimeZonesRector; use Iterator; +use DrupalRector\Rector\AbstractDrupalCoreRector; use Rector\Testing\PHPUnit\AbstractRectorTestCase; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class SystemTimeZonesRectorTest extends AbstractRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] - public function test(string $filePath): void + public function testAboveVersion(string $filePath): void { - $this->doTestFile($filePath); + AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } } /** @@ -24,6 +30,24 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } +#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] +public function testBelowVersion(string $filePath): void +{ + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } +} + +/** + * @return \Iterator<> + */ +public static function provideDataBelowVersion(): \Iterator +{ + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); +} public function provideConfigFilePath(): string { // must be implemented diff --git a/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/fixture-below-version/system_time_zones.php.inc b/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/fixture-below-version/system_time_zones.php.inc new file mode 100644 index 000000000..0825c7b22 --- /dev/null +++ b/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/fixture-below-version/system_time_zones.php.inc @@ -0,0 +1,25 @@ + +----- + diff --git a/tests/src/Drupal10/Rector/Deprecation/WatchdogExceptionRector/WatchdogExceptionRectorTest.php b/tests/src/Drupal10/Rector/Deprecation/WatchdogExceptionRector/WatchdogExceptionRectorTest.php index 66cfad5e5..2e1489fdb 100644 --- a/tests/src/Drupal10/Rector/Deprecation/WatchdogExceptionRector/WatchdogExceptionRectorTest.php +++ b/tests/src/Drupal10/Rector/Deprecation/WatchdogExceptionRector/WatchdogExceptionRectorTest.php @@ -5,15 +5,21 @@ namespace DrupalRector\Tests\Drupal10\Rector\Deprecation\WatchdogExceptionRector; use Iterator; +use DrupalRector\Rector\AbstractDrupalCoreRector; use Rector\Testing\PHPUnit\AbstractRectorTestCase; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class WatchdogExceptionRectorTest extends AbstractRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] - public function test(string $filePath): void + public function testAboveVersion(string $filePath): void { - $this->doTestFile($filePath); + AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } } /** @@ -24,6 +30,24 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } +#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] +public function testBelowVersion(string $filePath): void +{ + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } +} + +/** + * @return \Iterator<> + */ +public static function provideDataBelowVersion(): \Iterator +{ + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); +} public function provideConfigFilePath(): string { // must be implemented diff --git a/tests/src/Drupal10/Rector/Deprecation/WatchdogExceptionRector/fixture-below-version/watchdog_exception.php.inc b/tests/src/Drupal10/Rector/Deprecation/WatchdogExceptionRector/fixture-below-version/watchdog_exception.php.inc new file mode 100644 index 000000000..032e9d22f --- /dev/null +++ b/tests/src/Drupal10/Rector/Deprecation/WatchdogExceptionRector/fixture-below-version/watchdog_exception.php.inc @@ -0,0 +1,35 @@ + 'bar'], RfcLogLevel::CRITICAL, 'http://example.com'); + + watchdog_exception('update', $exception, 'My custom message @foo', ['@foo' => 'bar']); + + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '10.1.0', fn() => \Drupal\Core\Utility\Error::logException(\Drupal::logger('update'), $exception), fn() => watchdog_exception('update', $exception)); +} +?> +----- + 'bar'], RfcLogLevel::CRITICAL, 'http://example.com'); + + watchdog_exception('update', $exception, 'My custom message @foo', ['@foo' => 'bar']); + + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '10.1.0', fn() => \Drupal\Core\Utility\Error::logException(\Drupal::logger('update'), $exception), fn() => watchdog_exception('update', $exception)); +} +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/ErrorCurrentErrorHandlerRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/ErrorCurrentErrorHandlerRectorTest.php index f264455a3..4a88216f3 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/ErrorCurrentErrorHandlerRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/ErrorCurrentErrorHandlerRectorTest.php @@ -4,14 +4,20 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ErrorCurrentErrorHandlerRector; +use DrupalRector\Rector\AbstractDrupalCoreRector; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ErrorCurrentErrorHandlerRectorTest extends AbstractRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] - public function test(string $filePath): void + public function testAboveVersion(string $filePath): void { - $this->doTestFile($filePath); + AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } } /** @@ -22,6 +28,24 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } +#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] +public function testBelowVersion(string $filePath): void +{ + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } +} + +/** + * @return \Iterator<> + */ +public static function provideDataBelowVersion(): \Iterator +{ + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); +} public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/fixture-below-version/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/fixture-below-version/basic.php.inc new file mode 100644 index 000000000..da023a90f --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/fixture-below-version/basic.php.inc @@ -0,0 +1,13 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/FileSystemBasenameToNativeRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/FileSystemBasenameToNativeRectorTest.php index b45137f98..6a33ce464 100644 --- a/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/FileSystemBasenameToNativeRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/FileSystemBasenameToNativeRectorTest.php @@ -4,14 +4,20 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\FileSystemBasenameToNativeRector; +use DrupalRector\Rector\AbstractDrupalCoreRector; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class FileSystemBasenameToNativeRectorTest extends AbstractRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] - public function test(string $filePath): void + public function testAboveVersion(string $filePath): void { - $this->doTestFile($filePath); + AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } } /** @@ -22,6 +28,24 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } +#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] +public function testBelowVersion(string $filePath): void +{ + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } +} + +/** + * @return \Iterator<> + */ +public static function provideDataBelowVersion(): \Iterator +{ + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); +} public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/fixture-below-version/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/fixture-below-version/basic.php.inc new file mode 100644 index 000000000..fcb7a731f --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/fixture-below-version/basic.php.inc @@ -0,0 +1,15 @@ +basename($uri, '.txt'); +$noop = $untyped->basename($uri, '.txt'); + +?> +----- +basename($uri, '.txt'); +$noop = $untyped->basename($uri, '.txt'); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/RemoveTrustDataCallRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/RemoveTrustDataCallRectorTest.php index b10b9c176..8d8df27a9 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/RemoveTrustDataCallRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/RemoveTrustDataCallRectorTest.php @@ -4,14 +4,20 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\RemoveTrustDataCallRector; +use DrupalRector\Rector\AbstractDrupalCoreRector; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class RemoveTrustDataCallRectorTest extends AbstractRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] - public function test(string $filePath): void + public function testAboveVersion(string $filePath): void { - $this->doTestFile($filePath); + AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } } /** @@ -22,6 +28,24 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } +#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] +public function testBelowVersion(string $filePath): void +{ + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } +} + +/** + * @return \Iterator<> + */ +public static function provideDataBelowVersion(): \Iterator +{ + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); +} public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/fixture-below-version/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/fixture-below-version/basic.php.inc new file mode 100644 index 000000000..bba0c4275 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/fixture-below-version/basic.php.inc @@ -0,0 +1,15 @@ +trustData()->save(); +$other->someMethod(); + +?> +----- +trustData()->save(); +$other->someMethod(); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/ReplaceCommentManagerGetCountNewCommentsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/ReplaceCommentManagerGetCountNewCommentsRectorTest.php index 3a74ab5e9..3e355c44b 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/ReplaceCommentManagerGetCountNewCommentsRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/ReplaceCommentManagerGetCountNewCommentsRectorTest.php @@ -4,14 +4,20 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceCommentManagerGetCountNewCommentsRector; +use DrupalRector\Rector\AbstractDrupalCoreRector; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ReplaceCommentManagerGetCountNewCommentsRectorTest extends AbstractRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] - public function test(string $filePath): void + public function testAboveVersion(string $filePath): void { - $this->doTestFile($filePath); + AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } } /** @@ -22,6 +28,24 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } +#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] +public function testBelowVersion(string $filePath): void +{ + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } +} + +/** + * @return \Iterator<> + */ +public static function provideDataBelowVersion(): \Iterator +{ + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); +} public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/fixture-below-version/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/fixture-below-version/basic.php.inc new file mode 100644 index 000000000..52e38298d --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/fixture-below-version/basic.php.inc @@ -0,0 +1,11 @@ +getCountNewComments($entity); +?> +----- +getCountNewComments($entity); +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/ReplaceCommentUriRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/ReplaceCommentUriRectorTest.php index 8dfe5d260..134e710f3 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/ReplaceCommentUriRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/ReplaceCommentUriRectorTest.php @@ -4,14 +4,20 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceCommentUriRector; +use DrupalRector\Rector\AbstractDrupalCoreRector; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ReplaceCommentUriRectorTest extends AbstractRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] - public function test(string $filePath): void + public function testAboveVersion(string $filePath): void { - $this->doTestFile($filePath); + AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } } /** @@ -22,6 +28,24 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } +#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] +public function testBelowVersion(string $filePath): void +{ + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } +} + +/** + * @return \Iterator<> + */ +public static function provideDataBelowVersion(): \Iterator +{ + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); +} public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture-below-version/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture-below-version/basic.php.inc new file mode 100644 index 000000000..270de8010 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture-below-version/basic.php.inc @@ -0,0 +1,11 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/ReplaceDateTimeRangeConstantsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/ReplaceDateTimeRangeConstantsRectorTest.php index 1dd8cf4d7..9b72df6f4 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/ReplaceDateTimeRangeConstantsRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/ReplaceDateTimeRangeConstantsRectorTest.php @@ -4,14 +4,20 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceDateTimeRangeConstantsRector; +use DrupalRector\Rector\AbstractDrupalCoreRector; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ReplaceDateTimeRangeConstantsRectorTest extends AbstractRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] - public function test(string $filePath): void + public function testAboveVersion(string $filePath): void { - $this->doTestFile($filePath); + AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } } /** @@ -22,6 +28,24 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } +#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] +public function testBelowVersion(string $filePath): void +{ + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } +} + +/** + * @return \Iterator<> + */ +public static function provideDataBelowVersion(): \Iterator +{ + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); +} public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/fixture-below-version/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/fixture-below-version/basic.php.inc new file mode 100644 index 000000000..efe17eb6b --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/fixture-below-version/basic.php.inc @@ -0,0 +1,21 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/ReplaceEditorLoadRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/ReplaceEditorLoadRectorTest.php index 6be474c9d..bffadf3ce 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/ReplaceEditorLoadRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/ReplaceEditorLoadRectorTest.php @@ -4,14 +4,20 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceEditorLoadRector; +use DrupalRector\Rector\AbstractDrupalCoreRector; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ReplaceEditorLoadRectorTest extends AbstractRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] - public function test(string $filePath): void + public function testAboveVersion(string $filePath): void { - $this->doTestFile($filePath); + AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } } /** @@ -22,6 +28,24 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } +#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] +public function testBelowVersion(string $filePath): void +{ + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } +} + +/** + * @return \Iterator<> + */ +public static function provideDataBelowVersion(): \Iterator +{ + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); +} public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/fixture-below-version/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/fixture-below-version/basic.php.inc new file mode 100644 index 000000000..92de1176a --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/fixture-below-version/basic.php.inc @@ -0,0 +1,13 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/ReplaceEntityOriginalPropertyRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/ReplaceEntityOriginalPropertyRectorTest.php index 29904b1e4..cd8dd895b 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/ReplaceEntityOriginalPropertyRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/ReplaceEntityOriginalPropertyRectorTest.php @@ -4,14 +4,20 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceEntityOriginalPropertyRector; +use DrupalRector\Rector\AbstractDrupalCoreRector; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ReplaceEntityOriginalPropertyRectorTest extends AbstractRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] - public function test(string $filePath): void + public function testAboveVersion(string $filePath): void { - $this->doTestFile($filePath); + AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } } /** @@ -22,6 +28,24 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } +#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] +public function testBelowVersion(string $filePath): void +{ + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } +} + +/** + * @return \Iterator<> + */ +public static function provideDataBelowVersion(): \Iterator +{ + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); +} public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture-below-version/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture-below-version/basic.php.inc new file mode 100644 index 000000000..fee9f4846 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/fixture-below-version/basic.php.inc @@ -0,0 +1,17 @@ +original; +$entity->original = $unchanged; +$field = $entity->other_property; + +?> +----- +original; +$entity->original = $unchanged; +$field = $entity->other_property; + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/ReplaceFileGetContentHeadersRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/ReplaceFileGetContentHeadersRectorTest.php index 037a5eb98..48cb10e5a 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/ReplaceFileGetContentHeadersRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/ReplaceFileGetContentHeadersRectorTest.php @@ -4,14 +4,20 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceFileGetContentHeadersRector; +use DrupalRector\Rector\AbstractDrupalCoreRector; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ReplaceFileGetContentHeadersRectorTest extends AbstractRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] - public function test(string $filePath): void + public function testAboveVersion(string $filePath): void { - $this->doTestFile($filePath); + AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } } /** @@ -22,6 +28,24 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } +#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] +public function testBelowVersion(string $filePath): void +{ + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } +} + +/** + * @return \Iterator<> + */ +public static function provideDataBelowVersion(): \Iterator +{ + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); +} public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture-below-version/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture-below-version/basic.php.inc new file mode 100644 index 000000000..6570d9034 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture-below-version/basic.php.inc @@ -0,0 +1,13 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/ReplaceLocaleConfigBatchFunctionsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/ReplaceLocaleConfigBatchFunctionsRectorTest.php index 5ee6c9e13..5310b8b6b 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/ReplaceLocaleConfigBatchFunctionsRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/ReplaceLocaleConfigBatchFunctionsRectorTest.php @@ -4,14 +4,20 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceLocaleConfigBatchFunctionsRector; +use DrupalRector\Rector\AbstractDrupalCoreRector; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ReplaceLocaleConfigBatchFunctionsRectorTest extends AbstractRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] - public function test(string $filePath): void + public function testAboveVersion(string $filePath): void { - $this->doTestFile($filePath); + AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } } /** @@ -22,6 +28,24 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } +#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] +public function testBelowVersion(string $filePath): void +{ + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } +} + +/** + * @return \Iterator<> + */ +public static function provideDataBelowVersion(): \Iterator +{ + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); +} public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/fixture-below-version/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/fixture-below-version/basic.php.inc new file mode 100644 index 000000000..772500c33 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/fixture-below-version/basic.php.inc @@ -0,0 +1,15 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/ReplaceNodeAccessViewAllNodesRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/ReplaceNodeAccessViewAllNodesRectorTest.php index ca3e90a8c..da4e9faab 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/ReplaceNodeAccessViewAllNodesRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/ReplaceNodeAccessViewAllNodesRectorTest.php @@ -4,14 +4,20 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceNodeAccessViewAllNodesRector; +use DrupalRector\Rector\AbstractDrupalCoreRector; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ReplaceNodeAccessViewAllNodesRectorTest extends AbstractRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] - public function test(string $filePath): void + public function testAboveVersion(string $filePath): void { - $this->doTestFile($filePath); + AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } } /** @@ -22,6 +28,24 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } +#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] +public function testBelowVersion(string $filePath): void +{ + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } +} + +/** + * @return \Iterator<> + */ +public static function provideDataBelowVersion(): \Iterator +{ + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); +} public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/fixture-below-version/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/fixture-below-version/basic.php.inc new file mode 100644 index 000000000..6a4b21a0b --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/fixture-below-version/basic.php.inc @@ -0,0 +1,17 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/ReplaceNodeAddBodyFieldRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/ReplaceNodeAddBodyFieldRectorTest.php index 810c26f22..21418d0fc 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/ReplaceNodeAddBodyFieldRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/ReplaceNodeAddBodyFieldRectorTest.php @@ -4,14 +4,20 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceNodeAddBodyFieldRector; +use DrupalRector\Rector\AbstractDrupalCoreRector; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ReplaceNodeAddBodyFieldRectorTest extends AbstractRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] - public function test(string $filePath): void + public function testAboveVersion(string $filePath): void { - $this->doTestFile($filePath); + AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } } /** @@ -22,6 +28,24 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } +#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] +public function testBelowVersion(string $filePath): void +{ + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } +} + +/** + * @return \Iterator<> + */ +public static function provideDataBelowVersion(): \Iterator +{ + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); +} public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/fixture-below-version/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/fixture-below-version/basic.php.inc new file mode 100644 index 000000000..ddb448c0e --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/fixture-below-version/basic.php.inc @@ -0,0 +1,13 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/ReplaceNodeModuleProceduralFunctionsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/ReplaceNodeModuleProceduralFunctionsRectorTest.php index 573527971..54479c55f 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/ReplaceNodeModuleProceduralFunctionsRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/ReplaceNodeModuleProceduralFunctionsRectorTest.php @@ -4,14 +4,20 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceNodeModuleProceduralFunctionsRector; +use DrupalRector\Rector\AbstractDrupalCoreRector; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ReplaceNodeModuleProceduralFunctionsRectorTest extends AbstractRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] - public function test(string $filePath): void + public function testAboveVersion(string $filePath): void { - $this->doTestFile($filePath); + AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } } /** @@ -22,6 +28,24 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } +#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] +public function testBelowVersion(string $filePath): void +{ + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } +} + +/** + * @return \Iterator<> + */ +public static function provideDataBelowVersion(): \Iterator +{ + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); +} public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/fixture-below-version/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/fixture-below-version/basic.php.inc new file mode 100644 index 000000000..dddb75ee3 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/fixture-below-version/basic.php.inc @@ -0,0 +1,13 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/ReplaceRecipeRunnerInstallModuleRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/ReplaceRecipeRunnerInstallModuleRectorTest.php index 1b59b97e1..879f66fd0 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/ReplaceRecipeRunnerInstallModuleRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/ReplaceRecipeRunnerInstallModuleRectorTest.php @@ -4,14 +4,20 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceRecipeRunnerInstallModuleRector; +use DrupalRector\Rector\AbstractDrupalCoreRector; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ReplaceRecipeRunnerInstallModuleRectorTest extends AbstractRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] - public function test(string $filePath): void + public function testAboveVersion(string $filePath): void { - $this->doTestFile($filePath); + AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } } /** @@ -22,6 +28,24 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } +#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] +public function testBelowVersion(string $filePath): void +{ + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } +} + +/** + * @return \Iterator<> + */ +public static function provideDataBelowVersion(): \Iterator +{ + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); +} public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/fixture-below-version/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/fixture-below-version/basic.php.inc new file mode 100644 index 000000000..83b53183c --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/fixture-below-version/basic.php.inc @@ -0,0 +1,17 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/ReplaceSessionManagerDeleteRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/ReplaceSessionManagerDeleteRectorTest.php index 611e0f102..357fde1aa 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/ReplaceSessionManagerDeleteRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/ReplaceSessionManagerDeleteRectorTest.php @@ -4,14 +4,20 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceSessionManagerDeleteRector; +use DrupalRector\Rector\AbstractDrupalCoreRector; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ReplaceSessionManagerDeleteRectorTest extends AbstractRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] - public function test(string $filePath): void + public function testAboveVersion(string $filePath): void { - $this->doTestFile($filePath); + AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } } /** @@ -22,6 +28,24 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } +#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] +public function testBelowVersion(string $filePath): void +{ + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } +} + +/** + * @return \Iterator<> + */ +public static function provideDataBelowVersion(): \Iterator +{ + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); +} public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/fixture-below-version/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/fixture-below-version/basic.php.inc new file mode 100644 index 000000000..f0f4cdb87 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/fixture-below-version/basic.php.inc @@ -0,0 +1,11 @@ +delete($uid); +?> +----- +delete($uid); +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/ReplaceThemeGetSettingRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/ReplaceThemeGetSettingRectorTest.php index 941b92675..3d9e9c157 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/ReplaceThemeGetSettingRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/ReplaceThemeGetSettingRectorTest.php @@ -4,14 +4,20 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceThemeGetSettingRector; +use DrupalRector\Rector\AbstractDrupalCoreRector; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ReplaceThemeGetSettingRectorTest extends AbstractRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] - public function test(string $filePath): void + public function testAboveVersion(string $filePath): void { - $this->doTestFile($filePath); + AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } } /** @@ -22,6 +28,24 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } +#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] +public function testBelowVersion(string $filePath): void +{ + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } +} + +/** + * @return \Iterator<> + */ +public static function provideDataBelowVersion(): \Iterator +{ + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); +} public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/fixture-below-version/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/fixture-below-version/basic.php.inc new file mode 100644 index 000000000..7612590dc --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/fixture-below-version/basic.php.inc @@ -0,0 +1,15 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/ReplaceUserSessionNamePropertyRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/ReplaceUserSessionNamePropertyRectorTest.php index 34f311691..45f0f6f26 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/ReplaceUserSessionNamePropertyRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/ReplaceUserSessionNamePropertyRectorTest.php @@ -4,14 +4,20 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceUserSessionNamePropertyRector; +use DrupalRector\Rector\AbstractDrupalCoreRector; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ReplaceUserSessionNamePropertyRectorTest extends AbstractRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] - public function test(string $filePath): void + public function testAboveVersion(string $filePath): void { - $this->doTestFile($filePath); + AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } } /** @@ -22,6 +28,24 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } +#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] +public function testBelowVersion(string $filePath): void +{ + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } +} + +/** + * @return \Iterator<> + */ +public static function provideDataBelowVersion(): \Iterator +{ + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); +} public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/fixture-below-version/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/fixture-below-version/basic.php.inc new file mode 100644 index 000000000..7b913d4a3 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/fixture-below-version/basic.php.inc @@ -0,0 +1,15 @@ +name; +$other = $untyped->name; + +?> +----- +name; +$other = $untyped->name; + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/ReplaceViewsProceduralFunctionsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/ReplaceViewsProceduralFunctionsRectorTest.php index 658b9d71a..9947b6c89 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/ReplaceViewsProceduralFunctionsRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/ReplaceViewsProceduralFunctionsRectorTest.php @@ -4,14 +4,20 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceViewsProceduralFunctionsRector; +use DrupalRector\Rector\AbstractDrupalCoreRector; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ReplaceViewsProceduralFunctionsRectorTest extends AbstractRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] - public function test(string $filePath): void + public function testAboveVersion(string $filePath): void { - $this->doTestFile($filePath); + AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } } /** @@ -22,6 +28,25 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + AbstractDrupalCoreRector::setVersionOverride('11.3.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); + } + public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/fixture-below-version/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/fixture-below-version/basic.php.inc new file mode 100644 index 000000000..464d394f6 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/fixture-below-version/basic.php.inc @@ -0,0 +1,19 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/StatementPrefetchIteratorFetchColumnRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/StatementPrefetchIteratorFetchColumnRectorTest.php index d26aa82f4..aa8d2532d 100644 --- a/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/StatementPrefetchIteratorFetchColumnRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/StatementPrefetchIteratorFetchColumnRectorTest.php @@ -4,14 +4,20 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\StatementPrefetchIteratorFetchColumnRector; +use DrupalRector\Rector\AbstractDrupalCoreRector; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class StatementPrefetchIteratorFetchColumnRectorTest extends AbstractRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] - public function test(string $filePath): void + public function testAboveVersion(string $filePath): void { - $this->doTestFile($filePath); + AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } } /** @@ -22,6 +28,24 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } +#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] +public function testBelowVersion(string $filePath): void +{ + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } +} + +/** + * @return \Iterator<> + */ +public static function provideDataBelowVersion(): \Iterator +{ + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); +} public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture-below-version/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture-below-version/basic.php.inc new file mode 100644 index 000000000..9899cf3ed --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/fixture-below-version/basic.php.inc @@ -0,0 +1,23 @@ +fetchColumn(0); + $other = $this->clientStatement->fetchColumn(0); + } +} +?> +----- +fetchColumn(0); + $other = $this->clientStatement->fetchColumn(0); + } +} +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/UseEntityTypeHasIntegerIdRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/UseEntityTypeHasIntegerIdRectorTest.php index 1691f779b..8edb3143c 100644 --- a/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/UseEntityTypeHasIntegerIdRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/UseEntityTypeHasIntegerIdRectorTest.php @@ -4,14 +4,20 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\UseEntityTypeHasIntegerIdRector; +use DrupalRector\Rector\AbstractDrupalCoreRector; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class UseEntityTypeHasIntegerIdRectorTest extends AbstractRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] - public function test(string $filePath): void + public function testAboveVersion(string $filePath): void { - $this->doTestFile($filePath); + AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } } /** @@ -22,6 +28,24 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } +#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] +public function testBelowVersion(string $filePath): void +{ + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } +} + +/** + * @return \Iterator<> + */ +public static function provideDataBelowVersion(): \Iterator +{ + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); +} public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture-below-version/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture-below-version/basic.php.inc new file mode 100644 index 000000000..dc3e1501c --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/fixture-below-version/basic.php.inc @@ -0,0 +1,27 @@ +getEntityTypeIdKeyType($entity_type) === 'integer') { + $result = 'integer'; + } + } +} + +?> +----- +getEntityTypeIdKeyType($entity_type) === 'integer') { + $result = 'integer'; + } + } +} + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/ViewsPluginHandlerManagerRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/ViewsPluginHandlerManagerRectorTest.php index ed855a537..5a4048ea9 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/ViewsPluginHandlerManagerRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/ViewsPluginHandlerManagerRectorTest.php @@ -4,14 +4,20 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ViewsPluginHandlerManagerRector; +use DrupalRector\Rector\AbstractDrupalCoreRector; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ViewsPluginHandlerManagerRectorTest extends AbstractRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] - public function test(string $filePath): void + public function testAboveVersion(string $filePath): void { - $this->doTestFile($filePath); + AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } } /** @@ -22,6 +28,24 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } +#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] +public function testBelowVersion(string $filePath): void +{ + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } +} + +/** + * @return \Iterator<> + */ +public static function provideDataBelowVersion(): \Iterator +{ + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); +} public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/fixture-below-version/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/fixture-below-version/basic.php.inc new file mode 100644 index 000000000..520acd19b --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/fixture-below-version/basic.php.inc @@ -0,0 +1,19 @@ + +----- + From aac0be94c9cf6d2b53edca42a0d4a3dad84c7026 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 8 May 2026 10:38:58 +0200 Subject: [PATCH 119/256] chore(tests): update test files to actually test 11.4 recotrs. Also remove group from one of the rectors since that hangs on one of the tests. --- scripts/setup-rector-test-d10.sh | 470 ------------------------------- scripts/setup-rector-test.sh | 63 ++++- 2 files changed, 54 insertions(+), 479 deletions(-) delete mode 100755 scripts/setup-rector-test-d10.sh diff --git a/scripts/setup-rector-test-d10.sh b/scripts/setup-rector-test-d10.sh deleted file mode 100755 index def78216b..000000000 --- a/scripts/setup-rector-test-d10.sh +++ /dev/null @@ -1,470 +0,0 @@ -#!/usr/bin/env bash -# Sets up a Drupal 11 DDEV project with contrib modules that exercise all new -# rectors, wires in the local drupal-rector branch, and runs rector so you can -# review the resulting diff. -# -# Usage: ./scripts/setup-rector-test.sh [project-name] -# Default project name: drupal-rector-test -# Default location: ../../ (sibling of the rector repo) - -set -euo pipefail - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -RECTOR_REPO="$(cd "$SCRIPT_DIR/.." && pwd)" -RECTOR_BRANCH="feature/digest-rectors" - -PROJECT_NAME="${1:-drupal-rector-test-d10}" -# Two levels up from this script (scripts/ → repo-root → parent) then the project name. -TARGET_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)/$PROJECT_NAME" - -echo "==> Project directory : $TARGET_DIR" -echo "==> drupal-rector repo : $RECTOR_REPO ($RECTOR_BRANCH)" -echo "" - -# --------------------------------------------------------------------------- -# 1. Create project directory and configure DDEV -# --------------------------------------------------------------------------- -mkdir -p "$TARGET_DIR" -cd "$TARGET_DIR" - -echo "==> Configuring DDEV…" -ddev config \ - --project-type=drupal10 \ - --docroot=web \ - --project-name="$PROJECT_NAME" - -# Mount the local rector clone inside the DDEV container so the PATH -# composer repository works without pushing to GitHub first. -cat > .ddev/docker-compose.mounts.yaml << DOCKERCOMPOSE -services: - web: - volumes: - - "$RECTOR_REPO:/mnt/drupal-rector" -DOCKERCOMPOSE - -ddev start -y - -# --------------------------------------------------------------------------- -# 2. Scaffold Drupal 11 -# --------------------------------------------------------------------------- -echo "" -echo "==> Scaffolding Drupal 11 via composer create-project…" -ddev composer create-project "drupal/recommended-project:^10" . \ - --no-interaction \ - --stability dev - -# Pre-approve all composer plugins upfront so no interactive prompts appear -# during any subsequent require/update calls. -ddev composer config allow-plugins.tbachert/spi true - -ddev composer require drush/drush --no-interaction - -echo "" -echo "==> Installing Drupal site…" -ddev drush site:install --account-name=admin --account-pass=admin -y - -# --------------------------------------------------------------------------- -# 3. Wire in drupal-rector from the local clone -# --------------------------------------------------------------------------- -echo "" -echo "==> Wiring in drupal-rector (local clone via DDEV mount)…" - -# PATH repository — resolves to the mounted rector clone inside the container. -# Listed as the only source; no VCS fallback needed (and SSH keys aren't -# available inside DDEV containers anyway). -ddev composer config repositories.drupal-rector \ - '{"type":"path","url":"/mnt/drupal-rector","options":{"symlink":true}}' - -ddev composer require \ - "palantirnet/drupal-rector:dev-$RECTOR_BRANCH as 1.x-dev" \ - --no-interaction - -# --------------------------------------------------------------------------- -# 4. Require contrib modules (≥2 per rector where possible) -# See docs/contrib-modules-d11.md for the full coverage mapping. -# Note: 8 rectors have no testable D11 contrib module (see comments in test script). -# --------------------------------------------------------------------------- -echo "" -echo "==> Requiring contrib modules…" - -# Batch 1 — multi-rector modules (high-value) -ddev composer require --no-update \ - "drupal/acquia_contenthub:*" \ - "drupal/searchstax:*" \ - "drupal/ai_agents:*" \ - "drupal/commerce_invoice:*" \ - "drupal/custom_field:*" \ - "drupal/role_expire:*" \ - "drupal/views_dependent_filters:*" \ - "drupal/group:*" \ - "drupal/search_api:*" \ - "drupal/schemadotorg:*" \ - "drupal/smart_migrate_cli:*" \ - "drupal/metatag:*" \ - "drupal/external_entity:*" \ - "drupal/reassign_user_content:*" - -# Batch 2 — single-rector gap-fillers -ddev composer require --no-update \ - "drupal/tara:*" \ - "drupal/vani:*" \ - "drupal/association:*" \ - "drupal/tome:*" \ - "drupal/cmrf_form_processor:*" \ - "drupal/intl_date:*" \ - "drupal/responsive_preview:*" \ - "drupal/tmgmt:*" \ - "drupal/config_track:*" \ - "drupal/site_guardian:*" \ - "drupal/smart_date:*" \ - "drupal/vcp4dates:*" \ - "drupal/gdpr:*" \ - "drupal/ai_eca:*" \ - "drupal/gnode_request:*" \ - "drupal/migmag:*" \ - "drupal/sparql_entity_storage:*" \ - "drupal/views_advanced_cache:*" \ - "drupal/smart_sql_idmap:*" \ - "drupal/forum:*" \ - "drupal/history:*" \ - "drupal/addanother:*" \ - "drupal/quicktabs:*" \ - "drupal/entity_usage:*" \ - "drupal/media_auto_publication:*" \ - "drupal/migrate_tools:*" \ - "drupal/stage_file_proxy:^3.1" \ - "drupal/workflow_buttons:^1" \ - "drupal/optional_end_date:*" \ - "drupal/scheduler_field:*" \ - "drupal/mailsystem:*" \ - "drupal/webform:*" \ - "drupal/recipe_installer_kit:*" - -echo "" -echo "==> Running composer update to resolve all requirements…" -ddev composer update --no-interaction --with-all-dependencies - -# --------------------------------------------------------------------------- -# 5. Initialise git and commit the installed baseline -# (vendor/ and web/core/ excluded; web/modules/contrib/ tracked so -# rector changes show up in git diff) -# --------------------------------------------------------------------------- -echo "" -echo "==> Initialising git repository…" -if [ ! -d ".git" ]; then - git init -fi - -cat > .gitignore << 'GITIGNORE' -/vendor/ -/web/core/ -/web/sites/default/settings.php -/web/sites/default/services.yml -/web/sites/default/files/ -*.orig -GITIGNORE - -git add . -git commit -m "Install Drupal 11 + contrib modules for rector testing" - -# --------------------------------------------------------------------------- -# 6. Write rector.php -# --------------------------------------------------------------------------- -echo "" -echo "==> Writing rector.php…" -cat > rector.php << 'RECTOR' -withPaths([ - __DIR__ . '/web/modules/contrib', - ]) - ->withFileExtensions(['php', 'module', 'theme', 'install', 'profile', 'inc', 'engine']) - ->withSets([ - Drupal10SetList::DRUPAL_10, - Drupal11SetList::DRUPAL_11, - ]); -RECTOR - -git add rector.php - -# --------------------------------------------------------------------------- -# 7. Generate per-rector test script (run this inside ddev ssh) -# --------------------------------------------------------------------------- -mkdir -p scripts -cat > scripts/test-rectors.sh << 'TESTSCRIPT' -#!/usr/bin/env bash -# Per-rector test runner. Run this INSIDE the DDEV container: -# ddev ssh -# bash /var/www/html/scripts/test-rectors.sh [RectorName] -# -# With no argument: runs all rectors in sequence. -# With a rector class name: runs only that one rector. -# Output is tee'd to /var/www/html/rector-test.log - -set -euo pipefail -cd /var/www/html - -LOG=/var/www/html/rector-test.log -CONTRIB=web/modules/contrib -FILTER="${1:-}" - -run_test() { - local rector="$1" - shift - local mods=("$@") - - # Skip if a filter is set and doesn't match - if [ -n "$FILTER" ] && [ "$FILTER" != "$rector" ]; then - return - fi - - # Derive FQCN by checking which namespace the rector lives in - local fqcn - if [ -f "vendor/palantirnet/drupal-rector/src/Drupal11/Rector/Deprecation/${rector}.php" ]; then - fqcn="DrupalRector\\Drupal11\\Rector\\Deprecation\\${rector}" - else - fqcn="DrupalRector\\Drupal10\\Rector\\Deprecation\\${rector}" - fi - - # Resolve installed module directories - local paths=() - for mod in "${mods[@]}"; do - [ -d "$CONTRIB/$mod" ] && paths+=("$CONTRIB/$mod") - done - - echo "" | tee -a "$LOG" - echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" | tee -a "$LOG" - printf " %s\n" "$rector" | tee -a "$LOG" - echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" | tee -a "$LOG" - - if [ ${#paths[@]} -eq 0 ]; then - echo " SKIP — no modules installed for this rector" | tee -a "$LOG" - return - fi - - printf " Rector: %s\n" "$fqcn" | tee -a "$LOG" - printf " Modules: %s\n" "${paths[*]}" | tee -a "$LOG" - echo "" | tee -a "$LOG" - - timeout 30 vendor/bin/rector process "${paths[@]}" --only="$fqcn" --dry-run --clear-cache 2>&1 | tee -a "$LOG" || true - - echo "" | tee -a "$LOG" - git diff "${paths[@]}" | tee -a "$LOG" || true - - # Reset files so the next rector starts clean - git checkout -- "${paths[@]}" 2>/dev/null || true -} - -echo "Rector test run — $(date)" | tee "$LOG" -echo "Log: $LOG" | tee -a "$LOG" - -# ── Drupal 11 rectors ────────────────────────────────────────────────────── -run_test ErrorCurrentErrorHandlerRector - # No contrib usage: Error::currentErrorHandler() deprecated D11.3.0; devel 5.x already cleaned up, no other hits - -run_test FileSystemBasenameToNativeRector \ - stage_file_proxy - -run_test LoadAllIncludesRector \ - config_track schemadotorg - -run_test MigrateSqlGetMigrationPluginManagerRector \ - feeds_migrate migmag smart_sql_idmap - -run_test NodeStorageDeprecatedMethodsRector \ - workflow_buttons - -run_test PluginBaseIsConfigurableRector \ - metatag search_api - -run_test RemoveAutomatedCronSubmitHandlerRector - # No contrib usage: automated_cron_settings_submit deprecated D11.4.0, no contrib calls found - -run_test RemoveCacheExpireOverrideRector \ - cmrf_form_processor vcp4dates - -run_test RemoveHandlerBaseDefineExtraOptionsRector \ - views_dependent_filters - -run_test RemoveLinkWidgetValidateTitleElementRector - # No contrib usage: LinkWidget::validateTitleElement() deprecated D11.4.0, no contrib calls found - -run_test RemoveModuleHandlerAddModuleCallsRector \ - config_track - -run_test RemoveModuleHandlerDeprecatedMethodsRector - # No contrib usage: writeCache()/getHookInfo() on ModuleHandlerInterface not called in any D11 contrib module found - -run_test RemoveRootFromConvertDbUrlRector \ - smart_migrate_cli sparql_entity_storage - -run_test RemoveSetUriCallbackRector - # No contrib usage: $entityType->setUriCallback() not called in any D11 contrib module found - -run_test RemoveStateCacheSettingRector - # No contrib usage: $settings['state_cache'] pattern not found in any D11 contrib module; likely already gone from codebase - -run_test RemoveTrustDataCallRector \ - views_dependent_filters group - -run_test RemoveTwigNodeTransTagArgumentRector - # No contrib usage: TwigNodeTrans 6-arg constructor removed from core before D11 contrib caught up (version drift) - -run_test RemoveUpdaterPostInstallMethodsRector \ - group gnode_request - -run_test RemoveViewsRowCacheKeysRector \ - metatag views_advanced_cache - -run_test RenameStopProceduralHookScanRector - # No contrib usage: StopProceduralHookScan attribute deprecated D11.2.0, niche — no contrib usage found - -run_test ReplaceAlphadecimalToIntNullRector - # No contrib usage: alphadecimalToInt(null/'') — both values always returned 0, - # so this was only ever passed as a literal in custom code or tests. No D11 contrib - # module calls the function with a literal null or empty string. - -run_test ReplaceCommentManagerGetCountNewCommentsRector \ - forum history - -run_test ReplaceCommentUriRector - # No contrib usage: comment_uri() deprecated D11.3.0; Social 13.x already cleaned up (issue #3432522), no other D11 hits - -run_test ReplaceDateTimeRangeConstantsRector \ - optional_end_date scheduler_field - -run_test ReplaceEditorLoadRector - # No contrib usage: editor_load() deprecated D11; not called in any D11 contrib module found - -run_test ReplaceEntityOriginalPropertyRector \ - entity_usage media_auto_publication - -run_test ReplaceEntityReferenceRecursiveLimitRector - # No contrib usage: RECURSIVE_RENDER_LIMIT removed from core before D11; - # all D11-compatible modules either define their own constant or hardcode 20. - # custom_field/external_entity define the constant, they don't reference core's. - -run_test ReplaceFieldgroupToFieldsetRector \ - webform - -run_test ReplaceFileGetContentHeadersRector \ - commerce_invoice tmgmt - -run_test ReplaceLocaleConfigBatchFunctionsRector - # No contrib usage: locale_config_batch_* deprecated D11.1.0; all GitLab hits were bundled core copies, not contrib code - -run_test ReplaceModuleHandlerGetNameRector \ - mailsystem - -run_test ReplaceNodeAccessViewAllNodesRector - # No contrib usage: node_access_view_all_nodes() deprecated D11.3.0; no D11 contrib caller found (newly deprecated) - -run_test ReplaceNodeAddBodyFieldRector \ - tome ai_eca - -run_test ReplaceNodeModuleProceduralFunctionsRector \ - reassign_user_content addanother - -run_test ReplaceNodeSetPreviewModeRector \ - ai_agents responsive_preview - -run_test ReplacePdoFetchConstantsRector \ - acquia_contenthub gdpr - -run_test ReplaceRecipeRunnerInstallModuleRector \ - recipe_installer_kit - -run_test ReplaceSessionManagerDeleteRector - # role_expire confirmed caller at RoleExpireApiService.php:168 ($this->sessionManager->delete($uid)) - # but AbstractDrupalCoreRector version gate requires Drupal >= 11.4.0 — SessionManager::delete() - # was deprecated in 11.4.0 which is not yet released (latest stable: 11.3.x). - # Re-enable with "role_expire" once the test site runs Drupal 11.4.0+. - -run_test ReplaceSessionWritesWithRequestSessionRector - # No contrib usage: direct $_SESSION writes not present in any D11-compatible contrib module found - -run_test ReplaceSystemPerformanceGzipKeyRector - # No contrib usage: advagg (only known caller) declares "core_version_requirement: ^9.3 || ^10" — not D11-compatible - -run_test ReplaceThemeGetSettingRector \ - tara vani - -run_test ReplaceUserSessionNamePropertyRector - # No contrib usage: $userSession->name property access not present in any D11 contrib module found - -run_test ReplaceViewsProceduralFunctionsRector \ - custom_field quicktabs - -run_test StatementPrefetchIteratorFetchColumnRector - # No contrib usage: fetchColumn() removed at D10.0; all D11-compatible modules already resolved this - -run_test StripMigrationDependenciesExpandArgRector \ - migrate_tools - -run_test UseEntityTypeHasIntegerIdRector \ - commerce_invoice association - -run_test ViewsPluginHandlerManagerRector \ - searchstax search_api metatag - -# ── Drupal 10 rectors ────────────────────────────────────────────────────── -run_test ReplaceModuleHandlerGetNameRector \ - mailsystem - -run_test ReplaceRebuildThemeDataRector \ - site_guardian - -run_test ReplaceRequestTimeConstantRector - # No contrib usage: REQUEST_TIME constant usage already migrated in all D11-compatible modules found - -run_test SystemTimeZonesRector \ - intl_date smart_date - -echo "" | tee -a "$LOG" -echo "Done. Full log: $LOG" | tee -a "$LOG" -TESTSCRIPT - -chmod +x scripts/test-rectors.sh -git add rector.php scripts/test-rectors.sh -git commit -m "Add rector.php and per-rector test script" - -# --------------------------------------------------------------------------- -# 8. Print manual run instructions -# --------------------------------------------------------------------------- -echo "" -echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -echo " Setup complete." -echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -echo "" -echo " cd $TARGET_DIR && ddev ssh" -echo "" -echo " # Run all rectors, each against its own modules only:" -echo " bash /var/www/html/scripts/test-rectors.sh" -echo "" -echo " # Run a single rector:" -echo " bash /var/www/html/scripts/test-rectors.sh LoadAllIncludesRector" -echo "" -echo " # Log is written to: $TARGET_DIR/rector-test.log" -echo "" -echo " Site: run 'ddev launch' | Admin: admin / admin" -echo "" -echo " Coverage notes (see docs/contrib-modules-d11.md):" -echo " * 18 rectors skipped — pattern exhausted or no D11 contrib usage found" -echo " (ErrorCurrentErrorHandler, RemoveAutomatedCronSubmitHandler," -echo " RemoveLinkWidgetValidateTitleElement, RemoveModuleHandlerDeprecatedMethods," -echo " RemoveSetUriCallback, RemoveStateCacheSetting," -echo " RemoveTwigNodeTransTagArgument, RenameStopProceduralHookScan," -echo " ReplaceAlphadecimalToIntNull, ReplaceCommentUri, ReplaceEditorLoad," -echo " ReplaceEntityReferenceRecursiveLimit, ReplaceLocaleConfigBatchFunctions," -echo " ReplaceNodeAccessViewAllNodes, ReplaceRequestTimeConstant," -echo " ReplaceSessionWritesWithRequestSession, ReplaceSystemPerformanceGzipKey," -echo " ReplaceUserSessionNameProperty, StatementPrefetchIteratorFetchColumn)" -echo " * 1 rector skipped — version gate requires Drupal >= 11.4.0 (not yet released):" -echo " ReplaceSessionManagerDeleteRector (role_expire is valid test module; re-enable after upgrade)" diff --git a/scripts/setup-rector-test.sh b/scripts/setup-rector-test.sh index 257271604..a69dc556b 100755 --- a/scripts/setup-rector-test.sh +++ b/scripts/setup-rector-test.sh @@ -102,6 +102,7 @@ ddev composer require --no-update \ "drupal/smart_migrate_cli:*" \ "drupal/metatag:*" \ "drupal/external_entity:*" \ + "drupal/ckeditor5_premium_features:*" \ "drupal/reassign_user_content:*" # Batch 2 — single-rector gap-fillers @@ -144,6 +145,16 @@ echo "" echo "==> Running composer update to resolve all requirements…" ddev composer update --no-interaction --with-all-dependencies +# Upgrade to 11.x-dev so the Drupal 11.4 version gate in AbstractDrupalCoreRector +# is satisfied, enabling rectors like RemoveTrustDataCallRector and +# ReplaceSessionManagerDeleteRector to produce diffs. +echo "" +echo "==> Upgrading Drupal core to 11.x-dev (satisfies 11.4 version gates)…" +ddev composer require \ + 'drupal/core-recommended:11.x-dev' \ + 'drupal/core-composer-scaffold:11.x-dev' \ + --with-all-dependencies --no-interaction + # --------------------------------------------------------------------------- # 5. Initialise git and commit the installed baseline # (vendor/ and web/core/ excluded; web/modules/contrib/ tracked so @@ -213,8 +224,17 @@ cd /var/www/html LOG=/var/www/html/rector-test.log CONTRIB=web/modules/contrib +STASH=/tmp/rector_mod_stash FILTER="${1:-}" +# Restore any modules left in the stash from a previous crashed run +if [ -d "$STASH" ]; then + for _stashed in "$STASH"/*/; do + [ -d "$_stashed" ] && mv "$_stashed" "$CONTRIB/" + done + rmdir "$STASH" 2>/dev/null || true +fi + run_test() { local rector="$1" shift @@ -253,13 +273,41 @@ run_test() { printf " Modules: %s\n" "${paths[*]}" | tee -a "$LOG" echo "" | tee -a "$LOG" - timeout 30 vendor/bin/rector process "${paths[@]}" --only="$fqcn" --dry-run --clear-cache 2>&1 | tee -a "$LOG" || true + # Stash all modules not needed for this rector. PHPStan builds a type graph + # from every file it can reach via the autoloader; with 40+ contrib modules + # present it hits an infinite type-expansion loop on decorator patterns in + # group/. Isolating to only the required modules prevents this. + local hidden=() + mkdir -p "$STASH" + local modname needed m + for mod_dir in "$CONTRIB"/*/; do + [ -d "$mod_dir" ] || continue + modname="${mod_dir%/}" + modname="${modname##*/}" + needed=false + for m in "${mods[@]}"; do + [ "$m" = "$modname" ] && needed=true && break + done + if [ "$needed" = false ]; then + mv "$mod_dir" "$STASH/" + hidden+=("$modname") + fi + done + + rm -rf /tmp/rector_cached_files + timeout 60 vendor/bin/rector process "${paths[@]}" --only="$fqcn" --dry-run 2>&1 | tee -a "$LOG" || true echo "" | tee -a "$LOG" git diff "${paths[@]}" | tee -a "$LOG" || true # Reset files so the next rector starts clean git checkout -- "${paths[@]}" 2>/dev/null || true + + # Restore stashed modules + for modname in "${hidden[@]}"; do + mv "$STASH/$modname" "$CONTRIB/" + done + rmdir "$STASH" 2>/dev/null || true } echo "Rector test run — $(date)" | tee "$LOG" @@ -312,7 +360,7 @@ run_test RemoveStateCacheSettingRector # No contrib usage: $settings['state_cache'] pattern not found in any D11 contrib module; likely already gone from codebase run_test RemoveTrustDataCallRector \ - views_dependent_filters group + views_dependent_filters run_test RemoveTwigNodeTransTagArgumentRector # No contrib usage: TwigNodeTrans 6-arg constructor removed from core before D11 contrib caught up (version drift) @@ -341,6 +389,7 @@ run_test ReplaceDateTimeRangeConstantsRector \ optional_end_date scheduler_field run_test ReplaceEditorLoadRector + ckeditor5_premium_features # No contrib usage: editor_load() deprecated D11; not called in any D11 contrib module found run_test ReplaceEntityOriginalPropertyRector \ @@ -381,11 +430,8 @@ run_test ReplacePdoFetchConstantsRector \ run_test ReplaceRecipeRunnerInstallModuleRector \ recipe_installer_kit -run_test ReplaceSessionManagerDeleteRector - # role_expire confirmed caller at RoleExpireApiService.php:168 ($this->sessionManager->delete($uid)) - # but AbstractDrupalCoreRector version gate requires Drupal >= 11.4.0 — SessionManager::delete() - # was deprecated in 11.4.0 which is not yet released (latest stable: 11.3.x). - # Re-enable with "role_expire" once the test site runs Drupal 11.4.0+. +run_test ReplaceSessionManagerDeleteRector \ + role_expire run_test ReplaceSessionWritesWithRequestSessionRector # No contrib usage: direct $_SESSION writes not present in any D11-compatible contrib module found @@ -466,5 +512,4 @@ echo " ReplaceEntityReferenceRecursiveLimit, ReplaceLocaleConfigBatchFunctio echo " ReplaceNodeAccessViewAllNodes, ReplaceRequestTimeConstant," echo " ReplaceSessionWritesWithRequestSession, ReplaceSystemPerformanceGzipKey," echo " ReplaceUserSessionNameProperty, StatementPrefetchIteratorFetchColumn)" -echo " * 1 rector skipped — version gate requires Drupal >= 11.4.0 (not yet released):" -echo " ReplaceSessionManagerDeleteRector (role_expire is valid test module; re-enable after upgrade)" +echo " * Core is installed at 11.x-dev (11.4-dev) so all 11.4 version gates are active." From 7aeff28589e8458104fd6de0c1360346b20963b6 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 8 May 2026 10:43:51 +0200 Subject: [PATCH 120/256] chore(tests): remove stashing, dont think we need that --- scripts/setup-rector-test.sh | 35 ----------------------------------- 1 file changed, 35 deletions(-) diff --git a/scripts/setup-rector-test.sh b/scripts/setup-rector-test.sh index a69dc556b..1ef60b317 100755 --- a/scripts/setup-rector-test.sh +++ b/scripts/setup-rector-test.sh @@ -224,17 +224,8 @@ cd /var/www/html LOG=/var/www/html/rector-test.log CONTRIB=web/modules/contrib -STASH=/tmp/rector_mod_stash FILTER="${1:-}" -# Restore any modules left in the stash from a previous crashed run -if [ -d "$STASH" ]; then - for _stashed in "$STASH"/*/; do - [ -d "$_stashed" ] && mv "$_stashed" "$CONTRIB/" - done - rmdir "$STASH" 2>/dev/null || true -fi - run_test() { local rector="$1" shift @@ -273,27 +264,6 @@ run_test() { printf " Modules: %s\n" "${paths[*]}" | tee -a "$LOG" echo "" | tee -a "$LOG" - # Stash all modules not needed for this rector. PHPStan builds a type graph - # from every file it can reach via the autoloader; with 40+ contrib modules - # present it hits an infinite type-expansion loop on decorator patterns in - # group/. Isolating to only the required modules prevents this. - local hidden=() - mkdir -p "$STASH" - local modname needed m - for mod_dir in "$CONTRIB"/*/; do - [ -d "$mod_dir" ] || continue - modname="${mod_dir%/}" - modname="${modname##*/}" - needed=false - for m in "${mods[@]}"; do - [ "$m" = "$modname" ] && needed=true && break - done - if [ "$needed" = false ]; then - mv "$mod_dir" "$STASH/" - hidden+=("$modname") - fi - done - rm -rf /tmp/rector_cached_files timeout 60 vendor/bin/rector process "${paths[@]}" --only="$fqcn" --dry-run 2>&1 | tee -a "$LOG" || true @@ -303,11 +273,6 @@ run_test() { # Reset files so the next rector starts clean git checkout -- "${paths[@]}" 2>/dev/null || true - # Restore stashed modules - for modname in "${hidden[@]}"; do - mv "$STASH/$modname" "$CONTRIB/" - done - rmdir "$STASH" 2>/dev/null || true } echo "Rector test run — $(date)" | tee "$LOG" From cb812a4021cc550ca1fe289676df8ef3def23b66 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 8 May 2026 11:35:54 +0200 Subject: [PATCH 121/256] fix(ReplaceSessionManagerDeleteRector): match SessionManagerInterface-typed variables The rector was checking ObjectType('SessionManager') (the concrete class), which missed the common pattern of injecting SessionManagerInterface and calling ->delete() on it (as seen in role_expire). - Switch type guard to SessionManagerInterface so both the interface and concrete class are matched - Add PHPStan stubs for SessionManagerInterface and SessionManager so the type hierarchy resolves correctly in tests - Replace no_change_interface fixture (was documenting the limitation) with interface_variable and interface_property positive fixtures --- docs/analysis-2026-05-08.md | 140 ++++++++++++++++ ...2026-05-08-001-fix-rector-test-failures.md | 151 ++++++++++++++++++ scripts/setup-rector-test.sh | 7 +- .../ReplaceSessionManagerDeleteRector.php | 2 +- stubs/Drupal/Session/SessionManager.php | 14 ++ .../Session/SessionManagerInterface.php | 14 ++ .../fixture/interface_property.php.inc | 35 ++++ .../fixture/interface_variable.php.inc | 13 ++ .../fixture/no_change_interface.php.inc | 17 -- 9 files changed, 371 insertions(+), 22 deletions(-) create mode 100644 docs/analysis-2026-05-08.md create mode 100644 docs/plans/2026-05-08-001-fix-rector-test-failures.md create mode 100644 stubs/Drupal/Session/SessionManager.php create mode 100644 stubs/Drupal/Session/SessionManagerInterface.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/fixture/interface_property.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/fixture/interface_variable.php.inc delete mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/fixture/no_change_interface.php.inc diff --git a/docs/analysis-2026-05-08.md b/docs/analysis-2026-05-08.md new file mode 100644 index 000000000..ca420cd34 --- /dev/null +++ b/docs/analysis-2026-05-08.md @@ -0,0 +1,140 @@ +# Drupal Rector Test Run Analysis — 2026-05-08 + +**Log source:** `~/projects/drupal-rector-test/rector-test.log` +**Run timestamp:** Wed May 6 17:29:44 CEST 2026 + +--- + +## Summary + +| Category | Count | +|----------|-------| +| Passing (files changed) | 24 | +| Skipped (no modules) | 21 | +| No changes found | 2 | +| Interrupted / incomplete | 3 | +| Total file changes (dry-run) | 38 | + +--- + +## Full Results Table + +| Rector | Status | Files Changed | Modules | +|--------|--------|---------------|---------| +| ErrorCurrentErrorHandlerRector | SKIP | — | — | +| FileSystemBasenameToNativeRector | PASS | 1 | stage_file_proxy | +| LoadAllIncludesRector | PASS | 1 | schemadotorg | +| MigrateSqlGetMigrationPluginManagerRector | PASS | 1 | smart_sql_idmap | +| NodeStorageDeprecatedMethodsRector | PASS | 1 | workflow_buttons | +| PluginBaseIsConfigurableRector | PASS | 1 | metatag | +| RemoveAutomatedCronSubmitHandlerRector | SKIP | — | — | +| RemoveCacheExpireOverrideRector | PASS | 1 | vcp4dates | +| RemoveHandlerBaseDefineExtraOptionsRector | PASS | 1 | views_dependent_filters | +| RemoveLinkWidgetValidateTitleElementRector | SKIP | — | — | +| RemoveModuleHandlerAddModuleCallsRector | PASS | 1 | config_track | +| RemoveModuleHandlerDeprecatedMethodsRector | SKIP | — | — | +| RemoveRootFromConvertDbUrlRector | PASS | 1 | sparql_entity_storage | +| RemoveSetUriCallbackRector | SKIP | — | — | +| RemoveStateCacheSettingRector | SKIP | — | — | +| RemoveTrustDataCallRector | INTERRUPTED | — | views_dependent_filters, group | +| RemoveTwigNodeTransTagArgumentRector | SKIP | — | — | +| RemoveUpdaterPostInstallMethodsRector | INTERRUPTED | — | group, gnode_request | +| RemoveViewsRowCacheKeysRector | PASS | 2 | metatag, views_advanced_cache | +| RenameStopProceduralHookScanRector | SKIP | — | — | +| ReplaceAlphadecimalToIntNullRector | SKIP | — | — | +| ReplaceCommentManagerGetCountNewCommentsRector | INTERRUPTED | — | forum, history | +| ReplaceCommentUriRector | SKIP | — | — | +| ReplaceDateTimeRangeConstantsRector | PASS | 1 | scheduler_field | +| ReplaceEditorLoadRector | SKIP | — | — | +| ReplaceEntityOriginalPropertyRector | PASS | 2 | media_auto_publication, entity_usage | +| ReplaceEntityReferenceRecursiveLimitRector | SKIP | — | — | +| ReplaceFieldgroupToFieldsetRector | PASS | 1 | webform | +| ReplaceFileGetContentHeadersRector | PASS | 2 | commerce_invoice, tmgmt | +| ReplaceLocaleConfigBatchFunctionsRector | SKIP | — | — | +| ReplaceModuleHandlerGetNameRector (D10) | PASS | 1 | mailsystem *(appears twice in log — test script bug)* | +| ReplaceNodeAccessViewAllNodesRector | SKIP | — | — | +| ReplaceNodeAddBodyFieldRector | PASS | 1 | tome | +| ReplaceNodeModuleProceduralFunctionsRector | PASS | 3 | addanother, reassign_user_content | +| ReplaceNodeSetPreviewModeRector | PASS | 1 | responsive_preview | +| ReplacePdoFetchConstantsRector | PASS | 8 | acquia_contenthub, gdpr | +| ReplaceRebuildThemeDataRector (D10) | PASS | 1 | site_guardian | +| ReplaceRecipeRunnerInstallModuleRector | SKIP | — | — | +| ReplaceRequestTimeConstantRector | SKIP | — | — | +| ReplaceSessionManagerDeleteRector | NO CHANGES | 0 | role_expire | +| ReplaceSessionWritesWithRequestSessionRector | SKIP | — | — | +| ReplaceSystemPerformanceGzipKeyRector | SKIP | — | — | +| ReplaceThemeGetSettingRector | SKIP | — | — | +| ReplaceUserSessionNamePropertyRector | SKIP | — | — | +| ReplaceViewsProceduralFunctionsRector | PASS | 1 | quicktabs | +| StatementPrefetchIteratorFetchColumnRector | SKIP | — | — | +| StripMigrationDependenciesExpandArgRector | NO CHANGES | 0 | migrate_tools | +| SystemTimeZonesRector (D10) | PASS | 1 | smart_date | +| UseEntityTypeHasIntegerIdRector | PASS | 2 | association, commerce_invoice | +| ViewsPluginHandlerManagerRector | PASS | 1 | search_api | + +--- + +## Interrupted / Incomplete Runs + +Three rectors cut off mid-scan with no result line. All three hit large module trees and likely timed out: + +| Rector | Progress | Files | Modules | +|--------|----------|-------|---------| +| RemoveTrustDataCallRector | 94% (266/282) | unknown | views_dependent_filters, group | +| RemoveUpdaterPostInstallMethodsRector | 94% (289/305) | unknown | group, gnode_request | +| ReplaceCommentManagerGetCountNewCommentsRector | 82% (74/90) | unknown | forum, history | + +The `group` module appears in two of the three — it's a large contrib module and is likely the cause of the timeout. Results (PASS or NO CHANGES) are unknown for all three. + +--- + +## Skipped (no modules installed) + +21 rectors had no applicable test module available: + +- ErrorCurrentErrorHandlerRector +- RemoveAutomatedCronSubmitHandlerRector +- RemoveLinkWidgetValidateTitleElementRector +- RemoveModuleHandlerDeprecatedMethodsRector +- RemoveSetUriCallbackRector +- RemoveStateCacheSettingRector +- RemoveTwigNodeTransTagArgumentRector +- RenameStopProceduralHookScanRector +- ReplaceAlphadecimalToIntNullRector +- ReplaceCommentUriRector +- ReplaceEditorLoadRector +- ReplaceEntityReferenceRecursiveLimitRector +- ReplaceLocaleConfigBatchFunctionsRector +- ReplaceNodeAccessViewAllNodesRector +- ReplaceRecipeRunnerInstallModuleRector +- ReplaceRequestTimeConstantRector +- ReplaceSessionWritesWithRequestSessionRector +- ReplaceSystemPerformanceGzipKeyRector +- ReplaceThemeGetSettingRector +- ReplaceUserSessionNamePropertyRector +- StatementPrefetchIteratorFetchColumnRector + +--- + +## No Changes Found + +Ran to completion but found nothing to transform: + +| Rector | Modules Scanned | +|--------|-----------------| +| ReplaceSessionManagerDeleteRector | role_expire | +| StripMigrationDependenciesExpandArgRector | migrate_tools | + +`ReplaceSessionManagerDeleteRector` was previously blocked by a version gate (Drupal 11.4.0). The "no changes" result on `role_expire` is expected — the module likely doesn't call the deprecated method. + +--- + +## Observations + +**Most impactful rector:** `ReplacePdoFetchConstantsRector` — 8 files changed across `acquia_contenthub` and `gdpr`, replacing `PDO::FETCH_ASSOC` / `PDO::FETCH_COLUMN` with the new `\Drupal\Core\Database\Statement\FetchAs` enum. + +**BC-wrapped Drupal 10 rectors:** Three rectors (`ReplaceModuleHandlerGetNameRector`, `ReplaceRebuildThemeDataRector`, `SystemTimeZonesRector`) are in the `Drupal10` namespace and emit `DeprecationHelper::backwardsCompatibleCall()` output — consistent with the BC-wrap work on this branch. + +**Duplicate run:** `ReplaceModuleHandlerGetNameRector` appears twice in the log, both producing the same 1-file change on `mailsystem`. Test script bug — the rector was queued twice. + +**Timeout pattern:** The three interrupted rectors all had large file counts (90–305 files) and two involved the `group` module. Consider raising the scan timeout or excluding `group` from the timeout-sensitive rectors' test suites. diff --git a/docs/plans/2026-05-08-001-fix-rector-test-failures.md b/docs/plans/2026-05-08-001-fix-rector-test-failures.md new file mode 100644 index 000000000..9ddb9dc04 --- /dev/null +++ b/docs/plans/2026-05-08-001-fix-rector-test-failures.md @@ -0,0 +1,151 @@ +--- +title: "fix: Rector test failures and missed triggers from rector-test.log analysis" +type: fix +status: active +date: 2026-05-08 +--- + +# fix: Rector test failures and missed triggers from rector-test.log analysis + +## Summary + +Analysis of `rector-test.log` from `drupal-rector-test2` revealed two behavioral failures (rectors that run but do the wrong thing), five rectors that silently produce zero changes against plausible targets, and one rector that runs twice due to set duplication. This plan tracks investigation and fixes for each item. + +--- + +## Problem Frame + +The test log showed no hard PHP errors or test failures, but several rectors have either: +1. **False positives** — they modify code they should not touch +2. **Silent misses** — they match a target module but apply zero changes, suggesting a pattern mismatch in the node visitor + +--- + +## Issue Inventory + +### P1 — Behavioral Failures (rector runs, does wrong thing) + +#### F1: `RemoveModuleHandlerAddModuleCallsRector` — false positive, deletes unrelated method body + +**File affected:** `web/modules/contrib/config_track/src/Extension/ModuleHandler.php` + +**What happens:** The rector is supposed to remove deprecated `addModule()` and `addProfile()` call delegations. It correctly empties those two methods, but it also blanks out the body of `loadAllIncludes()` — a method outside its stated scope. + +**Root cause:** The `config_track` source has a pre-existing bug: `loadAllIncludes()` delegates to `$this->innerModuleHandler->addProfile(...)` instead of the correct method. The rector's node visitor sees an `addProfile()` call and removes it regardless of which method it lives in. + +**Fix needed:** Scope the node visitor to only remove `addProfile()`/`addModule()` calls that are the *sole statement* in methods named `addProfile` or `addModule` (i.e. delegation stubs), not arbitrary calls to those methods elsewhere. + +**Status:** [ ] Investigated [ ] Fixed [ ] Test added + +--- + +#### ~~F2: `ReplaceDateTimeRangeConstantsRector` — name/behavior mismatch~~ CLOSED — not a bug + +The rector deliberately handles two patterns from the same change record ([drupal.org/node/3574901](https://www.drupal.org/node/3574901)): +1. `DateTimeRangeConstantsInterface::BOTH/START_DATE/END_DATE` → `DateTimeRangeDisplayOptions` enum +2. `datetime_type_field_views_data_helper()` → `\Drupal::service('datetime.views_helper')->buildViewsData(...)` + +Both are documented in the docblock and `getRuleDefinition()`. The log showed branch 2 firing on `scheduler_field` because that module uses the function but not the constants. Correct behaviour. Class name is slightly narrow but not incorrect. + +--- + +### P2 — Silent Misses (zero changes on plausible targets) + +#### M1: `RemoveUpdaterPostInstallMethodsRector` — `gnode_request` (28 files), 0 changes + +**Target pattern:** `postInstall()` / `postUpdateFileTransfer()` methods from `UpdaterInterface` + +**Suspicion:** The class hierarchy check (resolving whether a class `implements UpdaterInterface`) may fail in the test Drupal installation if the interface is not autoloadable. The module was specifically matched as a target by the setup script, so the code likely exists. + +**Investigation steps:** +1. Grep `gnode_request` for `UpdaterInterface`, `postInstall`, `postUpdateFileTransfer` +2. Check if the rector's condition requires the class to be resolvable via `instanceof` / reflection + +**Status:** [ ] Investigated [ ] Fixed [ ] Test added + +--- + +#### ~~M2: `ReplaceCommentManagerGetCountNewCommentsRector` — `history` (23 files), 0 changes~~ CLOSED — true negative + +The rector requires the receiver to be typed as `Drupal\comment\CommentManagerInterface`. Every `getCountNewComments()` call in `history` is already on `HistoryManager` (the new API) — the module has fully migrated. No usage of the deprecated `CommentManagerInterface::getCountNewComments()` exists anywhere in the test environment. + +The setup script hardcoded `history` as the target, but `history` *provides* the new API — it wouldn't call the old one on `CommentManagerInterface`. A better test target would be a contrib module that still injects `CommentManagerInterface` and calls `->getCountNewComments()`. This deprecation landed in 11.3.0 so no such module may exist in the wild yet. + +**Action:** Add a comment to the setup script explaining that no suitable contrib target was found for this rector. + +--- + +#### M3: `ReplaceEditorLoadRector` — `ckeditor5_premium_features` (282 files), 0 changes + +**Target pattern:** `editor_load()` function calls + +**Suspicion:** `ckeditor5_premium_features` may use the entity storage API (`\Drupal::entityTypeManager()->getStorage('editor')->load(...)`) instead of the procedural `editor_load()`. That would be correct modern code and a true negative. Alternatively the setup script matched this module incorrectly. + +**Investigation steps:** +1. Grep `ckeditor5_premium_features` for `editor_load` +2. If not found, verify the setup script's matching logic for this rector + +**Status:** [ ] Investigated [ ] Fixed [ ] Test added + +--- + +#### ~~M4: `ReplaceSessionManagerDeleteRector` — `role_expire` (15 files), 0 changes~~ FIXED + +**Root cause:** The rector checked `ObjectType('Drupal\Core\Session\SessionManager')` (the concrete class). `role_expire` injects `SessionManagerInterface` and calls `->delete()` on it. PHPStan cannot resolve the subtype relationship without stubs, so the check failed. + +**Fix:** +- Changed `ObjectType` to `SessionManagerInterface` in the rector +- Added PHPStan stubs for `SessionManagerInterface` and `SessionManager` (with `implements SessionManagerInterface`) so the type hierarchy resolves correctly for both concrete and interface-typed variables +- Converted `no_change_interface.php.inc` → `interface_variable.php.inc` (now a positive fixture) +- Added `interface_property.php.inc` for the injected class property pattern + +**Status:** [x] Investigated [x] Fixed [x] Test added + +--- + +#### M5: `StripMigrationDependenciesExpandArgRector` — `migrate_tools` (45 files), 0 changes + +**Target pattern:** `$expand` argument in `MigrationPluginManager::createInstances()` or similar + +**Suspicion:** Either the argument has already been removed in the installed version of `migrate_tools`, or the rector's argument-position check is off-by-one. + +**Investigation steps:** +1. Grep `migrate_tools` for `createInstances` +2. Check the rector's expected method signature against what the module actually calls + +**Status:** [ ] Investigated [ ] Fixed [ ] Test added + +--- + +### P3 — Set Duplication (low priority) + +#### D1: `ReplaceModuleHandlerGetNameRector` runs twice against `mailsystem` + +**What happens:** The rector appears at log line ~722 and again at ~1297, scanning the same 16 files and producing identical diffs both times. + +**Root cause:** The rector class is registered in two different rector sets (e.g. a Drupal 10 set and a generic/all set). + +**Risk:** On a real (non-dry-run) run, the second pass would be a no-op since the first pass already applied the change. But it wastes time and is confusing. + +**Fix needed:** Audit rector set definitions for duplicate class registrations. Remove the duplicate. + +**Status:** [ ] Investigated [ ] Fixed + +--- + +## Work Order + +1. ~~**F1**~~ — `RemoveModuleHandlerAddModuleCallsRector` — CLOSED (rector correct, config_track has pre-existing bug) +2. ~~**F2**~~ — `ReplaceDateTimeRangeConstantsRector` — CLOSED (handles two patterns by design) +3. ~~**M2**~~ — `ReplaceCommentManagerGetCountNewCommentsRector` — CLOSED (true negative, history already migrated to new API) +4. ~~**M4**~~ — `ReplaceSessionManagerDeleteRector` — FIXED (now matches `SessionManagerInterface`-typed variables) +5. **M1** — `RemoveUpdaterPostInstallMethodsRector` interface resolution +6. **M3** — `ReplaceEditorLoadRector` true negative vs setup-script mismatch +7. **M5** — `StripMigrationDependenciesExpandArgRector` argument position +8. **D1** — Duplicate set registration for `ReplaceModuleHandlerGetNameRector` + +--- + +## Out of Scope + +- 20 rectors skipped due to missing modules in the test environment — expected gaps, not failures. diff --git a/scripts/setup-rector-test.sh b/scripts/setup-rector-test.sh index 1ef60b317..8aaa23305 100755 --- a/scripts/setup-rector-test.sh +++ b/scripts/setup-rector-test.sh @@ -96,7 +96,6 @@ ddev composer require --no-update \ "drupal/custom_field:*" \ "drupal/role_expire:*" \ "drupal/views_dependent_filters:*" \ - "drupal/group:*" \ "drupal/search_api:*" \ "drupal/schemadotorg:*" \ "drupal/smart_migrate_cli:*" \ @@ -331,7 +330,7 @@ run_test RemoveTwigNodeTransTagArgumentRector # No contrib usage: TwigNodeTrans 6-arg constructor removed from core before D11 contrib caught up (version drift) run_test RemoveUpdaterPostInstallMethodsRector \ - group gnode_request + gnode_request run_test RemoveViewsRowCacheKeysRector \ metatag views_advanced_cache @@ -345,7 +344,7 @@ run_test ReplaceAlphadecimalToIntNullRector # module calls the function with a literal null or empty string. run_test ReplaceCommentManagerGetCountNewCommentsRector \ - forum history + forum run_test ReplaceCommentUriRector # No contrib usage: comment_uri() deprecated D11.3.0; Social 13.x already cleaned up (issue #3432522), no other D11 hits @@ -353,7 +352,7 @@ run_test ReplaceCommentUriRector run_test ReplaceDateTimeRangeConstantsRector \ optional_end_date scheduler_field -run_test ReplaceEditorLoadRector +run_test ReplaceEditorLoadRector \ ckeditor5_premium_features # No contrib usage: editor_load() deprecated D11; not called in any D11 contrib module found diff --git a/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector.php b/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector.php index 5dbcfed66..72e53744b 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector.php @@ -54,7 +54,7 @@ public function refactorWithConfiguration(Node $node, VersionedConfigurationInte return null; } - if (!$this->isObjectType($node->var, new ObjectType('Drupal\Core\Session\SessionManager'))) { + if (!$this->isObjectType($node->var, new ObjectType('Drupal\Core\Session\SessionManagerInterface'))) { return null; } diff --git a/stubs/Drupal/Session/SessionManager.php b/stubs/Drupal/Session/SessionManager.php new file mode 100644 index 000000000..389f1ca24 --- /dev/null +++ b/stubs/Drupal/Session/SessionManager.php @@ -0,0 +1,14 @@ +sessionManager->delete($uid); + } +} + +?> +----- + \Drupal::service(\Drupal\Core\Session\UserSessionRepositoryInterface::class)->deleteAll($uid), fn() => $this->sessionManager->delete($uid)); + } +} + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/fixture/interface_variable.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/fixture/interface_variable.php.inc new file mode 100644 index 000000000..b2f0dd5d0 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/fixture/interface_variable.php.inc @@ -0,0 +1,13 @@ +delete($uid); + +?> +----- + \Drupal::service(\Drupal\Core\Session\UserSessionRepositoryInterface::class)->deleteAll($uid), fn() => $sessionManager->delete($uid)); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/fixture/no_change_interface.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/fixture/no_change_interface.php.inc deleted file mode 100644 index a74fa0322..000000000 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/fixture/no_change_interface.php.inc +++ /dev/null @@ -1,17 +0,0 @@ -delete($uid); - -?> ------ -delete($uid); - -?> From e3d5292fb784eac71404b15a4f800eee8f507f19 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 8 May 2026 11:46:35 +0200 Subject: [PATCH 122/256] chore: update test script --- scripts/setup-rector-test.sh | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/scripts/setup-rector-test.sh b/scripts/setup-rector-test.sh index 8aaa23305..87f5e16ee 100755 --- a/scripts/setup-rector-test.sh +++ b/scripts/setup-rector-test.sh @@ -101,7 +101,7 @@ ddev composer require --no-update \ "drupal/smart_migrate_cli:*" \ "drupal/metatag:*" \ "drupal/external_entity:*" \ - "drupal/ckeditor5_premium_features:*" \ + "drupal/ckeditor5_premium_features:1.3.*" \ "drupal/reassign_user_content:*" # Batch 2 — single-rector gap-fillers @@ -120,7 +120,6 @@ ddev composer require --no-update \ "drupal/vcp4dates:*" \ "drupal/gdpr:*" \ "drupal/ai_eca:*" \ - "drupal/gnode_request:*" \ "drupal/migmag:*" \ "drupal/sparql_entity_storage:*" \ "drupal/views_advanced_cache:*" \ @@ -131,7 +130,7 @@ ddev composer require --no-update \ "drupal/quicktabs:*" \ "drupal/entity_usage:*" \ "drupal/media_auto_publication:*" \ - "drupal/migrate_tools:*" \ + "drupal/migrate_tools:6.1.*" \ "drupal/stage_file_proxy:^3.1" \ "drupal/workflow_buttons:^1" \ "drupal/optional_end_date:*" \ @@ -329,8 +328,9 @@ run_test RemoveTrustDataCallRector \ run_test RemoveTwigNodeTransTagArgumentRector # No contrib usage: TwigNodeTrans 6-arg constructor removed from core before D11 contrib caught up (version drift) -run_test RemoveUpdaterPostInstallMethodsRector \ - gnode_request +run_test RemoveUpdaterPostInstallMethodsRector + # No contrib usage: targets classes extending Drupal\Core\Updater\Updater/Module/Theme + # that override postInstall() or postInstallTasks(). No D11 contrib module uses this pattern. run_test RemoveViewsRowCacheKeysRector \ metatag views_advanced_cache @@ -373,9 +373,6 @@ run_test ReplaceFileGetContentHeadersRector \ run_test ReplaceLocaleConfigBatchFunctionsRector # No contrib usage: locale_config_batch_* deprecated D11.1.0; all GitLab hits were bundled core copies, not contrib code -run_test ReplaceModuleHandlerGetNameRector \ - mailsystem - run_test ReplaceNodeAccessViewAllNodesRector # No contrib usage: node_access_view_all_nodes() deprecated D11.3.0; no D11 contrib caller found (newly deprecated) From f2a08131141c0ea75d7c098c77b471e92ee54bdc Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 8 May 2026 12:14:24 +0200 Subject: [PATCH 123/256] fix(ReplaceSessionManagerDeleteRector): handle @var without leading backslash MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Old Drupal contrib code commonly writes `@var Drupal\Core\Session\SessionManager` without a leading `\`. PHPStan resolves this relative to the current namespace, producing a mangled class name like `Vendor\Module\Drupal\Core\Session\SessionManager` that neither isObjectType check can match, causing the rector to silently skip the file (as seen in role_expire). Extract `isSessionManagerType()` with three layers: - isObjectType(SessionManagerInterface) — properly typed interface - isObjectType(SessionManager) — properly typed concrete class - str_ends_with fallback on raw PHPStan class names — catches the namespace-mangled case; still limited to the exact Drupal class paths Add `class_property_phpdoc.php.inc` fixture (above and below version) that reproduces the role_expire pattern: non-promoted property with a @var-only annotation and no leading backslash. --- docs/analys-log-prompt.md | 0 .../ReplaceSessionManagerDeleteRector.php | 27 +++++++++- .../class_property_phpdoc.php.inc | 51 +++++++++++++++++++ .../fixture/class_property_phpdoc.php.inc | 51 +++++++++++++++++++ 4 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 docs/analys-log-prompt.md create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/fixture-below-version/class_property_phpdoc.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/fixture/class_property_phpdoc.php.inc diff --git a/docs/analys-log-prompt.md b/docs/analys-log-prompt.md new file mode 100644 index 000000000..e69de29bb diff --git a/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector.php b/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector.php index 72e53744b..125ef005c 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector.php @@ -54,7 +54,7 @@ public function refactorWithConfiguration(Node $node, VersionedConfigurationInte return null; } - if (!$this->isObjectType($node->var, new ObjectType('Drupal\Core\Session\SessionManagerInterface'))) { + if (!$this->isSessionManagerType($node->var)) { return null; } @@ -67,6 +67,31 @@ public function refactorWithConfiguration(Node $node, VersionedConfigurationInte return new Node\Expr\MethodCall($service, 'deleteAll', [$node->args[0]]); } + private function isSessionManagerType(Node\Expr $node): bool + { + // Normal case: property typed as the interface or concrete class (with leading \). + if ($this->isObjectType($node, new ObjectType('Drupal\Core\Session\SessionManagerInterface'))) { + return true; + } + if ($this->isObjectType($node, new ObjectType('Drupal\Core\Session\SessionManager'))) { + return true; + } + + // Older Drupal contrib code often omits the leading \ in @var annotations: + // @var Drupal\Core\Session\SessionManager (no leading \) + // PHPStan resolves this relative to the current namespace, producing a wrong + // class name like "Vendor\Module\Drupal\Core\Session\SessionManager". We check + // the exact suffix so we still match the same two Drupal classes and nothing else. + foreach ($this->getType($node)->getObjectClassNames() as $className) { + if (str_ends_with($className, '\\Drupal\\Core\\Session\\SessionManagerInterface') + || str_ends_with($className, '\\Drupal\\Core\\Session\\SessionManager')) { + return true; + } + } + + return false; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Replaces deprecated SessionManager::delete($uid) with UserSessionRepositoryInterface service', [ diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/fixture-below-version/class_property_phpdoc.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/fixture-below-version/class_property_phpdoc.php.inc new file mode 100644 index 000000000..546904aff --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/fixture-below-version/class_property_phpdoc.php.inc @@ -0,0 +1,51 @@ +sessionManager = $session_manager; + } + + public function deleteUserSessions(int $uid): void + { + $this->sessionManager->delete($uid); + } +} + +?> +----- +sessionManager = $session_manager; + } + + public function deleteUserSessions(int $uid): void + { + $this->sessionManager->delete($uid); + } +} + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/fixture/class_property_phpdoc.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/fixture/class_property_phpdoc.php.inc new file mode 100644 index 000000000..574501e10 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/fixture/class_property_phpdoc.php.inc @@ -0,0 +1,51 @@ +sessionManager = $session_manager; + } + + public function deleteUserSessions(int $uid): void + { + $this->sessionManager->delete($uid); + } +} + +?> +----- +sessionManager = $session_manager; + } + + public function deleteUserSessions(int $uid): void + { + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service(\Drupal\Core\Session\UserSessionRepositoryInterface::class)->deleteAll($uid), fn() => $this->sessionManager->delete($uid)); + } +} + +?> From 4dfeec0b14b14a129af2a0459f499e1c916a003c Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 8 May 2026 12:15:10 +0200 Subject: [PATCH 124/256] docs: add analysis instructions for rector test logs - Document specific patterns to identify issues in rector test logs. - Outline steps to produce a structured report, including key metrics table. --- docs/analys-log-prompt.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/docs/analys-log-prompt.md b/docs/analys-log-prompt.md index e69de29bb..fe1e898cf 100644 --- a/docs/analys-log-prompt.md +++ b/docs/analys-log-prompt.md @@ -0,0 +1,21 @@ +--- +Analyze the rector test log at ~/projects/drupal-rector-test2/rector-test.log. The user wants to know: +1. Which rectors might not be working correctly (failures, errors, unexpected behavior) +2. Which rectors should trigger but don't (missed transformations) + +Read the file in chunks (it's large, use offset/limit). Look for: +- Test FAILED or ERROR lines +- Rectors where "0 files changed" when changes were expected +- PHPStan errors or exceptions during rector runs +- Any patterns suggesting a rector ran but didn't apply its transformation +- Any "no changes" results that seem wrong +- Skipped tests or rectors with warnings + +Produce a structured report: +- Section 1: Rectors with failures/errors (list rector name + what went wrong) +- Section 2: Rectors that appear to not trigger when they should (list rector name + why you suspect it) +- Section 3: Any other notable issues + +Be specific with rector class names and test names where available. + +Add a table at the end of the report with key metrics like; rectors with changes, rectors wihtout changes, rectors skipped. From 661281961c56c4dce18b879f35300186a28af24a Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 8 May 2026 12:30:14 +0200 Subject: [PATCH 125/256] feat: add rector workflow skills and index generator MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds four Claude Code skills and a supporting PHP script to reduce friction in the drupal-digests → drupal-rector conversion workflow: - rector-discover: lists pending rules by phase; regenerates the index when stale - rector-implement: wraps docs/digest-to-rector-prompt.md steps 1–14 with two quality gates (type guard audit QG-A, version-gating QG-B) - rector-live-test: finds D11-compatible contrib modules and runs the rector against them using search.tresbien.tech - rector-qa: four-pass review (type guards, fixtures, BC decision, @see URL accuracy) scripts/generate-rector-index.php scans the digests repo and rector src/ to write docs/rector-index.yml — a single source of truth for which of the 107 in-scope rules are implemented, config-only, or pending. The YAML is gitignored (always re-generated from source). Gitignore updated to track .claude/skills/** so skills are shareable via git with teammates. --- .claude/skills/rector-discover/SKILL.md | 120 +++++++ .claude/skills/rector-implement/SKILL.md | 151 ++++++++ .claude/skills/rector-live-test/SKILL.md | 129 +++++++ .claude/skills/rector-qa/SKILL.md | 171 +++++++++ .gitignore | 4 + scripts/generate-rector-index.php | 433 +++++++++++++++++++++++ 6 files changed, 1008 insertions(+) create mode 100644 .claude/skills/rector-discover/SKILL.md create mode 100644 .claude/skills/rector-implement/SKILL.md create mode 100644 .claude/skills/rector-live-test/SKILL.md create mode 100644 .claude/skills/rector-qa/SKILL.md create mode 100644 scripts/generate-rector-index.php diff --git a/.claude/skills/rector-discover/SKILL.md b/.claude/skills/rector-discover/SKILL.md new file mode 100644 index 000000000..b20fc7da8 --- /dev/null +++ b/.claude/skills/rector-discover/SKILL.md @@ -0,0 +1,120 @@ +--- +name: rector-discover +description: Lists unimplemented drupal-digests rules classified by implementation phase. Regenerates docs/rector-index.yml if absent or stale (>24h). Use to find what to work on next, filter by phase, or get a summary count. +argument-hint: "[--phase 1a|1b|1c|2|3|4] [--limit N] [--pending-only]" +allowed-tools: Bash, Read +--- + +# Rector Discover + +Show which drupal-digests deprecation rules still need to be implemented in drupal-rector, grouped by phase. + +## Steps + +### 1. Ensure the digests repo is available + +The generator needs access to `drupal-digests`. In a ddev context, `~/` resolves to the container home directory, so the repo must be present at a path accessible inside the container. Check the most common locations: + +```bash +# Check if the repo is accessible (inside ddev or on host) +DIGESTS_PATH="" +for candidate in \ + "/var/www/drupal-digests" \ + "../drupal-digests" \ + "$HOME/projects/drupal-digests"; do + if [ -d "$candidate/rector/rules" ]; then + DIGESTS_PATH="$candidate" + break + fi +done + +if [ -z "$DIGESTS_PATH" ]; then + echo "drupal-digests repo not found. Cloning to sibling directory…" + cd .. + git clone --depth=1 https://github.com/dbuytaert/drupal-digests.git + cd drupal-rector + DIGESTS_PATH="../drupal-digests" +fi +echo "Using digests repo: $DIGESTS_PATH" +``` + +### 2. Ensure the index is fresh + +Check whether `docs/rector-index.yml` exists and is less than 24 hours old: + +```bash +INDEX="docs/rector-index.yml" +if [ ! -f "$INDEX" ] || [ "$(find "$INDEX" -mmin +1440 2>/dev/null)" ]; then + echo "Regenerating rector-index.yml…" + php scripts/generate-rector-index.php --digests-path="$DIGESTS_PATH" +else + echo "Using existing index ($(date -r "$INDEX" '+%Y-%m-%d %H:%M'))" +fi +``` + +### 2. Read the index + +Read `docs/rector-index.yml` completely. + +### 3. Apply filters + +**Tip:** To make `/var/www/drupal-digests` available inside the ddev container, create `.ddev/docker-compose.digests.yaml` (gitignored): +```yaml +services: + web: + volumes: + - "/absolute/path/to/drupal-digests:/var/www/drupal-digests:ro" +``` +Then run `ddev restart`. + +If `$ARGUMENTS` contains `--phase X`, show only entries with `phase: 'X'`. +If `$ARGUMENTS` contains `--limit N`, show only the first N entries. +If `$ARGUMENTS` contains `--pending-only`, show only `status: pending` entries (default unless --all is passed). + +### 4. Present results + +Print a summary header: +``` +Rector Index — + implemented: X config-only: Y pending: Z +``` + +Then list pending entries grouped by phase in order: 1a → 1b → 1c → 2 → 3 → 4 → unknown. + +For each pending entry show: +``` +[Phase 2] ReplaceSessionManagerDeleteRector — issue #3577376 + Digest: replace-deprecated-sessionmanager-delete-with-3577376.php +``` + +If all rules are implemented, print: +``` +All rules are implemented or have config-only entries. Nothing pending. +``` + +### 5. Suggest next action + +At the end, suggest the highest-priority pending rule to work on next (Phase 1a first, then 1b, 1c, 2, 3, 4): +``` +Next suggested: /rector-implement ~/projects/drupal-digests/rector/rules/ +``` + +## Phase Reference + +| Phase | Description | Generic rector | +|-------|-------------|----------------| +| 1a | FuncCall → service call | `FunctionToServiceRector` | +| 1b | FuncCall → static call | `FunctionToStaticRector` | +| 1c | Class constant replacement | `ClassConstantToClassConstantRector` | +| 2 | MethodCall custom class | custom `AbstractRector` or `AbstractDrupalCoreRector` | +| 3 | Node removal | custom class returning `REMOVE_NODE` | +| 4 | Complex / multi-node | custom class | + +## Refreshing manually + +To force a full regeneration: +```bash +php scripts/generate-rector-index.php +``` + +The generated file is gitignored — it's always derived from source. diff --git a/.claude/skills/rector-implement/SKILL.md b/.claude/skills/rector-implement/SKILL.md new file mode 100644 index 000000000..66790acde --- /dev/null +++ b/.claude/skills/rector-implement/SKILL.md @@ -0,0 +1,151 @@ +--- +name: rector-implement +description: Converts a single drupal-digests rule to a drupal-rector-compliant implementation. Follows docs/digest-to-rector-prompt.md steps 1–14 and adds quality gates for type guards (QG-A) and version-gating tests (QG-B). Pass the path to the digests rule file as argument. +argument-hint: "~/projects/drupal-digests/rector/rules/.php" +allowed-tools: Read, Write, Edit, Bash, Glob +--- + +# Rector Implement + +Convert a single drupal-digests rule into a drupal-rector–compliant implementation with tests. + +## Input + +`$ARGUMENTS` must be the path to a drupal-digests rule file, e.g.: +``` +~/projects/drupal-digests/rector/rules/replace-deprecated-sessionmanager-delete-with-3577376.php +``` + +The path can also be relative: if the repo is cloned as a sibling of drupal-rector, use: +``` +../drupal-digests/rector/rules/replace-deprecated-sessionmanager-delete-with-3577376.php +``` + +## Steps + +### Steps 1–14: Follow the canonical conversion workflow + +Read `docs/digest-to-rector-prompt.md` completely and execute steps 1–14 as written there. + +The canonical prompt covers: +- Step 1: Confirm input and extract class name, node types, refactor logic, code samples, issue number +- Step 2: Read the companion issue markdown +- Step 3: Fetch from Drupal.org if Step 2 was insufficient +- Step 4: Classify the rule (BC decision) — `AbstractRector` vs `AbstractDrupalCoreRector` +- Step 4b: Check for existing generic rectors BEFORE writing a custom class +- Step 5: Derive class name and file paths +- Step 6: Generate the rule class +- Step 7: Generate the fixture file +- Step 8: Generate the test class +- Step 9: Generate the test config +- Step 10: Write all files +- Step 11: Fix code style (`ddev composer fix-style`) +- Step 12: Run static analysis (`ddev composer phpstan`) +- Step 13: Run the test (`vendor/bin/phpunit tests/src/Drupal11/Rector/Deprecation/[ClassName]/`) +- Step 14: Commit + +**Do not skip or abbreviate any step.** The `docs/digest-to-rector-prompt.md` prompt is authoritative. + +--- + +### After Step 10: Quality Gate QG-A — Type Guard Audit + +For every `MethodCall`, `NullsafeMethodCall`, or `PropertyFetch` node the rector handles: + +1. Is an `isObjectType()` guard present that constrains the owning class/interface? +2. If missing: + a. Find the owning interface/class in `~/projects/drupal-core`: + ```bash + grep -rn "function \|property \$" ~/projects/drupal-core/core --include="*.php" -l | head -5 + ``` + b. Check whether a stub exists: + ```bash + find stubs/ -name "*.php" | xargs grep -l "class \|interface " 2>/dev/null + ``` + c. If no stub: create a minimal stub at `stubs/Drupal/Some/Namespace/ClassName.php`: + ```php + doTestFile(__DIR__ . '/fixture/basic.php.inc'); + } + ``` + This is the existing test — rename if needed or leave it. + +2. Add `testBelowVersion()` method: + ```php + public function testBelowVersion(): void + { + AbstractDrupalCoreRector::setVersionOverride('10.0.0'); + try { + $this->doTestFile(__DIR__ . '/fixture-below-version/basic.php.inc'); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } + } + ``` + +3. Create `tests/src/Drupal11/Rector/Deprecation/[ClassName]/fixture-below-version/basic.php.inc`: + ``` + + ----- + + ``` + +--- + +### After Step 14: Update the index (if it exists) + +```bash +if [ -f docs/rector-index.yml ]; then + php scripts/generate-rector-index.php +fi +``` + +This marks the newly implemented rule as `implemented` in the index. + +--- + +## Pre-flight Checklist + +Before declaring the implementation complete, verify all items from `docs/digest-to-rector-prompt.md`'s final checklist, plus: + +- [ ] QG-A: `isObjectType()` guard present for all MethodCall/PropertyFetch nodes (or explicitly not needed) +- [ ] QG-A: `no_change_unrelated.php.inc` fixture exists if a type guard was added +- [ ] QG-B: `testBelowVersion()` and `fixture-below-version/basic.php.inc` present if BC-wrapped +- [ ] `vendor/bin/phpunit tests/src/Drupal11/Rector/Deprecation/[ClassName]/` passes +- [ ] `ddev composer phpstan` reports no new errors +- [ ] `ddev composer fix-style` produces no changes + +## Quick Reference: Phase 1 (config-only) path + +If Step 4b determines a generic rector handles this rule, follow the "config-only" path in `docs/digest-to-rector-prompt.md` Step 4b instead of generating a custom class. No custom PHP class is written — only a config entry and fixture are added. diff --git a/.claude/skills/rector-live-test/SKILL.md b/.claude/skills/rector-live-test/SKILL.md new file mode 100644 index 000000000..1bf9535e5 --- /dev/null +++ b/.claude/skills/rector-live-test/SKILL.md @@ -0,0 +1,129 @@ +--- +name: rector-live-test +description: Finds D11-compatible contrib modules that exercise a rector and runs it against them. Uses search.tresbien.tech as primary search tool, falls back to Drupal GitLab API. Pass rector class name or issue number as argument. +argument-hint: "" +allowed-tools: Read, Bash, Glob +--- + +# Rector Live Test + +Find real contrib modules that use the deprecated API a rector targets, then run the rector against them to verify it transforms real-world code correctly. + +## Input + +`$ARGUMENTS` — either: +- Rector class name: `ReplaceSessionManagerDeleteRector` +- Issue number: `3577376` + +## Steps + +### 1. Resolve the rector + +If given a class name, find the source file: +```bash +find src -name ".php" +``` + +If given an issue number, check `docs/rector-index.yml` (regenerate if needed) for the class name, then find the source file. + +Read the rector source to extract: +- The deprecated method/function/constant name (look in `isName()` calls, constants, or `FUNCTION_MAP`) +- The deprecated class/interface name (from `isObjectType()` guards) + +### 2. Search for contrib modules + +**Primary: `search.tresbien.tech`** + +Navigate to the search tool and search for the deprecated API pattern. This site searches Drupal contrib module code indexed from drupal.org. + +Construct the search query: +- For method calls: `->methodName(` +- For function calls: `functionName(` +- For class constants: `ClassName::CONSTANT_NAME` +- For properties: `->propertyName` + +If fewer than 3 results, also check `docs/contrib-module-search.md` for pre-discovered matches from session 18. + +**Fallback: Drupal GitLab API blob search** + +If `search.tresbien.tech` yields no results or is unavailable: + +```bash +QUERY="" +curl -s "https://git.drupalcode.org/search?group_id=2&scope=blobs&search=-path%3Acore+-path%3Avendor+-path%3Adocroot+-path%3Aweb+-path%3Aprofiles+-path%3Asites+$QUERY" \ + | grep -o 'data-project="[^"]*"' | sort -u | head -20 +``` + +### 3. Filter to D11-compatible modules + +For each module found, check its `.info.yml` for `core_version_requirement`: +```bash +# Example using GitLab API for a specific module +curl -s "https://git.drupalcode.org/api/v4/projects/%2F/repository/files/.info.yml/raw?ref=HEAD" +``` + +Keep only modules where `core_version_requirement` includes Drupal 11 (e.g., `^8 || ^9 || ^10 || ^11` or `>=10`). + +If no D11-compatible modules are found, report: +``` +No D11-compatible contrib modules found for . +Try manually: https://git.drupalcode.org/search?group_id=2&scope=blobs&search= +Update docs/contrib-module-search.md with findings. +``` + +### 4. Run the rector (if setup script exists) + +Check whether the integration test setup exists: +```bash +ls scripts/setup-rector-test.sh scripts/drupal-rector-test/ 2>/dev/null +``` + +**If the setup exists:** + +Add target modules to `scripts/drupal-rector-test/composer.json`, then run: +```bash +bash scripts/setup-rector-test.sh --rector --no-cache +``` + +Always pass `--no-cache` to prevent stale rector results from a prior run. + +Parse the output for: +- `X file(s) changed` — success, the rector transformed code +- `0 files changed` or no output — investigate (see below) + +**If the setup does not exist:** + +Report that integration testing requires `scripts/setup-rector-test.sh` and provide manual instructions: + +1. Clone a D11-compatible module into a Drupal 11 site +2. Run: `ddev exec vendor/bin/rector process --config drupal-rector.php --no-cache` +3. Check the diff for expected transformations + +### 5. Report results + +For each tested module, report: +``` + file(s) changed + Transformations: +``` + +### 6. Diagnose zero-match results + +If a module was found but 0 files were changed, investigate using `docs/no-match-investigation.md` (if it exists). Common causes: + +| Cause | Diagnosis | Fix | +|-------|-----------|-----| +| Untyped code | The variable calling the deprecated method has no type annotation | The rector is working correctly — untyped code is intentionally skipped to avoid false positives | +| Wrong module version | The module has already updated its code | Try an older tagged version | +| Rector class mismatch | Wrong rector class was run | Verify the rector targets the exact deprecated API used in the module | +| Rector cache | Old cache silently skips files | Already handled by `--no-cache` | +| getNodeTypes mismatch | The node type returned by the rector doesn't match the actual AST node | Read the digest rule and the actual module code to compare | + +### 7. Update contrib search doc + +After running, update `docs/contrib-module-search.md` with the modules found (or confirmed absent): +``` +### +- **Search:** `` +- **Modules found:** , or — +``` diff --git a/.claude/skills/rector-qa/SKILL.md b/.claude/skills/rector-qa/SKILL.md new file mode 100644 index 000000000..fb89a5e07 --- /dev/null +++ b/.claude/skills/rector-qa/SKILL.md @@ -0,0 +1,171 @@ +--- +name: rector-qa +description: Comprehensive quality review of an existing Drupal rector. Runs four audit passes — type guards, fixture coverage, BC decision correctness, and @see URL accuracy — and produces a PASS/FAIL/WARN checklist. Use before merging a rector or when reviewing existing ones for regressions. +argument-hint: "" +allowed-tools: Read, Bash, Edit, Write, Glob +--- + +# Rector QA + +Comprehensive four-pass quality review for a drupal-rector implementation. + +## Input + +`$ARGUMENTS` — rector class name, e.g. `ReplaceSessionManagerDeleteRector`. + +## Finding the files + +```bash +find src -name ".php" +find tests/src -type d -name "" +``` + +Read the rector class, test class, all fixture files, and the test config. + +--- + +## Pass 1 — Type Guard Audit + +**Goal:** Every `MethodCall`, `NullsafeMethodCall`, or `PropertyFetch` node the rector handles must be guarded by `isObjectType()`. See `~/.claude/skills/rector-type-check-review/SKILL.md` for the full pattern reference. + +**Steps:** + +1. Read the rector source. +2. Identify the node types from `getNodeTypes()`. +3. For each MethodCall/NullsafeMethodCall/PropertyFetch handler in `refactor()`: + - Is there an `isObjectType($node->var, new ObjectType('FQCN'))` guard? +4. Classify: + - **SAFE** — correct type guard present, or targets global functions/constants only + - **AT-RISK** — matches name without type guard + - **EXEMPT** — operates on class declaration, checks parent class + +**Output:** `Pass 1: [SAFE|AT-RISK|EXEMPT] — ` + +**If AT-RISK:** Propose the fix (see `rector-type-check-review` skill for exact fix pattern). Apply it and update `docs/rector-type-specificity-checklist.md`: + +```bash +# Find the row for this rector in the checklist +grep -n "" docs/rector-type-specificity-checklist.md +``` + +Update the verdict column from `⚠️ AT-RISK` to `✅ SAFE` after fixing. + +--- + +## Pass 2 — Fixture Coverage Audit + +**Goal:** Fixtures should cover the happy path, no-change cases, and edge cases. + +**Steps:** + +1. List all fixture files: + ```bash + find tests/src/Drupal11/Rector/Deprecation//fixture -name "*.php.inc" + find tests/src/Drupal11/Rector/Deprecation//fixture-below-version -name "*.php.inc" 2>/dev/null + ``` + +2. Check for required coverage: + +| Fixture | Required when | Status | +|---------|--------------|--------| +| `fixture/basic.php.inc` | Always | ✅/❌ | +| `fixture/no_change_unrelated.php.inc` | Rector uses `isObjectType()` | ✅/❌ | +| `fixture-below-version/basic.php.inc` | Rector extends `AbstractDrupalCoreRector` | ✅/❌ | +| Edge-case fixtures | Rector has conditional branches in `refactor()` | ✅/❌/N/A | + +3. For `no_change_unrelated.php.inc`: verify the before and after sections are **identical** (the rector must NOT change untyped code). + +4. For `fixture-below-version/basic.php.inc`: verify the before and after sections are **identical** (BC mode suppresses the transformation). + +**Output:** `Pass 2: [PASS|WARN] — ` + +**If WARN:** Propose missing fixture content and add it. + +--- + +## Pass 3 — BC Decision Audit + +**Goal:** The base class (`AbstractRector` vs `AbstractDrupalCoreRector`) must match the Step 4 classification from `docs/digest-to-rector-prompt.md`. + +**Steps:** + +1. Read the rector class docblock and header to find `extends AbstractRector` or `extends AbstractDrupalCoreRector`. + +2. Re-run the Step 4 decision: + - **Q1:** What node types does `getNodeTypes()` return? + - **Q2:** Is the transformation CallLike → CallLike? + - Old node is CallLike if: `FuncCall`, `MethodCall`, `StaticCall`, `NullsafeMethodCall`, `New_` + - New node (what `refactor()` or `refactorWithConfiguration()` returns) is CallLike if: same list + - **Q3:** Was the deprecation introduced in Drupal >= 10.1.0? + - Check `introduced_version` in the test config or `DrupalIntroducedVersionConfiguration` usage. + - If unclear, read `~/projects/drupal-digests/issues/drupal-core/.md`. + +3. Expected base class: + - Q2 = CallLike → CallLike AND Q3 = version >= 10.1.0 → **`AbstractDrupalCoreRector`** + - Otherwise → **`AbstractRector`** + +4. Compare expected vs actual. + +**Output:** `Pass 3: [PASS|FAIL] — expected , found ` + +**If FAIL:** The base class is wrong. Propose the corrected class and note that `configure()`, `refactorWithConfiguration()`, and the test class will need updating. + +--- + +## Pass 4 — @see URL Audit + +**Goal:** The `@see` URL in the rector class docblock should point to the correct Drupal.org node. + +**Steps:** + +1. Extract the `@see` URL from the rector class: + ```bash + grep '@see' src/Drupal11/Rector/Deprecation/.php + ``` + +2. Determine the issue number and change record number: + - The digest filename contains the **issue number** (last numeric group). + - `~/projects/drupal-digests/issues/drupal-core/.md` contains the change record link if known. + - Alternatively, search `~/projects/drupal-core` for the deprecated function/method: + ```bash + grep -rn "@deprecated in drupal:" ~/projects/drupal-core/core --include="*.php" | grep "" | head -5 + ``` + The `@see` in the Drupal core deprecation notice usually points to the **change record**. + +3. Expected `@see` URL: + - Rector should point to the **issue node** if that's what the digest file uses. + - OR the **change record node** if the Drupal core source cites it. + - Flag if the `@see` points to a node that's clearly wrong (e.g., points to a different, unrelated issue). + +4. Check URL validity by comparing the node number with known data: + - Issue URL: `https://www.drupal.org/node/` — from digest filename + - CR URL: `https://www.drupal.org/node/` — from drupal-core deprecation annotation + +**Output:** `Pass 4: [PASS|WARN] — [matches issue|matches CR|MISMATCH: should be ]` + +**If WARN/FAIL:** Propose the corrected `@see` URL and apply it. + +--- + +## Final Summary + +After all four passes, produce a summary checklist: + +``` +=== QA Summary: === + +Pass 1 — Type Guard: [SAFE|AT-RISK|EXEMPT] +Pass 2 — Fixtures: [PASS|WARN] — +Pass 3 — BC Decision: [PASS|FAIL] — +Pass 4 — @see URL: [PASS|WARN] — + +Overall: [PASS — ready to merge | NEEDS FIXES — see above] +``` + +If any pass shows AT-RISK or FAIL, do not declare the rector ready to merge. Apply the proposed fixes and re-run the affected passes. + +--- + +## Running on a "known good" rector + +To verify the skill works correctly, run it on `ReplaceSessionManagerDeleteRector` — all four passes should be PASS/SAFE. diff --git a/.gitignore b/.gitignore index 233f3ff65..6ddc0c4ed 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,9 @@ !/.gitattributes !/.editorconfig !.gitkeep +!/.claude +!/.claude/skills +!/.claude/skills/** # Other ignored paths and files. /vendor @@ -17,3 +20,4 @@ /.phpunit.cache .worktrees/ rector-decision.log +docs/rector-index.yml diff --git a/scripts/generate-rector-index.php b/scripts/generate-rector-index.php new file mode 100644 index 000000000..7ae27b9cc --- /dev/null +++ b/scripts/generate-rector-index.php @@ -0,0 +1,433 @@ +#!/usr/bin/env php + '1a', + 'FunctionToStaticRector' => '1b', + 'ClassConstantToClassConstantRector' => '1c', + 'ConstantToClassConstantRector' => '1c', + 'FunctionCallRemovalRector' => '3', + 'MethodToMethodWithCheckRector' => '2', + 'DeprecationHelperRemoveRector' => '2', +]; + +const SCOPE_PATTERN = '/^(replace-deprecated|remove-deprecated|replace-removed|strip-removed)/'; + +main($argv); + +function main(array $argv): void +{ + $digestsPath = expandPath('~/projects/drupal-digests'); + + foreach (array_slice($argv, 1) as $arg) { + if ($arg === '--help') { + echo file_get_contents(__FILE__); + exit(0); + } + if (str_starts_with($arg, '--digests-path=')) { + $digestsPath = expandPath(substr($arg, 15)); + } + } + + $repoRoot = dirname(__DIR__); + $rulesDir = $digestsPath . '/rector/rules'; + + if (!is_dir($rulesDir)) { + fprintf(STDERR, "Error: digests rules directory not found: %s\n", $rulesDir); + fprintf(STDERR, "Pass --digests-path=PATH to specify the drupal-digests repo location.\n"); + exit(1); + } + + // Step 1: Build base entries from in-scope digest files. + $entries = scanDigestFiles($rulesDir); + + // Step 2: Mark implemented custom classes. + $unmatched = scanImplementedClasses($repoRoot . '/src/Drupal11/Rector/Deprecation', $entries); + + // Step 3: Mark config-only Phase 1 entries. + scanConfigFiles($repoRoot . '/config/drupal-11', $entries); + + // Step 4: Add unmatched custom classes (no digest file found). + foreach ($unmatched as $className => $data) { + $entries['class_' . $className] = $data; + } + + // Step 5: Write YAML. + $outputFile = $repoRoot . '/docs/rector-index.yml'; + writeYaml($entries, $outputFile); + + $counts = countByStatus($entries); + printf( + "Wrote %s\n implemented: %d config-only: %d pending: %d\n", + $outputFile, + $counts['implemented'], + $counts['config-only'], + $counts['pending'] + ); +} + +function expandPath(string $path): string +{ + if (str_starts_with($path, '~/')) { + $home = $_SERVER['HOME'] ?? getenv('HOME') ?: ''; + return $home . '/' . substr($path, 2); + } + return $path; +} + +/** + * Scans in-scope digest files, returns array keyed by issue number. + * + * @return array> + */ +function scanDigestFiles(string $rulesDir): array +{ + $entries = []; + + foreach (glob($rulesDir . '/*.php') as $file) { + $filename = basename($file); + + if (!preg_match(SCOPE_PATTERN, $filename)) { + continue; + } + + $issueNumber = extractIssueNumber($filename); + if ($issueNumber === null) { + continue; + } + + $content = file_get_contents($file); + $phase = classifyPhaseFromDigest($content, $filename); + + $entries[$issueNumber] = [ + 'issue' => $issueNumber, + 'digest_file' => $filename, + 'phase' => $phase, + 'status' => 'pending', + 'class' => null, + 'files' => [], + ]; + } + + ksort($entries); + return $entries; +} + +function extractIssueNumber(string $filename): ?string +{ + // Last hyphen-separated numeric group before .php + if (preg_match('/-(\d+)\.php$/', $filename, $matches)) { + return $matches[1]; + } + return null; +} + +/** + * Classifies phase from digest file content by inspecting getNodeTypes(). + */ +function classifyPhaseFromDigest(string $content, string $filename): string +{ + if (!preg_match('/getNodeTypes\s*\(\)[^{]*\{[^}]*return\s*\[([^\]]+)\]/s', $content, $matches)) { + // No getNodeTypes found — fall back on filename prefix. + return classifyPhaseFromFilename($filename); + } + + $nodeTypes = $matches[1]; + + $hasFuncCall = str_contains($nodeTypes, 'FuncCall'); + $hasMethodCall = str_contains($nodeTypes, 'MethodCall') || str_contains($nodeTypes, 'NullsafeMethodCall'); + $hasClassConst = str_contains($nodeTypes, 'ClassConstFetch') || str_contains($nodeTypes, 'ConstFetch'); + $hasExpression = str_contains($nodeTypes, 'Expression'); + $hasRemoveNode = str_contains($content, 'REMOVE_NODE'); + + // Phase 3: removes the node entirely. + if ($hasRemoveNode || ($hasExpression && !$hasFuncCall && !$hasMethodCall)) { + return '3'; + } + + // Pure FuncCall — Phase 1a or 1b. + if ($hasFuncCall && !$hasMethodCall && !$hasClassConst) { + return classifyFuncCallSubPhase($content); + } + + // ClassConstFetch / ConstFetch — Phase 1c. + if ($hasClassConst && !$hasFuncCall && !$hasMethodCall) { + return '1c'; + } + + // MethodCall/NullsafeMethodCall — Phase 2. + if ($hasMethodCall && !$hasFuncCall && !$hasClassConst && !$hasExpression) { + return '2'; + } + + // Multiple or ambiguous — Phase 4. + return '4'; +} + +function classifyFuncCallSubPhase(string $content): string +{ + // Service call pattern: ::service( or ->service( or \Drupal::service. + if (preg_match('/\\\\?Drupal::service\b|->service\s*\(/i', $content)) { + return '1a'; + } + // Static call pattern: SomeClass::method(). + if (str_contains($content, '::')) { + return '1b'; + } + return '1a'; +} + +function classifyPhaseFromFilename(string $filename): string +{ + if (str_starts_with($filename, 'remove-deprecated') || str_starts_with($filename, 'strip-removed')) { + return '3'; + } + return 'unknown'; +} + +/** + * Scans custom rector classes, updates entries in-place, returns unmatched classes. + * + * @param array> $entries + * @return array> + */ +function scanImplementedClasses(string $srcDir, array &$entries): array +{ + $unmatched = []; + + foreach (glob($srcDir . '/*.php') as $file) { + $content = file_get_contents($file); + + if (!preg_match('/class\s+(\w+)\s+extends/', $content, $classMatch)) { + continue; + } + $className = $classMatch[1]; + + $issueNumber = extractIssueFromSeeUrl($content); + + $phase = classifyPhaseFromClass($content); + + $relFile = 'src/Drupal11/Rector/Deprecation/' . basename($file); + $files = [$relFile]; + + // Add test file path if directory exists. + $testDir = dirname(dirname($srcDir)) . '/tests/src/Drupal11/Rector/Deprecation/' . $className; + if (is_dir($testDir)) { + $files[] = 'tests/src/Drupal11/Rector/Deprecation/' . $className . '/' . $className . 'Test.php'; + } + + if ($issueNumber !== null && isset($entries[$issueNumber])) { + $existing = $entries[$issueNumber]; + $entries[$issueNumber]['status'] = 'implemented'; + $entries[$issueNumber]['phase'] = $existing['phase'] === 'unknown' ? $phase : $existing['phase']; + + // Support multiple classes per issue (rare but occurs). + if ($existing['status'] === 'implemented' && !empty($existing['class'])) { + $prev = is_array($existing['class']) ? $existing['class'] : [$existing['class']]; + $entries[$issueNumber]['class'] = array_values(array_unique(array_merge($prev, [$className]))); + $entries[$issueNumber]['files'] = array_values(array_unique(array_merge($existing['files'], $files))); + } else { + $entries[$issueNumber]['class'] = $className; + $entries[$issueNumber]['files'] = $files; + } + } else { + // No matching digest entry — store for later. + $unmatched[$className] = [ + 'issue' => $issueNumber ?? 'unknown', + 'digest_file' => null, + 'phase' => $phase, + 'status' => 'implemented', + 'class' => $className, + 'files' => $files, + ]; + } + } + + return $unmatched; +} + +function extractIssueFromSeeUrl(string $content): ?string +{ + if (preg_match('#@see\s+https?://www\.drupal\.org/node/(\d+)#i', $content, $matches)) { + return $matches[1]; + } + return null; +} + +/** + * Classifies phase from a rector class file by inspecting getNodeTypes(). + */ +function classifyPhaseFromClass(string $content): string +{ + $isAbstractDrupalCore = str_contains($content, 'AbstractDrupalCoreRector'); + $hasRemoveNode = str_contains($content, 'REMOVE_NODE'); + + if (!preg_match('/getNodeTypes\s*\(\)[^{]*\{[^}]*return\s*\[([^\]]+)\]/s', $content, $matches)) { + return 'unknown'; + } + + $nodeTypes = $matches[1]; + $hasMethodCall = str_contains($nodeTypes, 'MethodCall') || str_contains($nodeTypes, 'NullsafeMethodCall'); + $hasExpression = str_contains($nodeTypes, 'Expression'); + + if ($hasRemoveNode || $hasExpression) { + return '3'; + } + + if ($hasMethodCall) { + return $isAbstractDrupalCore ? '2' : '2'; + } + + return '4'; +} + +/** + * Scans config files and marks config-only Phase 1 entries. + * + * @param array> $entries + */ +function scanConfigFiles(string $configDir, array &$entries): void +{ + foreach (glob($configDir . '/*.php') as $configFile) { + if (str_ends_with($configFile, 'drupal-11-all-deprecations.php')) { + continue; + } + + $content = file_get_contents($configFile); + $relFile = 'config/drupal-11/' . basename($configFile); + + parseConfigBlock($content, $relFile, $entries); + } +} + +/** + * Parses a config file, associating issue URL comments with rector class calls. + * + * @param array> $entries + */ +function parseConfigBlock(string $content, string $relFile, array &$entries): void +{ + $lines = explode("\n", $content); + $pendingIssues = []; + + foreach ($lines as $line) { + $trimmed = ltrim($line); + + // Collect issue URL comments. + if (preg_match('#//\s+https?://www\.drupal\.org/node/(\d+)#', $trimmed, $m)) { + $pendingIssues[] = $m[1]; + continue; + } + + // On ruleWithConfiguration(...), process the pending issues. + if (preg_match('/\$rectorConfig->ruleWithConfiguration\s*\(\s*([A-Za-z0-9_\\\\]+)::class/', $trimmed, $m)) { + $shortClass = extractShortClassName($m[1]); + + if (isset(GENERIC_RECTORS[$shortClass])) { + $phase = GENERIC_RECTORS[$shortClass]; + + foreach ($pendingIssues as $issue) { + if (isset($entries[$issue]) && $entries[$issue]['status'] === 'pending') { + $entries[$issue]['status'] = 'config-only'; + $entries[$issue]['phase'] = $entries[$issue]['phase'] === 'unknown' ? $phase : $entries[$issue]['phase']; + if (!in_array($relFile, $entries[$issue]['files'])) { + $entries[$issue]['files'][] = $relFile; + } + } + } + } + + $pendingIssues = []; + continue; + } + + // Non-comment, non-ruleWithConfiguration line — clear pending if it's not blank/whitespace. + if ($trimmed !== '' && !str_starts_with($trimmed, '//') && !str_starts_with($trimmed, '*')) { + // Keep pending issues through blank lines and continuation comments. + // Clear only when we hit something substantive that's NOT a rector call. + if (!str_starts_with($trimmed, 'new ') && !str_starts_with($trimmed, ']);')) { + $pendingIssues = []; + } + } + } +} + +function extractShortClassName(string $fqcn): string +{ + $parts = explode('\\', $fqcn); + return end($parts); +} + +/** + * Writes the index as YAML. + * + * @param array> $entries + */ +function writeYaml(array $entries, string $outputFile): void +{ + $counts = countByStatus($entries); + + $out = "# Generated by scripts/generate-rector-index.php — do not edit manually.\n"; + $out .= "# Re-generate with: php scripts/generate-rector-index.php\n"; + $out .= sprintf("generated: '%s'\n", date('Y-m-d H:i:s')); + $out .= "counts:\n"; + $out .= sprintf(" implemented: %d\n", $counts['implemented']); + $out .= sprintf(" config-only: %d\n", $counts['config-only']); + $out .= sprintf(" pending: %d\n", $counts['pending']); + $out .= "entries:\n"; + + foreach ($entries as $key => $entry) { + $out .= sprintf(" '%s':\n", $key); + $out .= sprintf(" issue: '%s'\n", $entry['issue']); + $out .= sprintf(" digest_file: %s\n", $entry['digest_file'] === null ? 'null' : "'" . $entry['digest_file'] . "'"); + $out .= sprintf(" phase: '%s'\n", $entry['phase']); + $out .= sprintf(" status: %s\n", $entry['status']); + if ($entry['class'] === null) { + $out .= " class: null\n"; + } elseif (is_array($entry['class'])) { + $out .= " class:\n"; + foreach ($entry['class'] as $cls) { + $out .= sprintf(" - %s\n", $cls); + } + } else { + $out .= sprintf(" class: %s\n", $entry['class']); + } + + if (empty($entry['files'])) { + $out .= " files: []\n"; + } else { + $out .= " files:\n"; + foreach ($entry['files'] as $file) { + $out .= sprintf(" - %s\n", $file); + } + } + } + + file_put_contents($outputFile, $out); +} + +/** + * @param array> $entries + * @return array + */ +function countByStatus(array $entries): array +{ + $counts = ['implemented' => 0, 'config-only' => 0, 'pending' => 0, 'unknown' => 0]; + foreach ($entries as $entry) { + $status = $entry['status']; + $counts[$status] = ($counts[$status] ?? 0) + 1; + } + return $counts; +} From dfe2577f13873880587ad10777c90176608af333 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 8 May 2026 12:34:37 +0200 Subject: [PATCH 126/256] =?UTF-8?q?fix(skills):=20agent-native=20review=20?= =?UTF-8?q?=E2=80=94=20tools,=20step=20numbering,=20path=20resolution?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - rector-live-test: add WebFetch/WebSearch to allowed-tools (search.tresbien.tech was unreachable with Read/Bash/Glob only); replace 'Navigate to' with concrete WebFetch instruction - rector-discover: fix duplicate step numbers (1,2,2,3,4,5 → 1,2,3,4,5,6); move ddev tip from Apply-filters step to the path-discovery step where it belongs - rector-implement QG-A: replace hardcoded ~/projects/drupal-core with ordered path probe (ddev mount first, then sibling, then home) - rector-implement QG-B: replace magic '10.0.0' stub with derived ..0 pattern so the agent uses the actual introduced version - rector-qa: same drupal-core path probe; replace ~/.claude/ skill reference with in-scope path; replace ~/projects/drupal-digests with DIGESTS_PATH variable --- .claude/skills/rector-discover/SKILL.md | 29 +++++++++++++----------- .claude/skills/rector-implement/SKILL.md | 12 ++++++---- .claude/skills/rector-live-test/SKILL.md | 14 ++++++++---- .claude/skills/rector-qa/SKILL.md | 8 +++---- 4 files changed, 38 insertions(+), 25 deletions(-) diff --git a/.claude/skills/rector-discover/SKILL.md b/.claude/skills/rector-discover/SKILL.md index b20fc7da8..122815093 100644 --- a/.claude/skills/rector-discover/SKILL.md +++ b/.claude/skills/rector-discover/SKILL.md @@ -38,6 +38,18 @@ fi echo "Using digests repo: $DIGESTS_PATH" ``` +**Tip:** To make `/var/www/drupal-digests` available permanently inside the ddev container, create `.ddev/docker-compose.digests.yaml` (gitignored — user-specific path): +```yaml +services: + web: + volumes: + - "/absolute/path/to/drupal-digests:/var/www/drupal-digests:ro" +``` +Then run `ddev restart`. On subsequent runs the first candidate path will match and no clone is needed. + +```bash +``` + ### 2. Ensure the index is fresh Check whether `docs/rector-index.yml` exists and is less than 24 hours old: @@ -52,26 +64,17 @@ else fi ``` -### 2. Read the index +### 3. Read the index Read `docs/rector-index.yml` completely. -### 3. Apply filters - -**Tip:** To make `/var/www/drupal-digests` available inside the ddev container, create `.ddev/docker-compose.digests.yaml` (gitignored): -```yaml -services: - web: - volumes: - - "/absolute/path/to/drupal-digests:/var/www/drupal-digests:ro" -``` -Then run `ddev restart`. +### 4. Apply filters If `$ARGUMENTS` contains `--phase X`, show only entries with `phase: 'X'`. If `$ARGUMENTS` contains `--limit N`, show only the first N entries. If `$ARGUMENTS` contains `--pending-only`, show only `status: pending` entries (default unless --all is passed). -### 4. Present results +### 5. Present results Print a summary header: ``` @@ -92,7 +95,7 @@ If all rules are implemented, print: All rules are implemented or have config-only entries. Nothing pending. ``` -### 5. Suggest next action +### 6. Suggest next action At the end, suggest the highest-priority pending rule to work on next (Phase 1a first, then 1b, 1c, 2, 3, 4): ``` diff --git a/.claude/skills/rector-implement/SKILL.md b/.claude/skills/rector-implement/SKILL.md index 66790acde..a71c1cbff 100644 --- a/.claude/skills/rector-implement/SKILL.md +++ b/.claude/skills/rector-implement/SKILL.md @@ -54,9 +54,13 @@ For every `MethodCall`, `NullsafeMethodCall`, or `PropertyFetch` node the rector 1. Is an `isObjectType()` guard present that constrains the owning class/interface? 2. If missing: - a. Find the owning interface/class in `~/projects/drupal-core`: + a. Find the owning interface/class in the Drupal core source. Try these paths in order: ```bash - grep -rn "function \|property \$" ~/projects/drupal-core/core --include="*.php" -l | head -5 + CORE_PATH="" + for c in "/var/www/drupal-core" "../drupal-core" "$HOME/projects/drupal-core"; do + [ -d "$c/core" ] && CORE_PATH="$c" && break + done + grep -rn "function \|property \$" "$CORE_PATH/core" --include="*.php" -l | head -5 ``` b. Check whether a stub exists: ```bash @@ -95,11 +99,11 @@ Apply only if the rector extends `AbstractDrupalCoreRector`. ``` This is the existing test — rename if needed or leave it. -2. Add `testBelowVersion()` method: +2. Add `testBelowVersion()` method. Use a version just below the rector's `introduced_version` (e.g., if introduced in `11.4.0`, use `11.3.0`): ```php public function testBelowVersion(): void { - AbstractDrupalCoreRector::setVersionOverride('10.0.0'); + AbstractDrupalCoreRector::setVersionOverride('..0'); try { $this->doTestFile(__DIR__ . '/fixture-below-version/basic.php.inc'); } finally { diff --git a/.claude/skills/rector-live-test/SKILL.md b/.claude/skills/rector-live-test/SKILL.md index 1bf9535e5..5b6375f90 100644 --- a/.claude/skills/rector-live-test/SKILL.md +++ b/.claude/skills/rector-live-test/SKILL.md @@ -2,7 +2,7 @@ name: rector-live-test description: Finds D11-compatible contrib modules that exercise a rector and runs it against them. Uses search.tresbien.tech as primary search tool, falls back to Drupal GitLab API. Pass rector class name or issue number as argument. argument-hint: "" -allowed-tools: Read, Bash, Glob +allowed-tools: Read, Bash, Glob, WebFetch, WebSearch --- # Rector Live Test @@ -34,15 +34,21 @@ Read the rector source to extract: **Primary: `search.tresbien.tech`** -Navigate to the search tool and search for the deprecated API pattern. This site searches Drupal contrib module code indexed from drupal.org. +Fetch the search results for the deprecated API pattern. This site indexes Drupal contrib module code: -Construct the search query: +``` +https://search.tresbien.tech/?q= +``` + +Construct the search term: - For method calls: `->methodName(` - For function calls: `functionName(` - For class constants: `ClassName::CONSTANT_NAME` - For properties: `->propertyName` -If fewer than 3 results, also check `docs/contrib-module-search.md` for pre-discovered matches from session 18. +Use `WebFetch` to retrieve the page and extract module names from the results. If the page format is unclear, try `WebSearch` with `site:search.tresbien.tech ` as a fallback. + +If fewer than 3 results, also check `docs/contrib-module-search.md` for pre-discovered matches. **Fallback: Drupal GitLab API blob search** diff --git a/.claude/skills/rector-qa/SKILL.md b/.claude/skills/rector-qa/SKILL.md index fb89a5e07..e7c022424 100644 --- a/.claude/skills/rector-qa/SKILL.md +++ b/.claude/skills/rector-qa/SKILL.md @@ -26,7 +26,7 @@ Read the rector class, test class, all fixture files, and the test config. ## Pass 1 — Type Guard Audit -**Goal:** Every `MethodCall`, `NullsafeMethodCall`, or `PropertyFetch` node the rector handles must be guarded by `isObjectType()`. See `~/.claude/skills/rector-type-check-review/SKILL.md` for the full pattern reference. +**Goal:** Every `MethodCall`, `NullsafeMethodCall`, or `PropertyFetch` node the rector handles must be guarded by `isObjectType()`. The full fix pattern is in `.claude/skills/rector-qa/SKILL.md` Pass 1 below, and in the `rector-type-check-review` skill if available. **Steps:** @@ -98,7 +98,7 @@ Update the verdict column from `⚠️ AT-RISK` to `✅ SAFE` after fixing. - New node (what `refactor()` or `refactorWithConfiguration()` returns) is CallLike if: same list - **Q3:** Was the deprecation introduced in Drupal >= 10.1.0? - Check `introduced_version` in the test config or `DrupalIntroducedVersionConfiguration` usage. - - If unclear, read `~/projects/drupal-digests/issues/drupal-core/.md`. + - If unclear, read `/issues/drupal-core/.md` (use the same digests path detection as `rector-discover` step 1). 3. Expected base class: - Q2 = CallLike → CallLike AND Q3 = version >= 10.1.0 → **`AbstractDrupalCoreRector`** @@ -126,9 +126,9 @@ Update the verdict column from `⚠️ AT-RISK` to `✅ SAFE` after fixing. 2. Determine the issue number and change record number: - The digest filename contains the **issue number** (last numeric group). - `~/projects/drupal-digests/issues/drupal-core/.md` contains the change record link if known. - - Alternatively, search `~/projects/drupal-core` for the deprecated function/method: + - Alternatively, search the Drupal core source for the deprecated function/method (try `/var/www/drupal-core`, `../drupal-core`, or `~/projects/drupal-core` in that order): ```bash - grep -rn "@deprecated in drupal:" ~/projects/drupal-core/core --include="*.php" | grep "" | head -5 + grep -rn "@deprecated in drupal:" /core --include="*.php" | grep "" | head -5 ``` The `@see` in the Drupal core deprecation notice usually points to the **change record**. From b3720a2c99580bdbbbe49d28397d162663e10fd5 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 8 May 2026 12:35:50 +0200 Subject: [PATCH 127/256] fix(rector-live-test): use correct search.tresbien.tech URL and query syntax Use /search endpoint, -r:drupal filter (not -r:core), Go regexp syntax, and standard filters (f:.php$, -f:test, lang:php). Includes example URL. --- .claude/skills/rector-live-test/SKILL.md | 29 +++++++++++++++++------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/.claude/skills/rector-live-test/SKILL.md b/.claude/skills/rector-live-test/SKILL.md index 5b6375f90..9decf6353 100644 --- a/.claude/skills/rector-live-test/SKILL.md +++ b/.claude/skills/rector-live-test/SKILL.md @@ -34,19 +34,32 @@ Read the rector source to extract: **Primary: `search.tresbien.tech`** -Fetch the search results for the deprecated API pattern. This site indexes Drupal contrib module code: +Use `WebFetch` to search this Drupal contrib code index. The base URL is: ``` -https://search.tresbien.tech/?q= +https://search.tresbien.tech/search?q=&num=0&ctx=0 ``` -Construct the search term: -- For method calls: `->methodName(` -- For function calls: `functionName(` -- For class constants: `ClassName::CONSTANT_NAME` -- For properties: `->propertyName` +**Always include `-r:drupal`** to exclude Drupal core from results (use `-r:drupal`, NOT `-r:core`). -Use `WebFetch` to retrieve the page and extract module names from the results. If the page format is unclear, try `WebSearch` with `site:search.tresbien.tech ` as a fallback. +Standard query construction: +- Method call: `-r:drupal ->methodName(` +- Function call: `-r:drupal functionName(` +- Class constant: `-r:drupal ClassName::CONSTANT_NAME` +- Property access: `-r:drupal ->propertyName` + +Additional filters to add as needed: +- `f:\.php$` — PHP files only (add `f:\.module$` if the pattern may appear in `.module` files) +- `-f:test` — exclude test files when you want production code only +- `lang:php` — PHP language filter +- `case:yes` — force case-sensitive match + +Example for `->delete(` on SessionManager: +``` +https://search.tresbien.tech/search?q=-r%3Adrupal+-%3Edelete(&num=0&ctx=0 +``` + +Parse the fetched page for matching file paths and extract the module/project name from the path prefix. If fewer than 3 results, also check `docs/contrib-module-search.md` for pre-discovered matches. From 6662a0336bf4220a4c9d00cb5a5e4e37c6369b67 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 8 May 2026 12:41:07 +0200 Subject: [PATCH 128/256] feat: add setup-repos.sh and switch skills to repos/ paths Clone drupal-digests and drupal-core into repos/ (gitignored) via scripts/setup-repos.sh so skills work inside ddev without external mounts. Updated all skill path references from ~/projects/... to repos/... and adjusted generate-rector-index.php default digest path. --- .claude/skills/rector-discover/SKILL.md | 40 ++++-------------- .claude/skills/rector-implement/SKILL.md | 15 ++----- .claude/skills/rector-qa/SKILL.md | 6 +-- .gitignore | 1 + scripts/generate-rector-index.php | 2 +- scripts/setup-repos.sh | 52 ++++++++++++++++++++++++ 6 files changed, 68 insertions(+), 48 deletions(-) create mode 100755 scripts/setup-repos.sh diff --git a/.claude/skills/rector-discover/SKILL.md b/.claude/skills/rector-discover/SKILL.md index 122815093..1664c2044 100644 --- a/.claude/skills/rector-discover/SKILL.md +++ b/.claude/skills/rector-discover/SKILL.md @@ -13,52 +13,26 @@ Show which drupal-digests deprecation rules still need to be implemented in drup ### 1. Ensure the digests repo is available -The generator needs access to `drupal-digests`. In a ddev context, `~/` resolves to the container home directory, so the repo must be present at a path accessible inside the container. Check the most common locations: +The canonical path is `repos/drupal-digests` (inside ddev: `/var/www/html/repos/drupal-digests`). If absent, run the setup script first: ```bash -# Check if the repo is accessible (inside ddev or on host) -DIGESTS_PATH="" -for candidate in \ - "/var/www/drupal-digests" \ - "../drupal-digests" \ - "$HOME/projects/drupal-digests"; do - if [ -d "$candidate/rector/rules" ]; then - DIGESTS_PATH="$candidate" - break - fi -done - -if [ -z "$DIGESTS_PATH" ]; then - echo "drupal-digests repo not found. Cloning to sibling directory…" - cd .. - git clone --depth=1 https://github.com/dbuytaert/drupal-digests.git - cd drupal-rector - DIGESTS_PATH="../drupal-digests" -fi -echo "Using digests repo: $DIGESTS_PATH" ``` -**Tip:** To make `/var/www/drupal-digests` available permanently inside the ddev container, create `.ddev/docker-compose.digests.yaml` (gitignored — user-specific path): -```yaml -services: - web: - volumes: - - "/absolute/path/to/drupal-digests:/var/www/drupal-digests:ro" -``` -Then run `ddev restart`. On subsequent runs the first candidate path will match and no clone is needed. +### 2. Ensure the index is fresh + +Check whether `docs/rector-index.yml` exists and is less than 24 hours old: ```bash +[ -d repos/drupal-digests ] || bash scripts/setup-repos.sh ``` ### 2. Ensure the index is fresh -Check whether `docs/rector-index.yml` exists and is less than 24 hours old: - ```bash INDEX="docs/rector-index.yml" if [ ! -f "$INDEX" ] || [ "$(find "$INDEX" -mmin +1440 2>/dev/null)" ]; then echo "Regenerating rector-index.yml…" - php scripts/generate-rector-index.php --digests-path="$DIGESTS_PATH" + php scripts/generate-rector-index.php --digests-path=repos/drupal-digests else echo "Using existing index ($(date -r "$INDEX" '+%Y-%m-%d %H:%M'))" fi @@ -99,7 +73,7 @@ All rules are implemented or have config-only entries. Nothing pending. At the end, suggest the highest-priority pending rule to work on next (Phase 1a first, then 1b, 1c, 2, 3, 4): ``` -Next suggested: /rector-implement ~/projects/drupal-digests/rector/rules/ +Next suggested: /rector-implement repos/drupal-digests/rector/rules/ ``` ## Phase Reference diff --git a/.claude/skills/rector-implement/SKILL.md b/.claude/skills/rector-implement/SKILL.md index a71c1cbff..141e8ef95 100644 --- a/.claude/skills/rector-implement/SKILL.md +++ b/.claude/skills/rector-implement/SKILL.md @@ -13,13 +13,10 @@ Convert a single drupal-digests rule into a drupal-rector–compliant implementa `$ARGUMENTS` must be the path to a drupal-digests rule file, e.g.: ``` -~/projects/drupal-digests/rector/rules/replace-deprecated-sessionmanager-delete-with-3577376.php +repos/drupal-digests/rector/rules/replace-deprecated-sessionmanager-delete-with-3577376.php ``` -The path can also be relative: if the repo is cloned as a sibling of drupal-rector, use: -``` -../drupal-digests/rector/rules/replace-deprecated-sessionmanager-delete-with-3577376.php -``` +If `repos/drupal-digests` does not exist yet, run `bash scripts/setup-repos.sh` first. ## Steps @@ -54,13 +51,9 @@ For every `MethodCall`, `NullsafeMethodCall`, or `PropertyFetch` node the rector 1. Is an `isObjectType()` guard present that constrains the owning class/interface? 2. If missing: - a. Find the owning interface/class in the Drupal core source. Try these paths in order: + a. Find the owning interface/class in the Drupal core source (`repos/drupal-core`). If absent, run `bash scripts/setup-repos.sh` first. ```bash - CORE_PATH="" - for c in "/var/www/drupal-core" "../drupal-core" "$HOME/projects/drupal-core"; do - [ -d "$c/core" ] && CORE_PATH="$c" && break - done - grep -rn "function \|property \$" "$CORE_PATH/core" --include="*.php" -l | head -5 + grep -rn "function \|property \$" repos/drupal-core/core --include="*.php" -l | head -5 ``` b. Check whether a stub exists: ```bash diff --git a/.claude/skills/rector-qa/SKILL.md b/.claude/skills/rector-qa/SKILL.md index e7c022424..68aed708b 100644 --- a/.claude/skills/rector-qa/SKILL.md +++ b/.claude/skills/rector-qa/SKILL.md @@ -98,7 +98,7 @@ Update the verdict column from `⚠️ AT-RISK` to `✅ SAFE` after fixing. - New node (what `refactor()` or `refactorWithConfiguration()` returns) is CallLike if: same list - **Q3:** Was the deprecation introduced in Drupal >= 10.1.0? - Check `introduced_version` in the test config or `DrupalIntroducedVersionConfiguration` usage. - - If unclear, read `/issues/drupal-core/.md` (use the same digests path detection as `rector-discover` step 1). + - If unclear, read `repos/drupal-digests/issues/drupal-core/.md`. 3. Expected base class: - Q2 = CallLike → CallLike AND Q3 = version >= 10.1.0 → **`AbstractDrupalCoreRector`** @@ -126,9 +126,9 @@ Update the verdict column from `⚠️ AT-RISK` to `✅ SAFE` after fixing. 2. Determine the issue number and change record number: - The digest filename contains the **issue number** (last numeric group). - `~/projects/drupal-digests/issues/drupal-core/.md` contains the change record link if known. - - Alternatively, search the Drupal core source for the deprecated function/method (try `/var/www/drupal-core`, `../drupal-core`, or `~/projects/drupal-core` in that order): + - Alternatively, search `repos/drupal-core` for the deprecated function/method (run `bash scripts/setup-repos.sh` if absent): ```bash - grep -rn "@deprecated in drupal:" /core --include="*.php" | grep "" | head -5 + grep -rn "@deprecated in drupal:" repos/drupal-core/core --include="*.php" | grep "" | head -5 ``` The `@see` in the Drupal core deprecation notice usually points to the **change record**. diff --git a/.gitignore b/.gitignore index 6ddc0c4ed..37dbea0a2 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,4 @@ .worktrees/ rector-decision.log docs/rector-index.yml +/repos/ diff --git a/scripts/generate-rector-index.php b/scripts/generate-rector-index.php index 7ae27b9cc..e37f440ef 100644 --- a/scripts/generate-rector-index.php +++ b/scripts/generate-rector-index.php @@ -29,7 +29,7 @@ function main(array $argv): void { - $digestsPath = expandPath('~/projects/drupal-digests'); + $digestsPath = dirname(__DIR__) . '/repos/drupal-digests'; foreach (array_slice($argv, 1) as $arg) { if ($arg === '--help') { diff --git a/scripts/setup-repos.sh b/scripts/setup-repos.sh new file mode 100755 index 000000000..5b9a89dc0 --- /dev/null +++ b/scripts/setup-repos.sh @@ -0,0 +1,52 @@ +#!/usr/bin/env bash +# Clones or updates the external repos that drupal-rector skills depend on. +# +# Usage: bash scripts/setup-repos.sh [--update] +# +# Without --update: skips repos that are already cloned. +# With --update: runs `git fetch --depth=1` on existing clones. +# +# Repos are cloned into repos/ (gitignored) so they are accessible from +# inside the ddev container at /var/www/html/repos/. + +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +REPOS_DIR="$SCRIPT_DIR/../repos" +UPDATE=false + +for arg in "$@"; do + [ "$arg" = "--update" ] && UPDATE=true +done + +mkdir -p "$REPOS_DIR" + +clone_or_update() { + local name="$1" + local url="$2" + local branch="${3:-}" + local dest="$REPOS_DIR/$name" + + if [ -d "$dest/.git" ]; then + if $UPDATE; then + echo "==> Updating $name..." + git -C "$dest" fetch --depth=1 ${branch:+origin "$branch"} 2>&1 | tail -3 + git -C "$dest" reset --hard FETCH_HEAD + else + echo "==> $name already cloned -skipping (use --update to refresh)" + fi + else + echo "==> Cloning $name..." + local clone_args=(--depth=1) + [ -n "$branch" ] && clone_args+=(--branch "$branch" --single-branch) + git clone "${clone_args[@]}" "$url" "$dest" + fi +} + +clone_or_update drupal-digests "https://github.com/dbuytaert/drupal-digests.git" +clone_or_update drupal-core "https://github.com/drupal/drupal.git" "11.x" + +echo "" +echo "Done. Repos available at:" +echo " repos/drupal-digests → /var/www/html/repos/drupal-digests (inside ddev)" +echo " repos/drupal-core → /var/www/html/repos/drupal-core (inside ddev)" From 679709e050c8b6bbcfbc5f0da93f6a8c1cc6378d Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 8 May 2026 13:12:39 +0200 Subject: [PATCH 129/256] skills: experiment with a few skills to generate the code --- .../scripts}/generate-rector-index.php | 7 +- {scripts => .claude/scripts}/setup-repos.sh | 4 +- .claude/skills/README.md | 117 ++++++++++++++++++ .../prompts}/digest-to-rector-prompt.md | 2 +- .../rector-type-specificity-checklist.md | 0 .claude/skills/rector-discover/SKILL.md | 6 +- .claude/skills/rector-implement/SKILL.md | 16 +-- .claude/skills/rector-live-test/SKILL.md | 8 +- .../rector-live-test}/setup-rector-test.sh | 9 +- .claude/skills/rector-qa/SKILL.md | 8 +- .../skills/rector-type-check-review/SKILL.md | 101 +++++++++++++++ 11 files changed, 247 insertions(+), 31 deletions(-) rename {scripts => .claude/scripts}/generate-rector-index.php (98%) rename {scripts => .claude/scripts}/setup-repos.sh (93%) create mode 100644 .claude/skills/README.md rename {docs => .claude/skills/prompts}/digest-to-rector-prompt.md (99%) rename {docs => .claude/skills/prompts}/rector-type-specificity-checklist.md (100%) rename {scripts => .claude/skills/rector-live-test}/setup-rector-test.sh (98%) create mode 100644 .claude/skills/rector-type-check-review/SKILL.md diff --git a/scripts/generate-rector-index.php b/.claude/scripts/generate-rector-index.php similarity index 98% rename from scripts/generate-rector-index.php rename to .claude/scripts/generate-rector-index.php index e37f440ef..28dd8a762 100644 --- a/scripts/generate-rector-index.php +++ b/.claude/scripts/generate-rector-index.php @@ -6,7 +6,7 @@ /** * Generates docs/rector-index.yml — single source of truth for D11 rector status. * - * Usage: php scripts/generate-rector-index.php [--digests-path=PATH] + * Usage: php .claude/scripts/generate-rector-index.php [--digests-path=PATH] * * Options: * --digests-path=PATH Path to drupal-digests repo (default: ~/projects/drupal-digests) @@ -29,7 +29,8 @@ function main(array $argv): void { - $digestsPath = dirname(__DIR__) . '/repos/drupal-digests'; + $repoRoot = dirname(dirname(__DIR__)); + $digestsPath = $repoRoot . '/repos/drupal-digests'; foreach (array_slice($argv, 1) as $arg) { if ($arg === '--help') { @@ -40,8 +41,6 @@ function main(array $argv): void $digestsPath = expandPath(substr($arg, 15)); } } - - $repoRoot = dirname(__DIR__); $rulesDir = $digestsPath . '/rector/rules'; if (!is_dir($rulesDir)) { diff --git a/scripts/setup-repos.sh b/.claude/scripts/setup-repos.sh similarity index 93% rename from scripts/setup-repos.sh rename to .claude/scripts/setup-repos.sh index 5b9a89dc0..092c698e4 100755 --- a/scripts/setup-repos.sh +++ b/.claude/scripts/setup-repos.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash # Clones or updates the external repos that drupal-rector skills depend on. # -# Usage: bash scripts/setup-repos.sh [--update] +# Usage: bash .claude/scripts/setup-repos.sh [--update] # # Without --update: skips repos that are already cloned. # With --update: runs `git fetch --depth=1` on existing clones. @@ -12,7 +12,7 @@ set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -REPOS_DIR="$SCRIPT_DIR/../repos" +REPOS_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)/repos" UPDATE=false for arg in "$@"; do diff --git a/.claude/skills/README.md b/.claude/skills/README.md new file mode 100644 index 000000000..2c6ec457f --- /dev/null +++ b/.claude/skills/README.md @@ -0,0 +1,117 @@ +# drupal-rector Claude Code Skills + +Claude Code skills for the drupal-rector development workflow. Each skill is a structured prompt that guides Claude through a specific task — invoke them with `/skill-name` in Claude Code. + +## Skills + +### `/rector-discover` + +Lists unimplemented rules from [drupal-digests](https://github.com/dbuytaert/drupal-digests), grouped by implementation phase. Use this to find what to work on next. + +``` +/rector-discover +/rector-discover --phase 2 +/rector-discover --phase 1a --limit 5 +``` + +Maintains `docs/rector-index.yml` as a derived index — regenerated automatically when absent or stale. + +--- + +### `/rector-implement ` + +Converts a single drupal-digests rule into a complete drupal-rector implementation with tests. Follows the 14-step canonical workflow in `.claude/skills/prompts/digest-to-rector-prompt.md` and enforces two additional quality gates: + +- **QG-A — Type Guard Audit**: ensures every `MethodCall`/`PropertyFetch` node is guarded by `isObjectType()` to avoid false positives on untyped code. +- **QG-B — Version-Gating Tests**: for BC-wrapped rectors (`AbstractDrupalCoreRector`), adds a `testBelowVersion()` test and a `fixture-below-version/` fixture proving the transformation is suppressed on older Drupal versions. + +``` +/rector-implement repos/drupal-digests/rector/rules/replace-deprecated-sessionmanager-delete-with-3577376.php +``` + +--- + +### `/rector-qa ` + +Four-pass quality review of an existing rector. Use before merging or when auditing existing implementations. + +| Pass | What it checks | +|------|---------------| +| 1 — Type Guard | `isObjectType()` guard present for all MethodCall/PropertyFetch nodes | +| 2 — Fixture Coverage | `basic.php.inc`, `no_change_unrelated.php.inc`, `fixture-below-version/` present as required | +| 3 — BC Decision | Base class (`AbstractRector` vs `AbstractDrupalCoreRector`) matches the deprecation's version and node type | +| 4 — @see URL | Docblock URL points to the correct Drupal.org issue or change record | + +Produces a `PASS / WARN / FAIL` verdict per pass and an overall merge-readiness summary. + +``` +/rector-qa ReplaceSessionManagerDeleteRector +``` + +--- + +### `/rector-live-test ` + +Finds real contrib modules that use the deprecated API a rector targets, then runs the rector against them to verify it transforms real-world code correctly. Uses [search.tresbien.tech](https://search.tresbien.tech) as primary search, falls back to the Drupal GitLab API. + +``` +/rector-live-test ReplaceSessionManagerDeleteRector +/rector-live-test 3577376 +``` + +Results report files changed per module and flag zero-match cases with a diagnosis table (untyped code, wrong module version, cache, node type mismatch). + +--- + +### `/rector-type-check-review [RectorClassName|all]` + +Audits rector rules for type-specificity: ensures every `MethodCall`, `NullsafeMethodCall`, and `PropertyFetch` node is guarded by `isObjectType()` so unrelated classes with the same method/property name are not accidentally transformed. + +Run on a single rector, or pass `all` (or no argument) to walk through every AT-RISK row in `.claude/skills/prompts/rector-type-specificity-checklist.md`. For each AT-RISK rector it finds the owning Drupal interface in `repos/drupal-core`, creates a stub if needed, adds the guard, and updates fixtures. + +``` +/rector-type-check-review ReplaceSessionManagerDeleteRector +/rector-type-check-review all +``` + +--- + +## Supporting scripts + +Located in `.claude/scripts/` — shared utilities invoked by the skills above. + +| Script | Purpose | +|--------|---------| +| `setup-repos.sh` | Clones `repos/drupal-digests` and `repos/drupal-core` (shallow). Pass `--update` to refresh. | +| `generate-rector-index.php` | Regenerates `docs/rector-index.yml` from the digests source. | + +The live-test integration setup lives alongside its skill in `.claude/skills/rector-live-test/`: + +| File | Purpose | +|------|---------| +| `setup-rector-test.sh` | Creates a DDEV Drupal 11 project with all contrib test modules wired to the local rector branch. | +| `drupal-rector-test/` | Companion directory for the generated test project. | + +## Workflow + +A typical cycle for adding a new rector: + +``` +/rector-discover --phase 2 --limit 1 + → picks the next pending rule + +/rector-implement repos/drupal-digests/rector/rules/.php + → writes rector class, fixture, test, config; runs phpstan + phpunit + +/rector-live-test + → validates against real contrib modules + +/rector-qa + → final four-pass quality check before opening a PR +``` + +## Requirements + +- PHP 8.1+ +- [DDEV](https://ddev.com) (for `setup-rector-test.sh` and running tests inside the container) +- Clone `repos/drupal-digests` and `repos/drupal-core` via `bash .claude/scripts/setup-repos.sh` diff --git a/docs/digest-to-rector-prompt.md b/.claude/skills/prompts/digest-to-rector-prompt.md similarity index 99% rename from docs/digest-to-rector-prompt.md rename to .claude/skills/prompts/digest-to-rector-prompt.md index 160a52612..d121c60c2 100644 --- a/docs/digest-to-rector-prompt.md +++ b/.claude/skills/prompts/digest-to-rector-prompt.md @@ -7,7 +7,7 @@ fully drupal-rector–compliant implementation with tests. **Usage:** Start a Claude Code session in the drupal-rector repository, then say: > Convert the drupal-digests rule at `[path-to-rule-file]` following the prompt in -> `docs/digest-to-rector-prompt.md`. +> `.claude/skills/prompts/digest-to-rector-prompt.md`. The agent will read both this document and the target rule, then produce all output files. diff --git a/docs/rector-type-specificity-checklist.md b/.claude/skills/prompts/rector-type-specificity-checklist.md similarity index 100% rename from docs/rector-type-specificity-checklist.md rename to .claude/skills/prompts/rector-type-specificity-checklist.md diff --git a/.claude/skills/rector-discover/SKILL.md b/.claude/skills/rector-discover/SKILL.md index 1664c2044..6966fa885 100644 --- a/.claude/skills/rector-discover/SKILL.md +++ b/.claude/skills/rector-discover/SKILL.md @@ -23,7 +23,7 @@ The canonical path is `repos/drupal-digests` (inside ddev: `/var/www/html/repos/ Check whether `docs/rector-index.yml` exists and is less than 24 hours old: ```bash -[ -d repos/drupal-digests ] || bash scripts/setup-repos.sh +[ -d repos/drupal-digests ] || bash .claude/scripts/setup-repos.sh ``` ### 2. Ensure the index is fresh @@ -32,7 +32,7 @@ Check whether `docs/rector-index.yml` exists and is less than 24 hours old: INDEX="docs/rector-index.yml" if [ ! -f "$INDEX" ] || [ "$(find "$INDEX" -mmin +1440 2>/dev/null)" ]; then echo "Regenerating rector-index.yml…" - php scripts/generate-rector-index.php --digests-path=repos/drupal-digests + php .claude/scripts/generate-rector-index.php --digests-path=repos/drupal-digests else echo "Using existing index ($(date -r "$INDEX" '+%Y-%m-%d %H:%M'))" fi @@ -91,7 +91,7 @@ Next suggested: /rector-implement repos/drupal-digests/rector/rules/.php" allowed-tools: Read, Write, Edit, Bash, Glob --- @@ -16,13 +16,13 @@ Convert a single drupal-digests rule into a drupal-rector–compliant implementa repos/drupal-digests/rector/rules/replace-deprecated-sessionmanager-delete-with-3577376.php ``` -If `repos/drupal-digests` does not exist yet, run `bash scripts/setup-repos.sh` first. +If `repos/drupal-digests` does not exist yet, run `bash .claude/scripts/setup-repos.sh` first. ## Steps ### Steps 1–14: Follow the canonical conversion workflow -Read `docs/digest-to-rector-prompt.md` completely and execute steps 1–14 as written there. +Read `.claude/skills/prompts/digest-to-rector-prompt.md` completely and execute steps 1–14 as written there. The canonical prompt covers: - Step 1: Confirm input and extract class name, node types, refactor logic, code samples, issue number @@ -41,7 +41,7 @@ The canonical prompt covers: - Step 13: Run the test (`vendor/bin/phpunit tests/src/Drupal11/Rector/Deprecation/[ClassName]/`) - Step 14: Commit -**Do not skip or abbreviate any step.** The `docs/digest-to-rector-prompt.md` prompt is authoritative. +**Do not skip or abbreviate any step.** The `.claude/skills/prompts/digest-to-rector-prompt.md` prompt is authoritative. --- @@ -51,7 +51,7 @@ For every `MethodCall`, `NullsafeMethodCall`, or `PropertyFetch` node the rector 1. Is an `isObjectType()` guard present that constrains the owning class/interface? 2. If missing: - a. Find the owning interface/class in the Drupal core source (`repos/drupal-core`). If absent, run `bash scripts/setup-repos.sh` first. + a. Find the owning interface/class in the Drupal core source (`repos/drupal-core`). If absent, run `bash .claude/scripts/setup-repos.sh` first. ```bash grep -rn "function \|property \$" repos/drupal-core/core --include="*.php" -l | head -5 ``` @@ -124,7 +124,7 @@ Apply only if the rector extends `AbstractDrupalCoreRector`. ```bash if [ -f docs/rector-index.yml ]; then - php scripts/generate-rector-index.php + php .claude/scripts/generate-rector-index.php fi ``` @@ -134,7 +134,7 @@ This marks the newly implemented rule as `implemented` in the index. ## Pre-flight Checklist -Before declaring the implementation complete, verify all items from `docs/digest-to-rector-prompt.md`'s final checklist, plus: +Before declaring the implementation complete, verify all items from `.claude/skills/prompts/digest-to-rector-prompt.md`'s final checklist, plus: - [ ] QG-A: `isObjectType()` guard present for all MethodCall/PropertyFetch nodes (or explicitly not needed) - [ ] QG-A: `no_change_unrelated.php.inc` fixture exists if a type guard was added @@ -145,4 +145,4 @@ Before declaring the implementation complete, verify all items from `docs/digest ## Quick Reference: Phase 1 (config-only) path -If Step 4b determines a generic rector handles this rule, follow the "config-only" path in `docs/digest-to-rector-prompt.md` Step 4b instead of generating a custom class. No custom PHP class is written — only a config entry and fixture are added. +If Step 4b determines a generic rector handles this rule, follow the "config-only" path in `.claude/skills/prompts/digest-to-rector-prompt.md` Step 4b instead of generating a custom class. No custom PHP class is written — only a config entry and fixture are added. diff --git a/.claude/skills/rector-live-test/SKILL.md b/.claude/skills/rector-live-test/SKILL.md index 9decf6353..ea5d8febd 100644 --- a/.claude/skills/rector-live-test/SKILL.md +++ b/.claude/skills/rector-live-test/SKILL.md @@ -94,14 +94,14 @@ Update docs/contrib-module-search.md with findings. Check whether the integration test setup exists: ```bash -ls scripts/setup-rector-test.sh scripts/drupal-rector-test/ 2>/dev/null +ls .claude/skills/rector-live-test/setup-rector-test.sh .claude/skills/rector-live-test/drupal-rector-test/ 2>/dev/null ``` **If the setup exists:** -Add target modules to `scripts/drupal-rector-test/composer.json`, then run: +Add target modules to `.claude/skills/rector-live-test/drupal-rector-test/composer.json`, then run: ```bash -bash scripts/setup-rector-test.sh --rector --no-cache +bash .claude/skills/rector-live-test/setup-rector-test.sh --rector --no-cache ``` Always pass `--no-cache` to prevent stale rector results from a prior run. @@ -112,7 +112,7 @@ Parse the output for: **If the setup does not exist:** -Report that integration testing requires `scripts/setup-rector-test.sh` and provide manual instructions: +Report that integration testing requires `.claude/skills/rector-live-test/setup-rector-test.sh` and provide manual instructions: 1. Clone a D11-compatible module into a Drupal 11 site 2. Run: `ddev exec vendor/bin/rector process --config drupal-rector.php --no-cache` diff --git a/scripts/setup-rector-test.sh b/.claude/skills/rector-live-test/setup-rector-test.sh similarity index 98% rename from scripts/setup-rector-test.sh rename to .claude/skills/rector-live-test/setup-rector-test.sh index 87f5e16ee..e07a1fd61 100755 --- a/scripts/setup-rector-test.sh +++ b/.claude/skills/rector-live-test/setup-rector-test.sh @@ -3,19 +3,18 @@ # rectors, wires in the local drupal-rector branch, and runs rector so you can # review the resulting diff. # -# Usage: ./scripts/setup-rector-test.sh [project-name] +# Usage: bash .claude/skills/rector-live-test/setup-rector-test.sh [project-name] # Default project name: drupal-rector-test -# Default location: ../../ (sibling of the rector repo) +# Default location: / (sibling of the rector repo) set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -RECTOR_REPO="$(cd "$SCRIPT_DIR/.." && pwd)" +RECTOR_REPO="$(cd "$SCRIPT_DIR/../../.." && pwd)" RECTOR_BRANCH="feature/digest-rectors" PROJECT_NAME="${1:-drupal-rector-test}" -# Two levels up from this script (scripts/ → repo-root → parent) then the project name. -TARGET_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)/$PROJECT_NAME" +TARGET_DIR="$(cd "$RECTOR_REPO/.." && pwd)/$PROJECT_NAME" echo "==> Project directory : $TARGET_DIR" echo "==> drupal-rector repo : $RECTOR_REPO ($RECTOR_BRANCH)" diff --git a/.claude/skills/rector-qa/SKILL.md b/.claude/skills/rector-qa/SKILL.md index 68aed708b..0e67c24df 100644 --- a/.claude/skills/rector-qa/SKILL.md +++ b/.claude/skills/rector-qa/SKILL.md @@ -41,11 +41,11 @@ Read the rector class, test class, all fixture files, and the test config. **Output:** `Pass 1: [SAFE|AT-RISK|EXEMPT] — ` -**If AT-RISK:** Propose the fix (see `rector-type-check-review` skill for exact fix pattern). Apply it and update `docs/rector-type-specificity-checklist.md`: +**If AT-RISK:** Propose the fix (see `rector-type-check-review` skill for exact fix pattern). Apply it and update `.claude/skills/prompts/rector-type-specificity-checklist.md`: ```bash # Find the row for this rector in the checklist -grep -n "" docs/rector-type-specificity-checklist.md +grep -n "" .claude/skills/prompts/rector-type-specificity-checklist.md ``` Update the verdict column from `⚠️ AT-RISK` to `✅ SAFE` after fixing. @@ -85,7 +85,7 @@ Update the verdict column from `⚠️ AT-RISK` to `✅ SAFE` after fixing. ## Pass 3 — BC Decision Audit -**Goal:** The base class (`AbstractRector` vs `AbstractDrupalCoreRector`) must match the Step 4 classification from `docs/digest-to-rector-prompt.md`. +**Goal:** The base class (`AbstractRector` vs `AbstractDrupalCoreRector`) must match the Step 4 classification from `.claude/skills/prompts/digest-to-rector-prompt.md`. **Steps:** @@ -126,7 +126,7 @@ Update the verdict column from `⚠️ AT-RISK` to `✅ SAFE` after fixing. 2. Determine the issue number and change record number: - The digest filename contains the **issue number** (last numeric group). - `~/projects/drupal-digests/issues/drupal-core/.md` contains the change record link if known. - - Alternatively, search `repos/drupal-core` for the deprecated function/method (run `bash scripts/setup-repos.sh` if absent): + - Alternatively, search `repos/drupal-core` for the deprecated function/method (run `bash .claude/scripts/setup-repos.sh` if absent): ```bash grep -rn "@deprecated in drupal:" repos/drupal-core/core --include="*.php" | grep "" | head -5 ``` diff --git a/.claude/skills/rector-type-check-review/SKILL.md b/.claude/skills/rector-type-check-review/SKILL.md new file mode 100644 index 000000000..3fda0f5fc --- /dev/null +++ b/.claude/skills/rector-type-check-review/SKILL.md @@ -0,0 +1,101 @@ +--- +name: rector-type-check-review +description: Reviews Drupal rector rules for type-specificity — ensures method calls, property accesses, and $this references are guarded by isObjectType() or equivalent before transforming. Use when checking rectors that match by name alone without verifying the owning class. Run on individual rectors or walk through the whole branch list. +argument-hint: "[RectorClassName or 'all' or leave empty to use checklist]" +allowed-tools: Read, Bash, Edit, Write, Glob +--- + +# Rector Type-Check Review + +Rector rules that match a method call (`->foo()`), property access (`->bar`), or `$this` usage by *name only* — without verifying the owning class or interface — are a false-positive risk. Any unrelated class that happens to have the same method/property name will be transformed. + +This skill evaluates one or more rectors for this issue and, when a problem is found, proposes or implements the fix. + +## The Problem, Summarised + +| Pattern | What to look for | Risk if missing | +|---------|-----------------|-----------------| +| `->method()` on a variable | `isObjectType($node->var, new ObjectType('Fully\Qualified\Interface'))` | Any class with this method name is transformed | +| `->property` on a variable | Same `isObjectType` on `$node->var` | Any class with this property is transformed | +| `$this->method()` inside a class body | `isObjectType($node->var, ...)` or `extends`-check on the enclosing `Class_` node | Any class with this method is transformed, not just the intended subclass | +| `ClassName::method()` static call | `isName($node->class, 'ClassName')` or `isObjectType` | Low risk if the class name is unique, but still worth verifying | +| Global function call `foo()` | None needed | SAFE — function names are global | +| Class *declaration* (`class Foo extends Bar`) | Check `extends` on the `Class_` node before inspecting methods | EXEMPT category — different pattern | + +## Steps for Each Rector + +1. **Read** the rector source file. +2. **Identify** what node types it matches (look at `getNodeTypes()` and the early-return guards in `refactor()`). +3. **Check the guard**: for every method call, property fetch, or `$this` reference, is there an `isObjectType()` call that constrains the owning class? +4. **Classify**: + - `SAFE` — correct type guard present, or targets global functions/constants only + - `AT-RISK` — matches name without a type guard; needs fixing + - `EXEMPT` — operates on a class declaration and checks the parent class +5. **For AT-RISK rectors**: identify the Drupal class or interface that owns the deprecated member, check whether a stub exists in `stubs/`, add one if needed, then add the `isObjectType` guard and update fixtures. + +## Finding the Right Class/Interface + +For the `isObjectType` guard you need the FQCN of the interface or class that declares the deprecated member. Look it up in `repos/drupal-core` (run `bash .claude/scripts/setup-repos.sh` if absent): + +```bash +grep -rn "function \|property \$" repos/drupal-core/core --include="*.php" -l | head -5 +``` + +Prefer the *interface* over the concrete class when one exists — this catches all implementations. + +## Stub Pattern + +If the class is not already in `stubs/`, create a minimal stub: + +```php +.php" +``` + +Then apply the five steps above to that single rector only. + +## What a Fix Looks Like + +```php +// Before — matches any ->save() call: +if (!$this->isName($node->name, 'save')) { + return null; +} + +// After — only matches Config::save(): +if (!$this->isName($node->name, 'save')) { + return null; +} +if (!$this->isObjectType($node->var, new ObjectType('Drupal\Core\Config\Config'))) { + return null; +} +``` + +Always add the `isObjectType` check *after* the name check so PHPStan's heavier type resolution only runs when the name already matches. From 0210a6c1ce0f6b72f4f7082edfb85f891f406dd6 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 8 May 2026 13:17:33 +0200 Subject: [PATCH 130/256] feat(Drupal11): Add DeprecatedFilterFunctionsRector for issue #3226806 Replaces deprecated _filter_autop(), _filter_html_escape(), and _filter_html_image_secure_process() with plugin.manager.filter createInstance() chains. BC-wrapped for Drupal 11.4.0. --- .../DeprecatedFilterFunctionsRector.php | 125 ++++++++++++++++++ .../DeprecatedFilterFunctionsRectorTest.php | 54 ++++++++ .../config/configured_rule.php | 14 ++ .../fixture-below-version/basic.php.inc | 15 +++ .../fixture/basic.php.inc | 15 +++ 5 files changed, 223 insertions(+) create mode 100644 src/Drupal11/Rector/Deprecation/DeprecatedFilterFunctionsRector.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/DeprecatedFilterFunctionsRector/DeprecatedFilterFunctionsRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/DeprecatedFilterFunctionsRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/DeprecatedFilterFunctionsRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/DeprecatedFilterFunctionsRector/fixture/basic.php.inc diff --git a/src/Drupal11/Rector/Deprecation/DeprecatedFilterFunctionsRector.php b/src/Drupal11/Rector/Deprecation/DeprecatedFilterFunctionsRector.php new file mode 100644 index 000000000..c2517d4f7 --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/DeprecatedFilterFunctionsRector.php @@ -0,0 +1,125 @@ + + */ + private const FUNCTION_TO_PLUGIN_ID = [ + '_filter_autop' => 'filter_autop', + '_filter_html_escape' => 'filter_html_escape', + '_filter_html_image_secure_process' => 'filter_html_image_secure', + ]; + + /** @var DrupalIntroducedVersionConfiguration[] */ + protected array $configuration; + + public function configure(array $configuration): void + { + foreach ($configuration as $value) { + if (!$value instanceof DrupalIntroducedVersionConfiguration) { + throw new \InvalidArgumentException(sprintf('Each configuration item must be an instance of "%s"', DrupalIntroducedVersionConfiguration::class)); + } + } + parent::configure($configuration); + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition( + 'Replace deprecated _filter_autop(), _filter_html_escape(), and _filter_html_image_secure_process() with plugin manager calls.', + [ + new ConfiguredCodeSample( + <<<'CODE_BEFORE' +_filter_autop($text) +CODE_BEFORE, + <<<'CODE_AFTER' +\Drupal::service('plugin.manager.filter')->createInstance('filter_autop')->process($text, \Drupal::languageManager()->getCurrentLanguage()->getId())->getProcessedText() +CODE_AFTER, + [new DrupalIntroducedVersionConfiguration('11.4.0')] + ), + ] + ); + } + + /** @return array> */ + public function getNodeTypes(): array + { + return [FuncCall::class]; + } + + public function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node + { + assert($node instanceof FuncCall); + + if (!$node->name instanceof Name) { + return null; + } + + $funcName = $this->getName($node->name); + + if (!isset(self::FUNCTION_TO_PLUGIN_ID[$funcName])) { + return null; + } + + if (count($node->args) < 1) { + return null; + } + + $pluginId = self::FUNCTION_TO_PLUGIN_ID[$funcName]; + + $textArg = $node->args[0]; + $textExpr = $textArg instanceof Arg ? $textArg->value : $textArg; + + // Build: \Drupal::languageManager()->getCurrentLanguage()->getId() + $drupalLanguageManager = $this->nodeFactory->createStaticCall('Drupal', 'languageManager'); + $getCurrentLanguage = $this->nodeFactory->createMethodCall($drupalLanguageManager, 'getCurrentLanguage'); + $getLangcodeExpr = $this->nodeFactory->createMethodCall($getCurrentLanguage, 'getId'); + + // Build: \Drupal::service('plugin.manager.filter') + $drupalService = $this->nodeFactory->createStaticCall('Drupal', 'service', [ + new String_('plugin.manager.filter'), + ]); + + // ->createInstance('filter_autop') (or other plugin id) + $createInstance = $this->nodeFactory->createMethodCall($drupalService, 'createInstance', [ + new String_($pluginId), + ]); + + // ->process($text, $langcode) + $process = $this->nodeFactory->createMethodCall($createInstance, 'process', [ + $textExpr, + $getLangcodeExpr, + ]); + + // ->getProcessedText() + return $this->nodeFactory->createMethodCall($process, 'getProcessedText'); + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/DeprecatedFilterFunctionsRector/DeprecatedFilterFunctionsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/DeprecatedFilterFunctionsRector/DeprecatedFilterFunctionsRectorTest.php new file mode 100644 index 000000000..e5b2e72df --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/DeprecatedFilterFunctionsRector/DeprecatedFilterFunctionsRectorTest.php @@ -0,0 +1,54 @@ +doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/DeprecatedFilterFunctionsRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/DeprecatedFilterFunctionsRector/config/configured_rule.php new file mode 100644 index 000000000..db9b87a6e --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/DeprecatedFilterFunctionsRector/config/configured_rule.php @@ -0,0 +1,14 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/DeprecatedFilterFunctionsRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/DeprecatedFilterFunctionsRector/fixture/basic.php.inc new file mode 100644 index 000000000..387d7484e --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/DeprecatedFilterFunctionsRector/fixture/basic.php.inc @@ -0,0 +1,15 @@ + +----- + \Drupal::service('plugin.manager.filter')->createInstance('filter_autop')->process($text, \Drupal::languageManager()->getCurrentLanguage()->getId())->getProcessedText(), fn() => _filter_autop($text)); +$result2 = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('plugin.manager.filter')->createInstance('filter_html_escape')->process($text, \Drupal::languageManager()->getCurrentLanguage()->getId())->getProcessedText(), fn() => _filter_html_escape($text)); +$result3 = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('plugin.manager.filter')->createInstance('filter_html_image_secure')->process($text, \Drupal::languageManager()->getCurrentLanguage()->getId())->getProcessedText(), fn() => _filter_html_image_secure_process($text, $filter)); + +?> From 825035ebd6ea5945c10662c337a89c8f8d89129f Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 8 May 2026 13:40:14 +0200 Subject: [PATCH 131/256] chore: clean up docs and test files --- .../skills/prompts/analyse-test-results.md | 2 +- .../skills/prompts/digest-to-rector-prompt.md | 37 +- .claude/skills/rector-live-test/SKILL.md | 13 +- .../rector-live-test/setup-rector-test.sh | 16 +- docs/analysis-2026-05-08.md | 140 - docs/contrib-module-search.md | 220 - docs/digest-comparison-report-0505.md | 576 - docs/digest-comparison-report-fresh.md | 554 - docs/digest-comparison-report.md | 619 - docs/digest-to-rector-mapping.md | 542 - docs/filter_d11.py | 155 - docs/filter_progress.log | 1228 - docs/find_d11_for_rectors.py | 210 - docs/find_d11_targeted.py | 150 - docs/pass2_progress.log | 220 - docs/pass2_results.json | 8 - ...2026-05-08-001-fix-rector-test-failures.md | 151 - docs/plans/no-match-investigation.md | 164 - docs/rector-qa-checklist.md | 864 - docs/search_modules.py | 168 - docs/search_progress.log | 1348 - docs/search_results.json | 24248 ---------------- docs/targeted_progress.log | 351 - docs/targeted_results.json | 174 - 24 files changed, 34 insertions(+), 32124 deletions(-) rename docs/analys-log-prompt.md => .claude/skills/prompts/analyse-test-results.md (90%) delete mode 100644 docs/analysis-2026-05-08.md delete mode 100644 docs/contrib-module-search.md delete mode 100644 docs/digest-comparison-report-0505.md delete mode 100644 docs/digest-comparison-report-fresh.md delete mode 100644 docs/digest-comparison-report.md delete mode 100644 docs/digest-to-rector-mapping.md delete mode 100644 docs/filter_d11.py delete mode 100644 docs/filter_progress.log delete mode 100644 docs/find_d11_for_rectors.py delete mode 100644 docs/find_d11_targeted.py delete mode 100644 docs/pass2_progress.log delete mode 100644 docs/pass2_results.json delete mode 100644 docs/plans/2026-05-08-001-fix-rector-test-failures.md delete mode 100644 docs/plans/no-match-investigation.md delete mode 100644 docs/rector-qa-checklist.md delete mode 100644 docs/search_modules.py delete mode 100644 docs/search_progress.log delete mode 100644 docs/search_results.json delete mode 100644 docs/targeted_progress.log delete mode 100644 docs/targeted_results.json diff --git a/docs/analys-log-prompt.md b/.claude/skills/prompts/analyse-test-results.md similarity index 90% rename from docs/analys-log-prompt.md rename to .claude/skills/prompts/analyse-test-results.md index fe1e898cf..ced171ea6 100644 --- a/docs/analys-log-prompt.md +++ b/.claude/skills/prompts/analyse-test-results.md @@ -1,5 +1,5 @@ --- -Analyze the rector test log at ~/projects/drupal-rector-test2/rector-test.log. The user wants to know: +Analyze the rector test log generated after running the rector-live-test. The user wants to know: 1. Which rectors might not be working correctly (failures, errors, unexpected behavior) 2. Which rectors should trigger but don't (missed transformations) diff --git a/.claude/skills/prompts/digest-to-rector-prompt.md b/.claude/skills/prompts/digest-to-rector-prompt.md index d121c60c2..8e532144d 100644 --- a/.claude/skills/prompts/digest-to-rector-prompt.md +++ b/.claude/skills/prompts/digest-to-rector-prompt.md @@ -11,9 +11,6 @@ fully drupal-rector–compliant implementation with tests. The agent will read both this document and the target rule, then produce all output files. -**Reference:** See `docs/digest-to-rector-mapping.md` for the full pattern mapping this prompt -is based on. - --- ## Prerequisites @@ -108,6 +105,17 @@ Answer these questions using the information gathered: - BC wrapping applies → Use `AbstractDrupalCoreRector` + `DrupalIntroducedVersionConfiguration` - BC wrapping does not apply → Use `AbstractRector` +**Quick reference:** + +| Input node | Output node | Introduced | Base class | BC wrapping | +|---|---|---|---|---| +| `FuncCall` | `StaticCall` | >= 10.1.0 | `AbstractDrupalCoreRector` | Yes | +| `FuncCall` | `MethodCall` | >= 10.1.0 | `AbstractDrupalCoreRector` | Yes | +| `FuncCall` | `StaticCall` | < 10.1.0 | `AbstractRector` | No | +| `ClassConstFetch` | `ClassConstFetch` | any | `AbstractRector` | No | +| `New_` (arg modification) | `New_` | any | `AbstractRector` | No | +| `Class_` (structural) | `Class_` | any | `AbstractRector` | No | + --- ## Step 4b — Check for existing generic rectors (BEFORE writing a custom class) @@ -330,9 +338,12 @@ CODE_AFTER, - Remove `final` keyword — drupal-rector classes are not final. - Remove `use Rector\Config\RectorConfig` from the rule class (it belongs only in config files). - Keep all private constants, arrays, and helper methods unchanged. -- For multi-node-type rules (two or more different node types in `getNodeTypes()`), check if any - combination requires BC. If only some transformations need BC and others don't, split into two - separate rector classes. See `docs/digest-to-rector-mapping.md` section 8. +- For multi-node-type rules (two or more different node types in `getNodeTypes()`): + - **If both transformations are simple (no BC):** Keep them in one class, use `AbstractRector`. + Both node types go in `getNodeTypes()` and are handled by type-checking inside `refactor()`. + - **If one needs BC and the other doesn't:** Split into two separate rector classes. + `AbstractDrupalCoreRector::refactor()` assumes all transformations share the same BC + configuration, so mixing is not possible in a single class. --- @@ -443,6 +454,20 @@ return static function (RectorConfig $rectorConfig): void { **Note:** Set the third argument of `DeprecationBase::addClass()` to `true` only if the rule uses `AddCommentService` to insert human-review notices. This is uncommon — most rules use `false`. +**When to use `AddCommentService`:** Only when the transformation is not fully automatic and +requires developer judgment (e.g., the digests rule contains a `// TODO` comment in the output, +or the replacement differs depending on context). Deterministic one-to-one replacements never +need it. + +If used, inject it in the constructor and call it in `refactor()`/`refactorWithConfiguration()`: + +```php +public function __construct(private readonly AddCommentService $commentService) {} + +// Inside refactor(): +$this->commentService->addDrupalRectorComment($node, 'Please verify this change manually.'); +``` + --- ## Step 10 — Write all files diff --git a/.claude/skills/rector-live-test/SKILL.md b/.claude/skills/rector-live-test/SKILL.md index ea5d8febd..3a756d464 100644 --- a/.claude/skills/rector-live-test/SKILL.md +++ b/.claude/skills/rector-live-test/SKILL.md @@ -61,8 +61,6 @@ https://search.tresbien.tech/search?q=-r%3Adrupal+-%3Edelete(&num=0&ctx=0 Parse the fetched page for matching file paths and extract the module/project name from the path prefix. -If fewer than 3 results, also check `docs/contrib-module-search.md` for pre-discovered matches. - **Fallback: Drupal GitLab API blob search** If `search.tresbien.tech` yields no results or is unavailable: @@ -87,7 +85,6 @@ If no D11-compatible modules are found, report: ``` No D11-compatible contrib modules found for . Try manually: https://git.drupalcode.org/search?group_id=2&scope=blobs&search= -Update docs/contrib-module-search.md with findings. ``` ### 4. Run the rector (if setup script exists) @@ -128,7 +125,7 @@ For each tested module, report: ### 6. Diagnose zero-match results -If a module was found but 0 files were changed, investigate using `docs/no-match-investigation.md` (if it exists). Common causes: +Common causes: | Cause | Diagnosis | Fix | |-------|-----------|-----| @@ -138,11 +135,3 @@ If a module was found but 0 files were changed, investigate using `docs/no-match | Rector cache | Old cache silently skips files | Already handled by `--no-cache` | | getNodeTypes mismatch | The node type returned by the rector doesn't match the actual AST node | Read the digest rule and the actual module code to compare | -### 7. Update contrib search doc - -After running, update `docs/contrib-module-search.md` with the modules found (or confirmed absent): -``` -### -- **Search:** `` -- **Modules found:** , or — -``` diff --git a/.claude/skills/rector-live-test/setup-rector-test.sh b/.claude/skills/rector-live-test/setup-rector-test.sh index e07a1fd61..fd1f78bf2 100755 --- a/.claude/skills/rector-live-test/setup-rector-test.sh +++ b/.claude/skills/rector-live-test/setup-rector-test.sh @@ -80,8 +80,6 @@ ddev composer require \ # --------------------------------------------------------------------------- # 4. Require contrib modules (≥2 per rector where possible) -# See docs/contrib-modules-d11.md for the full coverage mapping. -# Note: 8 rectors have no testable D11 contrib module (see comments in test script). # --------------------------------------------------------------------------- echo "" echo "==> Requiring contrib modules…" @@ -460,16 +458,4 @@ echo "" echo " # Log is written to: $TARGET_DIR/rector-test.log" echo "" echo " Site: run 'ddev launch' | Admin: admin / admin" -echo "" -echo " Coverage notes (see docs/contrib-modules-d11.md):" -echo " * 18 rectors skipped — pattern exhausted or no D11 contrib usage found" -echo " (ErrorCurrentErrorHandler, RemoveAutomatedCronSubmitHandler," -echo " RemoveLinkWidgetValidateTitleElement, RemoveModuleHandlerDeprecatedMethods," -echo " RemoveSetUriCallback, RemoveStateCacheSetting," -echo " RemoveTwigNodeTransTagArgument, RenameStopProceduralHookScan," -echo " ReplaceAlphadecimalToIntNull, ReplaceCommentUri, ReplaceEditorLoad," -echo " ReplaceEntityReferenceRecursiveLimit, ReplaceLocaleConfigBatchFunctions," -echo " ReplaceNodeAccessViewAllNodes, ReplaceRequestTimeConstant," -echo " ReplaceSessionWritesWithRequestSession, ReplaceSystemPerformanceGzipKey," -echo " ReplaceUserSessionNameProperty, StatementPrefetchIteratorFetchColumn)" -echo " * Core is installed at 11.x-dev (11.4-dev) so all 11.4 version gates are active." + diff --git a/docs/analysis-2026-05-08.md b/docs/analysis-2026-05-08.md deleted file mode 100644 index ca420cd34..000000000 --- a/docs/analysis-2026-05-08.md +++ /dev/null @@ -1,140 +0,0 @@ -# Drupal Rector Test Run Analysis — 2026-05-08 - -**Log source:** `~/projects/drupal-rector-test/rector-test.log` -**Run timestamp:** Wed May 6 17:29:44 CEST 2026 - ---- - -## Summary - -| Category | Count | -|----------|-------| -| Passing (files changed) | 24 | -| Skipped (no modules) | 21 | -| No changes found | 2 | -| Interrupted / incomplete | 3 | -| Total file changes (dry-run) | 38 | - ---- - -## Full Results Table - -| Rector | Status | Files Changed | Modules | -|--------|--------|---------------|---------| -| ErrorCurrentErrorHandlerRector | SKIP | — | — | -| FileSystemBasenameToNativeRector | PASS | 1 | stage_file_proxy | -| LoadAllIncludesRector | PASS | 1 | schemadotorg | -| MigrateSqlGetMigrationPluginManagerRector | PASS | 1 | smart_sql_idmap | -| NodeStorageDeprecatedMethodsRector | PASS | 1 | workflow_buttons | -| PluginBaseIsConfigurableRector | PASS | 1 | metatag | -| RemoveAutomatedCronSubmitHandlerRector | SKIP | — | — | -| RemoveCacheExpireOverrideRector | PASS | 1 | vcp4dates | -| RemoveHandlerBaseDefineExtraOptionsRector | PASS | 1 | views_dependent_filters | -| RemoveLinkWidgetValidateTitleElementRector | SKIP | — | — | -| RemoveModuleHandlerAddModuleCallsRector | PASS | 1 | config_track | -| RemoveModuleHandlerDeprecatedMethodsRector | SKIP | — | — | -| RemoveRootFromConvertDbUrlRector | PASS | 1 | sparql_entity_storage | -| RemoveSetUriCallbackRector | SKIP | — | — | -| RemoveStateCacheSettingRector | SKIP | — | — | -| RemoveTrustDataCallRector | INTERRUPTED | — | views_dependent_filters, group | -| RemoveTwigNodeTransTagArgumentRector | SKIP | — | — | -| RemoveUpdaterPostInstallMethodsRector | INTERRUPTED | — | group, gnode_request | -| RemoveViewsRowCacheKeysRector | PASS | 2 | metatag, views_advanced_cache | -| RenameStopProceduralHookScanRector | SKIP | — | — | -| ReplaceAlphadecimalToIntNullRector | SKIP | — | — | -| ReplaceCommentManagerGetCountNewCommentsRector | INTERRUPTED | — | forum, history | -| ReplaceCommentUriRector | SKIP | — | — | -| ReplaceDateTimeRangeConstantsRector | PASS | 1 | scheduler_field | -| ReplaceEditorLoadRector | SKIP | — | — | -| ReplaceEntityOriginalPropertyRector | PASS | 2 | media_auto_publication, entity_usage | -| ReplaceEntityReferenceRecursiveLimitRector | SKIP | — | — | -| ReplaceFieldgroupToFieldsetRector | PASS | 1 | webform | -| ReplaceFileGetContentHeadersRector | PASS | 2 | commerce_invoice, tmgmt | -| ReplaceLocaleConfigBatchFunctionsRector | SKIP | — | — | -| ReplaceModuleHandlerGetNameRector (D10) | PASS | 1 | mailsystem *(appears twice in log — test script bug)* | -| ReplaceNodeAccessViewAllNodesRector | SKIP | — | — | -| ReplaceNodeAddBodyFieldRector | PASS | 1 | tome | -| ReplaceNodeModuleProceduralFunctionsRector | PASS | 3 | addanother, reassign_user_content | -| ReplaceNodeSetPreviewModeRector | PASS | 1 | responsive_preview | -| ReplacePdoFetchConstantsRector | PASS | 8 | acquia_contenthub, gdpr | -| ReplaceRebuildThemeDataRector (D10) | PASS | 1 | site_guardian | -| ReplaceRecipeRunnerInstallModuleRector | SKIP | — | — | -| ReplaceRequestTimeConstantRector | SKIP | — | — | -| ReplaceSessionManagerDeleteRector | NO CHANGES | 0 | role_expire | -| ReplaceSessionWritesWithRequestSessionRector | SKIP | — | — | -| ReplaceSystemPerformanceGzipKeyRector | SKIP | — | — | -| ReplaceThemeGetSettingRector | SKIP | — | — | -| ReplaceUserSessionNamePropertyRector | SKIP | — | — | -| ReplaceViewsProceduralFunctionsRector | PASS | 1 | quicktabs | -| StatementPrefetchIteratorFetchColumnRector | SKIP | — | — | -| StripMigrationDependenciesExpandArgRector | NO CHANGES | 0 | migrate_tools | -| SystemTimeZonesRector (D10) | PASS | 1 | smart_date | -| UseEntityTypeHasIntegerIdRector | PASS | 2 | association, commerce_invoice | -| ViewsPluginHandlerManagerRector | PASS | 1 | search_api | - ---- - -## Interrupted / Incomplete Runs - -Three rectors cut off mid-scan with no result line. All three hit large module trees and likely timed out: - -| Rector | Progress | Files | Modules | -|--------|----------|-------|---------| -| RemoveTrustDataCallRector | 94% (266/282) | unknown | views_dependent_filters, group | -| RemoveUpdaterPostInstallMethodsRector | 94% (289/305) | unknown | group, gnode_request | -| ReplaceCommentManagerGetCountNewCommentsRector | 82% (74/90) | unknown | forum, history | - -The `group` module appears in two of the three — it's a large contrib module and is likely the cause of the timeout. Results (PASS or NO CHANGES) are unknown for all three. - ---- - -## Skipped (no modules installed) - -21 rectors had no applicable test module available: - -- ErrorCurrentErrorHandlerRector -- RemoveAutomatedCronSubmitHandlerRector -- RemoveLinkWidgetValidateTitleElementRector -- RemoveModuleHandlerDeprecatedMethodsRector -- RemoveSetUriCallbackRector -- RemoveStateCacheSettingRector -- RemoveTwigNodeTransTagArgumentRector -- RenameStopProceduralHookScanRector -- ReplaceAlphadecimalToIntNullRector -- ReplaceCommentUriRector -- ReplaceEditorLoadRector -- ReplaceEntityReferenceRecursiveLimitRector -- ReplaceLocaleConfigBatchFunctionsRector -- ReplaceNodeAccessViewAllNodesRector -- ReplaceRecipeRunnerInstallModuleRector -- ReplaceRequestTimeConstantRector -- ReplaceSessionWritesWithRequestSessionRector -- ReplaceSystemPerformanceGzipKeyRector -- ReplaceThemeGetSettingRector -- ReplaceUserSessionNamePropertyRector -- StatementPrefetchIteratorFetchColumnRector - ---- - -## No Changes Found - -Ran to completion but found nothing to transform: - -| Rector | Modules Scanned | -|--------|-----------------| -| ReplaceSessionManagerDeleteRector | role_expire | -| StripMigrationDependenciesExpandArgRector | migrate_tools | - -`ReplaceSessionManagerDeleteRector` was previously blocked by a version gate (Drupal 11.4.0). The "no changes" result on `role_expire` is expected — the module likely doesn't call the deprecated method. - ---- - -## Observations - -**Most impactful rector:** `ReplacePdoFetchConstantsRector` — 8 files changed across `acquia_contenthub` and `gdpr`, replacing `PDO::FETCH_ASSOC` / `PDO::FETCH_COLUMN` with the new `\Drupal\Core\Database\Statement\FetchAs` enum. - -**BC-wrapped Drupal 10 rectors:** Three rectors (`ReplaceModuleHandlerGetNameRector`, `ReplaceRebuildThemeDataRector`, `SystemTimeZonesRector`) are in the `Drupal10` namespace and emit `DeprecationHelper::backwardsCompatibleCall()` output — consistent with the BC-wrap work on this branch. - -**Duplicate run:** `ReplaceModuleHandlerGetNameRector` appears twice in the log, both producing the same 1-file change on `mailsystem`. Test script bug — the rector was queued twice. - -**Timeout pattern:** The three interrupted rectors all had large file counts (90–305 files) and two involved the `group` module. Consider raising the scan timeout or excluding `group` from the timeout-sensitive rectors' test suites. diff --git a/docs/contrib-module-search.md b/docs/contrib-module-search.md deleted file mode 100644 index 5f89b181f..000000000 --- a/docs/contrib-module-search.md +++ /dev/null @@ -1,220 +0,0 @@ -# Contrib Module Search — New Rectors - -Use the Drupal GitLab search to find contrib modules that use the deprecated code each rector targets. - -Base search URL (replace `QUERY` with the search term): -``` -https://git.drupalcode.org/search?group_id=2&scope=blobs&search=-path%3Acore+-path%3Avendor+-path%3Adocroot+-path%3Aweb+-path%3Aprofiles+-path%3Asites+QUERY -``` - ---- - -## Drupal 11 Rectors - -### ErrorCurrentErrorHandlerRector -- **Search:** `Error::currentErrorHandler` -- **Modules found:** — - -### FileSystemBasenameToNativeRector -- **Search:** `->basename(` -- **Modules found:** — - -### LoadAllIncludesRector -- **Search:** `->loadAllIncludes(` -- **Modules found:** — - -### MigrateSqlGetMigrationPluginManagerRector -- **Search:** `->getMigrationPluginManager(` -- **Modules found:** — - -### NodeStorageDeprecatedMethodsRector -- **Search:** `->revisionIds(` OR `->userRevisionIds(` OR `->countDefaultLanguageRevisions(` -- **Modules found:** — - -### PluginBaseIsConfigurableRector -- **Search:** `->isConfigurable(` -- **Modules found:** — - -### RemoveAutomatedCronSubmitHandlerRector -- **Search:** `automated_cron_settings_submit` -- **Modules found:** — - -### RemoveCacheExpireOverrideRector -- **Search:** `function cacheExpire(` -- **Modules found:** — - -### RemoveConfigSaveTrustedDataArgRector -- **Search:** `->save(TRUE)` or `->save(true)` on Config objects -- **Modules found:** — - -### RemoveHandlerBaseDefineExtraOptionsRector -- **Search:** `function defineExtraOptions(` -- **Modules found:** — - -### RemoveLinkWidgetValidateTitleElementRector -- **Search:** `LinkWidget::validateTitleElement` -- **Modules found:** — - -### RemoveModuleHandlerAddModuleCallsRector -- **Search:** `->addModule(` OR `->addProfile(` -- **Modules found:** — - -### RemoveModuleHandlerDeprecatedMethodsRector -- **Search:** `->writeCache(` OR `->getHookInfo(` -- **Modules found:** — - -### RemoveRootFromConvertDbUrlRector -- **Search:** `convertDbUrlToConnectionInfo(` -- **Modules found:** — - -### RemoveSetUriCallbackRector -- **Search:** `->setUriCallback(` -- **Modules found:** — - -### RemoveStateCacheSettingRector -- **Search:** `state_cache` -- **Modules found:** — - -### RemoveTrustDataCallRector -- **Search:** `->trustData(` -- **Modules found:** — - -### RemoveTwigNodeTransTagArgumentRector -- **Search:** `TwigNodeTrans` -- **Modules found:** — - -### RemoveUpdaterPostInstallMethodsRector -- **Search:** `function postInstall(` OR `function postInstallTasks(` -- **Modules found:** — - -### RemoveViewsRowCacheKeysRector -- **Search:** `function getRowCacheKeys(` OR `function getRowId(` -- **Modules found:** — - -### RenameStopProceduralHookScanRector -- **Search:** `StopProceduralHookScan` -- **Modules found:** — - -### ReplaceAlphadecimalToIntNullRector -- **Search:** `alphadecimalToInt(` -- **Modules found:** — - -### ReplaceCommentManagerGetCountNewCommentsRector -- **Search:** `->getCountNewComments(` -- **Modules found:** — - -### ReplaceCommentUriRector -- **Search:** `comment_uri(` -- **Modules found:** — - -### ReplaceDateTimeRangeConstantsRector -- **Search:** `DateTimeRangeConstantsInterface` OR `datetime_type_field_views_data_helper(` -- **Modules found:** — - -### ReplaceEditorLoadRector -- **Search:** `editor_load(` -- **Modules found:** — - -### ReplaceEntityOriginalPropertyRector -- **Search:** `->original` -- **Modules found:** — - -### ReplaceEntityReferenceRecursiveLimitRector -- **Search:** `RECURSIVE_RENDER_LIMIT` -- **Modules found:** — - -### ReplaceFieldgroupToFieldsetRector -- **Search:** `'#type' => 'fieldgroup'` -- **Modules found:** — - -### ReplaceFileGetContentHeadersRector -- **Search:** `file_get_content_headers(` -- **Modules found:** — - -### ReplaceLocaleConfigBatchFunctionsRector -- **Search:** `locale_config_batch_set_config_langcodes(` OR `locale_config_batch_refresh_name(` -- **Modules found:** — - -### ReplaceNodeAccessViewAllNodesRector -- **Search:** `node_access_view_all_nodes(` -- **Modules found:** — - -### ReplaceNodeAddBodyFieldRector -- **Search:** `node_add_body_field(` -- **Modules found:** — - -### ReplaceNodeModuleProceduralFunctionsRector -- **Search:** `node_type_get_names(` OR `node_get_type_label(` OR `node_mass_update(` -- **Modules found:** — - -### ReplaceNodeSetPreviewModeRector -- **Search:** `->setPreviewMode(` -- **Modules found:** — - -### ReplacePdoFetchConstantsRector -- **Search:** `PDO::FETCH_` -- **Modules found:** — - -### ReplaceRecipeRunnerInstallModuleRector -- **Search:** `RecipeRunner::installModule(` -- **Modules found:** — - -### ReplaceSessionManagerDeleteRector -- **Search:** `SessionManager` + `->delete(` -- **Modules found:** — - -### ReplaceSessionWritesWithRequestSessionRector -- **Search:** `$_SESSION[` -- **Modules found:** — - -### ReplaceSystemPerformanceGzipKeyRector -- **Search:** `css.gzip` OR `js.gzip` -- **Modules found:** — - -### ReplaceThemeGetSettingRector -- **Search:** `theme_get_setting(` OR `_system_default_theme_features(` -- **Modules found:** — - -### ReplaceUserSessionNamePropertyRector -- **Search:** `->name` on UserSession (hard to search uniquely) -- **Modules found:** — - -### ReplaceViewsProceduralFunctionsRector -- **Search:** `views_view_is_enabled(` OR `views_view_is_disabled(` OR `views_enable_view(` OR `views_disable_view(` OR `views_get_view_result(` -- **Modules found:** — - -### StatementPrefetchIteratorFetchColumnRector -- **Search:** `->fetchColumn(` -- **Modules found:** — - -### StripMigrationDependenciesExpandArgRector -- **Search:** `->getMigrationDependencies(` -- **Modules found:** — - -### UseEntityTypeHasIntegerIdRector -- **Search:** `->getEntityTypeIdKeyType(` OR `->entityTypeSupportsComments(` -- **Modules found:** — - -### ViewsPluginHandlerManagerRector -- **Search:** `Views::pluginManager(` OR `Views::handlerManager(` -- **Modules found:** — - ---- - -## Drupal 10 Rectors - -### ReplaceModuleHandlerGetNameRector -- **Search:** `->getName(` (on module handler — hard to search uniquely) -- **Modules found:** — - -### ReplaceRebuildThemeDataRector -- **Search:** `->rebuildThemeData(` -- **Modules found:** — - -### ReplaceRequestTimeConstantRector -- **Search:** `REQUEST_TIME` -- **Modules found:** — - -### SystemTimeZonesRector (Drupal10) -- **Search:** `system_time_zones(` -- **Modules found:** — diff --git a/docs/digest-comparison-report-0505.md b/docs/digest-comparison-report-0505.md deleted file mode 100644 index 8e1142793..000000000 --- a/docs/digest-comparison-report-0505.md +++ /dev/null @@ -1,576 +0,0 @@ -# Drupal Digest → Drupal Rector Comparison Report (drupal-digest-0503) - -Compares each rector added in branch `feature/digest-rectors` against its source in -[drupal-digest-0503](https://github.com/dbuytaert/drupal-digests) (refreshed May 2025). - -**Total rectors compared:** 50 -**Significant changes:** 21 -**Minimal changes:** 28 -**Split from one digest file:** 1 pair (`RemoveTrustDataCallRector` + `RemoveConfigSaveTrustedDataArgRector`) - ---- - -## Overview Table - -> Paths are relative to each repo root. Digest paths are relative to `drupal-digest-0503/`. -> `†` = rector `@see` issue number differs from the digest filename — see [Notes](#notes-on-digest-file-mapping). - -| Rector | Ver | Changes | Issue | Digest source | Rector destination | -|---|---|---|---|---|---| -| `ReplaceModuleHandlerGetNameRector` | D10 | Minimal | [#3571063](https://www.drupal.org/node/3571063) | `rector/rules/replace-removed-modulehandlerinterface-getname-with-3571063.php` | `src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector.php` | -| `ReplaceRebuildThemeDataRector` | D10 | Minimal | [#3571068](https://www.drupal.org/node/3571068) | `rector/rules/replace-removed-themehandlerinterface-rebuildthemedata-with-3571068.php` | `src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector.php` | -| `ReplaceRequestTimeConstantRector` | D10 | **Significant** | [#3395986](https://www.drupal.org/node/3395986) | `rector/rules/add-timeinterface-time-argument-to-plugin-constructor-3395986.php` | `src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector.php` | -| `ErrorCurrentErrorHandlerRector` | D11 | Minimal | [#3526515](https://www.drupal.org/node/3526515) | `rector/rules/replace-error-currenterrorhandler-with-get-error-handler-3526515.php` | `src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector.php` | -| `FileSystemBasenameToNativeRector` | D11 | Minimal | [#3530461](https://www.drupal.org/node/3530461) | `rector/rules/replace-filesysteminterface-basename-with-native-basename-3530461.php` | `src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector.php` | -| `LoadAllIncludesRector` | D11 | Minimal | [#3536431](https://www.drupal.org/node/3536431) | `rector/rules/replace-deprecated-modulehandler-loadallincludes-with-3536431.php` | `src/Drupal11/Rector/Deprecation/LoadAllIncludesRector.php` | -| `MigrateSqlGetMigrationPluginManagerRector` | D11 | Minimal | [#3439369](https://www.drupal.org/node/3439369) | `rector/rules/replace-deprecated-sql-getmigrationpluginmanager-with-3439369.php` | `src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector.php` | -| `NodeStorageDeprecatedMethodsRector` | D11 | **Significant** | [#3396062](https://www.drupal.org/node/3396062) | `rector/rules/replace-deprecated-nodestorage-revisionids-and-3396062.php` | `src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector.php` | -| `PluginBaseIsConfigurableRector` | D11 | Minimal | [#3459533](https://www.drupal.org/node/3459533) | `rector/rules/replace-pluginbase-isconfigurable-with-instanceof-3459533.php` | `src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector.php` | -| `RemoveAutomatedCronSubmitHandlerRector` | D11 | **Significant** | [#3566768](https://www.drupal.org/node/3566768) | `rector/rules/remove-deprecated-automated-cron-settings-submit-calls-and-3566768.php` | `src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector.php` | -| `RemoveCacheExpireOverrideRector` | D11 | **Significant** | [#3576556](https://www.drupal.org/node/3576556) | `rector/rules/remove-deprecated-cacheexpire-overrides-from-views-3576556.php` | `src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector.php` | -| `RemoveConfigSaveTrustedDataArgRector` | D11 | **Significant** | [#3347842](https://www.drupal.org/node/3347842) | `rector/rules/remove-deprecated-trusted-data-concept-from-drupal-config-3347842.php` *(split)* | `src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector.php` | -| `RemoveHandlerBaseDefineExtraOptionsRector` | D11 | **Significant** | [#3485084](https://www.drupal.org/node/3485084) | `rector/rules/remove-overrides-of-deprecated-handlerbase-3485084.php` | `src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector.php` | -| `RemoveLinkWidgetValidateTitleElementRector` | D11 | Minimal | [#3093118](https://www.drupal.org/node/3093118) | `rector/rules/remove-deprecated-linkwidget-validatetitleelement-calls-3093118.php` | `src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector.php` | -| `RemoveModuleHandlerAddModuleCallsRector` | D11 | **Significant** | [#3528899](https://www.drupal.org/node/3528899) | `rector/rules/remove-deprecated-modulehandlerinterface-addmodule-and-3528899.php` | `src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector.php` | -| `RemoveModuleHandlerDeprecatedMethodsRector` | D11 | **Significant** | [#3442009](https://www.drupal.org/node/3442009) | `rector/rules/remove-deprecated-modulehandlerinterface-writecache-and-3442009.php` | `src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector.php` | -| `RemoveRootFromConvertDbUrlRector` | D11 | **Significant** | [#3522513](https://www.drupal.org/node/3522513) | `rector/rules/remove-deprecated-string-root-from-database-3522513.php` | `src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector.php` | -| `RemoveSetUriCallbackRector` | D11 | Minimal | [#2667040](https://www.drupal.org/node/2667040) | `rector/rules/remove-deprecated-entitytypeinterface-seturicallback-calls-2667040.php` | `src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector.php` | -| `RemoveStateCacheSettingRector` | D11 | Minimal | [#3436954](https://www.drupal.org/node/3436954) | `rector/rules/remove-deprecated-settings-state-cache-assignment-3436954.php` | `src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector.php` | -| `RemoveTrustDataCallRector` | D11 | **Significant** | [#3347842](https://www.drupal.org/node/3347842) | `rector/rules/remove-deprecated-trusted-data-concept-from-drupal-config-3347842.php` *(split)* | `src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector.php` | -| `RemoveTwigNodeTransTagArgumentRector` | D11 | **Significant** | [#3473440](https://www.drupal.org/node/3473440) | `rector/rules/remove-deprecated-tag-argument-from-twignodetrans-3473440.php` | `src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector.php` | -| `RemoveUpdaterPostInstallMethodsRector` | D11 | Minimal | [#3417136](https://www.drupal.org/node/3417136) | `rector/rules/remove-deprecated-updater-postinstall-postinstalltasks-3417136.php` | `src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector.php` | -| `RemoveViewsRowCacheKeysRector` | D11 | Minimal | [#3564958](https://www.drupal.org/node/3564958) † | `rector/rules/remove-deprecated-cachepluginbase-getrowcachekeys-and-3564937.php` | `src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php` | -| `RenameStopProceduralHookScanRector` | D11 | **Significant** | [#3495943](https://www.drupal.org/node/3495943) | `rector/rules/rename-stopproceduralhookscan-attribute-to-3495943.php` | `src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector.php` | -| `ReplaceAlphadecimalToIntNullRector` | D11 | Minimal | [#3442810](https://www.drupal.org/node/3442810) | `rector/rules/replace-deprecated-number-alphadecimaltoint-null-calls-with-3442810.php` | `src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector.php` | -| `ReplaceCommentManagerGetCountNewCommentsRector` | D11 | **Significant** | [#3551729](https://www.drupal.org/node/3551729) † | `rector/rules/replace-deprecated-commentmanagerinterface-3543035.php` | `src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector.php` | -| `ReplaceCommentUriRector` | D11 | Minimal | [#2010202](https://www.drupal.org/node/2010202) | `rector/rules/replace-deprecated-comment-uri-with-comment-permalink-2010202.php` | `src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector.php` | -| `ReplaceDateTimeRangeConstantsRector` | D11 | Minimal | [#3574901](https://www.drupal.org/node/3574901) | `rector/rules/replace-removed-datetimerangeconstantsinterface-constants-3574901.php` | `src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector.php` | -| `ReplaceEditorLoadRector` | D11 | **Significant** | [#3447794](https://www.drupal.org/node/3447794) | `rector/rules/replace-deprecated-editor-load-with-entity-storage-load-3447794.php` | `src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector.php` | -| `ReplaceEntityOriginalPropertyRector` | D11 | **Significant** | [#3571065](https://www.drupal.org/node/3571065) | `rector/rules/replace-deprecated-entity-original-magic-property-with-3571065.php` | `src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector.php` | -| `ReplaceEntityReferenceRecursiveLimitRector` | D11 | **Significant** | [#3316878](https://www.drupal.org/node/3316878) † | `rector/rules/replace-deprecated-entityreferenceentityformatter-recursive-2940605.php` | `src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector.php` | -| `ReplaceFieldgroupToFieldsetRector` | D11 | Minimal | [#3512254](https://www.drupal.org/node/3512254) | `rector/rules/replace-deprecated-type-fieldgroup-with-type-fieldset-3512254.php` | `src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector.php` | -| `ReplaceFileGetContentHeadersRector` | D11 | Minimal | [#3494126](https://www.drupal.org/node/3494126) | `rector/rules/replace-file-get-content-headers-with-fileinterface-3494126.php` | `src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector.php` | -| `ReplaceLocaleConfigBatchFunctionsRector` | D11 | **Significant** | [#3575254](https://www.drupal.org/node/3575254) | `rector/rules/replace-deprecated-locale-batch-functions-with-their-3575254.php` | `src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector.php` | -| `ReplaceNodeAccessViewAllNodesRector` | D11 | Minimal | [#3038908](https://www.drupal.org/node/3038908) | `rector/rules/replace-deprecated-node-access-view-all-nodes-with-oo-3038908.php` | `src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector.php` | -| `ReplaceNodeAddBodyFieldRector` | D11 | Minimal | [#3489266](https://www.drupal.org/node/3489266) | `rector/rules/replace-deprecated-node-add-body-field-with-createbodyfield-3489266.php` | `src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector.php` | -| `ReplaceNodeModuleProceduralFunctionsRector` | D11 | Minimal | [#3571623](https://www.drupal.org/node/3571623) | `rector/rules/replace-deprecated-node-module-procedural-functions-with-oo-3571623.php` | `src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector.php` | -| `ReplaceNodeSetPreviewModeRector` | D11 | Minimal | [#3538277](https://www.drupal.org/node/3538277) | `rector/rules/replace-deprecated-constants-with-nodepreviewmode-enum-in-3538277.php` | `src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector.php` | -| `ReplacePdoFetchConstantsRector` | D11 | **Significant** | [#3525077](https://www.drupal.org/node/3525077) | `rector/rules/replace-removed-mysql-pgsql-sqlite-driver-query-subclass-3525077.php` | `src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector.php` | -| `ReplaceRecipeRunnerInstallModuleRector` | D11 | Minimal | [#3498026](https://www.drupal.org/node/3498026) | `rector/rules/replace-deprecated-reciperunner-installmodule-with-3498026.php` | `src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector.php` | -| `ReplaceSessionManagerDeleteRector` | D11 | **Significant** | [#3577376](https://www.drupal.org/node/3577376) | `rector/rules/replace-deprecated-sessionmanager-delete-with-3577376.php` | `src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector.php` | -| `ReplaceSessionWritesWithRequestSessionRector` | D11 | Minimal | [#3518527](https://www.drupal.org/node/3518527) | `rector/rules/replace-deprecated-session-writes-with-drupal-request-3518527.php` | `src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector.php` | -| `ReplaceSystemPerformanceGzipKeyRector` | D11 | Minimal | [#3184242](https://www.drupal.org/node/3184242) | `rector/rules/replace-deprecated-system-performance-css-gzip-js-gzip-3184242.php` | `src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector.php` | -| `ReplaceThemeGetSettingRector` | D11 | Minimal | [#3573896](https://www.drupal.org/node/3573896) | `rector/rules/replace-deprecated-theme-get-setting-and-system-default-3573896.php` | `src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector.php` | -| `ReplaceUserSessionNamePropertyRector` | D11 | Minimal | [#3513856](https://www.drupal.org/node/3513856) | `rector/rules/replace-deprecated-usersession-name-property-read-with-3513856.php` | `src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector.php` | -| `ReplaceViewsProceduralFunctionsRector` | D11 | Minimal | [#3572243](https://www.drupal.org/node/3572243) | `rector/rules/replace-deprecated-views-procedural-functions-with-oo-3572243.php` | `src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector.php` | -| `StatementPrefetchIteratorFetchColumnRector` | D11 | **Significant** | [#3490200](https://www.drupal.org/node/3490200) | `rector/rules/replace-deprecated-statementprefetchiterator-fetchcolumn-3490200.php` | `src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector.php` | -| `StripMigrationDependenciesExpandArgRector` | D11 | Minimal | [#3574717](https://www.drupal.org/node/3574717) | `rector/rules/strip-removed-expand-argument-from-getmigrationdependencies-3574717.php` | `src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector.php` | -| `UseEntityTypeHasIntegerIdRector` | D11 | **Significant** | [#3566801](https://www.drupal.org/node/3566801) | `rector/rules/replace-deprecated-entity-type-integer-id-helpers-with-3566801.php` | `src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector.php` | -| `ViewsPluginHandlerManagerRector` | D11 | **Significant** | [#3566424](https://www.drupal.org/node/3566424) | `rector/rules/replace-deprecated-views-pluginmanager-and-views-3566424.php` | `src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector.php` | - ---- - -## Significant Changes - -### 1. `ReplaceRequestTimeConstantRector` (Drupal10) - -**Digest file:** `add-timeinterface-time-argument-to-plugin-constructor-3395986.php` - -**Change:** The issue ID is shared but the two rules address entirely different deprecations. The digest (`AddTimeInterfaceToPluginConstructorsRector`) adds a `?TimeInterface $time` argument to `__construct()` overrides in subclasses of six Drupal plugin parent classes (`TimestampFormatter`, `views\argument\Date`, etc.), updating each `parent::__construct()` call to pass `$time`. The rector instead replaces occurrences of the `REQUEST_TIME` constant with `\Drupal::time()->getRequestTime()` by visiting `ConstFetch` nodes. The two rules share a Drupal issue number but implement completely unrelated transformations. No code from the digest was reused. - -```php -// Digest — adds ?TimeInterface parameter to plugin __construct() overrides -final class AddTimeInterfaceToPluginConstructorsRector extends AbstractRector -{ - public function getNodeTypes(): array { return [Class_::class]; } - // ... -} - -// Rector — replaces REQUEST_TIME constant with method call -final class ReplaceRequestTimeConstantRector extends AbstractRector -{ - public function getNodeTypes(): array { return [Node\Expr\ConstFetch::class]; } - public function refactor(Node $node): ?Node - { - if (!$this->isName($node, 'REQUEST_TIME')) { return null; } - $staticCall = new Node\Expr\StaticCall(new Node\Name\FullyQualified('Drupal'), 'time'); - return new Node\Expr\MethodCall($staticCall, 'getRequestTime'); - } -} -``` - ---- - -### 2. `NodeStorageDeprecatedMethodsRector` (Drupal11) - -**Digest file:** `replace-deprecated-nodestorage-revisionids-and-3396062.php` - -**Change:** The digest handled only `revisionIds()` and `userRevisionIds()`, visiting only `MethodCall` nodes. The rector adds handling for `countDefaultLanguageRevisions()`, which has no replacement and must be removed entirely. This required registering `Expression::class` as a second node type and returning `NodeVisitor::REMOVE_NODE` when the expression statement wraps that call. - -```php -// Digest — only MethodCall nodes -public function getNodeTypes(): array -{ - return [MethodCall::class]; -} -// No handling for countDefaultLanguageRevisions() - -// Rector — adds Expression node type and removal -public function getNodeTypes(): array -{ - return [Node\Expr\MethodCall::class, Node\Stmt\Expression::class]; -} - -if ($node instanceof Node\Stmt\Expression) { - $methodCall = $node->expr; - if ($this->getName($methodCall->name) === 'countDefaultLanguageRevisions') { - return NodeVisitor::REMOVE_NODE; - } -} -``` - ---- - -### 3. `RemoveAutomatedCronSubmitHandlerRector` (Drupal11) - -**Digest file:** `remove-deprecated-automated-cron-settings-submit-calls-and-3566768.php` - -**Change:** The digest registered two separate rules: the custom `RemoveAutomatedCronSettingsSubmitHandlerRector` class (which removed `$form['#submit'][] = 'automated_cron_settings_submit'` array-append assignments) plus a comment pointing to `RemoveFuncCallRector` to handle direct `automated_cron_settings_submit($form, $form_state)` function calls. The rector implements only the array-append removal, omitting the direct function-call case. The class was also renamed from `RemoveAutomatedCronSettingsSubmitHandlerRector` to `RemoveAutomatedCronSubmitHandlerRector`. - ---- - -### 4. `RemoveCacheExpireOverrideRector` (Drupal11) - -**Digest file:** `remove-deprecated-cacheexpire-overrides-from-views-3576556.php` - -**Change:** The digest's `PARENT_SHORT_NAMES` listed `CachePluginBase`, `Time`, `Tag`, and `None`, and its `isCachePluginBaseSubclass()` used `str_ends_with($parentName, '\\' . $short)` for namespace-relative matching. It then fell back to a PHPStan `isSuperTypeOf()->yes()` check using an inline `\PHPStan\Type\ObjectType`. - -The rector adds a separate `PARENT_FQCNS` constant listing all four fully-qualified names (`CachePluginBase`, `Time`, `Tag`, `None`), and restructures `isCachePluginBaseSubclass()` to first iterate `PARENT_FQCNS` for exact FQCN matches, then only applies short-name matching when `!str_contains($parentName, '\\')` (i.e., bare unqualified names). The PHPStan fallback uses the imported `ObjectType` class rather than an inline FQN. This prevents a namespace-relative name like `cache\None` from accidentally matching the short name `None` via `str_ends_with`. - -```php -// Digest — single PARENT_SHORT_NAMES list, str_ends_with for all cases -private const PARENT_SHORT_NAMES = ['CachePluginBase', 'Time', 'Tag', 'None']; -// ... -foreach (self::PARENT_SHORT_NAMES as $short) { - if ($parentName === $short || str_ends_with($parentName, '\\' . $short)) { - return true; - } -} - -// Rector — separate PARENT_FQCNS constant, short-name check restricted to unqualified names -private const PARENT_FQCNS = [ - 'Drupal\views\Plugin\views\cache\CachePluginBase', - 'Drupal\views\Plugin\views\cache\Time', - 'Drupal\views\Plugin\views\cache\Tag', - 'Drupal\views\Plugin\views\cache\None', -]; - -foreach (self::PARENT_FQCNS as $fqcn) { - if ($parentName === $fqcn) { return true; } -} -if (!str_contains($parentName, '\\')) { - foreach (self::PARENT_SHORT_NAMES as $short) { - if ($parentName === $short) { return true; } - } -} -``` - ---- - -### 5. `RemoveConfigSaveTrustedDataArgRector` + `RemoveTrustDataCallRector` (Drupal11) - -**Digest file:** `remove-deprecated-trusted-data-concept-from-drupal-config-3347842.php` (one file, split into two rector classes) - -**Change:** The digest defined a single class (`RemoveTrustedDataConceptRector`) that handled both patterns in one `refactor()` method: it removed the boolean arg from `->save(TRUE/FALSE)` and removed `->trustData()` from fluent chains, both without any type guard. - -The rector splits these into two focused classes. `RemoveConfigSaveTrustedDataArgRector` handles only `Config::save(TRUE/FALSE)` and adds a `Drupal\Core\Config\Config` ObjectType guard. `RemoveTrustDataCallRector` handles only `->trustData()` chain removal and adds a `Drupal\Core\Config\Entity\ConfigEntityInterface` ObjectType guard. Both additions prevent false positives on unrelated classes with `save()` or `trustData()` methods. - -```php -// Digest — no type guards, single class -if ($this->isName($node->name, 'save') && count($node->args) === 1 ...) { - // remove boolean arg, no ObjectType check -} -if ($this->isName($node->name, 'trustData') && count($node->args) === 0) { - return $node->var; // no ObjectType check -} - -// RemoveConfigSaveTrustedDataArgRector — adds Config type guard -if (!$this->isObjectType($node->var, new ObjectType('Drupal\Core\Config\Config'))) { - return null; -} - -// RemoveTrustDataCallRector — adds ConfigEntityInterface type guard -if (!$this->isObjectType($node->var, new ObjectType('Drupal\Core\Config\Entity\ConfigEntityInterface'))) { - return null; -} -``` - ---- - -### 6. `RemoveHandlerBaseDefineExtraOptionsRector` (Drupal11) - -**Digest file:** `remove-overrides-of-deprecated-handlerbase-3485084.php` - -**Change:** The digest (`RemoveDefineExtraOptionsOverrideRector`) relied solely on PHPStan's `isObjectType()` against `HandlerBase` and explicitly excluded the `HandlerBase` class itself by checking the short class name. - -The rector takes a different approach: it uses a multi-strategy `isHandlerBaseSubclass()` helper that first checks `HANDLER_BASE_FQCN` for exact match, then iterates a `PARENT_SHORT_NAMES` constant (listing six short names: `HandlerBase`, `FieldHandlerBase`, `FilterPluginBase`, `SortPluginBase`, `ArgumentPluginBase`, `RelationshipPluginBase`) with `str_ends_with` support, and only falls back to `isObjectType()` as a last resort. This makes the rector more resilient when PHPStan's type resolution is unavailable. The `HandlerBase`-exclusion logic from the digest is absent (not needed since the detection now targets subclasses more precisely). - -```php -// Digest — relies primarily on isObjectType, excludes HandlerBase by name -if (!$this->isObjectType($node->extends, new ObjectType('Drupal\\views\\Plugin\\views\\HandlerBase'))) { - return null; -} -if ($node->name instanceof Identifier && $node->name->toString() === 'HandlerBase') { - return null; // skip HandlerBase itself -} - -// Rector — explicit PARENT_SHORT_NAMES list as primary detection -private const PARENT_SHORT_NAMES = [ - 'HandlerBase', 'FieldHandlerBase', 'FilterPluginBase', - 'SortPluginBase', 'ArgumentPluginBase', 'RelationshipPluginBase', -]; -foreach (self::PARENT_SHORT_NAMES as $short) { - if ($parentName === $short || str_ends_with($parentName, '\\'.$short)) { - return true; - } -} -``` - ---- - -### 7. `RemoveModuleHandlerAddModuleCallsRector` (Drupal11) - -**Digest file:** `remove-deprecated-modulehandlerinterface-addmodule-and-3528899.php` - -**Change:** The digest checked only `ModuleHandlerInterface`. The rector also checks the concrete `ModuleHandler` class, covering cases where the variable is typed as the concrete implementation rather than the interface. - -```php -// Digest — interface only -if ($this->isObjectType($methodCall->var, new ObjectType('Drupal\\Core\\Extension\\ModuleHandlerInterface'))) { - return NodeVisitor::REMOVE_NODE; -} - -// Rector — interface + concrete class -foreach (['Drupal\Core\Extension\ModuleHandlerInterface', 'Drupal\Core\Extension\ModuleHandler'] as $class) { - if ($this->isObjectType($methodCall->var, new ObjectType($class))) { - $isModuleHandler = true; - break; - } -} -``` - ---- - -### 8. `RemoveModuleHandlerDeprecatedMethodsRector` (Drupal11) - -**Digest file:** `remove-deprecated-modulehandlerinterface-writecache-and-3442009.php` - -**Change:** Both rules handle `writeCache()` removal and `getHookInfo()` → `[]` replacement identically in terms of transformation output. The key difference is how standalone `getHookInfo()` expression statements are handled. The digest left them in place as a bare `[];` expression (replacing the method call with an empty array literal as a statement, which is harmless dead code). The rector removes standalone `getHookInfo()` expression statements entirely via `NodeVisitor::REMOVE_NODE`, treating them the same as `writeCache()` calls. The rector also refactors the repeated type-check logic into a private `isModuleHandlerMethodCall()` helper, which the digest inlined. - -```php -// Digest — standalone getHookInfo() becomes bare []; (not removed) -if ($node instanceof Expression && $node->expr instanceof MethodCall) { - if ($this->isName($call->name, 'writeCache') && $this->isObjectType(...)) { - return NodeVisitor::REMOVE_NODE; - } - // getHookInfo() as statement: falls through to MethodCall branch → returns new Array_() -} - -// Rector — standalone getHookInfo() is also removed -if ($node instanceof Expression && $node->expr instanceof MethodCall) { - if ($this->isModuleHandlerMethodCall($call, 'writeCache') - || $this->isModuleHandlerMethodCall($call, 'getHookInfo') - ) { - return NodeVisitor::REMOVE_NODE; - } -} -``` - ---- - -### 9. `RemoveRootFromConvertDbUrlRector` (Drupal11) - -**Digest file:** `remove-deprecated-string-root-from-database-3522513.php` - -**Change:** The digest (`RemoveRootFromConvertDbUrlToConnectionInfoRector`) recognized `String_`, `PropertyFetch`, `NullsafePropertyFetch`, `FuncCall`, `StaticPropertyFetch`, and `MethodCall` as second-argument forms that should be stripped. The rector preserves all of these and adds the same logic, but also renames the class from `RemoveRootFromConvertDbUrlToConnectionInfoRector` to `RemoveRootFromConvertDbUrlRector`. Functionally the two implementations are equivalent; the differences are limited to class name, namespace, and the import style (inline `\PhpParser\Node\Expr\StaticPropertyFetch` vs imported `StaticPropertyFetch`). This entry is classified **Significant** only because the class was renamed and the rector adds the `StaticPropertyFetch` and `MethodCall` types explicitly as named imports where the digest used inline FQNs. - ---- - -### 10. `RemoveTwigNodeTransTagArgumentRector` (Drupal11) - -**Digest file:** `remove-deprecated-tag-argument-from-twignodetrans-3473440.php` - -**Change:** Two differences in argument-removal logic and class matching. The digest (`RemoveTwigNodeTransTagArgRector`) used `TARGET_CLASS = 'Drupal\\Core\\Template\\TwigNodeTrans'` with `$this->isName()`, matched only on the FQCN, checked `isset($node->args[5])`, and used `array_splice($node->args, 5)` which removes index 5 and everything beyond it. - -The rector checks both the FQCN `Drupal\Core\Template\TwigNodeTrans` and the short name `TwigNodeTrans` (using `$this->getName($node->class)` and comparing with `!==`), restricts the transformation to exactly `count($node->args) === 6`, and uses `array_pop($node->args)` to remove only the last argument. The short-name support broadens coverage to files that import the class via `use`. The `count() === 6` check is more restrictive than `isset([5])` (which fires for 7+ args too). - -```php -// Digest — FQCN only, isset check, array_splice -if (!$this->isName($node->class, self::TARGET_CLASS)) { return null; } -if (!isset($node->args[5])) { return null; } -array_splice($node->args, 5); - -// Rector — FQCN or short name, exact count, array_pop -if ($className !== 'TwigNodeTrans' && $className !== 'Drupal\Core\Template\TwigNodeTrans') { - return null; -} -if (count($node->args) !== 6) { return null; } -array_pop($node->args); -``` - ---- - -### 11. `RenameStopProceduralHookScanRector` (Drupal11) - -**Digest file:** `rename-stopproceduralhookscan-attribute-to-3495943.php` - -**Change:** The digest was a config-only snippet (no class body) that delegated to the built-in `RenameClassRector` with a single `StopProceduralHookScan` → `ProceduralHookScanStop` mapping. `RenameClassRector` rewrites all class references but does not specifically handle the `use` statement and attribute usage site independently — it also risks rewriting unrelated references in class bodies that happen to share the same short name. - -The rector implements a full custom rule visiting two distinct node types (`UseUse` and `Attribute`) and handles them separately: it rewrites the `use` statement's `name` to the new FQCN and rewrites `#[StopProceduralHookScan]` attribute nodes (both FQCN and short-name forms) to `#[ProceduralHookScanStop]`. This is more precise and avoids the side effects of `RenameClassRector`. - ---- - -### 12. `ReplaceCommentManagerGetCountNewCommentsRector` (Drupal11) - -**Digest file:** `replace-deprecated-commentmanagerinterface-3543035.php` - -**Note:** The rector's `@see` references issue `#3551729`; the digest file uses `#3543035`. Both reference the same deprecation. - -**Change:** The digest extended `AbstractRector` directly with a plain `refactor()` method. The rector extends `AbstractDrupalCoreRector` and wraps the logic in `refactorWithConfiguration()`, enabling version-gated activation via `DrupalIntroducedVersionConfiguration('11.3.0')`. The transformation logic itself (building `\Drupal::service(HistoryManager::class)->getCountNewComments()`) is identical. - -```php -// Digest -final class CommentManagerGetCountNewCommentsRector extends AbstractRector -{ - public function refactor(Node $node): ?Node { ... } -} - -// Rector -final class ReplaceCommentManagerGetCountNewCommentsRector extends AbstractDrupalCoreRector -{ - public function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { ... } - // getRuleDefinition() uses ConfiguredCodeSample with DrupalIntroducedVersionConfiguration('11.3.0') -} -``` - ---- - -### 13. `ReplaceEditorLoadRector` (Drupal11) - -**Digest file:** `replace-deprecated-editor-load-with-entity-storage-load-3447794.php` - -**Change:** The digest (`EditorLoadDeprecationRector`) built the replacement AST manually with inline `new StaticCall(new FullyQualified('Drupal'), 'entityTypeManager', [])`, `new MethodCall(...)`, and used `$node->args[0] ?? new Node\Arg(new Node\Expr\ConstFetch(new Name('null')))` to handle a missing first argument. The rector uses `$this->nodeFactory->createStaticCall()` and `$this->nodeFactory->createMethodCall()` helpers, which is cleaner and more idiomatic for drupal-rector. The rector also adds an explicit `count($node->args) !== 1` guard that the digest lacked (the digest silently substituted null). The class was renamed from `EditorLoadDeprecationRector`. - ---- - -### 14. `ReplaceEntityOriginalPropertyRector` (Drupal11) - -**Digest file:** `replace-deprecated-entity-original-magic-property-with-3571065.php` - -**Change:** The digest (`EntityOriginalPropertyToMethodRector`) handled `PropertyFetch` and `Assign` nodes only. For `Assign`, it added an `EntityInterface` ObjectType check on the `getOriginal()` MethodCall var, but for the `PropertyFetch` branch it relied only on the `$this->original`-skip check plus `isObjectType(EntityInterface)`. - -The rector adds `NullsafePropertyFetch` as a third registered node type and handles `$entity?->original` → `$entity?->getOriginal()` by returning a new `NullsafeMethodCall`. The `Assign` branch in the rector drops the secondary `EntityInterface` check (since by that pass the `PropertyFetch` was already transformed to `getOriginal()`, so the type check is redundant). The class was renamed from `EntityOriginalPropertyToMethodRector`. - -```php -// Digest — only PropertyFetch and Assign -public function getNodeTypes(): array { return [PropertyFetch::class, Assign::class]; } - -// Rector — adds NullsafePropertyFetch -public function getNodeTypes(): array -{ - return [PropertyFetch::class, NullsafePropertyFetch::class, Assign::class]; -} -// Handles $entity?->original → $entity?->getOriginal() -if ($node instanceof NullsafePropertyFetch) { - if ($this->isName($node->name, 'original') && ...) { - return new NullsafeMethodCall($node->var, 'getOriginal'); - } -} -``` - ---- - -### 15. `ReplaceEntityReferenceRecursiveLimitRector` (Drupal11) - -**Digest file:** `replace-deprecated-entityreferenceentityformatter-recursive-2940605.php` - -**Note:** The rector's `@see` references issue `#3316878`; the digest file uses `#2940605`. Both refer to the same deprecation. - -**Change:** The digest (`RemoveEntityReferenceRecursiveLimitConstantRector`) used `isObjectType()` for FQCN matching and additionally handled `static::`, `self::`, and `parent::` class-constant fetches within subclasses. The rector simplifies this by maintaining a `TARGET_CLASSES` constant (listing both the short name `EntityReferenceEntityFormatter` and the FQCN) and matching via `$this->isName($node->class, $class)` — which can match both short names (resolved by Rector via `use` imports) and FQCNs, but does not handle `static::`/`self::`/`parent::`. The rector's approach is simpler but slightly less complete. - -```php -// Digest — handles static/self/parent via isObjectType -if (in_array((string) $class, ['static', 'self', 'parent'], true)) { - if ($this->isObjectType($node, new ObjectType(self::DEPRECATED_CLASS))) { - return new LNumber(20); - } -} - -// Rector — TARGET_CLASSES with isName(), no static/self/parent handling -private const TARGET_CLASSES = [ - 'EntityReferenceEntityFormatter', - 'Drupal\Core\Field\Plugin\Field\FieldFormatter\EntityReferenceEntityFormatter', -]; -foreach (self::TARGET_CLASSES as $class) { - if ($this->isName($node->class, $class)) { return new Int_(20); } -} -``` - ---- - -### 16. `ReplaceLocaleConfigBatchFunctionsRector` (Drupal11) - -**Digest file:** `replace-deprecated-locale-batch-functions-with-their-3575254.php` - -**Change:** The digest was a config-only snippet delegating to the built-in `RenameFunctionRector` with a two-entry rename map. The rector implements a full custom `FuncCall`-visiting rule with a `RENAME_MAP` constant, providing testability, explicit control, and compatibility with the drupal-rector test infrastructure. - ---- - -### 17. `ReplacePdoFetchConstantsRector` (Drupal11) - -**Digest file:** `replace-removed-mysql-pgsql-sqlite-driver-query-subclass-3525077.php` - -**Change:** The issue ID is shared but the two rules address entirely different aspects of the same issue. The digest was a config-only snippet delegating to `RenameClassRector` to remap nine deprecated driver-specific query subclasses (e.g. `Drupal\mysql\Driver\Database\mysql\Delete`) to their `Drupal\Core\Database\Query\*` base equivalents. - -The rector is a fully custom rule that converts `PDO::FETCH_*` constants to `FetchAs` enum cases in Drupal Database API calls. It visits `MethodCall` nodes for `setFetchMode()`, `fetch()`, `fetchAll()`, `fetchAllAssoc()`, and `ArrayItem` nodes for `'fetch'` array keys. It also guards against accidentally rewriting `PDO::FETCH_*` on native PDO methods by checking whether the callee is `getClientStatement()` or `getClientConnection()`. No code from the digest was reused. - ---- - -### 18. `ReplaceSessionManagerDeleteRector` (Drupal11) - -**Digest file:** `replace-deprecated-sessionmanager-delete-with-3577376.php` - -**Change:** The digest extended `AbstractRector` directly and used the PHPStan `$sessionManagerType->isSuperTypeOf($callerType)->yes()` pattern to check the caller type. The rector extends `AbstractDrupalCoreRector` and uses `refactorWithConfiguration()` with `DrupalIntroducedVersionConfiguration('11.4.0')`, enabling version-gated activation. The type check was changed to `$this->isObjectType($node->var, new ObjectType('Drupal\Core\Session\SessionManager'))`, which is the standard Rector API. - -```php -// Digest — plain refactor(), PHPStan isSuperTypeOf -final class ReplaceSessionManagerDeleteRector extends AbstractRector -{ - public function refactor(Node $node): ?Node { - $callerType = $this->getType($node->var); - if (!$sessionManagerType->isSuperTypeOf($callerType)->yes()) { return null; } - } -} - -// Rector — refactorWithConfiguration(), isObjectType -final class ReplaceSessionManagerDeleteRector extends AbstractDrupalCoreRector -{ - public function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { - if (!$this->isObjectType($node->var, new ObjectType('Drupal\Core\Session\SessionManager'))) { return null; } - } -} -``` - ---- - -### 19. `StatementPrefetchIteratorFetchColumnRector` (Drupal11) - -**Digest file:** `replace-deprecated-statementprefetchiterator-fetchcolumn-3490200.php` - -**Change:** The digest was a config-only snippet delegating to the built-in `RenameMethodRector` with a single `StatementPrefetchIterator::fetchColumn → fetchField` mapping. The rector implements a full custom `MethodCall`-visiting rule with an explicit `StatementPrefetchIterator` ObjectType check, making the transformation testable and safe against accidental rewrites of unrelated `fetchColumn()` methods. - ---- - -### 20. `UseEntityTypeHasIntegerIdRector` (Drupal11) - -**Digest file:** `replace-deprecated-entity-type-integer-id-helpers-with-3566801.php` - -**Change:** The digest used a `TARGET_PARENTS` list with three FQCNs and a shared `isInTargetParent()` helper that called `isObjectType()` for all three, covering all three method patterns under one broad type check. It also handled the `hasIntegerId($entityType)` pattern directly. - -The rector replaces the broad `TARGET_PARENTS` approach with a `METHOD_OWNER_CLASS` map that pairs each method name to its specific declaring class (`entityTypeSupportsComments` → `CommentTypeForm`, `hasIntegerId` → `OverridesSectionStorage`). The `getEntityTypeIdKeyType` comparison pattern uses a dedicated `GET_ENTITY_TYPE_ID_KEY_TYPE_CLASS` constant. This means each method is checked against only its own class rather than all three parent classes, making false positives less likely. - -```php -// Digest — shared TARGET_PARENTS, checks all three for every method -private const TARGET_PARENTS = [ - 'Drupal\\Core\\Entity\\Routing\\DefaultHtmlRouteProvider', - 'Drupal\\comment\\CommentTypeForm', - 'Drupal\\layout_builder\\Plugin\\SectionStorage\\OverridesSectionStorage', -]; -private function isInTargetParent(Node $node): bool { - foreach (self::TARGET_PARENTS as $parent) { - if ($this->isObjectType($node, new ObjectType($parent))) { return true; } - } -} - -// Rector — METHOD_OWNER_CLASS pairs each method to its specific owner -private const METHOD_OWNER_CLASS = [ - 'entityTypeSupportsComments' => 'Drupal\comment\CommentTypeForm', - 'hasIntegerId' => 'Drupal\layout_builder\Plugin\SectionStorage\OverridesSectionStorage', -]; -if (!$this->isObjectType($node->var, new ObjectType(self::METHOD_OWNER_CLASS[$name]))) { - return null; -} -``` - ---- - -### 21. `ViewsPluginHandlerManagerRector` (Drupal11) - -**Digest file:** `replace-deprecated-views-pluginmanager-and-views-3566424.php` - -**Change:** The digest used `$this->isObjectType($node->class, new \PHPStan\Type\ObjectType('Drupal\\views\\Views'))` to match the static call class — which is incorrect for static call class nodes (the `class` property is a `Name`, not an object expression, so `isObjectType` does not apply). The rector replaces this with `$this->isName($node->class, 'Drupal\views\Views')`, which is the correct API for matching a class name on a `StaticCall` node. The transformation logic (string-literal vs dynamic argument) is identical. - -```php -// Digest — incorrect isObjectType on a Name node -if (!$this->isObjectType($node->class, new \PHPStan\Type\ObjectType('Drupal\\views\\Views'))) { - return null; -} - -// Rector — correct isName for StaticCall class -if (!$this->isName($node->class, 'Drupal\views\Views')) { - return null; -} -``` - ---- - -## Minimal Changes - -These rectors are functionally equivalent to their digest counterparts. Differences are limited to: namespace declarations, proper `use` imports (replacing inline backslash-prefixed FQNs), `declare(strict_types=1)` placement, class renaming to match drupal-rector conventions, and minor wording in `getRuleDefinition()`. - -| Rector class | Notable structural differences from digest | -|---|---| -| `ReplaceModuleHandlerGetNameRector` | Namespace + `AbstractDrupalCoreRector` wrapping + `DrupalIntroducedVersionConfiguration('10.3.0')`; logic identical to digest | -| `ReplaceRebuildThemeDataRector` | Namespace + `AbstractDrupalCoreRector` wrapping + `DrupalIntroducedVersionConfiguration('10.3.0')`; the `ThemeHandlerInterface` ObjectType check and `!empty($node->args)` guard were already present in the 0503 digest, so logic is identical | -| `ErrorCurrentErrorHandlerRector` | Namespace + imports only; `ObjectType` imported vs inline `\PHPStan\Type\ObjectType`; adds `assert($node instanceof StaticCall)` | -| `FileSystemBasenameToNativeRector` | Namespace + imports only; type-check API changed from `isSuperTypeOf()->yes()` to `isObjectType()` (semantically equivalent) | -| `LoadAllIncludesRector` | Namespace + imports only; logic and structure identical | -| `MigrateSqlGetMigrationPluginManagerRector` | Namespace + imports only; 0503 digest already uses `isObjectType(Sql)` as positive guard — identical to rector | -| `PluginBaseIsConfigurableRector` | Namespace + imports only; 0503 digest already has `isObjectType(PluginBase)` guard — identical to rector; class renamed from `ReplacePluginBaseIsConfigurableRector` | -| `RemoveLinkWidgetValidateTitleElementRector` | Namespace + imports only; logic identical | -| `RemoveSetUriCallbackRector` | Namespace + imports only; 0503 digest already has `EntityTypeInterface` ObjectType guards — identical to rector | -| `RemoveStateCacheSettingRector` | Namespace + imports only; logic identical | -| `RemoveUpdaterPostInstallMethodsRector` | Namespace + imports only; backslash escaping in `UPDATER_BASE_CLASSES` normalized (digest used escaped `\\`) | -| `ReplaceAlphadecimalToIntNullRector` | Namespace + imports only; class renamed from `AlphadecimalToIntNullOrEmptyRector`; inline `\PHPStan` and `\PhpParser` FQNs replaced with imports | -| `ReplaceCommentUriRector` | Namespace + imports only; class renamed from `CommentUriToPermalinkRector`; arg count check changed from `!== 1` (digest) to `< 1` (rector) | -| `ReplaceDateTimeRangeConstantsRector` | Namespace + imports only; class renamed from `ReplaceDatetimeDeprecatedApisRector`; inline `Config\RectorConfig` use removed; logic identical | -| `ReplaceFieldgroupToFieldsetRector` | Namespace + imports only; class renamed from `FieldgroupToFieldsetRector`; logic identical | -| `ReplaceFileGetContentHeadersRector` | Namespace + imports only; class renamed from `FileGetContentHeadersRector`; adds `assert()`; logic identical | -| `ReplaceNodeAccessViewAllNodesRector` | Namespace + imports only; class renamed from `NodeAccessViewAllNodesRector`; logic identical | -| `ReplaceNodeAddBodyFieldRector` | Namespace + imports only; class renamed from `NodeAddBodyFieldRector`; logic identical | -| `ReplaceNodeModuleProceduralFunctionsRector` | Namespace + imports only; class renamed from `ReplaceDeprecatedNodeFunctionsRector`; logic identical | -| `ReplaceNodeSetPreviewModeRector` | Namespace + imports only; class renamed from `NodeSetPreviewModeRector`; 0503 digest already has `NodeTypeInterface` ObjectType guard — logic identical | -| `ReplaceRecipeRunnerInstallModuleRector` | Namespace + imports only; class renamed from `RecipeRunnerInstallModuleRector`; logic identical | -| `ReplaceSessionWritesWithRequestSessionRector` | Namespace + imports only; class renamed from `SessionSuperGlobalToRequestSessionRector`; logic identical | -| `ReplaceSystemPerformanceGzipKeyRector` | Namespace + imports only; class renamed from `SystemPerformanceGzipToCompressRector`; logic identical | -| `ReplaceThemeGetSettingRector` | Namespace + imports only; logic identical | -| `ReplaceUserSessionNamePropertyRector` | Namespace + imports only; class renamed from `UserSessionNamePropertyToGetAccountNameRector`; adds `UserSession` ObjectType check and `$this->name` skip guard (digest had neither) | -| `ReplaceViewsProceduralFunctionsRector` | Namespace + imports only; class renamed from `ReplaceDeprecatedViewsFunctionsRector`; logic identical | -| `StripMigrationDependenciesExpandArgRector` | Namespace + imports only; class renamed from `RemoveMigrationDependenciesExpandArgRector`; type-check API changed from `isSuperTypeOf()->yes()` to `isObjectType()` (semantically equivalent) | -| `RemoveViewsRowCacheKeysRector` | Namespace + imports only; 0503 digest already has `CachePluginBase` ObjectType guard; logic equivalent (helper inlined vs private method) | - ---- - -## Notes on Digest File Mapping - -### One digest file → two rector files -`remove-deprecated-trusted-data-concept-from-drupal-config-3347842.php` defined a single class (`RemoveTrustedDataConceptRector`) handling both `->save(TRUE)` and `->trustData()` patterns. The rector project splits these into two separate class files — `RemoveConfigSaveTrustedDataArgRector` and `RemoveTrustDataCallRector` — consistent with the project's one-class-per-file convention. Both rector classes add ObjectType guards absent from the single digest class. - -### Issue number mismatches -Three rectors reference a different `@see` issue number than the digest filename's suffix. In each case the transformation is the same; the numbers refer to different nodes in the same deprecation issue thread: - -| Rector | Rector `@see` | Digest filename issue | Notes | -|---|---|---|---| -| `RemoveViewsRowCacheKeysRector` | `#3564958` | `#3564937` | `3564958` is the change record; `3564937` is the original issue | -| `ReplaceCommentManagerGetCountNewCommentsRector` | `#3551729` | `#3543035` | `3543035` is the original issue; `3551729` is the related change record | -| `ReplaceEntityReferenceRecursiveLimitRector` | `#3316878` | `#2940605` | `2940605` is the older issue; `3316878` is the more recent change record | diff --git a/docs/digest-comparison-report-fresh.md b/docs/digest-comparison-report-fresh.md deleted file mode 100644 index 4c8d0b566..000000000 --- a/docs/digest-comparison-report-fresh.md +++ /dev/null @@ -1,554 +0,0 @@ -# Drupal Digest → Drupal Rector Comparison Report (Fresh Digest) - -Compares each rector added in branch `feature/digest-rectors` against its source in -[drupal-digest-fresh](https://github.com/dbuytaert/drupal-digests) (regenerated with improved prompt). - -**Total rectors compared:** 50 -**Significant changes:** 28 -**Minimal changes:** 22 -**Split from one digest file:** 1 pair (`RemoveTrustDataCallRector` + `RemoveConfigSaveTrustedDataArgRector`) - ---- - -## Overview Table - -> Paths are relative to each repo root. Digest paths are relative to `drupal-digest-fresh/`. -> `†` = rector `@see` issue number differs from the digest filename — see [Notes](#notes-on-digest-file-mapping). - -| Rector | Ver | Changes | Issue | Digest source | Rector destination | -|---|---|---|---|---|---| -| `ReplaceModuleHandlerGetNameRector` | D10 | **Significant** | [#3571063](https://www.drupal.org/node/3571063) | `rector/rules/replace-removed-modulehandlerinterface-getname-with-3571063.php` | `src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector.php` | -| `ReplaceRebuildThemeDataRector` | D10 | **Significant** | [#3571068](https://www.drupal.org/node/3571068) | `rector/rules/replace-removed-themehandlerinterface-rebuildthemedata-with-3571068.php` | `src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector.php` | -| `ReplaceRequestTimeConstantRector` | D10 | **Significant** | [#3395986](https://www.drupal.org/node/3395986) | `rector/rules/add-timeinterface-time-argument-to-plugin-constructor-3395986.php` | `src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector.php` | -| `ErrorCurrentErrorHandlerRector` | D11 | Minimal | [#3526515](https://www.drupal.org/node/3526515) | `rector/rules/replace-error-currenterrorhandler-with-get-error-handler-3526515.php` | `src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector.php` | -| `FileSystemBasenameToNativeRector` | D11 | Minimal | [#3530461](https://www.drupal.org/node/3530461) | `rector/rules/replace-filesysteminterface-basename-with-native-basename-3530461.php` | `src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector.php` | -| `LoadAllIncludesRector` | D11 | **Significant** | [#3536431](https://www.drupal.org/node/3536431) | `rector/rules/replace-deprecated-modulehandler-loadallincludes-with-3536431.php` | `src/Drupal11/Rector/Deprecation/LoadAllIncludesRector.php` | -| `MigrateSqlGetMigrationPluginManagerRector` | D11 | **Significant** | [#3439369](https://www.drupal.org/node/3439369) | `rector/rules/replace-deprecated-sql-getmigrationpluginmanager-with-3439369.php` | `src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector.php` | -| `NodeStorageDeprecatedMethodsRector` | D11 | **Significant** | [#3396062](https://www.drupal.org/node/3396062) | `rector/rules/replace-deprecated-nodestorage-revisionids-and-3396062.php` | `src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector.php` | -| `PluginBaseIsConfigurableRector` | D11 | **Significant** | [#3459533](https://www.drupal.org/node/3459533) | `rector/rules/replace-deprecated-pluginbase-isconfigurable-with-3459533.php` | `src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector.php` | -| `RemoveAutomatedCronSubmitHandlerRector` | D11 | **Significant** | [#3566768](https://www.drupal.org/node/3566768) | `rector/rules/remove-deprecated-automated-cron-settings-submit-calls-and-3566768.php` | `src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector.php` | -| `RemoveCacheExpireOverrideRector` | D11 | **Significant** | [#3576556](https://www.drupal.org/node/3576556) | `rector/rules/remove-deprecated-cacheexpire-overrides-from-views-3576556.php` | `src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector.php` | -| `RemoveConfigSaveTrustedDataArgRector` | D11 | **Significant** | [#3347842](https://www.drupal.org/node/3347842) | `rector/rules/remove-deprecated-trusted-data-concept-from-drupal-config-3347842.php` *(split)* | `src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector.php` | -| `RemoveHandlerBaseDefineExtraOptionsRector` | D11 | **Significant** | [#3485084](https://www.drupal.org/node/3485084) | `rector/rules/remove-overrides-of-deprecated-handlerbase-3485084.php` | `src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector.php` | -| `RemoveLinkWidgetValidateTitleElementRector` | D11 | Minimal | [#3093118](https://www.drupal.org/node/3093118) | `rector/rules/remove-deprecated-linkwidget-validatetitleelement-calls-3093118.php` | `src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector.php` | -| `RemoveModuleHandlerAddModuleCallsRector` | D11 | **Significant** | [#3528899](https://www.drupal.org/node/3528899) | `rector/rules/remove-deprecated-modulehandlerinterface-addmodule-and-3528899.php` | `src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector.php` | -| `RemoveModuleHandlerDeprecatedMethodsRector` | D11 | **Significant** | [#3442009](https://www.drupal.org/node/3442009) | `rector/rules/remove-deprecated-modulehandlerinterface-writecache-and-3442009.php` | `src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector.php` | -| `RemoveRootFromConvertDbUrlRector` | D11 | **Significant** | [#3522513](https://www.drupal.org/node/3522513) | `rector/rules/remove-deprecated-string-root-from-database-3522513.php` | `src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector.php` | -| `RemoveSetUriCallbackRector` | D11 | **Significant** | [#2667040](https://www.drupal.org/node/2667040) | `rector/rules/remove-deprecated-entitytypeinterface-seturicallback-calls-2667040.php` | `src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector.php` | -| `RemoveStateCacheSettingRector` | D11 | Minimal | [#3436954](https://www.drupal.org/node/3436954) | `rector/rules/remove-deprecated-settings-state-cache-assignment-3436954.php` | `src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector.php` | -| `RemoveTrustDataCallRector` | D11 | **Significant** | [#3347842](https://www.drupal.org/node/3347842) | `rector/rules/remove-deprecated-trusted-data-concept-from-drupal-config-3347842.php` *(split)* | `src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector.php` | -| `RemoveTwigNodeTransTagArgumentRector` | D11 | **Significant** | [#3473440](https://www.drupal.org/node/3473440) | `rector/rules/remove-deprecated-tag-argument-from-twignodetrans-3473440.php` | `src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector.php` | -| `RemoveUpdaterPostInstallMethodsRector` | D11 | Minimal | [#3417136](https://www.drupal.org/node/3417136) | `rector/rules/remove-deprecated-updater-postinstall-postinstalltasks-3417136.php` | `src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector.php` | -| `RemoveViewsRowCacheKeysRector` | D11 | **Significant** | [#3564958](https://www.drupal.org/node/3564958) † | `rector/rules/remove-deprecated-cachepluginbase-getrowcachekeys-and-3564937.php` | `src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php` | -| `RenameStopProceduralHookScanRector` | D11 | **Significant** | [#3495943](https://www.drupal.org/node/3495943) | `rector/rules/rename-stopproceduralhookscan-attribute-to-3495943.php` | `src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector.php` | -| `ReplaceAlphadecimalToIntNullRector` | D11 | Minimal | [#3442810](https://www.drupal.org/node/3442810) | `rector/rules/replace-deprecated-number-alphadecimaltoint-null-calls-with-3442810.php` | `src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector.php` | -| `ReplaceCommentManagerGetCountNewCommentsRector` | D11 | **Significant** | [#3551729](https://www.drupal.org/node/3551729) † | `rector/rules/replace-deprecated-commentmanagerinterface-3543035.php` | `src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector.php` | -| `ReplaceCommentUriRector` | D11 | Minimal | [#2010202](https://www.drupal.org/node/2010202) | `rector/rules/replace-deprecated-comment-uri-with-comment-permalink-2010202.php` | `src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector.php` | -| `ReplaceDateTimeRangeConstantsRector` | D11 | Minimal | [#3574901](https://www.drupal.org/node/3574901) | `rector/rules/replace-removed-datetimerangeconstantsinterface-constants-3574901.php` | `src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector.php` | -| `ReplaceEditorLoadRector` | D11 | **Significant** | [#3447794](https://www.drupal.org/node/3447794) | `rector/rules/replace-deprecated-editor-load-with-entity-storage-load-3447794.php` | `src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector.php` | -| `ReplaceEntityOriginalPropertyRector` | D11 | **Significant** | [#3571065](https://www.drupal.org/node/3571065) | `rector/rules/replace-deprecated-entity-original-magic-property-with-3571065.php` | `src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector.php` | -| `ReplaceEntityReferenceRecursiveLimitRector` | D11 | Minimal | [#3316878](https://www.drupal.org/node/3316878) † | `rector/rules/replace-deprecated-entityreferenceentityformatter-recursive-2940605.php` | `src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector.php` | -| `ReplaceFieldgroupToFieldsetRector` | D11 | Minimal | [#3512254](https://www.drupal.org/node/3512254) | `rector/rules/replace-deprecated-type-fieldgroup-with-type-fieldset-3512254.php` | `src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector.php` | -| `ReplaceFileGetContentHeadersRector` | D11 | Minimal | [#3494126](https://www.drupal.org/node/3494126) | `rector/rules/replace-file-get-content-headers-with-fileinterface-3494126.php` | `src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector.php` | -| `ReplaceLocaleConfigBatchFunctionsRector` | D11 | **Significant** | [#3575254](https://www.drupal.org/node/3575254) | `rector/rules/replace-deprecated-locale-batch-functions-with-their-3575254.php` | `src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector.php` | -| `ReplaceNodeAccessViewAllNodesRector` | D11 | Minimal | [#3038908](https://www.drupal.org/node/3038908) | `rector/rules/replace-deprecated-node-access-view-all-nodes-with-oo-3038908.php` | `src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector.php` | -| `ReplaceNodeAddBodyFieldRector` | D11 | Minimal | [#3489266](https://www.drupal.org/node/3489266) | `rector/rules/replace-deprecated-node-add-body-field-with-createbodyfield-3489266.php` | `src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector.php` | -| `ReplaceNodeModuleProceduralFunctionsRector` | D11 | Minimal | [#3571623](https://www.drupal.org/node/3571623) | `rector/rules/replace-deprecated-node-module-procedural-functions-with-oo-3571623.php` | `src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector.php` | -| `ReplaceNodeSetPreviewModeRector` | D11 | **Significant** | [#3538277](https://www.drupal.org/node/3538277) | `rector/rules/replace-deprecated-constants-with-nodepreviewmode-enum-in-3538277.php` | `src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector.php` | -| `ReplacePdoFetchConstantsRector` | D11 | **Significant** | [#3525077](https://www.drupal.org/node/3525077) | `rector/rules/replace-removed-mysql-pgsql-sqlite-driver-query-subclass-3525077.php` | `src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector.php` | -| `ReplaceRecipeRunnerInstallModuleRector` | D11 | Minimal | [#3498026](https://www.drupal.org/node/3498026) | `rector/rules/replace-deprecated-reciperunner-installmodule-with-3498026.php` | `src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector.php` | -| `ReplaceSessionManagerDeleteRector` | D11 | **Significant** | [#3577376](https://www.drupal.org/node/3577376) | `rector/rules/replace-deprecated-sessionmanager-delete-with-3577376.php` | `src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector.php` | -| `ReplaceSessionWritesWithRequestSessionRector` | D11 | Minimal | [#3518527](https://www.drupal.org/node/3518527) | `rector/rules/replace-deprecated-session-writes-with-drupal-request-3518527.php` | `src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector.php` | -| `ReplaceSystemPerformanceGzipKeyRector` | D11 | Minimal | [#3184242](https://www.drupal.org/node/3184242) | `rector/rules/replace-deprecated-system-performance-css-gzip-js-gzip-3184242.php` | `src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector.php` | -| `ReplaceThemeGetSettingRector` | D11 | Minimal | [#3573896](https://www.drupal.org/node/3573896) | `rector/rules/replace-deprecated-theme-get-setting-and-system-default-3573896.php` | `src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector.php` | -| `ReplaceUserSessionNamePropertyRector` | D11 | Minimal | [#3513856](https://www.drupal.org/node/3513856) | `rector/rules/replace-deprecated-usersession-name-property-read-with-3513856.php` | `src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector.php` | -| `ReplaceViewsProceduralFunctionsRector` | D11 | Minimal | [#3572243](https://www.drupal.org/node/3572243) | `rector/rules/replace-deprecated-views-procedural-functions-with-oo-3572243.php` | `src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector.php` | -| `StatementPrefetchIteratorFetchColumnRector` | D11 | **Significant** | [#3490200](https://www.drupal.org/node/3490200) | `rector/rules/replace-deprecated-statementprefetchiterator-fetchcolumn-3490200.php` | `src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector.php` | -| `StripMigrationDependenciesExpandArgRector` | D11 | Minimal | [#3574717](https://www.drupal.org/node/3574717) | `rector/rules/strip-removed-expand-argument-from-getmigrationdependencies-3574717.php` | `src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector.php` | -| `UseEntityTypeHasIntegerIdRector` | D11 | **Significant** | [#3566801](https://www.drupal.org/node/3566801) | `rector/rules/replace-deprecated-entity-type-integer-id-helpers-with-3566801.php` | `src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector.php` | -| `ViewsPluginHandlerManagerRector` | D11 | Minimal | [#3566424](https://www.drupal.org/node/3566424) | `rector/rules/replace-deprecated-views-pluginmanager-and-views-3566424.php` | `src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector.php` | - ---- - -## Significant Changes - -### 1. `ReplaceModuleHandlerGetNameRector` (Drupal10) - -**Digest file:** `replace-removed-modulehandlerinterface-getname-with-3571063.php` - -**Change:** The fresh digest used a plain `AbstractRector` with a simple `refactor()` method. The rector integrates into the `AbstractDrupalCoreRector` framework with `DrupalIntroducedVersionConfiguration('10.3.0')`, using `refactorWithConfiguration()` and `ConfiguredCodeSample` in `getRuleDefinition()`. The transformation logic is otherwise identical. - ---- - -### 2. `ReplaceRebuildThemeDataRector` (Drupal10) - -**Digest file:** `replace-removed-themehandlerinterface-rebuildthemedata-with-3571068.php` - -**Change:** Like `ReplaceModuleHandlerGetNameRector`, the rector wraps the logic in `AbstractDrupalCoreRector` with `DrupalIntroducedVersionConfiguration('10.3.0')`. Additionally, the rector adds a `ThemeHandlerInterface` ObjectType check that was missing from the fresh digest. - -```php -// Fresh digest — no type guard -if (!$this->isName($node->name, 'rebuildThemeData')) { - return null; -} - -// Rector — adds ThemeHandlerInterface type guard -if (!$this->isObjectType($node->var, new ObjectType('Drupal\Core\Extension\ThemeHandlerInterface'))) { - return null; -} -``` - ---- - -### 3. `ReplaceRequestTimeConstantRector` (Drupal10) - -**Digest file:** `add-timeinterface-time-argument-to-plugin-constructor-3395986.php` - -**Change:** The issue ID is shared but the two rules address entirely different deprecations. The fresh digest adds a `?TimeInterface $time` argument to `__construct()` overrides across six Drupal plugin parent classes. The rector instead replaces the `REQUEST_TIME` constant with `\Drupal::time()->getRequestTime()`. No code from the digest was reused — the rector is a completely independent implementation. - ---- - -### 4. `LoadAllIncludesRector` (Drupal11) - -**Digest file:** `replace-deprecated-modulehandler-loadallincludes-with-3536431.php` - -**Change:** The fresh digest had no type guard — it rewrote any `loadAllIncludes()` call regardless of object type. The rector adds a `ModuleHandlerInterface` ObjectType check before rewriting. - -```php -// Fresh digest — no type guard -if (!$this->isName($methodCall->name, 'loadAllIncludes')) { - return null; -} - -// Rector — requires ModuleHandlerInterface -if (!$this->isObjectType($methodCall->var, new ObjectType('Drupal\Core\Extension\ModuleHandlerInterface'))) { - return null; -} -``` - ---- - -### 5. `MigrateSqlGetMigrationPluginManagerRector` (Drupal11) - -**Digest file:** `replace-deprecated-sql-getmigrationpluginmanager-with-3439369.php` - -**Change:** The type-check approach is inverted. The fresh digest used a negative guard — skip if the caller is a `Migration` instance, allowing any other caller through. The rector uses a positive guard — only proceed if the caller is specifically a `Sql` instance. The rector's approach is more restrictive and precise. - -```php -// Fresh digest — negative guard (exclude Migration) -if ($this->isObjectType($node->var, new ObjectType('Drupal\migrate\Plugin\Migration'))) { - return null; -} - -// Rector — positive guard (require Sql) -if (!$this->isObjectType($node->var, new ObjectType('Drupal\migrate\Plugin\migrate\id_map\Sql'))) { - return null; -} -``` - ---- - -### 6. `NodeStorageDeprecatedMethodsRector` (Drupal11) - -**Digest file:** `replace-deprecated-nodestorage-revisionids-and-3396062.php` - -**Change:** The fresh digest handled only `revisionIds()` and `userRevisionIds()`. The rector adds handling for `countDefaultLanguageRevisions()`, which has no replacement and must be removed entirely. This requires registering `Expression::class` as an additional node type and using `NodeVisitor::REMOVE_NODE`. - -```php -// Rector — additional node type and removal handling -public function getNodeTypes(): array -{ - return [Node\Expr\MethodCall::class, Node\Stmt\Expression::class]; -} - -// Removes countDefaultLanguageRevisions() entirely -if ($node instanceof Node\Stmt\Expression) { - if ($this->getName($methodCall->name) === 'countDefaultLanguageRevisions') { - return NodeVisitor::REMOVE_NODE; - } -} -``` - ---- - -### 7. `PluginBaseIsConfigurableRector` (Drupal11) - -**Digest file:** `replace-deprecated-pluginbase-isconfigurable-with-3459533.php` - -**Change:** The fresh digest relied solely on detecting `$this->isConfigurable()` (variable named `this`, no args) without any type guard. The rector adds an explicit `isObjectType($node->var, new ObjectType('Drupal\Component\Plugin\PluginBase'))` check, preventing false positives on any other class that may have an `isConfigurable()` method. - -```php -// Fresh digest — $this check only, no type guard -if ($this->getName($node->var) !== 'this') { - return null; -} - -// Rector — adds PluginBase type guard -if ($this->getName($node->var) !== 'this') { - return null; -} -if (!$this->isObjectType($node->var, new ObjectType('Drupal\Component\Plugin\PluginBase'))) { - return null; -} -``` - ---- - -### 8. `RemoveAutomatedCronSubmitHandlerRector` (Drupal11) - -**Digest file:** `remove-deprecated-automated-cron-settings-submit-calls-and-3566768.php` - -**Change:** The fresh digest registered two rules: a custom class for `$form['#submit'][]` array-append removal, and `RemoveFuncCallRector` (a built-in Rector rule) for direct `automated_cron_settings_submit()` function calls. The rector implements only the array-append removal, omitting the direct function-call case. The class was also renamed from `RemoveAutomatedCronSettingsSubmitHandlerRector` to `RemoveAutomatedCronSubmitHandlerRector`. - ---- - -### 9. `RemoveCacheExpireOverrideRector` (Drupal11) - -**Digest file:** `remove-deprecated-cacheexpire-overrides-from-views-3576556.php` - -**Change:** The rector significantly improves the class-hierarchy detection logic. It adds a `PARENT_FQCNS` constant listing all four known fully-qualified parent class names (`CachePluginBase`, `Time`, `Tag`, `None`), adds `'None'` to `PARENT_SHORT_NAMES`, and uses `str_ends_with($parentName, '\\' . $short)` for namespace-relative names to prevent false matches on partial namespace strings. - -```php -// Rector — adds PARENT_FQCNS constant -private const PARENT_FQCNS = [ - 'Drupal\views\Plugin\views\cache\CachePluginBase', - 'Drupal\views\Plugin\views\cache\Time', - 'Drupal\views\Plugin\views\cache\Tag', - 'Drupal\views\Plugin\views\cache\None', -]; -// Matches FQCNs first, then restricts short-name check to unqualified names -if (!str_contains($parentName, '\\')) { - foreach (self::PARENT_SHORT_NAMES as $short) { -``` - ---- - -### 10. `RemoveConfigSaveTrustedDataArgRector` + `RemoveTrustDataCallRector` (Drupal11) - -**Digest file:** `remove-deprecated-trusted-data-concept-from-drupal-config-3347842.php` (one file, split into two rector classes) - -**Change:** The fresh digest defined a single class covering both patterns. The rector splits them into two focused files. `RemoveConfigSaveTrustedDataArgRector` handles only `Config::save(TRUE/FALSE)` and adds a `Drupal\Core\Config\Config` ObjectType check. `RemoveTrustDataCallRector` handles only `->trustData()` chain removal and adds a `ConfigEntityInterface` ObjectType check. Both additions prevent false positives that the combined digest class was susceptible to. - -```php -// RemoveConfigSaveTrustedDataArgRector — adds Config type guard -if (!$this->isObjectType($node->var, new ObjectType('Drupal\Core\Config\Config'))) { - return null; -} - -// RemoveTrustDataCallRector — adds ConfigEntityInterface type guard -if (!$this->isObjectType($node->var, new ObjectType('Drupal\Core\Config\Entity\ConfigEntityInterface'))) { - return null; -} -``` - ---- - -### 11. `RemoveHandlerBaseDefineExtraOptionsRector` (Drupal11) - -**Digest file:** `remove-overrides-of-deprecated-handlerbase-3485084.php` - -**Change:** The fresh digest's `PARENT_SHORT_NAMES` covered only `HandlerBase`. The rector expands it to cover five additional handler base classes: `FieldHandlerBase`, `FilterPluginBase`, `SortPluginBase`, `ArgumentPluginBase`, and `RelationshipPluginBase`. The rector also adds an `isObjectType` PHPStan fallback and uses a different approach for the exclusion of the `HandlerBase` class itself. - -```php -// Fresh digest -private const PARENT_SHORT_NAMES = ['HandlerBase']; - -// Rector -private const PARENT_SHORT_NAMES = [ - 'HandlerBase', - 'FieldHandlerBase', - 'FilterPluginBase', - 'SortPluginBase', - 'ArgumentPluginBase', - 'RelationshipPluginBase', -]; -``` - ---- - -### 12. `RemoveModuleHandlerAddModuleCallsRector` (Drupal11) - -**Digest file:** `remove-deprecated-modulehandlerinterface-addmodule-and-3528899.php` - -**Change:** The fresh digest checked only `ModuleHandlerInterface`. The rector also checks the concrete `ModuleHandler` class, covering cases where the variable is typed as the implementation rather than the interface. - -```php -// Fresh digest — interface only -if ($this->isObjectType($methodCall->var, new ObjectType('Drupal\\Core\\Extension\\ModuleHandlerInterface'))) { - -// Rector — interface + concrete class -foreach (['Drupal\Core\Extension\ModuleHandlerInterface', 'Drupal\Core\Extension\ModuleHandler'] as $class) { - if ($this->isObjectType($methodCall->var, new ObjectType($class))) { - $isModuleHandler = true; - break; - } -} -``` - ---- - -### 13. `RemoveModuleHandlerDeprecatedMethodsRector` (Drupal11) - -**Digest file:** `remove-deprecated-modulehandlerinterface-writecache-and-3442009.php` - -**Change:** Both rules remove `writeCache()` and replace `getHookInfo()` with `[]`. The rector goes further: it removes standalone `getHookInfo()` expression statements entirely (via `NodeVisitor::REMOVE_NODE`) rather than leaving bare `[];` statements behind, as the digest did. The rector also refactors detection into a private `isModuleHandlerMethodCall()` helper. - ---- - -### 14. `RemoveRootFromConvertDbUrlRector` (Drupal11) - -**Digest file:** `remove-deprecated-string-root-from-database-3522513.php` - -**Change:** The rector recognizes more expression types as valid second-argument forms to strip. It adds `StaticPropertyFetch` and `MethodCall` to the recognized node types (the fresh digest handled only `Variable`, `String_`, and `ClassConstFetch`). The class was also renamed from `RemoveRootFromConvertDbUrlToConnectionInfoRector`. - ---- - -### 15. `RemoveSetUriCallbackRector` (Drupal11) - -**Digest file:** `remove-deprecated-entitytypeinterface-seturicallback-calls-2667040.php` - -**Change:** The fresh digest had no type guard — it removed any `setUriCallback()` call by method name alone. The rector adds `isObjectType($node->expr->var, new ObjectType('Drupal\Core\Entity\EntityTypeInterface'))` checks on both the standalone-statement case and the fluent-chain case. - -```php -// Fresh digest — no type guard -if ($node->expr instanceof MethodCall && $this->isName($node->expr->name, 'setUriCallback')) { - return NodeVisitor::REMOVE_NODE; -} - -// Rector — type-guarded -if ($node->expr instanceof MethodCall - && $this->isName($node->expr->name, 'setUriCallback') - && $this->isObjectType($node->expr->var, new ObjectType('Drupal\Core\Entity\EntityTypeInterface')) -) { - return NodeVisitor::REMOVE_NODE; -} -``` - ---- - -### 16. `RemoveTwigNodeTransTagArgumentRector` (Drupal11) - -**Digest file:** `remove-deprecated-tag-argument-from-twignodetrans-3473440.php` - -**Change:** The strategies for argument removal and class matching both differ. The rector checks `count($node->args) === 6` exactly and uses `array_pop()` to remove the last argument. The fresh digest used `isset($node->args[5])` and `array_splice($node->args, 5)`, which would also handle cases with more than six arguments. The rector additionally matches the short class name `TwigNodeTrans` (without namespace) in addition to the FQCN. The class was renamed from `RemoveTwigNodeTransTagArgRector`. - ---- - -### 17. `RemoveViewsRowCacheKeysRector` (Drupal11) - -**Digest file:** `remove-deprecated-cachepluginbase-getrowcachekeys-and-3564937.php` - -**Note:** The rector's `@see` references issue `#3564958`; the digest file uses `#3564937`. Both numbers refer to the same deprecation — `3564958` is the change record and `3564937` is the original issue. - -**Change:** The fresh digest removed array items whose value was a call to `getRowCacheKeys()` or `getRowId()` by method name alone, with no type guard. The rector adds `isObjectType($item->value->var, new ObjectType('Drupal\views\Plugin\views\cache\CachePluginBase'))`, preventing false positives when another class has methods with the same names. - -```php -// Fresh digest — no type guard -if ($item->value instanceof MethodCall && $this->isDeprecatedMethodCall($item->value)) { - -// Rector — type-guarded -if ($item->value instanceof MethodCall - && $item->value->name instanceof Identifier - && in_array($item->value->name->toString(), self::DEPRECATED_METHODS, true) - && $this->isObjectType($item->value->var, new ObjectType('Drupal\views\Plugin\views\cache\CachePluginBase')) -) { -``` - ---- - -### 18. `RenameStopProceduralHookScanRector` (Drupal11) - -**Digest file:** `rename-stopproceduralhookscan-attribute-to-3495943.php` - -**Change:** The fresh digest was a trivial config snippet (two lines of real logic) using the built-in `RenameClassRector`. The rector implements a full custom rule visiting both `UseUse` and `Attribute` AST nodes to rename the use-statement and the attribute usage site independently, preserving correct formatting and avoiding the risk of `RenameClassRector` rewriting unrelated class body references. - ---- - -### 19. `ReplaceCommentManagerGetCountNewCommentsRector` (Drupal11) - -**Digest file:** `replace-deprecated-commentmanagerinterface-3543035.php` - -**Note:** The rector's `@see` references issue `#3551729`; the digest file uses `#3543035`. Both reference the same deprecation — `#3543035` is the original issue, `#3551729` is the related change record. - -**Change:** The fresh digest extended `AbstractRector` directly with a plain `refactor()` method. The rector extends `AbstractDrupalCoreRector` and wraps the logic in `refactorWithConfiguration()`, enabling version-gated activation via `DrupalIntroducedVersionConfiguration('11.3.0')`. - -```php -// Fresh digest -final class CommentManagerGetCountNewCommentsRector extends AbstractRector -{ - public function refactor(Node $node): ?Node { ... } - -// Rector -final class ReplaceCommentManagerGetCountNewCommentsRector extends AbstractDrupalCoreRector -{ - public function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { ... } - // getRuleDefinition() uses ConfiguredCodeSample with DrupalIntroducedVersionConfiguration('11.3.0') -``` - ---- - -### 20. `ReplaceEditorLoadRector` (Drupal11) - -**Digest file:** `replace-deprecated-editor-load-with-entity-storage-load-3447794.php` - -**Change:** The rector uses `$this->nodeFactory->createStaticCall()` and `createMethodCall()` helpers from Rector's `NodeFactory` for cleaner AST construction, replacing the fresh digest's inline manual node construction. The rector also adds a `count($node->args) !== 1` guard that the digest lacked. The class was renamed from `EditorLoadDeprecationRector`. - ---- - -### 21. `ReplaceEntityOriginalPropertyRector` (Drupal11) - -**Digest file:** `replace-deprecated-entity-original-magic-property-with-3571065.php` - -**Change:** The fresh digest handled `PropertyFetch` and `Assign` nodes only, with no type guard on read accesses. The rector adds `NullsafePropertyFetch` as a third node type, rewriting `$entity?->original` to `$entity?->getOriginal()` via `NullsafeMethodCall`. It also adds an `EntityInterface` ObjectType check on the `PropertyFetch` branch. The class was renamed from `EntityOriginalPropertyToMethodRector`. - -```php -// Fresh digest — only PropertyFetch and Assign -public function getNodeTypes(): array -{ - return [PropertyFetch::class, Assign::class]; -} -// No isObjectType check on the PropertyFetch branch - -// Rector — adds NullsafePropertyFetch and EntityInterface type guard -public function getNodeTypes(): array -{ - return [PropertyFetch::class, NullsafePropertyFetch::class, Assign::class]; -} -if ($this->isObjectType($node->var, new ObjectType('Drupal\Core\Entity\EntityInterface'))) { - return new MethodCall($node->var, 'getOriginal'); -} -``` - ---- - -### 22. `ReplaceLocaleConfigBatchFunctionsRector` (Drupal11) - -**Digest file:** `replace-deprecated-locale-batch-functions-with-their-3575254.php` - -**Change:** The fresh digest was a config snippet using the built-in `RenameFunctionRector`. The rector implements a full custom `FuncCall`-visiting rule with a `RENAME_MAP` constant, providing type-safety, testability, and more control over the transformation. - ---- - -### 23. `ReplaceNodeSetPreviewModeRector` (Drupal11) - -**Digest file:** `replace-deprecated-constants-with-nodepreviewmode-enum-in-3538277.php` - -**Change:** The fresh digest had no type guard on `setPreviewMode()` — it would rewrite the call on any object. The rector adds `isObjectType($node->var, new ObjectType('Drupal\node\NodeTypeInterface'))`, preventing false positives on unrelated classes with the same method name. The class was renamed from `NodeSetPreviewModeRector`. - -```php -// Fresh digest — no type guard -if (!$this->isName($node->name, 'setPreviewMode')) { return null; } - -// Rector — NodeTypeInterface guard -if (!$this->isObjectType($node->var, new ObjectType('Drupal\node\NodeTypeInterface'))) { - return null; -} -``` - ---- - -### 24. `ReplacePdoFetchConstantsRector` (Drupal11) - -**Digest file:** `replace-removed-mysql-pgsql-sqlite-driver-query-subclass-3525077.php` - -**Change:** The issue ID is shared but the two rules address entirely different aspects of the same deprecation. The fresh digest was a config snippet using `RenameClassRector` to repoint nine deprecated driver-specific query subclasses to their `Drupal\Core\Database\Query\*` equivalents. The rector is a full custom rule converting `PDO::FETCH_*` constants to `FetchAs` enum cases across `setFetchMode()`, `fetch()`, `fetchAll()`, `fetchAllAssoc()`, and `'fetch'` array keys. No code from the digest was reused. - ---- - -### 25. `ReplaceSessionManagerDeleteRector` (Drupal11) - -**Digest file:** `replace-deprecated-sessionmanager-delete-with-3577376.php` - -**Change:** The fresh digest extended `AbstractRector` directly with a plain `refactor()` method. The rector extends `AbstractDrupalCoreRector` and uses `refactorWithConfiguration()` with `DrupalIntroducedVersionConfiguration('11.4.0')`. The type-check strategy was also changed from the PHPStan `$sessionManagerType->isSuperTypeOf($callerType)->yes()` pattern to the standard Rector `$this->isObjectType()` API. - -```php -// Fresh digest -final class ReplaceSessionManagerDeleteRector extends AbstractRector -{ - public function refactor(Node $node): ?Node { ... } - -// Rector -final class ReplaceSessionManagerDeleteRector extends AbstractDrupalCoreRector -{ - public function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { ... } -``` - ---- - -### 26. `StatementPrefetchIteratorFetchColumnRector` (Drupal11) - -**Digest file:** `replace-deprecated-statementprefetchiterator-fetchcolumn-3490200.php` - -**Change:** The fresh digest was a config snippet using `RenameMethodRector` to rename `fetchColumn` → `fetchField` on `StatementPrefetchIterator`. The rector implements a full custom `MethodCall`-visiting rule with an explicit `StatementPrefetchIterator` ObjectType check, making the transformation testable and precise. - ---- - -### 27. `UseEntityTypeHasIntegerIdRector` (Drupal11) - -**Digest file:** `replace-deprecated-entity-type-integer-id-helpers-with-3566801.php` - -**Change:** The fresh digest treated `entityTypeSupportsComments()` and `hasIntegerId()` as simple `$this->method()` rewrites with no type guard — any class with those method names would be transformed. The rector adds a `METHOD_OWNER_CLASS` constant that maps each method to its declaring class FQCN and calls `isObjectType()` before transforming, preventing false positives entirely. - -```php -// Fresh digest — no type guard -private const SIMPLE_METHOD_NAMES = ['entityTypeSupportsComments']; -if (in_array($methodName, self::SIMPLE_METHOD_NAMES, true) && count($node->args) === 1) { - return new MethodCall($node->args[0]->value, 'hasIntegerId'); -} - -// Rector — type-guarded via METHOD_OWNER_CLASS -private const METHOD_OWNER_CLASS = [ - 'entityTypeSupportsComments' => 'Drupal\comment\CommentTypeForm', - 'hasIntegerId' => 'Drupal\layout_builder\Plugin\SectionStorage\OverridesSectionStorage', -]; -if (!$this->isObjectType($node->var, new ObjectType(self::METHOD_OWNER_CLASS[$name]))) { - return null; -} -``` - ---- - -## Minimal Changes - -These rectors are functionally identical to their fresh-digest counterparts. Differences are limited to: namespace declarations, proper `use` imports (replacing inline backslash-prefixed FQCNs), `declare(strict_types=1)` placement, class renaming to match drupal-rector naming conventions, and minor wording in `getRuleDefinition()`. - -| Rector class | Notable structural differences from digest | -|---|---| -| `ErrorCurrentErrorHandlerRector` | Namespace + imports only; `ObjectType` imported vs inline `\PHPStan\Type\ObjectType` | -| `FileSystemBasenameToNativeRector` | Namespace + imports only; type-check API changed from `isSuperTypeOf()->yes()` to `isObjectType()` (semantically equivalent) | -| `RemoveLinkWidgetValidateTitleElementRector` | Namespace + imports only | -| `RemoveStateCacheSettingRector` | Namespace + imports only | -| `RemoveUpdaterPostInstallMethodsRector` | Namespace + imports only; backslash escaping in `UPDATER_BASE_CLASSES` normalized | -| `ReplaceAlphadecimalToIntNullRector` | Namespace + imports only; class renamed from `AlphadecimalToIntNullOrEmptyRector` | -| `ReplaceCommentUriRector` | Namespace + imports only; class renamed from `CommentUriToPermalinkRector`; arg count check changed from `!== 1` to `< 1` | -| `ReplaceDateTimeRangeConstantsRector` | Namespace + imports only; class renamed from `ReplaceDatetimeDeprecatedApisRector` | -| `ReplaceEntityReferenceRecursiveLimitRector` | Namespace + imports only; class name preserved; logic identical | -| `ReplaceFieldgroupToFieldsetRector` | Namespace + imports only; class renamed from `FieldgroupToFieldsetRector` | -| `ReplaceFileGetContentHeadersRector` | Namespace + imports only; class renamed from `FileGetContentHeadersRector` | -| `ReplaceNodeAccessViewAllNodesRector` | Namespace + imports only; class renamed from `NodeAccessViewAllNodesRector` | -| `ReplaceNodeAddBodyFieldRector` | Namespace + imports only; class renamed from `NodeAddBodyFieldRector` | -| `ReplaceNodeModuleProceduralFunctionsRector` | Namespace + imports only; class renamed from `ReplaceDeprecatedNodeFunctionsRector`; private constants replaced with inline strings | -| `ReplaceRecipeRunnerInstallModuleRector` | Namespace + imports only; class renamed from `RecipeRunnerInstallModuleRector` | -| `ReplaceSessionWritesWithRequestSessionRector` | Namespace + imports only; class renamed from `SessionSuperGlobalToRequestSessionRector` | -| `ReplaceSystemPerformanceGzipKeyRector` | Namespace + imports only; class renamed from `SystemPerformanceGzipToCompressRector` | -| `ReplaceThemeGetSettingRector` | Namespace + imports only | -| `ReplaceUserSessionNamePropertyRector` | Namespace + imports only; class renamed from `UserSessionNamePropertyToGetAccountNameRector`; adds `UserSession` ObjectType check | -| `ReplaceViewsProceduralFunctionsRector` | Namespace + imports only; class renamed from `ReplaceDeprecatedViewsFunctionsRector` | -| `StripMigrationDependenciesExpandArgRector` | Namespace + imports only; class renamed from `RemoveMigrationDependenciesExpandArgRector`; type-check API changed from `isSuperTypeOf()->yes()` to `isObjectType()` (semantically equivalent) | -| `ViewsPluginHandlerManagerRector` | Namespace + imports only; class-name check changed from `isObjectType()` to `isName()` (correct for static call class nodes) | - ---- - -## Notes on Digest File Mapping - -### One digest file → two rector files -`remove-deprecated-trusted-data-concept-from-drupal-config-3347842.php` defined two classes in a single file: a combined handler for both `save(TRUE)` and `->trustData()` patterns. The rector project splits these into two separate class files — `RemoveConfigSaveTrustedDataArgRector` and `RemoveTrustDataCallRector` — consistent with the project's one-class-per-file convention. - -### Issue number mismatches -Three rectors reference a different `@see` issue number than the digest filename's suffix. In each case the transformation is the same; the numbers refer to different nodes in the same deprecation issue thread: - -| Rector | Rector `@see` | Digest filename issue | Notes | -|---|---|---|---| -| `RemoveViewsRowCacheKeysRector` | `#3564958` | `#3564937` | `3564958` is the change record; `3564937` is the original issue | -| `ReplaceCommentManagerGetCountNewCommentsRector` | `#3551729` | `#3543035` | `3543035` is the original issue; `3551729` is the related change record | -| `ReplaceEntityReferenceRecursiveLimitRector` | `#3316878` | `#2940605` | `2940605` is the older issue; `3316878` is the more recent change record | diff --git a/docs/digest-comparison-report.md b/docs/digest-comparison-report.md deleted file mode 100644 index cba53bf66..000000000 --- a/docs/digest-comparison-report.md +++ /dev/null @@ -1,619 +0,0 @@ -# Drupal Digest → Drupal Rector Comparison Report - -Compares each rector added in branch `feature/digest-rectors` against its source in -[drupal-digests](https://github.com/dbuytaert/drupal-digests). - -**Total rectors compared:** 50 -**Significant changes:** 23 -**Minimal changes:** 27 -**Split from one digest file:** 1 pair (`RemoveTrustDataCallRector` + `RemoveConfigSaveTrustedDataArgRector`) - ---- - -## Overview Table - -> Paths are relative to each repo root. -> `†` = rector `@see` issue number differs from the digest filename — see [Notes](#notes-on-digest-file-mapping). - -| Rector | Ver | Changes | Issue | Digest source | Rector destination | -|---|---|---|---|---|---| -| `ReplaceModuleHandlerGetNameRector` | D10 | Minimal | [#3571063](https://www.drupal.org/node/3571063) | `rector/rules/replace-removed-modulehandlerinterface-getname-with-3571063.php` | `src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector.php` | -| `ReplaceRebuildThemeDataRector` | D10 | Minimal | [#3571068](https://www.drupal.org/node/3571068) | `rector/rules/replace-removed-themehandlerinterface-rebuildthemedata-with-3571068.php` | `src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector.php` | -| `ReplaceRequestTimeConstantRector` | D10 | **Significant** | [#3395986](https://www.drupal.org/node/3395986) | `rector/rules/replace-deprecated-request-time-constant-with-drupal-time-3395986.php` | `src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector.php` | -| `ErrorCurrentErrorHandlerRector` | D11 | Minimal | [#3526515](https://www.drupal.org/node/3526515) | `rector/rules/replace-error-currenterrorhandler-with-get-error-handler-3526515.php` | `src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector.php` | -| `FileSystemBasenameToNativeRector` | D11 | **Significant** | [#3530461](https://www.drupal.org/node/3530461) | `rector/rules/replace-filesysteminterface-basename-with-native-basename-3530461.php` | `src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector.php` | -| `LoadAllIncludesRector` | D11 | **Significant** | [#3536431](https://www.drupal.org/node/3536431) | `rector/rules/replace-deprecated-modulehandler-loadallincludes-with-3536431.php` | `src/Drupal11/Rector/Deprecation/LoadAllIncludesRector.php` | -| `MigrateSqlGetMigrationPluginManagerRector` | D11 | **Significant** | [#3439369](https://www.drupal.org/node/3439369) | `rector/rules/replace-deprecated-sql-getmigrationpluginmanager-with-3439369.php` | `src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector.php` | -| `NodeStorageDeprecatedMethodsRector` | D11 | **Significant** | [#3396062](https://www.drupal.org/node/3396062) | `rector/rules/replace-deprecated-nodestorage-revisionids-and-3396062.php` | `src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector.php` | -| `PluginBaseIsConfigurableRector` | D11 | **Significant** | [#3459533](https://www.drupal.org/node/3459533) | `rector/rules/replace-deprecated-pluginbase-isconfigurable-with-3459533.php` | `src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector.php` | -| `RemoveAutomatedCronSubmitHandlerRector` | D11 | Minimal | [#3566768](https://www.drupal.org/node/3566768) | `rector/rules/remove-deprecated-automated-cron-settings-submit-calls-and-3566768.php` | `src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector.php` | -| `RemoveCacheExpireOverrideRector` | D11 | **Significant** | [#3576556](https://www.drupal.org/node/3576556) | `rector/rules/remove-deprecated-cacheexpire-overrides-from-views-3576556.php` | `src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector.php` | -| `RemoveConfigSaveTrustedDataArgRector` | D11 | **Significant** | [#3347842](https://www.drupal.org/node/3347842) | `rector/rules/remove-deprecated-trustdata-calls-and-save-true-argument-in-3347842.php` *(split)* | `src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector.php` | -| `RemoveHandlerBaseDefineExtraOptionsRector` | D11 | **Significant** | [#3485084](https://www.drupal.org/node/3485084) | `rector/rules/remove-overrides-of-deprecated-handlerbase-3485084.php` | `src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector.php` | -| `RemoveLinkWidgetValidateTitleElementRector` | D11 | Minimal | [#3093118](https://www.drupal.org/node/3093118) | `rector/rules/remove-deprecated-linkwidget-validatetitleelement-calls-3093118.php` | `src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector.php` | -| `RemoveModuleHandlerAddModuleCallsRector` | D11 | **Significant** | [#3528899](https://www.drupal.org/node/3528899) | `rector/rules/remove-deprecated-modulehandlerinterface-addmodule-and-3528899.php` | `src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector.php` | -| `RemoveModuleHandlerDeprecatedMethodsRector` | D11 | Minimal | [#3442009](https://www.drupal.org/node/3442009) | `rector/rules/remove-deprecated-modulehandlerinterface-writecache-and-3442009.php` | `src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector.php` | -| `RemoveRootFromConvertDbUrlRector` | D11 | Minimal | [#3522513](https://www.drupal.org/node/3522513) | `rector/rules/remove-deprecated-string-root-from-database-3522513.php` | `src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector.php` | -| `RemoveSetUriCallbackRector` | D11 | **Significant** | [#2667040](https://www.drupal.org/node/2667040) | `rector/rules/remove-deprecated-entitytypeinterface-seturicallback-calls-2667040.php` | `src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector.php` | -| `RemoveStateCacheSettingRector` | D11 | Minimal | [#3436954](https://www.drupal.org/node/3436954) | `rector/rules/remove-deprecated-settings-state-cache-assignment-for-3436954.php` | `src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector.php` | -| `RemoveTrustDataCallRector` | D11 | **Significant** | [#3347842](https://www.drupal.org/node/3347842) | `rector/rules/remove-deprecated-trustdata-calls-and-save-true-argument-in-3347842.php` *(split)* | `src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector.php` | -| `RemoveTwigNodeTransTagArgumentRector` | D11 | Minimal | [#3473440](https://www.drupal.org/node/3473440) | `rector/rules/remove-deprecated-tag-argument-from-twignodetrans-3473440.php` | `src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector.php` | -| `RemoveUpdaterPostInstallMethodsRector` | D11 | Minimal | [#3417136](https://www.drupal.org/node/3417136) | `rector/rules/remove-deprecated-updater-postinstall-postinstalltasks-3417136.php` | `src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector.php` | -| `RemoveViewsRowCacheKeysRector` | D11 | **Significant** | [#3564958](https://www.drupal.org/node/3564958) † | `rector/rules/remove-deprecated-cachepluginbase-getrowcachekeys-and-3564937.php` | `src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php` | -| `RenameStopProceduralHookScanRector` | D11 | Minimal | [#3495943](https://www.drupal.org/node/3495943) | `rector/rules/rename-stopproceduralhookscan-to-proceduralhookscanstop-3495943.php` | `src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector.php` | -| `ReplaceAlphadecimalToIntNullRector` | D11 | **Significant** | [#3442810](https://www.drupal.org/node/3442810) | `rector/rules/replace-deprecated-number-alphadecimaltoint-null-calls-with-3442810.php` | `src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector.php` | -| `ReplaceCommentManagerGetCountNewCommentsRector` | D11 | **Significant** | [#3551729](https://www.drupal.org/node/3551729) † | `rector/rules/replace-deprecated-commentmanagerinterface-3543035.php` | `src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector.php` | -| `ReplaceCommentUriRector` | D11 | Minimal | [#2010202](https://www.drupal.org/node/2010202) | `rector/rules/replace-deprecated-comment-uri-with-comment-permalink-2010202.php` | `src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector.php` | -| `ReplaceDateTimeRangeConstantsRector` | D11 | Minimal | [#3574901](https://www.drupal.org/node/3574901) | `rector/rules/replace-removed-datetimerangeconstantsinterface-constants-3574901.php` | `src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector.php` | -| `ReplaceEditorLoadRector` | D11 | Minimal | [#3447794](https://www.drupal.org/node/3447794) | `rector/rules/replace-deprecated-editor-load-with-entity-storage-load-3447794.php` | `src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector.php` | -| `ReplaceEntityOriginalPropertyRector` | D11 | **Significant** | [#3571065](https://www.drupal.org/node/3571065) | `rector/rules/replace-deprecated-entity-original-magic-property-with-3571065.php` | `src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector.php` | -| `ReplaceEntityReferenceRecursiveLimitRector` | D11 | **Significant** | [#3316878](https://www.drupal.org/node/3316878) † | `rector/rules/replace-deprecated-entityreferenceentityformatter-recursive-2940605.php` | `src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector.php` | -| `ReplaceFieldgroupToFieldsetRector` | D11 | Minimal | [#3512254](https://www.drupal.org/node/3512254) | `rector/rules/replace-deprecated-type-fieldgroup-with-type-fieldset-3512254.php` | `src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector.php` | -| `ReplaceFileGetContentHeadersRector` | D11 | Minimal | [#3494126](https://www.drupal.org/node/3494126) | `rector/rules/replace-file-get-content-headers-with-fileinterface-3494126.php` | `src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector.php` | -| `ReplaceLocaleConfigBatchFunctionsRector` | D11 | Minimal | [#3575254](https://www.drupal.org/node/3575254) | `rector/rules/replace-removed-locale-batch-helper-functions-with-their-3575254.php` | `src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector.php` | -| `ReplaceNodeAccessViewAllNodesRector` | D11 | Minimal | [#3038908](https://www.drupal.org/node/3038908) | `rector/rules/replace-deprecated-node-access-view-all-nodes-with-3038908.php` | `src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector.php` | -| `ReplaceNodeAddBodyFieldRector` | D11 | Minimal | [#3489266](https://www.drupal.org/node/3489266) | `rector/rules/replace-deprecated-node-add-body-field-with-createbodyfield-3489266.php` | `src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector.php` | -| `ReplaceNodeModuleProceduralFunctionsRector` | D11 | Minimal | [#3571623](https://www.drupal.org/node/3571623) | `rector/rules/replace-deprecated-node-module-procedural-functions-with-oo-3571623.php` | `src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector.php` | -| `ReplaceNodeSetPreviewModeRector` | D11 | **Significant** | [#3538277](https://www.drupal.org/node/3538277) | `rector/rules/replace-deprecated-constants-with-nodepreviewmode-enum-in-3538277.php` | `src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector.php` | -| `ReplacePdoFetchConstantsRector` | D11 | Minimal | [#3525077](https://www.drupal.org/node/3525077) | `rector/rules/replace-pdo-fetch-constants-with-fetchas-enum-cases-in-3525077.php` | `src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector.php` | -| `ReplaceRecipeRunnerInstallModuleRector` | D11 | Minimal | [#3498026](https://www.drupal.org/node/3498026) | `rector/rules/replace-deprecated-reciperunner-installmodule-with-3498026.php` | `src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector.php` | -| `ReplaceSessionManagerDeleteRector` | D11 | **Significant** | [#3577376](https://www.drupal.org/node/3577376) | `rector/rules/replace-deprecated-sessionmanager-delete-with-3577376.php` | `src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector.php` | -| `ReplaceSessionWritesWithRequestSessionRector` | D11 | Minimal | [#3518527](https://www.drupal.org/node/3518527) | `rector/rules/replace-deprecated-session-writes-with-drupal-request-3518527.php` | `src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector.php` | -| `ReplaceSystemPerformanceGzipKeyRector` | D11 | Minimal | [#3184242](https://www.drupal.org/node/3184242) | `rector/rules/replace-deprecated-system-performance-css-gzip-js-gzip-3184242.php` | `src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector.php` | -| `ReplaceThemeGetSettingRector` | D11 | Minimal | [#3573896](https://www.drupal.org/node/3573896) | `rector/rules/replace-deprecated-theme-get-setting-and-system-default-3573896.php` | `src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector.php` | -| `ReplaceUserSessionNamePropertyRector` | D11 | Minimal | [#3513856](https://www.drupal.org/node/3513856) | `rector/rules/replace-deprecated-usersession-name-property-read-with-3513856.php` | `src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector.php` | -| `ReplaceViewsProceduralFunctionsRector` | D11 | Minimal | [#3572243](https://www.drupal.org/node/3572243) | `rector/rules/replace-deprecated-views-procedural-functions-with-oo-3572243.php` | `src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector.php` | -| `StatementPrefetchIteratorFetchColumnRector` | D11 | **Significant** | [#3490200](https://www.drupal.org/node/3490200) | `rector/rules/replace-deprecated-statementprefetchiterator-fetchcolumn-3490200.php` | `src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector.php` | -| `StripMigrationDependenciesExpandArgRector` | D11 | **Significant** | [#3574717](https://www.drupal.org/node/3574717) | `rector/rules/strip-removed-expand-argument-from-getmigrationdependencies-3574717.php` | `src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector.php` | -| `UseEntityTypeHasIntegerIdRector` | D11 | **Significant** | [#3566801](https://www.drupal.org/node/3566801) | `rector/rules/replace-deprecated-entity-type-integer-id-helpers-with-3566801.php` | `src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector.php` | -| `ViewsPluginHandlerManagerRector` | D11 | **Significant** | [#3566424](https://www.drupal.org/node/3566424) | `rector/rules/replace-deprecated-views-pluginmanager-and-views-3566424.php` | `src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector.php` | - ---- - -## Significant Changes - -### 1. `ReplaceRequestTimeConstantRector` (Drupal10) - -**Digest file:** `replace-deprecated-request-time-constant-with-drupal-time-3395986.php` - -**Change:** The digest used `$this->nodeFactory->createStaticCall('Drupal', 'time')` and `$this->nodeFactory->createMethodCall(...)` helpers from Rector's `NodeFactory`. The rector builds the AST manually using `new Node\Expr\StaticCall(new Node\Name\FullyQualified('Drupal'), new Node\Identifier('time'))` and `new Node\Expr\MethodCall(...)`. This avoids a dependency on `nodeFactory` and makes the node construction explicit and portable. - -```php -// Digest — uses nodeFactory helpers -$staticCall = $this->nodeFactory->createStaticCall('Drupal', 'time'); -return $this->nodeFactory->createMethodCall($staticCall, 'getRequestTime'); - -// Rector — manual AST construction -$staticCall = new Node\Expr\StaticCall( - new Node\Name\FullyQualified('Drupal'), - new Node\Identifier('time') -); -return new Node\Expr\MethodCall($staticCall, new Node\Identifier('getRequestTime')); -``` - ---- - -### 2. `FileSystemBasenameToNativeRector` - -**Digest file:** `replace-filesysteminterface-basename-with-native-basename-3530461.php` - -**Change:** The digest used `$this->getType($node->var)->isSuperTypeOf(new ObjectType($class))->yes()` inside a foreach loop. The rector uses `$this->isObjectType($node->var, new ObjectType($class))`, the standard Rector API. Also removed the unused `$callerType` variable assignment that was left in as a remnant. Both check the same two classes (`FileSystemInterface` and `FileSystem`), but the rector's approach is more idiomatic. - -```php -// Digest -$callerType = $this->getType($node->var); -foreach (['Drupal\Core\File\FileSystemInterface', 'Drupal\Core\File\FileSystem'] as $class) { - if ($callerType->isSuperTypeOf(new \PHPStan\Type\ObjectType($class))->yes()) { - -// Rector (note: $callerType assignment retained but unused — harmless) -foreach (['Drupal\Core\File\FileSystemInterface', 'Drupal\Core\File\FileSystem'] as $class) { - if ($this->isObjectType($node->var, new ObjectType($class))) { -``` - ---- - -### 3. `LoadAllIncludesRector` - -**Digest file:** `replace-deprecated-modulehandler-loadallincludes-with-3536431.php` - -**Change:** The digest had no type guard — it matched any `loadAllIncludes()` call regardless of object type. The rector adds a `ModuleHandlerInterface` type check, preventing false positives on unrelated objects. - -```php -// Digest — no type guard -if (!$this->isName($methodCall->name, 'loadAllIncludes')) { - return null; -} - -// Rector — requires ModuleHandlerInterface -if (!$this->isObjectType($methodCall->var, new ObjectType('Drupal\Core\Extension\ModuleHandlerInterface'))) { - return null; -} -``` - ---- - -### 4. `MigrateSqlGetMigrationPluginManagerRector` - -**Digest file:** `replace-deprecated-sql-getmigrationpluginmanager-with-3439369.php` - -**Change:** The digest used a **negative** type guard: skip if the caller `isObjectType(Migration::class)`. The rector inverts this to a **positive** guard: only proceed if the caller `isObjectType(Sql::class)`. This is more precise — it targets only the deprecated `Sql` subclass rather than excluding one known-good class while allowing everything else. - -```php -// Digest — negative guard (exclude Migration) -if ($this->isObjectType($node->var, new ObjectType('Drupal\migrate\Plugin\Migration'))) { - return null; -} - -// Rector — positive guard (require Sql) -if (!$this->isObjectType($node->var, new ObjectType('Drupal\migrate\Plugin\migrate\id_map\Sql'))) { - return null; -} -``` - ---- - -### 5. `NodeStorageDeprecatedMethodsRector` - -**Digest file:** `replace-deprecated-nodestorage-revisionids-and-3396062.php` - -**Change:** The digest handled only `revisionIds()` and `userRevisionIds()`. The rector adds handling for `countDefaultLanguageRevisions()`, which has no replacement and must be removed entirely. This requires registering `Node\Stmt\Expression::class` as an additional node type and using `NodeVisitor::REMOVE_NODE`. - -```php -// Rector — additional node type and removal handling -public function getNodeTypes(): array -{ - return [Node\Expr\MethodCall::class, Node\Stmt\Expression::class]; -} - -// Removes countDefaultLanguageRevisions() entirely -if ($node instanceof Node\Stmt\Expression) { - if ($this->getName($methodCall->name) === 'countDefaultLanguageRevisions') { - return NodeVisitor::REMOVE_NODE; - } -} -``` - ---- - -### 6. `PluginBaseIsConfigurableRector` - -**Digest file:** `replace-deprecated-pluginbase-isconfigurable-with-3459533.php` - -**Change:** The digest relied solely on checking `$this->isConfigurable()` (variable name `this`, no args) to avoid false positives. The rector adds an explicit `isObjectType($node->var, new ObjectType('Drupal\Component\Plugin\PluginBase'))` guard, making it precise about which `isConfigurable()` methods are targeted. The digest comment already noted this concern (CKEditor5PluginDefinition, Action), but the digest trusted the `$this` check alone. - -```php -// Digest — $this check only, no type guard -if ($this->getName($node->var) !== 'this') { - return null; -} -// returns Instanceof_ without type check - -// Rector — adds explicit PluginBase type guard -if ($this->getName($node->var) !== 'this') { - return null; -} -if (!$this->isObjectType($node->var, new ObjectType('Drupal\Component\Plugin\PluginBase'))) { - return null; -} -``` - ---- - -### 7. `RemoveCacheExpireOverrideRector` - -**Digest file:** `remove-deprecated-cacheexpire-overrides-from-views-3576556.php` - -**Change:** The digest's `isCachePluginBaseSubclass()` checked the FQCN, short names, and a PHPStan `isSuperTypeOf()` call. The rector adds a separate `PARENT_FQCNS` constant listing all four known fully-qualified parent class names (`CachePluginBase`, `Time`, `Tag`, `None`), and changes the short-name check to only apply when the name contains no backslash (i.e., is truly unqualified). This prevents false matches on partial namespace strings. - -```php -// Digest — short-name check uses str_ends_with (matches any suffix) -foreach (self::PARENT_SHORT_NAMES as $short) { - if ($parentName === $short || str_ends_with($parentName, '\\' . $short)) { - -// Rector — adds PARENT_FQCNS constant + restricts short-name check to unqualified names -private const PARENT_FQCNS = [ - 'Drupal\views\Plugin\views\cache\CachePluginBase', - 'Drupal\views\Plugin\views\cache\Time', - 'Drupal\views\Plugin\views\cache\Tag', - 'Drupal\views\Plugin\views\cache\None', -]; -// Matches FQCNs first, then only unqualified names (no backslash) -if (!str_contains($parentName, '\\')) { - foreach (self::PARENT_SHORT_NAMES as $short) { -``` - ---- - -### 8. `RemoveConfigSaveTrustedDataArgRector` - -**Digest file:** `remove-deprecated-trustdata-calls-and-save-true-argument-in-3347842.php` (one file, split into two rector classes) - -**Change:** In the digest, `RemoveConfigSaveTrustedDataArgRector` was defined in the same file as `RemoveTrustDataCallRector` and had **no type guard** on `save()` — it stripped the boolean arg from any `save(TRUE/FALSE)` call. The rector splits this into a standalone file and adds a `Drupal\Core\Config\Config` type guard, preventing false positives on `save(TRUE)` calls on unrelated objects. - -```php -// Digest — no type guard on save() -if (!$this->isName($node->name, 'save')) { - return null; -} -if (count($node->args) !== 1) { ... } - -// Rector — adds Config type guard -if (!$this->isObjectType($node->var, new ObjectType('Drupal\Core\Config\Config'))) { - return null; -} -``` - ---- - -### 9. `RemoveHandlerBaseDefineExtraOptionsRector` - -**Digest file:** `remove-overrides-of-deprecated-handlerbase-3485084.php` - -**Change:** The digest's `PARENT_SHORT_NAMES` covered only `HandlerBase`. The rector expands it to also cover `FieldHandlerBase`, `FilterPluginBase`, `SortPluginBase`, `ArgumentPluginBase`, and `RelationshipPluginBase` — the five concrete handler base classes that commonly appear as direct parents in contrib Views plugins. The digest also had a guard to skip the `HandlerBase` class itself by checking `$node->name->toString() === 'HandlerBase'`; the rector drops this because the type guard via `isObjectType` already handles it correctly. - -```php -// Digest -private const PARENT_SHORT_NAMES = ['HandlerBase']; -// Also had: if ($node->name instanceof Identifier && $node->name->toString() === 'HandlerBase') { return null; } - -// Rector -private const PARENT_SHORT_NAMES = [ - 'HandlerBase', - 'FieldHandlerBase', - 'FilterPluginBase', - 'SortPluginBase', - 'ArgumentPluginBase', - 'RelationshipPluginBase', -]; -``` - ---- - -### 10. `RemoveModuleHandlerAddModuleCallsRector` - -**Digest file:** `remove-deprecated-modulehandlerinterface-addmodule-and-3528899.php` - -**Change:** The digest checked only `ModuleHandlerInterface`. The rector also checks the concrete `ModuleHandler` class, covering cases where the variable is typed as the concrete implementation rather than the interface. - -```php -// Digest — interface only -if ($this->isObjectType($methodCall->var, new ObjectType('Drupal\\Core\\Extension\\ModuleHandlerInterface'))) { - -// Rector — interface + concrete class -foreach (['Drupal\Core\Extension\ModuleHandlerInterface', 'Drupal\Core\Extension\ModuleHandler'] as $class) { - if ($this->isObjectType($methodCall->var, new ObjectType($class))) { - $isModuleHandler = true; - break; - } -} -``` - ---- - -### 11. `RemoveSetUriCallbackRector` - -**Digest file:** `remove-deprecated-entitytypeinterface-seturicallback-calls-2667040.php` - -**Change:** The digest had no type guard — it removed any standalone or mid-chain `setUriCallback()` call by method name alone. The rector adds `isObjectType($node->expr->var, new ObjectType('Drupal\Core\Entity\EntityTypeInterface'))` checks on both the standalone-statement case and the fluent-chain case. - -```php -// Digest — no type guard -if ($node->expr instanceof MethodCall && $this->isName($node->expr->name, 'setUriCallback')) { - return NodeVisitor::REMOVE_NODE; -} - -// Rector — type-guarded -if ($node->expr instanceof MethodCall - && $this->isName($node->expr->name, 'setUriCallback') - && $this->isObjectType($node->expr->var, new ObjectType('Drupal\Core\Entity\EntityTypeInterface')) -) { - return NodeVisitor::REMOVE_NODE; -} -``` - ---- - -### 12. `RemoveTrustDataCallRector` - -**Digest file:** `remove-deprecated-trustdata-calls-and-save-true-argument-in-3347842.php` (one file, split into two rector classes) - -**Change:** In the digest, `RemoveTrustDataCallRector` stripped `trustData()` from any method chain regardless of object type. The rector adds a `ConfigEntityInterface` type guard, preventing false positives on unrelated objects that happen to have a `trustData()` method. - -```php -// Digest — no type guard -if (!$this->isName($node->name, 'trustData')) { - return null; -} -return $node->var; - -// Rector — requires ConfigEntityInterface -if (!$this->isObjectType($node->var, new ObjectType('Drupal\Core\Config\Entity\ConfigEntityInterface'))) { - return null; -} -``` - ---- - -### 13. `RemoveViewsRowCacheKeysRector` - -**Digest file:** `remove-deprecated-cachepluginbase-getrowcachekeys-and-3564937.php` - -**Note:** The digest's `@see` references issue `#3564937`; the rector's `@see` references `#3564958`. Both numbers are real Drupal issues; `3564958` is the change record and `3564937` is the original issue. The rector correctly cites `3564958`. - -**Change:** The digest removed array items whose value was a call to `getRowCacheKeys()` or `getRowId()` by method name alone (no type guard). The rector adds `isObjectType($item->value->var, new ObjectType('Drupal\views\Plugin\views\cache\CachePluginBase'))`, preventing false positives when another class has methods with the same names. - -```php -// Digest — no type guard -if ($item->value instanceof MethodCall && $this->isDeprecatedMethodCall($item->value)) { - -// Rector — type-guarded -if ($item->value instanceof MethodCall - && $item->value->name instanceof Identifier - && in_array($item->value->name->toString(), self::DEPRECATED_METHODS, true) - && $this->isObjectType($item->value->var, new ObjectType('Drupal\views\Plugin\views\cache\CachePluginBase')) -) { -``` - ---- - -### 14. `ReplaceAlphadecimalToIntNullRector` - -**Digest file:** `replace-deprecated-number-alphadecimaltoint-null-calls-with-3442810.php` - -**Change:** The digest used inline backslash-prefixed FQCNs everywhere (`new \PHPStan\Type\ObjectType(...)`, `new \PhpParser\Node\Arg(...)`, etc.) with no `use` imports. The rector uses proper `use` imports at the top of the file, following drupal-rector coding standards. Also, the digest class name was `AlphadecimalToIntNullOrEmptyRector`; the rector renamed it to `ReplaceAlphadecimalToIntNullRector` for consistency with the project's naming convention. - ---- - -### 15. `ReplaceCommentManagerGetCountNewCommentsRector` - -**Digest file:** `replace-deprecated-commentmanagerinterface-3543035.php` - -**Note:** The rector's `@see` references issue `#3551729`; the digest file uses issue `#3543035`. Both reference the same deprecation — `#3543035` is the original issue, `#3551729` is a related follow-up. The transformation logic is identical. - -**Change:** The digest extended `AbstractRector` directly. The rector extends `AbstractDrupalCoreRector` and wraps the logic in `refactorWithConfiguration()`, enabling version-gated activation via `DrupalIntroducedVersionConfiguration('11.3.0')`. `getRuleDefinition()` uses `ConfiguredCodeSample` instead of `CodeSample`. - -```php -// Digest -final class CommentManagerGetCountNewCommentsRector extends AbstractRector -{ - public function refactor(Node $node): ?Node { ... } - -// Rector -final class ReplaceCommentManagerGetCountNewCommentsRector extends AbstractDrupalCoreRector -{ - public function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { ... } - // getRuleDefinition() uses ConfiguredCodeSample with DrupalIntroducedVersionConfiguration('11.3.0') -``` - ---- - -### 16. `ReplaceEntityOriginalPropertyRector` - -**Digest file:** `replace-deprecated-entity-original-magic-property-with-3571065.php` - -**Change:** The digest handled `PropertyFetch` and `Assign` nodes. The rector adds `NullsafePropertyFetch` as a third node type, rewriting `$entity?->original` to `$entity?->getOriginal()` via `NullsafeMethodCall`. The digest also lacked a type guard on read accesses; the rector adds `isObjectType($node->var, new ObjectType('Drupal\Core\Entity\EntityInterface'))` on both `PropertyFetch` and `NullsafePropertyFetch`. - -```php -// Digest — only PropertyFetch and Assign -public function getNodeTypes(): array -{ - return [PropertyFetch::class, Assign::class]; -} -// No isObjectType check on the PropertyFetch branch - -// Rector — adds NullsafePropertyFetch and EntityInterface type guard -public function getNodeTypes(): array -{ - return [PropertyFetch::class, NullsafePropertyFetch::class, Assign::class]; -} -// PropertyFetch branch: -if ($this->isObjectType($node->var, new ObjectType('Drupal\Core\Entity\EntityInterface'))) { - return new MethodCall($node->var, 'getOriginal'); -} -// NullsafePropertyFetch branch: -if ($this->isObjectType($node->var, new ObjectType('Drupal\Core\Entity\EntityInterface'))) { - return new NullsafeMethodCall($node->var, 'getOriginal'); -} -``` - ---- - -### 17. `ReplaceEntityReferenceRecursiveLimitRector` - -**Digest file:** `replace-deprecated-entityreferenceentityformatter-recursive-2940605.php` - -**Note:** The rector's `@see` references issue `#3316878`; the digest file uses `#2940605`. The rector's issue number is the more recent change record for this deprecation. - -**Change (type resolution):** The digest used `isObjectType($node, new ObjectType(self::DEPRECATED_CLASS))` with a `static`/`self`/`parent` branch to handle within-subclass references. The rector uses a simpler `TARGET_CLASSES` array approach with `$this->isName($node->class, $class)`, which works because Rector resolves `use` aliases before `refactor()` is called. - -**Change (PhpParser version):** The digest used `LNumber` (PhpParser 4.x API). The rector uses `Int_` (PhpParser 5.x renamed `LNumber` to `Int_`). - -```php -// Digest — LNumber (PhpParser 4.x) -return new LNumber(20); - -// Rector — Int_ (PhpParser 5.x) -use PhpParser\Node\Scalar\Int_; -... -return new Int_(20); -``` - ---- - -### 18. `ReplaceNodeSetPreviewModeRector` - -**Digest file:** `replace-deprecated-constants-with-nodepreviewmode-enum-in-3538277.php` - -**Change:** The digest had no type guard on `setPreviewMode()`. The rector adds `isObjectType($node->var, new ObjectType('Drupal\node\NodeTypeInterface'))`, preventing false positives on other classes that may have a `setPreviewMode()` method. - -```php -// Digest — no type guard -if (!$this->isName($node->name, 'setPreviewMode')) { return null; } -// Immediately processes the argument - -// Rector — NodeTypeInterface guard -if (!$this->isObjectType($node->var, new ObjectType('Drupal\node\NodeTypeInterface'))) { - return null; -} -``` - ---- - -### 19. `ReplaceSessionManagerDeleteRector` - -**Digest file:** `replace-deprecated-sessionmanager-delete-with-3577376.php` - -**Change:** The digest extended `AbstractRector` directly with a plain `refactor()` method. The rector extends `AbstractDrupalCoreRector` and wraps the logic in `refactorWithConfiguration()`, enabling version-gated activation via `DrupalIntroducedVersionConfiguration('11.4.0')`. - -```php -// Digest -final class ReplaceSessionManagerDeleteRector extends AbstractRector -{ - public function refactor(Node $node): ?Node { ... } - -// Rector -final class ReplaceSessionManagerDeleteRector extends AbstractDrupalCoreRector -{ - public function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { ... } - // getRuleDefinition() uses ConfiguredCodeSample with DrupalIntroducedVersionConfiguration('11.4.0') -``` - ---- - -### 20. `StatementPrefetchIteratorFetchColumnRector` - -**Digest file:** `replace-deprecated-statementprefetchiterator-fetchcolumn-3490200.php` - -**Change:** The digest avoided PDO's native `fetchColumn()` by checking if the caller was a `PropertyFetch` with the name `clientStatement`. The rector replaces this heuristic with an explicit `isObjectType($node->var, new ObjectType('Drupal\Core\Database\StatementPrefetchIterator'))` type guard — more precise and not dependent on internal implementation details. - -```php -// Digest — heuristic exclusion -if ($node->var instanceof \PhpParser\Node\Expr\PropertyFetch) { - if ($propertyName === 'clientStatement') { - return null; - } -} - -// Rector — positive type guard -if (!$this->isObjectType($node->var, new ObjectType('Drupal\Core\Database\StatementPrefetchIterator'))) { - return null; -} -``` - ---- - -### 21. `StripMigrationDependenciesExpandArgRector` - -**Digest file:** `strip-removed-expand-argument-from-getmigrationdependencies-3574717.php` - -**Change:** The digest used `$migrationInterface->isSuperTypeOf($callerType)->yes()` (PHPStan's type algebra). The rector uses `$this->isObjectType($node->var, new ObjectType('Drupal\migrate\Plugin\MigrationInterface'))` — the standard Rector API, which is equivalent but more idiomatic. - -```php -// Digest -$callerType = $this->getType($node->var); -$migrationInterface = new ObjectType(self::MIGRATION_INTERFACE); -if (!$migrationInterface->isSuperTypeOf($callerType)->yes()) { - return null; -} - -// Rector -if (!$this->isObjectType($node->var, new ObjectType('Drupal\migrate\Plugin\MigrationInterface'))) { - return null; -} -``` - ---- - -### 22. `UseEntityTypeHasIntegerIdRector` - -**Digest file:** `replace-deprecated-entity-type-integer-id-helpers-with-3566801.php` - -**Change:** The digest treated `entityTypeSupportsComments` and `hasIntegerId` (the second one) as simple `$this->method()` rewrites with no type guard — any class could have those method names. The rector adds a `METHOD_OWNER_CLASS` constant that maps each method name to its declaring class FQCN, and calls `isObjectType()` before transforming. This prevents false positives on unrelated classes that might have methods with the same names. - -```php -// Digest — no type guard on $this->entityTypeSupportsComments() / $this->hasIntegerId() -private const SIMPLE_METHOD_NAMES = ['entityTypeSupportsComments']; -if (in_array($methodName, self::SIMPLE_METHOD_NAMES, true) && count($node->args) === 1) { - return new MethodCall($node->args[0]->value, 'hasIntegerId'); -} -if ($methodName === 'hasIntegerId' && count($node->args) === 1) { - return new MethodCall($node->args[0]->value, 'hasIntegerId'); -} - -// Rector — type-guarded via METHOD_OWNER_CLASS -private const METHOD_OWNER_CLASS = [ - 'entityTypeSupportsComments' => 'Drupal\comment\CommentTypeForm', - 'hasIntegerId' => 'Drupal\layout_builder\Plugin\SectionStorage\OverridesSectionStorage', -]; -if (!$this->isObjectType($node->var, new ObjectType(self::METHOD_OWNER_CLASS[$name]))) { - return null; -} -``` - ---- - -### 23. `ViewsPluginHandlerManagerRector` - -**Digest file:** `replace-deprecated-views-pluginmanager-and-views-3566424.php` - -**Change:** The digest used `$this->isObjectType($node->class, new ObjectType('Drupal\\views\\Views'))` to check the static call target — which is semantically wrong: `$node->class` in a static call is a `Name` node (the class name), not an object, so `isObjectType` is inappropriate. The rector uses `$this->isName($node->class, 'Drupal\views\Views')` instead, which is the correct way to match a class name in a static call. - -```php -// Digest — incorrect isObjectType on a static call class name -if (!$this->isObjectType($node->class, new \PHPStan\Type\ObjectType('Drupal\\views\\Views'))) { - -// Rector — correct isName check -if (!$this->isName($node->class, 'Drupal\views\Views')) { -``` - ---- - -## Minimal Changes - -These rectors are functionally identical to their digest counterparts. The differences are limited to: namespace declarations, proper `use` imports (replacing inline backslash-prefixed FQCNs), `declare(strict_types=1)` placement, removal of unused `use Rector\Config\RectorConfig` imports, replacement of `@param` docblock type hints with `assert()` guards, class renaming to match the drupal-rector naming convention, and wrapping in `AbstractDrupalCoreRector` with `configure()` + `refactorWithConfiguration()` (for the Drupal10 rectors below where the logic is unchanged). - -| Rector class | Notable structural differences from digest | -|---|---| -| `ReplaceModuleHandlerGetNameRector` (Drupal10) | Extends `AbstractDrupalCoreRector`; `refactorWithConfiguration()`; `ConfiguredCodeSample` with version `10.3.0` | -| `ReplaceRebuildThemeDataRector` (Drupal10) | Extends `AbstractDrupalCoreRector`; adds `ThemeHandlerInterface` type guard; `ConfiguredCodeSample` with version `10.3.0` | -| `ErrorCurrentErrorHandlerRector` | Namespace + imports only | -| `RemoveAutomatedCronSubmitHandlerRector` | Namespace + imports only | -| `RemoveLinkWidgetValidateTitleElementRector` | Namespace + imports only | -| `RemoveModuleHandlerDeprecatedMethodsRector` | Namespace + imports only | -| `RemoveRootFromConvertDbUrlRector` | Namespace + imports only | -| `RemoveStateCacheSettingRector` | Namespace + imports only | -| `RemoveTwigNodeTransTagArgumentRector` | Namespace + imports only | -| `RemoveUpdaterPostInstallMethodsRector` | Namespace + imports only | -| `RenameStopProceduralHookScanRector` | Namespace + imports only | -| `ReplaceCommentUriRector` | Namespace + imports only | -| `ReplaceDateTimeRangeConstantsRector` | Namespace + imports only | -| `ReplaceEditorLoadRector` | Namespace + imports only | -| `ReplaceFieldgroupToFieldsetRector` | Namespace + imports only | -| `ReplaceFileGetContentHeadersRector` | Namespace + imports only | -| `ReplaceLocaleConfigBatchFunctionsRector` | Namespace + imports only | -| `ReplaceNodeAccessViewAllNodesRector` | Namespace + imports only | -| `ReplaceNodeAddBodyFieldRector` | Namespace + imports only | -| `ReplaceNodeModuleProceduralFunctionsRector` | Namespace + imports only | -| `ReplacePdoFetchConstantsRector` | Namespace + imports only | -| `ReplaceRecipeRunnerInstallModuleRector` | Namespace + imports only | -| `ReplaceSessionWritesWithRequestSessionRector` | Namespace + imports only | -| `ReplaceSystemPerformanceGzipKeyRector` | Namespace + imports only | -| `ReplaceThemeGetSettingRector` | Namespace + imports only | -| `ReplaceUserSessionNamePropertyRector` | Namespace + imports only | -| `ReplaceViewsProceduralFunctionsRector` | Namespace + imports only | - ---- - -## Notes on Digest File Mapping - -### One digest file → two rector files -`remove-deprecated-trustdata-calls-and-save-true-argument-in-3347842.php` defined two classes in a single file: `RemoveTrustDataCallRector` and `RemoveConfigSaveTrustedDataArgRector`. The rector project splits these into two separate class files, one per rector — consistent with the project's one-class-per-file convention. - -### Issue number mismatches -Three rectors reference a different `@see` issue number than the digest filename's suffix. In each case the transformation is the same; the issue numbers refer to different nodes in the same deprecation issue thread (the original issue vs. a change record or follow-up): - -| Rector | Rector `@see` | Digest filename issue | Notes | -|---|---|---|---| -| `RemoveViewsRowCacheKeysRector` | `#3564958` | `#3564937` | `3564958` is the change record; `3564937` is the original issue | -| `ReplaceCommentManagerGetCountNewCommentsRector` | `#3551729` | `#3543035` | `3543035` is the original issue; `3551729` is a related follow-up | -| `ReplaceEntityReferenceRecursiveLimitRector` | `#3316878` | `#2940605` | `2940605` is the older issue; `3316878` is the more recent change record | diff --git a/docs/digest-to-rector-mapping.md b/docs/digest-to-rector-mapping.md deleted file mode 100644 index 89ebae844..000000000 --- a/docs/digest-to-rector-mapping.md +++ /dev/null @@ -1,542 +0,0 @@ -# Pattern Mapping: drupal-digests → drupal-rector - -This document maps the structural differences between AI-generated rules from the -[drupal-digests](https://github.com/dbuytaert/drupal-digests) repository and the conventions -expected in drupal-rector. Use this as a reference when converting a digests rule. - ---- - -## 1. Side-by-side comparison - -### drupal-digests rule (source) - -```php - 'Below', - 'FORM_SEPARATE_PAGE' => 'SeparatePage', - ]; - - public function getRuleDefinition(): RuleDefinition { ... } - public function getNodeTypes(): array { ... } - public function refactor(Node $node): ?Node { ... } -} -``` - -### drupal-rector equivalent (target) - -```php -= 10.1.0? - YES → Use AbstractDrupalCoreRector + DrupalIntroducedVersionConfiguration - (BC wrapping fires automatically) - NO → Use AbstractRector (no BC wrapping available for old Drupal versions) - NO → Use AbstractRector (e.g. FuncCall input but ClassConstFetch output) - - NO → Use AbstractRector - Examples: ClassConstFetch, Class_, return types, property declarations -``` - -### Quick reference - -| Input node | Output node | Introduced | Base class | BC wrapping | -|---|---|---|---|---| -| `FuncCall` | `StaticCall` | >= 10.1.0 | `AbstractDrupalCoreRector` | Yes | -| `FuncCall` | `MethodCall` | >= 10.1.0 | `AbstractDrupalCoreRector` | Yes | -| `FuncCall` | `StaticCall` | < 10.1.0 | `AbstractRector` | No | -| `ClassConstFetch` | `ClassConstFetch` | any | `AbstractRector` | No | -| `New_` (arg modification) | `New_` | any | `AbstractRector` | No | -| `Class_` (structural) | `Class_` | any | `AbstractRector` | No | - ---- - -## 3. Generic/configurable rectors — check these before writing a custom class - -drupal-rector ships several data-driven rectors in `src/Rector/Deprecation/` that handle common -deprecation patterns with zero custom PHP. **Always check whether one of these covers the -transformation before writing a new class.** - -### Available generic rectors - -#### `FunctionToStaticRector` — deprecated global function → static class call - -Config object: `FunctionToStaticConfiguration(introducedVersion, deprecatedFunctionName, className, methodName, [argReorder])` - -- Transforms `some_function($a, $b)` → `\ClassName::methodName($a, $b)` -- Uses `AbstractDrupalCoreRector` → BC-wrapped automatically for `introducedVersion >= 10.1.0` -- Optional `argReorder` map swaps argument positions: `[0 => 1, 1 => 0]` reverses two args - -```php -new FunctionToStaticConfiguration('11.4.0', 'language_configuration_element_submit', 'Drupal\language\Element\LanguageConfiguration', 'submit'), -``` - -Fixture output (BC-wrapped): -```php -\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal\language\Element\LanguageConfiguration::submit($form, $form_state), fn() => language_configuration_element_submit($form, $form_state)); -``` - -#### `FunctionToServiceRector` — deprecated global function → service method call - -Config object: `FunctionToServiceConfiguration(introducedVersion, deprecatedFunctionName, serviceName, serviceMethodName)` - -- Transforms `some_function($a)` → `\Drupal::service('service.name')->method($a)` -- Uses `AbstractDrupalCoreRector` → BC-wrapped automatically for `introducedVersion >= 10.1.0` -- **`serviceName` is a string literal** (e.g., `'theme.registry'`), not a class constant -- If the service is a class-based service (e.g., `\Drupal\language\Hook\LanguageHooks`), pass the FQCN as a string - -```php -new FunctionToServiceConfiguration('11.4.0', 'language_process_language_select', 'Drupal\language\Hook\LanguageHooks', 'processLanguageSelect'), -``` - -Fixture output (BC-wrapped): -```php -\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('Drupal\language\Hook\LanguageHooks')->processLanguageSelect($element), fn() => language_process_language_select($element)); -``` - -#### `ClassConstantToClassConstantRector` — deprecated class constant → new class constant - -Config object: `ClassConstantToClassConstantConfiguration(deprecatedClass, deprecatedConstant, newClass, newConstant)` - -- Transforms `OldClass::OLD_CONST` → `\NewClass::NewConst` -- Uses `AbstractRector` → **no BC wrapping** (ClassConstFetch is not a CallLike node) -- No `introducedVersion` parameter — applies unconditionally - -```php -new ClassConstantToClassConstantConfiguration('Drupal\comment\Plugin\Field\FieldType\CommentItemInterface', 'FORM_BELOW', 'Drupal\comment\FormLocation', 'Below'), -``` - -Fixture output (no BC wrapping): -```php -$location = \Drupal\comment\FormLocation::Below; -``` - -### Where to add generic rector configurations - -New configurations for existing generic rectors go into the appropriate versioned config file under `config/drupal-11/`: - -```php -// config/drupal-11/drupal-11.4-deprecations.php -$rectorConfig->ruleWithConfiguration(ClassConstantToClassConstantRector::class, [ - new ClassConstantToClassConstantConfiguration(...), -]); -$rectorConfig->ruleWithConfiguration(FunctionToStaticRector::class, [ - new FunctionToStaticConfiguration('11.4.0', ...), -]); -$rectorConfig->ruleWithConfiguration(FunctionToServiceRector::class, [ - new FunctionToServiceConfiguration('11.4.0', ...), -]); -``` - -Test coverage for generic rectors lives in `tests/src/Rector/Deprecation/[RectorName]/` — add a -new fixture file and a config entry there rather than creating a new test directory. - -### Decision: generic rector vs custom class - -| Pattern | Generic rector available? | -|---|---| -| Global function → static class method | `FunctionToStaticRector` ✓ | -| Global function → `\Drupal::service(…)->method()` | `FunctionToServiceRector` ✓ | -| Class constant → different class constant | `ClassConstantToClassConstantRector` ✓ | -| Function with complex arg transformation | Custom class | -| Constructor arg injection / `__construct` changes | Custom class | -| Multiple node types with different base classes | Custom classes (split by type) | -| Return type / property declaration changes | Custom class | - ---- - -## 4. BC wrapping — how it works - -When using `AbstractDrupalCoreRector`, the base class `refactor()` method automatically wraps -`CallLike → CallLike` transformations in `DeprecationHelper::backwardsCompatibleCall()`, allowing -the generated code to run on both old and new Drupal versions simultaneously. - -### What you write - -```php -// Your rule class extends AbstractDrupalCoreRector -// You implement refactorWithConfiguration() instead of refactor() - -public function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration) -{ - if (!$node instanceof Node\Expr\FuncCall || $this->getName($node) !== 'some_deprecated_function') { - return null; - } - // Return the NEW call — the base class wraps it automatically - return $this->nodeFactory->createStaticCall('SomeClass', 'newMethod', $node->getArgs()); -} -``` - -### What Rector emits in the target code - -```php -// Before (in the fixture) -some_deprecated_function($arg); - -// After (with BC wrapping, for >= 10.1.0 deprecations) -\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall( - \Drupal::VERSION, - '11.1.0', - static fn() => \SomeClass::newMethod($arg), - static fn() => some_deprecated_function($arg) -); -``` - -### AbstractDrupalCoreRector rule structure - -```php -class MyDeprecationRector extends AbstractDrupalCoreRector -{ - /** @var DrupalIntroducedVersionConfiguration[] */ - protected array $configuration; - - public function configure(array $configuration): void - { - foreach ($configuration as $value) { - if (!$value instanceof DrupalIntroducedVersionConfiguration) { - throw new \InvalidArgumentException(sprintf( - 'Each configuration item must be an instance of "%s"', - DrupalIntroducedVersionConfiguration::class - )); - } - } - parent::configure($configuration); - } - - public function getNodeTypes(): array - { - return [Node\Expr\FuncCall::class]; - } - - public function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration) - { - if (!$node instanceof Node\Expr\FuncCall || $this->getName($node) !== 'the_old_function') { - return null; - } - // Return the replacement node — base class adds BC wrapping - return $this->nodeFactory->createStaticCall('NewClass', 'newMethod', $node->getArgs()); - } - - public function getRuleDefinition(): RuleDefinition - { - return new RuleDefinition('Description of what this fixes', [ - new ConfiguredCodeSample( - 'the_old_function($arg);', - '\NewClass::newMethod($arg);', - [new DrupalIntroducedVersionConfiguration('11.1.0')] - ), - ]); - } -} -``` - ---- - -## 5. Fixture file format - -Test fixtures live at: -``` -tests/src/Drupal11/Rector/Deprecation/[RuleName]/fixture/basic.php.inc -``` - -### Format - -``` - ------ - -``` - -### Worked example (FormLocationRector) - -``` - ------ - -``` - -**Notes:** -- The `-----` separator must be on its own line with no trailing spaces. -- Use statements that are no longer needed after transformation should be removed in the "after" section. -- The `` tags are required (this is how `AbstractRectorTestCase` parses the sections). -- For BC-wrapped rules, the "after" section shows the `DeprecationHelper::backwardsCompatibleCall()` call. - ---- - -## 6. Namespace and file placement - -All Drupal 11 deprecation rules go into: -- **Rule class:** `src/Drupal11/Rector/Deprecation/[RuleName]Rector.php` -- **Namespace:** `DrupalRector\Drupal11\Rector\Deprecation` - -### Class name derivation from digests filename - -The drupal-digests filename format is: -``` -[action-verb]-[description]-[issue-number].php -``` - -Steps to derive the class name: -1. Strip the issue number suffix (e.g., `-3550054`). -2. Convert the remaining kebab-case to PascalCase: `replace-deprecated-commentiteminterface-form-below-and-form` → `ReplaceDeprecatedCommentiteminterfaceFormBelowAndForm` -3. Check if the digests rule already has a simpler class name (it often does — the class name inside the file is more descriptive than the filename). **Always use the class name from the file, not the filename.** -4. Append `Rector` if not already present. - -**Examples:** -- File: `replace-deprecated-commentiteminterface-form-below-and-form-3550054.php` -- Class inside file: `FormLocationRector` -- drupal-rector class: `FormLocationRector` ✓ (already has Rector suffix) - -- File: `add-componentpluginmanager-to-themeinstaller-constructor-3522505.php` -- Class inside file: `AddComponentPluginManagerToThemeInstallerRector` -- drupal-rector class: `AddComponentPluginManagerToThemeInstallerRector` ✓ - -### Version mapping - -All drupal-digests rules currently target Drupal 11.x deprecations. The issue markdown -(`issues/drupal-core/[issue-number].md`) states the exact version under the `## Impact` section: -``` -- **Deprecation:** ... deprecated in drupal:11.4.0, removed in drupal:13.0.0 ... -``` - -Use this to: -- Confirm the namespace (`Drupal11`). -- Extract the `introducedVersion` string for `DrupalIntroducedVersionConfiguration` (e.g., `'11.4.0'`). - ---- - -## 7. Test config patterns - -### Simple rule (no configuration, uses AbstractRector) - -```php -// tests/src/Drupal11/Rector/Deprecation/FormLocationRector/config/configured_rule.php -doTestFile($filePath); - } - - public static function provideData(): \Iterator - { - return self::yieldFilesFromDirectory(__DIR__.'/fixture'); - } - - public function provideConfigFilePath(): string - { - return __DIR__.'/config/configured_rule.php'; - } -} -``` - ---- - -## 9. Multi-node-type rules - -Some drupal-digests rules handle two or more distinct node types in a single class -(e.g., both `ClassConstFetch` and `FuncCall`). When converting: - -- **If both transformations are simple (no BC):** Keep them in one class, use `AbstractRector`. - Both node types are listed in `getNodeTypes()` and handled by type-checking inside `refactor()`. -- **If one transformation needs BC and the other doesn't:** Split into two separate rector classes. - This is necessary because `AbstractDrupalCoreRector::refactor()` assumes all transformations - use the same BC configuration. - ---- - -## 10. AddCommentService - -Some drupal-rector rules add a comment to the output code to prompt human review. When to use it: - -- The transformation is not fully automatic (e.g., requires developer judgment to complete). -- The digests rule itself contains a `// TODO` or review note in the transformed code. -- The output might need manual adjustment depending on context. - -When NOT to use it (the common case): -- The transformation is deterministic (one-to-one constant/function replacement). - -If used: -```php -// In the rule constructor -public function __construct(private readonly AddCommentService $commentService) {} - -// In refactor() -$this->commentService->addDrupalRectorComment($node, 'Please verify this change manually.'); -``` - -And in the test config: -```php -DeprecationBase::addClass(MyRector::class, $rectorConfig, true); // true = addNoticeConfig -``` - ---- - -## 11. Test environment: Drupal VERSION - -`AbstractDrupalCoreRector::installedDrupalVersion()` determines whether a rule fires. It resolves -the version in this order: - -1. **Static override** — `AbstractDrupalCoreRector::setVersionOverride($version)`, used in tests - that need to simulate a specific Drupal version. -2. **Stub fallback** — `stubs/Drupal/Drupal.php` defines `\Drupal::VERSION = '11.99.x-dev'`, - used by all tests that do not set an override. - -### Standard conversions (happy-path tests) - -For typical digest-to-rector test classes, no version setup is needed. The stub default `11.99.x-dev` -satisfies any `introducedVersion <= 11.x`, so the rule fires and the fixture transformation is verified. - -**Do not change the stub back to `10.99.x-dev`** — doing so will silently disable all Drupal 11 -rules in the test suite. - -### Version-specific tests (positive + negative cases) - -When a test needs to assert that a rule fires on one version but not another, use -`setVersionOverride` in `setUp`/`tearDown`: - -```php -use DrupalRector\Rector\AbstractDrupalCoreRector; - -protected function setUp(): void -{ - parent::setUp(); - AbstractDrupalCoreRector::setVersionOverride('11.0.0'); -} - -protected function tearDown(): void -{ - AbstractDrupalCoreRector::setVersionOverride(null); // always reset - parent::tearDown(); -} -``` - -Passing `null` resets to the stub fallback, so the override does not leak between test classes -in the same PHPUnit run. diff --git a/docs/filter_d11.py b/docs/filter_d11.py deleted file mode 100644 index 6c19fa0a9..000000000 --- a/docs/filter_d11.py +++ /dev/null @@ -1,155 +0,0 @@ -#!/usr/bin/env python3 -"""Filter search results to only projects with Drupal 11 support, then write markdown.""" - -import json -import os -import re -import time -import sys -import urllib.request -import urllib.parse -from collections import defaultdict - -TOKEN = os.environ["GITLAB_TOKEN"] -BASE = "https://git.drupalcode.org/api/v4" -SLEEP = 0.4 - -def api_get(path, params=None): - url = f"{BASE}{path}" - if params: - url += "?" + urllib.parse.urlencode(params) - req = urllib.request.Request(url, headers={"PRIVATE-TOKEN": TOKEN}) - try: - with urllib.request.urlopen(req, timeout=10) as resp: - return json.loads(resp.read()) - except Exception as e: - return None - - -def supports_d11(project_id, project_name, cache={}): - if project_id in cache: - return cache[project_id] - - # Search for .info.yml files in the project containing core_version_requirement - result = api_get(f"/projects/{project_id}/search", { - "scope": "blobs", - "search": "core_version_requirement", - "per_page": 5, - }) - if not result: - cache[project_id] = False - return False - - for blob in result: - fname = blob.get("filename", "") - if not fname.endswith(".info.yml"): - continue - data = blob.get("data", "") - # Match: core_version_requirement: ^10 || ^11, ^11, >=11, ~11, etc. - if re.search(r'core_version_requirement:[^\n]*\b11\b', data): - cache[project_id] = True - return True - - cache[project_id] = False - return False - - -def main(): - with open("docs/search_results.json") as f: - data = json.load(f) - - rector_hits = data["rector_hits"] - - # Collect unique project IDs across all rectors - # Map project_name -> project_id (we stored both in results) - name_to_id = {} - for rector, hits in rector_hits.items(): - for h in hits: - name_to_id[h["project_name"]] = h["project_id"] - - all_projects = list(name_to_id.items()) - print(f"Checking {len(all_projects)} projects for D11 support...", file=sys.stderr) - - d11_projects = set() - for i, (name, pid) in enumerate(all_projects): - ok = supports_d11(pid, name) - if ok: - d11_projects.add(name) - print(f" [{i+1}/{len(all_projects)}] ✓ {name}", file=sys.stderr) - else: - print(f" [{i+1}/{len(all_projects)}] {name}", file=sys.stderr) - time.sleep(SLEEP) - - print(f"\n{len(d11_projects)} projects support D11.", file=sys.stderr) - - # Build filtered rector -> [project_name] mapping - rector_d11_projects = defaultdict(list) - project_rectors = defaultdict(list) - - for rector, hits in rector_hits.items(): - seen = set() - for h in hits: - pname = h["project_name"] - if pname in d11_projects and pname not in seen: - rector_d11_projects[rector].append(pname) - project_rectors[pname].append(rector) - seen.add(pname) - - # Write markdown - lines = [ - "# Contrib Modules Using Deprecated APIs (D11 Compatible)", - "", - "Modules found via Drupal GitLab code search, filtered to those with `core_version_requirement` supporting Drupal 11.", - "", - "---", - "", - "## By Rector", - "", - ] - - for rector in sorted(rector_d11_projects.keys()): - projects = sorted(rector_d11_projects[rector]) - lines.append(f"### {rector}") - if projects: - for p in projects: - short = p.replace("project/", "") - lines.append(f"- [{short}](https://www.drupal.org/project/{short})") - else: - lines.append("- *(no D11 contrib modules found)*") - lines.append("") - - # Rectors with no hits at all - all_rectors = set() - for rector, hits in rector_hits.items(): - all_rectors.add(rector) - for rector in sorted(all_rectors - set(rector_d11_projects.keys())): - lines.append(f"### {rector}") - lines.append("- *(no hits)*") - lines.append("") - - lines += [ - "---", - "", - "## By Module (modules covering multiple rectors)", - "", - ] - - multi = {p: rs for p, rs in project_rectors.items() if len(rs) > 1} - for pname in sorted(multi.keys(), key=lambda p: -len(multi[p])): - short = pname.replace("project/", "") - rectors = multi[pname] - lines.append(f"### [{short}](https://www.drupal.org/project/{short}) — {len(rectors)} rectors") - for r in sorted(rectors): - lines.append(f"- {r}") - lines.append("") - - md = "\n".join(lines) - out = "docs/contrib-modules-d11.md" - with open(out, "w") as f: - f.write(md) - print(f"\nWrote {out}", file=sys.stderr) - print(md) - - -if __name__ == "__main__": - main() diff --git a/docs/filter_progress.log b/docs/filter_progress.log deleted file mode 100644 index d6568660f..000000000 --- a/docs/filter_progress.log +++ /dev/null @@ -1,1228 +0,0 @@ -Checking 1223 projects for D11 support... - [1/1223] project/pt-br - [2/1223] project/livediscussions - [3/1223] project/pushbutton_phptemplate - [4/1223] project/bg - [5/1223] project/mail_archive - [6/1223] project/sitemenu - [7/1223] project/binder - [8/1223] project/gladcamp - [9/1223] project/contact_dir - [10/1223] project/advcache - [11/1223] project/pmetrics - [12/1223] project/xcache - [13/1223] project/cache_disable - [14/1223] project/cacherouter - [15/1223] project/latest_members - [16/1223] project/eventbrite - [17/1223] project/querypath - [18/1223] project/qpservices - [19/1223] project/cache_actions - [20/1223] project/virtual_roles - [21/1223] project/media_ustream - [22/1223] project/max_age - [23/1223] project/block2field - [24/1223] project/cache_heuristic - [25/1223] project/cache_graceful - [26/1223] project/deds_client - [27/1223] project/corporative_site - [28/1223] project/b2b_store_solution - [29/1223] project/onepagecv - [30/1223] project/cachetags - [31/1223] project/amazon_import - [32/1223] project/shareaholic - [33/1223] project/booking_com_api - [34/1223] project/search_api_acquia - [35/1223] project/fetcher - [36/1223] project/memory_profiler - [37/1223] project/session_cache - [38/1223] project/userpickit - [39/1223] project/dynamodb - [40/1223] project/memcache_storage - [41/1223] project/entity_lister - [42/1223] project/context_cache - [43/1223] project/social_comments - [44/1223] project/site_search_analytics - [45/1223] project/reevoomark - [46/1223] project/enhanced_page_cache - [47/1223] project/wunderground_weather - [48/1223] project/at_base - [49/1223] project/visitorsvoice - [50/1223] project/cove_api - [51/1223] project/staticfilecache - [52/1223] project/qui - [53/1223] project/wincachedrupal - [54/1223] project/go1_base - [55/1223] project/quandl - [56/1223] project/social_feed_field - [57/1223] project/selective_tweets - [58/1223] project/orghunter - [59/1223] project/era - [60/1223] project/couchbasedrupal - [61/1223] project/riddle_marketplace - [62/1223] project/apcu - [63/1223] project/cision_block - [64/1223] project/sendinblue_rules - [65/1223] project/ovh - [66/1223] project/rss_embed_field - [67/1223] ✓ project/feed_block - [68/1223] project/wsdata - [69/1223] project/dvg_stuf_bg - [70/1223] ✓ project/spambot - [71/1223] project/usajobs_integration - [72/1223] project/dvg_appointments - [73/1223] ✓ project/wisski - [74/1223] project/js_entity - [75/1223] ✓ project/commercetools - [76/1223] project/social_media_api - [77/1223] ✓ project/cmrf_form_processor - [78/1223] ✓ project/cmrf_core - [79/1223] project/audit_report - [80/1223] ✓ project/menu_parser_php - [81/1223] ✓ project/vcp4dates - [82/1223] project/ct_expire - [83/1223] ✓ project/views_dependent_filters - [84/1223] project/sqlsrv - [85/1223] ✓ project/sparql_entity_storage - [86/1223] ✓ project/civicrm_entity - [87/1223] ✓ project/acsf - [88/1223] ✓ project/smart_migrate_cli - [89/1223] project/mollom - [90/1223] project/cache_browser - [91/1223] project/casaa - [92/1223] project/distro - [93/1223] project/freeagent - [94/1223] project/context_admin - [95/1223] project/winners - [96/1223] project/qfield - [97/1223] project/mb - [98/1223] project/backup_migrate_dropbox - [99/1223] ✓ project/dns - [100/1223] project/profile_setup_api - [101/1223] project/openid_sso_provider - [102/1223] project/devshop_hosting - [103/1223] project/panels_frame - [104/1223] project/wildfire - [105/1223] project/mpub - [106/1223] ✓ project/config_split - [107/1223] ✓ project/bynder - [108/1223] project/views_ajax_form - [109/1223] project/bynder_orbit - [110/1223] project/mustache_templates - [111/1223] ✓ project/community_tasks - [112/1223] project/odoo_api - [113/1223] ✓ project/views_advanced_cache - [114/1223] project/salesforce_auth - [115/1223] ✓ project/og - [116/1223] project/authcache - [117/1223] ✓ project/deploy_key - [118/1223] ✓ project/swagger_ui_formatter - [119/1223] project/d6lts - [120/1223] project/lightning_workflow - [121/1223] project/apigee_edge - [122/1223] ✓ project/searchstax - [123/1223] ✓ project/checklistapi - [124/1223] project/stratoserp - [125/1223] project/monster_menus - [126/1223] ✓ project/salesforce - [127/1223] ✓ project/cloud - [128/1223] project/aeg - [129/1223] project/govimentum - [130/1223] ✓ project/language_suggestion - [131/1223] project/drupalru_d7 - [132/1223] project/entity_reference_preview - [133/1223] ✓ project/eu_cookie_compliance_rocketship - [134/1223] project/ubershopwish - [135/1223] project/fmrest - [136/1223] project/stackla_widget - [137/1223] ✓ project/mailchimp_transactional - [138/1223] project/testproject4234 - [139/1223] project/entity_references_map - [140/1223] ✓ project/trailless_menu - [141/1223] project/widen_media - [142/1223] ✓ project/vwo - [143/1223] project/loop_workers - [144/1223] ✓ project/granulartimecache - [145/1223] ✓ project/engaging_networks - [146/1223] ✓ project/entity_usage_updater - [147/1223] ✓ project/pantheon_autopilot_toolbar - [148/1223] ✓ project/social_auth_entra_id - [149/1223] ✓ project/override_cache_control_headers - [150/1223] project/json_drop_api - [151/1223] ✓ project/sdx - [152/1223] ✓ project/search_api_postgresql - [153/1223] ✓ project/open_vocabularies - [154/1223] ✓ project/chromeless - [155/1223] ✓ project/rail_ai_provider - [156/1223] ✓ project/youtube_live_video - [157/1223] ✓ project/ffmpeg_media - [158/1223] project/drupal_devkit - [159/1223] project/bear_skin - [160/1223] ✓ project/canvas - [161/1223] project/patternlab - [162/1223] project/emulsify - [163/1223] project/kashmir - [164/1223] project/sketch - [165/1223] project/flexi_pattern_lab - [166/1223] project/potion - [167/1223] ✓ project/entity_import - [168/1223] ✓ project/search_api - [169/1223] ✓ project/search_api_autocomplete - [170/1223] ✓ project/search_api_saved_searches - [171/1223] ✓ project/tranc - [172/1223] project/core_logs - [173/1223] ✓ project/experience_builder - [174/1223] project/onepage - [175/1223] project/1087726 - [176/1223] project/redhen_demo - [177/1223] project/rebuild - [178/1223] project/ddcla - [179/1223] project/transcribe_distribution - [180/1223] project/restaurant - [181/1223] project/tr_kurulum - [182/1223] project/tb_blog_starter - [183/1223] project/tb_events_starter - [184/1223] project/tb_hadelis_starter - [185/1223] project/tb_methys_starter - [186/1223] project/tb_mollise_starter - [187/1223] project/tb_neris_starter - [188/1223] project/tb_palicico_starter - [189/1223] project/tb_purity_starter - [190/1223] project/tb_rave_starter - [191/1223] project/tb_sirate_starter - [192/1223] project/open_badging_installation_profile - [193/1223] project/sauce - [194/1223] project/mobilearkickstart - [195/1223] project/spanish_distribution - [196/1223] project/fuse - [197/1223] project/govbr - [198/1223] project/qurandistribution - [199/1223] project/redhen_raiser - [200/1223] project/development - [201/1223] project/gp_reviews - [202/1223] project/pankm - [203/1223] project/byu_installation_profile - [204/1223] ✓ project/group - [205/1223] ✓ project/ginvite - [206/1223] ✓ project/gnode_request - [207/1223] project/whereabouts - [208/1223] project/group_entity - [209/1223] project/tiendaparamipyme - [210/1223] ✓ project/metatag - [211/1223] ✓ project/comment_mover - [212/1223] project/flatcomments - [213/1223] project/openlayers - [214/1223] project/service_container - [215/1223] ✓ project/indieweb - [216/1223] project/project_issue - [217/1223] project/zen - [218/1223] project/rdf - [219/1223] project/advanced_forum - [220/1223] project/comment_perm - [221/1223] project/genesis - [222/1223] project/adaptivetheme - [223/1223] project/html5_boilerplate - [224/1223] project/nucleus - [225/1223] project/lc3_clean - [226/1223] project/comment_goodness - [227/1223] project/drupalace - [228/1223] project/twentyeleven - [229/1223] project/node_notify - [230/1223] project/md_foto - [231/1223] project/comment_fragment - [232/1223] project/twbs - [233/1223] project/stacksight - [234/1223] project/oa_basetheme - [235/1223] project/techsupport - [236/1223] project/tsm - [237/1223] project/jats_generator - [238/1223] project/idea - [239/1223] ✓ project/social - [240/1223] project/easy_booking - [241/1223] project/jsonapi_comment - [242/1223] ✓ project/gadget - [243/1223] ✓ project/deprecation_status - [244/1223] project/tinymce - [245/1223] project/bueditor - [246/1223] ✓ project/video_filter - [247/1223] project/cdn - [248/1223] project/editor - [249/1223] ✓ project/markdown - [250/1223] project/translation_management - [251/1223] project/imageeditor - [252/1223] ✓ project/video_embed_field - [253/1223] project/ole - [254/1223] project/wysiwyg_ckeditor - [255/1223] project/contextly - [256/1223] ✓ project/quickedit - [257/1223] ✓ project/url_embed - [258/1223] ✓ project/editor_advanced_link - [259/1223] project/editor_ckeditor_widgets - [260/1223] project/wysiwyg_trumbowyg - [261/1223] ✓ project/synimage - [262/1223] project/ckeditor_config - [263/1223] ✓ project/inline_formatter_field - [264/1223] ✓ project/entity_embed - [265/1223] ✓ project/ckeditor_mentions - [266/1223] project/boxout - [267/1223] ✓ project/flmngr - [268/1223] ✓ project/ckeditor_codemirror - [269/1223] ✓ project/depcalc - [270/1223] ✓ project/editor_advanced_image - [271/1223] ✓ project/wxt - [272/1223] ✓ project/openfed - [273/1223] project/ckeditor_uploadimage - [274/1223] ✓ project/acquia_contenthub - [275/1223] project/decoupled - [276/1223] project/inline_image_token - [277/1223] project/ckeditor_exclude_tags - [278/1223] project/ezcontent_publish - [279/1223] project/grapesjs_editor - [280/1223] project/learnosity - [281/1223] project/ckeditor_custom_paste_filters - [282/1223] ✓ project/acquia_dam - [283/1223] ✓ project/address_suggestion - [284/1223] ✓ project/ckeditor5_premium_features - [285/1223] project/ckeditor5_highlight - [286/1223] ✓ project/ckeditor5_mentions - [287/1223] ✓ project/visual_editor - [288/1223] ✓ project/ckeditor5_spoiler - [289/1223] ✓ project/txt42 - [290/1223] ✓ project/ckeditor_lts - [291/1223] ✓ project/edit_plus - [292/1223] ✓ project/ckeditor_braille - [293/1223] ✓ project/ckeditor5_plugin_pack - [294/1223] ✓ project/ckeditor_historylog - [295/1223] ✓ project/ckeditor5_deepl - [296/1223] ✓ project/ai_ckeditor_extras - [297/1223] ✓ project/theme_file_editor - [298/1223] ✓ project/deepseek - [299/1223] ✓ project/smartlinker_ai - [300/1223] ✓ project/media_folders - [301/1223] ✓ project/dsfr4drupal_picker - [302/1223] ✓ project/toast_image_editor - [303/1223] ✓ project/module_file_editor - [304/1223] project/ckeditor5_scroll_fix - [305/1223] ✓ project/editor_advanced_table - [306/1223] ✓ project/ai_editoria11y - [307/1223] ✓ project/ai_agents_experimental_collection - [308/1223] ✓ project/token_browser_plus - [309/1223] ✓ project/flo - [310/1223] ✓ project/custom_paragraphs - [311/1223] project/content_browser - [312/1223] project/berf - [313/1223] ✓ project/paragraphs_summary - [314/1223] project/entity_reference_override - [315/1223] ✓ project/entity_overlay - [316/1223] project/entity_browser_block - [317/1223] project/field_pager - [318/1223] ✓ project/entity_reference_ajax_formatter - [319/1223] ✓ project/entity_list - [320/1223] project/multi_render_formatter - [321/1223] ✓ project/dynamic_entity_reference - [322/1223] ✓ project/tripal - [323/1223] project/df - [324/1223] ✓ project/rocketship_core - [325/1223] ✓ project/gutenberg - [326/1223] ✓ project/link_field_display_mode_formatter - [327/1223] project/revisiondiff - [328/1223] project/entity_reference_dynamic_display - [329/1223] project/entity_reference_views_backfill - [330/1223] ✓ project/nested_entity_reference_formatter - [331/1223] ✓ project/external_entity - [332/1223] ✓ project/custom_field - [333/1223] ✓ project/view_mode_crop - [334/1223] project/image_as_media - [335/1223] ✓ project/seb - [336/1223] ✓ project/datafield - [337/1223] project/rest_entity_display - [338/1223] ✓ project/published_referenced_entity - [339/1223] project/more_fields - [340/1223] ✓ project/rendred_entity_list_formatter - [341/1223] ✓ project/rendered_entity_list_formatter - [342/1223] ✓ project/layout_builder_formatter - [343/1223] project/fieldgroup - [344/1223] project/fieldgroup_table - [345/1223] project/cck_fieldgroup_tabs - [346/1223] project/hexagon - [347/1223] project/bundles - [348/1223] project/inherit - [349/1223] project/popups_subedit - [350/1223] project/aurigma - [351/1223] project/fieldtool - [352/1223] project/cck_inputs - [353/1223] project/cck_sync - [354/1223] project/profile_migrate - [355/1223] project/meetu - [356/1223] project/node_widget - [357/1223] project/acc - [358/1223] project/pirets - [359/1223] project/briefcase - [360/1223] project/content_type_exporter - [361/1223] project/content_display_order - [362/1223] project/field_or - [363/1223] project/cck_signup - [364/1223] project/imagefetchr - [365/1223] project/ct_plus - [366/1223] project/podgroups - [367/1223] project/volunteer_rally_features - [368/1223] project/donor_rally_features - [369/1223] project/commerce_fieldgroup_panes - [370/1223] project/microdata - [371/1223] project/dt - [372/1223] project/msnf - [373/1223] project/bundle_copy - [374/1223] project/fieldgroup_htabs - [375/1223] project/fieldgroup_callouts - [376/1223] project/cgpa_calculator - [377/1223] project/elms_features - [378/1223] project/voipuser - [379/1223] project/fieldgroup_placeholder - [380/1223] project/syndicator - [381/1223] project/field_group_ajaxified_multipage - [382/1223] project/bootstrap_fieldgroup - [383/1223] project/markaspot - [384/1223] project/field_group_save_button - [385/1223] project/componentize - [386/1223] project/bundle_copy_commerce - [387/1223] project/field_group_table_component - [388/1223] project/skillset_inview - [389/1223] ✓ project/sports_league - [390/1223] project/bundle_copy_profile2 - [391/1223] project/razoreye_biz - [392/1223] project/bif - [393/1223] project/simple_multistep - [394/1223] project/esm - [395/1223] project/field_group_label_classes - [396/1223] project/certificate - [397/1223] project/ULT - [398/1223] project/icn - [399/1223] project/abtestui - [400/1223] project/bahai_incubator - [401/1223] project/wim - [402/1223] ✓ project/field_group - [403/1223] ✓ project/ui_patterns_settings - [404/1223] project/jsonapi_example - [405/1223] project/inline_field_group - [406/1223] project/social_media_image_generator - [407/1223] ✓ project/field_group_vertical_tabs - [408/1223] project/uc_fedex - [409/1223] ✓ project/download_file - [410/1223] ✓ project/commerce_invoice - [411/1223] ✓ project/commerce_purchase_order - [412/1223] project/archibald - [413/1223] project/odir - [414/1223] ✓ project/cforge - [415/1223] project/erpal - [416/1223] project/node_field - [417/1223] project/1635422 - [418/1223] project/tmgmt_server - [419/1223] project/sshid - [420/1223] project/wf - [421/1223] project/fontello - [422/1223] project/endicia - [423/1223] project/icomoon - [424/1223] project/drupdates - [425/1223] project/bassets_sw - [426/1223] project/pathed_files - [427/1223] project/flipping_book - [428/1223] project/image_download_formatter - [429/1223] project/private_image_cache - [430/1223] project/git_book - [431/1223] project/yamlform - [432/1223] project/pdftemplate - [433/1223] project/reporting_cloud - [434/1223] project/rules_letter - [435/1223] project/node_revision_private_files_access_permission - [436/1223] project/temporary_download - [437/1223] project/dam - [438/1223] project/onetime_download - [439/1223] ✓ project/feeds - [440/1223] project/field_formatter_key_label - [441/1223] project/file_shelf - [442/1223] ✓ project/tmgmt - [443/1223] ✓ project/protected_file - [444/1223] ✓ project/file_entity - [445/1223] project/skilling - [446/1223] project/lingo24 - [447/1223] project/commerce_invoice_ubl - [448/1223] ✓ project/dxpr_builder - [449/1223] ✓ project/unpublished_file - [450/1223] ✓ project/git_wiki_help - [451/1223] ✓ project/media_icon_deliver - [452/1223] ✓ project/file_visibility - [453/1223] project/evaluation - [454/1223] project/module_grants - [455/1223] project/views_query_na_subquery - [456/1223] project/entity_gallery - [457/1223] ✓ project/view_usernames_node_author - [458/1223] project/snippets - [459/1223] project/family - [460/1223] project/drush - [461/1223] project/administration_notification - [462/1223] project/search_by_page - [463/1223] project/guidance - [464/1223] project/recruit - [465/1223] project/wysiwyg_fields - [466/1223] project/vinculum - [467/1223] project/rocketship - [468/1223] project/opigno_glossary - [469/1223] project/prh_search - [470/1223] project/latest - [471/1223] project/rio - [472/1223] project/drupal_wall - [473/1223] project/civicrm_event_receipts - [474/1223] project/social_content - [475/1223] project/og_groupcontent - [476/1223] project/administrative_help - [477/1223] project/commune - [478/1223] project/commerce_behat - [479/1223] project/experd - [480/1223] project/display_machine_name - [481/1223] project/smartparticipation - [482/1223] project/external_page_redirect - [483/1223] project/automatic_field_saver - [484/1223] project/smartling - [485/1223] project/cultura - [486/1223] project/votingapi - [487/1223] project/closedquestion_scoreboard - [488/1223] ✓ project/tome - [489/1223] project/ctools - [490/1223] project/lingotek - [491/1223] project/virtualcare - [492/1223] project/druvel - [493/1223] ✓ project/feedstextareafetcher - [494/1223] ✓ project/sva - [495/1223] ✓ project/rdf_sync - [496/1223] ✓ project/ai_eca - [497/1223] project/drupal_cli - [498/1223] project/indexpage - [499/1223] project/question - [500/1223] project/node_clone - [501/1223] project/twitter - [502/1223] project/util - [503/1223] project/mmedia - [504/1223] project/subdomain - [505/1223] project/autotag - [506/1223] project/fast_gallery - [507/1223] project/nodetypeviews - [508/1223] project/admin_notify - [509/1223] project/fbconnect - [510/1223] ✓ project/addanother - [511/1223] project/googlenews - [512/1223] ✓ project/collection - [513/1223] project/simplenews_content_selection - [514/1223] project/languageassign - [515/1223] ✓ project/custom_search - [516/1223] project/revision_all - [517/1223] project/views_content_cache - [518/1223] project/nopremium - [519/1223] project/openscholar_vsite - [520/1223] project/references - [521/1223] project/node_gallery_bulk_operations - [522/1223] project/node_gallery_taxonomy - [523/1223] project/merci_signup - [524/1223] project/merci_barcode_labels - [525/1223] project/sharebar - [526/1223] project/colors - [527/1223] project/field_weight - [528/1223] project/meerkat - [529/1223] project/views_node_access - [530/1223] project/nodeaccesskeys - [531/1223] project/pager_for_content_type - [532/1223] project/drupalgap - [533/1223] project/comment_easy_reply - [534/1223] ✓ project/html_title - [535/1223] project/move_user - [536/1223] project/ajaxnewcounter - [537/1223] project/simpleantispam - [538/1223] project/factorydrone - [539/1223] project/blurry - [540/1223] project/content_access_view - [541/1223] project/uyan - [542/1223] project/og_admin_block - [543/1223] project/commons_migration - [544/1223] project/og_menu_single - [545/1223] project/content_trust - [546/1223] project/openpolitic - [547/1223] project/user_content_type - [548/1223] project/inspector - [549/1223] project/socialshare - [550/1223] project/multipage_navigation - [551/1223] project/persistent_menu_items - [552/1223] project/ajax_node_loader - [553/1223] project/codebook_core - [554/1223] project/codebook_print_pdf - [555/1223] project/form_default_button - [556/1223] project/simple_nodeblock - [557/1223] ✓ project/copyscape - [558/1223] project/oa_wizard - [559/1223] project/readmore_ajax - [560/1223] project/csf - [561/1223] project/usercancel_contentassigntoadmin - [562/1223] project/taxonomy_linking - [563/1223] project/taxonomy_autolink - [564/1223] project/node_title_help_text - [565/1223] project/update_external_links - [566/1223] project/contentassigntootheruser - [567/1223] project/hierarchical_select_access - [568/1223] project/basic_stats_token - [569/1223] project/stop_broken_link_in_body - [570/1223] project/anonymous_subscriptions - [571/1223] ✓ project/find_text - [572/1223] project/customizable_entities - [573/1223] project/npop - [574/1223] project/updated - [575/1223] project/admin_toolbar_content_languages - [576/1223] project/transfer_user_content - [577/1223] project/baidumap_fieldtype - [578/1223] project/node_creator_system_details - [579/1223] project/domain_video_sitemap - [580/1223] project/acal - [581/1223] ✓ project/rsvp_list - [582/1223] project/node_creation_links - [583/1223] project/skyword - [584/1223] project/communications - [585/1223] ✓ project/page_menu_reorder - [586/1223] project/node_menu_item_visibility_default_behaviour - [587/1223] project/user_delete_reassign - [588/1223] project/tide_core - [589/1223] project/tide_api - [590/1223] project/auto_nodetitle - [591/1223] project/project - [592/1223] project/filebrowser - [593/1223] ✓ project/token - [594/1223] ✓ project/read_time - [595/1223] ✓ project/quick_node_clone - [596/1223] project/hold_my_draft - [597/1223] ✓ project/edit_content_type_tab - [598/1223] project/campaignion - [599/1223] project/openpublic - [600/1223] ✓ project/entity_translation_unified_form - [601/1223] ✓ project/ds - [602/1223] project/pp_graphsearch - [603/1223] project/simply_signups - [604/1223] project/markdown_exporter - [605/1223] project/content_admin_tools - [606/1223] project/backdrop_upgrade_status - [607/1223] ✓ project/rsvplist - [608/1223] project/node_randomizer - [609/1223] project/public_revisions - [610/1223] ✓ project/node_singles - [611/1223] project/entity_sort - [612/1223] ✓ project/reassign_user_content - [613/1223] project/tracker - [614/1223] ✓ project/link_description_attributes - [615/1223] ✓ project/entity_reference_edit_link - [616/1223] ✓ project/duplicate_node - [617/1223] ✓ project/micronode_block - [618/1223] ✓ project/secure_nodes - [619/1223] ✓ project/content_dependency_graph - [620/1223] project/bitcache - [621/1223] project/accessible - [622/1223] project/storage_api - [623/1223] project/oracle - [624/1223] project/dbtng - [625/1223] project/styles - [626/1223] project/d7 - [627/1223] project/mongodb_dbtng - [628/1223] project/menu_minipanels - [629/1223] ✓ project/hubspot - [630/1223] project/survey_builder - [631/1223] project/relation_add - [632/1223] project/opac - [633/1223] project/autoslave - [634/1223] project/paddle_menu_manager - [635/1223] project/visitor_actions - [636/1223] project/mysql_async - [637/1223] project/sqlbuddy - [638/1223] project/contact_centre - [639/1223] project/amber - [640/1223] project/scoopit - [641/1223] project/multitype_slider - [642/1223] project/entity_translation - [643/1223] project/maps_suite - [644/1223] ✓ project/gdpr - [645/1223] project/media_migration - [646/1223] project/imotilux - [647/1223] project/gtfs - [648/1223] ✓ project/commerce_store_override - [649/1223] project/ms_react - [650/1223] ✓ project/arch - [651/1223] project/tweet_reference - [652/1223] project/acquia_migrate - [653/1223] project/lgpd - [654/1223] project/entitree - [655/1223] project/rating_list - [656/1223] ✓ project/social_auth_buttons - [657/1223] project/field_completeness - [658/1223] project/gtfs_511 - [659/1223] project/gtfs_rt - [660/1223] project/gtfs_geo - [661/1223] project/payment_button_drupal_plugin - [662/1223] project/ayrshare - [663/1223] ✓ project/tmgmt_smartcat - [664/1223] project/video_toolbox - [665/1223] ✓ project/sgd_user_status - [666/1223] ✓ project/sgd_watchdog_summary - [667/1223] ✓ project/smileys_field - [668/1223] ✓ project/mail_box_management - [669/1223] ✓ project/book_library_api - [670/1223] ✓ project/track_usage - [671/1223] ✓ project/babel - [672/1223] ✓ project/graphql_shield - [673/1223] ✓ project/livre - [674/1223] ✓ project/conreg - [675/1223] ✓ project/junk_drawer - [676/1223] ✓ project/ai_schemadotorg_jsonld - [677/1223] ✓ project/schemadotorg - [678/1223] project/session_limit - [679/1223] ✓ project/activity - [680/1223] ✓ project/restrict_by_ip - [681/1223] project/tupas - [682/1223] ✓ project/recently_read - [683/1223] project/commerce_qb_webconnect - [684/1223] project/xing_connect - [685/1223] project/saml_idp - [686/1223] project/big_pipe_demo - [687/1223] project/csv_to_config - [688/1223] ✓ project/bulk_update_fields - [689/1223] ✓ project/quicker_login - [690/1223] project/examplelist - [691/1223] ✓ project/page_hits - [692/1223] ✓ project/change_author_action - [693/1223] project/real_estate_lp_profile - [694/1223] ✓ project/node_export - [695/1223] project/mailing_list - [696/1223] project/userswitch - [697/1223] project/bulk_update_fields_commerce - [698/1223] ✓ project/bulk_copy_fields - [699/1223] project/login_alert - [700/1223] project/simple_node_importer - [701/1223] project/global_gateway - [702/1223] ✓ project/facebook_pixel - [703/1223] project/registration_form - [704/1223] project/tmgmt_smartling - [705/1223] project/questions_answers - [706/1223] project/eid_auth - [707/1223] project/smartid_auth - [708/1223] ✓ project/brightcove - [709/1223] ✓ project/devel - [710/1223] ✓ project/rules - [711/1223] project/evangelische_termine - [712/1223] ✓ project/entity_visibility_preview - [713/1223] project/eus - [714/1223] project/admin_can_login_anyuser - [715/1223] ✓ project/cookie_samesite_support - [716/1223] project/entity_sync - [717/1223] ✓ project/oidc - [718/1223] ✓ project/oidc_mcpf - [719/1223] project/bing_ads - [720/1223] ✓ project/anonymoussession - [721/1223] project/commerce_ticketing_checkin - [722/1223] ✓ project/session_inspector - [723/1223] project/acumatica - [724/1223] ✓ project/kamihaya_cms - [725/1223] project/entity_sync_odata - [726/1223] project/twilio_otp_login - [727/1223] project/cm_data_layer - [728/1223] ✓ project/session_management - [729/1223] ✓ project/loginnotification - [730/1223] ✓ project/externalauth_force - [731/1223] project/logout_timeout - [732/1223] ✓ project/simpleavs - [733/1223] ✓ project/stenographer - [734/1223] ✓ project/user_logout - [735/1223] ✓ project/drupal_saml_bridge - [736/1223] project/xmpp_server - [737/1223] project/cache - [738/1223] project/jp_mobile - [739/1223] project/session_proxy - [740/1223] project/drupalcon_base - [741/1223] project/kalvi_core - [742/1223] project/chatwee - [743/1223] project/events_features - [744/1223] project/casperjs - [745/1223] project/soauth - [746/1223] ✓ project/session_entity - [747/1223] ✓ project/drd - [748/1223] ✓ project/views_extras - [749/1223] project/delphi - [750/1223] ✓ project/intercept - [751/1223] ✓ project/telega - [752/1223] project/cypress - [753/1223] project/commerce7_razorpay - [754/1223] project/eventbrite_one_way_sync - [755/1223] ✓ project/simplesamlphp_sp - [756/1223] project/drupal_canvas_plugin - [757/1223] ✓ project/audit - [758/1223] project/smartcache - [759/1223] project/css_gzip - [760/1223] project/css_emimage - [761/1223] project/cf - [762/1223] project/barracuda - [763/1223] project/vagrant - [764/1223] project/octopus - [765/1223] project/novalnet - [766/1223] project/mongodrop - [767/1223] project/hpcloud - [768/1223] project/bundle_aggregation - [769/1223] project/ads - [770/1223] project/simple_aggregation - [771/1223] project/openstack_storage - [772/1223] ✓ project/settingsphp - [773/1223] project/flysystem - [774/1223] project/domain_wise_aggregation - [775/1223] project/devinci - [776/1223] project/dawn - [777/1223] project/tmgmt_transifex - [778/1223] ✓ project/background_image - [779/1223] project/timber - [780/1223] ✓ project/bootstrap4 - [781/1223] project/advagg - [782/1223] project/infrastructure - [783/1223] project/exsen - [784/1223] project/d_test - [785/1223] ✓ project/bootstrap5 - [786/1223] project/drupalsqlsrvci - [787/1223] project/stage_one_theme - [788/1223] ✓ project/tone - [789/1223] project/denver - [790/1223] project/zeropoint - [791/1223] project/adt_basetheme - [792/1223] project/onus - [793/1223] project/mobile_jquery - [794/1223] project/arctica - [795/1223] project/black_hole - [796/1223] project/aether - [797/1223] project/portal_theme - [798/1223] project/abc - [799/1223] project/berry - [800/1223] project/browsersync - [801/1223] project/scholarly_lite - [802/1223] project/glazed_free - [803/1223] project/agov_base - [804/1223] project/showcase_lite - [805/1223] project/green_theme - [806/1223] project/byu_theme - [807/1223] project/belle - [808/1223] project/plus - [809/1223] project/yg_booster - [810/1223] project/yg_charity - [811/1223] project/yg_flew - [812/1223] project/corporate_lite - [813/1223] project/yg_business_plus - [814/1223] project/yg_business_line - [815/1223] project/yg_medical - [816/1223] project/conference_lite - [817/1223] project/guesthouse_lite - [818/1223] project/yg_aesthetic - [819/1223] project/yg_hotel - [820/1223] project/yg_medicare - [821/1223] project/yg_iconic - [822/1223] project/yg_law_firm - [823/1223] project/yg_creative - [824/1223] project/yg_solid - [825/1223] project/yg_black - [826/1223] project/materialize - [827/1223] project/crypto_distribution - [828/1223] ✓ project/tara - [829/1223] ✓ project/mili - [830/1223] project/minimal_lite - [831/1223] project/stack_dd - [832/1223] project/catalog_lite - [833/1223] ✓ project/bootstrap_italia - [834/1223] project/elegant_showcase - [835/1223] ✓ project/zuvi - [836/1223] project/tactic - [837/1223] ✓ project/vani - [838/1223] ✓ project/dxpr_theme - [839/1223] project/zinble - [840/1223] project/photogenictheme - [841/1223] project/dolphin_theme - [842/1223] ✓ project/edux - [843/1223] ✓ project/ruhi - [844/1223] project/mycity - [845/1223] project/ajans - [846/1223] project/commerce_factuursturen - [847/1223] project/eau_theme - [848/1223] project/edwt - [849/1223] ✓ project/xara - [850/1223] project/creative_innovative - [851/1223] project/particles_orange - [852/1223] project/dark_awesome - [853/1223] project/cellular4drupal - [854/1223] ✓ project/dsfr - [855/1223] project/idyllic - [856/1223] project/dark_page - [857/1223] project/smash_lite - [858/1223] ✓ project/marvelous - [859/1223] project/fashion_beauty - [860/1223] ✓ project/mahi - [861/1223] project/power_portfolio - [862/1223] ✓ project/kart - [863/1223] project/potent_allure - [864/1223] project/rhythm - [865/1223] project/harmony_haven - [866/1223] project/novel_delights - [867/1223] project/decorx - [868/1223] project/diner_delights - [869/1223] project/business_dev - [870/1223] project/multi_purpose - [871/1223] project/animal_shelter - [872/1223] project/feature_boost - [873/1223] ✓ project/pets_clinic - [874/1223] project/lgms - [875/1223] ✓ project/diba_clean - [876/1223] ✓ project/bootstrap3 - [877/1223] ✓ project/nava - [878/1223] ✓ project/saar - [879/1223] ✓ project/uni - [880/1223] ✓ project/synonyms - [881/1223] project/field - [882/1223] ✓ project/role_inheritance - [883/1223] project/turbo - [884/1223] ✓ project/monitoring - [885/1223] project/services_session_token_auth - [886/1223] ✓ project/clu - [887/1223] project/program - [888/1223] project/complex_workflow - [889/1223] project/dbee - [890/1223] ✓ project/riddler - [891/1223] project/acquia_commercemanager - [892/1223] project/controller_annotations - [893/1223] ✓ project/miniorange_oauth_client - [894/1223] ✓ project/apigee_m10n - [895/1223] project/restful - [896/1223] project/probo - [897/1223] project/paddle_selenium_tests - [898/1223] project/lw_groups - [899/1223] project/neon_api - [900/1223] project/publisso_gold - [901/1223] project/acquia_perz - [902/1223] project/scorm_field - [903/1223] ✓ project/acquia_vwo - [904/1223] ✓ project/drupalfit - [905/1223] ✓ project/search_api_exclude_lb - [906/1223] ✓ project/entity_mesh - [907/1223] ✓ project/drupal_content_repository - [908/1223] project/related_content - [909/1223] ✓ project/quicktabs - [910/1223] project/featured_content - [911/1223] project/nodereference_basket - [912/1223] project/feeds_view_parser - [913/1223] project/internet_archive - [914/1223] project/hose_xml - [915/1223] project/highcharts - [916/1223] project/sensor_hub - [917/1223] project/taxonomy_display - [918/1223] project/student_signup - [919/1223] project/prometheus - [920/1223] project/rules_example - [921/1223] project/time_tracker_simple - [922/1223] project/product_reference_view - [923/1223] project/shopcart - [924/1223] project/featured_news_feature - [925/1223] project/manymail - [926/1223] project/entityform - [927/1223] project/deeplink - [928/1223] project/commerce_payleap - [929/1223] project/pdfck - [930/1223] project/openbadging - [931/1223] project/courseplanner - [932/1223] project/background_audio - [933/1223] project/feeds_tamper_string2id - [934/1223] project/at_theming - [935/1223] project/ctools_view_access - [936/1223] project/xml_export - [937/1223] project/eform - [938/1223] project/oa_folders - [939/1223] project/hunter - [940/1223] project/yaqut_epub_generator - [941/1223] project/wechat_views - [942/1223] project/commerce_checkout_products_list - [943/1223] project/ectostar_standard - [944/1223] project/proconcom - [945/1223] project/abookings - [946/1223] project/drupal_extra - [947/1223] ✓ project/sshop - [948/1223] project/simple_sitemap_views - [949/1223] project/qtools_common - [950/1223] ✓ project/twig_tweak - [951/1223] project/vfd - [952/1223] ✓ project/api - [953/1223] project/content_packager - [954/1223] project/openstory - [955/1223] project/gathercontent - [956/1223] project/ercore - [957/1223] project/dvg - [958/1223] project/views - [959/1223] project/outlayer - [960/1223] project/degov - [961/1223] ✓ project/simple_sitemap - [962/1223] ✓ project/viewfield - [963/1223] project/facet_granular_date - [964/1223] project/conference_suite - [965/1223] project/delivery - [966/1223] ✓ project/knowledge - [967/1223] ✓ project/next_views_entity_reference - [968/1223] project/socialblue - [969/1223] ✓ project/abinbev_gmap - [970/1223] ✓ project/simple_sitemap_authenticated - [971/1223] ✓ project/calendar - [972/1223] ✓ project/trash - [973/1223] ✓ project/views_exclude_previous - [974/1223] project/heartbeat - [975/1223] project/visitors - [976/1223] ✓ project/views_natural_sort - [977/1223] ✓ project/views_linkarea - [978/1223] project/relation - [979/1223] project/recurly - [980/1223] project/visualization - [981/1223] ✓ project/past - [982/1223] project/visualization_d8 - [983/1223] ✓ project/views_selective_filters - [984/1223] project/quick_pages - [985/1223] ✓ project/grant - [986/1223] project/migrate_views - [987/1223] project/chartjs - [988/1223] project/discussions - [989/1223] project/rel_content - [990/1223] project/dut - [991/1223] project/entity_domain_access - [992/1223] ✓ project/tally - [993/1223] ✓ project/friendship - [994/1223] ✓ project/lms - [995/1223] project/template_entities - [996/1223] project/entity_grants - [997/1223] ✓ project/islandora - [998/1223] ✓ project/entity_hierarchy - [999/1223] project/custom_list - [1000/1223] ✓ project/workbench_moderation - [1001/1223] ✓ project/entity_reference_uuid - [1002/1223] ✓ project/views_entity_embed - [1003/1223] project/shopify - [1004/1223] ✓ project/config_pages - [1005/1223] project/opigno_learning_path - [1006/1223] ✓ project/translation_views - [1007/1223] ✓ project/tmgmt_deepl - [1008/1223] ✓ project/plugin - [1009/1223] project/rng - [1010/1223] ✓ project/entityqueue - [1011/1223] ✓ project/private_message - [1012/1223] ✓ project/thunder - [1013/1223] ✓ project/geolocation - [1014/1223] ✓ project/cms_content_sync - [1015/1223] ✓ project/bat - [1016/1223] project/communication - [1017/1223] ✓ project/muser - [1018/1223] project/pub_options - [1019/1223] ✓ project/meta_entity - [1020/1223] ✓ project/moderation_team - [1021/1223] project/hubspot_integration - [1022/1223] project/ezcontent_api - [1023/1223] project/untatu - [1024/1223] project/dplor - [1025/1223] ✓ project/ggroup - [1026/1223] ✓ project/taxonomy_parents_index - [1027/1223] ✓ project/multilingual_plus - [1028/1223] project/opendevportal - [1029/1223] ✓ project/basket - [1030/1223] ✓ project/views_migration - [1031/1223] project/field_encrypt_searchable - [1032/1223] project/opigno_social - [1033/1223] ✓ project/views_override_viewmode - [1034/1223] ✓ project/usage_data - [1035/1223] project/content_moderation_node_grants - [1036/1223] project/entity_distribution - [1037/1223] ✓ project/group_domain - [1038/1223] ✓ project/media_filter - [1039/1223] project/access_policy - [1040/1223] project/social_group_types - [1041/1223] project/group_welcome_message - [1042/1223] ✓ project/views_moderation_state_weights - [1043/1223] project/group_media_library_extra - [1044/1223] project/social_lms_integrator - [1045/1223] project/views_sql_twig_fields - [1046/1223] ✓ project/nodehive_core - [1047/1223] project/service - [1048/1223] project/view_filter_promotion - [1049/1223] ✓ project/expirable_content - [1050/1223] ✓ project/diboo_core - [1051/1223] ✓ project/media_views_filter - [1052/1223] ✓ project/a12s_locations - [1053/1223] ✓ project/consent_management - [1054/1223] ✓ project/ai_agents - [1055/1223] ✓ project/mdp - [1056/1223] project/unused_files_delete - [1057/1223] ✓ project/unused_media_filter - [1058/1223] ✓ project/itunes_rss - [1059/1223] project/schema - [1060/1223] project/flow - [1061/1223] project/disable_modules - [1062/1223] project/hookalyzer - [1063/1223] project/console - [1064/1223] project/hooks - [1065/1223] project/rocket_chat - [1066/1223] ✓ project/confi - [1067/1223] project/message_private - [1068/1223] project/pki_ra - [1069/1223] project/commerce_currency_switcher - [1070/1223] project/entity_keyvalue - [1071/1223] project/social_media_integration - [1072/1223] project/message_thread - [1073/1223] project/domain_simple_sitemap - [1074/1223] project/ppoidc - [1075/1223] project/auto_alter - [1076/1223] ✓ project/image_moderate - [1077/1223] project/hook_manager - [1078/1223] project/social_post_video - [1079/1223] ✓ project/client_config_care - [1080/1223] project/social_auth_itsme - [1081/1223] project/module_maker - [1082/1223] project/config_entity_revisions - [1083/1223] ✓ project/mutual_credit - [1084/1223] project/slack_receive - [1085/1223] ✓ project/autosave_form - [1086/1223] ✓ project/onlyone - [1087/1223] ✓ project/contacts - [1088/1223] project/social_hub - [1089/1223] ✓ project/languagefield - [1090/1223] project/multiversion - [1091/1223] project/lightning_core - [1092/1223] project/lightning_layout - [1093/1223] project/nbox - [1094/1223] ✓ project/simplifying - [1095/1223] project/gearbox - [1096/1223] project/audit_monitoring - [1097/1223] project/views_extender - [1098/1223] ✓ project/nodeinfo - [1099/1223] ✓ project/pager_serializer - [1100/1223] project/sitemorse_lite - [1101/1223] project/workflow_extras - [1102/1223] project/file_update - [1103/1223] ✓ project/licenses - [1104/1223] project/layoutcomponents - [1105/1223] project/eventer - [1106/1223] project/simple_oauth_facebook_connect - [1107/1223] project/entity_track - [1108/1223] project/simple_oauth_google_connect - [1109/1223] project/robolytix - [1110/1223] project/rmkv - [1111/1223] project/sanitize_pii - [1112/1223] ✓ project/date_augmenter - [1113/1223] ✓ project/worldmap - [1114/1223] project/toast_messages - [1115/1223] project/cookies_module_handler - [1116/1223] ✓ project/migrate_visualize - [1117/1223] project/hook_event - [1118/1223] project/sitewide_alerts - [1119/1223] project/social_auth_tiktok_decouple - [1120/1223] project/social_auth_apple_decouple - [1121/1223] project/uninstall_unexisting - [1122/1223] project/asset_autoload - [1123/1223] project/function_autoload - [1124/1223] ✓ project/test_helpers - [1125/1223] ✓ project/ws_event - [1126/1223] ✓ project/nostr_id_nip05 - [1127/1223] project/hook_profiler - [1128/1223] ✓ project/pwbi - [1129/1223] ✓ project/nitropack - [1130/1223] ✓ project/localist_drupal - [1131/1223] ✓ project/bibliocommons - [1132/1223] ✓ project/ai_upgrade_assistant - [1133/1223] ✓ project/schema_form - [1134/1223] ✓ project/orchestration - [1135/1223] project/inactive_user - [1136/1223] project/node_expire - [1137/1223] project/one_time_login - [1138/1223] project/brilliant_gallery - [1139/1223] project/settings_audit_log - [1140/1223] project/cache_backport - [1141/1223] project/node_announce - [1142/1223] project/context_date - [1143/1223] project/ua_cache_bypass - [1144/1223] project/engagement - [1145/1223] project/adbc - [1146/1223] project/random_weight - [1147/1223] project/wem - [1148/1223] project/commerce_booking - [1149/1223] project/geckoboard_push - [1150/1223] project/fts - [1151/1223] project/fluxservice - [1152/1223] project/optimizedb - [1153/1223] project/pax_content - [1154/1223] project/new_relic_insights - [1155/1223] project/db_remote - [1156/1223] project/acquia_search_config - [1157/1223] project/commerce_priceminister - [1158/1223] project/uc_abandoned - [1159/1223] project/quizz - [1160/1223] project/priority_queue - [1161/1223] project/commerce_order_reminder - [1162/1223] project/tagged_systemqueue - [1163/1223] project/future_nodes - [1164/1223] project/motionpoint - [1165/1223] project/supercache - [1166/1223] project/freshdesk_sso - [1167/1223] project/drush_async_api - [1168/1223] project/gitinfo - [1169/1223] project/uc_recently_viewed_products - [1170/1223] project/authtoken - [1171/1223] project/election - [1172/1223] project/amazon - [1173/1223] project/anonymous_publishing - [1174/1223] project/preserve_changed - [1175/1223] project/course - [1176/1223] project/performance_toolkit - [1177/1223] ✓ project/google_analytics_counter - [1178/1223] ✓ project/automatic_updates - [1179/1223] ✓ project/computed_field - [1180/1223] project/participatory_process - [1181/1223] project/clockify - [1182/1223] project/sri - [1183/1223] project/queue_scheduler - [1184/1223] project/ecwid - [1185/1223] project/variable - [1186/1223] project/ar - [1187/1223] ✓ project/tzfield - [1188/1223] project/almanac - [1189/1223] project/booking_timeslots - [1190/1223] project/makemeeting - [1191/1223] ✓ project/openid_connect - [1192/1223] project/sfactive - [1193/1223] project/dummy_content - [1194/1223] project/commerce_installments - [1195/1223] project/list_predefined_options - [1196/1223] project/timezone_picker - [1197/1223] project/cm_cablecast - [1198/1223] project/paypal_roles - [1199/1223] project/better_field_formatters - [1200/1223] project/feeds_entity_processor - [1201/1223] project/user_access_timeslot - [1202/1223] project/condition_pack - [1203/1223] project/search_api_lucene - [1204/1223] project/digitalclock - [1205/1223] project/datex - [1206/1223] ✓ project/daterange_simplify - [1207/1223] project/cilogon_auth - [1208/1223] ✓ project/smart_date - [1209/1223] project/smart_content_ipstack - [1210/1223] ✓ project/mtc - [1211/1223] project/timezone_calculator - [1212/1223] project/rocketship_florista_demo_profile - [1213/1223] ✓ project/intl_date - [1214/1223] project/veracity_vql - [1215/1223] ✓ project/crema - [1216/1223] project/library_management_system - [1217/1223] project/date_occur - [1218/1223] project/custom_entity_example - [1219/1223] ✓ project/time_clock - [1220/1223] project/current_date_time - [1221/1223] project/everlms - [1222/1223] project/substitutoo - [1223/1223] ✓ project/salesforce_push_queue_ui - -353 projects support D11. - -Wrote docs/contrib-modules-d11.md diff --git a/docs/find_d11_for_rectors.py b/docs/find_d11_for_rectors.py deleted file mode 100644 index 23b5184df..000000000 --- a/docs/find_d11_for_rectors.py +++ /dev/null @@ -1,210 +0,0 @@ -#!/usr/bin/env python3 -""" -For rectors with no D11-compatible projects yet, paginate through more search -results to find D11-compatible modules. Merges into existing results. -""" - -import json -import os -import re -import time -import sys -import urllib.request -import urllib.parse -from collections import defaultdict - -TOKEN = os.environ["GITLAB_TOKEN"] -BASE = "https://git.drupalcode.org/api/v4" -GROUP_ID = 2 -PATH_EXCLUSIONS = "-path:core -path:vendor -path:docroot -path:web -path:profiles -path:sites" -SLEEP = 0.5 -MAX_PAGES = 10 # up to 1000 results per search term - -SEARCHES = [ - ("ErrorCurrentErrorHandlerRector", "Error::currentErrorHandler"), - ("FileSystemBasenameToNativeRector", "->basename("), - ("LoadAllIncludesRector", "->loadAllIncludes("), - ("MigrateSqlGetMigrationPluginManagerRector", "->getMigrationPluginManager("), - ("NodeStorageDeprecatedMethodsRector", "->revisionIds("), - ("NodeStorageDeprecatedMethodsRector", "->userRevisionIds("), - ("NodeStorageDeprecatedMethodsRector", "->countDefaultLanguageRevisions("), - ("PluginBaseIsConfigurableRector", "->isConfigurable("), - ("RemoveAutomatedCronSubmitHandlerRector", "automated_cron_settings_submit"), - ("RemoveCacheExpireOverrideRector", "function cacheExpire("), - ("RemoveHandlerBaseDefineExtraOptionsRector", "function defineExtraOptions("), - ("RemoveLinkWidgetValidateTitleElementRector", "LinkWidget::validateTitleElement"), - ("RemoveModuleHandlerAddModuleCallsRector", "->addModule("), - ("RemoveModuleHandlerDeprecatedMethodsRector", "->writeCache("), - ("RemoveModuleHandlerDeprecatedMethodsRector", "->getHookInfo("), - ("RemoveRootFromConvertDbUrlRector", "convertDbUrlToConnectionInfo("), - ("RemoveSetUriCallbackRector", "->setUriCallback("), - ("RemoveStateCacheSettingRector", "state_cache"), - ("RemoveTrustDataCallRector", "->trustData("), - ("RemoveTwigNodeTransTagArgumentRector", "TwigNodeTrans"), - ("RemoveUpdaterPostInstallMethodsRector", "function postInstallTasks("), - ("RemoveViewsRowCacheKeysRector", "function getRowCacheKeys("), - ("RenameStopProceduralHookScanRector", "StopProceduralHookScan"), - ("ReplaceAlphadecimalToIntNullRector", "alphadecimalToInt("), - ("ReplaceCommentManagerGetCountNewCommentsRector", "->getCountNewComments("), - ("ReplaceCommentUriRector", "comment_uri("), - ("ReplaceDateTimeRangeConstantsRector", "DateTimeRangeConstantsInterface"), - ("ReplaceEditorLoadRector", "editor_load("), - ("ReplaceEntityOriginalPropertyRector", "->original"), - ("ReplaceEntityReferenceRecursiveLimitRector", "RECURSIVE_RENDER_LIMIT"), - ("ReplaceFieldgroupToFieldsetRector", "'#type' => 'fieldgroup'"), - ("ReplaceFileGetContentHeadersRector", "file_get_content_headers("), - ("ReplaceLocaleConfigBatchFunctionsRector", "locale_config_batch_set_config_langcodes("), - ("ReplaceLocaleConfigBatchFunctionsRector", "locale_config_batch_refresh_name("), - ("ReplaceNodeAccessViewAllNodesRector", "node_access_view_all_nodes("), - ("ReplaceNodeAddBodyFieldRector", "node_add_body_field("), - ("ReplaceNodeModuleProceduralFunctionsRector", "node_type_get_names("), - ("ReplaceNodeModuleProceduralFunctionsRector", "node_get_type_label("), - ("ReplaceNodeModuleProceduralFunctionsRector", "node_mass_update("), - ("ReplaceNodeSetPreviewModeRector", "->setPreviewMode("), - ("ReplacePdoFetchConstantsRector", "PDO::FETCH_"), - ("ReplaceRecipeRunnerInstallModuleRector", "RecipeRunner::installModule("), - ("ReplaceSessionManagerDeleteRector", "SessionManager"), - ("ReplaceSessionWritesWithRequestSessionRector", "$_SESSION["), - ("ReplaceSystemPerformanceGzipKeyRector", "css.gzip"), - ("ReplaceThemeGetSettingRector", "theme_get_setting("), - ("ReplaceThemeGetSettingRector", "_system_default_theme_features("), - ("ReplaceUserSessionNamePropertyRector", "UserSession"), - ("ReplaceViewsProceduralFunctionsRector", "views_get_view_result("), - ("ReplaceViewsProceduralFunctionsRector", "views_view_is_enabled("), - ("ReplaceViewsProceduralFunctionsRector", "views_enable_view("), - ("StatementPrefetchIteratorFetchColumnRector", "StatementPrefetchIterator"), - ("StripMigrationDependenciesExpandArgRector", "->getMigrationDependencies("), - ("UseEntityTypeHasIntegerIdRector", "->getEntityTypeIdKeyType("), - ("UseEntityTypeHasIntegerIdRector", "->entityTypeSupportsComments("), - ("ViewsPluginHandlerManagerRector", "Views::pluginManager("), - ("ViewsPluginHandlerManagerRector", "Views::handlerManager("), - ("ReplaceModuleHandlerGetNameRector", "moduleHandler()->getName("), - ("ReplaceRebuildThemeDataRector", "->rebuildThemeData("), - ("ReplaceRequestTimeConstantRector", "REQUEST_TIME"), - ("SystemTimeZonesRector", "system_time_zones("), -] - - -def api_get(path, params=None): - url = f"{BASE}{path}" - if params: - url += "?" + urllib.parse.urlencode(params) - req = urllib.request.Request(url, headers={"PRIVATE-TOKEN": TOKEN}) - try: - with urllib.request.urlopen(req, timeout=15) as resp: - return json.loads(resp.read()) - except Exception as e: - print(f" API error: {e}", file=sys.stderr) - return None - - -def get_project_name(project_id, cache={}): - if project_id in cache: - return cache[project_id] - result = api_get(f"/projects/{project_id}") - name = result.get("path_with_namespace", str(project_id)) if result else str(project_id) - cache[project_id] = name - time.sleep(0.3) - return name - - -def check_d11(project_id, cache={}): - if project_id in cache: - return cache[project_id] - result = api_get(f"/projects/{project_id}/search", { - "scope": "blobs", - "search": "core_version_requirement", - "per_page": 5, - }) - if not result: - cache[project_id] = False - return False - for blob in result: - if not blob.get("filename", "").endswith(".info.yml"): - continue - if re.search(r'core_version_requirement:[^\n]*\b11\b', blob.get("data", "")): - cache[project_id] = True - return True - cache[project_id] = False - return False - - -def main(): - # Load existing D11 results - with open("docs/contrib-modules-d11.md") as f: - existing_md = f.read() - - # Parse which rectors already have D11 projects - rectors_with_d11 = set() - current_rector = None - for line in existing_md.splitlines(): - if line.startswith("### "): - current_rector = line[4:].strip() - elif line.startswith("- [") and current_rector: - rectors_with_d11.add(current_rector) - - print(f"Rectors already with D11 projects: {len(rectors_with_d11)}", file=sys.stderr) - - # Load existing search results to know which project IDs we already checked - with open("docs/search_results.json") as f: - existing = json.load(f) - - already_checked_pids = set() - for hits in existing["rector_hits"].values(): - for h in hits: - already_checked_pids.add(h["project_id"]) - - # Group searches by rector, only process rectors without D11 projects yet - rector_searches = defaultdict(list) - for rector, term in SEARCHES: - rector_searches[rector].append(term) - - rectors_to_search = [r for r in rector_searches if r not in rectors_with_d11] - print(f"Rectors needing D11 projects: {rectors_to_search}", file=sys.stderr) - - # For each rector without D11 projects, paginate through results - rector_d11_found = defaultdict(list) # rector -> list of project names - - for rector in rectors_to_search: - print(f"\nSearching for D11 modules for {rector}...", file=sys.stderr) - for term in rector_searches[rector]: - found = False - for page in range(1, MAX_PAGES + 1): - full_query = f"{PATH_EXCLUSIONS} {term}" - result = api_get(f"/groups/{GROUP_ID}/search", { - "scope": "blobs", - "search": full_query, - "per_page": 100, - "page": page, - }) - time.sleep(SLEEP) - if not result: - break - print(f" {term!r} page {page}: {len(result)} hits", file=sys.stderr) - for blob in result: - pid = blob["project_id"] - if pid in already_checked_pids: - continue - already_checked_pids.add(pid) - pname = get_project_name(pid) - is_d11 = check_d11(pid) - time.sleep(SLEEP) - if is_d11: - print(f" ✓ D11: {pname}", file=sys.stderr) - rector_d11_found[rector].append(pname) - found = True - if len(result) < 100: - break # no more pages - if found: - break # found D11 modules for this rector via this term, try next rector - - # Output summary - print("\n=== Summary ===", file=sys.stderr) - for rector, projects in rector_d11_found.items(): - print(f"{rector}: {projects}", file=sys.stderr) - - print(json.dumps(dict(rector_d11_found), indent=2)) - - -if __name__ == "__main__": - main() diff --git a/docs/find_d11_targeted.py b/docs/find_d11_targeted.py deleted file mode 100644 index a915b01e2..000000000 --- a/docs/find_d11_targeted.py +++ /dev/null @@ -1,150 +0,0 @@ -#!/usr/bin/env python3 -""" -Targeted search for D11 modules for rectors that had no results. -Uses more specific search terms to cut through noisy old projects. -""" - -import json -import os -import re -import time -import sys -import urllib.request -import urllib.parse - -TOKEN = os.environ["GITLAB_TOKEN"] -BASE = "https://git.drupalcode.org/api/v4" -GROUP_ID = 2 -PATH_EXCLUSIONS = "-path:core -path:vendor -path:docroot -path:web -path:profiles -path:sites" -SLEEP = 0.5 -MAX_PAGES = 10 - -# More specific terms that include namespace/class context to filter out old Drupal 6/7 code -TARGETED = [ - ("LoadAllIncludesRector", "loadAllIncludes ModuleHandler"), - ("MigrateSqlGetMigrationPluginManagerRector", "getMigrationPluginManager migrate"), - ("PluginBaseIsConfigurableRector", "isConfigurable PluginBase"), - ("RemoveModuleHandlerAddModuleCallsRector", "addModule ModuleHandlerInterface"), - ("RemoveModuleHandlerDeprecatedMethodsRector", "writeCache ModuleHandler"), - ("RemoveModuleHandlerDeprecatedMethodsRector", "getHookInfo ModuleHandler"), - ("RemoveSetUriCallbackRector", "setUriCallback EntityType"), - ("RemoveTrustDataCallRector", "trustData Config"), - ("ReplaceCommentManagerGetCountNewCommentsRector","getCountNewComments CommentManager"), - ("ReplaceEntityOriginalPropertyRector", "->original EntityInterface"), - ("ReplaceEntityOriginalPropertyRector", "original ContentEntityBase"), - ("ReplaceNodeSetPreviewModeRector", "setPreviewMode NodeType"), - ("ReplaceRebuildThemeDataRector", "rebuildThemeData ThemeHandler"), - ("StripMigrationDependenciesExpandArgRector", "getMigrationDependencies Migration"), - ("UseEntityTypeHasIntegerIdRector", "getEntityTypeIdKeyType"), - ("UseEntityTypeHasIntegerIdRector", "entityTypeSupportsComments"), -] - -NOISE_PROJECTS = {"project/pt-br", "project/bg", "project/gladcamp", "project/binder", - "project/livediscussions", "project/mail_archive", "project/pushbutton_phptemplate", - "project/sitemenu", "project/contact_dir"} - - -def api_get(path, params=None): - url = f"{BASE}{path}" - if params: - url += "?" + urllib.parse.urlencode(params) - req = urllib.request.Request(url, headers={"PRIVATE-TOKEN": TOKEN}) - try: - with urllib.request.urlopen(req, timeout=15) as resp: - return json.loads(resp.read()) - except Exception as e: - print(f" API error {path}: {e}", file=sys.stderr) - return None - - -def get_project_name(project_id, cache={}): - if project_id in cache: - return cache[project_id] - result = api_get(f"/projects/{project_id}") - name = result.get("path_with_namespace", str(project_id)) if result else str(project_id) - cache[project_id] = name - time.sleep(0.3) - return name - - -def check_d11(project_id, cache={}): - if project_id in cache: - return cache[project_id] - result = api_get(f"/projects/{project_id}/search", { - "scope": "blobs", - "search": "^11", - "per_page": 10, - }) - time.sleep(0.3) - if not result: - cache[project_id] = False - return False - for blob in result: - if blob.get("filename", "").endswith(".info.yml"): - cache[project_id] = True - return True - cache[project_id] = False - return False - - -def main(): - rector_d11 = {} # rector -> list of project names - - seen_pids = set() - - for rector, term in TARGETED: - if rector not in rector_d11: - rector_d11[rector] = [] - - if rector_d11[rector]: # already found something for this rector - continue - - print(f"\n{rector}: {term!r}", file=sys.stderr) - - for page in range(1, MAX_PAGES + 1): - full_query = f"{PATH_EXCLUSIONS} {term}" - result = api_get(f"/groups/{GROUP_ID}/search", { - "scope": "blobs", - "search": full_query, - "per_page": 100, - "page": page, - }) - time.sleep(SLEEP) - - if not result: - break - - print(f" page {page}: {len(result)} hits", file=sys.stderr) - - for blob in result: - pid = blob["project_id"] - if pid in seen_pids: - continue - seen_pids.add(pid) - - pname = get_project_name(pid) - if pname in NOISE_PROJECTS: - continue - - is_d11 = check_d11(pid) - if is_d11: - print(f" ✓ D11: {pname}", file=sys.stderr) - rector_d11[rector].append(pname) - else: - print(f" skip: {pname}", file=sys.stderr) - - if rector_d11[rector]: - break # found at least one, move to next rector - - if len(result) < 100: - break - - print("\n=== Results ===", file=sys.stderr) - for rector, projects in rector_d11.items(): - print(f"{rector}: {projects}", file=sys.stderr) - - print(json.dumps(rector_d11, indent=2)) - - -if __name__ == "__main__": - main() diff --git a/docs/pass2_progress.log b/docs/pass2_progress.log deleted file mode 100644 index 859ed4599..000000000 --- a/docs/pass2_progress.log +++ /dev/null @@ -1,220 +0,0 @@ -Rectors already with D11 projects: 29 -Rectors needing D11 projects: ['ErrorCurrentErrorHandlerRector', 'FileSystemBasenameToNativeRector', 'LoadAllIncludesRector', 'MigrateSqlGetMigrationPluginManagerRector', 'NodeStorageDeprecatedMethodsRector', 'PluginBaseIsConfigurableRector', 'RemoveAutomatedCronSubmitHandlerRector', 'RemoveLinkWidgetValidateTitleElementRector', 'RemoveModuleHandlerAddModuleCallsRector', 'RemoveModuleHandlerDeprecatedMethodsRector', 'RemoveSetUriCallbackRector', 'RemoveTrustDataCallRector', 'RenameStopProceduralHookScanRector', 'ReplaceCommentManagerGetCountNewCommentsRector', 'ReplaceEntityOriginalPropertyRector', 'ReplaceLocaleConfigBatchFunctionsRector', 'ReplaceNodeSetPreviewModeRector', 'StatementPrefetchIteratorFetchColumnRector', 'StripMigrationDependenciesExpandArgRector', 'UseEntityTypeHasIntegerIdRector', 'ReplaceRebuildThemeDataRector'] - -Searching for D11 modules for ErrorCurrentErrorHandlerRector... - -Searching for D11 modules for FileSystemBasenameToNativeRector... - '->basename(' page 1: 100 hits - '->basename(' page 2: 100 hits - '->basename(' page 3: 100 hits - '->basename(' page 4: 100 hits - ✓ D11: project/ejectorseat - '->basename(' page 5: 100 hits - '->basename(' page 6: 100 hits - '->basename(' page 7: 100 hits - '->basename(' page 8: 100 hits - '->basename(' page 9: 100 hits - '->basename(' page 10: 100 hits - -Searching for D11 modules for LoadAllIncludesRector... - '->loadAllIncludes(' page 1: 100 hits - '->loadAllIncludes(' page 2: 100 hits - '->loadAllIncludes(' page 3: 100 hits - '->loadAllIncludes(' page 4: 100 hits - '->loadAllIncludes(' page 5: 100 hits - '->loadAllIncludes(' page 6: 100 hits - '->loadAllIncludes(' page 7: 100 hits - '->loadAllIncludes(' page 8: 100 hits - '->loadAllIncludes(' page 9: 100 hits - '->loadAllIncludes(' page 10: 100 hits - -Searching for D11 modules for MigrateSqlGetMigrationPluginManagerRector... - '->getMigrationPluginManager(' page 1: 100 hits - '->getMigrationPluginManager(' page 2: 100 hits - '->getMigrationPluginManager(' page 3: 100 hits - '->getMigrationPluginManager(' page 4: 100 hits - '->getMigrationPluginManager(' page 5: 100 hits - '->getMigrationPluginManager(' page 6: 100 hits - '->getMigrationPluginManager(' page 7: 100 hits - '->getMigrationPluginManager(' page 8: 100 hits - '->getMigrationPluginManager(' page 9: 100 hits - '->getMigrationPluginManager(' page 10: 100 hits - -Searching for D11 modules for NodeStorageDeprecatedMethodsRector... - '->revisionIds(' page 1: 100 hits - '->revisionIds(' page 2: 100 hits - '->revisionIds(' page 3: 100 hits - '->revisionIds(' page 4: 100 hits - '->revisionIds(' page 5: 100 hits - ✓ D11: project/tb_megamenu - '->revisionIds(' page 6: 100 hits - '->revisionIds(' page 7: 100 hits - '->revisionIds(' page 8: 100 hits - '->revisionIds(' page 9: 100 hits - '->revisionIds(' page 10: 100 hits - -Searching for D11 modules for PluginBaseIsConfigurableRector... - '->isConfigurable(' page 1: 100 hits - '->isConfigurable(' page 2: 100 hits - '->isConfigurable(' page 3: 100 hits - '->isConfigurable(' page 4: 100 hits - '->isConfigurable(' page 5: 100 hits - '->isConfigurable(' page 6: 100 hits - '->isConfigurable(' page 7: 100 hits - '->isConfigurable(' page 8: 100 hits - '->isConfigurable(' page 9: 100 hits - '->isConfigurable(' page 10: 100 hits - -Searching for D11 modules for RemoveAutomatedCronSubmitHandlerRector... - -Searching for D11 modules for RemoveLinkWidgetValidateTitleElementRector... - -Searching for D11 modules for RemoveModuleHandlerAddModuleCallsRector... - '->addModule(' page 1: 100 hits - '->addModule(' page 2: 100 hits - '->addModule(' page 3: 100 hits - '->addModule(' page 4: 100 hits - '->addModule(' page 5: 100 hits - '->addModule(' page 6: 100 hits - '->addModule(' page 7: 100 hits - '->addModule(' page 8: 100 hits - '->addModule(' page 9: 100 hits - '->addModule(' page 10: 100 hits - -Searching for D11 modules for RemoveModuleHandlerDeprecatedMethodsRector... - '->writeCache(' page 1: 100 hits - '->writeCache(' page 2: 100 hits - '->writeCache(' page 3: 100 hits - '->writeCache(' page 4: 100 hits - '->writeCache(' page 5: 100 hits - '->writeCache(' page 6: 100 hits - '->writeCache(' page 7: 100 hits - '->writeCache(' page 8: 100 hits - '->writeCache(' page 9: 100 hits - '->writeCache(' page 10: 100 hits - '->getHookInfo(' page 1: 100 hits - '->getHookInfo(' page 2: 100 hits - '->getHookInfo(' page 3: 100 hits - '->getHookInfo(' page 4: 100 hits - '->getHookInfo(' page 5: 100 hits - '->getHookInfo(' page 6: 100 hits - '->getHookInfo(' page 7: 100 hits - '->getHookInfo(' page 8: 100 hits - '->getHookInfo(' page 9: 100 hits - '->getHookInfo(' page 10: 100 hits - -Searching for D11 modules for RemoveSetUriCallbackRector... - '->setUriCallback(' page 1: 100 hits - '->setUriCallback(' page 2: 100 hits - '->setUriCallback(' page 3: 100 hits - '->setUriCallback(' page 4: 100 hits - '->setUriCallback(' page 5: 100 hits - '->setUriCallback(' page 6: 100 hits - '->setUriCallback(' page 7: 100 hits - '->setUriCallback(' page 8: 100 hits - '->setUriCallback(' page 9: 100 hits - '->setUriCallback(' page 10: 100 hits - -Searching for D11 modules for RemoveTrustDataCallRector... - '->trustData(' page 1: 100 hits - '->trustData(' page 2: 100 hits - '->trustData(' page 3: 100 hits - '->trustData(' page 4: 100 hits - '->trustData(' page 5: 100 hits - '->trustData(' page 6: 100 hits - '->trustData(' page 7: 100 hits - '->trustData(' page 8: 100 hits - '->trustData(' page 9: 100 hits - '->trustData(' page 10: 100 hits - -Searching for D11 modules for RenameStopProceduralHookScanRector... - -Searching for D11 modules for ReplaceCommentManagerGetCountNewCommentsRector... - '->getCountNewComments(' page 1: 100 hits - '->getCountNewComments(' page 2: 100 hits - '->getCountNewComments(' page 3: 100 hits - '->getCountNewComments(' page 4: 100 hits - '->getCountNewComments(' page 5: 100 hits - '->getCountNewComments(' page 6: 100 hits - '->getCountNewComments(' page 7: 100 hits - '->getCountNewComments(' page 8: 100 hits - '->getCountNewComments(' page 9: 100 hits - '->getCountNewComments(' page 10: 100 hits - -Searching for D11 modules for ReplaceEntityOriginalPropertyRector... - '->original' page 1: 100 hits - '->original' page 2: 100 hits - '->original' page 3: 100 hits - '->original' page 4: 100 hits - '->original' page 5: 100 hits - '->original' page 6: 100 hits - '->original' page 7: 100 hits - '->original' page 8: 100 hits - '->original' page 9: 100 hits - '->original' page 10: 100 hits - -Searching for D11 modules for ReplaceLocaleConfigBatchFunctionsRector... - -Searching for D11 modules for ReplaceNodeSetPreviewModeRector... - '->setPreviewMode(' page 1: 100 hits - '->setPreviewMode(' page 2: 100 hits - '->setPreviewMode(' page 3: 100 hits - '->setPreviewMode(' page 4: 100 hits - '->setPreviewMode(' page 5: 100 hits - '->setPreviewMode(' page 6: 100 hits - '->setPreviewMode(' page 7: 100 hits - '->setPreviewMode(' page 8: 100 hits - '->setPreviewMode(' page 9: 100 hits - '->setPreviewMode(' page 10: 100 hits - -Searching for D11 modules for StatementPrefetchIteratorFetchColumnRector... - -Searching for D11 modules for StripMigrationDependenciesExpandArgRector... - '->getMigrationDependencies(' page 1: 100 hits - '->getMigrationDependencies(' page 2: 100 hits - '->getMigrationDependencies(' page 3: 100 hits - '->getMigrationDependencies(' page 4: 100 hits - '->getMigrationDependencies(' page 5: 100 hits - '->getMigrationDependencies(' page 6: 100 hits - '->getMigrationDependencies(' page 7: 100 hits - '->getMigrationDependencies(' page 8: 100 hits - '->getMigrationDependencies(' page 9: 100 hits - '->getMigrationDependencies(' page 10: 100 hits - -Searching for D11 modules for UseEntityTypeHasIntegerIdRector... - '->getEntityTypeIdKeyType(' page 1: 100 hits - '->getEntityTypeIdKeyType(' page 2: 100 hits - '->getEntityTypeIdKeyType(' page 3: 100 hits - '->getEntityTypeIdKeyType(' page 4: 100 hits - '->getEntityTypeIdKeyType(' page 5: 100 hits - '->getEntityTypeIdKeyType(' page 6: 100 hits - '->getEntityTypeIdKeyType(' page 7: 100 hits - '->getEntityTypeIdKeyType(' page 8: 100 hits - '->getEntityTypeIdKeyType(' page 9: 100 hits - '->getEntityTypeIdKeyType(' page 10: 100 hits - '->entityTypeSupportsComments(' page 1: 100 hits - '->entityTypeSupportsComments(' page 2: 100 hits - '->entityTypeSupportsComments(' page 3: 100 hits - '->entityTypeSupportsComments(' page 4: 100 hits - '->entityTypeSupportsComments(' page 5: 100 hits - '->entityTypeSupportsComments(' page 6: 100 hits - '->entityTypeSupportsComments(' page 7: 100 hits - '->entityTypeSupportsComments(' page 8: 100 hits - '->entityTypeSupportsComments(' page 9: 100 hits - '->entityTypeSupportsComments(' page 10: 100 hits - -Searching for D11 modules for ReplaceRebuildThemeDataRector... - '->rebuildThemeData(' page 1: 100 hits - '->rebuildThemeData(' page 2: 100 hits - '->rebuildThemeData(' page 3: 100 hits - '->rebuildThemeData(' page 4: 100 hits - '->rebuildThemeData(' page 5: 100 hits - '->rebuildThemeData(' page 6: 100 hits - '->rebuildThemeData(' page 7: 100 hits - '->rebuildThemeData(' page 8: 100 hits - '->rebuildThemeData(' page 9: 100 hits - '->rebuildThemeData(' page 10: 100 hits - -=== Summary === -FileSystemBasenameToNativeRector: ['project/ejectorseat'] -NodeStorageDeprecatedMethodsRector: ['project/tb_megamenu'] diff --git a/docs/pass2_results.json b/docs/pass2_results.json deleted file mode 100644 index 5632e90db..000000000 --- a/docs/pass2_results.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "FileSystemBasenameToNativeRector": [ - "project/ejectorseat" - ], - "NodeStorageDeprecatedMethodsRector": [ - "project/tb_megamenu" - ] -} diff --git a/docs/plans/2026-05-08-001-fix-rector-test-failures.md b/docs/plans/2026-05-08-001-fix-rector-test-failures.md deleted file mode 100644 index 9ddb9dc04..000000000 --- a/docs/plans/2026-05-08-001-fix-rector-test-failures.md +++ /dev/null @@ -1,151 +0,0 @@ ---- -title: "fix: Rector test failures and missed triggers from rector-test.log analysis" -type: fix -status: active -date: 2026-05-08 ---- - -# fix: Rector test failures and missed triggers from rector-test.log analysis - -## Summary - -Analysis of `rector-test.log` from `drupal-rector-test2` revealed two behavioral failures (rectors that run but do the wrong thing), five rectors that silently produce zero changes against plausible targets, and one rector that runs twice due to set duplication. This plan tracks investigation and fixes for each item. - ---- - -## Problem Frame - -The test log showed no hard PHP errors or test failures, but several rectors have either: -1. **False positives** — they modify code they should not touch -2. **Silent misses** — they match a target module but apply zero changes, suggesting a pattern mismatch in the node visitor - ---- - -## Issue Inventory - -### P1 — Behavioral Failures (rector runs, does wrong thing) - -#### F1: `RemoveModuleHandlerAddModuleCallsRector` — false positive, deletes unrelated method body - -**File affected:** `web/modules/contrib/config_track/src/Extension/ModuleHandler.php` - -**What happens:** The rector is supposed to remove deprecated `addModule()` and `addProfile()` call delegations. It correctly empties those two methods, but it also blanks out the body of `loadAllIncludes()` — a method outside its stated scope. - -**Root cause:** The `config_track` source has a pre-existing bug: `loadAllIncludes()` delegates to `$this->innerModuleHandler->addProfile(...)` instead of the correct method. The rector's node visitor sees an `addProfile()` call and removes it regardless of which method it lives in. - -**Fix needed:** Scope the node visitor to only remove `addProfile()`/`addModule()` calls that are the *sole statement* in methods named `addProfile` or `addModule` (i.e. delegation stubs), not arbitrary calls to those methods elsewhere. - -**Status:** [ ] Investigated [ ] Fixed [ ] Test added - ---- - -#### ~~F2: `ReplaceDateTimeRangeConstantsRector` — name/behavior mismatch~~ CLOSED — not a bug - -The rector deliberately handles two patterns from the same change record ([drupal.org/node/3574901](https://www.drupal.org/node/3574901)): -1. `DateTimeRangeConstantsInterface::BOTH/START_DATE/END_DATE` → `DateTimeRangeDisplayOptions` enum -2. `datetime_type_field_views_data_helper()` → `\Drupal::service('datetime.views_helper')->buildViewsData(...)` - -Both are documented in the docblock and `getRuleDefinition()`. The log showed branch 2 firing on `scheduler_field` because that module uses the function but not the constants. Correct behaviour. Class name is slightly narrow but not incorrect. - ---- - -### P2 — Silent Misses (zero changes on plausible targets) - -#### M1: `RemoveUpdaterPostInstallMethodsRector` — `gnode_request` (28 files), 0 changes - -**Target pattern:** `postInstall()` / `postUpdateFileTransfer()` methods from `UpdaterInterface` - -**Suspicion:** The class hierarchy check (resolving whether a class `implements UpdaterInterface`) may fail in the test Drupal installation if the interface is not autoloadable. The module was specifically matched as a target by the setup script, so the code likely exists. - -**Investigation steps:** -1. Grep `gnode_request` for `UpdaterInterface`, `postInstall`, `postUpdateFileTransfer` -2. Check if the rector's condition requires the class to be resolvable via `instanceof` / reflection - -**Status:** [ ] Investigated [ ] Fixed [ ] Test added - ---- - -#### ~~M2: `ReplaceCommentManagerGetCountNewCommentsRector` — `history` (23 files), 0 changes~~ CLOSED — true negative - -The rector requires the receiver to be typed as `Drupal\comment\CommentManagerInterface`. Every `getCountNewComments()` call in `history` is already on `HistoryManager` (the new API) — the module has fully migrated. No usage of the deprecated `CommentManagerInterface::getCountNewComments()` exists anywhere in the test environment. - -The setup script hardcoded `history` as the target, but `history` *provides* the new API — it wouldn't call the old one on `CommentManagerInterface`. A better test target would be a contrib module that still injects `CommentManagerInterface` and calls `->getCountNewComments()`. This deprecation landed in 11.3.0 so no such module may exist in the wild yet. - -**Action:** Add a comment to the setup script explaining that no suitable contrib target was found for this rector. - ---- - -#### M3: `ReplaceEditorLoadRector` — `ckeditor5_premium_features` (282 files), 0 changes - -**Target pattern:** `editor_load()` function calls - -**Suspicion:** `ckeditor5_premium_features` may use the entity storage API (`\Drupal::entityTypeManager()->getStorage('editor')->load(...)`) instead of the procedural `editor_load()`. That would be correct modern code and a true negative. Alternatively the setup script matched this module incorrectly. - -**Investigation steps:** -1. Grep `ckeditor5_premium_features` for `editor_load` -2. If not found, verify the setup script's matching logic for this rector - -**Status:** [ ] Investigated [ ] Fixed [ ] Test added - ---- - -#### ~~M4: `ReplaceSessionManagerDeleteRector` — `role_expire` (15 files), 0 changes~~ FIXED - -**Root cause:** The rector checked `ObjectType('Drupal\Core\Session\SessionManager')` (the concrete class). `role_expire` injects `SessionManagerInterface` and calls `->delete()` on it. PHPStan cannot resolve the subtype relationship without stubs, so the check failed. - -**Fix:** -- Changed `ObjectType` to `SessionManagerInterface` in the rector -- Added PHPStan stubs for `SessionManagerInterface` and `SessionManager` (with `implements SessionManagerInterface`) so the type hierarchy resolves correctly for both concrete and interface-typed variables -- Converted `no_change_interface.php.inc` → `interface_variable.php.inc` (now a positive fixture) -- Added `interface_property.php.inc` for the injected class property pattern - -**Status:** [x] Investigated [x] Fixed [x] Test added - ---- - -#### M5: `StripMigrationDependenciesExpandArgRector` — `migrate_tools` (45 files), 0 changes - -**Target pattern:** `$expand` argument in `MigrationPluginManager::createInstances()` or similar - -**Suspicion:** Either the argument has already been removed in the installed version of `migrate_tools`, or the rector's argument-position check is off-by-one. - -**Investigation steps:** -1. Grep `migrate_tools` for `createInstances` -2. Check the rector's expected method signature against what the module actually calls - -**Status:** [ ] Investigated [ ] Fixed [ ] Test added - ---- - -### P3 — Set Duplication (low priority) - -#### D1: `ReplaceModuleHandlerGetNameRector` runs twice against `mailsystem` - -**What happens:** The rector appears at log line ~722 and again at ~1297, scanning the same 16 files and producing identical diffs both times. - -**Root cause:** The rector class is registered in two different rector sets (e.g. a Drupal 10 set and a generic/all set). - -**Risk:** On a real (non-dry-run) run, the second pass would be a no-op since the first pass already applied the change. But it wastes time and is confusing. - -**Fix needed:** Audit rector set definitions for duplicate class registrations. Remove the duplicate. - -**Status:** [ ] Investigated [ ] Fixed - ---- - -## Work Order - -1. ~~**F1**~~ — `RemoveModuleHandlerAddModuleCallsRector` — CLOSED (rector correct, config_track has pre-existing bug) -2. ~~**F2**~~ — `ReplaceDateTimeRangeConstantsRector` — CLOSED (handles two patterns by design) -3. ~~**M2**~~ — `ReplaceCommentManagerGetCountNewCommentsRector` — CLOSED (true negative, history already migrated to new API) -4. ~~**M4**~~ — `ReplaceSessionManagerDeleteRector` — FIXED (now matches `SessionManagerInterface`-typed variables) -5. **M1** — `RemoveUpdaterPostInstallMethodsRector` interface resolution -6. **M3** — `ReplaceEditorLoadRector` true negative vs setup-script mismatch -7. **M5** — `StripMigrationDependenciesExpandArgRector` argument position -8. **D1** — Duplicate set registration for `ReplaceModuleHandlerGetNameRector` - ---- - -## Out of Scope - -- 20 rectors skipped due to missing modules in the test environment — expected gaps, not failures. diff --git a/docs/plans/no-match-investigation.md b/docs/plans/no-match-investigation.md deleted file mode 100644 index 48d8a6d8c..000000000 --- a/docs/plans/no-match-investigation.md +++ /dev/null @@ -1,164 +0,0 @@ -# No-match investigation - -Rectors that ran against installed modules but made zero changes. Per rector: check whether the -installed module(s) actually contain the deprecated pattern, and if so figure out why the rector -didn't match it. - -## How to investigate - -1. **Search contrib first** at https://search.tresbien.tech — use `-r:core` to exclude core. - Confirm the pattern actually exists in contrib before installing anything locally. - If 0 results: document as "pattern exhausted" and skip the test run entry. -2. Find the deprecated usage in the installed module source (grep for the old API/pattern). -3. If the usage exists but rector doesn't fire, run rector in debug mode and trace why the node visitor didn't fire. -4. Common culprits: wrong node type check, type mismatch, fully-qualified vs imported class name, - pattern too narrow (e.g. only matches method calls, not static calls or vice versa), - version drift (module already patched in installed release — check an older version or find another module). - ---- - -## Suspicious — started but no completion (possible crash or timeout) - -- [ ] `RemoveTrustDataCallRector` — modules: views_dependent_filters, group (progress bar showed `0/6` then nothing) -- [ ] `RemoveUpdaterPostInstallMethodsRector` — modules: group, gnode_request (progress bar showed `0/5` then nothing) - ---- - -## Ran cleanly — zero files changed - -- [x] `FileSystemBasenameToNativeRector` — modules: ejectorseat - - **Rector is correct.** Installed ejectorseat has zero `basename()` calls anywhere. - - **Root cause: wrong module.** ejectorseat is a session/autologout module — it has never had any file system calls in any version or branch. The original GitLab search hit was a false positive. - - **Fixed:** Replaced with `stage_file_proxy ^3.1` — confirmed caller at `src/DownloadManager.php:76`: `$this->fileSystem->basename($relative_path)`. D11-compatible (`^10.3 || ^11`), present through 3.1.6. Pinned to `^3.1` to guard against a future 4.x that removes the call. -- [x] `LoadAllIncludesRector` — modules: config_track, schemadotorg - - Pattern **exists** in schemadotorg at `SchemaDotOrgStarterkitConverter.php:430`: `$this->moduleHandler->loadAllIncludes('install')` - - config_track only has a definition/override of the method, no calls. - - **Root cause: missing type declaration.** Tests confirm the rector handles both promoted properties and traditional `@var`-annotated properties correctly (fixtures `class_property.php.inc`, `traditional_constructor.php.inc`). The schemadotorg property likely has no `@var` annotation and no PHP-native type, so PHPStan cannot infer `ModuleHandlerInterface`. Documented via `no_change_class_property_untyped.php.inc`. - - → No rector fix needed. The schemadotorg module needs to add a `@var \Drupal\Core\Extension\ModuleHandlerInterface` annotation to its `$moduleHandler` property. -- [x] `MigrateSqlGetMigrationPluginManagerRector` — modules: migmag, smart_sql_idmap - - Pattern **exists** in both modules but rector logic was too narrow: - - `migmag`: call is inside a trait; `$this` resolves to the test class, not `Sql` → type check fails (still unresolved) - - `smart_sql_idmap`: uses `parent::getMigrationPluginManager()` — rector only handled `$this->` calls, not `parent::` (StaticCall) - - **Fixed** (commit `149d6b3d`): added `StaticCall` to `getNodeTypes()` and a `refactorStaticCall()` handler that matches `parent::getMigrationPluginManager()` → `$this->migrationPluginManager`. Test fixture `parent_call.php.inc` added. - - → Trait case remains unresolved (type inference limitation). -- [x] `NodeStorageDeprecatedMethodsRector` — modules: tb_megamenu - - Pattern **not present**. tb_megamenu is a menu/block module with zero Node entity handling. Never imports `NodeStorageInterface`. - - **Fixed:** Updated to `workflow_buttons:^1` — 8.x-1.x calls `$node_storage->revisionIds($variables['node'])` in `workflow_buttons.module` with `@var \Drupal\node\NodeStorage`. D11-compatible (`^9 || ^10 || ^11`). Pinned to `^1` because 2.0.x already migrated. -- [x] `PluginBaseIsConfigurableRector` — modules: metatag, search_api - - Pattern **exists** in metatag at `metatag_views/src/MetatagViewsCacheWrapper.php:374`: `$this->plugin->isConfigurable()` - - **Root cause: rector logic too narrow.** Rector only matches direct `$this->isConfigurable()` where `$this` is `PluginBase`. Delegated calls (`$this->plugin->isConfigurable()`) fail the `$node->var->name !== 'this'` check. - - → **Rector limitation**: would need to also resolve property types to catch delegated calls. Document as known limitation or extend rector. -- [x] `RemoveModuleHandlerAddModuleCallsRector` — modules: acquia_contenthub, sdx - - Pattern **not present** in acquia_contenthub or sdx. - - Pattern **does exist** in `config_track/src/Extension/ModuleHandler.php:178,185,206` — but config_track was not in the test run for this rector (it was assigned to LoadAllIncludesRector instead). - - **Fixed:** Updated test assignment to `config_track`. Rector is correct and would fire (property is `@var ModuleHandlerInterface`). -- [x] `RemoveModuleHandlerDeprecatedMethodsRector` — modules: captcha, jsonld - - Pattern **not present** in either module. jsonld has a local `writeCache()` method but it's not on `ModuleHandlerInterface`. - - **Root cause: pattern exhausted.** Neither module uses `ModuleHandlerInterface::writeCache()` or `getHookInfo()`. Web search of D11 contrib found no caller. Module removed from test run (no replacement found). -- [x] `RemoveSetUriCallbackRector` — modules: rabbit_hole_href - - Pattern **not present**. rabbit_hole_href is a redirect-behavior plugin with no entity-type definition code. - - **Root cause: pattern exhausted.** Web search of D11 contrib found no `setUriCallback()` caller. Module removed from test run (no replacement found). - -- [x] `RemoveStateCacheSettingRector` — modules: searchstax, sdx - - Pattern **not present** (`$settings['state_cache']`) in either module or anywhere in contrib. - - **Root cause: pattern exhausted.** Confirmed gone from all D11 contrib. Module removed from test run. - -- [x] `RemoveTwigNodeTransTagArgumentRector` — modules: searchstax - - Pattern **not present** anywhere in contrib. `TwigNodeTrans` is a core class and the 6-arg constructor was already removed in the installed Drupal version. - - **Root cause: version drift.** Core removed the 6-arg constructor before any D11 contrib module could call it. Module removed from test run. - -- [x] `ReplaceAlphadecimalToIntNullRector` — modules: comment_mover - - Pattern **exists** in comment_mover at `CommentMover.php:73,109`: `Number::alphadecimalToInt($max)` / `Number::alphadecimalToInt($levels[$last])`. - - Root cause: **rector too narrow**. Rector only replaces calls where the argument is a literal `null` or `''`. Real-world calls pass runtime variables, which the rector skips. - - **Confirmed pattern exhausted** (search.tresbien.tech): 0 results across all contrib for `alphadecimalToInt(null)` or `alphadecimalToInt('')`. The literal-null/empty-string edge case never appeared in contrib — only custom code or core tests. - - **Fixed:** Removed `comment_mover` from test run. Added to "pattern exhausted" list. - -- [x] `ReplaceCommentManagerGetCountNewCommentsRector` — modules: forum, history - - Pattern **exists** in forum at `ForumManager.php:247`: `$this->commentManager->getCountNewComments($topic, 'comment_forum', $history)`. - - **Root cause: missing type annotation, not traditional assignment.** Tests confirm the rector handles `@var`-annotated traditional constructor assignment correctly (fixture `traditional_constructor.php.inc`). PHPStan reads `@var` docblocks on properties reliably. The forum `$commentManager` property likely has no `@var` or PHP-native type declaration. - - → No rector fix needed. Forum's `ForumManager::$commentManager` needs a `@var \Drupal\comment\CommentManagerInterface` annotation (or typed property) for the rector to fire. - -- [x] `ReplaceDateTimeRangeConstantsRector` — modules: deprecation_status → optional_end_date - - Pattern **not present** (`DateTimeRangeConstantsInterface::BOTH` etc.) in deprecation_status or any installed module. - - Previous fix (optional_end_date) hit version drift: the search index confirmed `DateTimeRangeConstantsInterface::BOTH` at `OptionalEndDateDateTimeRangeTrait.php:29`, but installed 8.x-1.4 has already migrated to the new enum. Pattern still present in the search index (not all branches updated). - - For `datetime_type_field_views_data_helper()`: confirmed in `scheduler_field` (calls it twice for field columns, D11-compatible `^8||^9||^10||^11`), plus quiz, civicrm_entity, computed_token_field, optional_end_month_year_range. - - **Fixed:** Added `scheduler_field` as second test module. Retained `optional_end_date` in case a future install picks up an unpatched version. - -- [x] `ReplaceEditorLoadRector` — modules: acquia_contenthub, ckeditor5_plugin_pack - - Pattern **not present** (`editor_load()` function call) in either module or anywhere in contrib. - - **Root cause: pattern exhausted.** Not called in any D11 contrib module found. Module removed from test run. - -- [x] `ReplaceFieldgroupToFieldsetRector` — modules: field_group_vertical_tabs, ui_patterns_settings - - Pattern **not present** in assigned modules. - - Pattern **found** in `webform` at `WebformEntityReferenceWidgetTrait.php:150`: `'#type' => 'fieldgroup'`. - - **Fixed:** Updated test assignment to `webform`. Rector is correct and would fire. - -- [x] `ReplaceFileGetContentHeadersRector` — modules: commerce_invoice, tmgmt - - Pattern **exists** in both: - - `commerce_invoice/Controller/InvoiceController.php:142` (`.php` file) — should be scanned - - `tmgmt_file/tmgmt_file.module:130` (`.module` file) — **excluded by default** (Rector only scans `.php` extensions) - - Root cause: **`.module` files excluded**. Rector's default `fileExtensions = ['php']` skips `.module` files entirely. The `.php` file in commerce_invoice should have been matched but wasn't — needs deeper investigation. - - → Add `'module'` to `fileExtensions` in rector config. Separately investigate why InvoiceController.php didn't fire. - -- [x] `ReplaceModuleHandlerGetNameRector` — modules: drd, reassign_user_content - - Pattern **not present** in drd or reassign_user_content. - - Pattern found in `group` module but already migrated (uses `ModuleExtensionList`, not `ModuleHandlerInterface`). - - **Fixed:** Updated test assignment to `mailsystem` — confirmed caller at `src/Form/AdminForm.php:206,211` (`$this->moduleHandler->getName($module)`), issue #3566556 active as of Jan 2026. - -- [x] `ReplaceNodeAccessViewAllNodesRector` — modules: view_usernames_node_author - - Pattern **not present** as executable code (only a `@see` docblock reference in a test file). - - **Root cause: pattern not yet present in contrib.** `node_access_view_all_nodes()` was only deprecated in D11.3.0 (late 2025); no D11 contrib caller found. Module removed from test run. - -- [x] `ReplaceNodeModuleProceduralFunctionsRector` — modules: reassign_user_content, addanother - - Pattern **exists**: - - `reassign_user_content.module:111` and `Form/AssignAuthorForm.php:98`: `node_mass_update()` - - `addanother.module:151,174`: `node_get_type_label($node)` - - Root cause: **type inference failure + `.module` file scope**. Calls in `.module` files are likely skipped (see `ReplaceFileGetContentHeadersRector`). For `AssignAuthorForm.php:98`, `$nids` is untyped mixed. For `addanother.module:174`, `$node` IS typed as `NodeInterface` but is in a `.module` file. - - → Enable `.module` file scanning. Then verify type inference for procedural function calls works — these functions may not require type checks (plain `FuncCall` nodes), in which case `.module` exclusion is the only blocker. - -- [x] `ReplaceRecipeRunnerInstallModuleRector` — modules: schemadotorg - - Pattern **not present** (schemadotorg uses `RecipeRunner::processRecipe()`, not the deprecated `installModule()`). - - **Updated:** Replaced with `recipe_installer_kit` (primary contrib recipe-wrapping module, deprecated D11.4.0). Needs verification in live test run. - -- [x] `ReplaceSessionManagerDeleteRector` — modules: entity_visibility_preview, session_inspector → role_expire - - Pattern **not present** with the required type in either original module. entity_visibility_preview has its own unrelated `SessionManager` service; session_inspector uses a raw DB delete. Both use the interface, not the concrete class. - - **Found via search.tresbien.tech**: `role_expire/src/RoleExpireApiService.php` declares `@var Drupal\Core\Session\SessionManager` on its `$sessionManager` property (concrete class) and calls `$this->sessionManager->delete($uid)`. D11-compatible (`^10.2||^11`). - - **Updated:** Replaced both modules with `role_expire`. The `@var` annotation naming the concrete class satisfies the rector's `isObjectType(SessionManager)` check. - - **Still NO_CHANGES** — blocked by version gate. `AbstractDrupalCoreRector::rectorShouldApplyToDrupalVersion()` compares `Drupal::VERSION` against the rector's `DrupalIntroducedVersionConfiguration('11.4.0')`. Test site runs Drupal 11.3.9. `SessionManager::delete()` was deprecated in Drupal 11.4.0 which has not been released yet (latest stable: 11.3.x). - - **Status:** `role_expire` is the correct test module. Re-enable in the test script once the test site is upgraded to Drupal 11.4.0+. - -- [x] `ReplaceSessionWritesWithRequestSessionRector` — modules: drd, entity_visibility_preview - - Pattern **not present** (`$_SESSION[...] = ...` writes) in either module. - - **Root cause: pattern exhausted.** Direct `$_SESSION` writes gone from all D11-compatible contrib found (openid_connect fixed in 2021). Module removed from test run. - -- [x] `ReplaceSystemPerformanceGzipKeyRector` — modules: drd - - Pattern **not present** (`system.performance` config keys `css.gzip`/`js.gzip`). drd_agent uses `css.preprocess`/`js.preprocess` (different, non-deprecated keys). - - **Root cause: no D11-compatible module.** advagg (5.x/6.0.0-alpha1) confirmed has the pattern at `src/Form/SettingsForm.php`, but declares `core_version_requirement: ^9.3 || ^10` — won't install against D11. Module removed from test run. - -- [x] `ReplaceUserSessionNamePropertyRector` — modules: acquia_contenthub, session_inspector - - Pattern **not present** (`$userSession->name` property access) in either module. - - **Root cause: pattern exhausted.** `->name` property access on `UserSession` objects gone from all D11-compatible contrib found (broke in Drupal 8). Module removed from test run. - -- [x] `ViewsPluginHandlerManagerRector` — modules: searchstax, search_api, metatag - - Pattern **exists** in search_api at `SearchApiEntityField.php:51-52`: `Views::handlerManager('field')->getHandler(...)`. - - Root cause: initial analysis was wrong — chained calls work fine because PHP-Parser walks the inner `StaticCall` regardless of what wraps it. - - **Verified working** (commit `6bc5f86b`): test fixture `chained_call.php.inc` added and passes. Zero-changes in test run was likely due to `.module` file exclusion or version drift, not a rector bug. - - → No rector change needed. - -- [x] `ReplaceRebuildThemeDataRector` — modules: site_guardian - - Pattern **exists** in site_guardian: - - `site_guardian.module:37`: `\Drupal::service('theme_handler')->rebuildThemeData()` — `\Drupal::service()` returns untyped `object`, PHPStan cannot infer `ThemeHandlerInterface`. - - `SiteGuardianService.php:153`: `$this->themeHandler->rebuildThemeData()` — property typed as concrete `ThemeHandler` class, not the interface. - - **Root cause confirmed as known limitation.** (1) `\Drupal::service()` is untyped — cannot be fixed without PHPStan service map stubs. (2) Concrete `ThemeHandler` class: without Drupal's full class hierarchy loaded in analysis, PHPStan cannot confirm it implements `ThemeHandlerInterface` — documented via `no_change_concrete_class.php.inc`. The rector works correctly when the property is declared as `ThemeHandlerInterface` (fixture `class_property.php.inc`). - - → No rector fix needed. Users must declare `$themeHandler` as `ThemeHandlerInterface` for the rector to fire. The `\Drupal::service()` call is an unfixable limitation. - -- [x] `ReplaceRequestTimeConstantRector` — modules: google_analytics_counter, automatic_updates - - Pattern **not present** (no bare `REQUEST_TIME` constant usage). Modules already use `$request->server->get('REQUEST_TIME')`. - - **Root cause: pattern exhausted.** Already migrated in all D11-compatible modules found. Module removed from test run. - -- [x] `SystemTimeZonesRector` — modules: intl_date, smart_date - - Pattern **exists** in both: - - `intl_date:122`: `system_time_zones(FALSE, TRUE)` (literal args — should match, didn't fire, likely because it's already inside a `DeprecationHelper::backwardsCompatibleCall` arrow function — the `isInBackwardsCompatibleCall()` guard skips it correctly) - - `smart_date:166,175`: `system_time_zones(FALSE, $grouped)` (variable 2nd arg — rector was too narrow) - - **Fixed** (commit `6bc5f86b`): added a ternary branch for when the second arg is dynamic (not a literal `FALSE`). Emits `$grouped ? getOptionsListByRegion($arg0) : getOptionsList($arg0)` instead of silently dropping the flag. Test fixture `system_time_zones_dynamic_grouped.php.inc` added. - - → intl_date case is expected no-op (already BC-wrapped). smart_date case now handled. diff --git a/docs/rector-qa-checklist.md b/docs/rector-qa-checklist.md deleted file mode 100644 index 5598820b5..000000000 --- a/docs/rector-qa-checklist.md +++ /dev/null @@ -1,864 +0,0 @@ -# Rector QA Checklist - -**Next:** *(all checklist rectors complete)* - - -Living checklist for every rector added in the `main-bbrala` branch. Each rector gets three tasks: **Analyze**, **Coverage**, and **Edge cases**. Work through them iteratively — check a box when it is done. - ---- - -## How to do each task - -### Analyze - -Goal: confirm the rector fully implements the deprecation described in the change record and matches the intended behaviour in the drupal-digest source. - -Steps: -1. Read the rector source at the `src/` path listed under the rector. -2. Open the drupal-digest source file listed (in the local `drupal-digests` repo at `rector/rules/`). -3. Read the actual deprecated and replacement code from the local Drupal core clone at `~/projects/drupal-core` (11.x). Prefer this over fetching drupal.org URLs — the source is authoritative and faster. -4. Fetch the change record URL if additional context is needed (e.g. the CR lists multiple deprecated items not obvious from the source). -5. Answer these questions: - - Are all deprecated items (methods, constants, properties, functions) from the change record handled by the rector? - - Does the drupal-digest version handle anything the drupal-rector version does not (extra guards, additional node types, `self::`/`static::` variants, etc.)? - - Does the change record describe a read *and* a write side (e.g. getter + setter), and does the rector handle both? - - Is the deprecation warning documented correctly in the rector's docblock (`@see` URL, version, removal version)? -5. Write down the gaps found as notes under the task checkbox. - -### Coverage - -Goal: ensure the test fixture exercises every transformation that the change record describes. - -Steps: -1. Read the existing fixture at `tests/src/.../fixture/basic.php.inc`. -2. Compare it against the before/after examples in the change record. -3. For each transformation variant in the change record that is missing from the fixture, add it. -4. Add fixture entries as new before/after pairs separated by `-----` if the test runner supports multiple pairs, or create a second fixture file (e.g. `extended.php.inc`) and wire it up in the test class. -5. Run `./vendor/bin/phpunit tests/src/.../RectorTest.php` to confirm all pass. - -### Edge cases - -Goal: harden the rector against inputs it should transform but currently does not, and inputs it should *not* transform but might accidentally change. - -Common edge cases to check for every rector: -- **`self::`/`static::`/`parent::` class constant references** — does the rector handle them when used inside a subclass? -- **Aliased imports** — `use Foo\Bar as Baz; Baz::CONST` — does the rector still match? -- **Receiver typed as a concrete class instead of an interface** — e.g. `NodeStorage` vs `NodeStorageInterface`. -- **Return value used in a fluent chain** — does the replacement expression fit correctly? -- **Return value unused / used as a statement** — the rector should handle both. -- **Named arguments** — does the rector skip or handle `func(arg: $val)`? -- **Multiple calls on the same line/expression** — no double-transform. -- **Nodes the rector should NOT touch** — unrelated methods/functions/classes with the same name but different type/context. - -For each edge case found, add a fixture pair and confirm the test still passes. - -### Finishing a rector - -When all three tasks for a rector are checked off, update the `**Next:**` line at the very top of this file to point to the next rector that still has unchecked tasks. Use the rector's section heading as the anchor (lowercase, spaces replaced with hyphens, no special characters). - ---- - -## Drupal 10 Rectors - -### ReplaceModuleHandlerGetNameRector -- Source: `src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector.php` -- Test: `tests/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector/` -- Drupal-digest: `replace-removed-modulehandlerinterface-getname-with-3571063.php` -- Change record: https://www.drupal.org/node/3310017 (the `@see` in the rector points to the issue node/3571063; the actual change record is node/3310017) - -Tasks: -- [x] **Analyze** — gaps found: - - `@see` in rector docblock points to the issue (node/3571063), not the change record (node/3310017) — minor, both are valid references - - Drupal-digest does a direct replacement; our rector wraps in `DeprecationHelper::backwardsCompatibleCall` via `AbstractDrupalCoreRector` — correct and intentional - - Only one deprecated method (`getName`) — full API coverage matches the change record; no other items missing - - Existing fixture only covered annotated local variable form; class property form was missing -- [x] **Coverage** — added `fixture/class_property.php.inc`: `$this->moduleHandler->getName($module)` in a class with typed constructor property → BC-wrapped output; all 3 tests pass -- [x] **Edge cases** — added `fixture/no_change_unrelated.php.inc`: `getName()` on an `UnrelatedManager` typed variable → correctly not transformed; confirmed by test pass - ---- - -### ReplaceRebuildThemeDataRector -- Source: `src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector.php` -- Test: `tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/` -- Drupal-digest: `replace-removed-themehandlerinterface-rebuildthemedata-with-3571068.php` -- Change record: https://www.drupal.org/node/3413196 (the `@see` in the rector points to the issue node/3571068; the actual change record is node/3413196) - -Tasks: -- [x] **Analyze** — gaps found: - - `@see` in rector docblock points to the issue (node/3571068), not the change record (node/3413196) - - **No type guard** — neither our rector nor the drupal-digest version checks `isObjectType(ThemeHandlerInterface)`; any `rebuildThemeData()` call with no args on any object is transformed. Low collision risk given the specific method name, but worth noting. - - Drupal-digest does direct replacement; our rector uses BC wrapping via `AbstractDrupalCoreRector` — correct and intentional - - Only one deprecated method — full API coverage matches the change record -- [x] **Coverage** — added `fixture/class_property.php.inc`: `$this->themeHandler->rebuildThemeData()` in a class with typed constructor property → BC-wrapped output; all 3 tests pass -- [x] **Edge cases** — added `fixture/no_change_with_args.php.inc`: `rebuildThemeData($extra)` with an argument → correctly not transformed by the `!empty($node->args)` guard. Note: no test for unrelated class because there is no type guard — such a call *would* be (incorrectly) transformed; documented above as a known gap. - ---- - -### ReplaceRequestTimeConstantRector -- Source: `src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector.php` -- Test: `tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/` -- Drupal-digest: `replace-deprecated-request-time-constant-with-drupal-time-3395986.php` -- Change record: https://www.drupal.org/node/3395986 - -Tasks: -- [x] **Analyze** — gaps found: - - Rector and drupal-digest are identical in logic — both target `ConstFetch` nodes named `REQUEST_TIME` and replace with `\Drupal::time()->getRequestTime()` - - The `@see` URL (node/3395986) is the same reference used in the drupal-digest source — consistent - - Docblock version ("deprecated drupal:8.3.0, removed drupal:11.0.0") is correct - - No gaps: only one deprecated item (`REQUEST_TIME`), fully handled -- [x] **Coverage** — added `fixture/in_function_call.php.inc`: `REQUEST_TIME` as function argument, array value, and in string concatenation — all transformed; 3 tests pass -- [x] **Edge cases** — added `fixture/no_change_string_literal.php.inc`: string literals `'REQUEST_TIME'` and `"REQUEST_TIME"` (String_ nodes, not ConstFetch) — correctly not transformed; confirmed by test pass - ---- - -## Drupal 11 Rectors - -### ErrorCurrentErrorHandlerRector -- Source: `src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/` -- Drupal-digest: `replace-error-currenterrorhandler-with-get-error-handler-3526515.php` -- Change record: https://www.drupal.org/node/3526515 - -Tasks: -- [x] **Analyze** — gaps found: - - `@see` in rector and digest reference `node/3526515` (the issue); the actual deprecation notice in `core/lib/Drupal/Core/Utility/Error.php:221` says `node/3529500` — minor discrepancy, both point to the same change - - Rector and digest are identical in logic; one deprecated item (`currentErrorHandler`), fully handled - - `isObjectType(ObjectType('Drupal\Core\Utility\Error'))` type guard correctly excludes unrelated classes - - Basic fixture already covers: FQCN form, result-assigned-to-variable, `OtherClass::` negative case -- [x] **Coverage** — basic fixture already covered all change-record variants (single method, single replacement); no additions needed -- [x] **Edge cases** — added `fixture/as_argument.php.inc`: result used as function argument and in boolean expression (via `use` import short-name form); both transformed correctly; 2 tests pass - ---- - -### FileSystemBasenameToNativeRector -- Source: `src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/` -- Drupal-digest: `replace-filesysteminterface-basename-with-native-basename-3530461.php` -- Change record: https://www.drupal.org/node/3530461 - -Tasks: -- [x] **Analyze** — gaps found: - - `@see` in rector and digest reference `node/3530461` (the issue); actual deprecation in `FileSystemInterface.php` and `FileSystem.php` says `node/3530869` — same discrepancy pattern as previous rectors - - Our rector uses Rector's `isObjectType()` helper (catches any implementor of `FileSystemInterface`); digest uses `isSuperTypeOf()` (exact type match only — our rector is stronger) - - Both deprecated locations handled: `FileSystemInterface::basename()` and `FileSystem::basename()` (via the two-class loop) - - No other deprecated items in this change record -- [x] **Coverage** — added `fixture/no_suffix.php.inc`: one-argument call (no `$suffix`) → `basename($uri)`; 3 tests pass -- [x] **Edge cases** — added `fixture/concrete_class.php.inc`: receiver typed as concrete `\Drupal\Core\File\FileSystem` → transformed; unrelated `$untyped->basename()` already covered as no-change in `basic.php.inc`; 3 tests pass - ---- - -### LoadAllIncludesRector -- Source: `src/Drupal11/Rector/Deprecation/LoadAllIncludesRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector/` -- Drupal-digest: `replace-deprecated-modulehandler-loadallincludes-with-3536431.php` -- Change record: https://www.drupal.org/node/3536431 - -Tasks: -- [x] **Analyze** — gaps found: - - `@see` references `node/3536431` (issue); core deprecation notice says `node/3536432` (CR) — same discrepancy pattern - - **No type guard** — neither rector nor digest checks `isObjectType(ModuleHandlerInterface)`; any `loadAllIncludes()` call on any receiver is transformed (same known gap as `ReplaceRebuildThemeDataRector`) - - Rector and digest are otherwise identical in logic; both variants (one-arg, two-arg) handled correctly -- [x] **Coverage** — basic fixture already covers one-arg and two-arg forms with `$this->moduleHandler`; added `fixture/drupal_module_handler.php.inc` for `\Drupal::moduleHandler()` chained receiver -- [x] **Edge cases** — `\Drupal::moduleHandler()` chained receiver works correctly (cloned StaticCall used in both inner calls); no no-change fixture possible — no type guard means any `loadAllIncludes()` is transformed; documented as known gap above; 2 tests pass - ---- - -### MigrateSqlGetMigrationPluginManagerRector -- Source: `src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/` -- Drupal-digest: `replace-deprecated-sql-getmigrationpluginmanager-with-3439369.php` -- Change record: https://www.drupal.org/node/3439369 - -Tasks: -- [x] **Analyze** — gaps found: - - `@see` in rector: `node/3439369`; digest references `node/3277306` — different nodes; node/3439369 is the change record used in the rector - - Method removed from `Sql.php` in drupal:11.0.0 — confirmed absent from 11.x core - - Rector restricts to `$this->...` only (protected method pattern) — `$other->getMigrationPluginManager()` correctly not matched - - Static `Migration::getMigrationPluginManager()` is a `StaticCall` node; rector only handles `MethodCall` — naturally excluded - - `isObjectType(ObjectType('Drupal\migrate\Plugin\Migration'))` exclusion guard correct but **untestable in this repo** — `drupal/migrate` not in vendor -- [x] **Coverage** — `$this` form already in basic fixture; added `fixture/chain_result.php.inc`: result used in method chain (`->createInstances()`); 2 tests pass -- [x] **Edge cases** — `$other->getMigrationPluginManager()` not matched (var !== `$this`); static call naturally excluded (StaticCall node); Migration subclass exclusion guard correct but not fixture-testable (drupal/migrate not in vendor — documented above) - ---- - -### NodeStorageDeprecatedMethodsRector -- Source: `src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector/` -- Drupal-digest: `replace-deprecated-nodestorage-revisionids-and-3396062.php` -- Change record: https://www.drupal.org/node/3519187 - -Tasks: -- [x] **Analyze** — gaps found: - - `@see` in rector: `node/3396062` (issue); actual change record is `node/3519187` — confirmed in `NodeStorage.php` deprecation notices - - All three deprecated methods confirmed in `NodeStorageInterface`: `revisionIds`, `userRevisionIds`, `countDefaultLanguageRevisions` (all deprecated in drupal:11.3.0, removed in drupal:13.0.0) - - **Gap fixed**: `countDefaultLanguageRevisions` (no replacement) was not handled — added statement-level removal using `NodeVisitor::REMOVE_NODE` -- [x] **Coverage** — added `fixture/count_default_language_revisions.php.inc`: statement removed, surrounding code preserved; added `fixture/foreach_usage.php.inc`: `revisionIds()` result used in `foreach` loop; 3 tests pass -- [x] **Edge cases** — argument as method call (`$this->getNode()`) handled correctly by `$node->args[0]` extraction; both methods in same block covered by basic fixture; receiver typed as concrete `NodeStorage` not fixture-testable (drupal/node not in vendor) but type guard is interface-based so any `NodeStorageInterface` implementor matches - ---- - -### PluginBaseIsConfigurableRector -- Source: `src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/` -- Drupal-digest: `replace-deprecated-pluginbase-isconfigurable-with-3459533.php` -- Change record: https://www.drupal.org/node/3459533 - -Tasks: -- [x] **Analyze** — gaps found: - - `@see` in rector: `node/3459533`; digest references `node/3198285` — different nodes - - `isConfigurable()` absent from `PluginBase.php` in 11.x — confirmed removed - - Rector intentionally restricts to `$this->isConfigurable()` only — avoids false positives on `CKEditor5PluginDefinition`, `Action`, etc. which have own `isConfigurable()` with different semantics (documented in digest) - - No other deprecated items in this change record -- [x] **Coverage** — basic fixture covers if-condition; added `fixture/negated.php.inc`: `!$this->isConfigurable()` and `return $this->isConfigurable()` — both correctly transformed; 3 tests pass -- [x] **Edge cases** — added `fixture/no_change_other_variable.php.inc`: `$plugin->isConfigurable()` on non-`$this` var → correctly not transformed; `$this->...` within any class body is transformed (no type guard by design — documented above); 3 tests pass - ---- - -### RemoveAutomatedCronSubmitHandlerRector -- Source: `src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector/` -- Drupal-digest: `remove-deprecated-automated-cron-settings-submit-calls-and-3566768.php` -- Change record: https://www.drupal.org/node/3566768 - -Tasks: -- [x] **Analyze** — gaps found: - - `@see` in rector: `node/3566768` (issue); actual deprecation in `automated_cron.module` says `node/3566774` (CR) — same discrepancy pattern - - Digest handles the `$form['#submit'][]` assignment only; direct function call `automated_cron_settings_submit(...)` is handled via `FunctionCallRemovalRector` config entry in `config/drupal-11/drupal-11.4-deprecations.php` — both removal paths are covered - - Rector and digest logic are identical for the assignment case -- [x] **Coverage** — basic fixture already covers: array-append removal and different-value no-change; function call removal tested via `FunctionCallRemovalRector` (separate rector/test) -- [x] **Edge cases** — added `fixture/no_change_explicit_index.php.inc`: `$form['#submit'][0] = 'automated_cron_settings_submit'` (explicit index → `dim !== null` guard correctly prevents removal); 2 tests pass - ---- - -### RemoveCacheExpireOverrideRector -- Source: `src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/` -- Drupal-digest: `remove-deprecated-cacheexpire-overrides-from-views-3576556.php` -- Change record: https://www.drupal.org/node/3576556 - -Tasks: -- [x] **Analyze** — gaps found: - - Rector and drupal-digest are functionally identical in logic (both remove `cacheExpire()` from `CachePluginBase` subclasses) - - Drupal-digest uses `$objectType->isSuperTypeOf($extendsType)->yes()` for the PHPStan fallback; rector uses `$this->isObjectType($node->extends, ...)` — different APIs but same intent - - `@see` URL (`node/3576556`), deprecation version (`drupal:11.4.0`), and removal version (`drupal:13.0.0`) are all correct - - `PARENT_SHORT_NAMES` includes all four known short-name subclasses: `CachePluginBase`, `Time`, `Tag`, `None` — full coverage - - Only one deprecated item (`cacheExpire()`) — no gaps in change record coverage -- [x] **Coverage** — added: - - `fixture/extends_time.php.inc`: class extending `Time` short name → `cacheExpire()` removed, `cacheSetMaxAge()` preserved - - `fixture/extends_tag.php.inc`: class extending `Tag` short name → `cacheExpire()` removed, class with empty body - - `fixture/extends_none.php.inc`: class extending `None` short name → `cacheExpire()` removed, class with empty body - - `fixture/no_change_unrelated.php.inc`: class with no `extends` → `cacheExpire()` correctly NOT removed - - All 8 tests pass -- [x] **Edge cases** — added: - - `fixture/side_effects_body.php.inc`: `cacheExpire()` body with logging + property side effects → still removed entirely (correct; caller must migrate side effects manually) - - `fixture/extends_fqcn.php.inc`: extends `\Drupal\views\Plugin\views\cache\CachePluginBase` by FQCN → matched by `CACHE_PLUGIN_BASE_FQCN` constant, removed correctly - - `fixture/namespace_alias.php.inc`: `use CachePluginBase as ViewsCache; class Foo extends ViewsCache` → resolved by PHPStan fallback, removed correctly - - All 8 tests pass - ---- - -### RemoveConfigSaveTrustedDataArgRector -- Source: `src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector/` -- Drupal-digest: `remove-deprecated-trustdata-calls-and-save-true-argument-in-3347842.php` -- Change record: https://www.drupal.org/node/3347842 - -Tasks: -- [x] **Analyze** — gaps found: - - Both sides of the deprecation are covered: `RemoveTrustDataCallRector` handles `trustData()` method call removal; this rector handles the `save(TRUE)` / `save(FALSE)` boolean arg removal — no overlap or double-application risk - - `@see` in rector docblock points to `node/3347842` (the digest issue); Drupal core's actual deprecation notice in `Config::save()` and `ConfigEntityBase::trustData()` both reference `node/3348180` — minor discrepancy, same change - - Deprecation version (`drupal:11.4.0`) and removal version (`drupal:13.0.0`) match core exactly - - **No type guard** — the rector removes the arg from any `save(boolean)` call on any receiver, not just `Config` objects. Intentional by design (same pattern as `ReplaceRebuildThemeDataRector`): `save()` with a boolean literal is highly specific to this deprecated pattern; false-positive risk is low and matches the digest approach - - `save(FALSE)` is handled correctly (rector checks both `'true'` and `'false'` in strtolower comparison) - - `hasTrustedData()` intentionally NOT deprecated yet — deferred to Drupal 13; no rector needed -- [x] **Coverage** — `basic.php.inc` already covers all required variants: `save(TRUE)` → `save()`; `save(FALSE)` → `save()`; `save()` no-arg unchanged; `$other->save(TRUE)` transformed (demonstrating no type guard); 2 tests pass -- [x] **Edge cases** — added `fixture/no_change_variable_arg.php.inc`: `$config->save($trusted)` where arg is a variable (not a boolean literal) — correctly not transformed (ConstFetch guard prevents it); 2 tests pass - ---- - -### RemoveHandlerBaseDefineExtraOptionsRector -- Source: `src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/` -- Drupal-digest: `remove-overrides-of-deprecated-handlerbase-3485084.php` -- Change record: https://www.drupal.org/node/3485084 - -Tasks: -- [x] **Analyze** — gaps found: - - Rector's `@see` URL (node/3485084) matches the drupal-digest source comment; digest `@see` says node/3486781 (different node) — rector is consistent with the digest file header - - Digest does NOT check `extends` at all — it removes `defineExtraOptions()` from any class that is not named `HandlerBase` itself; our rector is stronger and more correct: it only removes the method from known subclass hierarchies - - Rector correctly handles all four sub-plugin bases: `FilterPluginBase`, `SortPluginBase`, `ArgumentPluginBase`, `RelationshipPluginBase` — all in `PARENT_SHORT_NAMES` - - `FieldHandlerBase` is also in `PARENT_SHORT_NAMES`; not in the digest — a bonus improvement - - FQCN check (`\Drupal\views\Plugin\views\HandlerBase`) handled via direct `toString()` comparison - - Backslash-prefixed short name handled via `str_ends_with($parentName, '\\'.$short)` — correct - - PHPStan `ObjectType` fallback for when types are resolvable — belt-and-suspenders approach - - Versions correct: deprecated in drupal:11.2.0, removed in drupal:12.0.0 -- [x] **Coverage** — added `fixture/filter_plugin_base.php.inc` (with extra method preserved), `fixture/sort_plugin_base.php.inc`, `fixture/argument_plugin_base.php.inc`, `fixture/relationship_plugin_base.php.inc`; all 8 tests pass -- [x] **Edge cases** — added `fixture/fqcn_extends.php.inc` (FQCN `\Drupal\views\Plugin\views\HandlerBase`), `fixture/non_empty_body.php.inc` (multi-line body still removed), `fixture/no_change_unrelated_class.php.inc` (class with no `extends` → not touched); all 8 tests pass - ---- - -### RemoveLinkWidgetValidateTitleElementRector -- Source: `src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector/` -- Drupal-digest: `remove-deprecated-linkwidget-validatetitleelement-calls-3093118.php` -- Change record: https://www.drupal.org/node/3093118 - -Tasks: -- [x] **Analyze** — rector is a static-call removal rector; only one deprecated item in the change record (`LinkWidget::validateTitleElement()`), fully handled; both digest and rector check for static call on the exact FQCN `Drupal\link\Plugin\Field\FieldWidget\LinkWidget` — no type inference needed since the class is hardcoded in the guard; rector's `@see` URL uses node/3093118 (the digest's change-record reference) but Drupal core's `@deprecated` tag links to node/3554139 (a different issue) — this is a minor discrepancy but consistent with the digest source; no instance-method-call variant exists -- [x] **Coverage** — existing `basic.php.inc` covers the main case (aliased `use` import + static call removal); added `fqcn.php.inc` for FQCN static call without `use` statement -- [x] **Edge cases** — added `no_change_unrelated_class.php.inc` (static call on `SomeOtherWidget` is not removed); added `no_change_method_call.php.inc` (instance method call `$linkWidget->validateTitleElement()` is not removed because rector only matches `StaticCall` nodes); all 4 tests pass - ---- - -### RemoveModuleHandlerAddModuleCallsRector -- Source: `src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector/` -- Drupal-digest: `remove-deprecated-modulehandlerinterface-addmodule-and-3528899.php` -- Change record: https://www.drupal.org/node/3528899 - -Tasks: -- [x] **Analyze** — gaps found: - - Both `addModule()` and `addProfile()` are handled — confirmed in rector and basic fixture - - `@see` in rector: `node/3528899` (issue); Drupal core `ModuleHandlerInterface` deprecation uses `node/3491200` (CR) — minor discrepancy, same change - - Versions correct: deprecated in drupal:11.2.0, removed in drupal:12.0.0 - - Rector uses `isObjectType(ModuleHandlerInterface)` — concrete `ModuleHandler` class not matched unless PHPStan knows its hierarchy; **fixed**: updated rector to also explicitly check `ModuleHandler` concrete class, matching `FileSystemBasenameToNativeRector` pattern - - No type guard gap risk: method names `addModule`/`addProfile` are specific enough -- [x] **Coverage** — `addProfile()` already in `basic.php.inc`; added `fixture/concrete_class.php.inc`: receiver typed as `\Drupal\Core\Extension\ModuleHandler` → both calls removed; 4 tests pass -- [x] **Edge cases** — added `fixture/no_change_unrelated_class.php.inc`: `$manager->addModule()` on `SomeOtherManager` → not removed; added `fixture/no_change_fluent_chain.php.inc`: `$mh->addModule(...)->getSomething()` — chain form not removable as statement (outer method name ≠ addModule) → not touched; 4 tests pass - ---- - -### RemoveModuleHandlerDeprecatedMethodsRector -- Source: `src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector/` -- Drupal-digest: `remove-deprecated-modulehandlerinterface-writecache-and-3442009.php` -- Change record: https://www.drupal.org/node/3442009 - -Tasks: -- [x] **Analyze** — gaps found: - - Both transformations confirmed: `writeCache()` removed as statement (`NodeVisitor::REMOVE_NODE`); `getHookInfo()` replaced with `[]` when used as expression, also removed when used as standalone statement - - Rector has a correct `isObjectType(ModuleHandlerInterface)` type guard — untyped receivers are NOT transformed - - `@see` URL in rector docblock is `node/3442009` (matches drupal-digest); Drupal core's deprecation notices in `ModuleHandlerInterface.php` say `node/3442349` — minor discrepancy, same change - - Versions correct: deprecated in drupal:11.1.0, removed in drupal:12.0.0 - - Rector and digest are functionally identical — no missing transformations -- [x] **Coverage** — added `fixture/get_hook_info_expressions.php.inc`: `getHookInfo()` used as function argument (`doSomething([])`) and as `foreach` iterable — both transformed correctly; 4 tests pass -- [x] **Edge cases** — added `fixture/no_change_unrelated_class.php.inc`: `$untyped->getHookInfo()` and `$untyped->writeCache()` on untyped receivers — correctly NOT transformed (type guard works); added `fixture/write_cache_chained_receiver.php.inc`: `$builder->getModuleHandler()->writeCache()` — PHPStan cannot resolve chained return type so it is also NOT transformed (documented as known limitation); 4 tests pass - ---- - -### RemoveRootFromConvertDbUrlRector -- Source: `src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/` -- Drupal-digest: `remove-deprecated-string-root-from-database-3522513.php` -- Change record: https://www.drupal.org/node/3522513 - -Tasks: -- [x] **Analyze** — rector and drupal-digest are logically identical; heuristic is correct: ConstFetch(true/false/null) and Variable are skipped; String_, PropertyFetch, NullsafePropertyFetch, FuncCall, StaticPropertyFetch, MethodCall are treated as string root and removed. Minor note: rector `@see` uses `node/3522513` (change record) while core's own deprecation message cites `node/3511287` (issue) — both refer to the same change; the change record reference is the better one. Removal version in docblock is `12.0.0` which matches core. No gaps. -- [x] **Coverage** — added `fixture/two_args_string.php.inc` (string literal root removed), `fixture/two_args_property_fetch.php.inc` (property fetch only, no third arg), `fixture/three_args_property_fetch.php.inc` (three-arg shifts bool), `fixture/method_call_second_arg.php.inc` (method call result removed, three-arg variant shifts bool); 7 tests pass -- [x] **Edge cases** — added `fixture/no_change_bool_second_arg.php.inc` (TRUE/FALSE → unchanged) and `fixture/no_change_variable_second_arg.php.inc` ($root variable → unchanged); all 7 tests pass - ---- - -### RemoveSetUriCallbackRector -- Source: `src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/` -- Drupal-digest: `remove-deprecated-entitytypeinterface-seturicallback-calls-2667040.php` -- Change record: https://www.drupal.org/node/2667040 - -Tasks: -- [x] **Analyze** — both cases confirmed: standalone `Expression` removal via `NodeVisitor::REMOVE_NODE` and mid-chain `MethodCall` removal by replacing `$node->var` with `$node->var->var`; `@see` URL (node/2667040) and versions (deprecated drupal:11.4.0, removed drupal:13.0.0) are correct; note: `getUriCallback()` is also deprecated in the same CR but is a read-side accessor not in scope for this removal rector; no type guard (acceptable — method name is unique to `EntityTypeInterface` in Drupal core) -- [x] **Coverage** — `basic.php.inc` already covered standalone removal and single-level mid-chain; added `fixture/deep_chain.php.inc`: `$et->setLinkTemplate(...)->setUriCallback(...)->setLabel(...)` — deeply nested chain where `setUriCallback()` has a MethodCall receiver; all 4 tests pass -- [x] **Edge cases** — added `fixture/no_type_guard.php.inc`: demonstrates no type guard — `$unrelated_object->setUriCallback()` is also removed; acceptable because the method name is unique in Drupal core; added `fixture/no_change_assignment.php.inc`: `$x = $et->setUriCallback(...)` (assignment wrapper) — correctly NOT transformed because the `Expression` check requires `$node->expr` to be a `MethodCall` directly, and the MethodCall check only handles chained receivers; all 4 tests pass - ---- - -### RemoveStateCacheSettingRector -- Source: `src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector/` -- Drupal-digest: `remove-deprecated-settings-state-cache-assignment-for-3436954.php` -- Change record: https://www.drupal.org/node/3436954 - -Tasks: -- [x] **Analyze** — gaps found: - - Rector and digest are functionally identical — both remove `$settings['state_cache']` assignments by returning `NodeVisitor::REMOVE_NODE` from an `Expression` visitor - - `@see` in rector uses `node/3436954` (the digest issue); Drupal core's `Settings.php` deprecation message references `node/3177901` — minor discrepancy, both point to the same change - - Deprecation version `drupal:11.0.0` confirmed correct in `core/lib/Drupal/Core/Site/Settings.php`; no removal version specified (setting is simply gone, not replaced) - - Only one deprecated item (`$settings['state_cache']`), fully handled; basic fixture covers `TRUE` value and unrelated key preserved - - No type guard needed — the guard is structural: variable name `$settings` + key string `'state_cache'` -- [x] **Coverage** — added `fixture/false_value.php.inc`: `$settings['state_cache'] = FALSE` also removed (basic only covered `TRUE`); 4 tests pass -- [x] **Edge cases** — added `fixture/no_change_similar_key.php.inc`: `$settings['state_cache_bin']`, `$settings['disable_state_cache']`, `$settings['cache']` — none removed; added `fixture/no_change_nested_array.php.inc`: `$config['system']['state_cache']` and `['state_cache' => TRUE]` — not matched because outer variable is not `$settings`; 4 tests pass - ---- - -### RemoveTrustDataCallRector -- Source: `src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/` -- Drupal-digest: `remove-deprecated-trustdata-calls-and-save-true-argument-in-3347842.php` -- Change record: https://www.drupal.org/node/3347842 - -Tasks: -- [x] **Analyze** — confirmed: this rector handles only `trustData()` method call removal; `RemoveConfigSaveTrustedDataArgRector` handles `save(TRUE/FALSE)` — no overlap. `@see` points to node/3347842 (the broader change record used in the digest); Drupal core's `@trigger_error` references node/3348180 (the specific deprecation node) — same discrepancy as the sibling rector, intentional. No type guard: `trustData()` is unique enough that false positives are not a concern in practice. -- [x] **Coverage** — added `standalone_statement.php.inc` (trustData() as bare statement → `$entity;`), `assigned_result.php.inc` (result assigned to variable). Chained usage was already in `basic.php.inc`. -- [x] **Edge cases** — added `no_change_other_method.php.inc` (getData, save, trustMe — none changed). No type guard in the rector: trustData() on any class is removed; this is consistent with the sibling rector's design and safe given the method name's uniqueness. 4/4 tests pass. - ---- - -### RemoveTwigNodeTransTagArgumentRector -- Source: `src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/` -- Drupal-digest: `remove-deprecated-tag-argument-from-twignodetrans-3473440.php` -- Change record: https://www.drupal.org/node/3473440 - -Tasks: -- [x] **Analyze** — gaps found: - - `@see` points to node/3473440 (the meta-issue); the actual constructor change landed in child issue #3477374 — the digest also references node/3473440, so this is consistent and intentional - - Rector and drupal-digest are functionally identical in logic: only the 6-argument form is changed, 6th arg (`$tag`) is removed via `array_pop` - - Rector explicitly checks both `TwigNodeTrans` (short name after `use` import) and `Drupal\Core\Template\TwigNodeTrans` (FQCN without leading backslash); Rector's name resolver handles aliased imports at the framework level so alias resolution works automatically - - No version/removal annotations in the docblock — not required given the pattern used across other rectors; no other deprecated items in the change record -- [x] **Coverage** — added `fixture/fqcn.php.inc`: FQCN form `new \Drupal\Core\Template\TwigNodeTrans(6 args)` → 5 args; added `fixture/no_change_fewer_args.php.inc`: 5-arg and 4-arg forms → correctly unchanged; all 4 tests pass -- [x] **Edge cases** — added `fixture/aliased_import.php.inc`: `use TwigNodeTrans as NodeTrans; new NodeTrans(6 args)` → Rector's name resolver correctly resolves the alias to the FQCN, 6th arg removed; `no_change_fewer_args.php.inc` confirms the `count($node->args) !== 6` guard works for both 5-arg and 4-arg forms; all 4 tests pass - ---- - -### RemoveUpdaterPostInstallMethodsRector -- Source: `src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector/` -- Drupal-digest: `remove-deprecated-updater-postinstall-postinstalltasks-3417136.php` -- Change record: https://www.drupal.org/node/3417136 - -Tasks: -- [x] **Analyze** — gaps found: - - `@see` in rector docblock points to `node/3417136` (the digest issue/change record); Drupal core's actual deprecation notice in `Updater.php` for `postInstall`/`postInstallTasks` says `node/3461934` — minor discrepancy, both are valid references - - Deprecation version (`drupal:11.1.0`) and removal version (`drupal:12.0.0`) are correct per core source - - Both `postInstall()` and `postInstallTasks()` are handled — correct - - `Drupal\Core\Updater\Module` and `Drupal\Core\Updater\Theme` are both in `UPDATER_BASE_CLASSES` — correct - - **Known gap**: short-name `extends Updater` (without `use` import resolved to FQCN) is NOT matched — `$node->extends->toString()` returns `Updater` which is not in the FQCN list; documented as known limitation (same pattern as `RemoveCacheExpireOverrideRector` short-name gap) - - Rector and drupal-digest are functionally identical in logic -- [x] **Coverage** — added: - - `fixture/extends_module.php.inc`: class extending `Drupal\Core\Updater\Module` → `postInstall()` removed, other method preserved - - `fixture/extends_theme.php.inc`: class extending `Drupal\Core\Updater\Theme` → `postInstallTasks()` removed, other method preserved - - `fixture/non_empty_body.php.inc`: both methods with multi-line bodies → both removed entirely, class left empty - - All 5 tests pass -- [x] **Edge cases** — added: - - `fixture/no_change_short_name.php.inc`: `extends Updater` without FQCN import → correctly NOT transformed (short-name not in FQCN list; documented as known limitation) - - Unrelated class (`UnrelatedClass` with `postInstall()`) already covered in `basic.php.inc` — correctly not modified - - All 5 tests pass - ---- - -### RemoveViewsRowCacheKeysRector -- Source: `src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/` -- Drupal-digest: `remove-deprecated-cachepluginbase-getrowcachekeys-and-3564937.php` -- Change record: https://www.drupal.org/node/3564937 - -Tasks: -- [x] **Analyze** — gaps found: - - `@see` in rector docblock pointed to `node/3564937` (the digest issue number); the actual Drupal core deprecation notice in `CachePluginBase.php` references `node/3564958` — fixed to use the correct change record URL - - Deprecation version (`drupal:11.4.0`) and removal version (`drupal:13.0.0`) are correct per core source - - Both `getRowCacheKeys()` and `getRowId()` are in `DEPRECATED_METHODS` — correct, both are deprecated in core - - Rector logic is functionally identical to the drupal-digest; no extra type guard in either (name-based matching only) - - The rector only removes array items where the value is a deprecated method call — standalone calls outside arrays are NOT affected (correct: nothing to remove from) -- [x] **Coverage** — added: - - `fixture/get_row_id.php.inc`: `getRowId()` used as array item value is removed, non-deprecated items preserved - - `fixture/both_deprecated_calls.php.inc`: both `getRowCacheKeys()` and `getRowId()` in the same array — both removed in one pass -- [x] **Edge cases** — verified: - - `fixture/no_change_standalone_call.php.inc`: bare `$cache_plugin->getRowCacheKeys($row)` and `getRowId()` calls outside an array are not modified — rector targets `Array_` nodes only - - `fixture/no_change_unrelated_class.php.inc`: a class with `getRowCacheKeys()` and `getRowId()` method **definitions** (not calls) is not touched — method declarations are not `Array_` nodes - - Rector is name-based (no type guard); intentional since these method names are unique to Drupal Views `CachePluginBase` - ---- - -### RenameStopProceduralHookScanRector -- Source: `src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector/` -- Drupal-digest: `rename-stopproceduralhookscan-to-proceduralhookscanstop-3495943.php` -- Change record: https://www.drupal.org/node/3495943 - -Tasks: -- [x] **Analyze** — rector and drupal-digest are logically identical; both rename the `use` statement (via `UseUse` node) and the attribute itself (via `Attribute` node, matched as `FullyQualified`); `@see` URL (`node/3495943`), deprecation version (`drupal:11.2.0`), and removal version (`drupal:12.0.0`) are all correct; `ProceduralHookScanStop` is `TARGET_FUNCTION` only — no class-attribute form exists in real Drupal code; FQCN attribute form (`#[\Drupal\...\StopProceduralHookScan]`) is correctly matched as `FullyQualified` and replaced with the short name; no arguments on this attribute; no other deprecated items in the change record -- [x] **Coverage** — `basic.php.inc` already covers function + `use` import; added `fixture/fqcn_attribute.php.inc`: FQCN form without `use` → replaced with short name; added `fixture/multiple_functions.php.inc`: only the marked function is renamed, surrounding functions untouched; no class-attribute fixture needed (attribute is `TARGET_FUNCTION` only); 4 tests pass -- [x] **Edge cases** — added `fixture/no_change_already_new_name.php.inc`: file already using `ProceduralHookScanStop` (both `use` and attribute) → not double-renamed; `UseUse` node match is exact FQCN comparison so `StopProceduralHookScan` in other namespaces not affected; 4 tests pass - ---- - -### ReplaceAlphadecimalToIntNullRector -- Source: `src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/` -- Drupal-digest: `replace-deprecated-number-alphadecimaltoint-null-calls-with-3442810.php` -- Change record: https://www.drupal.org/node/3442810 - -Tasks: -- [x] **Analyze** — rector and drupal-digest are logically identical; both `null` (ConstFetch) and `''` (empty String_) produce `LNumber(0)`; type guard uses `isObjectType(ObjectType('Drupal\Component\Utility\Number'))` so wrong classes are excluded; `@see` URL (node/3442810), deprecation version (drupal:11.2.0) and removal version (drupal:12.0.0) all correct per `Number.php` in core; no gaps — single method, both argument forms, exact match with the digest source -- [x] **Coverage** — `basic.php.inc` already covers: `null` → `0`, `''` → `0`, non-null string left unchanged, wrong class left unchanged; no additional coverage fixtures needed -- [x] **Edge cases** — added `fixture/fqcn.php.inc`: FQCN call `\Drupal\Component\Utility\Number::alphadecimalToInt(NULL/'')` → `0` (both transformed); added `fixture/no_change_variable.php.inc`: `$value = null; Number::alphadecimalToInt($value)` → not touched (Variable node, not ConstFetch/String_); added `fixture/inline_usage.php.inc`: result as function argument `foo(Number::alphadecimalToInt(null))` and in arithmetic expression `Number::alphadecimalToInt('') + 5` — both transformed correctly; 4/4 tests pass - ---- - -### ReplaceCommentManagerGetCountNewCommentsRector -- Source: `src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/` -- Drupal-digest: `replace-deprecated-commentmanagerinterface-3543035.php` -- Change record: https://www.drupal.org/node/3543035 - -Tasks: -- [x] **Analyze** — gaps found: - - `@see` in rector docblock pointed to `node/3543035` (the drupal-digests issue); the actual Drupal core deprecation notice in `CommentManagerInterface.php` references `node/3551729` — **fixed** to use the correct change record URL - - Both rector and drupal-digest use `isObjectType(CommentManagerInterface)` as a type guard — consistent - - Single deprecated item (`getCountNewComments()`), fully handled; all arguments passed through via `$node->args` - - BC-wrap via `AbstractDrupalCoreRector::createBcCallOnExpr()` with version `11.3.0` — correct (deprecated in drupal:11.3.0, removed in drupal:12.0.0) - - Rector and digest are functionally identical; no missing items -- [x] **Coverage** — added `fixture/class_property.php.inc`: `$this->commentManager->getCountNewComments($entity)` with interface-typed property → BC-wrapped; added `fixture/multiple_args.php.inc`: all three arguments (`$entity, 'comment', 0`) passed through correctly; 3 tests pass -- [x] **Edge cases** — added `fixture/no_change_service_call.php.inc`: `\Drupal::service('comment.manager')->getCountNewComments($entity)` — `service()` returns mixed, type guard does not fire, correctly not transformed; added `fixture/concrete_class.php.inc`: receiver typed as `\Drupal\comment\CommentManager` — PHPStan does not resolve the implements-interface relationship without full class loading, so this is a no-change case (documented as known limitation); added `fixture/no_change_unrelated.php.inc`: `getCountNewComments()` on an `UnrelatedManager`-typed var → correctly not transformed; 6/6 tests pass - ---- - -### ReplaceCommentUriRector -- Source: `src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/` -- Drupal-digest: `replace-deprecated-comment-uri-with-comment-permalink-2010202.php` -- Change record: https://www.drupal.org/node/2010202 - -Tasks: -- [x] **Analyze** — gaps found: - - Rector and digest are functionally identical in logic; one deprecated item (`comment_uri()`), fully handled - - Zero-arg guard exists (`count($node->args) < 1`) — contrary to the task note, it IS already guarded - - `@see` URL in rector uses `node/2010202`; Drupal core's actual deprecation notice (in `CommentUriDeprecationTest.php`) says `node/3384294` — minor discrepancy, both refer to the same change - - Deprecation version (`drupal:11.3.0`) and removal version (`drupal:12.0.0`) are correct per core source - - No type guard — any function named `comment_uri` with at least one arg is transformed; acceptable given the function name is unique to Drupal's comment module -- [x] **Coverage** — added `fixture/inline_usage.php.inc` (`print comment_uri($comment)` → `print $comment->permalink()`); added `fixture/as_argument.php.inc` (result as argument to another function); all 5 tests pass -- [x] **Edge cases** — added `fixture/no_change_zero_args.php.inc` (zero-arg call correctly not touched — guard confirmed working); added `fixture/complex_expression.php.inc` (`comment_uri($this->getComment())` → `$this->getComment()->permalink()`); all 5 tests pass - ---- - -### ReplaceDateTimeRangeConstantsRector -- Source: `src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/` -- Drupal-digest: `replace-removed-datetimerangeconstantsinterface-constants-3574901.php` -- Change record: https://www.drupal.org/node/3574901 - -Tasks: -- [x] **Analyze** — all three constants (`BOTH` → `Both`, `START_DATE` → `StartDate`, `END_DATE` → `EndDate`) and `datetime_type_field_views_data_helper()` are handled; rector and digest are logically identical; `@see` URL (`node/3574901`), deprecation version (`drupal:11.2.0`), and removal version (`drupal:12.0.0`) are all correct per `DateTimeRangeConstantsInterface.php` in core; no gaps in change record coverage -- [x] **Coverage** — `basic.php.inc` already covers all three constants and the function in one fixture; added `fixture/function_replacement.php.inc`: standalone and assigned-result forms of `datetime_type_field_views_data_helper()` → `\Drupal::service('datetime.views_helper')->buildViewsData()`; added `fixture/match_arm.php.inc`: all three constants in `match` arm conditions → correctly transformed; 4 tests pass -- [x] **Edge cases** — added `fixture/self_static_in_implementor.php.inc`: `self::BOTH` and `static::START_DATE` inside a class implementing `DateTimeRangeConstantsInterface` — **correctly NOT transformed** (same limitation as `ReplaceEntityReferenceRecursiveLimitRector`: `isName()` on a `self`/`static` `Name` node returns the keyword itself, not the resolved FQCN); this is a known Rector limitation when there is no PHPStan scope to resolve `self`; `match_arm.php.inc` confirms FQCN-qualified constants in match arms work correctly; 4 tests pass - ---- - -### ReplaceEditorLoadRector -- Source: `src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/` -- Drupal-digest: `replace-deprecated-editor-load-with-entity-storage-load-3447794.php` -- Change record: https://www.drupal.org/node/3447794 - -Tasks: -- [x] **Analyze** — gaps found: - - `@see` in rector (node/3447794) matches the drupal-digest source; Drupal core's `editor_load()` deprecation notice in `editor.module:87` links to `node/3509245` — same change, minor discrepancy - - Rector and drupal-digest are logically equivalent; both produce `\Drupal::entityTypeManager()->getStorage('editor')->load($format_id)` - - **Gap fixed**: rector had no argument-count guard — `editor_load()` (0 args) and `editor_load($a, $b)` (2 args) would have been transformed incorrectly; added `count($node->args) !== 1` guard - - No type guard needed — `editor_load` is a global function unique to Drupal's editor module; false-positive risk is negligible - - Versions correct: deprecated in drupal:11.2.0, removed in drupal:12.0.0 -- [x] **Coverage** — added `fixture/inline_usage.php.inc` (`print editor_load($format_id)` → `print \Drupal::entityTypeManager()->getStorage('editor')->load($format_id)`); added `fixture/as_argument.php.inc` (result passed to another function); all 6 tests pass -- [x] **Edge cases** — added `fixture/no_change_no_arg.php.inc` (0-arg call not touched — guard confirmed); added `fixture/no_change_multiple_args.php.inc` (2-arg call not touched — guard confirmed); added `fixture/no_change_method_call.php.inc` (`$this->editor_load()` method call on a class — not a `FuncCall` node, correctly not transformed); all 6 tests pass - ---- - -### ReplaceEntityOriginalPropertyRector -- Source: `src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/` -- Drupal-digest: `replace-deprecated-entity-original-magic-property-with-3571065.php` -- Change record: https://www.drupal.org/node/3571065 - -Tasks: -- [x] **Analyze** — both read (`->original` → `getOriginal()`) and write (`->original = $x` → `setOriginal($x)`) handled; no type guard (intentional, same as digest — only `$this->original` is skipped to avoid false positives on non-entity classes like `EntityTypeEvent`); `@see` in rector points to node/3571065 (change record) while the Drupal core deprecation message cites node/3295826 — minor discrepancy, both valid; deprecation version (11.2.0) and removal version (12.0.0) match core; rector did not originally handle `NullsafePropertyFetch` — gap fixed (see Coverage) -- [x] **Coverage** — basic fixture already covered read and write; added `fixture/nullsafe.php.inc` (`$entity?->original` → `$entity?->getOriginal()`, required updating rector to include `NullsafePropertyFetch` → `NullsafeMethodCall`); all 5 tests pass -- [x] **Edge cases** — added `fixture/chain.php.inc` (`$entity->original->id()` → `$entity->getOriginal()->id()`) and `fixture/write_complex_rhs.php.inc` (write with method-call RHS); added `fixture/no_change_this_original.php.inc` (no type guard — any `$var->original` is transformed, but `$this->original` is correctly skipped); all 5 tests pass - ---- - -### ReplaceEntityReferenceRecursiveLimitRector -- Source: `src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/` -- Drupal-digest: `replace-deprecated-entityreferenceentityformatter-recursive-2940605.php` -- Change record: https://www.drupal.org/node/3316878 - -**Known gaps from analysis:** -- `self::RECURSIVE_RENDER_LIMIT` and `static::RECURSIVE_RENDER_LIMIT` within a subclass of `EntityReferenceEntityFormatter` — not handled (drupal-digest uses PHPStan `ObjectType` check for this) -- `static::$recursiveRenderDepth` static property — the entire counter pattern should be deleted; only the constant is replaced - -Tasks: -- [x] **Analyze** — `RECURSIVE_RENDER_LIMIT = 20` confirmed in Drupal core 11.x; `$recursiveRenderDepth` static property is also deprecated (removed in 13.0.0) but NOT handled by this rector (known gap — no PHPStan scope to detect subclass property usage); `@see` URL corrected from `2940605` to `3316878` in the rector source; removal version `drupal:13.0.0` is correct; the constant value `20` is correct -- [x] **Coverage** — added `fixture/in_ternary.php.inc` (true and false branch of ternary) and `fixture/in_function_call.php.inc` (as first and second function argument); basic fixture already covered FQCN in `if` condition and assignment; 6 tests pass -- [x] **Edge cases** — added `fixture/no_change_self_static_in_subclass.php.inc` (`self::` and `static::` in subclass body — correctly NOT transformed, known limitation); `fixture/no_change_parent_in_subclass.php.inc` (`parent::` — correctly NOT transformed); `fixture/aliased_import.php.inc` (`use ... as Formatter; Formatter::RECURSIVE_RENDER_LIMIT` — Rector resolves the alias to FQCN and DOES transform it correctly); all 6 tests pass - ---- - -### ReplaceFieldgroupToFieldsetRector -- Source: `src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/` -- Drupal-digest: `replace-deprecated-type-fieldgroup-with-type-fieldset-3512254.php` -- Change record: https://www.drupal.org/node/3512254 - -Tasks: -- [x] **Analyze** — rector and drupal-digest are functionally identical (both iterate `Array_` items checking for `String_('#type')` key and `String_('fieldgroup')` value, replacing value with `String_('fieldset')`); `@see` URL is `node/3512254` (correct change record); deprecation version `drupal:11.2.0` and removal version `drupal:12.0.0` match core `Fieldgroup.php`; note: the digest `@see` says `node/3515272` (a different node) while the rector uses `node/3512254` — rector is consistent with the change record header; one known limitation per the digest comment: if code relied on the `fieldgroup` CSS class or `core/drupal.fieldgroup` library being auto-attached, those must be added manually — out of scope for the rector -- [x] **Coverage** — `basic.php.inc` already covers the main transformation (fieldgroup → fieldset, including an already-correct fieldset entry left unchanged); added `deeply_nested.php.inc`: `'#type' => 'fieldgroup'` inside a deeply nested assignment (`$form['wrapper']['group']['settings']`) → correctly transformed; 4 tests pass -- [x] **Edge cases** — added `no_change_variable_assignment.php.inc`: `$type = 'fieldgroup'; $form['account']['#type'] = $type` — variable value, not inside an `Array_` item with a String_ value, correctly not touched by the rector; added `no_change_type_without_hash.php.inc`: `['type' => 'fieldgroup']` (key without `#`) — key check requires exact `String_('#type')` match so this is correctly not transformed; all 4 tests pass - ---- - -### ReplaceFileGetContentHeadersRector -- Source: `src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/` -- Drupal-digest: `replace-file-get-content-headers-with-fileinterface-3494126.php` -- Change record: https://www.drupal.org/node/3494126 - -Tasks: -- [x] **Analyze** — rector and drupal-digest are functionally identical; `count($node->args) !== 1` guard correctly handles zero-arg and multi-arg cases; `@see` URL (`node/3494126`), deprecation version (`drupal:11.2.0`), and removal version (`drupal:12.0.0`) all correct; no type guard needed — `file_get_content_headers` is unique to Drupal's file module; no gaps -- [x] **Coverage** — added `fixture/as_argument.php.inc` (result as function argument); `fixture/inline_in_array.php.inc` (result as array value); `fixture/method_call_as_arg.php.inc` (`$this->getFile()` as argument → `$this->getFile()->getDownloadHeaders()`); all 6 tests pass -- [x] **Edge cases** — added `fixture/no_change_zero_args.php.inc` (zero-arg call not touched — guard confirmed); added `fixture/no_change_multiple_args.php.inc` (two-arg call not touched — guard confirmed); all 6 tests pass - ---- - -### ReplaceLocaleConfigBatchFunctionsRector -- Source: `src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/` -- Drupal-digest: `replace-removed-locale-batch-helper-functions-with-their-3575254.php` -- Change record: https://www.drupal.org/node/3575254 - -**Note:** This rector is a candidate for replacement with Rector core's `RenameFunctionRector` — see the generic rector extraction todo. - -Tasks: -- [x] **Analyze** — both renames confirmed correct against Drupal core source (`locale.bulk.inc`); `@see` points to change record node/3575254 (Drupal source uses issue node/3475054 — consistent with other rectors using the CR URL); version `drupal:11.1.0` / removal `drupal:12.0.0` match; both functions are pure renames with argument pass-through; no gaps between drupal-digest and drupal-rector implementations -- [x] **Coverage** — added `fixture/expression_positions.php.inc`: `locale_config_batch_refresh_name()` used as statement, assignment RHS, `if` condition, and array push; all 3 tests pass -- [x] **Edge cases** — added `fixture/fqcn_prefix.php.inc`: `\locale_config_batch_set_config_langcodes()` and `\locale_config_batch_refresh_name()` with FQCN backslash prefix are correctly renamed (FullyQualified extends Name so the `instanceof Node\Name` check catches them); argument pass-through already covered by existing `basic.php.inc` and `expression_positions.php.inc` with varying arg counts; all 3 tests pass - ---- - -### ReplaceNodeAccessViewAllNodesRector -- Source: `src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/` -- Drupal-digest: `replace-deprecated-node-access-view-all-nodes-with-3038908.php` -- Change record: https://www.drupal.org/node/3038908 - -Tasks: -- [x] **Analyze** — rector and drupal-digest are logically identical; both transformations confirmed: `node_access_view_all_nodes()` → `\Drupal::entityTypeManager()->getAccessControlHandler('node')->checkAllGrants(account)`, and `drupal_static_reset('node_access_view_all_nodes')` → `\Drupal::service('node.view_all_nodes_memory_cache')->deleteAll()`; `@see` URL in rector points to `node/3038908` while Drupal core's deprecation notice says `node/3038909` — minor discrepancy; deprecation version (`drupal:11.3.0`) and removal version (`drupal:12.0.0`) confirmed correct in `node.module:344`; function signature is `node_access_view_all_nodes($account = NULL)` — rector correctly handles both 0-arg (falls back to `\Drupal::currentUser()`) and 1-arg (passes `$account` through) forms; no gaps -- [x] **Coverage** — `basic.php.inc` already covered: no-arg call, 1-arg call, `drupal_static_reset` match, `drupal_static_reset` no-change; added `fixture/in_condition.php.inc`: no-arg and 1-arg form used as `if`-condition — both transformed correctly; 2 tests pass -- [x] **Edge cases** — `drupal_static_reset('other_function')` not touched (already in `basic.php.inc` — `String_::value !== 'node_access_view_all_nodes'` guard works); `node_access_view_all_nodes($account)` with an argument IS correctly transformed (passes arg through to `checkAllGrants($account)`) — this is the intended behavior per `node.module`'s own implementation - ---- - -### ReplaceNodeAddBodyFieldRector -- Source: `src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/` -- Drupal-digest: `replace-deprecated-node-add-body-field-with-createbodyfield-3489266.php` -- Change record: https://www.drupal.org/node/3489266 - -Tasks: -- [x] **Analyze** — rector and digest are logically identical; `@see node/3489266` is the change record (matches digest); both 1-arg and 2-arg forms handled; `node_add_body_field` is fully removed from Drupal 11.x core; rector intentionally does not add `BodyFieldCreationTrait` to the calling class — that is a manual step; no other deprecated items in this change record; versions correct (`drupal:11.3.0` / `drupal:12.0.0`) -- [x] **Coverage** — `basic.php.inc` already covered 1-arg and 2-arg forms; added `fixture/fqcn_prefix.php.inc`: backslash-prefixed `\node_add_body_field()` — `isName()` resolves the FQCN so both forms are transformed; added `fixture/method_call_arg.php.inc`: first arg is a method call (`$this->getNodeType()`) — `->id()` is correctly applied; all 4 tests pass -- [x] **Edge cases** — added `fixture/no_change_no_args.php.inc`: zero-arg call correctly not transformed (`empty($node->args)` guard confirmed); rector does not add `BodyFieldCreationTrait` — manual step documented above; all 4 tests pass - ---- - -### ReplaceNodeModuleProceduralFunctionsRector -- Source: `src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/` -- Drupal-digest: `replace-deprecated-node-module-procedural-functions-with-oo-3571623.php` -- Change record: https://www.drupal.org/node/3571623 - -Tasks: -- [x] **Analyze** — digest handles 3 functions; rector originally only handled 2 — **gap fixed**: added `node_mass_update()` → `\Drupal::service(\Drupal\node\NodeBulkUpdate::class)->process(...)` handling; `node_type_get_names()` and `node_get_type_label()` were already correct; `@see node/3571623` matches; all three functions fully removed from Drupal 11.x core; fixed pre-existing PHPStan error (missing `assert($node instanceof FuncCall)` in `refactor()`); versions correct (`drupal:11.3.0` / `drupal:13.0.0`) -- [x] **Coverage** — added `fixture/node_mass_update.php.inc`: 2-arg and 5-arg forms of `node_mass_update()` correctly transformed; added `fixture/expression_positions.php.inc`: `node_type_get_names()` as assignment RHS and `if` condition; `node_get_type_label()` with method-call arg; all 4 tests pass -- [x] **Edge cases** — added `fixture/no_change_mass_update_too_few_args.php.inc`: `node_mass_update($nids)` with only 1 arg → correctly not transformed (guard: `count($node->args) < 2`); all 4 tests pass - ---- - -### ReplaceNodeSetPreviewModeRector -- Source: `src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/` -- Drupal-digest: `replace-deprecated-constants-with-nodepreviewmode-enum-in-3538277.php` -- Change record: https://www.drupal.org/node/3538277 - -Tasks: -- [x] **Analyze** — rector and digest are logically identical; `@see node/3538277` is correct; both deprecated constants (`DRUPAL_DISABLED/OPTIONAL/REQUIRED`) and integer values (0/1/2) are handled for `setPreviewMode()` — fully matching the change record; `getPreviewMode($returnAsInt)` deprecation (`@see node/3539662`) is a separate issue — out of scope for this rector; `getPreviewMode() === DRUPAL_DISABLED` comparison replacement is likewise out of scope (would require a broader ConstFetch rector); no type guard — intentional, same design as `ReplaceRebuildThemeDataRector`; versions correct (`drupal:11.3.0` / `drupal:13.0.0`) -- [x] **Coverage** — `basic.php.inc` already covers all 6 transformation variants (3 constants + 3 integers); added `fixture/no_change_getpreviewmode.php.inc`: documents that `getPreviewMode() === DRUPAL_DISABLED` and `getPreviewMode(TRUE)` are NOT transformed by this rector (out of scope); all 4 tests pass -- [x] **Edge cases** — added `fixture/no_change_unknown_int.php.inc`: `setPreviewMode(3)` and `setPreviewMode(-1)` correctly not transformed (not in `INT_TO_ENUM` map); added `fixture/no_type_guard.php.inc`: `$anyObject->setPreviewMode(DRUPAL_DISABLED)` IS transformed (no type guard — documented as intentional); all 4 tests pass - ---- - -### ReplacePdoFetchConstantsRector -- Source: `src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/` -- Drupal-digest: `replace-pdo-fetch-constants-with-fetchas-enum-cases-in-3525077.php` -- Change record: https://www.drupal.org/node/3525077 - -Tasks: -- [x] **Analyze** — rector and digest are logically identical; minor `@see` discrepancy: rector uses `node/3525077` (CR), digest uses `node/3488338` — rector's reference is the change record (correct); all 5 `PDO::FETCH_*` constants are in `FETCH_MAP` (`FETCH_OBJ`, `FETCH_ASSOC`, `FETCH_NUM`, `FETCH_COLUMN`, `FETCH_CLASS`); all 4 Drupal statement methods covered; `getClientStatement`/`getClientConnection` guard correctly excludes raw PDO object; no type guard on receiver — native `PDOStatement` calls are also transformed (known limitation — intentional, same design as other rectors); versions correct (`drupal:11.2.0` / `drupal:12.0.0`) -- [x] **Coverage** — `basic.php.inc` covered `FETCH_ASSOC`, `FETCH_OBJ`, `FETCH_NUM`, plus `getClientStatement` no-change; added `fixture/fetch_column_and_class.php.inc`: `FETCH_COLUMN` → `FetchAs::Column`, `FETCH_CLASS` → `FetchAs::ClassObject` (both previously untested); all 4 tests pass -- [x] **Edge cases** — added `fixture/no_change_outside_method.php.inc`: bare `PDO::FETCH_*` assignment, ternary, and function default parameter — correctly not transformed (rector only targets `MethodCall` and `ArrayItem` nodes); added `fixture/no_type_guard_native_pdo.php.inc`: `$pdoStatement->fetchAll(\PDO::FETCH_ASSOC)` IS transformed — documented as known limitation (no type check on receiver); all 4 tests pass - ---- - -### ReplaceRecipeRunnerInstallModuleRector -- Source: `src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/` -- Drupal-digest: `replace-deprecated-reciperunner-installmodule-with-3498026.php` -- Change record: https://www.drupal.org/node/3498026 - -Tasks: -- [x] **Analyze** — rector and digest are logically identical; `@see node/3498026` is in both rector and digest; Drupal core's own deprecation trigger in `RecipeRunner.php:278` references `node/3579527` — minor discrepancy; versions correct (`drupal:11.4.0` / `drupal:13.0.0`); class guards cover FQCN, short name `RecipeRunner`, `static`, and `self` — full coverage; rector targets only `StaticCall` nodes — method-call form is correctly excluded; only `installModule` is deprecated, `installModules` is the replacement — no other deprecated items -- [x] **Coverage** — `basic.php.inc` covered short-name static call with `use` import; added `fixture/fqcn.php.inc`: `\Drupal\Core\Recipe\RecipeRunner::installModule(...)` FQCN form correctly rewritten; added `fixture/self_static.php.inc`: `self::installModule()` and `static::installModule()` inside a subclass → both rewritten; all 5 tests pass -- [x] **Edge cases** — added `fixture/no_change_method_call.php.inc`: `$runner->installModule(...)` (instance method call, not `StaticCall` node) → correctly not transformed; added `fixture/no_change_unrelated_class.php.inc`: `SomeOtherRunner::installModule(...)` → not transformed (class name guard); all 5 tests pass - ---- - -### ReplaceSessionManagerDeleteRector -- Source: `src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/` -- Drupal-digest: `replace-deprecated-sessionmanager-delete-with-3577376.php` -- Change record: https://www.drupal.org/node/3577376 - -Tasks: -- [x] **Analyze** — rector and digest are logically identical; both use `ObjectType('SessionManager')` type guard (concrete class, not interface); `SessionManagerInterface::delete()` is also deprecated in drupal:11.4.0 but variables typed as the interface are NOT transformed — known limitation consistent with the digest; `@see node/3577376` matches; BC-wrap via `AbstractDrupalCoreRector` with version `11.4.0` — correct; versions correct (`drupal:11.4.0` / `drupal:12.0.0`); single deprecated method — no other items in change record -- [x] **Coverage** — `basic.php.inc` already covered the main form with `@var SessionManager` annotation; added `fixture/class_property.php.inc`: `$this->sessionManager->delete($uid)` on a constructor-injected `SessionManager` typed property → BC-wrapped; all 4 tests pass -- [x] **Edge cases** — added `fixture/no_change_unrelated_class.php.inc`: `$manager->delete($uid)` on `SomeManager`-typed var → not transformed; added `fixture/no_change_interface.php.inc`: `$sessionManager->delete($uid)` on `SessionManagerInterface`-typed var → not transformed (known limitation documented); fluent chain not added — `delete()` returns `void` so no fluent pattern exists; all 4 tests pass - ---- - -### ReplaceSessionWritesWithRequestSessionRector -- Source: `src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/` -- Drupal-digest: `replace-deprecated-session-writes-with-drupal-request-3518527.php` -- Change record: https://www.drupal.org/node/3518527 - -Tasks: -- [x] **Analyze** — rector and digest are logically identical; only `$_SESSION['key'] = $value` writes are handled (Assign node); `unset($_SESSION['key'])` (Unset_ node) and `$_SESSION = []` (plain Variable, not ArrayDimFetch) are out of scope — known limitations; `$_SESSION['outer']['inner'] = $v` nested writes not handled (guard requires `$arrayDimFetch->var` to be a `Variable`, not another `ArrayDimFetch`); `@see node/3518527` correct; version `drupal:11.2.0` correct; no removal version in docblock (deprecated, not removed, as of 11.2.0) -- [x] **Coverage** — `basic.php.inc` covered string literal and dynamic key forms; added `fixture/in_function.php.inc`: writes inside a function body and with concatenated key; all 4 tests pass -- [x] **Edge cases** — added `fixture/no_change_read_access.php.inc`: `$value = $_SESSION['key']`, `isset()`, and `echo` on `$_SESSION` → all correctly not transformed; added `fixture/no_change_nested_and_clear.php.inc`: nested write, bare `$_SESSION = []`, and `unset()` → all not transformed; known limitations documented inline; all 4 tests pass - ---- - -### ReplaceSystemPerformanceGzipKeyRector -- Source: `src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/` -- Drupal-digest: `replace-deprecated-system-performance-css-gzip-js-gzip-3184242.php` -- Change record: https://www.drupal.org/node/3184242 - -Tasks: -- [x] **Analyze** — rector and digest are logically identical; minor `@see` discrepancy: rector uses `node/3184242` (change record), digest uses `node/3526344`; both handle `get()` and `set()` on the `system.performance` config via a receiver-chain walk that matches `\Drupal::config()`, `\Drupal::configFactory()->get()`/`getEditable()`, and `$this->config()` patterns; exact string key guard (`'css.gzip'` / `'js.gzip'`); variable keys and other config names correctly excluded; versions correct (`drupal:11.4.0` / `drupal:12.0.0`) -- [x] **Coverage** — `basic.php.inc` covered `get('css.gzip')`, `get('js.gzip')`, `set('css.gzip', ...)`, and unrelated config no-change; added `fixture/set_js_gzip.php.inc`: `set('js.gzip', ...)` forms correctly rewritten; added `fixture/this_config.php.inc`: `$this->config('system.performance')->get/set()` method-chain form; all 4 tests pass -- [x] **Edge cases** — added `fixture/no_change_unrelated_keys.php.inc`: `'gzip'`, `'css'`, `'css.preprocess'` — exact key guard prevents transformation; variable key `$key` — `String_` node guard prevents transformation; all 4 tests pass - ---- - -### ReplaceThemeGetSettingRector -- Source: `src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/` -- Drupal-digest: `replace-deprecated-theme-get-setting-and-system-default-3573896.php` -- Change record: https://www.drupal.org/node/3573896 - -Tasks: -- [x] **Analyze** — rector and digest are logically identical; both `theme_get_setting()` and `_system_default_theme_features()` are handled; all args passed through for `theme_get_setting()` (no arg-count guard — 0, 1, or 2 args all work); `@see node/3573896` in both rector and digest; core's actual deprecation triggers reference `node/3035289` (theme_get_setting) and `node/3554127` (_system_default_theme_features) — minor discrepancy; versions correct (`drupal:11.3.0` / `drupal:13.0.0`) -- [x] **Coverage** — `basic.php.inc` already covered 1-arg `theme_get_setting`, 2-arg form, and `_system_default_theme_features`; added `fixture/inline_usage.php.inc`: result in `if` condition, with variable `$theme_name` arg, and `_system_default_theme_features()` as argument to `array_keys()`; added `fixture/variable_key.php.inc`: variable `$setting_name` first arg is transformed (no String_ guard); all 4 tests pass -- [x] **Edge cases** — added `fixture/fqcn_prefix.php.inc`: `\theme_get_setting()` and `\_system_default_theme_features()` with backslash prefix — `isName()` resolves the FQCN so both are correctly transformed; all 4 tests pass - ---- - -### ReplaceUserSessionNamePropertyRector -- Source: `src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/` -- Drupal-digest: `replace-deprecated-usersession-name-property-read-with-3513856.php` -- Change record: https://www.drupal.org/node/3513856 - -Tasks: -- [x] **Analyze** — **gap fixed**: digest has a `$this->name` guard (to prevent infinite recursion if run inside `UserSession::getAccountName()` which reads `$this->name`); rector was missing this guard — added `if ($node->var instanceof Variable && getName($node->var) === 'this') { return null; }`; `@see node/3513856` matches both rector and digest; only read access (`PropertyFetch`) handled — `PropertyAssign` is write access via a different node type (`Assign`); versions correct (`drupal:11.3.0` / `drupal:12.0.0`) -- [x] **Coverage** — `basic.php.inc` covered `@var`-annotated local variable; added `fixture/inline_usage.php.inc`: `$session->name` in `if` condition, return statement, and string concatenation; all 4 tests pass -- [x] **Edge cases** — added `fixture/no_change_this.php.inc`: `$this->name` inside a `UserSession` subclass → correctly not transformed (guard prevents infinite recursion); added `fixture/nullsafe.php.inc`: `$session?->name` → `NullsafePropertyFetch` is a different node type from `PropertyFetch` — not handled by this rector (documents known limitation); write access `$session->name = $v` is `Assign` not `PropertyFetch` so naturally not targeted; all 4 tests pass - ---- - -### ReplaceViewsProceduralFunctionsRector -- Source: `src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/` -- Drupal-digest: `replace-deprecated-views-procedural-functions-with-oo-3572243.php` -- Change record: https://www.drupal.org/node/3572243 - -Tasks: -- [x] **Analyze** — rector and digest are logically identical; all five functions handled: `views_view_is_enabled` → `$view->status()`, `views_view_is_disabled` → `!$view->status()`, `views_enable_view` → `$view->enable()->save()`, `views_disable_view` → `$view->disable()->save()`, `views_get_view_result` → `\Drupal\views\Views::getViewResult(...)`; `@see node/3572243` in rector; digest references `node/3572594` and the project issue — minor discrepancy; versions correct (`drupal:11.4.0` / `drupal:13.0.0`); no type guard (function names unique to views module) -- [x] **Coverage** — `basic.php.inc` already covered all five functions; added `fixture/expression_positions.php.inc`: `views_view_is_enabled()` in `if` condition, `views_view_is_disabled()` in ternary, `views_get_view_result()` with 1-arg and 2-arg forms; all 3 tests pass -- [x] **Edge cases** — added `fixture/no_change_no_args.php.inc`: zero-arg calls on all four view-object functions → correctly not transformed (each has `count($node->args) < 1` guard); `views_get_view_result()` has no arg guard — zero-arg call would be transformed to `Views::getViewResult()` but this is unlikely in real code; all 3 tests pass - ---- - -### StatementPrefetchIteratorFetchColumnRector -- Source: `src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/` -- Drupal-digest: `replace-deprecated-statementprefetchiterator-fetchcolumn-3490200.php` -- Change record: https://www.drupal.org/node/3490200 - -Tasks: -- [x] **Analyze** — rector matches digest exactly; `$this->clientStatement` exclusion guard is correct; @see URL is `3490200` (change record) while core deprecation message references `3490312` — consistent discrepancy, not a bug -- [x] **Coverage** — added `no_arg.php.inc` (zero-arg call), `chained_call.php.inc` (method-chain receiver); basic.php.inc covers explicit index and clientStatement skip -- [x] **Edge cases** — added `property_not_client_statement.php.inc` confirming `$this->statement` / `$this->stmt` (non-clientStatement) IS transformed; `$this->clientStatement` stays unchanged (basic.php.inc) - ---- - -### StripMigrationDependenciesExpandArgRector -- Source: `src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/` -- Drupal-digest: `strip-removed-expand-argument-from-getmigrationdependencies-3574717.php` -- Change record: https://www.drupal.org/node/3574717 - -Tasks: -- [x] **Analyze** — rector matches digest; type guard on `MigrationInterface` is correct; core deprecation message references `3442785` while rector/checklist use `3574717` — consistent discrepancy, not a bug -- [x] **Coverage** — added `false_arg.php.inc` (FALSE arg removed); basic.php.inc covers no-arg no-change and untyped no-change -- [x] **Edge cases** — added `this_caller.php.inc` documenting that `$this` in Migration subclass is NOT transformed (PHPStan cannot resolve type without Drupal core); TRUE case confirmed via basic.php.inc - ---- - -### UseEntityTypeHasIntegerIdRector -- Source: `src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/` -- Drupal-digest: `replace-deprecated-entity-type-integer-id-helpers-with-3566801.php` -- Change record: https://www.drupal.org/node/3566801 - -Tasks: -- [x] **Analyze** — rector matches digest; handles all three patterns (`getEntityTypeIdKeyType` === 'integer', `entityTypeSupportsComments`, `hasIntegerId`); both orderings of Identical handled via `extractPair` -- [x] **Coverage** — basic.php.inc covers all three patterns; added `string_reversed.php.inc` for `'integer' === $this->getEntityTypeIdKeyType(...)` (string on left) -- [x] **Edge cases** — added `no_change.php.inc` for: non-'integer' string value, non-`$this` receiver on `getEntityTypeIdKeyType`, non-`$this` `entityTypeSupportsComments` - ---- - -### ViewsPluginHandlerManagerRector -- Source: `src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector.php` -- Test: `tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/` -- Drupal-digest: `replace-deprecated-views-pluginmanager-and-views-3566424.php` -- Change record: https://www.drupal.org/node/3566424 - -Tasks: -- [x] **Analyze** — rector matches digest; handles both `pluginManager()` and `handlerManager()`; two output paths: string literal arg → `\Drupal::service('plugin.manager.views.')`, dynamic arg → `\Drupal::service('views.plugin_managers')->get($type)`; @see URL discrepancy: rector `3566424`, core/digest `3566982` — consistent pattern -- [x] **Coverage** — basic.php.inc covers string literal for both methods and dynamic for `pluginManager`; added `handler_manager_dynamic.php.inc` for `handlerManager($type)` dynamic variant; added `fqcn_prefix.php.inc` for FQCN calls -- [x] **Edge cases** — added `no_change_no_args.php.inc` confirming zero-arg calls are intentionally skipped - ---- - -## Generic Rectors (new in this branch) - -### FunctionCallRemovalRector -- Source: `src/Rector/Deprecation/FunctionCallRemovalRector.php` -- Test: `tests/src/Rector/Deprecation/FunctionCallRemovalRector/` -- No drupal-digest source — this is a generic configurable rector - -Tasks: -- [x] **Analyze** — rector targets `Stmt\Expression` wrapping a `FuncCall`; only standalone-statement calls are removed; assignments (`$x = f()`) and calls-as-arguments (`g(f())`) are intentionally left unchanged because `$node->expr` is not a `FuncCall` in those positions -- [x] **Coverage** — basic.php.inc covers multi-function removal and non-configured call survival; added `fqcn_prefix.php.inc` confirming `\fully_qualified_name()` form is also removed -- [x] **Edge cases** — added `no_change_expression_usage.php.inc` documenting that assigned and argument-position calls are not removed (known limitation) - ---- - -## Refactoring candidates (deferred) - -These are rectors identified as candidates for replacement by generic configurable rectors or Rector core rectors. Tracked here to avoid losing the finding. - -- [ ] **`ReplaceLocaleConfigBatchFunctionsRector`** → replace with Rector core `RenameFunctionRector`. Config: `['locale_config_batch_set_config_langcodes' => 'locale_config_batch_update_default_config_langcodes', 'locale_config_batch_refresh_name' => 'locale_config_batch_update_config_translations']`. Delete the custom class. -- [ ] **`ReplaceCommentUriRector` + `ReplaceFileGetContentHeadersRector`** → extract a new `FunctionToMethodOnFirstArgRector` generic rector. -- [ ] **`RemoveCacheExpireOverrideRector` + `RemoveHandlerBaseDefineExtraOptionsRector` + `RemoveUpdaterPostInstallMethodsRector`** → extract a new `RemoveOverriddenMethodRector` generic rector. diff --git a/docs/search_modules.py b/docs/search_modules.py deleted file mode 100644 index c20fbe6e2..000000000 --- a/docs/search_modules.py +++ /dev/null @@ -1,168 +0,0 @@ -#!/usr/bin/env python3 -"""Search Drupal GitLab for contrib modules using deprecated APIs targeted by new rectors.""" - -import json -import time -import sys -import urllib.request -import urllib.parse -from collections import defaultdict - -import os -TOKEN = os.environ["GITLAB_TOKEN"] -BASE = "https://git.drupalcode.org/api/v4" -GROUP_ID = 2 -PATH_EXCLUSIONS = "-path:core -path:vendor -path:docroot -path:web -path:profiles -path:sites" -SLEEP_BETWEEN = 2 # seconds between search requests - -SEARCHES = [ - # (rector_name, search_term) - # Drupal 11 - ("ErrorCurrentErrorHandlerRector", "Error::currentErrorHandler"), - ("FileSystemBasenameToNativeRector", "->basename("), - ("LoadAllIncludesRector", "->loadAllIncludes("), - ("MigrateSqlGetMigrationPluginManagerRector", "->getMigrationPluginManager("), - ("NodeStorageDeprecatedMethodsRector", "->revisionIds("), - ("NodeStorageDeprecatedMethodsRector", "->userRevisionIds("), - ("NodeStorageDeprecatedMethodsRector", "->countDefaultLanguageRevisions("), - ("PluginBaseIsConfigurableRector", "->isConfigurable("), - ("RemoveAutomatedCronSubmitHandlerRector", "automated_cron_settings_submit"), - ("RemoveCacheExpireOverrideRector", "function cacheExpire("), - ("RemoveHandlerBaseDefineExtraOptionsRector", "function defineExtraOptions("), - ("RemoveLinkWidgetValidateTitleElementRector", "LinkWidget::validateTitleElement"), - ("RemoveModuleHandlerAddModuleCallsRector", "->addModule("), - ("RemoveModuleHandlerDeprecatedMethodsRector", "->writeCache("), - ("RemoveModuleHandlerDeprecatedMethodsRector", "->getHookInfo("), - ("RemoveRootFromConvertDbUrlRector", "convertDbUrlToConnectionInfo("), - ("RemoveSetUriCallbackRector", "->setUriCallback("), - ("RemoveStateCacheSettingRector", "state_cache"), - ("RemoveTrustDataCallRector", "->trustData("), - ("RemoveTwigNodeTransTagArgumentRector", "TwigNodeTrans"), - ("RemoveUpdaterPostInstallMethodsRector", "function postInstallTasks("), - ("RemoveViewsRowCacheKeysRector", "function getRowCacheKeys("), - ("RenameStopProceduralHookScanRector", "StopProceduralHookScan"), - ("ReplaceAlphadecimalToIntNullRector", "alphadecimalToInt("), - ("ReplaceCommentManagerGetCountNewCommentsRector", "->getCountNewComments("), - ("ReplaceCommentUriRector", "comment_uri("), - ("ReplaceDateTimeRangeConstantsRector", "DateTimeRangeConstantsInterface"), - ("ReplaceEditorLoadRector", "editor_load("), - ("ReplaceEntityOriginalPropertyRector", "->original"), - ("ReplaceEntityReferenceRecursiveLimitRector", "RECURSIVE_RENDER_LIMIT"), - ("ReplaceFieldgroupToFieldsetRector", "'#type' => 'fieldgroup'"), - ("ReplaceFileGetContentHeadersRector", "file_get_content_headers("), - ("ReplaceLocaleConfigBatchFunctionsRector", "locale_config_batch_set_config_langcodes("), - ("ReplaceLocaleConfigBatchFunctionsRector", "locale_config_batch_refresh_name("), - ("ReplaceNodeAccessViewAllNodesRector", "node_access_view_all_nodes("), - ("ReplaceNodeAddBodyFieldRector", "node_add_body_field("), - ("ReplaceNodeModuleProceduralFunctionsRector", "node_type_get_names("), - ("ReplaceNodeModuleProceduralFunctionsRector", "node_get_type_label("), - ("ReplaceNodeModuleProceduralFunctionsRector", "node_mass_update("), - ("ReplaceNodeSetPreviewModeRector", "->setPreviewMode("), - ("ReplacePdoFetchConstantsRector", "PDO::FETCH_"), - ("ReplaceRecipeRunnerInstallModuleRector", "RecipeRunner::installModule("), - ("ReplaceSessionManagerDeleteRector", "SessionManager"), - ("ReplaceSessionWritesWithRequestSessionRector", "$_SESSION["), - ("ReplaceSystemPerformanceGzipKeyRector", "css.gzip"), - ("ReplaceThemeGetSettingRector", "theme_get_setting("), - ("ReplaceThemeGetSettingRector", "_system_default_theme_features("), - ("ReplaceUserSessionNamePropertyRector", "UserSession"), - ("ReplaceViewsProceduralFunctionsRector", "views_get_view_result("), - ("ReplaceViewsProceduralFunctionsRector", "views_view_is_enabled("), - ("ReplaceViewsProceduralFunctionsRector", "views_enable_view("), - ("StatementPrefetchIteratorFetchColumnRector", "StatementPrefetchIterator"), - ("StripMigrationDependenciesExpandArgRector", "->getMigrationDependencies("), - ("UseEntityTypeHasIntegerIdRector", "->getEntityTypeIdKeyType("), - ("UseEntityTypeHasIntegerIdRector", "->entityTypeSupportsComments("), - ("ViewsPluginHandlerManagerRector", "Views::pluginManager("), - ("ViewsPluginHandlerManagerRector", "Views::handlerManager("), - # Drupal 10 - ("ReplaceModuleHandlerGetNameRector", "moduleHandler()->getName("), - ("ReplaceRebuildThemeDataRector", "->rebuildThemeData("), - ("ReplaceRequestTimeConstantRector", "REQUEST_TIME"), - ("SystemTimeZonesRector", "system_time_zones("), -] - - -def api_get(path, params=None): - url = f"{BASE}{path}" - if params: - url += "?" + urllib.parse.urlencode(params) - req = urllib.request.Request(url, headers={"PRIVATE-TOKEN": TOKEN}) - with urllib.request.urlopen(req, timeout=15) as resp: - return json.loads(resp.read()) - - -def search_blobs(query): - full_query = f"{PATH_EXCLUSIONS} {query}" - try: - results = api_get(f"/groups/{GROUP_ID}/search", { - "scope": "blobs", - "search": full_query, - "per_page": 100, - }) - return results - except Exception as e: - print(f" ERROR: {e}", file=sys.stderr) - return [] - - -def get_project_name(project_id, cache={}): - if project_id in cache: - return cache[project_id] - try: - proj = api_get(f"/projects/{project_id}") - name = proj.get("path_with_namespace", str(project_id)) - cache[project_id] = name - time.sleep(0.5) - return name - except Exception: - cache[project_id] = str(project_id) - return str(project_id) - - -def main(): - # rector -> set of (project_id, filename) tuples - rector_hits = defaultdict(set) - # project_id -> set of rectors that hit it - project_rectors = defaultdict(set) - - print(f"Running {len(SEARCHES)} searches...", file=sys.stderr) - - for i, (rector, term) in enumerate(SEARCHES): - print(f" [{i+1}/{len(SEARCHES)}] {rector}: {term!r}", file=sys.stderr) - results = search_blobs(term) - for r in results: - pid = r["project_id"] - fname = r.get("filename", "") - rector_hits[rector].add((pid, fname)) - project_rectors[pid].add(rector) - print(f" → {len(results)} hits", file=sys.stderr) - time.sleep(SLEEP_BETWEEN) - - # Collect all unique project IDs - all_pids = set(project_rectors.keys()) - print(f"\nResolving {len(all_pids)} project names...", file=sys.stderr) - pid_to_name = {} - for pid in sorted(all_pids): - pid_to_name[pid] = get_project_name(pid) - print(f" {pid} → {pid_to_name[pid]}", file=sys.stderr) - - # Output JSON for the markdown writer - output = { - "rector_hits": { - rector: [ - {"project_id": pid, "project_name": pid_to_name.get(pid, str(pid)), "filename": fname} - for pid, fname in sorted(hits) - ] - for rector, hits in rector_hits.items() - }, - "project_rectors": { - pid_to_name.get(pid, str(pid)): sorted(rectors) - for pid, rectors in project_rectors.items() - }, - } - print(json.dumps(output, indent=2)) - - -if __name__ == "__main__": - main() diff --git a/docs/search_progress.log b/docs/search_progress.log deleted file mode 100644 index 9eaddd670..000000000 --- a/docs/search_progress.log +++ /dev/null @@ -1,1348 +0,0 @@ -Running 61 searches... - [1/61] ErrorCurrentErrorHandlerRector: 'Error::currentErrorHandler' - → 0 hits - [2/61] FileSystemBasenameToNativeRector: '->basename(' - → 100 hits - [3/61] LoadAllIncludesRector: '->loadAllIncludes(' - → 100 hits - [4/61] MigrateSqlGetMigrationPluginManagerRector: '->getMigrationPluginManager(' - → 100 hits - [5/61] NodeStorageDeprecatedMethodsRector: '->revisionIds(' - → 100 hits - [6/61] NodeStorageDeprecatedMethodsRector: '->userRevisionIds(' - → 100 hits - [7/61] NodeStorageDeprecatedMethodsRector: '->countDefaultLanguageRevisions(' - → 100 hits - [8/61] PluginBaseIsConfigurableRector: '->isConfigurable(' - → 100 hits - [9/61] RemoveAutomatedCronSubmitHandlerRector: 'automated_cron_settings_submit' - → 0 hits - [10/61] RemoveCacheExpireOverrideRector: 'function cacheExpire(' - → 100 hits - [11/61] RemoveHandlerBaseDefineExtraOptionsRector: 'function defineExtraOptions(' - → 1 hits - [12/61] RemoveLinkWidgetValidateTitleElementRector: 'LinkWidget::validateTitleElement' - → 0 hits - [13/61] RemoveModuleHandlerAddModuleCallsRector: '->addModule(' - → 100 hits - [14/61] RemoveModuleHandlerDeprecatedMethodsRector: '->writeCache(' - → 100 hits - [15/61] RemoveModuleHandlerDeprecatedMethodsRector: '->getHookInfo(' - → 100 hits - [16/61] RemoveRootFromConvertDbUrlRector: 'convertDbUrlToConnectionInfo(' - → 7 hits - [17/61] RemoveSetUriCallbackRector: '->setUriCallback(' - → 100 hits - [18/61] RemoveStateCacheSettingRector: 'state_cache' - → 100 hits - [19/61] RemoveTrustDataCallRector: '->trustData(' - → 100 hits - [20/61] RemoveTwigNodeTransTagArgumentRector: 'TwigNodeTrans' - → 22 hits - [21/61] RemoveUpdaterPostInstallMethodsRector: 'function postInstallTasks(' - → 83 hits - [22/61] RemoveViewsRowCacheKeysRector: 'function getRowCacheKeys(' - → 3 hits - [23/61] RenameStopProceduralHookScanRector: 'StopProceduralHookScan' - → 0 hits - [24/61] ReplaceAlphadecimalToIntNullRector: 'alphadecimalToInt(' - → 5 hits - [25/61] ReplaceCommentManagerGetCountNewCommentsRector: '->getCountNewComments(' - → 100 hits - [26/61] ReplaceCommentUriRector: 'comment_uri(' - → 95 hits - [27/61] ReplaceDateTimeRangeConstantsRector: 'DateTimeRangeConstantsInterface' - → 1 hits - [28/61] ReplaceEditorLoadRector: 'editor_load(' - → 100 hits - [29/61] ReplaceEntityOriginalPropertyRector: '->original' - → 100 hits - [30/61] ReplaceEntityReferenceRecursiveLimitRector: 'RECURSIVE_RENDER_LIMIT' - → 35 hits - [31/61] ReplaceFieldgroupToFieldsetRector: "'#type' => 'fieldgroup'" - → 100 hits - [32/61] ReplaceFileGetContentHeadersRector: 'file_get_content_headers(' - → 100 hits - [33/61] ReplaceLocaleConfigBatchFunctionsRector: 'locale_config_batch_set_config_langcodes(' - → 0 hits - [34/61] ReplaceLocaleConfigBatchFunctionsRector: 'locale_config_batch_refresh_name(' - → 0 hits - [35/61] ReplaceNodeAccessViewAllNodesRector: 'node_access_view_all_nodes(' - → 100 hits - [36/61] ReplaceNodeAddBodyFieldRector: 'node_add_body_field(' - → 100 hits - [37/61] ReplaceNodeModuleProceduralFunctionsRector: 'node_type_get_names(' - → 100 hits - [38/61] ReplaceNodeModuleProceduralFunctionsRector: 'node_get_type_label(' - → 34 hits - [39/61] ReplaceNodeModuleProceduralFunctionsRector: 'node_mass_update(' - → 100 hits - [40/61] ReplaceNodeSetPreviewModeRector: '->setPreviewMode(' - → 100 hits - [41/61] ReplacePdoFetchConstantsRector: 'PDO::FETCH_' - → 100 hits - [42/61] ReplaceRecipeRunnerInstallModuleRector: 'RecipeRunner::installModule(' - → 1 hits - [43/61] ReplaceSessionManagerDeleteRector: 'SessionManager' - → 100 hits - [44/61] ReplaceSessionWritesWithRequestSessionRector: '$_SESSION[' - → 100 hits - [45/61] ReplaceSystemPerformanceGzipKeyRector: 'css.gzip' - → 80 hits - [46/61] ReplaceThemeGetSettingRector: 'theme_get_setting(' - → 100 hits - [47/61] ReplaceThemeGetSettingRector: '_system_default_theme_features(' - → 71 hits - [48/61] ReplaceUserSessionNamePropertyRector: 'UserSession' - → 100 hits - [49/61] ReplaceViewsProceduralFunctionsRector: 'views_get_view_result(' - → 83 hits - [50/61] ReplaceViewsProceduralFunctionsRector: 'views_view_is_enabled(' - → 6 hits - [51/61] ReplaceViewsProceduralFunctionsRector: 'views_enable_view(' - → 2 hits - [52/61] StatementPrefetchIteratorFetchColumnRector: 'StatementPrefetchIterator' - → 0 hits - [53/61] StripMigrationDependenciesExpandArgRector: '->getMigrationDependencies(' - → 100 hits - [54/61] UseEntityTypeHasIntegerIdRector: '->getEntityTypeIdKeyType(' - → 100 hits - [55/61] UseEntityTypeHasIntegerIdRector: '->entityTypeSupportsComments(' - → 100 hits - [56/61] ViewsPluginHandlerManagerRector: 'Views::pluginManager(' - → 100 hits - [57/61] ViewsPluginHandlerManagerRector: 'Views::handlerManager(' - → 75 hits - [58/61] ReplaceModuleHandlerGetNameRector: 'moduleHandler()->getName(' - → 100 hits - [59/61] ReplaceRebuildThemeDataRector: '->rebuildThemeData(' - → 100 hits - [60/61] ReplaceRequestTimeConstantRector: 'REQUEST_TIME' - → 100 hits - [61/61] SystemTimeZonesRector: 'system_time_zones(' - → 100 hits - -Resolving 1223 project names... - 97 → project/variable - 191 → project/inactive_user - 249 → project/ar - 284 → project/pt-br - 289 → project/livediscussions - 294 → project/pushbutton_phptemplate - 301 → project/bg - 303 → project/mail_archive - 306 → project/contact_dir - 310 → project/sitemenu - 316 → project/binder - 327 → project/snippets - 337 → project/indexpage - 342 → project/tinymce - 422 → project/evaluation - 441 → project/question - 575 → project/family - 714 → project/session_limit - 744 → project/comment_mover - 939 → project/project_issue - 945 → project/node_clone - 978 → project/fieldgroup - 1005 → project/node_expire - 1039 → project/flatcomments - 1082 → project/zen - 1138 → project/calendar - 1151 → project/drush - 1258 → project/fieldgroup_table - 1337 → project/twitter - 1363 → project/bueditor - 1417 → project/audit - 1496 → project/util - 1568 → project/schema - 1666 → project/advcache - 1705 → project/synonyms - 1730 → project/related_content - 1770 → project/pmetrics - 1894 → project/cck_fieldgroup_tabs - 1952 → project/one_time_login - 1978 → project/brilliant_gallery - 2065 → project/openlayers - 2079 → project/activity - 2121 → project/xcache - 2124 → project/rdf - 2168 → project/denver - 2271 → project/bitcache - 2285 → project/advanced_forum - 2291 → project/video_filter - 2335 → project/mmedia - 2431 → project/cdn - 2523 → project/quicktabs - 2600 → project/tzfield - 2646 → project/cache_disable - 2651 → project/trash - 2658 → project/restrict_by_ip - 2760 → project/editor - 2775 → project/subdomain - 2816 → project/cacherouter - 2817 → project/mollom - 2866 → project/xmpp_server - 2880 → project/latest_members - 2942 → project/hexagon - 3063 → project/smartcache - 3104 → project/eventbrite - 3155 → project/markdown - 3156 → project/field - 3174 → project/autotag - 3330 → project/fast_gallery - 3591 → project/nodetypeviews - 3635 → project/views_exclude_previous - 3659 → project/cache_browser - 3738 → project/comment_perm - 3805 → project/genesis - 3873 → project/bundles - 3917 → project/heartbeat - 4031 → project/admin_notify - 4095 → project/inherit - 4196 → project/fbconnect - 4206 → project/addanother - 4288 → project/accessible - 4369 → project/storage_api - 4408 → project/uc_fedex - 4485 → project/googlenews - 4510 → project/querypath - 4557 → project/popups_subedit - 4559 → project/aurigma - 4568 → project/almanac - 4606 → project/module_grants - 4621 → project/css_gzip - 4627 → project/fieldtool - 4638 → project/visitors - 4652 → project/booking_timeslots - 4671 → project/collection - 4795 → project/administration_notification - 4833 → project/search_by_page - 4939 → project/makemeeting - 4956 → project/role_inheritance - 4957 → project/views_natural_sort - 4970 → project/oracle - 5055 → project/cck_inputs - 5104 → project/zeropoint - 5141 → project/qpservices - 5158 → project/dbtng - 5316 → project/adt_basetheme - 5362 → project/cck_sync - 5411 → project/adaptivetheme - 5444 → project/cache - 5481 → project/jp_mobile - 5494 → project/casaa - 5625 → project/guidance - 5738 → project/tupas - 5765 → project/simplenews_content_selection - 5930 → project/distro - 6019 → project/languageassign - 6109 → project/styles - 6245 → project/profile_migrate - 6452 → project/meetu - 6455 → project/freeagent - 6479 → project/openid_connect - 6486 → project/featured_content - 6551 → project/node_widget - 6610 → project/acc - 6632 → project/pirets - 6663 → project/css_emimage - 6676 → project/custom_search - 6705 → project/briefcase - 6719 → project/context_admin - 6751 → project/d7 - 6858 → project/winners - 6861 → project/content_type_exporter - 6870 → project/settings_audit_log - 6922 → project/views_linkarea - 6961 → project/sqlsrv - 7006 → project/content_display_order - 7070 → project/mongodb_dbtng - 7073 → project/revision_all - 7089 → project/cache_actions - 7093 → project/nodereference_basket - 7108 → project/field_or - 7220 → project/translation_management - 7241 → project/feeds_view_parser - 7245 → project/virtual_roles - 7296 → project/qfield - 7310 → project/views_content_cache - 7367 → project/turbo - 7402 → project/nopremium - 7433 → project/download_file - 7450 → project/cck_signup - 7559 → project/openscholar_vsite - 7684 → project/internet_archive - 7816 → project/hose_xml - 7900 → project/media_ustream - 7926 → project/imagefetchr - 7948 → project/highcharts - 8063 → project/menu_minipanels - 8197 → project/onepage - 8225 → project/mb - 8285 → project/recruit - 8296 → project/relation - 8368 → project/references - 8405 → project/cf - 8434 → project/ct_plus - 8453 → project/max_age - 8458 → project/node_gallery_bulk_operations - 8520 → project/node_gallery_taxonomy - 8533 → project/backup_migrate_dropbox - 8534 → project/dns - 8595 → project/podgroups - 8618 → project/cache_backport - 8635 → project/block2field - 8691 → project/sensor_hub - 8821 → project/profile_setup_api - 8863 → project/imageeditor - 8864 → project/merci_signup - 8882 → project/html5_boilerplate - 8889 → project/merci_barcode_labels - 8912 → project/barracuda - 8947 → project/wysiwyg_fields - 8969 → project/onus - 9044 → project/taxonomy_display - 9062 → project/recently_read - 9099 → project/vinculum - 9123 → project/1087726 - 9186 → project/mobile_jquery - 9201 → project/volunteer_rally_features - 9202 → project/vagrant - 9255 → project/commerce_qb_webconnect - 9273 → project/cache_heuristic - 9274 → project/donor_rally_features - 9292 → project/flow - 9324 → project/recurly - 9423 → project/student_signup - 9450 → project/cache_graceful - 9530 → project/commerce_fieldgroup_panes - 9628 → project/sfactive - 9636 → project/octopus - 9656 → project/deds_client - 9658 → project/openid_sso_provider - 9665 → project/sharebar - 9745 → project/commerce_invoice - 9770 → project/corporative_site - 9833 → project/microdata - 9847 → project/b2b_store_solution - 9911 → project/dt - 9950 → project/dummy_content - 9970 → project/colors - 9979 → project/prometheus - 9981 → project/field_weight - 10014 → project/hubspot - 10049 → project/meerkat - 10080 → project/rules_example - 10186 → project/nucleus - 10204 → project/lc3_clean - 10247 → project/video_embed_field - 10250 → project/views_node_access - 10271 → project/msnf - 10285 → project/time_tracker_simple - 10325 → project/product_reference_view - 10339 → project/views_query_na_subquery - 10369 → project/session_proxy - 10377 → project/nodeaccesskeys - 10384 → project/commerce_purchase_order - 10405 → project/onepagecv - 10416 → project/archibald - 10452 → project/shopcart - 10543 → project/featured_news_feature - 10594 → project/node_announce - 10703 → project/manymail - 10712 → project/commerce_installments - 10715 → project/odir - 10787 → project/bundle_copy - 10795 → project/cachetags - 10913 → project/arctica - 10942 → project/pager_for_content_type - 11093 → project/fieldgroup_htabs - 11136 → project/survey_builder - 11200 → project/black_hole - 11214 → project/amazon_import - 11286 → project/comment_goodness - 11295 → project/entityform - 11324 → project/drupalace - 11394 → project/context_date - 11404 → project/twentyeleven - 11481 → project/fieldgroup_callouts - 11503 → project/list_predefined_options - 11529 → project/drupalgap - 11537 → project/drupalcon_base - 11542 → project/cgpa_calculator - 11552 → project/novalnet - 11565 → project/ua_cache_bypass - 11613 → project/cforge - 11635 → project/shareaholic - 11641 → project/mongodrop - 11653 → project/elms_features - 11684 → project/views_dependent_filters - 11704 → project/voipuser - 11861 → project/erpal - 11880 → project/aether - 11900 → project/devshop_hosting - 11943 → project/rocketship - 11953 → project/hpcloud - 12057 → project/redhen_demo - 12072 → project/relation_add - 12118 → project/rebuild - 12168 → project/node_notify - 12192 → project/comment_easy_reply - 12442 → project/node_field - 12462 → project/opac - 12511 → project/panels_frame - 12520 → project/engagement - 12559 → project/fieldgroup_placeholder - 12583 → project/deeplink - 12593 → project/commerce_payleap - 12625 → project/booking_com_api - 12643 → project/search_api_acquia - 12677 → project/bundle_aggregation - 12690 → project/ole - 12717 → project/1635422 - 12848 → project/html_title - 13003 → project/syndicator - 13021 → project/adbc - 13039 → project/opigno_glossary - 13086 → project/fetcher - 13111 → project/ddcla - 13125 → project/transcribe_distribution - 13258 → project/wildfire - 13263 → project/move_user - 13323 → project/tmgmt_server - 13340 → project/autoslave - 13349 → project/visualization - 13366 → project/prh_search - 13452 → project/memory_profiler - 13458 → project/random_weight - 13590 → project/timezone_picker - 13600 → project/pdfck - 13611 → project/session_cache - 13628 → project/wem - 13635 → project/commerce_booking - 13754 → project/userpickit - 13758 → project/geckoboard_push - 13854 → project/openbadging - 13895 → project/ajaxnewcounter - 13917 → project/simpleantispam - 14076 → project/dynamodb - 14095 → project/wysiwyg_ckeditor - 14103 → project/factorydrone - 14136 → project/sshid - 14139 → project/courseplanner - 14211 → project/restaurant - 14333 → project/wf - 14446 → project/tr_kurulum - 14448 → project/blurry - 14469 → project/background_audio - 14470 → project/field_group_ajaxified_multipage - 14506 → project/tb_blog_starter - 14507 → project/tb_events_starter - 14509 → project/tb_hadelis_starter - 14510 → project/tb_methys_starter - 14511 → project/tb_mollise_starter - 14512 → project/tb_neris_starter - 14513 → project/tb_palicico_starter - 14514 → project/tb_purity_starter - 14515 → project/tb_rave_starter - 14522 → project/tb_sirate_starter - 14523 → project/gladcamp - 14614 → project/latest - 14636 → project/md_foto - 14682 → project/content_access_view - 14693 → project/feeds_tamper_string2id - 14698 → project/portal_theme - 14713 → project/uyan - 14723 → project/og_admin_block - 14728 → project/fontello - 14784 → project/past - 14786 → project/paddle_menu_manager - 14796 → project/comment_fragment - 14853 → project/memcache_storage - 14926 → project/commons_migration - 15002 → project/fts - 15015 → project/bootstrap_fieldgroup - 15045 → project/endicia - 15128 → project/entity_lister - 15185 → project/context_cache - 15194 → project/og_menu_single - 15203 → project/icomoon - 15222 → project/open_badging_installation_profile - 15268 → project/visualization_d8 - 15275 → project/ads - 15291 → project/fluxservice - 15378 → project/cm_cablecast - 15435 → project/drupdates - 15487 → project/optimizedb - 15497 → project/bassets_sw - 15568 → project/content_trust - 15590 → project/bear_skin - 15613 → project/sauce - 15649 → project/contextly - 15654 → project/rio - 15660 → project/markaspot - 15665 → project/drupal_wall - 15666 → project/pathed_files - 15691 → project/social_comments - 15746 → project/openpolitic - 15846 → project/abc - 15952 → project/monitoring - 16013 → project/simple_aggregation - 16050 → project/user_content_type - 16052 → project/pax_content - 16100 → project/disable_modules - 16108 → project/hookalyzer - 16138 → project/site_search_analytics - 16192 → project/mobilearkickstart - 16243 → project/reevoomark - 16249 → project/enhanced_page_cache - 16252 → project/berry - 16367 → project/inspector - 16382 → project/wunderground_weather - 16498 → project/socialshare - 16545 → project/multipage_navigation - 16549 → project/twbs - 16585 → project/at_base - 16588 → project/at_theming - 16663 → project/ctools_view_access - 16865 → project/persistent_menu_items - 16912 → project/views_selective_filters - 16918 → project/civicrm_event_receipts - 16984 → project/spanish_distribution - 17013 → project/fuse - 17101 → project/kalvi_core - 17142 → project/chatwee - 17146 → project/flipping_book - 17226 → project/visitor_actions - 17283 → project/social_content - 17324 → project/browsersync - 17399 → project/new_relic_insights - 17416 → project/xml_export - 17443 → project/console - 17483 → project/ajax_node_loader - 17523 → project/visitorsvoice - 17618 → project/codebook_core - 17753 → project/codebook_print_pdf - 17769 → project/cove_api - 17814 → project/db_remote - 17822 → project/quickedit - 17872 → project/acquia_search_config - 17914 → project/events_features - 17982 → project/form_default_button - 17996 → project/field_group_save_button - 18036 → project/paypal_roles - 18059 → project/staticfilecache - 18092 → project/eform - 18094 → project/openstack_storage - 18124 → project/qui - 18163 → project/commerce_priceminister - 18181 → project/og_groupcontent - 18191 → project/wincachedrupal - 18291 → project/casperjs - 18292 → project/uc_abandoned - 18297 → project/administrative_help - 18406 → project/url_embed - 18457 → project/simple_nodeblock - 18502 → project/go1_base - 18553 → project/copyscape - 18559 → project/govbr - 18606 → project/oa_wizard - 18708 → project/scholarly_lite - 18710 → project/readmore_ajax - 18752 → project/csf - 18763 → project/quizz - 18777 → project/quandl - 18815 → project/image_download_formatter - 18842 → project/service_container - 18882 → project/better_field_formatters - 18897 → project/qurandistribution - 18927 → project/oa_folders - 18967 → project/redhen_raiser - 19090 → project/settingsphp - 19162 → project/hunter - 19167 → project/usercancel_contentassigntoadmin - 19204 → project/taxonomy_linking - 19210 → project/taxonomy_autolink - 19307 → project/mysql_async - 19319 → project/node_title_help_text - 19339 → project/update_external_links - 19391 → project/canvas - 19409 → project/contentassigntootheruser - 19425 → project/xing_connect - 19494 → project/hierarchical_select_access - 19499 → project/yaqut_epub_generator - 19654 → project/commune - 19677 → project/priority_queue - 19746 → project/social_feed_field - 19807 → project/wechat_views - 19847 → project/commerce_order_reminder - 19876 → project/flysystem - 19961 → project/feeds_entity_processor - 19970 → project/entity_gallery - 20010 → project/domain_wise_aggregation - 20047 → project/stacksight - 20051 → project/componentize - 20056 → project/sqlbuddy - 20087 → project/hooks - 20151 → project/contact_centre - 20172 → project/selective_tweets - 20176 → project/private_image_cache - 20260 → project/soauth - 20289 → project/commerce_checkout_products_list - 20330 → project/tagged_systemqueue - 20381 → project/future_nodes - 20410 → project/devinci - 20426 → project/orghunter - 20447 → project/era - 20484 → project/mpub - 20556 → project/bundle_copy_commerce - 20588 → project/motionpoint - 20692 → project/basic_stats_token - 20730 → project/saml_idp - 20814 → project/editor_advanced_link - 20853 → project/stop_broken_link_in_body - 20879 → project/commerce_behat - 20888 → project/editor_ckeditor_widgets - 20971 → project/experd - 20976 → project/glazed_free - 20979 → project/git_book - 20990 → project/development - 21018 → project/amber - 21023 → project/couchbasedrupal - 21067 → project/supercache - 21069 → project/yamlform - 21075 → project/services_session_token_auth - 21127 → project/freshdesk_sso - 21149 → project/oa_basetheme - 21156 → project/rocket_chat - 21172 → project/user_access_timeslot - 21228 → project/big_pipe_demo - 21241 → project/techsupport - 21242 → project/tsm - 21317 → project/content_browser - 21439 → project/quick_pages - 21441 → project/field_group_table_component - 21452 → project/grant - 21548 → project/skillset_inview - 21579 → project/clu - 21609 → project/confi - 21675 → project/display_machine_name - 21683 → project/migrate_views - 21780 → project/anonymous_subscriptions - 21791 → project/find_text - 21816 → project/patternlab - 21827 → project/chartjs - 21828 → project/program - 21898 → project/ectostar_standard - 21934 → project/riddle_marketplace - 21936 → project/session_entity - 22307 → project/config_split - 22324 → project/berf - 22337 → project/apcu - 22341 → project/pdftemplate - 22401 → project/customizable_entities - 22479 → project/paragraphs_summary - 22530 → project/agov_base - 22547 → project/entity_reference_override - 22613 → project/smartparticipation - 22692 → project/discussions - 22735 → project/emulsify - 22810 → project/npop - 22819 → project/dawn - 23010 → project/message_private - 23034 → project/pki_ra - 23064 → project/updated - 23072 → project/csv_to_config - 23130 → project/admin_toolbar_content_languages - 23279 → project/condition_pack - 23284 → project/rel_content - 23311 → project/sports_league - 23354 → project/commerce_currency_switcher - 23398 → project/reporting_cloud - 23431 → project/transfer_user_content - 23447 → project/showcase_lite - 23448 → project/bynder - 23470 → project/gp_reviews - 23523 → project/scoopit - 23632 → project/complex_workflow - 23685 → project/rules_letter - 23717 → project/baidumap_fieldtype - 23726 → project/entity_keyvalue - 23838 → project/views_ajax_form - 23853 → project/cision_block - 23874 → project/node_creator_system_details - 23954 → project/wysiwyg_trumbowyg - 24022 → project/domain_video_sitemap - 24037 → project/proconcom - 24042 → project/bundle_copy_profile2 - 24046 → project/bulk_update_fields - 24064 → project/social_media_integration - 24128 → project/drush_async_api - 24220 → project/message_thread - 24357 → project/gitinfo - 24364 → project/domain_simple_sitemap - 24420 → project/razoreye_biz - 24449 → project/ppoidc - 24505 → project/tmgmt_transifex - 24699 → project/kashmir - 24787 → project/quicker_login - 24795 → project/abookings - 24829 → project/node_revision_private_files_access_permission - 25066 → project/search_api_lucene - 25097 → project/drupal_extra - 25172 → project/sketch - 25232 → project/green_theme - 25257 → project/background_image - 25294 → project/pankm - 25315 → project/auto_alter - 25326 → project/bif - 25336 → project/uc_recently_viewed_products - 25437 → project/sendinblue_rules - 25438 → project/acal - 25448 → project/entity_overlay - 25453 → project/byu_theme - 25475 → project/examplelist - 25524 → project/rsvp_list - 25540 → project/entity_browser_block - 25544 → project/sshop - 25548 → project/jats_generator - 25567 → project/synimage - 25577 → project/dut - 25598 → project/bynder_orbit - 25665 → project/ckeditor_config - 25692 → project/ovh - 25713 → project/authtoken - 25865 → project/image_moderate - 25894 → project/external_page_redirect - 25896 → project/byu_installation_profile - 25927 → project/automatic_field_saver - 25985 → project/entity_domain_access - 26017 → project/hook_manager - 26025 → project/belle - 26057 → project/temporary_download - 26081 → project/page_hits - 26124 → project/plus - 26141 → project/node_creation_links - 26169 → project/yg_booster - 26233 → project/yg_charity - 26260 → project/rss_embed_field - 26339 → project/yg_flew - 26708 → project/simple_multistep - 26713 → project/tally - 26733 → project/timber - 26816 → project/mustache_templates - 26838 → project/multitype_slider - 26869 → project/friendship - 26902 → project/skyword - 26951 → project/field_pager - 26961 → project/communications - 27005 → project/social_post_video - 27033 → project/corporate_lite - 27106 → project/page_menu_reorder - 27208 → project/change_author_action - 27283 → project/yg_business_plus - 27296 → project/inline_formatter_field - 27318 → project/yg_business_line - 27349 → project/yg_medical - 27405 → project/real_estate_lp_profile - 27409 → project/esm - 27445 → project/simple_sitemap_views - 27526 → project/node_menu_item_visibility_default_behaviour - 27553 → project/dam - 27656 → project/entity_reference_ajax_formatter - 27712 → project/client_config_care - 27734 → project/conference_lite - 27736 → project/guesthouse_lite - 27744 → project/lms - 27768 → project/yg_aesthetic - 27770 → project/yg_hotel - 27844 → project/yg_medicare - 27845 → project/social_auth_itsme - 27922 → project/yg_iconic - 27923 → project/yg_law_firm - 27952 → project/template_entities - 28029 → project/entity_grants - 28148 → project/yg_creative - 28302 → project/sparql_entity_storage - 34868 → project/islandora - 44107 → project/qtools_common - 45456 → project/digitalclock - 47202 → project/yg_solid - 47221 → project/yg_black - 47231 → project/module_maker - 47295 → project/node_export - 47298 → project/mailing_list - 47385 → project/entity_embed - 47401 → project/materialize - 47422 → project/twig_tweak - 47583 → project/userswitch - 47825 → project/entity_hierarchy - 47873 → project/field_group_label_classes - 47880 → project/entity_list - 48060 → project/smartling - 48123 → project/certificate - 48161 → project/ULT - 49251 → project/feed_block - 49252 → project/community_tasks - 49470 → project/config_entity_revisions - 49566 → project/multi_render_formatter - 49677 → project/icn - 49723 → project/mutual_credit - 49725 → project/drd - 49900 → project/onetime_download - 49956 → project/abtestui - 49979 → project/bulk_update_fields_commerce - 50151 → project/entity_translation - 50161 → project/dbee - 50166 → project/wsdata - 50178 → project/ckeditor_mentions - 50229 → project/bulk_copy_fields - 50230 → project/vfd - 50362 → project/election - 50434 → project/slack_receive - 50437 → project/dvg_stuf_bg - 50565 → project/custom_list - 50738 → project/user_delete_reassign - 50819 → project/spambot - 51085 → project/workbench_moderation - 51166 → project/odoo_api - 51217 → project/tide_core - 51218 → project/tide_api - 51249 → project/amazon - 51344 → project/usajobs_integration - 51352 → project/autosave_form - 51358 → project/entity_reference_uuid - 51380 → project/views_entity_embed - 51393 → project/login_alert - 51461 → project/auto_nodetitle - 51487 → project/maps_suite - 51500 → project/project - 51684 → project/views_extras - 51722 → project/filebrowser - 51727 → project/token - 51772 → project/onlyone - 51850 → project/anonymous_publishing - 51935 → project/views_advanced_cache - 52040 → project/salesforce_auth - 52081 → project/simple_node_importer - 52106 → project/delphi - 52126 → project/preserve_changed - 52158 → project/api - 52161 → project/og - 52207 → project/feeds - 52281 → project/civicrm_entity - 52307 → project/cultura - 52538 → project/content_packager - 52555 → project/field_formatter_key_label - 52646 → project/shopify - 52855 → project/idea - 53194 → project/authcache - 53222 → project/metatag - 53388 → project/config_pages - 53457 → project/openstory - 53533 → project/opigno_learning_path - 53807 → project/boxout - 53828 → project/bootstrap4 - 53860 → project/bahai_incubator - 54115 → project/course - 54190 → project/file_shelf - 54226 → project/gathercontent - 54247 → project/contacts - 54674 → project/riddler - 54935 → project/translation_views - 55014 → project/performance_toolkit - 55171 → project/votingapi - 55234 → project/flmngr - 55297 → project/flexi_pattern_lab - 55408 → project/global_gateway - 55425 → project/ckeditor_codemirror - 55547 → project/facebook_pixel - 55687 → project/tmgmt_deepl - 55697 → project/acquia_commercemanager - 55750 → project/read_time - 55755 → project/social_hub - 55801 → project/deploy_key - 55863 → project/depcalc - 55883 → project/swagger_ui_formatter - 55957 → project/quick_node_clone - 56187 → project/closedquestion_scoreboard - 56221 → project/datex - 56286 → project/dynamic_entity_reference - 56296 → project/editor_advanced_image - 56300 → project/potion - 56320 → project/plugin - 56359 → project/languagefield - 56521 → project/controller_annotations - 56659 → project/ercore - 56706 → project/registration_form - 56719 → project/multiversion - 56769 → project/hold_my_draft - 56855 → project/tmgmt - 56876 → project/tmgmt_smartling - 56945 → project/questions_answers - 56975 → project/d6lts - 57226 → project/edit_content_type_tab - 57266 → project/protected_file - 57564 → project/tome - 57654 → project/advagg - 57655 → project/miniorange_oauth_client - 57678 → project/eid_auth - 57706 → project/lightning_workflow - 57717 → project/dvg_appointments - 57777 → project/google_analytics_counter - 57841 → project/gdpr - 57971 → project/automatic_updates - 57997 → project/campaignion - 58047 → project/apigee_m10n - 58053 → project/media_migration - 58118 → project/restful - 58193 → project/tripal - 58220 → project/wim - 58233 → project/openpublic - 58249 → project/smartid_auth - 58354 → project/acsf - 58383 → project/dvg - 58470 → project/entity_translation_unified_form - 58509 → project/wxt - 58608 → project/lightning_core - 58633 → project/openfed - 58647 → project/views - 58658 → project/df - 58720 → project/apigee_edge - 58746 → project/crypto_distribution - 58759 → project/outlayer - 58768 → project/rng - 59005 → project/social - 59035 → project/lightning_layout - 59097 → project/easy_booking - 59133 → project/entityqueue - 59145 → project/brightcove - 59179 → project/nbox - 59186 → project/daterange_simplify - 59234 → project/devel - 59279 → project/searchstax - 59375 → project/private_message - 59387 → project/checklistapi - 59396 → project/ds - 59401 → project/file_entity - 59409 → project/pp_graphsearch - 59468 → project/probo - 59473 → project/rules - 59484 → project/stratoserp - 59503 → project/degov - 59514 → project/ctools - 59586 → project/monster_menus - 59603 → project/lingotek - 59610 → project/group - 59614 → project/entity_import - 59615 → project/salesforce - 59618 → project/intercept - 59642 → project/wisski - 59644 → project/simple_sitemap - 59671 → project/field_group - 59676 → project/skilling - 59691 → project/cilogon_auth - 59699 → project/tara - 59714 → project/thunder - 59723 → project/indieweb - 59736 → project/rocketship_core - 59739 → project/geolocation - 59741 → project/ckeditor_uploadimage - 59747 → project/cms_content_sync - 59781 → project/computed_field - 59814 → project/search_api - 59815 → project/search_api_autocomplete - 59833 → project/search_api_saved_searches - 59843 → project/bat - 59849 → project/cloud - 59851 → project/gutenberg - 59857 → project/acquia_contenthub - 59873 → project/viewfield - 59888 → project/paddle_selenium_tests - 59890 → project/simply_signups - 59891 → project/infrastructure - 59899 → project/facet_granular_date - 59930 → project/telega - 59941 → project/smart_date - 59956 → project/communication - 59984 → project/ui_patterns_settings - 59988 → project/evangelische_termine - 60013 → project/participatory_process - 60036 → project/mili - 60037 → project/link_field_display_mode_formatter - 60038 → project/conference_suite - 60087 → project/exsen - 60215 → project/aeg - 60227 → project/govimentum - 60278 → project/jsonapi_comment - 60301 → project/markdown_exporter - 60334 → project/minimal_lite - 60395 → project/muser - 60487 → project/cypress - 60491 → project/imotilux - 60499 → project/d_test - 60502 → project/simplifying - 60508 → project/js_entity - 60517 → project/revisiondiff - 60625 → project/gearbox - 60656 → project/decoupled - 60682 → project/delivery - 60695 → project/pub_options - 60837 → project/virtualcare - 60863 → project/druvel - 60909 → project/inline_image_token - 60916 → project/jsonapi_example - 61069 → project/audit_monitoring - 61073 → project/meta_entity - 61092 → project/views_extender - 61195 → project/deprecation_status - 61256 → project/gtfs - 61270 → project/inline_field_group - 61313 → project/stack_dd - 61358 → project/catalog_lite - 61386 → project/commercetools - 61449 → project/moderation_team - 61530 → project/language_suggestion - 61656 → project/bootstrap_italia - 61659 → project/entity_visibility_preview - 61662 → project/commerce_store_override - 61791 → project/elegant_showcase - 61809 → project/lw_groups - 61877 → project/clockify - 61899 → project/commerce7_razorpay - 62017 → project/nodeinfo - 62055 → project/eus - 62102 → project/ms_react - 62128 → project/hubspot_integration - 62173 → project/content_admin_tools - 62331 → project/knowledge - 62371 → project/zuvi - 62378 → project/drupalru_d7 - 62382 → project/arch - 62418 → project/pager_serializer - 62421 → project/sitemorse_lite - 62490 → project/tactic - 62579 → project/vani - 62602 → project/social_media_api - 62687 → project/workflow_extras - 62699 → project/smart_content_ipstack - 62719 → project/entity_reference_preview - 62728 → project/sri - 62760 → project/admin_can_login_anyuser - 62764 → project/cookie_samesite_support - 62772 → project/file_update - 62785 → project/entity_sync - 62790 → project/ezcontent_api - 62842 → project/untatu - 62851 → project/entity_reference_dynamic_display - 62868 → project/dxpr_theme - 62934 → project/zinble - 63073 → project/tweet_reference - 63108 → project/licenses - 63118 → project/dplor - 63177 → project/mtc - 63218 → project/oidc - 63299 → project/tranc - 63343 → project/ckeditor_exclude_tags - 63480 → project/ezcontent_publish - 63487 → project/eu_cookie_compliance_rocketship - 63489 → project/oidc_mcpf - 63559 → project/layoutcomponents - 63588 → project/acquia_migrate - 63624 → project/ubershopwish - 63669 → project/ggroup - 63725 → project/photogenictheme - 63757 → project/neon_api - 63790 → project/taxonomy_parents_index - 63797 → project/eventer - 63847 → project/fmrest - 63969 → project/dolphin_theme - 63976 → project/simple_oauth_facebook_connect - 64020 → project/lgpd - 64036 → project/grapesjs_editor - 64084 → project/entity_track - 64133 → project/bing_ads - 64168 → project/cmrf_form_processor - 64219 → project/ginvite - 64223 → project/publisso_gold - 64291 → project/entitree - 64348 → project/simple_oauth_google_connect - 64520 → project/robolytix - 65320 → project/multilingual_plus - 65525 → project/social_media_image_generator - 65774 → project/backdrop_upgrade_status - 66086 → project/opendevportal - 66091 → project/rmkv - 66097 → project/rating_list - 66128 → project/bootstrap5 - 66142 → project/basket - 66228 → project/edux - 67002 → project/next_views_entity_reference - 67217 → project/socialblue - 67475 → project/entity_reference_views_backfill - 67940 → project/anonymoussession - 68121 → project/nested_entity_reference_formatter - 68321 → project/views_migration - 68467 → project/rsvplist - 68595 → project/social_auth_buttons - 69687 → project/sanitize_pii - 69747 → project/cmrf_core - 69929 → project/stackla_widget - 69954 → project/date_augmenter - 70307 → project/ruhi - 70422 → project/mycity - 70928 → project/field_completeness - 71484 → project/timezone_calculator - 71508 → project/drupalsqlsrvci - 71887 → project/rocketship_florista_demo_profile - 72178 → project/field_encrypt_searchable - 72597 → project/intl_date - 72831 → project/node_randomizer - 73073 → project/opigno_social - 73144 → project/learnosity - 73211 → project/ajans - 73212 → project/worldmap - 73291 → project/acquia_perz - 73338 → project/feedstextareafetcher - 73343 → project/mailchimp_transactional - 73813 → project/toast_messages - 74275 → project/views_override_viewmode - 74572 → project/commerce_factuursturen - 74592 → project/gtfs_511 - 74593 → project/gtfs_rt - 74600 → project/gtfs_geo - 75981 → project/payment_button_drupal_plugin - 76180 → project/eau_theme - 76361 → project/edwt - 77509 → project/testproject4234 - 78054 → project/audit_report - 78499 → project/usage_data - 78721 → project/commerce_ticketing_checkin - 79554 → project/external_entity - 79588 → project/gnode_request - 79702 → project/public_revisions - 80771 → project/ckeditor_custom_paste_filters - 80778 → project/lingo24 - 81033 → project/cookies_module_handler - 81045 → project/custom_field - 81142 → project/view_mode_crop - 81278 → project/migrate_visualize - 81804 → project/node_singles - 81814 → project/entity_sort - 81865 → project/entity_references_map - 81896 → project/ayrshare - 82252 → project/reassign_user_content - 82260 → project/commerce_invoice_ubl - 82297 → project/tracker - 82549 → project/xara - 82962 → project/hook_event - 83095 → project/session_inspector - 83284 → project/whereabouts - 83449 → project/sitewide_alerts - 83700 → project/schemadotorg - 83752 → project/veracity_vql - 84590 → project/trailless_menu - 84617 → project/acquia_dam - 85308 → project/tmgmt_smartcat - 85551 → project/widen_media - 85563 → project/stage_one_theme - 86013 → project/content_moderation_node_grants - 86019 → project/creative_innovative - 86134 → project/crema - 86288 → project/particles_orange - 86399 → project/sva - 86424 → project/dark_awesome - 86809 → project/social_auth_tiktok_decouple - 86813 → project/address_suggestion - 86956 → project/social_auth_apple_decouple - 87283 → project/dxpr_builder - 87638 → project/group_entity - 88384 → project/uninstall_unexisting - 88438 → project/entity_distribution - 88882 → project/group_domain - 89428 → project/tone - 90367 → project/cellular4drupal - 90572 → project/dsfr - 90708 → project/library_management_system - 91077 → project/smart_migrate_cli - 91175 → project/idyllic - 92163 → project/dark_page - 92291 → project/smash_lite - 92563 → project/eventbrite_one_way_sync - 92852 → project/image_as_media - 92961 → project/asset_autoload - 93001 → project/queue_scheduler - 93188 → project/ckeditor5_premium_features - 93199 → project/function_autoload - 93499 → project/test_helpers - 93801 → project/seb - 94979 → project/marvelous - 94996 → project/vwo - 95795 → project/video_toolbox - 95804 → project/datafield - 95840 → project/loop_workers - 96166 → project/media_filter - 96282 → project/access_policy - 98695 → project/social_group_types - 99033 → project/menu_parser_php - 99358 → project/granulartimecache - 101539 → project/acumatica - 101942 → project/unpublished_file - 102735 → project/fashion_beauty - 102813 → project/date_occur - 104004 → project/ws_event - 104066 → project/ckeditor5_highlight - 104812 → project/scorm_field - 105011 → project/nostr_id_nip05 - 107494 → project/group_welcome_message - 108775 → project/ckeditor5_mentions - 108783 → project/views_moderation_state_weights - 109268 → project/group_media_library_extra - 109975 → project/rest_entity_display - 109993 → project/social_lms_integrator - 110336 → project/mahi - 110398 → project/views_sql_twig_fields - 110798 → project/hook_profiler - 111315 → project/vcp4dates - 111643 → project/published_referenced_entity - 112735 → project/core_logs - 113806 → project/ct_expire - 113931 → project/visual_editor - 115517 → project/power_portfolio - 115956 → project/pwbi - 116041 → project/nodehive_core - 116100 → project/ckeditor5_spoiler - 116731 → project/kart - 116841 → project/potent_allure - 117060 → project/rhythm - 117346 → project/txt42 - 117773 → project/engaging_networks - 117973 → project/harmony_haven - 118186 → project/novel_delights - 118568 → project/custom_entity_example - 118693 → project/entity_usage_updater - 119094 → project/kamihaya_cms - 119344 → project/entity_sync_odata - 119794 → project/link_description_attributes - 120281 → project/decorx - 120874 → project/abinbev_gmap - 120883 → project/diner_delights - 121122 → project/ckeditor_lts - 122249 → project/business_dev - 123514 → project/twilio_otp_login - 124420 → project/service - 124680 → project/multi_purpose - 126576 → project/time_clock - 127054 → project/animal_shelter - 127162 → project/current_date_time - 127276 → project/entity_reference_edit_link - 128959 → project/view_filter_promotion - 129676 → project/tiendaparamipyme - 131151 → project/pantheon_autopilot_toolbar - 132406 → project/nitropack - 132503 → project/edit_plus - 133730 → project/rdf_sync - 134090 → project/ecwid - 134243 → project/git_wiki_help - 135576 → project/everlms - 135646 → project/sgd_user_status - 135785 → project/ckeditor_braille - 138963 → project/feature_boost - 139702 → project/pets_clinic - 142569 → project/ckeditor5_plugin_pack - 143385 → project/experience_builder - 144182 → project/lgms - 144795 → project/expirable_content - 145116 → project/diboo_core - 146166 → project/cm_data_layer - 147460 → project/ckeditor_historylog - 147502 → project/media_views_filter - 148214 → project/sgd_watchdog_summary - 148466 → project/field_group_vertical_tabs - 149523 → project/ckeditor5_deepl - 150232 → project/smileys_field - 150956 → project/session_management - 151194 → project/a12s_locations - 152219 → project/duplicate_node - 152311 → project/more_fields - 154062 → project/acquia_vwo - 154063 → project/view_usernames_node_author - 154357 → project/loginnotification - 154509 → project/consent_management - 157751 → project/diba_clean - 158230 → project/media_icon_deliver - 158891 → project/ai_agents - 159795 → project/micronode_block - 160629 → project/drupalfit - 161548 → project/mdp - 161998 → project/bootstrap3 - 162094 → project/localist_drupal - 163174 → project/ai_eca - 163611 → project/secure_nodes - 163816 → project/ai_ckeditor_extras - 164248 → project/externalauth_force - 164485 → project/social_auth_entra_id - 166002 → project/bibliocommons - 167065 → project/mail_box_management - 167487 → project/search_api_exclude_lb - 167646 → project/theme_file_editor - 168630 → project/substitutoo - 170081 → project/nava - 170818 → project/ai_upgrade_assistant - 171755 → project/entity_mesh - 172885 → project/deepseek - 174206 → project/logout_timeout - 176726 → project/override_cache_control_headers - 176774 → project/unused_files_delete - 177369 → project/smartlinker_ai - 179254 → project/book_library_api - 179857 → project/track_usage - 179884 → project/unused_media_filter - 179931 → project/media_folders - 180259 → project/schema_form - 180286 → project/file_visibility - 181203 → project/json_drop_api - 181319 → project/sdx - 183657 → project/search_api_postgresql - 185077 → project/salesforce_push_queue_ui - 185845 → project/babel - 188516 → project/open_vocabularies - 188930 → project/dsfr4drupal_picker - 189447 → project/drupal_content_repository - 190652 → project/orchestration - 190686 → project/chromeless - 191533 → project/simpleavs - 193057 → project/toast_image_editor - 193305 → project/simplesamlphp_sp - 193866 → project/module_file_editor - 195589 → project/saar - 195972 → project/ckeditor5_scroll_fix - 196049 → project/stenographer - 196085 → project/graphql_shield - 196314 → project/livre - 196530 → project/rendred_entity_list_formatter - 196536 → project/rendered_entity_list_formatter - 197809 → project/editor_advanced_table - 197857 → project/user_logout - 198724 → project/ai_editoria11y - 200208 → project/conreg - 200422 → project/uni - 200814 → project/rail_ai_provider - 201686 → project/layout_builder_formatter - 202019 → project/junk_drawer - 202556 → project/youtube_live_video - 203641 → project/itunes_rss - 204384 → project/ffmpeg_media - 207471 → project/ai_agents_experimental_collection - 207806 → project/drupal_saml_bridge - 208118 → project/drupal_devkit - 208312 → project/simple_sitemap_authenticated - 208618 → project/token_browser_plus - 209328 → project/flo - 209517 → project/gadget - 209554 → project/custom_paragraphs - 210105 → project/drupal_canvas_plugin - 210430 → project/drupal_cli - 211056 → project/content_dependency_graph - 211072 → project/ai_schemadotorg_jsonld diff --git a/docs/search_results.json b/docs/search_results.json deleted file mode 100644 index 01a01a078..000000000 --- a/docs/search_results.json +++ /dev/null @@ -1,24248 +0,0 @@ -{ - "rector_hits": { - "FileSystemBasenameToNativeRector": [ - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "CREDITS.TXT" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "DICTIONARY.TXT" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "aggregator-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "archive-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "block-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "blog-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "blogapi-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "book-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "color-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "comment-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "common-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "contact-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "content_types-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "drupal-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "file-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "filter-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "form-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "forum-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "general.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "installer.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "locale-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "locale-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "menu-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "node-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "outros_modulos/gsitemap/gsitemap-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "outros_modulos/service_links/service_links-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "path-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "poll-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "profile-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "search-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "statistics-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "system-install.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "system-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "taxonomy-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "theme-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "throttle-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "tracker-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "unicode-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "upload-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "user-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "watchdog-module.po" - }, - { - "project_id": 289, - "project_name": "project/livediscussions", - "filename": "live_discussions.module" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "arrow-next-hover.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "arrow-prev-hover.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "arrow-prev.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "arrow-up-hover.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "background.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "block.tpl.php" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "box.tpl.php" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "forum-container.jpg" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "forum-link.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "header-a.jpg" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "icon-block.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "logo-active.jpg" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "logo.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "node.tpl.php" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "style.css" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "tabs-off.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "tabs-on.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "tabs-option-hover.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "tabs-option-on.png" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "README.txt" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "archive-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "block-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "blogapi-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "book-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "common-inc.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "drupal-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "file-inc.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "locale-inc.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "locale-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "menu-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "node-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "poll-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "profile-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "search-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "statistics-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "story-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "system-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "taxonomy-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "throttle-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "upload-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "user-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "watchdog-module.po" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "README.txt" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "ma_blogit/README.txt" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "ma_blogit/ma_blogit.module" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "ma_bzip2/ma_bzip2.module" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "ma_gzip/README.txt" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "ma_gzip/ma_gzip.module" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "mail_archive.mysql" - }, - { - "project_id": 310, - "project_name": "project/sitemenu", - "filename": "sitemenu.info" - }, - { - "project_id": 310, - "project_name": "project/sitemenu", - "filename": "sitemenu.module" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "binder.control" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "docs/binder-1.png" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "docs/binder_schema.png" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "docs/g6685.png" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "docs/rigid-vs-fluid.html" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "docs/state_machines_and_metadata.html" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "docs/text1709.png" - } - ], - "LoadAllIncludesRector": [ - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": ".gitignore" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/cache-install.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/database/log.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/database/sqlite/select.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/errors.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/filetransfer/local.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/filetransfer/ssh.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/install.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/lock.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/menu.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/password.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/farbtastic/farbtastic.js" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/jquery.js" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/powered-blue-80x15.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/powered-gray-135x42.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/ui/jquery.ui.selectable.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/ui/jquery.ui.slider.min.js" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/aggregator/aggregator-feed-source.tpl.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/aggregator/tests/aggregator_test_atom.xml" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/block/block.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/block/block.js" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/color/color.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.api.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/contact/contact.admin.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/contact/contact.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/dashboard/dashboard.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/field.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/modules/list/list.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/modules/number/number.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/tests/field_test.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/tests/field_test.storage.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field_ui/field_ui.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/file/icons/application-x-executable.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/file/icons/text-html.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/file/icons/text-x-generic.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/file/icons/x-office-document.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/filter/filter.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/filter/filter.pages.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/forum/forum.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/help/help.api.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/locale/locale.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/node/node.tokens.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/node/tests/node_access_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/node/tests/node_test_exception.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/openid/tests/openid_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/path/path.admin.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/php/php.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/poll/poll-results.tpl.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/rdf/rdf.api.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/rdf/tests/rdf_test.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/search/search.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/search/search.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/search/tests/search_embedded_form.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/search/tests/search_extra_type.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/files/css_test_files/comment_hacks.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/files/css_test_files/comment_hacks.css.unoptimized.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/files/javascript-2.script" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/simpletest.js" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/actions.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/ajax_test.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/error.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/graph.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/image_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/password.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/path_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/requirements1_test.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/system_incompatible_core_version_dependencies_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/system_incompatible_module_version_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/theme_test.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/unicode.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/upgrade/drupal-6.upload.database.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/upgrade/drupal-6.user-password-token.database.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/upgrade/upgrade.comment.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/statistics/statistics.pages.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/syslog/syslog.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/syslog/syslog.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/system/system.archiver.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/system/system.queue.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/system/system.updater.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/taxonomy/taxonomy.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/tracker/tracker.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/trigger/trigger.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/update/tests/aaa_update_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/update/tests/drupal.0.xml" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/user/tests/user_form_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/user/tests/user_form_test.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/user/user.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/README.txt" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/bartik/css/print.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/bartik/images/buttons.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/garland/fix-ie.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/garland/logo.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/seven/images/ui-icons-ffffff-256x240.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/seven/page.tpl.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/seven/style.css" - } - ], - "MigrateSqlGetMigrationPluginManagerRector": [ - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": ".gitignore" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/cache-install.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/database/log.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/database/sqlite/select.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/errors.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/filetransfer/local.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/filetransfer/ssh.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/install.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/lock.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/menu.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/password.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/farbtastic/farbtastic.js" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/jquery.js" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/powered-blue-80x15.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/powered-gray-135x42.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/ui/jquery.ui.selectable.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/ui/jquery.ui.slider.min.js" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/aggregator/aggregator-feed-source.tpl.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/aggregator/tests/aggregator_test_atom.xml" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/block/block.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/block/block.js" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/color/color.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.api.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/contact/contact.admin.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/contact/contact.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/dashboard/dashboard.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/field.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/modules/list/list.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/modules/number/number.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/tests/field_test.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/tests/field_test.storage.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field_ui/field_ui.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/file/icons/application-x-executable.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/file/icons/text-html.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/file/icons/text-x-generic.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/file/icons/x-office-document.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/filter/filter.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/filter/filter.pages.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/forum/forum.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/help/help.api.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/locale/locale.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/node/node.tokens.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/node/tests/node_access_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/node/tests/node_test_exception.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/openid/tests/openid_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/path/path.admin.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/php/php.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/poll/poll-results.tpl.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/rdf/rdf.api.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/rdf/tests/rdf_test.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/search/search.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/search/search.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/search/tests/search_embedded_form.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/search/tests/search_extra_type.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/files/css_test_files/comment_hacks.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/files/css_test_files/comment_hacks.css.unoptimized.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/files/javascript-2.script" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/simpletest.js" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/actions.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/ajax_test.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/error.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/graph.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/image_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/password.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/path_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/requirements1_test.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/system_incompatible_core_version_dependencies_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/system_incompatible_module_version_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/theme_test.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/unicode.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/upgrade/drupal-6.upload.database.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/upgrade/drupal-6.user-password-token.database.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/upgrade/upgrade.comment.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/statistics/statistics.pages.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/syslog/syslog.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/syslog/syslog.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/system/system.archiver.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/system/system.queue.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/system/system.updater.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/taxonomy/taxonomy.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/tracker/tracker.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/trigger/trigger.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/update/tests/aaa_update_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/update/tests/drupal.0.xml" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/user/tests/user_form_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/user/tests/user_form_test.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/user/user.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/README.txt" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/bartik/css/print.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/bartik/images/buttons.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/garland/fix-ie.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/garland/logo.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/seven/images/ui-icons-ffffff-256x240.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/seven/page.tpl.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/seven/style.css" - } - ], - "NodeStorageDeprecatedMethodsRector": [ - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "CREDITS.TXT" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "DICTIONARY.TXT" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "aggregator-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "archive-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "block-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "blog-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "blogapi-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "book-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "color-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "comment-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "common-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "contact-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "content_types-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "drupal-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "file-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "filter-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "form-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "forum-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "general.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "installer.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "locale-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "locale-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "menu-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "node-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "outros_modulos/gsitemap/gsitemap-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "outros_modulos/service_links/service_links-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "path-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "poll-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "profile-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "search-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "statistics-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "system-install.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "system-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "taxonomy-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "theme-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "throttle-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "tracker-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "unicode-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "upload-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "user-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "watchdog-module.po" - }, - { - "project_id": 289, - "project_name": "project/livediscussions", - "filename": "live_discussions.module" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "arrow-next-hover.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "arrow-prev-hover.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "arrow-prev.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "arrow-up-hover.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "background.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "block.tpl.php" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "box.tpl.php" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "forum-container.jpg" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "forum-link.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "header-a.jpg" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "icon-block.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "logo-active.jpg" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "logo.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "node.tpl.php" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "style.css" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "tabs-off.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "tabs-on.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "tabs-option-hover.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "tabs-option-on.png" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "README.txt" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "archive-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "block-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "blogapi-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "book-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "common-inc.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "drupal-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "file-inc.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "locale-inc.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "locale-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "menu-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "node-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "poll-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "profile-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "search-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "statistics-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "story-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "system-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "taxonomy-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "throttle-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "upload-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "user-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "watchdog-module.po" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "README.txt" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "ma_blogit/README.txt" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "ma_blogit/ma_blogit.module" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "ma_bzip2/ma_bzip2.module" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "ma_gzip/README.txt" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "ma_gzip/ma_gzip.module" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "mail_archive.mysql" - }, - { - "project_id": 310, - "project_name": "project/sitemenu", - "filename": "sitemenu.info" - }, - { - "project_id": 310, - "project_name": "project/sitemenu", - "filename": "sitemenu.module" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "binder.control" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "docs/binder-1.png" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "docs/binder_schema.png" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "docs/g6685.png" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "docs/rigid-vs-fluid.html" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "docs/state_machines_and_metadata.html" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "docs/text1709.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": ".gitignore" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/cache-install.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/database/log.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/database/sqlite/select.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/errors.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/filetransfer/local.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/filetransfer/ssh.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/install.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/lock.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/menu.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/password.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/farbtastic/farbtastic.js" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/jquery.js" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/powered-blue-80x15.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/powered-gray-135x42.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/ui/jquery.ui.selectable.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/ui/jquery.ui.slider.min.js" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/aggregator/aggregator-feed-source.tpl.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/aggregator/tests/aggregator_test_atom.xml" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/block/block.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/block/block.js" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/color/color.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.api.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/contact/contact.admin.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/contact/contact.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/dashboard/dashboard.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/field.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/modules/list/list.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/modules/number/number.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/tests/field_test.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/tests/field_test.storage.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field_ui/field_ui.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/file/icons/application-x-executable.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/file/icons/text-html.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/file/icons/text-x-generic.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/file/icons/x-office-document.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/filter/filter.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/filter/filter.pages.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/forum/forum.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/help/help.api.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/locale/locale.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/node/node.tokens.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/node/tests/node_access_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/node/tests/node_test_exception.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/openid/tests/openid_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/path/path.admin.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/php/php.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/poll/poll-results.tpl.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/rdf/rdf.api.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/rdf/tests/rdf_test.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/search/search.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/search/search.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/search/tests/search_embedded_form.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/search/tests/search_extra_type.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/files/css_test_files/comment_hacks.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/files/css_test_files/comment_hacks.css.unoptimized.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/files/javascript-2.script" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/simpletest.js" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/actions.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/ajax_test.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/error.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/graph.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/image_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/password.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/path_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/requirements1_test.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/system_incompatible_core_version_dependencies_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/system_incompatible_module_version_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/theme_test.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/unicode.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/upgrade/drupal-6.upload.database.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/upgrade/drupal-6.user-password-token.database.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/upgrade/upgrade.comment.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/statistics/statistics.pages.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/syslog/syslog.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/syslog/syslog.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/system/system.archiver.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/system/system.queue.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/system/system.updater.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/taxonomy/taxonomy.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/tracker/tracker.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/trigger/trigger.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/update/tests/aaa_update_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/update/tests/drupal.0.xml" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/user/tests/user_form_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/user/tests/user_form_test.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/user/user.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/README.txt" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/bartik/css/print.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/bartik/images/buttons.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/garland/fix-ie.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/garland/logo.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/seven/images/ui-icons-ffffff-256x240.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/seven/page.tpl.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/seven/style.css" - } - ], - "PluginBaseIsConfigurableRector": [ - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "CREDITS.TXT" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "DICTIONARY.TXT" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "aggregator-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "archive-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "block-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "blog-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "blogapi-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "book-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "color-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "comment-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "common-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "contact-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "content_types-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "drupal-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "file-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "filter-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "form-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "forum-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "general.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "installer.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "locale-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "locale-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "menu-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "node-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "outros_modulos/gsitemap/gsitemap-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "outros_modulos/service_links/service_links-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "path-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "poll-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "profile-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "search-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "statistics-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "system-install.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "system-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "taxonomy-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "theme-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "throttle-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "tracker-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "unicode-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "upload-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "user-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "watchdog-module.po" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "arrow-next-hover.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "arrow-prev-hover.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "arrow-prev.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "arrow-up-hover.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "background.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "block.tpl.php" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "box.tpl.php" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "forum-container.jpg" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "forum-link.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "header-a.jpg" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "icon-block.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "logo-active.jpg" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "logo.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "node.tpl.php" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "style.css" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "tabs-off.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "tabs-on.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "tabs-option-hover.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "tabs-option-on.png" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "README.txt" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "archive-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "block-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "blogapi-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "book-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "common-inc.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "drupal-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "file-inc.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "locale-inc.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "locale-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "menu-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "node-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "poll-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "profile-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "search-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "statistics-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "story-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "system-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "taxonomy-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "throttle-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "upload-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "user-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "watchdog-module.po" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "README.txt" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "ma_blogit/README.txt" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "ma_blogit/ma_blogit.module" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "ma_bzip2/ma_bzip2.module" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "ma_gzip/README.txt" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "ma_gzip/ma_gzip.module" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "mail_archive.mysql" - }, - { - "project_id": 306, - "project_name": "project/contact_dir", - "filename": "contact_dir.mysql.sql" - }, - { - "project_id": 310, - "project_name": "project/sitemenu", - "filename": "sitemenu.info" - }, - { - "project_id": 310, - "project_name": "project/sitemenu", - "filename": "sitemenu.module" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "binder.control" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "docs/binder-1.png" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "docs/binder_schema.png" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "docs/g6685.png" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "docs/rigid-vs-fluid.html" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "docs/state_machines_and_metadata.html" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "docs/text1709.png" - } - ], - "RemoveCacheExpireOverrideRector": [ - { - "project_id": 1666, - "project_name": "project/advcache", - "filename": "DRUPAL-6-10/path.patch" - }, - { - "project_id": 1770, - "project_name": "project/pmetrics", - "filename": "pmetrics.install" - }, - { - "project_id": 2121, - "project_name": "project/xcache", - "filename": "xcache.inc" - }, - { - "project_id": 2646, - "project_name": "project/cache_disable", - "filename": "cache_disable.module" - }, - { - "project_id": 2816, - "project_name": "project/cacherouter", - "filename": "engines/db.php" - }, - { - "project_id": 2816, - "project_name": "project/cacherouter", - "filename": "engines/eacc.php" - }, - { - "project_id": 2816, - "project_name": "project/cacherouter", - "filename": "engines/xcache.php" - }, - { - "project_id": 2880, - "project_name": "project/latest_members", - "filename": "latest_members.module" - }, - { - "project_id": 3104, - "project_name": "project/eventbrite", - "filename": "eventbrite.api.inc" - }, - { - "project_id": 4510, - "project_name": "project/querypath", - "filename": "qpcache/qpcache.install" - }, - { - "project_id": 5141, - "project_name": "project/qpservices", - "filename": "qpservices.install" - }, - { - "project_id": 7089, - "project_name": "project/cache_actions", - "filename": "views_plugin_cache_rules.inc" - }, - { - "project_id": 7245, - "project_name": "project/virtual_roles", - "filename": "virtual_roles.module" - }, - { - "project_id": 7900, - "project_name": "project/media_ustream", - "filename": "includes/MediaInternetUStreamHandler.inc" - }, - { - "project_id": 8453, - "project_name": "project/max_age", - "filename": "views/max_age_cache_time.inc" - }, - { - "project_id": 8453, - "project_name": "project/max_age", - "filename": "views/max_age_content_cache.inc" - }, - { - "project_id": 8635, - "project_name": "project/block2field", - "filename": "block2field.module" - }, - { - "project_id": 9273, - "project_name": "project/cache_heuristic", - "filename": "memcache.deferred.inc" - }, - { - "project_id": 9450, - "project_name": "project/cache_graceful", - "filename": "cache_graceful.module" - }, - { - "project_id": 9656, - "project_name": "project/deds_client", - "filename": "includes/DedsClient.inc" - }, - { - "project_id": 9770, - "project_name": "project/corporative_site", - "filename": "modules/contrib/views/plugins/views_plugin_cache_time.inc" - }, - { - "project_id": 9847, - "project_name": "project/b2b_store_solution", - "filename": "b2b_construction/modules/contrib/views/plugins/views_plugin_cache_time.inc" - }, - { - "project_id": 10405, - "project_name": "project/onepagecv", - "filename": "modules/views/plugins/views_plugin_cache_time.inc" - }, - { - "project_id": 10795, - "project_name": "project/cachetags", - "filename": "cache-memcache.inc" - }, - { - "project_id": 10795, - "project_name": "project/cachetags", - "filename": "cachetags.patch" - }, - { - "project_id": 10795, - "project_name": "project/cachetags", - "filename": "cachetags_sql/cachetags_sql.test" - }, - { - "project_id": 11214, - "project_name": "project/amazon_import", - "filename": "amazon_import.admin.inc" - }, - { - "project_id": 11635, - "project_name": "project/shareaholic", - "filename": "cache.php" - }, - { - "project_id": 12625, - "project_name": "project/booking_com_api", - "filename": "booking_com_api.admin.inc" - }, - { - "project_id": 12625, - "project_name": "project/booking_com_api", - "filename": "booking_com_api.install" - }, - { - "project_id": 12625, - "project_name": "project/booking_com_api", - "filename": "includes/JSONConnector.class.inc" - }, - { - "project_id": 12625, - "project_name": "project/booking_com_api", - "filename": "includes/XMLConnector.class.inc" - }, - { - "project_id": 12643, - "project_name": "project/search_api_acquia", - "filename": "includes/v3/SearchApiAcquiaApi.php" - }, - { - "project_id": 13086, - "project_name": "project/fetcher", - "filename": "lib/Fetcher/Configurator/DrupalVersion/Drupal6.php" - }, - { - "project_id": 13086, - "project_name": "project/fetcher", - "filename": "lib/Fetcher/Configurator/DrupalVersion/Drupal7.php" - }, - { - "project_id": 13086, - "project_name": "project/fetcher", - "filename": "lib/Fetcher/Configurator/DrupalVersion/Drupal8.php" - }, - { - "project_id": 13452, - "project_name": "project/memory_profiler", - "filename": "memcache_profiler.inc" - }, - { - "project_id": 13611, - "project_name": "project/session_cache", - "filename": "session_cache.admin.inc" - }, - { - "project_id": 13754, - "project_name": "project/userpickit", - "filename": "userpickit.module" - }, - { - "project_id": 14076, - "project_name": "project/dynamodb", - "filename": "dynamodb.inc" - }, - { - "project_id": 14853, - "project_name": "project/memcache_storage", - "filename": "src/MemcachedBackend.php" - }, - { - "project_id": 15128, - "project_name": "project/entity_lister", - "filename": "entity_lister.class.inc" - }, - { - "project_id": 15185, - "project_name": "project/context_cache", - "filename": "context_reaction_cache.inc" - }, - { - "project_id": 15691, - "project_name": "project/social_comments", - "filename": "includes/social_comments.admin.inc" - }, - { - "project_id": 16138, - "project_name": "project/site_search_analytics", - "filename": "visitorsvoice_api.install" - }, - { - "project_id": 16243, - "project_name": "project/reevoomark", - "filename": "ReevooMarkService.php" - }, - { - "project_id": 16249, - "project_name": "project/enhanced_page_cache", - "filename": "enhanced_page_cache.module" - }, - { - "project_id": 16249, - "project_name": "project/enhanced_page_cache", - "filename": "enhanced_pagecache.authcache.inc" - }, - { - "project_id": 16382, - "project_name": "project/wunderground_weather", - "filename": "wunderground_weather.admin.inc" - }, - { - "project_id": 16382, - "project_name": "project/wunderground_weather", - "filename": "wunderground_weather.install" - }, - { - "project_id": 16585, - "project_name": "project/at_base", - "filename": "lib/Helper/Test/Cache.php" - }, - { - "project_id": 16585, - "project_name": "project/at_base", - "filename": "lib/Helper/Wrapper/Cache.php" - }, - { - "project_id": 17523, - "project_name": "project/visitorsvoice", - "filename": "visitorsvoice.admin.inc" - }, - { - "project_id": 17769, - "project_name": "project/cove_api", - "filename": "cove_api.module" - }, - { - "project_id": 18059, - "project_name": "project/staticfilecache", - "filename": "DrupalStaticFileCache.inc" - }, - { - "project_id": 18124, - "project_name": "project/qui", - "filename": "qui.inc" - }, - { - "project_id": 18191, - "project_name": "project/wincachedrupal", - "filename": "src/Cache/WincacheBackend.php" - }, - { - "project_id": 18502, - "project_name": "project/go1_base", - "filename": "lib/Helper/Test/Cache.php" - }, - { - "project_id": 18502, - "project_name": "project/go1_base", - "filename": "lib/Helper/Wrapper/Cache.php" - }, - { - "project_id": 18777, - "project_name": "project/quandl", - "filename": "quandl.module" - }, - { - "project_id": 19746, - "project_name": "project/social_feed_field", - "filename": "modules/social_feed_field_facebook/includes/social_feed_field.facebook.inc" - }, - { - "project_id": 19746, - "project_name": "project/social_feed_field", - "filename": "modules/social_feed_field_gplus/includes/social_feed_field.gplus.inc" - }, - { - "project_id": 19746, - "project_name": "project/social_feed_field", - "filename": "modules/social_feed_field_instagram/includes/social_feed_field.instagram.inc" - }, - { - "project_id": 20172, - "project_name": "project/selective_tweets", - "filename": "includes/selective_tweets.features.inc" - }, - { - "project_id": 20172, - "project_name": "project/selective_tweets", - "filename": "selective_tweets.install" - }, - { - "project_id": 20426, - "project_name": "project/orghunter", - "filename": "orghunter_charity_search.module" - }, - { - "project_id": 20447, - "project_name": "project/era", - "filename": "era.admin.inc" - }, - { - "project_id": 20447, - "project_name": "project/era", - "filename": "era.install" - }, - { - "project_id": 20447, - "project_name": "project/era", - "filename": "era.module" - }, - { - "project_id": 21023, - "project_name": "project/couchbasedrupal", - "filename": "src/Cache/CouchbaseBackend.php" - }, - { - "project_id": 21934, - "project_name": "project/riddle_marketplace", - "filename": "src/RiddleClient.php" - }, - { - "project_id": 22337, - "project_name": "project/apcu", - "filename": "apcu.cache.inc" - }, - { - "project_id": 23853, - "project_name": "project/cision_block", - "filename": "cision_block.install" - }, - { - "project_id": 23853, - "project_name": "project/cision_block", - "filename": "cision_block.module" - }, - { - "project_id": 23853, - "project_name": "project/cision_block", - "filename": "tests/cision_block.test" - }, - { - "project_id": 25437, - "project_name": "project/sendinblue_rules", - "filename": "includes/sendinblue_rules.list.inc" - }, - { - "project_id": 25692, - "project_name": "project/ovh", - "filename": "src/Entity/Controller/OvhKeyViewBuilder.php" - }, - { - "project_id": 26260, - "project_name": "project/rss_embed_field", - "filename": "src/RssFeedFetcher.php" - }, - { - "project_id": 49251, - "project_name": "project/feed_block", - "filename": "src/EventSubscriber/FeedBlockCacheExpire.php" - }, - { - "project_id": 50166, - "project_name": "project/wsdata", - "filename": "src/Plugin/WSConnector/WSConnectorSimpleHTTP.php" - }, - { - "project_id": 50437, - "project_name": "project/dvg_stuf_bg", - "filename": "dvg_stuf_bg.module" - }, - { - "project_id": 50819, - "project_name": "project/spambot", - "filename": "src/Form/SpambotSettingsForm.php" - }, - { - "project_id": 51344, - "project_name": "project/usajobs_integration", - "filename": "src/RequestData.php" - }, - { - "project_id": 57717, - "project_name": "project/dvg_appointments", - "filename": "includes/AppointmentsClientApi.inc" - }, - { - "project_id": 59642, - "project_name": "project/wisski", - "filename": "wisski_data/wisski_authfile/src/Plugin/wisski_salz/Engine/LodSparqlEngine.php" - }, - { - "project_id": 60508, - "project_name": "project/js_entity", - "filename": "src/Queue/QueueCacheWorkerBase.php" - }, - { - "project_id": 61386, - "project_name": "project/commercetools", - "filename": "modules/commercetools_decoupled/src/CommercetoolsDecoupled.php" - }, - { - "project_id": 61386, - "project_name": "project/commercetools", - "filename": "modules/commercetools_decoupled/src/Controller/CtAuthController.php" - }, - { - "project_id": 61386, - "project_name": "project/commercetools", - "filename": "modules/commercetools_decoupled/src/CtAuth.php" - }, - { - "project_id": 62602, - "project_name": "project/social_media_api", - "filename": "src/SocialMediaApiFacebook.php" - }, - { - "project_id": 64168, - "project_name": "project/cmrf_form_processor", - "filename": "src/Factory.php" - }, - { - "project_id": 69747, - "project_name": "project/cmrf_core", - "filename": "src/CallFactory.php" - }, - { - "project_id": 69747, - "project_name": "project/cmrf_core", - "filename": "src/Form/CMRFProfileForm.php" - }, - { - "project_id": 78054, - "project_name": "project/audit_report", - "filename": "src/Plugin/AuditCheckManager.php" - }, - { - "project_id": 99033, - "project_name": "project/menu_parser_php", - "filename": "src/Form/SettingsForm.php" - }, - { - "project_id": 111315, - "project_name": "project/vcp4dates", - "filename": "tests/src/Kernel/DateFilterTest.php" - }, - { - "project_id": 113806, - "project_name": "project/ct_expire", - "filename": "ct_expire.module" - }, - { - "project_id": 113806, - "project_name": "project/ct_expire", - "filename": "src/Commands/CtExpireCommands.php" - }, - { - "project_id": 113806, - "project_name": "project/ct_expire", - "filename": "src/CtExpireScheduler.php" - }, - { - "project_id": 113806, - "project_name": "project/ct_expire", - "filename": "src/Plugin/Field/FieldWidget/DateAndTimeCacheExpireWidget.php" - } - ], - "RemoveHandlerBaseDefineExtraOptionsRector": [ - { - "project_id": 11684, - "project_name": "project/views_dependent_filters", - "filename": "src/Plugin/views/filter/ViewsDependentFilter.php" - } - ], - "RemoveModuleHandlerAddModuleCallsRector": [ - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "CREDITS.TXT" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "DICTIONARY.TXT" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "aggregator-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "archive-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "block-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "blog-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "blogapi-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "book-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "color-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "comment-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "common-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "contact-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "content_types-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "drupal-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "file-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "filter-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "form-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "forum-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "general.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "installer.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "locale-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "locale-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "menu-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "node-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "outros_modulos/gsitemap/gsitemap-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "outros_modulos/service_links/service_links-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "path-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "poll-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "profile-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "search-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "statistics-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "system-install.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "system-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "taxonomy-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "theme-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "throttle-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "tracker-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "unicode-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "upload-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "user-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "watchdog-module.po" - }, - { - "project_id": 289, - "project_name": "project/livediscussions", - "filename": "live_discussions.module" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "arrow-next-hover.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "arrow-prev-hover.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "arrow-prev.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "arrow-up-hover.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "background.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "block.tpl.php" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "box.tpl.php" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "forum-container.jpg" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "forum-link.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "header-a.jpg" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "icon-block.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "logo-active.jpg" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "logo.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "node.tpl.php" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "style.css" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "tabs-off.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "tabs-on.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "tabs-option-hover.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "tabs-option-on.png" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "README.txt" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "archive-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "block-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "blogapi-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "book-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "common-inc.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "drupal-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "file-inc.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "locale-inc.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "locale-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "menu-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "node-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "poll-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "profile-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "search-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "statistics-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "story-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "system-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "taxonomy-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "throttle-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "upload-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "user-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "watchdog-module.po" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "README.txt" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "ma_blogit/README.txt" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "ma_blogit/ma_blogit.module" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "ma_bzip2/ma_bzip2.module" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "ma_gzip/README.txt" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "ma_gzip/ma_gzip.module" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "mail_archive.mysql" - }, - { - "project_id": 310, - "project_name": "project/sitemenu", - "filename": "sitemenu.info" - }, - { - "project_id": 310, - "project_name": "project/sitemenu", - "filename": "sitemenu.module" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "binder.control" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "docs/binder-1.png" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "docs/binder_schema.png" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "docs/g6685.png" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "docs/rigid-vs-fluid.html" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "docs/state_machines_and_metadata.html" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "docs/text1709.png" - } - ], - "RemoveModuleHandlerDeprecatedMethodsRector": [ - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": ".gitignore" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/cache-install.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/database/log.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/database/sqlite/select.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/errors.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/filetransfer/local.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/filetransfer/ssh.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/install.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/lock.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/menu.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/password.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/farbtastic/farbtastic.js" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/jquery.js" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/powered-blue-80x15.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/powered-gray-135x42.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/ui/jquery.ui.selectable.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/ui/jquery.ui.slider.min.js" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/aggregator/aggregator-feed-source.tpl.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/aggregator/tests/aggregator_test_atom.xml" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/block/block.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/block/block.js" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/color/color.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.api.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/contact/contact.admin.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/contact/contact.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/dashboard/dashboard.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/field.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/modules/list/list.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/modules/number/number.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/tests/field_test.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/tests/field_test.storage.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field_ui/field_ui.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/file/icons/application-x-executable.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/file/icons/text-html.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/file/icons/text-x-generic.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/file/icons/x-office-document.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/filter/filter.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/filter/filter.pages.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/forum/forum.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/help/help.api.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/locale/locale.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/node/node.tokens.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/node/tests/node_access_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/node/tests/node_test_exception.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/openid/tests/openid_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/path/path.admin.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/php/php.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/poll/poll-results.tpl.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/rdf/rdf.api.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/rdf/tests/rdf_test.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/search/search.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/search/search.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/search/tests/search_embedded_form.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/search/tests/search_extra_type.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/files/css_test_files/comment_hacks.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/files/css_test_files/comment_hacks.css.unoptimized.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/files/javascript-2.script" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/simpletest.js" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/actions.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/ajax_test.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/error.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/graph.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/image_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/password.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/path_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/requirements1_test.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/system_incompatible_core_version_dependencies_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/system_incompatible_module_version_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/theme_test.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/unicode.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/upgrade/drupal-6.upload.database.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/upgrade/drupal-6.user-password-token.database.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/upgrade/upgrade.comment.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/statistics/statistics.pages.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/syslog/syslog.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/syslog/syslog.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/system/system.archiver.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/system/system.queue.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/system/system.updater.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/taxonomy/taxonomy.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/tracker/tracker.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/trigger/trigger.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/update/tests/aaa_update_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/update/tests/drupal.0.xml" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/user/tests/user_form_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/user/tests/user_form_test.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/user/user.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/README.txt" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/bartik/css/print.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/bartik/images/buttons.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/garland/fix-ie.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/garland/logo.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/seven/images/ui-icons-ffffff-256x240.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/seven/page.tpl.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/seven/style.css" - } - ], - "RemoveRootFromConvertDbUrlRector": [ - { - "project_id": 6961, - "project_name": "project/sqlsrv", - "filename": "tests/src/Kernel/NewDatabaseFailureTest.php" - }, - { - "project_id": 28302, - "project_name": "project/sparql_entity_storage", - "filename": "src/Driver/Database/sparql/Connection.php" - }, - { - "project_id": 28302, - "project_name": "project/sparql_entity_storage", - "filename": "tests/src/Traits/SparqlConnectionTrait.php" - }, - { - "project_id": 52281, - "project_name": "project/civicrm_entity", - "filename": "src/Plugin/views/query/CivicrmSql.php" - }, - { - "project_id": 52281, - "project_name": "project/civicrm_entity", - "filename": "tests/src/FunctionalJavascript/Views/CivicrmContactUserRelationshipTest.php" - }, - { - "project_id": 58354, - "project_name": "project/acsf", - "filename": "acsf_init/lib/cloud_hooks/acquia/db_connect.php" - }, - { - "project_id": 91077, - "project_name": "project/smart_migrate_cli", - "filename": "src/Commands/SmartMigrateCliCommands.php" - } - ], - "RemoveSetUriCallbackRector": [ - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": ".gitignore" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/cache-install.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/database/log.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/database/sqlite/select.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/errors.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/filetransfer/local.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/filetransfer/ssh.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/install.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/lock.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/menu.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/password.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/farbtastic/farbtastic.js" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/jquery.js" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/powered-blue-80x15.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/powered-gray-135x42.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/ui/jquery.ui.selectable.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/ui/jquery.ui.slider.min.js" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/aggregator/aggregator-feed-source.tpl.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/aggregator/tests/aggregator_test_atom.xml" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/block/block.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/block/block.js" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/color/color.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.api.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/contact/contact.admin.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/contact/contact.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/dashboard/dashboard.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/field.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/modules/list/list.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/modules/number/number.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/tests/field_test.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/tests/field_test.storage.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field_ui/field_ui.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/file/icons/application-x-executable.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/file/icons/text-html.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/file/icons/text-x-generic.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/file/icons/x-office-document.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/filter/filter.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/filter/filter.pages.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/forum/forum.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/help/help.api.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/locale/locale.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/node/node.tokens.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/node/tests/node_access_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/node/tests/node_test_exception.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/openid/tests/openid_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/path/path.admin.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/php/php.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/poll/poll-results.tpl.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/rdf/rdf.api.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/rdf/tests/rdf_test.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/search/search.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/search/search.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/search/tests/search_embedded_form.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/search/tests/search_extra_type.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/files/css_test_files/comment_hacks.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/files/css_test_files/comment_hacks.css.unoptimized.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/files/javascript-2.script" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/simpletest.js" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/actions.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/ajax_test.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/error.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/graph.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/image_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/password.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/path_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/requirements1_test.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/system_incompatible_core_version_dependencies_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/system_incompatible_module_version_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/theme_test.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/unicode.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/upgrade/drupal-6.upload.database.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/upgrade/drupal-6.user-password-token.database.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/upgrade/upgrade.comment.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/statistics/statistics.pages.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/syslog/syslog.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/syslog/syslog.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/system/system.archiver.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/system/system.queue.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/system/system.updater.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/taxonomy/taxonomy.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/tracker/tracker.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/trigger/trigger.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/update/tests/aaa_update_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/update/tests/drupal.0.xml" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/user/tests/user_form_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/user/tests/user_form_test.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/user/user.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/README.txt" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/bartik/css/print.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/bartik/images/buttons.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/garland/fix-ie.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/garland/logo.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/seven/images/ui-icons-ffffff-256x240.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/seven/page.tpl.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/seven/style.css" - } - ], - "RemoveStateCacheSettingRector": [ - { - "project_id": 2817, - "project_name": "project/mollom", - "filename": "mollom.pages.inc" - }, - { - "project_id": 3659, - "project_name": "project/cache_browser", - "filename": "src/Form/CacheCidForm.php" - }, - { - "project_id": 3659, - "project_name": "project/cache_browser", - "filename": "src/Form/CacheClearConfirmForm.php" - }, - { - "project_id": 5494, - "project_name": "project/casaa", - "filename": "casaa.add.inc" - }, - { - "project_id": 5930, - "project_name": "project/distro", - "filename": "distro_client.module" - }, - { - "project_id": 6455, - "project_name": "project/freeagent", - "filename": "freeagent.services.yml" - }, - { - "project_id": 6719, - "project_name": "project/context_admin", - "filename": "contrib/context_admin_vbo/plugins/context_admin/views_bulk_menu.inc" - }, - { - "project_id": 6719, - "project_name": "project/context_admin", - "filename": "plugins/context_admin/admin_section.inc" - }, - { - "project_id": 6719, - "project_name": "project/context_admin", - "filename": "plugins/context_admin/node_create_menu.inc" - }, - { - "project_id": 6719, - "project_name": "project/context_admin", - "filename": "plugins/context_admin/node_edit_menu.inc" - }, - { - "project_id": 6719, - "project_name": "project/context_admin", - "filename": "plugins/context_admin/node_view_menu.inc" - }, - { - "project_id": 6719, - "project_name": "project/context_admin", - "filename": "plugins/context_admin/taxonomy_list_menu.inc" - }, - { - "project_id": 6719, - "project_name": "project/context_admin", - "filename": "plugins/context_admin/term_options_menu.inc" - }, - { - "project_id": 6858, - "project_name": "project/winners", - "filename": "winners.pages.inc" - }, - { - "project_id": 7296, - "project_name": "project/qfield", - "filename": "qfield_wizard.inc" - }, - { - "project_id": 8225, - "project_name": "project/mb", - "filename": "mb_comment/mb_comment.module" - }, - { - "project_id": 8533, - "project_name": "project/backup_migrate_dropbox", - "filename": "backup_migrate_dropbox.module" - }, - { - "project_id": 8534, - "project_name": "project/dns", - "filename": "docs/contributing/style.md" - }, - { - "project_id": 8821, - "project_name": "project/profile_setup_api", - "filename": "includes/profile_setup_api.pages.inc" - }, - { - "project_id": 9658, - "project_name": "project/openid_sso_provider", - "filename": "openid_sso_provider.inc" - }, - { - "project_id": 9770, - "project_name": "project/corporative_site", - "filename": "modules/contrib/ctools/help/wizard.html" - }, - { - "project_id": 9770, - "project_name": "project/corporative_site", - "filename": "modules/contrib/ctools/includes/page-wizard.inc" - }, - { - "project_id": 9847, - "project_name": "project/b2b_store_solution", - "filename": "b2b_construction/modules/contrib/ctools/help/wizard.html" - }, - { - "project_id": 10405, - "project_name": "project/onepagecv", - "filename": "modules/ctools/help/wizard.html" - }, - { - "project_id": 11900, - "project_name": "project/devshop_hosting", - "filename": "devshop_hosting/devshop_projects/inc/create/create.inc" - }, - { - "project_id": 12511, - "project_name": "project/panels_frame", - "filename": "includes/stack-admin.inc" - }, - { - "project_id": 12511, - "project_name": "project/panels_frame", - "filename": "plugins/export_ui/panels_frame_stack_ui.class.php" - }, - { - "project_id": 12511, - "project_name": "project/panels_frame", - "filename": "plugins/export_ui/panels_frame_ui.class.php" - }, - { - "project_id": 13258, - "project_name": "project/wildfire", - "filename": "modules/wildfire_rpc_jobs/tests/wildfire_rpc_jobs.test" - }, - { - "project_id": 20484, - "project_name": "project/mpub", - "filename": "modules/contrib/ctools/help/wizard.html" - }, - { - "project_id": 20484, - "project_name": "project/mpub", - "filename": "modules/contrib/panels/includes/display-layout.inc" - }, - { - "project_id": 20484, - "project_name": "project/mpub", - "filename": "modules/contrib/panels/includes/page-wizard.inc" - }, - { - "project_id": 22307, - "project_name": "project/config_split", - "filename": "src/Config/StatusOverride.php" - }, - { - "project_id": 23448, - "project_name": "project/bynder", - "filename": "bynder.services.yml" - }, - { - "project_id": 23838, - "project_name": "project/views_ajax_form", - "filename": "src/ViewsAjaxForm.php" - }, - { - "project_id": 25598, - "project_name": "project/bynder_orbit", - "filename": "includes/bynder_orbit.admin.inc" - }, - { - "project_id": 26816, - "project_name": "project/mustache_templates", - "filename": "mustache.services.yml" - }, - { - "project_id": 26816, - "project_name": "project/mustache_templates", - "filename": "src/MustachePhpEngine.php" - }, - { - "project_id": 49252, - "project_name": "project/community_tasks", - "filename": "src/Form/CTaskActionBaseForm.php" - }, - { - "project_id": 51166, - "project_name": "project/odoo_api", - "filename": "src/Form/OdooMetadataExploreForm.php" - }, - { - "project_id": 51166, - "project_name": "project/odoo_api", - "filename": "src/FormStateCacheTrait.php" - }, - { - "project_id": 51935, - "project_name": "project/views_advanced_cache", - "filename": "src/Plugin/views/cache/AdvancedViewsCache.php" - }, - { - "project_id": 52040, - "project_name": "project/salesforce_auth", - "filename": "salesforce_auth.services.yml" - }, - { - "project_id": 52161, - "project_name": "project/og", - "filename": "og.services.yml" - }, - { - "project_id": 52161, - "project_name": "project/og", - "filename": "src/Cache/Context/OgMembershipStateCacheContext.php" - }, - { - "project_id": 52161, - "project_name": "project/og", - "filename": "tests/src/Unit/Cache/Context/OgContextCacheContextTestBase.php" - }, - { - "project_id": 52161, - "project_name": "project/og", - "filename": "tests/src/Unit/Cache/Context/OgMembershipStateCacheContextTest.php" - }, - { - "project_id": 53194, - "project_name": "project/authcache", - "filename": "modules/authcache_form/tests/authcache_form_test.module" - }, - { - "project_id": 55801, - "project_name": "project/deploy_key", - "filename": "src/KeyManager.php" - }, - { - "project_id": 55883, - "project_name": "project/swagger_ui_formatter", - "filename": "tests/modules/swagger_ui_formatter_test_fake_discovery/src/Service/SwaggerUiLibraryDiscovery.php" - }, - { - "project_id": 55883, - "project_name": "project/swagger_ui_formatter", - "filename": "tests/modules/swagger_ui_formatter_test_fake_discovery/swagger_ui_formatter_test_fake_discovery.services.yml" - }, - { - "project_id": 56975, - "project_name": "project/d6lts", - "filename": "common/contrib/features/SA-CONTRIB-2016-020.patch" - }, - { - "project_id": 57706, - "project_name": "project/lightning_workflow", - "filename": "modules/lightning_scheduler/lightning_scheduler.module" - }, - { - "project_id": 58720, - "project_name": "project/apigee_edge", - "filename": "src/Entity/Controller/Cache/EntityIdCache.php" - }, - { - "project_id": 59279, - "project_name": "project/searchstax", - "filename": "tests/modules/searchstax_test_version_check/src/DecoratedVersionCheck.php" - }, - { - "project_id": 59387, - "project_name": "project/checklistapi", - "filename": "checklistapi.services.yml" - }, - { - "project_id": 59387, - "project_name": "project/checklistapi", - "filename": "src/Storage/StateStorage.php" - }, - { - "project_id": 59484, - "project_name": "project/stratoserp", - "filename": "src/Form/SettingsForm.php" - }, - { - "project_id": 59586, - "project_name": "project/monster_menus", - "filename": "src/MMRenderer/DefaultMMRenderer.php" - }, - { - "project_id": 59615, - "project_name": "project/salesforce", - "filename": "salesforce.services.yml" - }, - { - "project_id": 59849, - "project_name": "project/cloud", - "filename": "modules/cloud_service_providers/terraform/config/install/views.view.terraform_state.yml" - }, - { - "project_id": 60215, - "project_name": "project/aeg", - "filename": "modules/ctools/help/wizard.html" - }, - { - "project_id": 60215, - "project_name": "project/aeg", - "filename": "modules/panels/includes/display-layout.inc" - }, - { - "project_id": 60215, - "project_name": "project/aeg", - "filename": "modules/panels/includes/page-wizard.inc" - }, - { - "project_id": 60227, - "project_name": "project/govimentum", - "filename": "modules/simpletest/tests/themes/test_theme/theme-settings.php" - }, - { - "project_id": 61530, - "project_name": "project/language_suggestion", - "filename": "src/Form/LanguageSuggestionMappingForm.php" - }, - { - "project_id": 62378, - "project_name": "project/drupalru_d7", - "filename": "modules/simpletest/tests/themes/test_theme/theme-settings.php" - }, - { - "project_id": 62719, - "project_name": "project/entity_reference_preview", - "filename": "src/Cache/StatusPreviewCacheContext.php" - }, - { - "project_id": 63487, - "project_name": "project/eu_cookie_compliance_rocketship", - "filename": "src/Form/SettingsForm.php" - }, - { - "project_id": 63624, - "project_name": "project/ubershopwish", - "filename": "modules/simpletest/tests/themes/test_theme/theme-settings.php" - }, - { - "project_id": 63847, - "project_name": "project/fmrest", - "filename": "fmrest.services.yml" - }, - { - "project_id": 63847, - "project_name": "project/fmrest", - "filename": "src/RestClient.php" - }, - { - "project_id": 69929, - "project_name": "project/stackla_widget", - "filename": "stackla_widget.services.yml" - }, - { - "project_id": 73343, - "project_name": "project/mailchimp_transactional", - "filename": "mailchimp_transactional.services.yml" - }, - { - "project_id": 77509, - "project_name": "project/testproject4234", - "filename": "modules/simpletest/tests/themes/test_theme/theme-settings.php" - }, - { - "project_id": 77509, - "project_name": "project/testproject4234", - "filename": "modules/user/tests/user_form_test.module" - }, - { - "project_id": 81865, - "project_name": "project/entity_references_map", - "filename": "src/Form/SettingsForm.php" - }, - { - "project_id": 84590, - "project_name": "project/trailless_menu", - "filename": "tests/src/Functional/TraillessMenuTest.php" - }, - { - "project_id": 85551, - "project_name": "project/widen_media", - "filename": "widen_media.services.yml" - }, - { - "project_id": 94996, - "project_name": "project/vwo", - "filename": "vwo.module" - }, - { - "project_id": 95840, - "project_name": "project/loop_workers", - "filename": "loop_workers.services.yml" - }, - { - "project_id": 99358, - "project_name": "project/granulartimecache", - "filename": "src/GranularTimeCacheService.php" - }, - { - "project_id": 117773, - "project_name": "project/engaging_networks", - "filename": "config/schema/engaging_networks.schema.yml" - }, - { - "project_id": 117773, - "project_name": "project/engaging_networks", - "filename": "src/Form/RestApiSettingsForm.php" - }, - { - "project_id": 118693, - "project_name": "project/entity_usage_updater", - "filename": "tests/src/Kernel/EntityUsageUpdaterOrphanedParagraphsTest.php" - }, - { - "project_id": 118693, - "project_name": "project/entity_usage_updater", - "filename": "tests/src/Kernel/EntityUsageUpdaterParagraphsTest.php" - }, - { - "project_id": 131151, - "project_name": "project/pantheon_autopilot_toolbar", - "filename": "src/Form/DismissNotificationForm.php" - }, - { - "project_id": 164485, - "project_name": "project/social_auth_entra_id", - "filename": "src/Plugin/Block/EntraIdLoginBlockBlock.php" - }, - { - "project_id": 176726, - "project_name": "project/override_cache_control_headers", - "filename": "override_cache_control_headers.services.yml" - }, - { - "project_id": 181203, - "project_name": "project/json_drop_api", - "filename": "modules/contrib/config_split/src/Config/StatusOverride.php" - }, - { - "project_id": 181319, - "project_name": "project/sdx", - "filename": "modules/feature/sdx_ssr/src/Plugin/SdxSettings/SsrSettings.php" - }, - { - "project_id": 183657, - "project_name": "project/search_api_postgresql", - "filename": "src/CircuitBreaker/CircuitBreaker.php" - }, - { - "project_id": 188516, - "project_name": "project/open_vocabularies", - "filename": "tests/src/Functional/VocabularyReferenceFieldTest.php" - }, - { - "project_id": 190686, - "project_name": "project/chromeless", - "filename": "chromeless.services.yml" - }, - { - "project_id": 190686, - "project_name": "project/chromeless", - "filename": "src/Cache/ChromelessStateCacheContext.php" - }, - { - "project_id": 200814, - "project_name": "project/rail_ai_provider", - "filename": "rail_ai_provider.services.yml" - }, - { - "project_id": 202556, - "project_name": "project/youtube_live_video", - "filename": "tests/src/Unit/Plugin/Block/YouTubeLiveVideoBlockSubmitTest.php" - }, - { - "project_id": 204384, - "project_name": "project/ffmpeg_media", - "filename": "src/Service/ProgressTracker.php" - }, - { - "project_id": 208118, - "project_name": "project/drupal_devkit", - "filename": "CLAUDE.md" - }, - { - "project_id": 208118, - "project_name": "project/drupal_devkit", - "filename": "tests/marketplace/test_integration.py" - } - ], - "RemoveTrustDataCallRector": [ - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "CREDITS.TXT" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "DICTIONARY.TXT" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "aggregator-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "archive-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "block-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "blog-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "blogapi-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "book-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "color-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "comment-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "common-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "contact-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "content_types-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "drupal-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "file-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "filter-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "form-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "forum-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "general.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "installer.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "locale-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "locale-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "menu-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "node-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "outros_modulos/gsitemap/gsitemap-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "outros_modulos/service_links/service_links-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "path-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "poll-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "profile-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "search-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "statistics-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "system-install.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "system-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "taxonomy-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "theme-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "throttle-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "tracker-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "unicode-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "upload-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "user-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "watchdog-module.po" - }, - { - "project_id": 289, - "project_name": "project/livediscussions", - "filename": "live_discussions.module" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "arrow-next-hover.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "arrow-prev-hover.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "arrow-prev.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "arrow-up-hover.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "background.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "block.tpl.php" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "box.tpl.php" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "forum-container.jpg" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "forum-link.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "header-a.jpg" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "icon-block.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "logo-active.jpg" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "logo.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "node.tpl.php" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "style.css" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "tabs-off.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "tabs-on.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "tabs-option-hover.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "tabs-option-on.png" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "README.txt" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "archive-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "block-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "blogapi-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "book-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "common-inc.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "drupal-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "file-inc.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "locale-inc.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "locale-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "menu-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "node-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "poll-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "profile-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "search-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "statistics-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "story-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "system-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "taxonomy-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "throttle-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "upload-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "user-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "watchdog-module.po" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "README.txt" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "ma_blogit/README.txt" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "ma_blogit/ma_blogit.module" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "ma_bzip2/ma_bzip2.module" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "ma_gzip/README.txt" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "ma_gzip/ma_gzip.module" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "mail_archive.mysql" - }, - { - "project_id": 310, - "project_name": "project/sitemenu", - "filename": "sitemenu.info" - }, - { - "project_id": 310, - "project_name": "project/sitemenu", - "filename": "sitemenu.module" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "binder.control" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "docs/binder-1.png" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "docs/binder_schema.png" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "docs/g6685.png" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "docs/rigid-vs-fluid.html" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "docs/state_machines_and_metadata.html" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "docs/text1709.png" - } - ], - "RemoveTwigNodeTransTagArgumentRector": [ - { - "project_id": 15590, - "project_name": "project/bear_skin", - "filename": "components/_twig-components/tags/trans.tag.php" - }, - { - "project_id": 19391, - "project_name": "project/canvas", - "filename": "src/Twig/CanvasPropVisitor.php" - }, - { - "project_id": 21816, - "project_name": "project/patternlab", - "filename": "pattern-lab/source/_twig-components/tags/trans.tag.php" - }, - { - "project_id": 22735, - "project_name": "project/emulsify", - "filename": "components/_twig-components/tags/pl_trans.tag.php" - }, - { - "project_id": 24699, - "project_name": "project/kashmir", - "filename": "components/_twig-components/tags/trans.tag.php" - }, - { - "project_id": 25172, - "project_name": "project/sketch", - "filename": "STARTER/components/_twig-components/tags/trans.tag.php" - }, - { - "project_id": 55297, - "project_name": "project/flexi_pattern_lab", - "filename": "components/source/_twig-components/tags/trans.tag.php" - }, - { - "project_id": 56300, - "project_name": "project/potion", - "filename": "src/Twig/NodeVisitor/TranslationNodeVisitor.php" - }, - { - "project_id": 59279, - "project_name": "project/searchstax", - "filename": ".ignored-deprecations.txt" - }, - { - "project_id": 59614, - "project_name": "project/entity_import", - "filename": ".deprecation-ignore.txt" - }, - { - "project_id": 59814, - "project_name": "project/search_api", - "filename": ".ignored-deprecations.txt" - }, - { - "project_id": 59815, - "project_name": "project/search_api_autocomplete", - "filename": ".ignored-deprecations.txt" - }, - { - "project_id": 59833, - "project_name": "project/search_api_saved_searches", - "filename": ".ignored-deprecations.txt" - }, - { - "project_id": 63299, - "project_name": "project/tranc", - "filename": "src/TrancNodeVisitor.php" - }, - { - "project_id": 112735, - "project_name": "project/core_logs", - "filename": "metadata/commit/33/336ba833bc8591810d0d27a8f36edb973ebb17c7/git-numstat" - }, - { - "project_id": 112735, - "project_name": "project/core_logs", - "filename": "metadata/commit/52/523cbdf6dfbd2af4ab18d97572bd3b01d3c7d4f7/git-numstat" - }, - { - "project_id": 112735, - "project_name": "project/core_logs", - "filename": "metadata/commit/ce/cec21638d098a4526174f0f97eb2e9ad675dcf52/git-numstat" - }, - { - "project_id": 112735, - "project_name": "project/core_logs", - "filename": "metadata/commit/ce/cec21638d098a4526174f0f97eb2e9ad675dcf52/git-subject" - }, - { - "project_id": 112735, - "project_name": "project/core_logs", - "filename": "metadata/commit/ce/cec21638d098a4526174f0f97eb2e9ad675dcf52/issue-title" - }, - { - "project_id": 112735, - "project_name": "project/core_logs", - "filename": "metadata/commit/ce/cec21638d098a4526174f0f97eb2e9ad675dcf52/subject" - }, - { - "project_id": 112735, - "project_name": "project/core_logs", - "filename": "metadata/x-journal/2024-09-28.md" - }, - { - "project_id": 143385, - "project_name": "project/experience_builder", - "filename": "src/Extension/XbPropVisitor.php" - } - ], - "RemoveUpdaterPostInstallMethodsRector": [ - { - "project_id": 8197, - "project_name": "project/onepage", - "filename": "includes/updater.inc" - }, - { - "project_id": 8197, - "project_name": "project/onepage", - "filename": "modules/system/system.updater.inc" - }, - { - "project_id": 9123, - "project_name": "project/1087726", - "filename": "includes/updater.inc" - }, - { - "project_id": 9123, - "project_name": "project/1087726", - "filename": "modules/system/system.updater.inc" - }, - { - "project_id": 11635, - "project_name": "project/shareaholic", - "filename": "admin.php" - }, - { - "project_id": 12057, - "project_name": "project/redhen_demo", - "filename": "redhen_demo.install" - }, - { - "project_id": 12057, - "project_name": "project/redhen_demo", - "filename": "ts_install_helpers/README.md" - }, - { - "project_id": 12118, - "project_name": "project/rebuild", - "filename": "tests/fixtures/drupal_sites/dev/includes/updater.inc" - }, - { - "project_id": 12118, - "project_name": "project/rebuild", - "filename": "tests/fixtures/drupal_sites/dev/modules/system/system.updater.inc" - }, - { - "project_id": 12118, - "project_name": "project/rebuild", - "filename": "tests/fixtures/drupal_sites/prod/includes/updater.inc" - }, - { - "project_id": 12118, - "project_name": "project/rebuild", - "filename": "tests/fixtures/drupal_sites/prod/modules/system/system.updater.inc" - }, - { - "project_id": 13111, - "project_name": "project/ddcla", - "filename": "public/includes/updater.inc" - }, - { - "project_id": 13111, - "project_name": "project/ddcla", - "filename": "public/modules/system/system.updater.inc" - }, - { - "project_id": 13125, - "project_name": "project/transcribe_distribution", - "filename": "includes/updater.inc" - }, - { - "project_id": 13125, - "project_name": "project/transcribe_distribution", - "filename": "modules/system/system.updater.inc" - }, - { - "project_id": 14211, - "project_name": "project/restaurant", - "filename": "restaurant.install" - }, - { - "project_id": 14446, - "project_name": "project/tr_kurulum", - "filename": "includes/updater.inc" - }, - { - "project_id": 14446, - "project_name": "project/tr_kurulum", - "filename": "modules/system/system.updater.inc" - }, - { - "project_id": 14506, - "project_name": "project/tb_blog_starter", - "filename": "includes/updater.inc" - }, - { - "project_id": 14506, - "project_name": "project/tb_blog_starter", - "filename": "modules/system/system.updater.inc" - }, - { - "project_id": 14507, - "project_name": "project/tb_events_starter", - "filename": "includes/updater.inc" - }, - { - "project_id": 14507, - "project_name": "project/tb_events_starter", - "filename": "modules/system/system.updater.inc" - }, - { - "project_id": 14509, - "project_name": "project/tb_hadelis_starter", - "filename": "includes/updater.inc" - }, - { - "project_id": 14509, - "project_name": "project/tb_hadelis_starter", - "filename": "modules/system/system.updater.inc" - }, - { - "project_id": 14510, - "project_name": "project/tb_methys_starter", - "filename": "includes/updater.inc" - }, - { - "project_id": 14510, - "project_name": "project/tb_methys_starter", - "filename": "modules/system/system.updater.inc" - }, - { - "project_id": 14511, - "project_name": "project/tb_mollise_starter", - "filename": "includes/updater.inc" - }, - { - "project_id": 14511, - "project_name": "project/tb_mollise_starter", - "filename": "modules/system/system.updater.inc" - }, - { - "project_id": 14512, - "project_name": "project/tb_neris_starter", - "filename": "includes/updater.inc" - }, - { - "project_id": 14512, - "project_name": "project/tb_neris_starter", - "filename": "modules/system/system.updater.inc" - }, - { - "project_id": 14513, - "project_name": "project/tb_palicico_starter", - "filename": "includes/updater.inc" - }, - { - "project_id": 14513, - "project_name": "project/tb_palicico_starter", - "filename": "modules/system/system.updater.inc" - }, - { - "project_id": 14514, - "project_name": "project/tb_purity_starter", - "filename": "includes/updater.inc" - }, - { - "project_id": 14514, - "project_name": "project/tb_purity_starter", - "filename": "modules/system/system.updater.inc" - }, - { - "project_id": 14515, - "project_name": "project/tb_rave_starter", - "filename": "includes/updater.inc" - }, - { - "project_id": 14515, - "project_name": "project/tb_rave_starter", - "filename": "modules/system/system.updater.inc" - }, - { - "project_id": 14522, - "project_name": "project/tb_sirate_starter", - "filename": "includes/updater.inc" - }, - { - "project_id": 14522, - "project_name": "project/tb_sirate_starter", - "filename": "modules/system/system.updater.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/updater.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/system/system.updater.inc" - }, - { - "project_id": 15222, - "project_name": "project/open_badging_installation_profile", - "filename": "includes/updater.inc" - }, - { - "project_id": 15222, - "project_name": "project/open_badging_installation_profile", - "filename": "modules/system/system.updater.inc" - }, - { - "project_id": 15613, - "project_name": "project/sauce", - "filename": "includes/sauce.updater.inc" - }, - { - "project_id": 16192, - "project_name": "project/mobilearkickstart", - "filename": "includes/updater.inc" - }, - { - "project_id": 16192, - "project_name": "project/mobilearkickstart", - "filename": "modules/system/system.updater.inc" - }, - { - "project_id": 16984, - "project_name": "project/spanish_distribution", - "filename": "includes/updater.inc" - }, - { - "project_id": 16984, - "project_name": "project/spanish_distribution", - "filename": "modules/system/system.updater.inc" - }, - { - "project_id": 17013, - "project_name": "project/fuse", - "filename": "includes/updater.inc" - }, - { - "project_id": 17013, - "project_name": "project/fuse", - "filename": "modules/system/system.updater.inc" - }, - { - "project_id": 18559, - "project_name": "project/govbr", - "filename": "includes/updater.inc" - }, - { - "project_id": 18559, - "project_name": "project/govbr", - "filename": "modules/system/system.updater.inc" - }, - { - "project_id": 18897, - "project_name": "project/qurandistribution", - "filename": "includes/updater.inc" - }, - { - "project_id": 18897, - "project_name": "project/qurandistribution", - "filename": "modules/system/system.updater.inc" - }, - { - "project_id": 18967, - "project_name": "project/redhen_raiser", - "filename": "redhen_raiser.profile" - }, - { - "project_id": 20990, - "project_name": "project/development", - "filename": "includes/updater.inc" - }, - { - "project_id": 20990, - "project_name": "project/development", - "filename": "modules/system/system.updater.inc" - }, - { - "project_id": 23470, - "project_name": "project/gp_reviews", - "filename": "includes/updater.inc" - }, - { - "project_id": 23470, - "project_name": "project/gp_reviews", - "filename": "modules/system/system.updater.inc" - }, - { - "project_id": 25294, - "project_name": "project/pankm", - "filename": "modules/contrib/group/src/Entity/GroupContentType.php" - }, - { - "project_id": 25896, - "project_name": "project/byu_installation_profile", - "filename": "includes/updater.inc" - }, - { - "project_id": 25896, - "project_name": "project/byu_installation_profile", - "filename": "modules/system/system.updater.inc" - }, - { - "project_id": 59610, - "project_name": "project/group", - "filename": "src/Entity/GroupRelationshipType.php" - }, - { - "project_id": 59610, - "project_name": "project/group", - "filename": "src/Plugin/Group/RelationHandler/GroupMembershipPostInstall.php" - }, - { - "project_id": 59610, - "project_name": "project/group", - "filename": "src/Plugin/Group/RelationHandlerDefault/EntityReference.php" - }, - { - "project_id": 59610, - "project_name": "project/group", - "filename": "src/Plugin/Group/RelationHandlerDefault/PostInstall.php" - }, - { - "project_id": 59610, - "project_name": "project/group", - "filename": "tests/src/Unit/PostInstallTest.php" - }, - { - "project_id": 60227, - "project_name": "project/govimentum", - "filename": "includes/updater.inc" - }, - { - "project_id": 60227, - "project_name": "project/govimentum", - "filename": "modules/system/system.updater.inc" - }, - { - "project_id": 62378, - "project_name": "project/drupalru_d7", - "filename": "includes/updater.inc" - }, - { - "project_id": 62378, - "project_name": "project/drupalru_d7", - "filename": "modules/system/system.updater.inc" - }, - { - "project_id": 63624, - "project_name": "project/ubershopwish", - "filename": "includes/updater.inc" - }, - { - "project_id": 63624, - "project_name": "project/ubershopwish", - "filename": "modules/system/system.updater.inc" - }, - { - "project_id": 64219, - "project_name": "project/ginvite", - "filename": "src/Plugin/Group/RelationHandler/GroupInvitationPostInstall.php" - }, - { - "project_id": 77509, - "project_name": "project/testproject4234", - "filename": "includes/updater.inc" - }, - { - "project_id": 77509, - "project_name": "project/testproject4234", - "filename": "modules/system/system.updater.inc" - }, - { - "project_id": 79588, - "project_name": "project/gnode_request", - "filename": "src/Plugin/Group/RelationHandler/GroupNodeRequestPostInstall.php" - }, - { - "project_id": 83284, - "project_name": "project/whereabouts", - "filename": "whereabouts.profile" - }, - { - "project_id": 87638, - "project_name": "project/group_entity", - "filename": "src/Entity/GroupContentType.php" - }, - { - "project_id": 87638, - "project_name": "project/group_entity", - "filename": "src/Plugin/Group/RelationHandler/GroupMembershipPostInstall.php" - }, - { - "project_id": 87638, - "project_name": "project/group_entity", - "filename": "src/Plugin/Group/RelationHandlerDefault/EntityReference.php" - }, - { - "project_id": 87638, - "project_name": "project/group_entity", - "filename": "src/Plugin/Group/RelationHandlerDefault/PostInstall.php" - }, - { - "project_id": 87638, - "project_name": "project/group_entity", - "filename": "tests/src/Unit/PostInstallTest.php" - }, - { - "project_id": 129676, - "project_name": "project/tiendaparamipyme", - "filename": "bt_store_cl.profile" - } - ], - "RemoveViewsRowCacheKeysRector": [ - { - "project_id": 51935, - "project_name": "project/views_advanced_cache", - "filename": "tests/src/Kernel/ViewsRowCacheTest.php" - }, - { - "project_id": 53222, - "project_name": "project/metatag", - "filename": "metatag_views/src/MetatagViewsCacheWrapper.php" - }, - { - "project_id": 181203, - "project_name": "project/json_drop_api", - "filename": "modules/contrib/metatag/metatag_views/src/MetatagViewsCacheWrapper.php" - } - ], - "ReplaceAlphadecimalToIntNullRector": [ - { - "project_id": 744, - "project_name": "project/comment_mover", - "filename": "src/CommentMover.php" - }, - { - "project_id": 1039, - "project_name": "project/flatcomments", - "filename": "flat_comments.module" - }, - { - "project_id": 2065, - "project_name": "project/openlayers", - "filename": "lib/OpenlayersDrupal/Component/Utility/Number.php" - }, - { - "project_id": 18842, - "project_name": "project/service_container", - "filename": "lib/Drupal/Component/Utility/Number.php" - }, - { - "project_id": 59723, - "project_name": "project/indieweb", - "filename": "modules/indieweb_webmention/src/Plugin/Action/ResetCommentThread.php" - } - ], - "ReplaceCommentManagerGetCountNewCommentsRector": [ - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": ".gitignore" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/cache-install.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/database/log.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/database/sqlite/select.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/errors.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/filetransfer/local.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/filetransfer/ssh.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/install.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/lock.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/menu.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/password.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/farbtastic/farbtastic.js" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/jquery.js" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/powered-blue-80x15.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/powered-gray-135x42.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/ui/jquery.ui.selectable.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/ui/jquery.ui.slider.min.js" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/aggregator/aggregator-feed-source.tpl.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/aggregator/tests/aggregator_test_atom.xml" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/block/block.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/block/block.js" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/color/color.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.api.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/contact/contact.admin.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/contact/contact.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/dashboard/dashboard.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/field.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/modules/list/list.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/modules/number/number.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/tests/field_test.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/tests/field_test.storage.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field_ui/field_ui.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/file/icons/application-x-executable.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/file/icons/text-html.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/file/icons/text-x-generic.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/file/icons/x-office-document.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/filter/filter.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/filter/filter.pages.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/forum/forum.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/help/help.api.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/locale/locale.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/node/node.tokens.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/node/tests/node_access_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/node/tests/node_test_exception.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/openid/tests/openid_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/path/path.admin.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/php/php.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/poll/poll-results.tpl.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/rdf/rdf.api.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/rdf/tests/rdf_test.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/search/search.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/search/search.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/search/tests/search_embedded_form.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/search/tests/search_extra_type.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/files/css_test_files/comment_hacks.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/files/css_test_files/comment_hacks.css.unoptimized.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/files/javascript-2.script" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/simpletest.js" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/actions.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/ajax_test.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/error.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/graph.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/image_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/password.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/path_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/requirements1_test.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/system_incompatible_core_version_dependencies_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/system_incompatible_module_version_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/theme_test.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/unicode.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/upgrade/drupal-6.upload.database.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/upgrade/drupal-6.user-password-token.database.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/upgrade/upgrade.comment.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/statistics/statistics.pages.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/syslog/syslog.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/syslog/syslog.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/system/system.archiver.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/system/system.queue.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/system/system.updater.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/taxonomy/taxonomy.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/tracker/tracker.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/trigger/trigger.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/update/tests/aaa_update_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/update/tests/drupal.0.xml" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/user/tests/user_form_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/user/tests/user_form_test.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/user/user.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/README.txt" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/bartik/css/print.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/bartik/images/buttons.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/garland/fix-ie.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/garland/logo.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/seven/images/ui-icons-ffffff-256x240.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/seven/page.tpl.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/seven/style.css" - } - ], - "ReplaceCommentUriRector": [ - { - "project_id": 939, - "project_name": "project/project_issue", - "filename": "includes/mail.inc" - }, - { - "project_id": 939, - "project_name": "project/project_issue", - "filename": "project_issue.module" - }, - { - "project_id": 1082, - "project_name": "project/zen", - "filename": "template.php" - }, - { - "project_id": 2124, - "project_name": "project/rdf", - "filename": "rdf.module" - }, - { - "project_id": 2124, - "project_name": "project/rdf", - "filename": "tests/src/Functional/CommentAttributesTest.php" - }, - { - "project_id": 2124, - "project_name": "project/rdf", - "filename": "tests/src/Functional/StandardProfileTest.php" - }, - { - "project_id": 2285, - "project_name": "project/advanced_forum", - "filename": "includes/advanced_forum_preprocess_comment.inc" - }, - { - "project_id": 3738, - "project_name": "project/comment_perm", - "filename": "src/CommentForm.php" - }, - { - "project_id": 3805, - "project_name": "project/genesis", - "filename": "genesis/template.php" - }, - { - "project_id": 5411, - "project_name": "project/adaptivetheme", - "filename": "at_core/inc/preprocess.inc" - }, - { - "project_id": 8197, - "project_name": "project/onepage", - "filename": "modules/comment/comment.module" - }, - { - "project_id": 8197, - "project_name": "project/onepage", - "filename": "modules/rdf/rdf.module" - }, - { - "project_id": 8882, - "project_name": "project/html5_boilerplate", - "filename": "template.php" - }, - { - "project_id": 9123, - "project_name": "project/1087726", - "filename": "modules/comment/comment.module" - }, - { - "project_id": 9123, - "project_name": "project/1087726", - "filename": "modules/rdf/rdf.module" - }, - { - "project_id": 10186, - "project_name": "project/nucleus", - "filename": "nucleus/inc/override_functions.inc" - }, - { - "project_id": 10204, - "project_name": "project/lc3_clean", - "filename": "preprocess.inc" - }, - { - "project_id": 11286, - "project_name": "project/comment_goodness", - "filename": "comment_goodness.module" - }, - { - "project_id": 11324, - "project_name": "project/drupalace", - "filename": "template.php" - }, - { - "project_id": 11404, - "project_name": "project/twentyeleven", - "filename": "template.php" - }, - { - "project_id": 12118, - "project_name": "project/rebuild", - "filename": "tests/fixtures/drupal_sites/dev/modules/comment/comment.module" - }, - { - "project_id": 12118, - "project_name": "project/rebuild", - "filename": "tests/fixtures/drupal_sites/dev/modules/rdf/rdf.module" - }, - { - "project_id": 12118, - "project_name": "project/rebuild", - "filename": "tests/fixtures/drupal_sites/prod/modules/comment/comment.module" - }, - { - "project_id": 12118, - "project_name": "project/rebuild", - "filename": "tests/fixtures/drupal_sites/prod/modules/rdf/rdf.module" - }, - { - "project_id": 12168, - "project_name": "project/node_notify", - "filename": "node_notify.module" - }, - { - "project_id": 13111, - "project_name": "project/ddcla", - "filename": "public/modules/comment/comment.module" - }, - { - "project_id": 13111, - "project_name": "project/ddcla", - "filename": "public/modules/rdf/rdf.module" - }, - { - "project_id": 13125, - "project_name": "project/transcribe_distribution", - "filename": "modules/comment/comment.module" - }, - { - "project_id": 13125, - "project_name": "project/transcribe_distribution", - "filename": "modules/rdf/rdf.module" - }, - { - "project_id": 14446, - "project_name": "project/tr_kurulum", - "filename": "modules/comment/comment.module" - }, - { - "project_id": 14446, - "project_name": "project/tr_kurulum", - "filename": "modules/rdf/rdf.module" - }, - { - "project_id": 14506, - "project_name": "project/tb_blog_starter", - "filename": "modules/comment/comment.module" - }, - { - "project_id": 14506, - "project_name": "project/tb_blog_starter", - "filename": "modules/rdf/rdf.module" - }, - { - "project_id": 14507, - "project_name": "project/tb_events_starter", - "filename": "modules/comment/comment.module" - }, - { - "project_id": 14507, - "project_name": "project/tb_events_starter", - "filename": "modules/rdf/rdf.module" - }, - { - "project_id": 14509, - "project_name": "project/tb_hadelis_starter", - "filename": "modules/comment/comment.module" - }, - { - "project_id": 14509, - "project_name": "project/tb_hadelis_starter", - "filename": "modules/rdf/rdf.module" - }, - { - "project_id": 14510, - "project_name": "project/tb_methys_starter", - "filename": "modules/comment/comment.module" - }, - { - "project_id": 14510, - "project_name": "project/tb_methys_starter", - "filename": "modules/rdf/rdf.module" - }, - { - "project_id": 14511, - "project_name": "project/tb_mollise_starter", - "filename": "modules/comment/comment.module" - }, - { - "project_id": 14511, - "project_name": "project/tb_mollise_starter", - "filename": "modules/rdf/rdf.module" - }, - { - "project_id": 14512, - "project_name": "project/tb_neris_starter", - "filename": "modules/comment/comment.module" - }, - { - "project_id": 14512, - "project_name": "project/tb_neris_starter", - "filename": "modules/rdf/rdf.module" - }, - { - "project_id": 14513, - "project_name": "project/tb_palicico_starter", - "filename": "modules/comment/comment.module" - }, - { - "project_id": 14513, - "project_name": "project/tb_palicico_starter", - "filename": "modules/rdf/rdf.module" - }, - { - "project_id": 14514, - "project_name": "project/tb_purity_starter", - "filename": "modules/comment/comment.module" - }, - { - "project_id": 14514, - "project_name": "project/tb_purity_starter", - "filename": "modules/rdf/rdf.module" - }, - { - "project_id": 14515, - "project_name": "project/tb_rave_starter", - "filename": "modules/comment/comment.module" - }, - { - "project_id": 14515, - "project_name": "project/tb_rave_starter", - "filename": "modules/rdf/rdf.module" - }, - { - "project_id": 14522, - "project_name": "project/tb_sirate_starter", - "filename": "modules/comment/comment.module" - }, - { - "project_id": 14522, - "project_name": "project/tb_sirate_starter", - "filename": "modules/rdf/rdf.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/rdf/rdf.module" - }, - { - "project_id": 14636, - "project_name": "project/md_foto", - "filename": "inc/template.process.inc" - }, - { - "project_id": 14796, - "project_name": "project/comment_fragment", - "filename": "comment_fragment.module" - }, - { - "project_id": 15222, - "project_name": "project/open_badging_installation_profile", - "filename": "modules/comment/comment.module" - }, - { - "project_id": 15222, - "project_name": "project/open_badging_installation_profile", - "filename": "modules/rdf/rdf.module" - }, - { - "project_id": 16192, - "project_name": "project/mobilearkickstart", - "filename": "modules/comment/comment.module" - }, - { - "project_id": 16192, - "project_name": "project/mobilearkickstart", - "filename": "modules/rdf/rdf.module" - }, - { - "project_id": 16549, - "project_name": "project/twbs", - "filename": "preprocess/modules/comment/twbs_preprocess_comment.inc" - }, - { - "project_id": 16984, - "project_name": "project/spanish_distribution", - "filename": "modules/comment/comment.module" - }, - { - "project_id": 16984, - "project_name": "project/spanish_distribution", - "filename": "modules/rdf/rdf.module" - }, - { - "project_id": 17013, - "project_name": "project/fuse", - "filename": "modules/comment/comment.module" - }, - { - "project_id": 17013, - "project_name": "project/fuse", - "filename": "modules/rdf/rdf.module" - }, - { - "project_id": 18559, - "project_name": "project/govbr", - "filename": "modules/comment/comment.module" - }, - { - "project_id": 18559, - "project_name": "project/govbr", - "filename": "modules/rdf/rdf.module" - }, - { - "project_id": 18897, - "project_name": "project/qurandistribution", - "filename": "modules/comment/comment.module" - }, - { - "project_id": 18897, - "project_name": "project/qurandistribution", - "filename": "modules/rdf/rdf.module" - }, - { - "project_id": 20047, - "project_name": "project/stacksight", - "filename": "stacksight.module" - }, - { - "project_id": 20990, - "project_name": "project/development", - "filename": "modules/comment/comment.module" - }, - { - "project_id": 20990, - "project_name": "project/development", - "filename": "modules/rdf/rdf.module" - }, - { - "project_id": 21149, - "project_name": "project/oa_basetheme", - "filename": "includes/comment.inc" - }, - { - "project_id": 21241, - "project_name": "project/techsupport", - "filename": "modules/contrib/project/package/project_package.module" - }, - { - "project_id": 21241, - "project_name": "project/techsupport", - "filename": "modules/contrib/project_issue/project_issue.module" - }, - { - "project_id": 21242, - "project_name": "project/tsm", - "filename": "modules/contrib/project/package/project_package.module" - }, - { - "project_id": 21242, - "project_name": "project/tsm", - "filename": "modules/contrib/project_issue/project_issue.module" - }, - { - "project_id": 23470, - "project_name": "project/gp_reviews", - "filename": "modules/comment/comment.module" - }, - { - "project_id": 23470, - "project_name": "project/gp_reviews", - "filename": "modules/rdf/rdf.module" - }, - { - "project_id": 25548, - "project_name": "project/jats_generator", - "filename": "jats_generator.pages.inc" - }, - { - "project_id": 25896, - "project_name": "project/byu_installation_profile", - "filename": "modules/comment/comment.module" - }, - { - "project_id": 25896, - "project_name": "project/byu_installation_profile", - "filename": "modules/rdf/rdf.module" - }, - { - "project_id": 52855, - "project_name": "project/idea", - "filename": "themes/openideal_theme/openideal_theme.theme" - }, - { - "project_id": 52855, - "project_name": "project/idea", - "filename": "themes/openideal_theme/templates/comment/comment--view--my-comments--my-comments.html.twig" - }, - { - "project_id": 59005, - "project_name": "project/social", - "filename": "modules/social_features/social_comment/src/Form/SocialCommentAdminOverview.php" - }, - { - "project_id": 59097, - "project_name": "project/easy_booking", - "filename": "themes/contrib/adaptivetheme/at_core/inc/preprocess.inc" - }, - { - "project_id": 60227, - "project_name": "project/govimentum", - "filename": "modules/comment/comment.module" - }, - { - "project_id": 60227, - "project_name": "project/govimentum", - "filename": "modules/rdf/rdf.module" - }, - { - "project_id": 60278, - "project_name": "project/jsonapi_comment", - "filename": "jsonapi_comment.link_relation_types.yml" - }, - { - "project_id": 62378, - "project_name": "project/drupalru_d7", - "filename": "modules/comment/comment.module" - }, - { - "project_id": 62378, - "project_name": "project/drupalru_d7", - "filename": "modules/rdf/rdf.module" - }, - { - "project_id": 63624, - "project_name": "project/ubershopwish", - "filename": "modules/comment/comment.module" - }, - { - "project_id": 63624, - "project_name": "project/ubershopwish", - "filename": "modules/rdf/rdf.module" - }, - { - "project_id": 77509, - "project_name": "project/testproject4234", - "filename": "modules/comment/comment.module" - }, - { - "project_id": 77509, - "project_name": "project/testproject4234", - "filename": "modules/rdf/rdf.module" - }, - { - "project_id": 209517, - "project_name": "project/gadget", - "filename": "src/Commands/File/GadgetFileCommands.php" - } - ], - "ReplaceDateTimeRangeConstantsRector": [ - { - "project_id": 61195, - "project_name": "project/deprecation_status", - "filename": "data/12_errors_detail.csv" - } - ], - "ReplaceEditorLoadRector": [ - { - "project_id": 342, - "project_name": "project/tinymce", - "filename": "tests/src/Kernel/TinyMCETest.php" - }, - { - "project_id": 1363, - "project_name": "project/bueditor", - "filename": "src/Plugin/BUEditorPlugin/XPreview.php" - }, - { - "project_id": 1363, - "project_name": "project/bueditor", - "filename": "src/Plugin/Editor/BUEditor.php" - }, - { - "project_id": 2291, - "project_name": "project/video_filter", - "filename": "tests/src/Functional/CkEditor4LoadingTest.php" - }, - { - "project_id": 2431, - "project_name": "project/cdn", - "filename": "cdn.module" - }, - { - "project_id": 2760, - "project_name": "project/editor", - "filename": "editor.features.inc" - }, - { - "project_id": 3155, - "project_name": "project/markdown", - "filename": "tests/src/Functional/FilterAdminTest.php" - }, - { - "project_id": 7220, - "project_name": "project/translation_management", - "filename": "icl_translate/css/icl_translate_editor.css" - }, - { - "project_id": 8863, - "project_name": "project/imageeditor", - "filename": "plugins/editor/svgedit/ext-imageeditor.js" - }, - { - "project_id": 10247, - "project_name": "project/video_embed_field", - "filename": "modules/video_embed_wysiwyg/tests/src/Functional/TextFormatConfigurationTest.php" - }, - { - "project_id": 12690, - "project_name": "project/ole", - "filename": "includes/openlayers_behavior_ole.js" - }, - { - "project_id": 14095, - "project_name": "project/wysiwyg_ckeditor", - "filename": "ckeditor.api.php" - }, - { - "project_id": 15649, - "project_name": "project/contextly", - "filename": "js/contextly-edit-form.js" - }, - { - "project_id": 17822, - "project_name": "project/quickedit", - "filename": "src/Plugin/InPlaceEditor/Editor.php" - }, - { - "project_id": 18406, - "project_name": "project/url_embed", - "filename": "tests/src/FunctionalJavascript/UrlEmbedCKEditor5UITest.php" - }, - { - "project_id": 20814, - "project_name": "project/editor_advanced_link", - "filename": "tests/src/FunctionalJavascript/AdvancedLinkTest.php" - }, - { - "project_id": 20888, - "project_name": "project/editor_ckeditor_widgets", - "filename": "editor_ckeditor_widgets.module" - }, - { - "project_id": 23954, - "project_name": "project/wysiwyg_trumbowyg", - "filename": "editors/trumbowyg.inc" - }, - { - "project_id": 25567, - "project_name": "project/synimage", - "filename": "src/Form/EditorImageSynboxDialog.php" - }, - { - "project_id": 25665, - "project_name": "project/ckeditor_config", - "filename": "ckeditor_config.install" - }, - { - "project_id": 27296, - "project_name": "project/inline_formatter_field", - "filename": "src/Plugin/Field/FieldFormatter/InlineFormatterFieldFormatter.php" - }, - { - "project_id": 47385, - "project_name": "project/entity_embed", - "filename": "tests/src/FunctionalJavascript/CKEditor5IntegrationTest.php" - }, - { - "project_id": 50178, - "project_name": "project/ckeditor_mentions", - "filename": "src/Controller/CKMentionsController.php" - }, - { - "project_id": 53807, - "project_name": "project/boxout", - "filename": "boxout.install" - }, - { - "project_id": 55234, - "project_name": "project/flmngr", - "filename": "flmngr.install" - }, - { - "project_id": 55425, - "project_name": "project/ckeditor_codemirror", - "filename": "tests/src/Functional/CkeditorCodeMirrorBasicTest.php" - }, - { - "project_id": 55863, - "project_name": "project/depcalc", - "filename": "src/EventSubscriber/DependencyCollector/TextItemFieldDependencyCollector.php" - }, - { - "project_id": 56296, - "project_name": "project/editor_advanced_image", - "filename": "tests/src/FunctionalJavascript/CKEditor5EditorAdvancedImageDialogTest.php" - }, - { - "project_id": 58509, - "project_name": "project/wxt", - "filename": "modules/custom/wxt_core/src/UpdateWxT/UpdateWxT420.php" - }, - { - "project_id": 58633, - "project_name": "project/openfed", - "filename": "modules/d10_compatibility/ckeditor_uploadimage/ckeditor_uploadimage-3296773-7.patch" - }, - { - "project_id": 58633, - "project_name": "project/openfed", - "filename": "modules/d10_compatibility/ckeditor_uploadimage/ckeditor_uploadimage-fix-undefined-array-key-3543081-2.patch" - }, - { - "project_id": 58633, - "project_name": "project/openfed", - "filename": "modules/d10_compatibility/ckeditor_uploadimage/src/Plugin/CKEditorPlugin/DrupalUploadImage.php" - }, - { - "project_id": 58633, - "project_name": "project/openfed", - "filename": "modules/d10_compatibility/ckeditor_uploadimage/src/Plugin/CKEditorPlugin/DrupalUploadImageImce.php" - }, - { - "project_id": 59741, - "project_name": "project/ckeditor_uploadimage", - "filename": "src/Plugin/CKEditorPlugin/DrupalUploadImage.php" - }, - { - "project_id": 59741, - "project_name": "project/ckeditor_uploadimage", - "filename": "src/Plugin/CKEditorPlugin/DrupalUploadImageImce.php" - }, - { - "project_id": 59857, - "project_name": "project/acquia_contenthub", - "filename": "tests/src/Kernel/EventSubscriber/EntityImport/FilterFormatEditor/FilterFormatEditorTest.php" - }, - { - "project_id": 60656, - "project_name": "project/decoupled", - "filename": "decoupled_jsoneditor/src/EntityTypeInfo.php" - }, - { - "project_id": 60909, - "project_name": "project/inline_image_token", - "filename": "inline_image_token.module" - }, - { - "project_id": 63343, - "project_name": "project/ckeditor_exclude_tags", - "filename": "src/Form/CkeditorSettings.php" - }, - { - "project_id": 63480, - "project_name": "project/ezcontent_publish", - "filename": "modules/ezcontent_publish_layoutmanager/ezcontent_publish_layoutmanager.install" - }, - { - "project_id": 64036, - "project_name": "project/grapesjs_editor", - "filename": "src/Controller/AssetController.php" - }, - { - "project_id": 73144, - "project_name": "project/learnosity", - "filename": "src/Controller/LearnosityImageUploadController.php" - }, - { - "project_id": 73144, - "project_name": "project/learnosity", - "filename": "src/LearnosityActivityEditorPermissions.php" - }, - { - "project_id": 73144, - "project_name": "project/learnosity", - "filename": "src/Plugin/Field/FieldType/LearnosityActivity.php" - }, - { - "project_id": 80771, - "project_name": "project/ckeditor_custom_paste_filters", - "filename": "ckeditor_custom_paste_filters.module" - }, - { - "project_id": 84617, - "project_name": "project/acquia_dam", - "filename": "src/FormatAllowedHtmlModifier.php" - }, - { - "project_id": 86813, - "project_name": "project/address_suggestion", - "filename": "src/Controller/AddressSuggestion.php" - }, - { - "project_id": 93188, - "project_name": "project/ckeditor5_premium_features", - "filename": "modules/ckeditor5_premium_features_fullscreen/ckeditor5_premium_features_fullscreen.module" - }, - { - "project_id": 93188, - "project_name": "project/ckeditor5_premium_features", - "filename": "modules/ckeditor5_premium_features_merge_fields/src/MergeFieldsProcessor.php" - }, - { - "project_id": 104066, - "project_name": "project/ckeditor5_highlight", - "filename": "ckeditor5_highlight.module" - }, - { - "project_id": 108775, - "project_name": "project/ckeditor5_mentions", - "filename": "src/Element/MentionsIntegration.php" - }, - { - "project_id": 113931, - "project_name": "project/visual_editor", - "filename": "js/visual_editor.node_view.js" - }, - { - "project_id": 116100, - "project_name": "project/ckeditor5_spoiler", - "filename": "ckeditor5_spoiler.install" - }, - { - "project_id": 117346, - "project_name": "project/txt42", - "filename": "txt42.install" - }, - { - "project_id": 121122, - "project_name": "project/ckeditor_lts", - "filename": "ckeditor.api.php" - }, - { - "project_id": 121122, - "project_name": "project/ckeditor_lts", - "filename": "tests/src/Functional/CKEditorAdminTest.php" - }, - { - "project_id": 121122, - "project_name": "project/ckeditor_lts", - "filename": "tests/src/Functional/CKEditorLoadingTest.php" - }, - { - "project_id": 121122, - "project_name": "project/ckeditor_lts", - "filename": "tests/src/Functional/CKEditorStylesComboAdminTest.php" - }, - { - "project_id": 121122, - "project_name": "project/ckeditor_lts", - "filename": "tests/src/Functional/Update/CKEditorUpdateOmitDisabledPluginSettings.php" - }, - { - "project_id": 121122, - "project_name": "project/ckeditor_lts", - "filename": "tests/src/FunctionalJavascript/CKEditor5CKEditor4Compatibility.php" - }, - { - "project_id": 121122, - "project_name": "project/ckeditor_lts", - "filename": "tests/src/Kernel/CKEditorPluginManagerTest.php" - }, - { - "project_id": 121122, - "project_name": "project/ckeditor_lts", - "filename": "tests/src/Kernel/CKEditorTest.php" - }, - { - "project_id": 132503, - "project_name": "project/edit_plus", - "filename": "src/InlineEditorElement.php" - }, - { - "project_id": 135785, - "project_name": "project/ckeditor_braille", - "filename": "ckeditor_braille.install" - }, - { - "project_id": 142569, - "project_name": "project/ckeditor5_plugin_pack", - "filename": "modules/ckeditor5_plugin_pack_bookmark/ckeditor5_plugin_pack_bookmark.module" - }, - { - "project_id": 142569, - "project_name": "project/ckeditor5_plugin_pack", - "filename": "modules/ckeditor5_plugin_pack_emoji/ckeditor5_plugin_pack_emoji.module" - }, - { - "project_id": 142569, - "project_name": "project/ckeditor5_plugin_pack", - "filename": "modules/ckeditor5_plugin_pack_find_and_replace/tests/src/FunctionalJavascript/FindReplaceTest.php" - }, - { - "project_id": 142569, - "project_name": "project/ckeditor5_plugin_pack", - "filename": "modules/ckeditor5_plugin_pack_highlight/ckeditor5_plugin_pack_highlight.module" - }, - { - "project_id": 142569, - "project_name": "project/ckeditor5_plugin_pack", - "filename": "modules/ckeditor5_plugin_pack_todo_document_list/ckeditor5_plugin_pack_todo_document_list.module" - }, - { - "project_id": 147460, - "project_name": "project/ckeditor_historylog", - "filename": "js/ckeditor5_plugins/history_log/src/historylog.js" - }, - { - "project_id": 149523, - "project_name": "project/ckeditor5_deepl", - "filename": "src/Controller/TranslationEndpointController.php" - }, - { - "project_id": 163816, - "project_name": "project/ai_ckeditor_extras", - "filename": "tests/src/FunctionalJavascript/CkeditorPluginTestBase.php" - }, - { - "project_id": 163816, - "project_name": "project/ai_ckeditor_extras", - "filename": "tests/src/FunctionalJavascript/FaqPluginTest.php" - }, - { - "project_id": 163816, - "project_name": "project/ai_ckeditor_extras", - "filename": "tests/src/FunctionalJavascript/FleschScorePluginTest.php" - }, - { - "project_id": 163816, - "project_name": "project/ai_ckeditor_extras", - "filename": "tests/src/FunctionalJavascript/ParaphrasingPluginTest.php" - }, - { - "project_id": 163816, - "project_name": "project/ai_ckeditor_extras", - "filename": "tests/src/FunctionalJavascript/TonePluginTest.php" - }, - { - "project_id": 167646, - "project_name": "project/theme_file_editor", - "filename": "theme_file_editor.routing.yml" - }, - { - "project_id": 172885, - "project_name": "project/deepseek", - "filename": "js/React/src/component/message/chat-trix.jsx" - }, - { - "project_id": 177369, - "project_name": "project/smartlinker_ai", - "filename": "smartlinker_ai.install" - }, - { - "project_id": 179931, - "project_name": "project/media_folders", - "filename": "js/ckeditor.js" - }, - { - "project_id": 181203, - "project_name": "project/json_drop_api", - "filename": "modules/contrib/ckeditor5_plugin_pack/modules/ckeditor5_plugin_pack_find_and_replace/tests/src/FunctionalJavascript/FindReplaceTest.php" - }, - { - "project_id": 181203, - "project_name": "project/json_drop_api", - "filename": "modules/contrib/ckeditor5_plugin_pack/modules/ckeditor5_plugin_pack_highlight/ckeditor5_plugin_pack_highlight.module" - }, - { - "project_id": 181203, - "project_name": "project/json_drop_api", - "filename": "modules/contrib/ckeditor5_plugin_pack/modules/ckeditor5_plugin_pack_todo_document_list/ckeditor5_plugin_pack_todo_document_list.module" - }, - { - "project_id": 181203, - "project_name": "project/json_drop_api", - "filename": "modules/contrib/ckeditor5_premium_features/modules/ckeditor5_premium_features_productivity_pack/ckeditor5_premium_features_productivity_pack.module" - }, - { - "project_id": 188930, - "project_name": "project/dsfr4drupal_picker", - "filename": "src/Form/DialogFormBase.php" - }, - { - "project_id": 193057, - "project_name": "project/toast_image_editor", - "filename": "css/toast-image-editor.css" - }, - { - "project_id": 193866, - "project_name": "project/module_file_editor", - "filename": "module_file_editor.routing.yml" - }, - { - "project_id": 195972, - "project_name": "project/ckeditor5_scroll_fix", - "filename": "ckeditor5_scroll_fix.module" - }, - { - "project_id": 197809, - "project_name": "project/editor_advanced_table", - "filename": "tests/src/FunctionalJavascript/TableAdvancedEditorTest.php" - }, - { - "project_id": 198724, - "project_name": "project/ai_editoria11y", - "filename": "ai_editoria11y.module" - }, - { - "project_id": 198724, - "project_name": "project/ai_editoria11y", - "filename": "tests/src/Kernel/UninstallTest.php" - }, - { - "project_id": 207471, - "project_name": "project/ai_agents_experimental_collection", - "filename": "modules/ai_agents_text_formats/src/Plugin/tool/Tool/DeleteTextFormat.php" - }, - { - "project_id": 207471, - "project_name": "project/ai_agents_experimental_collection", - "filename": "modules/ai_agents_text_formats/src/Plugin/tool/Tool/GetEditorConfig.php" - }, - { - "project_id": 207471, - "project_name": "project/ai_agents_experimental_collection", - "filename": "modules/ai_agents_text_formats/src/Plugin/tool/Tool/UpdateEditorPluginSettings.php" - }, - { - "project_id": 207471, - "project_name": "project/ai_agents_experimental_collection", - "filename": "modules/ai_agents_text_formats/src/Plugin/tool/Tool/UpdateEditorToolbar.php" - }, - { - "project_id": 207471, - "project_name": "project/ai_agents_experimental_collection", - "filename": "modules/ai_agents_text_formats/src/Plugin/tool/Tool/UpdateImageUploadSettings.php" - }, - { - "project_id": 208618, - "project_name": "project/token_browser_plus", - "filename": "token_browser_plus.module" - }, - { - "project_id": 209328, - "project_name": "project/flo", - "filename": "src/Hook/FloHooks.php" - }, - { - "project_id": 209328, - "project_name": "project/flo", - "filename": "tests/src/Kernel/FloCKEditor5Test.php" - }, - { - "project_id": 209554, - "project_name": "project/custom_paragraphs", - "filename": "custom_paragraphs.module" - } - ], - "ReplaceEntityOriginalPropertyRector": [ - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": ".gitignore" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/cache-install.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/database/log.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/database/sqlite/select.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/errors.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/file.mimetypes.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/filetransfer/local.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/filetransfer/ssh.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/install.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/lock.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/password.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/farbtastic/farbtastic.js" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/powered-blue-80x15.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/powered-gray-135x42.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/ui/jquery.ui.selectable.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/ui/jquery.ui.slider.min.js" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/aggregator/aggregator-feed-source.tpl.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/aggregator/tests/aggregator_test_atom.xml" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/block/block.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/block/block.js" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.api.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/contact/contact.admin.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/contact/contact.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/dashboard/dashboard.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/field.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/modules/list/list.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/modules/number/number.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/tests/field_test.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/tests/field_test.storage.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field_ui/field_ui.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/file/icons/application-x-executable.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/file/icons/text-html.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/file/icons/text-x-generic.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/file/icons/x-office-document.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/filter/filter.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/filter/filter.pages.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/forum/forum.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/help/help.api.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/locale/locale.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/node/tests/node_access_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/node/tests/node_test_exception.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/openid/openid.pages.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/openid/tests/openid_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/path/path.admin.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/php/php.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/poll/poll-results.tpl.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/rdf/rdf.api.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/rdf/tests/rdf_test.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/search/search.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/search/tests/search_embedded_form.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/search/tests/search_extra_type.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/files/css_test_files/comment_hacks.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/files/css_test_files/comment_hacks.css.unoptimized.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/files/javascript-2.script" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/simpletest.js" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/actions.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/ajax_test.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/error.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/graph.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/image_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/password.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/path_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/requirements1_test.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/system_incompatible_core_version_dependencies_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/system_incompatible_module_version_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/theme_test.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/unicode.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/upgrade/drupal-6.upload.database.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/upgrade/drupal-6.user-password-token.database.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/upgrade/drupal-7.aggregator.database.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/upgrade/upgrade.comment.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/statistics/statistics.pages.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/syslog/syslog.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/syslog/syslog.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/system/system.archiver.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/system/system.queue.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/system/system.updater.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/taxonomy/taxonomy.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/tracker/tracker.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/trigger/trigger.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/update/tests/aaa_update_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/update/tests/drupal.0.xml" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/user/tests/user_form_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/user/tests/user_form_test.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/README.txt" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/bartik/css/print.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/bartik/images/buttons.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/garland/color/preview.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/garland/fix-ie.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/garland/images/menu-collapsed-rtl.gif" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/garland/logo.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/seven/ie6.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/seven/ie7.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/seven/images/ui-icons-ffffff-256x240.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/seven/page.tpl.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/seven/style.css" - } - ], - "ReplaceEntityReferenceRecursiveLimitRector": [ - { - "project_id": 21317, - "project_name": "project/content_browser", - "filename": "src/Plugin/Block/ContentEmbedBlock.php" - }, - { - "project_id": 22324, - "project_name": "project/berf", - "filename": "src/Plugin/Field/FieldFormatter/BetterEntityReferenceFormatter.php" - }, - { - "project_id": 22479, - "project_name": "project/paragraphs_summary", - "filename": "src/Plugin/Field/FieldFormatter/ParagraphsSummaryFormatter.php" - }, - { - "project_id": 22547, - "project_name": "project/entity_reference_override", - "filename": "src/Plugin/Field/FieldFormatter/EntityReferenceOverrideEntityFormatter.php" - }, - { - "project_id": 25448, - "project_name": "project/entity_overlay", - "filename": "src/Plugin/Field/FieldFormatter/EntityReferenceOverlayFormatter.php" - }, - { - "project_id": 25540, - "project_name": "project/entity_browser_block", - "filename": "src/Plugin/Block/EntityBrowserBlock.php" - }, - { - "project_id": 26951, - "project_name": "project/field_pager", - "filename": "src/Plugin/Field/FieldFormatter/EntityReferencePager.php" - }, - { - "project_id": 27656, - "project_name": "project/entity_reference_ajax_formatter", - "filename": "src/Plugin/Field/FieldFormatter/EntityReferenceAjaxFormatter.php" - }, - { - "project_id": 47385, - "project_name": "project/entity_embed", - "filename": "src/Plugin/Filter/EntityEmbedFilter.php" - }, - { - "project_id": 47385, - "project_name": "project/entity_embed", - "filename": "tests/src/Functional/RecursionProtectionTest.php" - }, - { - "project_id": 47880, - "project_name": "project/entity_list", - "filename": "src/Plugin/Field/FieldFormatter/EntityListReferenceFieldFormatter.php" - }, - { - "project_id": 49566, - "project_name": "project/multi_render_formatter", - "filename": "src/Plugin/Field/FieldFormatter/EntityMultiRender.php" - }, - { - "project_id": 56286, - "project_name": "project/dynamic_entity_reference", - "filename": "src/Plugin/Field/FieldFormatter/DynamicEntityReferenceEntityFormatter.php" - }, - { - "project_id": 58193, - "project_name": "project/tripal", - "filename": "tripal_chado/src/Plugin/Field/FieldFormatter/ChadoEmbeddedEntityFormatter.php" - }, - { - "project_id": 58658, - "project_name": "project/df", - "filename": "modules/df/df_tools/df_tools_media/src/Plugin/Block/MediaEmbedBlock.php" - }, - { - "project_id": 59736, - "project_name": "project/rocketship_core", - "filename": "src/Plugin/Field/FieldFormatter/MultiViewModeEntityReferenceEntityFormatter.php" - }, - { - "project_id": 59851, - "project_name": "project/gutenberg", - "filename": "src/BlockProcessor/ContentBlockProcessor.php" - }, - { - "project_id": 59851, - "project_name": "project/gutenberg", - "filename": "src/BlockProcessor/ReusableBlockProcessor.php" - }, - { - "project_id": 60037, - "project_name": "project/link_field_display_mode_formatter", - "filename": "src/Plugin/Field/FieldFormatter/LinkRenderingAnotherDisplayModeFormatter.php" - }, - { - "project_id": 60517, - "project_name": "project/revisiondiff", - "filename": "src/Plugin/Field/FieldFormatter/RevisionDiffFieldFormatter.php" - }, - { - "project_id": 62851, - "project_name": "project/entity_reference_dynamic_display", - "filename": "src/Plugin/Field/FieldFormatter/DynamicDisplay.php" - }, - { - "project_id": 67475, - "project_name": "project/entity_reference_views_backfill", - "filename": "src/Plugin/Field/FieldFormatter/EntityReferenceEntityViewsBackfillFormatter.php" - }, - { - "project_id": 68121, - "project_name": "project/nested_entity_reference_formatter", - "filename": "src/Plugin/Field/FieldFormatter/NestedEntityReferenceFormatter.php" - }, - { - "project_id": 79554, - "project_name": "project/external_entity", - "filename": "src/Plugin/Field/FieldFormatter/ExternalEntityReferenceEntityFormatter.php" - }, - { - "project_id": 81045, - "project_name": "project/custom_field", - "filename": "src/Plugin/CustomField/FieldFormatter/EntityReferenceEntityFormatter.php" - }, - { - "project_id": 81142, - "project_name": "project/view_mode_crop", - "filename": "src/Plugin/Field/FieldFormatter/ViewModeCropEntityReferenceEntityFormatter.php" - }, - { - "project_id": 92852, - "project_name": "project/image_as_media", - "filename": "src/Plugin/Field/FieldFormatter/ImageAsMediaFormatter.php" - }, - { - "project_id": 93801, - "project_name": "project/seb", - "filename": "src/Plugin/Block/EntityBlock.php" - }, - { - "project_id": 95804, - "project_name": "project/datafield", - "filename": "src/Plugin/DataField/FieldFormatter/EntityReferenceEntityFormatter.php" - }, - { - "project_id": 109975, - "project_name": "project/rest_entity_display", - "filename": "src/Plugin/Field/FieldFormatter/EmbedEntityReferenceFormatter.php" - }, - { - "project_id": 111643, - "project_name": "project/published_referenced_entity", - "filename": "src/Plugin/Field/FieldFormatter/PublishedRenderedEntityFormatter.php" - }, - { - "project_id": 152311, - "project_name": "project/more_fields", - "filename": "src/Plugin/Field/FieldFormatter/EntityFilterReferenceFormatter.php" - }, - { - "project_id": 196530, - "project_name": "project/rendred_entity_list_formatter", - "filename": "src/Plugin/Field/FieldFormatter/RendredEntityListFormatter.php" - }, - { - "project_id": 196536, - "project_name": "project/rendered_entity_list_formatter", - "filename": "src/Plugin/Field/FieldFormatter/RenderedEntityListFormatter.php" - }, - { - "project_id": 201686, - "project_name": "project/layout_builder_formatter", - "filename": "src/Plugin/Field/FieldFormatter/LayoutBuilderFormatter.php" - } - ], - "ReplaceFieldgroupToFieldsetRector": [ - { - "project_id": 978, - "project_name": "project/fieldgroup", - "filename": "fieldgroup.module" - }, - { - "project_id": 1258, - "project_name": "project/fieldgroup_table", - "filename": "fieldgroup_table.module" - }, - { - "project_id": 1894, - "project_name": "project/cck_fieldgroup_tabs", - "filename": "cck_fieldgroup_tabs.module" - }, - { - "project_id": 2942, - "project_name": "project/hexagon", - "filename": "overrides/contrib.cck/content.common-vars.inc" - }, - { - "project_id": 3873, - "project_name": "project/bundles", - "filename": "bundles_cck.install.inc" - }, - { - "project_id": 4095, - "project_name": "project/inherit", - "filename": "inherit.module" - }, - { - "project_id": 4557, - "project_name": "project/popups_subedit", - "filename": "popups_subedit.module" - }, - { - "project_id": 4559, - "project_name": "project/aurigma", - "filename": "aurigma_iufield.upload.inc" - }, - { - "project_id": 4627, - "project_name": "project/fieldtool", - "filename": "plugins/fieldtool/fieldgroup.inc" - }, - { - "project_id": 5055, - "project_name": "project/cck_inputs", - "filename": "modules/cck_inputs_form/cck_inputs_form.module" - }, - { - "project_id": 5362, - "project_name": "project/cck_sync", - "filename": "cck_sync.module" - }, - { - "project_id": 6245, - "project_name": "project/profile_migrate", - "filename": "profile_migrate.module" - }, - { - "project_id": 6452, - "project_name": "project/meetu", - "filename": "modules/features/meetu_feature_core/meetu_feature_core.features.fieldgroup.inc" - }, - { - "project_id": 6551, - "project_name": "project/node_widget", - "filename": "includes/node_widget.class.inc" - }, - { - "project_id": 6551, - "project_name": "project/node_widget", - "filename": "modules/filefield.node_widget.inc" - }, - { - "project_id": 6610, - "project_name": "project/acc", - "filename": "alternate_content_copy.module" - }, - { - "project_id": 6632, - "project_name": "project/pirets", - "filename": "pirets.install" - }, - { - "project_id": 6705, - "project_name": "project/briefcase", - "filename": "includes/briefcase_cck.admin.inc" - }, - { - "project_id": 6861, - "project_name": "project/content_type_exporter", - "filename": "content_type_exporter.module" - }, - { - "project_id": 7006, - "project_name": "project/content_display_order", - "filename": "content_display_order.admin.inc" - }, - { - "project_id": 7006, - "project_name": "project/content_display_order", - "filename": "content_display_order.module" - }, - { - "project_id": 7108, - "project_name": "project/field_or", - "filename": "field_or.module" - }, - { - "project_id": 7450, - "project_name": "project/cck_signup", - "filename": "cck_signup_group/cck_signup_group.admin.inc" - }, - { - "project_id": 7926, - "project_name": "project/imagefetchr", - "filename": "imagefetchr.admin.inc" - }, - { - "project_id": 8434, - "project_name": "project/ct_plus", - "filename": "ct_plus.features.fieldgroup.inc" - }, - { - "project_id": 8595, - "project_name": "project/podgroups", - "filename": "content_podgroup.admin.inc" - }, - { - "project_id": 9201, - "project_name": "project/volunteer_rally_features", - "filename": "shift_signup/shift_signup.features.fieldgroup.inc" - }, - { - "project_id": 9201, - "project_name": "project/volunteer_rally_features", - "filename": "shift_signup_group/shift_signup_group.features.fieldgroup.inc" - }, - { - "project_id": 9201, - "project_name": "project/volunteer_rally_features", - "filename": "shift_signup_group_address/shift_signup_group_address.features.fieldgroup.inc" - }, - { - "project_id": 9274, - "project_name": "project/donor_rally_features", - "filename": "dr_team/dr_team.features.fieldgroup.inc" - }, - { - "project_id": 9530, - "project_name": "project/commerce_fieldgroup_panes", - "filename": "commerce_fieldgroup_panes.module" - }, - { - "project_id": 9770, - "project_name": "project/corporative_site", - "filename": "modules/contrib/cck/modules/content_copy/content_copy.module" - }, - { - "project_id": 9770, - "project_name": "project/corporative_site", - "filename": "modules/contrib/cck/modules/fieldgroup/fieldgroup.install" - }, - { - "project_id": 9770, - "project_name": "project/corporative_site", - "filename": "modules/contrib/cck/modules/fieldgroup/fieldgroup.module" - }, - { - "project_id": 9770, - "project_name": "project/corporative_site", - "filename": "modules/contrib/cck/modules/fieldgroup/panels/content_types/content_fieldgroup.inc" - }, - { - "project_id": 9770, - "project_name": "project/corporative_site", - "filename": "modules/contrib/cck/translations/pt.po" - }, - { - "project_id": 9770, - "project_name": "project/corporative_site", - "filename": "modules/contrib/features/includes/features.fieldgroup.inc" - }, - { - "project_id": 9770, - "project_name": "project/corporative_site", - "filename": "modules/contrib/features/tests/features.test" - }, - { - "project_id": 9770, - "project_name": "project/corporative_site", - "filename": "modules/contrib/features/tests/features_test.features.fieldgroup.inc" - }, - { - "project_id": 9833, - "project_name": "project/microdata", - "filename": "microdata.test" - }, - { - "project_id": 9847, - "project_name": "project/b2b_store_solution", - "filename": "b2b_construction/modules/contrib/field_group/field_group.module" - }, - { - "project_id": 9911, - "project_name": "project/dt", - "filename": "includes/contrib/dt.fieldgroup.inc" - }, - { - "project_id": 10271, - "project_name": "project/msnf", - "filename": "includes/msnf.steps.inc" - }, - { - "project_id": 10787, - "project_name": "project/bundle_copy", - "filename": "bundle_copy.module" - }, - { - "project_id": 11093, - "project_name": "project/fieldgroup_htabs", - "filename": "fieldgroup_htabs.module" - }, - { - "project_id": 11481, - "project_name": "project/fieldgroup_callouts", - "filename": "fieldgroup_callouts.module" - }, - { - "project_id": 11542, - "project_name": "project/cgpa_calculator", - "filename": "cgpa_calculator.features.fieldgroup.inc" - }, - { - "project_id": 11653, - "project_name": "project/elms_features", - "filename": "elms_parent/elms_parent.features.fieldgroup.inc" - }, - { - "project_id": 11653, - "project_name": "project/elms_features", - "filename": "elms_schedule/elms_schedule.features.fieldgroup.inc" - }, - { - "project_id": 11653, - "project_name": "project/elms_features", - "filename": "elms_site/elms_site.features.fieldgroup.inc" - }, - { - "project_id": 11704, - "project_name": "project/voipuser", - "filename": "voipuser.features.fieldgroup.inc" - }, - { - "project_id": 12559, - "project_name": "project/fieldgroup_placeholder", - "filename": "fieldgroup_placeholder.module" - }, - { - "project_id": 13003, - "project_name": "project/syndicator", - "filename": "includes/syndicator.permissions.inc" - }, - { - "project_id": 14470, - "project_name": "project/field_group_ajaxified_multipage", - "filename": "tests/src/Functional/FieldGroupAjaxifiedTest.php" - }, - { - "project_id": 15015, - "project_name": "project/bootstrap_fieldgroup", - "filename": "bootstrap_fieldgroup.module" - }, - { - "project_id": 15660, - "project_name": "project/markaspot", - "filename": "modules/mark_a_spot/mark_a_spot.field_group.inc" - }, - { - "project_id": 17996, - "project_name": "project/field_group_save_button", - "filename": "field_group_save_button.module" - }, - { - "project_id": 20051, - "project_name": "project/componentize", - "filename": "componentize_fieldgroup/componentize_fieldgroup.field_group.inc" - }, - { - "project_id": 20051, - "project_name": "project/componentize", - "filename": "componentize_fieldgroup/componentize_fieldgroup.module" - }, - { - "project_id": 20484, - "project_name": "project/mpub", - "filename": "modules/contrib/field_group/field_group.api.php" - }, - { - "project_id": 20484, - "project_name": "project/mpub", - "filename": "modules/contrib/field_group/field_group.module" - }, - { - "project_id": 20556, - "project_name": "project/bundle_copy_commerce", - "filename": "bundle_copy_commerce.module" - }, - { - "project_id": 21441, - "project_name": "project/field_group_table_component", - "filename": "field_group_table_component.module" - }, - { - "project_id": 21548, - "project_name": "project/skillset_inview", - "filename": "src/Form/ColorSkill.php" - }, - { - "project_id": 23311, - "project_name": "project/sports_league", - "filename": "modules/sl_default_ui/sl_default_ui.module" - }, - { - "project_id": 24042, - "project_name": "project/bundle_copy_profile2", - "filename": "bundle_copy_profile2.module" - }, - { - "project_id": 24420, - "project_name": "project/razoreye_biz", - "filename": "modules/contrib/field_group/includes/field_ui.inc" - }, - { - "project_id": 24420, - "project_name": "project/razoreye_biz", - "filename": "modules/contrib/field_group/src/Form/FieldGroupDeleteForm.php" - }, - { - "project_id": 24420, - "project_name": "project/razoreye_biz", - "filename": "modules/contrib/field_group/src/Plugin/field_group/FieldGroupFormatter/HtmlElement.php" - }, - { - "project_id": 25294, - "project_name": "project/pankm", - "filename": "modules/contrib/field_group/includes/field_ui.inc" - }, - { - "project_id": 25294, - "project_name": "project/pankm", - "filename": "modules/contrib/field_group/src/Form/FieldGroupDeleteForm.php" - }, - { - "project_id": 25294, - "project_name": "project/pankm", - "filename": "modules/contrib/field_group/src/Plugin/field_group/FieldGroupFormatter/HtmlElement.php" - }, - { - "project_id": 25326, - "project_name": "project/bif", - "filename": "src/Form/BlockInFormDeleteForm.php" - }, - { - "project_id": 26708, - "project_name": "project/simple_multistep", - "filename": "simple_multistep.module" - }, - { - "project_id": 27409, - "project_name": "project/esm", - "filename": "esm.module" - }, - { - "project_id": 47873, - "project_name": "project/field_group_label_classes", - "filename": "src/Plugin/field_group/FieldGroupFormatter/HtmlClassTitleElement.php" - }, - { - "project_id": 48123, - "project_name": "project/certificate", - "filename": "certificate.admin.inc" - }, - { - "project_id": 48161, - "project_name": "project/ULT", - "filename": "modules/ult_profiles/ult_profiles.install" - }, - { - "project_id": 49677, - "project_name": "project/icn", - "filename": "src/Form/IcnDefault.php" - }, - { - "project_id": 49956, - "project_name": "project/abtestui", - "filename": "src/Form/ABTestForm.php" - }, - { - "project_id": 53860, - "project_name": "project/bahai_incubator", - "filename": "modules/incubator/inc_base/inc_base.features.fieldgroup.inc" - }, - { - "project_id": 53860, - "project_name": "project/bahai_incubator", - "filename": "modules/incubator/inc_blog/inc_blog.features.fieldgroup.inc" - }, - { - "project_id": 53860, - "project_name": "project/bahai_incubator", - "filename": "modules/incubator/inc_calendar/inc_calendar.features.fieldgroup.inc" - }, - { - "project_id": 53860, - "project_name": "project/bahai_incubator", - "filename": "modules/incubator/inc_facilities/inc_facilities.features.fieldgroup.inc" - }, - { - "project_id": 53860, - "project_name": "project/bahai_incubator", - "filename": "modules/incubator/inc_news/inc_news.features.fieldgroup.inc" - }, - { - "project_id": 58220, - "project_name": "project/wim", - "filename": "modules/features/wim_addition_faq_product_fields/wim_addition_faq_product_fields.field_group.inc" - }, - { - "project_id": 59671, - "project_name": "project/field_group", - "filename": "includes/field_ui.inc" - }, - { - "project_id": 59671, - "project_name": "project/field_group", - "filename": "js/field_group.js" - }, - { - "project_id": 59671, - "project_name": "project/field_group", - "filename": "src/Form/FieldGroupDeleteForm.php" - }, - { - "project_id": 59671, - "project_name": "project/field_group", - "filename": "src/Plugin/field_group/FieldGroupFormatter/HtmlElement.php" - }, - { - "project_id": 59984, - "project_name": "project/ui_patterns_settings", - "filename": "src/Plugin/UiPatterns/SettingType/GroupType.php" - }, - { - "project_id": 60916, - "project_name": "project/jsonapi_example", - "filename": "src/Controller/JsonApiExampleController.php" - }, - { - "project_id": 61270, - "project_name": "project/inline_field_group", - "filename": "src/Plugin/field_group/FieldGroupFormatter/Inline.php" - }, - { - "project_id": 65525, - "project_name": "project/social_media_image_generator", - "filename": "src/Form/SocialImageLayoutForm.php" - }, - { - "project_id": 148466, - "project_name": "project/field_group_vertical_tabs", - "filename": "field_group_vertical_tabs.module" - }, - { - "project_id": 181203, - "project_name": "project/json_drop_api", - "filename": "modules/contrib/field_group/includes/field_ui.inc" - }, - { - "project_id": 181203, - "project_name": "project/json_drop_api", - "filename": "modules/contrib/field_group/js/field_group.js" - }, - { - "project_id": 181203, - "project_name": "project/json_drop_api", - "filename": "modules/contrib/field_group/src/Form/FieldGroupDeleteForm.php" - }, - { - "project_id": 181203, - "project_name": "project/json_drop_api", - "filename": "modules/contrib/field_group/src/FormatterHelper.php" - }, - { - "project_id": 181203, - "project_name": "project/json_drop_api", - "filename": "modules/contrib/field_group/src/Plugin/field_group/FieldGroupFormatter/HtmlElement.php" - } - ], - "ReplaceFileGetContentHeadersRector": [ - { - "project_id": 4408, - "project_name": "project/uc_fedex", - "filename": "uc_fedex.ship.inc" - }, - { - "project_id": 7433, - "project_name": "project/download_file", - "filename": "src/Controller/DownloadFileController.php" - }, - { - "project_id": 8197, - "project_name": "project/onepage", - "filename": "includes/file.inc" - }, - { - "project_id": 8197, - "project_name": "project/onepage", - "filename": "modules/file/file.module" - }, - { - "project_id": 9123, - "project_name": "project/1087726", - "filename": "includes/file.inc" - }, - { - "project_id": 9123, - "project_name": "project/1087726", - "filename": "modules/file/file.module" - }, - { - "project_id": 9745, - "project_name": "project/commerce_invoice", - "filename": "src/Controller/InvoiceController.php" - }, - { - "project_id": 10384, - "project_name": "project/commerce_purchase_order", - "filename": "commerce_purchase_order.module" - }, - { - "project_id": 10416, - "project_name": "project/archibald", - "filename": "modules/export/archibald_export.module" - }, - { - "project_id": 10715, - "project_name": "project/odir", - "filename": "odir.module" - }, - { - "project_id": 11613, - "project_name": "project/cforge", - "filename": "cforge.profile" - }, - { - "project_id": 11861, - "project_name": "project/erpal", - "filename": "modules/erpal/erpal_core/erpal_basic/erpal_basic_helper/modules/erpal_hacks_helper/erpal_hacks_helper.module" - }, - { - "project_id": 12118, - "project_name": "project/rebuild", - "filename": "tests/fixtures/drupal_sites/dev/includes/file.inc" - }, - { - "project_id": 12118, - "project_name": "project/rebuild", - "filename": "tests/fixtures/drupal_sites/dev/modules/file/file.module" - }, - { - "project_id": 12118, - "project_name": "project/rebuild", - "filename": "tests/fixtures/drupal_sites/prod/includes/file.inc" - }, - { - "project_id": 12118, - "project_name": "project/rebuild", - "filename": "tests/fixtures/drupal_sites/prod/modules/file/file.module" - }, - { - "project_id": 12442, - "project_name": "project/node_field", - "filename": "modules/node_field_file/node_field_file.module" - }, - { - "project_id": 12717, - "project_name": "project/1635422", - "filename": "hooks_list.php" - }, - { - "project_id": 13111, - "project_name": "project/ddcla", - "filename": "public/includes/file.inc" - }, - { - "project_id": 13111, - "project_name": "project/ddcla", - "filename": "public/modules/file/file.module" - }, - { - "project_id": 13125, - "project_name": "project/transcribe_distribution", - "filename": "modules/file/file.module" - }, - { - "project_id": 13323, - "project_name": "project/tmgmt_server", - "filename": "modules/tmgmt_server_mailer/tmgmt_server_mailer.module" - }, - { - "project_id": 14136, - "project_name": "project/sshid", - "filename": "sshid.admin.inc" - }, - { - "project_id": 14333, - "project_name": "project/wf", - "filename": "wf_job/includes/wf_job.pages.inc" - }, - { - "project_id": 14446, - "project_name": "project/tr_kurulum", - "filename": "includes/file.inc" - }, - { - "project_id": 14446, - "project_name": "project/tr_kurulum", - "filename": "modules/file/file.module" - }, - { - "project_id": 14506, - "project_name": "project/tb_blog_starter", - "filename": "includes/file.inc" - }, - { - "project_id": 14506, - "project_name": "project/tb_blog_starter", - "filename": "modules/file/file.module" - }, - { - "project_id": 14507, - "project_name": "project/tb_events_starter", - "filename": "modules/file/file.module" - }, - { - "project_id": 14509, - "project_name": "project/tb_hadelis_starter", - "filename": "includes/file.inc" - }, - { - "project_id": 14509, - "project_name": "project/tb_hadelis_starter", - "filename": "modules/file/file.module" - }, - { - "project_id": 14510, - "project_name": "project/tb_methys_starter", - "filename": "includes/file.inc" - }, - { - "project_id": 14510, - "project_name": "project/tb_methys_starter", - "filename": "modules/file/file.module" - }, - { - "project_id": 14511, - "project_name": "project/tb_mollise_starter", - "filename": "modules/file/file.module" - }, - { - "project_id": 14512, - "project_name": "project/tb_neris_starter", - "filename": "includes/file.inc" - }, - { - "project_id": 14512, - "project_name": "project/tb_neris_starter", - "filename": "modules/file/file.module" - }, - { - "project_id": 14513, - "project_name": "project/tb_palicico_starter", - "filename": "includes/file.inc" - }, - { - "project_id": 14513, - "project_name": "project/tb_palicico_starter", - "filename": "modules/file/file.module" - }, - { - "project_id": 14514, - "project_name": "project/tb_purity_starter", - "filename": "includes/file.inc" - }, - { - "project_id": 14514, - "project_name": "project/tb_purity_starter", - "filename": "modules/file/file.module" - }, - { - "project_id": 14515, - "project_name": "project/tb_rave_starter", - "filename": "includes/file.inc" - }, - { - "project_id": 14515, - "project_name": "project/tb_rave_starter", - "filename": "modules/file/file.module" - }, - { - "project_id": 14522, - "project_name": "project/tb_sirate_starter", - "filename": "includes/file.inc" - }, - { - "project_id": 14522, - "project_name": "project/tb_sirate_starter", - "filename": "modules/file/file.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/file/file.module" - }, - { - "project_id": 14728, - "project_name": "project/fontello", - "filename": "fontello.module" - }, - { - "project_id": 15045, - "project_name": "project/endicia", - "filename": "endicia.module" - }, - { - "project_id": 15203, - "project_name": "project/icomoon", - "filename": "icomoon.module" - }, - { - "project_id": 15222, - "project_name": "project/open_badging_installation_profile", - "filename": "includes/file.inc" - }, - { - "project_id": 15222, - "project_name": "project/open_badging_installation_profile", - "filename": "modules/file/file.module" - }, - { - "project_id": 15435, - "project_name": "project/drupdates", - "filename": "drupdates.module" - }, - { - "project_id": 15497, - "project_name": "project/bassets_sw", - "filename": "bassets_sw.module" - }, - { - "project_id": 15666, - "project_name": "project/pathed_files", - "filename": "pathed_files.module" - }, - { - "project_id": 16192, - "project_name": "project/mobilearkickstart", - "filename": "modules/file/file.module" - }, - { - "project_id": 16984, - "project_name": "project/spanish_distribution", - "filename": "includes/file.inc" - }, - { - "project_id": 16984, - "project_name": "project/spanish_distribution", - "filename": "modules/file/file.module" - }, - { - "project_id": 17013, - "project_name": "project/fuse", - "filename": "modules/file/file.module" - }, - { - "project_id": 17146, - "project_name": "project/flipping_book", - "filename": "flipping_book.module" - }, - { - "project_id": 18559, - "project_name": "project/govbr", - "filename": "modules/file/file.module" - }, - { - "project_id": 18815, - "project_name": "project/image_download_formatter", - "filename": "image_download_formatter.module" - }, - { - "project_id": 18897, - "project_name": "project/qurandistribution", - "filename": "includes/file.inc" - }, - { - "project_id": 18897, - "project_name": "project/qurandistribution", - "filename": "modules/file/file.module" - }, - { - "project_id": 20176, - "project_name": "project/private_image_cache", - "filename": "private_image_cache.module" - }, - { - "project_id": 20484, - "project_name": "project/mpub", - "filename": "modules/contrib/feeds/feeds.module" - }, - { - "project_id": 20979, - "project_name": "project/git_book", - "filename": "modules/git_book_markdown/git_book_markdown.module" - }, - { - "project_id": 20990, - "project_name": "project/development", - "filename": "modules/file/file.module" - }, - { - "project_id": 21069, - "project_name": "project/yamlform", - "filename": "src/Plugin/YamlFormElement/YamlFormManagedFileBase.php" - }, - { - "project_id": 22341, - "project_name": "project/pdftemplate", - "filename": "pdftemplate.rules.inc" - }, - { - "project_id": 23398, - "project_name": "project/reporting_cloud", - "filename": "reporting_cloud.module" - }, - { - "project_id": 23470, - "project_name": "project/gp_reviews", - "filename": "modules/file/file.module" - }, - { - "project_id": 23685, - "project_name": "project/rules_letter", - "filename": "rules_letter.module" - }, - { - "project_id": 24829, - "project_name": "project/node_revision_private_files_access_permission", - "filename": "node_revision_private_files_view.module" - }, - { - "project_id": 25896, - "project_name": "project/byu_installation_profile", - "filename": "modules/file/file.module" - }, - { - "project_id": 26057, - "project_name": "project/temporary_download", - "filename": "temporary_download.module" - }, - { - "project_id": 27553, - "project_name": "project/dam", - "filename": "dam.module" - }, - { - "project_id": 49900, - "project_name": "project/onetime_download", - "filename": "onetime_download.module" - }, - { - "project_id": 52207, - "project_name": "project/feeds", - "filename": "feeds.module" - }, - { - "project_id": 52555, - "project_name": "project/field_formatter_key_label", - "filename": "field_formatter_key_label.module" - }, - { - "project_id": 54190, - "project_name": "project/file_shelf", - "filename": "file_shelf.module" - }, - { - "project_id": 56855, - "project_name": "project/tmgmt", - "filename": "translators/tmgmt_file/tmgmt_file.module" - }, - { - "project_id": 57266, - "project_name": "project/protected_file", - "filename": "protected_file.module" - }, - { - "project_id": 57266, - "project_name": "project/protected_file", - "filename": "src/Access/ProtectedFileAccessChecker.php" - }, - { - "project_id": 59401, - "project_name": "project/file_entity", - "filename": "file_entity.module" - }, - { - "project_id": 59676, - "project_name": "project/skilling", - "filename": "src/Access/access-control.inc" - }, - { - "project_id": 60227, - "project_name": "project/govimentum", - "filename": "includes/file.inc" - }, - { - "project_id": 60227, - "project_name": "project/govimentum", - "filename": "modules/file/file.module" - }, - { - "project_id": 60227, - "project_name": "project/govimentum", - "filename": "modules/file/tests/file_module_test.module" - }, - { - "project_id": 62378, - "project_name": "project/drupalru_d7", - "filename": "modules/file/file.module" - }, - { - "project_id": 62378, - "project_name": "project/drupalru_d7", - "filename": "modules/file/tests/file_module_test.module" - }, - { - "project_id": 63624, - "project_name": "project/ubershopwish", - "filename": "modules/file/file.module" - }, - { - "project_id": 63624, - "project_name": "project/ubershopwish", - "filename": "modules/file/tests/file_module_test.module" - }, - { - "project_id": 77509, - "project_name": "project/testproject4234", - "filename": "modules/file/file.module" - }, - { - "project_id": 77509, - "project_name": "project/testproject4234", - "filename": "modules/file/tests/file_module_test.module" - }, - { - "project_id": 80778, - "project_name": "project/lingo24", - "filename": "lingo24.module" - }, - { - "project_id": 82260, - "project_name": "project/commerce_invoice_ubl", - "filename": "src/Controller/InvoiceController.php" - }, - { - "project_id": 87283, - "project_name": "project/dxpr_builder", - "filename": "dxpr_builder.module" - }, - { - "project_id": 101942, - "project_name": "project/unpublished_file", - "filename": "unpublished_file.module" - }, - { - "project_id": 134243, - "project_name": "project/git_wiki_help", - "filename": "git_wiki_help.module" - }, - { - "project_id": 158230, - "project_name": "project/media_icon_deliver", - "filename": "src/Controller/IconController.php" - }, - { - "project_id": 180286, - "project_name": "project/file_visibility", - "filename": "src/Hook/FileAccessHooks.php" - } - ], - "ReplaceNodeAccessViewAllNodesRector": [ - { - "project_id": 422, - "project_name": "project/evaluation", - "filename": "patched_files/node.module" - }, - { - "project_id": 4606, - "project_name": "project/module_grants", - "filename": "module_grants.module" - }, - { - "project_id": 8197, - "project_name": "project/onepage", - "filename": "modules/node/node.api.php" - }, - { - "project_id": 8197, - "project_name": "project/onepage", - "filename": "modules/node/node.test" - }, - { - "project_id": 8197, - "project_name": "project/onepage", - "filename": "modules/simpletest/tests/entity_query_access_test.module" - }, - { - "project_id": 9123, - "project_name": "project/1087726", - "filename": "modules/node/node.api.php" - }, - { - "project_id": 9123, - "project_name": "project/1087726", - "filename": "modules/node/node.test" - }, - { - "project_id": 9847, - "project_name": "project/b2b_store_solution", - "filename": "b2b_construction/modules/contrib/entity/modules/callbacks.inc" - }, - { - "project_id": 10339, - "project_name": "project/views_query_na_subquery", - "filename": "views_plugin_query_na_subquery.inc" - }, - { - "project_id": 12118, - "project_name": "project/rebuild", - "filename": "tests/fixtures/drupal_sites/dev/modules/node/node.api.php" - }, - { - "project_id": 12118, - "project_name": "project/rebuild", - "filename": "tests/fixtures/drupal_sites/dev/modules/node/node.test" - }, - { - "project_id": 12118, - "project_name": "project/rebuild", - "filename": "tests/fixtures/drupal_sites/dev/modules/simpletest/tests/entity_query_access_test.module" - }, - { - "project_id": 12118, - "project_name": "project/rebuild", - "filename": "tests/fixtures/drupal_sites/prod/modules/node/node.api.php" - }, - { - "project_id": 12118, - "project_name": "project/rebuild", - "filename": "tests/fixtures/drupal_sites/prod/modules/node/node.test" - }, - { - "project_id": 12118, - "project_name": "project/rebuild", - "filename": "tests/fixtures/drupal_sites/prod/modules/simpletest/tests/entity_query_access_test.module" - }, - { - "project_id": 12717, - "project_name": "project/1635422", - "filename": "hooks_list.php" - }, - { - "project_id": 13111, - "project_name": "project/ddcla", - "filename": "public/modules/node/node.api.php" - }, - { - "project_id": 13111, - "project_name": "project/ddcla", - "filename": "public/modules/node/node.test" - }, - { - "project_id": 13125, - "project_name": "project/transcribe_distribution", - "filename": "modules/node/node.api.php" - }, - { - "project_id": 13125, - "project_name": "project/transcribe_distribution", - "filename": "modules/node/node.test" - }, - { - "project_id": 13125, - "project_name": "project/transcribe_distribution", - "filename": "modules/simpletest/tests/entity_query_access_test.module" - }, - { - "project_id": 14446, - "project_name": "project/tr_kurulum", - "filename": "modules/node/node.api.php" - }, - { - "project_id": 14446, - "project_name": "project/tr_kurulum", - "filename": "modules/node/node.test" - }, - { - "project_id": 14446, - "project_name": "project/tr_kurulum", - "filename": "modules/simpletest/tests/entity_query_access_test.module" - }, - { - "project_id": 14506, - "project_name": "project/tb_blog_starter", - "filename": "modules/node/node.api.php" - }, - { - "project_id": 14506, - "project_name": "project/tb_blog_starter", - "filename": "modules/node/node.test" - }, - { - "project_id": 14506, - "project_name": "project/tb_blog_starter", - "filename": "modules/simpletest/tests/entity_query_access_test.module" - }, - { - "project_id": 14507, - "project_name": "project/tb_events_starter", - "filename": "modules/node/node.api.php" - }, - { - "project_id": 14507, - "project_name": "project/tb_events_starter", - "filename": "modules/node/node.test" - }, - { - "project_id": 14507, - "project_name": "project/tb_events_starter", - "filename": "modules/simpletest/tests/entity_query_access_test.module" - }, - { - "project_id": 14509, - "project_name": "project/tb_hadelis_starter", - "filename": "modules/node/node.api.php" - }, - { - "project_id": 14509, - "project_name": "project/tb_hadelis_starter", - "filename": "modules/node/node.test" - }, - { - "project_id": 14509, - "project_name": "project/tb_hadelis_starter", - "filename": "modules/simpletest/tests/entity_query_access_test.module" - }, - { - "project_id": 14510, - "project_name": "project/tb_methys_starter", - "filename": "modules/node/node.api.php" - }, - { - "project_id": 14510, - "project_name": "project/tb_methys_starter", - "filename": "modules/node/node.test" - }, - { - "project_id": 14510, - "project_name": "project/tb_methys_starter", - "filename": "modules/simpletest/tests/entity_query_access_test.module" - }, - { - "project_id": 14511, - "project_name": "project/tb_mollise_starter", - "filename": "modules/node/node.api.php" - }, - { - "project_id": 14511, - "project_name": "project/tb_mollise_starter", - "filename": "modules/node/node.test" - }, - { - "project_id": 14511, - "project_name": "project/tb_mollise_starter", - "filename": "modules/simpletest/tests/entity_query_access_test.module" - }, - { - "project_id": 14512, - "project_name": "project/tb_neris_starter", - "filename": "modules/node/node.api.php" - }, - { - "project_id": 14512, - "project_name": "project/tb_neris_starter", - "filename": "modules/node/node.test" - }, - { - "project_id": 14512, - "project_name": "project/tb_neris_starter", - "filename": "modules/simpletest/tests/entity_query_access_test.module" - }, - { - "project_id": 14513, - "project_name": "project/tb_palicico_starter", - "filename": "modules/node/node.api.php" - }, - { - "project_id": 14513, - "project_name": "project/tb_palicico_starter", - "filename": "modules/node/node.test" - }, - { - "project_id": 14513, - "project_name": "project/tb_palicico_starter", - "filename": "modules/simpletest/tests/entity_query_access_test.module" - }, - { - "project_id": 14514, - "project_name": "project/tb_purity_starter", - "filename": "modules/node/node.api.php" - }, - { - "project_id": 14514, - "project_name": "project/tb_purity_starter", - "filename": "modules/node/node.test" - }, - { - "project_id": 14514, - "project_name": "project/tb_purity_starter", - "filename": "modules/simpletest/tests/entity_query_access_test.module" - }, - { - "project_id": 14515, - "project_name": "project/tb_rave_starter", - "filename": "modules/node/node.api.php" - }, - { - "project_id": 14515, - "project_name": "project/tb_rave_starter", - "filename": "modules/node/node.test" - }, - { - "project_id": 14515, - "project_name": "project/tb_rave_starter", - "filename": "modules/simpletest/tests/entity_query_access_test.module" - }, - { - "project_id": 14522, - "project_name": "project/tb_sirate_starter", - "filename": "modules/node/node.api.php" - }, - { - "project_id": 14522, - "project_name": "project/tb_sirate_starter", - "filename": "modules/node/node.test" - }, - { - "project_id": 14522, - "project_name": "project/tb_sirate_starter", - "filename": "modules/simpletest/tests/entity_query_access_test.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/node/node.api.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/node/node.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/entity_query_access_test.module" - }, - { - "project_id": 15222, - "project_name": "project/open_badging_installation_profile", - "filename": "modules/node/node.api.php" - }, - { - "project_id": 15222, - "project_name": "project/open_badging_installation_profile", - "filename": "modules/node/node.test" - }, - { - "project_id": 15222, - "project_name": "project/open_badging_installation_profile", - "filename": "modules/simpletest/tests/entity_query_access_test.module" - }, - { - "project_id": 16192, - "project_name": "project/mobilearkickstart", - "filename": "modules/node/node.api.php" - }, - { - "project_id": 16192, - "project_name": "project/mobilearkickstart", - "filename": "modules/node/node.test" - }, - { - "project_id": 16192, - "project_name": "project/mobilearkickstart", - "filename": "modules/simpletest/tests/entity_query_access_test.module" - }, - { - "project_id": 16984, - "project_name": "project/spanish_distribution", - "filename": "modules/node/node.api.php" - }, - { - "project_id": 16984, - "project_name": "project/spanish_distribution", - "filename": "modules/node/node.test" - }, - { - "project_id": 16984, - "project_name": "project/spanish_distribution", - "filename": "modules/simpletest/tests/entity_query_access_test.module" - }, - { - "project_id": 17013, - "project_name": "project/fuse", - "filename": "modules/node/node.api.php" - }, - { - "project_id": 17013, - "project_name": "project/fuse", - "filename": "modules/node/node.test" - }, - { - "project_id": 17013, - "project_name": "project/fuse", - "filename": "modules/simpletest/tests/entity_query_access_test.module" - }, - { - "project_id": 18559, - "project_name": "project/govbr", - "filename": "modules/node/node.test" - }, - { - "project_id": 18559, - "project_name": "project/govbr", - "filename": "modules/simpletest/tests/entity_query_access_test.module" - }, - { - "project_id": 18897, - "project_name": "project/qurandistribution", - "filename": "modules/node/node.api.php" - }, - { - "project_id": 18897, - "project_name": "project/qurandistribution", - "filename": "modules/node/node.test" - }, - { - "project_id": 18897, - "project_name": "project/qurandistribution", - "filename": "modules/simpletest/tests/entity_query_access_test.module" - }, - { - "project_id": 19970, - "project_name": "project/entity_gallery", - "filename": "entity_gallery.api.php" - }, - { - "project_id": 20484, - "project_name": "project/mpub", - "filename": "modules/contrib/ctools/includes/entity-access.inc" - }, - { - "project_id": 20484, - "project_name": "project/mpub", - "filename": "modules/contrib/entity/modules/callbacks.inc" - }, - { - "project_id": 20990, - "project_name": "project/development", - "filename": "modules/node/node.api.php" - }, - { - "project_id": 20990, - "project_name": "project/development", - "filename": "modules/node/node.test" - }, - { - "project_id": 20990, - "project_name": "project/development", - "filename": "modules/simpletest/tests/entity_query_access_test.module" - }, - { - "project_id": 23470, - "project_name": "project/gp_reviews", - "filename": "modules/node/node.api.php" - }, - { - "project_id": 23470, - "project_name": "project/gp_reviews", - "filename": "modules/node/node.test" - }, - { - "project_id": 23470, - "project_name": "project/gp_reviews", - "filename": "modules/simpletest/tests/entity_query_access_test.module" - }, - { - "project_id": 25896, - "project_name": "project/byu_installation_profile", - "filename": "modules/node/node.test" - }, - { - "project_id": 25896, - "project_name": "project/byu_installation_profile", - "filename": "modules/simpletest/tests/entity_query_access_test.module" - }, - { - "project_id": 60215, - "project_name": "project/aeg", - "filename": "modules/ctools/includes/entity-access.inc" - }, - { - "project_id": 60215, - "project_name": "project/aeg", - "filename": "modules/entity/modules/callbacks.inc" - }, - { - "project_id": 60227, - "project_name": "project/govimentum", - "filename": "modules/node/node.api.php" - }, - { - "project_id": 60227, - "project_name": "project/govimentum", - "filename": "modules/node/node.test" - }, - { - "project_id": 60227, - "project_name": "project/govimentum", - "filename": "modules/simpletest/tests/entity_query_access_test.module" - }, - { - "project_id": 62378, - "project_name": "project/drupalru_d7", - "filename": "modules/node/node.api.php" - }, - { - "project_id": 62378, - "project_name": "project/drupalru_d7", - "filename": "modules/node/node.test" - }, - { - "project_id": 62378, - "project_name": "project/drupalru_d7", - "filename": "modules/simpletest/tests/entity_query_access_test.module" - }, - { - "project_id": 63624, - "project_name": "project/ubershopwish", - "filename": "modules/node/node.api.php" - }, - { - "project_id": 63624, - "project_name": "project/ubershopwish", - "filename": "modules/node/node.test" - }, - { - "project_id": 63624, - "project_name": "project/ubershopwish", - "filename": "modules/simpletest/tests/entity_query_access_test.module" - }, - { - "project_id": 77509, - "project_name": "project/testproject4234", - "filename": "modules/node/node.api.php" - }, - { - "project_id": 77509, - "project_name": "project/testproject4234", - "filename": "modules/node/node.test" - }, - { - "project_id": 77509, - "project_name": "project/testproject4234", - "filename": "modules/simpletest/tests/entity_query_access_test.module" - }, - { - "project_id": 154063, - "project_name": "project/view_usernames_node_author", - "filename": "tests/src/Kernel/NodeAuthorUsernameAccessDeciderTest.php" - } - ], - "ReplaceNodeAddBodyFieldRector": [ - { - "project_id": 327, - "project_name": "project/snippets", - "filename": "snippets.install" - }, - { - "project_id": 575, - "project_name": "project/family", - "filename": "family.install" - }, - { - "project_id": 1151, - "project_name": "project/drush", - "filename": "tests/resources/create_node_types.php" - }, - { - "project_id": 4795, - "project_name": "project/administration_notification", - "filename": "admin_notification.install" - }, - { - "project_id": 4833, - "project_name": "project/search_by_page", - "filename": "tests/sbp_test.install" - }, - { - "project_id": 5625, - "project_name": "project/guidance", - "filename": "guidance.install" - }, - { - "project_id": 8197, - "project_name": "project/onepage", - "filename": "modules/blog/blog.install" - }, - { - "project_id": 8197, - "project_name": "project/onepage", - "filename": "modules/book/book.install" - }, - { - "project_id": 8285, - "project_name": "project/recruit", - "filename": "recruit.install" - }, - { - "project_id": 8947, - "project_name": "project/wysiwyg_fields", - "filename": "tests/wysiwyg_fields_test.install" - }, - { - "project_id": 9099, - "project_name": "project/vinculum", - "filename": "modules/vinculum_comment/vinculum_comment.test" - }, - { - "project_id": 9123, - "project_name": "project/1087726", - "filename": "modules/blog/blog.install" - }, - { - "project_id": 9123, - "project_name": "project/1087726", - "filename": "modules/book/book.install" - }, - { - "project_id": 11943, - "project_name": "project/rocketship", - "filename": "rocketship.install" - }, - { - "project_id": 12118, - "project_name": "project/rebuild", - "filename": "tests/fixtures/drupal_sites/dev/modules/blog/blog.install" - }, - { - "project_id": 12118, - "project_name": "project/rebuild", - "filename": "tests/fixtures/drupal_sites/dev/modules/book/book.install" - }, - { - "project_id": 12118, - "project_name": "project/rebuild", - "filename": "tests/fixtures/drupal_sites/prod/modules/blog/blog.install" - }, - { - "project_id": 12118, - "project_name": "project/rebuild", - "filename": "tests/fixtures/drupal_sites/prod/modules/book/book.install" - }, - { - "project_id": 13039, - "project_name": "project/opigno_glossary", - "filename": "opigno_glossary.install" - }, - { - "project_id": 13111, - "project_name": "project/ddcla", - "filename": "public/modules/blog/blog.install" - }, - { - "project_id": 13111, - "project_name": "project/ddcla", - "filename": "public/modules/book/book.install" - }, - { - "project_id": 13125, - "project_name": "project/transcribe_distribution", - "filename": "modules/blog/blog.install" - }, - { - "project_id": 13366, - "project_name": "project/prh_search", - "filename": "prh_search.install" - }, - { - "project_id": 14446, - "project_name": "project/tr_kurulum", - "filename": "modules/blog/blog.install" - }, - { - "project_id": 14446, - "project_name": "project/tr_kurulum", - "filename": "modules/book/book.install" - }, - { - "project_id": 14506, - "project_name": "project/tb_blog_starter", - "filename": "modules/blog/blog.install" - }, - { - "project_id": 14507, - "project_name": "project/tb_events_starter", - "filename": "modules/blog/blog.install" - }, - { - "project_id": 14507, - "project_name": "project/tb_events_starter", - "filename": "modules/book/book.install" - }, - { - "project_id": 14509, - "project_name": "project/tb_hadelis_starter", - "filename": "modules/blog/blog.install" - }, - { - "project_id": 14509, - "project_name": "project/tb_hadelis_starter", - "filename": "modules/book/book.install" - }, - { - "project_id": 14510, - "project_name": "project/tb_methys_starter", - "filename": "modules/blog/blog.install" - }, - { - "project_id": 14511, - "project_name": "project/tb_mollise_starter", - "filename": "modules/blog/blog.install" - }, - { - "project_id": 14511, - "project_name": "project/tb_mollise_starter", - "filename": "modules/book/book.install" - }, - { - "project_id": 14512, - "project_name": "project/tb_neris_starter", - "filename": "modules/blog/blog.install" - }, - { - "project_id": 14512, - "project_name": "project/tb_neris_starter", - "filename": "modules/book/book.install" - }, - { - "project_id": 14513, - "project_name": "project/tb_palicico_starter", - "filename": "modules/blog/blog.install" - }, - { - "project_id": 14514, - "project_name": "project/tb_purity_starter", - "filename": "modules/blog/blog.install" - }, - { - "project_id": 14514, - "project_name": "project/tb_purity_starter", - "filename": "modules/book/book.install" - }, - { - "project_id": 14515, - "project_name": "project/tb_rave_starter", - "filename": "modules/blog/blog.install" - }, - { - "project_id": 14515, - "project_name": "project/tb_rave_starter", - "filename": "modules/book/book.install" - }, - { - "project_id": 14522, - "project_name": "project/tb_sirate_starter", - "filename": "modules/blog/blog.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/blog/blog.install" - }, - { - "project_id": 14614, - "project_name": "project/latest", - "filename": "latest.install.fields-instances" - }, - { - "project_id": 15222, - "project_name": "project/open_badging_installation_profile", - "filename": "modules/blog/blog.install" - }, - { - "project_id": 15222, - "project_name": "project/open_badging_installation_profile", - "filename": "modules/book/book.install" - }, - { - "project_id": 15654, - "project_name": "project/rio", - "filename": "rio.install" - }, - { - "project_id": 15665, - "project_name": "project/drupal_wall", - "filename": "drupal_wall.install" - }, - { - "project_id": 16192, - "project_name": "project/mobilearkickstart", - "filename": "modules/blog/blog.install" - }, - { - "project_id": 16918, - "project_name": "project/civicrm_event_receipts", - "filename": "civicrm_event_receipts.install" - }, - { - "project_id": 16984, - "project_name": "project/spanish_distribution", - "filename": "modules/blog/blog.install" - }, - { - "project_id": 16984, - "project_name": "project/spanish_distribution", - "filename": "modules/book/book.install" - }, - { - "project_id": 17013, - "project_name": "project/fuse", - "filename": "modules/blog/blog.install" - }, - { - "project_id": 17283, - "project_name": "project/social_content", - "filename": "modules/facebook/social_content_facebook.install" - }, - { - "project_id": 17283, - "project_name": "project/social_content", - "filename": "modules/flickr/social_content_flickr.install" - }, - { - "project_id": 17283, - "project_name": "project/social_content", - "filename": "modules/instagram/social_content_instagram.install" - }, - { - "project_id": 17283, - "project_name": "project/social_content", - "filename": "modules/linkedin/social_content_linkedin.install" - }, - { - "project_id": 17283, - "project_name": "project/social_content", - "filename": "modules/picasa/social_content_picasa.install" - }, - { - "project_id": 17283, - "project_name": "project/social_content", - "filename": "modules/pinterest/social_content_pinterest.install" - }, - { - "project_id": 17283, - "project_name": "project/social_content", - "filename": "modules/soundcloud/social_content_soundcloud.install" - }, - { - "project_id": 17283, - "project_name": "project/social_content", - "filename": "modules/vk/social_content_vk.install" - }, - { - "project_id": 17283, - "project_name": "project/social_content", - "filename": "modules/youtube/social_content_youtube.install" - }, - { - "project_id": 18181, - "project_name": "project/og_groupcontent", - "filename": "og_groupcontent.install" - }, - { - "project_id": 18297, - "project_name": "project/administrative_help", - "filename": "administrative_help.install" - }, - { - "project_id": 18559, - "project_name": "project/govbr", - "filename": "modules/blog/blog.install" - }, - { - "project_id": 18897, - "project_name": "project/qurandistribution", - "filename": "modules/blog/blog.install" - }, - { - "project_id": 19654, - "project_name": "project/commune", - "filename": "commune.install" - }, - { - "project_id": 20879, - "project_name": "project/commerce_behat", - "filename": "commerce_behat.install" - }, - { - "project_id": 20971, - "project_name": "project/experd", - "filename": "experd_reports/experd_reports.install" - }, - { - "project_id": 20990, - "project_name": "project/development", - "filename": "modules/blog/blog.install" - }, - { - "project_id": 20990, - "project_name": "project/development", - "filename": "modules/book/book.install" - }, - { - "project_id": 21675, - "project_name": "project/display_machine_name", - "filename": "tests/src/Kernel/DisplayMachineNameTest.php" - }, - { - "project_id": 22613, - "project_name": "project/smartparticipation", - "filename": "modules/smartparticipation/smartparticipation_core/node_types/smartparticipation_core_research.inc" - }, - { - "project_id": 23470, - "project_name": "project/gp_reviews", - "filename": "modules/blog/blog.install" - }, - { - "project_id": 24420, - "project_name": "project/razoreye_biz", - "filename": "modules/contrib/ctools/tests/src/Kernel/RelationshipsTestBase.php" - }, - { - "project_id": 25294, - "project_name": "project/pankm", - "filename": "modules/contrib/ctools/tests/src/Kernel/RelationshipsTestBase.php" - }, - { - "project_id": 25894, - "project_name": "project/external_page_redirect", - "filename": "external_page_redirect.install" - }, - { - "project_id": 25896, - "project_name": "project/byu_installation_profile", - "filename": "modules/blog/blog.install" - }, - { - "project_id": 25927, - "project_name": "project/automatic_field_saver", - "filename": "tests/src/Kernel/AutomaticFieldSaverTest.php" - }, - { - "project_id": 48060, - "project_name": "project/smartling", - "filename": "submodules/smartling_quiz_multichoice/tests/smartling_quiz_multichoice.test" - }, - { - "project_id": 52307, - "project_name": "project/cultura", - "filename": "includes/content_types.inc" - }, - { - "project_id": 55171, - "project_name": "project/votingapi", - "filename": "tests/src/Functional/VoteCreationTest.php" - }, - { - "project_id": 56187, - "project_name": "project/closedquestion_scoreboard", - "filename": "closedquestion_scoreboard.install" - }, - { - "project_id": 57564, - "project_name": "project/tome", - "filename": "modules/tome_sync/tests/src/Kernel/FieldDeletionTest.php" - }, - { - "project_id": 59514, - "project_name": "project/ctools", - "filename": "tests/src/Kernel/RelationshipsTestBase.php" - }, - { - "project_id": 59603, - "project_name": "project/lingotek", - "filename": "tests/src/Functional/LingotekFieldBodyNotificationCallbackTest.php" - }, - { - "project_id": 60227, - "project_name": "project/govimentum", - "filename": "modules/blog/blog.install" - }, - { - "project_id": 60227, - "project_name": "project/govimentum", - "filename": "modules/book/book.install" - }, - { - "project_id": 60837, - "project_name": "project/virtualcare", - "filename": "modules/contrib/ctools/tests/src/Kernel/RelationshipsTestBase.php" - }, - { - "project_id": 60863, - "project_name": "project/druvel", - "filename": "druvel.install" - }, - { - "project_id": 62378, - "project_name": "project/drupalru_d7", - "filename": "modules/blog/blog.install" - }, - { - "project_id": 63624, - "project_name": "project/ubershopwish", - "filename": "modules/blog/blog.install" - }, - { - "project_id": 63624, - "project_name": "project/ubershopwish", - "filename": "modules/book/book.install" - }, - { - "project_id": 73338, - "project_name": "project/feedstextareafetcher", - "filename": "tests/src/Functional/Feeds/Fetcher/Form/TextareaFetcherFeedFormTest.php" - }, - { - "project_id": 77509, - "project_name": "project/testproject4234", - "filename": "modules/blog/blog.install" - }, - { - "project_id": 77509, - "project_name": "project/testproject4234", - "filename": "modules/book/book.install" - }, - { - "project_id": 86399, - "project_name": "project/sva", - "filename": "tests/src/FunctionalJavascript/SimpleViewsAccordionTest.php" - }, - { - "project_id": 133730, - "project_name": "project/rdf_sync", - "filename": "tests/src/Functional/RdfFieldConfigFormTest.php" - }, - { - "project_id": 163174, - "project_name": "project/ai_eca", - "filename": "modules/agents/tests/src/Kernel/AiEcaAgentsKernelTestBase.php" - }, - { - "project_id": 181203, - "project_name": "project/json_drop_api", - "filename": "modules/contrib/ctools/tests/src/Kernel/RelationshipsTestBase.php" - }, - { - "project_id": 210430, - "project_name": "project/drupal_cli", - "filename": "tests/integrations/drupal/fixtures/setup-content-type.php" - } - ], - "ReplaceNodeModuleProceduralFunctionsRector": [ - { - "project_id": 337, - "project_name": "project/indexpage", - "filename": "indexpage.install" - }, - { - "project_id": 441, - "project_name": "project/question", - "filename": "question.module" - }, - { - "project_id": 945, - "project_name": "project/node_clone", - "filename": "clone.install" - }, - { - "project_id": 1337, - "project_name": "project/twitter", - "filename": "twitter_post/twitter_post.pages.inc" - }, - { - "project_id": 1496, - "project_name": "project/util", - "filename": "contribs/comment_box/comment_box.install" - }, - { - "project_id": 1496, - "project_name": "project/util", - "filename": "contribs/edit_link/edit_link.module" - }, - { - "project_id": 1496, - "project_name": "project/util", - "filename": "contribs/top_buttons/top_buttons.install" - }, - { - "project_id": 2335, - "project_name": "project/mmedia", - "filename": "modules/mapi_admin.inc" - }, - { - "project_id": 2775, - "project_name": "project/subdomain", - "filename": "includes/subdomain_mode_contenttype.inc" - }, - { - "project_id": 3174, - "project_name": "project/autotag", - "filename": "autotag.settings.inc" - }, - { - "project_id": 3330, - "project_name": "project/fast_gallery", - "filename": "storageengine/node.config.inc" - }, - { - "project_id": 3591, - "project_name": "project/nodetypeviews", - "filename": "nodetypeviews.admin.inc" - }, - { - "project_id": 4031, - "project_name": "project/admin_notify", - "filename": "admin_notify.admin.inc" - }, - { - "project_id": 4196, - "project_name": "project/fbconnect", - "filename": "fbconnect_stream_publish/fbconnect_stream_publish.install" - }, - { - "project_id": 4206, - "project_name": "project/addanother", - "filename": "addanother.module" - }, - { - "project_id": 4485, - "project_name": "project/googlenews", - "filename": "tests/GoogleNewsBasicsTestCase.test" - }, - { - "project_id": 4671, - "project_name": "project/collection", - "filename": "src/CollectionItemListBuilder.php" - }, - { - "project_id": 4671, - "project_name": "project/collection", - "filename": "src/Plugin/views/field/CollectionItemCollectedItemEntityTypeLabel.php" - }, - { - "project_id": 5765, - "project_name": "project/simplenews_content_selection", - "filename": "scs.admin.inc" - }, - { - "project_id": 6019, - "project_name": "project/languageassign", - "filename": "languageassign.module" - }, - { - "project_id": 6676, - "project_name": "project/custom_search", - "filename": "custom_search.install" - }, - { - "project_id": 6719, - "project_name": "project/context_admin", - "filename": "contrib/context_admin_vbo/includes/context_admin_vbo.views_default.inc" - }, - { - "project_id": 7073, - "project_name": "project/revision_all", - "filename": "revision_all.module" - }, - { - "project_id": 7310, - "project_name": "project/views_content_cache", - "filename": "plugins/views_content_cache/node.inc" - }, - { - "project_id": 7402, - "project_name": "project/nopremium", - "filename": "nopremium.admin.inc" - }, - { - "project_id": 7402, - "project_name": "project/nopremium", - "filename": "nopremium.module" - }, - { - "project_id": 7559, - "project_name": "project/openscholar_vsite", - "filename": "vsite_content/vsite_content.features.views.inc" - }, - { - "project_id": 8197, - "project_name": "project/onepage", - "filename": "modules/node/node.admin.inc" - }, - { - "project_id": 8197, - "project_name": "project/onepage", - "filename": "modules/node/node.api.php" - }, - { - "project_id": 8197, - "project_name": "project/onepage", - "filename": "modules/user/user.api.php" - }, - { - "project_id": 8368, - "project_name": "project/references", - "filename": "node_reference/node_reference.test" - }, - { - "project_id": 8453, - "project_name": "project/max_age", - "filename": "max_age.install" - }, - { - "project_id": 8458, - "project_name": "project/node_gallery_bulk_operations", - "filename": "node_gallery_bulk_operations.views_default.inc" - }, - { - "project_id": 8520, - "project_name": "project/node_gallery_taxonomy", - "filename": "node_gallery_taxonomy.module" - }, - { - "project_id": 8864, - "project_name": "project/merci_signup", - "filename": "merci_signup.views_default.inc" - }, - { - "project_id": 8889, - "project_name": "project/merci_barcode_labels", - "filename": "merci_barcode_labels.views_default.inc" - }, - { - "project_id": 9123, - "project_name": "project/1087726", - "filename": "modules/node/node.admin.inc" - }, - { - "project_id": 9123, - "project_name": "project/1087726", - "filename": "modules/node/node.api.php" - }, - { - "project_id": 9123, - "project_name": "project/1087726", - "filename": "modules/user/user.api.php" - }, - { - "project_id": 9665, - "project_name": "project/sharebar", - "filename": "sharebar.install" - }, - { - "project_id": 9847, - "project_name": "project/b2b_store_solution", - "filename": "b2b_construction/modules/contrib/admin_menu/admin_views/views_default/admin_content_node.inc" - }, - { - "project_id": 9970, - "project_name": "project/colors", - "filename": "src/Plugin/colors/type/NodeScheme.php" - }, - { - "project_id": 9981, - "project_name": "project/field_weight", - "filename": "field_weight.admin.inc" - }, - { - "project_id": 10049, - "project_name": "project/meerkat", - "filename": "modules/meerkatnode/meerkatnode.module" - }, - { - "project_id": 10250, - "project_name": "project/views_node_access", - "filename": "views_node_access_plugin_access_node_type.inc" - }, - { - "project_id": 10250, - "project_name": "project/views_node_access", - "filename": "views_node_access_plugin_access_node_type_current_user.inc" - }, - { - "project_id": 10250, - "project_name": "project/views_node_access", - "filename": "views_node_access_plugin_access_node_type_perm.inc" - }, - { - "project_id": 10250, - "project_name": "project/views_node_access", - "filename": "views_node_access_plugin_access_node_type_role.inc" - }, - { - "project_id": 10377, - "project_name": "project/nodeaccesskeys", - "filename": "views_plugin_access_nodeaccesskeys.inc" - }, - { - "project_id": 10715, - "project_name": "project/odir", - "filename": "odir.admin.inc" - }, - { - "project_id": 10942, - "project_name": "project/pager_for_content_type", - "filename": "pager_for_content_type.module" - }, - { - "project_id": 11529, - "project_name": "project/drupalgap", - "filename": "modules/drupalgap_og/drupalgap_og.module" - }, - { - "project_id": 11653, - "project_name": "project/elms_features", - "filename": "elms_schedule/elms_schedule.views_default.inc" - }, - { - "project_id": 12118, - "project_name": "project/rebuild", - "filename": "tests/fixtures/drupal_sites/dev/modules/node/node.admin.inc" - }, - { - "project_id": 12118, - "project_name": "project/rebuild", - "filename": "tests/fixtures/drupal_sites/dev/modules/node/node.api.php" - }, - { - "project_id": 12118, - "project_name": "project/rebuild", - "filename": "tests/fixtures/drupal_sites/dev/modules/user/user.api.php" - }, - { - "project_id": 12118, - "project_name": "project/rebuild", - "filename": "tests/fixtures/drupal_sites/prod/modules/node/node.admin.inc" - }, - { - "project_id": 12118, - "project_name": "project/rebuild", - "filename": "tests/fixtures/drupal_sites/prod/modules/node/node.api.php" - }, - { - "project_id": 12118, - "project_name": "project/rebuild", - "filename": "tests/fixtures/drupal_sites/prod/modules/user/user.api.php" - }, - { - "project_id": 12192, - "project_name": "project/comment_easy_reply", - "filename": "comment_easy_reply.install" - }, - { - "project_id": 12192, - "project_name": "project/comment_easy_reply", - "filename": "modules/beautytips/comment_easy_reply_beautytips.install" - }, - { - "project_id": 12192, - "project_name": "project/comment_easy_reply", - "filename": "modules/node/comment_easy_reply_node.install" - }, - { - "project_id": 12192, - "project_name": "project/comment_easy_reply", - "filename": "modules/qtip/comment_easy_reply_qtip.install" - }, - { - "project_id": 12848, - "project_name": "project/html_title", - "filename": "html_title.module" - }, - { - "project_id": 13111, - "project_name": "project/ddcla", - "filename": "public/modules/node/node.admin.inc" - }, - { - "project_id": 13111, - "project_name": "project/ddcla", - "filename": "public/modules/node/node.api.php" - }, - { - "project_id": 13111, - "project_name": "project/ddcla", - "filename": "public/modules/user/user.api.php" - }, - { - "project_id": 13125, - "project_name": "project/transcribe_distribution", - "filename": "modules/node/node.admin.inc" - }, - { - "project_id": 13125, - "project_name": "project/transcribe_distribution", - "filename": "modules/user/user.api.php" - }, - { - "project_id": 13263, - "project_name": "project/move_user", - "filename": "move_user.module" - }, - { - "project_id": 13895, - "project_name": "project/ajaxnewcounter", - "filename": "ajaxnewcounter.module" - }, - { - "project_id": 13917, - "project_name": "project/simpleantispam", - "filename": "simpleantispam.install" - }, - { - "project_id": 14103, - "project_name": "project/factorydrone", - "filename": "tests/ContentTypeFactory.test" - }, - { - "project_id": 14446, - "project_name": "project/tr_kurulum", - "filename": "modules/node/node.admin.inc" - }, - { - "project_id": 14446, - "project_name": "project/tr_kurulum", - "filename": "modules/node/node.api.php" - }, - { - "project_id": 14446, - "project_name": "project/tr_kurulum", - "filename": "modules/user/user.api.php" - }, - { - "project_id": 14448, - "project_name": "project/blurry", - "filename": "blurry.admin.inc" - }, - { - "project_id": 14506, - "project_name": "project/tb_blog_starter", - "filename": "modules/node/node.admin.inc" - }, - { - "project_id": 14506, - "project_name": "project/tb_blog_starter", - "filename": "modules/user/user.api.php" - }, - { - "project_id": 14507, - "project_name": "project/tb_events_starter", - "filename": "modules/node/node.admin.inc" - }, - { - "project_id": 14507, - "project_name": "project/tb_events_starter", - "filename": "modules/node/node.api.php" - }, - { - "project_id": 14507, - "project_name": "project/tb_events_starter", - "filename": "modules/user/user.api.php" - }, - { - "project_id": 14509, - "project_name": "project/tb_hadelis_starter", - "filename": "modules/node/node.admin.inc" - }, - { - "project_id": 14509, - "project_name": "project/tb_hadelis_starter", - "filename": "modules/node/node.api.php" - }, - { - "project_id": 14509, - "project_name": "project/tb_hadelis_starter", - "filename": "modules/user/user.api.php" - }, - { - "project_id": 14510, - "project_name": "project/tb_methys_starter", - "filename": "modules/node/node.admin.inc" - }, - { - "project_id": 14510, - "project_name": "project/tb_methys_starter", - "filename": "modules/user/user.api.php" - }, - { - "project_id": 14511, - "project_name": "project/tb_mollise_starter", - "filename": "modules/node/node.admin.inc" - }, - { - "project_id": 14511, - "project_name": "project/tb_mollise_starter", - "filename": "modules/node/node.api.php" - }, - { - "project_id": 14511, - "project_name": "project/tb_mollise_starter", - "filename": "modules/user/user.api.php" - }, - { - "project_id": 14512, - "project_name": "project/tb_neris_starter", - "filename": "modules/node/node.admin.inc" - }, - { - "project_id": 14512, - "project_name": "project/tb_neris_starter", - "filename": "modules/node/node.api.php" - }, - { - "project_id": 14512, - "project_name": "project/tb_neris_starter", - "filename": "modules/user/user.api.php" - }, - { - "project_id": 14513, - "project_name": "project/tb_palicico_starter", - "filename": "modules/node/node.admin.inc" - }, - { - "project_id": 14513, - "project_name": "project/tb_palicico_starter", - "filename": "modules/user/user.api.php" - }, - { - "project_id": 14514, - "project_name": "project/tb_purity_starter", - "filename": "modules/node/node.admin.inc" - }, - { - "project_id": 14514, - "project_name": "project/tb_purity_starter", - "filename": "modules/node/node.api.php" - }, - { - "project_id": 14514, - "project_name": "project/tb_purity_starter", - "filename": "modules/user/user.api.php" - }, - { - "project_id": 14515, - "project_name": "project/tb_rave_starter", - "filename": "modules/node/node.admin.inc" - }, - { - "project_id": 14515, - "project_name": "project/tb_rave_starter", - "filename": "modules/user/user.api.php" - }, - { - "project_id": 14522, - "project_name": "project/tb_sirate_starter", - "filename": "modules/node/node.admin.inc" - }, - { - "project_id": 14522, - "project_name": "project/tb_sirate_starter", - "filename": "modules/user/user.api.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/node/node.admin.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/user/user.api.php" - }, - { - "project_id": 14682, - "project_name": "project/content_access_view", - "filename": "content_access_view.install" - }, - { - "project_id": 14713, - "project_name": "project/uyan", - "filename": "uyan.admin.inc" - }, - { - "project_id": 14723, - "project_name": "project/og_admin_block", - "filename": "og_admin_block.install" - }, - { - "project_id": 14926, - "project_name": "project/commons_migration", - "filename": "includes/commons_migration.og.content.inc" - }, - { - "project_id": 14926, - "project_name": "project/commons_migration", - "filename": "includes/commons_migration.og.user.inc" - }, - { - "project_id": 15194, - "project_name": "project/og_menu_single", - "filename": "og_menu_single.install" - }, - { - "project_id": 15222, - "project_name": "project/open_badging_installation_profile", - "filename": "modules/node/node.admin.inc" - }, - { - "project_id": 15222, - "project_name": "project/open_badging_installation_profile", - "filename": "modules/node/node.api.php" - }, - { - "project_id": 15222, - "project_name": "project/open_badging_installation_profile", - "filename": "modules/user/user.api.php" - }, - { - "project_id": 15568, - "project_name": "project/content_trust", - "filename": "includes/views/handlers/content_trust_handler_filter_content_trust.inc" - }, - { - "project_id": 15746, - "project_name": "project/openpolitic", - "filename": "modules/custom/ajax_comments/ajax_comments.admin.inc" - }, - { - "project_id": 15746, - "project_name": "project/openpolitic", - "filename": "modules/custom/auto_nodetitle/auto_nodetitle.install" - }, - { - "project_id": 16050, - "project_name": "project/user_content_type", - "filename": "user_content_type.install" - }, - { - "project_id": 16050, - "project_name": "project/user_content_type", - "filename": "user_content_type.module" - }, - { - "project_id": 16192, - "project_name": "project/mobilearkickstart", - "filename": "modules/node/node.admin.inc" - }, - { - "project_id": 16192, - "project_name": "project/mobilearkickstart", - "filename": "modules/user/user.api.php" - }, - { - "project_id": 16367, - "project_name": "project/inspector", - "filename": "d7-bk/modules/content_types_inspector/content_types_inspector.module" - }, - { - "project_id": 16498, - "project_name": "project/socialshare", - "filename": "socialshare.install" - }, - { - "project_id": 16545, - "project_name": "project/multipage_navigation", - "filename": "multipage_navigation.admin.inc" - }, - { - "project_id": 16865, - "project_name": "project/persistent_menu_items", - "filename": "persistent_menu_items.admin.inc" - }, - { - "project_id": 16984, - "project_name": "project/spanish_distribution", - "filename": "modules/node/node.admin.inc" - }, - { - "project_id": 16984, - "project_name": "project/spanish_distribution", - "filename": "modules/node/node.api.php" - }, - { - "project_id": 16984, - "project_name": "project/spanish_distribution", - "filename": "modules/user/user.api.php" - }, - { - "project_id": 17013, - "project_name": "project/fuse", - "filename": "modules/node/node.admin.inc" - }, - { - "project_id": 17013, - "project_name": "project/fuse", - "filename": "modules/user/user.api.php" - }, - { - "project_id": 17483, - "project_name": "project/ajax_node_loader", - "filename": "ajax_node_loader.admin.inc" - }, - { - "project_id": 17618, - "project_name": "project/codebook_core", - "filename": "codebook_core_views_handler_area_node_add.inc" - }, - { - "project_id": 17753, - "project_name": "project/codebook_print_pdf", - "filename": "codebook_core_views_handler_area_node_add.inc" - }, - { - "project_id": 17982, - "project_name": "project/form_default_button", - "filename": "form_default_button.install" - }, - { - "project_id": 18457, - "project_name": "project/simple_nodeblock", - "filename": "simple_nodeblock.module" - }, - { - "project_id": 18553, - "project_name": "project/copyscape", - "filename": "src/Form/CopyscapeContentForm.php" - }, - { - "project_id": 18559, - "project_name": "project/govbr", - "filename": "modules/node/node.admin.inc" - }, - { - "project_id": 18559, - "project_name": "project/govbr", - "filename": "modules/user/user.api.php" - }, - { - "project_id": 18606, - "project_name": "project/oa_wizard", - "filename": "oa_wizard.features.field_base.inc" - }, - { - "project_id": 18710, - "project_name": "project/readmore_ajax", - "filename": "readmore.admin.inc" - }, - { - "project_id": 18752, - "project_name": "project/csf", - "filename": "custom_search_field.admin.inc" - }, - { - "project_id": 18897, - "project_name": "project/qurandistribution", - "filename": "modules/node/node.admin.inc" - }, - { - "project_id": 18897, - "project_name": "project/qurandistribution", - "filename": "modules/user/user.api.php" - }, - { - "project_id": 19167, - "project_name": "project/usercancel_contentassigntoadmin", - "filename": "usercancel_contentassigntoadmin.module" - }, - { - "project_id": 19204, - "project_name": "project/taxonomy_linking", - "filename": "taxonomy_autolink.install" - }, - { - "project_id": 19210, - "project_name": "project/taxonomy_autolink", - "filename": "taxonomy_autolink.install" - }, - { - "project_id": 19319, - "project_name": "project/node_title_help_text", - "filename": "node_title_help_text.install" - }, - { - "project_id": 19339, - "project_name": "project/update_external_links", - "filename": "src/Form/ConfigurationForm.php" - }, - { - "project_id": 19409, - "project_name": "project/contentassigntootheruser", - "filename": "usercancel_contentassigntootheruser.module" - }, - { - "project_id": 19494, - "project_name": "project/hierarchical_select_access", - "filename": "hierarchical_select_access.admin.inc" - }, - { - "project_id": 20692, - "project_name": "project/basic_stats_token", - "filename": "basic_stats_token.tokens.inc" - }, - { - "project_id": 20853, - "project_name": "project/stop_broken_link_in_body", - "filename": "stop_broken_link_in_body.admin.inc" - }, - { - "project_id": 20990, - "project_name": "project/development", - "filename": "modules/node/node.admin.inc" - }, - { - "project_id": 20990, - "project_name": "project/development", - "filename": "modules/user/user.api.php" - }, - { - "project_id": 21241, - "project_name": "project/techsupport", - "filename": "modules/contrib/project/tests/spec/install.test" - }, - { - "project_id": 21242, - "project_name": "project/tsm", - "filename": "modules/contrib/project/tests/spec/install.test" - }, - { - "project_id": 21780, - "project_name": "project/anonymous_subscriptions", - "filename": "src/Plugin/Block/SubscribeBlock.php" - }, - { - "project_id": 21791, - "project_name": "project/find_text", - "filename": "src/Form/SearchForm.php" - }, - { - "project_id": 22401, - "project_name": "project/customizable_entities", - "filename": "customizable_entities_api.php" - }, - { - "project_id": 22613, - "project_name": "project/smartparticipation", - "filename": "modules/smartparticipation/smartparticipation_core/modules/smartparticipation_ajax_comments/smartparticipation_ajax_comments.admin.inc" - }, - { - "project_id": 22810, - "project_name": "project/npop", - "filename": "npop.install" - }, - { - "project_id": 23064, - "project_name": "project/updated", - "filename": "updated.install" - }, - { - "project_id": 23130, - "project_name": "project/admin_toolbar_content_languages", - "filename": "admin_toolbar_content_languages.module" - }, - { - "project_id": 23431, - "project_name": "project/transfer_user_content", - "filename": "transfer_user_content.module" - }, - { - "project_id": 23470, - "project_name": "project/gp_reviews", - "filename": "modules/node/node.admin.inc" - }, - { - "project_id": 23470, - "project_name": "project/gp_reviews", - "filename": "modules/user/user.api.php" - }, - { - "project_id": 23717, - "project_name": "project/baidumap_fieldtype", - "filename": "src/Form/BaidumapFieldtypeSettingsForm.php" - }, - { - "project_id": 23874, - "project_name": "project/node_creator_system_details", - "filename": "node_creator_system_details.admin.inc" - }, - { - "project_id": 24022, - "project_name": "project/domain_video_sitemap", - "filename": "src/DomainVideoList.php" - }, - { - "project_id": 24420, - "project_name": "project/razoreye_biz", - "filename": "modules/contrib/ds/modules/ds_switch_view_mode/src/Permissions.php" - }, - { - "project_id": 24420, - "project_name": "project/razoreye_biz", - "filename": "modules/contrib/token/token.tokens.inc" - }, - { - "project_id": 25294, - "project_name": "project/pankm", - "filename": "modules/contrib/ds/modules/ds_switch_view_mode/src/Permissions.php" - }, - { - "project_id": 25294, - "project_name": "project/pankm", - "filename": "modules/contrib/token/token.tokens.inc" - }, - { - "project_id": 25438, - "project_name": "project/acal", - "filename": "acal.install" - }, - { - "project_id": 25524, - "project_name": "project/rsvp_list", - "filename": "src/Form/RSVPSettingsForm.php" - }, - { - "project_id": 25896, - "project_name": "project/byu_installation_profile", - "filename": "modules/node/node.admin.inc" - }, - { - "project_id": 25896, - "project_name": "project/byu_installation_profile", - "filename": "modules/user/user.api.php" - }, - { - "project_id": 26141, - "project_name": "project/node_creation_links", - "filename": "node_creation_links.module" - }, - { - "project_id": 26902, - "project_name": "project/skyword", - "filename": "src/Plugin/rest/resource/SkywordPostsRestResource.php" - }, - { - "project_id": 26961, - "project_name": "project/communications", - "filename": "src/Form/MessageForm.php" - }, - { - "project_id": 27106, - "project_name": "project/page_menu_reorder", - "filename": "src/Form/ReorderMenuSettingsForm.php" - }, - { - "project_id": 27526, - "project_name": "project/node_menu_item_visibility_default_behaviour", - "filename": "node_menu_item_visibility_default_behaviour.install" - }, - { - "project_id": 50738, - "project_name": "project/user_delete_reassign", - "filename": "user_delete_reassign.module" - }, - { - "project_id": 51217, - "project_name": "project/tide_core", - "filename": "modules/tide_api/modules/tide_share_link/src/Controller/ShareLinkTokenController.php" - }, - { - "project_id": 51218, - "project_name": "project/tide_api", - "filename": "modules/tide_share_link/src/Controller/ShareLinkTokenController.php" - }, - { - "project_id": 51461, - "project_name": "project/auto_nodetitle", - "filename": "auto_nodetitle.install" - }, - { - "project_id": 51500, - "project_name": "project/project", - "filename": "tests/spec/install.test" - }, - { - "project_id": 51722, - "project_name": "project/filebrowser", - "filename": "filebrowser.module" - }, - { - "project_id": 51727, - "project_name": "project/token", - "filename": "src/Hook/TokenTokensHooks.php" - }, - { - "project_id": 55750, - "project_name": "project/read_time", - "filename": "read_time.install" - }, - { - "project_id": 55957, - "project_name": "project/quick_node_clone", - "filename": "src/Form/QuickNodeCloneNodeForm.php" - }, - { - "project_id": 56769, - "project_name": "project/hold_my_draft", - "filename": "src/Form/ConfirmCancellation.php" - }, - { - "project_id": 56769, - "project_name": "project/hold_my_draft", - "filename": "src/Form/ConfirmCompletion.php" - }, - { - "project_id": 56769, - "project_name": "project/hold_my_draft", - "filename": "src/Form/ConfirmStart.php" - }, - { - "project_id": 57226, - "project_name": "project/edit_content_type_tab", - "filename": "src/Plugin/Menu/EditTab.php" - }, - { - "project_id": 57997, - "project_name": "project/campaignion", - "filename": "campaignion_manage/src/Filter/ContentType.php" - }, - { - "project_id": 58233, - "project_name": "project/openpublic", - "filename": "modules/apps/openpublic_person/openpublic_person.app.inc" - }, - { - "project_id": 58470, - "project_name": "project/entity_translation_unified_form", - "filename": "entity_translation_unified_form.install" - }, - { - "project_id": 59005, - "project_name": "project/social", - "filename": "modules/social_features/social_content_report/src/Plugin/views/field/ReportContentType.php" - }, - { - "project_id": 59005, - "project_name": "project/social", - "filename": "modules/social_features/social_node/social_node.api.php" - }, - { - "project_id": 59396, - "project_name": "project/ds", - "filename": "modules/ds_switch_view_mode/src/Permissions.php" - }, - { - "project_id": 59409, - "project_name": "project/pp_graphsearch", - "filename": "src/PPGraphSearch.php" - }, - { - "project_id": 59586, - "project_name": "project/monster_menus", - "filename": "mm_ui.inc" - }, - { - "project_id": 59586, - "project_name": "project/monster_menus", - "filename": "src/Controller/DefaultController.php" - }, - { - "project_id": 59890, - "project_name": "project/simply_signups", - "filename": "src/Form/Config/SimplySignupsConfigForm.php" - }, - { - "project_id": 60215, - "project_name": "project/aeg", - "filename": "modules/og/og_ui/includes/migrate/7000/add_field.inc" - }, - { - "project_id": 60227, - "project_name": "project/govimentum", - "filename": "modules/node/node.admin.inc" - }, - { - "project_id": 60227, - "project_name": "project/govimentum", - "filename": "modules/node/node.api.php" - }, - { - "project_id": 60227, - "project_name": "project/govimentum", - "filename": "modules/user/user.api.php" - }, - { - "project_id": 60301, - "project_name": "project/markdown_exporter", - "filename": "markdown_exporter.drush.inc" - }, - { - "project_id": 60837, - "project_name": "project/virtualcare", - "filename": "modules/contrib/token/token.tokens.inc" - }, - { - "project_id": 62173, - "project_name": "project/content_admin_tools", - "filename": "modules/text_replace/src/Form/ConfirmUpdateForm.php" - }, - { - "project_id": 62378, - "project_name": "project/drupalru_d7", - "filename": "modules/node/node.admin.inc" - }, - { - "project_id": 62378, - "project_name": "project/drupalru_d7", - "filename": "modules/user/user.api.php" - }, - { - "project_id": 63624, - "project_name": "project/ubershopwish", - "filename": "modules/node/node.admin.inc" - }, - { - "project_id": 63624, - "project_name": "project/ubershopwish", - "filename": "modules/user/user.api.php" - }, - { - "project_id": 65774, - "project_name": "project/backdrop_upgrade_status", - "filename": "includes/modules/backdrop_upgrade_status.node.inc" - }, - { - "project_id": 68467, - "project_name": "project/rsvplist", - "filename": "src/Form/RSVPSettingsForm.php" - }, - { - "project_id": 72831, - "project_name": "project/node_randomizer", - "filename": "src/Form/NodeRandomizerSettingsForm.php" - }, - { - "project_id": 77509, - "project_name": "project/testproject4234", - "filename": "modules/node/node.admin.inc" - }, - { - "project_id": 77509, - "project_name": "project/testproject4234", - "filename": "modules/node/node.api.php" - }, - { - "project_id": 77509, - "project_name": "project/testproject4234", - "filename": "modules/user/user.api.php" - }, - { - "project_id": 79702, - "project_name": "project/public_revisions", - "filename": "src/Form/PublicRevisionGenerateForm.php" - }, - { - "project_id": 81804, - "project_name": "project/node_singles", - "filename": "src/EventSubscriber/NodeFormEventSubscriber.php" - }, - { - "project_id": 81814, - "project_name": "project/entity_sort", - "filename": "entity_sort.module" - }, - { - "project_id": 81865, - "project_name": "project/entity_references_map", - "filename": "src/EntityReferencesMapBuilder.php" - }, - { - "project_id": 82252, - "project_name": "project/reassign_user_content", - "filename": "src/Form/AssignAuthorForm.php" - }, - { - "project_id": 82297, - "project_name": "project/tracker", - "filename": "src/Controller/TrackerController.php" - }, - { - "project_id": 119794, - "project_name": "project/link_description_attributes", - "filename": "link_description_attributes.install" - }, - { - "project_id": 127276, - "project_name": "project/entity_reference_edit_link", - "filename": "entity_reference_edit_link.module" - }, - { - "project_id": 152219, - "project_name": "project/duplicate_node", - "filename": "src/Form/DuplicateNodeForm.php" - }, - { - "project_id": 159795, - "project_name": "project/micronode_block", - "filename": "src/Plugin/Block/MicronodeBlock.php" - }, - { - "project_id": 163611, - "project_name": "project/secure_nodes", - "filename": "src/Form/SecureNodesSettingsForm.php" - }, - { - "project_id": 181203, - "project_name": "project/json_drop_api", - "filename": "modules/contrib/token/token.tokens.inc" - }, - { - "project_id": 211056, - "project_name": "project/content_dependency_graph", - "filename": "src/Controller/GraphController.php" - } - ], - "ReplaceNodeSetPreviewModeRector": [ - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": ".gitignore" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/cache-install.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/database/log.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/database/sqlite/select.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/errors.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/filetransfer/local.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/filetransfer/ssh.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/install.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/lock.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/menu.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/password.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/farbtastic/farbtastic.js" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/jquery.js" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/powered-blue-80x15.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/powered-gray-135x42.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/ui/jquery.ui.selectable.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/ui/jquery.ui.slider.min.js" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/aggregator/aggregator-feed-source.tpl.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/aggregator/tests/aggregator_test_atom.xml" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/block/block.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/block/block.js" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/color/color.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.api.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/contact/contact.admin.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/contact/contact.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/dashboard/dashboard.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/field.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/modules/list/list.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/modules/number/number.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/tests/field_test.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/tests/field_test.storage.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field_ui/field_ui.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/file/icons/application-x-executable.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/file/icons/text-html.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/file/icons/text-x-generic.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/file/icons/x-office-document.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/filter/filter.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/filter/filter.pages.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/forum/forum.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/help/help.api.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/locale/locale.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/node/node.tokens.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/node/tests/node_access_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/node/tests/node_test_exception.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/openid/tests/openid_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/path/path.admin.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/php/php.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/poll/poll-results.tpl.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/rdf/rdf.api.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/rdf/tests/rdf_test.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/search/search.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/search/search.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/search/tests/search_embedded_form.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/search/tests/search_extra_type.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/files/css_test_files/comment_hacks.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/files/css_test_files/comment_hacks.css.unoptimized.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/files/javascript-2.script" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/simpletest.js" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/actions.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/ajax_test.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/error.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/graph.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/image_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/password.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/path_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/requirements1_test.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/system_incompatible_core_version_dependencies_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/system_incompatible_module_version_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/theme_test.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/unicode.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/upgrade/drupal-6.upload.database.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/upgrade/drupal-6.user-password-token.database.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/upgrade/upgrade.comment.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/statistics/statistics.pages.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/syslog/syslog.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/syslog/syslog.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/system/system.archiver.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/system/system.queue.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/system/system.updater.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/taxonomy/taxonomy.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/tracker/tracker.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/trigger/trigger.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/update/tests/aaa_update_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/update/tests/drupal.0.xml" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/user/tests/user_form_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/user/tests/user_form_test.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/user/user.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/README.txt" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/bartik/css/print.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/bartik/images/buttons.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/garland/fix-ie.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/garland/logo.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/seven/images/ui-icons-ffffff-256x240.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/seven/page.tpl.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/seven/style.css" - } - ], - "ReplacePdoFetchConstantsRector": [ - { - "project_id": 2271, - "project_name": "project/bitcache", - "filename": "adapters/pdo.inc" - }, - { - "project_id": 4288, - "project_name": "project/accessible", - "filename": "accessible_api/accessible_api.landing.inc" - }, - { - "project_id": 4369, - "project_name": "project/storage_api", - "filename": "cron.inc" - }, - { - "project_id": 4510, - "project_name": "project/querypath", - "filename": "QueryPath/Extension/QPDB.php" - }, - { - "project_id": 4970, - "project_name": "project/oracle", - "filename": "Statement.php" - }, - { - "project_id": 5158, - "project_name": "project/dbtng", - "filename": "database/prefetch.inc" - }, - { - "project_id": 6109, - "project_name": "project/styles", - "filename": "styles.module" - }, - { - "project_id": 6751, - "project_name": "project/d7", - "filename": "includes/database/prefetch.inc" - }, - { - "project_id": 7070, - "project_name": "project/mongodb_dbtng", - "filename": "database.inc" - }, - { - "project_id": 8063, - "project_name": "project/menu_minipanels", - "filename": "menu_minipanels.admin.inc" - }, - { - "project_id": 8197, - "project_name": "project/onepage", - "filename": "includes/database/prefetch.inc" - }, - { - "project_id": 9123, - "project_name": "project/1087726", - "filename": "includes/database/prefetch.inc" - }, - { - "project_id": 10014, - "project_name": "project/hubspot", - "filename": "hubspot.post_update.php" - }, - { - "project_id": 11136, - "project_name": "project/survey_builder", - "filename": "includes/survey_builder.entity.inc" - }, - { - "project_id": 12072, - "project_name": "project/relation_add", - "filename": "relation_add.install" - }, - { - "project_id": 12118, - "project_name": "project/rebuild", - "filename": "tests/fixtures/drupal_sites/dev/includes/database/prefetch.inc" - }, - { - "project_id": 12118, - "project_name": "project/rebuild", - "filename": "tests/fixtures/drupal_sites/prod/includes/database/prefetch.inc" - }, - { - "project_id": 12462, - "project_name": "project/opac", - "filename": "includes/opac.check.inc" - }, - { - "project_id": 13111, - "project_name": "project/ddcla", - "filename": "public/includes/database/prefetch.inc" - }, - { - "project_id": 13125, - "project_name": "project/transcribe_distribution", - "filename": "includes/database/prefetch.inc" - }, - { - "project_id": 13340, - "project_name": "project/autoslave", - "filename": "autoslave/autoslave.affected_tables.db-accurate.inc" - }, - { - "project_id": 14446, - "project_name": "project/tr_kurulum", - "filename": "includes/database/prefetch.inc" - }, - { - "project_id": 14506, - "project_name": "project/tb_blog_starter", - "filename": "includes/database/prefetch.inc" - }, - { - "project_id": 14507, - "project_name": "project/tb_events_starter", - "filename": "includes/database/prefetch.inc" - }, - { - "project_id": 14509, - "project_name": "project/tb_hadelis_starter", - "filename": "includes/database/prefetch.inc" - }, - { - "project_id": 14510, - "project_name": "project/tb_methys_starter", - "filename": "includes/database/prefetch.inc" - }, - { - "project_id": 14511, - "project_name": "project/tb_mollise_starter", - "filename": "includes/database/prefetch.inc" - }, - { - "project_id": 14512, - "project_name": "project/tb_neris_starter", - "filename": "includes/database/prefetch.inc" - }, - { - "project_id": 14513, - "project_name": "project/tb_palicico_starter", - "filename": "includes/database/prefetch.inc" - }, - { - "project_id": 14514, - "project_name": "project/tb_purity_starter", - "filename": "includes/database/prefetch.inc" - }, - { - "project_id": 14515, - "project_name": "project/tb_rave_starter", - "filename": "includes/database/prefetch.inc" - }, - { - "project_id": 14522, - "project_name": "project/tb_sirate_starter", - "filename": "includes/database/prefetch.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/database/prefetch.inc" - }, - { - "project_id": 14786, - "project_name": "project/paddle_menu_manager", - "filename": "paddle_menu_manager.i18n.inc" - }, - { - "project_id": 15222, - "project_name": "project/open_badging_installation_profile", - "filename": "includes/database/prefetch.inc" - }, - { - "project_id": 16192, - "project_name": "project/mobilearkickstart", - "filename": "includes/database/prefetch.inc" - }, - { - "project_id": 16984, - "project_name": "project/spanish_distribution", - "filename": "includes/database/prefetch.inc" - }, - { - "project_id": 17013, - "project_name": "project/fuse", - "filename": "includes/database/prefetch.inc" - }, - { - "project_id": 17226, - "project_name": "project/visitor_actions", - "filename": "modules/visitor_actions_ui/visitor_actions_ui.install" - }, - { - "project_id": 18559, - "project_name": "project/govbr", - "filename": "includes/database/prefetch.inc" - }, - { - "project_id": 18897, - "project_name": "project/qurandistribution", - "filename": "includes/database/prefetch.inc" - }, - { - "project_id": 19307, - "project_name": "project/mysql_async", - "filename": "includes/database/async-statement.inc" - }, - { - "project_id": 20056, - "project_name": "project/sqlbuddy", - "filename": "lib/sqlbuddy/includes/class/Sql.inc" - }, - { - "project_id": 20151, - "project_name": "project/contact_centre", - "filename": "includes/contact_centre.admin.view.inc" - }, - { - "project_id": 20990, - "project_name": "project/development", - "filename": "includes/database/prefetch.inc" - }, - { - "project_id": 21018, - "project_name": "project/amber", - "filename": "libraries/AmberDB.php" - }, - { - "project_id": 23470, - "project_name": "project/gp_reviews", - "filename": "includes/database/prefetch.inc" - }, - { - "project_id": 23523, - "project_name": "project/scoopit", - "filename": "external.libraries/oauth/oauth2-server-php/src/OAuth2/Storage/Pdo.php" - }, - { - "project_id": 25896, - "project_name": "project/byu_installation_profile", - "filename": "includes/database/prefetch.inc" - }, - { - "project_id": 26838, - "project_name": "project/multitype_slider", - "filename": "config/multitype_slider.classes.inc" - }, - { - "project_id": 50151, - "project_name": "project/entity_translation", - "filename": "tests/entity_translation_test.module" - }, - { - "project_id": 51487, - "project_name": "project/maps_suite", - "filename": "modules/import/lib/Drupal/maps_import/Operation/Entity/Delete/Delete.php" - }, - { - "project_id": 51722, - "project_name": "project/filebrowser", - "filename": "src/Services/FilebrowserStorage.php" - }, - { - "project_id": 55171, - "project_name": "project/votingapi", - "filename": "src/Plugin/migrate/VotingApiDeriver.php" - }, - { - "project_id": 57841, - "project_name": "project/gdpr", - "filename": "modules/gdpr_dump/src/Service/GdprDatabaseManager.php" - }, - { - "project_id": 58053, - "project_name": "project/media_migration", - "filename": "src/FileDealerBase.php" - }, - { - "project_id": 59857, - "project_name": "project/acquia_contenthub", - "filename": "src/AcquiaContentHubStatusMetricsTrait.php" - }, - { - "project_id": 60227, - "project_name": "project/govimentum", - "filename": "includes/database/prefetch.inc" - }, - { - "project_id": 60491, - "project_name": "project/imotilux", - "filename": "src/ImotiluxOutlineStorage.php" - }, - { - "project_id": 61256, - "project_name": "project/gtfs", - "filename": "src/Entity/HasIdTrait.php" - }, - { - "project_id": 61256, - "project_name": "project/gtfs", - "filename": "src/Entity/Route.php" - }, - { - "project_id": 61256, - "project_name": "project/gtfs", - "filename": "src/Plugin/rest/resource/AgencyListResource.php" - }, - { - "project_id": 61256, - "project_name": "project/gtfs", - "filename": "src/Plugin/rest/resource/RouteWKTResource.php" - }, - { - "project_id": 61256, - "project_name": "project/gtfs", - "filename": "src/Plugin/rest/resource/StopDirectionResource.php" - }, - { - "project_id": 61256, - "project_name": "project/gtfs", - "filename": "src/Plugin/rest/resource/StopListResource.php" - }, - { - "project_id": 61662, - "project_name": "project/commerce_store_override", - "filename": "tests/src/Kernel/IntegrationTest.php" - }, - { - "project_id": 62102, - "project_name": "project/ms_react", - "filename": "src/Controller/ApiController.php" - }, - { - "project_id": 62102, - "project_name": "project/ms_react", - "filename": "src/Controller/NewNotificationController.php" - }, - { - "project_id": 62378, - "project_name": "project/drupalru_d7", - "filename": "includes/database/prefetch.inc" - }, - { - "project_id": 62382, - "project_name": "project/arch", - "filename": "modules/order/src/Services/OrderAddressService.php" - }, - { - "project_id": 63073, - "project_name": "project/tweet_reference", - "filename": "src/TweetStorage.php" - }, - { - "project_id": 63588, - "project_name": "project/acquia_migrate", - "filename": "tests/src/Functional/RollbackableTablesUpdateTest.php" - }, - { - "project_id": 63624, - "project_name": "project/ubershopwish", - "filename": "includes/database/prefetch.inc" - }, - { - "project_id": 64020, - "project_name": "project/lgpd", - "filename": "modules/lgpd_dump/src/Service/LgpdDatabaseManager.php" - }, - { - "project_id": 64291, - "project_name": "project/entitree", - "filename": "modules/entitree_permissions/src/EntitreePermissionsManager.php" - }, - { - "project_id": 66097, - "project_name": "project/rating_list", - "filename": "modules/csdata/batch/test.php" - }, - { - "project_id": 68595, - "project_name": "project/social_auth_buttons", - "filename": "src/Services/SocialAuthButtonsRouteProvider.php" - }, - { - "project_id": 70928, - "project_name": "project/field_completeness", - "filename": "src/FieldCompletenessStorage.php" - }, - { - "project_id": 74592, - "project_name": "project/gtfs_511", - "filename": "gtfs_511.module" - }, - { - "project_id": 74593, - "project_name": "project/gtfs_rt", - "filename": "src/Plugin/Field/FieldType/CurrentRoutesComputed.php" - }, - { - "project_id": 74593, - "project_name": "project/gtfs_rt", - "filename": "src/Plugin/rest/resource/RouteStopPredictionsResource.php" - }, - { - "project_id": 74600, - "project_name": "project/gtfs_geo", - "filename": "gtfs_geo.module" - }, - { - "project_id": 75981, - "project_name": "project/payment_button_drupal_plugin", - "filename": "src/Form/Settings.php" - }, - { - "project_id": 77509, - "project_name": "project/testproject4234", - "filename": "includes/database/prefetch.inc" - }, - { - "project_id": 81896, - "project_name": "project/ayrshare", - "filename": "modules/ayrshare_node/src/Database/DatabaseStorage.php" - }, - { - "project_id": 85308, - "project_name": "project/tmgmt_smartcat", - "filename": "src/Services/SmartcatDocument.php" - }, - { - "project_id": 95795, - "project_name": "project/video_toolbox", - "filename": "src/Controller/VideoAutoCompleteController.php" - }, - { - "project_id": 95795, - "project_name": "project/video_toolbox", - "filename": "src/VideoHandler.php" - }, - { - "project_id": 135646, - "project_name": "project/sgd_user_status", - "filename": "sgd_user_status.install" - }, - { - "project_id": 148214, - "project_name": "project/sgd_watchdog_summary", - "filename": "sgd_watchdog_summary.module" - }, - { - "project_id": 150232, - "project_name": "project/smileys_field", - "filename": "src/Form/SmileysSelectForm.php" - }, - { - "project_id": 167065, - "project_name": "project/mail_box_management", - "filename": "src/Plugin/LocalStorage.php" - }, - { - "project_id": 179254, - "project_name": "project/book_library_api", - "filename": "src/Controller/BookController.php" - }, - { - "project_id": 179857, - "project_name": "project/track_usage", - "filename": "src/Trait/BackwardsCompatibilityTrait.php" - }, - { - "project_id": 185845, - "project_name": "project/babel", - "filename": "src/BackwardsCompatibilityHelper.php" - }, - { - "project_id": 196085, - "project_name": "project/graphql_shield", - "filename": "src/Service/SecurityDashboard.php" - }, - { - "project_id": 196314, - "project_name": "project/livre", - "filename": "book/src/BookOutlineStorage.php" - }, - { - "project_id": 200208, - "project_name": "project/conreg", - "filename": "src/Service/MemberStorage.php" - }, - { - "project_id": 202019, - "project_name": "project/junk_drawer", - "filename": "src/Drush/Commands/JunkDrawerCacheTagCommands.php" - }, - { - "project_id": 211072, - "project_name": "project/ai_schemadotorg_jsonld", - "filename": "modules/ai_schemadotorg_jsonld_log/src/AiSchemaDotOrgJsonLdLogStorage.php" - } - ], - "ReplaceRecipeRunnerInstallModuleRector": [ - { - "project_id": 83700, - "project_name": "project/schemadotorg", - "filename": "modules/schemadotorg_recipe/schemadotorg_recipe.module" - } - ], - "ReplaceSessionManagerDeleteRector": [ - { - "project_id": 714, - "project_name": "project/session_limit", - "filename": "src/Form/SessionLimitForm.php" - }, - { - "project_id": 714, - "project_name": "project/session_limit", - "filename": "src/Services/SessionLimit.php" - }, - { - "project_id": 2079, - "project_name": "project/activity", - "filename": "src/Form/MultiStepFormBase.php" - }, - { - "project_id": 2658, - "project_name": "project/restrict_by_ip", - "filename": "src/LoginFirewall.php" - }, - { - "project_id": 5738, - "project_name": "project/tupas", - "filename": "modules/tupas_registration/src/Form/MapTupasConfirmForm.php" - }, - { - "project_id": 5738, - "project_name": "project/tupas", - "filename": "modules/tupas_registration/src/Form/RegisterForm.php" - }, - { - "project_id": 5738, - "project_name": "project/tupas", - "filename": "modules/tupas_registration/tests/src/Kernel/TupasRegistrationTest.php" - }, - { - "project_id": 5738, - "project_name": "project/tupas", - "filename": "modules/tupas_session/src/Access/TupasSessionAccess.php" - }, - { - "project_id": 5738, - "project_name": "project/tupas", - "filename": "modules/tupas_session/src/EventSubscriber/TupasSessionEventSubscriber.php" - }, - { - "project_id": 5738, - "project_name": "project/tupas", - "filename": "modules/tupas_session/src/TupasSessionManager.php" - }, - { - "project_id": 5738, - "project_name": "project/tupas", - "filename": "modules/tupas_session/src/TupasSessionManagerInterface.php" - }, - { - "project_id": 5738, - "project_name": "project/tupas", - "filename": "modules/tupas_session/src/TupasTransactionManager.php" - }, - { - "project_id": 5738, - "project_name": "project/tupas", - "filename": "modules/tupas_session/tests/src/Kernel/TupasSessionTest.php" - }, - { - "project_id": 5738, - "project_name": "project/tupas", - "filename": "modules/tupas_session/tests/src/Unit/TupasSessionManagerTest.php" - }, - { - "project_id": 5738, - "project_name": "project/tupas", - "filename": "modules/tupas_session/tupas_session.module" - }, - { - "project_id": 5738, - "project_name": "project/tupas", - "filename": "modules/tupas_session/tupas_session.services.yml" - }, - { - "project_id": 9062, - "project_name": "project/recently_read", - "filename": "src/Plugin/views/relationship/RecentlyReadRelationship.php" - }, - { - "project_id": 9062, - "project_name": "project/recently_read", - "filename": "src/RecentlyReadService.php" - }, - { - "project_id": 9255, - "project_name": "project/commerce_qb_webconnect", - "filename": "src/SoapBundle/Services/SoapSessionManager.php" - }, - { - "project_id": 19425, - "project_name": "project/xing_connect", - "filename": "src/Controller/XingConnectAuthController.php" - }, - { - "project_id": 20730, - "project_name": "project/saml_idp", - "filename": "src/Auth/Source/External.php" - }, - { - "project_id": 21228, - "project_name": "project/big_pipe_demo", - "filename": "src/Plugin/Block/AnonSessionBlock.php" - }, - { - "project_id": 23072, - "project_name": "project/csv_to_config", - "filename": "src/Form/MultistepFormBase.php" - }, - { - "project_id": 24046, - "project_name": "project/bulk_update_fields", - "filename": "src/Plugin/Action/BulkUpdateFieldsActionBase.php" - }, - { - "project_id": 24420, - "project_name": "project/razoreye_biz", - "filename": "modules/contrib/devel/src/Controller/SwitchUserController.php" - }, - { - "project_id": 24420, - "project_name": "project/razoreye_biz", - "filename": "modules/contrib/masquerade/src/Masquerade.php" - }, - { - "project_id": 24787, - "project_name": "project/quicker_login", - "filename": "src/Service/QuickerLoginService.php" - }, - { - "project_id": 25475, - "project_name": "project/examplelist", - "filename": "src/Form/MultistepFormBase.php" - }, - { - "project_id": 26081, - "project_name": "project/page_hits", - "filename": "src/EventSubscriber/PageHitsSubscriber.php" - }, - { - "project_id": 27208, - "project_name": "project/change_author_action", - "filename": "src/Form/ChangeAuthorActionForm.php" - }, - { - "project_id": 27208, - "project_name": "project/change_author_action", - "filename": "src/Plugin/Action/ChangeAuthorActionBase.php" - }, - { - "project_id": 27405, - "project_name": "project/real_estate_lp_profile", - "filename": "modules/devel/src/Controller/SwitchUserController.php" - }, - { - "project_id": 47295, - "project_name": "project/node_export", - "filename": "src/Form/BulkNodeExport.php" - }, - { - "project_id": 47295, - "project_name": "project/node_export", - "filename": "src/Plugin/Action/BulkNodeExport.php" - }, - { - "project_id": 47298, - "project_name": "project/mailing_list", - "filename": "src/MailingListManager.php" - }, - { - "project_id": 47583, - "project_name": "project/userswitch", - "filename": "src/UserSwitch.php" - }, - { - "project_id": 49979, - "project_name": "project/bulk_update_fields_commerce", - "filename": "src/Form/BulkUpdateFieldsForm.php" - }, - { - "project_id": 49979, - "project_name": "project/bulk_update_fields_commerce", - "filename": "src/Plugin/Action/BulkUpdateFieldsActionBase.php" - }, - { - "project_id": 49979, - "project_name": "project/bulk_update_fields_commerce", - "filename": "src/Plugin/Action/BulkUpdateFieldsActionBaseCommerceOrder.php" - }, - { - "project_id": 49979, - "project_name": "project/bulk_update_fields_commerce", - "filename": "src/Plugin/Action/BulkUpdateFieldsActionBaseCommerceProduct.php" - }, - { - "project_id": 50229, - "project_name": "project/bulk_copy_fields", - "filename": "src/Plugin/Action/BulkCopyFieldsActionBase.php" - }, - { - "project_id": 51393, - "project_name": "project/login_alert", - "filename": "src/Controller/LoginAlertController.php" - }, - { - "project_id": 52081, - "project_name": "project/simple_node_importer", - "filename": "src/Form/SimpleNodeConfirmImportForm.php" - }, - { - "project_id": 52081, - "project_name": "project/simple_node_importer", - "filename": "src/Form/SimpleUserConfirmImportForm.php" - }, - { - "project_id": 55408, - "project_name": "project/global_gateway", - "filename": "src/Helper.php" - }, - { - "project_id": 55547, - "project_name": "project/facebook_pixel", - "filename": "src/FacebookEvent.php" - }, - { - "project_id": 56706, - "project_name": "project/registration_form", - "filename": "src/Form/Multistep/MultistepFormBase.php" - }, - { - "project_id": 56876, - "project_name": "project/tmgmt_smartling", - "filename": "src/Context/ContextUserAuth.php" - }, - { - "project_id": 56945, - "project_name": "project/questions_answers", - "filename": "src/Form/HelpfulForm.php" - }, - { - "project_id": 56945, - "project_name": "project/questions_answers", - "filename": "src/Form/ReportAnswerForm.php" - }, - { - "project_id": 56945, - "project_name": "project/questions_answers", - "filename": "src/Form/ReportQuestionForm.php" - }, - { - "project_id": 57678, - "project_name": "project/eid_auth", - "filename": "src/Form/MobileIdLoginForm.php" - }, - { - "project_id": 57678, - "project_name": "project/eid_auth", - "filename": "src/Form/SmartIdLoginForm.php" - }, - { - "project_id": 58249, - "project_name": "project/smartid_auth", - "filename": "src/Form/SmartidLoginForm.php" - }, - { - "project_id": 59145, - "project_name": "project/brightcove", - "filename": "src/EventSubscriber/RedirectResponseSubscriber.php" - }, - { - "project_id": 59145, - "project_name": "project/brightcove", - "filename": "src/Services/SessionManager.php" - }, - { - "project_id": 59145, - "project_name": "project/brightcove", - "filename": "src/Services/SessionManagerInterface.php" - }, - { - "project_id": 59234, - "project_name": "project/devel", - "filename": "src/Controller/SwitchUserController.php" - }, - { - "project_id": 59473, - "project_name": "project/rules", - "filename": "src/Plugin/RulesAction/UserBlock.php" - }, - { - "project_id": 59473, - "project_name": "project/rules", - "filename": "tests/src/Unit/Integration/RulesAction/UserBlockTest.php" - }, - { - "project_id": 59988, - "project_name": "project/evangelische_termine", - "filename": "src/Plugin/Block/FilteredList.php" - }, - { - "project_id": 61659, - "project_name": "project/entity_visibility_preview", - "filename": "src/Cache/Context/PreviewIsActiveCacheContextIdentifier.php" - }, - { - "project_id": 61659, - "project_name": "project/entity_visibility_preview", - "filename": "src/EntityVisibilityPreviewConditionPluginBase.php" - }, - { - "project_id": 61659, - "project_name": "project/entity_visibility_preview", - "filename": "src/Form/PreviewForm.php" - }, - { - "project_id": 61659, - "project_name": "project/entity_visibility_preview", - "filename": "src/HookHandler/EntityAccessHookHandler.php" - }, - { - "project_id": 61659, - "project_name": "project/entity_visibility_preview", - "filename": "src/Service/SessionManager.php" - }, - { - "project_id": 61659, - "project_name": "project/entity_visibility_preview", - "filename": "src/Service/SessionManagerInterface.php" - }, - { - "project_id": 62055, - "project_name": "project/eus", - "filename": "src/Form/ConfirmEndSessionForm.php" - }, - { - "project_id": 62055, - "project_name": "project/eus", - "filename": "src/Form/ConfirmRoleEndSessionForm.php" - }, - { - "project_id": 62055, - "project_name": "project/eus", - "filename": "src/Form/ConfirmSelectedusersEndSessionForm.php" - }, - { - "project_id": 62760, - "project_name": "project/admin_can_login_anyuser", - "filename": "src/Controller/AdminBackLoginLinkController.php" - }, - { - "project_id": 62760, - "project_name": "project/admin_can_login_anyuser", - "filename": "src/Form/ConfirmLoginSwitchForm.php" - }, - { - "project_id": 62764, - "project_name": "project/cookie_samesite_support", - "filename": "cookie_samesite_support.services.yml" - }, - { - "project_id": 62764, - "project_name": "project/cookie_samesite_support", - "filename": "src/Session/CookieSameSiteSupportSessionManager.php" - }, - { - "project_id": 62785, - "project_name": "project/entity_sync", - "filename": "modules/session/src/SessionConfigurator/Oauth2/Base.php" - }, - { - "project_id": 62785, - "project_name": "project/entity_sync", - "filename": "modules/session/src/SessionConfigurator/Oauth2/ClientCredentialsBase.php" - }, - { - "project_id": 62785, - "project_name": "project/entity_sync", - "filename": "modules/session/src/SessionConfigurator/Oauth2/PasswordBase.php" - }, - { - "project_id": 62785, - "project_name": "project/entity_sync", - "filename": "modules/session/src/SessionConfigurator/Oauth2/RefreshTokenBase.php" - }, - { - "project_id": 63218, - "project_name": "project/oidc", - "filename": "src/OpenidConnectSession.php" - }, - { - "project_id": 63218, - "project_name": "project/oidc", - "filename": "tests/src/Unit/OpenidConnectSessionTest.php" - }, - { - "project_id": 63489, - "project_name": "project/oidc_mcpf", - "filename": "src/Controller/AcmController.php" - }, - { - "project_id": 64133, - "project_name": "project/bing_ads", - "filename": "src/BingAdsEvent.php" - }, - { - "project_id": 67940, - "project_name": "project/anonymoussession", - "filename": "src/Services/AnonymousSessionService.php" - }, - { - "project_id": 78721, - "project_name": "project/commerce_ticketing_checkin", - "filename": "src/Form/CheckinMultistepFormBase.php" - }, - { - "project_id": 83095, - "project_name": "project/session_inspector", - "filename": "src/SessionInspector.php" - }, - { - "project_id": 101539, - "project_name": "project/acumatica", - "filename": "src/Session/OAuth2/PasswordSessionManager.php" - }, - { - "project_id": 119094, - "project_name": "project/kamihaya_cms", - "filename": "modules/kamihaya_cms_spiral_api/src/Controller/SpiralController.php" - }, - { - "project_id": 119344, - "project_name": "project/entity_sync_odata", - "filename": "src/EntitySync/Api/EntityClientFactory.php" - }, - { - "project_id": 119344, - "project_name": "project/entity_sync_odata", - "filename": "src/EntitySync/Api/ODataClientBuilderTrait.php" - }, - { - "project_id": 123514, - "project_name": "project/twilio_otp_login", - "filename": "src/Services/LocalStorage.php" - }, - { - "project_id": 146166, - "project_name": "project/cm_data_layer", - "filename": "src/DataLayer.php" - }, - { - "project_id": 150956, - "project_name": "project/session_management", - "filename": "src/SessionMonitor.php" - }, - { - "project_id": 154357, - "project_name": "project/loginnotification", - "filename": "src/Controller/LoginNotificationController.php" - }, - { - "project_id": 164248, - "project_name": "project/externalauth_force", - "filename": "src/EventSubscriber/RequestSubscriber.php" - }, - { - "project_id": 174206, - "project_name": "project/logout_timeout", - "filename": "src/Service/LogoutTimeoutService.php" - }, - { - "project_id": 191533, - "project_name": "project/simpleavs", - "filename": "src/Session/AvsSessionManager.php" - }, - { - "project_id": 196049, - "project_name": "project/stenographer", - "filename": "src/AuditRecorder.php" - }, - { - "project_id": 197857, - "project_name": "project/user_logout", - "filename": "src/UserLogoutBatch.php" - }, - { - "project_id": 207806, - "project_name": "project/drupal_saml_bridge", - "filename": "src/Controller/SamlController.php" - }, - { - "project_id": 207806, - "project_name": "project/drupal_saml_bridge", - "filename": "src/Service/SessionManager.php" - } - ], - "ReplaceSessionWritesWithRequestSessionRector": [ - { - "project_id": 714, - "project_name": "project/session_limit", - "filename": "tests/SessionLimitSessionTestCase.php" - }, - { - "project_id": 2866, - "project_name": "project/xmpp_server", - "filename": "includes/session.php" - }, - { - "project_id": 5444, - "project_name": "project/cache", - "filename": "session.inc" - }, - { - "project_id": 5481, - "project_name": "project/jp_mobile", - "filename": "session.inc" - }, - { - "project_id": 8197, - "project_name": "project/onepage", - "filename": "includes/session.inc" - }, - { - "project_id": 8197, - "project_name": "project/onepage", - "filename": "modules/simpletest/tests/session.test" - }, - { - "project_id": 9123, - "project_name": "project/1087726", - "filename": "includes/session.inc" - }, - { - "project_id": 9123, - "project_name": "project/1087726", - "filename": "modules/simpletest/tests/session.test" - }, - { - "project_id": 10369, - "project_name": "project/session_proxy", - "filename": "session.inc" - }, - { - "project_id": 11537, - "project_name": "project/drupalcon_base", - "filename": "amsterdam2014/sass/components/node/_session.scss" - }, - { - "project_id": 11537, - "project_name": "project/drupalcon_base", - "filename": "bogota2015/sass/components/node/_session.scss" - }, - { - "project_id": 12118, - "project_name": "project/rebuild", - "filename": "tests/fixtures/drupal_sites/dev/includes/session.inc" - }, - { - "project_id": 12118, - "project_name": "project/rebuild", - "filename": "tests/fixtures/drupal_sites/dev/modules/simpletest/tests/session.test" - }, - { - "project_id": 12118, - "project_name": "project/rebuild", - "filename": "tests/fixtures/drupal_sites/prod/includes/session.inc" - }, - { - "project_id": 12118, - "project_name": "project/rebuild", - "filename": "tests/fixtures/drupal_sites/prod/modules/simpletest/tests/session.test" - }, - { - "project_id": 13111, - "project_name": "project/ddcla", - "filename": "public/includes/session.inc" - }, - { - "project_id": 13111, - "project_name": "project/ddcla", - "filename": "public/modules/simpletest/tests/session.test" - }, - { - "project_id": 13125, - "project_name": "project/transcribe_distribution", - "filename": "includes/session.inc" - }, - { - "project_id": 13125, - "project_name": "project/transcribe_distribution", - "filename": "modules/simpletest/tests/session.test" - }, - { - "project_id": 14446, - "project_name": "project/tr_kurulum", - "filename": "includes/session.inc" - }, - { - "project_id": 14446, - "project_name": "project/tr_kurulum", - "filename": "modules/simpletest/tests/session.test" - }, - { - "project_id": 14506, - "project_name": "project/tb_blog_starter", - "filename": "includes/session.inc" - }, - { - "project_id": 14506, - "project_name": "project/tb_blog_starter", - "filename": "modules/simpletest/tests/session.test" - }, - { - "project_id": 14507, - "project_name": "project/tb_events_starter", - "filename": "includes/session.inc" - }, - { - "project_id": 14507, - "project_name": "project/tb_events_starter", - "filename": "modules/simpletest/tests/session.test" - }, - { - "project_id": 14509, - "project_name": "project/tb_hadelis_starter", - "filename": "includes/session.inc" - }, - { - "project_id": 14509, - "project_name": "project/tb_hadelis_starter", - "filename": "modules/simpletest/tests/session.test" - }, - { - "project_id": 14510, - "project_name": "project/tb_methys_starter", - "filename": "includes/session.inc" - }, - { - "project_id": 14510, - "project_name": "project/tb_methys_starter", - "filename": "modules/simpletest/tests/session.test" - }, - { - "project_id": 14511, - "project_name": "project/tb_mollise_starter", - "filename": "includes/session.inc" - }, - { - "project_id": 14511, - "project_name": "project/tb_mollise_starter", - "filename": "modules/simpletest/tests/session.test" - }, - { - "project_id": 14512, - "project_name": "project/tb_neris_starter", - "filename": "includes/session.inc" - }, - { - "project_id": 14512, - "project_name": "project/tb_neris_starter", - "filename": "modules/simpletest/tests/session.test" - }, - { - "project_id": 14513, - "project_name": "project/tb_palicico_starter", - "filename": "includes/session.inc" - }, - { - "project_id": 14513, - "project_name": "project/tb_palicico_starter", - "filename": "modules/simpletest/tests/session.test" - }, - { - "project_id": 14514, - "project_name": "project/tb_purity_starter", - "filename": "includes/session.inc" - }, - { - "project_id": 14514, - "project_name": "project/tb_purity_starter", - "filename": "modules/simpletest/tests/session.test" - }, - { - "project_id": 14515, - "project_name": "project/tb_rave_starter", - "filename": "includes/session.inc" - }, - { - "project_id": 14515, - "project_name": "project/tb_rave_starter", - "filename": "modules/simpletest/tests/session.test" - }, - { - "project_id": 14515, - "project_name": "project/tb_rave_starter", - "filename": "modules/simpletest/tests/session_test.module" - }, - { - "project_id": 14522, - "project_name": "project/tb_sirate_starter", - "filename": "includes/session.inc" - }, - { - "project_id": 14522, - "project_name": "project/tb_sirate_starter", - "filename": "modules/simpletest/tests/session.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/session.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/session.test" - }, - { - "project_id": 15222, - "project_name": "project/open_badging_installation_profile", - "filename": "includes/session.inc" - }, - { - "project_id": 15222, - "project_name": "project/open_badging_installation_profile", - "filename": "modules/simpletest/tests/session.test" - }, - { - "project_id": 16192, - "project_name": "project/mobilearkickstart", - "filename": "includes/session.inc" - }, - { - "project_id": 16192, - "project_name": "project/mobilearkickstart", - "filename": "modules/simpletest/tests/session.test" - }, - { - "project_id": 16984, - "project_name": "project/spanish_distribution", - "filename": "includes/session.inc" - }, - { - "project_id": 16984, - "project_name": "project/spanish_distribution", - "filename": "modules/simpletest/tests/session.test" - }, - { - "project_id": 17013, - "project_name": "project/fuse", - "filename": "includes/session.inc" - }, - { - "project_id": 17013, - "project_name": "project/fuse", - "filename": "modules/simpletest/tests/session.test" - }, - { - "project_id": 17101, - "project_name": "project/kalvi_core", - "filename": "modules/session/session.admin.inc" - }, - { - "project_id": 17101, - "project_name": "project/kalvi_core", - "filename": "modules/session/session.inc" - }, - { - "project_id": 17101, - "project_name": "project/kalvi_core", - "filename": "modules/session/views/session_handler_session_operations_field.inc" - }, - { - "project_id": 17142, - "project_name": "project/chatwee", - "filename": "chatwee/src/SSO/Session.php" - }, - { - "project_id": 17914, - "project_name": "project/events_features", - "filename": "panopoly_session/panopoly_session_demo/import/data/panopoly_session_demo.session.csv" - }, - { - "project_id": 17914, - "project_name": "project/events_features", - "filename": "panopoly_session/panopoly_session_demo/import/panopoly_session_demo.session.inc" - }, - { - "project_id": 18291, - "project_name": "project/casperjs", - "filename": "includes/session.js" - }, - { - "project_id": 18559, - "project_name": "project/govbr", - "filename": "includes/session.inc" - }, - { - "project_id": 18559, - "project_name": "project/govbr", - "filename": "modules/simpletest/tests/session.test" - }, - { - "project_id": 18897, - "project_name": "project/qurandistribution", - "filename": "includes/session.inc" - }, - { - "project_id": 18897, - "project_name": "project/qurandistribution", - "filename": "modules/simpletest/tests/session.test" - }, - { - "project_id": 20260, - "project_name": "project/soauth", - "filename": "src/Common/Session.php" - }, - { - "project_id": 20990, - "project_name": "project/development", - "filename": "includes/session.inc" - }, - { - "project_id": 20990, - "project_name": "project/development", - "filename": "modules/simpletest/tests/session.test" - }, - { - "project_id": 21936, - "project_name": "project/session_entity", - "filename": "src/Form/SessionEntitySessionForm.php" - }, - { - "project_id": 21936, - "project_name": "project/session_entity", - "filename": "src/SessionEntityCurrentSessionEntity.php" - }, - { - "project_id": 21936, - "project_name": "project/session_entity", - "filename": "src/SessionEntitySessionStorage.php" - }, - { - "project_id": 23470, - "project_name": "project/gp_reviews", - "filename": "includes/session.inc" - }, - { - "project_id": 23470, - "project_name": "project/gp_reviews", - "filename": "modules/simpletest/tests/session.test" - }, - { - "project_id": 25896, - "project_name": "project/byu_installation_profile", - "filename": "includes/session.inc" - }, - { - "project_id": 25896, - "project_name": "project/byu_installation_profile", - "filename": "modules/simpletest/tests/session.test" - }, - { - "project_id": 49725, - "project_name": "project/drd", - "filename": "src/Plugin/Action/Session.php" - }, - { - "project_id": 51684, - "project_name": "project/views_extras", - "filename": "src/Plugin/views/argument_default/Session.php" - }, - { - "project_id": 52106, - "project_name": "project/delphi", - "filename": "migrate_delphi2/session.inc" - }, - { - "project_id": 59618, - "project_name": "project/intercept", - "filename": "modules/intercept_core/js/src/lib/session.js" - }, - { - "project_id": 59930, - "project_name": "project/telega", - "filename": "modules/telega_session/src/Service/Session.php" - }, - { - "project_id": 60227, - "project_name": "project/govimentum", - "filename": "includes/session.inc" - }, - { - "project_id": 60227, - "project_name": "project/govimentum", - "filename": "modules/simpletest/tests/session.test" - }, - { - "project_id": 60487, - "project_name": "project/cypress", - "filename": "tests/Cypress/integration/Session.feature" - }, - { - "project_id": 61659, - "project_name": "project/entity_visibility_preview", - "filename": "src/Service/SessionManager.php" - }, - { - "project_id": 61899, - "project_name": "project/commerce7_razorpay", - "filename": "includes/libs/Requests-1.6.1/examples/session.php" - }, - { - "project_id": 61899, - "project_name": "project/commerce7_razorpay", - "filename": "includes/libs/Requests-1.6.1/library/Requests/Session.php" - }, - { - "project_id": 61899, - "project_name": "project/commerce7_razorpay", - "filename": "includes/libs/Requests-1.6.1/tests/Session.php" - }, - { - "project_id": 62378, - "project_name": "project/drupalru_d7", - "filename": "includes/session.inc" - }, - { - "project_id": 62378, - "project_name": "project/drupalru_d7", - "filename": "modules/simpletest/tests/session.test" - }, - { - "project_id": 62785, - "project_name": "project/entity_sync", - "filename": "modules/session/src/Commands/Session.php" - }, - { - "project_id": 63624, - "project_name": "project/ubershopwish", - "filename": "includes/session.inc" - }, - { - "project_id": 63624, - "project_name": "project/ubershopwish", - "filename": "modules/simpletest/tests/session.test" - }, - { - "project_id": 77509, - "project_name": "project/testproject4234", - "filename": "includes/session.inc" - }, - { - "project_id": 77509, - "project_name": "project/testproject4234", - "filename": "modules/simpletest/tests/session.test" - }, - { - "project_id": 92563, - "project_name": "project/eventbrite_one_way_sync", - "filename": "src/Session/Session.php" - }, - { - "project_id": 101539, - "project_name": "project/acumatica", - "filename": "src/Command/Session.php" - }, - { - "project_id": 193305, - "project_name": "project/simplesamlphp_sp", - "filename": "tests/modules/simplesamlphp_sp_test/lib/SimpleSAML/Session.php" - }, - { - "project_id": 208118, - "project_name": "project/drupal_devkit", - "filename": "build/claude-code/drupal-core/hooks/session-start" - }, - { - "project_id": 208118, - "project_name": "project/drupal_devkit", - "filename": "build/copilot-cli/drupal-core/hooks/session-start" - }, - { - "project_id": 208118, - "project_name": "project/drupal_devkit", - "filename": "build/cursor/drupal-core/hooks/session-start" - }, - { - "project_id": 208118, - "project_name": "project/drupal_devkit", - "filename": "plugins/drupal-core/hooks/session-start" - }, - { - "project_id": 210105, - "project_name": "project/drupal_canvas_plugin", - "filename": "plugins/drupal-canvas/hooks/session-start" - } - ], - "ReplaceSystemPerformanceGzipKeyRector": [ - { - "project_id": 1417, - "project_name": "project/audit", - "filename": "modules/audit_performance/src/Plugin/AuditAnalyzer/PerformanceAnalyzer.php" - }, - { - "project_id": 1417, - "project_name": "project/audit", - "filename": "modules/audit_performance/tests/src/Unit/Plugin/AuditAnalyzer/PerformanceAnalyzerTest.php" - }, - { - "project_id": 3063, - "project_name": "project/smartcache", - "filename": "README.txt" - }, - { - "project_id": 4621, - "project_name": "project/css_gzip", - "filename": "README.txt" - }, - { - "project_id": 4621, - "project_name": "project/css_gzip", - "filename": "css_gzip.info" - }, - { - "project_id": 4621, - "project_name": "project/css_gzip", - "filename": "css_gzip.install" - }, - { - "project_id": 4621, - "project_name": "project/css_gzip", - "filename": "css_gzip.module" - }, - { - "project_id": 6663, - "project_name": "project/css_emimage", - "filename": "css_emimage.module" - }, - { - "project_id": 8197, - "project_name": "project/onepage", - "filename": "includes/common.inc" - }, - { - "project_id": 8405, - "project_name": "project/cf", - "filename": "modules/cf_settings/cf_settings.install" - }, - { - "project_id": 8912, - "project_name": "project/barracuda", - "filename": "CHANGELOG.txt" - }, - { - "project_id": 8912, - "project_name": "project/barracuda", - "filename": "aegir/tools/system/daily.sh" - }, - { - "project_id": 8912, - "project_name": "project/barracuda", - "filename": "docs/MODULES.txt" - }, - { - "project_id": 9123, - "project_name": "project/1087726", - "filename": "includes/common.inc" - }, - { - "project_id": 9202, - "project_name": "project/vagrant", - "filename": "cookbooks/drupal-cookbooks/drupal/files/default/settings.php" - }, - { - "project_id": 9636, - "project_name": "project/octopus", - "filename": "CHANGELOG.txt" - }, - { - "project_id": 9636, - "project_name": "project/octopus", - "filename": "aegir/tools/system/daily.sh" - }, - { - "project_id": 9636, - "project_name": "project/octopus", - "filename": "docs/MODULES.txt" - }, - { - "project_id": 11552, - "project_name": "project/novalnet", - "filename": "settings.php" - }, - { - "project_id": 11641, - "project_name": "project/mongodrop", - "filename": "default.settings.php" - }, - { - "project_id": 11953, - "project_name": "project/hpcloud", - "filename": "hpcloud.css.inc" - }, - { - "project_id": 12118, - "project_name": "project/rebuild", - "filename": "tests/fixtures/drupal_sites/dev/includes/common.inc" - }, - { - "project_id": 12118, - "project_name": "project/rebuild", - "filename": "tests/fixtures/drupal_sites/prod/includes/common.inc" - }, - { - "project_id": 12677, - "project_name": "project/bundle_aggregation", - "filename": "bundle_aggregation.module" - }, - { - "project_id": 13111, - "project_name": "project/ddcla", - "filename": "public/includes/common.inc" - }, - { - "project_id": 13125, - "project_name": "project/transcribe_distribution", - "filename": "includes/common.inc" - }, - { - "project_id": 14446, - "project_name": "project/tr_kurulum", - "filename": "includes/common.inc" - }, - { - "project_id": 14506, - "project_name": "project/tb_blog_starter", - "filename": "includes/common.inc" - }, - { - "project_id": 14507, - "project_name": "project/tb_events_starter", - "filename": "includes/common.inc" - }, - { - "project_id": 14509, - "project_name": "project/tb_hadelis_starter", - "filename": "includes/common.inc" - }, - { - "project_id": 14510, - "project_name": "project/tb_methys_starter", - "filename": "includes/common.inc" - }, - { - "project_id": 14511, - "project_name": "project/tb_mollise_starter", - "filename": "includes/common.inc" - }, - { - "project_id": 14512, - "project_name": "project/tb_neris_starter", - "filename": "includes/common.inc" - }, - { - "project_id": 14513, - "project_name": "project/tb_palicico_starter", - "filename": "includes/common.inc" - }, - { - "project_id": 14514, - "project_name": "project/tb_purity_starter", - "filename": "includes/common.inc" - }, - { - "project_id": 14515, - "project_name": "project/tb_rave_starter", - "filename": "includes/common.inc" - }, - { - "project_id": 14522, - "project_name": "project/tb_sirate_starter", - "filename": "includes/common.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/common.inc" - }, - { - "project_id": 15222, - "project_name": "project/open_badging_installation_profile", - "filename": "includes/common.inc" - }, - { - "project_id": 15275, - "project_name": "project/ads", - "filename": "examples/settings.php" - }, - { - "project_id": 15746, - "project_name": "project/openpolitic", - "filename": "themes/omega/alpha/includes/alpha.inc" - }, - { - "project_id": 16013, - "project_name": "project/simple_aggregation", - "filename": "simple_aggregation.module" - }, - { - "project_id": 16192, - "project_name": "project/mobilearkickstart", - "filename": "includes/common.inc" - }, - { - "project_id": 16984, - "project_name": "project/spanish_distribution", - "filename": "includes/common.inc" - }, - { - "project_id": 17013, - "project_name": "project/fuse", - "filename": "includes/common.inc" - }, - { - "project_id": 18094, - "project_name": "project/openstack_storage", - "filename": "openstack_storage.css.inc" - }, - { - "project_id": 18559, - "project_name": "project/govbr", - "filename": "includes/common.inc" - }, - { - "project_id": 18897, - "project_name": "project/qurandistribution", - "filename": "includes/common.inc" - }, - { - "project_id": 19090, - "project_name": "project/settingsphp", - "filename": ".env.example" - }, - { - "project_id": 19090, - "project_name": "project/settingsphp", - "filename": "assets/settings.custom.php" - }, - { - "project_id": 19090, - "project_name": "project/settingsphp", - "filename": "assets/settings.recommended.php" - }, - { - "project_id": 19876, - "project_name": "project/flysystem", - "filename": "src/Asset/AssetDumper.php" - }, - { - "project_id": 20010, - "project_name": "project/domain_wise_aggregation", - "filename": "domain_aggregate_compress.module" - }, - { - "project_id": 20410, - "project_name": "project/devinci", - "filename": "example.settings.php" - }, - { - "project_id": 20990, - "project_name": "project/development", - "filename": "includes/common.inc" - }, - { - "project_id": 22819, - "project_name": "project/dawn", - "filename": "node_modules/bootstrap/README.md" - }, - { - "project_id": 23470, - "project_name": "project/gp_reviews", - "filename": "includes/common.inc" - }, - { - "project_id": 24420, - "project_name": "project/razoreye_biz", - "filename": "modules/contrib/advagg/src/Form/SettingsForm.php" - }, - { - "project_id": 24505, - "project_name": "project/tmgmt_transifex", - "filename": "docker/settings.php" - }, - { - "project_id": 25257, - "project_name": "project/background_image", - "filename": "src/Controller/BackgroundImageCssController.php" - }, - { - "project_id": 25896, - "project_name": "project/byu_installation_profile", - "filename": "includes/common.inc" - }, - { - "project_id": 26733, - "project_name": "project/timber", - "filename": "console/site.mode.yml" - }, - { - "project_id": 49725, - "project_name": "project/drd", - "filename": "src/Entity/Requirement.php" - }, - { - "project_id": 53828, - "project_name": "project/bootstrap4", - "filename": "dist/bootstrap/4.6.2/README.md" - }, - { - "project_id": 57654, - "project_name": "project/advagg", - "filename": "src/Form/SettingsForm.php" - }, - { - "project_id": 59891, - "project_name": "project/infrastructure", - "filename": "stats/NG/drupalorg_projects.csv" - }, - { - "project_id": 60087, - "project_name": "project/exsen", - "filename": "node_modules/bootstrap/README.md" - }, - { - "project_id": 60227, - "project_name": "project/govimentum", - "filename": "includes/common.inc" - }, - { - "project_id": 60499, - "project_name": "project/d_test", - "filename": "libraries/bootstrap/README.md" - }, - { - "project_id": 62378, - "project_name": "project/drupalru_d7", - "filename": "includes/common.inc" - }, - { - "project_id": 63624, - "project_name": "project/ubershopwish", - "filename": "includes/common.inc" - }, - { - "project_id": 66128, - "project_name": "project/bootstrap5", - "filename": "dist/bootstrap/5.2.3/README.md" - }, - { - "project_id": 66128, - "project_name": "project/bootstrap5", - "filename": "dist/bootstrap/5.3.8/README.md" - }, - { - "project_id": 71508, - "project_name": "project/drupalsqlsrvci", - "filename": "src/settings.php" - }, - { - "project_id": 77509, - "project_name": "project/testproject4234", - "filename": "includes/common.inc" - }, - { - "project_id": 85563, - "project_name": "project/stage_one_theme", - "filename": "scss/bootstrap/README.md" - }, - { - "project_id": 89428, - "project_name": "project/tone", - "filename": "src/Plugin/ToneAttachmentStrategy/CssPublicFiles.php" - }, - { - "project_id": 89428, - "project_name": "project/tone", - "filename": "tests/src/Kernel/AttachmentStrategy/CssPublicFilesTest.php" - }, - { - "project_id": 207471, - "project_name": "project/ai_agents_experimental_collection", - "filename": "modules/ai_agents_system_manager/src/Plugin/tool/Tool/GetPerformanceSettings.php" - }, - { - "project_id": 207471, - "project_name": "project/ai_agents_experimental_collection", - "filename": "modules/ai_agents_system_manager/src/Plugin/tool/Tool/UpdatePerformanceSettings.php" - } - ], - "ReplaceThemeGetSettingRector": [ - { - "project_id": 2168, - "project_name": "project/denver", - "filename": "page.tpl.php" - }, - { - "project_id": 5104, - "project_name": "project/zeropoint", - "filename": "templates/slider.php" - }, - { - "project_id": 5316, - "project_name": "project/adt_basetheme", - "filename": "preprocess/preprocess-node.inc" - }, - { - "project_id": 8197, - "project_name": "project/onepage", - "filename": "includes/theme.inc" - }, - { - "project_id": 8197, - "project_name": "project/onepage", - "filename": "modules/system/system.module" - }, - { - "project_id": 8969, - "project_name": "project/onus", - "filename": "inc/layout.fixed.css.inc" - }, - { - "project_id": 8969, - "project_name": "project/onus", - "filename": "inc/layout.handler.inc" - }, - { - "project_id": 8969, - "project_name": "project/onus", - "filename": "inc/theme.settings.variables.inc" - }, - { - "project_id": 9123, - "project_name": "project/1087726", - "filename": "includes/theme.inc" - }, - { - "project_id": 9123, - "project_name": "project/1087726", - "filename": "modules/system/system.module" - }, - { - "project_id": 9186, - "project_name": "project/mobile_jquery", - "filename": "SUBTHEME/theme-settings.php" - }, - { - "project_id": 10913, - "project_name": "project/arctica", - "filename": "arctica/theme-settings.php" - }, - { - "project_id": 11200, - "project_name": "project/black_hole", - "filename": "templates/slider.php" - }, - { - "project_id": 11880, - "project_name": "project/aether", - "filename": "aether_core/includes/theme-base.inc" - }, - { - "project_id": 12118, - "project_name": "project/rebuild", - "filename": "tests/fixtures/drupal_sites/dev/includes/theme.inc" - }, - { - "project_id": 12118, - "project_name": "project/rebuild", - "filename": "tests/fixtures/drupal_sites/dev/modules/system/system.module" - }, - { - "project_id": 12118, - "project_name": "project/rebuild", - "filename": "tests/fixtures/drupal_sites/prod/includes/theme.inc" - }, - { - "project_id": 12118, - "project_name": "project/rebuild", - "filename": "tests/fixtures/drupal_sites/prod/modules/system/system.module" - }, - { - "project_id": 13111, - "project_name": "project/ddcla", - "filename": "public/includes/theme.inc" - }, - { - "project_id": 13111, - "project_name": "project/ddcla", - "filename": "public/modules/system/system.module" - }, - { - "project_id": 13125, - "project_name": "project/transcribe_distribution", - "filename": "includes/theme.inc" - }, - { - "project_id": 13125, - "project_name": "project/transcribe_distribution", - "filename": "modules/system/system.module" - }, - { - "project_id": 14446, - "project_name": "project/tr_kurulum", - "filename": "includes/theme.inc" - }, - { - "project_id": 14446, - "project_name": "project/tr_kurulum", - "filename": "modules/system/system.module" - }, - { - "project_id": 14506, - "project_name": "project/tb_blog_starter", - "filename": "includes/theme.inc" - }, - { - "project_id": 14506, - "project_name": "project/tb_blog_starter", - "filename": "modules/system/system.module" - }, - { - "project_id": 14507, - "project_name": "project/tb_events_starter", - "filename": "includes/theme.inc" - }, - { - "project_id": 14507, - "project_name": "project/tb_events_starter", - "filename": "modules/system/system.module" - }, - { - "project_id": 14509, - "project_name": "project/tb_hadelis_starter", - "filename": "includes/theme.inc" - }, - { - "project_id": 14509, - "project_name": "project/tb_hadelis_starter", - "filename": "modules/system/system.module" - }, - { - "project_id": 14510, - "project_name": "project/tb_methys_starter", - "filename": "includes/theme.inc" - }, - { - "project_id": 14510, - "project_name": "project/tb_methys_starter", - "filename": "modules/system/system.module" - }, - { - "project_id": 14511, - "project_name": "project/tb_mollise_starter", - "filename": "includes/theme.inc" - }, - { - "project_id": 14511, - "project_name": "project/tb_mollise_starter", - "filename": "modules/system/system.module" - }, - { - "project_id": 14512, - "project_name": "project/tb_neris_starter", - "filename": "includes/theme.inc" - }, - { - "project_id": 14512, - "project_name": "project/tb_neris_starter", - "filename": "modules/system/system.module" - }, - { - "project_id": 14513, - "project_name": "project/tb_palicico_starter", - "filename": "includes/theme.inc" - }, - { - "project_id": 14513, - "project_name": "project/tb_palicico_starter", - "filename": "modules/system/system.module" - }, - { - "project_id": 14514, - "project_name": "project/tb_purity_starter", - "filename": "includes/theme.inc" - }, - { - "project_id": 14514, - "project_name": "project/tb_purity_starter", - "filename": "modules/system/system.module" - }, - { - "project_id": 14515, - "project_name": "project/tb_rave_starter", - "filename": "includes/theme.inc" - }, - { - "project_id": 14515, - "project_name": "project/tb_rave_starter", - "filename": "modules/system/system.module" - }, - { - "project_id": 14522, - "project_name": "project/tb_sirate_starter", - "filename": "includes/theme.inc" - }, - { - "project_id": 14522, - "project_name": "project/tb_sirate_starter", - "filename": "modules/system/system.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/theme.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/system/system.module" - }, - { - "project_id": 14636, - "project_name": "project/md_foto", - "filename": "inc/template.process.inc" - }, - { - "project_id": 14698, - "project_name": "project/portal_theme", - "filename": "template.php" - }, - { - "project_id": 15222, - "project_name": "project/open_badging_installation_profile", - "filename": "includes/theme.inc" - }, - { - "project_id": 15222, - "project_name": "project/open_badging_installation_profile", - "filename": "modules/system/system.module" - }, - { - "project_id": 15846, - "project_name": "project/abc", - "filename": "templates/slider.php" - }, - { - "project_id": 16192, - "project_name": "project/mobilearkickstart", - "filename": "includes/theme.inc" - }, - { - "project_id": 16192, - "project_name": "project/mobilearkickstart", - "filename": "modules/system/system.module" - }, - { - "project_id": 16252, - "project_name": "project/berry", - "filename": "includes/slider.tpl.php" - }, - { - "project_id": 16984, - "project_name": "project/spanish_distribution", - "filename": "includes/theme.inc" - }, - { - "project_id": 16984, - "project_name": "project/spanish_distribution", - "filename": "modules/system/system.module" - }, - { - "project_id": 17013, - "project_name": "project/fuse", - "filename": "includes/theme.inc" - }, - { - "project_id": 17013, - "project_name": "project/fuse", - "filename": "modules/system/system.module" - }, - { - "project_id": 17324, - "project_name": "project/browsersync", - "filename": "browsersync.module" - }, - { - "project_id": 18559, - "project_name": "project/govbr", - "filename": "includes/theme.inc" - }, - { - "project_id": 18559, - "project_name": "project/govbr", - "filename": "modules/system/system.module" - }, - { - "project_id": 18708, - "project_name": "project/scholarly_lite", - "filename": "template.php" - }, - { - "project_id": 18897, - "project_name": "project/qurandistribution", - "filename": "includes/theme.inc" - }, - { - "project_id": 18897, - "project_name": "project/qurandistribution", - "filename": "modules/system/system.module" - }, - { - "project_id": 20484, - "project_name": "project/mpub", - "filename": "themes/contrib/omega/omega/includes/omega.inc" - }, - { - "project_id": 20976, - "project_name": "project/glazed_free", - "filename": "features/sooper-typography/typography-theme-settings-css.inc" - }, - { - "project_id": 20976, - "project_name": "project/glazed_free", - "filename": "features/sooper-typography/typography-theme-settings.inc" - }, - { - "project_id": 20976, - "project_name": "project/glazed_free", - "filename": "theme-settings.php" - }, - { - "project_id": 20990, - "project_name": "project/development", - "filename": "includes/theme.inc" - }, - { - "project_id": 20990, - "project_name": "project/development", - "filename": "modules/system/system.module" - }, - { - "project_id": 22530, - "project_name": "project/agov_base", - "filename": "agov_base.info.yml" - }, - { - "project_id": 23447, - "project_name": "project/showcase_lite", - "filename": "showcase_lite.theme" - }, - { - "project_id": 23470, - "project_name": "project/gp_reviews", - "filename": "includes/theme.inc" - }, - { - "project_id": 23470, - "project_name": "project/gp_reviews", - "filename": "modules/system/system.module" - }, - { - "project_id": 24420, - "project_name": "project/razoreye_biz", - "filename": "themes/contrib/bootstrap/src/ThemeSettings.php" - }, - { - "project_id": 25232, - "project_name": "project/green_theme", - "filename": "green_theme.theme" - }, - { - "project_id": 25294, - "project_name": "project/pankm", - "filename": "themes/contrib/bootstrap/src/ThemeSettings.php" - }, - { - "project_id": 25453, - "project_name": "project/byu_theme", - "filename": "byu_theme.theme" - }, - { - "project_id": 25896, - "project_name": "project/byu_installation_profile", - "filename": "includes/theme.inc" - }, - { - "project_id": 25896, - "project_name": "project/byu_installation_profile", - "filename": "modules/system/system.module" - }, - { - "project_id": 26025, - "project_name": "project/belle", - "filename": "belle.theme" - }, - { - "project_id": 26124, - "project_name": "project/plus", - "filename": "src/Plugin/Theme/Setting/Settings.php" - }, - { - "project_id": 26124, - "project_name": "project/plus", - "filename": "src/ThemeSettings.php" - }, - { - "project_id": 26169, - "project_name": "project/yg_booster", - "filename": "yg_booster.theme" - }, - { - "project_id": 26233, - "project_name": "project/yg_charity", - "filename": "yg_charity.theme" - }, - { - "project_id": 26339, - "project_name": "project/yg_flew", - "filename": "yg_flew.theme" - }, - { - "project_id": 27033, - "project_name": "project/corporate_lite", - "filename": "corporate_lite.theme" - }, - { - "project_id": 27283, - "project_name": "project/yg_business_plus", - "filename": "yg_business_plus.theme" - }, - { - "project_id": 27318, - "project_name": "project/yg_business_line", - "filename": "yg_business_line.theme" - }, - { - "project_id": 27349, - "project_name": "project/yg_medical", - "filename": "yg_medical.theme" - }, - { - "project_id": 27734, - "project_name": "project/conference_lite", - "filename": "conference_lite.theme" - }, - { - "project_id": 27736, - "project_name": "project/guesthouse_lite", - "filename": "guesthouse_lite.theme" - }, - { - "project_id": 27768, - "project_name": "project/yg_aesthetic", - "filename": "yg_aesthetic.theme" - }, - { - "project_id": 27770, - "project_name": "project/yg_hotel", - "filename": "yg_hotel.theme" - }, - { - "project_id": 27844, - "project_name": "project/yg_medicare", - "filename": "yg_medicare.theme" - }, - { - "project_id": 27922, - "project_name": "project/yg_iconic", - "filename": "yg_iconic.theme" - }, - { - "project_id": 27923, - "project_name": "project/yg_law_firm", - "filename": "yg_law_firm.theme" - }, - { - "project_id": 28148, - "project_name": "project/yg_creative", - "filename": "yg_creative.theme" - }, - { - "project_id": 47202, - "project_name": "project/yg_solid", - "filename": "yg_solid.theme" - }, - { - "project_id": 47221, - "project_name": "project/yg_black", - "filename": "yg_black.theme" - }, - { - "project_id": 47401, - "project_name": "project/materialize", - "filename": "src/ThemeSettings.php" - }, - { - "project_id": 58746, - "project_name": "project/crypto_distribution", - "filename": "themes/crypto/crypto.theme" - }, - { - "project_id": 59699, - "project_name": "project/tara", - "filename": "tara.theme" - }, - { - "project_id": 60036, - "project_name": "project/mili", - "filename": "mili.theme" - }, - { - "project_id": 60227, - "project_name": "project/govimentum", - "filename": "includes/theme.inc" - }, - { - "project_id": 60227, - "project_name": "project/govimentum", - "filename": "modules/system/system.module" - }, - { - "project_id": 60334, - "project_name": "project/minimal_lite", - "filename": "minimal_lite.theme" - }, - { - "project_id": 60837, - "project_name": "project/virtualcare", - "filename": "themes/bootstrap/src/ThemeSettings.php" - }, - { - "project_id": 61313, - "project_name": "project/stack_dd", - "filename": "stack_dd.theme" - }, - { - "project_id": 61358, - "project_name": "project/catalog_lite", - "filename": "catalog_lite.theme" - }, - { - "project_id": 61656, - "project_name": "project/bootstrap_italia", - "filename": "includes/page.inc" - }, - { - "project_id": 61656, - "project_name": "project/bootstrap_italia", - "filename": "includes/preprocess-menu.inc" - }, - { - "project_id": 61656, - "project_name": "project/bootstrap_italia", - "filename": "src/Helper/Table.php" - }, - { - "project_id": 61791, - "project_name": "project/elegant_showcase", - "filename": "elegant_showcase.theme" - }, - { - "project_id": 62371, - "project_name": "project/zuvi", - "filename": "zuvi.theme" - }, - { - "project_id": 62378, - "project_name": "project/drupalru_d7", - "filename": "includes/theme.inc" - }, - { - "project_id": 62378, - "project_name": "project/drupalru_d7", - "filename": "modules/system/system.module" - }, - { - "project_id": 62490, - "project_name": "project/tactic", - "filename": "tactic.theme" - }, - { - "project_id": 62579, - "project_name": "project/vani", - "filename": "vani.theme" - }, - { - "project_id": 62868, - "project_name": "project/dxpr_theme", - "filename": "scripts/generate-settings-schema.js" - }, - { - "project_id": 62868, - "project_name": "project/dxpr_theme", - "filename": "theme-settings.php" - }, - { - "project_id": 62934, - "project_name": "project/zinble", - "filename": "zinble.theme" - }, - { - "project_id": 63624, - "project_name": "project/ubershopwish", - "filename": "includes/theme.inc" - }, - { - "project_id": 63624, - "project_name": "project/ubershopwish", - "filename": "modules/system/system.module" - }, - { - "project_id": 63725, - "project_name": "project/photogenictheme", - "filename": "photogenic_theme.theme" - }, - { - "project_id": 63969, - "project_name": "project/dolphin_theme", - "filename": "dolphin.theme" - }, - { - "project_id": 66228, - "project_name": "project/edux", - "filename": "edux.theme" - }, - { - "project_id": 70307, - "project_name": "project/ruhi", - "filename": "ruhi.theme" - }, - { - "project_id": 70422, - "project_name": "project/mycity", - "filename": "my_city.theme" - }, - { - "project_id": 73211, - "project_name": "project/ajans", - "filename": "ajans.theme" - }, - { - "project_id": 74572, - "project_name": "project/commerce_factuursturen", - "filename": ".gitlab-ci/phpstan.neon" - }, - { - "project_id": 76180, - "project_name": "project/eau_theme", - "filename": "theme-settings/settings-style.inc" - }, - { - "project_id": 76180, - "project_name": "project/eau_theme", - "filename": "theme-settings/style-root.inc" - }, - { - "project_id": 76361, - "project_name": "project/edwt", - "filename": "theme-settings/settings-style.inc" - }, - { - "project_id": 76361, - "project_name": "project/edwt", - "filename": "theme-settings/style-root.inc" - }, - { - "project_id": 77509, - "project_name": "project/testproject4234", - "filename": "includes/theme.inc" - }, - { - "project_id": 77509, - "project_name": "project/testproject4234", - "filename": "modules/system/system.module" - }, - { - "project_id": 82549, - "project_name": "project/xara", - "filename": "xara.theme" - }, - { - "project_id": 86019, - "project_name": "project/creative_innovative", - "filename": "creative_innovative.theme" - }, - { - "project_id": 86288, - "project_name": "project/particles_orange", - "filename": "particles_orange.theme" - }, - { - "project_id": 86424, - "project_name": "project/dark_awesome", - "filename": "dark_awesome.theme" - }, - { - "project_id": 90367, - "project_name": "project/cellular4drupal", - "filename": "cellular/src/preprocess/social.inc" - }, - { - "project_id": 90572, - "project_name": "project/dsfr", - "filename": ".phpstan.neon" - }, - { - "project_id": 91175, - "project_name": "project/idyllic", - "filename": "idyllic.theme" - }, - { - "project_id": 92163, - "project_name": "project/dark_page", - "filename": "dark_page.theme" - }, - { - "project_id": 92291, - "project_name": "project/smash_lite", - "filename": "smash_lite.theme" - }, - { - "project_id": 94979, - "project_name": "project/marvelous", - "filename": "marvelous.theme" - }, - { - "project_id": 102735, - "project_name": "project/fashion_beauty", - "filename": "ultimate_slider.theme" - }, - { - "project_id": 110336, - "project_name": "project/mahi", - "filename": "mahi.theme" - }, - { - "project_id": 115517, - "project_name": "project/power_portfolio", - "filename": "power_portfolio.theme" - }, - { - "project_id": 116731, - "project_name": "project/kart", - "filename": "kart.theme" - }, - { - "project_id": 116841, - "project_name": "project/potent_allure", - "filename": "potent_allure.theme" - }, - { - "project_id": 117060, - "project_name": "project/rhythm", - "filename": "rhythm.theme" - }, - { - "project_id": 117973, - "project_name": "project/harmony_haven", - "filename": "harmony_haven.theme" - }, - { - "project_id": 118186, - "project_name": "project/novel_delights", - "filename": "novel_delights.theme" - }, - { - "project_id": 119094, - "project_name": "project/kamihaya_cms", - "filename": "themes/kamihaya_digitalagency/kamihaya_digitalagency.theme" - }, - { - "project_id": 120281, - "project_name": "project/decorx", - "filename": "decorx.theme" - }, - { - "project_id": 120883, - "project_name": "project/diner_delights", - "filename": "diner_delights.theme" - }, - { - "project_id": 120883, - "project_name": "project/diner_delights", - "filename": "theme-settings.php" - }, - { - "project_id": 122249, - "project_name": "project/business_dev", - "filename": "business_dev.theme" - }, - { - "project_id": 124680, - "project_name": "project/multi_purpose", - "filename": "multi_purpose.theme" - }, - { - "project_id": 127054, - "project_name": "project/animal_shelter", - "filename": "animal_shelter.theme" - }, - { - "project_id": 138963, - "project_name": "project/feature_boost", - "filename": "feature_boost.theme" - }, - { - "project_id": 139702, - "project_name": "project/pets_clinic", - "filename": "pets_clinic.theme" - }, - { - "project_id": 144182, - "project_name": "project/lgms", - "filename": "themes/contrib/vani/vani.theme" - }, - { - "project_id": 157751, - "project_name": "project/diba_clean", - "filename": "diba_clean.theme" - }, - { - "project_id": 161998, - "project_name": "project/bootstrap3", - "filename": "src/ThemeSettings.php" - }, - { - "project_id": 170081, - "project_name": "project/nava", - "filename": "nava.theme" - }, - { - "project_id": 195589, - "project_name": "project/saar", - "filename": "saar.theme" - }, - { - "project_id": 200422, - "project_name": "project/uni", - "filename": "uni.theme" - } - ], - "ReplaceUserSessionNamePropertyRector": [ - { - "project_id": 1705, - "project_name": "project/synonyms", - "filename": "modules/synonyms_search/tests/src/Functional/AdminFunctionalityTest.php" - }, - { - "project_id": 1705, - "project_name": "project/synonyms", - "filename": "tests/src/Functional/AdminFunctionalityTest.php" - }, - { - "project_id": 3156, - "project_name": "project/field", - "filename": "session-memcache.inc" - }, - { - "project_id": 4956, - "project_name": "project/role_inheritance", - "filename": "src/EventSubscriber/CurrentUserRoleShim.php" - }, - { - "project_id": 7367, - "project_name": "project/turbo", - "filename": "contrib/turbo_session/session.db.inc" - }, - { - "project_id": 7367, - "project_name": "project/turbo", - "filename": "contrib/turbo_session/session.file.inc" - }, - { - "project_id": 7367, - "project_name": "project/turbo", - "filename": "contrib/turbo_session/session.memcache.inc" - }, - { - "project_id": 15952, - "project_name": "project/monitoring", - "filename": "config/optional/monitoring.sensor_config.user_session_logouts.yml" - }, - { - "project_id": 16138, - "project_name": "project/site_search_analytics", - "filename": "visitorsvoice_api.module" - }, - { - "project_id": 21075, - "project_name": "project/services_session_token_auth", - "filename": "README.txt" - }, - { - "project_id": 21075, - "project_name": "project/services_session_token_auth", - "filename": "services_session_token_auth.module" - }, - { - "project_id": 21579, - "project_name": "project/clu", - "filename": "clu.routing.yml" - }, - { - "project_id": 21579, - "project_name": "project/clu", - "filename": "src/Controller/GetUserSession.php" - }, - { - "project_id": 21579, - "project_name": "project/clu", - "filename": "src/Form/EndUserSessionConfirm.php" - }, - { - "project_id": 21828, - "project_name": "project/program", - "filename": "modules/program_session_user/config/install/views.view.user_session_schedule.yml" - }, - { - "project_id": 23632, - "project_name": "project/complex_workflow", - "filename": "src/Util/WorkflowUtil.php" - }, - { - "project_id": 23632, - "project_name": "project/complex_workflow", - "filename": "src/Util/WorkflowUtilInterface.php" - }, - { - "project_id": 50161, - "project_name": "project/dbee", - "filename": "src/Authentication/Provider/DbeeCookie.php" - }, - { - "project_id": 54674, - "project_name": "project/riddler", - "filename": "tests/src/Functional/RiddlerCaseSensitivityTest.php" - }, - { - "project_id": 55697, - "project_name": "project/acquia_commercemanager", - "filename": "modules/acm/src/User/AnonymousCommerceUserSession.php" - }, - { - "project_id": 55697, - "project_name": "project/acquia_commercemanager", - "filename": "modules/acm/src/User/CommerceUserSession.php" - }, - { - "project_id": 56521, - "project_name": "project/controller_annotations", - "filename": "tests/src/Kernel/KernelTestBase.php" - }, - { - "project_id": 56521, - "project_name": "project/controller_annotations", - "filename": "tests/src/Kernel/TestUserSession.php" - }, - { - "project_id": 57655, - "project_name": "project/miniorange_oauth_client", - "filename": "src/MoFeatures/MoUnoFeatures/MoOperations/MoUnoClientSettings.php" - }, - { - "project_id": 58047, - "project_name": "project/apigee_m10n", - "filename": "modules/apigee_m10n_teams/tests/src/Kernel/MonetizationTeamsKernelTestBase.php" - }, - { - "project_id": 58118, - "project_name": "project/restful", - "filename": "src/Authentication/AuthenticationManager.php" - }, - { - "project_id": 58118, - "project_name": "project/restful", - "filename": "src/Authentication/UserSessionState.php" - }, - { - "project_id": 58118, - "project_name": "project/restful", - "filename": "src/Authentication/UserSessionStateInterface.php" - }, - { - "project_id": 59468, - "project_name": "project/probo", - "filename": "src/EventSubscriber/UserSessionObjectSubscriber.php" - }, - { - "project_id": 59857, - "project_name": "project/acquia_contenthub", - "filename": "src/Session/ContentHubUserSession.php" - }, - { - "project_id": 59888, - "project_name": "project/paddle_selenium_tests", - "filename": "pages/Kanooh/Paddle/Utilities/UserSessionService.php" - }, - { - "project_id": 59888, - "project_name": "project/paddle_selenium_tests", - "filename": "tests/Kanooh/Paddle/App/Base/EnableDisableTestBase.php" - }, - { - "project_id": 59888, - "project_name": "project/paddle_selenium_tests", - "filename": "tests/Kanooh/Paddle/App/Base/InfoTestBase.php" - }, - { - "project_id": 59888, - "project_name": "project/paddle_selenium_tests", - "filename": "tests/Kanooh/Paddle/App/Calendar/CalendarTest.php" - }, - { - "project_id": 59888, - "project_name": "project/paddle_selenium_tests", - "filename": "tests/Kanooh/Paddle/App/CodexFlanders/PaneTest.php" - }, - { - "project_id": 59888, - "project_name": "project/paddle_selenium_tests", - "filename": "tests/Kanooh/Paddle/App/Comment/ConfigurationTest.php" - }, - { - "project_id": 59888, - "project_name": "project/paddle_selenium_tests", - "filename": "tests/Kanooh/Paddle/App/Comment/UserNotificationsTest.php" - }, - { - "project_id": 59888, - "project_name": "project/paddle_selenium_tests", - "filename": "tests/Kanooh/Paddle/App/Cultuurnet/CultuurnetTest.php" - }, - { - "project_id": 59888, - "project_name": "project/paddle_selenium_tests", - "filename": "tests/Kanooh/Paddle/App/CustomJavascript/ConfigurationTest.php" - }, - { - "project_id": 59888, - "project_name": "project/paddle_selenium_tests", - "filename": "tests/Kanooh/Paddle/App/CustomPageLayout/ConfigurationTest.php" - }, - { - "project_id": 59888, - "project_name": "project/paddle_selenium_tests", - "filename": "tests/Kanooh/Paddle/App/CustomPageLayout/CustomPageLayoutTest.php" - }, - { - "project_id": 59888, - "project_name": "project/paddle_selenium_tests", - "filename": "tests/Kanooh/Paddle/App/Embed/PaneTest.php" - }, - { - "project_id": 59888, - "project_name": "project/paddle_selenium_tests", - "filename": "tests/Kanooh/Paddle/App/FlyOutMenu/FlyOutMenuTest.php" - }, - { - "project_id": 59888, - "project_name": "project/paddle_selenium_tests", - "filename": "tests/Kanooh/Paddle/App/Formbuilder/ConfigurationTest.php" - }, - { - "project_id": 59888, - "project_name": "project/paddle_selenium_tests", - "filename": "tests/Kanooh/Paddle/App/Glossary/GlossaryPagerTest.php" - }, - { - "project_id": 59888, - "project_name": "project/paddle_selenium_tests", - "filename": "tests/Kanooh/Paddle/App/IncomingRSS/ConfigurationTest.php" - }, - { - "project_id": 59888, - "project_name": "project/paddle_selenium_tests", - "filename": "tests/Kanooh/Paddle/App/Multilingual/ConfigurationTest.php" - }, - { - "project_id": 59888, - "project_name": "project/paddle_selenium_tests", - "filename": "tests/Kanooh/Paddle/App/Multilingual/InterfaceLanguageTest.php" - }, - { - "project_id": 59888, - "project_name": "project/paddle_selenium_tests", - "filename": "tests/Kanooh/Paddle/App/Multilingual/LanguagePrefixTest.php" - }, - { - "project_id": 59888, - "project_name": "project/paddle_selenium_tests", - "filename": "tests/Kanooh/Paddle/App/Multilingual/MenuLanguageSyncTest.php" - }, - { - "project_id": 59888, - "project_name": "project/paddle_selenium_tests", - "filename": "tests/Kanooh/Paddle/App/Multilingual/MultilingualMenuItemsTest.php" - }, - { - "project_id": 59888, - "project_name": "project/paddle_selenium_tests", - "filename": "tests/Kanooh/Paddle/App/Multilingual/NewsOverviewTest.php" - }, - { - "project_id": 59888, - "project_name": "project/paddle_selenium_tests", - "filename": "tests/Kanooh/Paddle/App/Multilingual/Pane/PaneMultilingualTestBase.php" - }, - { - "project_id": 59888, - "project_name": "project/paddle_selenium_tests", - "filename": "tests/Kanooh/Paddle/App/Multilingual/TranslationLinksTest.php" - }, - { - "project_id": 59888, - "project_name": "project/paddle_selenium_tests", - "filename": "tests/Kanooh/Paddle/App/OpeningHours/ConfigurationTest.php" - }, - { - "project_id": 59888, - "project_name": "project/paddle_selenium_tests", - "filename": "tests/Kanooh/Paddle/App/OrganizationalUnit/OrganizationalUnitSearchTest.php" - }, - { - "project_id": 59888, - "project_name": "project/paddle_selenium_tests", - "filename": "tests/Kanooh/Paddle/App/PasswordPolicy/PasswordPolicyTest.php" - }, - { - "project_id": 59888, - "project_name": "project/paddle_selenium_tests", - "filename": "tests/Kanooh/Paddle/App/Poll/PollChartTest.php" - }, - { - "project_id": 59888, - "project_name": "project/paddle_selenium_tests", - "filename": "tests/Kanooh/Paddle/App/Poll/PollVoteTest.php" - }, - { - "project_id": 59888, - "project_name": "project/paddle_selenium_tests", - "filename": "tests/Kanooh/Paddle/App/ProtectedContent/ConfigurationTest.php" - }, - { - "project_id": 59888, - "project_name": "project/paddle_selenium_tests", - "filename": "tests/Kanooh/Paddle/App/ProtectedContent/ContentType/Base/ProtectedPageTestBase.php" - }, - { - "project_id": 59888, - "project_name": "project/paddle_selenium_tests", - "filename": "tests/Kanooh/Paddle/App/ProtectedContent/ProtectedContentTest.php" - }, - { - "project_id": 59888, - "project_name": "project/paddle_selenium_tests", - "filename": "tests/Kanooh/Paddle/App/Rate/ConfigurationTest.php" - }, - { - "project_id": 59888, - "project_name": "project/paddle_selenium_tests", - "filename": "tests/Kanooh/Paddle/App/Rate/RateTest.php" - }, - { - "project_id": 59888, - "project_name": "project/paddle_selenium_tests", - "filename": "tests/Kanooh/Paddle/App/ReCaptcha/ConfigurationTest.php" - }, - { - "project_id": 59888, - "project_name": "project/paddle_selenium_tests", - "filename": "tests/Kanooh/Paddle/App/RichFooter/RichFooterTest.php" - }, - { - "project_id": 59888, - "project_name": "project/paddle_selenium_tests", - "filename": "tests/Kanooh/Paddle/App/SimpleContact/PaneTest.php" - }, - { - "project_id": 59888, - "project_name": "project/paddle_selenium_tests", - "filename": "tests/Kanooh/Paddle/App/SimpleContact/SimpleContactTest.php" - }, - { - "project_id": 59888, - "project_name": "project/paddle_selenium_tests", - "filename": "tests/Kanooh/Paddle/App/SocialMedia/ContentType/Base/SocialMediaTestBase.php" - }, - { - "project_id": 59888, - "project_name": "project/paddle_selenium_tests", - "filename": "tests/Kanooh/Paddle/App/SplashPage/MenuLanguageSyncTest.php" - }, - { - "project_id": 59888, - "project_name": "project/paddle_selenium_tests", - "filename": "tests/Kanooh/Paddle/App/SplashPage/SplashPageTest.php" - }, - { - "project_id": 59888, - "project_name": "project/paddle_selenium_tests", - "filename": "tests/Kanooh/Paddle/App/TimeStamp/TimeStampTest.php" - }, - { - "project_id": 59888, - "project_name": "project/paddle_selenium_tests", - "filename": "tests/Kanooh/Paddle/App/XMLSitemap/ConfigurationTest.php" - }, - { - "project_id": 61809, - "project_name": "project/lw_groups", - "filename": "modules/lw_groups_node/lw_groups_node.module" - }, - { - "project_id": 61809, - "project_name": "project/lw_groups", - "filename": "modules/lw_groups_node/src/UserAccountHelpers.php" - }, - { - "project_id": 62055, - "project_name": "project/eus", - "filename": "README.txt" - }, - { - "project_id": 62055, - "project_name": "project/eus", - "filename": "composer.json" - }, - { - "project_id": 62055, - "project_name": "project/eus", - "filename": "eus.routing.yml" - }, - { - "project_id": 62378, - "project_name": "project/drupalru_d7", - "filename": "modules/user/tests/user_session_test.info" - }, - { - "project_id": 62378, - "project_name": "project/drupalru_d7", - "filename": "modules/user/tests/user_session_test.module" - }, - { - "project_id": 63624, - "project_name": "project/ubershopwish", - "filename": "modules/user/tests/user_session_test.info" - }, - { - "project_id": 63624, - "project_name": "project/ubershopwish", - "filename": "modules/user/tests/user_session_test.module" - }, - { - "project_id": 63757, - "project_name": "project/neon_api", - "filename": "src/NeonApi.php" - }, - { - "project_id": 64223, - "project_name": "project/publisso_gold", - "filename": "src/Form/publisso_goldUseridentity.php" - }, - { - "project_id": 73291, - "project_name": "project/acquia_perz", - "filename": "src/Session/AcquiaPerzUserSession.php" - }, - { - "project_id": 77509, - "project_name": "project/testproject4234", - "filename": "modules/user/tests/user_session_test.info" - }, - { - "project_id": 77509, - "project_name": "project/testproject4234", - "filename": "modules/user/tests/user_session_test.module" - }, - { - "project_id": 83095, - "project_name": "project/session_inspector", - "filename": "src/Controller/UserSessionInspector.php" - }, - { - "project_id": 104812, - "project_name": "project/scorm_field", - "filename": "scorm_field.install" - }, - { - "project_id": 150956, - "project_name": "project/session_management", - "filename": "session_management.links.menu.yml" - }, - { - "project_id": 150956, - "project_name": "project/session_management", - "filename": "session_management.routing.yml" - }, - { - "project_id": 150956, - "project_name": "project/session_management", - "filename": "src/Controller/UserSessionMonitor.php" - }, - { - "project_id": 150956, - "project_name": "project/session_management", - "filename": "src/EventSubscriber/SessionLimitSubscriber.php" - }, - { - "project_id": 150956, - "project_name": "project/session_management", - "filename": "src/Form/SessionSettingsForm.php" - }, - { - "project_id": 150956, - "project_name": "project/session_management", - "filename": "src/SessionMonitorInterface.php" - }, - { - "project_id": 154062, - "project_name": "project/acquia_vwo", - "filename": "modules/acquia_vwo_content/src/Session/AcquiaVwoContentUserSession.php" - }, - { - "project_id": 160629, - "project_name": "project/drupalfit", - "filename": "src/Plugin/FitCheck/AnonymousUserSession.php" - }, - { - "project_id": 167487, - "project_name": "project/search_api_exclude_lb", - "filename": "patches/search_api/search_api-processor_rendered-item_add_flag_to_user_session.patch" - }, - { - "project_id": 171755, - "project_name": "project/entity_mesh", - "filename": "src/DummyAccount.php" - }, - { - "project_id": 189447, - "project_name": "project/drupal_content_repository", - "filename": "note.txt" - } - ], - "ReplaceViewsProceduralFunctionsRector": [ - { - "project_id": 1730, - "project_name": "project/related_content", - "filename": "methods/related_content_views.module" - }, - { - "project_id": 2523, - "project_name": "project/quicktabs", - "filename": "src/Plugin/TabType/ViewContent.php" - }, - { - "project_id": 4485, - "project_name": "project/googlenews", - "filename": "googlenews.module" - }, - { - "project_id": 6486, - "project_name": "project/featured_content", - "filename": "featured_content.module" - }, - { - "project_id": 7093, - "project_name": "project/nodereference_basket", - "filename": "nodereference_basket.module" - }, - { - "project_id": 7241, - "project_name": "project/feeds_view_parser", - "filename": "FeedsViewFetcher.inc" - }, - { - "project_id": 7684, - "project_name": "project/internet_archive", - "filename": "internet_archive.module" - }, - { - "project_id": 7816, - "project_name": "project/hose_xml", - "filename": "hose_xml.module" - }, - { - "project_id": 7948, - "project_name": "project/highcharts", - "filename": "views/highcharts_views.options.inc" - }, - { - "project_id": 8691, - "project_name": "project/sensor_hub", - "filename": "feeds_plugins/feeds_atrium_reader_data_fetcher/FeedsAtriumReaderDataFetcher.inc" - }, - { - "project_id": 8691, - "project_name": "project/sensor_hub", - "filename": "feeds_plugins/feeds_shub_sensor_board_data_fetcher/FeedsShubSensorBoardDataFetcher.inc" - }, - { - "project_id": 9044, - "project_name": "project/taxonomy_display", - "filename": "handlers/associated/views.inc" - }, - { - "project_id": 9423, - "project_name": "project/student_signup", - "filename": "modules/s4_features/s4_core/s4_core.blocks.inc" - }, - { - "project_id": 9423, - "project_name": "project/student_signup", - "filename": "modules/s4_features/s4_core/s4_core.module" - }, - { - "project_id": 9770, - "project_name": "project/corporative_site", - "filename": "modules/contrib/views/CHANGELOG.txt" - }, - { - "project_id": 9770, - "project_name": "project/corporative_site", - "filename": "modules/contrib/views/includes/admin.inc" - }, - { - "project_id": 9770, - "project_name": "project/corporative_site", - "filename": "modules/contrib/views/views.module" - }, - { - "project_id": 9847, - "project_name": "project/b2b_store_solution", - "filename": "b2b_construction/modules/contrib/views/views.module" - }, - { - "project_id": 9979, - "project_name": "project/prometheus", - "filename": "classes/prometheus.class.php" - }, - { - "project_id": 10080, - "project_name": "project/rules_example", - "filename": "rules_example.rules.inc" - }, - { - "project_id": 10285, - "project_name": "project/time_tracker_simple", - "filename": "time_tracker_simple.module" - }, - { - "project_id": 10325, - "project_name": "project/product_reference_view", - "filename": "product_reference_view.module" - }, - { - "project_id": 10405, - "project_name": "project/onepagecv", - "filename": "modules/views/views.module" - }, - { - "project_id": 10452, - "project_name": "project/shopcart", - "filename": "shopcart.inc" - }, - { - "project_id": 10543, - "project_name": "project/featured_news_feature", - "filename": "featured_news.module" - }, - { - "project_id": 10703, - "project_name": "project/manymail", - "filename": "modules/views/manymail_views.module" - }, - { - "project_id": 11295, - "project_name": "project/entityform", - "filename": "entityform.admin.inc" - }, - { - "project_id": 12583, - "project_name": "project/deeplink", - "filename": "deeplink.rules.inc" - }, - { - "project_id": 12593, - "project_name": "project/commerce_payleap", - "filename": "commerce_payleap.rules.inc" - }, - { - "project_id": 13600, - "project_name": "project/pdfck", - "filename": "pdfck.generate.inc" - }, - { - "project_id": 13854, - "project_name": "project/openbadging", - "filename": "modules/openbadging_manage_backpack/openbadging_manage_backpack.module" - }, - { - "project_id": 13895, - "project_name": "project/ajaxnewcounter", - "filename": "ajaxnewcounter_view/ajaxnewcounter_view.module" - }, - { - "project_id": 14139, - "project_name": "project/courseplanner", - "filename": "courseplanner.module" - }, - { - "project_id": 14469, - "project_name": "project/background_audio", - "filename": "background_audio_block/background_audio_block.module" - }, - { - "project_id": 14693, - "project_name": "project/feeds_tamper_string2id", - "filename": "plugins/string2id.inc" - }, - { - "project_id": 16588, - "project_name": "project/at_theming", - "filename": "lib/ViewRender.php" - }, - { - "project_id": 16663, - "project_name": "project/ctools_view_access", - "filename": "plugins/access/view_access.inc" - }, - { - "project_id": 17416, - "project_name": "project/xml_export", - "filename": "xml_export.module" - }, - { - "project_id": 18092, - "project_name": "project/eform", - "filename": "src/Controller/EFormControllerBase.php" - }, - { - "project_id": 18927, - "project_name": "project/oa_folders", - "filename": "oa_folders.module" - }, - { - "project_id": 18927, - "project_name": "project/oa_folders", - "filename": "oa_folders_zip/oa_folders_zip.module" - }, - { - "project_id": 19162, - "project_name": "project/hunter", - "filename": "modules/magic_theme/hunter_test/src/Controller/HunterTestController.php" - }, - { - "project_id": 19499, - "project_name": "project/yaqut_epub_generator", - "filename": "modules/custom/yaqut/yaqut.module" - }, - { - "project_id": 19807, - "project_name": "project/wechat_views", - "filename": "wechat_views.module" - }, - { - "project_id": 20289, - "project_name": "project/commerce_checkout_products_list", - "filename": "commerce_checkout_products_list.checkout_pane.inc" - }, - { - "project_id": 20484, - "project_name": "project/mpub", - "filename": "modules/contrib/views/views.module" - }, - { - "project_id": 21898, - "project_name": "project/ectostar_standard", - "filename": "modules/custom/conf_eform/conf_eform.admin.inc" - }, - { - "project_id": 24037, - "project_name": "project/proconcom", - "filename": "proconcom.module" - }, - { - "project_id": 24420, - "project_name": "project/razoreye_biz", - "filename": "modules/contrib/schema_metatag/src/Plugin/metatag/Tag/SchemaItemListElementViewsBase.php" - }, - { - "project_id": 24795, - "project_name": "project/abookings", - "filename": "includes/queries.inc" - }, - { - "project_id": 24795, - "project_name": "project/abookings", - "filename": "modules/booking/includes/costs.inc" - }, - { - "project_id": 25097, - "project_name": "project/drupal_extra", - "filename": "README.md" - }, - { - "project_id": 25097, - "project_name": "project/drupal_extra", - "filename": "drupal_extra.module" - }, - { - "project_id": 25544, - "project_name": "project/sshop", - "filename": "sshop.theme" - }, - { - "project_id": 27445, - "project_name": "project/simple_sitemap_views", - "filename": "src/Plugin/simple_sitemap/UrlGenerator/ViewsUrlGenerator.php" - }, - { - "project_id": 27445, - "project_name": "project/simple_sitemap_views", - "filename": "src/SimpleSitemapViews.php" - }, - { - "project_id": 44107, - "project_name": "project/qtools_common", - "filename": "qtools.inc" - }, - { - "project_id": 47422, - "project_name": "project/twig_tweak", - "filename": "src/TwigTweakExtension.php" - }, - { - "project_id": 50230, - "project_name": "project/vfd", - "filename": "src/Controller/DownloadViewController.php" - }, - { - "project_id": 52158, - "project_name": "project/api", - "filename": "src/Formatter.php" - }, - { - "project_id": 52538, - "project_name": "project/content_packager", - "filename": "src/PluginForm/RestSourcePackage.php" - }, - { - "project_id": 53457, - "project_name": "project/openstory", - "filename": "src/Plugin/rest/EntityTypeResourceBase.php" - }, - { - "project_id": 54226, - "project_name": "project/gathercontent", - "filename": "gathercontent_ui/gathercontent_ui.install" - }, - { - "project_id": 56659, - "project_name": "project/ercore", - "filename": "modules/ercore_core/pages/ercore-integrity.inc" - }, - { - "project_id": 58383, - "project_name": "project/dvg", - "filename": "modules/features/dvg_topical/dvg_topical.module" - }, - { - "project_id": 58647, - "project_name": "project/views", - "filename": "views.module" - }, - { - "project_id": 58759, - "project_name": "project/outlayer", - "filename": "src/Plugin/views/style/OutlayerViewsIsotope.php" - }, - { - "project_id": 59005, - "project_name": "project/social", - "filename": "modules/social_features/social_album/social_album.module" - }, - { - "project_id": 59005, - "project_name": "project/social", - "filename": "themes/socialblue/src/Plugin/Preprocess/Node.php" - }, - { - "project_id": 59503, - "project_name": "project/degov", - "filename": "modules/degov_paragraph_slideshow/src/PreprocessParagraph.php" - }, - { - "project_id": 59644, - "project_name": "project/simple_sitemap", - "filename": "modules/simple_sitemap_views/src/Plugin/simple_sitemap/UrlGenerator/ViewsUrlGenerator.php" - }, - { - "project_id": 59644, - "project_name": "project/simple_sitemap", - "filename": "modules/simple_sitemap_views/src/SimpleSitemapViews.php" - }, - { - "project_id": 59873, - "project_name": "project/viewfield", - "filename": "src/Plugin/Field/FieldFormatter/ViewfieldFormatterDefault.php" - }, - { - "project_id": 59899, - "project_name": "project/facet_granular_date", - "filename": "src/Plugin/facets/url_processor/GranularDateQueryString.php" - }, - { - "project_id": 60038, - "project_name": "project/conference_suite", - "filename": "email/conference_email.pages.inc" - }, - { - "project_id": 60038, - "project_name": "project/conference_suite", - "filename": "schedule/conference_schedule.module" - }, - { - "project_id": 60215, - "project_name": "project/aeg", - "filename": "modules/views/views.module" - }, - { - "project_id": 60682, - "project_name": "project/delivery", - "filename": "src/DeliveryService.php" - }, - { - "project_id": 62331, - "project_name": "project/knowledge", - "filename": "src/Controller/CompetencyController.php" - }, - { - "project_id": 67002, - "project_name": "project/next_views_entity_reference", - "filename": "src/Plugin/Block/NextViewsEntityReferenceBlock.php" - }, - { - "project_id": 67217, - "project_name": "project/socialblue", - "filename": "src/Plugin/Preprocess/Node.php" - }, - { - "project_id": 81045, - "project_name": "project/custom_field", - "filename": "modules/custom_field_viewfield/src/Plugin/CustomField/FieldFormatter/ViewfieldDefaultFormatter.php" - }, - { - "project_id": 120874, - "project_name": "project/abinbev_gmap", - "filename": "src/PlaceInfoService.php" - }, - { - "project_id": 181203, - "project_name": "project/json_drop_api", - "filename": "modules/contrib/simple_sitemap/modules/simple_sitemap_views/src/Plugin/simple_sitemap/UrlGenerator/ViewsUrlGenerator.php" - }, - { - "project_id": 181203, - "project_name": "project/json_drop_api", - "filename": "modules/contrib/simple_sitemap/modules/simple_sitemap_views/src/SimpleSitemapViews.php" - }, - { - "project_id": 208312, - "project_name": "project/simple_sitemap_authenticated", - "filename": "src/Plugin/simple_sitemap/UrlGenerator/AuthenticatedViewsUrlGenerator.php" - } - ], - "StripMigrationDependenciesExpandArgRector": [ - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": ".gitignore" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/cache-install.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/database/log.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/database/sqlite/select.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/errors.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/filetransfer/local.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/filetransfer/ssh.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/install.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/lock.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/menu.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/password.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/farbtastic/farbtastic.js" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/jquery.js" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/powered-blue-80x15.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/powered-gray-135x42.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/ui/jquery.ui.selectable.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "misc/ui/jquery.ui.slider.min.js" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/aggregator/aggregator-feed-source.tpl.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/aggregator/tests/aggregator_test_atom.xml" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/block/block.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/block/block.js" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/color/color.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.api.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/comment/comment.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/contact/contact.admin.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/contact/contact.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/dashboard/dashboard.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/field.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/modules/list/list.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/modules/number/number.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/tests/field_test.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field/tests/field_test.storage.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/field_ui/field_ui.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/file/icons/application-x-executable.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/file/icons/text-html.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/file/icons/text-x-generic.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/file/icons/x-office-document.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/filter/filter.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/filter/filter.pages.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/forum/forum.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/help/help.api.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/locale/locale.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/node/node.tokens.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/node/tests/node_access_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/node/tests/node_test_exception.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/openid/tests/openid_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/path/path.admin.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/php/php.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/poll/poll-results.tpl.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/rdf/rdf.api.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/rdf/tests/rdf_test.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/search/search.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/search/search.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/search/tests/search_embedded_form.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/search/tests/search_extra_type.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/files/css_test_files/comment_hacks.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/files/css_test_files/comment_hacks.css.unoptimized.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/files/javascript-2.script" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/simpletest.js" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/actions.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/ajax_test.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/drupal_system_listing_incompatible_test/drupal_system_listing_incompatible_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/error.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/graph.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/image_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/password.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/path_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/requirements1_test.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/system_incompatible_core_version_dependencies_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/system_incompatible_module_version_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/theme_test.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/unicode.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/upgrade/drupal-6.upload.database.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/upgrade/drupal-6.user-password-token.database.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/simpletest/tests/upgrade/upgrade.comment.test" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/statistics/statistics.pages.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/syslog/syslog.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/syslog/syslog.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/system/system.archiver.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/system/system.queue.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/system/system.updater.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/taxonomy/taxonomy.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/tracker/tracker.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/trigger/trigger.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/update/tests/aaa_update_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/update/tests/drupal.0.xml" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/user/tests/user_form_test.info" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/user/tests/user_form_test.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/user/user.module" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/README.txt" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/bartik/css/print.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/bartik/images/buttons.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/garland/fix-ie.css" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/garland/logo.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/seven/images/ui-icons-ffffff-256x240.png" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/seven/page.tpl.php" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "themes/seven/style.css" - } - ], - "UseEntityTypeHasIntegerIdRector": [ - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "CREDITS.TXT" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "DICTIONARY.TXT" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "aggregator-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "archive-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "block-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "blog-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "blogapi-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "book-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "color-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "comment-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "common-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "contact-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "content_types-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "drupal-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "file-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "filter-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "form-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "forum-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "general.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "installer.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "locale-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "locale-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "menu-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "node-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "outros_modulos/gsitemap/gsitemap-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "outros_modulos/service_links/service_links-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "path-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "poll-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "profile-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "search-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "statistics-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "system-install.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "system-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "taxonomy-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "theme-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "throttle-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "tracker-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "unicode-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "upload-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "user-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "watchdog-module.po" - }, - { - "project_id": 289, - "project_name": "project/livediscussions", - "filename": "live_discussions.module" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "arrow-next-hover.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "arrow-prev-hover.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "arrow-prev.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "arrow-up-hover.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "background.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "block.tpl.php" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "box.tpl.php" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "forum-container.jpg" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "forum-link.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "header-a.jpg" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "icon-block.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "logo-active.jpg" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "logo.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "node.tpl.php" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "style.css" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "tabs-off.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "tabs-on.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "tabs-option-hover.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "tabs-option-on.png" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "README.txt" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "archive-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "block-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "blogapi-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "book-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "common-inc.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "drupal-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "file-inc.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "locale-inc.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "locale-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "menu-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "node-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "poll-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "profile-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "search-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "statistics-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "story-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "system-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "taxonomy-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "throttle-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "upload-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "user-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "watchdog-module.po" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "README.txt" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "ma_blogit/README.txt" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "ma_blogit/ma_blogit.module" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "ma_bzip2/ma_bzip2.module" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "ma_gzip/README.txt" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "ma_gzip/ma_gzip.module" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "mail_archive.mysql" - }, - { - "project_id": 310, - "project_name": "project/sitemenu", - "filename": "sitemenu.info" - }, - { - "project_id": 310, - "project_name": "project/sitemenu", - "filename": "sitemenu.module" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "binder.control" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "docs/binder-1.png" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "docs/binder_schema.png" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "docs/g6685.png" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "docs/rigid-vs-fluid.html" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "docs/state_machines_and_metadata.html" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "docs/text1709.png" - } - ], - "ViewsPluginHandlerManagerRector": [ - { - "project_id": 1138, - "project_name": "project/calendar", - "filename": "src/CalendarHelper.php" - }, - { - "project_id": 2651, - "project_name": "project/trash", - "filename": "src/Hook/TrashViewsHooks.php" - }, - { - "project_id": 3635, - "project_name": "project/views_exclude_previous", - "filename": "tests/src/Kernel/EntityRenderHistoryPluginTest.php" - }, - { - "project_id": 3917, - "project_name": "project/heartbeat", - "filename": "heartbeat.views.inc" - }, - { - "project_id": 4638, - "project_name": "project/visitors", - "filename": "tests/src/Kernel/Plugin/views/field/BounceRateTest.php" - }, - { - "project_id": 4638, - "project_name": "project/visitors", - "filename": "tests/src/Kernel/Plugin/views/field/BounceTest.php" - }, - { - "project_id": 4638, - "project_name": "project/visitors", - "filename": "tests/src/Kernel/Plugin/views/field/RefererTypeTest.php" - }, - { - "project_id": 4957, - "project_name": "project/views_natural_sort", - "filename": "src/Plugin/views/sort/Natural.php" - }, - { - "project_id": 6922, - "project_name": "project/views_linkarea", - "filename": "tests/src/Kernel/Plugin/LinkAreaTest.php" - }, - { - "project_id": 8296, - "project_name": "project/relation", - "filename": "src/Plugin/views/relationship/RelationRelationship.php" - }, - { - "project_id": 9324, - "project_name": "project/recurly", - "filename": "src/Plugin/views/relationship/EntityOwner.php" - }, - { - "project_id": 9324, - "project_name": "project/recurly", - "filename": "src/Plugin/views/relationship/RecurlyEntityOwnerReverse.php" - }, - { - "project_id": 13349, - "project_name": "project/visualization", - "filename": "src/Plugin/VisualizationHandlerManager.php" - }, - { - "project_id": 14784, - "project_name": "project/past", - "filename": "modules/past_db/src/Plugin/views/filter/EventArgumentData.php" - }, - { - "project_id": 15268, - "project_name": "project/visualization_d8", - "filename": "lib/Drupal/visualization/Plugin/VisualizationHandlerManager.php" - }, - { - "project_id": 16912, - "project_name": "project/views_selective_filters", - "filename": "src/Plugin/views/filter/Selective.php" - }, - { - "project_id": 21439, - "project_name": "project/quick_pages", - "filename": "src/EventSubscriber/RouteSubscriber.php" - }, - { - "project_id": 21439, - "project_name": "project/quick_pages", - "filename": "src/Form/QuickPageForm.php" - }, - { - "project_id": 21452, - "project_name": "project/grant", - "filename": "src/Plugin/views/relationship/GrantReverseUuid.php" - }, - { - "project_id": 21452, - "project_name": "project/grant", - "filename": "src/Plugin/views/relationship/GrantStandardUuid.php" - }, - { - "project_id": 21683, - "project_name": "project/migrate_views", - "filename": "migrate_views.services.yml" - }, - { - "project_id": 21683, - "project_name": "project/migrate_views", - "filename": "src/EventSubscriber/MigrationViewsSubscriber.php" - }, - { - "project_id": 21683, - "project_name": "project/migrate_views", - "filename": "src/MigrateViewsPluginManager.php" - }, - { - "project_id": 21683, - "project_name": "project/migrate_views", - "filename": "src/Plugin/migrate/process/d6/ViewsDisplays.php" - }, - { - "project_id": 21827, - "project_name": "project/chartjs", - "filename": "src/Plugin/ChartjsHandlerManager.php" - }, - { - "project_id": 22692, - "project_name": "project/discussions", - "filename": "discussions.module" - }, - { - "project_id": 23284, - "project_name": "project/rel_content", - "filename": "src/Plugin/RelatedContent/GroupRelatedContent.php" - }, - { - "project_id": 23284, - "project_name": "project/rel_content", - "filename": "src/Plugin/RelatedContent/TaxonomyTermRelatedContent.php" - }, - { - "project_id": 25294, - "project_name": "project/pankm", - "filename": "modules/contrib/calendar/src/CalendarHelper.php" - }, - { - "project_id": 25294, - "project_name": "project/pankm", - "filename": "modules/contrib/group/src/Plugin/views/relationship/GroupContentToEntity.php" - }, - { - "project_id": 25294, - "project_name": "project/pankm", - "filename": "modules/contrib/group/src/Plugin/views/relationship/GroupContentToEntityBase.php" - }, - { - "project_id": 25294, - "project_name": "project/pankm", - "filename": "modules/contrib/group/src/Plugin/views/relationship/GroupContentToEntityReverse.php" - }, - { - "project_id": 25294, - "project_name": "project/pankm", - "filename": "modules/contrib/group/src/Plugin/views/relationship/GroupToGroupContent.php" - }, - { - "project_id": 25577, - "project_name": "project/dut", - "filename": "modules/views/src/Plugin/views/display_extender/ThemeSuggestionsDisplayExtender.php" - }, - { - "project_id": 25985, - "project_name": "project/entity_domain_access", - "filename": "src/Plugin/views/filter/EntityDomainAccessCurrentAllFilter.php" - }, - { - "project_id": 26713, - "project_name": "project/tally", - "filename": "src/Plugin/views/filter/TallyFilter.php" - }, - { - "project_id": 26869, - "project_name": "project/friendship", - "filename": "tests/src/Kernel/ViewsFieldsTest.php" - }, - { - "project_id": 27744, - "project_name": "project/lms", - "filename": "src/Plugin/views/filter/LmsOrphanFilter.php" - }, - { - "project_id": 27744, - "project_name": "project/lms", - "filename": "src/Plugin/views/relationship/ClassMemberCourseStatus.php" - }, - { - "project_id": 27952, - "project_name": "project/template_entities", - "filename": "src/ViewsQueryAlter.php" - }, - { - "project_id": 28029, - "project_name": "project/entity_grants", - "filename": "src/Plugin/views/filter/EntityGrant.php" - }, - { - "project_id": 34868, - "project_name": "project/islandora", - "filename": "src/Plugin/views/filter/NodeIsIslandora.php" - }, - { - "project_id": 47825, - "project_name": "project/entity_hierarchy", - "filename": "src/Plugin/views/relationship/HierarchyRoot.php" - }, - { - "project_id": 50565, - "project_name": "project/custom_list", - "filename": "modules/custom_list_default/src/Plugin/SourceListPlugin/DefaultSourceListPlugin.php" - }, - { - "project_id": 50565, - "project_name": "project/custom_list", - "filename": "src/Plugin/views/style/CustomListBase.php" - }, - { - "project_id": 51085, - "project_name": "project/workbench_moderation", - "filename": "src/Plugin/views/filter/LatestRevision.php" - }, - { - "project_id": 51217, - "project_name": "project/tide_core", - "filename": "modules/tide_site_restriction/src/Plugin/views/filter/SubSitesFilter.php" - }, - { - "project_id": 51358, - "project_name": "project/entity_reference_uuid", - "filename": "src/Plugin/views/relationship/EntityReverseUuid.php" - }, - { - "project_id": 51358, - "project_name": "project/entity_reference_uuid", - "filename": "src/Plugin/views/relationship/EntityStandardUuid.php" - }, - { - "project_id": 51380, - "project_name": "project/views_entity_embed", - "filename": "src/Plugin/EmbedType/EmbedViews.php" - }, - { - "project_id": 52158, - "project_name": "project/api", - "filename": "src/Plugin/views/filter/ServiceTags.php" - }, - { - "project_id": 52161, - "project_name": "project/og", - "filename": "src/Plugin/views/relationship/GroupByGroupContentRelationship.php" - }, - { - "project_id": 52161, - "project_name": "project/og", - "filename": "src/Plugin/views/relationship/GroupContentByGroupRelationship.php" - }, - { - "project_id": 52281, - "project_name": "project/civicrm_entity", - "filename": "src/Plugin/views/filter/ActivityContactRecord.php" - }, - { - "project_id": 52281, - "project_name": "project/civicrm_entity", - "filename": "src/Plugin/views/relationship/CiviCrmActivityContact.php" - }, - { - "project_id": 52281, - "project_name": "project/civicrm_entity", - "filename": "src/Plugin/views/relationship/CiviCrmBridgeRelationshipBase.php" - }, - { - "project_id": 52281, - "project_name": "project/civicrm_entity", - "filename": "src/Plugin/views/relationship/EntityReverseLocation.php" - }, - { - "project_id": 52281, - "project_name": "project/civicrm_entity", - "filename": "src/Plugin/views/relationship/EntityReverseWebsiteType.php" - }, - { - "project_id": 52646, - "project_name": "project/shopify", - "filename": "src/Plugin/views/argument/ShopifyCollectionsArgument.php" - }, - { - "project_id": 52646, - "project_name": "project/shopify", - "filename": "src/Plugin/views/argument/ShopifyTagsArgument.php" - }, - { - "project_id": 52646, - "project_name": "project/shopify", - "filename": "src/Plugin/views/filter/ShopifyCollectionsFilter.php" - }, - { - "project_id": 52646, - "project_name": "project/shopify", - "filename": "src/Plugin/views/filter/ShopifyTagsFilter.php" - }, - { - "project_id": 53222, - "project_name": "project/metatag", - "filename": "metatag_views/src/MetatagViewsCachePluginManager.php" - }, - { - "project_id": 53388, - "project_name": "project/config_pages", - "filename": "tests/src/Kernel/ConfigPagesViewsPluginTest.php" - }, - { - "project_id": 53533, - "project_name": "project/opigno_learning_path", - "filename": "src/Plugin/views/filter/OpignoGroupMembershipStatus.php" - }, - { - "project_id": 54935, - "project_name": "project/translation_views", - "filename": "src/Plugin/views/field/TranslationCountField.php" - }, - { - "project_id": 54935, - "project_name": "project/translation_views", - "filename": "src/Plugin/views/filter/TranslationCountFilter.php" - }, - { - "project_id": 54935, - "project_name": "project/translation_views", - "filename": "src/TranslationCountTrait.php" - }, - { - "project_id": 55687, - "project_name": "project/tmgmt_deepl", - "filename": "modules/tmgmt_deepl_glossary/src/Plugin/views/filter/DeeplGlossaryEntries.php" - }, - { - "project_id": 56320, - "project_name": "project/plugin", - "filename": "plugin.plugin_type.yml" - }, - { - "project_id": 56855, - "project_name": "project/tmgmt", - "filename": "translators/tmgmt_local/src/Plugin/views/field/ItemCount.php" - }, - { - "project_id": 58768, - "project_name": "project/rng", - "filename": "src/Plugin/views/field/EventDateStringField.php" - }, - { - "project_id": 58768, - "project_name": "project/rng", - "filename": "src/Plugin/views/filter/SingleDateFilter.php" - }, - { - "project_id": 59005, - "project_name": "project/social", - "filename": "modules/custom/activity_viewer/src/Plugin/views/filter/ActivityExploreVisibilityAccess.php" - }, - { - "project_id": 59005, - "project_name": "project/social", - "filename": "modules/custom/activity_viewer/src/Plugin/views/filter/ActivityNotificationVisibilityAccess.php" - }, - { - "project_id": 59005, - "project_name": "project/social", - "filename": "modules/custom/activity_viewer/src/Plugin/views/filter/ActivityPostVisibilityAccess.php" - }, - { - "project_id": 59005, - "project_name": "project/social", - "filename": "modules/custom/gvbo/src/Access/GroupViewsBulkOperationsAccessTrait.php" - }, - { - "project_id": 59005, - "project_name": "project/social", - "filename": "modules/social_features/social_activity/modules/social_activity_filter/src/Plugin/views/filter/ActivityFilterTags.php" - }, - { - "project_id": 59005, - "project_name": "project/social", - "filename": "modules/social_features/social_event/src/Plugin/views/filter/EventDate.php" - }, - { - "project_id": 59005, - "project_name": "project/social", - "filename": "modules/social_features/social_event/src/Plugin/views/filter/EventEnrolledOrCreated.php" - }, - { - "project_id": 59005, - "project_name": "project/social", - "filename": "modules/social_features/social_profile/src/Plugin/views/field/ProfileEntitySortable.php" - }, - { - "project_id": 59133, - "project_name": "project/entityqueue", - "filename": "src/Plugin/views/relationship/EntityQueueRelationship.php" - }, - { - "project_id": 59279, - "project_name": "project/searchstax", - "filename": ".ignored-deprecations.txt" - }, - { - "project_id": 59375, - "project_name": "project/private_message", - "filename": "src/Plugin/views/filter/PrivateMessageThreadCleanHistory.php" - }, - { - "project_id": 59375, - "project_name": "project/private_message", - "filename": "src/Plugin/views/filter/PrivateMessageThreadIsUnread.php" - }, - { - "project_id": 59514, - "project_name": "project/ctools", - "filename": "modules/ctools_views/src/Plugin/Display/Block.php" - }, - { - "project_id": 59586, - "project_name": "project/monster_menus", - "filename": "src/Plugin/views/argument/MMTreeChildren.php" - }, - { - "project_id": 59586, - "project_name": "project/monster_menus", - "filename": "src/Plugin/views/relationship/SequentialJoin.php" - }, - { - "project_id": 59610, - "project_name": "project/group", - "filename": "src/Plugin/views/relationship/GroupRelationshipToEntityBase.php" - }, - { - "project_id": 59610, - "project_name": "project/group", - "filename": "src/Plugin/views/relationship/GroupToGroupRelationship.php" - }, - { - "project_id": 59714, - "project_name": "project/thunder", - "filename": "docs/developer-guide/migration/migrate-2-3.md" - }, - { - "project_id": 59739, - "project_name": "project/geolocation", - "filename": "modules/geolocation_geometry/src/Plugin/views/relationship/GeolocationGeometry.php" - }, - { - "project_id": 59747, - "project_name": "project/cms_content_sync", - "filename": "modules/cms_content_sync_views/src/Plugin/views/filter/SyncState.php" - }, - { - "project_id": 59814, - "project_name": "project/search_api", - "filename": "src/Plugin/views/field/SearchApiEntityField.php" - }, - { - "project_id": 59843, - "project_name": "project/bat", - "filename": "modules/bat_event/src/Plugin/views/filter/BatEventHandlerBlockingFilter.php" - }, - { - "project_id": 59849, - "project_name": "project/cloud", - "filename": "cloud.module" - }, - { - "project_id": 59849, - "project_name": "project/cloud", - "filename": "modules/cloud_service_providers/k8s/src/Plugin/views/argument/K8sNodeId.php" - }, - { - "project_id": 59849, - "project_name": "project/cloud", - "filename": "modules/cloud_service_providers/k8s/src/Plugin/views/relationship/K8sCloudProject.php" - }, - { - "project_id": 59956, - "project_name": "project/communication", - "filename": "src/Plugin/views/relationship/CommunicationLatestEventRelationship.php" - }, - { - "project_id": 60395, - "project_name": "project/muser", - "filename": "modules/custom/muser_project/src/Plugin/views/argument/AllowedMentor.php" - }, - { - "project_id": 60395, - "project_name": "project/muser", - "filename": "modules/custom/muser_system/src/Plugin/views/filter/UserActiveInRoundFilter.php" - }, - { - "project_id": 60682, - "project_name": "project/delivery", - "filename": "src/Plugin/views/relationship/WorkspaceRevision.php" - }, - { - "project_id": 60682, - "project_name": "project/delivery", - "filename": "src/Plugin/views/traits/CurrentWorkspaceViewsFilterTrait.php" - }, - { - "project_id": 60682, - "project_name": "project/delivery", - "filename": "src/Plugin/views/traits/EntityDeliveryStatusTrait.php" - }, - { - "project_id": 60695, - "project_name": "project/pub_options", - "filename": "src/Plugin/views/argument/PublishingOptionsContextualFilter.php" - }, - { - "project_id": 60695, - "project_name": "project/pub_options", - "filename": "src/Plugin/views/field/PublishingOptionsField.php" - }, - { - "project_id": 60695, - "project_name": "project/pub_options", - "filename": "src/Plugin/views/filter/PublishingOptionsFilters.php" - }, - { - "project_id": 61073, - "project_name": "project/meta_entity", - "filename": "meta_entity.install" - }, - { - "project_id": 61449, - "project_name": "project/moderation_team", - "filename": "src/Plugin/views/argument/ModerationTeam.php" - }, - { - "project_id": 62128, - "project_name": "project/hubspot_integration", - "filename": "src/Plugin/views/argument/HubspotTidDepth.php" - }, - { - "project_id": 62128, - "project_name": "project/hubspot_integration", - "filename": "src/Plugin/views/sort/HubspotTerms.php" - }, - { - "project_id": 62790, - "project_name": "project/ezcontent_api", - "filename": "modules/ezcontent_preview/src/Plugin/views/filter/AccessUnpublishedToken.php" - }, - { - "project_id": 62842, - "project_name": "project/untatu", - "filename": "src/Plugin/views/filter/Untatu.php" - }, - { - "project_id": 63118, - "project_name": "project/dplor", - "filename": "modules/custom/dyniva_permission/src/Plugin/views/filter/DynivaPermission.php" - }, - { - "project_id": 63669, - "project_name": "project/ggroup", - "filename": "src/Plugin/views/argument/GroupIdDepth.php" - }, - { - "project_id": 63790, - "project_name": "project/taxonomy_parents_index", - "filename": "src/Plugin/views/relationship/TaxonomyIndexReverseToParents.php" - }, - { - "project_id": 65320, - "project_name": "project/multilingual_plus", - "filename": "src/Plugin/views/field/LangcodeOriginalLanguage.php" - }, - { - "project_id": 66086, - "project_name": "project/opendevportal", - "filename": "modules/custom/odp_program/modules/odp_domain/src/Plugin/views/filter/ProgramDomainFilterPlugin.php" - }, - { - "project_id": 66142, - "project_name": "project/basket", - "filename": "src/Plugin/views/field/BasketOrderPrice.php" - }, - { - "project_id": 66142, - "project_name": "project/basket", - "filename": "src/Plugin/views/field/BasketPriceField.php" - }, - { - "project_id": 66142, - "project_name": "project/basket", - "filename": "src/Plugin/views/filter/BasketCartSid.php" - }, - { - "project_id": 66142, - "project_name": "project/basket", - "filename": "src/Plugin/views/filter/BasketFilterTitleField.php" - }, - { - "project_id": 66142, - "project_name": "project/basket", - "filename": "src/Plugin/views/filter/BasketIsAddCart.php" - }, - { - "project_id": 66142, - "project_name": "project/basket", - "filename": "src/Plugin/views/filter/BasketOrderFilter.php" - }, - { - "project_id": 66142, - "project_name": "project/basket", - "filename": "src/Plugin/views/filter/BasketProductInStosk.php" - }, - { - "project_id": 66142, - "project_name": "project/basket", - "filename": "src/Plugin/views/sort/BasketProductInStock.php" - }, - { - "project_id": 66142, - "project_name": "project/basket", - "filename": "src/Query/BasketQuery.php" - }, - { - "project_id": 68321, - "project_name": "project/views_migration", - "filename": "src/Plugin/MigrateViewsBaseTablePluginManager.php" - }, - { - "project_id": 68321, - "project_name": "project/views_migration", - "filename": "src/Plugin/MigrateViewsPluginManager.php" - }, - { - "project_id": 68321, - "project_name": "project/views_migration", - "filename": "src/Plugin/MigrateViewsPluginPluginManager.php" - }, - { - "project_id": 68321, - "project_name": "project/views_migration", - "filename": "src/Plugin/migrate/source/BaseViewsMigration.php" - }, - { - "project_id": 68321, - "project_name": "project/views_migration", - "filename": "src/Plugin/migrate/source/ViewsMigrationInterface.php" - }, - { - "project_id": 72178, - "project_name": "project/field_encrypt_searchable", - "filename": "src/Plugin/views/filter/EncryptedFieldViewsFilter.php" - }, - { - "project_id": 73073, - "project_name": "project/opigno_social", - "filename": "src/Plugin/views/filter/BadgeNameFilter.php" - }, - { - "project_id": 74275, - "project_name": "project/views_override_viewmode", - "filename": "src/Plugin/Display/Block.php" - }, - { - "project_id": 78499, - "project_name": "project/usage_data", - "filename": "src/Plugin/views/field/UsageDataField.php" - }, - { - "project_id": 78499, - "project_name": "project/usage_data", - "filename": "src/Plugin/views/sort/UsageDataSort.php" - }, - { - "project_id": 84617, - "project_name": "project/acquia_dam", - "filename": "src/Plugin/views/field/AvailabilityPublishingStatusCompare.php" - }, - { - "project_id": 84617, - "project_name": "project/acquia_dam", - "filename": "src/Plugin/views/field/DamAssetUsageCounter.php" - }, - { - "project_id": 84617, - "project_name": "project/acquia_dam", - "filename": "src/Plugin/views/filter/DamAssetFilter.php" - }, - { - "project_id": 86013, - "project_name": "project/content_moderation_node_grants", - "filename": "src/Plugin/views/filter/UpdatableFilter.php" - }, - { - "project_id": 87638, - "project_name": "project/group_entity", - "filename": "src/Plugin/views/relationship/GroupContentToEntityBase.php" - }, - { - "project_id": 87638, - "project_name": "project/group_entity", - "filename": "src/Plugin/views/relationship/GroupToGroupContent.php" - }, - { - "project_id": 88438, - "project_name": "project/entity_distribution", - "filename": "modules/entity_distribution_client/src/Plugin/views/filter/EntitySharedSource.php" - }, - { - "project_id": 88882, - "project_name": "project/group_domain", - "filename": "src/Plugin/views/filter/DomainGroupCurrentGroup.php" - }, - { - "project_id": 96166, - "project_name": "project/media_filter", - "filename": "src/Plugin/views/filter/MediaFilterEntity.php" - }, - { - "project_id": 96282, - "project_name": "project/access_policy", - "filename": "src/Plugin/views/AccessPolicyJoinViewsHandlerTrait.php" - }, - { - "project_id": 98695, - "project_name": "project/social_group_types", - "filename": "src/Plugin/views/filter/SocialGroupTypesGroupNodeAccess.php" - }, - { - "project_id": 107494, - "project_name": "project/group_welcome_message", - "filename": "src/Plugin/views/relationship/GroupWelcomeMessageRelationship.php" - }, - { - "project_id": 108783, - "project_name": "project/views_moderation_state_weights", - "filename": "src/Plugin/views/ModerationStateWeightJoinViewsHandlerTrait.php" - }, - { - "project_id": 109268, - "project_name": "project/group_media_library_extra", - "filename": "src/MediaItemsSource/MediaItemsSourceBase.php" - }, - { - "project_id": 109268, - "project_name": "project/group_media_library_extra", - "filename": "src/MediaLibraryWidgetViewsQueryAlter.php" - }, - { - "project_id": 109268, - "project_name": "project/group_media_library_extra", - "filename": "src/Plugin/GroupMediaLibraryExtra/MediaItemsSource/OwnMediaItems.php" - }, - { - "project_id": 109993, - "project_name": "project/social_lms_integrator", - "filename": "modules/social_lms_integrator_iteration_enrollment_notify/src/Plugin/views/relationship/IterationWelcomeMessageRelationship.php" - }, - { - "project_id": 110398, - "project_name": "project/views_sql_twig_fields", - "filename": "modules/views_sql_twig_relationship/src/Plugin/views/relationship/ViewsSqlTwigFieldsRelationship.php" - }, - { - "project_id": 116041, - "project_name": "project/nodehive_core", - "filename": "src/Plugin/views/filter/UserSpacesFilter.php" - }, - { - "project_id": 124420, - "project_name": "project/service", - "filename": "src/JoinManagerTrait.php" - }, - { - "project_id": 128959, - "project_name": "project/view_filter_promotion", - "filename": "view_filter_promotion.module" - }, - { - "project_id": 144795, - "project_name": "project/expirable_content", - "filename": "src/Plugin/views/ExpirableContentJoinViewsHandlerTrait.php" - }, - { - "project_id": 145116, - "project_name": "project/diboo_core", - "filename": "src/Hook/FinishedChains.php" - }, - { - "project_id": 147502, - "project_name": "project/media_views_filter", - "filename": "src/Plugin/views/filter/MediaFileNameFilter.php" - }, - { - "project_id": 151194, - "project_name": "project/a12s_locations", - "filename": "a12s_locations.module" - }, - { - "project_id": 151194, - "project_name": "project/a12s_locations", - "filename": "src/Commands/A12sLocationsCommands.php" - }, - { - "project_id": 151194, - "project_name": "project/a12s_locations", - "filename": "src/Form/CacheUpdateConfirmForm.php" - }, - { - "project_id": 152311, - "project_name": "project/more_fields", - "filename": "src/Plugin/views/filter/MoreFieldsBaseFilter.php" - }, - { - "project_id": 154509, - "project_name": "project/consent_management", - "filename": "src/Plugin/views/filter/ConsentStateFilter.php" - }, - { - "project_id": 158891, - "project_name": "project/ai_agents", - "filename": "modules/ai_agents_extra/src/Plugin/AiAgent/ViewsAgent.php" - }, - { - "project_id": 161548, - "project_name": "project/mdp", - "filename": "src/Plugin/views/filter/MDPFilter.php" - }, - { - "project_id": 176774, - "project_name": "project/unused_files_delete", - "filename": "src/Plugin/views/filter/UnusedFileFilter.php" - }, - { - "project_id": 179884, - "project_name": "project/unused_media_filter", - "filename": "src/Plugin/views/filter/UnusedMediaFilter.php" - }, - { - "project_id": 181203, - "project_name": "project/json_drop_api", - "filename": "modules/contrib/ctools/modules/ctools_views/src/Plugin/Display/Block.php" - }, - { - "project_id": 181203, - "project_name": "project/json_drop_api", - "filename": "modules/contrib/metatag/metatag_views/src/MetatagViewsCachePluginManager.php" - }, - { - "project_id": 203641, - "project_name": "project/itunes_rss", - "filename": "tests/src/Kernel/ItunesRssPluginDiscoveryTest.php" - } - ], - "ReplaceModuleHandlerGetNameRector": [ - { - "project_id": 1568, - "project_name": "project/schema", - "filename": "src/SchemaModuleHandler.php" - }, - { - "project_id": 9292, - "project_name": "project/flow", - "filename": "src/Helpers/ModuleHandlerTrait.php" - }, - { - "project_id": 16100, - "project_name": "project/disable_modules", - "filename": "src/Extension/ModuleInstallerDisableModules.php" - }, - { - "project_id": 16108, - "project_name": "project/hookalyzer", - "filename": "lib/Drupal/hookalyzer/ModuleHandler.php" - }, - { - "project_id": 17443, - "project_name": "project/console", - "filename": "src/Command/Update/ExecuteCommand.php" - }, - { - "project_id": 18842, - "project_name": "project/service_container", - "filename": "lib/Drupal/service_container/Tests/ModuleHandlerTest.php" - }, - { - "project_id": 20087, - "project_name": "project/hooks", - "filename": "src/ModuleHandler.php" - }, - { - "project_id": 21156, - "project_name": "project/rocket_chat", - "filename": "modules/rocket_chat_api/src/RocketChat/Drupal8Config.php" - }, - { - "project_id": 21156, - "project_name": "project/rocket_chat", - "filename": "modules/rocket_chat_api_test/src/Form/ApiTestForm.php" - }, - { - "project_id": 21156, - "project_name": "project/rocket_chat", - "filename": "modules/rocket_chat_group/src/Plugin/Block/RocketChatChannelBlock.php" - }, - { - "project_id": 21609, - "project_name": "project/confi", - "filename": "src/ConfigImporterService.php" - }, - { - "project_id": 23010, - "project_name": "project/message_private", - "filename": "src/Plugin/Block/MessageHistory.php" - }, - { - "project_id": 23034, - "project_name": "project/pki_ra", - "filename": "src/Plugin/EoiProgress/EoiSourcesProgressManager.php" - }, - { - "project_id": 23354, - "project_name": "project/commerce_currency_switcher", - "filename": "src/Resolver/MulticurrencyPriceResolver.php" - }, - { - "project_id": 23726, - "project_name": "project/entity_keyvalue", - "filename": "src/EntityKeyValueStoreProvider.php" - }, - { - "project_id": 24064, - "project_name": "project/social_media_integration", - "filename": "src/Form/GooglePlusSettingsForm.php" - }, - { - "project_id": 24064, - "project_name": "project/social_media_integration", - "filename": "src/Form/LinkedInSettingsForm.php" - }, - { - "project_id": 24064, - "project_name": "project/social_media_integration", - "filename": "src/Form/PinterestSettingsForm.php" - }, - { - "project_id": 24064, - "project_name": "project/social_media_integration", - "filename": "src/Form/SjiSocialConnectSettingsForm.php" - }, - { - "project_id": 24220, - "project_name": "project/message_thread", - "filename": "src/Plugin/Block/MessageThreadHistory.php" - }, - { - "project_id": 24364, - "project_name": "project/domain_simple_sitemap", - "filename": "src/DomainSimpleSitemapGenerator.php" - }, - { - "project_id": 24420, - "project_name": "project/razoreye_biz", - "filename": "modules/contrib/simple_sitemap/src/Plugin/simple_sitemap/UrlGenerator/ArbitraryUrlGenerator.php" - }, - { - "project_id": 24449, - "project_name": "project/ppoidc", - "filename": "src/Claims.php" - }, - { - "project_id": 25315, - "project_name": "project/auto_alter", - "filename": "src/Form/AutoAlterSettingsForm.php" - }, - { - "project_id": 25865, - "project_name": "project/image_moderate", - "filename": "src/Form/ImageModerateSettingsForm.php" - }, - { - "project_id": 26017, - "project_name": "project/hook_manager", - "filename": "src/Service/HookManagerModuleHandler.php" - }, - { - "project_id": 27005, - "project_name": "project/social_post_video", - "filename": "src/Plugin/Block/PostVideoBlock.php" - }, - { - "project_id": 27005, - "project_name": "project/social_post_video", - "filename": "src/Plugin/Block/PostVideoGroupBlock.php" - }, - { - "project_id": 27005, - "project_name": "project/social_post_video", - "filename": "src/Plugin/Block/PostVideoProfileBlock.php" - }, - { - "project_id": 27712, - "project_name": "project/client_config_care", - "filename": "tests/src/Behat/context/ModuleContext.php" - }, - { - "project_id": 27845, - "project_name": "project/social_auth_itsme", - "filename": "src/ItsmeAuthManager.php" - }, - { - "project_id": 34868, - "project_name": "project/islandora", - "filename": "src/Plugin/Action/IndexMediasParentNodeInSearchApi.php" - }, - { - "project_id": 34868, - "project_name": "project/islandora", - "filename": "src/Plugin/Action/IndexNodeInSearchApi.php" - }, - { - "project_id": 47231, - "project_name": "project/module_maker", - "filename": "src/CreateFiles.php" - }, - { - "project_id": 49470, - "project_name": "project/config_entity_revisions", - "filename": "src/ConfigEntityRevisionsOverviewFormBase.php" - }, - { - "project_id": 49470, - "project_name": "project/config_entity_revisions", - "filename": "src/ConfigEntityRevisionsOverviewFormBaseInterface.php" - }, - { - "project_id": 49723, - "project_name": "project/mutual_credit", - "filename": "modules/credcom/src/Form/SettingsForm.php" - }, - { - "project_id": 49725, - "project_name": "project/drd", - "filename": "src/Crypt/BaseMethod.php" - }, - { - "project_id": 50434, - "project_name": "project/slack_receive", - "filename": "src/Plugin/rest/resource/SlashCommandResponse.php" - }, - { - "project_id": 51352, - "project_name": "project/autosave_form", - "filename": "src/EmptyAlter/Extension/ModuleHandlerEmptyAlter.php" - }, - { - "project_id": 51772, - "project_name": "project/onlyone", - "filename": "src/OnlyOneModuleHandler.php" - }, - { - "project_id": 54247, - "project_name": "project/contacts", - "filename": "modules/user_dashboard/src/Controller/UserDashboardController.php" - }, - { - "project_id": 54247, - "project_name": "project/contacts", - "filename": "modules/user_dashboard/src/Plugin/Derivative/UserDashboardLocalTask.php" - }, - { - "project_id": 55697, - "project_name": "project/acquia_commercemanager", - "filename": "modules/acm_sku/src/CategoryManager.php" - }, - { - "project_id": 55755, - "project_name": "project/social_hub", - "filename": "src/Utils/ModuleLibrariesResolver.php" - }, - { - "project_id": 56359, - "project_name": "project/languagefield", - "filename": "src/Plugin/Field/FieldFormatter/LanguageFormatter.php" - }, - { - "project_id": 56719, - "project_name": "project/multiversion", - "filename": "src/Entity/Storage/Sql/NodeStorage.php" - }, - { - "project_id": 56719, - "project_name": "project/multiversion", - "filename": "src/EventSubscriber/FileUsageMigrateSubscriber.php" - }, - { - "project_id": 58193, - "project_name": "project/tripal", - "filename": "tripal_chado/src/Services/ChadoFieldDebugger.php" - }, - { - "project_id": 58608, - "project_name": "project/lightning_core", - "filename": "modules/lightning_page/tests/src/Kernel/InstallTest.php" - }, - { - "project_id": 59035, - "project_name": "project/lightning_layout", - "filename": "modules/lightning_landing_page/tests/src/Kernel/InstallTest.php" - }, - { - "project_id": 59179, - "project_name": "project/nbox", - "filename": "modules/nbox_ui/src/Form/ThreadActionForm.php" - }, - { - "project_id": 59179, - "project_name": "project/nbox", - "filename": "src/Plugin/MailboxBase.php" - }, - { - "project_id": 59503, - "project_name": "project/degov", - "filename": "modules/degov_social_media_instagram/src/Plugin/Block/InstagramFeedBlock.php" - }, - { - "project_id": 60502, - "project_name": "project/simplifying", - "filename": "src/Services/EntityFields.php" - }, - { - "project_id": 60502, - "project_name": "project/simplifying", - "filename": "src/Services/Toolbar.php" - }, - { - "project_id": 60625, - "project_name": "project/gearbox", - "filename": "src/Extension/HandlerFactory.php" - }, - { - "project_id": 61069, - "project_name": "project/audit_monitoring", - "filename": "src/Plugin/monitoring/SensorPlugin/MaillogConfig.php" - }, - { - "project_id": 61092, - "project_name": "project/views_extender", - "filename": "modules/views_extender_eca/src/Plugin/views/argument_default/ArgumentDefaultEca.php" - }, - { - "project_id": 62017, - "project_name": "project/nodeinfo", - "filename": "src/Controller/NodeInfoController.php" - }, - { - "project_id": 62418, - "project_name": "project/pager_serializer", - "filename": "tests/src/Unit/Plugin/views/style/SerializerTest.php" - }, - { - "project_id": 62421, - "project_name": "project/sitemorse_lite", - "filename": "src/Sitemorse/Checker.php" - }, - { - "project_id": 62687, - "project_name": "project/workflow_extras", - "filename": "src/Plugin/Block/ContentModerationBlock.php" - }, - { - "project_id": 62772, - "project_name": "project/file_update", - "filename": "src/Plugin/FileUpdate/FileUpdateImageField.php" - }, - { - "project_id": 63108, - "project_name": "project/licenses", - "filename": "src/Plugin/License/Scanner/ModuleLibraries.php" - }, - { - "project_id": 63559, - "project_name": "project/layoutcomponents", - "filename": "src/LcPage.php" - }, - { - "project_id": 63797, - "project_name": "project/eventer", - "filename": "src/Decorator/ModuleHandlerDecorator.php" - }, - { - "project_id": 63976, - "project_name": "project/simple_oauth_facebook_connect", - "filename": "src/Plugin/Oauth2Grant/Facebook.php" - }, - { - "project_id": 64084, - "project_name": "project/entity_track", - "filename": "src/EntityTrackManager.php" - }, - { - "project_id": 64348, - "project_name": "project/simple_oauth_google_connect", - "filename": "src/Plugin/Oauth2Grant/Google.php" - }, - { - "project_id": 64520, - "project_name": "project/robolytix", - "filename": "src/Form/RobolytixAdminSettingsForm.php" - }, - { - "project_id": 66091, - "project_name": "project/rmkv", - "filename": "src/Commands/RemoveKeyValueCommands.php" - }, - { - "project_id": 66142, - "project_name": "project/basket", - "filename": "src/ModuleHandler.php" - }, - { - "project_id": 69687, - "project_name": "project/sanitize_pii", - "filename": "src/Commands/sql/SanitizeTelephoneCommands.php" - }, - { - "project_id": 69954, - "project_name": "project/date_augmenter", - "filename": "src/Plugin/ConfigurablePluginBase.php" - }, - { - "project_id": 73212, - "project_name": "project/worldmap", - "filename": "src/MapHelper.php" - }, - { - "project_id": 73813, - "project_name": "project/toast_messages", - "filename": "src/ToastMessagesManager.php" - }, - { - "project_id": 81033, - "project_name": "project/cookies_module_handler", - "filename": "cookies_module_handler.module" - }, - { - "project_id": 81278, - "project_name": "project/migrate_visualize", - "filename": "src/Controller/ListingController.php" - }, - { - "project_id": 81278, - "project_name": "project/migrate_visualize", - "filename": "src/Form/VisualizeMigrationSwitcherForm.php" - }, - { - "project_id": 82252, - "project_name": "project/reassign_user_content", - "filename": "src/Form/AssignAuthorForm.php" - }, - { - "project_id": 82962, - "project_name": "project/hook_event", - "filename": "src/Extension/ModuleHandler.php" - }, - { - "project_id": 83449, - "project_name": "project/sitewide_alerts", - "filename": "src/SiteAlertService.php" - }, - { - "project_id": 86809, - "project_name": "project/social_auth_tiktok_decouple", - "filename": "src/Plugin/Oauth2Grant/Tiktok.php" - }, - { - "project_id": 86956, - "project_name": "project/social_auth_apple_decouple", - "filename": "src/Plugin/Oauth2Grant/Apple.php" - }, - { - "project_id": 88384, - "project_name": "project/uninstall_unexisting", - "filename": "src/Service/ModuleHandlerOverride.php" - }, - { - "project_id": 92961, - "project_name": "project/asset_autoload", - "filename": "src/SuggestionHelper.php" - }, - { - "project_id": 93199, - "project_name": "project/function_autoload", - "filename": "src/FunctionAutoloader.php" - }, - { - "project_id": 93499, - "project_name": "project/test_helpers", - "filename": "src/Stub/ModuleHandlerStub.php" - }, - { - "project_id": 104004, - "project_name": "project/ws_event", - "filename": "src/EventDataHelper.php" - }, - { - "project_id": 105011, - "project_name": "project/nostr_id_nip05", - "filename": "src/Controller/NostrIdNip05Controller.php" - }, - { - "project_id": 110798, - "project_name": "project/hook_profiler", - "filename": "src/HookProfilerModuleHandler.php" - }, - { - "project_id": 115956, - "project_name": "project/pwbi", - "filename": "modules/pwbi_banner/src/DisclaimerBanner.php" - }, - { - "project_id": 124420, - "project_name": "project/service", - "filename": "src/ModuleHandlerTrait.php" - }, - { - "project_id": 132406, - "project_name": "project/nitropack", - "filename": "src/Form/ConfigForm.php" - }, - { - "project_id": 162094, - "project_name": "project/localist_drupal", - "filename": "src/Controller/LocalistExample.php" - }, - { - "project_id": 166002, - "project_name": "project/bibliocommons", - "filename": "src/Plugin/Field/FieldFormatter/BookListFormatter.php" - }, - { - "project_id": 170818, - "project_name": "project/ai_upgrade_assistant", - "filename": "src/Controller/UpdateController.php" - }, - { - "project_id": 180259, - "project_name": "project/schema_form", - "filename": "tests/modules/schema_form_test/src/Form/BlockContentTypeForm.php" - }, - { - "project_id": 190652, - "project_name": "project/orchestration", - "filename": "modules/ai_function/src/ServicesProvider.php" - } - ], - "ReplaceRebuildThemeDataRector": [ - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "CREDITS.TXT" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "DICTIONARY.TXT" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "aggregator-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "archive-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "block-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "blog-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "blogapi-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "book-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "color-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "comment-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "common-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "contact-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "content_types-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "drupal-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "file-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "filter-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "form-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "forum-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "general.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "installer.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "locale-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "locale-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "menu-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "node-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "outros_modulos/gsitemap/gsitemap-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "outros_modulos/service_links/service_links-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "path-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "poll-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "profile-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "search-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "statistics-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "system-install.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "system-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "taxonomy-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "theme-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "throttle-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "tracker-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "unicode-inc.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "upload-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "user-module.po" - }, - { - "project_id": 284, - "project_name": "project/pt-br", - "filename": "watchdog-module.po" - }, - { - "project_id": 289, - "project_name": "project/livediscussions", - "filename": "live_discussions.module" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "arrow-next-hover.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "arrow-prev-hover.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "arrow-prev.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "arrow-up-hover.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "background.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "block.tpl.php" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "box.tpl.php" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "forum-container.jpg" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "forum-link.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "header-a.jpg" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "icon-block.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "logo-active.jpg" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "logo.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "node.tpl.php" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "style.css" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "tabs-off.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "tabs-on.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "tabs-option-hover.png" - }, - { - "project_id": 294, - "project_name": "project/pushbutton_phptemplate", - "filename": "tabs-option-on.png" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "README.txt" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "archive-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "block-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "blogapi-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "book-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "common-inc.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "drupal-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "file-inc.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "locale-inc.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "locale-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "menu-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "node-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "poll-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "profile-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "search-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "statistics-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "story-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "system-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "taxonomy-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "throttle-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "upload-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "user-module.po" - }, - { - "project_id": 301, - "project_name": "project/bg", - "filename": "watchdog-module.po" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "README.txt" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "ma_blogit/README.txt" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "ma_blogit/ma_blogit.module" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "ma_bzip2/ma_bzip2.module" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "ma_gzip/README.txt" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "ma_gzip/ma_gzip.module" - }, - { - "project_id": 303, - "project_name": "project/mail_archive", - "filename": "mail_archive.mysql" - }, - { - "project_id": 310, - "project_name": "project/sitemenu", - "filename": "sitemenu.info" - }, - { - "project_id": 310, - "project_name": "project/sitemenu", - "filename": "sitemenu.module" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "binder.control" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "docs/binder-1.png" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "docs/binder_schema.png" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "docs/g6685.png" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "docs/rigid-vs-fluid.html" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "docs/state_machines_and_metadata.html" - }, - { - "project_id": 316, - "project_name": "project/binder", - "filename": "docs/text1709.png" - } - ], - "ReplaceRequestTimeConstantRector": [ - { - "project_id": 191, - "project_name": "project/inactive_user", - "filename": "inactive_user.module" - }, - { - "project_id": 1005, - "project_name": "project/node_expire", - "filename": "node_expire.rules.inc" - }, - { - "project_id": 1952, - "project_name": "project/one_time_login", - "filename": "views/views_handler_field_one_time_login_expiry.inc" - }, - { - "project_id": 1978, - "project_name": "project/brilliant_gallery", - "filename": "brilliant_gallery_cron.inc" - }, - { - "project_id": 6870, - "project_name": "project/settings_audit_log", - "filename": "settings_audit_log.module" - }, - { - "project_id": 7310, - "project_name": "project/views_content_cache", - "filename": "views/views_content_cache_plugin_cache.inc" - }, - { - "project_id": 8618, - "project_name": "project/cache_backport", - "filename": "patches/memcache.inc-7.x-1.0-beta3-variable_set.patch" - }, - { - "project_id": 10594, - "project_name": "project/node_announce", - "filename": "node_announce_api.inc" - }, - { - "project_id": 10594, - "project_name": "project/node_announce", - "filename": "tests/node_announce_create.test" - }, - { - "project_id": 10594, - "project_name": "project/node_announce", - "filename": "tests/node_announce_cron.test" - }, - { - "project_id": 11394, - "project_name": "project/context_date", - "filename": "context_date.test" - }, - { - "project_id": 11565, - "project_name": "project/ua_cache_bypass", - "filename": "drush/ua_cache_bypass.drush.inc" - }, - { - "project_id": 11635, - "project_name": "project/shareaholic", - "filename": "cache.php" - }, - { - "project_id": 12520, - "project_name": "project/engagement", - "filename": "engagement.test" - }, - { - "project_id": 13021, - "project_name": "project/adbc", - "filename": "adbc.cache.inc" - }, - { - "project_id": 13021, - "project_name": "project/adbc", - "filename": "adbc.test" - }, - { - "project_id": 13111, - "project_name": "project/ddcla", - "filename": "public/includes/session.inc" - }, - { - "project_id": 13125, - "project_name": "project/transcribe_distribution", - "filename": "includes/session.inc" - }, - { - "project_id": 13452, - "project_name": "project/memory_profiler", - "filename": "memcache_profiler.inc" - }, - { - "project_id": 13458, - "project_name": "project/random_weight", - "filename": "includes/frequencies.inc" - }, - { - "project_id": 13628, - "project_name": "project/wem", - "filename": "wem.test" - }, - { - "project_id": 13635, - "project_name": "project/commerce_booking", - "filename": "commerce_booking.queue.inc" - }, - { - "project_id": 13758, - "project_name": "project/geckoboard_push", - "filename": "geckoboard_push.module" - }, - { - "project_id": 14446, - "project_name": "project/tr_kurulum", - "filename": "includes/session.inc" - }, - { - "project_id": 14506, - "project_name": "project/tb_blog_starter", - "filename": "includes/session.inc" - }, - { - "project_id": 14507, - "project_name": "project/tb_events_starter", - "filename": "includes/session.inc" - }, - { - "project_id": 14510, - "project_name": "project/tb_methys_starter", - "filename": "includes/session.inc" - }, - { - "project_id": 14511, - "project_name": "project/tb_mollise_starter", - "filename": "includes/session.inc" - }, - { - "project_id": 14513, - "project_name": "project/tb_palicico_starter", - "filename": "includes/session.inc" - }, - { - "project_id": 14514, - "project_name": "project/tb_purity_starter", - "filename": "includes/session.inc" - }, - { - "project_id": 14515, - "project_name": "project/tb_rave_starter", - "filename": "includes/session.inc" - }, - { - "project_id": 14522, - "project_name": "project/tb_sirate_starter", - "filename": "includes/session.inc" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "includes/session.inc" - }, - { - "project_id": 15002, - "project_name": "project/fts", - "filename": "fts.module" - }, - { - "project_id": 15291, - "project_name": "project/fluxservice", - "filename": "lib/Drupal/fluxservice/KeyValueStore/DatabaseStorageExpirable.php" - }, - { - "project_id": 15487, - "project_name": "project/optimizedb", - "filename": "optimizedb.test" - }, - { - "project_id": 16052, - "project_name": "project/pax_content", - "filename": "pax_content.module" - }, - { - "project_id": 16192, - "project_name": "project/mobilearkickstart", - "filename": "includes/session.inc" - }, - { - "project_id": 17013, - "project_name": "project/fuse", - "filename": "includes/session.inc" - }, - { - "project_id": 17399, - "project_name": "project/new_relic_insights", - "filename": "src/InsightRemoteEntityQuery.inc" - }, - { - "project_id": 17814, - "project_name": "project/db_remote", - "filename": "src/RemoteSystemQueue.php" - }, - { - "project_id": 17872, - "project_name": "project/acquia_search_config", - "filename": "lib/Drupal/Apachesolr/acquia_search_config.apachesolr.inc" - }, - { - "project_id": 18163, - "project_name": "project/commerce_priceminister", - "filename": "includes/commerce_priceminister_product_queue.inc" - }, - { - "project_id": 18292, - "project_name": "project/uc_abandoned", - "filename": "uc_abandoned_cart/uc_abandoned_cart.module" - }, - { - "project_id": 18559, - "project_name": "project/govbr", - "filename": "includes/session.inc" - }, - { - "project_id": 18763, - "project_name": "project/quizz", - "filename": "src/Generator/ResultGenerator.php" - }, - { - "project_id": 18897, - "project_name": "project/qurandistribution", - "filename": "includes/session.inc" - }, - { - "project_id": 19677, - "project_name": "project/priority_queue", - "filename": "PriorityQueue.php" - }, - { - "project_id": 19746, - "project_name": "project/social_feed_field", - "filename": "modules/social_feed_field_facebook/includes/social_feed_field.facebook.inc" - }, - { - "project_id": 19746, - "project_name": "project/social_feed_field", - "filename": "modules/social_feed_field_gplus/includes/social_feed_field.gplus.inc" - }, - { - "project_id": 19847, - "project_name": "project/commerce_order_reminder", - "filename": "commerce_order_reminder.module" - }, - { - "project_id": 19970, - "project_name": "project/entity_gallery", - "filename": "src/Tests/Views/EntityGalleryRevisionWizardTest.php" - }, - { - "project_id": 20330, - "project_name": "project/tagged_systemqueue", - "filename": "tagged_systemqueue.queue.inc" - }, - { - "project_id": 20381, - "project_name": "project/future_nodes", - "filename": "tests/future_nodes.test" - }, - { - "project_id": 20588, - "project_name": "project/motionpoint", - "filename": "motionpoint.cron.inc" - }, - { - "project_id": 20990, - "project_name": "project/development", - "filename": "includes/session.inc" - }, - { - "project_id": 21023, - "project_name": "project/couchbasedrupal", - "filename": "src/Flood/CouchbaseBackend.php" - }, - { - "project_id": 21067, - "project_name": "project/supercache", - "filename": "src/Cache/RequestTimeTrait.php" - }, - { - "project_id": 21127, - "project_name": "project/freshdesk_sso", - "filename": "src/AuthenticationService.php" - }, - { - "project_id": 23470, - "project_name": "project/gp_reviews", - "filename": "includes/session.inc" - }, - { - "project_id": 24128, - "project_name": "project/drush_async_api", - "filename": "includes/DrushAsyncApiQueue.inc" - }, - { - "project_id": 24357, - "project_name": "project/gitinfo", - "filename": "gitinfo.module" - }, - { - "project_id": 25336, - "project_name": "project/uc_recently_viewed_products", - "filename": "uc_recently_viewed_products.module" - }, - { - "project_id": 25437, - "project_name": "project/sendinblue_rules", - "filename": "includes/sendinblue_rules.list.inc" - }, - { - "project_id": 25713, - "project_name": "project/authtoken", - "filename": "tests/authtoken.test" - }, - { - "project_id": 25896, - "project_name": "project/byu_installation_profile", - "filename": "includes/session.inc" - }, - { - "project_id": 50151, - "project_name": "project/entity_translation", - "filename": "includes/translation.migrate.inc" - }, - { - "project_id": 50362, - "project_name": "project/election", - "filename": "election_cron/election_cron.module" - }, - { - "project_id": 50362, - "project_name": "project/election", - "filename": "tests/ElectionCrudTestCase.test" - }, - { - "project_id": 51249, - "project_name": "project/amazon", - "filename": "includes/views_handler_field_amazon_date.inc" - }, - { - "project_id": 51850, - "project_name": "project/anonymous_publishing", - "filename": "anonymous_publishing.module" - }, - { - "project_id": 52126, - "project_name": "project/preserve_changed", - "filename": "src/PreservedChangedItem.php" - }, - { - "project_id": 54115, - "project_name": "project/course", - "filename": "tests/CourseAccessTestCase.test" - }, - { - "project_id": 55014, - "project_name": "project/performance_toolkit", - "filename": "performance_toolkit.install" - }, - { - "project_id": 55014, - "project_name": "project/performance_toolkit", - "filename": "plugins/ptoolkit/PerformanceToolkitInsertsQueries.inc" - }, - { - "project_id": 55697, - "project_name": "project/acquia_commercemanager", - "filename": "modules/acm/tests/src/Unit/PhpSessionStoreTest.php" - }, - { - "project_id": 56975, - "project_name": "project/d6lts", - "filename": "common/contrib/legal/SA-CONTRIB-2017-036.patch" - }, - { - "project_id": 57777, - "project_name": "project/google_analytics_counter", - "filename": "tests/src/Kernel/GoogleAnalyticsCounterQueueTest.php" - }, - { - "project_id": 57971, - "project_name": "project/automatic_updates", - "filename": "tests/modules/automatic_updates_test/src/EventSubscriber/RequestTimeRecorder.php" - }, - { - "project_id": 58220, - "project_name": "project/wim", - "filename": "modules/features/sduconnect/sduconnect.utils.inc" - }, - { - "project_id": 59781, - "project_name": "project/computed_field", - "filename": "tests/modules/test_computed_field_output/src/Plugin/ComputedField/TestRequestTime.php" - }, - { - "project_id": 59781, - "project_name": "project/computed_field", - "filename": "tests/modules/test_computed_field_plugins/src/Plugin/ComputedField/TestRequestTime.php" - }, - { - "project_id": 60013, - "project_name": "project/participatory_process", - "filename": "src/Utility/ParticipationHelper.php" - }, - { - "project_id": 60038, - "project_name": "project/conference_suite", - "filename": "forms/includes/ConferenceFormsStepBase.php" - }, - { - "project_id": 60837, - "project_name": "project/virtualcare", - "filename": "modules/contrib/message/tests/src/Kernel/Plugin/MessagePurge/DaysTest.php" - }, - { - "project_id": 61877, - "project_name": "project/clockify", - "filename": "clockify.module" - }, - { - "project_id": 62378, - "project_name": "project/drupalru_d7", - "filename": "includes/session.inc" - }, - { - "project_id": 62728, - "project_name": "project/sri", - "filename": "src/JsCollectionRenderer.php" - }, - { - "project_id": 63624, - "project_name": "project/ubershopwish", - "filename": "includes/session.inc" - }, - { - "project_id": 93001, - "project_name": "project/queue_scheduler", - "filename": "src/Queue/DatabaseQueueScheduler.php" - }, - { - "project_id": 134090, - "project_name": "project/ecwid", - "filename": "src/EcwidApiService.php" - }, - { - "project_id": 208118, - "project_name": "project/drupal_devkit", - "filename": "build/claude-code/drupal-core/skills/drupal-contrib-mgmt/references/d11-common-deprecations.md" - }, - { - "project_id": 208118, - "project_name": "project/drupal_devkit", - "filename": "build/codex/drupal-core/skills/drupal-contrib-mgmt/references/d11-common-deprecations.md" - }, - { - "project_id": 208118, - "project_name": "project/drupal_devkit", - "filename": "build/copilot-cli/drupal-core/skills/drupal-contrib-mgmt/references/d11-common-deprecations.md" - }, - { - "project_id": 208118, - "project_name": "project/drupal_devkit", - "filename": "build/cursor/drupal-core/skills/drupal-contrib-mgmt/references/d11-common-deprecations.md" - }, - { - "project_id": 208118, - "project_name": "project/drupal_devkit", - "filename": "build/gemini/drupal-core/skills/drupal-contrib-mgmt/references/d11-common-deprecations.md" - }, - { - "project_id": 208118, - "project_name": "project/drupal_devkit", - "filename": "build/hermes/drupal-core/skills/drupal-contrib-mgmt/references/d11-common-deprecations.md" - }, - { - "project_id": 208118, - "project_name": "project/drupal_devkit", - "filename": "build/kiro/drupal-core/skills/drupal-contrib-mgmt/references/d11-common-deprecations.md" - }, - { - "project_id": 208118, - "project_name": "project/drupal_devkit", - "filename": "build/opencode/drupal-core/skills/drupal-contrib-mgmt/references/d11-common-deprecations.md" - }, - { - "project_id": 208118, - "project_name": "project/drupal_devkit", - "filename": "plugins/drupal-core/skills/drupal-contrib-mgmt/references/d11-common-deprecations.md" - } - ], - "SystemTimeZonesRector": [ - { - "project_id": 97, - "project_name": "project/variable", - "filename": "includes/system.variable.inc" - }, - { - "project_id": 249, - "project_name": "project/ar", - "filename": "contrib/event.po" - }, - { - "project_id": 2600, - "project_name": "project/tzfield", - "filename": "src/Plugin/Field/FieldType/TimeZoneItem.php" - }, - { - "project_id": 2600, - "project_name": "project/tzfield", - "filename": "src/Plugin/Field/FieldWidget/TimeZoneDefaultWidget.php" - }, - { - "project_id": 4568, - "project_name": "project/almanac", - "filename": "almanac.admin.inc" - }, - { - "project_id": 4652, - "project_name": "project/booking_timeslots", - "filename": "includes/booking_timeslots.admin.inc" - }, - { - "project_id": 4939, - "project_name": "project/makemeeting", - "filename": "makemeeting.field.inc" - }, - { - "project_id": 6479, - "project_name": "project/openid_connect", - "filename": "openid_connect.module" - }, - { - "project_id": 8197, - "project_name": "project/onepage", - "filename": "modules/user/user.install" - }, - { - "project_id": 9123, - "project_name": "project/1087726", - "filename": "modules/user/user.install" - }, - { - "project_id": 9628, - "project_name": "project/sfactive", - "filename": "sfactive_migrate.admin.inc" - }, - { - "project_id": 9950, - "project_name": "project/dummy_content", - "filename": "includes/class.dcdate.inc" - }, - { - "project_id": 10712, - "project_name": "project/commerce_installments", - "filename": "src/Plugin/Commerce/InstallmentPlanMethod/InstallmentPlanMethodMethodBase.php" - }, - { - "project_id": 11503, - "project_name": "project/list_predefined_options", - "filename": "src/Plugin/ListOptions/Timezones.php" - }, - { - "project_id": 11529, - "project_name": "project/drupalgap", - "filename": "modules/drupalgap_date/drupalgap_date.module" - }, - { - "project_id": 12118, - "project_name": "project/rebuild", - "filename": "tests/fixtures/drupal_sites/dev/modules/user/user.install" - }, - { - "project_id": 12118, - "project_name": "project/rebuild", - "filename": "tests/fixtures/drupal_sites/prod/modules/user/user.install" - }, - { - "project_id": 13111, - "project_name": "project/ddcla", - "filename": "public/modules/user/user.install" - }, - { - "project_id": 13125, - "project_name": "project/transcribe_distribution", - "filename": "modules/user/user.install" - }, - { - "project_id": 13590, - "project_name": "project/timezone_picker", - "filename": "timezone_picker.module" - }, - { - "project_id": 14446, - "project_name": "project/tr_kurulum", - "filename": "modules/user/user.install" - }, - { - "project_id": 14506, - "project_name": "project/tb_blog_starter", - "filename": "modules/user/user.install" - }, - { - "project_id": 14507, - "project_name": "project/tb_events_starter", - "filename": "modules/user/user.install" - }, - { - "project_id": 14509, - "project_name": "project/tb_hadelis_starter", - "filename": "modules/user/user.install" - }, - { - "project_id": 14510, - "project_name": "project/tb_methys_starter", - "filename": "modules/user/user.install" - }, - { - "project_id": 14511, - "project_name": "project/tb_mollise_starter", - "filename": "modules/user/user.install" - }, - { - "project_id": 14512, - "project_name": "project/tb_neris_starter", - "filename": "modules/user/user.install" - }, - { - "project_id": 14513, - "project_name": "project/tb_palicico_starter", - "filename": "modules/user/user.install" - }, - { - "project_id": 14514, - "project_name": "project/tb_purity_starter", - "filename": "modules/user/user.install" - }, - { - "project_id": 14515, - "project_name": "project/tb_rave_starter", - "filename": "modules/user/user.install" - }, - { - "project_id": 14522, - "project_name": "project/tb_sirate_starter", - "filename": "modules/user/user.install" - }, - { - "project_id": 14523, - "project_name": "project/gladcamp", - "filename": "modules/user/user.install" - }, - { - "project_id": 15222, - "project_name": "project/open_badging_installation_profile", - "filename": "modules/user/user.install" - }, - { - "project_id": 15378, - "project_name": "project/cm_cablecast", - "filename": "modules/cablecast_api/cablecast_api.module" - }, - { - "project_id": 16192, - "project_name": "project/mobilearkickstart", - "filename": "modules/user/user.install" - }, - { - "project_id": 16984, - "project_name": "project/spanish_distribution", - "filename": "modules/user/user.install" - }, - { - "project_id": 17013, - "project_name": "project/fuse", - "filename": "modules/user/user.install" - }, - { - "project_id": 18036, - "project_name": "project/paypal_roles", - "filename": "includes/views/handlers/views_handler_field_custom_payment_expire.inc" - }, - { - "project_id": 18036, - "project_name": "project/paypal_roles", - "filename": "includes/views/handlers/views_handler_field_payment_expire.inc" - }, - { - "project_id": 18559, - "project_name": "project/govbr", - "filename": "modules/user/user.install" - }, - { - "project_id": 18777, - "project_name": "project/quandl", - "filename": "modules/quandl_views/handlers/quandl_views_handler_field_date.inc" - }, - { - "project_id": 18882, - "project_name": "project/better_field_formatters", - "filename": "better_field_formatters.module" - }, - { - "project_id": 18897, - "project_name": "project/qurandistribution", - "filename": "modules/user/user.install" - }, - { - "project_id": 19961, - "project_name": "project/feeds_entity_processor", - "filename": "src/Property/FeedsEntityProcessorPropertyDate.php" - }, - { - "project_id": 20484, - "project_name": "project/mpub", - "filename": "modules/contrib/views/handlers/views_handler_field_date.inc" - }, - { - "project_id": 20990, - "project_name": "project/development", - "filename": "modules/user/user.install" - }, - { - "project_id": 21069, - "project_name": "project/yamlform", - "filename": "includes/yamlform.options.inc" - }, - { - "project_id": 21069, - "project_name": "project/yamlform", - "filename": "src/Plugin/YamlFormElement/DateTime.php" - }, - { - "project_id": 21172, - "project_name": "project/user_access_timeslot", - "filename": "user_access_timeslot.admin.inc" - }, - { - "project_id": 23279, - "project_name": "project/condition_pack", - "filename": "condition_pack_time/src/Plugin/Condition/TimezoneCondition.php" - }, - { - "project_id": 23470, - "project_name": "project/gp_reviews", - "filename": "modules/user/user.install" - }, - { - "project_id": 24449, - "project_name": "project/ppoidc", - "filename": "pixelpin_openid_connect.module" - }, - { - "project_id": 25066, - "project_name": "project/search_api_lucene", - "filename": "search_api_solr.module" - }, - { - "project_id": 25896, - "project_name": "project/byu_installation_profile", - "filename": "modules/user/user.install" - }, - { - "project_id": 45456, - "project_name": "project/digitalclock", - "filename": "src/Plugin/Block/ClockBlock.php" - }, - { - "project_id": 56221, - "project_name": "project/datex", - "filename": "datex.module" - }, - { - "project_id": 58633, - "project_name": "project/openfed", - "filename": "modules/openfed_features/partial_date/partial_date.module" - }, - { - "project_id": 58647, - "project_name": "project/views", - "filename": "handlers/views_handler_field_date.inc" - }, - { - "project_id": 59186, - "project_name": "project/daterange_simplify", - "filename": "src/Plugin/Field/FieldFormatter/SimplifyFormatterBase.php" - }, - { - "project_id": 59691, - "project_name": "project/cilogon_auth", - "filename": "cilogon_auth.module" - }, - { - "project_id": 59941, - "project_name": "project/smart_date", - "filename": "src/Plugin/Field/FieldWidget/SmartDateTimezoneWidget.php" - }, - { - "project_id": 60038, - "project_name": "project/conference_suite", - "filename": "date/conference_date.configure.inc" - }, - { - "project_id": 60038, - "project_name": "project/conference_suite", - "filename": "date/conference_date.module" - }, - { - "project_id": 60215, - "project_name": "project/aeg", - "filename": "modules/views/handlers/views_handler_field_date.inc" - }, - { - "project_id": 60227, - "project_name": "project/govimentum", - "filename": "modules/user/user.install" - }, - { - "project_id": 62378, - "project_name": "project/drupalru_d7", - "filename": "modules/user/user.install" - }, - { - "project_id": 62699, - "project_name": "project/smart_content_ipstack", - "filename": "src/Plugin/Derivative/IpStackConditionDeriver.php" - }, - { - "project_id": 63177, - "project_name": "project/mtc", - "filename": "src/Form/MultipleTimezoneClockForm.php" - }, - { - "project_id": 63624, - "project_name": "project/ubershopwish", - "filename": "modules/user/user.install" - }, - { - "project_id": 71484, - "project_name": "project/timezone_calculator", - "filename": "src/Form/SelectDateAndTimezone.php" - }, - { - "project_id": 71887, - "project_name": "project/rocketship_florista_demo_profile", - "filename": "src/Form/RocketshipFloristaSiteConfigureForm.php" - }, - { - "project_id": 72597, - "project_name": "project/intl_date", - "filename": "src/Plugin/Field/FieldFormatter/IntlTimestampFormatter.php" - }, - { - "project_id": 77509, - "project_name": "project/testproject4234", - "filename": "modules/user/user.install" - }, - { - "project_id": 83752, - "project_name": "project/veracity_vql", - "filename": "src/Plugin/VqlPreProcess/UserTimezoneProcess.php" - }, - { - "project_id": 86134, - "project_name": "project/crema", - "filename": "tests/src/Unit/CremaUserTestClasses.php" - }, - { - "project_id": 90708, - "project_name": "project/library_management_system", - "filename": "src/Plugin/views/field/RequestedBookIssuedDate.php" - }, - { - "project_id": 90708, - "project_name": "project/library_management_system", - "filename": "src/Plugin/views/field/RequestedBookReturnedDate.php" - }, - { - "project_id": 96282, - "project_name": "project/access_policy", - "filename": "src/Plugin/access_policy/AccessRule/WeekdayRange.php" - }, - { - "project_id": 102813, - "project_name": "project/date_occur", - "filename": "date_occur_ui/src/Plugin/Field/FieldFormatter/DateOccurParentOccurFormatter.php" - }, - { - "project_id": 102813, - "project_name": "project/date_occur", - "filename": "date_occur_ui/src/Plugin/Field/FieldWidget/DateOccurSummaryWidget.php" - }, - { - "project_id": 118568, - "project_name": "project/custom_entity_example", - "filename": "src/Entity/CustomEntityExample.php" - }, - { - "project_id": 126576, - "project_name": "project/time_clock", - "filename": "src/Plugin/Block/TimeClockBlock.php" - }, - { - "project_id": 127162, - "project_name": "project/current_date_time", - "filename": "src/Plugin/Block/ZoneBlock.php" - }, - { - "project_id": 135576, - "project_name": "project/everlms", - "filename": "modules/lms_answer/src/Entity/LMSAnswer.php" - }, - { - "project_id": 135576, - "project_name": "project/everlms", - "filename": "modules/lms_certificate/src/Entity/LMSCertificate.php" - }, - { - "project_id": 135576, - "project_name": "project/everlms", - "filename": "modules/lms_class/src/Entity/LMSClass.php" - }, - { - "project_id": 135576, - "project_name": "project/everlms", - "filename": "modules/lms_lesson/src/Entity/LMSLesson.php" - }, - { - "project_id": 135576, - "project_name": "project/everlms", - "filename": "modules/lms_question/src/Entity/LMSQuestion.php" - }, - { - "project_id": 135576, - "project_name": "project/everlms", - "filename": "modules/lms_question_response/src/Entity/LMSQuestionResponse.php" - }, - { - "project_id": 135576, - "project_name": "project/everlms", - "filename": "modules/lms_quiz/src/Entity/LMSQuiz.php" - }, - { - "project_id": 135576, - "project_name": "project/everlms", - "filename": "modules/lms_quiz_result/src/Entity/LMSQuizResult.php" - }, - { - "project_id": 135576, - "project_name": "project/everlms", - "filename": "modules/lms_room/src/Entity/LMSRoom.php" - }, - { - "project_id": 135576, - "project_name": "project/everlms", - "filename": "modules/lms_scheduler/src/Entity/LMSScheduler.php" - }, - { - "project_id": 135576, - "project_name": "project/everlms", - "filename": "modules/lms_user_ceritificate/src/Entity/LMSUserCertificate.php" - }, - { - "project_id": 135576, - "project_name": "project/everlms", - "filename": "modules/lms_user_certificate/src/Entity/LMSUserCertificate.php" - }, - { - "project_id": 135576, - "project_name": "project/everlms", - "filename": "modules/lms_user_course/src/Entity/LMSUserCourse.php" - }, - { - "project_id": 135576, - "project_name": "project/everlms", - "filename": "modules/we_notification/src/Entity/WeNotification.php" - }, - { - "project_id": 168630, - "project_name": "project/substitutoo", - "filename": "modules/sub_activity/src/Entity/SubActivity.php" - }, - { - "project_id": 168630, - "project_name": "project/substitutoo", - "filename": "modules/sub_notification/src/Entity/SubNotification.php" - }, - { - "project_id": 185077, - "project_name": "project/salesforce_push_queue_ui", - "filename": "src/Plugin/views/field/TimestampField.php" - } - ] - }, - "project_rectors": { - "project/livediscussions": [ - "FileSystemBasenameToNativeRector", - "NodeStorageDeprecatedMethodsRector", - "RemoveModuleHandlerAddModuleCallsRector", - "RemoveTrustDataCallRector", - "ReplaceRebuildThemeDataRector", - "UseEntityTypeHasIntegerIdRector" - ], - "project/pt-br": [ - "FileSystemBasenameToNativeRector", - "NodeStorageDeprecatedMethodsRector", - "PluginBaseIsConfigurableRector", - "RemoveModuleHandlerAddModuleCallsRector", - "RemoveTrustDataCallRector", - "ReplaceRebuildThemeDataRector", - "UseEntityTypeHasIntegerIdRector" - ], - "project/pushbutton_phptemplate": [ - "FileSystemBasenameToNativeRector", - "NodeStorageDeprecatedMethodsRector", - "PluginBaseIsConfigurableRector", - "RemoveModuleHandlerAddModuleCallsRector", - "RemoveTrustDataCallRector", - "ReplaceRebuildThemeDataRector", - "UseEntityTypeHasIntegerIdRector" - ], - "project/bg": [ - "FileSystemBasenameToNativeRector", - "NodeStorageDeprecatedMethodsRector", - "PluginBaseIsConfigurableRector", - "RemoveModuleHandlerAddModuleCallsRector", - "RemoveTrustDataCallRector", - "ReplaceRebuildThemeDataRector", - "UseEntityTypeHasIntegerIdRector" - ], - "project/mail_archive": [ - "FileSystemBasenameToNativeRector", - "NodeStorageDeprecatedMethodsRector", - "PluginBaseIsConfigurableRector", - "RemoveModuleHandlerAddModuleCallsRector", - "RemoveTrustDataCallRector", - "ReplaceRebuildThemeDataRector", - "UseEntityTypeHasIntegerIdRector" - ], - "project/sitemenu": [ - "FileSystemBasenameToNativeRector", - "NodeStorageDeprecatedMethodsRector", - "PluginBaseIsConfigurableRector", - "RemoveModuleHandlerAddModuleCallsRector", - "RemoveTrustDataCallRector", - "ReplaceRebuildThemeDataRector", - "UseEntityTypeHasIntegerIdRector" - ], - "project/binder": [ - "FileSystemBasenameToNativeRector", - "NodeStorageDeprecatedMethodsRector", - "PluginBaseIsConfigurableRector", - "RemoveModuleHandlerAddModuleCallsRector", - "RemoveTrustDataCallRector", - "ReplaceRebuildThemeDataRector", - "UseEntityTypeHasIntegerIdRector" - ], - "project/gladcamp": [ - "LoadAllIncludesRector", - "MigrateSqlGetMigrationPluginManagerRector", - "NodeStorageDeprecatedMethodsRector", - "RemoveModuleHandlerDeprecatedMethodsRector", - "RemoveSetUriCallbackRector", - "RemoveUpdaterPostInstallMethodsRector", - "ReplaceCommentManagerGetCountNewCommentsRector", - "ReplaceCommentUriRector", - "ReplaceEntityOriginalPropertyRector", - "ReplaceFileGetContentHeadersRector", - "ReplaceNodeAccessViewAllNodesRector", - "ReplaceNodeAddBodyFieldRector", - "ReplaceNodeModuleProceduralFunctionsRector", - "ReplaceNodeSetPreviewModeRector", - "ReplacePdoFetchConstantsRector", - "ReplaceRequestTimeConstantRector", - "ReplaceSessionWritesWithRequestSessionRector", - "ReplaceSystemPerformanceGzipKeyRector", - "ReplaceThemeGetSettingRector", - "StripMigrationDependenciesExpandArgRector", - "SystemTimeZonesRector" - ], - "project/contact_dir": [ - "PluginBaseIsConfigurableRector" - ], - "project/vcp4dates": [ - "RemoveCacheExpireOverrideRector" - ], - "project/ct_expire": [ - "RemoveCacheExpireOverrideRector" - ], - "project/feed_block": [ - "RemoveCacheExpireOverrideRector" - ], - "project/qpservices": [ - "RemoveCacheExpireOverrideRector" - ], - "project/querypath": [ - "RemoveCacheExpireOverrideRector", - "ReplacePdoFetchConstantsRector" - ], - "project/selective_tweets": [ - "RemoveCacheExpireOverrideRector" - ], - "project/memory_profiler": [ - "RemoveCacheExpireOverrideRector", - "ReplaceRequestTimeConstantRector" - ], - "project/quandl": [ - "RemoveCacheExpireOverrideRector", - "SystemTimeZonesRector" - ], - "project/menu_parser_php": [ - "RemoveCacheExpireOverrideRector" - ], - "project/js_entity": [ - "RemoveCacheExpireOverrideRector" - ], - "project/cache_heuristic": [ - "RemoveCacheExpireOverrideRector" - ], - "project/booking_com_api": [ - "RemoveCacheExpireOverrideRector" - ], - "project/cmrf_form_processor": [ - "RemoveCacheExpireOverrideRector" - ], - "project/cove_api": [ - "RemoveCacheExpireOverrideRector" - ], - "project/cachetags": [ - "RemoveCacheExpireOverrideRector" - ], - "project/social_comments": [ - "RemoveCacheExpireOverrideRector" - ], - "project/cacherouter": [ - "RemoveCacheExpireOverrideRector" - ], - "project/pmetrics": [ - "RemoveCacheExpireOverrideRector" - ], - "project/cision_block": [ - "RemoveCacheExpireOverrideRector" - ], - "project/shareaholic": [ - "RemoveCacheExpireOverrideRector", - "RemoveUpdaterPostInstallMethodsRector", - "ReplaceRequestTimeConstantRector" - ], - "project/qui": [ - "RemoveCacheExpireOverrideRector" - ], - "project/max_age": [ - "RemoveCacheExpireOverrideRector", - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/wincachedrupal": [ - "RemoveCacheExpireOverrideRector" - ], - "project/cmrf_core": [ - "RemoveCacheExpireOverrideRector" - ], - "project/orghunter": [ - "RemoveCacheExpireOverrideRector" - ], - "project/ovh": [ - "RemoveCacheExpireOverrideRector" - ], - "project/era": [ - "RemoveCacheExpireOverrideRector" - ], - "project/media_ustream": [ - "RemoveCacheExpireOverrideRector" - ], - "project/visitorsvoice": [ - "RemoveCacheExpireOverrideRector" - ], - "project/social_feed_field": [ - "RemoveCacheExpireOverrideRector", - "ReplaceRequestTimeConstantRector" - ], - "project/dvg_appointments": [ - "RemoveCacheExpireOverrideRector" - ], - "project/at_base": [ - "RemoveCacheExpireOverrideRector" - ], - "project/session_cache": [ - "RemoveCacheExpireOverrideRector" - ], - "project/eventbrite": [ - "RemoveCacheExpireOverrideRector" - ], - "project/spambot": [ - "RemoveCacheExpireOverrideRector" - ], - "project/go1_base": [ - "RemoveCacheExpireOverrideRector" - ], - "project/latest_members": [ - "RemoveCacheExpireOverrideRector" - ], - "project/cache_disable": [ - "RemoveCacheExpireOverrideRector" - ], - "project/deds_client": [ - "RemoveCacheExpireOverrideRector" - ], - "project/cache_actions": [ - "RemoveCacheExpireOverrideRector" - ], - "project/enhanced_page_cache": [ - "RemoveCacheExpireOverrideRector" - ], - "project/riddle_marketplace": [ - "RemoveCacheExpireOverrideRector" - ], - "project/cache_graceful": [ - "RemoveCacheExpireOverrideRector" - ], - "project/wunderground_weather": [ - "RemoveCacheExpireOverrideRector" - ], - "project/wsdata": [ - "RemoveCacheExpireOverrideRector" - ], - "project/amazon_import": [ - "RemoveCacheExpireOverrideRector" - ], - "project/sendinblue_rules": [ - "RemoveCacheExpireOverrideRector", - "ReplaceRequestTimeConstantRector" - ], - "project/apcu": [ - "RemoveCacheExpireOverrideRector" - ], - "project/userpickit": [ - "RemoveCacheExpireOverrideRector" - ], - "project/advcache": [ - "RemoveCacheExpireOverrideRector" - ], - "project/xcache": [ - "RemoveCacheExpireOverrideRector" - ], - "project/reevoomark": [ - "RemoveCacheExpireOverrideRector" - ], - "project/dynamodb": [ - "RemoveCacheExpireOverrideRector" - ], - "project/block2field": [ - "RemoveCacheExpireOverrideRector" - ], - "project/staticfilecache": [ - "RemoveCacheExpireOverrideRector" - ], - "project/entity_lister": [ - "RemoveCacheExpireOverrideRector" - ], - "project/wisski": [ - "RemoveCacheExpireOverrideRector" - ], - "project/search_api_acquia": [ - "RemoveCacheExpireOverrideRector" - ], - "project/rss_embed_field": [ - "RemoveCacheExpireOverrideRector" - ], - "project/fetcher": [ - "RemoveCacheExpireOverrideRector" - ], - "project/couchbasedrupal": [ - "RemoveCacheExpireOverrideRector", - "ReplaceRequestTimeConstantRector" - ], - "project/usajobs_integration": [ - "RemoveCacheExpireOverrideRector" - ], - "project/virtual_roles": [ - "RemoveCacheExpireOverrideRector" - ], - "project/dvg_stuf_bg": [ - "RemoveCacheExpireOverrideRector" - ], - "project/onepagecv": [ - "RemoveCacheExpireOverrideRector", - "RemoveStateCacheSettingRector", - "ReplaceViewsProceduralFunctionsRector" - ], - "project/site_search_analytics": [ - "RemoveCacheExpireOverrideRector", - "ReplaceUserSessionNamePropertyRector" - ], - "project/commercetools": [ - "RemoveCacheExpireOverrideRector" - ], - "project/social_media_api": [ - "RemoveCacheExpireOverrideRector" - ], - "project/context_cache": [ - "RemoveCacheExpireOverrideRector" - ], - "project/corporative_site": [ - "RemoveCacheExpireOverrideRector", - "RemoveStateCacheSettingRector", - "ReplaceFieldgroupToFieldsetRector", - "ReplaceViewsProceduralFunctionsRector" - ], - "project/audit_report": [ - "RemoveCacheExpireOverrideRector" - ], - "project/memcache_storage": [ - "RemoveCacheExpireOverrideRector" - ], - "project/b2b_store_solution": [ - "RemoveCacheExpireOverrideRector", - "RemoveStateCacheSettingRector", - "ReplaceFieldgroupToFieldsetRector", - "ReplaceNodeAccessViewAllNodesRector", - "ReplaceNodeModuleProceduralFunctionsRector", - "ReplaceViewsProceduralFunctionsRector" - ], - "project/views_dependent_filters": [ - "RemoveHandlerBaseDefineExtraOptionsRector" - ], - "project/sqlsrv": [ - "RemoveRootFromConvertDbUrlRector" - ], - "project/sparql_entity_storage": [ - "RemoveRootFromConvertDbUrlRector" - ], - "project/civicrm_entity": [ - "RemoveRootFromConvertDbUrlRector", - "ViewsPluginHandlerManagerRector" - ], - "project/acsf": [ - "RemoveRootFromConvertDbUrlRector" - ], - "project/smart_migrate_cli": [ - "RemoveRootFromConvertDbUrlRector" - ], - "project/chromeless": [ - "RemoveStateCacheSettingRector" - ], - "project/og": [ - "RemoveStateCacheSettingRector", - "ViewsPluginHandlerManagerRector" - ], - "project/odoo_api": [ - "RemoveStateCacheSettingRector" - ], - "project/distro": [ - "RemoveStateCacheSettingRector" - ], - "project/panels_frame": [ - "RemoveStateCacheSettingRector" - ], - "project/monster_menus": [ - "RemoveStateCacheSettingRector", - "ReplaceNodeModuleProceduralFunctionsRector", - "ViewsPluginHandlerManagerRector" - ], - "project/searchstax": [ - "RemoveStateCacheSettingRector", - "RemoveTwigNodeTransTagArgumentRector", - "ViewsPluginHandlerManagerRector" - ], - "project/profile_setup_api": [ - "RemoveStateCacheSettingRector" - ], - "project/devshop_hosting": [ - "RemoveStateCacheSettingRector" - ], - "project/qfield": [ - "RemoveStateCacheSettingRector" - ], - "project/widen_media": [ - "RemoveStateCacheSettingRector" - ], - "project/fmrest": [ - "RemoveStateCacheSettingRector" - ], - "project/stackla_widget": [ - "RemoveStateCacheSettingRector" - ], - "project/salesforce_auth": [ - "RemoveStateCacheSettingRector" - ], - "project/freeagent": [ - "RemoveStateCacheSettingRector" - ], - "project/vwo": [ - "RemoveStateCacheSettingRector" - ], - "project/mpub": [ - "RemoveStateCacheSettingRector", - "ReplaceFieldgroupToFieldsetRector", - "ReplaceFileGetContentHeadersRector", - "ReplaceNodeAccessViewAllNodesRector", - "ReplaceThemeGetSettingRector", - "ReplaceViewsProceduralFunctionsRector", - "SystemTimeZonesRector" - ], - "project/swagger_ui_formatter": [ - "RemoveStateCacheSettingRector" - ], - "project/checklistapi": [ - "RemoveStateCacheSettingRector" - ], - "project/rail_ai_provider": [ - "RemoveStateCacheSettingRector" - ], - "project/aeg": [ - "RemoveStateCacheSettingRector", - "ReplaceNodeAccessViewAllNodesRector", - "ReplaceNodeModuleProceduralFunctionsRector", - "ReplaceViewsProceduralFunctionsRector", - "SystemTimeZonesRector" - ], - "project/engaging_networks": [ - "RemoveStateCacheSettingRector" - ], - "project/bynder": [ - "RemoveStateCacheSettingRector" - ], - "project/loop_workers": [ - "RemoveStateCacheSettingRector" - ], - "project/override_cache_control_headers": [ - "RemoveStateCacheSettingRector" - ], - "project/casaa": [ - "RemoveStateCacheSettingRector" - ], - "project/salesforce": [ - "RemoveStateCacheSettingRector" - ], - "project/context_admin": [ - "RemoveStateCacheSettingRector", - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/drupalru_d7": [ - "RemoveStateCacheSettingRector", - "RemoveUpdaterPostInstallMethodsRector", - "ReplaceCommentUriRector", - "ReplaceFileGetContentHeadersRector", - "ReplaceNodeAccessViewAllNodesRector", - "ReplaceNodeAddBodyFieldRector", - "ReplaceNodeModuleProceduralFunctionsRector", - "ReplacePdoFetchConstantsRector", - "ReplaceRequestTimeConstantRector", - "ReplaceSessionWritesWithRequestSessionRector", - "ReplaceSystemPerformanceGzipKeyRector", - "ReplaceThemeGetSettingRector", - "ReplaceUserSessionNamePropertyRector", - "SystemTimeZonesRector" - ], - "project/trailless_menu": [ - "RemoveStateCacheSettingRector" - ], - "project/ubershopwish": [ - "RemoveStateCacheSettingRector", - "RemoveUpdaterPostInstallMethodsRector", - "ReplaceCommentUriRector", - "ReplaceFileGetContentHeadersRector", - "ReplaceNodeAccessViewAllNodesRector", - "ReplaceNodeAddBodyFieldRector", - "ReplaceNodeModuleProceduralFunctionsRector", - "ReplacePdoFetchConstantsRector", - "ReplaceRequestTimeConstantRector", - "ReplaceSessionWritesWithRequestSessionRector", - "ReplaceSystemPerformanceGzipKeyRector", - "ReplaceThemeGetSettingRector", - "ReplaceUserSessionNamePropertyRector", - "SystemTimeZonesRector" - ], - "project/govimentum": [ - "RemoveStateCacheSettingRector", - "RemoveUpdaterPostInstallMethodsRector", - "ReplaceCommentUriRector", - "ReplaceFileGetContentHeadersRector", - "ReplaceNodeAccessViewAllNodesRector", - "ReplaceNodeAddBodyFieldRector", - "ReplaceNodeModuleProceduralFunctionsRector", - "ReplacePdoFetchConstantsRector", - "ReplaceSessionWritesWithRequestSessionRector", - "ReplaceSystemPerformanceGzipKeyRector", - "ReplaceThemeGetSettingRector", - "SystemTimeZonesRector" - ], - "project/testproject4234": [ - "RemoveStateCacheSettingRector", - "RemoveUpdaterPostInstallMethodsRector", - "ReplaceCommentUriRector", - "ReplaceFileGetContentHeadersRector", - "ReplaceNodeAccessViewAllNodesRector", - "ReplaceNodeAddBodyFieldRector", - "ReplaceNodeModuleProceduralFunctionsRector", - "ReplacePdoFetchConstantsRector", - "ReplaceSessionWritesWithRequestSessionRector", - "ReplaceSystemPerformanceGzipKeyRector", - "ReplaceThemeGetSettingRector", - "ReplaceUserSessionNamePropertyRector", - "SystemTimeZonesRector" - ], - "project/mailchimp_transactional": [ - "RemoveStateCacheSettingRector" - ], - "project/ffmpeg_media": [ - "RemoveStateCacheSettingRector" - ], - "project/openid_sso_provider": [ - "RemoveStateCacheSettingRector" - ], - "project/backup_migrate_dropbox": [ - "RemoveStateCacheSettingRector" - ], - "project/d6lts": [ - "RemoveStateCacheSettingRector", - "ReplaceRequestTimeConstantRector" - ], - "project/winners": [ - "RemoveStateCacheSettingRector" - ], - "project/cache_browser": [ - "RemoveStateCacheSettingRector" - ], - "project/community_tasks": [ - "RemoveStateCacheSettingRector" - ], - "project/wildfire": [ - "RemoveStateCacheSettingRector" - ], - "project/entity_usage_updater": [ - "RemoveStateCacheSettingRector" - ], - "project/mustache_templates": [ - "RemoveStateCacheSettingRector" - ], - "project/entity_reference_preview": [ - "RemoveStateCacheSettingRector" - ], - "project/granulartimecache": [ - "RemoveStateCacheSettingRector" - ], - "project/pantheon_autopilot_toolbar": [ - "RemoveStateCacheSettingRector" - ], - "project/views_ajax_form": [ - "RemoveStateCacheSettingRector" - ], - "project/authcache": [ - "RemoveStateCacheSettingRector" - ], - "project/entity_references_map": [ - "RemoveStateCacheSettingRector", - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/views_advanced_cache": [ - "RemoveStateCacheSettingRector", - "RemoveViewsRowCacheKeysRector" - ], - "project/cloud": [ - "RemoveStateCacheSettingRector", - "ViewsPluginHandlerManagerRector" - ], - "project/json_drop_api": [ - "RemoveStateCacheSettingRector", - "RemoveViewsRowCacheKeysRector", - "ReplaceEditorLoadRector", - "ReplaceFieldgroupToFieldsetRector", - "ReplaceNodeAddBodyFieldRector", - "ReplaceNodeModuleProceduralFunctionsRector", - "ReplaceViewsProceduralFunctionsRector", - "ViewsPluginHandlerManagerRector" - ], - "project/deploy_key": [ - "RemoveStateCacheSettingRector" - ], - "project/stratoserp": [ - "RemoveStateCacheSettingRector" - ], - "project/config_split": [ - "RemoveStateCacheSettingRector" - ], - "project/drupal_devkit": [ - "RemoveStateCacheSettingRector", - "ReplaceRequestTimeConstantRector", - "ReplaceSessionWritesWithRequestSessionRector" - ], - "project/bynder_orbit": [ - "RemoveStateCacheSettingRector" - ], - "project/youtube_live_video": [ - "RemoveStateCacheSettingRector" - ], - "project/language_suggestion": [ - "RemoveStateCacheSettingRector" - ], - "project/sdx": [ - "RemoveStateCacheSettingRector" - ], - "project/apigee_edge": [ - "RemoveStateCacheSettingRector" - ], - "project/open_vocabularies": [ - "RemoveStateCacheSettingRector" - ], - "project/dns": [ - "RemoveStateCacheSettingRector" - ], - "project/mollom": [ - "RemoveStateCacheSettingRector" - ], - "project/eu_cookie_compliance_rocketship": [ - "RemoveStateCacheSettingRector" - ], - "project/mb": [ - "RemoveStateCacheSettingRector" - ], - "project/social_auth_entra_id": [ - "RemoveStateCacheSettingRector" - ], - "project/search_api_postgresql": [ - "RemoveStateCacheSettingRector" - ], - "project/lightning_workflow": [ - "RemoveStateCacheSettingRector" - ], - "project/experience_builder": [ - "RemoveTwigNodeTransTagArgumentRector" - ], - "project/canvas": [ - "RemoveTwigNodeTransTagArgumentRector" - ], - "project/tranc": [ - "RemoveTwigNodeTransTagArgumentRector" - ], - "project/core_logs": [ - "RemoveTwigNodeTransTagArgumentRector" - ], - "project/potion": [ - "RemoveTwigNodeTransTagArgumentRector" - ], - "project/sketch": [ - "RemoveTwigNodeTransTagArgumentRector" - ], - "project/bear_skin": [ - "RemoveTwigNodeTransTagArgumentRector" - ], - "project/patternlab": [ - "RemoveTwigNodeTransTagArgumentRector" - ], - "project/entity_import": [ - "RemoveTwigNodeTransTagArgumentRector" - ], - "project/flexi_pattern_lab": [ - "RemoveTwigNodeTransTagArgumentRector" - ], - "project/emulsify": [ - "RemoveTwigNodeTransTagArgumentRector" - ], - "project/kashmir": [ - "RemoveTwigNodeTransTagArgumentRector" - ], - "project/search_api_saved_searches": [ - "RemoveTwigNodeTransTagArgumentRector" - ], - "project/search_api_autocomplete": [ - "RemoveTwigNodeTransTagArgumentRector" - ], - "project/search_api": [ - "RemoveTwigNodeTransTagArgumentRector", - "ViewsPluginHandlerManagerRector" - ], - "project/whereabouts": [ - "RemoveUpdaterPostInstallMethodsRector" - ], - "project/redhen_demo": [ - "RemoveUpdaterPostInstallMethodsRector" - ], - "project/group_entity": [ - "RemoveUpdaterPostInstallMethodsRector", - "ViewsPluginHandlerManagerRector" - ], - "project/group": [ - "RemoveUpdaterPostInstallMethodsRector", - "ViewsPluginHandlerManagerRector" - ], - "project/tb_purity_starter": [ - "RemoveUpdaterPostInstallMethodsRector", - "ReplaceCommentUriRector", - "ReplaceFileGetContentHeadersRector", - "ReplaceNodeAccessViewAllNodesRector", - "ReplaceNodeAddBodyFieldRector", - "ReplaceNodeModuleProceduralFunctionsRector", - "ReplacePdoFetchConstantsRector", - "ReplaceRequestTimeConstantRector", - "ReplaceSessionWritesWithRequestSessionRector", - "ReplaceSystemPerformanceGzipKeyRector", - "ReplaceThemeGetSettingRector", - "SystemTimeZonesRector" - ], - "project/tr_kurulum": [ - "RemoveUpdaterPostInstallMethodsRector", - "ReplaceCommentUriRector", - "ReplaceFileGetContentHeadersRector", - "ReplaceNodeAccessViewAllNodesRector", - "ReplaceNodeAddBodyFieldRector", - "ReplaceNodeModuleProceduralFunctionsRector", - "ReplacePdoFetchConstantsRector", - "ReplaceRequestTimeConstantRector", - "ReplaceSessionWritesWithRequestSessionRector", - "ReplaceSystemPerformanceGzipKeyRector", - "ReplaceThemeGetSettingRector", - "SystemTimeZonesRector" - ], - "project/ddcla": [ - "RemoveUpdaterPostInstallMethodsRector", - "ReplaceCommentUriRector", - "ReplaceFileGetContentHeadersRector", - "ReplaceNodeAccessViewAllNodesRector", - "ReplaceNodeAddBodyFieldRector", - "ReplaceNodeModuleProceduralFunctionsRector", - "ReplacePdoFetchConstantsRector", - "ReplaceRequestTimeConstantRector", - "ReplaceSessionWritesWithRequestSessionRector", - "ReplaceSystemPerformanceGzipKeyRector", - "ReplaceThemeGetSettingRector", - "SystemTimeZonesRector" - ], - "project/1087726": [ - "RemoveUpdaterPostInstallMethodsRector", - "ReplaceCommentUriRector", - "ReplaceFileGetContentHeadersRector", - "ReplaceNodeAccessViewAllNodesRector", - "ReplaceNodeAddBodyFieldRector", - "ReplaceNodeModuleProceduralFunctionsRector", - "ReplacePdoFetchConstantsRector", - "ReplaceSessionWritesWithRequestSessionRector", - "ReplaceSystemPerformanceGzipKeyRector", - "ReplaceThemeGetSettingRector", - "SystemTimeZonesRector" - ], - "project/tb_neris_starter": [ - "RemoveUpdaterPostInstallMethodsRector", - "ReplaceCommentUriRector", - "ReplaceFileGetContentHeadersRector", - "ReplaceNodeAccessViewAllNodesRector", - "ReplaceNodeAddBodyFieldRector", - "ReplaceNodeModuleProceduralFunctionsRector", - "ReplacePdoFetchConstantsRector", - "ReplaceSessionWritesWithRequestSessionRector", - "ReplaceSystemPerformanceGzipKeyRector", - "ReplaceThemeGetSettingRector", - "SystemTimeZonesRector" - ], - "project/tb_hadelis_starter": [ - "RemoveUpdaterPostInstallMethodsRector", - "ReplaceCommentUriRector", - "ReplaceFileGetContentHeadersRector", - "ReplaceNodeAccessViewAllNodesRector", - "ReplaceNodeAddBodyFieldRector", - "ReplaceNodeModuleProceduralFunctionsRector", - "ReplacePdoFetchConstantsRector", - "ReplaceSessionWritesWithRequestSessionRector", - "ReplaceSystemPerformanceGzipKeyRector", - "ReplaceThemeGetSettingRector", - "SystemTimeZonesRector" - ], - "project/onepage": [ - "RemoveUpdaterPostInstallMethodsRector", - "ReplaceCommentUriRector", - "ReplaceFileGetContentHeadersRector", - "ReplaceNodeAccessViewAllNodesRector", - "ReplaceNodeAddBodyFieldRector", - "ReplaceNodeModuleProceduralFunctionsRector", - "ReplacePdoFetchConstantsRector", - "ReplaceSessionWritesWithRequestSessionRector", - "ReplaceSystemPerformanceGzipKeyRector", - "ReplaceThemeGetSettingRector", - "SystemTimeZonesRector" - ], - "project/tb_blog_starter": [ - "RemoveUpdaterPostInstallMethodsRector", - "ReplaceCommentUriRector", - "ReplaceFileGetContentHeadersRector", - "ReplaceNodeAccessViewAllNodesRector", - "ReplaceNodeAddBodyFieldRector", - "ReplaceNodeModuleProceduralFunctionsRector", - "ReplacePdoFetchConstantsRector", - "ReplaceRequestTimeConstantRector", - "ReplaceSessionWritesWithRequestSessionRector", - "ReplaceSystemPerformanceGzipKeyRector", - "ReplaceThemeGetSettingRector", - "SystemTimeZonesRector" - ], - "project/tb_rave_starter": [ - "RemoveUpdaterPostInstallMethodsRector", - "ReplaceCommentUriRector", - "ReplaceFileGetContentHeadersRector", - "ReplaceNodeAccessViewAllNodesRector", - "ReplaceNodeAddBodyFieldRector", - "ReplaceNodeModuleProceduralFunctionsRector", - "ReplacePdoFetchConstantsRector", - "ReplaceRequestTimeConstantRector", - "ReplaceSessionWritesWithRequestSessionRector", - "ReplaceSystemPerformanceGzipKeyRector", - "ReplaceThemeGetSettingRector", - "SystemTimeZonesRector" - ], - "project/tb_palicico_starter": [ - "RemoveUpdaterPostInstallMethodsRector", - "ReplaceCommentUriRector", - "ReplaceFileGetContentHeadersRector", - "ReplaceNodeAccessViewAllNodesRector", - "ReplaceNodeAddBodyFieldRector", - "ReplaceNodeModuleProceduralFunctionsRector", - "ReplacePdoFetchConstantsRector", - "ReplaceRequestTimeConstantRector", - "ReplaceSessionWritesWithRequestSessionRector", - "ReplaceSystemPerformanceGzipKeyRector", - "ReplaceThemeGetSettingRector", - "SystemTimeZonesRector" - ], - "project/tb_methys_starter": [ - "RemoveUpdaterPostInstallMethodsRector", - "ReplaceCommentUriRector", - "ReplaceFileGetContentHeadersRector", - "ReplaceNodeAccessViewAllNodesRector", - "ReplaceNodeAddBodyFieldRector", - "ReplaceNodeModuleProceduralFunctionsRector", - "ReplacePdoFetchConstantsRector", - "ReplaceRequestTimeConstantRector", - "ReplaceSessionWritesWithRequestSessionRector", - "ReplaceSystemPerformanceGzipKeyRector", - "ReplaceThemeGetSettingRector", - "SystemTimeZonesRector" - ], - "project/tb_sirate_starter": [ - "RemoveUpdaterPostInstallMethodsRector", - "ReplaceCommentUriRector", - "ReplaceFileGetContentHeadersRector", - "ReplaceNodeAccessViewAllNodesRector", - "ReplaceNodeAddBodyFieldRector", - "ReplaceNodeModuleProceduralFunctionsRector", - "ReplacePdoFetchConstantsRector", - "ReplaceRequestTimeConstantRector", - "ReplaceSessionWritesWithRequestSessionRector", - "ReplaceSystemPerformanceGzipKeyRector", - "ReplaceThemeGetSettingRector", - "SystemTimeZonesRector" - ], - "project/tb_events_starter": [ - "RemoveUpdaterPostInstallMethodsRector", - "ReplaceCommentUriRector", - "ReplaceFileGetContentHeadersRector", - "ReplaceNodeAccessViewAllNodesRector", - "ReplaceNodeAddBodyFieldRector", - "ReplaceNodeModuleProceduralFunctionsRector", - "ReplacePdoFetchConstantsRector", - "ReplaceRequestTimeConstantRector", - "ReplaceSessionWritesWithRequestSessionRector", - "ReplaceSystemPerformanceGzipKeyRector", - "ReplaceThemeGetSettingRector", - "SystemTimeZonesRector" - ], - "project/tb_mollise_starter": [ - "RemoveUpdaterPostInstallMethodsRector", - "ReplaceCommentUriRector", - "ReplaceFileGetContentHeadersRector", - "ReplaceNodeAccessViewAllNodesRector", - "ReplaceNodeAddBodyFieldRector", - "ReplaceNodeModuleProceduralFunctionsRector", - "ReplacePdoFetchConstantsRector", - "ReplaceRequestTimeConstantRector", - "ReplaceSessionWritesWithRequestSessionRector", - "ReplaceSystemPerformanceGzipKeyRector", - "ReplaceThemeGetSettingRector", - "SystemTimeZonesRector" - ], - "project/open_badging_installation_profile": [ - "RemoveUpdaterPostInstallMethodsRector", - "ReplaceCommentUriRector", - "ReplaceFileGetContentHeadersRector", - "ReplaceNodeAccessViewAllNodesRector", - "ReplaceNodeAddBodyFieldRector", - "ReplaceNodeModuleProceduralFunctionsRector", - "ReplacePdoFetchConstantsRector", - "ReplaceSessionWritesWithRequestSessionRector", - "ReplaceSystemPerformanceGzipKeyRector", - "ReplaceThemeGetSettingRector", - "SystemTimeZonesRector" - ], - "project/spanish_distribution": [ - "RemoveUpdaterPostInstallMethodsRector", - "ReplaceCommentUriRector", - "ReplaceFileGetContentHeadersRector", - "ReplaceNodeAccessViewAllNodesRector", - "ReplaceNodeAddBodyFieldRector", - "ReplaceNodeModuleProceduralFunctionsRector", - "ReplacePdoFetchConstantsRector", - "ReplaceSessionWritesWithRequestSessionRector", - "ReplaceSystemPerformanceGzipKeyRector", - "ReplaceThemeGetSettingRector", - "SystemTimeZonesRector" - ], - "project/rebuild": [ - "RemoveUpdaterPostInstallMethodsRector", - "ReplaceCommentUriRector", - "ReplaceFileGetContentHeadersRector", - "ReplaceNodeAccessViewAllNodesRector", - "ReplaceNodeAddBodyFieldRector", - "ReplaceNodeModuleProceduralFunctionsRector", - "ReplacePdoFetchConstantsRector", - "ReplaceSessionWritesWithRequestSessionRector", - "ReplaceSystemPerformanceGzipKeyRector", - "ReplaceThemeGetSettingRector", - "SystemTimeZonesRector" - ], - "project/transcribe_distribution": [ - "RemoveUpdaterPostInstallMethodsRector", - "ReplaceCommentUriRector", - "ReplaceFileGetContentHeadersRector", - "ReplaceNodeAccessViewAllNodesRector", - "ReplaceNodeAddBodyFieldRector", - "ReplaceNodeModuleProceduralFunctionsRector", - "ReplacePdoFetchConstantsRector", - "ReplaceRequestTimeConstantRector", - "ReplaceSessionWritesWithRequestSessionRector", - "ReplaceSystemPerformanceGzipKeyRector", - "ReplaceThemeGetSettingRector", - "SystemTimeZonesRector" - ], - "project/gp_reviews": [ - "RemoveUpdaterPostInstallMethodsRector", - "ReplaceCommentUriRector", - "ReplaceFileGetContentHeadersRector", - "ReplaceNodeAccessViewAllNodesRector", - "ReplaceNodeAddBodyFieldRector", - "ReplaceNodeModuleProceduralFunctionsRector", - "ReplacePdoFetchConstantsRector", - "ReplaceRequestTimeConstantRector", - "ReplaceSessionWritesWithRequestSessionRector", - "ReplaceSystemPerformanceGzipKeyRector", - "ReplaceThemeGetSettingRector", - "SystemTimeZonesRector" - ], - "project/fuse": [ - "RemoveUpdaterPostInstallMethodsRector", - "ReplaceCommentUriRector", - "ReplaceFileGetContentHeadersRector", - "ReplaceNodeAccessViewAllNodesRector", - "ReplaceNodeAddBodyFieldRector", - "ReplaceNodeModuleProceduralFunctionsRector", - "ReplacePdoFetchConstantsRector", - "ReplaceRequestTimeConstantRector", - "ReplaceSessionWritesWithRequestSessionRector", - "ReplaceSystemPerformanceGzipKeyRector", - "ReplaceThemeGetSettingRector", - "SystemTimeZonesRector" - ], - "project/qurandistribution": [ - "RemoveUpdaterPostInstallMethodsRector", - "ReplaceCommentUriRector", - "ReplaceFileGetContentHeadersRector", - "ReplaceNodeAccessViewAllNodesRector", - "ReplaceNodeAddBodyFieldRector", - "ReplaceNodeModuleProceduralFunctionsRector", - "ReplacePdoFetchConstantsRector", - "ReplaceRequestTimeConstantRector", - "ReplaceSessionWritesWithRequestSessionRector", - "ReplaceSystemPerformanceGzipKeyRector", - "ReplaceThemeGetSettingRector", - "SystemTimeZonesRector" - ], - "project/development": [ - "RemoveUpdaterPostInstallMethodsRector", - "ReplaceCommentUriRector", - "ReplaceFileGetContentHeadersRector", - "ReplaceNodeAccessViewAllNodesRector", - "ReplaceNodeAddBodyFieldRector", - "ReplaceNodeModuleProceduralFunctionsRector", - "ReplacePdoFetchConstantsRector", - "ReplaceRequestTimeConstantRector", - "ReplaceSessionWritesWithRequestSessionRector", - "ReplaceSystemPerformanceGzipKeyRector", - "ReplaceThemeGetSettingRector", - "SystemTimeZonesRector" - ], - "project/byu_installation_profile": [ - "RemoveUpdaterPostInstallMethodsRector", - "ReplaceCommentUriRector", - "ReplaceFileGetContentHeadersRector", - "ReplaceNodeAccessViewAllNodesRector", - "ReplaceNodeAddBodyFieldRector", - "ReplaceNodeModuleProceduralFunctionsRector", - "ReplacePdoFetchConstantsRector", - "ReplaceRequestTimeConstantRector", - "ReplaceSessionWritesWithRequestSessionRector", - "ReplaceSystemPerformanceGzipKeyRector", - "ReplaceThemeGetSettingRector", - "SystemTimeZonesRector" - ], - "project/govbr": [ - "RemoveUpdaterPostInstallMethodsRector", - "ReplaceCommentUriRector", - "ReplaceFileGetContentHeadersRector", - "ReplaceNodeAccessViewAllNodesRector", - "ReplaceNodeAddBodyFieldRector", - "ReplaceNodeModuleProceduralFunctionsRector", - "ReplacePdoFetchConstantsRector", - "ReplaceRequestTimeConstantRector", - "ReplaceSessionWritesWithRequestSessionRector", - "ReplaceSystemPerformanceGzipKeyRector", - "ReplaceThemeGetSettingRector", - "SystemTimeZonesRector" - ], - "project/mobilearkickstart": [ - "RemoveUpdaterPostInstallMethodsRector", - "ReplaceCommentUriRector", - "ReplaceFileGetContentHeadersRector", - "ReplaceNodeAccessViewAllNodesRector", - "ReplaceNodeAddBodyFieldRector", - "ReplaceNodeModuleProceduralFunctionsRector", - "ReplacePdoFetchConstantsRector", - "ReplaceRequestTimeConstantRector", - "ReplaceSessionWritesWithRequestSessionRector", - "ReplaceSystemPerformanceGzipKeyRector", - "ReplaceThemeGetSettingRector", - "SystemTimeZonesRector" - ], - "project/redhen_raiser": [ - "RemoveUpdaterPostInstallMethodsRector" - ], - "project/sauce": [ - "RemoveUpdaterPostInstallMethodsRector" - ], - "project/tiendaparamipyme": [ - "RemoveUpdaterPostInstallMethodsRector" - ], - "project/gnode_request": [ - "RemoveUpdaterPostInstallMethodsRector" - ], - "project/ginvite": [ - "RemoveUpdaterPostInstallMethodsRector" - ], - "project/pankm": [ - "RemoveUpdaterPostInstallMethodsRector", - "ReplaceFieldgroupToFieldsetRector", - "ReplaceNodeAddBodyFieldRector", - "ReplaceNodeModuleProceduralFunctionsRector", - "ReplaceThemeGetSettingRector", - "ViewsPluginHandlerManagerRector" - ], - "project/restaurant": [ - "RemoveUpdaterPostInstallMethodsRector" - ], - "project/metatag": [ - "RemoveViewsRowCacheKeysRector", - "ViewsPluginHandlerManagerRector" - ], - "project/openlayers": [ - "ReplaceAlphadecimalToIntNullRector" - ], - "project/indieweb": [ - "ReplaceAlphadecimalToIntNullRector" - ], - "project/service_container": [ - "ReplaceAlphadecimalToIntNullRector", - "ReplaceModuleHandlerGetNameRector" - ], - "project/comment_mover": [ - "ReplaceAlphadecimalToIntNullRector" - ], - "project/flatcomments": [ - "ReplaceAlphadecimalToIntNullRector" - ], - "project/idea": [ - "ReplaceCommentUriRector" - ], - "project/rdf": [ - "ReplaceCommentUriRector" - ], - "project/jsonapi_comment": [ - "ReplaceCommentUriRector" - ], - "project/social": [ - "ReplaceCommentUriRector", - "ReplaceNodeModuleProceduralFunctionsRector", - "ReplaceViewsProceduralFunctionsRector", - "ViewsPluginHandlerManagerRector" - ], - "project/oa_basetheme": [ - "ReplaceCommentUriRector" - ], - "project/comment_fragment": [ - "ReplaceCommentUriRector" - ], - "project/twbs": [ - "ReplaceCommentUriRector" - ], - "project/zen": [ - "ReplaceCommentUriRector" - ], - "project/twentyeleven": [ - "ReplaceCommentUriRector" - ], - "project/html5_boilerplate": [ - "ReplaceCommentUriRector" - ], - "project/advanced_forum": [ - "ReplaceCommentUriRector" - ], - "project/lc3_clean": [ - "ReplaceCommentUriRector" - ], - "project/genesis": [ - "ReplaceCommentUriRector" - ], - "project/tsm": [ - "ReplaceCommentUriRector", - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/techsupport": [ - "ReplaceCommentUriRector", - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/comment_perm": [ - "ReplaceCommentUriRector" - ], - "project/drupalace": [ - "ReplaceCommentUriRector" - ], - "project/nucleus": [ - "ReplaceCommentUriRector" - ], - "project/project_issue": [ - "ReplaceCommentUriRector" - ], - "project/node_notify": [ - "ReplaceCommentUriRector" - ], - "project/comment_goodness": [ - "ReplaceCommentUriRector" - ], - "project/md_foto": [ - "ReplaceCommentUriRector", - "ReplaceThemeGetSettingRector" - ], - "project/easy_booking": [ - "ReplaceCommentUriRector" - ], - "project/gadget": [ - "ReplaceCommentUriRector" - ], - "project/adaptivetheme": [ - "ReplaceCommentUriRector" - ], - "project/stacksight": [ - "ReplaceCommentUriRector" - ], - "project/jats_generator": [ - "ReplaceCommentUriRector" - ], - "project/deprecation_status": [ - "ReplaceDateTimeRangeConstantsRector" - ], - "project/ckeditor_lts": [ - "ReplaceEditorLoadRector" - ], - "project/theme_file_editor": [ - "ReplaceEditorLoadRector" - ], - "project/module_file_editor": [ - "ReplaceEditorLoadRector" - ], - "project/decoupled": [ - "ReplaceEditorLoadRector" - ], - "project/ai_editoria11y": [ - "ReplaceEditorLoadRector" - ], - "project/acquia_contenthub": [ - "ReplaceEditorLoadRector", - "ReplacePdoFetchConstantsRector", - "ReplaceUserSessionNamePropertyRector" - ], - "project/media_folders": [ - "ReplaceEditorLoadRector" - ], - "project/wxt": [ - "ReplaceEditorLoadRector" - ], - "project/ckeditor_config": [ - "ReplaceEditorLoadRector" - ], - "project/ckeditor_exclude_tags": [ - "ReplaceEditorLoadRector" - ], - "project/wysiwyg_trumbowyg": [ - "ReplaceEditorLoadRector" - ], - "project/translation_management": [ - "ReplaceEditorLoadRector" - ], - "project/openfed": [ - "ReplaceEditorLoadRector", - "SystemTimeZonesRector" - ], - "project/quickedit": [ - "ReplaceEditorLoadRector" - ], - "project/ezcontent_publish": [ - "ReplaceEditorLoadRector" - ], - "project/video_embed_field": [ - "ReplaceEditorLoadRector" - ], - "project/deepseek": [ - "ReplaceEditorLoadRector" - ], - "project/custom_paragraphs": [ - "ReplaceEditorLoadRector" - ], - "project/editor": [ - "ReplaceEditorLoadRector" - ], - "project/smartlinker_ai": [ - "ReplaceEditorLoadRector" - ], - "project/editor_advanced_link": [ - "ReplaceEditorLoadRector" - ], - "project/ckeditor5_highlight": [ - "ReplaceEditorLoadRector" - ], - "project/address_suggestion": [ - "ReplaceEditorLoadRector" - ], - "project/ckeditor_braille": [ - "ReplaceEditorLoadRector" - ], - "project/video_filter": [ - "ReplaceEditorLoadRector" - ], - "project/ckeditor5_spoiler": [ - "ReplaceEditorLoadRector" - ], - "project/ckeditor5_premium_features": [ - "ReplaceEditorLoadRector" - ], - "project/ai_ckeditor_extras": [ - "ReplaceEditorLoadRector" - ], - "project/bueditor": [ - "ReplaceEditorLoadRector" - ], - "project/boxout": [ - "ReplaceEditorLoadRector" - ], - "project/ckeditor5_scroll_fix": [ - "ReplaceEditorLoadRector" - ], - "project/inline_image_token": [ - "ReplaceEditorLoadRector" - ], - "project/editor_advanced_image": [ - "ReplaceEditorLoadRector" - ], - "project/contextly": [ - "ReplaceEditorLoadRector" - ], - "project/ckeditor5_plugin_pack": [ - "ReplaceEditorLoadRector" - ], - "project/ckeditor_mentions": [ - "ReplaceEditorLoadRector" - ], - "project/learnosity": [ - "ReplaceEditorLoadRector" - ], - "project/ckeditor_uploadimage": [ - "ReplaceEditorLoadRector" - ], - "project/editor_advanced_table": [ - "ReplaceEditorLoadRector" - ], - "project/synimage": [ - "ReplaceEditorLoadRector" - ], - "project/dsfr4drupal_picker": [ - "ReplaceEditorLoadRector" - ], - "project/ckeditor5_deepl": [ - "ReplaceEditorLoadRector" - ], - "project/flo": [ - "ReplaceEditorLoadRector" - ], - "project/inline_formatter_field": [ - "ReplaceEditorLoadRector" - ], - "project/wysiwyg_ckeditor": [ - "ReplaceEditorLoadRector" - ], - "project/ckeditor_custom_paste_filters": [ - "ReplaceEditorLoadRector" - ], - "project/ai_agents_experimental_collection": [ - "ReplaceEditorLoadRector", - "ReplaceSystemPerformanceGzipKeyRector" - ], - "project/flmngr": [ - "ReplaceEditorLoadRector" - ], - "project/edit_plus": [ - "ReplaceEditorLoadRector" - ], - "project/ckeditor_historylog": [ - "ReplaceEditorLoadRector" - ], - "project/txt42": [ - "ReplaceEditorLoadRector" - ], - "project/cdn": [ - "ReplaceEditorLoadRector" - ], - "project/editor_ckeditor_widgets": [ - "ReplaceEditorLoadRector" - ], - "project/toast_image_editor": [ - "ReplaceEditorLoadRector" - ], - "project/ckeditor5_mentions": [ - "ReplaceEditorLoadRector" - ], - "project/token_browser_plus": [ - "ReplaceEditorLoadRector" - ], - "project/ckeditor_codemirror": [ - "ReplaceEditorLoadRector" - ], - "project/url_embed": [ - "ReplaceEditorLoadRector" - ], - "project/depcalc": [ - "ReplaceEditorLoadRector" - ], - "project/grapesjs_editor": [ - "ReplaceEditorLoadRector" - ], - "project/acquia_dam": [ - "ReplaceEditorLoadRector", - "ViewsPluginHandlerManagerRector" - ], - "project/markdown": [ - "ReplaceEditorLoadRector" - ], - "project/tinymce": [ - "ReplaceEditorLoadRector" - ], - "project/ole": [ - "ReplaceEditorLoadRector" - ], - "project/visual_editor": [ - "ReplaceEditorLoadRector" - ], - "project/entity_embed": [ - "ReplaceEditorLoadRector", - "ReplaceEntityReferenceRecursiveLimitRector" - ], - "project/imageeditor": [ - "ReplaceEditorLoadRector" - ], - "project/gutenberg": [ - "ReplaceEntityReferenceRecursiveLimitRector" - ], - "project/custom_field": [ - "ReplaceEntityReferenceRecursiveLimitRector", - "ReplaceViewsProceduralFunctionsRector" - ], - "project/layout_builder_formatter": [ - "ReplaceEntityReferenceRecursiveLimitRector" - ], - "project/datafield": [ - "ReplaceEntityReferenceRecursiveLimitRector" - ], - "project/content_browser": [ - "ReplaceEntityReferenceRecursiveLimitRector" - ], - "project/df": [ - "ReplaceEntityReferenceRecursiveLimitRector" - ], - "project/rendered_entity_list_formatter": [ - "ReplaceEntityReferenceRecursiveLimitRector" - ], - "project/published_referenced_entity": [ - "ReplaceEntityReferenceRecursiveLimitRector" - ], - "project/rendred_entity_list_formatter": [ - "ReplaceEntityReferenceRecursiveLimitRector" - ], - "project/image_as_media": [ - "ReplaceEntityReferenceRecursiveLimitRector" - ], - "project/entity_browser_block": [ - "ReplaceEntityReferenceRecursiveLimitRector" - ], - "project/link_field_display_mode_formatter": [ - "ReplaceEntityReferenceRecursiveLimitRector" - ], - "project/paragraphs_summary": [ - "ReplaceEntityReferenceRecursiveLimitRector" - ], - "project/external_entity": [ - "ReplaceEntityReferenceRecursiveLimitRector" - ], - "project/tripal": [ - "ReplaceEntityReferenceRecursiveLimitRector", - "ReplaceModuleHandlerGetNameRector" - ], - "project/seb": [ - "ReplaceEntityReferenceRecursiveLimitRector" - ], - "project/revisiondiff": [ - "ReplaceEntityReferenceRecursiveLimitRector" - ], - "project/entity_list": [ - "ReplaceEntityReferenceRecursiveLimitRector" - ], - "project/rest_entity_display": [ - "ReplaceEntityReferenceRecursiveLimitRector" - ], - "project/field_pager": [ - "ReplaceEntityReferenceRecursiveLimitRector" - ], - "project/nested_entity_reference_formatter": [ - "ReplaceEntityReferenceRecursiveLimitRector" - ], - "project/view_mode_crop": [ - "ReplaceEntityReferenceRecursiveLimitRector" - ], - "project/rocketship_core": [ - "ReplaceEntityReferenceRecursiveLimitRector" - ], - "project/dynamic_entity_reference": [ - "ReplaceEntityReferenceRecursiveLimitRector" - ], - "project/more_fields": [ - "ReplaceEntityReferenceRecursiveLimitRector", - "ViewsPluginHandlerManagerRector" - ], - "project/entity_reference_override": [ - "ReplaceEntityReferenceRecursiveLimitRector" - ], - "project/berf": [ - "ReplaceEntityReferenceRecursiveLimitRector" - ], - "project/multi_render_formatter": [ - "ReplaceEntityReferenceRecursiveLimitRector" - ], - "project/entity_overlay": [ - "ReplaceEntityReferenceRecursiveLimitRector" - ], - "project/entity_reference_ajax_formatter": [ - "ReplaceEntityReferenceRecursiveLimitRector" - ], - "project/entity_reference_dynamic_display": [ - "ReplaceEntityReferenceRecursiveLimitRector" - ], - "project/entity_reference_views_backfill": [ - "ReplaceEntityReferenceRecursiveLimitRector" - ], - "project/fieldgroup": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/fieldtool": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/fieldgroup_htabs": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/fieldgroup_callouts": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/bootstrap_fieldgroup": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/dt": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/fieldgroup_table": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/componentize": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/cck_fieldgroup_tabs": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/fieldgroup_placeholder": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/commerce_fieldgroup_panes": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/voipuser": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/volunteer_rally_features": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/bahai_incubator": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/donor_rally_features": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/elms_features": [ - "ReplaceFieldgroupToFieldsetRector", - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/cgpa_calculator": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/ct_plus": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/meetu": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/content_type_exporter": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/ui_patterns_settings": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/bundle_copy_profile2": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/field_group_vertical_tabs": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/cck_inputs": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/bundle_copy_commerce": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/bundle_copy": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/abtestui": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/popups_subedit": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/markaspot": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/certificate": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/jsonapi_example": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/inline_field_group": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/field_or": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/esm": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/sports_league": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/briefcase": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/inherit": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/ULT": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/icn": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/imagefetchr": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/profile_migrate": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/node_widget": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/msnf": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/content_display_order": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/bundles": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/bif": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/field_group_ajaxified_multipage": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/field_group_save_button": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/cck_signup": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/razoreye_biz": [ - "ReplaceFieldgroupToFieldsetRector", - "ReplaceModuleHandlerGetNameRector", - "ReplaceNodeAddBodyFieldRector", - "ReplaceNodeModuleProceduralFunctionsRector", - "ReplaceSessionManagerDeleteRector", - "ReplaceSystemPerformanceGzipKeyRector", - "ReplaceThemeGetSettingRector", - "ReplaceViewsProceduralFunctionsRector" - ], - "project/field_group": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/hexagon": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/acc": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/cck_sync": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/wim": [ - "ReplaceFieldgroupToFieldsetRector", - "ReplaceRequestTimeConstantRector" - ], - "project/skillset_inview": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/aurigma": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/social_media_image_generator": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/microdata": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/field_group_table_component": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/simple_multistep": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/podgroups": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/pirets": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/syndicator": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/field_group_label_classes": [ - "ReplaceFieldgroupToFieldsetRector" - ], - "project/sshid": [ - "ReplaceFileGetContentHeadersRector" - ], - "project/private_image_cache": [ - "ReplaceFileGetContentHeadersRector" - ], - "project/field_formatter_key_label": [ - "ReplaceFileGetContentHeadersRector" - ], - "project/protected_file": [ - "ReplaceFileGetContentHeadersRector" - ], - "project/download_file": [ - "ReplaceFileGetContentHeadersRector" - ], - "project/commerce_invoice_ubl": [ - "ReplaceFileGetContentHeadersRector" - ], - "project/file_visibility": [ - "ReplaceFileGetContentHeadersRector" - ], - "project/archibald": [ - "ReplaceFileGetContentHeadersRector" - ], - "project/media_icon_deliver": [ - "ReplaceFileGetContentHeadersRector" - ], - "project/unpublished_file": [ - "ReplaceFileGetContentHeadersRector" - ], - "project/pdftemplate": [ - "ReplaceFileGetContentHeadersRector" - ], - "project/commerce_invoice": [ - "ReplaceFileGetContentHeadersRector" - ], - "project/tmgmt": [ - "ReplaceFileGetContentHeadersRector", - "ViewsPluginHandlerManagerRector" - ], - "project/git_book": [ - "ReplaceFileGetContentHeadersRector" - ], - "project/node_revision_private_files_access_permission": [ - "ReplaceFileGetContentHeadersRector" - ], - "project/image_download_formatter": [ - "ReplaceFileGetContentHeadersRector" - ], - "project/commerce_purchase_order": [ - "ReplaceFileGetContentHeadersRector" - ], - "project/flipping_book": [ - "ReplaceFileGetContentHeadersRector" - ], - "project/pathed_files": [ - "ReplaceFileGetContentHeadersRector" - ], - "project/node_field": [ - "ReplaceFileGetContentHeadersRector" - ], - "project/onetime_download": [ - "ReplaceFileGetContentHeadersRector" - ], - "project/rules_letter": [ - "ReplaceFileGetContentHeadersRector" - ], - "project/dam": [ - "ReplaceFileGetContentHeadersRector" - ], - "project/skilling": [ - "ReplaceFileGetContentHeadersRector" - ], - "project/icomoon": [ - "ReplaceFileGetContentHeadersRector" - ], - "project/tmgmt_server": [ - "ReplaceFileGetContentHeadersRector" - ], - "project/fontello": [ - "ReplaceFileGetContentHeadersRector" - ], - "project/lingo24": [ - "ReplaceFileGetContentHeadersRector" - ], - "project/feeds": [ - "ReplaceFileGetContentHeadersRector" - ], - "project/wf": [ - "ReplaceFileGetContentHeadersRector" - ], - "project/file_shelf": [ - "ReplaceFileGetContentHeadersRector" - ], - "project/bassets_sw": [ - "ReplaceFileGetContentHeadersRector" - ], - "project/git_wiki_help": [ - "ReplaceFileGetContentHeadersRector" - ], - "project/erpal": [ - "ReplaceFileGetContentHeadersRector" - ], - "project/file_entity": [ - "ReplaceFileGetContentHeadersRector" - ], - "project/temporary_download": [ - "ReplaceFileGetContentHeadersRector" - ], - "project/yamlform": [ - "ReplaceFileGetContentHeadersRector", - "SystemTimeZonesRector" - ], - "project/reporting_cloud": [ - "ReplaceFileGetContentHeadersRector" - ], - "project/drupdates": [ - "ReplaceFileGetContentHeadersRector" - ], - "project/endicia": [ - "ReplaceFileGetContentHeadersRector" - ], - "project/odir": [ - "ReplaceFileGetContentHeadersRector", - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/uc_fedex": [ - "ReplaceFileGetContentHeadersRector" - ], - "project/dxpr_builder": [ - "ReplaceFileGetContentHeadersRector" - ], - "project/cforge": [ - "ReplaceFileGetContentHeadersRector" - ], - "project/1635422": [ - "ReplaceFileGetContentHeadersRector", - "ReplaceNodeAccessViewAllNodesRector" - ], - "project/views_query_na_subquery": [ - "ReplaceNodeAccessViewAllNodesRector" - ], - "project/view_usernames_node_author": [ - "ReplaceNodeAccessViewAllNodesRector" - ], - "project/module_grants": [ - "ReplaceNodeAccessViewAllNodesRector" - ], - "project/entity_gallery": [ - "ReplaceNodeAccessViewAllNodesRector", - "ReplaceRequestTimeConstantRector" - ], - "project/evaluation": [ - "ReplaceNodeAccessViewAllNodesRector" - ], - "project/drupal_wall": [ - "ReplaceNodeAddBodyFieldRector" - ], - "project/commune": [ - "ReplaceNodeAddBodyFieldRector" - ], - "project/tome": [ - "ReplaceNodeAddBodyFieldRector" - ], - "project/closedquestion_scoreboard": [ - "ReplaceNodeAddBodyFieldRector" - ], - "project/search_by_page": [ - "ReplaceNodeAddBodyFieldRector" - ], - "project/og_groupcontent": [ - "ReplaceNodeAddBodyFieldRector" - ], - "project/virtualcare": [ - "ReplaceNodeAddBodyFieldRector", - "ReplaceNodeModuleProceduralFunctionsRector", - "ReplaceRequestTimeConstantRector", - "ReplaceThemeGetSettingRector" - ], - "project/ctools": [ - "ReplaceNodeAddBodyFieldRector", - "ViewsPluginHandlerManagerRector" - ], - "project/ai_eca": [ - "ReplaceNodeAddBodyFieldRector" - ], - "project/druvel": [ - "ReplaceNodeAddBodyFieldRector" - ], - "project/recruit": [ - "ReplaceNodeAddBodyFieldRector" - ], - "project/administration_notification": [ - "ReplaceNodeAddBodyFieldRector" - ], - "project/drush": [ - "ReplaceNodeAddBodyFieldRector" - ], - "project/civicrm_event_receipts": [ - "ReplaceNodeAddBodyFieldRector" - ], - "project/snippets": [ - "ReplaceNodeAddBodyFieldRector" - ], - "project/experd": [ - "ReplaceNodeAddBodyFieldRector" - ], - "project/latest": [ - "ReplaceNodeAddBodyFieldRector" - ], - "project/drupal_cli": [ - "ReplaceNodeAddBodyFieldRector" - ], - "project/rocketship": [ - "ReplaceNodeAddBodyFieldRector" - ], - "project/smartling": [ - "ReplaceNodeAddBodyFieldRector" - ], - "project/external_page_redirect": [ - "ReplaceNodeAddBodyFieldRector" - ], - "project/guidance": [ - "ReplaceNodeAddBodyFieldRector" - ], - "project/vinculum": [ - "ReplaceNodeAddBodyFieldRector" - ], - "project/smartparticipation": [ - "ReplaceNodeAddBodyFieldRector", - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/family": [ - "ReplaceNodeAddBodyFieldRector" - ], - "project/administrative_help": [ - "ReplaceNodeAddBodyFieldRector" - ], - "project/sva": [ - "ReplaceNodeAddBodyFieldRector" - ], - "project/feedstextareafetcher": [ - "ReplaceNodeAddBodyFieldRector" - ], - "project/cultura": [ - "ReplaceNodeAddBodyFieldRector" - ], - "project/votingapi": [ - "ReplaceNodeAddBodyFieldRector", - "ReplacePdoFetchConstantsRector" - ], - "project/social_content": [ - "ReplaceNodeAddBodyFieldRector" - ], - "project/automatic_field_saver": [ - "ReplaceNodeAddBodyFieldRector" - ], - "project/rdf_sync": [ - "ReplaceNodeAddBodyFieldRector" - ], - "project/rio": [ - "ReplaceNodeAddBodyFieldRector" - ], - "project/wysiwyg_fields": [ - "ReplaceNodeAddBodyFieldRector" - ], - "project/display_machine_name": [ - "ReplaceNodeAddBodyFieldRector" - ], - "project/lingotek": [ - "ReplaceNodeAddBodyFieldRector" - ], - "project/opigno_glossary": [ - "ReplaceNodeAddBodyFieldRector" - ], - "project/prh_search": [ - "ReplaceNodeAddBodyFieldRector" - ], - "project/commerce_behat": [ - "ReplaceNodeAddBodyFieldRector" - ], - "project/references": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/views_node_access": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/og_menu_single": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/basic_stats_token": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/form_default_button": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/acal": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/update_external_links": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/comment_easy_reply": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/entity_translation_unified_form": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/og_admin_block": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/node_title_help_text": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/simply_signups": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/user_content_type": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/util": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/simpleantispam": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/auto_nodetitle": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/taxonomy_autolink": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/taxonomy_linking": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/node_menu_item_visibility_default_behaviour": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/ajax_node_loader": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/node_clone": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/fast_gallery": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/node_creator_system_details": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/csf": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/codebook_print_pdf": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/uyan": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/factorydrone": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/nodetypeviews": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/field_weight": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/codebook_core": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/ds": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/openpolitic": [ - "ReplaceNodeModuleProceduralFunctionsRector", - "ReplaceSystemPerformanceGzipKeyRector" - ], - "project/updated": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/content_trust": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/nopremium": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/multipage_navigation": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/indexpage": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/node_creation_links": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/domain_video_sitemap": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/views_content_cache": [ - "ReplaceNodeModuleProceduralFunctionsRector", - "ReplaceRequestTimeConstantRector" - ], - "project/link_description_attributes": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/googlenews": [ - "ReplaceNodeModuleProceduralFunctionsRector", - "ReplaceViewsProceduralFunctionsRector" - ], - "project/persistent_menu_items": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/commons_migration": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/hierarchical_select_access": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/campaignion": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/read_time": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/npop": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/sharebar": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/colors": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/fbconnect": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/revision_all": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/stop_broken_link_in_body": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/page_menu_reorder": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/socialshare": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/baidumap_fieldtype": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/node_randomizer": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/readmore_ajax": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/oa_wizard": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/copyscape": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/admin_toolbar_content_languages": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/content_access_view": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/markdown_exporter": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/custom_search": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/twitter": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/admin_notify": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/inspector": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/rsvp_list": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/secure_nodes": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/simplenews_content_selection": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/drupalgap": [ - "ReplaceNodeModuleProceduralFunctionsRector", - "SystemTimeZonesRector" - ], - "project/nodeaccesskeys": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/project": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/backdrop_upgrade_status": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/openpublic": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/blurry": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/anonymous_subscriptions": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/rsvplist": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/subdomain": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/meerkat": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/simple_nodeblock": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/html_title": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/tide_api": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/tide_core": [ - "ReplaceNodeModuleProceduralFunctionsRector", - "ViewsPluginHandlerManagerRector" - ], - "project/collection": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/edit_content_type_tab": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/node_singles": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/quick_node_clone": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/addanother": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/content_dependency_graph": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/public_revisions": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/hold_my_draft": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/duplicate_node": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/tracker": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/entity_reference_edit_link": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/content_admin_tools": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/communications": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/pager_for_content_type": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/micronode_block": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/skyword": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/find_text": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/token": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/pp_graphsearch": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/customizable_entities": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/node_gallery_bulk_operations": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/openscholar_vsite": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/merci_barcode_labels": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/question": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/autotag": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/move_user": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/transfer_user_content": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/merci_signup": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/entity_sort": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/reassign_user_content": [ - "ReplaceModuleHandlerGetNameRector", - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/usercancel_contentassigntoadmin": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/node_gallery_taxonomy": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/filebrowser": [ - "ReplaceNodeModuleProceduralFunctionsRector", - "ReplacePdoFetchConstantsRector" - ], - "project/user_delete_reassign": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/mmedia": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/ajaxnewcounter": [ - "ReplaceNodeModuleProceduralFunctionsRector", - "ReplaceViewsProceduralFunctionsRector" - ], - "project/contentassigntootheruser": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/languageassign": [ - "ReplaceNodeModuleProceduralFunctionsRector" - ], - "project/babel": [ - "ReplacePdoFetchConstantsRector" - ], - "project/track_usage": [ - "ReplacePdoFetchConstantsRector" - ], - "project/mysql_async": [ - "ReplacePdoFetchConstantsRector" - ], - "project/d7": [ - "ReplacePdoFetchConstantsRector" - ], - "project/dbtng": [ - "ReplacePdoFetchConstantsRector" - ], - "project/multitype_slider": [ - "ReplacePdoFetchConstantsRector" - ], - "project/storage_api": [ - "ReplacePdoFetchConstantsRector" - ], - "project/gtfs_511": [ - "ReplacePdoFetchConstantsRector" - ], - "project/gtfs_geo": [ - "ReplacePdoFetchConstantsRector" - ], - "project/gtfs_rt": [ - "ReplacePdoFetchConstantsRector" - ], - "project/junk_drawer": [ - "ReplacePdoFetchConstantsRector" - ], - "project/gtfs": [ - "ReplacePdoFetchConstantsRector" - ], - "project/scoopit": [ - "ReplacePdoFetchConstantsRector" - ], - "project/conreg": [ - "ReplacePdoFetchConstantsRector" - ], - "project/survey_builder": [ - "ReplacePdoFetchConstantsRector" - ], - "project/graphql_shield": [ - "ReplacePdoFetchConstantsRector" - ], - "project/accessible": [ - "ReplacePdoFetchConstantsRector" - ], - "project/visitor_actions": [ - "ReplacePdoFetchConstantsRector" - ], - "project/commerce_store_override": [ - "ReplacePdoFetchConstantsRector" - ], - "project/field_completeness": [ - "ReplacePdoFetchConstantsRector" - ], - "project/video_toolbox": [ - "ReplacePdoFetchConstantsRector" - ], - "project/ai_schemadotorg_jsonld": [ - "ReplacePdoFetchConstantsRector" - ], - "project/tmgmt_smartcat": [ - "ReplacePdoFetchConstantsRector" - ], - "project/oracle": [ - "ReplacePdoFetchConstantsRector" - ], - "project/lgpd": [ - "ReplacePdoFetchConstantsRector" - ], - "project/ayrshare": [ - "ReplacePdoFetchConstantsRector" - ], - "project/social_auth_buttons": [ - "ReplacePdoFetchConstantsRector" - ], - "project/acquia_migrate": [ - "ReplacePdoFetchConstantsRector" - ], - "project/mail_box_management": [ - "ReplacePdoFetchConstantsRector" - ], - "project/payment_button_drupal_plugin": [ - "ReplacePdoFetchConstantsRector" - ], - "project/entitree": [ - "ReplacePdoFetchConstantsRector" - ], - "project/imotilux": [ - "ReplacePdoFetchConstantsRector" - ], - "project/book_library_api": [ - "ReplacePdoFetchConstantsRector" - ], - "project/mongodb_dbtng": [ - "ReplacePdoFetchConstantsRector" - ], - "project/entity_translation": [ - "ReplacePdoFetchConstantsRector", - "ReplaceRequestTimeConstantRector" - ], - "project/tweet_reference": [ - "ReplacePdoFetchConstantsRector" - ], - "project/hubspot": [ - "ReplacePdoFetchConstantsRector" - ], - "project/relation_add": [ - "ReplacePdoFetchConstantsRector" - ], - "project/gdpr": [ - "ReplacePdoFetchConstantsRector" - ], - "project/sgd_watchdog_summary": [ - "ReplacePdoFetchConstantsRector" - ], - "project/sgd_user_status": [ - "ReplacePdoFetchConstantsRector" - ], - "project/ms_react": [ - "ReplacePdoFetchConstantsRector" - ], - "project/rating_list": [ - "ReplacePdoFetchConstantsRector" - ], - "project/styles": [ - "ReplacePdoFetchConstantsRector" - ], - "project/opac": [ - "ReplacePdoFetchConstantsRector" - ], - "project/sqlbuddy": [ - "ReplacePdoFetchConstantsRector" - ], - "project/contact_centre": [ - "ReplacePdoFetchConstantsRector" - ], - "project/bitcache": [ - "ReplacePdoFetchConstantsRector" - ], - "project/amber": [ - "ReplacePdoFetchConstantsRector" - ], - "project/maps_suite": [ - "ReplacePdoFetchConstantsRector" - ], - "project/menu_minipanels": [ - "ReplacePdoFetchConstantsRector" - ], - "project/livre": [ - "ReplacePdoFetchConstantsRector" - ], - "project/paddle_menu_manager": [ - "ReplacePdoFetchConstantsRector" - ], - "project/media_migration": [ - "ReplacePdoFetchConstantsRector" - ], - "project/autoslave": [ - "ReplacePdoFetchConstantsRector" - ], - "project/smileys_field": [ - "ReplacePdoFetchConstantsRector" - ], - "project/arch": [ - "ReplacePdoFetchConstantsRector" - ], - "project/schemadotorg": [ - "ReplaceRecipeRunnerInstallModuleRector" - ], - "project/entity_visibility_preview": [ - "ReplaceSessionManagerDeleteRector", - "ReplaceSessionWritesWithRequestSessionRector" - ], - "project/brightcove": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/drupal_saml_bridge": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/cookie_samesite_support": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/session_limit": [ - "ReplaceSessionManagerDeleteRector", - "ReplaceSessionWritesWithRequestSessionRector" - ], - "project/recently_read": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/logout_timeout": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/smartid_auth": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/bing_ads": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/change_author_action": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/node_export": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/facebook_pixel": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/tupas": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/bulk_update_fields_commerce": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/kamihaya_cms": [ - "ReplaceSessionManagerDeleteRector", - "ReplaceThemeGetSettingRector" - ], - "project/acumatica": [ - "ReplaceSessionManagerDeleteRector", - "ReplaceSessionWritesWithRequestSessionRector" - ], - "project/cm_data_layer": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/commerce_qb_webconnect": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/global_gateway": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/simpleavs": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/eid_auth": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/evangelische_termine": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/xing_connect": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/saml_idp": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/mailing_list": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/twilio_otp_login": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/examplelist": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/registration_form": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/loginnotification": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/rules": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/questions_answers": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/stenographer": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/entity_sync": [ - "ReplaceSessionManagerDeleteRector", - "ReplaceSessionWritesWithRequestSessionRector" - ], - "project/bulk_copy_fields": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/activity": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/anonymoussession": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/entity_sync_odata": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/real_estate_lp_profile": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/userswitch": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/login_alert": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/eus": [ - "ReplaceSessionManagerDeleteRector", - "ReplaceUserSessionNamePropertyRector" - ], - "project/commerce_ticketing_checkin": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/session_inspector": [ - "ReplaceSessionManagerDeleteRector", - "ReplaceUserSessionNamePropertyRector" - ], - "project/page_hits": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/admin_can_login_anyuser": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/big_pipe_demo": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/session_management": [ - "ReplaceSessionManagerDeleteRector", - "ReplaceUserSessionNamePropertyRector" - ], - "project/csv_to_config": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/quicker_login": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/oidc": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/devel": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/bulk_update_fields": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/externalauth_force": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/restrict_by_ip": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/user_logout": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/tmgmt_smartling": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/oidc_mcpf": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/simple_node_importer": [ - "ReplaceSessionManagerDeleteRector" - ], - "project/session_entity": [ - "ReplaceSessionWritesWithRequestSessionRector" - ], - "project/session_proxy": [ - "ReplaceSessionWritesWithRequestSessionRector" - ], - "project/xmpp_server": [ - "ReplaceSessionWritesWithRequestSessionRector" - ], - "project/jp_mobile": [ - "ReplaceSessionWritesWithRequestSessionRector" - ], - "project/commerce7_razorpay": [ - "ReplaceSessionWritesWithRequestSessionRector" - ], - "project/kalvi_core": [ - "ReplaceSessionWritesWithRequestSessionRector" - ], - "project/events_features": [ - "ReplaceSessionWritesWithRequestSessionRector" - ], - "project/cache": [ - "ReplaceSessionWritesWithRequestSessionRector" - ], - "project/telega": [ - "ReplaceSessionWritesWithRequestSessionRector" - ], - "project/chatwee": [ - "ReplaceSessionWritesWithRequestSessionRector" - ], - "project/cypress": [ - "ReplaceSessionWritesWithRequestSessionRector" - ], - "project/intercept": [ - "ReplaceSessionWritesWithRequestSessionRector" - ], - "project/soauth": [ - "ReplaceSessionWritesWithRequestSessionRector" - ], - "project/views_extras": [ - "ReplaceSessionWritesWithRequestSessionRector" - ], - "project/casperjs": [ - "ReplaceSessionWritesWithRequestSessionRector" - ], - "project/eventbrite_one_way_sync": [ - "ReplaceSessionWritesWithRequestSessionRector" - ], - "project/drupal_canvas_plugin": [ - "ReplaceSessionWritesWithRequestSessionRector" - ], - "project/delphi": [ - "ReplaceSessionWritesWithRequestSessionRector" - ], - "project/drd": [ - "ReplaceModuleHandlerGetNameRector", - "ReplaceSessionWritesWithRequestSessionRector", - "ReplaceSystemPerformanceGzipKeyRector" - ], - "project/simplesamlphp_sp": [ - "ReplaceSessionWritesWithRequestSessionRector" - ], - "project/drupalcon_base": [ - "ReplaceSessionWritesWithRequestSessionRector" - ], - "project/css_gzip": [ - "ReplaceSystemPerformanceGzipKeyRector" - ], - "project/flysystem": [ - "ReplaceSystemPerformanceGzipKeyRector" - ], - "project/tone": [ - "ReplaceSystemPerformanceGzipKeyRector" - ], - "project/settingsphp": [ - "ReplaceSystemPerformanceGzipKeyRector" - ], - "project/css_emimage": [ - "ReplaceSystemPerformanceGzipKeyRector" - ], - "project/timber": [ - "ReplaceSystemPerformanceGzipKeyRector" - ], - "project/hpcloud": [ - "ReplaceSystemPerformanceGzipKeyRector" - ], - "project/openstack_storage": [ - "ReplaceSystemPerformanceGzipKeyRector" - ], - "project/simple_aggregation": [ - "ReplaceSystemPerformanceGzipKeyRector" - ], - "project/advagg": [ - "ReplaceSystemPerformanceGzipKeyRector" - ], - "project/d_test": [ - "ReplaceSystemPerformanceGzipKeyRector" - ], - "project/exsen": [ - "ReplaceSystemPerformanceGzipKeyRector" - ], - "project/smartcache": [ - "ReplaceSystemPerformanceGzipKeyRector" - ], - "project/devinci": [ - "ReplaceSystemPerformanceGzipKeyRector" - ], - "project/barracuda": [ - "ReplaceSystemPerformanceGzipKeyRector" - ], - "project/octopus": [ - "ReplaceSystemPerformanceGzipKeyRector" - ], - "project/cf": [ - "ReplaceSystemPerformanceGzipKeyRector" - ], - "project/domain_wise_aggregation": [ - "ReplaceSystemPerformanceGzipKeyRector" - ], - "project/bootstrap4": [ - "ReplaceSystemPerformanceGzipKeyRector" - ], - "project/bootstrap5": [ - "ReplaceSystemPerformanceGzipKeyRector" - ], - "project/stage_one_theme": [ - "ReplaceSystemPerformanceGzipKeyRector" - ], - "project/dawn": [ - "ReplaceSystemPerformanceGzipKeyRector" - ], - "project/background_image": [ - "ReplaceSystemPerformanceGzipKeyRector" - ], - "project/vagrant": [ - "ReplaceSystemPerformanceGzipKeyRector" - ], - "project/audit": [ - "ReplaceSystemPerformanceGzipKeyRector" - ], - "project/novalnet": [ - "ReplaceSystemPerformanceGzipKeyRector" - ], - "project/mongodrop": [ - "ReplaceSystemPerformanceGzipKeyRector" - ], - "project/ads": [ - "ReplaceSystemPerformanceGzipKeyRector" - ], - "project/bundle_aggregation": [ - "ReplaceSystemPerformanceGzipKeyRector" - ], - "project/drupalsqlsrvci": [ - "ReplaceSystemPerformanceGzipKeyRector" - ], - "project/tmgmt_transifex": [ - "ReplaceSystemPerformanceGzipKeyRector" - ], - "project/infrastructure": [ - "ReplaceSystemPerformanceGzipKeyRector" - ], - "project/dsfr": [ - "ReplaceThemeGetSettingRector" - ], - "project/browsersync": [ - "ReplaceThemeGetSettingRector" - ], - "project/commerce_factuursturen": [ - "ReplaceThemeGetSettingRector" - ], - "project/arctica": [ - "ReplaceThemeGetSettingRector" - ], - "project/dxpr_theme": [ - "ReplaceThemeGetSettingRector" - ], - "project/glazed_free": [ - "ReplaceThemeGetSettingRector" - ], - "project/diner_delights": [ - "ReplaceThemeGetSettingRector" - ], - "project/xara": [ - "ReplaceThemeGetSettingRector" - ], - "project/bootstrap_italia": [ - "ReplaceThemeGetSettingRector" - ], - "project/onus": [ - "ReplaceThemeGetSettingRector" - ], - "project/edux": [ - "ReplaceThemeGetSettingRector" - ], - "project/ruhi": [ - "ReplaceThemeGetSettingRector" - ], - "project/eau_theme": [ - "ReplaceThemeGetSettingRector" - ], - "project/vani": [ - "ReplaceThemeGetSettingRector" - ], - "project/lgms": [ - "ReplaceThemeGetSettingRector" - ], - "project/multi_purpose": [ - "ReplaceThemeGetSettingRector" - ], - "project/marvelous": [ - "ReplaceThemeGetSettingRector" - ], - "project/yg_business_plus": [ - "ReplaceThemeGetSettingRector" - ], - "project/tactic": [ - "ReplaceThemeGetSettingRector" - ], - "project/denver": [ - "ReplaceThemeGetSettingRector" - ], - "project/belle": [ - "ReplaceThemeGetSettingRector" - ], - "project/crypto_distribution": [ - "ReplaceThemeGetSettingRector" - ], - "project/photogenictheme": [ - "ReplaceThemeGetSettingRector" - ], - "project/yg_business_line": [ - "ReplaceThemeGetSettingRector" - ], - "project/kart": [ - "ReplaceThemeGetSettingRector" - ], - "project/catalog_lite": [ - "ReplaceThemeGetSettingRector" - ], - "project/conference_lite": [ - "ReplaceThemeGetSettingRector" - ], - "project/yg_hotel": [ - "ReplaceThemeGetSettingRector" - ], - "project/novel_delights": [ - "ReplaceThemeGetSettingRector" - ], - "project/dark_awesome": [ - "ReplaceThemeGetSettingRector" - ], - "project/smash_lite": [ - "ReplaceThemeGetSettingRector" - ], - "project/potent_allure": [ - "ReplaceThemeGetSettingRector" - ], - "project/yg_iconic": [ - "ReplaceThemeGetSettingRector" - ], - "project/animal_shelter": [ - "ReplaceThemeGetSettingRector" - ], - "project/byu_theme": [ - "ReplaceThemeGetSettingRector" - ], - "project/black_hole": [ - "ReplaceThemeGetSettingRector" - ], - "project/elegant_showcase": [ - "ReplaceThemeGetSettingRector" - ], - "project/feature_boost": [ - "ReplaceThemeGetSettingRector" - ], - "project/zuvi": [ - "ReplaceThemeGetSettingRector" - ], - "project/aether": [ - "ReplaceThemeGetSettingRector" - ], - "project/mahi": [ - "ReplaceThemeGetSettingRector" - ], - "project/zeropoint": [ - "ReplaceThemeGetSettingRector" - ], - "project/business_dev": [ - "ReplaceThemeGetSettingRector" - ], - "project/uni": [ - "ReplaceThemeGetSettingRector" - ], - "project/edwt": [ - "ReplaceThemeGetSettingRector" - ], - "project/scholarly_lite": [ - "ReplaceThemeGetSettingRector" - ], - "project/abc": [ - "ReplaceThemeGetSettingRector" - ], - "project/showcase_lite": [ - "ReplaceThemeGetSettingRector" - ], - "project/yg_aesthetic": [ - "ReplaceThemeGetSettingRector" - ], - "project/yg_booster": [ - "ReplaceThemeGetSettingRector" - ], - "project/saar": [ - "ReplaceThemeGetSettingRector" - ], - "project/yg_charity": [ - "ReplaceThemeGetSettingRector" - ], - "project/tara": [ - "ReplaceThemeGetSettingRector" - ], - "project/yg_creative": [ - "ReplaceThemeGetSettingRector" - ], - "project/yg_flew": [ - "ReplaceThemeGetSettingRector" - ], - "project/mobile_jquery": [ - "ReplaceThemeGetSettingRector" - ], - "project/harmony_haven": [ - "ReplaceThemeGetSettingRector" - ], - "project/yg_medical": [ - "ReplaceThemeGetSettingRector" - ], - "project/dolphin_theme": [ - "ReplaceThemeGetSettingRector" - ], - "project/pets_clinic": [ - "ReplaceThemeGetSettingRector" - ], - "project/mili": [ - "ReplaceThemeGetSettingRector" - ], - "project/particles_orange": [ - "ReplaceThemeGetSettingRector" - ], - "project/nava": [ - "ReplaceThemeGetSettingRector" - ], - "project/green_theme": [ - "ReplaceThemeGetSettingRector" - ], - "project/yg_black": [ - "ReplaceThemeGetSettingRector" - ], - "project/berry": [ - "ReplaceThemeGetSettingRector" - ], - "project/dark_page": [ - "ReplaceThemeGetSettingRector" - ], - "project/corporate_lite": [ - "ReplaceThemeGetSettingRector" - ], - "project/cellular4drupal": [ - "ReplaceThemeGetSettingRector" - ], - "project/rhythm": [ - "ReplaceThemeGetSettingRector" - ], - "project/ajans": [ - "ReplaceThemeGetSettingRector" - ], - "project/fashion_beauty": [ - "ReplaceThemeGetSettingRector" - ], - "project/portal_theme": [ - "ReplaceThemeGetSettingRector" - ], - "project/zinble": [ - "ReplaceThemeGetSettingRector" - ], - "project/diba_clean": [ - "ReplaceThemeGetSettingRector" - ], - "project/adt_basetheme": [ - "ReplaceThemeGetSettingRector" - ], - "project/yg_law_firm": [ - "ReplaceThemeGetSettingRector" - ], - "project/power_portfolio": [ - "ReplaceThemeGetSettingRector" - ], - "project/yg_medicare": [ - "ReplaceThemeGetSettingRector" - ], - "project/guesthouse_lite": [ - "ReplaceThemeGetSettingRector" - ], - "project/minimal_lite": [ - "ReplaceThemeGetSettingRector" - ], - "project/idyllic": [ - "ReplaceThemeGetSettingRector" - ], - "project/mycity": [ - "ReplaceThemeGetSettingRector" - ], - "project/creative_innovative": [ - "ReplaceThemeGetSettingRector" - ], - "project/decorx": [ - "ReplaceThemeGetSettingRector" - ], - "project/yg_solid": [ - "ReplaceThemeGetSettingRector" - ], - "project/stack_dd": [ - "ReplaceThemeGetSettingRector" - ], - "project/agov_base": [ - "ReplaceThemeGetSettingRector" - ], - "project/materialize": [ - "ReplaceThemeGetSettingRector" - ], - "project/plus": [ - "ReplaceThemeGetSettingRector" - ], - "project/bootstrap3": [ - "ReplaceThemeGetSettingRector" - ], - "project/controller_annotations": [ - "ReplaceUserSessionNamePropertyRector" - ], - "project/acquia_perz": [ - "ReplaceUserSessionNamePropertyRector" - ], - "project/acquia_vwo": [ - "ReplaceUserSessionNamePropertyRector" - ], - "project/complex_workflow": [ - "ReplaceUserSessionNamePropertyRector" - ], - "project/dbee": [ - "ReplaceUserSessionNamePropertyRector" - ], - "project/lw_groups": [ - "ReplaceUserSessionNamePropertyRector" - ], - "project/role_inheritance": [ - "ReplaceUserSessionNamePropertyRector" - ], - "project/clu": [ - "ReplaceUserSessionNamePropertyRector" - ], - "project/restful": [ - "ReplaceUserSessionNamePropertyRector" - ], - "project/acquia_commercemanager": [ - "ReplaceModuleHandlerGetNameRector", - "ReplaceRequestTimeConstantRector", - "ReplaceUserSessionNamePropertyRector" - ], - "project/drupalfit": [ - "ReplaceUserSessionNamePropertyRector" - ], - "project/entity_mesh": [ - "ReplaceUserSessionNamePropertyRector" - ], - "project/monitoring": [ - "ReplaceUserSessionNamePropertyRector" - ], - "project/paddle_selenium_tests": [ - "ReplaceUserSessionNamePropertyRector" - ], - "project/probo": [ - "ReplaceUserSessionNamePropertyRector" - ], - "project/program": [ - "ReplaceUserSessionNamePropertyRector" - ], - "project/search_api_exclude_lb": [ - "ReplaceUserSessionNamePropertyRector" - ], - "project/drupal_content_repository": [ - "ReplaceUserSessionNamePropertyRector" - ], - "project/field": [ - "ReplaceUserSessionNamePropertyRector" - ], - "project/neon_api": [ - "ReplaceUserSessionNamePropertyRector" - ], - "project/miniorange_oauth_client": [ - "ReplaceUserSessionNamePropertyRector" - ], - "project/publisso_gold": [ - "ReplaceUserSessionNamePropertyRector" - ], - "project/apigee_m10n": [ - "ReplaceUserSessionNamePropertyRector" - ], - "project/scorm_field": [ - "ReplaceUserSessionNamePropertyRector" - ], - "project/services_session_token_auth": [ - "ReplaceUserSessionNamePropertyRector" - ], - "project/synonyms": [ - "ReplaceUserSessionNamePropertyRector" - ], - "project/turbo": [ - "ReplaceUserSessionNamePropertyRector" - ], - "project/riddler": [ - "ReplaceUserSessionNamePropertyRector" - ], - "project/socialblue": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/drupal_extra": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/commerce_payleap": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/featured_news_feature": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/delivery": [ - "ReplaceViewsProceduralFunctionsRector", - "ViewsPluginHandlerManagerRector" - ], - "project/gathercontent": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/vfd": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/abookings": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/feeds_view_parser": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/at_theming": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/outlayer": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/dvg": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/sensor_hub": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/wechat_views": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/quicktabs": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/yaqut_epub_generator": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/conference_suite": [ - "ReplaceRequestTimeConstantRector", - "ReplaceViewsProceduralFunctionsRector", - "SystemTimeZonesRector" - ], - "project/ercore": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/courseplanner": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/hunter": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/eform": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/manymail": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/product_reference_view": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/oa_folders": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/degov": [ - "ReplaceModuleHandlerGetNameRector", - "ReplaceViewsProceduralFunctionsRector" - ], - "project/proconcom": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/ctools_view_access": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/content_packager": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/sshop": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/nodereference_basket": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/abinbev_gmap": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/background_audio": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/rules_example": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/simple_sitemap": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/time_tracker_simple": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/simple_sitemap_views": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/viewfield": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/simple_sitemap_authenticated": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/next_views_entity_reference": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/deeplink": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/pdfck": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/highcharts": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/prometheus": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/featured_content": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/openstory": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/student_signup": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/knowledge": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/shopcart": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/openbadging": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/feeds_tamper_string2id": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/facet_granular_date": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/qtools_common": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/commerce_checkout_products_list": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/ectostar_standard": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/entityform": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/xml_export": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/twig_tweak": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/api": [ - "ReplaceViewsProceduralFunctionsRector", - "ViewsPluginHandlerManagerRector" - ], - "project/hose_xml": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/views": [ - "ReplaceViewsProceduralFunctionsRector", - "SystemTimeZonesRector" - ], - "project/internet_archive": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/taxonomy_display": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/related_content": [ - "ReplaceViewsProceduralFunctionsRector" - ], - "project/views_migration": [ - "ViewsPluginHandlerManagerRector" - ], - "project/migrate_views": [ - "ViewsPluginHandlerManagerRector" - ], - "project/plugin": [ - "ViewsPluginHandlerManagerRector" - ], - "project/itunes_rss": [ - "ViewsPluginHandlerManagerRector" - ], - "project/quick_pages": [ - "ViewsPluginHandlerManagerRector" - ], - "project/bat": [ - "ViewsPluginHandlerManagerRector" - ], - "project/social_group_types": [ - "ViewsPluginHandlerManagerRector" - ], - "project/pub_options": [ - "ViewsPluginHandlerManagerRector" - ], - "project/grant": [ - "ViewsPluginHandlerManagerRector" - ], - "project/entity_reference_uuid": [ - "ViewsPluginHandlerManagerRector" - ], - "project/shopify": [ - "ViewsPluginHandlerManagerRector" - ], - "project/muser": [ - "ViewsPluginHandlerManagerRector" - ], - "project/relation": [ - "ViewsPluginHandlerManagerRector" - ], - "project/basket": [ - "ReplaceModuleHandlerGetNameRector", - "ViewsPluginHandlerManagerRector" - ], - "project/config_pages": [ - "ViewsPluginHandlerManagerRector" - ], - "project/access_policy": [ - "SystemTimeZonesRector", - "ViewsPluginHandlerManagerRector" - ], - "project/ai_agents": [ - "ViewsPluginHandlerManagerRector" - ], - "project/views_moderation_state_weights": [ - "ViewsPluginHandlerManagerRector" - ], - "project/past": [ - "ViewsPluginHandlerManagerRector" - ], - "project/tally": [ - "ViewsPluginHandlerManagerRector" - ], - "project/opendevportal": [ - "ViewsPluginHandlerManagerRector" - ], - "project/expirable_content": [ - "ViewsPluginHandlerManagerRector" - ], - "project/group_domain": [ - "ViewsPluginHandlerManagerRector" - ], - "project/rel_content": [ - "ViewsPluginHandlerManagerRector" - ], - "project/a12s_locations": [ - "ViewsPluginHandlerManagerRector" - ], - "project/opigno_learning_path": [ - "ViewsPluginHandlerManagerRector" - ], - "project/ezcontent_api": [ - "ViewsPluginHandlerManagerRector" - ], - "project/entity_grants": [ - "ViewsPluginHandlerManagerRector" - ], - "project/recurly": [ - "ViewsPluginHandlerManagerRector" - ], - "project/media_views_filter": [ - "ViewsPluginHandlerManagerRector" - ], - "project/visitors": [ - "ViewsPluginHandlerManagerRector" - ], - "project/views_natural_sort": [ - "ViewsPluginHandlerManagerRector" - ], - "project/multilingual_plus": [ - "ViewsPluginHandlerManagerRector" - ], - "project/lms": [ - "ViewsPluginHandlerManagerRector" - ], - "project/entity_hierarchy": [ - "ViewsPluginHandlerManagerRector" - ], - "project/communication": [ - "ViewsPluginHandlerManagerRector" - ], - "project/views_sql_twig_fields": [ - "ViewsPluginHandlerManagerRector" - ], - "project/social_lms_integrator": [ - "ViewsPluginHandlerManagerRector" - ], - "project/group_welcome_message": [ - "ViewsPluginHandlerManagerRector" - ], - "project/views_linkarea": [ - "ViewsPluginHandlerManagerRector" - ], - "project/views_entity_embed": [ - "ViewsPluginHandlerManagerRector" - ], - "project/ggroup": [ - "ViewsPluginHandlerManagerRector" - ], - "project/consent_management": [ - "ViewsPluginHandlerManagerRector" - ], - "project/cms_content_sync": [ - "ViewsPluginHandlerManagerRector" - ], - "project/unused_files_delete": [ - "ViewsPluginHandlerManagerRector" - ], - "project/mdp": [ - "ViewsPluginHandlerManagerRector" - ], - "project/media_filter": [ - "ViewsPluginHandlerManagerRector" - ], - "project/thunder": [ - "ViewsPluginHandlerManagerRector" - ], - "project/entity_distribution": [ - "ViewsPluginHandlerManagerRector" - ], - "project/dut": [ - "ViewsPluginHandlerManagerRector" - ], - "project/discussions": [ - "ViewsPluginHandlerManagerRector" - ], - "project/unused_media_filter": [ - "ViewsPluginHandlerManagerRector" - ], - "project/views_exclude_previous": [ - "ViewsPluginHandlerManagerRector" - ], - "project/heartbeat": [ - "ViewsPluginHandlerManagerRector" - ], - "project/field_encrypt_searchable": [ - "ViewsPluginHandlerManagerRector" - ], - "project/dplor": [ - "ViewsPluginHandlerManagerRector" - ], - "project/view_filter_promotion": [ - "ViewsPluginHandlerManagerRector" - ], - "project/friendship": [ - "ViewsPluginHandlerManagerRector" - ], - "project/group_media_library_extra": [ - "ViewsPluginHandlerManagerRector" - ], - "project/hubspot_integration": [ - "ViewsPluginHandlerManagerRector" - ], - "project/tmgmt_deepl": [ - "ViewsPluginHandlerManagerRector" - ], - "project/taxonomy_parents_index": [ - "ViewsPluginHandlerManagerRector" - ], - "project/nodehive_core": [ - "ViewsPluginHandlerManagerRector" - ], - "project/workbench_moderation": [ - "ViewsPluginHandlerManagerRector" - ], - "project/untatu": [ - "ViewsPluginHandlerManagerRector" - ], - "project/service": [ - "ReplaceModuleHandlerGetNameRector", - "ViewsPluginHandlerManagerRector" - ], - "project/islandora": [ - "ReplaceModuleHandlerGetNameRector", - "ViewsPluginHandlerManagerRector" - ], - "project/entity_domain_access": [ - "ViewsPluginHandlerManagerRector" - ], - "project/diboo_core": [ - "ViewsPluginHandlerManagerRector" - ], - "project/usage_data": [ - "ViewsPluginHandlerManagerRector" - ], - "project/opigno_social": [ - "ViewsPluginHandlerManagerRector" - ], - "project/private_message": [ - "ViewsPluginHandlerManagerRector" - ], - "project/translation_views": [ - "ViewsPluginHandlerManagerRector" - ], - "project/rng": [ - "ViewsPluginHandlerManagerRector" - ], - "project/moderation_team": [ - "ViewsPluginHandlerManagerRector" - ], - "project/template_entities": [ - "ViewsPluginHandlerManagerRector" - ], - "project/entityqueue": [ - "ViewsPluginHandlerManagerRector" - ], - "project/geolocation": [ - "ViewsPluginHandlerManagerRector" - ], - "project/chartjs": [ - "ViewsPluginHandlerManagerRector" - ], - "project/visualization_d8": [ - "ViewsPluginHandlerManagerRector" - ], - "project/visualization": [ - "ViewsPluginHandlerManagerRector" - ], - "project/views_override_viewmode": [ - "ViewsPluginHandlerManagerRector" - ], - "project/meta_entity": [ - "ViewsPluginHandlerManagerRector" - ], - "project/trash": [ - "ViewsPluginHandlerManagerRector" - ], - "project/content_moderation_node_grants": [ - "ViewsPluginHandlerManagerRector" - ], - "project/custom_list": [ - "ViewsPluginHandlerManagerRector" - ], - "project/views_selective_filters": [ - "ViewsPluginHandlerManagerRector" - ], - "project/calendar": [ - "ViewsPluginHandlerManagerRector" - ], - "project/test_helpers": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/uninstall_unexisting": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/hook_profiler": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/autosave_form": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/schema": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/hook_manager": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/hookalyzer": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/hook_event": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/hooks": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/eventer": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/gearbox": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/simplifying": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/nostr_id_nip05": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/rocket_chat": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/image_moderate": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/auto_alter": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/worldmap": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/config_entity_revisions": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/social_hub": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/social_post_video": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/confi": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/sitemorse_lite": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/views_extender": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/nitropack": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/function_autoload": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/console": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/multiversion": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/disable_modules": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/localist_drupal": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/migrate_visualize": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/mutual_credit": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/schema_form": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/entity_track": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/layoutcomponents": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/lightning_core": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/nodeinfo": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/lightning_layout": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/contacts": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/social_media_integration": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/sanitize_pii": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/slack_receive": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/licenses": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/workflow_extras": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/asset_autoload": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/ai_upgrade_assistant": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/entity_keyvalue": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/toast_messages": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/message_private": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/audit_monitoring": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/orchestration": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/sitewide_alerts": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/flow": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/domain_simple_sitemap": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/pager_serializer": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/languagefield": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/message_thread": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/bibliocommons": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/commerce_currency_switcher": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/social_auth_tiktok_decouple": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/social_auth_apple_decouple": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/file_update": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/simple_oauth_google_connect": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/nbox": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/pwbi": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/ppoidc": [ - "ReplaceModuleHandlerGetNameRector", - "SystemTimeZonesRector" - ], - "project/robolytix": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/pki_ra": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/date_augmenter": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/rmkv": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/simple_oauth_facebook_connect": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/cookies_module_handler": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/module_maker": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/client_config_care": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/ws_event": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/social_auth_itsme": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/onlyone": [ - "ReplaceModuleHandlerGetNameRector" - ], - "project/supercache": [ - "ReplaceRequestTimeConstantRector" - ], - "project/engagement": [ - "ReplaceRequestTimeConstantRector" - ], - "project/context_date": [ - "ReplaceRequestTimeConstantRector" - ], - "project/computed_field": [ - "ReplaceRequestTimeConstantRector" - ], - "project/automatic_updates": [ - "ReplaceRequestTimeConstantRector" - ], - "project/wem": [ - "ReplaceRequestTimeConstantRector" - ], - "project/preserve_changed": [ - "ReplaceRequestTimeConstantRector" - ], - "project/random_weight": [ - "ReplaceRequestTimeConstantRector" - ], - "project/participatory_process": [ - "ReplaceRequestTimeConstantRector" - ], - "project/fts": [ - "ReplaceRequestTimeConstantRector" - ], - "project/geckoboard_push": [ - "ReplaceRequestTimeConstantRector" - ], - "project/node_announce": [ - "ReplaceRequestTimeConstantRector" - ], - "project/course": [ - "ReplaceRequestTimeConstantRector" - ], - "project/queue_scheduler": [ - "ReplaceRequestTimeConstantRector" - ], - "project/authtoken": [ - "ReplaceRequestTimeConstantRector" - ], - "project/acquia_search_config": [ - "ReplaceRequestTimeConstantRector" - ], - "project/new_relic_insights": [ - "ReplaceRequestTimeConstantRector" - ], - "project/performance_toolkit": [ - "ReplaceRequestTimeConstantRector" - ], - "project/fluxservice": [ - "ReplaceRequestTimeConstantRector" - ], - "project/ua_cache_bypass": [ - "ReplaceRequestTimeConstantRector" - ], - "project/commerce_order_reminder": [ - "ReplaceRequestTimeConstantRector" - ], - "project/priority_queue": [ - "ReplaceRequestTimeConstantRector" - ], - "project/db_remote": [ - "ReplaceRequestTimeConstantRector" - ], - "project/inactive_user": [ - "ReplaceRequestTimeConstantRector" - ], - "project/election": [ - "ReplaceRequestTimeConstantRector" - ], - "project/brilliant_gallery": [ - "ReplaceRequestTimeConstantRector" - ], - "project/uc_abandoned": [ - "ReplaceRequestTimeConstantRector" - ], - "project/commerce_booking": [ - "ReplaceRequestTimeConstantRector" - ], - "project/pax_content": [ - "ReplaceRequestTimeConstantRector" - ], - "project/commerce_priceminister": [ - "ReplaceRequestTimeConstantRector" - ], - "project/node_expire": [ - "ReplaceRequestTimeConstantRector" - ], - "project/quizz": [ - "ReplaceRequestTimeConstantRector" - ], - "project/tagged_systemqueue": [ - "ReplaceRequestTimeConstantRector" - ], - "project/optimizedb": [ - "ReplaceRequestTimeConstantRector" - ], - "project/adbc": [ - "ReplaceRequestTimeConstantRector" - ], - "project/ecwid": [ - "ReplaceRequestTimeConstantRector" - ], - "project/freshdesk_sso": [ - "ReplaceRequestTimeConstantRector" - ], - "project/future_nodes": [ - "ReplaceRequestTimeConstantRector" - ], - "project/gitinfo": [ - "ReplaceRequestTimeConstantRector" - ], - "project/google_analytics_counter": [ - "ReplaceRequestTimeConstantRector" - ], - "project/cache_backport": [ - "ReplaceRequestTimeConstantRector" - ], - "project/clockify": [ - "ReplaceRequestTimeConstantRector" - ], - "project/amazon": [ - "ReplaceRequestTimeConstantRector" - ], - "project/settings_audit_log": [ - "ReplaceRequestTimeConstantRector" - ], - "project/one_time_login": [ - "ReplaceRequestTimeConstantRector" - ], - "project/motionpoint": [ - "ReplaceRequestTimeConstantRector" - ], - "project/uc_recently_viewed_products": [ - "ReplaceRequestTimeConstantRector" - ], - "project/anonymous_publishing": [ - "ReplaceRequestTimeConstantRector" - ], - "project/sri": [ - "ReplaceRequestTimeConstantRector" - ], - "project/drush_async_api": [ - "ReplaceRequestTimeConstantRector" - ], - "project/list_predefined_options": [ - "SystemTimeZonesRector" - ], - "project/dummy_content": [ - "SystemTimeZonesRector" - ], - "project/veracity_vql": [ - "SystemTimeZonesRector" - ], - "project/tzfield": [ - "SystemTimeZonesRector" - ], - "project/intl_date": [ - "SystemTimeZonesRector" - ], - "project/sfactive": [ - "SystemTimeZonesRector" - ], - "project/smart_date": [ - "SystemTimeZonesRector" - ], - "project/condition_pack": [ - "SystemTimeZonesRector" - ], - "project/daterange_simplify": [ - "SystemTimeZonesRector" - ], - "project/current_date_time": [ - "SystemTimeZonesRector" - ], - "project/timezone_calculator": [ - "SystemTimeZonesRector" - ], - "project/almanac": [ - "SystemTimeZonesRector" - ], - "project/paypal_roles": [ - "SystemTimeZonesRector" - ], - "project/salesforce_push_queue_ui": [ - "SystemTimeZonesRector" - ], - "project/time_clock": [ - "SystemTimeZonesRector" - ], - "project/substitutoo": [ - "SystemTimeZonesRector" - ], - "project/date_occur": [ - "SystemTimeZonesRector" - ], - "project/feeds_entity_processor": [ - "SystemTimeZonesRector" - ], - "project/timezone_picker": [ - "SystemTimeZonesRector" - ], - "project/smart_content_ipstack": [ - "SystemTimeZonesRector" - ], - "project/user_access_timeslot": [ - "SystemTimeZonesRector" - ], - "project/everlms": [ - "SystemTimeZonesRector" - ], - "project/custom_entity_example": [ - "SystemTimeZonesRector" - ], - "project/rocketship_florista_demo_profile": [ - "SystemTimeZonesRector" - ], - "project/openid_connect": [ - "SystemTimeZonesRector" - ], - "project/library_management_system": [ - "SystemTimeZonesRector" - ], - "project/commerce_installments": [ - "SystemTimeZonesRector" - ], - "project/mtc": [ - "SystemTimeZonesRector" - ], - "project/digitalclock": [ - "SystemTimeZonesRector" - ], - "project/better_field_formatters": [ - "SystemTimeZonesRector" - ], - "project/crema": [ - "SystemTimeZonesRector" - ], - "project/variable": [ - "SystemTimeZonesRector" - ], - "project/cm_cablecast": [ - "SystemTimeZonesRector" - ], - "project/datex": [ - "SystemTimeZonesRector" - ], - "project/makemeeting": [ - "SystemTimeZonesRector" - ], - "project/booking_timeslots": [ - "SystemTimeZonesRector" - ], - "project/ar": [ - "SystemTimeZonesRector" - ], - "project/search_api_lucene": [ - "SystemTimeZonesRector" - ], - "project/cilogon_auth": [ - "SystemTimeZonesRector" - ] - } -} diff --git a/docs/targeted_progress.log b/docs/targeted_progress.log deleted file mode 100644 index 4f6c01baa..000000000 --- a/docs/targeted_progress.log +++ /dev/null @@ -1,351 +0,0 @@ - -LoadAllIncludesRector: 'loadAllIncludes ModuleHandler' - page 1: 17 hits - skip: project/service_container - skip: project/openlayers - skip: project/schema - ✓ D11: project/migrate_boost - ✓ D11: project/config_track - skip: project/nuclear - skip: project/hook_event - skip: project/sir_trevor - ✓ D11: project/hux - skip: project/hook_event_dispatcher - skip: project/qd_screenshottests - ✓ D11: project/update_worker - ✓ D11: project/drupalmoduleupgrader - ✓ D11: project/graphapi - ✓ D11: project/schemadotorg - skip: project/xmlsitemap - -MigrateSqlGetMigrationPluginManagerRector: 'getMigrationPluginManager migrate' - page 1: 3 hits - ✓ D11: project/feeds_migrate - ✓ D11: project/smart_sql_idmap - ✓ D11: project/migmag - -PluginBaseIsConfigurableRector: 'isConfigurable PluginBase' - page 1: 31 hits - ✓ D11: project/localgov_publications_importer - ✓ D11: project/autotagger - ✓ D11: project/api - skip: project/tracardi - skip: project/entity_embed_extras - ✓ D11: project/content_planner - skip: project/tripal - ✓ D11: project/plugin_constructor_factory - skip: project/blaze - ✓ D11: project/metatag - ✓ D11: project/json_drop_api - skip: project/elasticsearch_helper_views - ✓ D11: project/localgov_elections - ✓ D11: project/geocoder - skip: project/table_of_contents - ✓ D11: project/oswald - ✓ D11: project/xbbcode - ✓ D11: project/localgov_publications_importer_copilot - ✓ D11: project/views_bulk_operations - ✓ D11: project/search_api - skip: project/deprecation_status - -RemoveModuleHandlerAddModuleCallsRector: 'addModule ModuleHandlerInterface' - page 1: 24 hits - skip: project/service - ✓ D11: project/depcalc - ✓ D11: project/fleetview_client - ✓ D11: project/sdx - ✓ D11: project/simplifying - ✓ D11: project/ai_watchdog_analyst - ✓ D11: project/acquia_contenthub - ✓ D11: project/component_entity - ✓ D11: project/ai_vdb_provider_pinecone - ✓ D11: project/ai_vdb_provider_milvus - ✓ D11: project/rift_recipe - skip: project/views_config_field - -RemoveModuleHandlerDeprecatedMethodsRector: 'writeCache ModuleHandler' - page 1: 20 hits - skip: project/hooks - ✓ D11: project/jsonld - skip: project/hal - skip: project/skinr - skip: project/s3fs - ✓ D11: project/captcha - skip: project/gclient_storage - -RemoveSetUriCallbackRector: 'setUriCallback EntityType' - page 1: 2 hits - ✓ D11: project/rabbit_hole_href - skip: project/i18n - -RemoveTrustDataCallRector: 'trustData Config' - page 1: 86 hits - ✓ D11: project/eca - skip: project/canvas - ✓ D11: project/parameters - ✓ D11: project/slots - ✓ D11: project/cms_core - skip: project/social - skip: project/commerce_order_action_reassign_owner - skip: project/config_actions - ✓ D11: project/userprotect - skip: project/social_lms_integrator - ✓ D11: project/acquia_cms_headless - ✓ D11: project/storage - ✓ D11: project/config_plus - ✓ D11: project/views_dependent_filters - ✓ D11: project/complete_webform_exporter - ✓ D11: project/workbench_moderation_actions - ✓ D11: project/smart_title - skip: project/apigee_edge - ✓ D11: project/monitoring - ✓ D11: project/varbase_workflow - skip: project/hn - ✓ D11: project/commerce_square - skip: project/gcontent_moderation - skip: project/bene - ✓ D11: project/preview_site - skip: project/degov - skip: project/acquia_migrate - ✓ D11: project/acquia_starterkits - ✓ D11: project/scheduled_publish - ✓ D11: project/output_format_api - ✓ D11: project/workbench_email - skip: project/price - ✓ D11: project/theming_tools - ✓ D11: project/elasticsearch_helper - skip: project/blazy - skip: project/mailgroup - skip: project/dxpr_marketing_cms - skip: project/braintree_cashier - ✓ D11: project/epm - ✓ D11: project/og - skip: project/razoreye_biz - skip: project/tiendaparamipyme - ✓ D11: project/redirect - skip: project/core_extend - skip: project/pankm - ✓ D11: project/pluggable_entity_view_builder - ✓ D11: project/gutenberg - skip: project/field_permissions_group - ✓ D11: project/group - skip: project/foldershare - skip: project/group_entity - ✓ D11: project/flag - ✓ D11: project/simplenews - ✓ D11: project/entity_browser - ✓ D11: project/eca_cm - ✓ D11: project/jsonapi - -ReplaceCommentManagerGetCountNewCommentsRector: 'getCountNewComments CommentManager' - page 1: 4 hits - ✓ D11: project/history - skip: project/comment_perm - ✓ D11: project/forum - -ReplaceEntityOriginalPropertyRector: '->original EntityInterface' - page 1: 100 hits - skip: project/tdt_client - skip: project/entity_orm - skip: project/re_mgr - ✓ D11: project/languagewire_translation_provider - skip: project/cache_entity_type - skip: project/plug - ✓ D11: project/drd - skip: project/hidden_tab - ✓ D11: project/ptools - ✓ D11: project/media_acquiadam - skip: project/plug_config - ✓ D11: project/typed_entity - ✓ D11: project/child_entity - skip: project/records - ✓ D11: project/experience_builder - skip: project/fluxservice - skip: project/dplor - ✓ D11: project/external_entity - skip: project/maps_suite - skip: project/pagebuilder - skip: project/entity_keyvalue - ✓ D11: project/ckeditor_mentions - ✓ D11: project/entity_value_inheritance - skip: project/drupal_coverage_core - ✓ D11: project/entity_io - ✓ D11: project/conflict - skip: project/yamlform - skip: project/dea - ✓ D11: project/orange_dam - ✓ D11: project/a12s_maps_sync - skip: project/lingotek - skip: project/kafka_event_publisher - skip: project/field_validation - skip: project/reactive - skip: project/flow - skip: project/userpoints - skip: project/elasticsearch_connect - ✓ D11: project/entity_embed - ✓ D11: project/entity_reference_manager - ✓ D11: project/simplenews_stats - ✓ D11: project/variants - skip: project/entity_pilot - ✓ D11: project/nofraud - ✓ D11: project/entity_webhook - ✓ D11: project/phpedu_profile - ✓ D11: project/reader - ✓ D11: project/gotem_content_moderation - skip: project/apitools - ✓ D11: project/paragraph_view_mode - skip: project/admin_content_notification - ✓ D11: project/activitypub - ✓ D11: project/navigation_plus - ✓ D11: project/content_synchronizer - ✓ D11: project/custom_elements - ✓ D11: project/edit_plus - skip: project/action_queue - skip: project/test_support - skip: project/entity_change_notifier - ✓ D11: project/standalone - skip: project/lti_tool_provider - -ReplaceNodeSetPreviewModeRector: 'setPreviewMode NodeType' - page 1: 23 hits - ✓ D11: project/responsive_preview - skip: project/archimedes - skip: project/drupal_cms - ✓ D11: project/ai_agents - skip: project/convene - skip: project/provus_gov_recipe - ✓ D11: project/node_type_defaults - skip: project/haven - skip: project/caresphere - skip: project/healthcare - skip: project/provus_duswds_recipe - skip: project/provus_edu - skip: project/mercury_demo - skip: project/local - skip: project/pulse - skip: project/convivial_gov - ✓ D11: project/sdx_drast - ✓ D11: project/sdx_engine - ✓ D11: project/metadata_hex - skip: project/communications - ✓ D11: project/ai_agents_experimental_collection - -ReplaceRebuildThemeDataRector: 'rebuildThemeData ThemeHandler' - page 1: 63 hits - skip: project/console - ✓ D11: project/site_guardian - skip: project/koality_theme_generator - ✓ D11: project/theme_per_user - skip: project/omega - skip: project/provision - ✓ D11: project/libraries_ui - skip: project/micro_theme - skip: project/at_tools - skip: project/at_tool - skip: project/guru - skip: project/monix - skip: project/localgov_microsites_project - skip: project/views_system - skip: project/openrestaurant - ✓ D11: project/openy - ✓ D11: project/edw_healthcheck - skip: project/install_profile_generator - skip: project/at_theme - ✓ D11: project/l10n_update_bundled - skip: project/library_field - ✓ D11: project/ai_components - skip: project/cookie_blocking_libraries - ✓ D11: project/mercury_editor - skip: project/demo_content - ✓ D11: project/dropsolid_rocketship_profile - skip: project/quick_pages - ✓ D11: project/guswds - ✓ D11: project/gesso - ✓ D11: project/theme_file_editor - skip: project/amp - skip: project/extensions_api - skip: project/rocketship_florista_demo_profile - skip: project/basic - skip: project/hops - skip: project/cm_config_tools - skip: project/visualn_libraries - skip: project/editablevar - skip: project/civictheme - skip: project/demo_design_system - -StripMigrationDependenciesExpandArgRector: 'getMigrationDependencies Migration' - page 1: 60 hits - ✓ D11: project/migrate_plus - skip: project/forgery - ✓ D11: project/paragraphs - ✓ D11: project/smart_migrate_cli - skip: project/paragraphs_migration - ✓ D11: project/migrate_tools - skip: project/media_migration - skip: project/migrate_gathercontent - ✓ D11: project/wordpress_migrate - skip: project/location_migration - ✓ D11: project/migrate_plus_ui - ✓ D11: project/geolocation - skip: project/openfed_migrate - skip: project/entity_staging - ✓ D11: project/entity_import - skip: project/bigcommerce - skip: project/amoebacrm - skip: project/ekan - skip: project/wxt - ✓ D11: project/migrate_queue_importer - skip: project/openy_gated_content - ✓ D11: project/migrate_from_services - skip: project/migrate_upgrade - skip: project/migrate_run - ✓ D11: project/crm_migrate_node - -UseEntityTypeHasIntegerIdRector: 'getEntityTypeIdKeyType' - page 1: 48 hits - skip: project/mcet - ✓ D11: project/workflow_participants - skip: project/mpr - ✓ D11: project/apigee_m10n - ✓ D11: project/workbench_moderation - ✓ D11: project/intercept - skip: project/entity_activity - skip: project/contacts_events - ✓ D11: project/commerce_invoice - skip: project/commerce_invoice_ubl - ✓ D11: project/homebox - ✓ D11: project/commerce_eta - ✓ D11: project/display_builder - skip: project/content_entity_base - ✓ D11: project/role_request - skip: project/wsdata - skip: project/virtualcare - ✓ D11: project/entity - skip: project/openy_digital_signage - ✓ D11: project/localgov_alert_banner - skip: project/commerce_refund - skip: project/view_api_response - skip: project/entities_import - ✓ D11: project/easy_email - skip: project/commerce_inventory - ✓ D11: project/paragraphs_edit - skip: project/complex_workflow - skip: project/redhen - skip: project/guidelines - ✓ D11: project/association - skip: project/omdb_api - -=== Results === -LoadAllIncludesRector: ['project/migrate_boost', 'project/config_track', 'project/hux', 'project/update_worker', 'project/drupalmoduleupgrader', 'project/graphapi', 'project/schemadotorg'] -MigrateSqlGetMigrationPluginManagerRector: ['project/feeds_migrate', 'project/smart_sql_idmap', 'project/migmag'] -PluginBaseIsConfigurableRector: ['project/localgov_publications_importer', 'project/autotagger', 'project/api', 'project/content_planner', 'project/plugin_constructor_factory', 'project/metatag', 'project/json_drop_api', 'project/localgov_elections', 'project/geocoder', 'project/oswald', 'project/xbbcode', 'project/localgov_publications_importer_copilot', 'project/views_bulk_operations', 'project/search_api'] -RemoveModuleHandlerAddModuleCallsRector: ['project/depcalc', 'project/fleetview_client', 'project/sdx', 'project/simplifying', 'project/ai_watchdog_analyst', 'project/acquia_contenthub', 'project/component_entity', 'project/ai_vdb_provider_pinecone', 'project/ai_vdb_provider_milvus', 'project/rift_recipe'] -RemoveModuleHandlerDeprecatedMethodsRector: ['project/jsonld', 'project/captcha'] -RemoveSetUriCallbackRector: ['project/rabbit_hole_href'] -RemoveTrustDataCallRector: ['project/eca', 'project/parameters', 'project/slots', 'project/cms_core', 'project/userprotect', 'project/acquia_cms_headless', 'project/storage', 'project/config_plus', 'project/views_dependent_filters', 'project/complete_webform_exporter', 'project/workbench_moderation_actions', 'project/smart_title', 'project/monitoring', 'project/varbase_workflow', 'project/commerce_square', 'project/preview_site', 'project/acquia_starterkits', 'project/scheduled_publish', 'project/output_format_api', 'project/workbench_email', 'project/theming_tools', 'project/elasticsearch_helper', 'project/epm', 'project/og', 'project/redirect', 'project/pluggable_entity_view_builder', 'project/gutenberg', 'project/group', 'project/flag', 'project/simplenews', 'project/entity_browser', 'project/eca_cm', 'project/jsonapi'] -ReplaceCommentManagerGetCountNewCommentsRector: ['project/history', 'project/forum'] -ReplaceEntityOriginalPropertyRector: ['project/languagewire_translation_provider', 'project/drd', 'project/ptools', 'project/media_acquiadam', 'project/typed_entity', 'project/child_entity', 'project/experience_builder', 'project/external_entity', 'project/ckeditor_mentions', 'project/entity_value_inheritance', 'project/entity_io', 'project/conflict', 'project/orange_dam', 'project/a12s_maps_sync', 'project/entity_embed', 'project/entity_reference_manager', 'project/simplenews_stats', 'project/variants', 'project/nofraud', 'project/entity_webhook', 'project/phpedu_profile', 'project/reader', 'project/gotem_content_moderation', 'project/paragraph_view_mode', 'project/activitypub', 'project/navigation_plus', 'project/content_synchronizer', 'project/custom_elements', 'project/edit_plus', 'project/standalone'] -ReplaceNodeSetPreviewModeRector: ['project/responsive_preview', 'project/ai_agents', 'project/node_type_defaults', 'project/sdx_drast', 'project/sdx_engine', 'project/metadata_hex', 'project/ai_agents_experimental_collection'] -ReplaceRebuildThemeDataRector: ['project/site_guardian', 'project/theme_per_user', 'project/libraries_ui', 'project/openy', 'project/edw_healthcheck', 'project/l10n_update_bundled', 'project/ai_components', 'project/mercury_editor', 'project/dropsolid_rocketship_profile', 'project/guswds', 'project/gesso', 'project/theme_file_editor'] -StripMigrationDependenciesExpandArgRector: ['project/migrate_plus', 'project/paragraphs', 'project/smart_migrate_cli', 'project/migrate_tools', 'project/wordpress_migrate', 'project/migrate_plus_ui', 'project/geolocation', 'project/entity_import', 'project/migrate_queue_importer', 'project/migrate_from_services', 'project/crm_migrate_node'] -UseEntityTypeHasIntegerIdRector: ['project/workflow_participants', 'project/apigee_m10n', 'project/workbench_moderation', 'project/intercept', 'project/commerce_invoice', 'project/homebox', 'project/commerce_eta', 'project/display_builder', 'project/role_request', 'project/entity', 'project/localgov_alert_banner', 'project/easy_email', 'project/paragraphs_edit', 'project/association'] diff --git a/docs/targeted_results.json b/docs/targeted_results.json deleted file mode 100644 index 59d7864b7..000000000 --- a/docs/targeted_results.json +++ /dev/null @@ -1,174 +0,0 @@ -{ - "LoadAllIncludesRector": [ - "project/migrate_boost", - "project/config_track", - "project/hux", - "project/update_worker", - "project/drupalmoduleupgrader", - "project/graphapi", - "project/schemadotorg" - ], - "MigrateSqlGetMigrationPluginManagerRector": [ - "project/feeds_migrate", - "project/smart_sql_idmap", - "project/migmag" - ], - "PluginBaseIsConfigurableRector": [ - "project/localgov_publications_importer", - "project/autotagger", - "project/api", - "project/content_planner", - "project/plugin_constructor_factory", - "project/metatag", - "project/json_drop_api", - "project/localgov_elections", - "project/geocoder", - "project/oswald", - "project/xbbcode", - "project/localgov_publications_importer_copilot", - "project/views_bulk_operations", - "project/search_api" - ], - "RemoveModuleHandlerAddModuleCallsRector": [ - "project/depcalc", - "project/fleetview_client", - "project/sdx", - "project/simplifying", - "project/ai_watchdog_analyst", - "project/acquia_contenthub", - "project/component_entity", - "project/ai_vdb_provider_pinecone", - "project/ai_vdb_provider_milvus", - "project/rift_recipe" - ], - "RemoveModuleHandlerDeprecatedMethodsRector": [ - "project/jsonld", - "project/captcha" - ], - "RemoveSetUriCallbackRector": [ - "project/rabbit_hole_href" - ], - "RemoveTrustDataCallRector": [ - "project/eca", - "project/parameters", - "project/slots", - "project/cms_core", - "project/userprotect", - "project/acquia_cms_headless", - "project/storage", - "project/config_plus", - "project/views_dependent_filters", - "project/complete_webform_exporter", - "project/workbench_moderation_actions", - "project/smart_title", - "project/monitoring", - "project/varbase_workflow", - "project/commerce_square", - "project/preview_site", - "project/acquia_starterkits", - "project/scheduled_publish", - "project/output_format_api", - "project/workbench_email", - "project/theming_tools", - "project/elasticsearch_helper", - "project/epm", - "project/og", - "project/redirect", - "project/pluggable_entity_view_builder", - "project/gutenberg", - "project/group", - "project/flag", - "project/simplenews", - "project/entity_browser", - "project/eca_cm", - "project/jsonapi" - ], - "ReplaceCommentManagerGetCountNewCommentsRector": [ - "project/history", - "project/forum" - ], - "ReplaceEntityOriginalPropertyRector": [ - "project/languagewire_translation_provider", - "project/drd", - "project/ptools", - "project/media_acquiadam", - "project/typed_entity", - "project/child_entity", - "project/experience_builder", - "project/external_entity", - "project/ckeditor_mentions", - "project/entity_value_inheritance", - "project/entity_io", - "project/conflict", - "project/orange_dam", - "project/a12s_maps_sync", - "project/entity_embed", - "project/entity_reference_manager", - "project/simplenews_stats", - "project/variants", - "project/nofraud", - "project/entity_webhook", - "project/phpedu_profile", - "project/reader", - "project/gotem_content_moderation", - "project/paragraph_view_mode", - "project/activitypub", - "project/navigation_plus", - "project/content_synchronizer", - "project/custom_elements", - "project/edit_plus", - "project/standalone" - ], - "ReplaceNodeSetPreviewModeRector": [ - "project/responsive_preview", - "project/ai_agents", - "project/node_type_defaults", - "project/sdx_drast", - "project/sdx_engine", - "project/metadata_hex", - "project/ai_agents_experimental_collection" - ], - "ReplaceRebuildThemeDataRector": [ - "project/site_guardian", - "project/theme_per_user", - "project/libraries_ui", - "project/openy", - "project/edw_healthcheck", - "project/l10n_update_bundled", - "project/ai_components", - "project/mercury_editor", - "project/dropsolid_rocketship_profile", - "project/guswds", - "project/gesso", - "project/theme_file_editor" - ], - "StripMigrationDependenciesExpandArgRector": [ - "project/migrate_plus", - "project/paragraphs", - "project/smart_migrate_cli", - "project/migrate_tools", - "project/wordpress_migrate", - "project/migrate_plus_ui", - "project/geolocation", - "project/entity_import", - "project/migrate_queue_importer", - "project/migrate_from_services", - "project/crm_migrate_node" - ], - "UseEntityTypeHasIntegerIdRector": [ - "project/workflow_participants", - "project/apigee_m10n", - "project/workbench_moderation", - "project/intercept", - "project/commerce_invoice", - "project/homebox", - "project/commerce_eta", - "project/display_builder", - "project/role_request", - "project/entity", - "project/localgov_alert_banner", - "project/easy_email", - "project/paragraphs_edit", - "project/association" - ] -} From 750845433b75b479286cf7816163364b7398929b Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 8 May 2026 13:42:51 +0200 Subject: [PATCH 132/256] chore: small style fixes --- .../RemoveViewsRowCacheKeysRector.php | 3 ++ .../ReplaceModuleHandlerGetNameRectorTest.php | 33 ++++++++--------- .../ReplaceRebuildThemeDataRectorTest.php | 33 ++++++++--------- .../SystemTimeZonesRectorTest.php | 35 ++++++++++--------- .../WatchdogExceptionRectorTest.php | 35 ++++++++++--------- .../ErrorCurrentErrorHandlerRectorTest.php | 33 ++++++++--------- .../FileSystemBasenameToNativeRectorTest.php | 33 ++++++++--------- .../RemoveTrustDataCallRectorTest.php | 33 ++++++++--------- ...ntManagerGetCountNewCommentsRectorTest.php | 33 ++++++++--------- .../ReplaceCommentUriRectorTest.php | 33 ++++++++--------- ...eplaceDateTimeRangeConstantsRectorTest.php | 33 ++++++++--------- .../ReplaceEditorLoadRectorTest.php | 33 ++++++++--------- ...eplaceEntityOriginalPropertyRectorTest.php | 33 ++++++++--------- ...ReplaceFileGetContentHeadersRectorTest.php | 33 ++++++++--------- ...ceLocaleConfigBatchFunctionsRectorTest.php | 33 ++++++++--------- ...eplaceNodeAccessViewAllNodesRectorTest.php | 33 ++++++++--------- .../ReplaceNodeAddBodyFieldRectorTest.php | 33 ++++++++--------- ...odeModuleProceduralFunctionsRectorTest.php | 33 ++++++++--------- ...aceRecipeRunnerInstallModuleRectorTest.php | 33 ++++++++--------- .../ReplaceSessionManagerDeleteRectorTest.php | 33 ++++++++--------- .../ReplaceThemeGetSettingRectorTest.php | 33 ++++++++--------- ...placeUserSessionNamePropertyRectorTest.php | 33 ++++++++--------- ...tPrefetchIteratorFetchColumnRectorTest.php | 33 ++++++++--------- .../UseEntityTypeHasIntegerIdRectorTest.php | 33 ++++++++--------- .../ViewsPluginHandlerManagerRectorTest.php | 33 ++++++++--------- 25 files changed, 413 insertions(+), 386 deletions(-) diff --git a/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php b/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php index b7092658a..bde130f72 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php @@ -41,11 +41,13 @@ final class RemoveViewsRowCacheKeysRector extends AbstractRector /** * @param array $nodes + * * @return array */ public function beforeTraversal(array $nodes): array { $this->removedVarNames = []; + return $nodes; } @@ -83,6 +85,7 @@ public function refactor(Node $node): int|Node|null } assert($node instanceof Array_); + return $this->refactorArray($node); } diff --git a/tests/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector/ReplaceModuleHandlerGetNameRectorTest.php b/tests/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector/ReplaceModuleHandlerGetNameRectorTest.php index 544abf603..14a662e85 100644 --- a/tests/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector/ReplaceModuleHandlerGetNameRectorTest.php +++ b/tests/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector/ReplaceModuleHandlerGetNameRectorTest.php @@ -28,24 +28,25 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } -#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] -public function testBelowVersion(string $filePath): void -{ - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); } -} -/** - * @return \Iterator<> - */ -public static function provideDataBelowVersion(): \Iterator -{ - return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); -} public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/ReplaceRebuildThemeDataRectorTest.php b/tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/ReplaceRebuildThemeDataRectorTest.php index f0be6661a..3de10bd15 100644 --- a/tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/ReplaceRebuildThemeDataRectorTest.php +++ b/tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/ReplaceRebuildThemeDataRectorTest.php @@ -28,24 +28,25 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } -#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] -public function testBelowVersion(string $filePath): void -{ - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); } -} -/** - * @return \Iterator<> - */ -public static function provideDataBelowVersion(): \Iterator -{ - return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); -} public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/SystemTimeZonesRectorTest.php b/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/SystemTimeZonesRectorTest.php index 02fb4feda..d048c7fe9 100644 --- a/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/SystemTimeZonesRectorTest.php +++ b/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/SystemTimeZonesRectorTest.php @@ -4,8 +4,8 @@ namespace DrupalRector\Tests\Drupal10\Rector\Deprecation\SystemTimeZonesRector; -use Iterator; use DrupalRector\Rector\AbstractDrupalCoreRector; +use Iterator; use Rector\Testing\PHPUnit\AbstractRectorTestCase; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] @@ -30,24 +30,25 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } -#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] -public function testBelowVersion(string $filePath): void -{ - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); } -} -/** - * @return \Iterator<> - */ -public static function provideDataBelowVersion(): \Iterator -{ - return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); -} public function provideConfigFilePath(): string { // must be implemented diff --git a/tests/src/Drupal10/Rector/Deprecation/WatchdogExceptionRector/WatchdogExceptionRectorTest.php b/tests/src/Drupal10/Rector/Deprecation/WatchdogExceptionRector/WatchdogExceptionRectorTest.php index 2e1489fdb..6291081fa 100644 --- a/tests/src/Drupal10/Rector/Deprecation/WatchdogExceptionRector/WatchdogExceptionRectorTest.php +++ b/tests/src/Drupal10/Rector/Deprecation/WatchdogExceptionRector/WatchdogExceptionRectorTest.php @@ -4,8 +4,8 @@ namespace DrupalRector\Tests\Drupal10\Rector\Deprecation\WatchdogExceptionRector; -use Iterator; use DrupalRector\Rector\AbstractDrupalCoreRector; +use Iterator; use Rector\Testing\PHPUnit\AbstractRectorTestCase; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] @@ -30,24 +30,25 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } -#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] -public function testBelowVersion(string $filePath): void -{ - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); } -} -/** - * @return \Iterator<> - */ -public static function provideDataBelowVersion(): \Iterator -{ - return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); -} public function provideConfigFilePath(): string { // must be implemented diff --git a/tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/ErrorCurrentErrorHandlerRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/ErrorCurrentErrorHandlerRectorTest.php index 4a88216f3..e5296adaa 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/ErrorCurrentErrorHandlerRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/ErrorCurrentErrorHandlerRectorTest.php @@ -28,24 +28,25 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } -#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] -public function testBelowVersion(string $filePath): void -{ - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); } -} -/** - * @return \Iterator<> - */ -public static function provideDataBelowVersion(): \Iterator -{ - return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); -} public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/FileSystemBasenameToNativeRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/FileSystemBasenameToNativeRectorTest.php index 6a33ce464..12709744d 100644 --- a/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/FileSystemBasenameToNativeRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/FileSystemBasenameToNativeRectorTest.php @@ -28,24 +28,25 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } -#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] -public function testBelowVersion(string $filePath): void -{ - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); } -} -/** - * @return \Iterator<> - */ -public static function provideDataBelowVersion(): \Iterator -{ - return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); -} public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/RemoveTrustDataCallRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/RemoveTrustDataCallRectorTest.php index 8d8df27a9..7a7683720 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/RemoveTrustDataCallRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/RemoveTrustDataCallRectorTest.php @@ -28,24 +28,25 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } -#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] -public function testBelowVersion(string $filePath): void -{ - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); } -} -/** - * @return \Iterator<> - */ -public static function provideDataBelowVersion(): \Iterator -{ - return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); -} public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/ReplaceCommentManagerGetCountNewCommentsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/ReplaceCommentManagerGetCountNewCommentsRectorTest.php index 3e355c44b..697da2cd6 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/ReplaceCommentManagerGetCountNewCommentsRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/ReplaceCommentManagerGetCountNewCommentsRectorTest.php @@ -28,24 +28,25 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } -#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] -public function testBelowVersion(string $filePath): void -{ - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); } -} -/** - * @return \Iterator<> - */ -public static function provideDataBelowVersion(): \Iterator -{ - return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); -} public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/ReplaceCommentUriRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/ReplaceCommentUriRectorTest.php index 134e710f3..81c1bfabf 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/ReplaceCommentUriRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/ReplaceCommentUriRectorTest.php @@ -28,24 +28,25 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } -#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] -public function testBelowVersion(string $filePath): void -{ - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); } -} -/** - * @return \Iterator<> - */ -public static function provideDataBelowVersion(): \Iterator -{ - return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); -} public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/ReplaceDateTimeRangeConstantsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/ReplaceDateTimeRangeConstantsRectorTest.php index 9b72df6f4..0f9752c67 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/ReplaceDateTimeRangeConstantsRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/ReplaceDateTimeRangeConstantsRectorTest.php @@ -28,24 +28,25 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } -#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] -public function testBelowVersion(string $filePath): void -{ - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); } -} -/** - * @return \Iterator<> - */ -public static function provideDataBelowVersion(): \Iterator -{ - return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); -} public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/ReplaceEditorLoadRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/ReplaceEditorLoadRectorTest.php index bffadf3ce..359a0dd4d 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/ReplaceEditorLoadRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/ReplaceEditorLoadRectorTest.php @@ -28,24 +28,25 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } -#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] -public function testBelowVersion(string $filePath): void -{ - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); } -} -/** - * @return \Iterator<> - */ -public static function provideDataBelowVersion(): \Iterator -{ - return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); -} public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/ReplaceEntityOriginalPropertyRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/ReplaceEntityOriginalPropertyRectorTest.php index cd8dd895b..66e7436f6 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/ReplaceEntityOriginalPropertyRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/ReplaceEntityOriginalPropertyRectorTest.php @@ -28,24 +28,25 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } -#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] -public function testBelowVersion(string $filePath): void -{ - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); } -} -/** - * @return \Iterator<> - */ -public static function provideDataBelowVersion(): \Iterator -{ - return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); -} public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/ReplaceFileGetContentHeadersRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/ReplaceFileGetContentHeadersRectorTest.php index 48cb10e5a..204a8888c 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/ReplaceFileGetContentHeadersRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/ReplaceFileGetContentHeadersRectorTest.php @@ -28,24 +28,25 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } -#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] -public function testBelowVersion(string $filePath): void -{ - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); } -} -/** - * @return \Iterator<> - */ -public static function provideDataBelowVersion(): \Iterator -{ - return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); -} public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/ReplaceLocaleConfigBatchFunctionsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/ReplaceLocaleConfigBatchFunctionsRectorTest.php index 5310b8b6b..6f172dc67 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/ReplaceLocaleConfigBatchFunctionsRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/ReplaceLocaleConfigBatchFunctionsRectorTest.php @@ -28,24 +28,25 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } -#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] -public function testBelowVersion(string $filePath): void -{ - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); } -} -/** - * @return \Iterator<> - */ -public static function provideDataBelowVersion(): \Iterator -{ - return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); -} public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/ReplaceNodeAccessViewAllNodesRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/ReplaceNodeAccessViewAllNodesRectorTest.php index da4e9faab..b2f44fc57 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/ReplaceNodeAccessViewAllNodesRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/ReplaceNodeAccessViewAllNodesRectorTest.php @@ -28,24 +28,25 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } -#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] -public function testBelowVersion(string $filePath): void -{ - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); } -} -/** - * @return \Iterator<> - */ -public static function provideDataBelowVersion(): \Iterator -{ - return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); -} public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/ReplaceNodeAddBodyFieldRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/ReplaceNodeAddBodyFieldRectorTest.php index 21418d0fc..8ee4f53dc 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/ReplaceNodeAddBodyFieldRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/ReplaceNodeAddBodyFieldRectorTest.php @@ -28,24 +28,25 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } -#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] -public function testBelowVersion(string $filePath): void -{ - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); } -} -/** - * @return \Iterator<> - */ -public static function provideDataBelowVersion(): \Iterator -{ - return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); -} public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/ReplaceNodeModuleProceduralFunctionsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/ReplaceNodeModuleProceduralFunctionsRectorTest.php index 54479c55f..1a97c5d5a 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/ReplaceNodeModuleProceduralFunctionsRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/ReplaceNodeModuleProceduralFunctionsRectorTest.php @@ -28,24 +28,25 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } -#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] -public function testBelowVersion(string $filePath): void -{ - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); } -} -/** - * @return \Iterator<> - */ -public static function provideDataBelowVersion(): \Iterator -{ - return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); -} public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/ReplaceRecipeRunnerInstallModuleRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/ReplaceRecipeRunnerInstallModuleRectorTest.php index 879f66fd0..4583f1bfc 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/ReplaceRecipeRunnerInstallModuleRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/ReplaceRecipeRunnerInstallModuleRectorTest.php @@ -28,24 +28,25 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } -#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] -public function testBelowVersion(string $filePath): void -{ - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); } -} -/** - * @return \Iterator<> - */ -public static function provideDataBelowVersion(): \Iterator -{ - return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); -} public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/ReplaceSessionManagerDeleteRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/ReplaceSessionManagerDeleteRectorTest.php index 357fde1aa..908355285 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/ReplaceSessionManagerDeleteRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/ReplaceSessionManagerDeleteRectorTest.php @@ -28,24 +28,25 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } -#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] -public function testBelowVersion(string $filePath): void -{ - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); } -} -/** - * @return \Iterator<> - */ -public static function provideDataBelowVersion(): \Iterator -{ - return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); -} public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/ReplaceThemeGetSettingRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/ReplaceThemeGetSettingRectorTest.php index 3d9e9c157..d765b877f 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/ReplaceThemeGetSettingRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/ReplaceThemeGetSettingRectorTest.php @@ -28,24 +28,25 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } -#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] -public function testBelowVersion(string $filePath): void -{ - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); } -} -/** - * @return \Iterator<> - */ -public static function provideDataBelowVersion(): \Iterator -{ - return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); -} public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/ReplaceUserSessionNamePropertyRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/ReplaceUserSessionNamePropertyRectorTest.php index 45f0f6f26..b99178843 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/ReplaceUserSessionNamePropertyRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/ReplaceUserSessionNamePropertyRectorTest.php @@ -28,24 +28,25 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } -#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] -public function testBelowVersion(string $filePath): void -{ - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); } -} -/** - * @return \Iterator<> - */ -public static function provideDataBelowVersion(): \Iterator -{ - return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); -} public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/StatementPrefetchIteratorFetchColumnRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/StatementPrefetchIteratorFetchColumnRectorTest.php index aa8d2532d..124195d3b 100644 --- a/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/StatementPrefetchIteratorFetchColumnRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/StatementPrefetchIteratorFetchColumnRectorTest.php @@ -28,24 +28,25 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } -#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] -public function testBelowVersion(string $filePath): void -{ - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); } -} -/** - * @return \Iterator<> - */ -public static function provideDataBelowVersion(): \Iterator -{ - return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); -} public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/UseEntityTypeHasIntegerIdRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/UseEntityTypeHasIntegerIdRectorTest.php index 8edb3143c..434d3921c 100644 --- a/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/UseEntityTypeHasIntegerIdRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/UseEntityTypeHasIntegerIdRectorTest.php @@ -28,24 +28,25 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } -#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] -public function testBelowVersion(string $filePath): void -{ - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); } -} -/** - * @return \Iterator<> - */ -public static function provideDataBelowVersion(): \Iterator -{ - return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); -} public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/ViewsPluginHandlerManagerRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/ViewsPluginHandlerManagerRectorTest.php index 5a4048ea9..93b07578d 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/ViewsPluginHandlerManagerRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/ViewsPluginHandlerManagerRectorTest.php @@ -28,24 +28,25 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } -#[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] -public function testBelowVersion(string $filePath): void -{ - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); } -} -/** - * @return \Iterator<> - */ -public static function provideDataBelowVersion(): \Iterator -{ - return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); -} public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; From 027323b8325ac017a407faddc7fbdfae51fe59e3 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 8 May 2026 15:18:10 +0200 Subject: [PATCH 133/256] chore: make testing better --- .../rector-type-specificity-checklist.md | 108 ------------------ .claude/skills/rector-live-test/SKILL.md | 48 +++++--- .../rector-live-test/setup-rector-test.sh | 18 ++- 3 files changed, 46 insertions(+), 128 deletions(-) delete mode 100644 .claude/skills/prompts/rector-type-specificity-checklist.md diff --git a/.claude/skills/prompts/rector-type-specificity-checklist.md b/.claude/skills/prompts/rector-type-specificity-checklist.md deleted file mode 100644 index 75b58731c..000000000 --- a/.claude/skills/prompts/rector-type-specificity-checklist.md +++ /dev/null @@ -1,108 +0,0 @@ -# Rector Type-Specificity Checklist - -Rectors that match a method call, property access, or `$this` reference **by name only** — without verifying the owning class or interface — will transform any unrelated class that happens to share that name. This checklist tracks every rector added in the `feature/digest-rectors` branch against that criterion. - -Use `/rector-type-check-review ` to fix an AT-RISK rector interactively. - ---- - -## Legend - -| Verdict | Meaning | -|---------|---------| -| ✅ SAFE | Correct `isObjectType` guard, targets global functions/constants, or name is so specific collisions are implausible | -| ⚠️ AT-RISK | Matches method/property/`$this` by name alone without owning-class verification | -| 🔵 EXEMPT | Operates on a **class declaration** (`Class_` node) and checks the parent class before acting | - ---- - -## Drupal 10 Rectors - -| Rector | Matches | Guard | Verdict | Issue | Change Record | Notes | -|--------|---------|-------|---------|-------|---------------|-------| -| `ReplaceModuleHandlerGetNameRector` | `->getName()` | `isObjectType(ModuleHandlerInterface)` | ✅ SAFE | 3571063 | — | | -| `ReplaceRebuildThemeDataRector` | `->rebuildThemeData()` | `isObjectType(ThemeHandlerInterface)` | ✅ SAFE | 3571068 | — | Fixed | -| `ReplaceRequestTimeConstantRector` | `REQUEST_TIME` constant | n/a | ✅ SAFE | 3395986 | 3395991 | Global constant — no owning class | - ---- - -## Drupal 11 Rectors - -| Rector | Matches | Guard | Verdict | Issue | Change Record | Notes | -|--------|---------|-------|---------|-------|---------------|-------| -| `ErrorCurrentErrorHandlerRector` | `Error::currentErrorHandler()` static | `isObjectType(Error)` | ✅ SAFE | 3526515 | 3529500 | | -| `FileSystemBasenameToNativeRector` | `->basename()` | `isObjectType(FileSystemInterface\|FileSystem)` | ✅ SAFE | 3530461 | 3530869 | | -| `LoadAllIncludesRector` | `->loadAllIncludes()` | `isObjectType(ModuleHandlerInterface)` | ✅ SAFE | 3536431 | 3536432 | Fixed | -| `MigrateSqlGetMigrationPluginManagerRector` | `$this->getMigrationPluginManager()` | `isObjectType(Sql)` | ✅ SAFE | 3439369 | 3442785 | | -| `NodeStorageDeprecatedMethodsRector` | `->revisionIds()` etc. | `isObjectType(NodeStorageInterface)` | ✅ SAFE | 3396062 | 3519187 | | -| `PluginBaseIsConfigurableRector` | `$this->isConfigurable()` | `isObjectType(PluginBase)` | ✅ SAFE | 3459533 | 3459535 | Fixed | -| `RemoveAutomatedCronSubmitHandlerRector` | `$form['#submit'][]` string literal | n/a | ✅ SAFE | 3566768 | 3566774 | Matches specific string value, not a class member | -| `RemoveCacheExpireOverrideRector` | `cacheExpire()` method declaration | exact FQCN list + `isObjectType` fallback on `Class_` | 🔵 EXEMPT | 3576556 | 3576855 | Fixed | -| `RemoveConfigSaveTrustedDataArgRector` | `->save(TRUE\|FALSE)` | `isObjectType(Config)` | ✅ SAFE | 3347842 | 3348180 | Fixed | -| `RemoveHandlerBaseDefineExtraOptionsRector` | `defineExtraOptions()` declaration | `extends` check on `Class_` | 🔵 EXEMPT | 3485084 | 3486781 | | -| `RemoveLinkWidgetValidateTitleElementRector` | `LinkWidget::validateTitleElement()` static | `isName(LinkWidget)` | ✅ SAFE | 3093118 | 3554139 | | -| `RemoveModuleHandlerAddModuleCallsRector` | `->addModule()`, `->addProfile()` | `isObjectType(ModuleHandlerInterface\|ModuleHandler)` | ✅ SAFE | 3528899 | 3550193 | | -| `RemoveModuleHandlerDeprecatedMethodsRector` | `->writeCache()`, `->getHookInfo()` | `isObjectType(ModuleHandlerInterface)` | ✅ SAFE | 3442009 | — | | -| `RemoveRootFromConvertDbUrlRector` | `Database::convertDbUrlToConnectionInfo()` static | `isName(Database)` | ✅ SAFE | 3522513 | 3511287 | | -| `RemoveSetUriCallbackRector` | `->setUriCallback()` | `isObjectType(EntityTypeInterface)` | ✅ SAFE | 2667040 | 3575062 | Fixed | -| `RemoveStateCacheSettingRector` | `$settings['state_cache']` array key | n/a | ✅ SAFE | 3436954 | 3443018 | Specific variable + key pattern | -| `RemoveTrustDataCallRector` | `->trustData()` | `isObjectType(ConfigEntityInterface)` | ✅ SAFE | 3347842 | 3348180 | Fixed | -| `RemoveTwigNodeTransTagArgumentRector` | `new TwigNodeTrans(...)` | `isName(TwigNodeTrans)` | ✅ SAFE | 3473440 | — | | -| `RemoveUpdaterPostInstallMethodsRector` | `postInstall()`, `postInstallTasks()` declarations | `extends` check on `Class_` | 🔵 EXEMPT | 3417136 | 3571399 | | -| `RemoveViewsRowCacheKeysRector` | array values: `->getRowCacheKeys()`, `->getRowId()` | `isObjectType(CachePluginBase)` | ✅ SAFE | 3564937 | 3564958 | Fixed | -| `RenameStopProceduralHookScanRector` | `StopProceduralHookScan` attribute/use | `isName` on FQCN | ✅ SAFE | 3495943 | 3490771 | | -| `ReplaceAlphadecimalToIntNullRector` | `Number::alphadecimalToInt()` static | `isObjectType(Number)` | ✅ SAFE | 3442810 | 3494472 | | -| `ReplaceCommentManagerGetCountNewCommentsRector` | `->getCountNewComments()` | `isObjectType(CommentManagerInterface)` | ✅ SAFE | 3543035 | 3551729 | | -| `ReplaceCommentUriRector` | `comment_uri()` function | n/a | ✅ SAFE | 2010202 | 3384294 | Global function | -| `ReplaceDateTimeRangeConstantsRector` | class constant fetch + function | `isName` on interface | ✅ SAFE | 3574901 | — | | -| `ReplaceEditorLoadRector` | `editor_load()` function | `count($node->args) !== 1` | ✅ SAFE | 3447794 | 3509245 | Global function; Fixed | -| `ReplaceEntityOriginalPropertyRector` | `->original` property | `isObjectType(EntityInterface)` | ✅ SAFE | 3571065 | — | Fixed | -| `ReplaceEntityReferenceRecursiveLimitRector` | `RECURSIVE_RENDER_LIMIT` class const | `isName` on target classes | ✅ SAFE | 2940605 | 3316878 | | -| `ReplaceFieldgroupToFieldsetRector` | `'#type' => 'fieldgroup'` array literal | n/a | ✅ SAFE | 3512254 | 3515272 | String literal match | -| `ReplaceFileGetContentHeadersRector` | `file_get_content_headers()` function | n/a | ✅ SAFE | 3494126 | 3494172 | Global function | -| `ReplaceLocaleConfigBatchFunctionsRector` | `locale_config_batch_*()` functions | n/a | ✅ SAFE | 3575254 | — | Global functions | -| `ReplaceNodeAccessViewAllNodesRector` | `node_access_view_all_nodes()` etc. | n/a | ✅ SAFE | 3038908 | 3038909 | Global functions | -| `ReplaceNodeAddBodyFieldRector` | `node_add_body_field()` function | n/a | ✅ SAFE | 3489266 | 3516778 | Global function | -| `ReplaceNodeModuleProceduralFunctionsRector` | `node_type_get_names()` etc. | `$node->name instanceof Name` guard | ✅ SAFE | 3571623 | — | Global functions; Fixed | -| `ReplaceNodeSetPreviewModeRector` | `->setPreviewMode(0\|1\|2\|CONST)` | `isObjectType(NodeTypeInterface)` | ✅ SAFE | 3538277 | 3538666 | Fixed | -| `ReplacePdoFetchConstantsRector` | `PDO::FETCH_*` constants | `isName(PDO)` on const fetch | ✅ SAFE | 3525077 | — | | -| `ReplaceRecipeRunnerInstallModuleRector` | `RecipeRunner::installModule()` static | `isName(RecipeRunner)` | ✅ SAFE | 3498026 | 3579527 | | -| `ReplaceSessionManagerDeleteRector` | `->delete()` | `isObjectType(SessionManager)` | ✅ SAFE | 3577376 | — | | -| `ReplaceSessionWritesWithRequestSessionRector` | `$_SESSION[...]` superglobal | n/a | ✅ SAFE | 3518527 | 3518914 | Specific superglobal | -| `ReplaceSystemPerformanceGzipKeyRector` | `->get()`/`->set()` on config chain | chain inspection for `'system.performance'` key | ✅ SAFE | 3184242 | 3526344 | Custom chain guard | -| `ReplaceThemeGetSettingRector` | `theme_get_setting()` etc. | n/a | ✅ SAFE | 3573896 | — | Global functions | -| `ReplaceUserSessionNamePropertyRector` | `->name` property | `isObjectType(UserSession)` + skips `$this` | ✅ SAFE | 3513856 | 3513877 | Fixed | -| `ReplaceViewsProceduralFunctionsRector` | `views_*()` functions | n/a | ✅ SAFE | 3572243 | 3572594 | Global functions | -| `StatementPrefetchIteratorFetchColumnRector` | `->fetchColumn()` | `isObjectType(StatementPrefetchIterator)` | ✅ SAFE | 3490200 | 3490312 | Fixed | -| `StripMigrationDependenciesExpandArgRector` | `->getMigrationDependencies()` | `isObjectType(MigrationInterface)` | ✅ SAFE | 3574717 | 3442785 | | -| `UseEntityTypeHasIntegerIdRector` | `$this->getEntityTypeIdKeyType()` etc. | `isObjectType` per-method via `METHOD_OWNER_CLASS` map | ✅ SAFE | 3566801 | 3566814 | Fixed | -| `ViewsPluginHandlerManagerRector` | `Views::pluginManager()` static | `isName(Views)` | ✅ SAFE | 3566424 | 3566982 | | -| `FunctionCallRemovalRector` (generic) | configured function names | configuration-driven name match | ✅ SAFE | — | — | Targets global functions only | - ---- - -## AT-RISK Summary - -All 19 AT-RISK rectors have been fixed. ✅ - -| # | Rector | Guard added | Drupal class/interface used | Issue | Change Record | -|---|--------|------------|------------------------------|-------|---------------| -| 1 | `ReplaceRebuildThemeDataRector` | `isObjectType` on `->rebuildThemeData()` caller | `Drupal\Core\Extension\ThemeHandlerInterface` | 3571068 | — | -| 2 | `PluginBaseIsConfigurableRector` | `isObjectType` on `$this` | `Drupal\Component\Plugin\PluginBase` | 3459533 | 3459535 | -| 3 | `RemoveConfigSaveTrustedDataArgRector` | `isObjectType` on `->save()` caller | `Drupal\Core\Config\Config` | 3347842 | 3348180 | -| 4 | `RemoveSetUriCallbackRector` | `isObjectType` on `->setUriCallback()` caller | `Drupal\Core\Entity\EntityTypeInterface` | 2667040 | 3575062 | -| 5 | `RemoveTrustDataCallRector` | `isObjectType` on `->trustData()` caller | `Drupal\Core\Config\Entity\ConfigEntityInterface` | 3347842 | 3348180 | -| 6 | `RemoveViewsRowCacheKeysRector` | `isObjectType` on method-call receiver inside array item | `Drupal\views\Plugin\views\cache\CachePluginBase` | 3564937 | 3564958 | -| 7 | `ReplaceEntityOriginalPropertyRector` | `isObjectType` on `->original` variable | `Drupal\Core\Entity\EntityInterface` | 3571065 | — | -| 8 | `ReplaceNodeSetPreviewModeRector` | `isObjectType` on `->setPreviewMode()` caller | `Drupal\node\NodeTypeInterface` | 3538277 | 3538666 | -| 9 | `StatementPrefetchIteratorFetchColumnRector` | `isObjectType` on `->fetchColumn()` caller | `Drupal\Core\Database\StatementPrefetchIterator` | 3490200 | 3490312 | -| 10 | `UseEntityTypeHasIntegerIdRector` | per-method `isObjectType` via `METHOD_OWNER_CLASS` map | `DefaultHtmlRouteProvider`, `CommentTypeForm`, `OverridesSectionStorage` | 3566801 | 3566814 | -| 11 | `LoadAllIncludesRector` | `isObjectType` on `->loadAllIncludes()` caller | `Drupal\Core\Extension\ModuleHandlerInterface` | 3536431 | 3536432 | -| 12 | `RemoveCacheExpireOverrideRector` | replaced broad `str_ends_with` with exact FQCN list; added `isObjectType(CachePluginBase)` fallback | `Drupal\views\Plugin\views\cache\CachePluginBase` | 3576556 | 3576855 | -| 13 | `ReplaceUserSessionNamePropertyRector` | `isObjectType` on `->name` property variable | `Drupal\Core\Session\UserSession` | 3513856 | 3513877 | -| 14 | `ReplaceNodeModuleProceduralFunctionsRector` | added `$node->name instanceof Name` guard to skip variable/dynamic function calls | n/a — targets global functions | 3571623 | — | -| 15 | `ReplaceEditorLoadRector` | added `count($node->args) !== 1` guard to skip argument-less calls | n/a — targets global function | 3447794 | 3509245 | -| 16 | `ReplaceEntityOriginalPropertyRector` | `isObjectType(EntityInterface)` on `->original` variable; also added `NullsafePropertyFetch` branch missing from original | `Drupal\Core\Entity\EntityInterface` | 3571065 | — | -| 17 | `NodeStorageDeprecatedMethodsRector` | `isObjectType(NodeStorageInterface)` promoted to top-level guard; added `countDefaultLanguageRevisions()` removal branch absent from original | `Drupal\node\NodeStorageInterface` | 3396062 | 3519187 | -| 18 | `RemoveModuleHandlerAddModuleCallsRector` | extended `isObjectType` check to cover concrete `ModuleHandler` in addition to `ModuleHandlerInterface` | `Drupal\Core\Extension\ModuleHandlerInterface` + `ModuleHandler` | 3528899 | 3550193 | -| 19 | `RemoveViewsRowCacheKeysRector` | `isObjectType(CachePluginBase)` on array item receiver — original had no type guard at all | `Drupal\views\Plugin\views\cache\CachePluginBase` | 3564937 | 3564958 | diff --git a/.claude/skills/rector-live-test/SKILL.md b/.claude/skills/rector-live-test/SKILL.md index 3a756d464..121aac432 100644 --- a/.claude/skills/rector-live-test/SKILL.md +++ b/.claude/skills/rector-live-test/SKILL.md @@ -87,33 +87,47 @@ No D11-compatible contrib modules found for . Try manually: https://git.drupalcode.org/search?group_id=2&scope=blobs&search= ``` -### 4. Run the rector (if setup script exists) +### 4. Run the rector -Check whether the integration test setup exists: +**Check if the DDEV test project exists:** ```bash -ls .claude/skills/rector-live-test/setup-rector-test.sh .claude/skills/rector-live-test/drupal-rector-test/ 2>/dev/null +ls ~/projects/drupal-rector-test/.ddev 2>/dev/null && echo "exists" || echo "not found" ``` -**If the setup exists:** - -Add target modules to `.claude/skills/rector-live-test/drupal-rector-test/composer.json`, then run: +**If not found**, run the one-time setup (takes ~10 minutes): ```bash -bash .claude/skills/rector-live-test/setup-rector-test.sh --rector --no-cache +bash .claude/skills/rector-live-test/setup-rector-test.sh ``` +This creates a Drupal 11 site at `~/projects/drupal-rector-test` with a broad set of +contrib modules pre-installed. Running the script again is safe — it detects the existing +project and just ensures DDEV is started. -Always pass `--no-cache` to prevent stale rector results from a prior run. - -Parse the output for: -- `X file(s) changed` — success, the rector transformed code -- `0 files changed` or no output — investigate (see below) +**If a module found in step 2 is not pre-installed**, add it before running: +```bash +cd ~/projects/drupal-rector-test +ddev composer require drupal/ --no-interaction +``` -**If the setup does not exist:** +**Resolve the FQCN** based on where the rector source lives: +- `src/Drupal11/…` → `DrupalRector\Drupal11\Rector\Deprecation\` +- `src/Drupal10/…` → `DrupalRector\Drupal10\Rector\Deprecation\` +- `src/Rector/…` → `DrupalRector\Rector\Deprecation\` -Report that integration testing requires `.claude/skills/rector-live-test/setup-rector-test.sh` and provide manual instructions: +**Run rector** against the found modules: +```bash +cd ~/projects/drupal-rector-test +ddev exec -d /var/www/html \ + vendor/bin/rector process \ + web/modules/contrib/ web/modules/contrib/ \ + --only="DrupalRector\\Drupal11\\Rector\\Deprecation\\" \ + --no-cache 2>&1 +``` -1. Clone a D11-compatible module into a Drupal 11 site -2. Run: `ddev exec vendor/bin/rector process --config drupal-rector.php --no-cache` -3. Check the diff for expected transformations +**Inspect the diff**, then reset for the next run: +```bash +git -C ~/projects/drupal-rector-test diff web/modules/contrib/ +git -C ~/projects/drupal-rector-test checkout -- web/modules/contrib/ +``` ### 5. Report results diff --git a/.claude/skills/rector-live-test/setup-rector-test.sh b/.claude/skills/rector-live-test/setup-rector-test.sh index fd1f78bf2..39cc54c5d 100755 --- a/.claude/skills/rector-live-test/setup-rector-test.sh +++ b/.claude/skills/rector-live-test/setup-rector-test.sh @@ -11,15 +11,27 @@ set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" RECTOR_REPO="$(cd "$SCRIPT_DIR/../../.." && pwd)" -RECTOR_BRANCH="feature/digest-rectors" +RECTOR_BRANCH="$(git -C "$RECTOR_REPO" rev-parse --abbrev-ref HEAD)" -PROJECT_NAME="${1:-drupal-rector-test}" -TARGET_DIR="$(cd "$RECTOR_REPO/.." && pwd)/$PROJECT_NAME" +TARGET_DIR="${RECTOR_TEST_DIR:-$HOME/projects/drupal-rector-test}" +PROJECT_NAME="$(basename "$TARGET_DIR")" echo "==> Project directory : $TARGET_DIR" echo "==> drupal-rector repo : $RECTOR_REPO ($RECTOR_BRANCH)" echo "" +# Idempotency: skip full setup if the DDEV project already exists. +if [ -d "$TARGET_DIR/.ddev" ]; then + echo "==> Project already exists — starting DDEV if needed." + cd "$TARGET_DIR" + ddev start -y + echo "" + echo " To run a single rector:" + echo " ddev exec -d /var/www/html vendor/bin/rector process web/modules/contrib/ \\" + echo " --only=\"DrupalRector\\\\Drupal11\\\\Rector\\\\Deprecation\\\\\" --no-cache" + exit 0 +fi + # --------------------------------------------------------------------------- # 1. Create project directory and configure DDEV # --------------------------------------------------------------------------- From afe3feb07f7621d3f4edf4c060612a514824fcaf Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 8 May 2026 15:37:23 +0200 Subject: [PATCH 134/256] feat(Drupal11): Configure DeprecatedFilterFunctionsRector for Drupal 11.4 deprecations Includes rule to replace _filter_autop(), _filter_html_escape(), and _filter_html_image_secure_process() with plugin.manager.filter createInstance() chains, addressing issue #3226806. --- config/drupal-11/drupal-11.4-deprecations.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/config/drupal-11/drupal-11.4-deprecations.php b/config/drupal-11/drupal-11.4-deprecations.php index c3020709b..55229ac53 100644 --- a/config/drupal-11/drupal-11.4-deprecations.php +++ b/config/drupal-11/drupal-11.4-deprecations.php @@ -2,6 +2,7 @@ declare(strict_types=1); +use DrupalRector\Drupal11\Rector\Deprecation\DeprecatedFilterFunctionsRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveAutomatedCronSubmitHandlerRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveCacheExpireOverrideRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveConfigSaveTrustedDataArgRector; @@ -37,6 +38,14 @@ new DrupalIntroducedVersionConfiguration('11.4.0'), ]); + // https://www.drupal.org/node/3226806 + // _filter_autop(), _filter_html_escape(), and _filter_html_image_secure_process() + // deprecated in drupal:11.4.0, removed in drupal:13.0.0. + // Replaced by plugin.manager.filter createInstance() chain. + $rectorConfig->ruleWithConfiguration(DeprecatedFilterFunctionsRector::class, [ + new DrupalIntroducedVersionConfiguration('11.4.0'), + ]); + // https://www.drupal.org/node/3577376 // SessionManager::delete() deprecated in drupal:11.4.0, removed in drupal:12.0.0. // Replaced by \Drupal\Core\Session\UserSessionRepositoryInterface::deleteAll(). From 0b6e8c9fca26aaa992914c862a00fc67e3b05d1a Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 8 May 2026 15:37:40 +0200 Subject: [PATCH 135/256] docs: Update API references in SKILL.md and README.md to use api.tresbien.tech --- .claude/skills/README.md | 2 +- .claude/skills/rector-live-test/SKILL.md | 57 +++++++++++++++++------- 2 files changed, 42 insertions(+), 17 deletions(-) diff --git a/.claude/skills/README.md b/.claude/skills/README.md index 2c6ec457f..be85b0104 100644 --- a/.claude/skills/README.md +++ b/.claude/skills/README.md @@ -52,7 +52,7 @@ Produces a `PASS / WARN / FAIL` verdict per pass and an overall merge-readiness ### `/rector-live-test ` -Finds real contrib modules that use the deprecated API a rector targets, then runs the rector against them to verify it transforms real-world code correctly. Uses [search.tresbien.tech](https://search.tresbien.tech) as primary search, falls back to the Drupal GitLab API. +Finds real contrib modules that use the deprecated API a rector targets, then runs the rector against them to verify it transforms real-world code correctly. Uses [api.tresbien.tech](https://api.tresbien.tech) JSON API as primary search, falls back to the Drupal GitLab API. ``` /rector-live-test ReplaceSessionManagerDeleteRector diff --git a/.claude/skills/rector-live-test/SKILL.md b/.claude/skills/rector-live-test/SKILL.md index 121aac432..8c45ae721 100644 --- a/.claude/skills/rector-live-test/SKILL.md +++ b/.claude/skills/rector-live-test/SKILL.md @@ -1,6 +1,6 @@ --- name: rector-live-test -description: Finds D11-compatible contrib modules that exercise a rector and runs it against them. Uses search.tresbien.tech as primary search tool, falls back to Drupal GitLab API. Pass rector class name or issue number as argument. +description: Finds D11-compatible contrib modules that exercise a rector and runs it against them. Uses api.tresbien.tech JSON API as primary search tool, falls back to Drupal GitLab API. Pass rector class name or issue number as argument. argument-hint: "" allowed-tools: Read, Bash, Glob, WebFetch, WebSearch --- @@ -32,38 +32,52 @@ Read the rector source to extract: ### 2. Search for contrib modules -**Primary: `search.tresbien.tech`** +**Primary: `api.tresbien.tech` JSON API** -Use `WebFetch` to search this Drupal contrib code index. The base URL is: +Use `curl` + `jq` to query the JSON search API. The base URL is: ``` -https://search.tresbien.tech/search?q=&num=0&ctx=0 +https://api.tresbien.tech/v1/search?q=&num= ``` **Always include `-r:drupal`** to exclude Drupal core from results (use `-r:drupal`, NOT `-r:core`). +**Regex escaping:** The query is treated as a regex. Escape `(` as `\(` — an unescaped `(` causes a parse error and returns HTTP 418. + Standard query construction: -- Method call: `-r:drupal ->methodName(` -- Function call: `-r:drupal functionName(` +- Method call: `-r:drupal ->methodName\(` +- Function call: `-r:drupal functionName\(` - Class constant: `-r:drupal ClassName::CONSTANT_NAME` - Property access: `-r:drupal ->propertyName` Additional filters to add as needed: -- `f:\.php$` — PHP files only (add `f:\.module$` if the pattern may appear in `.module` files) -- `-f:test` — exclude test files when you want production code only +- `f:\.php$` — PHP files only (add `f:\.module$` if pattern may appear in `.module` files) +- `-f:test` — exclude test files - `lang:php` — PHP language filter - `case:yes` — force case-sensitive match -Example for `->delete(` on SessionManager: +Example — search for `_filter_autop(` in contrib PHP files: +```bash +curl -s "https://api.tresbien.tech/v1/search?q=-r%3Adrupal+_filter_autop%5C%28+-f%3Atest&num=20" \ + | jq -r '.Result.Files[] | "\(.Repository)\t\(.FileName)\t\(.Branches | join(","))"' ``` -https://search.tresbien.tech/search?q=-r%3Adrupal+-%3Edelete(&num=0&ctx=0 + +The response is JSON with `Result.Files[]` — each entry has: +- `.Repository` — module/project name (use this directly, no path parsing needed) +- `.FileName` — file path within the repo +- `.Branches[]` — which branch the match is on +- `.ChunkMatches[].Content` — base64-encoded matched line(s) + +To decode a matched line and see actual code context: +```bash +echo "" | base64 -d ``` -Parse the fetched page for matching file paths and extract the module/project name from the path prefix. +**Never loop over individual repos.** If you need to search within a known set of repos, use regex alternation: `r:^(module1|module2|module3)$`. **Fallback: Drupal GitLab API blob search** -If `search.tresbien.tech` yields no results or is unavailable: +If the API yields no results or is unavailable: ```bash QUERY="" @@ -73,13 +87,24 @@ curl -s "https://git.drupalcode.org/search?group_id=2&scope=blobs&search=-path%3 ### 3. Filter to D11-compatible modules -For each module found, check its `.info.yml` for `core_version_requirement`: +Use the repo listing API to batch-check all found modules at once. The endpoint returns `RawConfig."drupal-core"` (branch-keyed compatibility strings) and `RawConfig."drupal-usage"` (install counts per branch): + ```bash -# Example using GitLab API for a specific module -curl -s "https://git.drupalcode.org/api/v4/projects/%2F/repository/files/.info.yml/raw?ref=HEAD" +# Get D11-compatible repos and their install counts +MODULES='module1|module2|module3' # pipe-separated list from step 2 +curl -s "https://api.tresbien.tech/v1/search/repo" \ + | jq -r --arg mods "$MODULES" \ + '.List.Repos[] + | select(.Repository.Name | test($mods)) + | select(.Repository.RawConfig."drupal-core" // "" | test("\\^11")) + | [.Repository.Name, + .Repository.RawConfig."drupal-core", + .Repository.RawConfig."drupal-usage"] | @tsv' ``` -Keep only modules where `core_version_requirement` includes Drupal 11 (e.g., `^8 || ^9 || ^10 || ^11` or `>=10`). +The `drupal-core` field looks like `"1.x:^10 || ^11;2.x:^11"` — keep modules where any branch entry includes `^11`. + +The `drupal-usage` field looks like `"1.x:4521;2.x:312"` — **prefer modules with higher install counts** for better real-world test coverage. If no D11-compatible modules are found, report: ``` From dd76b4066bc6995785d89e5ac192f93e1340136b Mon Sep 17 00:00:00 2001 From: nLightened Development LLC Date: Fri, 8 May 2026 09:39:38 -0400 Subject: [PATCH 136/256] Add theme extension (#325) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add theme extension * test: add .theme file to test * test: use actual theme hooks * test: update expected result for hookconvertrector.theme * test: update expected result for hookconvertrector.theme * test: update expected result for hookconvertrector.theme last cleanup --------- Co-authored-by: Björn Brala --- src/Rector/Convert/HookConvertRector.php | 2 +- .../hookconvertrector/hookconvertrector.theme | 83 +++++++++++++++++++ .../hookconvertrector.theme | 39 +++++++++ 3 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 tests/functional/hookconvertrector/fixture/hookconvertrector/hookconvertrector.theme create mode 100644 tests/functional/hookconvertrector/fixture/hookconvertrector_updated/hookconvertrector.theme diff --git a/src/Rector/Convert/HookConvertRector.php b/src/Rector/Convert/HookConvertRector.php index 786298743..1a6e0cb1a 100644 --- a/src/Rector/Convert/HookConvertRector.php +++ b/src/Rector/Convert/HookConvertRector.php @@ -131,7 +131,7 @@ public function refactor(Node $node): Node|int|null ? $this->getFile()->getFilePath() : $this->file->getFilePath(); $ext = pathinfo($filePath, \PATHINFO_EXTENSION); - if (!in_array($ext, ['inc', 'module'])) { + if (!in_array($ext, ['inc', 'module', 'theme'])) { return null; } if ($filePath !== $this->inputFilename) { diff --git a/tests/functional/hookconvertrector/fixture/hookconvertrector/hookconvertrector.theme b/tests/functional/hookconvertrector/fixture/hookconvertrector/hookconvertrector.theme new file mode 100644 index 000000000..dfde73a70 --- /dev/null +++ b/tests/functional/hookconvertrector/fixture/hookconvertrector/hookconvertrector.theme @@ -0,0 +1,83 @@ + 'red', + 'green' => 'green', + 'blue' => 'blue', + ]; +} + + +/** + * Implements hook_user_add(). + */ +#[LegacyHook] +function hookconvertrector_theme_suggestions_form_alter(array &$attachments): void { + $red = 'red'; + $method = [ + 'red', + 'green', + 'blue', + ]; + $edit = [ + 'red' => 'red', + 'green' => 'green', + 'blue' => 'blue', + ]; +} + +/** + * Implements hook_page_attachments_alter(). + */ +function hookconvertrector_page_attachments_alter(array &$page) { + // Routes that don't use BigPipe also don't need no-JS detection. + if (\Drupal::routeMatch()->getRouteObject()->getOption('_no_big_pipe')) { + return; + } + + $request = \Drupal::request(); + // BigPipe is only used when there is an actual session, so only add the no-JS + // detection when there actually is a session. + // @see \Drupal\big_pipe\Render\Placeholder\BigPipeStrategy. + $session_exists = \Drupal::service('session_configuration')->hasSession($request); + $page['#cache']['contexts'][] = 'session.exists'; + // Only do the no-JS detection while we don't know if there's no JS support: + // avoid endless redirect loops. + $has_big_pipe_nojs_cookie = $request->cookies->has(BigPipeStrategy::NOJS_COOKIE); + $page['#cache']['contexts'][] = 'cookies:' . BigPipeStrategy::NOJS_COOKIE; + if ($session_exists) { + if (!$has_big_pipe_nojs_cookie) { + // Let server set the BigPipe no-JS cookie. + $page['#attached']['html_head'][] = [ + [ + // Redirect through a 'Refresh' meta tag if JavaScript is disabled. + '#tag' => 'meta', + '#noscript' => TRUE, + '#attributes' => [ + 'http-equiv' => 'Refresh', + 'content' => '0; URL=' . Url::fromRoute('big_pipe.nojs', [], ['query' => \Drupal::service('redirect.destination')->getAsArray()])->toString(), + ], + ], + 'big_pipe_detect_nojs', + ]; + } + else { + // Let client delete the BigPipe no-JS cookie. + $page['#attached']['html_head'][] = [ + [ + '#tag' => 'script', + '#value' => 'document.cookie = "' . BigPipeStrategy::NOJS_COOKIE . '=1; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT"', + ], + 'big_pipe_detect_js', + ]; + } + } +} diff --git a/tests/functional/hookconvertrector/fixture/hookconvertrector_updated/hookconvertrector.theme b/tests/functional/hookconvertrector/fixture/hookconvertrector_updated/hookconvertrector.theme new file mode 100644 index 000000000..fd6d4163f --- /dev/null +++ b/tests/functional/hookconvertrector/fixture/hookconvertrector_updated/hookconvertrector.theme @@ -0,0 +1,39 @@ +themeSuggestionsFormElementAlter($suggestions, $variables); +} + + +/** + * Implements hook_user_add(). + */ +#[LegacyHook] +function hookconvertrector_theme_suggestions_form_alter(array &$attachments): void { + $red = 'red'; + $method = [ + 'red', + 'green', + 'blue', + ]; + $edit = [ + 'red' => 'red', + 'green' => 'green', + 'blue' => 'blue', + ]; +} + +/** + * Implements hook_page_attachments_alter(). + */ +#[LegacyHook] +function hookconvertrector_page_attachments(array &$page) +{ + return \Drupal::service(HookconvertrectorHooks::class)->pageAttachmentsAlter($page); +} From 421665d1777df769292b47c51e297c73ed417d00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Brala?= Date: Fri, 8 May 2026 16:23:45 +0200 Subject: [PATCH 137/256] fix: fix theme hook test (#328) * fix: fix theme hook test * add #[LegacyHook] attribute to legacy hook implementations in tests * add Hook attributes to test fixtures to demonstrate hook conversions * add Hook attributes to test fixtures to demonstrate hook conversions --- .../hookconvertrector.services.yml | 4 + .../hookconvertrector.theme | 10 ++- .../src/Hook/HookconvertrectorHooks1.php | 81 +++++++++++++++++++ 3 files changed, 91 insertions(+), 4 deletions(-) create mode 100644 tests/functional/hookconvertrector/fixture/hookconvertrector_updated/src/Hook/HookconvertrectorHooks1.php diff --git a/tests/functional/hookconvertrector/fixture/hookconvertrector_updated/hookconvertrector.services.yml b/tests/functional/hookconvertrector/fixture/hookconvertrector_updated/hookconvertrector.services.yml index 3be2c7590..366f49558 100644 --- a/tests/functional/hookconvertrector/fixture/hookconvertrector_updated/hookconvertrector.services.yml +++ b/tests/functional/hookconvertrector/fixture/hookconvertrector_updated/hookconvertrector.services.yml @@ -3,3 +3,7 @@ services: Drupal\hookconvertrector\Hook\HookconvertrectorHooks: class: Drupal\hookconvertrector\Hook\HookconvertrectorHooks autowire: true + + Drupal\hookconvertrector\Hook\HookconvertrectorHooks1: + class: Drupal\hookconvertrector\Hook\HookconvertrectorHooks1 + autowire: true diff --git a/tests/functional/hookconvertrector/fixture/hookconvertrector_updated/hookconvertrector.theme b/tests/functional/hookconvertrector/fixture/hookconvertrector_updated/hookconvertrector.theme index fd6d4163f..295e09c03 100644 --- a/tests/functional/hookconvertrector/fixture/hookconvertrector_updated/hookconvertrector.theme +++ b/tests/functional/hookconvertrector/fixture/hookconvertrector_updated/hookconvertrector.theme @@ -1,12 +1,14 @@ themeSuggestionsFormElementAlter($suggestions, $variables); } @@ -33,7 +35,7 @@ function hookconvertrector_theme_suggestions_form_alter(array &$attachments): vo * Implements hook_page_attachments_alter(). */ #[LegacyHook] -function hookconvertrector_page_attachments(array &$page) +function hookconvertrector_page_attachments_alter(array &$page) { - return \Drupal::service(HookconvertrectorHooks::class)->pageAttachmentsAlter($page); + return \Drupal::service(HookconvertrectorHooks1::class)->pageAttachmentsAlter($page); } diff --git a/tests/functional/hookconvertrector/fixture/hookconvertrector_updated/src/Hook/HookconvertrectorHooks1.php b/tests/functional/hookconvertrector/fixture/hookconvertrector_updated/src/Hook/HookconvertrectorHooks1.php new file mode 100644 index 000000000..aa0262045 --- /dev/null +++ b/tests/functional/hookconvertrector/fixture/hookconvertrector_updated/src/Hook/HookconvertrectorHooks1.php @@ -0,0 +1,81 @@ + 'red', + 'green' => 'green', + 'blue' => 'blue', + ]; + } + + /** + * Implements hook_page_attachments_alter(). + */ + #[Hook('page_attachments_alter')] + public function pageAttachmentsAlter(array &$page) + { + // Routes that don't use BigPipe also don't need no-JS detection. + if (\Drupal::routeMatch()->getRouteObject()->getOption('_no_big_pipe')) { + return; + } + $request = \Drupal::request(); + // BigPipe is only used when there is an actual session, so only add the no-JS + // detection when there actually is a session. + // @see \Drupal\big_pipe\Render\Placeholder\BigPipeStrategy. + $session_exists = \Drupal::service('session_configuration')->hasSession($request); + $page['#cache']['contexts'][] = 'session.exists'; + // Only do the no-JS detection while we don't know if there's no JS support: + // avoid endless redirect loops. + $has_big_pipe_nojs_cookie = $request->cookies->has(\BigPipeStrategy::NOJS_COOKIE); + $page['#cache']['contexts'][] = 'cookies:' . \BigPipeStrategy::NOJS_COOKIE; + if ($session_exists) { + if (!$has_big_pipe_nojs_cookie) { + // Let server set the BigPipe no-JS cookie. + $page['#attached']['html_head'][] = [ + [ + // Redirect through a 'Refresh' meta tag if JavaScript is disabled. + '#tag' => 'meta', + '#noscript' => TRUE, + '#attributes' => [ + 'http-equiv' => 'Refresh', + 'content' => '0; URL=' . \Url::fromRoute('big_pipe.nojs', [ + ], [ + 'query' => \Drupal::service('redirect.destination')->getAsArray(), + ])->toString(), + ], + ], + 'big_pipe_detect_nojs', + ]; + } else { + // Let client delete the BigPipe no-JS cookie. + $page['#attached']['html_head'][] = [ + [ + '#tag' => 'script', + '#value' => 'document.cookie = "' . \BigPipeStrategy::NOJS_COOKIE . '=1; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT"', + ], + 'big_pipe_detect_js', + ]; + } + } + } +} From 7d616d2f548d753d66c410d180abae1052dd83bd Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 8 May 2026 16:28:01 +0200 Subject: [PATCH 138/256] docs(skills): Remove `rector-type-check-review` and update `rector-qa` for type-guard checklist Removed the deprecated `rector-type-check-review` skill and consolidated its type-guard audit patterns into the updated `rector-qa` skill. Enhanced `rector-qa` with bulk mode (`all`), checklist integration for `AT-RISK` patterns, and detailed fix patterns for better consistency. --- .claude/skills/rector-qa/SKILL.md | 87 +++++++++++++-- .../skills/rector-type-check-review/SKILL.md | 101 ------------------ 2 files changed, 81 insertions(+), 107 deletions(-) delete mode 100644 .claude/skills/rector-type-check-review/SKILL.md diff --git a/.claude/skills/rector-qa/SKILL.md b/.claude/skills/rector-qa/SKILL.md index 0e67c24df..b9fef9962 100644 --- a/.claude/skills/rector-qa/SKILL.md +++ b/.claude/skills/rector-qa/SKILL.md @@ -1,7 +1,7 @@ --- name: rector-qa -description: Comprehensive quality review of an existing Drupal rector. Runs four audit passes — type guards, fixture coverage, BC decision correctness, and @see URL accuracy — and produces a PASS/FAIL/WARN checklist. Use before merging a rector or when reviewing existing ones for regressions. -argument-hint: "" +description: Comprehensive quality review of an existing Drupal rector. Runs four audit passes — type guards, fixture coverage, BC decision correctness, and @see URL accuracy — and produces a PASS/FAIL/WARN checklist. Use before merging a rector or when reviewing existing ones for regressions. Pass 'all' to walk the full branch type-guard checklist. +argument-hint: "" allowed-tools: Read, Bash, Edit, Write, Glob --- @@ -11,7 +11,9 @@ Comprehensive four-pass quality review for a drupal-rector implementation. ## Input -`$ARGUMENTS` — rector class name, e.g. `ReplaceSessionManagerDeleteRector`. +`$ARGUMENTS` — one of: +- Rector class name, e.g. `ReplaceSessionManagerDeleteRector` — runs all four passes on that rector. +- `all` — walks every row marked `AT-RISK` in `.claude/skills/prompts/rector-type-specificity-checklist.md` and runs Pass 1 only, fixing each rector in sequence. ## Finding the files @@ -26,7 +28,16 @@ Read the rector class, test class, all fixture files, and the test config. ## Pass 1 — Type Guard Audit -**Goal:** Every `MethodCall`, `NullsafeMethodCall`, or `PropertyFetch` node the rector handles must be guarded by `isObjectType()`. The full fix pattern is in `.claude/skills/rector-qa/SKILL.md` Pass 1 below, and in the `rector-type-check-review` skill if available. +**Goal:** Every `MethodCall`, `NullsafeMethodCall`, or `PropertyFetch` node the rector handles must be guarded by `isObjectType()`. + +| Pattern | What to look for | Risk if missing | +|---------|-----------------|-----------------| +| `->method()` on a variable | `isObjectType($node->var, new ObjectType('FQCN'))` | Any class with this method is transformed | +| `->property` on a variable | Same `isObjectType` on `$node->var` | Any class with this property is transformed | +| `$this->method()` inside a class body | `isObjectType($node->var, ...)` or `extends`-check on enclosing `Class_` | Any class with this method is transformed | +| `ClassName::method()` static call | `isName($node->class, 'ClassName')` or `isObjectType` | Low risk if class name is unique | +| Global function call `foo()` | None needed | SAFE — function names are global | +| Class declaration (`class Foo extends Bar`) | Check `extends` on the `Class_` node | EXEMPT — different pattern | **Steps:** @@ -41,15 +52,79 @@ Read the rector class, test class, all fixture files, and the test config. **Output:** `Pass 1: [SAFE|AT-RISK|EXEMPT] — ` -**If AT-RISK:** Propose the fix (see `rector-type-check-review` skill for exact fix pattern). Apply it and update `.claude/skills/prompts/rector-type-specificity-checklist.md`: +**If AT-RISK:** Apply the fix (see patterns below), then update `.claude/skills/prompts/rector-type-specificity-checklist.md`: ```bash -# Find the row for this rector in the checklist grep -n "" .claude/skills/prompts/rector-type-specificity-checklist.md ``` Update the verdict column from `⚠️ AT-RISK` to `✅ SAFE` after fixing. +### Finding the right class/interface + +Look up the FQCN in `repos/drupal-core` (run `bash .claude/scripts/setup-repos.sh` if absent): + +```bash +grep -rn "function \|property \$" repos/drupal-core/core --include="*.php" -l | head -5 +``` + +Prefer the *interface* over the concrete class — it catches all implementations. + +### Fix pattern + +```php +// Before — matches any ->save() call: +if (!$this->isName($node->name, 'save')) { + return null; +} + +// After — only matches Config::save(): +if (!$this->isName($node->name, 'save')) { + return null; +} +if (!$this->isObjectType($node->var, new ObjectType('Drupal\Core\Config\Config'))) { + return null; +} +``` + +Always add the `isObjectType` check *after* the name check so the heavier type resolution only runs when the name already matches. + +### Stub pattern + +If the class is not already in `stubs/`, create a minimal stub: + +```php +.php"`. +2. Apply the Pass 1 steps above. +3. Fix any AT-RISK rectors and tick the checklist row. + +Do not run the other three passes in bulk mode. + --- ## Pass 2 — Fixture Coverage Audit diff --git a/.claude/skills/rector-type-check-review/SKILL.md b/.claude/skills/rector-type-check-review/SKILL.md deleted file mode 100644 index 3fda0f5fc..000000000 --- a/.claude/skills/rector-type-check-review/SKILL.md +++ /dev/null @@ -1,101 +0,0 @@ ---- -name: rector-type-check-review -description: Reviews Drupal rector rules for type-specificity — ensures method calls, property accesses, and $this references are guarded by isObjectType() or equivalent before transforming. Use when checking rectors that match by name alone without verifying the owning class. Run on individual rectors or walk through the whole branch list. -argument-hint: "[RectorClassName or 'all' or leave empty to use checklist]" -allowed-tools: Read, Bash, Edit, Write, Glob ---- - -# Rector Type-Check Review - -Rector rules that match a method call (`->foo()`), property access (`->bar`), or `$this` usage by *name only* — without verifying the owning class or interface — are a false-positive risk. Any unrelated class that happens to have the same method/property name will be transformed. - -This skill evaluates one or more rectors for this issue and, when a problem is found, proposes or implements the fix. - -## The Problem, Summarised - -| Pattern | What to look for | Risk if missing | -|---------|-----------------|-----------------| -| `->method()` on a variable | `isObjectType($node->var, new ObjectType('Fully\Qualified\Interface'))` | Any class with this method name is transformed | -| `->property` on a variable | Same `isObjectType` on `$node->var` | Any class with this property is transformed | -| `$this->method()` inside a class body | `isObjectType($node->var, ...)` or `extends`-check on the enclosing `Class_` node | Any class with this method is transformed, not just the intended subclass | -| `ClassName::method()` static call | `isName($node->class, 'ClassName')` or `isObjectType` | Low risk if the class name is unique, but still worth verifying | -| Global function call `foo()` | None needed | SAFE — function names are global | -| Class *declaration* (`class Foo extends Bar`) | Check `extends` on the `Class_` node before inspecting methods | EXEMPT category — different pattern | - -## Steps for Each Rector - -1. **Read** the rector source file. -2. **Identify** what node types it matches (look at `getNodeTypes()` and the early-return guards in `refactor()`). -3. **Check the guard**: for every method call, property fetch, or `$this` reference, is there an `isObjectType()` call that constrains the owning class? -4. **Classify**: - - `SAFE` — correct type guard present, or targets global functions/constants only - - `AT-RISK` — matches name without a type guard; needs fixing - - `EXEMPT` — operates on a class declaration and checks the parent class -5. **For AT-RISK rectors**: identify the Drupal class or interface that owns the deprecated member, check whether a stub exists in `stubs/`, add one if needed, then add the `isObjectType` guard and update fixtures. - -## Finding the Right Class/Interface - -For the `isObjectType` guard you need the FQCN of the interface or class that declares the deprecated member. Look it up in `repos/drupal-core` (run `bash .claude/scripts/setup-repos.sh` if absent): - -```bash -grep -rn "function \|property \$" repos/drupal-core/core --include="*.php" -l | head -5 -``` - -Prefer the *interface* over the concrete class when one exists — this catches all implementations. - -## Stub Pattern - -If the class is not already in `stubs/`, create a minimal stub: - -```php -.php" -``` - -Then apply the five steps above to that single rector only. - -## What a Fix Looks Like - -```php -// Before — matches any ->save() call: -if (!$this->isName($node->name, 'save')) { - return null; -} - -// After — only matches Config::save(): -if (!$this->isName($node->name, 'save')) { - return null; -} -if (!$this->isObjectType($node->var, new ObjectType('Drupal\Core\Config\Config'))) { - return null; -} -``` - -Always add the `isObjectType` check *after* the name check so PHPStan's heavier type resolution only runs when the name already matches. From 7816d1bcc2b4cbc68c0f59cdef0b14fe5878b592 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 8 May 2026 16:37:21 +0200 Subject: [PATCH 139/256] refactor: promote DrupalServiceRenameRector, FunctionToFirstArgMethodRector, and VersionedFunctionToServiceRector to generic namespace Move DrupalServiceRenameRector, FunctionToFirstArgMethodRector, and their ValueObject configuration classes to src/Rector/ so they are available as generic, version-agnostic rectors alongside the existing FunctionToServiceRector and FunctionToStaticRector. The Drupal8, Drupal9, and Drupal10 originals are kept as thin BC wrappers that extend the generic classes and preserve their original configure() type validation. VersionedFunctionToServiceConfiguration now extends FunctionToServiceConfiguration (the two were field-for-field identical). --- .../VersionedFunctionToServiceRector.php | 47 +---------- ...ersionedFunctionToServiceConfiguration.php | 48 +----------- .../Deprecation/DrupalServiceRenameRector.php | 63 +-------------- .../DrupalServiceRenameConfiguration.php | 23 +----- .../FunctionToFirstArgMethodRector.php | 69 +---------------- .../FunctionToFirstArgMethodConfiguration.php | 26 +------ .../Deprecation/DrupalServiceRenameRector.php | 77 +++++++++++++++++++ .../FunctionToFirstArgMethodRector.php | 69 +++++++++++++++++ .../DrupalServiceRenameConfiguration.php | 28 +++++++ .../FunctionToFirstArgMethodConfiguration.php | 28 +++++++ 10 files changed, 217 insertions(+), 261 deletions(-) create mode 100644 src/Rector/Deprecation/DrupalServiceRenameRector.php create mode 100644 src/Rector/Deprecation/FunctionToFirstArgMethodRector.php create mode 100644 src/Rector/ValueObject/DrupalServiceRenameConfiguration.php create mode 100644 src/Rector/ValueObject/FunctionToFirstArgMethodConfiguration.php diff --git a/src/Drupal10/Rector/Deprecation/VersionedFunctionToServiceRector.php b/src/Drupal10/Rector/Deprecation/VersionedFunctionToServiceRector.php index 8ec7105f0..785ad152c 100644 --- a/src/Drupal10/Rector/Deprecation/VersionedFunctionToServiceRector.php +++ b/src/Drupal10/Rector/Deprecation/VersionedFunctionToServiceRector.php @@ -4,23 +4,13 @@ namespace DrupalRector\Drupal10\Rector\Deprecation; -use DrupalRector\Contract\VersionedConfigurationInterface; use DrupalRector\Drupal10\Rector\ValueObject\VersionedFunctionToServiceConfiguration; -use DrupalRector\Rector\AbstractDrupalCoreRector; -use PhpParser\Node; +use DrupalRector\Rector\Deprecation\FunctionToServiceRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -/** - * Replaces deprecated function call with service method call with backwards compatibility. - */ -class VersionedFunctionToServiceRector extends AbstractDrupalCoreRector +class VersionedFunctionToServiceRector extends FunctionToServiceRector { - /** - * @var array|VersionedFunctionToServiceConfiguration[] - */ - protected array $configurations = []; - public function configure(array $configuration): void { foreach ($configuration as $value) { @@ -32,40 +22,9 @@ public function configure(array $configuration): void parent::configure($configuration); } - /** - * {@inheritdoc} - */ - public function getNodeTypes(): array - { - return [ - Node\Expr\FuncCall::class, - ]; - } - - /** - * @param Node\Expr\FuncCall $node - * @param VersionedFunctionToServiceConfiguration $configuration - * - * @return Node|null - */ - public function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node - { - /** @var Node\Expr\FuncCall $node */ - if ($this->getName($node->name) === $configuration->getDeprecatedFunctionName()) { - // This creates a service call like `\Drupal::service('file_system'). - $service = new Node\Expr\StaticCall(new Node\Name\FullyQualified('Drupal'), 'service', [new Node\Arg(new Node\Scalar\String_($configuration->getServiceName()))]); - - $method_name = new Node\Identifier($configuration->getServiceMethodName()); - - return new Node\Expr\MethodCall($service, $method_name, $node->args); - } - - return null; - } - public function getRuleDefinition(): RuleDefinition { - return new RuleDefinition('Fixes deprecated function to service calls, used in Drupal 8 and 9 deprecations', [ + return new RuleDefinition('Fixes deprecated function to service calls, used in Drupal 10 deprecations', [ new ConfiguredCodeSample( <<<'CODE_BEFORE' _drupal_flush_css_js(); diff --git a/src/Drupal10/Rector/ValueObject/VersionedFunctionToServiceConfiguration.php b/src/Drupal10/Rector/ValueObject/VersionedFunctionToServiceConfiguration.php index e00681627..8a6db935f 100644 --- a/src/Drupal10/Rector/ValueObject/VersionedFunctionToServiceConfiguration.php +++ b/src/Drupal10/Rector/ValueObject/VersionedFunctionToServiceConfiguration.php @@ -4,52 +4,8 @@ namespace DrupalRector\Drupal10\Rector\ValueObject; -use DrupalRector\Contract\VersionedConfigurationInterface; +use DrupalRector\Rector\ValueObject\FunctionToServiceConfiguration; -class VersionedFunctionToServiceConfiguration implements VersionedConfigurationInterface +class VersionedFunctionToServiceConfiguration extends FunctionToServiceConfiguration { - /** - * The deprecated function name. - */ - protected string $deprecatedFunctionName; - - /** - * The replacement service name. - */ - protected string $serviceName; - - /** - * The replacement service method. - */ - protected string $serviceMethodName; - - protected string $introducedVersion; - - public function __construct(string $introducedVersion, string $deprecatedFunctionName, string $serviceName, string $serviceMethodName) - { - $this->deprecatedFunctionName = $deprecatedFunctionName; - $this->serviceName = $serviceName; - $this->serviceMethodName = $serviceMethodName; - $this->introducedVersion = $introducedVersion; - } - - public function getDeprecatedFunctionName(): string - { - return $this->deprecatedFunctionName; - } - - public function getServiceName(): string - { - return $this->serviceName; - } - - public function getServiceMethodName(): string - { - return $this->serviceMethodName; - } - - public function getIntroducedVersion(): string - { - return $this->introducedVersion; - } } diff --git a/src/Drupal8/Rector/Deprecation/DrupalServiceRenameRector.php b/src/Drupal8/Rector/Deprecation/DrupalServiceRenameRector.php index f530b832f..99ec38382 100644 --- a/src/Drupal8/Rector/Deprecation/DrupalServiceRenameRector.php +++ b/src/Drupal8/Rector/Deprecation/DrupalServiceRenameRector.php @@ -5,19 +5,9 @@ namespace DrupalRector\Drupal8\Rector\Deprecation; use DrupalRector\Drupal8\Rector\ValueObject\DrupalServiceRenameConfiguration; -use PhpParser\Node; -use Rector\Contract\Rector\ConfigurableRectorInterface; -use Rector\Rector\AbstractRector; -use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; -use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -class DrupalServiceRenameRector extends AbstractRector implements ConfigurableRectorInterface +class DrupalServiceRenameRector extends \DrupalRector\Rector\Deprecation\DrupalServiceRenameRector { - /** - * @var DrupalServiceRenameConfiguration[] - */ - protected array $staticArgumentRenameConfigs = []; - public function configure(array $configuration): void { foreach ($configuration as $value) { @@ -26,55 +16,6 @@ public function configure(array $configuration): void } } - $this->staticArgumentRenameConfigs = $configuration; - } - - public function getNodeTypes(): array - { - return [ - Node\Expr\StaticCall::class, - ]; - } - - public function refactor(Node $node) - { - if ($node instanceof Node\Expr\StaticCall) { - foreach ($this->staticArgumentRenameConfigs as $configuration) { - if ($this->getName($node->name) === 'service' && (string) $node->class === 'Drupal') { - if (count($node->args) === 1) { - /* @var Node\Arg $argument */ - $argument = $node->args[0]; - - if ($argument->value instanceof Node\Scalar\String_ && $argument->value->value === $configuration->getDeprecatedService()) { - $node->args[0] = new Node\Arg(new Node\Scalar\String_($configuration->getNewService())); - - return $node; - } - } - } - } - } - - return null; - } - - public function getRuleDefinition(): RuleDefinition - { - return new RuleDefinition('Renames the IDs in Drupal::service() calls', [ - new ConfiguredCodeSample( - <<<'CODE_BEFORE' -\Drupal::service('old')->foo(); -CODE_BEFORE, - <<<'CODE_AFTER' -\Drupal::service('bar')->foo(); -CODE_AFTER, - [ - new DrupalServiceRenameConfiguration( - 'old', - 'bar', - ), - ] - ), - ]); + parent::configure($configuration); } } diff --git a/src/Drupal8/Rector/ValueObject/DrupalServiceRenameConfiguration.php b/src/Drupal8/Rector/ValueObject/DrupalServiceRenameConfiguration.php index d24d59335..9665ec459 100644 --- a/src/Drupal8/Rector/ValueObject/DrupalServiceRenameConfiguration.php +++ b/src/Drupal8/Rector/ValueObject/DrupalServiceRenameConfiguration.php @@ -4,25 +4,8 @@ namespace DrupalRector\Drupal8\Rector\ValueObject; -class DrupalServiceRenameConfiguration -{ - protected string $newService; - - protected string $deprecatedService; - - public function __construct(string $deprecatedService, string $newService) - { - $this->deprecatedService = $deprecatedService; - $this->newService = $newService; - } +use DrupalRector\Rector\ValueObject\DrupalServiceRenameConfiguration as GenericDrupalServiceRenameConfiguration; - public function getNewService(): string - { - return $this->newService; - } - - public function getDeprecatedService(): string - { - return $this->deprecatedService; - } +class DrupalServiceRenameConfiguration extends GenericDrupalServiceRenameConfiguration +{ } diff --git a/src/Drupal9/Rector/Deprecation/FunctionToFirstArgMethodRector.php b/src/Drupal9/Rector/Deprecation/FunctionToFirstArgMethodRector.php index 769d014d9..30146d3f6 100644 --- a/src/Drupal9/Rector/Deprecation/FunctionToFirstArgMethodRector.php +++ b/src/Drupal9/Rector/Deprecation/FunctionToFirstArgMethodRector.php @@ -5,29 +5,9 @@ namespace DrupalRector\Drupal9\Rector\Deprecation; use DrupalRector\Drupal9\Rector\ValueObject\FunctionToFirstArgMethodConfiguration; -use PhpParser\Node; -use Rector\Contract\Rector\ConfigurableRectorInterface; -use Rector\Rector\AbstractRector; -use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; -use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -final class FunctionToFirstArgMethodRector extends AbstractRector implements ConfigurableRectorInterface +final class FunctionToFirstArgMethodRector extends \DrupalRector\Rector\Deprecation\FunctionToFirstArgMethodRector { - /** - * @var FunctionToFirstArgMethodConfiguration[] - */ - private array $configuration; - - /** - * {@inheritdoc} - */ - public function getNodeTypes(): array - { - return [ - Node\Expr\FuncCall::class, - ]; - } - public function configure(array $configuration): void { foreach ($configuration as $value) { @@ -36,51 +16,6 @@ public function configure(array $configuration): void } } - $this->configuration = $configuration; - } - - /** - * {@inheritdoc} - */ - public function refactor(Node $node): ?Node - { - assert($node instanceof Node\Expr\FuncCall); - - foreach ($this->configuration as $configuration) { - if ($this->getName($node) !== $configuration->getDeprecatedFunctionName()) { - continue; - } - $args = $node->getArgs(); - if (count($args) !== 1) { - continue; - } - - return $this->nodeFactory->createMethodCall($args[0]->value, $configuration->getMethodName()); - } - - return null; - } - - /** - * {@inheritdoc} - */ - public function getRuleDefinition(): RuleDefinition - { - return new RuleDefinition('Fixes deprecated taxonomy_implode_tags() calls', [ - new ConfiguredCodeSample( - <<<'CODE_BEFORE' -$url = taxonomy_term_uri($term); -$name = taxonomy_term_title($term); -CODE_BEFORE, - <<<'CODE_AFTER' -$url = $term->toUrl(); -$name = $term->label(); -CODE_AFTER, - [ - new FunctionToFirstArgMethodConfiguration('taxonomy_term_uri', 'toUrl'), - new FunctionToFirstArgMethodConfiguration('taxonomy_term_title', 'label'), - ] - ), - ]); + parent::configure($configuration); } } diff --git a/src/Drupal9/Rector/ValueObject/FunctionToFirstArgMethodConfiguration.php b/src/Drupal9/Rector/ValueObject/FunctionToFirstArgMethodConfiguration.php index 86299e61f..127f9e29b 100644 --- a/src/Drupal9/Rector/ValueObject/FunctionToFirstArgMethodConfiguration.php +++ b/src/Drupal9/Rector/ValueObject/FunctionToFirstArgMethodConfiguration.php @@ -4,28 +4,8 @@ namespace DrupalRector\Drupal9\Rector\ValueObject; -class FunctionToFirstArgMethodConfiguration -{ - private string $deprecatedFunctionName; - private string $methodName; - - /** - * @param string $deprecatedFunctionName - * @param string $methodName - */ - public function __construct(string $deprecatedFunctionName, string $methodName) - { - $this->deprecatedFunctionName = $deprecatedFunctionName; - $this->methodName = $methodName; - } +use DrupalRector\Rector\ValueObject\FunctionToFirstArgMethodConfiguration as GenericFunctionToFirstArgMethodConfiguration; - public function getDeprecatedFunctionName(): string - { - return $this->deprecatedFunctionName; - } - - public function getMethodName(): string - { - return $this->methodName; - } +class FunctionToFirstArgMethodConfiguration extends GenericFunctionToFirstArgMethodConfiguration +{ } diff --git a/src/Rector/Deprecation/DrupalServiceRenameRector.php b/src/Rector/Deprecation/DrupalServiceRenameRector.php new file mode 100644 index 000000000..6ec33a563 --- /dev/null +++ b/src/Rector/Deprecation/DrupalServiceRenameRector.php @@ -0,0 +1,77 @@ +configuration = $configuration; + } + + public function getNodeTypes(): array + { + return [Node\Expr\StaticCall::class]; + } + + public function refactor(Node $node): ?Node + { + assert($node instanceof Node\Expr\StaticCall); + + if ($this->getName($node->name) !== 'service' || (string) $node->class !== 'Drupal') { + return null; + } + + if (count($node->args) !== 1) { + return null; + } + + $argument = $node->args[0]; + if (!$argument instanceof Node\Arg || !$argument->value instanceof Node\Scalar\String_) { + return null; + } + + foreach ($this->configuration as $config) { + if ($argument->value->value === $config->getDeprecatedService()) { + $node->args[0] = new Node\Arg(new Node\Scalar\String_($config->getNewService())); + + return $node; + } + } + + return null; + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition('Renames the IDs in Drupal::service() calls', [ + new ConfiguredCodeSample( + <<<'CODE_BEFORE' +\Drupal::service('old')->foo(); +CODE_BEFORE, + <<<'CODE_AFTER' +\Drupal::service('bar')->foo(); +CODE_AFTER, + [new DrupalServiceRenameConfiguration('old', 'bar')] + ), + ]); + } +} diff --git a/src/Rector/Deprecation/FunctionToFirstArgMethodRector.php b/src/Rector/Deprecation/FunctionToFirstArgMethodRector.php new file mode 100644 index 000000000..01ef2e1a5 --- /dev/null +++ b/src/Rector/Deprecation/FunctionToFirstArgMethodRector.php @@ -0,0 +1,69 @@ +configuration = $configuration; + } + + public function refactor(Node $node): ?Node + { + assert($node instanceof Node\Expr\FuncCall); + + foreach ($this->configuration as $configuration) { + if ($this->getName($node) !== $configuration->getDeprecatedFunctionName()) { + continue; + } + + $args = $node->getArgs(); + if (count($args) !== 1) { + continue; + } + + return $this->nodeFactory->createMethodCall($args[0]->value, $configuration->getMethodName()); + } + + return null; + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition('Replaces function calls where the first argument is an object with a method call on that object', [ + new ConfiguredCodeSample( + <<<'CODE_BEFORE' +$url = taxonomy_term_uri($term); +CODE_BEFORE, + <<<'CODE_AFTER' +$url = $term->toUrl(); +CODE_AFTER, + [new FunctionToFirstArgMethodConfiguration('taxonomy_term_uri', 'toUrl')] + ), + ]); + } +} diff --git a/src/Rector/ValueObject/DrupalServiceRenameConfiguration.php b/src/Rector/ValueObject/DrupalServiceRenameConfiguration.php new file mode 100644 index 000000000..21475578f --- /dev/null +++ b/src/Rector/ValueObject/DrupalServiceRenameConfiguration.php @@ -0,0 +1,28 @@ +deprecatedService = $deprecatedService; + $this->newService = $newService; + } + + public function getNewService(): string + { + return $this->newService; + } + + public function getDeprecatedService(): string + { + return $this->deprecatedService; + } +} diff --git a/src/Rector/ValueObject/FunctionToFirstArgMethodConfiguration.php b/src/Rector/ValueObject/FunctionToFirstArgMethodConfiguration.php new file mode 100644 index 000000000..c36d37532 --- /dev/null +++ b/src/Rector/ValueObject/FunctionToFirstArgMethodConfiguration.php @@ -0,0 +1,28 @@ +deprecatedFunctionName = $deprecatedFunctionName; + $this->methodName = $methodName; + } + + public function getDeprecatedFunctionName(): string + { + return $this->deprecatedFunctionName; + } + + public function getMethodName(): string + { + return $this->methodName; + } +} From 314606ec9d7bc0a29e1973d5dfb4fa3cc95e6b8d Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 8 May 2026 16:39:07 +0200 Subject: [PATCH 140/256] chore: add DrupalServiceRenameRector and FunctionToFirstArgMethodRector to skill docs Update the generic rector decision table and configuration syntax examples in digest-to-rector-prompt.md, and the phase reference table in rector-discover, to include the two newly promoted generic rectors. --- .claude/skills/prompts/digest-to-rector-prompt.md | 10 ++++++++++ .claude/skills/rector-discover/SKILL.md | 2 ++ 2 files changed, 12 insertions(+) diff --git a/.claude/skills/prompts/digest-to-rector-prompt.md b/.claude/skills/prompts/digest-to-rector-prompt.md index 8e532144d..3373320b3 100644 --- a/.claude/skills/prompts/digest-to-rector-prompt.md +++ b/.claude/skills/prompts/digest-to-rector-prompt.md @@ -131,6 +131,8 @@ preferred path — it avoids creating new classes for patterns that drupal-recto | Global function call removed entirely (no replacement) | `FunctionCallRemovalRector` | | Global function → static class method | `FunctionToStaticRector` | | Global function → `\Drupal::service('…')->method()` | `FunctionToServiceRector` | +| Global function → method on its first argument (e.g. `fn($obj)` → `$obj->method()`) | `FunctionToFirstArgMethodRector` | +| `\Drupal::service('old.id')` → `\Drupal::service('new.id')` | `DrupalServiceRenameRector` | | Instance method renamed (with receiver type check) | `MethodToMethodWithCheckRector` | | Class constant → different class constant | `ClassConstantToClassConstantRector` | | Global constant → class constant | `ConstantToClassConstantRector` | @@ -182,6 +184,14 @@ new ClassConstantToClassConstantConfiguration('[OldClass\\FQCN]', '[OLD_CONST]', new ConstantToClassConfiguration('[GLOBAL_CONSTANT_NAME]', '[TargetClass\\FQCN]', '[CONST_NAME]'), // no introducedVersion — applies unconditionally; no BC wrapping +// FunctionToFirstArgMethodRector — fn($obj) → $obj->method(); first arg must be the receiver +new FunctionToFirstArgMethodConfiguration('[deprecatedFunctionName]', '[methodName]'), +// no introducedVersion — applies unconditionally; no BC wrapping + +// DrupalServiceRenameRector — \Drupal::service('old.id') → \Drupal::service('new.id') +new DrupalServiceRenameConfiguration('[deprecated.service.id]', '[new.service.id]'), +// no introducedVersion — applies unconditionally; no BC wrapping + // RenameClassRector — pass an associative array directly, not a configuration object $rectorConfig->ruleWithConfiguration(RenameClassRector::class, [ '[Old\\Class\\FQCN]' => '[New\\Class\\FQCN]', diff --git a/.claude/skills/rector-discover/SKILL.md b/.claude/skills/rector-discover/SKILL.md index 6966fa885..11535fa0e 100644 --- a/.claude/skills/rector-discover/SKILL.md +++ b/.claude/skills/rector-discover/SKILL.md @@ -81,6 +81,8 @@ Next suggested: /rector-implement repos/drupal-digests/rector/rules/method()`) | `FunctionToFirstArgMethodRector` | +| 1a | Service ID rename (`\Drupal::service('old')` → `\Drupal::service('new')`) | `DrupalServiceRenameRector` | | 1b | FuncCall → static call | `FunctionToStaticRector` | | 1c | Class constant replacement | `ClassConstantToClassConstantRector` | | 2 | MethodCall custom class | custom `AbstractRector` or `AbstractDrupalCoreRector` | From 956f2f10aa047efc02887b12c8837490a53319a4 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 8 May 2026 16:41:55 +0200 Subject: [PATCH 141/256] feat: add DeprecationHelper BC wrapping support to DrupalServiceRenameRector and FunctionToFirstArgMethodRector MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Both generic rectors now extend AbstractDrupalCoreRector and their configuration classes implement VersionedConfigurationInterface. Passing an introducedVersion triggers the standard DeprecationHelper::backwardsCompatibleCall() wrapping just like FunctionToServiceRector. The D8/D9 BC wrapper configs override __construct to keep the old two-arg signature and pass an empty version string to the parent, which causes AbstractDrupalCoreRector to apply the rule unconditionally with no BC wrapping — preserving the existing behaviour for D8/D9 entries. --- .../skills/prompts/digest-to-rector-prompt.md | 8 ++-- .../DrupalServiceRenameConfiguration.php | 4 ++ .../FunctionToFirstArgMethodConfiguration.php | 4 ++ .../Deprecation/DrupalServiceRenameRector.php | 28 +++++------- .../FunctionToFirstArgMethodRector.php | 44 ++++++++----------- .../DrupalServiceRenameConfiguration.php | 20 ++++++--- .../FunctionToFirstArgMethodConfiguration.php | 14 +++++- 7 files changed, 70 insertions(+), 52 deletions(-) diff --git a/.claude/skills/prompts/digest-to-rector-prompt.md b/.claude/skills/prompts/digest-to-rector-prompt.md index 3373320b3..81604ded0 100644 --- a/.claude/skills/prompts/digest-to-rector-prompt.md +++ b/.claude/skills/prompts/digest-to-rector-prompt.md @@ -185,12 +185,12 @@ new ConstantToClassConfiguration('[GLOBAL_CONSTANT_NAME]', '[TargetClass\\FQCN]' // no introducedVersion — applies unconditionally; no BC wrapping // FunctionToFirstArgMethodRector — fn($obj) → $obj->method(); first arg must be the receiver -new FunctionToFirstArgMethodConfiguration('[deprecatedFunctionName]', '[methodName]'), -// no introducedVersion — applies unconditionally; no BC wrapping +new FunctionToFirstArgMethodConfiguration('[introducedVersion]', '[deprecatedFunctionName]', '[methodName]'), +// introducedVersion triggers DeprecationHelper BC wrapping; omit (use D9 BC wrapper) for older entries // DrupalServiceRenameRector — \Drupal::service('old.id') → \Drupal::service('new.id') -new DrupalServiceRenameConfiguration('[deprecated.service.id]', '[new.service.id]'), -// no introducedVersion — applies unconditionally; no BC wrapping +new DrupalServiceRenameConfiguration('[introducedVersion]', '[deprecated.service.id]', '[new.service.id]'), +// introducedVersion triggers DeprecationHelper BC wrapping; omit (use D8 BC wrapper) for older entries // RenameClassRector — pass an associative array directly, not a configuration object $rectorConfig->ruleWithConfiguration(RenameClassRector::class, [ diff --git a/src/Drupal8/Rector/ValueObject/DrupalServiceRenameConfiguration.php b/src/Drupal8/Rector/ValueObject/DrupalServiceRenameConfiguration.php index 9665ec459..d2e5e2915 100644 --- a/src/Drupal8/Rector/ValueObject/DrupalServiceRenameConfiguration.php +++ b/src/Drupal8/Rector/ValueObject/DrupalServiceRenameConfiguration.php @@ -8,4 +8,8 @@ class DrupalServiceRenameConfiguration extends GenericDrupalServiceRenameConfiguration { + public function __construct(string $deprecatedService, string $newService) + { + parent::__construct('', $deprecatedService, $newService); + } } diff --git a/src/Drupal9/Rector/ValueObject/FunctionToFirstArgMethodConfiguration.php b/src/Drupal9/Rector/ValueObject/FunctionToFirstArgMethodConfiguration.php index 127f9e29b..4e1c1f26b 100644 --- a/src/Drupal9/Rector/ValueObject/FunctionToFirstArgMethodConfiguration.php +++ b/src/Drupal9/Rector/ValueObject/FunctionToFirstArgMethodConfiguration.php @@ -8,4 +8,8 @@ class FunctionToFirstArgMethodConfiguration extends GenericFunctionToFirstArgMethodConfiguration { + public function __construct(string $deprecatedFunctionName, string $methodName) + { + parent::__construct('', $deprecatedFunctionName, $methodName); + } } diff --git a/src/Rector/Deprecation/DrupalServiceRenameRector.php b/src/Rector/Deprecation/DrupalServiceRenameRector.php index 6ec33a563..fa65b5e0d 100644 --- a/src/Rector/Deprecation/DrupalServiceRenameRector.php +++ b/src/Rector/Deprecation/DrupalServiceRenameRector.php @@ -4,18 +4,15 @@ namespace DrupalRector\Rector\Deprecation; +use DrupalRector\Contract\VersionedConfigurationInterface; +use DrupalRector\Rector\AbstractDrupalCoreRector; use DrupalRector\Rector\ValueObject\DrupalServiceRenameConfiguration; use PhpParser\Node; -use Rector\Contract\Rector\ConfigurableRectorInterface; -use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -class DrupalServiceRenameRector extends AbstractRector implements ConfigurableRectorInterface +class DrupalServiceRenameRector extends AbstractDrupalCoreRector { - /** @var DrupalServiceRenameConfiguration[] */ - protected array $configuration = []; - public function configure(array $configuration): void { foreach ($configuration as $value) { @@ -24,7 +21,7 @@ public function configure(array $configuration): void } } - $this->configuration = $configuration; + parent::configure($configuration); } public function getNodeTypes(): array @@ -32,9 +29,10 @@ public function getNodeTypes(): array return [Node\Expr\StaticCall::class]; } - public function refactor(Node $node): ?Node + public function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { assert($node instanceof Node\Expr\StaticCall); + assert($configuration instanceof DrupalServiceRenameConfiguration); if ($this->getName($node->name) !== 'service' || (string) $node->class !== 'Drupal') { return null; @@ -49,15 +47,13 @@ public function refactor(Node $node): ?Node return null; } - foreach ($this->configuration as $config) { - if ($argument->value->value === $config->getDeprecatedService()) { - $node->args[0] = new Node\Arg(new Node\Scalar\String_($config->getNewService())); - - return $node; - } + if ($argument->value->value !== $configuration->getDeprecatedService()) { + return null; } - return null; + $node->args[0] = new Node\Arg(new Node\Scalar\String_($configuration->getNewService())); + + return $node; } public function getRuleDefinition(): RuleDefinition @@ -70,7 +66,7 @@ public function getRuleDefinition(): RuleDefinition <<<'CODE_AFTER' \Drupal::service('bar')->foo(); CODE_AFTER, - [new DrupalServiceRenameConfiguration('old', 'bar')] + [new DrupalServiceRenameConfiguration('11.4.0', 'old', 'bar')] ), ]); } diff --git a/src/Rector/Deprecation/FunctionToFirstArgMethodRector.php b/src/Rector/Deprecation/FunctionToFirstArgMethodRector.php index 01ef2e1a5..f6f4071cd 100644 --- a/src/Rector/Deprecation/FunctionToFirstArgMethodRector.php +++ b/src/Rector/Deprecation/FunctionToFirstArgMethodRector.php @@ -4,23 +4,15 @@ namespace DrupalRector\Rector\Deprecation; +use DrupalRector\Contract\VersionedConfigurationInterface; +use DrupalRector\Rector\AbstractDrupalCoreRector; use DrupalRector\Rector\ValueObject\FunctionToFirstArgMethodConfiguration; use PhpParser\Node; -use Rector\Contract\Rector\ConfigurableRectorInterface; -use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -class FunctionToFirstArgMethodRector extends AbstractRector implements ConfigurableRectorInterface +class FunctionToFirstArgMethodRector extends AbstractDrupalCoreRector { - /** @var FunctionToFirstArgMethodConfiguration[] */ - private array $configuration; - - public function getNodeTypes(): array - { - return [Node\Expr\FuncCall::class]; - } - public function configure(array $configuration): void { foreach ($configuration as $value) { @@ -29,27 +21,29 @@ public function configure(array $configuration): void } } - $this->configuration = $configuration; + parent::configure($configuration); } - public function refactor(Node $node): ?Node + public function getNodeTypes(): array { - assert($node instanceof Node\Expr\FuncCall); + return [Node\Expr\FuncCall::class]; + } - foreach ($this->configuration as $configuration) { - if ($this->getName($node) !== $configuration->getDeprecatedFunctionName()) { - continue; - } + public function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node + { + assert($node instanceof Node\Expr\FuncCall); + assert($configuration instanceof FunctionToFirstArgMethodConfiguration); - $args = $node->getArgs(); - if (count($args) !== 1) { - continue; - } + if ($this->getName($node) !== $configuration->getDeprecatedFunctionName()) { + return null; + } - return $this->nodeFactory->createMethodCall($args[0]->value, $configuration->getMethodName()); + $args = $node->getArgs(); + if (count($args) !== 1) { + return null; } - return null; + return $this->nodeFactory->createMethodCall($args[0]->value, $configuration->getMethodName()); } public function getRuleDefinition(): RuleDefinition @@ -62,7 +56,7 @@ public function getRuleDefinition(): RuleDefinition <<<'CODE_AFTER' $url = $term->toUrl(); CODE_AFTER, - [new FunctionToFirstArgMethodConfiguration('taxonomy_term_uri', 'toUrl')] + [new FunctionToFirstArgMethodConfiguration('9.3.0', 'taxonomy_term_uri', 'toUrl')] ), ]); } diff --git a/src/Rector/ValueObject/DrupalServiceRenameConfiguration.php b/src/Rector/ValueObject/DrupalServiceRenameConfiguration.php index 21475578f..790339a07 100644 --- a/src/Rector/ValueObject/DrupalServiceRenameConfiguration.php +++ b/src/Rector/ValueObject/DrupalServiceRenameConfiguration.php @@ -4,25 +4,35 @@ namespace DrupalRector\Rector\ValueObject; -class DrupalServiceRenameConfiguration +use DrupalRector\Contract\VersionedConfigurationInterface; + +class DrupalServiceRenameConfiguration implements VersionedConfigurationInterface { - protected string $newService; + protected string $introducedVersion; protected string $deprecatedService; - public function __construct(string $deprecatedService, string $newService) + protected string $newService; + + public function __construct(string $introducedVersion, string $deprecatedService, string $newService) { + $this->introducedVersion = $introducedVersion; $this->deprecatedService = $deprecatedService; $this->newService = $newService; } - public function getNewService(): string + public function getIntroducedVersion(): string { - return $this->newService; + return $this->introducedVersion; } public function getDeprecatedService(): string { return $this->deprecatedService; } + + public function getNewService(): string + { + return $this->newService; + } } diff --git a/src/Rector/ValueObject/FunctionToFirstArgMethodConfiguration.php b/src/Rector/ValueObject/FunctionToFirstArgMethodConfiguration.php index c36d37532..8856ef993 100644 --- a/src/Rector/ValueObject/FunctionToFirstArgMethodConfiguration.php +++ b/src/Rector/ValueObject/FunctionToFirstArgMethodConfiguration.php @@ -4,18 +4,28 @@ namespace DrupalRector\Rector\ValueObject; -class FunctionToFirstArgMethodConfiguration +use DrupalRector\Contract\VersionedConfigurationInterface; + +class FunctionToFirstArgMethodConfiguration implements VersionedConfigurationInterface { + protected string $introducedVersion; + private string $deprecatedFunctionName; private string $methodName; - public function __construct(string $deprecatedFunctionName, string $methodName) + public function __construct(string $introducedVersion, string $deprecatedFunctionName, string $methodName) { + $this->introducedVersion = $introducedVersion; $this->deprecatedFunctionName = $deprecatedFunctionName; $this->methodName = $methodName; } + public function getIntroducedVersion(): string + { + return $this->introducedVersion; + } + public function getDeprecatedFunctionName(): string { return $this->deprecatedFunctionName; From da8e0cf2f137932eabef4ad9d5c0ed82916e0aad Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 8 May 2026 16:49:38 +0200 Subject: [PATCH 142/256] refactor: replace ReplaceCommentUriRector and ReplaceFileGetContentHeadersRector with FunctionToFirstArgMethodRector MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Both custom rectors were identical in shape to FunctionToFirstArgMethodRector (single-argument function → method call on that argument with BC wrapping). Replaced both with config entries on the generic rector and deleted the now- redundant custom classes and their tests. Generic tests migrated to tests/src/Rector/Deprecation/FunctionToFirstArgMethodRector/. --- config/drupal-11/drupal-11.2-deprecations.php | 7 +- config/drupal-11/drupal-11.3-deprecations.php | 7 +- .../Deprecation/ReplaceCommentUriRector.php | 71 ------------------- .../ReplaceFileGetContentHeadersRector.php | 71 ------------------- .../config/configured_rule.php | 14 ---- ...ReplaceFileGetContentHeadersRectorTest.php | 54 -------------- .../config/configured_rule.php | 14 ---- .../FunctionToFirstArgMethodRectorTest.php} | 4 +- .../config/configured_rule.php | 15 ++++ .../comment_uri_basic.php.inc} | 0 .../file_get_content_headers_basic.php.inc} | 0 .../fixture/comment_uri_as_argument.php.inc} | 0 .../fixture/comment_uri_basic.php.inc} | 0 .../comment_uri_complex_expression.php.inc} | 0 .../fixture/comment_uri_inline_usage.php.inc} | 0 .../comment_uri_no_change_zero_args.php.inc} | 0 ...e_get_content_headers_as_argument.php.inc} | 0 .../file_get_content_headers_basic.php.inc} | 0 ...t_content_headers_inline_in_array.php.inc} | 0 ...ontent_headers_method_call_as_arg.php.inc} | 0 ...t_headers_no_change_multiple_args.php.inc} | 0 ...ntent_headers_no_change_zero_args.php.inc} | 0 22 files changed, 25 insertions(+), 232 deletions(-) delete mode 100644 src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector.php delete mode 100644 src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector.php delete mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/config/configured_rule.php delete mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/ReplaceFileGetContentHeadersRectorTest.php delete mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/config/configured_rule.php rename tests/src/{Drupal11/Rector/Deprecation/ReplaceCommentUriRector/ReplaceCommentUriRectorTest.php => Rector/Deprecation/FunctionToFirstArgMethodRector/FunctionToFirstArgMethodRectorTest.php} (89%) create mode 100644 tests/src/Rector/Deprecation/FunctionToFirstArgMethodRector/config/configured_rule.php rename tests/src/{Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture-below-version/basic.php.inc => Rector/Deprecation/FunctionToFirstArgMethodRector/fixture-below-version/comment_uri_basic.php.inc} (100%) rename tests/src/{Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture-below-version/basic.php.inc => Rector/Deprecation/FunctionToFirstArgMethodRector/fixture-below-version/file_get_content_headers_basic.php.inc} (100%) rename tests/src/{Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture/as_argument.php.inc => Rector/Deprecation/FunctionToFirstArgMethodRector/fixture/comment_uri_as_argument.php.inc} (100%) rename tests/src/{Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture/basic.php.inc => Rector/Deprecation/FunctionToFirstArgMethodRector/fixture/comment_uri_basic.php.inc} (100%) rename tests/src/{Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture/complex_expression.php.inc => Rector/Deprecation/FunctionToFirstArgMethodRector/fixture/comment_uri_complex_expression.php.inc} (100%) rename tests/src/{Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture/inline_usage.php.inc => Rector/Deprecation/FunctionToFirstArgMethodRector/fixture/comment_uri_inline_usage.php.inc} (100%) rename tests/src/{Drupal11/Rector/Deprecation/ReplaceCommentUriRector/fixture/no_change_zero_args.php.inc => Rector/Deprecation/FunctionToFirstArgMethodRector/fixture/comment_uri_no_change_zero_args.php.inc} (100%) rename tests/src/{Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture/as_argument.php.inc => Rector/Deprecation/FunctionToFirstArgMethodRector/fixture/file_get_content_headers_as_argument.php.inc} (100%) rename tests/src/{Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture/basic.php.inc => Rector/Deprecation/FunctionToFirstArgMethodRector/fixture/file_get_content_headers_basic.php.inc} (100%) rename tests/src/{Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture/inline_in_array.php.inc => Rector/Deprecation/FunctionToFirstArgMethodRector/fixture/file_get_content_headers_inline_in_array.php.inc} (100%) rename tests/src/{Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture/method_call_as_arg.php.inc => Rector/Deprecation/FunctionToFirstArgMethodRector/fixture/file_get_content_headers_method_call_as_arg.php.inc} (100%) rename tests/src/{Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture/no_change_multiple_args.php.inc => Rector/Deprecation/FunctionToFirstArgMethodRector/fixture/file_get_content_headers_no_change_multiple_args.php.inc} (100%) rename tests/src/{Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/fixture/no_change_zero_args.php.inc => Rector/Deprecation/FunctionToFirstArgMethodRector/fixture/file_get_content_headers_no_change_zero_args.php.inc} (100%) diff --git a/config/drupal-11/drupal-11.2-deprecations.php b/config/drupal-11/drupal-11.2-deprecations.php index cdb9dd57b..732f2d557 100644 --- a/config/drupal-11/drupal-11.2-deprecations.php +++ b/config/drupal-11/drupal-11.2-deprecations.php @@ -11,7 +11,8 @@ use DrupalRector\Drupal11\Rector\Deprecation\ReplaceEditorLoadRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceEntityOriginalPropertyRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceFieldgroupToFieldsetRector; -use DrupalRector\Drupal11\Rector\Deprecation\ReplaceFileGetContentHeadersRector; +use DrupalRector\Rector\Deprecation\FunctionToFirstArgMethodRector; +use DrupalRector\Rector\ValueObject\FunctionToFirstArgMethodConfiguration; use DrupalRector\Drupal11\Rector\Deprecation\ReplacePdoFetchConstantsRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceSessionWritesWithRequestSessionRector; use DrupalRector\Drupal11\Rector\Deprecation\StatementPrefetchIteratorFetchColumnRector; @@ -149,8 +150,8 @@ // https://www.drupal.org/node/3494126 // file_get_content_headers($file) deprecated in drupal:11.2.0, removed in drupal:12.0.0. // Replaced by $file->getDownloadHeaders(). - $rectorConfig->ruleWithConfiguration(ReplaceFileGetContentHeadersRector::class, [ - new DrupalIntroducedVersionConfiguration('11.2.0'), + $rectorConfig->ruleWithConfiguration(FunctionToFirstArgMethodRector::class, [ + new FunctionToFirstArgMethodConfiguration('11.2.0', 'file_get_content_headers', 'getDownloadHeaders'), ]); // https://www.drupal.org/node/3518527 diff --git a/config/drupal-11/drupal-11.3-deprecations.php b/config/drupal-11/drupal-11.3-deprecations.php index 9d4f6430b..090cb7843 100644 --- a/config/drupal-11/drupal-11.3-deprecations.php +++ b/config/drupal-11/drupal-11.3-deprecations.php @@ -8,7 +8,8 @@ use DrupalRector\Drupal11\Rector\Deprecation\NodeStorageDeprecatedMethodsRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveRootFromConvertDbUrlRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceCommentManagerGetCountNewCommentsRector; -use DrupalRector\Drupal11\Rector\Deprecation\ReplaceCommentUriRector; +use DrupalRector\Rector\Deprecation\FunctionToFirstArgMethodRector; +use DrupalRector\Rector\ValueObject\FunctionToFirstArgMethodConfiguration; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceNodeAccessViewAllNodesRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceNodeAddBodyFieldRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceNodeModuleProceduralFunctionsRector; @@ -67,8 +68,8 @@ // https://www.drupal.org/node/2010202 // comment_uri($comment) deprecated in drupal:11.3.0, removed in drupal:12.0.0. // Replaced by $comment->permalink(). - $rectorConfig->ruleWithConfiguration(ReplaceCommentUriRector::class, [ - new DrupalIntroducedVersionConfiguration('11.3.0'), + $rectorConfig->ruleWithConfiguration(FunctionToFirstArgMethodRector::class, [ + new FunctionToFirstArgMethodConfiguration('11.3.0', 'comment_uri', 'permalink'), ]); // https://www.drupal.org/node/3038908 diff --git a/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector.php b/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector.php deleted file mode 100644 index 187aeb0fc..000000000 --- a/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector.php +++ /dev/null @@ -1,71 +0,0 @@ -permalink(). - * - * Deprecated in drupal:11.3.0, removed in drupal:12.0.0. - * - * @see https://www.drupal.org/node/2010202 - */ -final class ReplaceCommentUriRector extends AbstractDrupalCoreRector -{ - /** - * @var array|DrupalIntroducedVersionConfiguration[] - */ - protected array $configuration; - - public function configure(array $configuration): void - { - foreach ($configuration as $value) { - if (!$value instanceof DrupalIntroducedVersionConfiguration) { - throw new \InvalidArgumentException(sprintf('Each configuration item must be an instance of "%s"', DrupalIntroducedVersionConfiguration::class)); - } - } - parent::configure($configuration); - } - - public function getNodeTypes(): array - { - return [Node\Expr\FuncCall::class]; - } - - public function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node - { - assert($node instanceof Node\Expr\FuncCall); - - if (!$this->isName($node, 'comment_uri')) { - return null; - } - - if (count($node->args) < 1) { - return null; - } - - return new Node\Expr\MethodCall( - $node->args[0]->value, - new Node\Identifier('permalink') - ); - } - - public function getRuleDefinition(): RuleDefinition - { - return new RuleDefinition('Replace deprecated comment_uri($comment) calls with $comment->permalink() (drupal:11.3.0)', [ - new ConfiguredCodeSample( - '$url = comment_uri($comment);', - '$url = $comment->permalink();', - [new DrupalIntroducedVersionConfiguration('11.3.0')] - ), - ]); - } -} diff --git a/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector.php b/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector.php deleted file mode 100644 index 0d48b34a9..000000000 --- a/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector.php +++ /dev/null @@ -1,71 +0,0 @@ -getDownloadHeaders(). - * - * Deprecated in drupal:11.2.0, removed in drupal:12.0.0. - * - * @see https://www.drupal.org/node/3494126 - */ -final class ReplaceFileGetContentHeadersRector extends AbstractDrupalCoreRector -{ - /** - * @var array|DrupalIntroducedVersionConfiguration[] - */ - protected array $configuration; - - public function configure(array $configuration): void - { - foreach ($configuration as $value) { - if (!$value instanceof DrupalIntroducedVersionConfiguration) { - throw new \InvalidArgumentException(sprintf('Each configuration item must be an instance of "%s"', DrupalIntroducedVersionConfiguration::class)); - } - } - parent::configure($configuration); - } - - public function getNodeTypes(): array - { - return [Node\Expr\FuncCall::class]; - } - - public function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node - { - assert($node instanceof Node\Expr\FuncCall); - - if (!$this->isName($node, 'file_get_content_headers')) { - return null; - } - - if (count($node->args) !== 1) { - return null; - } - - return new Node\Expr\MethodCall( - $node->args[0]->value, - new Node\Identifier('getDownloadHeaders') - ); - } - - public function getRuleDefinition(): RuleDefinition - { - return new RuleDefinition('Replace deprecated file_get_content_headers($file) with $file->getDownloadHeaders() (drupal:11.2.0)', [ - new ConfiguredCodeSample( - '$headers = file_get_content_headers($file);', - '$headers = $file->getDownloadHeaders();', - [new DrupalIntroducedVersionConfiguration('11.2.0')] - ), - ]); - } -} diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/config/configured_rule.php deleted file mode 100644 index 960fbd32c..000000000 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentUriRector/config/configured_rule.php +++ /dev/null @@ -1,14 +0,0 @@ -doTestFile($filePath); - } finally { - AbstractDrupalCoreRector::setVersionOverride(null); - } - } - - /** - * @return \Iterator<> - */ - public static function provideData(): \Iterator - { - return self::yieldFilesFromDirectory(__DIR__.'/fixture'); - } - - #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] - public function testBelowVersion(string $filePath): void - { - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - AbstractDrupalCoreRector::setVersionOverride(null); - } - } - - /** - * @return \Iterator<> - */ - public static function provideDataBelowVersion(): \Iterator - { - return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); - } - - public function provideConfigFilePath(): string - { - return __DIR__.'/config/configured_rule.php'; - } -} diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/config/configured_rule.php deleted file mode 100644 index 30ab9bfa3..000000000 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceFileGetContentHeadersRector/config/configured_rule.php +++ /dev/null @@ -1,14 +0,0 @@ - Date: Fri, 8 May 2026 17:18:06 +0200 Subject: [PATCH 143/256] feat(Drupal11): Add TwigEngineFunctionsRector for issue #1685492 --- .../Deprecation/TwigEngineFunctionsRector.php | 76 +++++++++++++++++++ .../TwigEngineFunctionsRectorTest.php | 29 +++++++ .../config/configured_rule.php | 11 +++ .../fixture/basic.php.inc | 11 +++ 4 files changed, 127 insertions(+) create mode 100644 src/Drupal11/Rector/Deprecation/TwigEngineFunctionsRector.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/TwigEngineFunctionsRector/TwigEngineFunctionsRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/TwigEngineFunctionsRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/TwigEngineFunctionsRector/fixture/basic.php.inc diff --git a/src/Drupal11/Rector/Deprecation/TwigEngineFunctionsRector.php b/src/Drupal11/Rector/Deprecation/TwigEngineFunctionsRector.php new file mode 100644 index 000000000..36d9a6a56 --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/TwigEngineFunctionsRector.php @@ -0,0 +1,76 @@ +renderTemplate($template_file, $variables);' + ), + ] + ); + } + + /** @return array> */ + public function getNodeTypes(): array + { + return [FuncCall::class]; + } + + /** @param FuncCall $node */ + public function refactor(Node $node): ?Node + { + $name = $this->getName($node); + + if ($name === 'twig_extension') { + return new String_('.html.twig'); + } + + if ($name === 'twig_render_template') { + return new MethodCall( + new StaticCall( + new FullyQualified('Drupal'), + 'service', + [new Node\Arg( + new ClassConstFetch( + new FullyQualified('Drupal\Core\Template\TwigThemeEngine'), + 'class' + ) + )] + ), + 'renderTemplate', + $node->args + ); + } + + return null; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/TwigEngineFunctionsRector/TwigEngineFunctionsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/TwigEngineFunctionsRector/TwigEngineFunctionsRectorTest.php new file mode 100644 index 000000000..b55e9779a --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/TwigEngineFunctionsRector/TwigEngineFunctionsRectorTest.php @@ -0,0 +1,29 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/TwigEngineFunctionsRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/TwigEngineFunctionsRector/config/configured_rule.php new file mode 100644 index 000000000..d5d933aef --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/TwigEngineFunctionsRector/config/configured_rule.php @@ -0,0 +1,11 @@ + +----- +renderTemplate($template_file, $variables); +?> From 3cd60a8cf4831848fd25d919acb14ecca1420774 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 8 May 2026 17:18:33 +0200 Subject: [PATCH 144/256] =?UTF-8?q?refactor:=20scan=20deprecation=20direct?= =?UTF-8?q?ories=20dynamically=20for=20Drupal=20versions=20=E2=89=A510?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Updated `generate-rector-index.php` to dynamically scan deprecation directories for Drupal versions ≥10 in descending order. Adjusted `scanImplementedClasses` to handle relative paths for source and test files. Enhanced SKILL.md with new transformation patterns. --- .claude/scripts/generate-rector-index.php | 23 +++++++++++++++++------ .claude/skills/rector-discover/SKILL.md | 9 ++++++--- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/.claude/scripts/generate-rector-index.php b/.claude/scripts/generate-rector-index.php index 28dd8a762..1a53ad3ff 100644 --- a/.claude/scripts/generate-rector-index.php +++ b/.claude/scripts/generate-rector-index.php @@ -52,8 +52,16 @@ function main(array $argv): void // Step 1: Build base entries from in-scope digest files. $entries = scanDigestFiles($rulesDir); - // Step 2: Mark implemented custom classes. - $unmatched = scanImplementedClasses($repoRoot . '/src/Drupal11/Rector/Deprecation', $entries); + // Step 2: Mark implemented custom classes — scan src/DrupalXX/ dirs for version >= 10, newest first. + $srcDirs = array_filter( + glob($repoRoot . '/src/Drupal*/Rector/Deprecation', GLOB_ONLYDIR), + fn($d) => preg_match('#/Drupal(\d+)/#', $d, $m) && (int) $m[1] >= 10 + ); + rsort($srcDirs); + $unmatched = []; + foreach ($srcDirs as $srcDir) { + $unmatched += scanImplementedClasses($srcDir, $repoRoot, $entries); + } // Step 3: Mark config-only Phase 1 entries. scanConfigFiles($repoRoot . '/config/drupal-11', $entries); @@ -202,10 +210,13 @@ function classifyPhaseFromFilename(string $filename): string * @param array> $entries * @return array> */ -function scanImplementedClasses(string $srcDir, array &$entries): array +function scanImplementedClasses(string $srcDir, string $repoRoot, array &$entries): array { $unmatched = []; + $relSrcDir = ltrim(str_replace($repoRoot, '', $srcDir), '/'); + $relTestDir = preg_replace('#^src/(Drupal\d+)#', 'tests/src/$1', $relSrcDir); + foreach (glob($srcDir . '/*.php') as $file) { $content = file_get_contents($file); @@ -218,13 +229,13 @@ function scanImplementedClasses(string $srcDir, array &$entries): array $phase = classifyPhaseFromClass($content); - $relFile = 'src/Drupal11/Rector/Deprecation/' . basename($file); + $relFile = $relSrcDir . '/' . basename($file); $files = [$relFile]; // Add test file path if directory exists. - $testDir = dirname(dirname($srcDir)) . '/tests/src/Drupal11/Rector/Deprecation/' . $className; + $testDir = $repoRoot . '/' . $relTestDir . '/' . $className; if (is_dir($testDir)) { - $files[] = 'tests/src/Drupal11/Rector/Deprecation/' . $className . '/' . $className . 'Test.php'; + $files[] = $relTestDir . '/' . $className . '/' . $className . 'Test.php'; } if ($issueNumber !== null && isset($entries[$issueNumber])) { diff --git a/.claude/skills/rector-discover/SKILL.md b/.claude/skills/rector-discover/SKILL.md index 11535fa0e..8c1c3f9bc 100644 --- a/.claude/skills/rector-discover/SKILL.md +++ b/.claude/skills/rector-discover/SKILL.md @@ -84,9 +84,12 @@ Next suggested: /rector-implement repos/drupal-digests/rector/rules/method()`) | `FunctionToFirstArgMethodRector` | | 1a | Service ID rename (`\Drupal::service('old')` → `\Drupal::service('new')`) | `DrupalServiceRenameRector` | | 1b | FuncCall → static call | `FunctionToStaticRector` | -| 1c | Class constant replacement | `ClassConstantToClassConstantRector` | -| 2 | MethodCall custom class | custom `AbstractRector` or `AbstractDrupalCoreRector` | -| 3 | Node removal | custom class returning `REMOVE_NODE` | +| 1c | Class constant → class constant (`OldClass::OLD` → `NewClass::NEW`) | `ClassConstantToClassConstantRector` | +| 1c | Bare global constant → class constant (`DEPRECATED_CONST` → `\Ns\Class::CONST`) | `ConstantToClassConstantRector` | +| 2 | MethodCall rename with type check (`$obj->old()` → `$obj->new()`) | `MethodToMethodWithCheckRector` | +| 2 | MethodCall custom transformation | custom `AbstractRector` or `AbstractDrupalCoreRector` | +| 3 | Remove a function call statement with no replacement | `FunctionCallRemovalRector` | +| 3 | Node removal (other patterns) | custom class returning `REMOVE_NODE` | | 4 | Complex / multi-node | custom class | ## Refreshing manually From aa3636902f056a6d3a5510a7606790ebee5ad7fb Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 8 May 2026 17:27:34 +0200 Subject: [PATCH 145/256] refactor: remove TwigEngineFunctionsRector (splitting into two) --- .../Deprecation/TwigEngineFunctionsRector.php | 76 ------------------- .../TwigEngineFunctionsRectorTest.php | 29 ------- .../config/configured_rule.php | 11 --- .../fixture/basic.php.inc | 11 --- 4 files changed, 127 deletions(-) delete mode 100644 src/Drupal11/Rector/Deprecation/TwigEngineFunctionsRector.php delete mode 100644 tests/src/Drupal11/Rector/Deprecation/TwigEngineFunctionsRector/TwigEngineFunctionsRectorTest.php delete mode 100644 tests/src/Drupal11/Rector/Deprecation/TwigEngineFunctionsRector/config/configured_rule.php delete mode 100644 tests/src/Drupal11/Rector/Deprecation/TwigEngineFunctionsRector/fixture/basic.php.inc diff --git a/src/Drupal11/Rector/Deprecation/TwigEngineFunctionsRector.php b/src/Drupal11/Rector/Deprecation/TwigEngineFunctionsRector.php deleted file mode 100644 index 36d9a6a56..000000000 --- a/src/Drupal11/Rector/Deprecation/TwigEngineFunctionsRector.php +++ /dev/null @@ -1,76 +0,0 @@ -renderTemplate($template_file, $variables);' - ), - ] - ); - } - - /** @return array> */ - public function getNodeTypes(): array - { - return [FuncCall::class]; - } - - /** @param FuncCall $node */ - public function refactor(Node $node): ?Node - { - $name = $this->getName($node); - - if ($name === 'twig_extension') { - return new String_('.html.twig'); - } - - if ($name === 'twig_render_template') { - return new MethodCall( - new StaticCall( - new FullyQualified('Drupal'), - 'service', - [new Node\Arg( - new ClassConstFetch( - new FullyQualified('Drupal\Core\Template\TwigThemeEngine'), - 'class' - ) - )] - ), - 'renderTemplate', - $node->args - ); - } - - return null; - } -} diff --git a/tests/src/Drupal11/Rector/Deprecation/TwigEngineFunctionsRector/TwigEngineFunctionsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/TwigEngineFunctionsRector/TwigEngineFunctionsRectorTest.php deleted file mode 100644 index b55e9779a..000000000 --- a/tests/src/Drupal11/Rector/Deprecation/TwigEngineFunctionsRector/TwigEngineFunctionsRectorTest.php +++ /dev/null @@ -1,29 +0,0 @@ -doTestFile($filePath); - } - - /** - * @return \Iterator - */ - public static function provideData(): \Iterator - { - return self::yieldFilesFromDirectory(__DIR__.'/fixture'); - } - - public function provideConfigFilePath(): string - { - return __DIR__.'/config/configured_rule.php'; - } -} diff --git a/tests/src/Drupal11/Rector/Deprecation/TwigEngineFunctionsRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/TwigEngineFunctionsRector/config/configured_rule.php deleted file mode 100644 index d5d933aef..000000000 --- a/tests/src/Drupal11/Rector/Deprecation/TwigEngineFunctionsRector/config/configured_rule.php +++ /dev/null @@ -1,11 +0,0 @@ - ------ -renderTemplate($template_file, $variables); -?> From 7d5157f90252679f680f3726d8f6ce4412316b6f Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 8 May 2026 17:28:41 +0200 Subject: [PATCH 146/256] feat(Drupal11): Add ReplaceTwigExtensionRector and twig_render_template config entry for issue #1685492 --- .../skills/prompts/digest-to-rector-prompt.md | 19 +++++++ config/drupal-11/drupal-11.3-deprecations.php | 15 +++++- .../ReplaceTwigExtensionRector.php | 49 +++++++++++++++++++ .../ReplaceTwigExtensionRectorTest.php | 29 +++++++++++ .../config/configured_rule.php | 11 +++++ .../fixture/basic.php.inc | 9 ++++ .../config/configured_rule.php | 2 + .../fixture/twig_render_template.php.inc | 9 ++++ 8 files changed, 141 insertions(+), 2 deletions(-) create mode 100644 src/Drupal11/Rector/Deprecation/ReplaceTwigExtensionRector.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceTwigExtensionRector/ReplaceTwigExtensionRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceTwigExtensionRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceTwigExtensionRector/fixture/basic.php.inc create mode 100644 tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/twig_render_template.php.inc diff --git a/.claude/skills/prompts/digest-to-rector-prompt.md b/.claude/skills/prompts/digest-to-rector-prompt.md index 81604ded0..4acf40b1b 100644 --- a/.claude/skills/prompts/digest-to-rector-prompt.md +++ b/.claude/skills/prompts/digest-to-rector-prompt.md @@ -51,6 +51,25 @@ Extract from the file: --- +## Step 1b — Split check + +If `refactor()` (or the rule's code samples) handles **more than one** deprecated name (function, method, or constant), pause before proceeding and ask: + +> For each deprecated name, could it be independently applied without the others? + +**Split them if:** +- Each has a different replacement pattern (e.g., one → string literal, another → service call) +- Each could be useful without the others +- Any individual one fits a generic rector from Step 4b — that one becomes a config entry, not a class method + +**Keep them together if:** +- They are semantically inseparable (always migrated as a unit, e.g., an old getter/setter pair) +- They share exactly the same replacement pattern (e.g., 10 procedural functions all mapping to service methods on the same class) + +**If splitting:** implement each piece separately — custom rector for patterns that need custom code, config entry for patterns that fit a generic rector — and use distinct, descriptive class names (e.g., `ReplaceTwigExtensionRector` not `TwigEngineFunctionsRector`). + +--- + ## Step 2 — Read the companion issue markdown The issue markdown is at: diff --git a/config/drupal-11/drupal-11.3-deprecations.php b/config/drupal-11/drupal-11.3-deprecations.php index 090cb7843..9dc6170c0 100644 --- a/config/drupal-11/drupal-11.3-deprecations.php +++ b/config/drupal-11/drupal-11.3-deprecations.php @@ -8,21 +8,22 @@ use DrupalRector\Drupal11\Rector\Deprecation\NodeStorageDeprecatedMethodsRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveRootFromConvertDbUrlRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceCommentManagerGetCountNewCommentsRector; -use DrupalRector\Rector\Deprecation\FunctionToFirstArgMethodRector; -use DrupalRector\Rector\ValueObject\FunctionToFirstArgMethodConfiguration; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceNodeAccessViewAllNodesRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceNodeAddBodyFieldRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceNodeModuleProceduralFunctionsRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceNodeSetPreviewModeRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceThemeGetSettingRector; +use DrupalRector\Drupal11\Rector\Deprecation\ReplaceTwigExtensionRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceUserSessionNamePropertyRector; use DrupalRector\Rector\Deprecation\ConstantToClassConstantRector; use DrupalRector\Rector\Deprecation\FunctionCallRemovalRector; +use DrupalRector\Rector\Deprecation\FunctionToFirstArgMethodRector; use DrupalRector\Rector\Deprecation\FunctionToServiceRector; use DrupalRector\Rector\Deprecation\FunctionToStaticRector; use DrupalRector\Rector\ValueObject\ConstantToClassConfiguration; use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use DrupalRector\Rector\ValueObject\FunctionCallRemovalConfiguration; +use DrupalRector\Rector\ValueObject\FunctionToFirstArgMethodConfiguration; use DrupalRector\Rector\ValueObject\FunctionToServiceConfiguration; use DrupalRector\Rector\ValueObject\FunctionToStaticConfiguration; use Rector\Config\RectorConfig; @@ -50,10 +51,20 @@ // node_mass_update() deprecated in drupal:11.3.0, removed in drupal:13.0.0. // Replaced by \Drupal\node\NodeBulkUpdate::process(). // node_type_get_names() and node_get_type_label() deprecated in drupal:11.3.0, removed in drupal:13.0.0. + // https://www.drupal.org/node/1685492 + // twig_render_template() deprecated in drupal:11.3.0, removed in drupal:12.0.0. + // Replaced by \Drupal::service(TwigThemeEngine::class)->renderTemplate(). + // twig_extension() is handled by ReplaceTwigExtensionRector below. $rectorConfig->ruleWithConfiguration(FunctionToServiceRector::class, [ new FunctionToServiceConfiguration('11.3.0', 'node_mass_update', 'Drupal\node\NodeBulkUpdate', 'process'), new FunctionToServiceConfiguration('11.3.0', 'template_preprocess_layout', 'Drupal\layout_discovery\Hook\LayoutDiscoveryThemeHooks', 'preprocessLayout'), + new FunctionToServiceConfiguration('11.3.0', 'twig_render_template', 'Drupal\Core\Template\TwigThemeEngine', 'renderTemplate'), ]); + + // https://www.drupal.org/node/1685492 + // twig_extension() deprecated in drupal:11.3.0, removed in drupal:12.0.0. + // Replaced by the '.html.twig' string literal. + $rectorConfig->rule(ReplaceTwigExtensionRector::class); $rectorConfig->ruleWithConfiguration(ReplaceNodeModuleProceduralFunctionsRector::class, [ new DrupalIntroducedVersionConfiguration('11.3.0'), ]); diff --git a/src/Drupal11/Rector/Deprecation/ReplaceTwigExtensionRector.php b/src/Drupal11/Rector/Deprecation/ReplaceTwigExtensionRector.php new file mode 100644 index 000000000..4f5d41b9a --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/ReplaceTwigExtensionRector.php @@ -0,0 +1,49 @@ +> */ + public function getNodeTypes(): array + { + return [FuncCall::class]; + } + + /** @param FuncCall $node */ + public function refactor(Node $node): ?Node + { + if ($this->getName($node) === 'twig_extension') { + return new String_('.html.twig'); + } + + return null; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceTwigExtensionRector/ReplaceTwigExtensionRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceTwigExtensionRector/ReplaceTwigExtensionRectorTest.php new file mode 100644 index 000000000..a5ed8044c --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceTwigExtensionRector/ReplaceTwigExtensionRectorTest.php @@ -0,0 +1,29 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceTwigExtensionRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceTwigExtensionRector/config/configured_rule.php new file mode 100644 index 000000000..14cef6096 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceTwigExtensionRector/config/configured_rule.php @@ -0,0 +1,11 @@ + +----- + diff --git a/tests/src/Rector/Deprecation/FunctionToServiceRector/config/configured_rule.php b/tests/src/Rector/Deprecation/FunctionToServiceRector/config/configured_rule.php index ed0460028..ea7cc6f9e 100644 --- a/tests/src/Rector/Deprecation/FunctionToServiceRector/config/configured_rule.php +++ b/tests/src/Rector/Deprecation/FunctionToServiceRector/config/configured_rule.php @@ -25,6 +25,8 @@ new FunctionToServiceConfiguration('11.2.0', 'template_preprocess_page', 'Drupal\Core\Theme\ThemePreprocess', 'preprocessPage'), // https://www.drupal.org/node/3571623 (Drupal 11.3) new FunctionToServiceConfiguration('11.3.0', 'node_mass_update', 'Drupal\node\NodeBulkUpdate', 'process'), + // https://www.drupal.org/node/1685492 (Drupal 11.3) + new FunctionToServiceConfiguration('11.3.0', 'twig_render_template', 'Drupal\Core\Template\TwigThemeEngine', 'renderTemplate'), // https://www.drupal.org/node/3574727 (Drupal 11.4) new FunctionToServiceConfiguration('11.4.0', 'language_process_language_select', 'Drupal\language\Hook\LanguageHooks', 'processLanguageSelect'), // https://www.drupal.org/node/3566792 (Drupal 11.4) diff --git a/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/twig_render_template.php.inc b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/twig_render_template.php.inc new file mode 100644 index 000000000..b5e5d8e7f --- /dev/null +++ b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/twig_render_template.php.inc @@ -0,0 +1,9 @@ + +----- + \Drupal::service('Drupal\Core\Template\TwigThemeEngine')->renderTemplate($template_file, $variables), fn() => twig_render_template($template_file, $variables)); +?> From 64da3f9dc6386c6185fb3322f7e78ba1a57b486b Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 8 May 2026 17:32:55 +0200 Subject: [PATCH 147/256] build: codestyle --- config/drupal-11/drupal-11.2-deprecations.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/drupal-11/drupal-11.2-deprecations.php b/config/drupal-11/drupal-11.2-deprecations.php index 732f2d557..a68953321 100644 --- a/config/drupal-11/drupal-11.2-deprecations.php +++ b/config/drupal-11/drupal-11.2-deprecations.php @@ -11,14 +11,13 @@ use DrupalRector\Drupal11\Rector\Deprecation\ReplaceEditorLoadRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceEntityOriginalPropertyRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceFieldgroupToFieldsetRector; -use DrupalRector\Rector\Deprecation\FunctionToFirstArgMethodRector; -use DrupalRector\Rector\ValueObject\FunctionToFirstArgMethodConfiguration; use DrupalRector\Drupal11\Rector\Deprecation\ReplacePdoFetchConstantsRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceSessionWritesWithRequestSessionRector; use DrupalRector\Drupal11\Rector\Deprecation\StatementPrefetchIteratorFetchColumnRector; use DrupalRector\Rector\Deprecation\ClassConstantToClassConstantRector; use DrupalRector\Rector\Deprecation\ConstantToClassConstantRector; use DrupalRector\Rector\Deprecation\FunctionCallRemovalRector; +use DrupalRector\Rector\Deprecation\FunctionToFirstArgMethodRector; use DrupalRector\Rector\Deprecation\FunctionToServiceRector; use DrupalRector\Rector\Deprecation\FunctionToStaticRector; use DrupalRector\Rector\Deprecation\MethodToMethodWithCheckRector; @@ -26,6 +25,7 @@ use DrupalRector\Rector\ValueObject\ConstantToClassConfiguration; use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use DrupalRector\Rector\ValueObject\FunctionCallRemovalConfiguration; +use DrupalRector\Rector\ValueObject\FunctionToFirstArgMethodConfiguration; use DrupalRector\Rector\ValueObject\FunctionToServiceConfiguration; use DrupalRector\Rector\ValueObject\FunctionToStaticConfiguration; use DrupalRector\Rector\ValueObject\MethodToMethodWithCheckConfiguration; From 26c4b71fd6485ea668c776e932d9234cf9ed0f03 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 8 May 2026 18:50:04 +0200 Subject: [PATCH 148/256] feat(Drupal11): Add template_preprocess_layout config for issue #3571382 --- config/drupal-11/drupal-11.3-deprecations.php | 3 +++ .../config/configured_rule.php | 4 ++++ .../fixture/template_preprocess_layout.php.inc | 13 +++++++++++++ 3 files changed, 20 insertions(+) create mode 100644 tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/template_preprocess_layout.php.inc diff --git a/config/drupal-11/drupal-11.3-deprecations.php b/config/drupal-11/drupal-11.3-deprecations.php index 9dc6170c0..38f2bc08d 100644 --- a/config/drupal-11/drupal-11.3-deprecations.php +++ b/config/drupal-11/drupal-11.3-deprecations.php @@ -57,6 +57,9 @@ // twig_extension() is handled by ReplaceTwigExtensionRector below. $rectorConfig->ruleWithConfiguration(FunctionToServiceRector::class, [ new FunctionToServiceConfiguration('11.3.0', 'node_mass_update', 'Drupal\node\NodeBulkUpdate', 'process'), + // https://www.drupal.org/node/3571382 + // template_preprocess_layout() deprecated in drupal:11.3.0, removed in drupal:12.0.0. + // Replaced by \Drupal\layout_discovery\Hook\LayoutDiscoveryThemeHooks::preprocessLayout(). new FunctionToServiceConfiguration('11.3.0', 'template_preprocess_layout', 'Drupal\layout_discovery\Hook\LayoutDiscoveryThemeHooks', 'preprocessLayout'), new FunctionToServiceConfiguration('11.3.0', 'twig_render_template', 'Drupal\Core\Template\TwigThemeEngine', 'renderTemplate'), ]); diff --git a/tests/src/Rector/Deprecation/FunctionToServiceRector/config/configured_rule.php b/tests/src/Rector/Deprecation/FunctionToServiceRector/config/configured_rule.php index ea7cc6f9e..38b0ed724 100644 --- a/tests/src/Rector/Deprecation/FunctionToServiceRector/config/configured_rule.php +++ b/tests/src/Rector/Deprecation/FunctionToServiceRector/config/configured_rule.php @@ -25,6 +25,8 @@ new FunctionToServiceConfiguration('11.2.0', 'template_preprocess_page', 'Drupal\Core\Theme\ThemePreprocess', 'preprocessPage'), // https://www.drupal.org/node/3571623 (Drupal 11.3) new FunctionToServiceConfiguration('11.3.0', 'node_mass_update', 'Drupal\node\NodeBulkUpdate', 'process'), + // https://www.drupal.org/node/3571382 (Drupal 11.3) + new FunctionToServiceConfiguration('11.3.0', 'template_preprocess_layout', 'Drupal\layout_discovery\Hook\LayoutDiscoveryThemeHooks', 'preprocessLayout'), // https://www.drupal.org/node/1685492 (Drupal 11.3) new FunctionToServiceConfiguration('11.3.0', 'twig_render_template', 'Drupal\Core\Template\TwigThemeEngine', 'renderTemplate'), // https://www.drupal.org/node/3574727 (Drupal 11.4) @@ -67,5 +69,7 @@ new FunctionToServiceConfiguration('11.4.0', 'text_summary', 'Drupal\text\TextSummary', 'generate'), // https://www.drupal.org/node/3582106 (Drupal 11.4) new FunctionToServiceConfiguration('11.4.0', 'user_form_process_password_confirm', 'Drupal\user\Hook\UserThemeHooks', 'processPasswordConfirm'), + // https://www.drupal.org/node/2473041 (Drupal 11.4) + new FunctionToServiceConfiguration('11.4.0', 'node_access_grants', 'Drupal\node\NodeGrantsHelper', 'nodeAccessGrants'), ]); }; diff --git a/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/template_preprocess_layout.php.inc b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/template_preprocess_layout.php.inc new file mode 100644 index 000000000..ad97a5450 --- /dev/null +++ b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/template_preprocess_layout.php.inc @@ -0,0 +1,13 @@ + +----- + \Drupal::service('Drupal\layout_discovery\Hook\LayoutDiscoveryThemeHooks')->preprocessLayout($variables), fn() => template_preprocess_layout($variables)); +} +?> From af2c581af84df787ee82b2c46577adff32e93b3c Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 8 May 2026 18:51:54 +0200 Subject: [PATCH 149/256] feat(Drupal11): Add node_access_grants config for issue #2473041 --- .claude/skills/prompts/recipes/RECIPES.md | 85 +++++ .../prompts/recipes/config-only-template.md | 184 +++++++++++ .../recipes/func-to-class-service-bc-multi.md | 181 +++++++++++ .../recipes/func-to-class-service-bc.md | 291 ++++++++++++++++++ .../FilterFormatFunctionsToServiceRector.php | 122 ++++++++ ...ediaFilterFormatEditFormValidateRector.php | 87 ++++++ .../NodeAccessRebuildFunctionsRector.php | 101 ++++++ ...lterFormatFunctionsToServiceRectorTest.php | 50 +++ .../config/configured_rule.php | 14 + .../fixture-below-version/basic.php.inc | 21 ++ .../fixture/basic.php.inc | 21 ++ ...FilterFormatEditFormValidateRectorTest.php | 27 ++ .../config/configured_rule.php | 11 + .../fixture/basic.php.inc | 11 + .../NodeAccessRebuildFunctionsRectorTest.php | 50 +++ .../config/configured_rule.php | 14 + .../fixture-below-version/basic.php.inc | 17 + .../fixture/basic.php.inc | 17 + .../fixture/node_access_grants.php.inc | 9 + 19 files changed, 1313 insertions(+) create mode 100644 .claude/skills/prompts/recipes/RECIPES.md create mode 100644 .claude/skills/prompts/recipes/config-only-template.md create mode 100644 .claude/skills/prompts/recipes/func-to-class-service-bc-multi.md create mode 100644 .claude/skills/prompts/recipes/func-to-class-service-bc.md create mode 100644 src/Drupal11/Rector/Deprecation/FilterFormatFunctionsToServiceRector.php create mode 100644 src/Drupal11/Rector/Deprecation/MediaFilterFormatEditFormValidateRector.php create mode 100644 src/Drupal11/Rector/Deprecation/NodeAccessRebuildFunctionsRector.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/FilterFormatFunctionsToServiceRector/FilterFormatFunctionsToServiceRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/FilterFormatFunctionsToServiceRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/FilterFormatFunctionsToServiceRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/FilterFormatFunctionsToServiceRector/fixture/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/MediaFilterFormatEditFormValidateRector/MediaFilterFormatEditFormValidateRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/MediaFilterFormatEditFormValidateRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/MediaFilterFormatEditFormValidateRector/fixture/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/NodeAccessRebuildFunctionsRector/NodeAccessRebuildFunctionsRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/NodeAccessRebuildFunctionsRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/NodeAccessRebuildFunctionsRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/NodeAccessRebuildFunctionsRector/fixture/basic.php.inc create mode 100644 tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/node_access_grants.php.inc diff --git a/.claude/skills/prompts/recipes/RECIPES.md b/.claude/skills/prompts/recipes/RECIPES.md new file mode 100644 index 000000000..4058e95fc --- /dev/null +++ b/.claude/skills/prompts/recipes/RECIPES.md @@ -0,0 +1,85 @@ +# Recipe Index + +Recipes are fill-in-the-blank templates that replace the 14-step exploration workflow +in `digest-to-rector-prompt.md` for well-understood patterns. + +**How to use:** Identify which recipe matches the digest rule, extract the required values, +and follow only that recipe. Skip `digest-to-rector-prompt.md` entirely. + +--- + +## Routing guide + +Read the digest. Answer these questions in order: + +1. **What node type is transformed?** + - `FuncCall` → continue + - `MethodCall` / `NullsafeMethodCall` → go to **method-rename** or **custom** + - `ClassConstFetch` → go to **class-const-rename** or **global-const-to-class-const** + - `String_` → **custom** (no recipe yet) + - Multiple node types in one class → **custom** (`digest-to-rector-prompt.md`) + +2. **What does the replacement look like?** + - `fn()` is removed entirely, no replacement → **func-removal** (config-only) + - `SomeClass::staticMethod()` → **func-to-static** (config-only) + - `\Drupal::service('string.id')->method()` → **func-to-string-service** (config-only) + - `\Drupal::service(FqcnClass::class)->method()`, one function → **func-to-class-service-bc** ✓ + - `\Drupal::service(FqcnClass::class)->method()`, multiple functions → **func-to-class-service-bc-multi** ✓ + - `$firstArg->method()` (method on first argument) → **func-to-first-arg-method** (config-only) + - `\Drupal::service('old.id')` → `\Drupal::service('new.id')` → **service-rename** (config-only) + - Something else → **custom** (`digest-to-rector-prompt.md`) + +3. **For MethodCall:** which generic rector applies? + - Rename with receiver type check → **method-rename** (config-only) + - Complex transformation → **custom** + +4. **For ClassConstFetch:** + - `OldClass::CONST` → `NewClass::CONST` → **class-const-rename** (config-only) + - `GLOBAL_CONST` → `SomeClass::CONST` → **global-const-to-class-const** (config-only) + +--- + +## Recipe status + +| Recipe file | Pattern | Type | Status | +|---|---|---|---| +| `func-to-class-service-bc.md` | FuncCall → `Fqcn::class` service, single | custom class | ✅ done | +| `func-to-class-service-bc-multi.md` | FuncCall → `Fqcn::class` service, multiple | custom class | ✅ done | +| `func-removal.md` | FuncCall removed entirely | config-only | 🔲 todo | +| `func-to-static.md` | FuncCall → static method | config-only | 🔲 todo | +| `func-to-string-service.md` | FuncCall → `'service.id'` method | config-only | 🔲 todo | +| `func-to-first-arg-method.md` | FuncCall → method on first arg | config-only | 🔲 todo | +| `service-rename.md` | `\Drupal::service('old')` → `'new'` | config-only | 🔲 todo | +| `method-rename.md` | MethodCall rename with type check | config-only | 🔲 todo | +| `class-const-rename.md` | `OldClass::CONST` → `NewClass::CONST` | config-only | 🔲 todo | +| `global-const-to-class-const.md` | `GLOBAL_CONST` → `Class::CONST` | config-only | 🔲 todo | + +--- + +## Notes on config-only recipes + +Config-only recipes do **not** create a new PHP class. They: + +1. Add one entry to an existing config file (e.g. `config/drupal-11/drupal-11.4-deprecations.php`) +2. Add one fixture file to the existing generic rector's test directory +3. Add the entry to that rector's test config +4. Run the existing test suite for that rector + +The config file to edit depends on `introducedVersion` — same lookup table as the +custom-class recipes. If the file does not yet import the generic rector class, add the +`use` statement. + +--- + +## What belongs in a recipe vs. the main prompt + +Use a recipe when **all** of these are true: +- The transformation pattern is fully determined (no ambiguity) +- The base class and BC-wrapping decision are obvious from the pattern +- The output is identical boilerplate except for 5–8 substitution values + +Use `digest-to-rector-prompt.md` when: +- The digest rule uses multiple node types that need different BC treatment +- The replacement logic is conditional (e.g., depends on surrounding AST context) +- The rule removes or restructures nodes rather than substituting them +- You are unsure which recipe applies diff --git a/.claude/skills/prompts/recipes/config-only-template.md b/.claude/skills/prompts/recipes/config-only-template.md new file mode 100644 index 000000000..440c992fe --- /dev/null +++ b/.claude/skills/prompts/recipes/config-only-template.md @@ -0,0 +1,184 @@ +# Config-only recipe template + +All config-only recipes share the same 5-step structure. Each recipe file specialises +the exact config syntax and fixture shape for one generic rector. + +--- + +## The 5 steps (same for every config-only recipe) + +### Step 1 — Identify the config file + +| introducedVersion | File | +|---|---| +| 11.4.x | `config/drupal-11/drupal-11.4-deprecations.php` | +| 11.3.x | `config/drupal-11/drupal-11.3-deprecations.php` | +| 11.2.x | `config/drupal-11/drupal-11.2-deprecations.php` | +| 11.1.x | `config/drupal-11/drupal-11.1-deprecations.php` | +| 11.0.x | `config/drupal-11/drupal-11.0-deprecations.php` | + +### Step 2 — Add the config entry + +See the specific recipe for the exact entry syntax. +Add the `use` statement for the configuration value object if it is not yet imported. + +### Step 3 — Add a fixture to the generic rector's test directory + +Path: `tests/src/Rector/Deprecation/{{GenericRectorName}}/fixture/{{descriptive-name}}.php.inc` + +Format (no BC wrapper — generic rectors do not produce one): +``` + +----- + +``` + +### Step 4 — Register the fixture in the generic rector's test config + +File: `tests/src/Rector/Deprecation/{{GenericRectorName}}/config/configured_rule.php` + +Add the configuration entry that was added to the deprecations config in Step 2. + +### Step 5 — Run quality checks and commit + +```bash +ddev composer fix-style +ddev composer phpstan +vendor/bin/phpunit tests/src/Rector/Deprecation/{{GenericRectorName}}/ +git add config/drupal-11/drupal-11.{{X}}-deprecations.php \ + tests/src/Rector/Deprecation/{{GenericRectorName}}/ +git commit -m "feat(Drupal11): Add {{GenericRectorName}} config for issue #{{issueNumber}}" +``` + +--- + +## Config entry syntax by generic rector + +### FunctionCallRemovalRector + +Values: `{{functionName}}` + +```php +new FunctionCallRemovalConfiguration('{{functionName}}'), +``` + +No replacement — the entire call statement is deleted. +Fixture "after" is the code with the statement removed entirely. + +--- + +### FunctionToStaticRector + +Values: `{{introducedVersion}}`, `{{functionName}}`, `{{ClassName}}`, `{{methodName}}` + +```php +new FunctionToStaticConfiguration('{{introducedVersion}}', '{{functionName}}', '{{ClassName}}', '{{methodName}}'), +``` + +Optional 5th argument: arg reorder map, e.g. `[0 => 1, 1 => 0]` to swap the first two args. +Fixture "after": `{{ClassName}}::{{methodName}}(args)` +BC-wrapped (introduced >= 10.1.0). + +--- + +### FunctionToServiceRector + +Values: `{{introducedVersion}}`, `{{functionName}}`, `'{{serviceId}}'`, `{{methodName}}` + +```php +new FunctionToServiceConfiguration('{{introducedVersion}}', '{{functionName}}', '{{serviceId}}', '{{methodName}}'), +``` + +`serviceId` is a dotted string like `'filter.format_repository'`, NOT a class name. +Use `func-to-class-service-bc.md` instead when the service is identified by `Fqcn::class`. +Fixture "after": `\Drupal::service('{{serviceId}}')->{{methodName}}(args)` +BC-wrapped (introduced >= 10.1.0). + +--- + +### FunctionToFirstArgMethodRector + +Values: `{{introducedVersion}}`, `{{functionName}}`, `{{methodName}}` + +```php +new FunctionToFirstArgMethodConfiguration('{{introducedVersion}}', '{{functionName}}', '{{methodName}}'), +``` + +`{{functionName}}($obj, ...)` → `$obj->{{methodName}}(...remaining args)` +Fixture "after": `$firstArg->{{methodName}}(...)` +BC-wrapped (introduced >= 10.1.0). + +--- + +### DrupalServiceRenameRector + +Values: `{{introducedVersion}}`, `'{{oldServiceId}}'`, `'{{newServiceId}}'` + +```php +new DrupalServiceRenameConfiguration('{{introducedVersion}}', '{{oldServiceId}}', '{{newServiceId}}'), +``` + +Fixture "after": `\Drupal::service('{{newServiceId}}')` +BC-wrapped (introduced >= 10.1.0). + +--- + +### MethodToMethodWithCheckRector + +Values: `{{ReceiverClass}}`, `{{oldMethod}}`, `{{newMethod}}` + +```php +new MethodToMethodWithCheckConfiguration('{{ReceiverClass}}', '{{oldMethod}}', '{{newMethod}}'), +``` + +No `introducedVersion` — applies unconditionally, no BC wrapping. +`{{ReceiverClass}}` is the FQCN of the interface/class the receiver must be typed as. +Fixture "after": `$receiver->{{newMethod}}(args)` + +--- + +### ClassConstantToClassConstantRector + +Values: `{{OldClass}}`, `{{OLD_CONST}}`, `{{NewClass}}`, `{{NEW_CONST}}` + +```php +new ClassConstantToClassConstantConfiguration('{{OldClass}}', '{{OLD_CONST}}', '{{NewClass}}', '{{NEW_CONST}}'), +``` + +No BC wrapping. +Fixture "after": `{{NewClass}}::{{NEW_CONST}}` + +--- + +### ConstantToClassConstantRector + +Values: `{{GLOBAL_CONST}}`, `{{TargetClass}}`, `{{CONST_NAME}}` + +```php +new ConstantToClassConfiguration('{{GLOBAL_CONST}}', '{{TargetClass}}', '{{CONST_NAME}}'), +``` + +No BC wrapping. +Fixture "after": `\{{TargetClass}}::{{CONST_NAME}}` + +--- + +### RenameClassRector (Rector core) + +Values: `{{OldFqcn}}`, `{{NewFqcn}}` + +```php +$rectorConfig->ruleWithConfiguration(RenameClassRector::class, [ + '{{OldFqcn}}' => '{{NewFqcn}}', +]); +``` + +Add `use Rector\Renaming\Rector\Name\RenameClassRector;` at the top of the config file. +No BC wrapping. +Fixture "after": all references to `{{OldFqcn}}` replaced with `{{NewFqcn}}`. diff --git a/.claude/skills/prompts/recipes/func-to-class-service-bc-multi.md b/.claude/skills/prompts/recipes/func-to-class-service-bc-multi.md new file mode 100644 index 000000000..f052de3ba --- /dev/null +++ b/.claude/skills/prompts/recipes/func-to-class-service-bc-multi.md @@ -0,0 +1,181 @@ +# Recipe: Multiple FuncCalls → `::class` service methods (BC-wrapped) + +**Use when:** several deprecated global functions all map to methods on the same +`\Drupal::service(SomeClass::class)` and were introduced in Drupal >= 10.1.0. + +**Output:** one new custom rector class + test suite (4–5 files). + +This is the multi-function variant of `func-to-class-service-bc.md`. Use that recipe instead +when there is only one function to replace. + +--- + +## Step 1 — Extract these values from the digest + +**Per-class values:** + +| Placeholder | Where to find it | +|---|---| +| `{{ClassName}}` | PHP class name in the digest file | +| `{{serviceClass}}` | Shared service FQCN, e.g. `Drupal\node\NodeAccessRebuild` | +| `{{introducedVersion}}` | From issue markdown `## Impact`, e.g. `11.4.0` | +| `{{removedVersion}}` | From issue markdown `## Impact`, e.g. `13.0.0` | +| `{{issueNumber}}` | From filename or `@see` comment | + +**Per-function values** (repeat for each deprecated function): + +| Placeholder | Example | +|---|---| +| `{{funcN}}` | `node_access_rebuild` | +| `{{methodN}}` | `rebuild` | +| Arg handling | "forward all args" OR "check count first" (see variants below) | + +--- + +## Step 2 — Determine the target config file + +Same lookup as `func-to-class-service-bc.md` Step 2. + +--- + +## Step 3 — Write the rector class + +Path: `src/Drupal11/Rector/Deprecation/{{ClassName}}.php` + +```php +> */ + public function getNodeTypes(): array + { + return [FuncCall::class]; + } + + protected function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node + { + assert($node instanceof FuncCall); + + if (!$node->name instanceof Name) { + return null; + } + + return match ($node->name->toString()) { + '{{func1}}' => $this->buildServiceCall('{{method1}}', $node->args), + '{{func2}}' => $this->buildServiceCall('{{method2}}', $node->args), + // add more cases here + default => null, + }; + } + + /** @param \PhpParser\Node\Arg[] $args */ + private function buildServiceCall(string $method, array $args): MethodCall + { + $serviceCall = new StaticCall( + new FullyQualified('Drupal'), + 'service', + [new Arg(new ClassConstFetch(new FullyQualified('{{serviceClass}}'), 'class'))] + ); + + return new MethodCall($serviceCall, $method, $args); + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition( + 'Replace deprecated {{func1}}() and related functions with the {{serviceClass}} service.', + [ + new ConfiguredCodeSample( + '{{before1}}', + '{{after1}}', + [new DrupalIntroducedVersionConfiguration('{{introducedVersion}}')] + ), + // add more ConfiguredCodeSample entries for each function + ] + ); + } +} +``` + +### Variant: arg-count dispatch (getter/setter pattern) + +When one function behaves differently based on whether args are passed (e.g. +`needs_rebuild()` = getter, `needs_rebuild($value)` = setter), replace the match +arm with an if/else: + +```php +'{{funcN}}' => count($node->args) === 0 + ? $this->buildServiceCall('{{getterMethod}}', []) + : $this->buildServiceCall('{{setterMethod}}', $node->args), +``` + +--- + +## Steps 4–9 — Test class, test config, fixtures, registration, quality checks, commit + +Follow Steps 4–9 from `func-to-class-service-bc.md` exactly, substituting the +multi-function fixture below for Step 6. + +### Fixture — include one representative call per function + +`tests/src/Drupal11/Rector/Deprecation/{{ClassName}}/fixture/basic.php.inc` + +``` + +----- + {{after1_no_semi}}, fn() => {{before1_no_semi}}); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '{{introducedVersion}}', fn() => {{after2_no_semi}}, fn() => {{before2_no_semi}}); + +?> +``` + +The below-version fixture is identical before and after for all functions (no change). diff --git a/.claude/skills/prompts/recipes/func-to-class-service-bc.md b/.claude/skills/prompts/recipes/func-to-class-service-bc.md new file mode 100644 index 000000000..59fee6db5 --- /dev/null +++ b/.claude/skills/prompts/recipes/func-to-class-service-bc.md @@ -0,0 +1,291 @@ +# Recipe: FuncCall → `::class` service method (BC-wrapped) + +**Use when:** a single deprecated global function is replaced by +`\Drupal::service(SomeClass::class)->method()` and was introduced in Drupal >= 10.1.0. + +**Output:** one new custom rector class + test suite (4–5 files). + +--- + +## Step 1 — Extract these values from the digest + +| Placeholder | Where to find it | +|---|---| +| `{{ClassName}}` | PHP class name in the digest file | +| `{{functionName}}` | The deprecated function name, e.g. `node_access_grants` | +| `{{serviceClass}}` | Fully-qualified service class, e.g. `Drupal\node\NodeGrantsHelper` | +| `{{methodName}}` | Method to call on the service, e.g. `nodeAccessGrants` | +| `{{introducedVersion}}` | From issue markdown `## Impact` section, e.g. `11.4.0` | +| `{{removedVersion}}` | From issue markdown `## Impact` section, e.g. `13.0.0` | +| `{{issueNumber}}` | From filename or `@see` comment, e.g. `2473041` | +| `{{beforeCode}}` | CodeSample "before" snippet, e.g. `node_access_grants($operation, $account);` | +| `{{afterCode}}` | CodeSample "after" snippet (clean, no BC wrapper), e.g. `\Drupal::service(\Drupal\node\NodeGrantsHelper::class)->nodeAccessGrants($operation, $account);` | + +--- + +## Step 2 — Determine the target config file + +| introducedVersion | Config file | +|---|---| +| 11.4.x | `config/drupal-11/drupal-11.4-deprecations.php` | +| 11.3.x | `config/drupal-11/drupal-11.3-deprecations.php` | +| 11.2.x | `config/drupal-11/drupal-11.2-deprecations.php` | +| 11.1.x | `config/drupal-11/drupal-11.1-deprecations.php` | + +--- + +## Step 3 — Write the rector class + +Path: `src/Drupal11/Rector/Deprecation/{{ClassName}}.php` + +```php +> */ + public function getNodeTypes(): array + { + return [FuncCall::class]; + } + + protected function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node + { + assert($node instanceof FuncCall); + + if (!$node->name instanceof Name || $node->name->toString() !== '{{functionName}}') { + return null; + } + + $serviceCall = new StaticCall( + new FullyQualified('Drupal'), + 'service', + [new Arg(new ClassConstFetch(new FullyQualified('{{serviceClass}}'), 'class'))] + ); + + return new MethodCall($serviceCall, '{{methodName}}', $node->args); + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition( + 'Replace deprecated {{functionName}}() with \Drupal::service(\{{serviceClass}}::class)->{{methodName}}().', + [ + new ConfiguredCodeSample( + <<<'CODE_BEFORE' +{{beforeCode}} +CODE_BEFORE, + <<<'CODE_AFTER' +{{afterCode}} +CODE_AFTER, + [new DrupalIntroducedVersionConfiguration('{{introducedVersion}}')] + ), + ] + ); + } +} +``` + +--- + +## Step 4 — Write the test class + +Path: `tests/src/Drupal11/Rector/Deprecation/{{ClassName}}/{{ClassName}}Test.php` + +```php +doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } + } + + /** @return \Iterator> */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } + } + + /** @return \Iterator> */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} +``` + +--- + +## Step 5 — Write the test config + +Path: `tests/src/Drupal11/Rector/Deprecation/{{ClassName}}/config/configured_rule.php` + +```php + +----- + {{afterCode}}, fn() => {{beforeCode}}); +?> +``` + +> **Note:** In the "after" section, strip any trailing `;` from `{{beforeCode}}` and `{{afterCode}}` +> when they appear inside the `backwardsCompatibleCall` arguments — the `;` belongs on the +> outer statement only. If `{{beforeCode}}` is wrapped in a variable assignment +> (e.g. `$x = fn();`), the BC call wraps only the right-hand side expression. + +### Below-version fixture (no change) + +Path: `tests/src/Drupal11/Rector/Deprecation/{{ClassName}}/fixture-below-version/basic.php.inc` + +``` + +----- + +``` + +--- + +## Step 7 — Register in the deprecations config + +Add to the appropriate config file (`config/drupal-11/drupal-11.{{X}}-deprecations.php`): + +```php +use DrupalRector\Drupal11\Rector\Deprecation\{{ClassName}}; +// (add to the use block at the top) + +// https://www.drupal.org/node/{{issueNumber}} +// {{functionName}}() deprecated in drupal:{{introducedVersion}}, removed in drupal:{{removedVersion}}. +$rectorConfig->ruleWithConfiguration({{ClassName}}::class, [ + new DrupalIntroducedVersionConfiguration('{{introducedVersion}}'), +]); +``` + +--- + +## Step 8 — Run quality checks + +```bash +ddev composer fix-style +ddev composer phpstan +vendor/bin/phpunit tests/src/Drupal11/Rector/Deprecation/{{ClassName}}/ +``` + +All three must pass before committing. + +--- + +## Step 9 — Commit + +```bash +git add src/Drupal11/Rector/Deprecation/{{ClassName}}.php \ + tests/src/Drupal11/Rector/Deprecation/{{ClassName}}/ \ + config/drupal-11/drupal-11.{{X}}-deprecations.php +git commit -m "feat(Drupal11): Add {{ClassName}} for issue #{{issueNumber}}" +``` diff --git a/src/Drupal11/Rector/Deprecation/FilterFormatFunctionsToServiceRector.php b/src/Drupal11/Rector/Deprecation/FilterFormatFunctionsToServiceRector.php new file mode 100644 index 000000000..36eb3ae86 --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/FilterFormatFunctionsToServiceRector.php @@ -0,0 +1,122 @@ +> */ + public function getNodeTypes(): array + { + return [FuncCall::class]; + } + + protected function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node + { + assert($node instanceof FuncCall); + + if (!$node->name instanceof Name) { + return null; + } + + return match ($node->name->toString()) { + 'filter_fallback_format' => $this->buildServiceCall('getFallbackFormatId', []), + 'filter_formats' => count($node->args) === 0 + ? $this->buildServiceCall('getAllFormats', []) + : $this->buildServiceCall('getFormatsForAccount', [$node->args[0]->value]), + 'filter_get_roles_by_format' => count($node->args) >= 1 + ? new MethodCall($node->args[0]->value, 'getRoles') + : null, + 'filter_get_formats_by_role' => count($node->args) >= 1 + ? $this->buildServiceCall('getFormatsByRole', [$node->args[0]->value]) + : null, + 'filter_default_format' => $this->buildDefaultFormatCall($node), + default => null, + }; + } + + private function buildDefaultFormatCall(FuncCall $node): MethodCall + { + $args = count($node->args) > 0 ? [$node->args[0]->value] : []; + + return new MethodCall( + $this->buildServiceCall('getDefaultFormat', $args), + 'id' + ); + } + + /** @param Node\Expr[] $argExprs */ + private function buildServiceCall(string $method, array $argExprs): MethodCall + { + $serviceCall = new StaticCall( + new FullyQualified('Drupal'), + 'service', + [new Arg(new ClassConstFetch(new FullyQualified(self::SERVICE_CLASS), 'class'))] + ); + + $args = array_map(static fn ($expr) => new Arg($expr), $argExprs); + + return new MethodCall($serviceCall, $method, $args); + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition( + 'Replace deprecated filter module procedural functions with FilterFormatRepositoryInterface service methods.', + [ + new ConfiguredCodeSample( + 'filter_fallback_format();', + '\Drupal::service(\Drupal\filter\FilterFormatRepositoryInterface::class)->getFallbackFormatId();', + [new DrupalIntroducedVersionConfiguration('11.4.0')] + ), + new ConfiguredCodeSample( + 'filter_formats();', + '\Drupal::service(\Drupal\filter\FilterFormatRepositoryInterface::class)->getAllFormats();', + [new DrupalIntroducedVersionConfiguration('11.4.0')] + ), + new ConfiguredCodeSample( + 'filter_get_roles_by_format($format);', + '$format->getRoles();', + [new DrupalIntroducedVersionConfiguration('11.4.0')] + ), + ] + ); + } +} diff --git a/src/Drupal11/Rector/Deprecation/MediaFilterFormatEditFormValidateRector.php b/src/Drupal11/Rector/Deprecation/MediaFilterFormatEditFormValidateRector.php new file mode 100644 index 000000000..679ff519f --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/MediaFilterFormatEditFormValidateRector.php @@ -0,0 +1,87 @@ +> */ + public function getNodeTypes(): array + { + return [FuncCall::class, String_::class]; + } + + public function refactor(Node $node): ?Node + { + if ($node instanceof FuncCall) { + if (!$node->name instanceof Name || $node->name->toString() !== self::DEPRECATED_FUNCTION) { + return null; + } + + $serviceCall = new StaticCall( + new FullyQualified('Drupal'), + 'service', + [new Arg(new ClassConstFetch(new FullyQualified(self::MEDIA_HOOKS_CLASS), 'class'))] + ); + + return new MethodCall($serviceCall, 'formatEditFormValidate', $node->args); + } + + if ($node instanceof String_) { + if ($node->value !== self::DEPRECATED_FUNCTION) { + return null; + } + + return new Array_([ + new ArrayItem(new ClassConstFetch(new FullyQualified(self::MEDIA_HOOKS_CLASS), 'class')), + new ArrayItem(new String_('formatEditFormValidate')), + ]); + } + + return null; + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition( + 'Replace deprecated media_filter_format_edit_form_validate() with \Drupal\media\Hook\MediaHooks::formatEditFormValidate().', + [ + new CodeSample( + 'media_filter_format_edit_form_validate($form, $form_state);', + '\Drupal::service(\Drupal\media\Hook\MediaHooks::class)->formatEditFormValidate($form, $form_state);' + ), + new CodeSample( + "\$form['#validate'][] = 'media_filter_format_edit_form_validate';", + "\$form['#validate'][] = [\\Drupal\\media\\Hook\\MediaHooks::class, 'formatEditFormValidate'];" + ), + ] + ); + } +} diff --git a/src/Drupal11/Rector/Deprecation/NodeAccessRebuildFunctionsRector.php b/src/Drupal11/Rector/Deprecation/NodeAccessRebuildFunctionsRector.php new file mode 100644 index 000000000..266b30322 --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/NodeAccessRebuildFunctionsRector.php @@ -0,0 +1,101 @@ +> */ + public function getNodeTypes(): array + { + return [FuncCall::class]; + } + + protected function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node + { + assert($node instanceof FuncCall); + + if (!$node->name instanceof Name) { + return null; + } + + return match ($node->name->toString()) { + 'node_access_rebuild' => $this->buildServiceCall('rebuild', $node->args), + 'node_access_needs_rebuild' => count($node->args) === 0 + ? $this->buildServiceCall('needsRebuild', []) + : $this->buildServiceCall('setNeedsRebuild', $node->args), + default => null, + }; + } + + /** @param Arg[] $args */ + private function buildServiceCall(string $method, array $args): MethodCall + { + $serviceCall = new StaticCall( + new FullyQualified('Drupal'), + 'service', + [new Arg(new ClassConstFetch(new FullyQualified('Drupal\node\NodeAccessRebuild'), 'class'))] + ); + + return new MethodCall($serviceCall, $method, $args); + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition( + 'Replace deprecated node_access_rebuild() and node_access_needs_rebuild() with the NodeAccessRebuild service.', + [ + new ConfiguredCodeSample( + 'node_access_rebuild();', + '\Drupal::service(\Drupal\node\NodeAccessRebuild::class)->rebuild();', + [new DrupalIntroducedVersionConfiguration('11.4.0')] + ), + new ConfiguredCodeSample( + 'node_access_needs_rebuild();', + '\Drupal::service(\Drupal\node\NodeAccessRebuild::class)->needsRebuild();', + [new DrupalIntroducedVersionConfiguration('11.4.0')] + ), + new ConfiguredCodeSample( + 'node_access_needs_rebuild(TRUE);', + '\Drupal::service(\Drupal\node\NodeAccessRebuild::class)->setNeedsRebuild(TRUE);', + [new DrupalIntroducedVersionConfiguration('11.4.0')] + ), + ] + ); + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/FilterFormatFunctionsToServiceRector/FilterFormatFunctionsToServiceRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/FilterFormatFunctionsToServiceRector/FilterFormatFunctionsToServiceRectorTest.php new file mode 100644 index 000000000..3d13eaf6a --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/FilterFormatFunctionsToServiceRector/FilterFormatFunctionsToServiceRectorTest.php @@ -0,0 +1,50 @@ +doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } + } + + /** @return \Iterator> */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } + } + + /** @return \Iterator> */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/FilterFormatFunctionsToServiceRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/FilterFormatFunctionsToServiceRector/config/configured_rule.php new file mode 100644 index 000000000..5969602e3 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/FilterFormatFunctionsToServiceRector/config/configured_rule.php @@ -0,0 +1,14 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/FilterFormatFunctionsToServiceRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/FilterFormatFunctionsToServiceRector/fixture/basic.php.inc new file mode 100644 index 000000000..509b4bbba --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/FilterFormatFunctionsToServiceRector/fixture/basic.php.inc @@ -0,0 +1,21 @@ + +----- + \Drupal::service(\Drupal\filter\FilterFormatRepositoryInterface::class)->getFallbackFormatId(), fn() => filter_fallback_format()); +$all = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service(\Drupal\filter\FilterFormatRepositoryInterface::class)->getAllFormats(), fn() => filter_formats()); +$for_account = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service(\Drupal\filter\FilterFormatRepositoryInterface::class)->getFormatsForAccount($account), fn() => filter_formats($account)); +$roles = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => $format->getRoles(), fn() => filter_get_roles_by_format($format)); +$formats = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service(\Drupal\filter\FilterFormatRepositoryInterface::class)->getFormatsByRole($rid), fn() => filter_get_formats_by_role($rid)); +$default_id = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service(\Drupal\filter\FilterFormatRepositoryInterface::class)->getDefaultFormat()->id(), fn() => filter_default_format()); +$default_id_account = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service(\Drupal\filter\FilterFormatRepositoryInterface::class)->getDefaultFormat($account)->id(), fn() => filter_default_format($account)); +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/MediaFilterFormatEditFormValidateRector/MediaFilterFormatEditFormValidateRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/MediaFilterFormatEditFormValidateRector/MediaFilterFormatEditFormValidateRectorTest.php new file mode 100644 index 000000000..011cd5680 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/MediaFilterFormatEditFormValidateRector/MediaFilterFormatEditFormValidateRectorTest.php @@ -0,0 +1,27 @@ +doTestFile($filePath); + } + + /** @return \Iterator> */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/MediaFilterFormatEditFormValidateRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/MediaFilterFormatEditFormValidateRector/config/configured_rule.php new file mode 100644 index 000000000..b5b2bb096 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/MediaFilterFormatEditFormValidateRector/config/configured_rule.php @@ -0,0 +1,11 @@ + +----- +formatEditFormValidate($form, $form_state); +$form['#validate'][] = [\Drupal\media\Hook\MediaHooks::class, 'formatEditFormValidate']; +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/NodeAccessRebuildFunctionsRector/NodeAccessRebuildFunctionsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/NodeAccessRebuildFunctionsRector/NodeAccessRebuildFunctionsRectorTest.php new file mode 100644 index 000000000..9d0c5ca02 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/NodeAccessRebuildFunctionsRector/NodeAccessRebuildFunctionsRectorTest.php @@ -0,0 +1,50 @@ +doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } + } + + /** @return \Iterator> */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + AbstractDrupalCoreRector::setVersionOverride(null); + } + } + + /** @return \Iterator> */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/NodeAccessRebuildFunctionsRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/NodeAccessRebuildFunctionsRector/config/configured_rule.php new file mode 100644 index 000000000..fb77332da --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/NodeAccessRebuildFunctionsRector/config/configured_rule.php @@ -0,0 +1,14 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/NodeAccessRebuildFunctionsRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/NodeAccessRebuildFunctionsRector/fixture/basic.php.inc new file mode 100644 index 000000000..a9206d1b0 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/NodeAccessRebuildFunctionsRector/fixture/basic.php.inc @@ -0,0 +1,17 @@ + +----- + \Drupal::service(\Drupal\node\NodeAccessRebuild::class)->rebuild(), fn() => node_access_rebuild()); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service(\Drupal\node\NodeAccessRebuild::class)->rebuild(TRUE), fn() => node_access_rebuild(TRUE)); +$needs = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service(\Drupal\node\NodeAccessRebuild::class)->needsRebuild(), fn() => node_access_needs_rebuild()); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service(\Drupal\node\NodeAccessRebuild::class)->setNeedsRebuild(TRUE), fn() => node_access_needs_rebuild(TRUE)); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service(\Drupal\node\NodeAccessRebuild::class)->setNeedsRebuild(FALSE), fn() => node_access_needs_rebuild(FALSE)); +?> diff --git a/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/node_access_grants.php.inc b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/node_access_grants.php.inc new file mode 100644 index 000000000..10d19199b --- /dev/null +++ b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/node_access_grants.php.inc @@ -0,0 +1,9 @@ + +----- + \Drupal::service('Drupal\node\NodeGrantsHelper')->nodeAccessGrants($operation, $account), fn() => node_access_grants($operation, $account)); +?> From 68cb6f241fbf9fa2ac94c9436697e600f5484d9c Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 8 May 2026 18:52:07 +0200 Subject: [PATCH 150/256] feat(Drupal11): Register new 11.4.0 deprecation rectors and update implement skill with recipes --- .claude/skills/rector-implement/SKILL.md | 19 +++++++++++- config/drupal-11/drupal-11.4-deprecations.php | 30 +++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/.claude/skills/rector-implement/SKILL.md b/.claude/skills/rector-implement/SKILL.md index eac8bd20d..fd8504a7a 100644 --- a/.claude/skills/rector-implement/SKILL.md +++ b/.claude/skills/rector-implement/SKILL.md @@ -20,7 +20,24 @@ If `repos/drupal-digests` does not exist yet, run `bash .claude/scripts/setup-re ## Steps -### Steps 1–14: Follow the canonical conversion workflow +### Step 0 — Try a recipe first + +Before doing anything else: + +1. Read the digest file. +2. Read `.claude/skills/prompts/recipes/RECIPES.md` and answer the routing questions. +3. If a recipe matches, read that recipe file and follow it **instead of Steps 1–14 below**. + The recipe is self-contained and includes quality checks and commit instructions. +4. If no recipe matches, continue with Steps 1–14. + +Available recipes: +- `func-to-class-service-bc.md` — single FuncCall → `Fqcn::class` service method (BC-wrapped) +- `func-to-class-service-bc-multi.md` — multiple FuncCalls → same `Fqcn::class` service (BC-wrapped) +- `config-only-template.md` — all config-only patterns (FunctionToServiceRector, FunctionToStaticRector, etc.) + +--- + +### Steps 1–14: Follow the canonical conversion workflow (fallback) Read `.claude/skills/prompts/digest-to-rector-prompt.md` completely and execute steps 1–14 as written there. diff --git a/config/drupal-11/drupal-11.4-deprecations.php b/config/drupal-11/drupal-11.4-deprecations.php index 55229ac53..062d22048 100644 --- a/config/drupal-11/drupal-11.4-deprecations.php +++ b/config/drupal-11/drupal-11.4-deprecations.php @@ -3,6 +3,9 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\DeprecatedFilterFunctionsRector; +use DrupalRector\Drupal11\Rector\Deprecation\FilterFormatFunctionsToServiceRector; +use DrupalRector\Drupal11\Rector\Deprecation\MediaFilterFormatEditFormValidateRector; +use DrupalRector\Drupal11\Rector\Deprecation\NodeAccessRebuildFunctionsRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveAutomatedCronSubmitHandlerRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveCacheExpireOverrideRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveConfigSaveTrustedDataArgRector; @@ -38,6 +41,33 @@ new DrupalIntroducedVersionConfiguration('11.4.0'), ]); + // https://www.drupal.org/node/2473041 + // node_access_grants() deprecated in drupal:11.4.0, removed in drupal:13.0.0. + // Replaced by \Drupal\node\NodeGrantsHelper::nodeAccessGrants(). + $rectorConfig->ruleWithConfiguration(FunctionToServiceRector::class, [ + new FunctionToServiceConfiguration('11.4.0', 'node_access_grants', 'Drupal\node\NodeGrantsHelper', 'nodeAccessGrants'), + ]); + + // https://www.drupal.org/node/3533299 + // node_access_rebuild() and node_access_needs_rebuild() deprecated in drupal:11.4.0, removed in drupal:13.0.0. + // Replaced by \Drupal\node\NodeAccessRebuild service. + $rectorConfig->ruleWithConfiguration(NodeAccessRebuildFunctionsRector::class, [ + new DrupalIntroducedVersionConfiguration('11.4.0'), + ]); + + // https://www.drupal.org/node/2536594 + // filter_formats(), filter_get_roles_by_format(), filter_get_formats_by_role(), + // filter_default_format(), and filter_fallback_format() deprecated in drupal:11.4.0, removed in drupal:13.0.0. + // Replaced by \Drupal\filter\FilterFormatRepositoryInterface service. + $rectorConfig->ruleWithConfiguration(FilterFormatFunctionsToServiceRector::class, [ + new DrupalIntroducedVersionConfiguration('11.4.0'), + ]); + + // https://www.drupal.org/node/3568124 + // media_filter_format_edit_form_validate() deprecated in drupal:11.4.0, removed in drupal:12.0.0. + // Replaced by \Drupal\media\Hook\MediaHooks::formatEditFormValidate(). + $rectorConfig->rule(MediaFilterFormatEditFormValidateRector::class); + // https://www.drupal.org/node/3226806 // _filter_autop(), _filter_html_escape(), and _filter_html_image_secure_process() // deprecated in drupal:11.4.0, removed in drupal:13.0.0. From 722f83789d4d0490c6381c6beb046ce8196f199c Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 8 May 2026 18:54:30 +0200 Subject: [PATCH 151/256] fix(Drupal11): Split template_preprocess_layout into own config block for issue #3571382 --- config/drupal-11/drupal-11.3-deprecations.php | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/config/drupal-11/drupal-11.3-deprecations.php b/config/drupal-11/drupal-11.3-deprecations.php index 38f2bc08d..bbbd57bfc 100644 --- a/config/drupal-11/drupal-11.3-deprecations.php +++ b/config/drupal-11/drupal-11.3-deprecations.php @@ -57,13 +57,16 @@ // twig_extension() is handled by ReplaceTwigExtensionRector below. $rectorConfig->ruleWithConfiguration(FunctionToServiceRector::class, [ new FunctionToServiceConfiguration('11.3.0', 'node_mass_update', 'Drupal\node\NodeBulkUpdate', 'process'), - // https://www.drupal.org/node/3571382 - // template_preprocess_layout() deprecated in drupal:11.3.0, removed in drupal:12.0.0. - // Replaced by \Drupal\layout_discovery\Hook\LayoutDiscoveryThemeHooks::preprocessLayout(). - new FunctionToServiceConfiguration('11.3.0', 'template_preprocess_layout', 'Drupal\layout_discovery\Hook\LayoutDiscoveryThemeHooks', 'preprocessLayout'), new FunctionToServiceConfiguration('11.3.0', 'twig_render_template', 'Drupal\Core\Template\TwigThemeEngine', 'renderTemplate'), ]); + // https://www.drupal.org/node/3571382 + // template_preprocess_layout() deprecated in drupal:11.3.0, removed in drupal:12.0.0. + // Replaced by \Drupal\layout_discovery\Hook\LayoutDiscoveryThemeHooks::preprocessLayout(). + $rectorConfig->ruleWithConfiguration(FunctionToServiceRector::class, [ + new FunctionToServiceConfiguration('11.3.0', 'template_preprocess_layout', 'Drupal\layout_discovery\Hook\LayoutDiscoveryThemeHooks', 'preprocessLayout'), + ]); + // https://www.drupal.org/node/1685492 // twig_extension() deprecated in drupal:11.3.0, removed in drupal:12.0.0. // Replaced by the '.html.twig' string literal. From 1086337fd0fe7f06af6628fd1adfaeb734744235 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 8 May 2026 19:00:36 +0200 Subject: [PATCH 152/256] feat: add useClassSyntax option to FunctionToServiceConfiguration --- config/drupal-11/drupal-11.3-deprecations.php | 2 +- config/drupal-11/drupal-11.4-deprecations.php | 2 +- src/Rector/Deprecation/FunctionToServiceRector.php | 7 +++++-- .../ValueObject/FunctionToServiceConfiguration.php | 10 +++++++++- .../FunctionToServiceRector/config/configured_rule.php | 4 ++-- .../fixture/node_access_grants.php.inc | 2 +- .../fixture/template_preprocess_layout.php.inc | 2 +- 7 files changed, 20 insertions(+), 9 deletions(-) diff --git a/config/drupal-11/drupal-11.3-deprecations.php b/config/drupal-11/drupal-11.3-deprecations.php index bbbd57bfc..dfb0d81ef 100644 --- a/config/drupal-11/drupal-11.3-deprecations.php +++ b/config/drupal-11/drupal-11.3-deprecations.php @@ -64,7 +64,7 @@ // template_preprocess_layout() deprecated in drupal:11.3.0, removed in drupal:12.0.0. // Replaced by \Drupal\layout_discovery\Hook\LayoutDiscoveryThemeHooks::preprocessLayout(). $rectorConfig->ruleWithConfiguration(FunctionToServiceRector::class, [ - new FunctionToServiceConfiguration('11.3.0', 'template_preprocess_layout', 'Drupal\layout_discovery\Hook\LayoutDiscoveryThemeHooks', 'preprocessLayout'), + new FunctionToServiceConfiguration('11.3.0', 'template_preprocess_layout', 'Drupal\layout_discovery\Hook\LayoutDiscoveryThemeHooks', 'preprocessLayout', true), ]); // https://www.drupal.org/node/1685492 diff --git a/config/drupal-11/drupal-11.4-deprecations.php b/config/drupal-11/drupal-11.4-deprecations.php index 062d22048..edafb50ed 100644 --- a/config/drupal-11/drupal-11.4-deprecations.php +++ b/config/drupal-11/drupal-11.4-deprecations.php @@ -45,7 +45,7 @@ // node_access_grants() deprecated in drupal:11.4.0, removed in drupal:13.0.0. // Replaced by \Drupal\node\NodeGrantsHelper::nodeAccessGrants(). $rectorConfig->ruleWithConfiguration(FunctionToServiceRector::class, [ - new FunctionToServiceConfiguration('11.4.0', 'node_access_grants', 'Drupal\node\NodeGrantsHelper', 'nodeAccessGrants'), + new FunctionToServiceConfiguration('11.4.0', 'node_access_grants', 'Drupal\node\NodeGrantsHelper', 'nodeAccessGrants', true), ]); // https://www.drupal.org/node/3533299 diff --git a/src/Rector/Deprecation/FunctionToServiceRector.php b/src/Rector/Deprecation/FunctionToServiceRector.php index 26f1813ff..48276be26 100644 --- a/src/Rector/Deprecation/FunctionToServiceRector.php +++ b/src/Rector/Deprecation/FunctionToServiceRector.php @@ -57,8 +57,11 @@ public function refactorWithConfiguration(Node $node, VersionedConfigurationInte assert($node instanceof Node\Expr\FuncCall); if ($this->getName($node->name) === $configuration->getDeprecatedFunctionName()) { - // This creates a service call like `\Drupal::service('file_system'). - $service = new Node\Expr\StaticCall(new Node\Name\FullyQualified('Drupal'), 'service', [new Node\Arg(new Node\Scalar\String_($configuration->getServiceName()))]); + $serviceArg = $configuration->useClassSyntax() + ? new Node\Arg(new Node\Expr\ClassConstFetch(new Node\Name\FullyQualified($configuration->getServiceName()), 'class')) + : new Node\Arg(new Node\Scalar\String_($configuration->getServiceName())); + + $service = new Node\Expr\StaticCall(new Node\Name\FullyQualified('Drupal'), 'service', [$serviceArg]); $method_name = new Node\Identifier($configuration->getServiceMethodName()); diff --git a/src/Rector/ValueObject/FunctionToServiceConfiguration.php b/src/Rector/ValueObject/FunctionToServiceConfiguration.php index 737aaeb1a..9cfb6a02d 100644 --- a/src/Rector/ValueObject/FunctionToServiceConfiguration.php +++ b/src/Rector/ValueObject/FunctionToServiceConfiguration.php @@ -25,12 +25,15 @@ class FunctionToServiceConfiguration implements VersionedConfigurationInterface protected string $introducedVersion; - public function __construct(string $introducedVersion, string $deprecatedFunctionName, string $serviceName, string $serviceMethodName) + protected bool $useClassSyntax; + + public function __construct(string $introducedVersion, string $deprecatedFunctionName, string $serviceName, string $serviceMethodName, bool $useClassSyntax = false) { $this->deprecatedFunctionName = $deprecatedFunctionName; $this->serviceName = $serviceName; $this->serviceMethodName = $serviceMethodName; $this->introducedVersion = $introducedVersion; + $this->useClassSyntax = $useClassSyntax; } public function getDeprecatedFunctionName(): string @@ -52,4 +55,9 @@ public function getIntroducedVersion(): string { return $this->introducedVersion; } + + public function useClassSyntax(): bool + { + return $this->useClassSyntax; + } } diff --git a/tests/src/Rector/Deprecation/FunctionToServiceRector/config/configured_rule.php b/tests/src/Rector/Deprecation/FunctionToServiceRector/config/configured_rule.php index 38b0ed724..280842776 100644 --- a/tests/src/Rector/Deprecation/FunctionToServiceRector/config/configured_rule.php +++ b/tests/src/Rector/Deprecation/FunctionToServiceRector/config/configured_rule.php @@ -26,7 +26,7 @@ // https://www.drupal.org/node/3571623 (Drupal 11.3) new FunctionToServiceConfiguration('11.3.0', 'node_mass_update', 'Drupal\node\NodeBulkUpdate', 'process'), // https://www.drupal.org/node/3571382 (Drupal 11.3) - new FunctionToServiceConfiguration('11.3.0', 'template_preprocess_layout', 'Drupal\layout_discovery\Hook\LayoutDiscoveryThemeHooks', 'preprocessLayout'), + new FunctionToServiceConfiguration('11.3.0', 'template_preprocess_layout', 'Drupal\layout_discovery\Hook\LayoutDiscoveryThemeHooks', 'preprocessLayout', true), // https://www.drupal.org/node/1685492 (Drupal 11.3) new FunctionToServiceConfiguration('11.3.0', 'twig_render_template', 'Drupal\Core\Template\TwigThemeEngine', 'renderTemplate'), // https://www.drupal.org/node/3574727 (Drupal 11.4) @@ -70,6 +70,6 @@ // https://www.drupal.org/node/3582106 (Drupal 11.4) new FunctionToServiceConfiguration('11.4.0', 'user_form_process_password_confirm', 'Drupal\user\Hook\UserThemeHooks', 'processPasswordConfirm'), // https://www.drupal.org/node/2473041 (Drupal 11.4) - new FunctionToServiceConfiguration('11.4.0', 'node_access_grants', 'Drupal\node\NodeGrantsHelper', 'nodeAccessGrants'), + new FunctionToServiceConfiguration('11.4.0', 'node_access_grants', 'Drupal\node\NodeGrantsHelper', 'nodeAccessGrants', true), ]); }; diff --git a/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/node_access_grants.php.inc b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/node_access_grants.php.inc index 10d19199b..a74b45ae5 100644 --- a/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/node_access_grants.php.inc +++ b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/node_access_grants.php.inc @@ -5,5 +5,5 @@ $grants = node_access_grants($operation, $account); ----- \Drupal::service('Drupal\node\NodeGrantsHelper')->nodeAccessGrants($operation, $account), fn() => node_access_grants($operation, $account)); +$grants = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service(\Drupal\node\NodeGrantsHelper::class)->nodeAccessGrants($operation, $account), fn() => node_access_grants($operation, $account)); ?> diff --git a/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/template_preprocess_layout.php.inc b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/template_preprocess_layout.php.inc index ad97a5450..cf57556a2 100644 --- a/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/template_preprocess_layout.php.inc +++ b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/template_preprocess_layout.php.inc @@ -8,6 +8,6 @@ function my_preprocess(&$variables) { \Drupal::service('Drupal\layout_discovery\Hook\LayoutDiscoveryThemeHooks')->preprocessLayout($variables), fn() => template_preprocess_layout($variables)); + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => \Drupal::service(\Drupal\layout_discovery\Hook\LayoutDiscoveryThemeHooks::class)->preprocessLayout($variables), fn() => template_preprocess_layout($variables)); } ?> From a72871c5da688b021d378f2246f38d2ef1b502f5 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 8 May 2026 19:02:40 +0200 Subject: [PATCH 153/256] docs: update recipes to route simple Fqcn::class service mappings to config-only --- .claude/skills/prompts/recipes/RECIPES.md | 8 ++++---- .../prompts/recipes/config-only-template.md | 15 +++++++++++---- .../recipes/func-to-class-service-bc-multi.md | 7 ++++++- .../prompts/recipes/func-to-class-service-bc.md | 7 ++++++- 4 files changed, 27 insertions(+), 10 deletions(-) diff --git a/.claude/skills/prompts/recipes/RECIPES.md b/.claude/skills/prompts/recipes/RECIPES.md index 4058e95fc..f12eda8be 100644 --- a/.claude/skills/prompts/recipes/RECIPES.md +++ b/.claude/skills/prompts/recipes/RECIPES.md @@ -23,8 +23,8 @@ Read the digest. Answer these questions in order: - `fn()` is removed entirely, no replacement → **func-removal** (config-only) - `SomeClass::staticMethod()` → **func-to-static** (config-only) - `\Drupal::service('string.id')->method()` → **func-to-string-service** (config-only) - - `\Drupal::service(FqcnClass::class)->method()`, one function → **func-to-class-service-bc** ✓ - - `\Drupal::service(FqcnClass::class)->method()`, multiple functions → **func-to-class-service-bc-multi** ✓ + - `\Drupal::service(FqcnClass::class)->method()`, simple 1-to-1 → **config-only** (`FunctionToServiceConfiguration(..., true)`) + - `\Drupal::service(FqcnClass::class)->method()`, arg-count dispatch / chained / mixed → **func-to-class-service-bc** or **func-to-class-service-bc-multi** ✓ - `$firstArg->method()` (method on first argument) → **func-to-first-arg-method** (config-only) - `\Drupal::service('old.id')` → `\Drupal::service('new.id')` → **service-rename** (config-only) - Something else → **custom** (`digest-to-rector-prompt.md`) @@ -43,8 +43,8 @@ Read the digest. Answer these questions in order: | Recipe file | Pattern | Type | Status | |---|---|---|---| -| `func-to-class-service-bc.md` | FuncCall → `Fqcn::class` service, single | custom class | ✅ done | -| `func-to-class-service-bc-multi.md` | FuncCall → `Fqcn::class` service, multiple | custom class | ✅ done | +| `func-to-class-service-bc.md` | FuncCall → `Fqcn::class` service, complex (dispatch/chained) | custom class | ✅ done | +| `func-to-class-service-bc-multi.md` | FuncCall → `Fqcn::class` service, multiple with complex logic | custom class | ✅ done | | `func-removal.md` | FuncCall removed entirely | config-only | 🔲 todo | | `func-to-static.md` | FuncCall → static method | config-only | 🔲 todo | | `func-to-string-service.md` | FuncCall → `'service.id'` method | config-only | 🔲 todo | diff --git a/.claude/skills/prompts/recipes/config-only-template.md b/.claude/skills/prompts/recipes/config-only-template.md index 440c992fe..98d2ba161 100644 --- a/.claude/skills/prompts/recipes/config-only-template.md +++ b/.claude/skills/prompts/recipes/config-only-template.md @@ -89,15 +89,22 @@ BC-wrapped (introduced >= 10.1.0). ### FunctionToServiceRector -Values: `{{introducedVersion}}`, `{{functionName}}`, `'{{serviceId}}'`, `{{methodName}}` +Values: `{{introducedVersion}}`, `{{functionName}}`, `{{serviceId}}`, `{{methodName}}` +**String service ID** (dotted alias like `'file_system'`, `'renderer'`): ```php new FunctionToServiceConfiguration('{{introducedVersion}}', '{{functionName}}', '{{serviceId}}', '{{methodName}}'), ``` - -`serviceId` is a dotted string like `'filter.format_repository'`, NOT a class name. -Use `func-to-class-service-bc.md` instead when the service is identified by `Fqcn::class`. Fixture "after": `\Drupal::service('{{serviceId}}')->{{methodName}}(args)` + +**FQCN service ID** (class or interface name like `Drupal\node\NodeGrantsHelper`): +```php +new FunctionToServiceConfiguration('{{introducedVersion}}', '{{functionName}}', '{{fqcn}}', '{{methodName}}', true), +``` +Fixture "after": `\Drupal::service(\{{fqcn}}::class)->{{methodName}}(args)` + +Use `func-to-class-service-bc.md` only when the replacement has custom logic (arg-count dispatch, chained calls, method on first arg, etc.). For a plain 1-to-1 mapping, the 5th `true` argument handles it. + BC-wrapped (introduced >= 10.1.0). --- diff --git a/.claude/skills/prompts/recipes/func-to-class-service-bc-multi.md b/.claude/skills/prompts/recipes/func-to-class-service-bc-multi.md index f052de3ba..7efe6aff3 100644 --- a/.claude/skills/prompts/recipes/func-to-class-service-bc-multi.md +++ b/.claude/skills/prompts/recipes/func-to-class-service-bc-multi.md @@ -1,7 +1,12 @@ # Recipe: Multiple FuncCalls → `::class` service methods (BC-wrapped) **Use when:** several deprecated global functions all map to methods on the same -`\Drupal::service(SomeClass::class)` and were introduced in Drupal >= 10.1.0. +`\Drupal::service(SomeClass::class)`, were introduced in Drupal >= 10.1.0, +**and** the replacement requires custom logic: arg-count dispatch to different methods, +chained calls, or method-on-first-arg mixed with service calls. + +For a group of plain 1-to-1 mappings with no custom logic, use multiple +`FunctionToServiceConfiguration(..., true)` config-only entries instead (see `config-only-template.md`). **Output:** one new custom rector class + test suite (4–5 files). diff --git a/.claude/skills/prompts/recipes/func-to-class-service-bc.md b/.claude/skills/prompts/recipes/func-to-class-service-bc.md index 59fee6db5..1bd559e57 100644 --- a/.claude/skills/prompts/recipes/func-to-class-service-bc.md +++ b/.claude/skills/prompts/recipes/func-to-class-service-bc.md @@ -1,7 +1,12 @@ # Recipe: FuncCall → `::class` service method (BC-wrapped) **Use when:** a single deprecated global function is replaced by -`\Drupal::service(SomeClass::class)->method()` and was introduced in Drupal >= 10.1.0. +`\Drupal::service(SomeClass::class)->method()`, was introduced in Drupal >= 10.1.0, +**and** the replacement requires custom logic: arg-count dispatch to different methods, +chained calls (e.g. `->getFormat()->id()`), or method-on-first-arg mixed with a service call. + +For a plain 1-to-1 mapping with no custom logic, use `FunctionToServiceConfiguration(..., true)` +as a config-only entry instead (see `config-only-template.md`). **Output:** one new custom rector class + test suite (4–5 files). From fd196fc95504ec8984834a3ae657dc1120e817bd Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 8 May 2026 19:04:32 +0200 Subject: [PATCH 154/256] fix: add FunctionToFirstArgMethodRector, DrupalServiceRenameRector, RenameClassRector to GENERIC_RECTORS --- .claude/scripts/generate-rector-index.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.claude/scripts/generate-rector-index.php b/.claude/scripts/generate-rector-index.php index 1a53ad3ff..efa856e92 100644 --- a/.claude/scripts/generate-rector-index.php +++ b/.claude/scripts/generate-rector-index.php @@ -15,12 +15,15 @@ const GENERIC_RECTORS = [ 'FunctionToServiceRector' => '1a', + 'FunctionToFirstArgMethodRector' => '1a', + 'DrupalServiceRenameRector' => '1a', 'FunctionToStaticRector' => '1b', 'ClassConstantToClassConstantRector' => '1c', 'ConstantToClassConstantRector' => '1c', - 'FunctionCallRemovalRector' => '3', 'MethodToMethodWithCheckRector' => '2', 'DeprecationHelperRemoveRector' => '2', + 'FunctionCallRemovalRector' => '3', + 'RenameClassRector' => 'unknown', ]; const SCOPE_PATTERN = '/^(replace-deprecated|remove-deprecated|replace-removed|strip-removed)/'; From 9246af92205d7ffb52e6f9ffedc3a37abe098f8b Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 8 May 2026 19:09:06 +0200 Subject: [PATCH 155/256] feat(Drupal11): Add RemoveFilterTipsLongParamRector for issue #3505370 --- .../RemoveFilterTipsLongParamRector.php | 164 ++++++++++++++++++ .../RemoveFilterTipsLongParamRectorTest.php | 29 ++++ .../config/configured_rule.php | 11 ++ .../fixture/basic.php.inc | 99 +++++++++++ 4 files changed, 303 insertions(+) create mode 100644 src/Drupal11/Rector/Deprecation/RemoveFilterTipsLongParamRector.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveFilterTipsLongParamRector/RemoveFilterTipsLongParamRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveFilterTipsLongParamRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveFilterTipsLongParamRector/fixture/basic.php.inc diff --git a/src/Drupal11/Rector/Deprecation/RemoveFilterTipsLongParamRector.php b/src/Drupal11/Rector/Deprecation/RemoveFilterTipsLongParamRector.php new file mode 100644 index 000000000..8b33c13df --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/RemoveFilterTipsLongParamRector.php @@ -0,0 +1,164 @@ +t('No HTML tags allowed.'); +} +CODE_BEFORE, + <<<'CODE_AFTER' +public function tips() { + return $this->t('No HTML tags allowed.'); +} +CODE_AFTER + ), + ] + ); + } + + /** @return array> */ + public function getNodeTypes(): array + { + return [Class_::class, FuncCall::class]; + } + + /** @param Class_|FuncCall $node */ + public function refactor(Node $node): ?Node + { + if ($node instanceof Class_) { + return $this->refactorClass($node); + } + + return $this->refactorFuncCall($node); + } + + private function refactorClass(Class_ $node): ?Class_ + { + if (!$this->classIsFilterPlugin($node)) { + return null; + } + + $changed = false; + foreach ($node->getMethods() as $method) { + if ($this->updateTipsMethod($method)) { + $changed = true; + } + } + + return $changed ? $node : null; + } + + private function classIsFilterPlugin(Class_ $classNode): bool + { + foreach ($classNode->implements as $implement) { + if ($this->nameMatchesFilterSymbol($implement)) { + return true; + } + } + + if ($classNode->extends !== null && $this->nameMatchesFilterSymbol($classNode->extends)) { + return true; + } + + return false; + } + + private function nameMatchesFilterSymbol(Name $name): bool + { + return in_array($name->toString(), self::FILTER_SYMBOLS, true); + } + + private function updateTipsMethod(ClassMethod $method): bool + { + if (!$this->isName($method, 'tips')) { + return false; + } + + if (count($method->params) === 0) { + return false; + } + + $firstParam = $method->params[0]; + if (!$firstParam->var instanceof Variable) { + return false; + } + + if (!$this->isName($firstParam->var, 'long')) { + return false; + } + + $usesLong = false; + $this->traverseNodesWithCallable((array) $method->stmts, function (Node $subNode) use (&$usesLong): ?Node { + if ($subNode instanceof Variable && $this->isName($subNode, 'long')) { + $usesLong = true; + } + + return null; + }); + + if ($usesLong) { + return false; + } + + $method->params = []; + + return true; + } + + private function refactorFuncCall(FuncCall $node): ?FuncCall + { + if (!$this->isName($node->name, '_filter_tips')) { + return null; + } + + if (count($node->getArgs()) < 2) { + return null; + } + + array_splice($node->args, 1); + + return $node; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveFilterTipsLongParamRector/RemoveFilterTipsLongParamRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveFilterTipsLongParamRector/RemoveFilterTipsLongParamRectorTest.php new file mode 100644 index 000000000..692ba3c17 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveFilterTipsLongParamRector/RemoveFilterTipsLongParamRectorTest.php @@ -0,0 +1,29 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveFilterTipsLongParamRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/RemoveFilterTipsLongParamRector/config/configured_rule.php new file mode 100644 index 000000000..d71fea5e2 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveFilterTipsLongParamRector/config/configured_rule.php @@ -0,0 +1,11 @@ +t('No HTML tags allowed.'); + } +} + +// Class implementing FilterInterface — $long parameter removed. +class MyEscapeFilter implements FilterInterface +{ + public function tips($long = FALSE) + { + return $this->t('HTML is escaped.'); + } +} + +// Class extending FilterBase where $long IS used — must not change. +class MyLongTipsFilter extends FilterBase +{ + public function tips($long = FALSE) + { + if ($long) { + return $this->t('Long tip with details.'); + } + + return $this->t('Short tip.'); + } +} + +// Unrelated class — must not change. +class MyUnrelatedClass +{ + public function tips($long = FALSE) + { + return 'something'; + } +} + +// _filter_tips() call with second argument — second argument removed. +_filter_tips(0, FALSE); + +// _filter_tips() call without second argument — must not change. +_filter_tips(0); + +?> +----- +t('No HTML tags allowed.'); + } +} + +// Class implementing FilterInterface — $long parameter removed. +class MyEscapeFilter implements FilterInterface +{ + public function tips() + { + return $this->t('HTML is escaped.'); + } +} + +// Class extending FilterBase where $long IS used — must not change. +class MyLongTipsFilter extends FilterBase +{ + public function tips($long = FALSE) + { + if ($long) { + return $this->t('Long tip with details.'); + } + + return $this->t('Short tip.'); + } +} + +// Unrelated class — must not change. +class MyUnrelatedClass +{ + public function tips($long = FALSE) + { + return 'something'; + } +} + +// _filter_tips() call with second argument — second argument removed. +_filter_tips(0); + +// _filter_tips() call without second argument — must not change. +_filter_tips(0); + +?> From 14db4785d6331968601011c3513f844f2885767e Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 8 May 2026 19:11:36 +0200 Subject: [PATCH 156/256] fix(Drupal11): Update @see URL in RemoveFilterTipsLongParamRector to change record 3567879 --- .../Rector/Deprecation/RemoveFilterTipsLongParamRector.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Drupal11/Rector/Deprecation/RemoveFilterTipsLongParamRector.php b/src/Drupal11/Rector/Deprecation/RemoveFilterTipsLongParamRector.php index 8b33c13df..2aec1f955 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveFilterTipsLongParamRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveFilterTipsLongParamRector.php @@ -26,7 +26,7 @@ * When $long is used inside the method body the rule skips that method — * the developer must manually remove the long-tip branch. * - * @see https://www.drupal.org/node/3505370 + * @see https://www.drupal.org/node/3567879 */ class RemoveFilterTipsLongParamRector extends AbstractRector { From 7d78fc8d7325b8b82aa8be450ca73e88630fb610 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 8 May 2026 19:15:09 +0200 Subject: [PATCH 157/256] feat: auto-run rector-qa after implement; require both @see URLs in Pass 4 --- .../skills/prompts/digest-to-rector-prompt.md | 12 ++++ .claude/skills/rector-implement/SKILL.md | 18 ++++++ .claude/skills/rector-qa/SKILL.md | 55 ++++++++++++------- .../RemoveFilterTipsLongParamRector.php | 1 + 4 files changed, 67 insertions(+), 19 deletions(-) diff --git a/.claude/skills/prompts/digest-to-rector-prompt.md b/.claude/skills/prompts/digest-to-rector-prompt.md index 4acf40b1b..11fe4723c 100644 --- a/.claude/skills/prompts/digest-to-rector-prompt.md +++ b/.claude/skills/prompts/digest-to-rector-prompt.md @@ -259,6 +259,12 @@ use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; +/** + * [description from Step 2] + * + * @see https://www.drupal.org/node/[issue-number] + * @see https://www.drupal.org/node/[change-record-number] + */ class [ClassName] extends AbstractRector { // [copy private constants and properties from the digests rule unchanged] @@ -313,6 +319,12 @@ use PhpParser\Node; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; +/** + * [description from Step 2] + * + * @see https://www.drupal.org/node/[issue-number] + * @see https://www.drupal.org/node/[change-record-number] + */ class [ClassName] extends AbstractDrupalCoreRector { /** @var DrupalIntroducedVersionConfiguration[] */ diff --git a/.claude/skills/rector-implement/SKILL.md b/.claude/skills/rector-implement/SKILL.md index fd8504a7a..0895637df 100644 --- a/.claude/skills/rector-implement/SKILL.md +++ b/.claude/skills/rector-implement/SKILL.md @@ -149,6 +149,23 @@ This marks the newly implemented rule as `implemented` in the index. --- +### After the index update: Run rector-qa + +Read `.claude/skills/rector-qa/SKILL.md` and execute all four passes for `[ClassName]`. + +Apply any fixes the QA reveals. If fixes touch the rector class or test files, commit them +separately: + +```bash +git add src/Drupal11/Rector/Deprecation/[ClassName].php \ + tests/src/Drupal11/Rector/Deprecation/[ClassName]/ +git commit -m "fix(Drupal11): QA fixes for [ClassName]" +``` + +Do not declare the implementation complete until rector-qa reports **Overall: PASS**. + +--- + ## Pre-flight Checklist Before declaring the implementation complete, verify all items from `.claude/skills/prompts/digest-to-rector-prompt.md`'s final checklist, plus: @@ -159,6 +176,7 @@ Before declaring the implementation complete, verify all items from `.claude/ski - [ ] `vendor/bin/phpunit tests/src/Drupal11/Rector/Deprecation/[ClassName]/` passes - [ ] `ddev composer phpstan` reports no new errors - [ ] `ddev composer fix-style` produces no changes +- [ ] rector-qa reports **Overall: PASS** (all four passes green) ## Quick Reference: Phase 1 (config-only) path diff --git a/.claude/skills/rector-qa/SKILL.md b/.claude/skills/rector-qa/SKILL.md index b9fef9962..59c1bdeeb 100644 --- a/.claude/skills/rector-qa/SKILL.md +++ b/.claude/skills/rector-qa/SKILL.md @@ -189,36 +189,53 @@ Do not run the other three passes in bulk mode. ## Pass 4 — @see URL Audit -**Goal:** The `@see` URL in the rector class docblock should point to the correct Drupal.org node. +**Goal:** The rector docblock must contain `@see` lines for **both** the Drupal.org issue node +and the change record node, so the class is findable regardless of which reference appears in +a given digest file or Drupal core deprecation notice. **Steps:** -1. Extract the `@see` URL from the rector class: +1. Extract all `@see` lines from the rector class: ```bash grep '@see' src/Drupal11/Rector/Deprecation/.php ``` 2. Determine the issue number and change record number: - - The digest filename contains the **issue number** (last numeric group). - - `~/projects/drupal-digests/issues/drupal-core/.md` contains the change record link if known. - - Alternatively, search `repos/drupal-core` for the deprecated function/method (run `bash .claude/scripts/setup-repos.sh` if absent): - ```bash - grep -rn "@deprecated in drupal:" repos/drupal-core/core --include="*.php" | grep "" | head -5 - ``` - The `@see` in the Drupal core deprecation notice usually points to the **change record**. -3. Expected `@see` URL: - - Rector should point to the **issue node** if that's what the digest file uses. - - OR the **change record node** if the Drupal core source cites it. - - Flag if the `@see` points to a node that's clearly wrong (e.g., points to a different, unrelated issue). + a. **Issue number** — last numeric group in the digest filename, e.g. + `remove-deprecated-foo-3505370.php` → issue `3505370`. -4. Check URL validity by comparing the node number with known data: - - Issue URL: `https://www.drupal.org/node/` — from digest filename - - CR URL: `https://www.drupal.org/node/` — from drupal-core deprecation annotation + b. **Change record number** — look in two places: + - `repos/drupal-digests/issues/drupal-core/.md`: scan for a link like + `[#3567879](https://www.drupal.org/node/3567879)` in the Upgrade or Technical details section. + - Drupal core source (run `bash .claude/scripts/setup-repos.sh` if `repos/drupal-core` is absent): + ```bash + grep -rn "3505370\|@see https://www.drupal.org" repos/drupal-core/core --include="*.php" \ + | grep "\|" | head -10 + ``` + The `@see` in Drupal core's own `@deprecated` block or `trigger_error` message usually + points to the **change record**. -**Output:** `Pass 4: [PASS|WARN] — [matches issue|matches CR|MISMATCH: should be ]` + c. If the issue number and change record number are the **same** (rare), one `@see` suffices. -**If WARN/FAIL:** Propose the corrected `@see` URL and apply it. +3. Verify the rector has **both** `@see` lines: + - `@see https://www.drupal.org/node/` + - `@see https://www.drupal.org/node/` + +4. Flag: + - **PASS** — both `@see` lines present (or issue == CR, so one is correct) + - **WARN** — one `@see` present but the other is missing; add the missing line + - **FAIL** — `@see` points to an entirely unrelated node + +**If WARN/FAIL:** Add or correct the `@see` line(s) in the rector docblock. Both should appear +consecutively, issue first: + +```php + * @see https://www.drupal.org/node/ + * @see https://www.drupal.org/node/ +``` + +**Output:** `Pass 4: [PASS|WARN|FAIL] — issue: CR:` --- @@ -232,7 +249,7 @@ After all four passes, produce a summary checklist: Pass 1 — Type Guard: [SAFE|AT-RISK|EXEMPT] Pass 2 — Fixtures: [PASS|WARN] — Pass 3 — BC Decision: [PASS|FAIL] — -Pass 4 — @see URL: [PASS|WARN] — +Pass 4 — @see URL: [PASS|WARN|FAIL] — issue: CR: Overall: [PASS — ready to merge | NEEDS FIXES — see above] ``` diff --git a/src/Drupal11/Rector/Deprecation/RemoveFilterTipsLongParamRector.php b/src/Drupal11/Rector/Deprecation/RemoveFilterTipsLongParamRector.php index 2aec1f955..456725210 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveFilterTipsLongParamRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveFilterTipsLongParamRector.php @@ -26,6 +26,7 @@ * When $long is used inside the method body the rule skips that method — * the developer must manually remove the long-tip branch. * + * @see https://www.drupal.org/node/3505370 * @see https://www.drupal.org/node/3567879 */ class RemoveFilterTipsLongParamRector extends AbstractRector From b3118ada80dfbe5ec8f9e9b7ca829e985ccdbfd0 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 8 May 2026 19:35:31 +0200 Subject: [PATCH 158/256] docs(Drupal11): add missing change record @see URLs to rector docblocks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Each rector now has two @see lines — the Drupal.org issue and the change record — so the class is findable regardless of which reference appears in a digest file or deprecation notice. --- .../Rector/Deprecation/DeprecatedFilterFunctionsRector.php | 1 + .../Rector/Deprecation/ErrorCurrentErrorHandlerRector.php | 1 + .../Rector/Deprecation/FileSystemBasenameToNativeRector.php | 1 + .../Rector/Deprecation/FilterFormatFunctionsToServiceRector.php | 1 + src/Drupal11/Rector/Deprecation/LoadAllIncludesRector.php | 1 + .../Deprecation/MediaFilterFormatEditFormValidateRector.php | 1 + .../Deprecation/MigrateSqlGetMigrationPluginManagerRector.php | 1 + .../Rector/Deprecation/NodeAccessRebuildFunctionsRector.php | 1 + .../Rector/Deprecation/NodeStorageDeprecatedMethodsRector.php | 1 + .../Rector/Deprecation/PluginBaseIsConfigurableRector.php | 1 + .../Deprecation/RemoveAutomatedCronSubmitHandlerRector.php | 1 + .../Rector/Deprecation/RemoveCacheExpireOverrideRector.php | 1 + .../Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector.php | 1 + .../Deprecation/RemoveHandlerBaseDefineExtraOptionsRector.php | 1 + .../Deprecation/RemoveLinkWidgetValidateTitleElementRector.php | 1 + .../Deprecation/RemoveModuleHandlerAddModuleCallsRector.php | 1 + .../Deprecation/RemoveModuleHandlerDeprecatedMethodsRector.php | 1 + .../Rector/Deprecation/RemoveRootFromConvertDbUrlRector.php | 1 + src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector.php | 1 + .../Rector/Deprecation/RemoveStateCacheSettingRector.php | 1 + src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector.php | 1 + .../Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector.php | 1 + .../Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector.php | 1 + .../Rector/Deprecation/RemoveViewsRowCacheKeysRector.php | 1 + .../Rector/Deprecation/ReplaceAlphadecimalToIntNullRector.php | 1 + .../ReplaceCommentManagerGetCountNewCommentsRector.php | 1 + src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector.php | 1 + .../Rector/Deprecation/ReplaceFieldgroupToFieldsetRector.php | 1 + .../Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector.php | 1 + .../Rector/Deprecation/ReplaceNodeAddBodyFieldRector.php | 1 + .../Rector/Deprecation/ReplaceNodeSetPreviewModeRector.php | 1 + .../Rector/Deprecation/ReplacePdoFetchConstantsRector.php | 1 + .../Deprecation/ReplaceRecipeRunnerInstallModuleRector.php | 1 + .../Deprecation/ReplaceSessionWritesWithRequestSessionRector.php | 1 + .../Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector.php | 1 + .../Rector/Deprecation/ReplaceUserSessionNamePropertyRector.php | 1 + .../Rector/Deprecation/ReplaceViewsProceduralFunctionsRector.php | 1 + .../Deprecation/StatementPrefetchIteratorFetchColumnRector.php | 1 + .../Deprecation/StripMigrationDependenciesExpandArgRector.php | 1 + .../Rector/Deprecation/UseEntityTypeHasIntegerIdRector.php | 1 + .../Rector/Deprecation/ViewsPluginHandlerManagerRector.php | 1 + 41 files changed, 41 insertions(+) diff --git a/src/Drupal11/Rector/Deprecation/DeprecatedFilterFunctionsRector.php b/src/Drupal11/Rector/Deprecation/DeprecatedFilterFunctionsRector.php index c2517d4f7..7e11475a3 100644 --- a/src/Drupal11/Rector/Deprecation/DeprecatedFilterFunctionsRector.php +++ b/src/Drupal11/Rector/Deprecation/DeprecatedFilterFunctionsRector.php @@ -24,6 +24,7 @@ * chain. * * @see https://www.drupal.org/node/3226806 + * @see https://www.drupal.org/node/3566536 */ final class DeprecatedFilterFunctionsRector extends AbstractDrupalCoreRector { diff --git a/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector.php b/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector.php index a593e2cf6..6d2783886 100644 --- a/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector.php +++ b/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector.php @@ -21,6 +21,7 @@ * Deprecated in drupal:11.3.0 and removed in drupal:13.0.0. * * @see https://www.drupal.org/node/3526515 + * @see https://www.drupal.org/node/3529500 */ final class ErrorCurrentErrorHandlerRector extends AbstractDrupalCoreRector { diff --git a/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector.php b/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector.php index fe0742b9a..7fa31fe07 100644 --- a/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector.php +++ b/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector.php @@ -22,6 +22,7 @@ * in drupal:13.0.0. PHP native basename() is identical on PHP 8.x+. * * @see https://www.drupal.org/node/3530461 + * @see https://www.drupal.org/node/3530869 */ final class FileSystemBasenameToNativeRector extends AbstractDrupalCoreRector { diff --git a/src/Drupal11/Rector/Deprecation/FilterFormatFunctionsToServiceRector.php b/src/Drupal11/Rector/Deprecation/FilterFormatFunctionsToServiceRector.php index 36eb3ae86..a125dbc73 100644 --- a/src/Drupal11/Rector/Deprecation/FilterFormatFunctionsToServiceRector.php +++ b/src/Drupal11/Rector/Deprecation/FilterFormatFunctionsToServiceRector.php @@ -24,6 +24,7 @@ * Deprecated in drupal:11.4.0 and removed in drupal:13.0.0. * * @see https://www.drupal.org/node/2536594 + * @see https://www.drupal.org/node/3035368 */ class FilterFormatFunctionsToServiceRector extends AbstractDrupalCoreRector { diff --git a/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector.php b/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector.php index 313bb3217..6b4efb48d 100644 --- a/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector.php +++ b/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector.php @@ -14,6 +14,7 @@ * Replaces deprecated ModuleHandler::loadAllIncludes() with an explicit foreach loop. * * @see https://www.drupal.org/node/3536431 + * @see https://www.drupal.org/node/3536432 */ final class LoadAllIncludesRector extends AbstractRector { diff --git a/src/Drupal11/Rector/Deprecation/MediaFilterFormatEditFormValidateRector.php b/src/Drupal11/Rector/Deprecation/MediaFilterFormatEditFormValidateRector.php index 679ff519f..e59f36a52 100644 --- a/src/Drupal11/Rector/Deprecation/MediaFilterFormatEditFormValidateRector.php +++ b/src/Drupal11/Rector/Deprecation/MediaFilterFormatEditFormValidateRector.php @@ -25,6 +25,7 @@ * Deprecated in drupal:11.4.0 and removed in drupal:12.0.0. * * @see https://www.drupal.org/node/3568124 + * @see https://www.drupal.org/node/3566774 */ class MediaFilterFormatEditFormValidateRector extends AbstractRector { diff --git a/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector.php b/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector.php index ef1afa770..7ab4d3a57 100644 --- a/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector.php +++ b/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector.php @@ -22,6 +22,7 @@ * Sql should access $this->migrationPluginManager directly. * * @see https://www.drupal.org/node/3439369 + * @see https://www.drupal.org/node/3282894 */ final class MigrateSqlGetMigrationPluginManagerRector extends AbstractRector { diff --git a/src/Drupal11/Rector/Deprecation/NodeAccessRebuildFunctionsRector.php b/src/Drupal11/Rector/Deprecation/NodeAccessRebuildFunctionsRector.php index 266b30322..1fcd6a9ce 100644 --- a/src/Drupal11/Rector/Deprecation/NodeAccessRebuildFunctionsRector.php +++ b/src/Drupal11/Rector/Deprecation/NodeAccessRebuildFunctionsRector.php @@ -24,6 +24,7 @@ * Deprecated in drupal:11.4.0 and removed in drupal:13.0.0. * * @see https://www.drupal.org/node/3533299 + * @see https://www.drupal.org/node/3575096 */ class NodeAccessRebuildFunctionsRector extends AbstractDrupalCoreRector { diff --git a/src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector.php b/src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector.php index e6a819267..2aaf96b1b 100644 --- a/src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector.php +++ b/src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector.php @@ -15,6 +15,7 @@ * Replaces deprecated NodeStorage::revisionIds() and userRevisionIds() calls. * * @see https://www.drupal.org/node/3396062 + * @see https://www.drupal.org/node/3519187 */ final class NodeStorageDeprecatedMethodsRector extends AbstractRector { diff --git a/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector.php b/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector.php index efc886932..3963e480e 100644 --- a/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector.php +++ b/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector.php @@ -14,6 +14,7 @@ * Replaces deprecated PluginBase::isConfigurable() with an instanceof check. * * @see https://www.drupal.org/node/3459533 + * @see https://www.drupal.org/node/2946122 */ final class PluginBaseIsConfigurableRector extends AbstractRector { diff --git a/src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector.php b/src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector.php index a2283903c..871dfbc68 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector.php @@ -17,6 +17,7 @@ * Config saving is now handled automatically via #config_target on the interval element. * * @see https://www.drupal.org/node/3566768 + * @see https://www.drupal.org/node/3566774 */ final class RemoveAutomatedCronSubmitHandlerRector extends AbstractRector { diff --git a/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector.php b/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector.php index 17876867f..adf3d2343 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector.php @@ -19,6 +19,7 @@ * in drupal:13.0.0. Cache expiration is now configured via cacheSetMaxAge(). * * @see https://www.drupal.org/node/3576556 + * @see https://www.drupal.org/node/3576855 */ final class RemoveCacheExpireOverrideRector extends AbstractRector { diff --git a/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector.php b/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector.php index 5c99046d5..04aaa3d52 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector.php @@ -20,6 +20,7 @@ * removed in drupal:13.0.0. * * @see https://www.drupal.org/node/3347842 + * @see https://www.drupal.org/node/3348180 */ final class RemoveConfigSaveTrustedDataArgRector extends AbstractRector { diff --git a/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector.php b/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector.php index eb57ebbd6..487e1b21a 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector.php @@ -20,6 +20,7 @@ * so any override is dead code. * * @see https://www.drupal.org/node/3485084 + * @see https://www.drupal.org/node/3486781 */ final class RemoveHandlerBaseDefineExtraOptionsRector extends AbstractRector { diff --git a/src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector.php b/src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector.php index 868a8abad..88b066393 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector.php @@ -17,6 +17,7 @@ * Validation is now handled by LinkTitleRequiredConstraint on the LinkItem field type. * * @see https://www.drupal.org/node/3093118 + * @see https://www.drupal.org/node/3554139 */ final class RemoveLinkWidgetValidateTitleElementRector extends AbstractRector { diff --git a/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector.php b/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector.php index 38ede1a53..2477bd5e5 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector.php @@ -17,6 +17,7 @@ * These methods are no-ops since drupal:11.2.0 and removed in drupal:12.0.0. * * @see https://www.drupal.org/node/3528899 + * @see https://www.drupal.org/node/3550193 */ final class RemoveModuleHandlerAddModuleCallsRector extends AbstractRector { diff --git a/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector.php b/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector.php index 2acac3c25..06e64679a 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector.php @@ -21,6 +21,7 @@ * Both are deprecated in drupal:11.1.0 and removed in drupal:12.0.0. * * @see https://www.drupal.org/node/3442009 + * @see https://www.drupal.org/node/3368812 */ final class RemoveModuleHandlerDeprecatedMethodsRector extends AbstractRector { diff --git a/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector.php b/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector.php index a830e323a..b46c6f845 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector.php @@ -26,6 +26,7 @@ * Any third $include_test_drivers argument is shifted to position two. * * @see https://www.drupal.org/node/3522513 + * @see https://www.drupal.org/node/3511287 */ final class RemoveRootFromConvertDbUrlRector extends AbstractRector { diff --git a/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector.php b/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector.php index 2e925a610..e5ebd1e46 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector.php @@ -21,6 +21,7 @@ * removed while preserving the rest of the chain. * * @see https://www.drupal.org/node/2667040 + * @see https://www.drupal.org/node/3575062 */ final class RemoveSetUriCallbackRector extends AbstractRector { diff --git a/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector.php b/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector.php index df335df6c..dc14911c9 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector.php @@ -17,6 +17,7 @@ * and the setting has no effect. * * @see https://www.drupal.org/node/3436954 + * @see https://www.drupal.org/node/2575105 */ final class RemoveStateCacheSettingRector extends AbstractRector { diff --git a/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector.php b/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector.php index d74558c8f..42fb72474 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector.php @@ -20,6 +20,7 @@ * It was a no-op optimisation hint; removing it is safe. * * @see https://www.drupal.org/node/3347842 + * @see https://www.drupal.org/node/3348180 */ final class RemoveTrustDataCallRector extends AbstractDrupalCoreRector { diff --git a/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector.php b/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector.php index 54ad214f6..eb5e16d20 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector.php @@ -18,6 +18,7 @@ * Drupal core removed the parameter in issue #3473440. * * @see https://www.drupal.org/node/3473440 + * @see https://www.drupal.org/node/3474692 */ final class RemoveTwigNodeTransTagArgumentRector extends AbstractRector { diff --git a/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector.php b/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector.php index b12192289..4302c4b8b 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector.php @@ -17,6 +17,7 @@ * Deprecated in drupal:11.1.0, removed in drupal:12.0.0. * * @see https://www.drupal.org/node/3417136 + * @see https://www.drupal.org/node/3461934 */ final class RemoveUpdaterPostInstallMethodsRector extends AbstractRector { diff --git a/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php b/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php index bde130f72..19c9741b1 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector.php @@ -28,6 +28,7 @@ * - Variable-first assignment: $keys = $plugin->getRowCacheKeys($row); [...'keys' => $keys] * - Delegation method: public function getRowCacheKeys($row) { return $this->plugin->getRowCacheKeys($row); } * + * @see https://www.drupal.org/node/3564937 * @see https://www.drupal.org/node/3564958 */ final class RemoveViewsRowCacheKeysRector extends AbstractRector diff --git a/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector.php b/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector.php index fa03ba34f..3d52bf09e 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector.php @@ -22,6 +22,7 @@ * in drupal:12.0.0. Both values always returned 0. * * @see https://www.drupal.org/node/3442810 + * @see https://www.drupal.org/node/3494472 */ final class ReplaceAlphadecimalToIntNullRector extends AbstractRector { diff --git a/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector.php b/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector.php index 34bb37187..bf0a81ad2 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector.php @@ -15,6 +15,7 @@ /** * Replaces deprecated CommentManagerInterface::getCountNewComments() calls. * + * @see https://www.drupal.org/node/3543035 * @see https://www.drupal.org/node/3551729 */ final class ReplaceCommentManagerGetCountNewCommentsRector extends AbstractDrupalCoreRector diff --git a/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector.php b/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector.php index 0442a6586..57dba80c7 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector.php @@ -20,6 +20,7 @@ * Deprecated in drupal:11.2.0, removed in drupal:12.0.0. * * @see https://www.drupal.org/node/3447794 + * @see https://www.drupal.org/node/3509245 */ final class ReplaceEditorLoadRector extends AbstractDrupalCoreRector { diff --git a/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector.php b/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector.php index bcf9c991e..46b87af8c 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector.php @@ -18,6 +18,7 @@ * drupal:12.0.0. * * @see https://www.drupal.org/node/3512254 + * @see https://www.drupal.org/node/3515272 */ final class ReplaceFieldgroupToFieldsetRector extends AbstractRector { diff --git a/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector.php b/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector.php index 47abb02e9..0271cb357 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector.php @@ -21,6 +21,7 @@ * Deprecated in drupal:11.3.0, removed in drupal:12.0.0. * * @see https://www.drupal.org/node/3038908 + * @see https://www.drupal.org/node/3038909 */ final class ReplaceNodeAccessViewAllNodesRector extends AbstractDrupalCoreRector { diff --git a/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector.php b/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector.php index a407c7d5b..388536d0c 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector.php @@ -22,6 +22,7 @@ * Deprecated in drupal:11.3.0, removed in drupal:12.0.0. * * @see https://www.drupal.org/node/3489266 + * @see https://www.drupal.org/node/3516778 */ final class ReplaceNodeAddBodyFieldRector extends AbstractDrupalCoreRector { diff --git a/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector.php b/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector.php index 0894935b2..c35eed200 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector.php @@ -17,6 +17,7 @@ * Deprecated in drupal:11.3.0, removed in drupal:13.0.0. * * @see https://www.drupal.org/node/3538277 + * @see https://www.drupal.org/node/3538666 */ final class ReplaceNodeSetPreviewModeRector extends AbstractRector { diff --git a/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector.php b/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector.php index b3b5fcebe..acd2824a9 100644 --- a/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector.php @@ -21,6 +21,7 @@ * Deprecated in drupal:11.2.0 and removed in drupal:12.0.0. * * @see https://www.drupal.org/node/3525077 + * @see https://www.drupal.org/node/3488338 */ final class ReplacePdoFetchConstantsRector extends AbstractRector { diff --git a/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector.php b/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector.php index f5a1d1010..fc4a682cd 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector.php @@ -24,6 +24,7 @@ * is wrapped in an array literal. * * @see https://www.drupal.org/node/3498026 + * @see https://www.drupal.org/node/3579527 */ final class ReplaceRecipeRunnerInstallModuleRector extends AbstractDrupalCoreRector { diff --git a/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector.php b/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector.php index 59795315c..d535b3903 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector.php @@ -22,6 +22,7 @@ * Deprecated in drupal:11.2.0. * * @see https://www.drupal.org/node/3518527 + * @see https://www.drupal.org/node/3518914 */ final class ReplaceSessionWritesWithRequestSessionRector extends AbstractRector { diff --git a/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector.php b/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector.php index 15f1dc97e..fbb669dd7 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector.php @@ -20,6 +20,7 @@ * and removed in drupal:12.0.0. Use css.compress and js.compress instead. * * @see https://www.drupal.org/node/3184242 + * @see https://www.drupal.org/node/3526344 */ final class ReplaceSystemPerformanceGzipKeyRector extends AbstractRector { diff --git a/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector.php b/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector.php index 19039870d..83484f3e4 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector.php @@ -19,6 +19,7 @@ * Deprecated in drupal:11.3.0, removed in drupal:12.0.0. * * @see https://www.drupal.org/node/3513856 + * @see https://www.drupal.org/node/3513877 */ final class ReplaceUserSessionNamePropertyRector extends AbstractDrupalCoreRector { diff --git a/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector.php b/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector.php index ac74da909..2106d0580 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector.php @@ -23,6 +23,7 @@ * - views_get_view_result(...) => \Drupal\views\Views::getViewResult(...) * * @see https://www.drupal.org/node/3572243 + * @see https://www.drupal.org/node/3572594 */ final class ReplaceViewsProceduralFunctionsRector extends AbstractDrupalCoreRector { diff --git a/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector.php b/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector.php index e458a2e52..b234ced9d 100644 --- a/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector.php +++ b/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector.php @@ -18,6 +18,7 @@ * Deprecated in drupal:11.2.0, removed in drupal:12.0.0. * * @see https://www.drupal.org/node/3490200 + * @see https://www.drupal.org/node/3490312 */ final class StatementPrefetchIteratorFetchColumnRector extends AbstractDrupalCoreRector { diff --git a/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector.php b/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector.php index 2aaeb25da..3a3aa9248 100644 --- a/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector.php +++ b/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector.php @@ -16,6 +16,7 @@ * Deprecated in drupal:11.0.0, removed in drupal:12.0.0. * * @see https://www.drupal.org/node/3574717 + * @see https://www.drupal.org/node/3442785 */ final class StripMigrationDependenciesExpandArgRector extends AbstractRector { diff --git a/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector.php b/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector.php index 0a8195ba9..7665e94da 100644 --- a/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector.php +++ b/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector.php @@ -23,6 +23,7 @@ * - $this->hasIntegerId($entityType) => $entityType->hasIntegerId() * * @see https://www.drupal.org/node/3566801 + * @see https://www.drupal.org/node/3566814 */ final class UseEntityTypeHasIntegerIdRector extends AbstractDrupalCoreRector { diff --git a/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector.php b/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector.php index 3f1480077..8fe600ecf 100644 --- a/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector.php +++ b/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector.php @@ -17,6 +17,7 @@ * Deprecated in drupal:11.4.0, removed in drupal:13.0.0. * * @see https://www.drupal.org/node/3566424 + * @see https://www.drupal.org/node/3566982 */ final class ViewsPluginHandlerManagerRector extends AbstractDrupalCoreRector { From ffb5fe8c805a15cbc447446e17465be950c8726c Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 8 May 2026 19:35:36 +0200 Subject: [PATCH 159/256] docs(Drupal11): add change record comment URLs to config-only deprecation entries MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Config-only rector entries now carry two comment lines — the Drupal.org issue and the change record — matching the docblock convention used in custom rector classes. --- config/drupal-11/drupal-11.0-deprecations.php | 3 +++ config/drupal-11/drupal-11.1-deprecations.php | 3 +++ config/drupal-11/drupal-11.2-deprecations.php | 9 +++++++++ config/drupal-11/drupal-11.3-deprecations.php | 10 ++++++++++ config/drupal-11/drupal-11.4-deprecations.php | 16 ++++++++++++++++ 5 files changed, 41 insertions(+) diff --git a/config/drupal-11/drupal-11.0-deprecations.php b/config/drupal-11/drupal-11.0-deprecations.php index 61959f1a6..976d5722a 100644 --- a/config/drupal-11/drupal-11.0-deprecations.php +++ b/config/drupal-11/drupal-11.0-deprecations.php @@ -10,6 +10,7 @@ return static function (RectorConfig $rectorConfig): void { // https://www.drupal.org/node/3436954 + // https://www.drupal.org/node/2575105 (change record) // $settings['state_cache'] deprecated in drupal:11.0.0. // State caching is now permanently enabled and the setting has no effect. $rectorConfig->rule(RemoveStateCacheSettingRector::class); @@ -20,11 +21,13 @@ $rectorConfig->rule(ReplaceRequestTimeConstantRector::class); // https://www.drupal.org/node/3574717 + // https://www.drupal.org/node/3442785 (change record) // getMigrationDependencies($expand) deprecated in drupal:11.0.0, removed in drupal:12.0.0. // The $expand boolean argument is removed; call without arguments. $rectorConfig->rule(StripMigrationDependenciesExpandArgRector::class); // https://www.drupal.org/node/3439369 + // https://www.drupal.org/node/3282894 (change record) // Sql::getMigrationPluginManager() deprecated in drupal:9.5.0, removed in drupal:11.0.0. // Replaced by $this->migrationPluginManager property access. $rectorConfig->rule(MigrateSqlGetMigrationPluginManagerRector::class); diff --git a/config/drupal-11/drupal-11.1-deprecations.php b/config/drupal-11/drupal-11.1-deprecations.php index 0f7f36dc6..dfb8eea23 100644 --- a/config/drupal-11/drupal-11.1-deprecations.php +++ b/config/drupal-11/drupal-11.1-deprecations.php @@ -16,6 +16,7 @@ return static function (RectorConfig $rectorConfig): void { // https://www.drupal.org/node/3459533 + // https://www.drupal.org/node/2946122 (change record) // PluginBase::isConfigurable() deprecated in drupal:11.1.0, removed in drupal:12.0.0. // Replaced by instanceof \Drupal\Component\Plugin\ConfigurableInterface. $rectorConfig->rule(PluginBaseIsConfigurableRector::class); @@ -35,6 +36,7 @@ ]); // https://www.drupal.org/node/3442009 + // https://www.drupal.org/node/3368812 (change record) // ModuleHandlerInterface::writeCache() deprecated in drupal:11.1.0, removed in drupal:12.0.0. No replacement needed. // ModuleHandlerInterface::getHookInfo() deprecated in drupal:11.1.0, removed in drupal:12.0.0. Replaced by []. $rectorConfig->rule(RemoveModuleHandlerDeprecatedMethodsRector::class); @@ -48,6 +50,7 @@ ]); // https://www.drupal.org/node/3417136 + // https://www.drupal.org/node/3461934 (change record) // Updater::postInstall() and postInstallTasks() deprecated in drupal:11.1.0, removed in drupal:12.0.0. // The entire install-via-URL flow was eliminated; overrides are dead code. $rectorConfig->rule(RemoveUpdaterPostInstallMethodsRector::class); diff --git a/config/drupal-11/drupal-11.2-deprecations.php b/config/drupal-11/drupal-11.2-deprecations.php index a68953321..0a2c704d4 100644 --- a/config/drupal-11/drupal-11.2-deprecations.php +++ b/config/drupal-11/drupal-11.2-deprecations.php @@ -34,6 +34,7 @@ return static function (RectorConfig $rectorConfig): void { // https://www.drupal.org/node/3490200 + // https://www.drupal.org/node/3490312 (change record) // StatementPrefetchIterator::fetchColumn() deprecated in drupal:11.2.0, removed in drupal:12.0.0. // Replaced by fetchField(). $rectorConfig->ruleWithConfiguration(StatementPrefetchIteratorFetchColumnRector::class, [ @@ -76,11 +77,13 @@ ]); // https://www.drupal.org/node/3528899 + // https://www.drupal.org/node/3550193 (change record) // ModuleHandlerInterface::addModule() and addProfile() deprecated in drupal:11.2.0, removed in drupal:12.0.0. // These methods are no-ops and can be removed. $rectorConfig->rule(RemoveModuleHandlerAddModuleCallsRector::class); // https://www.drupal.org/node/3485084 + // https://www.drupal.org/node/3486781 (change record) // HandlerBase::defineExtraOptions() deprecated in drupal:11.2.0, removed in drupal:12.0.0. // No replacement — Drupal core never called it; any override is dead code. $rectorConfig->rule(RemoveHandlerBaseDefineExtraOptionsRector::class); @@ -119,21 +122,25 @@ ]); // https://www.drupal.org/node/3473440 + // https://www.drupal.org/node/3474692 (change record) // TwigNodeTrans 6th $tag constructor argument deprecated in twig/twig 3.12, removed in drupal:11.2.0. // Drop the argument. $rectorConfig->rule(RemoveTwigNodeTransTagArgumentRector::class); // https://www.drupal.org/node/3442810 + // https://www.drupal.org/node/3494472 (change record) // Number::alphadecimalToInt(null/'') deprecated in drupal:11.2.0, removed in drupal:12.0.0. // Both arguments always produced 0; replaced with literal 0. $rectorConfig->rule(ReplaceAlphadecimalToIntNullRector::class); // https://www.drupal.org/node/3512254 + // https://www.drupal.org/node/3515272 (change record) // #type 'fieldgroup' deprecated in drupal:11.2.0, removed in drupal:12.0.0. // Replaced by 'fieldset'. $rectorConfig->rule(ReplaceFieldgroupToFieldsetRector::class); // https://www.drupal.org/node/3525077 + // https://www.drupal.org/node/3488338 (change record) // PDO::FETCH_* constants deprecated in drupal:11.2.0, removed in drupal:12.0.0. // Replaced by \Drupal\Core\Database\Statement\FetchAs enum cases. $rectorConfig->rule(ReplacePdoFetchConstantsRector::class); @@ -155,11 +162,13 @@ ]); // https://www.drupal.org/node/3518527 + // https://www.drupal.org/node/3518914 (change record) // $_SESSION['key'] = $value deprecated in drupal:11.2.0. // Replaced by \Drupal::request()->getSession()->set('key', $value). $rectorConfig->rule(ReplaceSessionWritesWithRequestSessionRector::class); // https://www.drupal.org/node/3447794 + // https://www.drupal.org/node/3509245 (change record) // editor_load($format_id) deprecated in drupal:11.2.0, removed in drupal:12.0.0. // Replaced by entityTypeManager()->getStorage('editor')->load($format_id). $rectorConfig->ruleWithConfiguration(ReplaceEditorLoadRector::class, [ diff --git a/config/drupal-11/drupal-11.3-deprecations.php b/config/drupal-11/drupal-11.3-deprecations.php index dfb0d81ef..8d78baa47 100644 --- a/config/drupal-11/drupal-11.3-deprecations.php +++ b/config/drupal-11/drupal-11.3-deprecations.php @@ -31,6 +31,7 @@ return static function (RectorConfig $rectorConfig): void { // https://www.drupal.org/node/3543035 + // https://www.drupal.org/node/3551729 (change record) // CommentManagerInterface::getCountNewComments() deprecated in drupal:11.3.0, removed in drupal:12.0.0. // Replaced by \Drupal\history\HistoryManager::getCountNewComments(). $rectorConfig->ruleWithConfiguration(ReplaceCommentManagerGetCountNewCommentsRector::class, [ @@ -38,11 +39,13 @@ ]); // https://www.drupal.org/node/3536431 + // https://www.drupal.org/node/3536432 (change record) // ModuleHandler::loadAllIncludes() deprecated in drupal:11.3.0, removed in drupal:13.0.0. // Replaced by an explicit foreach over getModuleList() + loadInclude(). $rectorConfig->rule(LoadAllIncludesRector::class); // https://www.drupal.org/node/3396062 + // https://www.drupal.org/node/3519187 (change record) // NodeStorage::revisionIds() and userRevisionIds() deprecated in drupal:11.3.0, removed in drupal:13.0.0. // Replaced by equivalent entity queries. $rectorConfig->rule(NodeStorageDeprecatedMethodsRector::class); @@ -90,6 +93,7 @@ ]); // https://www.drupal.org/node/3038908 + // https://www.drupal.org/node/3038909 (change record) // node_access_view_all_nodes() deprecated in drupal:11.3.0, removed in drupal:12.0.0. // Replaced by entityTypeManager()->getAccessControlHandler('node')->checkAllGrants(). // drupal_static_reset('node_access_view_all_nodes') replaced by node.view_all_nodes_memory_cache->deleteAll(). @@ -108,6 +112,7 @@ ]); // https://www.drupal.org/node/3489266 + // https://www.drupal.org/node/3516778 (change record) // node_add_body_field() deprecated in drupal:11.3.0, removed in drupal:12.0.0. // Replaced by $this->createBodyField() from BodyFieldCreationTrait. $rectorConfig->ruleWithConfiguration(ReplaceNodeAddBodyFieldRector::class, [ @@ -115,6 +120,7 @@ ]); // https://www.drupal.org/node/3513856 + // https://www.drupal.org/node/3513877 (change record) // UserSession::$name property read deprecated in drupal:11.3.0, removed in drupal:12.0.0. // Replaced by getAccountName(). $rectorConfig->ruleWithConfiguration(ReplaceUserSessionNamePropertyRector::class, [ @@ -139,12 +145,14 @@ ]); // https://www.drupal.org/node/3538277 + // https://www.drupal.org/node/3538666 (change record) // DRUPAL_DISABLED/OPTIONAL/REQUIRED constants (and integers 0/1/2) in setPreviewMode() // deprecated in drupal:11.3.0, removed in drupal:13.0.0. // Replaced by NodePreviewMode enum cases. $rectorConfig->rule(ReplaceNodeSetPreviewModeRector::class); // https://www.drupal.org/node/3530461 + // https://www.drupal.org/node/3530869 (change record) // FileSystemInterface::basename() deprecated in drupal:11.3.0, removed in drupal:13.0.0. // Replaced by PHP native basename(). $rectorConfig->ruleWithConfiguration(FileSystemBasenameToNativeRector::class, [ @@ -152,6 +160,7 @@ ]); // https://www.drupal.org/node/3526515 + // https://www.drupal.org/node/3529500 (change record) // Error::currentErrorHandler() deprecated in drupal:11.3.0, removed in drupal:13.0.0. // Replaced by PHP built-in get_error_handler(). $rectorConfig->ruleWithConfiguration(ErrorCurrentErrorHandlerRector::class, [ @@ -166,6 +175,7 @@ ]); // https://www.drupal.org/node/3522513 + // https://www.drupal.org/node/3511287 (change record) // Database::convertDbUrlToConnectionInfo($url, $root, ...) deprecated in drupal:11.3.0, removed in drupal:12.0.0. // The $root parameter is obsolete; remove it (shift any $include_test_drivers arg left). $rectorConfig->rule(RemoveRootFromConvertDbUrlRector::class); diff --git a/config/drupal-11/drupal-11.4-deprecations.php b/config/drupal-11/drupal-11.4-deprecations.php index edafb50ed..806886385 100644 --- a/config/drupal-11/drupal-11.4-deprecations.php +++ b/config/drupal-11/drupal-11.4-deprecations.php @@ -35,6 +35,7 @@ return static function (RectorConfig $rectorConfig): void { // https://www.drupal.org/node/3566424 + // https://www.drupal.org/node/3566982 (change record) // Views::pluginManager() and Views::handlerManager() deprecated in drupal:11.4.0, removed in drupal:13.0.0. // Replaced by \Drupal::service('plugin.manager.views.*') or views.plugin_managers service. $rectorConfig->ruleWithConfiguration(ViewsPluginHandlerManagerRector::class, [ @@ -49,6 +50,7 @@ ]); // https://www.drupal.org/node/3533299 + // https://www.drupal.org/node/3575096 (change record) // node_access_rebuild() and node_access_needs_rebuild() deprecated in drupal:11.4.0, removed in drupal:13.0.0. // Replaced by \Drupal\node\NodeAccessRebuild service. $rectorConfig->ruleWithConfiguration(NodeAccessRebuildFunctionsRector::class, [ @@ -56,6 +58,7 @@ ]); // https://www.drupal.org/node/2536594 + // https://www.drupal.org/node/3035368 (change record) // filter_formats(), filter_get_roles_by_format(), filter_get_formats_by_role(), // filter_default_format(), and filter_fallback_format() deprecated in drupal:11.4.0, removed in drupal:13.0.0. // Replaced by \Drupal\filter\FilterFormatRepositoryInterface service. @@ -64,11 +67,13 @@ ]); // https://www.drupal.org/node/3568124 + // https://www.drupal.org/node/3566774 (change record) // media_filter_format_edit_form_validate() deprecated in drupal:11.4.0, removed in drupal:12.0.0. // Replaced by \Drupal\media\Hook\MediaHooks::formatEditFormValidate(). $rectorConfig->rule(MediaFilterFormatEditFormValidateRector::class); // https://www.drupal.org/node/3226806 + // https://www.drupal.org/node/3566536 (change record) // _filter_autop(), _filter_html_escape(), and _filter_html_image_secure_process() // deprecated in drupal:11.4.0, removed in drupal:13.0.0. // Replaced by plugin.manager.filter createInstance() chain. @@ -205,6 +210,7 @@ // views_ui_contextual_links_suppress*() deprecated in drupal:11.4.0, removed in drupal:13.0.0. // These are no-ops and can be removed. // https://www.drupal.org/node/3566768 + // https://www.drupal.org/node/3566774 (change record) // automated_cron_settings_submit() deprecated in drupal:11.4.0, removed in drupal:13.0.0. // Config saving is now handled automatically via #config_target on the interval element. // https://www.drupal.org/node/3566782 @@ -223,32 +229,38 @@ ]); // https://www.drupal.org/node/2667040 + // https://www.drupal.org/node/3575062 (change record) // EntityTypeInterface::setUriCallback() deprecated in drupal:11.4.0, removed in drupal:13.0.0. // Use link templates or a route provider instead. $rectorConfig->rule(RemoveSetUriCallbackRector::class); // https://www.drupal.org/node/3498026 + // https://www.drupal.org/node/3579527 (change record) // RecipeRunner::installModule() deprecated in drupal:11.4.0. Use installModules() with an array. $rectorConfig->ruleWithConfiguration(ReplaceRecipeRunnerInstallModuleRector::class, [ new DrupalIntroducedVersionConfiguration('11.4.0'), ]); // https://www.drupal.org/node/3184242 + // https://www.drupal.org/node/3526344 (change record) // system.performance css.gzip and js.gzip config keys deprecated in drupal:11.4.0, removed in drupal:12.0.0. // Replaced by css.compress and js.compress. $rectorConfig->rule(ReplaceSystemPerformanceGzipKeyRector::class); // https://www.drupal.org/node/3564937 + // https://www.drupal.org/node/3564958 (change record) // CachePluginBase::getRowCacheKeys() and getRowId() deprecated in drupal:11.4.0, removed in drupal:13.0.0. // Remove array items whose value is one of these calls. $rectorConfig->rule(RemoveViewsRowCacheKeysRector::class); // https://www.drupal.org/node/3576556 + // https://www.drupal.org/node/3576855 (change record) // CachePluginBase::cacheExpire() deprecated in drupal:11.4.0, removed in drupal:13.0.0. // Subclass overrides are dead code; remove them. $rectorConfig->rule(RemoveCacheExpireOverrideRector::class); // https://www.drupal.org/node/3347842 + // https://www.drupal.org/node/3348180 (change record) // trustData() deprecated in drupal:11.4.0, removed in drupal:13.0.0. Remove from fluent chains. // Config::save($has_trusted_data) boolean arg deprecated in drupal:11.4.0, removed in drupal:13.0.0. $rectorConfig->ruleWithConfiguration(RemoveTrustDataCallRector::class, [ @@ -257,16 +269,19 @@ $rectorConfig->rule(RemoveConfigSaveTrustedDataArgRector::class); // https://www.drupal.org/node/3093118 + // https://www.drupal.org/node/3554139 (change record) // LinkWidget::validateTitleElement() deprecated in drupal:11.4.0, removed in drupal:12.0.0. // Validation is now handled by LinkTitleRequiredConstraint on the LinkItem field type. $rectorConfig->rule(RemoveLinkWidgetValidateTitleElementRector::class); // https://www.drupal.org/node/3566768 + // https://www.drupal.org/node/3566774 (change record) // $form['#submit'][] = 'automated_cron_settings_submit' deprecated in drupal:11.4.0, removed in drupal:13.0.0. // Config saving is now handled automatically via #config_target on the interval element. $rectorConfig->rule(RemoveAutomatedCronSubmitHandlerRector::class); // https://www.drupal.org/node/3572243 + // https://www.drupal.org/node/3572594 (change record) // views_view_is_enabled(), views_view_is_disabled(), views_enable_view(), // views_disable_view(), views_get_view_result() deprecated in drupal:11.4.0, removed in drupal:13.0.0. // Replaced by OO equivalents on the view object or Views::getViewResult(). @@ -275,6 +290,7 @@ ]); // https://www.drupal.org/node/3566801 + // https://www.drupal.org/node/3566814 (change record) // getEntityTypeIdKeyType() === 'integer', entityTypeSupportsComments(), and hasIntegerId($entityType) // deprecated in drupal:11.4.0, removed in drupal:13.0.0. // Replaced by EntityTypeInterface::hasIntegerId() called on the entity type object. From 88b5aee5ef25a8f129ee28eb7da2424d16d6508f Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 8 May 2026 19:35:42 +0200 Subject: [PATCH 160/256] docs(skills): strengthen rector-qa Pass 4 and wire rector-qa into rector-implement MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit rector-qa Pass 4: explicit three-source lookup (issue markdown → Drupal.org fetch → drupal-core grep) for finding the change record number; requires BOTH issue and CR @see lines in every rector docblock. rector-implement: automatically runs rector-qa after each implementation and adds it to the pre-flight checklist. digest-to-rector-prompt: Step 6 templates now include the two-@see pattern. --- .claude/skills/rector-qa/SKILL.md | 35 ++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/.claude/skills/rector-qa/SKILL.md b/.claude/skills/rector-qa/SKILL.md index 59c1bdeeb..3bf73c4d1 100644 --- a/.claude/skills/rector-qa/SKILL.md +++ b/.claude/skills/rector-qa/SKILL.md @@ -205,16 +205,31 @@ a given digest file or Drupal core deprecation notice. a. **Issue number** — last numeric group in the digest filename, e.g. `remove-deprecated-foo-3505370.php` → issue `3505370`. - b. **Change record number** — look in two places: - - `repos/drupal-digests/issues/drupal-core/.md`: scan for a link like - `[#3567879](https://www.drupal.org/node/3567879)` in the Upgrade or Technical details section. - - Drupal core source (run `bash .claude/scripts/setup-repos.sh` if `repos/drupal-core` is absent): - ```bash - grep -rn "3505370\|@see https://www.drupal.org" repos/drupal-core/core --include="*.php" \ - | grep "\|" | head -10 - ``` - The `@see` in Drupal core's own `@deprecated` block or `trigger_error` message usually - points to the **change record**. + b. **Change record number** — work through these sources in order, stopping when found: + + **Source 1 — Issue markdown (fastest):** + ```bash + cat repos/drupal-digests/issues/drupal-core/.md + ``` + Scan for a `drupal.org/node/` link in the "Upgrade path", "Change record", or "Technical + details" sections. A link like `[#3567879](https://www.drupal.org/node/3567879)` or + `https://www.drupal.org/node/3567879` in those sections is the change record number. + Also check the frontmatter for `change_record_url` or similar fields. + + **Source 2 — Drupal.org issue page (reliable):** + Fetch `https://www.drupal.org/node/` and look for a + "Change records for this issue" section or a "Related change records" block. + Those links point directly to the change record node. + + **Source 3 — Drupal core deprecation annotation (fallback):** + Run `bash .claude/scripts/setup-repos.sh` if `repos/drupal-core` is absent, then: + ```bash + grep -rn "@deprecated\|trigger_error" repos/drupal-core/core --include="*.php" \ + | grep "\|" | head -10 + ``` + The `@see` URL inside the `@deprecated` docblock or `trigger_error` message usually + points to the **change record**. Verify the node number differs from the issue number + before treating it as a CR. c. If the issue number and change record number are the **same** (rare), one `@see` suffices. From c1e3659d116685a0bd88a5353929bca1ff141c06 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 8 May 2026 19:48:39 +0200 Subject: [PATCH 161/256] docs(skills): extract change record number in Steps 2-3 of digest-to-rector-prompt Step 2 now explicitly extracts the change record number from the issue markdown alongside introduced version, removal version, FQCN, and description. Step 3 also triggers when the CR number is missing, and instructs fetching the Drupal.org issue page to find it via the "Change records for this issue" block. This ensures the [change-record-number] placeholder in the Step 6 templates is always populated before writing the rector class. --- .claude/skills/prompts/digest-to-rector-prompt.md | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/.claude/skills/prompts/digest-to-rector-prompt.md b/.claude/skills/prompts/digest-to-rector-prompt.md index 11fe4723c..d739ab04b 100644 --- a/.claude/skills/prompts/digest-to-rector-prompt.md +++ b/.claude/skills/prompts/digest-to-rector-prompt.md @@ -83,22 +83,27 @@ Read it completely. Extract: - **Removal version** — e.g., `removed in drupal:13.0.0` → `'13.0.0'` - **New API FQCN** — the fully-qualified class name of the replacement API, from `## Upgrade` or `## Technical details` - **Description** — one-sentence summary of what this rule does +- **Change record number** — scan for any `drupal.org/node/` link in the "Upgrade path", + "Change record", or "Technical details" sections. A link like + `[#3567879](https://www.drupal.org/node/3567879)` is the change record node number. + Note it separately from the issue number — they are usually different. -If any of these are missing or ambiguous, proceed to Step 3. Otherwise skip Step 3. +If any of the above (including the change record number) are missing or ambiguous, proceed to Step 3. Otherwise skip Step 3. --- ## Step 3 — Optional: fetch from Drupal.org (only if Step 2 was insufficient) -If the introduced version, removal version, or replacement FQCN is not clear from the markdown: +If the introduced version, removal version, replacement FQCN, **or change record number** is not clear from the markdown: Fetch the Drupal.org issue page: ``` https://www.drupal.org/node/[issue-number] ``` -Look for the change record linked from the issue. Change records typically contain the exact -`deprecated in drupal:X.Y.Z` wording and code examples. +Look for: +- A "Change records for this issue" section or "Related change records" block — the linked node number is the change record. +- The `deprecated in drupal:X.Y.Z` wording and code examples for version/FQCN confirmation. --- From bb06acadb76c1354868c968a9bf55773b45cf5b7 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 8 May 2026 19:59:01 +0200 Subject: [PATCH 162/256] feat(Drupal11): Add FileManagedFileSubmitRector for issue #3534089 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Split into two parts: - FunctionToStaticRector config entry for the direct FuncCall form (BC-wrapped, 11.3.0) - Custom FileManagedFileSubmitRector for the string callback form (String_ → Array_ callable) --- config/drupal-11/drupal-11.3-deprecations.php | 12 ++++ .../FileManagedFileSubmitRector.php | 72 +++++++++++++++++++ .../FileManagedFileSubmitRectorTest.php | 29 ++++++++ .../config/configured_rule.php | 11 +++ .../fixture/basic.php.inc | 15 ++++ .../config/configured_rule.php | 2 + .../fixture/file_managed_file_submit.php.inc | 13 ++++ 7 files changed, 154 insertions(+) create mode 100644 src/Drupal11/Rector/Deprecation/FileManagedFileSubmitRector.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/FileManagedFileSubmitRector/FileManagedFileSubmitRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/FileManagedFileSubmitRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/FileManagedFileSubmitRector/fixture/basic.php.inc create mode 100644 tests/src/Rector/Deprecation/FunctionToStaticRector/fixture/file_managed_file_submit.php.inc diff --git a/config/drupal-11/drupal-11.3-deprecations.php b/config/drupal-11/drupal-11.3-deprecations.php index 8d78baa47..5946ef7fd 100644 --- a/config/drupal-11/drupal-11.3-deprecations.php +++ b/config/drupal-11/drupal-11.3-deprecations.php @@ -3,6 +3,7 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\ErrorCurrentErrorHandlerRector; +use DrupalRector\Drupal11\Rector\Deprecation\FileManagedFileSubmitRector; use DrupalRector\Drupal11\Rector\Deprecation\FileSystemBasenameToNativeRector; use DrupalRector\Drupal11\Rector\Deprecation\LoadAllIncludesRector; use DrupalRector\Drupal11\Rector\Deprecation\NodeStorageDeprecatedMethodsRector; @@ -130,10 +131,21 @@ // https://www.drupal.org/node/3534092 // file_system_settings_submit() deprecated in drupal:11.3.0, removed in drupal:13.0.0. // Replaced by \Drupal\file\Hook\FileHooks::settingsSubmit(). + // https://www.drupal.org/node/3534089 + // https://www.drupal.org/node/3534091 (change record) + // file_managed_file_submit() deprecated in drupal:11.3.0, removed in drupal:12.0.0. + // Replaced by \Drupal\file\Element\ManagedFile::submit(). $rectorConfig->ruleWithConfiguration(FunctionToStaticRector::class, [ new FunctionToStaticConfiguration('11.3.0', 'file_system_settings_submit', 'Drupal\file\Hook\FileHooks', 'settingsSubmit'), + new FunctionToStaticConfiguration('11.3.0', 'file_managed_file_submit', 'Drupal\file\Element\ManagedFile', 'submit'), ]); + // https://www.drupal.org/node/3534089 + // https://www.drupal.org/node/3534091 (change record) + // 'file_managed_file_submit' string callback deprecated in drupal:11.3.0, removed in drupal:12.0.0. + // Replaced by [\Drupal\file\Element\ManagedFile::class, 'submit'] array callable. + $rectorConfig->rule(FileManagedFileSubmitRector::class); + // https://www.drupal.org/node/3495600 // JSONAPI_FILTER_AMONG_* global constants deprecated in drupal:11.3.0, removed in drupal:13.0.0. // Replaced by \Drupal\jsonapi\JsonApiFilter::AMONG_* class constants. diff --git a/src/Drupal11/Rector/Deprecation/FileManagedFileSubmitRector.php b/src/Drupal11/Rector/Deprecation/FileManagedFileSubmitRector.php new file mode 100644 index 000000000..af58706be --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/FileManagedFileSubmitRector.php @@ -0,0 +1,72 @@ +> */ + public function getNodeTypes(): array + { + return [String_::class]; + } + + /** @param String_ $node */ + public function refactor(Node $node): ?Node + { + if ($node->value !== self::DEPRECATED_FUNCTION) { + return null; + } + + return new Array_([ + new ArrayItem( + new ClassConstFetch( + new FullyQualified(self::NEW_CLASS), + 'class' + ) + ), + new ArrayItem( + new String_(self::NEW_METHOD) + ), + ]); + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/FileManagedFileSubmitRector/FileManagedFileSubmitRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/FileManagedFileSubmitRector/FileManagedFileSubmitRectorTest.php new file mode 100644 index 000000000..e23a64416 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/FileManagedFileSubmitRector/FileManagedFileSubmitRectorTest.php @@ -0,0 +1,29 @@ +doTestFile($filePath); + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/FileManagedFileSubmitRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/FileManagedFileSubmitRector/config/configured_rule.php new file mode 100644 index 000000000..d8b9e4968 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/FileManagedFileSubmitRector/config/configured_rule.php @@ -0,0 +1,11 @@ + +----- + diff --git a/tests/src/Rector/Deprecation/FunctionToStaticRector/config/configured_rule.php b/tests/src/Rector/Deprecation/FunctionToStaticRector/config/configured_rule.php index 34cbdb98b..63223c942 100644 --- a/tests/src/Rector/Deprecation/FunctionToStaticRector/config/configured_rule.php +++ b/tests/src/Rector/Deprecation/FunctionToStaticRector/config/configured_rule.php @@ -21,5 +21,7 @@ new FunctionToStaticConfiguration('11.4.0', 'views_ui_add_limited_validation', 'Drupal\views\ViewsFormAjaxHelperTrait', 'addLimitedValidation'), new FunctionToStaticConfiguration('11.4.0', 'views_ui_add_ajax_wrapper', 'Drupal\views\ViewsFormAjaxHelperTrait', 'addAjaxWrapper'), new FunctionToStaticConfiguration('11.4.0', 'views_ui_nojs_submit', 'Drupal\views\ViewsFormAjaxHelperTrait', 'noJsSubmit'), + // https://www.drupal.org/node/3534089 (Drupal 11.3) + new FunctionToStaticConfiguration('11.3.0', 'file_managed_file_submit', 'Drupal\file\Element\ManagedFile', 'submit'), ]); }; diff --git a/tests/src/Rector/Deprecation/FunctionToStaticRector/fixture/file_managed_file_submit.php.inc b/tests/src/Rector/Deprecation/FunctionToStaticRector/fixture/file_managed_file_submit.php.inc new file mode 100644 index 000000000..41c59c0b1 --- /dev/null +++ b/tests/src/Rector/Deprecation/FunctionToStaticRector/fixture/file_managed_file_submit.php.inc @@ -0,0 +1,13 @@ + +----- + \Drupal\file\Element\ManagedFile::submit($form, $form_state), fn() => file_managed_file_submit($form, $form_state)); +} +?> From d6aae6da34cb215fcf9ba05a341a20ac5d1a0fe2 Mon Sep 17 00:00:00 2001 From: bjorn Date: Sat, 9 May 2026 15:48:28 +0200 Subject: [PATCH 163/256] chore(composer): remove unused mglaman/phpstan-drupal dependency --- composer.json | 1 - 1 file changed, 1 deletion(-) diff --git a/composer.json b/composer.json index 9e6ecee11..f202b80f8 100644 --- a/composer.json +++ b/composer.json @@ -10,7 +10,6 @@ ], "require": { "rector/rector": "^2", - "mglaman/phpstan-drupal": "^2.0", "webflo/drupal-finder": "^1.2" }, "license": "MIT", From 421bf32e050b4dc71d59b712484515b0edf89ffa Mon Sep 17 00:00:00 2001 From: bjorn Date: Sat, 9 May 2026 15:41:31 +0200 Subject: [PATCH 164/256] feat(Settings): add DrupalRectorSettings service with unit tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Introduces a plain PHP service class for global drupal-rector configuration: BC wrapping toggle, minimum supported Drupal core version, and optional Drupal version override — replacing the static \$versionOverride hack. --- src/Services/DrupalRectorSettings.php | 61 ++++++++++++ .../src/Services/DrupalRectorSettingsTest.php | 92 +++++++++++++++++++ 2 files changed, 153 insertions(+) create mode 100644 src/Services/DrupalRectorSettings.php create mode 100644 tests/src/Services/DrupalRectorSettingsTest.php diff --git a/src/Services/DrupalRectorSettings.php b/src/Services/DrupalRectorSettings.php new file mode 100644 index 000000000..bf6c819ed --- /dev/null +++ b/src/Services/DrupalRectorSettings.php @@ -0,0 +1,61 @@ +backwardCompatibilityEnabled = true; + + return $this; + } + + public function disableBackwardCompatibility(): static + { + $this->backwardCompatibilityEnabled = false; + + return $this; + } + + public function isBackwardCompatibilityEnabled(): bool + { + return $this->backwardCompatibilityEnabled; + } + + public function setMinimumCoreVersionSupported(string $version): static + { + if ($version === '') { + throw new \InvalidArgumentException('Minimum core version supported cannot be empty.'); + } + + $this->minimumCoreVersionSupported = $version; + + return $this; + } + + public function getMinimumCoreVersionSupported(): string + { + return $this->minimumCoreVersionSupported; + } + + public function setDrupalVersion(?string $version): static + { + $this->drupalVersion = $version; + + return $this; + } + + public function getDrupalVersion(): ?string + { + return $this->drupalVersion; + } +} diff --git a/tests/src/Services/DrupalRectorSettingsTest.php b/tests/src/Services/DrupalRectorSettingsTest.php new file mode 100644 index 000000000..9b82b199d --- /dev/null +++ b/tests/src/Services/DrupalRectorSettingsTest.php @@ -0,0 +1,92 @@ +isBackwardCompatibilityEnabled()); + self::assertSame('10.1.0', $settings->getMinimumCoreVersionSupported()); + self::assertNull($settings->getDrupalVersion()); + } + + public function testDisableBackwardCompatibilityReturnsSelf(): void + { + $settings = new DrupalRectorSettings(); + $result = $settings->disableBackwardCompatibility(); + + self::assertSame($settings, $result); + self::assertFalse($settings->isBackwardCompatibilityEnabled()); + } + + public function testEnableBackwardCompatibilityAfterDisable(): void + { + $settings = new DrupalRectorSettings(); + $settings->disableBackwardCompatibility(); + $settings->enableBackwardCompatibility(); + + self::assertTrue($settings->isBackwardCompatibilityEnabled()); + } + + public function testEnableBackwardCompatibilityReturnsSelf(): void + { + $settings = new DrupalRectorSettings(); + $result = $settings->enableBackwardCompatibility(); + + self::assertSame($settings, $result); + } + + public function testSetMinimumCoreVersionSupported(): void + { + $settings = new DrupalRectorSettings(); + $result = $settings->setMinimumCoreVersionSupported('11.0.0'); + + self::assertSame($settings, $result); + self::assertSame('11.0.0', $settings->getMinimumCoreVersionSupported()); + } + + public function testSetMinimumCoreVersionSupportedThrowsOnEmpty(): void + { + $this->expectException(\InvalidArgumentException::class); + + (new DrupalRectorSettings())->setMinimumCoreVersionSupported(''); + } + + public function testSetDrupalVersion(): void + { + $settings = new DrupalRectorSettings(); + $result = $settings->setDrupalVersion('99.99.99'); + + self::assertSame($settings, $result); + self::assertSame('99.99.99', $settings->getDrupalVersion()); + } + + public function testSetDrupalVersionCanBeResetToNull(): void + { + $settings = new DrupalRectorSettings(); + $settings->setDrupalVersion('11.0.0'); + $settings->setDrupalVersion(null); + + self::assertNull($settings->getDrupalVersion()); + } + + public function testFluentChain(): void + { + $settings = (new DrupalRectorSettings()) + ->disableBackwardCompatibility() + ->setMinimumCoreVersionSupported('10.5.0') + ->setDrupalVersion('10.5.1'); + + self::assertFalse($settings->isBackwardCompatibilityEnabled()); + self::assertSame('10.5.0', $settings->getMinimumCoreVersionSupported()); + self::assertSame('10.5.1', $settings->getDrupalVersion()); + } +} From 15bf5d18ae046edcf0dedb2c763fb484df8a814a Mon Sep 17 00:00:00 2001 From: bjorn Date: Sat, 9 May 2026 15:43:31 +0200 Subject: [PATCH 165/256] feat(Settings): inject DrupalRectorSettings into AbstractDrupalCoreRector - Replace static \$versionOverride with DrupalRectorSettings setter injection wired via afterResolving() in DeprecationBase and rector.php - supportBackwardsCompatibility() now respects the BC toggle and uses minimumCoreVersionSupported as the floor instead of hardcoded 10.1.0 - Migrate all test setVersionOverride() calls to container-based setDrupalVersion() --- src/Rector/AbstractDrupalCoreRector.php | 23 ++++++++++++------- .../ReplaceModuleHandlerGetNameRectorTest.php | 10 ++++---- .../ReplaceRebuildThemeDataRectorTest.php | 10 ++++---- .../SystemTimeZonesRectorTest.php | 10 ++++---- .../WatchdogExceptionRectorTest.php | 10 ++++---- .../DeprecatedFilterFunctionsRectorTest.php | 10 ++++---- .../ErrorCurrentErrorHandlerRectorTest.php | 10 ++++---- .../FileSystemBasenameToNativeRectorTest.php | 10 ++++---- ...lterFormatFunctionsToServiceRectorTest.php | 10 ++++---- .../NodeAccessRebuildFunctionsRectorTest.php | 10 ++++---- .../RemoveTrustDataCallRectorTest.php | 10 ++++---- ...ntManagerGetCountNewCommentsRectorTest.php | 10 ++++---- ...eplaceDateTimeRangeConstantsRectorTest.php | 10 ++++---- .../ReplaceEditorLoadRectorTest.php | 10 ++++---- ...eplaceEntityOriginalPropertyRectorTest.php | 10 ++++---- ...ceLocaleConfigBatchFunctionsRectorTest.php | 10 ++++---- ...eplaceNodeAccessViewAllNodesRectorTest.php | 10 ++++---- .../ReplaceNodeAddBodyFieldRectorTest.php | 10 ++++---- ...odeModuleProceduralFunctionsRectorTest.php | 10 ++++---- ...aceRecipeRunnerInstallModuleRectorTest.php | 10 ++++---- .../ReplaceSessionManagerDeleteRectorTest.php | 10 ++++---- .../ReplaceThemeGetSettingRectorTest.php | 10 ++++---- ...placeUserSessionNamePropertyRectorTest.php | 10 ++++---- ...laceViewsProceduralFunctionsRectorTest.php | 10 ++++---- ...tPrefetchIteratorFetchColumnRectorTest.php | 10 ++++---- .../UseEntityTypeHasIntegerIdRectorTest.php | 10 ++++---- .../ViewsPluginHandlerManagerRectorTest.php | 10 ++++---- .../Rector/Deprecation/DeprecationBase.php | 8 +++++++ .../FunctionToFirstArgMethodRectorTest.php | 10 ++++---- 29 files changed, 158 insertions(+), 143 deletions(-) diff --git a/src/Rector/AbstractDrupalCoreRector.php b/src/Rector/AbstractDrupalCoreRector.php index ec57144fb..f4247921a 100644 --- a/src/Rector/AbstractDrupalCoreRector.php +++ b/src/Rector/AbstractDrupalCoreRector.php @@ -6,6 +6,7 @@ use Drupal\Component\Utility\DeprecationHelper; use DrupalRector\Contract\VersionedConfigurationInterface; +use DrupalRector\Services\DrupalRectorSettings; use PhpParser\Node; use PhpParser\Node\Expr\ArrowFunction; use PHPStan\Reflection\MethodReflection; @@ -15,13 +16,18 @@ abstract class AbstractDrupalCoreRector extends AbstractRector implements ConfigurableRectorInterface { - private static ?string $versionOverride = null; + private ?DrupalRectorSettings $drupalRectorSettings = null; /** * @var array|VersionedConfigurationInterface[] */ protected array $configuration = []; + public function setDrupalRectorSettings(DrupalRectorSettings $settings): void + { + $this->drupalRectorSettings = $settings; + } + public function configure(array $configuration): void { foreach ($configuration as $value) { @@ -125,11 +131,6 @@ public function rectorShouldApplyToDrupalVersion(VersionedConfigurationInterface return version_compare($this->installedDrupalVersion(), $configuration->getIntroducedVersion(), '>='); } - public static function setVersionOverride(?string $version): void - { - self::$versionOverride = $version; - } - /** * @phpstan-return non-empty-string */ @@ -138,7 +139,7 @@ public function installedDrupalVersion(): string return str_replace([ '.x-dev', '-dev', - ], '.0', self::$versionOverride ?? \Drupal::VERSION); + ], '.0', $this->drupalRectorSettings?->getDrupalVersion() ?? \Drupal::VERSION); } /** @@ -155,6 +156,12 @@ public function installedDrupalVersion(): string */ public function supportBackwardsCompatibility(VersionedConfigurationInterface $configuration): bool { - return !(version_compare($this->installedDrupalVersion(), '10.1.0', '<') || version_compare($configuration->getIntroducedVersion(), '10.0.0', '<')); + if ($this->drupalRectorSettings !== null && !$this->drupalRectorSettings->isBackwardCompatibilityEnabled()) { + return false; + } + + $minimumVersion = $this->drupalRectorSettings?->getMinimumCoreVersionSupported() ?? $this->installedDrupalVersion(); + + return !(version_compare($minimumVersion, '10.1.0', '<') || version_compare($configuration->getIntroducedVersion(), '10.0.0', '<')); } } diff --git a/tests/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector/ReplaceModuleHandlerGetNameRectorTest.php b/tests/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector/ReplaceModuleHandlerGetNameRectorTest.php index 14a662e85..4b8518cf3 100644 --- a/tests/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector/ReplaceModuleHandlerGetNameRectorTest.php +++ b/tests/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector/ReplaceModuleHandlerGetNameRectorTest.php @@ -4,7 +4,7 @@ namespace DrupalRector\Tests\Drupal10\Rector\Deprecation\ReplaceModuleHandlerGetNameRector; -use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Services\DrupalRectorSettings; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ReplaceModuleHandlerGetNameRectorTest extends AbstractRectorTestCase @@ -12,11 +12,11 @@ class ReplaceModuleHandlerGetNameRectorTest extends AbstractRectorTestCase #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } @@ -31,11 +31,11 @@ public static function provideData(): \Iterator #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] public function testBelowVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } diff --git a/tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/ReplaceRebuildThemeDataRectorTest.php b/tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/ReplaceRebuildThemeDataRectorTest.php index 3de10bd15..277dffb22 100644 --- a/tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/ReplaceRebuildThemeDataRectorTest.php +++ b/tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/ReplaceRebuildThemeDataRectorTest.php @@ -4,7 +4,7 @@ namespace DrupalRector\Tests\Drupal10\Rector\Deprecation\ReplaceRebuildThemeDataRector; -use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Services\DrupalRectorSettings; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ReplaceRebuildThemeDataRectorTest extends AbstractRectorTestCase @@ -12,11 +12,11 @@ class ReplaceRebuildThemeDataRectorTest extends AbstractRectorTestCase #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } @@ -31,11 +31,11 @@ public static function provideData(): \Iterator #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] public function testBelowVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } diff --git a/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/SystemTimeZonesRectorTest.php b/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/SystemTimeZonesRectorTest.php index d048c7fe9..6ab33d245 100644 --- a/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/SystemTimeZonesRectorTest.php +++ b/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/SystemTimeZonesRectorTest.php @@ -4,7 +4,7 @@ namespace DrupalRector\Tests\Drupal10\Rector\Deprecation\SystemTimeZonesRector; -use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Services\DrupalRectorSettings; use Iterator; use Rector\Testing\PHPUnit\AbstractRectorTestCase; @@ -14,11 +14,11 @@ class SystemTimeZonesRectorTest extends AbstractRectorTestCase #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } @@ -33,11 +33,11 @@ public static function provideData(): \Iterator #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] public function testBelowVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } diff --git a/tests/src/Drupal10/Rector/Deprecation/WatchdogExceptionRector/WatchdogExceptionRectorTest.php b/tests/src/Drupal10/Rector/Deprecation/WatchdogExceptionRector/WatchdogExceptionRectorTest.php index 6291081fa..b6c2ce96c 100644 --- a/tests/src/Drupal10/Rector/Deprecation/WatchdogExceptionRector/WatchdogExceptionRectorTest.php +++ b/tests/src/Drupal10/Rector/Deprecation/WatchdogExceptionRector/WatchdogExceptionRectorTest.php @@ -4,7 +4,7 @@ namespace DrupalRector\Tests\Drupal10\Rector\Deprecation\WatchdogExceptionRector; -use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Services\DrupalRectorSettings; use Iterator; use Rector\Testing\PHPUnit\AbstractRectorTestCase; @@ -14,11 +14,11 @@ class WatchdogExceptionRectorTest extends AbstractRectorTestCase #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } @@ -33,11 +33,11 @@ public static function provideData(): \Iterator #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] public function testBelowVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } diff --git a/tests/src/Drupal11/Rector/Deprecation/DeprecatedFilterFunctionsRector/DeprecatedFilterFunctionsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/DeprecatedFilterFunctionsRector/DeprecatedFilterFunctionsRectorTest.php index e5b2e72df..c63bcc291 100644 --- a/tests/src/Drupal11/Rector/Deprecation/DeprecatedFilterFunctionsRector/DeprecatedFilterFunctionsRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/DeprecatedFilterFunctionsRector/DeprecatedFilterFunctionsRectorTest.php @@ -4,7 +4,7 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\DeprecatedFilterFunctionsRector; -use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Services\DrupalRectorSettings; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class DeprecatedFilterFunctionsRectorTest extends AbstractRectorTestCase @@ -12,11 +12,11 @@ class DeprecatedFilterFunctionsRectorTest extends AbstractRectorTestCase #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } @@ -31,11 +31,11 @@ public static function provideData(): \Iterator #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] public function testBelowVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } diff --git a/tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/ErrorCurrentErrorHandlerRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/ErrorCurrentErrorHandlerRectorTest.php index e5296adaa..644232d16 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/ErrorCurrentErrorHandlerRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/ErrorCurrentErrorHandlerRectorTest.php @@ -4,7 +4,7 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ErrorCurrentErrorHandlerRector; -use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Services\DrupalRectorSettings; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ErrorCurrentErrorHandlerRectorTest extends AbstractRectorTestCase @@ -12,11 +12,11 @@ class ErrorCurrentErrorHandlerRectorTest extends AbstractRectorTestCase #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } @@ -31,11 +31,11 @@ public static function provideData(): \Iterator #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] public function testBelowVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } diff --git a/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/FileSystemBasenameToNativeRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/FileSystemBasenameToNativeRectorTest.php index 12709744d..1f25b1121 100644 --- a/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/FileSystemBasenameToNativeRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/FileSystemBasenameToNativeRectorTest.php @@ -4,7 +4,7 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\FileSystemBasenameToNativeRector; -use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Services\DrupalRectorSettings; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class FileSystemBasenameToNativeRectorTest extends AbstractRectorTestCase @@ -12,11 +12,11 @@ class FileSystemBasenameToNativeRectorTest extends AbstractRectorTestCase #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } @@ -31,11 +31,11 @@ public static function provideData(): \Iterator #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] public function testBelowVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } diff --git a/tests/src/Drupal11/Rector/Deprecation/FilterFormatFunctionsToServiceRector/FilterFormatFunctionsToServiceRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/FilterFormatFunctionsToServiceRector/FilterFormatFunctionsToServiceRectorTest.php index 3d13eaf6a..cbfb632e0 100644 --- a/tests/src/Drupal11/Rector/Deprecation/FilterFormatFunctionsToServiceRector/FilterFormatFunctionsToServiceRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/FilterFormatFunctionsToServiceRector/FilterFormatFunctionsToServiceRectorTest.php @@ -4,7 +4,7 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\FilterFormatFunctionsToServiceRector; -use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Services\DrupalRectorSettings; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class FilterFormatFunctionsToServiceRectorTest extends AbstractRectorTestCase @@ -12,11 +12,11 @@ class FilterFormatFunctionsToServiceRectorTest extends AbstractRectorTestCase #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } @@ -29,11 +29,11 @@ public static function provideData(): \Iterator #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] public function testBelowVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } diff --git a/tests/src/Drupal11/Rector/Deprecation/NodeAccessRebuildFunctionsRector/NodeAccessRebuildFunctionsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/NodeAccessRebuildFunctionsRector/NodeAccessRebuildFunctionsRectorTest.php index 9d0c5ca02..8b48b958d 100644 --- a/tests/src/Drupal11/Rector/Deprecation/NodeAccessRebuildFunctionsRector/NodeAccessRebuildFunctionsRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/NodeAccessRebuildFunctionsRector/NodeAccessRebuildFunctionsRectorTest.php @@ -4,7 +4,7 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\NodeAccessRebuildFunctionsRector; -use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Services\DrupalRectorSettings; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class NodeAccessRebuildFunctionsRectorTest extends AbstractRectorTestCase @@ -12,11 +12,11 @@ class NodeAccessRebuildFunctionsRectorTest extends AbstractRectorTestCase #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } @@ -29,11 +29,11 @@ public static function provideData(): \Iterator #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] public function testBelowVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/RemoveTrustDataCallRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/RemoveTrustDataCallRectorTest.php index 7a7683720..c617769b8 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/RemoveTrustDataCallRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/RemoveTrustDataCallRectorTest.php @@ -4,7 +4,7 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\RemoveTrustDataCallRector; -use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Services\DrupalRectorSettings; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class RemoveTrustDataCallRectorTest extends AbstractRectorTestCase @@ -12,11 +12,11 @@ class RemoveTrustDataCallRectorTest extends AbstractRectorTestCase #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } @@ -31,11 +31,11 @@ public static function provideData(): \Iterator #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] public function testBelowVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/ReplaceCommentManagerGetCountNewCommentsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/ReplaceCommentManagerGetCountNewCommentsRectorTest.php index 697da2cd6..ccefc3251 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/ReplaceCommentManagerGetCountNewCommentsRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/ReplaceCommentManagerGetCountNewCommentsRectorTest.php @@ -4,7 +4,7 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceCommentManagerGetCountNewCommentsRector; -use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Services\DrupalRectorSettings; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ReplaceCommentManagerGetCountNewCommentsRectorTest extends AbstractRectorTestCase @@ -12,11 +12,11 @@ class ReplaceCommentManagerGetCountNewCommentsRectorTest extends AbstractRectorT #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } @@ -31,11 +31,11 @@ public static function provideData(): \Iterator #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] public function testBelowVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/ReplaceDateTimeRangeConstantsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/ReplaceDateTimeRangeConstantsRectorTest.php index 0f9752c67..c45979ac9 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/ReplaceDateTimeRangeConstantsRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/ReplaceDateTimeRangeConstantsRectorTest.php @@ -4,7 +4,7 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceDateTimeRangeConstantsRector; -use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Services\DrupalRectorSettings; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ReplaceDateTimeRangeConstantsRectorTest extends AbstractRectorTestCase @@ -12,11 +12,11 @@ class ReplaceDateTimeRangeConstantsRectorTest extends AbstractRectorTestCase #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } @@ -31,11 +31,11 @@ public static function provideData(): \Iterator #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] public function testBelowVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/ReplaceEditorLoadRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/ReplaceEditorLoadRectorTest.php index 359a0dd4d..84694396a 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/ReplaceEditorLoadRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/ReplaceEditorLoadRectorTest.php @@ -4,7 +4,7 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceEditorLoadRector; -use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Services\DrupalRectorSettings; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ReplaceEditorLoadRectorTest extends AbstractRectorTestCase @@ -12,11 +12,11 @@ class ReplaceEditorLoadRectorTest extends AbstractRectorTestCase #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } @@ -31,11 +31,11 @@ public static function provideData(): \Iterator #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] public function testBelowVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/ReplaceEntityOriginalPropertyRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/ReplaceEntityOriginalPropertyRectorTest.php index 66e7436f6..b13b09582 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/ReplaceEntityOriginalPropertyRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/ReplaceEntityOriginalPropertyRectorTest.php @@ -4,7 +4,7 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceEntityOriginalPropertyRector; -use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Services\DrupalRectorSettings; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ReplaceEntityOriginalPropertyRectorTest extends AbstractRectorTestCase @@ -12,11 +12,11 @@ class ReplaceEntityOriginalPropertyRectorTest extends AbstractRectorTestCase #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } @@ -31,11 +31,11 @@ public static function provideData(): \Iterator #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] public function testBelowVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/ReplaceLocaleConfigBatchFunctionsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/ReplaceLocaleConfigBatchFunctionsRectorTest.php index 6f172dc67..7f64594ac 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/ReplaceLocaleConfigBatchFunctionsRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/ReplaceLocaleConfigBatchFunctionsRectorTest.php @@ -4,7 +4,7 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceLocaleConfigBatchFunctionsRector; -use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Services\DrupalRectorSettings; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ReplaceLocaleConfigBatchFunctionsRectorTest extends AbstractRectorTestCase @@ -12,11 +12,11 @@ class ReplaceLocaleConfigBatchFunctionsRectorTest extends AbstractRectorTestCase #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } @@ -31,11 +31,11 @@ public static function provideData(): \Iterator #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] public function testBelowVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/ReplaceNodeAccessViewAllNodesRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/ReplaceNodeAccessViewAllNodesRectorTest.php index b2f44fc57..02f41d5d2 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/ReplaceNodeAccessViewAllNodesRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/ReplaceNodeAccessViewAllNodesRectorTest.php @@ -4,7 +4,7 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceNodeAccessViewAllNodesRector; -use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Services\DrupalRectorSettings; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ReplaceNodeAccessViewAllNodesRectorTest extends AbstractRectorTestCase @@ -12,11 +12,11 @@ class ReplaceNodeAccessViewAllNodesRectorTest extends AbstractRectorTestCase #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } @@ -31,11 +31,11 @@ public static function provideData(): \Iterator #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] public function testBelowVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/ReplaceNodeAddBodyFieldRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/ReplaceNodeAddBodyFieldRectorTest.php index 8ee4f53dc..dc46b2d49 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/ReplaceNodeAddBodyFieldRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/ReplaceNodeAddBodyFieldRectorTest.php @@ -4,7 +4,7 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceNodeAddBodyFieldRector; -use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Services\DrupalRectorSettings; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ReplaceNodeAddBodyFieldRectorTest extends AbstractRectorTestCase @@ -12,11 +12,11 @@ class ReplaceNodeAddBodyFieldRectorTest extends AbstractRectorTestCase #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } @@ -31,11 +31,11 @@ public static function provideData(): \Iterator #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] public function testBelowVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/ReplaceNodeModuleProceduralFunctionsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/ReplaceNodeModuleProceduralFunctionsRectorTest.php index 1a97c5d5a..69f1791b1 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/ReplaceNodeModuleProceduralFunctionsRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/ReplaceNodeModuleProceduralFunctionsRectorTest.php @@ -4,7 +4,7 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceNodeModuleProceduralFunctionsRector; -use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Services\DrupalRectorSettings; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ReplaceNodeModuleProceduralFunctionsRectorTest extends AbstractRectorTestCase @@ -12,11 +12,11 @@ class ReplaceNodeModuleProceduralFunctionsRectorTest extends AbstractRectorTestC #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } @@ -31,11 +31,11 @@ public static function provideData(): \Iterator #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] public function testBelowVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/ReplaceRecipeRunnerInstallModuleRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/ReplaceRecipeRunnerInstallModuleRectorTest.php index 4583f1bfc..9c0ed3dde 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/ReplaceRecipeRunnerInstallModuleRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/ReplaceRecipeRunnerInstallModuleRectorTest.php @@ -4,7 +4,7 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceRecipeRunnerInstallModuleRector; -use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Services\DrupalRectorSettings; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ReplaceRecipeRunnerInstallModuleRectorTest extends AbstractRectorTestCase @@ -12,11 +12,11 @@ class ReplaceRecipeRunnerInstallModuleRectorTest extends AbstractRectorTestCase #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } @@ -31,11 +31,11 @@ public static function provideData(): \Iterator #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] public function testBelowVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/ReplaceSessionManagerDeleteRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/ReplaceSessionManagerDeleteRectorTest.php index 908355285..b440694b0 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/ReplaceSessionManagerDeleteRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/ReplaceSessionManagerDeleteRectorTest.php @@ -4,7 +4,7 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceSessionManagerDeleteRector; -use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Services\DrupalRectorSettings; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ReplaceSessionManagerDeleteRectorTest extends AbstractRectorTestCase @@ -12,11 +12,11 @@ class ReplaceSessionManagerDeleteRectorTest extends AbstractRectorTestCase #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } @@ -31,11 +31,11 @@ public static function provideData(): \Iterator #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] public function testBelowVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/ReplaceThemeGetSettingRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/ReplaceThemeGetSettingRectorTest.php index d765b877f..fa4ee255d 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/ReplaceThemeGetSettingRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/ReplaceThemeGetSettingRectorTest.php @@ -4,7 +4,7 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceThemeGetSettingRector; -use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Services\DrupalRectorSettings; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ReplaceThemeGetSettingRectorTest extends AbstractRectorTestCase @@ -12,11 +12,11 @@ class ReplaceThemeGetSettingRectorTest extends AbstractRectorTestCase #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } @@ -31,11 +31,11 @@ public static function provideData(): \Iterator #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] public function testBelowVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/ReplaceUserSessionNamePropertyRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/ReplaceUserSessionNamePropertyRectorTest.php index b99178843..86b9cbad3 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/ReplaceUserSessionNamePropertyRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/ReplaceUserSessionNamePropertyRectorTest.php @@ -4,7 +4,7 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceUserSessionNamePropertyRector; -use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Services\DrupalRectorSettings; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ReplaceUserSessionNamePropertyRectorTest extends AbstractRectorTestCase @@ -12,11 +12,11 @@ class ReplaceUserSessionNamePropertyRectorTest extends AbstractRectorTestCase #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } @@ -31,11 +31,11 @@ public static function provideData(): \Iterator #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] public function testBelowVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/ReplaceViewsProceduralFunctionsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/ReplaceViewsProceduralFunctionsRectorTest.php index 9947b6c89..74cf94905 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/ReplaceViewsProceduralFunctionsRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/ReplaceViewsProceduralFunctionsRectorTest.php @@ -4,7 +4,7 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceViewsProceduralFunctionsRector; -use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Services\DrupalRectorSettings; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ReplaceViewsProceduralFunctionsRectorTest extends AbstractRectorTestCase @@ -12,11 +12,11 @@ class ReplaceViewsProceduralFunctionsRectorTest extends AbstractRectorTestCase #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } @@ -31,11 +31,11 @@ public static function provideData(): \Iterator #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] public function testBelowVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('11.3.0'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('11.3.0'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } diff --git a/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/StatementPrefetchIteratorFetchColumnRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/StatementPrefetchIteratorFetchColumnRectorTest.php index 124195d3b..4432042ba 100644 --- a/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/StatementPrefetchIteratorFetchColumnRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/StatementPrefetchIteratorFetchColumnRectorTest.php @@ -4,7 +4,7 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\StatementPrefetchIteratorFetchColumnRector; -use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Services\DrupalRectorSettings; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class StatementPrefetchIteratorFetchColumnRectorTest extends AbstractRectorTestCase @@ -12,11 +12,11 @@ class StatementPrefetchIteratorFetchColumnRectorTest extends AbstractRectorTestC #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } @@ -31,11 +31,11 @@ public static function provideData(): \Iterator #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] public function testBelowVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } diff --git a/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/UseEntityTypeHasIntegerIdRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/UseEntityTypeHasIntegerIdRectorTest.php index 434d3921c..1bed6f966 100644 --- a/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/UseEntityTypeHasIntegerIdRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/UseEntityTypeHasIntegerIdRectorTest.php @@ -4,7 +4,7 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\UseEntityTypeHasIntegerIdRector; -use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Services\DrupalRectorSettings; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class UseEntityTypeHasIntegerIdRectorTest extends AbstractRectorTestCase @@ -12,11 +12,11 @@ class UseEntityTypeHasIntegerIdRectorTest extends AbstractRectorTestCase #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } @@ -31,11 +31,11 @@ public static function provideData(): \Iterator #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] public function testBelowVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } diff --git a/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/ViewsPluginHandlerManagerRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/ViewsPluginHandlerManagerRectorTest.php index 93b07578d..d99351b9b 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/ViewsPluginHandlerManagerRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/ViewsPluginHandlerManagerRectorTest.php @@ -4,7 +4,7 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ViewsPluginHandlerManagerRector; -use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Services\DrupalRectorSettings; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ViewsPluginHandlerManagerRectorTest extends AbstractRectorTestCase @@ -12,11 +12,11 @@ class ViewsPluginHandlerManagerRectorTest extends AbstractRectorTestCase #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } @@ -31,11 +31,11 @@ public static function provideData(): \Iterator #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] public function testBelowVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } diff --git a/tests/src/Rector/Deprecation/DeprecationBase.php b/tests/src/Rector/Deprecation/DeprecationBase.php index b324f1ffc..ded115bb0 100644 --- a/tests/src/Rector/Deprecation/DeprecationBase.php +++ b/tests/src/Rector/Deprecation/DeprecationBase.php @@ -4,7 +4,9 @@ namespace DrupalRector\Tests\Rector\Deprecation; +use DrupalRector\Rector\AbstractDrupalCoreRector; use DrupalRector\Services\AddCommentService; +use DrupalRector\Services\DrupalRectorSettings; use Rector\Config\RectorConfig; /** @@ -22,6 +24,12 @@ class DeprecationBase */ public static function addClass(string $rectorClass, RectorConfig $rectorConfig, bool $add_notice_config = true, array $configuration = []) { + $rectorConfig->singleton(DrupalRectorSettings::class); + $rectorConfig->afterResolving( + AbstractDrupalCoreRector::class, + fn ($rector, $container) => $rector->setDrupalRectorSettings($container->make(DrupalRectorSettings::class)) + ); + if ($add_notice_config) { $rectorConfig->singleton(AddCommentService::class, function () { return new AddCommentService(true); diff --git a/tests/src/Rector/Deprecation/FunctionToFirstArgMethodRector/FunctionToFirstArgMethodRectorTest.php b/tests/src/Rector/Deprecation/FunctionToFirstArgMethodRector/FunctionToFirstArgMethodRectorTest.php index 11e3c449d..87c872b2e 100644 --- a/tests/src/Rector/Deprecation/FunctionToFirstArgMethodRector/FunctionToFirstArgMethodRectorTest.php +++ b/tests/src/Rector/Deprecation/FunctionToFirstArgMethodRector/FunctionToFirstArgMethodRectorTest.php @@ -4,7 +4,7 @@ namespace DrupalRector\Tests\Rector\Deprecation\FunctionToFirstArgMethodRector; -use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Services\DrupalRectorSettings; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class FunctionToFirstArgMethodRectorTest extends AbstractRectorTestCase @@ -12,11 +12,11 @@ class FunctionToFirstArgMethodRectorTest extends AbstractRectorTestCase #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } @@ -31,11 +31,11 @@ public static function provideData(): \Iterator #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] public function testBelowVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } From 14dd167aefcf971765c0088de4fb49750e1b15cb Mon Sep 17 00:00:00 2001 From: bjorn Date: Sat, 9 May 2026 15:44:23 +0200 Subject: [PATCH 166/256] feat(Settings): register DrupalRectorSettings in rector.php and document in README The bundled rector.php now wires the singleton and afterResolving hook so users get settings support automatically on cp. BC is disabled by default. README documents the enableBackwardCompatibility() and setMinimumCoreVersionSupported() options for contrib module developers. --- README.md | 23 +++++++++++++++++++++++ rector.php | 19 +++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/README.md b/README.md index 62c0cf891..e49660ce4 100644 --- a/README.md +++ b/README.md @@ -96,6 +96,29 @@ $rectorConfig->sets([ This is more granular than the `Drupal9SetList::DRUPAL_9` set. +### DrupalRectorSettings + +The copied `rector.php` includes a `DrupalRectorSettings` block that controls two behaviours: + +**Backward-compatibility wrapping** — when enabled, rule results are wrapped in `DeprecationHelper::backwardsCompatibleCall()` so the code works on both the old and new Drupal API simultaneously. The default in `rector.php` is **disabled** (recommended for most projects). Enable it when you need the output to run on multiple Drupal versions at the same time: + +```php +$rectorConfig->singleton(DrupalRectorSettings::class, fn () => + (new DrupalRectorSettings()) + ->enableBackwardCompatibility() +); +``` + +**Minimum supported Drupal version** (contrib modules) — if you are running Rector against a contrib module that must stay compatible with an older Drupal release, set `minimumCoreVersionSupported` so BC wrappers are emitted correctly even when your development environment runs a newer Drupal: + +```php +$rectorConfig->singleton(DrupalRectorSettings::class, fn () => + (new DrupalRectorSettings()) + ->enableBackwardCompatibility() + ->setMinimumCoreVersionSupported('10.5.0') +); +``` + ## Suggested workflow 1. Analyze your code with Rector and review suggested changes: diff --git a/rector.php b/rector.php index 8d140f134..b6b258042 100644 --- a/rector.php +++ b/rector.php @@ -2,12 +2,15 @@ declare(strict_types=1); +use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Services\DrupalRectorSettings; use DrupalRector\Set\Drupal10SetList; use DrupalRector\Set\Drupal8SetList; use DrupalRector\Set\Drupal9SetList; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { + // Adjust the set lists to be more granular to your Drupal requirements. // @todo find out how to only load the relevant rector rules. // Should we try and load \Drupal::VERSION and check? @@ -19,6 +22,22 @@ Drupal10SetList::DRUPAL_10, ]); + // Configure DrupalRectorSettings to control rule behaviour. + // By default, backward-compatibility wrapping is disabled (recommended for + // projects that target a single Drupal version). Enable it if you need to + // support multiple Drupal versions simultaneously. + $rectorConfig->singleton(DrupalRectorSettings::class, fn () => + (new DrupalRectorSettings()) + ->disableBackwardCompatibility() + // Contrib module developers: set the minimum Drupal version your + // module needs to support so that BC wrappers are emitted correctly. + // Example: ->setMinimumCoreVersionSupported('10.5.0') + ); + $rectorConfig->afterResolving( + AbstractDrupalCoreRector::class, + fn ($rector, $container) => $rector->setDrupalRectorSettings($container->make(DrupalRectorSettings::class)) + ); + if (class_exists('DrupalFinder\DrupalFinderComposerRuntime')) { $drupalFinder = new DrupalFinder\DrupalFinderComposerRuntime(); } else { From 9c1e03a386513ef179edcf4507f852fcfc99fef3 Mon Sep 17 00:00:00 2001 From: bjorn Date: Sat, 9 May 2026 15:58:08 +0200 Subject: [PATCH 167/256] refactor(Settings): replace setter injection with constructor injection DrupalRectorSettings is now injected via the constructor following the same pattern as AddCommentService. Drops the afterResolving hook from DeprecationBase and rector.php; the container wires it automatically. --- rector.php | 5 ----- .../Deprecation/AnnotationToAttributeRector.php | 4 +++- .../Rector/Deprecation/SystemTimeZonesRector.php | 4 +++- src/Rector/AbstractDrupalCoreRector.php | 11 ++++------- tests/src/Rector/Deprecation/DeprecationBase.php | 5 ----- 5 files changed, 10 insertions(+), 19 deletions(-) diff --git a/rector.php b/rector.php index b6b258042..c8c2a6316 100644 --- a/rector.php +++ b/rector.php @@ -2,7 +2,6 @@ declare(strict_types=1); -use DrupalRector\Rector\AbstractDrupalCoreRector; use DrupalRector\Services\DrupalRectorSettings; use DrupalRector\Set\Drupal10SetList; use DrupalRector\Set\Drupal8SetList; @@ -33,10 +32,6 @@ // module needs to support so that BC wrappers are emitted correctly. // Example: ->setMinimumCoreVersionSupported('10.5.0') ); - $rectorConfig->afterResolving( - AbstractDrupalCoreRector::class, - fn ($rector, $container) => $rector->setDrupalRectorSettings($container->make(DrupalRectorSettings::class)) - ); if (class_exists('DrupalFinder\DrupalFinderComposerRuntime')) { $drupalFinder = new DrupalFinder\DrupalFinderComposerRuntime(); diff --git a/src/Drupal10/Rector/Deprecation/AnnotationToAttributeRector.php b/src/Drupal10/Rector/Deprecation/AnnotationToAttributeRector.php index 6c7bc649e..042be0328 100644 --- a/src/Drupal10/Rector/Deprecation/AnnotationToAttributeRector.php +++ b/src/Drupal10/Rector/Deprecation/AnnotationToAttributeRector.php @@ -7,6 +7,7 @@ use DrupalRector\Contract\VersionedConfigurationInterface; use DrupalRector\Drupal10\Rector\ValueObject\AnnotationToAttributeConfiguration; use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Services\DrupalRectorSettings; use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use PhpParser\Node; use PhpParser\Node\Arg; @@ -57,8 +58,9 @@ final class AnnotationToAttributeRector extends AbstractDrupalCoreRector impleme */ private AnnotationToAttributeMapper $annotationToAttributeMapper; - public function __construct(PhpDocTagRemover $phpDocTagRemover, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory, ArrayParser $arrayParser, TokenIteratorFactory $tokenIteratorFactory, AnnotationToAttributeMapper $annotationToAttributeMapper) + public function __construct(DrupalRectorSettings $drupalRectorSettings, PhpDocTagRemover $phpDocTagRemover, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory, ArrayParser $arrayParser, TokenIteratorFactory $tokenIteratorFactory, AnnotationToAttributeMapper $annotationToAttributeMapper) { + parent::__construct($drupalRectorSettings); $this->phpDocTagRemover = $phpDocTagRemover; $this->docBlockUpdater = $docBlockUpdater; $this->phpDocInfoFactory = $phpDocInfoFactory; diff --git a/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector.php b/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector.php index dde8da723..36a8d00e3 100644 --- a/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector.php +++ b/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector.php @@ -6,6 +6,7 @@ use DrupalRector\Contract\VersionedConfigurationInterface; use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Services\DrupalRectorSettings; use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use PhpParser\Node; use PhpParser\Node\Expr\ConstFetch; @@ -25,8 +26,9 @@ class SystemTimeZonesRector extends AbstractDrupalCoreRector */ private ValueResolver $valueResolver; - public function __construct(ValueResolver $valueResolver) + public function __construct(DrupalRectorSettings $drupalRectorSettings, ValueResolver $valueResolver) { + parent::__construct($drupalRectorSettings); $this->valueResolver = $valueResolver; } diff --git a/src/Rector/AbstractDrupalCoreRector.php b/src/Rector/AbstractDrupalCoreRector.php index f4247921a..2ac8b1061 100644 --- a/src/Rector/AbstractDrupalCoreRector.php +++ b/src/Rector/AbstractDrupalCoreRector.php @@ -16,16 +16,13 @@ abstract class AbstractDrupalCoreRector extends AbstractRector implements ConfigurableRectorInterface { - private ?DrupalRectorSettings $drupalRectorSettings = null; - /** * @var array|VersionedConfigurationInterface[] */ protected array $configuration = []; - public function setDrupalRectorSettings(DrupalRectorSettings $settings): void + public function __construct(private readonly DrupalRectorSettings $drupalRectorSettings) { - $this->drupalRectorSettings = $settings; } public function configure(array $configuration): void @@ -139,7 +136,7 @@ public function installedDrupalVersion(): string return str_replace([ '.x-dev', '-dev', - ], '.0', $this->drupalRectorSettings?->getDrupalVersion() ?? \Drupal::VERSION); + ], '.0', $this->drupalRectorSettings->getDrupalVersion() ?? \Drupal::VERSION); } /** @@ -156,11 +153,11 @@ public function installedDrupalVersion(): string */ public function supportBackwardsCompatibility(VersionedConfigurationInterface $configuration): bool { - if ($this->drupalRectorSettings !== null && !$this->drupalRectorSettings->isBackwardCompatibilityEnabled()) { + if (!$this->drupalRectorSettings->isBackwardCompatibilityEnabled()) { return false; } - $minimumVersion = $this->drupalRectorSettings?->getMinimumCoreVersionSupported() ?? $this->installedDrupalVersion(); + $minimumVersion = $this->drupalRectorSettings->getMinimumCoreVersionSupported(); return !(version_compare($minimumVersion, '10.1.0', '<') || version_compare($configuration->getIntroducedVersion(), '10.0.0', '<')); } diff --git a/tests/src/Rector/Deprecation/DeprecationBase.php b/tests/src/Rector/Deprecation/DeprecationBase.php index ded115bb0..bd9d514ea 100644 --- a/tests/src/Rector/Deprecation/DeprecationBase.php +++ b/tests/src/Rector/Deprecation/DeprecationBase.php @@ -4,7 +4,6 @@ namespace DrupalRector\Tests\Rector\Deprecation; -use DrupalRector\Rector\AbstractDrupalCoreRector; use DrupalRector\Services\AddCommentService; use DrupalRector\Services\DrupalRectorSettings; use Rector\Config\RectorConfig; @@ -25,10 +24,6 @@ class DeprecationBase public static function addClass(string $rectorClass, RectorConfig $rectorConfig, bool $add_notice_config = true, array $configuration = []) { $rectorConfig->singleton(DrupalRectorSettings::class); - $rectorConfig->afterResolving( - AbstractDrupalCoreRector::class, - fn ($rector, $container) => $rector->setDrupalRectorSettings($container->make(DrupalRectorSettings::class)) - ); if ($add_notice_config) { $rectorConfig->singleton(AddCommentService::class, function () { From f0d5eddb60bca41079fd4c7ceb5ad98549ee6f99 Mon Sep 17 00:00:00 2001 From: bjorn Date: Sat, 9 May 2026 18:45:11 +0200 Subject: [PATCH 168/256] refactor(BC): migrate 17 custom rectors to AbstractDrupalCoreRector with version-gating tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit All custom rectors that produce Expr → Expr transformations introduced in Drupal >= 10.1.0 now extend AbstractDrupalCoreRector and emit DeprecationHelper::backwardsCompatibleCall() wrappers when BC mode is active. Each rector gains testAboveVersion / testBelowVersion test methods backed by DrupalRectorSettings::setDrupalVersion(), plus fixture-below-version/ directories confirming no transformation fires below the introduced version. Two shallow-clone bugs fixed: - ReplaceFieldgroupToFieldsetRector: ArrayItem children must be cloned before mutating their value to avoid both BC sides showing the new string. - ReplacePdoFetchConstantsRector: Arg children must be cloned before replacing their value expression for the same reason. --- config/drupal-11/drupal-11.0-deprecations.php | 13 +++- config/drupal-11/drupal-11.1-deprecations.php | 4 +- config/drupal-11/drupal-11.2-deprecations.php | 20 ++++-- config/drupal-11/drupal-11.3-deprecations.php | 16 +++-- config/drupal-11/drupal-11.4-deprecations.php | 16 +++-- .../ReplaceRequestTimeConstantRector.php | 30 +++++++-- .../FileManagedFileSubmitRector.php | 33 +++++++-- ...ediaFilterFormatEditFormValidateRector.php | 35 +++++++--- ...rateSqlGetMigrationPluginManagerRector.php | 30 +++++++-- .../PluginBaseIsConfigurableRector.php | 30 +++++++-- .../RemoveConfigSaveTrustedDataArgRector.php | 36 +++++++--- .../RemoveRootFromConvertDbUrlRector.php | 35 +++++++--- .../RemoveTwigNodeTransTagArgumentRector.php | 36 +++++++--- .../ReplaceAlphadecimalToIntNullRector.php | 37 ++++++++-- ...aceEntityReferenceRecursiveLimitRector.php | 30 +++++++-- .../ReplaceFieldgroupToFieldsetRector.php | 39 ++++++++--- .../ReplaceNodeSetPreviewModeRector.php | 35 +++++++--- .../ReplacePdoFetchConstantsRector.php | 67 +++++++++++++++---- ...eSessionWritesWithRequestSessionRector.php | 30 +++++++-- .../ReplaceSystemPerformanceGzipKeyRector.php | 35 +++++++--- .../ReplaceTwigExtensionRector.php | 33 +++++++-- ...ipMigrationDependenciesExpandArgRector.php | 35 +++++++--- .../ReplaceRequestTimeConstantRectorTest.php | 29 +++++++- .../config/configured_rule.php | 6 +- .../fixture-below-version/basic.php.inc | 13 ++++ .../in_function_call.php.inc | 25 +++++++ .../fixture/basic.php.inc | 2 +- .../fixture/in_function_call.php.inc | 6 +- .../FileManagedFileSubmitRectorTest.php | 29 +++++++- .../config/configured_rule.php | 5 +- .../fixture-below-version/basic.php.inc | 15 +++++ .../fixture/basic.php.inc | 4 +- ...FilterFormatEditFormValidateRectorTest.php | 33 ++++++++- .../config/configured_rule.php | 5 +- .../fixture-below-version/basic.php.inc | 11 +++ .../fixture/basic.php.inc | 4 +- ...SqlGetMigrationPluginManagerRectorTest.php | 29 +++++++- .../config/configured_rule.php | 5 +- .../fixture-below-version/basic.php.inc | 29 ++++++++ .../chain_result.php.inc | 27 ++++++++ .../fixture-below-version/parent_call.php.inc | 29 ++++++++ .../fixture/basic.php.inc | 2 +- .../fixture/chain_result.php.inc | 2 +- .../fixture/parent_call.php.inc | 2 +- .../PluginBaseIsConfigurableRectorTest.php | 29 +++++++- .../config/configured_rule.php | 5 +- .../fixture-below-version/basic.php.inc | 25 +++++++ .../fixture-below-version/negated.php.inc | 27 ++++++++ .../property_delegation.php.inc | 35 ++++++++++ .../fixture/basic.php.inc | 2 +- .../fixture/negated.php.inc | 4 +- .../fixture/property_delegation.php.inc | 2 +- ...moveConfigSaveTrustedDataArgRectorTest.php | 29 +++++++- .../config/configured_rule.php | 5 +- .../fixture-below-version/basic.php.inc | 23 +++++++ .../fixture/basic.php.inc | 4 +- .../RemoveRootFromConvertDbUrlRectorTest.php | 29 +++++++- .../config/configured_rule.php | 5 +- .../fixture-below-version/basic.php.inc | 25 +++++++ .../method_call_second_arg.php.inc | 19 ++++++ .../three_args_property_fetch.php.inc | 17 +++++ .../two_args_property_fetch.php.inc | 17 +++++ .../two_args_string.php.inc | 17 +++++ .../fixture/basic.php.inc | 2 +- .../fixture/method_call_second_arg.php.inc | 4 +- .../fixture/three_args_property_fetch.php.inc | 2 +- .../fixture/two_args_property_fetch.php.inc | 2 +- .../fixture/two_args_string.php.inc | 2 +- ...moveTwigNodeTransTagArgumentRectorTest.php | 29 +++++++- .../config/configured_rule.php | 5 +- .../aliased_import.php.inc | 19 ++++++ .../fixture-below-version/basic.php.inc | 17 +++++ .../fixture-below-version/fqcn.php.inc | 13 ++++ .../fixture/aliased_import.php.inc | 2 +- .../fixture/basic.php.inc | 2 +- .../fixture/fqcn.php.inc | 2 +- ...ReplaceAlphadecimalToIntNullRectorTest.php | 29 +++++++- .../config/configured_rule.php | 5 +- .../fixture-below-version/basic.php.inc | 21 ++++++ .../fixture-below-version/fqcn.php.inc | 15 +++++ .../inline_usage.php.inc | 19 ++++++ .../fixture/basic.php.inc | 4 +- .../fixture/fqcn.php.inc | 4 +- .../fixture/inline_usage.php.inc | 4 +- ...ntityReferenceRecursiveLimitRectorTest.php | 29 +++++++- .../config/configured_rule.php | 6 +- .../aliased_import.php.inc | 17 +++++ .../fixture-below-version/basic.php.inc | 23 +++++++ .../in_function_call.php.inc | 23 +++++++ .../fixture-below-version/in_ternary.php.inc | 23 +++++++ .../fixture/aliased_import.php.inc | 2 +- .../fixture/basic.php.inc | 4 +- .../fixture/in_function_call.php.inc | 4 +- .../fixture/in_ternary.php.inc | 4 +- .../ReplaceFieldgroupToFieldsetRectorTest.php | 29 +++++++- .../config/configured_rule.php | 5 +- .../fixture-below-version/basic.php.inc | 25 +++++++ .../deeply_nested.php.inc | 21 ++++++ .../fixture/basic.php.inc | 7 +- .../fixture/deeply_nested.php.inc | 8 ++- .../ReplaceNodeSetPreviewModeRectorTest.php | 29 +++++++- .../config/configured_rule.php | 6 +- .../fixture-below-version/basic.php.inc | 23 +++++++ .../fixture/basic.php.inc | 12 ++-- .../ReplacePdoFetchConstantsRectorTest.php | 29 +++++++- .../config/configured_rule.php | 5 +- .../fixture-below-version/basic.php.inc | 23 +++++++ .../fetch_column_and_class.php.inc | 15 +++++ .../no_type_guard_native_pdo.php.inc | 17 +++++ .../fixture/basic.php.inc | 8 +-- .../fixture/fetch_column_and_class.php.inc | 6 +- .../fixture/no_type_guard_native_pdo.php.inc | 2 +- ...sionWritesWithRequestSessionRectorTest.php | 29 +++++++- .../config/configured_rule.php | 5 +- .../fixture-below-version/basic.php.inc | 15 +++++ .../fixture-below-version/in_function.php.inc | 17 +++++ .../fixture/basic.php.inc | 4 +- .../fixture/in_function.php.inc | 4 +- ...laceSystemPerformanceGzipKeyRectorTest.php | 29 +++++++- .../config/configured_rule.php | 5 +- .../fixture-below-version/basic.php.inc | 19 ++++++ .../fixture-below-version/set_js_gzip.php.inc | 13 ++++ .../fixture-below-version/this_config.php.inc | 15 +++++ .../fixture/basic.php.inc | 6 +- .../fixture/set_js_gzip.php.inc | 4 +- .../fixture/this_config.php.inc | 6 +- .../ReplaceTwigExtensionRectorTest.php | 31 ++++++++- .../config/configured_rule.php | 5 +- .../fixture-below-version/basic.php.inc | 9 +++ .../fixture/basic.php.inc | 2 +- ...grationDependenciesExpandArgRectorTest.php | 29 +++++++- .../config/configured_rule.php | 6 +- .../fixture-below-version/basic.php.inc | 17 +++++ .../fixture-below-version/false_arg.php.inc | 15 +++++ .../fixture/basic.php.inc | 2 +- .../fixture/false_arg.php.inc | 2 +- 136 files changed, 1932 insertions(+), 270 deletions(-) create mode 100644 tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/fixture-below-version/in_function_call.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/FileManagedFileSubmitRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/MediaFilterFormatEditFormValidateRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/fixture-below-version/chain_result.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/fixture-below-version/parent_call.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture-below-version/negated.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture-below-version/property_delegation.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture-below-version/method_call_second_arg.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture-below-version/three_args_property_fetch.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture-below-version/two_args_property_fetch.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture-below-version/two_args_string.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/fixture-below-version/aliased_import.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/fixture-below-version/fqcn.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/fixture-below-version/fqcn.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/fixture-below-version/inline_usage.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture-below-version/aliased_import.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture-below-version/in_function_call.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture-below-version/in_ternary.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/fixture-below-version/deeply_nested.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture-below-version/fetch_column_and_class.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture-below-version/no_type_guard_native_pdo.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/fixture-below-version/in_function.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/fixture-below-version/set_js_gzip.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/fixture-below-version/this_config.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceTwigExtensionRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/fixture-below-version/false_arg.php.inc diff --git a/config/drupal-11/drupal-11.0-deprecations.php b/config/drupal-11/drupal-11.0-deprecations.php index 976d5722a..8e16d8ccc 100644 --- a/config/drupal-11/drupal-11.0-deprecations.php +++ b/config/drupal-11/drupal-11.0-deprecations.php @@ -6,6 +6,7 @@ use DrupalRector\Drupal11\Rector\Deprecation\MigrateSqlGetMigrationPluginManagerRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveStateCacheSettingRector; use DrupalRector\Drupal11\Rector\Deprecation\StripMigrationDependenciesExpandArgRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { @@ -18,17 +19,23 @@ // https://www.drupal.org/node/3395986 // REQUEST_TIME constant deprecated in drupal:8.3.0, removed in drupal:11.0.0. // Replaced by \Drupal::time()->getRequestTime(). - $rectorConfig->rule(ReplaceRequestTimeConstantRector::class); + $rectorConfig->ruleWithConfiguration(ReplaceRequestTimeConstantRector::class, [ + new DrupalIntroducedVersionConfiguration('11.0.0'), + ]); // https://www.drupal.org/node/3574717 // https://www.drupal.org/node/3442785 (change record) // getMigrationDependencies($expand) deprecated in drupal:11.0.0, removed in drupal:12.0.0. // The $expand boolean argument is removed; call without arguments. - $rectorConfig->rule(StripMigrationDependenciesExpandArgRector::class); + $rectorConfig->ruleWithConfiguration(StripMigrationDependenciesExpandArgRector::class, [ + new DrupalIntroducedVersionConfiguration('11.0.0'), + ]); // https://www.drupal.org/node/3439369 // https://www.drupal.org/node/3282894 (change record) // Sql::getMigrationPluginManager() deprecated in drupal:9.5.0, removed in drupal:11.0.0. // Replaced by $this->migrationPluginManager property access. - $rectorConfig->rule(MigrateSqlGetMigrationPluginManagerRector::class); + $rectorConfig->ruleWithConfiguration(MigrateSqlGetMigrationPluginManagerRector::class, [ + new DrupalIntroducedVersionConfiguration('11.0.0'), + ]); }; diff --git a/config/drupal-11/drupal-11.1-deprecations.php b/config/drupal-11/drupal-11.1-deprecations.php index dfb8eea23..00f94957a 100644 --- a/config/drupal-11/drupal-11.1-deprecations.php +++ b/config/drupal-11/drupal-11.1-deprecations.php @@ -19,7 +19,9 @@ // https://www.drupal.org/node/2946122 (change record) // PluginBase::isConfigurable() deprecated in drupal:11.1.0, removed in drupal:12.0.0. // Replaced by instanceof \Drupal\Component\Plugin\ConfigurableInterface. - $rectorConfig->rule(PluginBaseIsConfigurableRector::class); + $rectorConfig->ruleWithConfiguration(PluginBaseIsConfigurableRector::class, [ + new DrupalIntroducedVersionConfiguration('11.1.0'), + ]); // https://www.drupal.org/node/3151086 // AliasWhitelist and AliasWhitelistInterface deprecated in drupal:11.1.0, removed in drupal:12.0.0. diff --git a/config/drupal-11/drupal-11.2-deprecations.php b/config/drupal-11/drupal-11.2-deprecations.php index 0a2c704d4..8e4453bb2 100644 --- a/config/drupal-11/drupal-11.2-deprecations.php +++ b/config/drupal-11/drupal-11.2-deprecations.php @@ -125,25 +125,33 @@ // https://www.drupal.org/node/3474692 (change record) // TwigNodeTrans 6th $tag constructor argument deprecated in twig/twig 3.12, removed in drupal:11.2.0. // Drop the argument. - $rectorConfig->rule(RemoveTwigNodeTransTagArgumentRector::class); + $rectorConfig->ruleWithConfiguration(RemoveTwigNodeTransTagArgumentRector::class, [ + new DrupalIntroducedVersionConfiguration('11.2.0'), + ]); // https://www.drupal.org/node/3442810 // https://www.drupal.org/node/3494472 (change record) // Number::alphadecimalToInt(null/'') deprecated in drupal:11.2.0, removed in drupal:12.0.0. // Both arguments always produced 0; replaced with literal 0. - $rectorConfig->rule(ReplaceAlphadecimalToIntNullRector::class); + $rectorConfig->ruleWithConfiguration(ReplaceAlphadecimalToIntNullRector::class, [ + new DrupalIntroducedVersionConfiguration('11.2.0'), + ]); // https://www.drupal.org/node/3512254 // https://www.drupal.org/node/3515272 (change record) // #type 'fieldgroup' deprecated in drupal:11.2.0, removed in drupal:12.0.0. // Replaced by 'fieldset'. - $rectorConfig->rule(ReplaceFieldgroupToFieldsetRector::class); + $rectorConfig->ruleWithConfiguration(ReplaceFieldgroupToFieldsetRector::class, [ + new DrupalIntroducedVersionConfiguration('11.2.0'), + ]); // https://www.drupal.org/node/3525077 // https://www.drupal.org/node/3488338 (change record) // PDO::FETCH_* constants deprecated in drupal:11.2.0, removed in drupal:12.0.0. // Replaced by \Drupal\Core\Database\Statement\FetchAs enum cases. - $rectorConfig->rule(ReplacePdoFetchConstantsRector::class); + $rectorConfig->ruleWithConfiguration(ReplacePdoFetchConstantsRector::class, [ + new DrupalIntroducedVersionConfiguration('11.2.0'), + ]); // https://www.drupal.org/node/3574901 // DateTimeRangeConstantsInterface::BOTH/START_DATE/END_DATE deprecated in drupal:11.2.0, removed in drupal:12.0.0. @@ -165,7 +173,9 @@ // https://www.drupal.org/node/3518914 (change record) // $_SESSION['key'] = $value deprecated in drupal:11.2.0. // Replaced by \Drupal::request()->getSession()->set('key', $value). - $rectorConfig->rule(ReplaceSessionWritesWithRequestSessionRector::class); + $rectorConfig->ruleWithConfiguration(ReplaceSessionWritesWithRequestSessionRector::class, [ + new DrupalIntroducedVersionConfiguration('11.2.0'), + ]); // https://www.drupal.org/node/3447794 // https://www.drupal.org/node/3509245 (change record) diff --git a/config/drupal-11/drupal-11.3-deprecations.php b/config/drupal-11/drupal-11.3-deprecations.php index 5946ef7fd..2011dee97 100644 --- a/config/drupal-11/drupal-11.3-deprecations.php +++ b/config/drupal-11/drupal-11.3-deprecations.php @@ -74,7 +74,9 @@ // https://www.drupal.org/node/1685492 // twig_extension() deprecated in drupal:11.3.0, removed in drupal:12.0.0. // Replaced by the '.html.twig' string literal. - $rectorConfig->rule(ReplaceTwigExtensionRector::class); + $rectorConfig->ruleWithConfiguration(ReplaceTwigExtensionRector::class, [ + new DrupalIntroducedVersionConfiguration('11.3.0'), + ]); $rectorConfig->ruleWithConfiguration(ReplaceNodeModuleProceduralFunctionsRector::class, [ new DrupalIntroducedVersionConfiguration('11.3.0'), ]); @@ -144,7 +146,9 @@ // https://www.drupal.org/node/3534091 (change record) // 'file_managed_file_submit' string callback deprecated in drupal:11.3.0, removed in drupal:12.0.0. // Replaced by [\Drupal\file\Element\ManagedFile::class, 'submit'] array callable. - $rectorConfig->rule(FileManagedFileSubmitRector::class); + $rectorConfig->ruleWithConfiguration(FileManagedFileSubmitRector::class, [ + new DrupalIntroducedVersionConfiguration('11.3.0'), + ]); // https://www.drupal.org/node/3495600 // JSONAPI_FILTER_AMONG_* global constants deprecated in drupal:11.3.0, removed in drupal:13.0.0. @@ -161,7 +165,9 @@ // DRUPAL_DISABLED/OPTIONAL/REQUIRED constants (and integers 0/1/2) in setPreviewMode() // deprecated in drupal:11.3.0, removed in drupal:13.0.0. // Replaced by NodePreviewMode enum cases. - $rectorConfig->rule(ReplaceNodeSetPreviewModeRector::class); + $rectorConfig->ruleWithConfiguration(ReplaceNodeSetPreviewModeRector::class, [ + new DrupalIntroducedVersionConfiguration('11.3.0'), + ]); // https://www.drupal.org/node/3530461 // https://www.drupal.org/node/3530869 (change record) @@ -190,7 +196,9 @@ // https://www.drupal.org/node/3511287 (change record) // Database::convertDbUrlToConnectionInfo($url, $root, ...) deprecated in drupal:11.3.0, removed in drupal:12.0.0. // The $root parameter is obsolete; remove it (shift any $include_test_drivers arg left). - $rectorConfig->rule(RemoveRootFromConvertDbUrlRector::class); + $rectorConfig->ruleWithConfiguration(RemoveRootFromConvertDbUrlRector::class, [ + new DrupalIntroducedVersionConfiguration('11.3.0'), + ]); // https://www.drupal.org/node/3551446 // workspaces.association service and WorkspaceAssociationInterface renamed in drupal:11.3.0. diff --git a/config/drupal-11/drupal-11.4-deprecations.php b/config/drupal-11/drupal-11.4-deprecations.php index 806886385..d49a6736e 100644 --- a/config/drupal-11/drupal-11.4-deprecations.php +++ b/config/drupal-11/drupal-11.4-deprecations.php @@ -70,7 +70,9 @@ // https://www.drupal.org/node/3566774 (change record) // media_filter_format_edit_form_validate() deprecated in drupal:11.4.0, removed in drupal:12.0.0. // Replaced by \Drupal\media\Hook\MediaHooks::formatEditFormValidate(). - $rectorConfig->rule(MediaFilterFormatEditFormValidateRector::class); + $rectorConfig->ruleWithConfiguration(MediaFilterFormatEditFormValidateRector::class, [ + new DrupalIntroducedVersionConfiguration('11.4.0'), + ]); // https://www.drupal.org/node/3226806 // https://www.drupal.org/node/3566536 (change record) @@ -245,7 +247,9 @@ // https://www.drupal.org/node/3526344 (change record) // system.performance css.gzip and js.gzip config keys deprecated in drupal:11.4.0, removed in drupal:12.0.0. // Replaced by css.compress and js.compress. - $rectorConfig->rule(ReplaceSystemPerformanceGzipKeyRector::class); + $rectorConfig->ruleWithConfiguration(ReplaceSystemPerformanceGzipKeyRector::class, [ + new DrupalIntroducedVersionConfiguration('11.4.0'), + ]); // https://www.drupal.org/node/3564937 // https://www.drupal.org/node/3564958 (change record) @@ -266,7 +270,9 @@ $rectorConfig->ruleWithConfiguration(RemoveTrustDataCallRector::class, [ new DrupalIntroducedVersionConfiguration('11.4.0'), ]); - $rectorConfig->rule(RemoveConfigSaveTrustedDataArgRector::class); + $rectorConfig->ruleWithConfiguration(RemoveConfigSaveTrustedDataArgRector::class, [ + new DrupalIntroducedVersionConfiguration('11.4.0'), + ]); // https://www.drupal.org/node/3093118 // https://www.drupal.org/node/3554139 (change record) @@ -367,5 +373,7 @@ // https://www.drupal.org/node/2940605 // EntityReferenceEntityFormatter::RECURSIVE_RENDER_LIMIT deprecated in drupal:11.4.0, removed in drupal:13.0.0. // Replaced by literal 20. - $rectorConfig->rule(ReplaceEntityReferenceRecursiveLimitRector::class); + $rectorConfig->ruleWithConfiguration(ReplaceEntityReferenceRecursiveLimitRector::class, [ + new DrupalIntroducedVersionConfiguration('11.4.0'), + ]); }; diff --git a/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector.php b/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector.php index 353f2b146..cfe5a079e 100644 --- a/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector.php +++ b/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector.php @@ -4,9 +4,11 @@ namespace DrupalRector\Drupal10\Rector\Deprecation; +use DrupalRector\Contract\VersionedConfigurationInterface; +use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use PhpParser\Node; -use Rector\Rector\AbstractRector; -use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; +use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -16,14 +18,29 @@ * * @see https://www.drupal.org/node/3395986 */ -final class ReplaceRequestTimeConstantRector extends AbstractRector +final class ReplaceRequestTimeConstantRector extends AbstractDrupalCoreRector { + /** + * @var array|DrupalIntroducedVersionConfiguration[] + */ + protected array $configuration; + + public function configure(array $configuration): void + { + foreach ($configuration as $value) { + if (!$value instanceof DrupalIntroducedVersionConfiguration) { + throw new \InvalidArgumentException(sprintf('Each configuration item must be an instance of "%s"', DrupalIntroducedVersionConfiguration::class)); + } + } + parent::configure($configuration); + } + public function getNodeTypes(): array { return [Node\Expr\ConstFetch::class]; } - public function refactor(Node $node): ?Node + protected function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { assert($node instanceof Node\Expr\ConstFetch); @@ -42,9 +59,10 @@ public function refactor(Node $node): ?Node public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Replace deprecated REQUEST_TIME constant with \\Drupal::time()->getRequestTime() (deprecated drupal:8.3.0, removed drupal:11.0.0)', [ - new CodeSample( + new ConfiguredCodeSample( '$cutoff = REQUEST_TIME - $lifespan;', - '$cutoff = \\Drupal::time()->getRequestTime() - $lifespan;' + '$cutoff = \\Drupal::time()->getRequestTime() - $lifespan;', + [new DrupalIntroducedVersionConfiguration('11.0.0')] ), ]); } diff --git a/src/Drupal11/Rector/Deprecation/FileManagedFileSubmitRector.php b/src/Drupal11/Rector/Deprecation/FileManagedFileSubmitRector.php index af58706be..2c13ec158 100644 --- a/src/Drupal11/Rector/Deprecation/FileManagedFileSubmitRector.php +++ b/src/Drupal11/Rector/Deprecation/FileManagedFileSubmitRector.php @@ -4,14 +4,16 @@ namespace DrupalRector\Drupal11\Rector\Deprecation; +use DrupalRector\Contract\VersionedConfigurationInterface; +use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use PhpParser\Node; use PhpParser\Node\Expr\Array_; use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\ClassConstFetch; use PhpParser\Node\Name\FullyQualified; use PhpParser\Node\Scalar\String_; -use Rector\Rector\AbstractRector; -use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; +use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -21,24 +23,40 @@ * @see https://www.drupal.org/node/3534089 * @see https://www.drupal.org/node/3534091 */ -class FileManagedFileSubmitRector extends AbstractRector +final class FileManagedFileSubmitRector extends AbstractDrupalCoreRector { private const DEPRECATED_FUNCTION = 'file_managed_file_submit'; private const NEW_CLASS = 'Drupal\\file\\Element\\ManagedFile'; private const NEW_METHOD = 'submit'; + /** + * @var array|DrupalIntroducedVersionConfiguration[] + */ + protected array $configuration; + + public function configure(array $configuration): void + { + foreach ($configuration as $value) { + if (!$value instanceof DrupalIntroducedVersionConfiguration) { + throw new \InvalidArgumentException(sprintf('Each configuration item must be an instance of "%s"', DrupalIntroducedVersionConfiguration::class)); + } + } + parent::configure($configuration); + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( "Replace deprecated 'file_managed_file_submit' string callback with [\\Drupal\\file\\Element\\ManagedFile::class, 'submit'] array callable", [ - new CodeSample( + new ConfiguredCodeSample( <<<'CODE_BEFORE' $form['upload']['#submit'] = ['file_managed_file_submit']; CODE_BEFORE, <<<'CODE_AFTER' $form['upload']['#submit'] = [[\Drupal\file\Element\ManagedFile::class, 'submit']]; -CODE_AFTER +CODE_AFTER, + [new DrupalIntroducedVersionConfiguration('11.3.0')] ), ] ); @@ -50,9 +68,10 @@ public function getNodeTypes(): array return [String_::class]; } - /** @param String_ $node */ - public function refactor(Node $node): ?Node + protected function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { + assert($node instanceof String_); + if ($node->value !== self::DEPRECATED_FUNCTION) { return null; } diff --git a/src/Drupal11/Rector/Deprecation/MediaFilterFormatEditFormValidateRector.php b/src/Drupal11/Rector/Deprecation/MediaFilterFormatEditFormValidateRector.php index e59f36a52..965e62aff 100644 --- a/src/Drupal11/Rector/Deprecation/MediaFilterFormatEditFormValidateRector.php +++ b/src/Drupal11/Rector/Deprecation/MediaFilterFormatEditFormValidateRector.php @@ -4,6 +4,9 @@ namespace DrupalRector\Drupal11\Rector\Deprecation; +use DrupalRector\Contract\VersionedConfigurationInterface; +use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use PhpParser\Node; use PhpParser\Node\Arg; use PhpParser\Node\Expr\Array_; @@ -15,8 +18,7 @@ use PhpParser\Node\Name; use PhpParser\Node\Name\FullyQualified; use PhpParser\Node\Scalar\String_; -use Rector\Rector\AbstractRector; -use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; +use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -27,19 +29,34 @@ * @see https://www.drupal.org/node/3568124 * @see https://www.drupal.org/node/3566774 */ -class MediaFilterFormatEditFormValidateRector extends AbstractRector +final class MediaFilterFormatEditFormValidateRector extends AbstractDrupalCoreRector { private const DEPRECATED_FUNCTION = 'media_filter_format_edit_form_validate'; private const MEDIA_HOOKS_CLASS = 'Drupal\media\Hook\MediaHooks'; + /** + * @var array|DrupalIntroducedVersionConfiguration[] + */ + protected array $configuration; + + public function configure(array $configuration): void + { + foreach ($configuration as $value) { + if (!$value instanceof DrupalIntroducedVersionConfiguration) { + throw new \InvalidArgumentException(sprintf('Each configuration item must be an instance of "%s"', DrupalIntroducedVersionConfiguration::class)); + } + } + parent::configure($configuration); + } + /** @return array> */ public function getNodeTypes(): array { return [FuncCall::class, String_::class]; } - public function refactor(Node $node): ?Node + protected function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { if ($node instanceof FuncCall) { if (!$node->name instanceof Name || $node->name->toString() !== self::DEPRECATED_FUNCTION) { @@ -74,13 +91,15 @@ public function getRuleDefinition(): RuleDefinition return new RuleDefinition( 'Replace deprecated media_filter_format_edit_form_validate() with \Drupal\media\Hook\MediaHooks::formatEditFormValidate().', [ - new CodeSample( + new ConfiguredCodeSample( 'media_filter_format_edit_form_validate($form, $form_state);', - '\Drupal::service(\Drupal\media\Hook\MediaHooks::class)->formatEditFormValidate($form, $form_state);' + '\Drupal::service(\Drupal\media\Hook\MediaHooks::class)->formatEditFormValidate($form, $form_state);', + [new DrupalIntroducedVersionConfiguration('11.4.0')] ), - new CodeSample( + new ConfiguredCodeSample( "\$form['#validate'][] = 'media_filter_format_edit_form_validate';", - "\$form['#validate'][] = [\\Drupal\\media\\Hook\\MediaHooks::class, 'formatEditFormValidate'];" + "\$form['#validate'][] = [\\Drupal\\media\\Hook\\MediaHooks::class, 'formatEditFormValidate'];", + [new DrupalIntroducedVersionConfiguration('11.4.0')] ), ] ); diff --git a/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector.php b/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector.php index 7ab4d3a57..892b09bb5 100644 --- a/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector.php +++ b/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector.php @@ -4,6 +4,9 @@ namespace DrupalRector\Drupal11\Rector\Deprecation; +use DrupalRector\Contract\VersionedConfigurationInterface; +use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use PhpParser\Node; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\PropertyFetch; @@ -11,8 +14,7 @@ use PhpParser\Node\Expr\Variable; use PhpParser\Node\Name; use PHPStan\Type\ObjectType; -use Rector\Rector\AbstractRector; -use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; +use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -24,16 +26,32 @@ * @see https://www.drupal.org/node/3439369 * @see https://www.drupal.org/node/3282894 */ -final class MigrateSqlGetMigrationPluginManagerRector extends AbstractRector +final class MigrateSqlGetMigrationPluginManagerRector extends AbstractDrupalCoreRector { + /** + * @var array|DrupalIntroducedVersionConfiguration[] + */ + protected array $configuration; + + public function configure(array $configuration): void + { + foreach ($configuration as $value) { + if (!$value instanceof DrupalIntroducedVersionConfiguration) { + throw new \InvalidArgumentException(sprintf('Each configuration item must be an instance of "%s"', DrupalIntroducedVersionConfiguration::class)); + } + } + parent::configure($configuration); + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( 'Replace deprecated Sql::getMigrationPluginManager() with $this->migrationPluginManager', [ - new CodeSample( + new ConfiguredCodeSample( '$manager = $this->getMigrationPluginManager();', - '$manager = $this->migrationPluginManager;' + '$manager = $this->migrationPluginManager;', + [new DrupalIntroducedVersionConfiguration('11.0.0')] ), ] ); @@ -45,7 +63,7 @@ public function getNodeTypes(): array return [MethodCall::class, StaticCall::class]; } - public function refactor(Node $node): ?Node + protected function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { if ($node instanceof StaticCall) { return $this->refactorStaticCall($node); diff --git a/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector.php b/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector.php index 3963e480e..17448f978 100644 --- a/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector.php +++ b/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector.php @@ -4,10 +4,12 @@ namespace DrupalRector\Drupal11\Rector\Deprecation; +use DrupalRector\Contract\VersionedConfigurationInterface; +use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use PhpParser\Node; use PHPStan\Type\ObjectType; -use Rector\Rector\AbstractRector; -use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; +use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -16,14 +18,29 @@ * @see https://www.drupal.org/node/3459533 * @see https://www.drupal.org/node/2946122 */ -final class PluginBaseIsConfigurableRector extends AbstractRector +final class PluginBaseIsConfigurableRector extends AbstractDrupalCoreRector { + /** + * @var array|DrupalIntroducedVersionConfiguration[] + */ + protected array $configuration; + + public function configure(array $configuration): void + { + foreach ($configuration as $value) { + if (!$value instanceof DrupalIntroducedVersionConfiguration) { + throw new \InvalidArgumentException(sprintf('Each configuration item must be an instance of "%s"', DrupalIntroducedVersionConfiguration::class)); + } + } + parent::configure($configuration); + } + public function getNodeTypes(): array { return [Node\Expr\MethodCall::class]; } - public function refactor(Node $node): ?Node + protected function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { if (!$node instanceof Node\Expr\MethodCall) { return null; @@ -50,9 +67,10 @@ public function refactor(Node $node): ?Node public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Replaces deprecated PluginBase::isConfigurable() with instanceof ConfigurableInterface', [ - new CodeSample( + new ConfiguredCodeSample( '$this->isConfigurable()', - '$this instanceof \Drupal\Component\Plugin\ConfigurableInterface' + '$this instanceof \Drupal\Component\Plugin\ConfigurableInterface', + [new DrupalIntroducedVersionConfiguration('11.1.0')] ), ]); } diff --git a/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector.php b/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector.php index 04aaa3d52..afad34fa3 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector.php @@ -4,13 +4,15 @@ namespace DrupalRector\Drupal11\Rector\Deprecation; +use DrupalRector\Contract\VersionedConfigurationInterface; +use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use PhpParser\Node; use PhpParser\Node\Arg; use PhpParser\Node\Expr\ConstFetch; use PhpParser\Node\Expr\MethodCall; use PHPStan\Type\ObjectType; -use Rector\Rector\AbstractRector; -use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; +use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -22,16 +24,32 @@ * @see https://www.drupal.org/node/3347842 * @see https://www.drupal.org/node/3348180 */ -final class RemoveConfigSaveTrustedDataArgRector extends AbstractRector +final class RemoveConfigSaveTrustedDataArgRector extends AbstractDrupalCoreRector { + /** + * @var array|DrupalIntroducedVersionConfiguration[] + */ + protected array $configuration; + + public function configure(array $configuration): void + { + foreach ($configuration as $value) { + if (!$value instanceof DrupalIntroducedVersionConfiguration) { + throw new \InvalidArgumentException(sprintf('Each configuration item must be an instance of "%s"', DrupalIntroducedVersionConfiguration::class)); + } + } + parent::configure($configuration); + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( 'Remove deprecated boolean $has_trusted_data argument from Config::save() calls', [ - new CodeSample( + new ConfiguredCodeSample( '$config->save(TRUE);', - '$config->save();' + '$config->save();', + [new DrupalIntroducedVersionConfiguration('11.4.0')] ), ] ); @@ -43,7 +61,7 @@ public function getNodeTypes(): array return [MethodCall::class]; } - public function refactor(Node $node): ?Node + protected function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { assert($node instanceof MethodCall); if (!$this->isName($node->name, 'save')) { @@ -66,8 +84,10 @@ public function refactor(Node $node): ?Node if ($constName !== 'true' && $constName !== 'false') { return null; } - $node->args = []; - return $node; + $cloned = clone $node; + $cloned->args = []; + + return $cloned; } } diff --git a/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector.php b/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector.php index b46c6f845..d69cdbd72 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector.php @@ -4,6 +4,9 @@ namespace DrupalRector\Drupal11\Rector\Deprecation; +use DrupalRector\Contract\VersionedConfigurationInterface; +use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use PhpParser\Node; use PhpParser\Node\Arg; use PhpParser\Node\Expr\ConstFetch; @@ -15,8 +18,7 @@ use PhpParser\Node\Expr\StaticPropertyFetch; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Scalar\String_; -use Rector\Rector\AbstractRector; -use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; +use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -28,16 +30,32 @@ * @see https://www.drupal.org/node/3522513 * @see https://www.drupal.org/node/3511287 */ -final class RemoveRootFromConvertDbUrlRector extends AbstractRector +final class RemoveRootFromConvertDbUrlRector extends AbstractDrupalCoreRector { + /** + * @var array|DrupalIntroducedVersionConfiguration[] + */ + protected array $configuration; + + public function configure(array $configuration): void + { + foreach ($configuration as $value) { + if (!$value instanceof DrupalIntroducedVersionConfiguration) { + throw new \InvalidArgumentException(sprintf('Each configuration item must be an instance of "%s"', DrupalIntroducedVersionConfiguration::class)); + } + } + parent::configure($configuration); + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( 'Remove deprecated string $root argument from Database::convertDbUrlToConnectionInfo()', [ - new CodeSample( + new ConfiguredCodeSample( 'Database::convertDbUrlToConnectionInfo($url, $this->root, TRUE);', - 'Database::convertDbUrlToConnectionInfo($url, TRUE);' + 'Database::convertDbUrlToConnectionInfo($url, TRUE);', + [new DrupalIntroducedVersionConfiguration('11.3.0')] ), ] ); @@ -49,7 +67,7 @@ public function getNodeTypes(): array return [StaticCall::class]; } - public function refactor(Node $node): ?Node + protected function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { assert($node instanceof StaticCall); if (!$this->isName($node->class, 'Drupal\Core\Database\Database')) { @@ -86,8 +104,9 @@ public function refactor(Node $node): ?Node return null; } - array_splice($node->args, 1, 1); + $cloned = clone $node; + array_splice($cloned->args, 1, 1); - return $node; + return $cloned; } } diff --git a/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector.php b/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector.php index eb5e16d20..c754fc175 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector.php @@ -4,11 +4,13 @@ namespace DrupalRector\Drupal11\Rector\Deprecation; +use DrupalRector\Contract\VersionedConfigurationInterface; +use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use PhpParser\Node; use PhpParser\Node\Expr\New_; use PhpParser\Node\Name; -use Rector\Rector\AbstractRector; -use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; +use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -20,16 +22,32 @@ * @see https://www.drupal.org/node/3473440 * @see https://www.drupal.org/node/3474692 */ -final class RemoveTwigNodeTransTagArgumentRector extends AbstractRector +final class RemoveTwigNodeTransTagArgumentRector extends AbstractDrupalCoreRector { + /** + * @var array|DrupalIntroducedVersionConfiguration[] + */ + protected array $configuration; + + public function configure(array $configuration): void + { + foreach ($configuration as $value) { + if (!$value instanceof DrupalIntroducedVersionConfiguration) { + throw new \InvalidArgumentException(sprintf('Each configuration item must be an instance of "%s"', DrupalIntroducedVersionConfiguration::class)); + } + } + parent::configure($configuration); + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( 'Remove the deprecated 6th $tag argument from TwigNodeTrans constructor calls', [ - new CodeSample( + new ConfiguredCodeSample( 'new TwigNodeTrans($body, $plural, $count, $options, $lineno, $this->getTag());', - 'new TwigNodeTrans($body, $plural, $count, $options, $lineno);' + 'new TwigNodeTrans($body, $plural, $count, $options, $lineno);', + [new DrupalIntroducedVersionConfiguration('11.2.0')] ), ] ); @@ -41,7 +59,7 @@ public function getNodeTypes(): array return [New_::class]; } - public function refactor(Node $node): ?Node + protected function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { assert($node instanceof New_); if (!$node->class instanceof Name) { @@ -56,8 +74,10 @@ public function refactor(Node $node): ?Node if (count($node->args) !== 6) { return null; } - array_pop($node->args); - return $node; + $cloned = clone $node; + array_pop($cloned->args); + + return $cloned; } } diff --git a/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector.php b/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector.php index 3d52bf09e..88261509e 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector.php @@ -4,6 +4,9 @@ namespace DrupalRector\Drupal11\Rector\Deprecation; +use DrupalRector\Contract\VersionedConfigurationInterface; +use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use PhpParser\Node; use PhpParser\Node\Arg; use PhpParser\Node\Expr\ConstFetch; @@ -11,8 +14,7 @@ use PhpParser\Node\Scalar\LNumber; use PhpParser\Node\Scalar\String_; use PHPStan\Type\ObjectType; -use Rector\Rector\AbstractRector; -use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; +use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -24,15 +26,38 @@ * @see https://www.drupal.org/node/3442810 * @see https://www.drupal.org/node/3494472 */ -final class ReplaceAlphadecimalToIntNullRector extends AbstractRector +final class ReplaceAlphadecimalToIntNullRector extends AbstractDrupalCoreRector { + /** + * @var array|DrupalIntroducedVersionConfiguration[] + */ + protected array $configuration; + + public function configure(array $configuration): void + { + foreach ($configuration as $value) { + if (!$value instanceof DrupalIntroducedVersionConfiguration) { + throw new \InvalidArgumentException(sprintf('Each configuration item must be an instance of "%s"', DrupalIntroducedVersionConfiguration::class)); + } + } + parent::configure($configuration); + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( "Replace deprecated Number::alphadecimalToInt(null/'') calls with 0", [ - new CodeSample('Number::alphadecimalToInt(NULL);', '0;'), - new CodeSample("Number::alphadecimalToInt('');", '0;'), + new ConfiguredCodeSample( + 'Number::alphadecimalToInt(NULL);', + '0;', + [new DrupalIntroducedVersionConfiguration('11.2.0')] + ), + new ConfiguredCodeSample( + "Number::alphadecimalToInt('');", + '0;', + [new DrupalIntroducedVersionConfiguration('11.2.0')] + ), ] ); } @@ -43,7 +68,7 @@ public function getNodeTypes(): array return [StaticCall::class]; } - public function refactor(Node $node): ?Node + protected function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { assert($node instanceof StaticCall); if (!$this->isName($node->name, 'alphadecimalToInt')) { diff --git a/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector.php b/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector.php index 5ce11576d..b3e717ea7 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector.php @@ -4,11 +4,13 @@ namespace DrupalRector\Drupal11\Rector\Deprecation; +use DrupalRector\Contract\VersionedConfigurationInterface; +use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use PhpParser\Node; use PhpParser\Node\Expr\ClassConstFetch; use PhpParser\Node\Scalar\Int_; -use Rector\Rector\AbstractRector; -use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; +use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -18,19 +20,34 @@ * * @see https://www.drupal.org/node/3316878 */ -final class ReplaceEntityReferenceRecursiveLimitRector extends AbstractRector +final class ReplaceEntityReferenceRecursiveLimitRector extends AbstractDrupalCoreRector { private const TARGET_CLASSES = [ 'EntityReferenceEntityFormatter', 'Drupal\Core\Field\Plugin\Field\FieldFormatter\EntityReferenceEntityFormatter', ]; + /** + * @var array|DrupalIntroducedVersionConfiguration[] + */ + protected array $configuration; + + public function configure(array $configuration): void + { + foreach ($configuration as $value) { + if (!$value instanceof DrupalIntroducedVersionConfiguration) { + throw new \InvalidArgumentException(sprintf('Each configuration item must be an instance of "%s"', DrupalIntroducedVersionConfiguration::class)); + } + } + parent::configure($configuration); + } + public function getNodeTypes(): array { return [ClassConstFetch::class]; } - public function refactor(Node $node): ?Node + protected function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { assert($node instanceof ClassConstFetch); @@ -50,9 +67,10 @@ public function refactor(Node $node): ?Node public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Replace deprecated EntityReferenceEntityFormatter::RECURSIVE_RENDER_LIMIT with literal 20 (drupal:11.4.0)', [ - new CodeSample( + new ConfiguredCodeSample( 'if ($count > EntityReferenceEntityFormatter::RECURSIVE_RENDER_LIMIT) {}', - 'if ($count > 20) {}' + 'if ($count > 20) {}', + [new DrupalIntroducedVersionConfiguration('11.4.0')] ), ]); } diff --git a/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector.php b/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector.php index 46b87af8c..306f90bec 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector.php @@ -4,11 +4,13 @@ namespace DrupalRector\Drupal11\Rector\Deprecation; +use DrupalRector\Contract\VersionedConfigurationInterface; +use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use PhpParser\Node; use PhpParser\Node\Expr\Array_; use PhpParser\Node\Scalar\String_; -use Rector\Rector\AbstractRector; -use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; +use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -20,16 +22,32 @@ * @see https://www.drupal.org/node/3512254 * @see https://www.drupal.org/node/3515272 */ -final class ReplaceFieldgroupToFieldsetRector extends AbstractRector +final class ReplaceFieldgroupToFieldsetRector extends AbstractDrupalCoreRector { + /** + * @var array|DrupalIntroducedVersionConfiguration[] + */ + protected array $configuration; + + public function configure(array $configuration): void + { + foreach ($configuration as $value) { + if (!$value instanceof DrupalIntroducedVersionConfiguration) { + throw new \InvalidArgumentException(sprintf('Each configuration item must be an instance of "%s"', DrupalIntroducedVersionConfiguration::class)); + } + } + parent::configure($configuration); + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( "Replace '#type' => 'fieldgroup' with '#type' => 'fieldset' in render arrays", [ - new CodeSample( + new ConfiguredCodeSample( "\$form['account'] = ['#type' => 'fieldgroup', '#title' => \$this->t('Account settings')];", - "\$form['account'] = ['#type' => 'fieldset', '#title' => \$this->t('Account settings')];" + "\$form['account'] = ['#type' => 'fieldset', '#title' => \$this->t('Account settings')];", + [new DrupalIntroducedVersionConfiguration('11.2.0')] ), ] ); @@ -41,21 +59,24 @@ public function getNodeTypes(): array return [Array_::class]; } - public function refactor(Node $node): ?Node + protected function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { assert($node instanceof Array_); $changed = false; - foreach ($node->items as $item) { + $cloned = clone $node; + foreach ($cloned->items as $index => $item) { if (!$item->key instanceof String_ || $item->key->value !== '#type') { continue; } if (!$item->value instanceof String_ || $item->value->value !== 'fieldgroup') { continue; } - $item->value = new String_('fieldset'); + $newItem = clone $item; + $newItem->value = new String_('fieldset'); + $cloned->items[$index] = $newItem; $changed = true; } - return $changed ? $node : null; + return $changed ? $cloned : null; } } diff --git a/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector.php b/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector.php index c35eed200..92f8761b7 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector.php @@ -4,10 +4,12 @@ namespace DrupalRector\Drupal11\Rector\Deprecation; +use DrupalRector\Contract\VersionedConfigurationInterface; +use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use PhpParser\Node; use PHPStan\Type\ObjectType; -use Rector\Rector\AbstractRector; -use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; +use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -19,7 +21,7 @@ * @see https://www.drupal.org/node/3538277 * @see https://www.drupal.org/node/3538666 */ -final class ReplaceNodeSetPreviewModeRector extends AbstractRector +final class ReplaceNodeSetPreviewModeRector extends AbstractDrupalCoreRector { private const CONST_TO_ENUM = [ 'DRUPAL_DISABLED' => 'Disabled', @@ -33,12 +35,27 @@ final class ReplaceNodeSetPreviewModeRector extends AbstractRector 2 => 'Required', ]; + /** + * @var array|DrupalIntroducedVersionConfiguration[] + */ + protected array $configuration; + + public function configure(array $configuration): void + { + foreach ($configuration as $value) { + if (!$value instanceof DrupalIntroducedVersionConfiguration) { + throw new \InvalidArgumentException(sprintf('Each configuration item must be an instance of "%s"', DrupalIntroducedVersionConfiguration::class)); + } + } + parent::configure($configuration); + } + public function getNodeTypes(): array { return [Node\Expr\MethodCall::class]; } - public function refactor(Node $node): ?Node + protected function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { assert($node instanceof Node\Expr\MethodCall); @@ -72,22 +89,24 @@ public function refactor(Node $node): ?Node return null; } - $node->args[0] = new Node\Arg( + $cloned = clone $node; + $cloned->args[0] = new Node\Arg( new Node\Expr\ClassConstFetch( new Node\Name\FullyQualified('Drupal\node\NodePreviewMode'), $enumCase ) ); - return $node; + return $cloned; } public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Replace deprecated DRUPAL_DISABLED/OPTIONAL/REQUIRED constants and integer literals in setPreviewMode() with NodePreviewMode enum cases (drupal:11.3.0)', [ - new CodeSample( + new ConfiguredCodeSample( '$nodeType->setPreviewMode(DRUPAL_DISABLED);', - '$nodeType->setPreviewMode(\\Drupal\\node\\NodePreviewMode::Disabled);' + '$nodeType->setPreviewMode(\\Drupal\\node\\NodePreviewMode::Disabled);', + [new DrupalIntroducedVersionConfiguration('11.3.0')] ), ]); } diff --git a/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector.php b/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector.php index acd2824a9..f25a33a8a 100644 --- a/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector.php @@ -4,6 +4,9 @@ namespace DrupalRector\Drupal11\Rector\Deprecation; +use DrupalRector\Contract\VersionedConfigurationInterface; +use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use PhpParser\Node; use PhpParser\Node\Arg; use PhpParser\Node\Expr\ArrayItem; @@ -11,8 +14,7 @@ use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Name\FullyQualified; use PhpParser\Node\Scalar\String_; -use Rector\Rector\AbstractRector; -use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; +use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -23,7 +25,7 @@ * @see https://www.drupal.org/node/3525077 * @see https://www.drupal.org/node/3488338 */ -final class ReplacePdoFetchConstantsRector extends AbstractRector +final class ReplacePdoFetchConstantsRector extends AbstractDrupalCoreRector { private const FETCH_MAP = [ 'FETCH_OBJ' => 'Object', @@ -42,14 +44,30 @@ final class ReplacePdoFetchConstantsRector extends AbstractRector private const PDO_RETURN_METHODS = ['getClientStatement', 'getClientConnection']; + /** + * @var array|DrupalIntroducedVersionConfiguration[] + */ + protected array $configuration; + + public function configure(array $configuration): void + { + foreach ($configuration as $value) { + if (!$value instanceof DrupalIntroducedVersionConfiguration) { + throw new \InvalidArgumentException(sprintf('Each configuration item must be an instance of "%s"', DrupalIntroducedVersionConfiguration::class)); + } + } + parent::configure($configuration); + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( 'Replace PDO::FETCH_* constants with FetchAs enum cases in Drupal Database API calls', [ - new CodeSample( + new ConfiguredCodeSample( '$statement->setFetchMode(\\PDO::FETCH_ASSOC);', - '$statement->setFetchMode(\\Drupal\\Core\\Database\\Statement\\FetchAs::Associative);' + '$statement->setFetchMode(\\Drupal\\Core\\Database\\Statement\\FetchAs::Associative);', + [new DrupalIntroducedVersionConfiguration('11.2.0')] ), ] ); @@ -62,13 +80,32 @@ public function getNodeTypes(): array } public function refactor(Node $node): ?Node + { + if ($node instanceof ArrayItem) { + // ArrayItem nodes cannot be BC-wrapped as standalone expressions. + // Apply the transformation directly without version-gating wrapper. + foreach ($this->configuration as $configuration) { + if (!$this->rectorShouldApplyToDrupalVersion($configuration)) { + continue; + } + if ($this->isInBackwardsCompatibleCall($node)) { + continue; + } + + return $this->refactorArrayItem($node); + } + + return null; + } + + return parent::refactor($node); + } + + protected function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { if ($node instanceof MethodCall) { return $this->refactorMethodCall($node); } - if ($node instanceof ArrayItem) { - return $this->refactorArrayItem($node); - } return null; } @@ -89,19 +126,22 @@ private function refactorMethodCall(MethodCall $node): ?MethodCall $fetchArgIndex = self::DRUPAL_FETCH_METHODS[$methodName]; $changed = false; + $cloned = clone $node; - foreach ($node->args as $index => $arg) { + foreach ($cloned->args as $index => $arg) { if (!$arg instanceof Arg || $index !== $fetchArgIndex) { continue; } $replacement = $this->replacePdoFetchConst($arg->value); if ($replacement !== null) { - $arg->value = $replacement; + $newArg = clone $arg; + $newArg->value = $replacement; + $cloned->args[$index] = $newArg; $changed = true; } } - return $changed ? $node : null; + return $changed ? $cloned : null; } private function refactorArrayItem(ArrayItem $node): ?ArrayItem @@ -116,9 +156,10 @@ private function refactorArrayItem(ArrayItem $node): ?ArrayItem if ($replacement === null) { return null; } - $node->value = $replacement; + $cloned = clone $node; + $cloned->value = $replacement; - return $node; + return $cloned; } private function replacePdoFetchConst(Node $node): ?ClassConstFetch diff --git a/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector.php b/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector.php index d535b3903..68766286f 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector.php @@ -4,6 +4,9 @@ namespace DrupalRector\Drupal11\Rector\Deprecation; +use DrupalRector\Contract\VersionedConfigurationInterface; +use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use PhpParser\Node; use PhpParser\Node\Arg; use PhpParser\Node\Expr\ArrayDimFetch; @@ -12,8 +15,7 @@ use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Name\FullyQualified; -use Rector\Rector\AbstractRector; -use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; +use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -24,14 +26,29 @@ * @see https://www.drupal.org/node/3518527 * @see https://www.drupal.org/node/3518914 */ -final class ReplaceSessionWritesWithRequestSessionRector extends AbstractRector +final class ReplaceSessionWritesWithRequestSessionRector extends AbstractDrupalCoreRector { + /** + * @var array|DrupalIntroducedVersionConfiguration[] + */ + protected array $configuration; + + public function configure(array $configuration): void + { + foreach ($configuration as $value) { + if (!$value instanceof DrupalIntroducedVersionConfiguration) { + throw new \InvalidArgumentException(sprintf('Each configuration item must be an instance of "%s"', DrupalIntroducedVersionConfiguration::class)); + } + } + parent::configure($configuration); + } + public function getNodeTypes(): array { return [Assign::class]; } - public function refactor(Node $node): ?Node + protected function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { assert($node instanceof Assign); @@ -74,9 +91,10 @@ public function refactor(Node $node): ?Node public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Replace deprecated $_SESSION writes with \\Drupal::request()->getSession()->set() (drupal:11.2.0)', [ - new CodeSample( + new ConfiguredCodeSample( '$_SESSION[\'my_key\'] = $value;', - '\\Drupal::request()->getSession()->set(\'my_key\', $value);' + '\\Drupal::request()->getSession()->set(\'my_key\', $value);', + [new DrupalIntroducedVersionConfiguration('11.2.0')] ), ]); } diff --git a/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector.php b/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector.php index fbb669dd7..15197d266 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector.php @@ -4,13 +4,15 @@ namespace DrupalRector\Drupal11\Rector\Deprecation; +use DrupalRector\Contract\VersionedConfigurationInterface; +use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use PhpParser\Node; use PhpParser\Node\Arg; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Scalar\String_; -use Rector\Rector\AbstractRector; -use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; +use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -22,18 +24,34 @@ * @see https://www.drupal.org/node/3184242 * @see https://www.drupal.org/node/3526344 */ -final class ReplaceSystemPerformanceGzipKeyRector extends AbstractRector +final class ReplaceSystemPerformanceGzipKeyRector extends AbstractDrupalCoreRector { private const CONFIG_ACCESSOR_METHODS = ['config', 'get', 'getEditable']; + /** + * @var array|DrupalIntroducedVersionConfiguration[] + */ + protected array $configuration; + + public function configure(array $configuration): void + { + foreach ($configuration as $value) { + if (!$value instanceof DrupalIntroducedVersionConfiguration) { + throw new \InvalidArgumentException(sprintf('Each configuration item must be an instance of "%s"', DrupalIntroducedVersionConfiguration::class)); + } + } + parent::configure($configuration); + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( 'Replace deprecated system.performance css.gzip/js.gzip config keys with css.compress/js.compress', [ - new CodeSample( + new ConfiguredCodeSample( "\\Drupal::config('system.performance')->get('css.gzip');", - "\\Drupal::config('system.performance')->get('css.compress');" + "\\Drupal::config('system.performance')->get('css.compress');", + [new DrupalIntroducedVersionConfiguration('11.4.0')] ), ] ); @@ -45,7 +63,7 @@ public function getNodeTypes(): array return [MethodCall::class]; } - public function refactor(Node $node): ?Node + protected function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { assert($node instanceof MethodCall); if (!$this->isNames($node->name, ['get', 'set'])) { @@ -70,9 +88,10 @@ public function refactor(Node $node): ?Node return null; } $newKey = ($key === 'css.gzip') ? 'css.compress' : 'js.compress'; - $node->args[0] = new Arg(new String_($newKey)); + $cloned = clone $node; + $cloned->args[0] = new Arg(new String_($newKey)); - return $node; + return $cloned; } private function isSystemPerformanceConfigReceiver(Node $receiver): bool diff --git a/src/Drupal11/Rector/Deprecation/ReplaceTwigExtensionRector.php b/src/Drupal11/Rector/Deprecation/ReplaceTwigExtensionRector.php index 4f5d41b9a..f46de6a39 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceTwigExtensionRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceTwigExtensionRector.php @@ -4,11 +4,13 @@ namespace DrupalRector\Drupal11\Rector\Deprecation; +use DrupalRector\Contract\VersionedConfigurationInterface; +use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use PhpParser\Node; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Scalar\String_; -use Rector\Rector\AbstractRector; -use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; +use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -16,16 +18,32 @@ * * @see https://www.drupal.org/node/1685492 */ -class ReplaceTwigExtensionRector extends AbstractRector +final class ReplaceTwigExtensionRector extends AbstractDrupalCoreRector { + /** + * @var array|DrupalIntroducedVersionConfiguration[] + */ + protected array $configuration; + + public function configure(array $configuration): void + { + foreach ($configuration as $value) { + if (!$value instanceof DrupalIntroducedVersionConfiguration) { + throw new \InvalidArgumentException(sprintf('Each configuration item must be an instance of "%s"', DrupalIntroducedVersionConfiguration::class)); + } + } + parent::configure($configuration); + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( "Replace deprecated twig_extension() with the '.html.twig' string literal", [ - new CodeSample( + new ConfiguredCodeSample( '$ext = twig_extension();', - "\$ext = '.html.twig';" + "\$ext = '.html.twig';", + [new DrupalIntroducedVersionConfiguration('11.3.0')] ), ] ); @@ -37,9 +55,10 @@ public function getNodeTypes(): array return [FuncCall::class]; } - /** @param FuncCall $node */ - public function refactor(Node $node): ?Node + protected function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { + assert($node instanceof FuncCall); + if ($this->getName($node) === 'twig_extension') { return new String_('.html.twig'); } diff --git a/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector.php b/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector.php index 3a3aa9248..d20bf7944 100644 --- a/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector.php +++ b/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector.php @@ -4,10 +4,12 @@ namespace DrupalRector\Drupal11\Rector\Deprecation; +use DrupalRector\Contract\VersionedConfigurationInterface; +use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use PhpParser\Node; use PHPStan\Type\ObjectType; -use Rector\Rector\AbstractRector; -use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; +use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -18,14 +20,29 @@ * @see https://www.drupal.org/node/3574717 * @see https://www.drupal.org/node/3442785 */ -final class StripMigrationDependenciesExpandArgRector extends AbstractRector +final class StripMigrationDependenciesExpandArgRector extends AbstractDrupalCoreRector { + /** + * @var array|DrupalIntroducedVersionConfiguration[] + */ + protected array $configuration; + + public function configure(array $configuration): void + { + foreach ($configuration as $value) { + if (!$value instanceof DrupalIntroducedVersionConfiguration) { + throw new \InvalidArgumentException(sprintf('Each configuration item must be an instance of "%s"', DrupalIntroducedVersionConfiguration::class)); + } + } + parent::configure($configuration); + } + public function getNodeTypes(): array { return [Node\Expr\MethodCall::class]; } - public function refactor(Node $node): ?Node + protected function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { assert($node instanceof Node\Expr\MethodCall); @@ -41,17 +58,19 @@ public function refactor(Node $node): ?Node return null; } - $node->args = []; + $cloned = clone $node; + $cloned->args = []; - return $node; + return $cloned; } public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Strip removed $expand argument from getMigrationDependencies() calls on MigrationInterface (drupal:11.0.0)', [ - new CodeSample( + new ConfiguredCodeSample( '$deps = $migration->getMigrationDependencies(TRUE);', - '$deps = $migration->getMigrationDependencies();' + '$deps = $migration->getMigrationDependencies();', + [new DrupalIntroducedVersionConfiguration('11.0.0')] ), ]); } diff --git a/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/ReplaceRequestTimeConstantRectorTest.php b/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/ReplaceRequestTimeConstantRectorTest.php index 088c615e1..0258d4a62 100644 --- a/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/ReplaceRequestTimeConstantRectorTest.php +++ b/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/ReplaceRequestTimeConstantRectorTest.php @@ -4,14 +4,20 @@ namespace DrupalRector\Tests\Drupal10\Rector\Deprecation\ReplaceRequestTimeConstantRector; +use DrupalRector\Services\DrupalRectorSettings; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ReplaceRequestTimeConstantRectorTest extends AbstractRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] - public function test(string $filePath): void + public function testAboveVersion(string $filePath): void { - $this->doTestFile($filePath); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } } /** @@ -22,6 +28,25 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); + } + public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/config/configured_rule.php b/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/config/configured_rule.php index 47f8697e1..47f93fc4c 100644 --- a/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/config/configured_rule.php +++ b/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/config/configured_rule.php @@ -3,8 +3,12 @@ declare(strict_types=1); use DrupalRector\Drupal10\Rector\Deprecation\ReplaceRequestTimeConstantRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; +use DrupalRector\Tests\Rector\Deprecation\DeprecationBase; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { - $rectorConfig->rule(ReplaceRequestTimeConstantRector::class); + DeprecationBase::addClass(ReplaceRequestTimeConstantRector::class, $rectorConfig, false, [ + new DrupalIntroducedVersionConfiguration('11.0.0'), + ]); }; diff --git a/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/fixture-below-version/basic.php.inc b/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/fixture-below-version/basic.php.inc new file mode 100644 index 000000000..3354eb2cb --- /dev/null +++ b/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/fixture-below-version/basic.php.inc @@ -0,0 +1,13 @@ + +----- + diff --git a/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/fixture-below-version/in_function_call.php.inc b/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/fixture-below-version/in_function_call.php.inc new file mode 100644 index 000000000..0b7ecee32 --- /dev/null +++ b/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/fixture-below-version/in_function_call.php.inc @@ -0,0 +1,25 @@ + REQUEST_TIME]; + +// REQUEST_TIME in string concatenation (still a ConstFetch, so it IS transformed). +$label = 'Timestamp: ' . REQUEST_TIME; + +?> +----- + REQUEST_TIME]; + +// REQUEST_TIME in string concatenation (still a ConstFetch, so it IS transformed). +$label = 'Timestamp: ' . REQUEST_TIME; + +?> diff --git a/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/fixture/basic.php.inc b/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/fixture/basic.php.inc index ef05283f6..ca2b0053b 100644 --- a/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/fixture/basic.php.inc +++ b/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/fixture/basic.php.inc @@ -7,7 +7,7 @@ $other = time(); ----- getRequestTime() - $lifespan; +$cutoff = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.0.0', fn() => \Drupal::time()->getRequestTime(), fn() => REQUEST_TIME) - $lifespan; $other = time(); ?> diff --git a/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/fixture/in_function_call.php.inc b/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/fixture/in_function_call.php.inc index e3ee4c862..dcbe96c31 100644 --- a/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/fixture/in_function_call.php.inc +++ b/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/fixture/in_function_call.php.inc @@ -14,12 +14,12 @@ $label = 'Timestamp: ' . REQUEST_TIME; getRequestTime()); +$date = date('Y-m-d H:i:s', \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.0.0', fn() => \Drupal::time()->getRequestTime(), fn() => REQUEST_TIME)); // REQUEST_TIME used as an array value. -$data = ['cutoff' => \Drupal::time()->getRequestTime()]; +$data = ['cutoff' => \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.0.0', fn() => \Drupal::time()->getRequestTime(), fn() => REQUEST_TIME)]; // REQUEST_TIME in string concatenation (still a ConstFetch, so it IS transformed). -$label = 'Timestamp: ' . \Drupal::time()->getRequestTime(); +$label = 'Timestamp: ' . \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.0.0', fn() => \Drupal::time()->getRequestTime(), fn() => REQUEST_TIME); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/FileManagedFileSubmitRector/FileManagedFileSubmitRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/FileManagedFileSubmitRector/FileManagedFileSubmitRectorTest.php index e23a64416..75fd55002 100644 --- a/tests/src/Drupal11/Rector/Deprecation/FileManagedFileSubmitRector/FileManagedFileSubmitRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/FileManagedFileSubmitRector/FileManagedFileSubmitRectorTest.php @@ -4,14 +4,20 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\FileManagedFileSubmitRector; +use DrupalRector\Services\DrupalRectorSettings; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class FileManagedFileSubmitRectorTest extends AbstractRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] - public function test(string $filePath): void + public function testAboveVersion(string $filePath): void { - $this->doTestFile($filePath); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } } /** @@ -22,6 +28,25 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); + } + public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/FileManagedFileSubmitRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/FileManagedFileSubmitRector/config/configured_rule.php index d8b9e4968..d1f7225e5 100644 --- a/tests/src/Drupal11/Rector/Deprecation/FileManagedFileSubmitRector/config/configured_rule.php +++ b/tests/src/Drupal11/Rector/Deprecation/FileManagedFileSubmitRector/config/configured_rule.php @@ -3,9 +3,12 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\FileManagedFileSubmitRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use DrupalRector\Tests\Rector\Deprecation\DeprecationBase; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { - DeprecationBase::addClass(FileManagedFileSubmitRector::class, $rectorConfig, false); + DeprecationBase::addClass(FileManagedFileSubmitRector::class, $rectorConfig, false, [ + new DrupalIntroducedVersionConfiguration('11.3.0'), + ]); }; diff --git a/tests/src/Drupal11/Rector/Deprecation/FileManagedFileSubmitRector/fixture-below-version/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/FileManagedFileSubmitRector/fixture-below-version/basic.php.inc new file mode 100644 index 000000000..b8dff6174 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/FileManagedFileSubmitRector/fixture-below-version/basic.php.inc @@ -0,0 +1,15 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/FileManagedFileSubmitRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/FileManagedFileSubmitRector/fixture/basic.php.inc index fa4a18ffa..319bcdd8d 100644 --- a/tests/src/Drupal11/Rector/Deprecation/FileManagedFileSubmitRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/FileManagedFileSubmitRector/fixture/basic.php.inc @@ -9,7 +9,7 @@ function example() { [\Drupal\file\Element\ManagedFile::class, 'submit'], fn() => 'file_managed_file_submit')]; + $form['actions']['#submit'][] = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => [\Drupal\file\Element\ManagedFile::class, 'submit'], fn() => 'file_managed_file_submit'); } ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/MediaFilterFormatEditFormValidateRector/MediaFilterFormatEditFormValidateRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/MediaFilterFormatEditFormValidateRector/MediaFilterFormatEditFormValidateRectorTest.php index 011cd5680..009bb1ea5 100644 --- a/tests/src/Drupal11/Rector/Deprecation/MediaFilterFormatEditFormValidateRector/MediaFilterFormatEditFormValidateRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/MediaFilterFormatEditFormValidateRector/MediaFilterFormatEditFormValidateRectorTest.php @@ -4,22 +4,49 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\MediaFilterFormatEditFormValidateRector; +use DrupalRector\Services\DrupalRectorSettings; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class MediaFilterFormatEditFormValidateRectorTest extends AbstractRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] - public function test(string $filePath): void + public function testAboveVersion(string $filePath): void { - $this->doTestFile($filePath); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } } - /** @return \Iterator> */ + /** + * @return \Iterator<> + */ public static function provideData(): \Iterator { return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); + } + public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/MediaFilterFormatEditFormValidateRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/MediaFilterFormatEditFormValidateRector/config/configured_rule.php index b5b2bb096..009413150 100644 --- a/tests/src/Drupal11/Rector/Deprecation/MediaFilterFormatEditFormValidateRector/config/configured_rule.php +++ b/tests/src/Drupal11/Rector/Deprecation/MediaFilterFormatEditFormValidateRector/config/configured_rule.php @@ -3,9 +3,12 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\MediaFilterFormatEditFormValidateRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use DrupalRector\Tests\Rector\Deprecation\DeprecationBase; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { - DeprecationBase::addClass(MediaFilterFormatEditFormValidateRector::class, $rectorConfig, false); + DeprecationBase::addClass(MediaFilterFormatEditFormValidateRector::class, $rectorConfig, false, [ + new DrupalIntroducedVersionConfiguration('11.4.0'), + ]); }; diff --git a/tests/src/Drupal11/Rector/Deprecation/MediaFilterFormatEditFormValidateRector/fixture-below-version/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/MediaFilterFormatEditFormValidateRector/fixture-below-version/basic.php.inc new file mode 100644 index 000000000..2a66f7082 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/MediaFilterFormatEditFormValidateRector/fixture-below-version/basic.php.inc @@ -0,0 +1,11 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/MediaFilterFormatEditFormValidateRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/MediaFilterFormatEditFormValidateRector/fixture/basic.php.inc index c2a3bc407..6f2882a20 100644 --- a/tests/src/Drupal11/Rector/Deprecation/MediaFilterFormatEditFormValidateRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/MediaFilterFormatEditFormValidateRector/fixture/basic.php.inc @@ -6,6 +6,6 @@ $form['#validate'][] = 'media_filter_format_edit_form_validate'; ----- formatEditFormValidate($form, $form_state); -$form['#validate'][] = [\Drupal\media\Hook\MediaHooks::class, 'formatEditFormValidate']; +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service(\Drupal\media\Hook\MediaHooks::class)->formatEditFormValidate($form, $form_state), fn() => media_filter_format_edit_form_validate($form, $form_state)); +$form['#validate'][] = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => [\Drupal\media\Hook\MediaHooks::class, 'formatEditFormValidate'], fn() => 'media_filter_format_edit_form_validate'); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/MigrateSqlGetMigrationPluginManagerRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/MigrateSqlGetMigrationPluginManagerRectorTest.php index 07dc06a87..5fd47704b 100644 --- a/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/MigrateSqlGetMigrationPluginManagerRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/MigrateSqlGetMigrationPluginManagerRectorTest.php @@ -4,14 +4,20 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\MigrateSqlGetMigrationPluginManagerRector; +use DrupalRector\Services\DrupalRectorSettings; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class MigrateSqlGetMigrationPluginManagerRectorTest extends AbstractRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] - public function test(string $filePath): void + public function testAboveVersion(string $filePath): void { - $this->doTestFile($filePath); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } } /** @@ -22,6 +28,25 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); + } + public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/config/configured_rule.php index 65d312988..d53538a49 100644 --- a/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/config/configured_rule.php +++ b/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/config/configured_rule.php @@ -3,9 +3,12 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\MigrateSqlGetMigrationPluginManagerRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use DrupalRector\Tests\Rector\Deprecation\DeprecationBase; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { - DeprecationBase::addClass(MigrateSqlGetMigrationPluginManagerRector::class, $rectorConfig, false); + DeprecationBase::addClass(MigrateSqlGetMigrationPluginManagerRector::class, $rectorConfig, false, [ + new DrupalIntroducedVersionConfiguration('11.0.0'), + ]); }; diff --git a/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/fixture-below-version/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/fixture-below-version/basic.php.inc new file mode 100644 index 000000000..008c66c8d --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/fixture-below-version/basic.php.inc @@ -0,0 +1,29 @@ +getMigrationPluginManager(); + $other = $this->someOtherMethod(); + } +} + +?> +----- +getMigrationPluginManager(); + $other = $this->someOtherMethod(); + } +} + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/fixture-below-version/chain_result.php.inc b/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/fixture-below-version/chain_result.php.inc new file mode 100644 index 000000000..ba9ff1226 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/fixture-below-version/chain_result.php.inc @@ -0,0 +1,27 @@ +getMigrationPluginManager()->createInstances($requirements); + } +} + +?> +----- +getMigrationPluginManager()->createInstances($requirements); + } +} + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/fixture-below-version/parent_call.php.inc b/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/fixture-below-version/parent_call.php.inc new file mode 100644 index 000000000..13860a87a --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/fixture-below-version/parent_call.php.inc @@ -0,0 +1,29 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/fixture/basic.php.inc index 6a6ffd0d3..0c5514d11 100644 --- a/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/fixture/basic.php.inc @@ -21,7 +21,7 @@ class MyIdMap extends Sql { public function doSomething(): void { - $manager = $this->migrationPluginManager; + $manager = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.0.0', fn() => $this->migrationPluginManager, fn() => $this->getMigrationPluginManager()); $other = $this->someOtherMethod(); } } diff --git a/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/fixture/chain_result.php.inc b/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/fixture/chain_result.php.inc index 7d27b393e..fbc66d074 100644 --- a/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/fixture/chain_result.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/fixture/chain_result.php.inc @@ -20,7 +20,7 @@ class MyIdMap extends Sql { public function doSomething(array $requirements): array { - return $this->migrationPluginManager->createInstances($requirements); + return \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.0.0', fn() => $this->migrationPluginManager, fn() => $this->getMigrationPluginManager())->createInstances($requirements); } } diff --git a/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/fixture/parent_call.php.inc b/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/fixture/parent_call.php.inc index 11497b5ca..6f5a77696 100644 --- a/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/fixture/parent_call.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/fixture/parent_call.php.inc @@ -22,7 +22,7 @@ class MyIdMap extends Sql { public function getMigrationPluginManager() { - return $this->migrationPluginManager; + return \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.0.0', fn() => $this->migrationPluginManager, fn() => parent::getMigrationPluginManager()); } } diff --git a/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/PluginBaseIsConfigurableRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/PluginBaseIsConfigurableRectorTest.php index f4349a0ac..dbaa274be 100644 --- a/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/PluginBaseIsConfigurableRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/PluginBaseIsConfigurableRectorTest.php @@ -4,14 +4,20 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\PluginBaseIsConfigurableRector; +use DrupalRector\Services\DrupalRectorSettings; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class PluginBaseIsConfigurableRectorTest extends AbstractRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] - public function test(string $filePath): void + public function testAboveVersion(string $filePath): void { - $this->doTestFile($filePath); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } } /** @@ -22,6 +28,25 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); + } + public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/config/configured_rule.php index f7c1a3795..e844d7b22 100644 --- a/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/config/configured_rule.php +++ b/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/config/configured_rule.php @@ -3,9 +3,12 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\PluginBaseIsConfigurableRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use DrupalRector\Tests\Rector\Deprecation\DeprecationBase; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { - DeprecationBase::addClass(PluginBaseIsConfigurableRector::class, $rectorConfig, false); + DeprecationBase::addClass(PluginBaseIsConfigurableRector::class, $rectorConfig, false, [ + new DrupalIntroducedVersionConfiguration('11.1.0'), + ]); }; diff --git a/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture-below-version/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture-below-version/basic.php.inc new file mode 100644 index 000000000..6211357ae --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture-below-version/basic.php.inc @@ -0,0 +1,25 @@ +isConfigurable()) { + // handle configurable + } + } +} +?> +----- +isConfigurable()) { + // handle configurable + } + } +} +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture-below-version/negated.php.inc b/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture-below-version/negated.php.inc new file mode 100644 index 000000000..fe64b0cdc --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture-below-version/negated.php.inc @@ -0,0 +1,27 @@ +isConfigurable()) { + return; + } + return $this->isConfigurable(); + } +} +?> +----- +isConfigurable()) { + return; + } + return $this->isConfigurable(); + } +} +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture-below-version/property_delegation.php.inc b/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture-below-version/property_delegation.php.inc new file mode 100644 index 000000000..df1400117 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture-below-version/property_delegation.php.inc @@ -0,0 +1,35 @@ +plugin (not $this), but since $this->plugin +// is typed as PluginBase the rector must still replace the deprecated call. +class PluginWrapper extends CachePluginBase { + /** @var \Drupal\Component\Plugin\PluginBase */ + protected $plugin; + + public function isConfigurable(): bool { + return $this->plugin->isConfigurable(); + } +} +?> +----- +plugin (not $this), but since $this->plugin +// is typed as PluginBase the rector must still replace the deprecated call. +class PluginWrapper extends CachePluginBase { + /** @var \Drupal\Component\Plugin\PluginBase */ + protected $plugin; + + public function isConfigurable(): bool { + return $this->plugin->isConfigurable(); + } +} +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture/basic.php.inc index 01aad453e..b9cba38e8 100644 --- a/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture/basic.php.inc @@ -17,7 +17,7 @@ use Drupal\Component\Plugin\PluginBase; class MyPlugin extends PluginBase { public function doSomething(): void { - if ($this instanceof \Drupal\Component\Plugin\ConfigurableInterface) { + if (\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.1.0', fn() => $this instanceof \Drupal\Component\Plugin\ConfigurableInterface, fn() => $this->isConfigurable())) { // handle configurable } } diff --git a/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture/negated.php.inc b/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture/negated.php.inc index 2b2ae4edb..7af6f3e8e 100644 --- a/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture/negated.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture/negated.php.inc @@ -18,10 +18,10 @@ use Drupal\Component\Plugin\PluginBase; class MyPlugin extends PluginBase { public function doSomething(): void { - if (!$this instanceof \Drupal\Component\Plugin\ConfigurableInterface) { + if (!\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.1.0', fn() => $this instanceof \Drupal\Component\Plugin\ConfigurableInterface, fn() => $this->isConfigurable())) { return; } - return $this instanceof \Drupal\Component\Plugin\ConfigurableInterface; + return \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.1.0', fn() => $this instanceof \Drupal\Component\Plugin\ConfigurableInterface, fn() => $this->isConfigurable()); } } ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture/property_delegation.php.inc b/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture/property_delegation.php.inc index 48080a2ba..f398b6af0 100644 --- a/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture/property_delegation.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/fixture/property_delegation.php.inc @@ -29,7 +29,7 @@ class PluginWrapper extends CachePluginBase { protected $plugin; public function isConfigurable(): bool { - return $this->plugin instanceof \Drupal\Component\Plugin\ConfigurableInterface; + return \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.1.0', fn() => $this->plugin instanceof \Drupal\Component\Plugin\ConfigurableInterface, fn() => $this->plugin->isConfigurable()); } } ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector/RemoveConfigSaveTrustedDataArgRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector/RemoveConfigSaveTrustedDataArgRectorTest.php index 602c5baf9..9f7fb2865 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector/RemoveConfigSaveTrustedDataArgRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector/RemoveConfigSaveTrustedDataArgRectorTest.php @@ -4,14 +4,20 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\RemoveConfigSaveTrustedDataArgRector; +use DrupalRector\Services\DrupalRectorSettings; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class RemoveConfigSaveTrustedDataArgRectorTest extends AbstractRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] - public function test(string $filePath): void + public function testAboveVersion(string $filePath): void { - $this->doTestFile($filePath); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } } /** @@ -22,6 +28,25 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); + } + public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector/config/configured_rule.php index ca3d908a4..c3554fc99 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector/config/configured_rule.php +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector/config/configured_rule.php @@ -3,9 +3,12 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\RemoveConfigSaveTrustedDataArgRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use DrupalRector\Tests\Rector\Deprecation\DeprecationBase; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { - DeprecationBase::addClass(RemoveConfigSaveTrustedDataArgRector::class, $rectorConfig, false); + DeprecationBase::addClass(RemoveConfigSaveTrustedDataArgRector::class, $rectorConfig, false, [ + new DrupalIntroducedVersionConfiguration('11.4.0'), + ]); }; diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector/fixture-below-version/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector/fixture-below-version/basic.php.inc new file mode 100644 index 000000000..f76f85da8 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector/fixture-below-version/basic.php.inc @@ -0,0 +1,23 @@ +save(TRUE); +$config->save(FALSE); +$config->save(); + +// Untyped — must not be changed. +$other->save(TRUE); + +?> +----- +save(TRUE); +$config->save(FALSE); +$config->save(); + +// Untyped — must not be changed. +$other->save(TRUE); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector/fixture/basic.php.inc index afe1e033f..9da7bdcb7 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector/fixture/basic.php.inc @@ -13,8 +13,8 @@ $other->save(TRUE); save(); -$config->save(); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => $config->save(), fn() => $config->save(TRUE)); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => $config->save(), fn() => $config->save(FALSE)); $config->save(); // Untyped — must not be changed. diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/RemoveRootFromConvertDbUrlRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/RemoveRootFromConvertDbUrlRectorTest.php index 9968ccf54..df03bd545 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/RemoveRootFromConvertDbUrlRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/RemoveRootFromConvertDbUrlRectorTest.php @@ -4,14 +4,20 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\RemoveRootFromConvertDbUrlRector; +use DrupalRector\Services\DrupalRectorSettings; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class RemoveRootFromConvertDbUrlRectorTest extends AbstractRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] - public function test(string $filePath): void + public function testAboveVersion(string $filePath): void { - $this->doTestFile($filePath); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } } /** @@ -22,6 +28,25 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); + } + public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/config/configured_rule.php index 268c31250..9df53cd51 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/config/configured_rule.php +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/config/configured_rule.php @@ -3,9 +3,12 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\RemoveRootFromConvertDbUrlRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use DrupalRector\Tests\Rector\Deprecation\DeprecationBase; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { - DeprecationBase::addClass(RemoveRootFromConvertDbUrlRector::class, $rectorConfig, false); + DeprecationBase::addClass(RemoveRootFromConvertDbUrlRector::class, $rectorConfig, false, [ + new DrupalIntroducedVersionConfiguration('11.3.0'), + ]); }; diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture-below-version/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture-below-version/basic.php.inc new file mode 100644 index 000000000..f76ad71d6 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture-below-version/basic.php.inc @@ -0,0 +1,25 @@ +root, TRUE); +// With string root, no third arg +Database::convertDbUrlToConnectionInfo($url, $root); +// Already adapted (boolean second arg): leave unchanged +Database::convertDbUrlToConnectionInfo($url, TRUE); + +?> +----- +root, TRUE); +// With string root, no third arg +Database::convertDbUrlToConnectionInfo($url, $root); +// Already adapted (boolean second arg): leave unchanged +Database::convertDbUrlToConnectionInfo($url, TRUE); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture-below-version/method_call_second_arg.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture-below-version/method_call_second_arg.php.inc new file mode 100644 index 000000000..7ad38b99e --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture-below-version/method_call_second_arg.php.inc @@ -0,0 +1,19 @@ +getRoot()); +Database::convertDbUrlToConnectionInfo($url, $this->getDrupalRoot(), TRUE); + +?> +----- +getRoot()); +Database::convertDbUrlToConnectionInfo($url, $this->getDrupalRoot(), TRUE); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture-below-version/three_args_property_fetch.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture-below-version/three_args_property_fetch.php.inc new file mode 100644 index 000000000..1efb3662d --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture-below-version/three_args_property_fetch.php.inc @@ -0,0 +1,17 @@ +root, TRUE); + +?> +----- +root, TRUE); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture-below-version/two_args_property_fetch.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture-below-version/two_args_property_fetch.php.inc new file mode 100644 index 000000000..b732f6d79 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture-below-version/two_args_property_fetch.php.inc @@ -0,0 +1,17 @@ +root); + +?> +----- +root); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture-below-version/two_args_string.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture-below-version/two_args_string.php.inc new file mode 100644 index 000000000..6cd3fbb08 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture-below-version/two_args_string.php.inc @@ -0,0 +1,17 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/basic.php.inc index 6a4bef1f6..3022df892 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/basic.php.inc @@ -16,7 +16,7 @@ Database::convertDbUrlToConnectionInfo($url, TRUE); use Drupal\Core\Database\Database; // With three args: root removed, bool arg shifts left -Database::convertDbUrlToConnectionInfo($url, TRUE); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => Database::convertDbUrlToConnectionInfo($url, TRUE), fn() => Database::convertDbUrlToConnectionInfo($url, $this->root, TRUE)); // With string root, no third arg Database::convertDbUrlToConnectionInfo($url, $root); // Already adapted (boolean second arg): leave unchanged diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/method_call_second_arg.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/method_call_second_arg.php.inc index 4717bb6ca..2b790ff22 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/method_call_second_arg.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/method_call_second_arg.php.inc @@ -13,7 +13,7 @@ Database::convertDbUrlToConnectionInfo($url, $this->getDrupalRoot(), TRUE); use Drupal\Core\Database\Database; // Second arg is a method call result (string-returning method): remove it -Database::convertDbUrlToConnectionInfo($url); -Database::convertDbUrlToConnectionInfo($url, TRUE); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => Database::convertDbUrlToConnectionInfo($url), fn() => Database::convertDbUrlToConnectionInfo($url, $this->getRoot())); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => Database::convertDbUrlToConnectionInfo($url, TRUE), fn() => Database::convertDbUrlToConnectionInfo($url, $this->getDrupalRoot(), TRUE)); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/three_args_property_fetch.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/three_args_property_fetch.php.inc index 802f78d95..dbe004c66 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/three_args_property_fetch.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/three_args_property_fetch.php.inc @@ -12,6 +12,6 @@ Database::convertDbUrlToConnectionInfo($url, $this->root, TRUE); use Drupal\Core\Database\Database; // Three-arg call with property fetch: $root removed, bool arg shifts to position 2 -Database::convertDbUrlToConnectionInfo($url, TRUE); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => Database::convertDbUrlToConnectionInfo($url, TRUE), fn() => Database::convertDbUrlToConnectionInfo($url, $this->root, TRUE)); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/two_args_property_fetch.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/two_args_property_fetch.php.inc index 37fb1d6cf..7d11ad856 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/two_args_property_fetch.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/two_args_property_fetch.php.inc @@ -12,6 +12,6 @@ Database::convertDbUrlToConnectionInfo($url, $this->root); use Drupal\Core\Database\Database; // Two-arg call where second arg is a property fetch (no third arg) -Database::convertDbUrlToConnectionInfo($url); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => Database::convertDbUrlToConnectionInfo($url), fn() => Database::convertDbUrlToConnectionInfo($url, $this->root)); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/two_args_string.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/two_args_string.php.inc index 016372339..a2182a18c 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/two_args_string.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/fixture/two_args_string.php.inc @@ -12,6 +12,6 @@ Database::convertDbUrlToConnectionInfo($url, '/var/www/html'); use Drupal\Core\Database\Database; // Two-arg call with string literal root: removed, leaving only $url -Database::convertDbUrlToConnectionInfo($url); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => Database::convertDbUrlToConnectionInfo($url), fn() => Database::convertDbUrlToConnectionInfo($url, '/var/www/html')); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/RemoveTwigNodeTransTagArgumentRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/RemoveTwigNodeTransTagArgumentRectorTest.php index 98a42f90a..40b48c994 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/RemoveTwigNodeTransTagArgumentRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/RemoveTwigNodeTransTagArgumentRectorTest.php @@ -4,14 +4,20 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\RemoveTwigNodeTransTagArgumentRector; +use DrupalRector\Services\DrupalRectorSettings; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class RemoveTwigNodeTransTagArgumentRectorTest extends AbstractRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] - public function test(string $filePath): void + public function testAboveVersion(string $filePath): void { - $this->doTestFile($filePath); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } } /** @@ -22,6 +28,25 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); + } + public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/config/configured_rule.php index 9cc2320b8..bd52ab455 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/config/configured_rule.php +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/config/configured_rule.php @@ -3,9 +3,12 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\RemoveTwigNodeTransTagArgumentRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use DrupalRector\Tests\Rector\Deprecation\DeprecationBase; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { - DeprecationBase::addClass(RemoveTwigNodeTransTagArgumentRector::class, $rectorConfig, false); + DeprecationBase::addClass(RemoveTwigNodeTransTagArgumentRector::class, $rectorConfig, false, [ + new DrupalIntroducedVersionConfiguration('11.2.0'), + ]); }; diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/fixture-below-version/aliased_import.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/fixture-below-version/aliased_import.php.inc new file mode 100644 index 000000000..e5f18fef3 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/fixture-below-version/aliased_import.php.inc @@ -0,0 +1,19 @@ +getTag()); + +?> +----- +getTag()); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/fixture-below-version/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/fixture-below-version/basic.php.inc new file mode 100644 index 000000000..f7cee716b --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/fixture-below-version/basic.php.inc @@ -0,0 +1,17 @@ +getTag()); +$other = new OtherClass($a, $b, $c, $d, $e, $f); + +?> +----- +getTag()); +$other = new OtherClass($a, $b, $c, $d, $e, $f); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/fixture-below-version/fqcn.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/fixture-below-version/fqcn.php.inc new file mode 100644 index 000000000..8c9773048 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/fixture-below-version/fqcn.php.inc @@ -0,0 +1,13 @@ +getTag()); + +?> +----- +getTag()); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/fixture/aliased_import.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/fixture/aliased_import.php.inc index ab4818359..a38a9adb0 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/fixture/aliased_import.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/fixture/aliased_import.php.inc @@ -14,6 +14,6 @@ use Drupal\Core\Template\TwigNodeTrans as NodeTrans; // Aliased import — Rector resolves the alias to the FQCN before matching, // so this form IS correctly transformed. -$node = new NodeTrans($body, $plural, $count, $options, $lineno); +$node = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => new NodeTrans($body, $plural, $count, $options, $lineno), fn() => new NodeTrans($body, $plural, $count, $options, $lineno, $this->getTag())); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/fixture/basic.php.inc index 8b2b2c886..9050d119e 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/fixture/basic.php.inc @@ -11,7 +11,7 @@ $other = new OtherClass($a, $b, $c, $d, $e, $f); use Drupal\Core\Template\TwigNodeTrans; -$node = new TwigNodeTrans($body, $plural, $count, $options, $lineno); +$node = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => new TwigNodeTrans($body, $plural, $count, $options, $lineno), fn() => new TwigNodeTrans($body, $plural, $count, $options, $lineno, $this->getTag())); $other = new OtherClass($a, $b, $c, $d, $e, $f); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/fixture/fqcn.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/fixture/fqcn.php.inc index 91be0b29d..b193bc68e 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/fixture/fqcn.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/fixture/fqcn.php.inc @@ -8,6 +8,6 @@ $node = new \Drupal\Core\Template\TwigNodeTrans($body, $plural, $count, $options new \Drupal\Core\Template\TwigNodeTrans($body, $plural, $count, $options, $lineno), fn() => new \Drupal\Core\Template\TwigNodeTrans($body, $plural, $count, $options, $lineno, $this->getTag())); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/ReplaceAlphadecimalToIntNullRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/ReplaceAlphadecimalToIntNullRectorTest.php index 6545eb5a1..6674338cd 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/ReplaceAlphadecimalToIntNullRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/ReplaceAlphadecimalToIntNullRectorTest.php @@ -4,14 +4,20 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceAlphadecimalToIntNullRector; +use DrupalRector\Services\DrupalRectorSettings; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ReplaceAlphadecimalToIntNullRectorTest extends AbstractRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] - public function test(string $filePath): void + public function testAboveVersion(string $filePath): void { - $this->doTestFile($filePath); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } } /** @@ -22,6 +28,25 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); + } + public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/config/configured_rule.php index a092dde9f..f9b41f2f0 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/config/configured_rule.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/config/configured_rule.php @@ -3,9 +3,12 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\ReplaceAlphadecimalToIntNullRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use DrupalRector\Tests\Rector\Deprecation\DeprecationBase; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { - DeprecationBase::addClass(ReplaceAlphadecimalToIntNullRector::class, $rectorConfig, false); + DeprecationBase::addClass(ReplaceAlphadecimalToIntNullRector::class, $rectorConfig, false, [ + new DrupalIntroducedVersionConfiguration('11.2.0'), + ]); }; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/fixture-below-version/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/fixture-below-version/basic.php.inc new file mode 100644 index 000000000..15b800cd4 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/fixture-below-version/basic.php.inc @@ -0,0 +1,21 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/fixture-below-version/fqcn.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/fixture-below-version/fqcn.php.inc new file mode 100644 index 000000000..6a06a4262 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/fixture-below-version/fqcn.php.inc @@ -0,0 +1,15 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/fixture-below-version/inline_usage.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/fixture-below-version/inline_usage.php.inc new file mode 100644 index 000000000..cc380cc2f --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/fixture-below-version/inline_usage.php.inc @@ -0,0 +1,19 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/fixture/basic.php.inc index cc0c835cf..986e1b07f 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/fixture/basic.php.inc @@ -13,8 +13,8 @@ $d = OtherClass::alphadecimalToInt(NULL); use Drupal\Component\Utility\Number; -$a = 0; -$b = 0; +$a = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => 0, fn() => Number::alphadecimalToInt(NULL)); +$b = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => 0, fn() => Number::alphadecimalToInt('')); $c = Number::alphadecimalToInt('abc'); $d = OtherClass::alphadecimalToInt(NULL); diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/fixture/fqcn.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/fixture/fqcn.php.inc index e9f283717..e5908a8d0 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/fixture/fqcn.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/fixture/fqcn.php.inc @@ -9,7 +9,7 @@ $b = \Drupal\Component\Utility\Number::alphadecimalToInt(''); 0, fn() => \Drupal\Component\Utility\Number::alphadecimalToInt(NULL)); +$b = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => 0, fn() => \Drupal\Component\Utility\Number::alphadecimalToInt('')); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/fixture/inline_usage.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/fixture/inline_usage.php.inc index 8ced29310..458fd3c09 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/fixture/inline_usage.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/fixture/inline_usage.php.inc @@ -13,7 +13,7 @@ $x = Number::alphadecimalToInt('') + 5; use Drupal\Component\Utility\Number; // Result used inline: as a function argument and in an expression. -foo(0); -$x = 0 + 5; +foo(\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => 0, fn() => Number::alphadecimalToInt(null))); +$x = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => 0, fn() => Number::alphadecimalToInt('')) + 5; ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/ReplaceEntityReferenceRecursiveLimitRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/ReplaceEntityReferenceRecursiveLimitRectorTest.php index b52e0ce7e..3dd09b256 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/ReplaceEntityReferenceRecursiveLimitRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/ReplaceEntityReferenceRecursiveLimitRectorTest.php @@ -4,14 +4,20 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceEntityReferenceRecursiveLimitRector; +use DrupalRector\Services\DrupalRectorSettings; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ReplaceEntityReferenceRecursiveLimitRectorTest extends AbstractRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] - public function test(string $filePath): void + public function testAboveVersion(string $filePath): void { - $this->doTestFile($filePath); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } } /** @@ -22,6 +28,25 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); + } + public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/config/configured_rule.php index ddb33fde1..ec4a93c1d 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/config/configured_rule.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/config/configured_rule.php @@ -3,8 +3,12 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\ReplaceEntityReferenceRecursiveLimitRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; +use DrupalRector\Tests\Rector\Deprecation\DeprecationBase; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { - $rectorConfig->rule(ReplaceEntityReferenceRecursiveLimitRector::class); + DeprecationBase::addClass(ReplaceEntityReferenceRecursiveLimitRector::class, $rectorConfig, false, [ + new DrupalIntroducedVersionConfiguration('11.4.0'), + ]); }; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture-below-version/aliased_import.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture-below-version/aliased_import.php.inc new file mode 100644 index 000000000..a69061cb9 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture-below-version/aliased_import.php.inc @@ -0,0 +1,17 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture-below-version/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture-below-version/basic.php.inc new file mode 100644 index 000000000..c40b528b6 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture-below-version/basic.php.inc @@ -0,0 +1,23 @@ + EntityReferenceEntityFormatter::RECURSIVE_RENDER_LIMIT) { + return; +} + +$limit = EntityReferenceEntityFormatter::RECURSIVE_RENDER_LIMIT; + +?> +----- + EntityReferenceEntityFormatter::RECURSIVE_RENDER_LIMIT) { + return; +} + +$limit = EntityReferenceEntityFormatter::RECURSIVE_RENDER_LIMIT; + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture-below-version/in_function_call.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture-below-version/in_function_call.php.inc new file mode 100644 index 000000000..7e9d8c9f3 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture-below-version/in_function_call.php.inc @@ -0,0 +1,23 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture-below-version/in_ternary.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture-below-version/in_ternary.php.inc new file mode 100644 index 000000000..5b7aba27b --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture-below-version/in_ternary.php.inc @@ -0,0 +1,23 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture/aliased_import.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture/aliased_import.php.inc index 2d10c170f..de11144d8 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture/aliased_import.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture/aliased_import.php.inc @@ -12,6 +12,6 @@ $limit = Formatter::RECURSIVE_RENDER_LIMIT; use Drupal\Core\Field\Plugin\Field\FieldFormatter\EntityReferenceEntityFormatter as Formatter; // Aliased import — Rector resolves the alias back to the FQCN. -$limit = 20; +$limit = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => 20, fn() => Formatter::RECURSIVE_RENDER_LIMIT); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture/basic.php.inc index 6b209a6e8..9dec15348 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture/basic.php.inc @@ -14,10 +14,10 @@ $limit = EntityReferenceEntityFormatter::RECURSIVE_RENDER_LIMIT; use Drupal\Core\Field\Plugin\Field\FieldFormatter\EntityReferenceEntityFormatter; -if ($count > 20) { +if ($count > \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => 20, fn() => EntityReferenceEntityFormatter::RECURSIVE_RENDER_LIMIT)) { return; } -$limit = 20; +$limit = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => 20, fn() => EntityReferenceEntityFormatter::RECURSIVE_RENDER_LIMIT); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture/in_function_call.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture/in_function_call.php.inc index 0561578b8..a663ddee1 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture/in_function_call.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture/in_function_call.php.inc @@ -15,9 +15,9 @@ $result = some_check($id, EntityReferenceEntityFormatter::RECURSIVE_RENDER_LIMIT use Drupal\Core\Field\Plugin\Field\FieldFormatter\EntityReferenceEntityFormatter; // RECURSIVE_RENDER_LIMIT used as a function argument. -$capped = min($count, 20); +$capped = min($count, \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => 20, fn() => EntityReferenceEntityFormatter::RECURSIVE_RENDER_LIMIT)); // RECURSIVE_RENDER_LIMIT used as a second argument. -$result = some_check($id, 20); +$result = some_check($id, \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => 20, fn() => EntityReferenceEntityFormatter::RECURSIVE_RENDER_LIMIT)); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture/in_ternary.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture/in_ternary.php.inc index e7ae41831..c80f529f1 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture/in_ternary.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/fixture/in_ternary.php.inc @@ -15,9 +15,9 @@ $limit2 = $override ? 5 : EntityReferenceEntityFormatter::RECURSIVE_RENDER_LIMIT use Drupal\Core\Field\Plugin\Field\FieldFormatter\EntityReferenceEntityFormatter; // RECURSIVE_RENDER_LIMIT used as the true branch of a ternary. -$limit = $override ? 20 : 10; +$limit = $override ? \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => 20, fn() => EntityReferenceEntityFormatter::RECURSIVE_RENDER_LIMIT) : 10; // RECURSIVE_RENDER_LIMIT used as the false branch of a ternary. -$limit2 = $override ? 5 : 20; +$limit2 = $override ? 5 : \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => 20, fn() => EntityReferenceEntityFormatter::RECURSIVE_RENDER_LIMIT); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/ReplaceFieldgroupToFieldsetRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/ReplaceFieldgroupToFieldsetRectorTest.php index 8ab7629e4..33fc0739c 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/ReplaceFieldgroupToFieldsetRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/ReplaceFieldgroupToFieldsetRectorTest.php @@ -4,14 +4,20 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceFieldgroupToFieldsetRector; +use DrupalRector\Services\DrupalRectorSettings; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ReplaceFieldgroupToFieldsetRectorTest extends AbstractRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] - public function test(string $filePath): void + public function testAboveVersion(string $filePath): void { - $this->doTestFile($filePath); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } } /** @@ -22,6 +28,25 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); + } + public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/config/configured_rule.php index af4f02a5f..5df4d2e89 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/config/configured_rule.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/config/configured_rule.php @@ -3,9 +3,12 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\ReplaceFieldgroupToFieldsetRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use DrupalRector\Tests\Rector\Deprecation\DeprecationBase; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { - DeprecationBase::addClass(ReplaceFieldgroupToFieldsetRector::class, $rectorConfig, false); + DeprecationBase::addClass(ReplaceFieldgroupToFieldsetRector::class, $rectorConfig, false, [ + new DrupalIntroducedVersionConfiguration('11.2.0'), + ]); }; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/fixture-below-version/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/fixture-below-version/basic.php.inc new file mode 100644 index 000000000..aa1af1af5 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/fixture-below-version/basic.php.inc @@ -0,0 +1,25 @@ + 'fieldgroup', + '#title' => 'Account settings', +]; +$form['other'] = [ + '#type' => 'fieldset', + '#title' => 'Other settings', +]; + +?> +----- + 'fieldgroup', + '#title' => 'Account settings', +]; +$form['other'] = [ + '#type' => 'fieldset', + '#title' => 'Other settings', +]; + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/fixture-below-version/deeply_nested.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/fixture-below-version/deeply_nested.php.inc new file mode 100644 index 000000000..702dbcc8d --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/fixture-below-version/deeply_nested.php.inc @@ -0,0 +1,21 @@ + 'fieldgroup' inside a deeply nested form array must be changed. +$form['wrapper']['group']['settings'] = [ + '#type' => 'fieldgroup', + '#title' => 'Advanced settings', + '#weight' => 10, +]; + +?> +----- + 'fieldgroup' inside a deeply nested form array must be changed. +$form['wrapper']['group']['settings'] = [ + '#type' => 'fieldgroup', + '#title' => 'Advanced settings', + '#weight' => 10, +]; + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/fixture/basic.php.inc index ec656a76a..29a17e1e6 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/fixture/basic.php.inc @@ -13,10 +13,13 @@ $form['other'] = [ ----- [ '#type' => 'fieldset', '#title' => 'Account settings', -]; +], fn() => [ + '#type' => 'fieldgroup', + '#title' => 'Account settings', +]); $form['other'] = [ '#type' => 'fieldset', '#title' => 'Other settings', diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/fixture/deeply_nested.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/fixture/deeply_nested.php.inc index fab0d88b0..a7dda79c0 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/fixture/deeply_nested.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/fixture/deeply_nested.php.inc @@ -12,10 +12,14 @@ $form['wrapper']['group']['settings'] = [ 'fieldgroup' inside a deeply nested form array must be changed. -$form['wrapper']['group']['settings'] = [ +$form['wrapper']['group']['settings'] = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => [ '#type' => 'fieldset', '#title' => 'Advanced settings', '#weight' => 10, -]; +], fn() => [ + '#type' => 'fieldgroup', + '#title' => 'Advanced settings', + '#weight' => 10, +]); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/ReplaceNodeSetPreviewModeRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/ReplaceNodeSetPreviewModeRectorTest.php index 19d867d6d..adcc365f0 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/ReplaceNodeSetPreviewModeRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/ReplaceNodeSetPreviewModeRectorTest.php @@ -4,14 +4,20 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceNodeSetPreviewModeRector; +use DrupalRector\Services\DrupalRectorSettings; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ReplaceNodeSetPreviewModeRectorTest extends AbstractRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] - public function test(string $filePath): void + public function testAboveVersion(string $filePath): void { - $this->doTestFile($filePath); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } } /** @@ -22,6 +28,25 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); + } + public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/config/configured_rule.php index 02b2b3e90..9d83abc0e 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/config/configured_rule.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/config/configured_rule.php @@ -3,8 +3,12 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\ReplaceNodeSetPreviewModeRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; +use DrupalRector\Tests\Rector\Deprecation\DeprecationBase; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { - $rectorConfig->rule(ReplaceNodeSetPreviewModeRector::class); + DeprecationBase::addClass(ReplaceNodeSetPreviewModeRector::class, $rectorConfig, false, [ + new DrupalIntroducedVersionConfiguration('11.3.0'), + ]); }; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/fixture-below-version/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/fixture-below-version/basic.php.inc new file mode 100644 index 000000000..84fda3086 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/fixture-below-version/basic.php.inc @@ -0,0 +1,23 @@ +setPreviewMode(DRUPAL_DISABLED); +$nodeType->setPreviewMode(DRUPAL_OPTIONAL); +$nodeType->setPreviewMode(DRUPAL_REQUIRED); +$nodeType->setPreviewMode(0); +$nodeType->setPreviewMode(1); +$nodeType->setPreviewMode(2); + +?> +----- +setPreviewMode(DRUPAL_DISABLED); +$nodeType->setPreviewMode(DRUPAL_OPTIONAL); +$nodeType->setPreviewMode(DRUPAL_REQUIRED); +$nodeType->setPreviewMode(0); +$nodeType->setPreviewMode(1); +$nodeType->setPreviewMode(2); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/fixture/basic.php.inc index 7ba1a7f12..2ad451c4f 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/fixture/basic.php.inc @@ -13,11 +13,11 @@ $nodeType->setPreviewMode(2); setPreviewMode(\Drupal\node\NodePreviewMode::Disabled); -$nodeType->setPreviewMode(\Drupal\node\NodePreviewMode::Optional); -$nodeType->setPreviewMode(\Drupal\node\NodePreviewMode::Required); -$nodeType->setPreviewMode(\Drupal\node\NodePreviewMode::Disabled); -$nodeType->setPreviewMode(\Drupal\node\NodePreviewMode::Optional); -$nodeType->setPreviewMode(\Drupal\node\NodePreviewMode::Required); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => $nodeType->setPreviewMode(\Drupal\node\NodePreviewMode::Disabled), fn() => $nodeType->setPreviewMode(DRUPAL_DISABLED)); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => $nodeType->setPreviewMode(\Drupal\node\NodePreviewMode::Optional), fn() => $nodeType->setPreviewMode(DRUPAL_OPTIONAL)); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => $nodeType->setPreviewMode(\Drupal\node\NodePreviewMode::Required), fn() => $nodeType->setPreviewMode(DRUPAL_REQUIRED)); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => $nodeType->setPreviewMode(\Drupal\node\NodePreviewMode::Disabled), fn() => $nodeType->setPreviewMode(0)); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => $nodeType->setPreviewMode(\Drupal\node\NodePreviewMode::Optional), fn() => $nodeType->setPreviewMode(1)); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => $nodeType->setPreviewMode(\Drupal\node\NodePreviewMode::Required), fn() => $nodeType->setPreviewMode(2)); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/ReplacePdoFetchConstantsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/ReplacePdoFetchConstantsRectorTest.php index b545184bc..78235ad31 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/ReplacePdoFetchConstantsRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/ReplacePdoFetchConstantsRectorTest.php @@ -4,14 +4,20 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplacePdoFetchConstantsRector; +use DrupalRector\Services\DrupalRectorSettings; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ReplacePdoFetchConstantsRectorTest extends AbstractRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] - public function test(string $filePath): void + public function testAboveVersion(string $filePath): void { - $this->doTestFile($filePath); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } } /** @@ -22,6 +28,25 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); + } + public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/config/configured_rule.php index ecb0f6c31..c586928e1 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/config/configured_rule.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/config/configured_rule.php @@ -3,9 +3,12 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\ReplacePdoFetchConstantsRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use DrupalRector\Tests\Rector\Deprecation\DeprecationBase; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { - DeprecationBase::addClass(ReplacePdoFetchConstantsRector::class, $rectorConfig, false); + DeprecationBase::addClass(ReplacePdoFetchConstantsRector::class, $rectorConfig, false, [ + new DrupalIntroducedVersionConfiguration('11.2.0'), + ]); }; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture-below-version/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture-below-version/basic.php.inc new file mode 100644 index 000000000..2e50bc85a --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture-below-version/basic.php.inc @@ -0,0 +1,23 @@ +setFetchMode(\PDO::FETCH_ASSOC); +$statement->fetch(\PDO::FETCH_OBJ); +$rows = $statement->fetchAll(\PDO::FETCH_NUM); +$data = $statement->fetchAllAssoc('id', \PDO::FETCH_ASSOC); +$result = $db->query('SELECT name FROM {test}', [], ['fetch' => \PDO::FETCH_ASSOC]); +// Raw PDO: leave unchanged +$pdo = $statement->getClientStatement()->fetchAll(\PDO::FETCH_ASSOC); + +?> +----- +setFetchMode(\PDO::FETCH_ASSOC); +$statement->fetch(\PDO::FETCH_OBJ); +$rows = $statement->fetchAll(\PDO::FETCH_NUM); +$data = $statement->fetchAllAssoc('id', \PDO::FETCH_ASSOC); +$result = $db->query('SELECT name FROM {test}', [], ['fetch' => \PDO::FETCH_ASSOC]); +// Raw PDO: leave unchanged +$pdo = $statement->getClientStatement()->fetchAll(\PDO::FETCH_ASSOC); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture-below-version/fetch_column_and_class.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture-below-version/fetch_column_and_class.php.inc new file mode 100644 index 000000000..eae6cbd98 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture-below-version/fetch_column_and_class.php.inc @@ -0,0 +1,15 @@ +setFetchMode(\PDO::FETCH_COLUMN); +$statement->fetch(\PDO::FETCH_CLASS); +$rows = $statement->fetchAll(\PDO::FETCH_COLUMN); + +?> +----- +setFetchMode(\PDO::FETCH_COLUMN); +$statement->fetch(\PDO::FETCH_CLASS); +$rows = $statement->fetchAll(\PDO::FETCH_COLUMN); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture-below-version/no_type_guard_native_pdo.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture-below-version/no_type_guard_native_pdo.php.inc new file mode 100644 index 000000000..fc2cd5698 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture-below-version/no_type_guard_native_pdo.php.inc @@ -0,0 +1,17 @@ +fetchAll(\PDO::FETCH_ASSOC); + +?> +----- +fetchAll(\PDO::FETCH_ASSOC); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/basic.php.inc index e9cc33056..017045d46 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/basic.php.inc @@ -12,10 +12,10 @@ $pdo = $statement->getClientStatement()->fetchAll(\PDO::FETCH_ASSOC); ----- setFetchMode(\Drupal\Core\Database\Statement\FetchAs::Associative); -$statement->fetch(\Drupal\Core\Database\Statement\FetchAs::Object); -$rows = $statement->fetchAll(\Drupal\Core\Database\Statement\FetchAs::List); -$data = $statement->fetchAllAssoc('id', \Drupal\Core\Database\Statement\FetchAs::Associative); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => $statement->setFetchMode(\Drupal\Core\Database\Statement\FetchAs::Associative), fn() => $statement->setFetchMode(\PDO::FETCH_ASSOC)); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => $statement->fetch(\Drupal\Core\Database\Statement\FetchAs::Object), fn() => $statement->fetch(\PDO::FETCH_OBJ)); +$rows = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => $statement->fetchAll(\Drupal\Core\Database\Statement\FetchAs::List), fn() => $statement->fetchAll(\PDO::FETCH_NUM)); +$data = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => $statement->fetchAllAssoc('id', \Drupal\Core\Database\Statement\FetchAs::Associative), fn() => $statement->fetchAllAssoc('id', \PDO::FETCH_ASSOC)); $result = $db->query('SELECT name FROM {test}', [], ['fetch' => \Drupal\Core\Database\Statement\FetchAs::Associative]); // Raw PDO: leave unchanged $pdo = $statement->getClientStatement()->fetchAll(\PDO::FETCH_ASSOC); diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/fetch_column_and_class.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/fetch_column_and_class.php.inc index 200dc7e55..4b634c5e3 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/fetch_column_and_class.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/fetch_column_and_class.php.inc @@ -8,8 +8,8 @@ $rows = $statement->fetchAll(\PDO::FETCH_COLUMN); ----- setFetchMode(\Drupal\Core\Database\Statement\FetchAs::Column); -$statement->fetch(\Drupal\Core\Database\Statement\FetchAs::ClassObject); -$rows = $statement->fetchAll(\Drupal\Core\Database\Statement\FetchAs::Column); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => $statement->setFetchMode(\Drupal\Core\Database\Statement\FetchAs::Column), fn() => $statement->setFetchMode(\PDO::FETCH_COLUMN)); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => $statement->fetch(\Drupal\Core\Database\Statement\FetchAs::ClassObject), fn() => $statement->fetch(\PDO::FETCH_CLASS)); +$rows = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => $statement->fetchAll(\Drupal\Core\Database\Statement\FetchAs::Column), fn() => $statement->fetchAll(\PDO::FETCH_COLUMN)); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/no_type_guard_native_pdo.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/no_type_guard_native_pdo.php.inc index 2768459d7..ab858b44b 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/no_type_guard_native_pdo.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/no_type_guard_native_pdo.php.inc @@ -12,6 +12,6 @@ $pdoStatement->fetchAll(\PDO::FETCH_ASSOC); // No receiver type guard: PDOStatement::fetchAll(PDO::FETCH_ASSOC) is also // transformed. This is a known limitation — the reactor cannot distinguish // a native PDOStatement from a Drupal statement without PHPStan type info. -$pdoStatement->fetchAll(\Drupal\Core\Database\Statement\FetchAs::Associative); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => $pdoStatement->fetchAll(\Drupal\Core\Database\Statement\FetchAs::Associative), fn() => $pdoStatement->fetchAll(\PDO::FETCH_ASSOC)); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/ReplaceSessionWritesWithRequestSessionRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/ReplaceSessionWritesWithRequestSessionRectorTest.php index f93b32ae0..9eb794c2f 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/ReplaceSessionWritesWithRequestSessionRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/ReplaceSessionWritesWithRequestSessionRectorTest.php @@ -4,14 +4,20 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceSessionWritesWithRequestSessionRector; +use DrupalRector\Services\DrupalRectorSettings; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ReplaceSessionWritesWithRequestSessionRectorTest extends AbstractRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] - public function test(string $filePath): void + public function testAboveVersion(string $filePath): void { - $this->doTestFile($filePath); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } } /** @@ -22,6 +28,25 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); + } + public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/config/configured_rule.php index 2965fa85b..a57fc1466 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/config/configured_rule.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/config/configured_rule.php @@ -3,9 +3,12 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\ReplaceSessionWritesWithRequestSessionRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use DrupalRector\Tests\Rector\Deprecation\DeprecationBase; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { - DeprecationBase::addClass(ReplaceSessionWritesWithRequestSessionRector::class, $rectorConfig, false); + DeprecationBase::addClass(ReplaceSessionWritesWithRequestSessionRector::class, $rectorConfig, false, [ + new DrupalIntroducedVersionConfiguration('11.2.0'), + ]); }; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/fixture-below-version/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/fixture-below-version/basic.php.inc new file mode 100644 index 000000000..6c02390c0 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/fixture-below-version/basic.php.inc @@ -0,0 +1,15 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/fixture-below-version/in_function.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/fixture-below-version/in_function.php.inc new file mode 100644 index 000000000..ba54a969a --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/fixture-below-version/in_function.php.inc @@ -0,0 +1,17 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/fixture/basic.php.inc index 6c937177c..0efaeb05b 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/fixture/basic.php.inc @@ -8,8 +8,8 @@ $other_var['key'] = 'untouched'; ----- getSession()->set('my_key', $value); -\Drupal::request()->getSession()->set($dynamic_key, $other); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => \Drupal::request()->getSession()->set('my_key', $value), fn() => $_SESSION['my_key'] = $value); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => \Drupal::request()->getSession()->set($dynamic_key, $other), fn() => $_SESSION[$dynamic_key] = $other); $other_var['key'] = 'untouched'; ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/fixture/in_function.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/fixture/in_function.php.inc index 317cc51d8..1ee5f8041 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/fixture/in_function.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/fixture/in_function.php.inc @@ -10,8 +10,8 @@ function my_module_store_data(string $key, mixed $value): void { getSession()->set($key, $value); - \Drupal::request()->getSession()->set('prefix_' . $key, $value); + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => \Drupal::request()->getSession()->set($key, $value), fn() => $_SESSION[$key] = $value); + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => \Drupal::request()->getSession()->set('prefix_' . $key, $value), fn() => $_SESSION['prefix_' . $key] = $value); } ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/ReplaceSystemPerformanceGzipKeyRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/ReplaceSystemPerformanceGzipKeyRectorTest.php index 2b050f24b..bc6acab77 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/ReplaceSystemPerformanceGzipKeyRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/ReplaceSystemPerformanceGzipKeyRectorTest.php @@ -4,14 +4,20 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceSystemPerformanceGzipKeyRector; +use DrupalRector\Services\DrupalRectorSettings; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ReplaceSystemPerformanceGzipKeyRectorTest extends AbstractRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] - public function test(string $filePath): void + public function testAboveVersion(string $filePath): void { - $this->doTestFile($filePath); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } } /** @@ -22,6 +28,25 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); + } + public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/config/configured_rule.php index 4ee5002e6..db21af6fd 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/config/configured_rule.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/config/configured_rule.php @@ -3,9 +3,12 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\ReplaceSystemPerformanceGzipKeyRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use DrupalRector\Tests\Rector\Deprecation\DeprecationBase; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { - DeprecationBase::addClass(ReplaceSystemPerformanceGzipKeyRector::class, $rectorConfig, false); + DeprecationBase::addClass(ReplaceSystemPerformanceGzipKeyRector::class, $rectorConfig, false, [ + new DrupalIntroducedVersionConfiguration('11.4.0'), + ]); }; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/fixture-below-version/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/fixture-below-version/basic.php.inc new file mode 100644 index 000000000..22a8514a6 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/fixture-below-version/basic.php.inc @@ -0,0 +1,19 @@ +get('css.gzip'); +$js = \Drupal::config('system.performance')->get('js.gzip'); +\Drupal::configFactory()->getEditable('system.performance')->set('css.gzip', TRUE); +// Unrelated: leave unchanged +$other = \Drupal::config('other.config')->get('css.gzip'); + +?> +----- +get('css.gzip'); +$js = \Drupal::config('system.performance')->get('js.gzip'); +\Drupal::configFactory()->getEditable('system.performance')->set('css.gzip', TRUE); +// Unrelated: leave unchanged +$other = \Drupal::config('other.config')->get('css.gzip'); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/fixture-below-version/set_js_gzip.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/fixture-below-version/set_js_gzip.php.inc new file mode 100644 index 000000000..952b88c24 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/fixture-below-version/set_js_gzip.php.inc @@ -0,0 +1,13 @@ +getEditable('system.performance')->set('js.gzip', TRUE); +\Drupal::configFactory()->getEditable('system.performance')->set('js.gzip', FALSE); + +?> +----- +getEditable('system.performance')->set('js.gzip', TRUE); +\Drupal::configFactory()->getEditable('system.performance')->set('js.gzip', FALSE); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/fixture-below-version/this_config.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/fixture-below-version/this_config.php.inc new file mode 100644 index 000000000..a9d6ef02d --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/fixture-below-version/this_config.php.inc @@ -0,0 +1,15 @@ +config('system.performance')->get('css.gzip'); +$js = $this->config('system.performance')->get('js.gzip'); +$this->config('system.performance')->set('css.gzip', TRUE); + +?> +----- +config('system.performance')->get('css.gzip'); +$js = $this->config('system.performance')->get('js.gzip'); +$this->config('system.performance')->set('css.gzip', TRUE); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/fixture/basic.php.inc index 166182ad3..f24e49099 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/fixture/basic.php.inc @@ -10,9 +10,9 @@ $other = \Drupal::config('other.config')->get('css.gzip'); ----- get('css.compress'); -$js = \Drupal::config('system.performance')->get('js.compress'); -\Drupal::configFactory()->getEditable('system.performance')->set('css.compress', TRUE); +$css = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::config('system.performance')->get('css.compress'), fn() => \Drupal::config('system.performance')->get('css.gzip')); +$js = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::config('system.performance')->get('js.compress'), fn() => \Drupal::config('system.performance')->get('js.gzip')); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::configFactory()->getEditable('system.performance')->set('css.compress', TRUE), fn() => \Drupal::configFactory()->getEditable('system.performance')->set('css.gzip', TRUE)); // Unrelated: leave unchanged $other = \Drupal::config('other.config')->get('css.gzip'); diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/fixture/set_js_gzip.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/fixture/set_js_gzip.php.inc index f30d24fe5..b128bbcb5 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/fixture/set_js_gzip.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/fixture/set_js_gzip.php.inc @@ -7,7 +7,7 @@ ----- getEditable('system.performance')->set('js.compress', TRUE); -\Drupal::configFactory()->getEditable('system.performance')->set('js.compress', FALSE); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::configFactory()->getEditable('system.performance')->set('js.compress', TRUE), fn() => \Drupal::configFactory()->getEditable('system.performance')->set('js.gzip', TRUE)); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::configFactory()->getEditable('system.performance')->set('js.compress', FALSE), fn() => \Drupal::configFactory()->getEditable('system.performance')->set('js.gzip', FALSE)); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/fixture/this_config.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/fixture/this_config.php.inc index 5c58809b0..1e0808cea 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/fixture/this_config.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/fixture/this_config.php.inc @@ -8,8 +8,8 @@ $this->config('system.performance')->set('css.gzip', TRUE); ----- config('system.performance')->get('css.compress'); -$js = $this->config('system.performance')->get('js.compress'); -$this->config('system.performance')->set('css.compress', TRUE); +$css = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => $this->config('system.performance')->get('css.compress'), fn() => $this->config('system.performance')->get('css.gzip')); +$js = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => $this->config('system.performance')->get('js.compress'), fn() => $this->config('system.performance')->get('js.gzip')); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => $this->config('system.performance')->set('css.compress', TRUE), fn() => $this->config('system.performance')->set('css.gzip', TRUE)); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceTwigExtensionRector/ReplaceTwigExtensionRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceTwigExtensionRector/ReplaceTwigExtensionRectorTest.php index a5ed8044c..9607ca95e 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceTwigExtensionRector/ReplaceTwigExtensionRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceTwigExtensionRector/ReplaceTwigExtensionRectorTest.php @@ -4,24 +4,49 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceTwigExtensionRector; +use DrupalRector\Services\DrupalRectorSettings; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class ReplaceTwigExtensionRectorTest extends AbstractRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] - public function test(string $filePath): void + public function testAboveVersion(string $filePath): void { - $this->doTestFile($filePath); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } } /** - * @return \Iterator + * @return \Iterator<> */ public static function provideData(): \Iterator { return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); + } + public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceTwigExtensionRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceTwigExtensionRector/config/configured_rule.php index 14cef6096..c8c72ec89 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceTwigExtensionRector/config/configured_rule.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceTwigExtensionRector/config/configured_rule.php @@ -3,9 +3,12 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\ReplaceTwigExtensionRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use DrupalRector\Tests\Rector\Deprecation\DeprecationBase; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { - DeprecationBase::addClass(ReplaceTwigExtensionRector::class, $rectorConfig, false); + DeprecationBase::addClass(ReplaceTwigExtensionRector::class, $rectorConfig, false, [ + new DrupalIntroducedVersionConfiguration('11.3.0'), + ]); }; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceTwigExtensionRector/fixture-below-version/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceTwigExtensionRector/fixture-below-version/basic.php.inc new file mode 100644 index 000000000..79779340b --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceTwigExtensionRector/fixture-below-version/basic.php.inc @@ -0,0 +1,9 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceTwigExtensionRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceTwigExtensionRector/fixture/basic.php.inc index eefaa47a3..9d93c74b9 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceTwigExtensionRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceTwigExtensionRector/fixture/basic.php.inc @@ -5,5 +5,5 @@ $ext = twig_extension(); ----- '.html.twig', fn() => twig_extension()); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/StripMigrationDependenciesExpandArgRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/StripMigrationDependenciesExpandArgRectorTest.php index 34a9e1d6c..69606b0f4 100644 --- a/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/StripMigrationDependenciesExpandArgRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/StripMigrationDependenciesExpandArgRectorTest.php @@ -4,14 +4,20 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\StripMigrationDependenciesExpandArgRector; +use DrupalRector\Services\DrupalRectorSettings; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class StripMigrationDependenciesExpandArgRectorTest extends AbstractRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] - public function test(string $filePath): void + public function testAboveVersion(string $filePath): void { - $this->doTestFile($filePath); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } } /** @@ -22,6 +28,25 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); + } + public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/config/configured_rule.php index 9916a3ee3..1d539e090 100644 --- a/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/config/configured_rule.php +++ b/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/config/configured_rule.php @@ -3,8 +3,12 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\StripMigrationDependenciesExpandArgRector; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; +use DrupalRector\Tests\Rector\Deprecation\DeprecationBase; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { - $rectorConfig->rule(StripMigrationDependenciesExpandArgRector::class); + DeprecationBase::addClass(StripMigrationDependenciesExpandArgRector::class, $rectorConfig, false, [ + new DrupalIntroducedVersionConfiguration('11.0.0'), + ]); }; diff --git a/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/fixture-below-version/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/fixture-below-version/basic.php.inc new file mode 100644 index 000000000..d813b6d0c --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/fixture-below-version/basic.php.inc @@ -0,0 +1,17 @@ +getMigrationDependencies(TRUE); +$noop = $migration->getMigrationDependencies(); +$untyped = $other->getMigrationDependencies(TRUE); + +?> +----- +getMigrationDependencies(TRUE); +$noop = $migration->getMigrationDependencies(); +$untyped = $other->getMigrationDependencies(TRUE); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/fixture-below-version/false_arg.php.inc b/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/fixture-below-version/false_arg.php.inc new file mode 100644 index 000000000..69f65d00a --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/fixture-below-version/false_arg.php.inc @@ -0,0 +1,15 @@ +getMigrationDependencies(FALSE); + +?> +----- +getMigrationDependencies(FALSE); + +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/fixture/basic.php.inc index 9ffe9d627..780bae4a3 100644 --- a/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/fixture/basic.php.inc @@ -10,7 +10,7 @@ $untyped = $other->getMigrationDependencies(TRUE); getMigrationDependencies(); +$deps = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.0.0', fn() => $migration->getMigrationDependencies(), fn() => $migration->getMigrationDependencies(TRUE)); $noop = $migration->getMigrationDependencies(); $untyped = $other->getMigrationDependencies(TRUE); diff --git a/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/fixture/false_arg.php.inc b/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/fixture/false_arg.php.inc index 6b7d9c994..b2a70fa23 100644 --- a/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/fixture/false_arg.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/fixture/false_arg.php.inc @@ -10,6 +10,6 @@ $deps = $migration->getMigrationDependencies(FALSE); // FALSE argument is also removed — the arg value doesn't matter, only presence does. /** @var \Drupal\migrate\Plugin\MigrationInterface $migration */ -$deps = $migration->getMigrationDependencies(); +$deps = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.0.0', fn() => $migration->getMigrationDependencies(), fn() => $migration->getMigrationDependencies(FALSE)); ?> From e1250065876aabc1c108294d7e7d182a1f7beb87 Mon Sep 17 00:00:00 2001 From: bjorn Date: Sat, 9 May 2026 18:45:25 +0200 Subject: [PATCH 169/256] docs(skills): update rector-implement skill with BC lessons from custom rector migration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Broaden BC eligibility criterion from CallLike→CallLike to the true Expr→Expr check (AbstractDrupalCoreRector line 92), with updated quick- reference table covering Array_, MethodCall, New_, ClassConstFetch etc. - Add shallow-clone warning to Template B: child nodes (Arg, ArrayItem) must be cloned before mutation to avoid both BC sides showing the new value. - Add ArrayItem edge-case pattern: override refactor() to apply ArrayItem transforms directly, bypassing the BC path which cannot wrap ArrayItem. - Replace outdated AbstractDrupalCoreRector::setVersionOverride() references with the correct DrupalRectorSettings::setDrupalVersion() container pattern. - Replace simple test() template for BC rectors with the full testAboveVersion/testBelowVersion + provideData/provideDataBelowVersion form. - Clarify that fixture-below-version/ is only needed for transformable fixtures. - Note in Step 7 that the exact BC fixture format is best read from a test failure diff rather than guessed. --- .../skills/prompts/digest-to-rector-prompt.md | 94 +++++++++++--- .claude/skills/rector-implement/SKILL.md | 115 ++++++++++++------ 2 files changed, 156 insertions(+), 53 deletions(-) diff --git a/.claude/skills/prompts/digest-to-rector-prompt.md b/.claude/skills/prompts/digest-to-rector-prompt.md index d739ab04b..524d91e22 100644 --- a/.claude/skills/prompts/digest-to-rector-prompt.md +++ b/.claude/skills/prompts/digest-to-rector-prompt.md @@ -27,9 +27,9 @@ that does not set an explicit override. Do not revert it to `10.99.x-dev` — th disable all Drupal 11 rules in the test suite. For tests that need to simulate a specific Drupal version (e.g., to verify a rule does NOT fire -on an older version), use `AbstractDrupalCoreRector::setVersionOverride($version)` in `setUp()` -and reset it with `setVersionOverride(null)` in `tearDown()`. Standard conversion tests do not -need this — the stub default is sufficient. +on an older version), use `DrupalRectorSettings::setDrupalVersion($version)` via the service +container, and reset it in a `finally` block. Standard conversion tests do not need this — the +stub default (`11.99.x-dev`) is sufficient for normal fixture testing. --- @@ -114,11 +114,17 @@ Answer these questions using the information gathered: **Q1: What node types does the rule process?** - List each type from `getNodeTypes()`. -**Q2: Is there a CallLike → CallLike transformation?** -- Old node is CallLike if: `FuncCall`, `MethodCall`, `StaticCall`, `NullsafeMethodCall`, `New_`. -- New node (what `refactor()` returns) is CallLike if: `FuncCall`, `MethodCall`, `StaticCall`, `NullsafeMethodCall`, `New_`. -- If both are CallLike → BC wrapping is **eligible**. -- If either is NOT CallLike (e.g., `ClassConstFetch`, `Class_`) → BC wrapping is **not applicable**. +**Q2: Is there an Expr → Expr transformation?** +- The authoritative check (from `AbstractDrupalCoreRector::refactor()` line 92) is: + `if ($node instanceof Node\Expr && $result instanceof Node\Expr)`. +- If **both** the input node and the returned node are `Node\Expr` subtypes → BC wrapping is **eligible**. +- `Node\Expr` subtypes include: `FuncCall`, `MethodCall`, `StaticCall`, `NullsafeMethodCall`, + `New_`, `Array_`, `ClassConstFetch`, `ConstFetch`, `String_`, `Int_`, `PropertyFetch`, and more. +- `Class_` (structural node) and `ArrayItem` are **not** `Node\Expr` → BC wrapping is not applicable. +- Exception: `ArrayItem` cannot appear as an arrow function body in PHP syntax, so even though + `Node\Expr\ArrayItem` exists, it cannot be BC-wrapped. If a rector handles `ArrayItem` nodes + alongside BC-wrappable nodes, override `refactor()` to apply the ArrayItem transform directly + while letting the parent handle BC for other node types (see edge case note in Template B). **Q3: Was the deprecation introduced in Drupal >= 10.1.0?** - Compare the introduced version from Step 2 against `10.1.0`. @@ -135,10 +141,13 @@ Answer these questions using the information gathered: |---|---|---|---|---| | `FuncCall` | `StaticCall` | >= 10.1.0 | `AbstractDrupalCoreRector` | Yes | | `FuncCall` | `MethodCall` | >= 10.1.0 | `AbstractDrupalCoreRector` | Yes | +| `MethodCall` | `MethodCall` | >= 10.1.0 | `AbstractDrupalCoreRector` | Yes | +| `Array_` | `Array_` | >= 10.1.0 | `AbstractDrupalCoreRector` | Yes | +| `New_` | `New_` | >= 10.1.0 | `AbstractDrupalCoreRector` | Yes | +| `ClassConstFetch` | `ClassConstFetch` | >= 10.1.0 | `AbstractDrupalCoreRector` | Yes | | `FuncCall` | `StaticCall` | < 10.1.0 | `AbstractRector` | No | -| `ClassConstFetch` | `ClassConstFetch` | any | `AbstractRector` | No | -| `New_` (arg modification) | `New_` | any | `AbstractRector` | No | -| `Class_` (structural) | `Class_` | any | `AbstractRector` | No | +| `ArrayItem` | `ArrayItem` | any | `AbstractRector` | No (PHP syntax limit) | +| `Class_` (structural) | `Class_` | any | `AbstractRector` | No (not an Expr) | --- @@ -391,6 +400,50 @@ CODE_AFTER, `AbstractDrupalCoreRector::refactor()` assumes all transformations share the same BC configuration, so mixing is not possible in a single class. +**Shallow-clone warning (critical for correctness):** +PHP's `clone` is a shallow copy — child objects in arrays (e.g. `$node->args[]`, `$node->items[]`) +are the same object instances in both the original and the clone. If you mutate a child after +cloning the parent, the mutation appears on **both** the original and the cloned node. This breaks +BC wrapping: both the `fn() => ` and `fn() => ` sides of the +`DeprecationHelper::backwardsCompatibleCall()` will show the mutated (new) value. + +**Rule:** Always clone child nodes before mutating them: +```php +// WRONG — mutates the shared Arg object; BC call gets new value on both sides +$arg->value = $replacement; + +// CORRECT — clone the child, mutate the clone, put it back in the cloned parent +$newArg = clone $arg; +$newArg->value = $replacement; +$cloned->args[$index] = $newArg; +``` +This applies to any child node you modify: `Arg`, `ArrayItem`, `Node\Identifier`, etc. + +**ArrayItem edge case:** +`ArrayItem` (`Node\Expr\ArrayItem`) cannot appear as an arrow function body in valid PHP. If a +rector handles `ArrayItem` nodes alongside BC-wrappable nodes (e.g. `MethodCall`), override +`refactor()` to apply ArrayItem transforms directly and skip the BC path for that node type: +```php +public function refactor(Node $node): ?Node +{ + if ($node instanceof ArrayItem) { + // Apply directly; BC wrapping is not applicable for ArrayItem. + foreach ($this->configuration as $configuration) { + if (!$this->rectorShouldApplyToDrupalVersion($configuration)) { + continue; + } + if ($this->isInBackwardsCompatibleCall($node)) { + continue; + } + return $this->refactorArrayItem($node); + } + return null; + } + // Let the parent handle BC wrapping for all other Expr nodes. + return parent::refactor($node); +} +``` + --- ## Step 7 — Generate the fixture file @@ -413,7 +466,10 @@ Format: **Rules:** - The `-----` separator must be on its own line with no surrounding whitespace. - Remove `use` statements from the "after" section if the new code uses FQCNs (backslash-prefixed). -- For BC-wrapped rules: the "after" section should show the `DeprecationHelper::backwardsCompatibleCall()` output. +- For BC-wrapped rules: the "after" section must show the full + `\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, 'X.Y.Z', fn() => , fn() => )` + output rather than the plain transformed code. The exact format is produced by the rector at + runtime — if unsure, run `vendor/bin/phpunit` once and read the failure diff to copy the actual output. - If the CodeSample before/after strings are not full PHP files, wrap them appropriately (add ``). - Add realistic surrounding context if the snippet is very minimal (e.g., wrap a bare expression in a function body). @@ -423,22 +479,20 @@ Format: Write `tests/src/Drupal11/Rector/Deprecation/[ClassName]/[ClassName]Test.php`. +**For simple rules (AbstractRector, no BC):** + ```php doTestFile($filePath); @@ -456,6 +510,10 @@ class [ClassName]Test extends AbstractRectorTestCase } ``` +**For BC-capable rules (AbstractDrupalCoreRector):** Use the full `testAboveVersion` / +`testBelowVersion` form from the QG-B section of SKILL.md. Do NOT use the simple `test()` form +above — the version-gating tests are required for all BC-wrapped rectors. + --- ## Step 9 — Generate the test config diff --git a/.claude/skills/rector-implement/SKILL.md b/.claude/skills/rector-implement/SKILL.md index 0895637df..bb9a7d772 100644 --- a/.claude/skills/rector-implement/SKILL.md +++ b/.claude/skills/rector-implement/SKILL.md @@ -100,40 +100,85 @@ For every `MethodCall`, `NullsafeMethodCall`, or `PropertyFetch` node the rector Apply only if the rector extends `AbstractDrupalCoreRector`. -1. Add `testAboveVersion()` method to the test class: - ```php - public function testAboveVersion(): void - { - $this->doTestFile(__DIR__ . '/fixture/basic.php.inc'); - } - ``` - This is the existing test — rename if needed or leave it. - -2. Add `testBelowVersion()` method. Use a version just below the rector's `introduced_version` (e.g., if introduced in `11.4.0`, use `11.3.0`): - ```php - public function testBelowVersion(): void - { - AbstractDrupalCoreRector::setVersionOverride('..0'); - try { - $this->doTestFile(__DIR__ . '/fixture-below-version/basic.php.inc'); - } finally { - AbstractDrupalCoreRector::setVersionOverride(null); - } - } - ``` - -3. Create `tests/src/Drupal11/Rector/Deprecation/[ClassName]/fixture-below-version/basic.php.inc`: - ``` - - ----- - - ``` +Replace the simple test class with the full `testAboveVersion` / `testBelowVersion` form that uses +`DrupalRectorSettings::setDrupalVersion()` (not `AbstractDrupalCoreRector::setVersionOverride()`): + +```php +make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} +``` + +- `'99.99.99'` simulates a Drupal version well above any introduced version → BC wrapper fires. +- `'1.0.0'` simulates a version below every introduced version → rector skips, no change applied. + +Create `tests/src/Drupal11/Rector/Deprecation/[ClassName]/fixture-below-version/basic.php.inc`: +``` + +----- + +``` + +Only "transformable" fixtures (those that produce a change) need a `fixture-below-version/` +counterpart. No-change fixtures (`no_change_*.php.inc`) do not need one — they already show no +transformation. --- @@ -172,7 +217,7 @@ Before declaring the implementation complete, verify all items from `.claude/ski - [ ] QG-A: `isObjectType()` guard present for all MethodCall/PropertyFetch nodes (or explicitly not needed) - [ ] QG-A: `no_change_unrelated.php.inc` fixture exists if a type guard was added -- [ ] QG-B: `testBelowVersion()` and `fixture-below-version/basic.php.inc` present if BC-wrapped +- [ ] QG-B: `testAboveVersion()` + `testBelowVersion()` (with `DrupalRectorSettings::setDrupalVersion`) and `fixture-below-version/basic.php.inc` present if BC-wrapped - [ ] `vendor/bin/phpunit tests/src/Drupal11/Rector/Deprecation/[ClassName]/` passes - [ ] `ddev composer phpstan` reports no new errors - [ ] `ddev composer fix-style` produces no changes From ffd91dea1bfe24e656a6bee9e7ff58a6fa58a51f Mon Sep 17 00:00:00 2001 From: bjorn Date: Sat, 9 May 2026 18:47:53 +0200 Subject: [PATCH 170/256] build: fix codestyle --- src/Drupal10/Rector/Deprecation/AnnotationToAttributeRector.php | 2 +- src/Drupal10/Rector/Deprecation/SystemTimeZonesRector.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Drupal10/Rector/Deprecation/AnnotationToAttributeRector.php b/src/Drupal10/Rector/Deprecation/AnnotationToAttributeRector.php index 042be0328..fde3ba283 100644 --- a/src/Drupal10/Rector/Deprecation/AnnotationToAttributeRector.php +++ b/src/Drupal10/Rector/Deprecation/AnnotationToAttributeRector.php @@ -7,8 +7,8 @@ use DrupalRector\Contract\VersionedConfigurationInterface; use DrupalRector\Drupal10\Rector\ValueObject\AnnotationToAttributeConfiguration; use DrupalRector\Rector\AbstractDrupalCoreRector; -use DrupalRector\Services\DrupalRectorSettings; use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; +use DrupalRector\Services\DrupalRectorSettings; use PhpParser\Node; use PhpParser\Node\Arg; use PhpParser\Node\Attribute; diff --git a/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector.php b/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector.php index 36a8d00e3..9c050c8fb 100644 --- a/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector.php +++ b/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector.php @@ -6,8 +6,8 @@ use DrupalRector\Contract\VersionedConfigurationInterface; use DrupalRector\Rector\AbstractDrupalCoreRector; -use DrupalRector\Services\DrupalRectorSettings; use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; +use DrupalRector\Services\DrupalRectorSettings; use PhpParser\Node; use PhpParser\Node\Expr\ConstFetch; use Rector\PhpParser\Node\Value\ValueResolver; From ace9a731360ab8ad77736a569cd94a23311e1526 Mon Sep 17 00:00:00 2001 From: bjorn Date: Sun, 10 May 2026 07:37:18 +0200 Subject: [PATCH 171/256] chore: just setup at start, always update and scan. --- .claude/scripts/setup-repos.sh | 16 ++------ .claude/skills/rector-discover/SKILL.md | 54 +++++++++---------------- 2 files changed, 21 insertions(+), 49 deletions(-) diff --git a/.claude/scripts/setup-repos.sh b/.claude/scripts/setup-repos.sh index 092c698e4..d1449bcbd 100755 --- a/.claude/scripts/setup-repos.sh +++ b/.claude/scripts/setup-repos.sh @@ -13,12 +13,6 @@ set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPOS_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)/repos" -UPDATE=false - -for arg in "$@"; do - [ "$arg" = "--update" ] && UPDATE=true -done - mkdir -p "$REPOS_DIR" clone_or_update() { @@ -28,13 +22,9 @@ clone_or_update() { local dest="$REPOS_DIR/$name" if [ -d "$dest/.git" ]; then - if $UPDATE; then - echo "==> Updating $name..." - git -C "$dest" fetch --depth=1 ${branch:+origin "$branch"} 2>&1 | tail -3 - git -C "$dest" reset --hard FETCH_HEAD - else - echo "==> $name already cloned -skipping (use --update to refresh)" - fi + echo "==> Updating $name..." + git -C "$dest" fetch --depth=1 ${branch:+origin "$branch"} 2>&1 | tail -3 + git -C "$dest" reset --hard FETCH_HEAD else echo "==> Cloning $name..." local clone_args=(--depth=1) diff --git a/.claude/skills/rector-discover/SKILL.md b/.claude/skills/rector-discover/SKILL.md index 8c1c3f9bc..1a3f7aace 100644 --- a/.claude/skills/rector-discover/SKILL.md +++ b/.claude/skills/rector-discover/SKILL.md @@ -13,29 +13,20 @@ Show which drupal-digests deprecation rules still need to be implemented in drup ### 1. Ensure the digests repo is available -The canonical path is `repos/drupal-digests` (inside ddev: `/var/www/html/repos/drupal-digests`). If absent, run the setup script first: +The canonical path is `repos/drupal-digests` (inside ddev: `/var/www/html/repos/drupal-digests`). Always run the setup script first to clone or update the repositories: ```bash +bash .claude/scripts/setup-repos.sh ``` ### 2. Ensure the index is fresh -Check whether `docs/rector-index.yml` exists and is less than 24 hours old: - -```bash -[ -d repos/drupal-digests ] || bash .claude/scripts/setup-repos.sh -``` - -### 2. Ensure the index is fresh +Update the `docs/rector-index.yml`: ```bash INDEX="docs/rector-index.yml" -if [ ! -f "$INDEX" ] || [ "$(find "$INDEX" -mmin +1440 2>/dev/null)" ]; then - echo "Regenerating rector-index.yml…" - php .claude/scripts/generate-rector-index.php --digests-path=repos/drupal-digests -else - echo "Using existing index ($(date -r "$INDEX" '+%Y-%m-%d %H:%M'))" -fi +echo "Regenerating rector-index.yml…" +php .claude/scripts/generate-rector-index.php --digests-path=repos/drupal-digests ``` ### 3. Read the index @@ -56,7 +47,7 @@ Rector Index — implemented: X config-only: Y pending: Z ``` -Then list pending entries grouped by phase in order: 1a → 1b → 1c → 2 → 3 → 4 → unknown. +Then list pending entries grouped by phase in order: 1a → 1b → 1c → 2 → 3 → 4 → unknown. For each phase list the title of that phase. For each pending entry show: ``` @@ -78,25 +69,16 @@ Next suggested: /rector-implement repos/drupal-digests/rector/rules/method()`) | `FunctionToFirstArgMethodRector` | -| 1a | Service ID rename (`\Drupal::service('old')` → `\Drupal::service('new')`) | `DrupalServiceRenameRector` | -| 1b | FuncCall → static call | `FunctionToStaticRector` | -| 1c | Class constant → class constant (`OldClass::OLD` → `NewClass::NEW`) | `ClassConstantToClassConstantRector` | +| Phase | Description | Generic rector | +|-------|---------------------------------------------------------------------------------|----------------| +| 1a | FuncCall → service call (`fn(...)` -> `\Drupal::service(...)` | `FunctionToServiceRector` | +| 1a | FuncCall → method on first arg (`fn($obj)` → `$obj->method()`) | `FunctionToFirstArgMethodRector` | +| 1a | Service ID rename (`\Drupal::service('old')` → `\Drupal::service('new')`) | `DrupalServiceRenameRector` | +| 1b | FuncCall → static call on class (`fn(...)` -> `Class::method(...)` | `FunctionToStaticRector` | +| 1c | Class constant → class constant (`OldClass::OLD` → `NewClass::NEW`) | `ClassConstantToClassConstantRector` | | 1c | Bare global constant → class constant (`DEPRECATED_CONST` → `\Ns\Class::CONST`) | `ConstantToClassConstantRector` | -| 2 | MethodCall rename with type check (`$obj->old()` → `$obj->new()`) | `MethodToMethodWithCheckRector` | -| 2 | MethodCall custom transformation | custom `AbstractRector` or `AbstractDrupalCoreRector` | -| 3 | Remove a function call statement with no replacement | `FunctionCallRemovalRector` | -| 3 | Node removal (other patterns) | custom class returning `REMOVE_NODE` | -| 4 | Complex / multi-node | custom class | - -## Refreshing manually - -To force a full regeneration: -```bash -php .claude/scripts/generate-rector-index.php -``` - -The generated file is gitignored — it's always derived from source. +| 2 | MethodCall rename with type check (`$obj->old()` → `$obj->new()`) | `MethodToMethodWithCheckRector` | +| 2 | MethodCall custom transformation | custom `AbstractRector` or `AbstractDrupalCoreRector` | +| 3 | Remove a function call statement with no replacement | `FunctionCallRemovalRector` | +| 3 | Node removal (other patterns) | custom class returning `REMOVE_NODE` | +| 4 | Complex / multi-node | custom class | From a683d6be0a53207599fd2d92d72ba24a1cbd8e53 Mon Sep 17 00:00:00 2001 From: bjorn Date: Sun, 10 May 2026 07:50:23 +0200 Subject: [PATCH 172/256] docs(skills): FIxup recipes links --- .claude/skills/prompts/recipes/RECIPES.md | 34 +++++++++++------------ .claude/skills/rector-discover/SKILL.md | 4 +-- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/.claude/skills/prompts/recipes/RECIPES.md b/.claude/skills/prompts/recipes/RECIPES.md index f12eda8be..3ced63a28 100644 --- a/.claude/skills/prompts/recipes/RECIPES.md +++ b/.claude/skills/prompts/recipes/RECIPES.md @@ -20,22 +20,22 @@ Read the digest. Answer these questions in order: - Multiple node types in one class → **custom** (`digest-to-rector-prompt.md`) 2. **What does the replacement look like?** - - `fn()` is removed entirely, no replacement → **func-removal** (config-only) - - `SomeClass::staticMethod()` → **func-to-static** (config-only) - - `\Drupal::service('string.id')->method()` → **func-to-string-service** (config-only) - - `\Drupal::service(FqcnClass::class)->method()`, simple 1-to-1 → **config-only** (`FunctionToServiceConfiguration(..., true)`) + - `fn()` is removed entirely, no replacement → [`config-only-template.md#functioncallremovalrector`](config-only-template.md#functioncallremovalrector) + - `SomeClass::staticMethod()` → [`config-only-template.md#functiontostaticroctor`](config-only-template.md#functiontostaticroctor) + - `\Drupal::service('string.id')->method()` → [`config-only-template.md#functiontoservicerector`](config-only-template.md#functiontoservicerector) + - `\Drupal::service(FqcnClass::class)->method()`, simple 1-to-1 → [`config-only-template.md#functiontoservicerector`](config-only-template.md#functiontoservicerector) (`FunctionToServiceConfiguration(..., true)`) - `\Drupal::service(FqcnClass::class)->method()`, arg-count dispatch / chained / mixed → **func-to-class-service-bc** or **func-to-class-service-bc-multi** ✓ - - `$firstArg->method()` (method on first argument) → **func-to-first-arg-method** (config-only) - - `\Drupal::service('old.id')` → `\Drupal::service('new.id')` → **service-rename** (config-only) + - `$firstArg->method()` (method on first argument) → [`config-only-template.md#functiontofirstargmethodrector`](config-only-template.md#functiontofirstargmethodrector) + - `\Drupal::service('old.id')` → `\Drupal::service('new.id')` → [`config-only-template.md#drupalservicerenamerector`](config-only-template.md#drupalservicerenamerector) - Something else → **custom** (`digest-to-rector-prompt.md`) 3. **For MethodCall:** which generic rector applies? - - Rename with receiver type check → **method-rename** (config-only) + - Rename with receiver type check → [`config-only-template.md#methodtomethodwithcheckrector`](config-only-template.md#methodtomethodwithcheckrector) - Complex transformation → **custom** 4. **For ClassConstFetch:** - - `OldClass::CONST` → `NewClass::CONST` → **class-const-rename** (config-only) - - `GLOBAL_CONST` → `SomeClass::CONST` → **global-const-to-class-const** (config-only) + - `OldClass::CONST` → `NewClass::CONST` → [`config-only-template.md#classconstanttoclassconstantrector`](config-only-template.md#classconstanttoclassconstantrector) + - `GLOBAL_CONST` → `SomeClass::CONST` → [`config-only-template.md#constanttoclassconstantrector`](config-only-template.md#constanttoclassconstantrector) --- @@ -45,14 +45,14 @@ Read the digest. Answer these questions in order: |---|---|---|---| | `func-to-class-service-bc.md` | FuncCall → `Fqcn::class` service, complex (dispatch/chained) | custom class | ✅ done | | `func-to-class-service-bc-multi.md` | FuncCall → `Fqcn::class` service, multiple with complex logic | custom class | ✅ done | -| `func-removal.md` | FuncCall removed entirely | config-only | 🔲 todo | -| `func-to-static.md` | FuncCall → static method | config-only | 🔲 todo | -| `func-to-string-service.md` | FuncCall → `'service.id'` method | config-only | 🔲 todo | -| `func-to-first-arg-method.md` | FuncCall → method on first arg | config-only | 🔲 todo | -| `service-rename.md` | `\Drupal::service('old')` → `'new'` | config-only | 🔲 todo | -| `method-rename.md` | MethodCall rename with type check | config-only | 🔲 todo | -| `class-const-rename.md` | `OldClass::CONST` → `NewClass::CONST` | config-only | 🔲 todo | -| `global-const-to-class-const.md` | `GLOBAL_CONST` → `Class::CONST` | config-only | 🔲 todo | +| [`config-only-template.md#functioncallremovalrector`](config-only-template.md#functioncallremovalrector) | FuncCall removed entirely | config-only | ✅ done | +| [`config-only-template.md#functiontostaticroctor`](config-only-template.md#functiontostaticroctor) | FuncCall → static method | config-only | ✅ done | +| [`config-only-template.md#functiontoservicerector`](config-only-template.md#functiontoservicerector) | FuncCall → `'service.id'` method or `Fqcn::class` simple 1-to-1 | config-only | ✅ done | +| [`config-only-template.md#functiontofirstargmethodrector`](config-only-template.md#functiontofirstargmethodrector) | FuncCall → method on first arg | config-only | ✅ done | +| [`config-only-template.md#drupalservicerenamerector`](config-only-template.md#drupalservicerenamerector) | `\Drupal::service('old')` → `'new'` | config-only | ✅ done | +| [`config-only-template.md#methodtomethodwithcheckrector`](config-only-template.md#methodtomethodwithcheckrector) | MethodCall rename with type check | config-only | ✅ done | +| [`config-only-template.md#classconstanttoclassconstantrector`](config-only-template.md#classconstanttoclassconstantrector) | `OldClass::CONST` → `NewClass::CONST` | config-only | ✅ done | +| [`config-only-template.md#constanttoclassconstantrector`](config-only-template.md#constanttoclassconstantrector) | `GLOBAL_CONST` → `Class::CONST` | config-only | ✅ done | --- diff --git a/.claude/skills/rector-discover/SKILL.md b/.claude/skills/rector-discover/SKILL.md index 1a3f7aace..881dc95ed 100644 --- a/.claude/skills/rector-discover/SKILL.md +++ b/.claude/skills/rector-discover/SKILL.md @@ -47,11 +47,11 @@ Rector Index — implemented: X config-only: Y pending: Z ``` -Then list pending entries grouped by phase in order: 1a → 1b → 1c → 2 → 3 → 4 → unknown. For each phase list the title of that phase. +Then list pending entries grouped by phase in order: 1a → 1b → 1c → 2 → 3 → 4 → unknown. Eg: `Phase 3 — Remove function call / node removal` For each pending entry show: ``` -[Phase 2] ReplaceSessionManagerDeleteRector — issue #3577376 +[Phase 2] ReplaceSessionManagerDeleteRector — issue [#3577376](https://www.drupal.org/i/3577376) Digest: replace-deprecated-sessionmanager-delete-with-3577376.php ``` From e0516050af6340ede9e319575e797c2d1e0cc23e Mon Sep 17 00:00:00 2001 From: bjorn Date: Sun, 10 May 2026 08:16:15 +0200 Subject: [PATCH 173/256] docs(skills): Add extra guards to make deciding to use a AbstractDrupalCoreRector better --- .../skills/prompts/digest-to-rector-prompt.md | 52 ++++++++++++++----- .claude/skills/rector-qa/SKILL.md | 26 ++++++---- 2 files changed, 54 insertions(+), 24 deletions(-) diff --git a/.claude/skills/prompts/digest-to-rector-prompt.md b/.claude/skills/prompts/digest-to-rector-prompt.md index 524d91e22..3edbaedc0 100644 --- a/.claude/skills/prompts/digest-to-rector-prompt.md +++ b/.claude/skills/prompts/digest-to-rector-prompt.md @@ -128,26 +128,50 @@ Answer these questions using the information gathered: **Q3: Was the deprecation introduced in Drupal >= 10.1.0?** - Compare the introduced version from Step 2 against `10.1.0`. -- If introduced version >= `10.1.0` AND Q2 is eligible → BC wrapping **applies**. +- If introduced version >= `10.1.0` AND Q2 is eligible → BC wrapping is **potentially applicable**, but check Q4. - Otherwise → BC wrapping does **not** apply. +**Q4: Does the replacement code depend on a new Drupal API?** + +This is the key semantic question that overrides the structural eligibility from Q2/Q3. + +Ask: *Could the transformed code run unchanged on a Drupal version that predates the deprecation?* + +- **Yes, it depends on a new API** → BC wrapping IS needed. + The replacement calls a function, method, class, or constant that was introduced at the same + time as the deprecation. Running the new code on an older Drupal would cause a fatal error or + missing-symbol error. The BC wrapper lets contrib code work on both old and new Drupal + simultaneously. + > Example: `locale_config_batch_set_config_langcodes()` → `locale_config_batch_update_default_config_langcodes()`. + > The new function only exists on Drupal ≥ 11.1.0; calling it on 11.0.x would fail. + +- **No, the replacement is version-agnostic** → BC wrapping is **NOT** needed — use `AbstractRector`. + The replacement is pure PHP, uses only native PHP functions, or uses Drupal APIs that existed + long before this deprecation. The transformed code is safe to run on any Drupal version, so + there is nothing to guard with a version check. + > Example: `uasort($arr, 'system_sort_themes')` → `uasort($arr, static function ($a, $b) { … })`. + > The inline closure is pure PHP and works on every Drupal version; BC wrapping adds no value. + **Decision:** -- BC wrapping applies → Use `AbstractDrupalCoreRector` + `DrupalIntroducedVersionConfiguration` -- BC wrapping does not apply → Use `AbstractRector` +- Q2 eligible AND Q3 >= 10.1.0 AND Q4 = new API → Use `AbstractDrupalCoreRector` + `DrupalIntroducedVersionConfiguration` +- Q4 = version-agnostic replacement (or Q2/Q3 not met) → Use `AbstractRector` **Quick reference:** -| Input node | Output node | Introduced | Base class | BC wrapping | -|---|---|---|---|---| -| `FuncCall` | `StaticCall` | >= 10.1.0 | `AbstractDrupalCoreRector` | Yes | -| `FuncCall` | `MethodCall` | >= 10.1.0 | `AbstractDrupalCoreRector` | Yes | -| `MethodCall` | `MethodCall` | >= 10.1.0 | `AbstractDrupalCoreRector` | Yes | -| `Array_` | `Array_` | >= 10.1.0 | `AbstractDrupalCoreRector` | Yes | -| `New_` | `New_` | >= 10.1.0 | `AbstractDrupalCoreRector` | Yes | -| `ClassConstFetch` | `ClassConstFetch` | >= 10.1.0 | `AbstractDrupalCoreRector` | Yes | -| `FuncCall` | `StaticCall` | < 10.1.0 | `AbstractRector` | No | -| `ArrayItem` | `ArrayItem` | any | `AbstractRector` | No (PHP syntax limit) | -| `Class_` (structural) | `Class_` | any | `AbstractRector` | No (not an Expr) | +| Input node | Output node | Replacement type | Introduced | Base class | BC wrapping | +|---|---|---|---|---|---| +| `FuncCall` | `FuncCall` (renamed) | new Drupal function | >= 10.1.0 | `AbstractDrupalCoreRector` | Yes | +| `FuncCall` | `StaticCall` | new static method | >= 10.1.0 | `AbstractDrupalCoreRector` | Yes | +| `FuncCall` | `MethodCall` | new service method | >= 10.1.0 | `AbstractDrupalCoreRector` | Yes | +| `MethodCall` | `MethodCall` | new method on same class | >= 10.1.0 | `AbstractDrupalCoreRector` | Yes | +| `Array_` | `Array_` | new class constant/callable | >= 10.1.0 | `AbstractDrupalCoreRector` | Yes | +| `New_` | `New_` | new class name | >= 10.1.0 | `AbstractDrupalCoreRector` | Yes | +| `ClassConstFetch` | `ClassConstFetch` | new class constant | >= 10.1.0 | `AbstractDrupalCoreRector` | Yes | +| `FuncCall` | `FuncCall` (modified args) | pure PHP / no new API | any | `AbstractRector` | No | +| `MethodCall` | `FuncCall` | native PHP function | any | `AbstractRector` | No | +| `FuncCall` | `StaticCall` | any | < 10.1.0 | `AbstractRector` | No | +| `ArrayItem` | `ArrayItem` | any | any | `AbstractRector` | No (PHP syntax limit) | +| `Class_` (structural) | `Class_` | any | any | `AbstractRector` | No (not an Expr) | --- diff --git a/.claude/skills/rector-qa/SKILL.md b/.claude/skills/rector-qa/SKILL.md index 3bf73c4d1..142c61bdb 100644 --- a/.claude/skills/rector-qa/SKILL.md +++ b/.claude/skills/rector-qa/SKILL.md @@ -141,11 +141,11 @@ Do not run the other three passes in bulk mode. 2. Check for required coverage: -| Fixture | Required when | Status | -|---------|--------------|--------| -| `fixture/basic.php.inc` | Always | ✅/❌ | -| `fixture/no_change_unrelated.php.inc` | Rector uses `isObjectType()` | ✅/❌ | -| `fixture-below-version/basic.php.inc` | Rector extends `AbstractDrupalCoreRector` | ✅/❌ | +| Fixture | Required when | Status | +|---------|-------------------------------------------------|--------| +| `fixture/basic.php.inc` | Always | ✅/❌ | +| `fixture/no_change_unrelated.php.inc` | Always | ✅/❌ | +| `fixture-below-version/basic.php.inc` | Rector extends `AbstractDrupalCoreRector` | ✅/❌ | | Edge-case fixtures | Rector has conditional branches in `refactor()` | ✅/❌/N/A | 3. For `no_change_unrelated.php.inc`: verify the before and after sections are **identical** (the rector must NOT change untyped code). @@ -168,16 +168,22 @@ Do not run the other three passes in bulk mode. 2. Re-run the Step 4 decision: - **Q1:** What node types does `getNodeTypes()` return? - - **Q2:** Is the transformation CallLike → CallLike? - - Old node is CallLike if: `FuncCall`, `MethodCall`, `StaticCall`, `NullsafeMethodCall`, `New_` - - New node (what `refactor()` or `refactorWithConfiguration()` returns) is CallLike if: same list + - **Q2:** Is the transformation Expr → Expr? + - Old node is `Node\Expr` if: `FuncCall`, `MethodCall`, `StaticCall`, `NullsafeMethodCall`, `New_`, `Array_`, `ClassConstFetch`, `String_`, etc. + - New node (what `refactor()` or `refactorWithConfiguration()` returns) must also be `Node\Expr`. - **Q3:** Was the deprecation introduced in Drupal >= 10.1.0? - Check `introduced_version` in the test config or `DrupalIntroducedVersionConfiguration` usage. - If unclear, read `repos/drupal-digests/issues/drupal-core/.md`. + - **Q4:** Does the replacement code depend on a new Drupal API? + - Read `refactor()`/`refactorWithConfiguration()` and identify what the returned node calls or + references (function name, class name, method name, constant). + - Ask: could this replacement code run unchanged on a Drupal version that predates the deprecation? + - **New Drupal API** (function/method/class introduced alongside the deprecation) → BC needed. + - **Pure PHP or version-agnostic** (native functions, inline closures, no new Drupal symbols) → BC NOT needed. 3. Expected base class: - - Q2 = CallLike → CallLike AND Q3 = version >= 10.1.0 → **`AbstractDrupalCoreRector`** - - Otherwise → **`AbstractRector`** + - Q2 = Expr → Expr AND Q3 = version >= 10.1.0 AND **Q4 = new Drupal API** → **`AbstractDrupalCoreRector`** + - Q4 = version-agnostic replacement (or Q2/Q3 not met) → **`AbstractRector`** 4. Compare expected vs actual. From 843fee10cdf0cab6d3b6cf66fbf0e80c73cee87d Mon Sep 17 00:00:00 2001 From: bjorn Date: Sun, 10 May 2026 08:45:59 +0200 Subject: [PATCH 174/256] feat(Drupal11): Add SystemSortThemesRector for issue #3571172 --- .../Deprecation/SystemSortThemesRector.php | 118 ++++++++++++++++++ .../SystemSortThemesRectorTest.php | 26 ++++ .../config/configured_rule.php | 11 ++ .../fixture/basic.php.inc | 21 ++++ .../fixture/no_change_unrelated.php.inc | 13 ++ 5 files changed, 189 insertions(+) create mode 100644 src/Drupal11/Rector/Deprecation/SystemSortThemesRector.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/SystemSortThemesRector/SystemSortThemesRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/SystemSortThemesRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/SystemSortThemesRector/fixture/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/SystemSortThemesRector/fixture/no_change_unrelated.php.inc diff --git a/src/Drupal11/Rector/Deprecation/SystemSortThemesRector.php b/src/Drupal11/Rector/Deprecation/SystemSortThemesRector.php new file mode 100644 index 000000000..7fdc9804f --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/SystemSortThemesRector.php @@ -0,0 +1,118 @@ +is_default) { + return -1; + } + if ($b->is_default) { + return 1; + } + return strcasecmp($a->info['name'], $b->info['name']); +}); +CODE_AFTER + ), + ] + ); + } + + /** @return array> */ + public function getNodeTypes(): array + { + return [FuncCall::class]; + } + + /** @param FuncCall $node */ + public function refactor(Node $node): ?Node + { + if (!$this->isName($node, 'uasort')) { + return null; + } + + if (count($node->args) < 2) { + return null; + } + + $secondArg = $node->args[1]; + if (!$secondArg instanceof Arg) { + return null; + } + + $callbackValue = $secondArg->value; + if (!$callbackValue instanceof String_ || $callbackValue->value !== 'system_sort_themes') { + return null; + } + + $varA = new Variable('a'); + $varB = new Variable('b'); + + $ifADefault = new If_( + new PropertyFetch($varA, 'is_default'), + ['stmts' => [new Return_(new UnaryMinus(new Int_(1)))]] + ); + + $ifBDefault = new If_( + new PropertyFetch($varB, 'is_default'), + ['stmts' => [new Return_(new Int_(1))]] + ); + + $returnStmt = new Return_( + new FuncCall( + new Node\Name('strcasecmp'), + [ + new Arg(new ArrayDimFetch(new PropertyFetch($varA, 'info'), new String_('name'))), + new Arg(new ArrayDimFetch(new PropertyFetch($varB, 'info'), new String_('name'))), + ] + ) + ); + + $closure = new Closure([ + 'static' => true, + 'params' => [new Param($varA), new Param($varB)], + 'stmts' => [$ifADefault, $ifBDefault, $returnStmt], + ]); + + $node->args[1] = new Arg($closure); + + return $node; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/SystemSortThemesRector/SystemSortThemesRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/SystemSortThemesRector/SystemSortThemesRectorTest.php new file mode 100644 index 000000000..19e49a056 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/SystemSortThemesRector/SystemSortThemesRectorTest.php @@ -0,0 +1,26 @@ +doTestFile($filePath); + } + + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/SystemSortThemesRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/SystemSortThemesRector/config/configured_rule.php new file mode 100644 index 000000000..8516871b1 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/SystemSortThemesRector/config/configured_rule.php @@ -0,0 +1,11 @@ + +----- +is_default) { + return -1; + } + if ($b->is_default) { + return 1; + } + return strcasecmp($a->info['name'], $b->info['name']); + }); +} +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/SystemSortThemesRector/fixture/no_change_unrelated.php.inc b/tests/src/Drupal11/Rector/Deprecation/SystemSortThemesRector/fixture/no_change_unrelated.php.inc new file mode 100644 index 000000000..706de9f53 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/SystemSortThemesRector/fixture/no_change_unrelated.php.inc @@ -0,0 +1,13 @@ + +----- + From ad71832d8848f45af8ada9d28ecb08b107d49433 Mon Sep 17 00:00:00 2001 From: bjorn Date: Sun, 10 May 2026 09:19:05 +0200 Subject: [PATCH 175/256] feat(Drupal11): Add BlockContentTestBaseStringToArrayRector for issue #3196937 Replaces the deprecated string $values argument in BlockContentTestBase::createBlockContentType() with an array (['id' => 'basic']) as required since drupal:11.1.0. --- .claude/settings.local.json | 8 ++ ...lockContentTestBaseStringToArrayRector.php | 111 ++++++++++++++++++ .../Traits/BlockContentCreationTrait.php | 13 ++ ...ContentTestBaseStringToArrayRectorTest.php | 54 +++++++++ .../config/configured_rule.php | 14 +++ .../fixture-below-version/basic.php.inc | 11 ++ .../fixture/basic.php.inc | 11 ++ .../fixture/no_change_unrelated.php.inc | 21 ++++ 8 files changed, 243 insertions(+) create mode 100644 .claude/settings.local.json create mode 100644 src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector.php create mode 100644 stubs/Drupal/Tests/block_content/Traits/BlockContentCreationTrait.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector/BlockContentTestBaseStringToArrayRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector/fixture/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector/fixture/no_change_unrelated.php.inc diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 000000000..146792739 --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,8 @@ +{ + "permissions": { + "allow": [ + "Skill(rector-qa)", + "Skill(rector-discover)" + ] + } +} diff --git a/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector.php b/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector.php new file mode 100644 index 000000000..2420bb735 --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector.php @@ -0,0 +1,111 @@ + 'basic'] instead of a plain string. + * + * @see https://www.drupal.org/node/3196937 + * @see https://www.drupal.org/node/3473739 + */ +class BlockContentTestBaseStringToArrayRector extends AbstractDrupalCoreRector +{ + /** @var DrupalIntroducedVersionConfiguration[] */ + protected array $configuration; + + public function configure(array $configuration): void + { + foreach ($configuration as $value) { + if (!$value instanceof DrupalIntroducedVersionConfiguration) { + throw new \InvalidArgumentException(sprintf('Each configuration item must be an instance of "%s"', DrupalIntroducedVersionConfiguration::class)); + } + } + parent::configure($configuration); + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition( + "Replace deprecated string \$values in BlockContentTestBase::createBlockContentType() with an ['id' => ...] array", + [ + new ConfiguredCodeSample( + <<<'CODE_BEFORE' +$this->createBlockContentType('basic', TRUE); +CODE_BEFORE, + <<<'CODE_AFTER' +$this->createBlockContentType(['id' => 'basic'], TRUE); +CODE_AFTER, + [new DrupalIntroducedVersionConfiguration('11.1.0')] + ), + ] + ); + } + + /** @return array> */ + public function getNodeTypes(): array + { + return [MethodCall::class]; + } + + protected function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node + { + if (!$node instanceof MethodCall) { + return null; + } + + if (!$this->isName($node->name, 'createBlockContentType')) { + return null; + } + + if (count($node->args) === 0) { + return null; + } + + $firstArg = $node->args[0]; + if (!$firstArg instanceof Arg) { + return null; + } + + if (!$firstArg->value instanceof String_) { + return null; + } + + // Skip InlineBlockTestBase::createBlockContentType($id, $label) — two string args. + if (isset($node->args[1])) { + $secondArg = $node->args[1]; + if ($secondArg instanceof Arg && $secondArg->value instanceof String_) { + return null; + } + } + + if (!$this->isObjectType($node->var, new ObjectType('Drupal\Tests\block_content\Traits\BlockContentCreationTrait'))) { + return null; + } + + // Clone to avoid mutating the original node — required for correct BC wrapping. + $clonedNode = clone $node; + $clonedArg = clone $firstArg; + $clonedArg->value = new Array_([new ArrayItem($firstArg->value, new String_('id'))]); + $clonedNode->args[0] = $clonedArg; + + return $clonedNode; + } +} diff --git a/stubs/Drupal/Tests/block_content/Traits/BlockContentCreationTrait.php b/stubs/Drupal/Tests/block_content/Traits/BlockContentCreationTrait.php new file mode 100644 index 000000000..9755faa8d --- /dev/null +++ b/stubs/Drupal/Tests/block_content/Traits/BlockContentCreationTrait.php @@ -0,0 +1,13 @@ +make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } + } + + /** + * @return \Iterator + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } + } + + /** + * @return \Iterator + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector/config/configured_rule.php new file mode 100644 index 000000000..7880a3ff6 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector/config/configured_rule.php @@ -0,0 +1,14 @@ +createBlockContentType('basic', TRUE); +?> +----- +createBlockContentType('basic', TRUE); +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector/fixture/basic.php.inc new file mode 100644 index 000000000..678790568 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector/fixture/basic.php.inc @@ -0,0 +1,11 @@ +createBlockContentType('basic', TRUE); +?> +----- + $testBase->createBlockContentType(['id' => 'basic'], TRUE), fn() => $testBase->createBlockContentType('basic', TRUE)); +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector/fixture/no_change_unrelated.php.inc b/tests/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector/fixture/no_change_unrelated.php.inc new file mode 100644 index 000000000..d6ad0d5ca --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector/fixture/no_change_unrelated.php.inc @@ -0,0 +1,21 @@ +createBlockContentType('basic', TRUE); + +// Two string args — InlineBlockTestBase pattern, must not change. +/** @var \Drupal\Tests\block_content\Traits\BlockContentCreationTrait $testBase */ +$testBase->createBlockContentType('basic', 'Basic block'); +?> +----- +createBlockContentType('basic', TRUE); + +// Two string args — InlineBlockTestBase pattern, must not change. +/** @var \Drupal\Tests\block_content\Traits\BlockContentCreationTrait $testBase */ +$testBase->createBlockContentType('basic', 'Basic block'); +?> From 006d00c499f368eb5a14fc5e73ff037ea0a1a026 Mon Sep 17 00:00:00 2001 From: bjorn Date: Sun, 10 May 2026 11:00:28 +0200 Subject: [PATCH 176/256] fix(Drupal11): Switch BlockContentTestBaseStringToArrayRector to AbstractRector Array signature predates 11.1.0 so the replacement is version-agnostic; no BC wrapping needed. Remove fixture-below-version and simplify test class. --- ...lockContentTestBaseStringToArrayRector.php | 41 ++++--------------- ...ContentTestBaseStringToArrayRectorTest.php | 32 +-------------- .../config/configured_rule.php | 5 +-- .../fixture-below-version/basic.php.inc | 11 ----- .../fixture/basic.php.inc | 2 +- 5 files changed, 13 insertions(+), 78 deletions(-) delete mode 100644 tests/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector/fixture-below-version/basic.php.inc diff --git a/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector.php b/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector.php index 2420bb735..e44d6dd89 100644 --- a/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector.php +++ b/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector.php @@ -4,9 +4,6 @@ namespace DrupalRector\Drupal11\Rector\Deprecation; -use DrupalRector\Contract\VersionedConfigurationInterface; -use DrupalRector\Rector\AbstractDrupalCoreRector; -use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use PhpParser\Node; use PhpParser\Node\Arg; use PhpParser\Node\ArrayItem; @@ -14,7 +11,8 @@ use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Scalar\String_; use PHPStan\Type\ObjectType; -use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; +use Rector\Rector\AbstractRector; +use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -26,34 +24,20 @@ * @see https://www.drupal.org/node/3196937 * @see https://www.drupal.org/node/3473739 */ -class BlockContentTestBaseStringToArrayRector extends AbstractDrupalCoreRector +class BlockContentTestBaseStringToArrayRector extends AbstractRector { - /** @var DrupalIntroducedVersionConfiguration[] */ - protected array $configuration; - - public function configure(array $configuration): void - { - foreach ($configuration as $value) { - if (!$value instanceof DrupalIntroducedVersionConfiguration) { - throw new \InvalidArgumentException(sprintf('Each configuration item must be an instance of "%s"', DrupalIntroducedVersionConfiguration::class)); - } - } - parent::configure($configuration); - } - public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( "Replace deprecated string \$values in BlockContentTestBase::createBlockContentType() with an ['id' => ...] array", [ - new ConfiguredCodeSample( + new CodeSample( <<<'CODE_BEFORE' $this->createBlockContentType('basic', TRUE); CODE_BEFORE, <<<'CODE_AFTER' $this->createBlockContentType(['id' => 'basic'], TRUE); -CODE_AFTER, - [new DrupalIntroducedVersionConfiguration('11.1.0')] +CODE_AFTER ), ] ); @@ -65,12 +49,9 @@ public function getNodeTypes(): array return [MethodCall::class]; } - protected function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node + /** @param MethodCall $node */ + public function refactor(Node $node): ?Node { - if (!$node instanceof MethodCall) { - return null; - } - if (!$this->isName($node->name, 'createBlockContentType')) { return null; } @@ -100,12 +81,8 @@ protected function refactorWithConfiguration(Node $node, VersionedConfigurationI return null; } - // Clone to avoid mutating the original node — required for correct BC wrapping. - $clonedNode = clone $node; - $clonedArg = clone $firstArg; - $clonedArg->value = new Array_([new ArrayItem($firstArg->value, new String_('id'))]); - $clonedNode->args[0] = $clonedArg; + $firstArg->value = new Array_([new ArrayItem($firstArg->value, new String_('id'))]); - return $clonedNode; + return $node; } } diff --git a/tests/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector/BlockContentTestBaseStringToArrayRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector/BlockContentTestBaseStringToArrayRectorTest.php index b5a71cc90..bdce8a81c 100644 --- a/tests/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector/BlockContentTestBaseStringToArrayRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector/BlockContentTestBaseStringToArrayRectorTest.php @@ -4,49 +4,21 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\BlockContentTestBaseStringToArrayRector; -use DrupalRector\Services\DrupalRectorSettings; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class BlockContentTestBaseStringToArrayRectorTest extends AbstractRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] - public function testAboveVersion(string $filePath): void + public function test(string $filePath): void { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } - /** - * @return \Iterator - */ public static function provideData(): \Iterator { return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } - #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] - public function testBelowVersion(string $filePath): void - { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } - } - - /** - * @return \Iterator - */ - public static function provideDataBelowVersion(): \Iterator - { - return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); - } - public function provideConfigFilePath(): string { return __DIR__.'/config/configured_rule.php'; diff --git a/tests/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector/config/configured_rule.php index 7880a3ff6..8037813da 100644 --- a/tests/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector/config/configured_rule.php +++ b/tests/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector/config/configured_rule.php @@ -3,12 +3,9 @@ declare(strict_types=1); use DrupalRector\Drupal11\Rector\Deprecation\BlockContentTestBaseStringToArrayRector; -use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use DrupalRector\Tests\Rector\Deprecation\DeprecationBase; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { - DeprecationBase::addClass(BlockContentTestBaseStringToArrayRector::class, $rectorConfig, false, [ - new DrupalIntroducedVersionConfiguration('11.1.0'), - ]); + DeprecationBase::addClass(BlockContentTestBaseStringToArrayRector::class, $rectorConfig, false); }; diff --git a/tests/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector/fixture-below-version/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector/fixture-below-version/basic.php.inc deleted file mode 100644 index e4d9987d0..000000000 --- a/tests/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector/fixture-below-version/basic.php.inc +++ /dev/null @@ -1,11 +0,0 @@ -createBlockContentType('basic', TRUE); -?> ------ -createBlockContentType('basic', TRUE); -?> diff --git a/tests/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector/fixture/basic.php.inc index 678790568..67f62cd34 100644 --- a/tests/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector/fixture/basic.php.inc @@ -7,5 +7,5 @@ $testBase->createBlockContentType('basic', TRUE); $testBase->createBlockContentType(['id' => 'basic'], TRUE), fn() => $testBase->createBlockContentType('basic', TRUE)); +$testBase->createBlockContentType(['id' => 'basic'], TRUE); ?> From 5b01788b2128efaee5d66c33afe992f4914070b2 Mon Sep 17 00:00:00 2001 From: bjorn Date: Sun, 10 May 2026 11:03:31 +0200 Subject: [PATCH 177/256] test(Drupal11): Add no-second-arg case to BlockContentTestBaseStringToArrayRector fixture --- .../fixture/basic.php.inc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector/fixture/basic.php.inc index 67f62cd34..c1469fdef 100644 --- a/tests/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector/fixture/basic.php.inc @@ -2,10 +2,12 @@ /** @var \Drupal\Tests\block_content\Traits\BlockContentCreationTrait $testBase */ $testBase->createBlockContentType('basic', TRUE); +$testBase->createBlockContentType('basic'); ?> ----- createBlockContentType(['id' => 'basic'], TRUE); +$testBase->createBlockContentType(['id' => 'basic']); ?> From 9a0bbe4769242b4378044ed34870b7bdbd735e4d Mon Sep 17 00:00:00 2001 From: bjorn Date: Sun, 10 May 2026 11:36:42 +0200 Subject: [PATCH 178/256] docs(skills): Fix script to make sure Drupal12 wont break the index --- .claude/scripts/generate-rector-index.php | 77 +++++++++++++++++++---- .claude/settings.local.json | 6 +- 2 files changed, 69 insertions(+), 14 deletions(-) diff --git a/.claude/scripts/generate-rector-index.php b/.claude/scripts/generate-rector-index.php index efa856e92..a98df399f 100644 --- a/.claude/scripts/generate-rector-index.php +++ b/.claude/scripts/generate-rector-index.php @@ -55,7 +55,7 @@ function main(array $argv): void // Step 1: Build base entries from in-scope digest files. $entries = scanDigestFiles($rulesDir); - // Step 2: Mark implemented custom classes — scan src/DrupalXX/ dirs for version >= 10, newest first. + // Step 2: Mark implemented custom classes — scan src/Drupal*/Rector/Deprecation dirs, newest first. $srcDirs = array_filter( glob($repoRoot . '/src/Drupal*/Rector/Deprecation', GLOB_ONLYDIR), fn($d) => preg_match('#/Drupal(\d+)/#', $d, $m) && (int) $m[1] >= 10 @@ -66,8 +66,12 @@ function main(array $argv): void $unmatched += scanImplementedClasses($srcDir, $repoRoot, $entries); } - // Step 3: Mark config-only Phase 1 entries. - scanConfigFiles($repoRoot . '/config/drupal-11', $entries); + // Build a reverse lookup: shortClassName => {class, files} for all known implemented classes. + // Used in Step 3 so config files can link pending issues to existing custom rectors. + $implementedClasses = buildClassMap($entries, $unmatched); + + // Step 3: Mark config-only / implemented entries found in any config/* subdir. + scanConfigFiles($repoRoot . '/config', $entries, $implementedClasses); // Step 4: Add unmatched custom classes (no digest file found). foreach ($unmatched as $className => $data) { @@ -307,30 +311,67 @@ function classifyPhaseFromClass(string $content): string } /** - * Scans config files and marks config-only Phase 1 entries. + * Builds a map of shortClassName => {class, files} for all currently-implemented entries + * plus unmatched classes. Used to resolve custom rectors referenced in config files. * - * @param array> $entries + * @param array> $entries + * @param array> $unmatched + * @return array> */ -function scanConfigFiles(string $configDir, array &$entries): void +function buildClassMap(array $entries, array $unmatched): array { - foreach (glob($configDir . '/*.php') as $configFile) { - if (str_ends_with($configFile, 'drupal-11-all-deprecations.php')) { + $map = []; + + foreach ($entries as $entry) { + if ($entry['status'] !== 'implemented') { continue; } + foreach ((array) $entry['class'] as $cls) { + if ($cls !== null) { + $map[$cls] = ['class' => $cls, 'files' => $entry['files']]; + } + } + } + + foreach ($unmatched as $className => $data) { + $map[$className] = ['class' => $className, 'files' => $data['files']]; + } - $content = file_get_contents($configFile); - $relFile = 'config/drupal-11/' . basename($configFile); + return $map; +} - parseConfigBlock($content, $relFile, $entries); +/** + * Scans all config/* subdirectories and marks config-only / implemented entries. + * + * @param array> $entries + * @param array> $implementedClasses + */ +function scanConfigFiles(string $configRoot, array &$entries, array $implementedClasses): void +{ + foreach (glob($configRoot . '/*/', GLOB_ONLYDIR) as $configDir) { + $dirName = basename(rtrim($configDir, '/')); + foreach (glob($configDir . '*.php') as $configFile) { + // Skip aggregate "all deprecations" bundle files. + if (preg_match('/drupal-\d+-all-deprecations\.php$/', basename($configFile))) { + continue; + } + $content = file_get_contents($configFile); + $relFile = 'config/' . $dirName . '/' . basename($configFile); + parseConfigBlock($content, $relFile, $entries, $implementedClasses); + } } } /** * Parses a config file, associating issue URL comments with rector class calls. * + * Generic rectors (FunctionToServiceRector etc.) → config-only. + * Custom rectors already found in src/ → implemented (linked via $implementedClasses). + * * @param array> $entries + * @param array> $implementedClasses shortClassName => {class, files} */ -function parseConfigBlock(string $content, string $relFile, array &$entries): void +function parseConfigBlock(string $content, string $relFile, array &$entries, array $implementedClasses): void { $lines = explode("\n", $content); $pendingIssues = []; @@ -349,8 +390,8 @@ function parseConfigBlock(string $content, string $relFile, array &$entries): vo $shortClass = extractShortClassName($m[1]); if (isset(GENERIC_RECTORS[$shortClass])) { + // Generic rector — mark as config-only. $phase = GENERIC_RECTORS[$shortClass]; - foreach ($pendingIssues as $issue) { if (isset($entries[$issue]) && $entries[$issue]['status'] === 'pending') { $entries[$issue]['status'] = 'config-only'; @@ -360,6 +401,16 @@ function parseConfigBlock(string $content, string $relFile, array &$entries): vo } } } + } elseif (isset($implementedClasses[$shortClass])) { + // Custom rector already implemented in src/ — mark as implemented. + $classData = $implementedClasses[$shortClass]; + foreach ($pendingIssues as $issue) { + if (isset($entries[$issue]) && $entries[$issue]['status'] === 'pending') { + $entries[$issue]['status'] = 'implemented'; + $entries[$issue]['class'] = $classData['class']; + $entries[$issue]['files'] = $classData['files']; + } + } } $pendingIssues = []; diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 146792739..a16628c8c 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -2,7 +2,11 @@ "permissions": { "allow": [ "Skill(rector-qa)", - "Skill(rector-discover)" + "Skill(rector-discover)", + "Skill(rector-implement)", + "WebFetch(domain:www.drupal.org)", + "Bash(ddev composer *)", + "Bash(rg *)" ] } } From e38016405e8303a4734354261b8ed30f7e2109bb Mon Sep 17 00:00:00 2001 From: bjorn Date: Sun, 10 May 2026 11:37:34 +0200 Subject: [PATCH 179/256] feat(Drupal11): Add MovePointerToMouseOverRector for issue #3421202 Converts deprecated $this->movePointerTo('#css-id') calls to the equivalent $this->getSession()->getDriver()->mouseOver('.//*[@id="..."]') chain. Handles simple CSS ID selectors only; complex selectors are left untouched. Includes a stub for LayoutBuilderDisableInteractionsTest. --- .../MovePointerToMouseOverRector.php | 93 +++++++++++++++++++ .../LayoutBuilderDisableInteractionsTest.php | 13 +++ .../MovePointerToMouseOverRectorTest.php | 26 ++++++ .../config/configured_rule.php | 11 +++ .../fixture/basic.php.inc | 13 +++ .../fixture/no_change_unrelated.php.inc | 29 ++++++ .../fixture/subclass.php.inc | 21 +++++ 7 files changed, 206 insertions(+) create mode 100644 src/Drupal11/Rector/Deprecation/MovePointerToMouseOverRector.php create mode 100644 stubs/Drupal/Tests/layout_builder/FunctionalJavascript/LayoutBuilderDisableInteractionsTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/MovePointerToMouseOverRector/MovePointerToMouseOverRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/MovePointerToMouseOverRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/MovePointerToMouseOverRector/fixture/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/MovePointerToMouseOverRector/fixture/no_change_unrelated.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/MovePointerToMouseOverRector/fixture/subclass.php.inc diff --git a/src/Drupal11/Rector/Deprecation/MovePointerToMouseOverRector.php b/src/Drupal11/Rector/Deprecation/MovePointerToMouseOverRector.php new file mode 100644 index 000000000..d7d2a8409 --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/MovePointerToMouseOverRector.php @@ -0,0 +1,93 @@ +getDriver()->mouseOver(). + * + * Deprecated in drupal:11.1.0 and removed in drupal:12.0.0. The replacement + * requires an XPath selector instead of a CSS selector. This rule handles + * simple CSS ID selectors (#foo), converting them to .//*[@id="foo"]. + * + * @see https://www.drupal.org/node/3421202 + * @see https://www.drupal.org/node/3460567 + */ +class MovePointerToMouseOverRector extends AbstractRector +{ + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition( + 'Replace deprecated movePointerTo() with getSession()->getDriver()->mouseOver()', + [ + new CodeSample( + <<<'CODE_BEFORE' +$this->movePointerTo('#my-element'); +CODE_BEFORE, + <<<'CODE_AFTER' +$this->getSession()->getDriver()->mouseOver('.//*[@id="my-element"]'); +CODE_AFTER + ), + ] + ); + } + + /** @return array> */ + public function getNodeTypes(): array + { + return [MethodCall::class]; + } + + /** @param MethodCall $node */ + public function refactor(Node $node): ?Node + { + if (!$this->isName($node->name, 'movePointerTo')) { + return null; + } + + if (!$this->isObjectType($node->var, new ObjectType('Drupal\Tests\layout_builder\FunctionalJavascript\LayoutBuilderDisableInteractionsTest'))) { + return null; + } + + if (count($node->args) !== 1) { + return null; + } + + $arg = $node->args[0]; + if (!$arg instanceof Arg) { + return null; + } + + $argValue = $arg->value; + if (!$argValue instanceof String_) { + return null; + } + + $cssSelector = $argValue->value; + + if (!preg_match('/^#([a-zA-Z][a-zA-Z0-9_-]*)$/', $cssSelector, $matches)) { + return null; + } + + $xpathSelector = './/*[@id="'.$matches[1].'"]'; + + $getSession = new MethodCall($node->var, 'getSession', []); + $getDriver = new MethodCall($getSession, 'getDriver', []); + + return new MethodCall( + $getDriver, + 'mouseOver', + [new Arg(new String_($xpathSelector))] + ); + } +} diff --git a/stubs/Drupal/Tests/layout_builder/FunctionalJavascript/LayoutBuilderDisableInteractionsTest.php b/stubs/Drupal/Tests/layout_builder/FunctionalJavascript/LayoutBuilderDisableInteractionsTest.php new file mode 100644 index 000000000..461f116a0 --- /dev/null +++ b/stubs/Drupal/Tests/layout_builder/FunctionalJavascript/LayoutBuilderDisableInteractionsTest.php @@ -0,0 +1,13 @@ +doTestFile($filePath); + } + + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/MovePointerToMouseOverRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/MovePointerToMouseOverRector/config/configured_rule.php new file mode 100644 index 000000000..3e72c7882 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/MovePointerToMouseOverRector/config/configured_rule.php @@ -0,0 +1,11 @@ +movePointerTo('#my-element'); +$test->movePointerTo('#another-id'); +?> +----- +getSession()->getDriver()->mouseOver('.//*[@id="my-element"]'); +$test->getSession()->getDriver()->mouseOver('.//*[@id="another-id"]'); +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/MovePointerToMouseOverRector/fixture/no_change_unrelated.php.inc b/tests/src/Drupal11/Rector/Deprecation/MovePointerToMouseOverRector/fixture/no_change_unrelated.php.inc new file mode 100644 index 000000000..8241e6974 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/MovePointerToMouseOverRector/fixture/no_change_unrelated.php.inc @@ -0,0 +1,29 @@ +movePointerTo('#my-element'); + +// Non-ID CSS selector — cannot be auto-converted to XPath. +/** @var \Drupal\Tests\layout_builder\FunctionalJavascript\LayoutBuilderDisableInteractionsTest $test */ +$test->movePointerTo('.some-class'); + +// Dynamic/variable argument — cannot be statically converted. +/** @var \Drupal\Tests\layout_builder\FunctionalJavascript\LayoutBuilderDisableInteractionsTest $test */ +$test->movePointerTo($selector); +?> +----- +movePointerTo('#my-element'); + +// Non-ID CSS selector — cannot be auto-converted to XPath. +/** @var \Drupal\Tests\layout_builder\FunctionalJavascript\LayoutBuilderDisableInteractionsTest $test */ +$test->movePointerTo('.some-class'); + +// Dynamic/variable argument — cannot be statically converted. +/** @var \Drupal\Tests\layout_builder\FunctionalJavascript\LayoutBuilderDisableInteractionsTest $test */ +$test->movePointerTo($selector); +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/MovePointerToMouseOverRector/fixture/subclass.php.inc b/tests/src/Drupal11/Rector/Deprecation/MovePointerToMouseOverRector/fixture/subclass.php.inc new file mode 100644 index 000000000..0e4ea50cc --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/MovePointerToMouseOverRector/fixture/subclass.php.inc @@ -0,0 +1,21 @@ +movePointerTo('#my-element'); + } +} +?> +----- +getSession()->getDriver()->mouseOver('.//*[@id="my-element"]'); + } +} +?> From 3f3bc130b24d4f742d148ca0d5ea640890dedb65 Mon Sep 17 00:00:00 2001 From: bjorn Date: Sun, 10 May 2026 11:52:20 +0200 Subject: [PATCH 180/256] feat(Drupal11): Add RemoveRootFromCreateConnectionOptionsFromUrlRector for issue #3506931 --- ...omCreateConnectionOptionsFromUrlRector.php | 89 +++++++++++++++++++ stubs/Drupal/Core/Database/Connection.php | 11 +++ ...eateConnectionOptionsFromUrlRectorTest.php | 26 ++++++ .../config/configured_rule.php | 11 +++ .../fixture/basic.php.inc | 15 ++++ .../fixture/no_change_already_null.php.inc | 13 +++ .../fixture/no_change_unrelated.php.inc | 19 ++++ 7 files changed, 184 insertions(+) create mode 100644 src/Drupal11/Rector/Deprecation/RemoveRootFromCreateConnectionOptionsFromUrlRector.php create mode 100644 stubs/Drupal/Core/Database/Connection.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveRootFromCreateConnectionOptionsFromUrlRector/RemoveRootFromCreateConnectionOptionsFromUrlRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveRootFromCreateConnectionOptionsFromUrlRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveRootFromCreateConnectionOptionsFromUrlRector/fixture/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveRootFromCreateConnectionOptionsFromUrlRector/fixture/no_change_already_null.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveRootFromCreateConnectionOptionsFromUrlRector/fixture/no_change_unrelated.php.inc diff --git a/src/Drupal11/Rector/Deprecation/RemoveRootFromCreateConnectionOptionsFromUrlRector.php b/src/Drupal11/Rector/Deprecation/RemoveRootFromCreateConnectionOptionsFromUrlRector.php new file mode 100644 index 000000000..5de79fd56 --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/RemoveRootFromCreateConnectionOptionsFromUrlRector.php @@ -0,0 +1,89 @@ +createConnectionOptionsFromUrl($url, $root); +CODE_BEFORE, + <<<'CODE_AFTER' +$connection->createConnectionOptionsFromUrl($url, NULL); +CODE_AFTER + ), + ] + ); + } + + /** @return array> */ + public function getNodeTypes(): array + { + return [MethodCall::class, StaticCall::class]; + } + + /** + * @param MethodCall|StaticCall $node + */ + public function refactor(Node $node): ?Node + { + if (!$this->isName($node->name, 'createConnectionOptionsFromUrl')) { + return null; + } + + if ($node instanceof MethodCall && !$this->isObjectType($node->var, new ObjectType('Drupal\Core\Database\Connection'))) { + return null; + } + + if ($node instanceof StaticCall && !$this->isObjectType($node->class, new ObjectType('Drupal\Core\Database\Connection'))) { + return null; + } + + // Must have at least two arguments. + if (count($node->args) < 2) { + return null; + } + + $secondArg = $node->args[1]; + + // Skip if the argument is already named or unpacked (edge cases). + if (!$secondArg instanceof Arg) { + return null; + } + + // Skip if the second argument is already null. + $value = $secondArg->value; + if ($value instanceof ConstFetch && strtolower((string) $value->name) === 'null') { + return null; + } + + // Replace the second argument with NULL. + $node->args[1] = new Arg(new ConstFetch(new Name('NULL'))); + + return $node; + } +} diff --git a/stubs/Drupal/Core/Database/Connection.php b/stubs/Drupal/Core/Database/Connection.php new file mode 100644 index 000000000..8ea574152 --- /dev/null +++ b/stubs/Drupal/Core/Database/Connection.php @@ -0,0 +1,11 @@ +doTestFile($filePath); + } + + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromCreateConnectionOptionsFromUrlRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromCreateConnectionOptionsFromUrlRector/config/configured_rule.php new file mode 100644 index 000000000..dba1e5b48 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromCreateConnectionOptionsFromUrlRector/config/configured_rule.php @@ -0,0 +1,11 @@ +createConnectionOptionsFromUrl($url, $root); + +\Drupal\Core\Database\Connection::createConnectionOptionsFromUrl($url, $root); +?> +----- +createConnectionOptionsFromUrl($url, NULL); + +\Drupal\Core\Database\Connection::createConnectionOptionsFromUrl($url, NULL); +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromCreateConnectionOptionsFromUrlRector/fixture/no_change_already_null.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromCreateConnectionOptionsFromUrlRector/fixture/no_change_already_null.php.inc new file mode 100644 index 000000000..b213d5b35 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromCreateConnectionOptionsFromUrlRector/fixture/no_change_already_null.php.inc @@ -0,0 +1,13 @@ +createConnectionOptionsFromUrl($url, NULL); +?> +----- +createConnectionOptionsFromUrl($url, NULL); +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromCreateConnectionOptionsFromUrlRector/fixture/no_change_unrelated.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromCreateConnectionOptionsFromUrlRector/fixture/no_change_unrelated.php.inc new file mode 100644 index 000000000..7d7c98067 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromCreateConnectionOptionsFromUrlRector/fixture/no_change_unrelated.php.inc @@ -0,0 +1,19 @@ +createConnectionOptionsFromUrl($url, $root); + +// Unrelated class — type guard prevents transformation. +/** @var \SomeOtherClass $other */ +$other->createConnectionOptionsFromUrl($url, $root); +?> +----- +createConnectionOptionsFromUrl($url, $root); + +// Unrelated class — type guard prevents transformation. +/** @var \SomeOtherClass $other */ +$other->createConnectionOptionsFromUrl($url, $root); +?> From cc30b4ab4828a4dda6b30ccaf8812e9c16412231 Mon Sep 17 00:00:00 2001 From: bjorn Date: Mon, 11 May 2026 08:46:12 +0200 Subject: [PATCH 181/256] feat(skills): Don't commit by default. --- .claude/skills/prompts/digest-to-rector-prompt.md | 13 +++---------- .claude/skills/rector-implement/SKILL.md | 13 ++----------- 2 files changed, 5 insertions(+), 21 deletions(-) diff --git a/.claude/skills/prompts/digest-to-rector-prompt.md b/.claude/skills/prompts/digest-to-rector-prompt.md index 3edbaedc0..4ccb1e607 100644 --- a/.claude/skills/prompts/digest-to-rector-prompt.md +++ b/.claude/skills/prompts/digest-to-rector-prompt.md @@ -213,7 +213,7 @@ preferred path — it avoids creating new classes for patterns that drupal-recto vendor/bin/phpunit tests/src/Rector/Deprecation/[GenericRectorName]/ ``` -5. Skip to Step 11 (fix-style) then Step 12 (phpstan) then Step 13 (test) then Step 14 (commit). +5. Skip to Step 11 (fix-style) then Step 12 (phpstan) then Step 13 (test). **Configuration entry syntax by generic rector:** @@ -655,16 +655,9 @@ prevented the failure from occurring, so future conversions avoid the same issue --- -## Step 14 — Commit +## Step 14 — Done -```bash -git add \ - src/Drupal11/Rector/Deprecation/[ClassName].php \ - tests/src/Drupal11/Rector/Deprecation/[ClassName]/ -git commit -m "feat(Drupal11): Add [ClassName] for issue #[issue-number]" -``` - -Do not push — leave pushing to the human reviewer. +Leave committing to the human reviewer. Do not run any git commands. --- diff --git a/.claude/skills/rector-implement/SKILL.md b/.claude/skills/rector-implement/SKILL.md index bb9a7d772..f222da519 100644 --- a/.claude/skills/rector-implement/SKILL.md +++ b/.claude/skills/rector-implement/SKILL.md @@ -56,7 +56,7 @@ The canonical prompt covers: - Step 11: Fix code style (`ddev composer fix-style`) - Step 12: Run static analysis (`ddev composer phpstan`) - Step 13: Run the test (`vendor/bin/phpunit tests/src/Drupal11/Rector/Deprecation/[ClassName]/`) -- Step 14: Commit +- Step 14: Done (no commit — leave that to the reviewer) **Do not skip or abbreviate any step.** The `.claude/skills/prompts/digest-to-rector-prompt.md` prompt is authoritative. @@ -198,16 +198,7 @@ This marks the newly implemented rule as `implemented` in the index. Read `.claude/skills/rector-qa/SKILL.md` and execute all four passes for `[ClassName]`. -Apply any fixes the QA reveals. If fixes touch the rector class or test files, commit them -separately: - -```bash -git add src/Drupal11/Rector/Deprecation/[ClassName].php \ - tests/src/Drupal11/Rector/Deprecation/[ClassName]/ -git commit -m "fix(Drupal11): QA fixes for [ClassName]" -``` - -Do not declare the implementation complete until rector-qa reports **Overall: PASS**. +Apply any fixes the QA reveals. Do not declare the implementation complete until rector-qa reports **Overall: PASS**. --- From 16b57e28a91863541dbd9563cc7bc83e262ac89e Mon Sep 17 00:00:00 2001 From: bjorn Date: Mon, 11 May 2026 08:47:40 +0200 Subject: [PATCH 182/256] feat(Drupal11): Add RemoveCacheTagChecksumAssertionsRector for issue #3511123 Removes deprecated CacheTagChecksumCount and CacheTagIsValidCount keys from assertMetrics() calls (deprecated drupal:11.2.0, removed drupal:12.0.0). Includes PerformanceTestTrait stub for isObjectType() guard. --- ...RemoveCacheTagChecksumAssertionsRector.php | 99 +++++++++++++++++++ stubs/Drupal/Tests/PerformanceTestTrait.php | 13 +++ ...veCacheTagChecksumAssertionsRectorTest.php | 26 +++++ .../config/configured_rule.php | 11 +++ .../fixture/basic.php.inc | 19 ++++ .../fixture/no_change_unrelated.php.inc | 9 ++ 6 files changed, 177 insertions(+) create mode 100644 src/Drupal11/Rector/Deprecation/RemoveCacheTagChecksumAssertionsRector.php create mode 100644 stubs/Drupal/Tests/PerformanceTestTrait.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveCacheTagChecksumAssertionsRector/RemoveCacheTagChecksumAssertionsRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveCacheTagChecksumAssertionsRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveCacheTagChecksumAssertionsRector/fixture/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/RemoveCacheTagChecksumAssertionsRector/fixture/no_change_unrelated.php.inc diff --git a/src/Drupal11/Rector/Deprecation/RemoveCacheTagChecksumAssertionsRector.php b/src/Drupal11/Rector/Deprecation/RemoveCacheTagChecksumAssertionsRector.php new file mode 100644 index 000000000..169ab821c --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/RemoveCacheTagChecksumAssertionsRector.php @@ -0,0 +1,99 @@ +assertMetrics([ + 'CacheGetCount' => 5, + 'CacheTagChecksumCount' => 38, + 'CacheTagIsValidCount' => 43, + 'CacheTagInvalidationCount' => 0, +], $performance_data); +CODE_BEFORE, + <<<'CODE_AFTER' +$this->assertMetrics([ + 'CacheGetCount' => 5, + 'CacheTagInvalidationCount' => 0, +], $performance_data); +CODE_AFTER + ), + ] + ); + } + + /** @return array> */ + public function getNodeTypes(): array + { + return [MethodCall::class]; + } + + /** @param MethodCall $node */ + public function refactor(Node $node): ?Node + { + if (!$this->isName($node->name, 'assertMetrics')) { + return null; + } + + if (!$this->isObjectType($node->var, new ObjectType('Drupal\Tests\PerformanceTestTrait'))) { + return null; + } + + if (!isset($node->args[0])) { + return null; + } + + $firstArg = $node->args[0]->value; + if (!$firstArg instanceof Array_) { + return null; + } + + $changed = false; + $newItems = []; + foreach ($firstArg->items as $item) { + $key = $item->key; + if ($key instanceof String_ && in_array($key->value, self::DEPRECATED_KEYS, true)) { + $changed = true; + continue; + } + $newItems[] = $item; + } + + if (!$changed) { + return null; + } + + $firstArg->items = $newItems; + + return $node; + } +} diff --git a/stubs/Drupal/Tests/PerformanceTestTrait.php b/stubs/Drupal/Tests/PerformanceTestTrait.php new file mode 100644 index 000000000..ca618ece8 --- /dev/null +++ b/stubs/Drupal/Tests/PerformanceTestTrait.php @@ -0,0 +1,13 @@ +doTestFile($filePath); + } + + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveCacheTagChecksumAssertionsRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/RemoveCacheTagChecksumAssertionsRector/config/configured_rule.php new file mode 100644 index 000000000..112c33c79 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveCacheTagChecksumAssertionsRector/config/configured_rule.php @@ -0,0 +1,11 @@ +assertMetrics([ + 'CacheGetCount' => 5, + 'CacheTagChecksumCount' => 38, + 'CacheTagIsValidCount' => 43, + 'CacheTagInvalidationCount' => 0, +], $performance_data); +?> +----- +assertMetrics([ + 'CacheGetCount' => 5, + 'CacheTagInvalidationCount' => 0, +], $performance_data); +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveCacheTagChecksumAssertionsRector/fixture/no_change_unrelated.php.inc b/tests/src/Drupal11/Rector/Deprecation/RemoveCacheTagChecksumAssertionsRector/fixture/no_change_unrelated.php.inc new file mode 100644 index 000000000..3919e4a1e --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveCacheTagChecksumAssertionsRector/fixture/no_change_unrelated.php.inc @@ -0,0 +1,9 @@ +assertMetrics([ + 'CacheGetCount' => 5, + 'CacheTagChecksumCount' => 38, + 'CacheTagIsValidCount' => 43, + 'CacheTagInvalidationCount' => 0, +], $performance_data); From 283861164f3c79c32f3b5429e5f51c1f588cc68c Mon Sep 17 00:00:00 2001 From: bjorn Date: Mon, 11 May 2026 08:53:14 +0200 Subject: [PATCH 183/256] feat(skills): Hone in onto type checks --- .claude/skills/rector-implement/SKILL.md | 11 ++++++-- .claude/skills/rector-qa/SKILL.md | 32 +++++++++++++++++++----- 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/.claude/skills/rector-implement/SKILL.md b/.claude/skills/rector-implement/SKILL.md index f222da519..971fb5be7 100644 --- a/.claude/skills/rector-implement/SKILL.md +++ b/.claude/skills/rector-implement/SKILL.md @@ -66,7 +66,12 @@ The canonical prompt covers: For every `MethodCall`, `NullsafeMethodCall`, or `PropertyFetch` node the rector handles: -1. Is an `isObjectType()` guard present that constrains the owning class/interface? +**Choose the right guard for the node type:** +- Instance method/property on a variable → `isObjectType($node->var, new ObjectType('FQCN'))` (prefer the interface over the concrete class) +- Static call `ClassName::method()` → `isName($node->class, 'Fully\Qualified\ClassName')` using the FQCN directly — `isObjectType` is not needed here +- Global function `foo()` or class constant `ClassName::CONST` → no guard needed, SAFE + +1. Is the correct guard present? 2. If missing: a. Find the owning interface/class in the Drupal core source (`repos/drupal-core`). If absent, run `bash .claude/scripts/setup-repos.sh` first. ```bash @@ -87,11 +92,13 @@ For every `MethodCall`, `NullsafeMethodCall`, or `PropertyFetch` node the rector interface ClassName {} ``` d. Run `composer dump-autoload` to register the stub. - e. Add the `isObjectType()` guard to the rector class (after the name check). + e. Add the guard to the rector class (after the name check). f. Add a `no_change_unrelated.php.inc` fixture proving untyped callers are skipped: - Before section: a call with no type annotation - After section: identical (no change) +**Note on `isObjectType` limits:** if real-world testing shows the rector silently skips valid cases, the cause is often a `@var` annotation without a leading `\` — PHPStan mangles the class into the current namespace. Add a `getType($node)->getObjectClassNames()` + `str_ends_with()` fallback (see `ReplaceSessionManagerDeleteRector::isSessionManagerType()` for the reference pattern). Only add this when a real miss is confirmed; do not add it pre-emptively. + **Global functions (FuncCall without a receiver) and class constants (ClassConstFetch) do NOT need `isObjectType()` guards — skip QG-A for these.** --- diff --git a/.claude/skills/rector-qa/SKILL.md b/.claude/skills/rector-qa/SKILL.md index 142c61bdb..82925e9d7 100644 --- a/.claude/skills/rector-qa/SKILL.md +++ b/.claude/skills/rector-qa/SKILL.md @@ -28,17 +28,37 @@ Read the rector class, test class, all fixture files, and the test config. ## Pass 1 — Type Guard Audit -**Goal:** Every `MethodCall`, `NullsafeMethodCall`, or `PropertyFetch` node the rector handles must be guarded by `isObjectType()`. +**Goal:** Every `MethodCall`, `NullsafeMethodCall`, or `PropertyFetch` node the rector handles must be guarded by an appropriate type check. | Pattern | What to look for | Risk if missing | |---------|-----------------|-----------------| | `->method()` on a variable | `isObjectType($node->var, new ObjectType('FQCN'))` | Any class with this method is transformed | | `->property` on a variable | Same `isObjectType` on `$node->var` | Any class with this property is transformed | | `$this->method()` inside a class body | `isObjectType($node->var, ...)` or `extends`-check on enclosing `Class_` | Any class with this method is transformed | -| `ClassName::method()` static call | `isName($node->class, 'ClassName')` or `isObjectType` | Low risk if class name is unique | +| `ClassName::method()` static call | `isName($node->class, 'Fully\Qualified\ClassName')` — use the FQCN directly; `isObjectType` is not needed | Low risk but use FQCN, not short name | | Global function call `foo()` | None needed | SAFE — function names are global | | Class declaration (`class Foo extends Bar`) | Check `extends` on the `Class_` node | EXEMPT — different pattern | +**When `isObjectType` is not enough:** contrib code sometimes writes `@var Drupal\Core\Session\SessionManager` (no leading `\`). PHPStan resolves this relative to the current namespace and produces a mangled class name like `Vendor\Module\Drupal\Core\Session\SessionManager` that `isObjectType` won't match. Add a fallback using `getType($node)->getObjectClassNames()` with `str_ends_with()`: + +```php +private function isSessionManagerType(Node\Expr $node): bool +{ + if ($this->isObjectType($node, new ObjectType('Drupal\Core\Session\SessionManagerInterface'))) { + return true; + } + // Fallback for @var without leading \ (PHPStan mangles the class name) + foreach ($this->getType($node)->getObjectClassNames() as $className) { + if (str_ends_with($className, '\\Drupal\\Core\\Session\\SessionManagerInterface')) { + return true; + } + } + return false; +} +``` + +Only add this fallback when real-world testing shows `isObjectType` silently misses a valid case. See `ReplaceSessionManagerDeleteRector` for the reference implementation. + **Steps:** 1. Read the rector source. @@ -141,11 +161,11 @@ Do not run the other three passes in bulk mode. 2. Check for required coverage: -| Fixture | Required when | Status | -|---------|-------------------------------------------------|--------| -| `fixture/basic.php.inc` | Always | ✅/❌ | +| Fixture | Required when | Status | +|---------|--------------|--------| +| `fixture/basic.php.inc` | Always | ✅/❌ | | `fixture/no_change_unrelated.php.inc` | Always | ✅/❌ | -| `fixture-below-version/basic.php.inc` | Rector extends `AbstractDrupalCoreRector` | ✅/❌ | +| `fixture-below-version/basic.php.inc` | Rector extends `AbstractDrupalCoreRector` | ✅/❌ | | Edge-case fixtures | Rector has conditional branches in `refactor()` | ✅/❌/N/A | 3. For `no_change_unrelated.php.inc`: verify the before and after sections are **identical** (the rector must NOT change untyped code). From 6ae3e0d30430abbd4df1df5e38f26b43a459911c Mon Sep 17 00:00:00 2001 From: bjorn Date: Mon, 11 May 2026 13:25:49 +0200 Subject: [PATCH 184/256] chore: remove intermediate implementation from skill and recipe. AbstractDrupalCoreRector::setVersionOverride --- .../skills/prompts/recipes/func-to-class-service-bc.md | 10 +++++----- .claude/skills/rector-implement/SKILL.md | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.claude/skills/prompts/recipes/func-to-class-service-bc.md b/.claude/skills/prompts/recipes/func-to-class-service-bc.md index 1bd559e57..c028d08ce 100644 --- a/.claude/skills/prompts/recipes/func-to-class-service-bc.md +++ b/.claude/skills/prompts/recipes/func-to-class-service-bc.md @@ -145,7 +145,7 @@ declare(strict_types=1); namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\{{ClassName}}; -use DrupalRector\Rector\AbstractDrupalCoreRector; +use DrupalRector\Services\DrupalRectorSettings; use Rector\Testing\PHPUnit\AbstractRectorTestCase; class {{ClassName}}Test extends AbstractRectorTestCase @@ -153,11 +153,11 @@ class {{ClassName}}Test extends AbstractRectorTestCase #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('99.99.99'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } @@ -170,11 +170,11 @@ class {{ClassName}}Test extends AbstractRectorTestCase #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] public function testBelowVersion(string $filePath): void { - AbstractDrupalCoreRector::setVersionOverride('1.0.0'); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); try { $this->doTestFile($filePath); } finally { - AbstractDrupalCoreRector::setVersionOverride(null); + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); } } diff --git a/.claude/skills/rector-implement/SKILL.md b/.claude/skills/rector-implement/SKILL.md index 971fb5be7..92b91545b 100644 --- a/.claude/skills/rector-implement/SKILL.md +++ b/.claude/skills/rector-implement/SKILL.md @@ -108,7 +108,7 @@ For every `MethodCall`, `NullsafeMethodCall`, or `PropertyFetch` node the rector Apply only if the rector extends `AbstractDrupalCoreRector`. Replace the simple test class with the full `testAboveVersion` / `testBelowVersion` form that uses -`DrupalRectorSettings::setDrupalVersion()` (not `AbstractDrupalCoreRector::setVersionOverride()`): +`DrupalRectorSettings::setDrupalVersion()`: ```php Date: Mon, 11 May 2026 13:26:09 +0200 Subject: [PATCH 185/256] chore: remove intermediate list of contrib modules to test from branch --- docs/contrib-modules-d11.md | 751 ------------------------------------ 1 file changed, 751 deletions(-) delete mode 100644 docs/contrib-modules-d11.md diff --git a/docs/contrib-modules-d11.md b/docs/contrib-modules-d11.md deleted file mode 100644 index 5d42f1096..000000000 --- a/docs/contrib-modules-d11.md +++ /dev/null @@ -1,751 +0,0 @@ -# Contrib Modules Using Deprecated APIs (Drupal 11 Compatible) - -Found via Drupal GitLab code search (`group_id=2`), filtered to modules with -`core_version_requirement` supporting Drupal 11. - -**Rectors with D11 modules:** 44 -**Rectors with no contrib usage found:** 6 -**Total module entries:** 532 - ---- - -## By Rector - -### FileSystemBasenameToNativeRector - -- [ejectorseat](https://www.drupal.org/project/ejectorseat) - -### LoadAllIncludesRector - -- [config_track](https://www.drupal.org/project/config_track) -- [drupalmoduleupgrader](https://www.drupal.org/project/drupalmoduleupgrader) -- [graphapi](https://www.drupal.org/project/graphapi) -- [hux](https://www.drupal.org/project/hux) -- [migrate_boost](https://www.drupal.org/project/migrate_boost) -- [schemadotorg](https://www.drupal.org/project/schemadotorg) -- [update_worker](https://www.drupal.org/project/update_worker) - -### MigrateSqlGetMigrationPluginManagerRector - -- [feeds_migrate](https://www.drupal.org/project/feeds_migrate) -- [migmag](https://www.drupal.org/project/migmag) -- [smart_sql_idmap](https://www.drupal.org/project/smart_sql_idmap) - -### NodeStorageDeprecatedMethodsRector - -- [tb_megamenu](https://www.drupal.org/project/tb_megamenu) - -### PluginBaseIsConfigurableRector - -- [api](https://www.drupal.org/project/api) -- [autotagger](https://www.drupal.org/project/autotagger) -- [content_planner](https://www.drupal.org/project/content_planner) -- [geocoder](https://www.drupal.org/project/geocoder) -- [json_drop_api](https://www.drupal.org/project/json_drop_api) -- [localgov_elections](https://www.drupal.org/project/localgov_elections) -- [localgov_publications_importer](https://www.drupal.org/project/localgov_publications_importer) -- [localgov_publications_importer_copilot](https://www.drupal.org/project/localgov_publications_importer_copilot) -- [metatag](https://www.drupal.org/project/metatag) -- [oswald](https://www.drupal.org/project/oswald) -- [plugin_constructor_factory](https://www.drupal.org/project/plugin_constructor_factory) -- [search_api](https://www.drupal.org/project/search_api) -- [views_bulk_operations](https://www.drupal.org/project/views_bulk_operations) -- [xbbcode](https://www.drupal.org/project/xbbcode) - -### RemoveCacheExpireOverrideRector - -- [cmrf_core](https://www.drupal.org/project/cmrf_core) -- [cmrf_form_processor](https://www.drupal.org/project/cmrf_form_processor) -- [commercetools](https://www.drupal.org/project/commercetools) -- [feed_block](https://www.drupal.org/project/feed_block) -- [menu_parser_php](https://www.drupal.org/project/menu_parser_php) -- [spambot](https://www.drupal.org/project/spambot) -- [vcp4dates](https://www.drupal.org/project/vcp4dates) -- [wisski](https://www.drupal.org/project/wisski) - -### RemoveHandlerBaseDefineExtraOptionsRector - -- [views_dependent_filters](https://www.drupal.org/project/views_dependent_filters) - -### RemoveModuleHandlerAddModuleCallsRector - -- [acquia_contenthub](https://www.drupal.org/project/acquia_contenthub) -- [ai_vdb_provider_milvus](https://www.drupal.org/project/ai_vdb_provider_milvus) -- [ai_vdb_provider_pinecone](https://www.drupal.org/project/ai_vdb_provider_pinecone) -- [ai_watchdog_analyst](https://www.drupal.org/project/ai_watchdog_analyst) -- [component_entity](https://www.drupal.org/project/component_entity) -- [depcalc](https://www.drupal.org/project/depcalc) -- [fleetview_client](https://www.drupal.org/project/fleetview_client) -- [rift_recipe](https://www.drupal.org/project/rift_recipe) -- [sdx](https://www.drupal.org/project/sdx) -- [simplifying](https://www.drupal.org/project/simplifying) - -### RemoveModuleHandlerDeprecatedMethodsRector - -- [captcha](https://www.drupal.org/project/captcha) -- [jsonld](https://www.drupal.org/project/jsonld) - -### RemoveRootFromConvertDbUrlRector - -- [acsf](https://www.drupal.org/project/acsf) -- [civicrm_entity](https://www.drupal.org/project/civicrm_entity) -- [smart_migrate_cli](https://www.drupal.org/project/smart_migrate_cli) -- [sparql_entity_storage](https://www.drupal.org/project/sparql_entity_storage) - -### RemoveSetUriCallbackRector - -- [rabbit_hole_href](https://www.drupal.org/project/rabbit_hole_href) - -### RemoveStateCacheSettingRector - -- [bynder](https://www.drupal.org/project/bynder) -- [checklistapi](https://www.drupal.org/project/checklistapi) -- [chromeless](https://www.drupal.org/project/chromeless) -- [cloud](https://www.drupal.org/project/cloud) -- [community_tasks](https://www.drupal.org/project/community_tasks) -- [config_split](https://www.drupal.org/project/config_split) -- [deploy_key](https://www.drupal.org/project/deploy_key) -- [dns](https://www.drupal.org/project/dns) -- [engaging_networks](https://www.drupal.org/project/engaging_networks) -- [entity_usage_updater](https://www.drupal.org/project/entity_usage_updater) -- [eu_cookie_compliance_rocketship](https://www.drupal.org/project/eu_cookie_compliance_rocketship) -- [ffmpeg_media](https://www.drupal.org/project/ffmpeg_media) -- [granulartimecache](https://www.drupal.org/project/granulartimecache) -- [language_suggestion](https://www.drupal.org/project/language_suggestion) -- [mailchimp_transactional](https://www.drupal.org/project/mailchimp_transactional) -- [og](https://www.drupal.org/project/og) -- [open_vocabularies](https://www.drupal.org/project/open_vocabularies) -- [override_cache_control_headers](https://www.drupal.org/project/override_cache_control_headers) -- [pantheon_autopilot_toolbar](https://www.drupal.org/project/pantheon_autopilot_toolbar) -- [rail_ai_provider](https://www.drupal.org/project/rail_ai_provider) -- [salesforce](https://www.drupal.org/project/salesforce) -- [sdx](https://www.drupal.org/project/sdx) -- [search_api_postgresql](https://www.drupal.org/project/search_api_postgresql) -- [searchstax](https://www.drupal.org/project/searchstax) -- [social_auth_entra_id](https://www.drupal.org/project/social_auth_entra_id) -- [swagger_ui_formatter](https://www.drupal.org/project/swagger_ui_formatter) -- [trailless_menu](https://www.drupal.org/project/trailless_menu) -- [views_advanced_cache](https://www.drupal.org/project/views_advanced_cache) -- [vwo](https://www.drupal.org/project/vwo) -- [youtube_live_video](https://www.drupal.org/project/youtube_live_video) - -### RemoveTrustDataCallRector - -- [acquia_cms_headless](https://www.drupal.org/project/acquia_cms_headless) -- [acquia_starterkits](https://www.drupal.org/project/acquia_starterkits) -- [cms_core](https://www.drupal.org/project/cms_core) -- [commerce_square](https://www.drupal.org/project/commerce_square) -- [complete_webform_exporter](https://www.drupal.org/project/complete_webform_exporter) -- [config_plus](https://www.drupal.org/project/config_plus) -- [eca](https://www.drupal.org/project/eca) -- [eca_cm](https://www.drupal.org/project/eca_cm) -- [elasticsearch_helper](https://www.drupal.org/project/elasticsearch_helper) -- [entity_browser](https://www.drupal.org/project/entity_browser) -- [epm](https://www.drupal.org/project/epm) -- [flag](https://www.drupal.org/project/flag) -- [group](https://www.drupal.org/project/group) -- [gutenberg](https://www.drupal.org/project/gutenberg) -- [jsonapi](https://www.drupal.org/project/jsonapi) -- [monitoring](https://www.drupal.org/project/monitoring) -- [og](https://www.drupal.org/project/og) -- [output_format_api](https://www.drupal.org/project/output_format_api) -- [parameters](https://www.drupal.org/project/parameters) -- [pluggable_entity_view_builder](https://www.drupal.org/project/pluggable_entity_view_builder) -- [preview_site](https://www.drupal.org/project/preview_site) -- [redirect](https://www.drupal.org/project/redirect) -- [scheduled_publish](https://www.drupal.org/project/scheduled_publish) -- [simplenews](https://www.drupal.org/project/simplenews) -- [slots](https://www.drupal.org/project/slots) -- [smart_title](https://www.drupal.org/project/smart_title) -- [storage](https://www.drupal.org/project/storage) -- [theming_tools](https://www.drupal.org/project/theming_tools) -- [userprotect](https://www.drupal.org/project/userprotect) -- [varbase_workflow](https://www.drupal.org/project/varbase_workflow) -- [views_dependent_filters](https://www.drupal.org/project/views_dependent_filters) -- [workbench_email](https://www.drupal.org/project/workbench_email) -- [workbench_moderation_actions](https://www.drupal.org/project/workbench_moderation_actions) - -### RemoveTwigNodeTransTagArgumentRector - -- [canvas](https://www.drupal.org/project/canvas) -- [entity_import](https://www.drupal.org/project/entity_import) -- [experience_builder](https://www.drupal.org/project/experience_builder) -- [search_api](https://www.drupal.org/project/search_api) -- [search_api_autocomplete](https://www.drupal.org/project/search_api_autocomplete) -- [search_api_saved_searches](https://www.drupal.org/project/search_api_saved_searches) -- [searchstax](https://www.drupal.org/project/searchstax) -- [tranc](https://www.drupal.org/project/tranc) - -### RemoveUpdaterPostInstallMethodsRector - -- [ginvite](https://www.drupal.org/project/ginvite) -- [gnode_request](https://www.drupal.org/project/gnode_request) -- [group](https://www.drupal.org/project/group) - -### RemoveViewsRowCacheKeysRector - -- [metatag](https://www.drupal.org/project/metatag) -- [views_advanced_cache](https://www.drupal.org/project/views_advanced_cache) - -### ReplaceAlphadecimalToIntNullRector - -- [comment_mover](https://www.drupal.org/project/comment_mover) -- [indieweb](https://www.drupal.org/project/indieweb) - -### ReplaceCommentManagerGetCountNewCommentsRector - -- [forum](https://www.drupal.org/project/forum) -- [history](https://www.drupal.org/project/history) - -### ReplaceCommentUriRector - -- [gadget](https://www.drupal.org/project/gadget) -- [social](https://www.drupal.org/project/social) - -### ReplaceDateTimeRangeConstantsRector - -- [deprecation_status](https://www.drupal.org/project/deprecation_status) - -### ReplaceEditorLoadRector - -- [acquia_contenthub](https://www.drupal.org/project/acquia_contenthub) -- [acquia_dam](https://www.drupal.org/project/acquia_dam) -- [address_suggestion](https://www.drupal.org/project/address_suggestion) -- [ai_agents_experimental_collection](https://www.drupal.org/project/ai_agents_experimental_collection) -- [ai_ckeditor_extras](https://www.drupal.org/project/ai_ckeditor_extras) -- [ai_editoria11y](https://www.drupal.org/project/ai_editoria11y) -- [ckeditor5_deepl](https://www.drupal.org/project/ckeditor5_deepl) -- [ckeditor5_mentions](https://www.drupal.org/project/ckeditor5_mentions) -- [ckeditor5_plugin_pack](https://www.drupal.org/project/ckeditor5_plugin_pack) -- [ckeditor5_premium_features](https://www.drupal.org/project/ckeditor5_premium_features) -- [ckeditor5_spoiler](https://www.drupal.org/project/ckeditor5_spoiler) -- [ckeditor_braille](https://www.drupal.org/project/ckeditor_braille) -- [ckeditor_codemirror](https://www.drupal.org/project/ckeditor_codemirror) -- [ckeditor_historylog](https://www.drupal.org/project/ckeditor_historylog) -- [ckeditor_lts](https://www.drupal.org/project/ckeditor_lts) -- [ckeditor_mentions](https://www.drupal.org/project/ckeditor_mentions) -- [custom_paragraphs](https://www.drupal.org/project/custom_paragraphs) -- [deepseek](https://www.drupal.org/project/deepseek) -- [depcalc](https://www.drupal.org/project/depcalc) -- [dsfr4drupal_picker](https://www.drupal.org/project/dsfr4drupal_picker) -- [edit_plus](https://www.drupal.org/project/edit_plus) -- [editor_advanced_image](https://www.drupal.org/project/editor_advanced_image) -- [editor_advanced_link](https://www.drupal.org/project/editor_advanced_link) -- [editor_advanced_table](https://www.drupal.org/project/editor_advanced_table) -- [entity_embed](https://www.drupal.org/project/entity_embed) -- [flmngr](https://www.drupal.org/project/flmngr) -- [flo](https://www.drupal.org/project/flo) -- [inline_formatter_field](https://www.drupal.org/project/inline_formatter_field) -- [markdown](https://www.drupal.org/project/markdown) -- [media_folders](https://www.drupal.org/project/media_folders) -- [module_file_editor](https://www.drupal.org/project/module_file_editor) -- [openfed](https://www.drupal.org/project/openfed) -- [quickedit](https://www.drupal.org/project/quickedit) -- [smartlinker_ai](https://www.drupal.org/project/smartlinker_ai) -- [synimage](https://www.drupal.org/project/synimage) -- [theme_file_editor](https://www.drupal.org/project/theme_file_editor) -- [toast_image_editor](https://www.drupal.org/project/toast_image_editor) -- [token_browser_plus](https://www.drupal.org/project/token_browser_plus) -- [txt42](https://www.drupal.org/project/txt42) -- [url_embed](https://www.drupal.org/project/url_embed) -- [video_embed_field](https://www.drupal.org/project/video_embed_field) -- [video_filter](https://www.drupal.org/project/video_filter) -- [visual_editor](https://www.drupal.org/project/visual_editor) -- [wxt](https://www.drupal.org/project/wxt) - -### ReplaceEntityOriginalPropertyRector - -- [a12s_maps_sync](https://www.drupal.org/project/a12s_maps_sync) -- [activitypub](https://www.drupal.org/project/activitypub) -- [child_entity](https://www.drupal.org/project/child_entity) -- [ckeditor_mentions](https://www.drupal.org/project/ckeditor_mentions) -- [conflict](https://www.drupal.org/project/conflict) -- [content_synchronizer](https://www.drupal.org/project/content_synchronizer) -- [custom_elements](https://www.drupal.org/project/custom_elements) -- [drd](https://www.drupal.org/project/drd) -- [edit_plus](https://www.drupal.org/project/edit_plus) -- [entity_embed](https://www.drupal.org/project/entity_embed) -- [entity_io](https://www.drupal.org/project/entity_io) -- [entity_reference_manager](https://www.drupal.org/project/entity_reference_manager) -- [entity_value_inheritance](https://www.drupal.org/project/entity_value_inheritance) -- [entity_webhook](https://www.drupal.org/project/entity_webhook) -- [experience_builder](https://www.drupal.org/project/experience_builder) -- [external_entity](https://www.drupal.org/project/external_entity) -- [gotem_content_moderation](https://www.drupal.org/project/gotem_content_moderation) -- [languagewire_translation_provider](https://www.drupal.org/project/languagewire_translation_provider) -- [media_acquiadam](https://www.drupal.org/project/media_acquiadam) -- [navigation_plus](https://www.drupal.org/project/navigation_plus) -- [nofraud](https://www.drupal.org/project/nofraud) -- [orange_dam](https://www.drupal.org/project/orange_dam) -- [paragraph_view_mode](https://www.drupal.org/project/paragraph_view_mode) -- [phpedu_profile](https://www.drupal.org/project/phpedu_profile) -- [ptools](https://www.drupal.org/project/ptools) -- [reader](https://www.drupal.org/project/reader) -- [simplenews_stats](https://www.drupal.org/project/simplenews_stats) -- [standalone](https://www.drupal.org/project/standalone) -- [typed_entity](https://www.drupal.org/project/typed_entity) -- [variants](https://www.drupal.org/project/variants) - -### ReplaceEntityReferenceRecursiveLimitRector - -- [custom_field](https://www.drupal.org/project/custom_field) -- [datafield](https://www.drupal.org/project/datafield) -- [dynamic_entity_reference](https://www.drupal.org/project/dynamic_entity_reference) -- [entity_embed](https://www.drupal.org/project/entity_embed) -- [entity_list](https://www.drupal.org/project/entity_list) -- [entity_overlay](https://www.drupal.org/project/entity_overlay) -- [entity_reference_ajax_formatter](https://www.drupal.org/project/entity_reference_ajax_formatter) -- [external_entity](https://www.drupal.org/project/external_entity) -- [gutenberg](https://www.drupal.org/project/gutenberg) -- [layout_builder_formatter](https://www.drupal.org/project/layout_builder_formatter) -- [link_field_display_mode_formatter](https://www.drupal.org/project/link_field_display_mode_formatter) -- [nested_entity_reference_formatter](https://www.drupal.org/project/nested_entity_reference_formatter) -- [paragraphs_summary](https://www.drupal.org/project/paragraphs_summary) -- [published_referenced_entity](https://www.drupal.org/project/published_referenced_entity) -- [rendered_entity_list_formatter](https://www.drupal.org/project/rendered_entity_list_formatter) -- [rendred_entity_list_formatter](https://www.drupal.org/project/rendred_entity_list_formatter) -- [rocketship_core](https://www.drupal.org/project/rocketship_core) -- [seb](https://www.drupal.org/project/seb) -- [tripal](https://www.drupal.org/project/tripal) -- [view_mode_crop](https://www.drupal.org/project/view_mode_crop) - -### ReplaceFieldgroupToFieldsetRector - -- [field_group](https://www.drupal.org/project/field_group) -- [field_group_vertical_tabs](https://www.drupal.org/project/field_group_vertical_tabs) -- [sports_league](https://www.drupal.org/project/sports_league) -- [ui_patterns_settings](https://www.drupal.org/project/ui_patterns_settings) - -### ReplaceFileGetContentHeadersRector - -- [cforge](https://www.drupal.org/project/cforge) -- [commerce_invoice](https://www.drupal.org/project/commerce_invoice) -- [commerce_purchase_order](https://www.drupal.org/project/commerce_purchase_order) -- [download_file](https://www.drupal.org/project/download_file) -- [dxpr_builder](https://www.drupal.org/project/dxpr_builder) -- [feeds](https://www.drupal.org/project/feeds) -- [file_entity](https://www.drupal.org/project/file_entity) -- [file_visibility](https://www.drupal.org/project/file_visibility) -- [git_wiki_help](https://www.drupal.org/project/git_wiki_help) -- [media_icon_deliver](https://www.drupal.org/project/media_icon_deliver) -- [protected_file](https://www.drupal.org/project/protected_file) -- [tmgmt](https://www.drupal.org/project/tmgmt) -- [unpublished_file](https://www.drupal.org/project/unpublished_file) - -### ReplaceModuleHandlerGetNameRector - -- [ai_upgrade_assistant](https://www.drupal.org/project/ai_upgrade_assistant) -- [autosave_form](https://www.drupal.org/project/autosave_form) -- [basket](https://www.drupal.org/project/basket) -- [bibliocommons](https://www.drupal.org/project/bibliocommons) -- [client_config_care](https://www.drupal.org/project/client_config_care) -- [confi](https://www.drupal.org/project/confi) -- [contacts](https://www.drupal.org/project/contacts) -- [date_augmenter](https://www.drupal.org/project/date_augmenter) -- [drd](https://www.drupal.org/project/drd) -- [image_moderate](https://www.drupal.org/project/image_moderate) -- [islandora](https://www.drupal.org/project/islandora) -- [languagefield](https://www.drupal.org/project/languagefield) -- [licenses](https://www.drupal.org/project/licenses) -- [localist_drupal](https://www.drupal.org/project/localist_drupal) -- [migrate_visualize](https://www.drupal.org/project/migrate_visualize) -- [mutual_credit](https://www.drupal.org/project/mutual_credit) -- [nitropack](https://www.drupal.org/project/nitropack) -- [nodeinfo](https://www.drupal.org/project/nodeinfo) -- [nostr_id_nip05](https://www.drupal.org/project/nostr_id_nip05) -- [onlyone](https://www.drupal.org/project/onlyone) -- [orchestration](https://www.drupal.org/project/orchestration) -- [pager_serializer](https://www.drupal.org/project/pager_serializer) -- [pwbi](https://www.drupal.org/project/pwbi) -- [reassign_user_content](https://www.drupal.org/project/reassign_user_content) -- [schema_form](https://www.drupal.org/project/schema_form) -- [simplifying](https://www.drupal.org/project/simplifying) -- [test_helpers](https://www.drupal.org/project/test_helpers) -- [tripal](https://www.drupal.org/project/tripal) -- [worldmap](https://www.drupal.org/project/worldmap) -- [ws_event](https://www.drupal.org/project/ws_event) - -### ReplaceNodeAccessViewAllNodesRector - -- [view_usernames_node_author](https://www.drupal.org/project/view_usernames_node_author) - -### ReplaceNodeAddBodyFieldRector - -- [ai_eca](https://www.drupal.org/project/ai_eca) -- [feedstextareafetcher](https://www.drupal.org/project/feedstextareafetcher) -- [rdf_sync](https://www.drupal.org/project/rdf_sync) -- [sva](https://www.drupal.org/project/sva) -- [tome](https://www.drupal.org/project/tome) - -### ReplaceNodeModuleProceduralFunctionsRector - -- [addanother](https://www.drupal.org/project/addanother) -- [collection](https://www.drupal.org/project/collection) -- [content_dependency_graph](https://www.drupal.org/project/content_dependency_graph) -- [copyscape](https://www.drupal.org/project/copyscape) -- [custom_search](https://www.drupal.org/project/custom_search) -- [ds](https://www.drupal.org/project/ds) -- [duplicate_node](https://www.drupal.org/project/duplicate_node) -- [edit_content_type_tab](https://www.drupal.org/project/edit_content_type_tab) -- [entity_reference_edit_link](https://www.drupal.org/project/entity_reference_edit_link) -- [entity_translation_unified_form](https://www.drupal.org/project/entity_translation_unified_form) -- [find_text](https://www.drupal.org/project/find_text) -- [html_title](https://www.drupal.org/project/html_title) -- [link_description_attributes](https://www.drupal.org/project/link_description_attributes) -- [micronode_block](https://www.drupal.org/project/micronode_block) -- [node_singles](https://www.drupal.org/project/node_singles) -- [page_menu_reorder](https://www.drupal.org/project/page_menu_reorder) -- [quick_node_clone](https://www.drupal.org/project/quick_node_clone) -- [read_time](https://www.drupal.org/project/read_time) -- [reassign_user_content](https://www.drupal.org/project/reassign_user_content) -- [rsvp_list](https://www.drupal.org/project/rsvp_list) -- [rsvplist](https://www.drupal.org/project/rsvplist) -- [secure_nodes](https://www.drupal.org/project/secure_nodes) -- [social](https://www.drupal.org/project/social) -- [token](https://www.drupal.org/project/token) - -### ReplaceNodeSetPreviewModeRector - -- [ai_agents](https://www.drupal.org/project/ai_agents) -- [ai_agents_experimental_collection](https://www.drupal.org/project/ai_agents_experimental_collection) -- [metadata_hex](https://www.drupal.org/project/metadata_hex) -- [node_type_defaults](https://www.drupal.org/project/node_type_defaults) -- [responsive_preview](https://www.drupal.org/project/responsive_preview) -- [sdx_drast](https://www.drupal.org/project/sdx_drast) -- [sdx_engine](https://www.drupal.org/project/sdx_engine) - -### ReplacePdoFetchConstantsRector - -- [acquia_contenthub](https://www.drupal.org/project/acquia_contenthub) -- [ai_schemadotorg_jsonld](https://www.drupal.org/project/ai_schemadotorg_jsonld) -- [arch](https://www.drupal.org/project/arch) -- [babel](https://www.drupal.org/project/babel) -- [book_library_api](https://www.drupal.org/project/book_library_api) -- [commerce_store_override](https://www.drupal.org/project/commerce_store_override) -- [conreg](https://www.drupal.org/project/conreg) -- [gdpr](https://www.drupal.org/project/gdpr) -- [graphql_shield](https://www.drupal.org/project/graphql_shield) -- [hubspot](https://www.drupal.org/project/hubspot) -- [junk_drawer](https://www.drupal.org/project/junk_drawer) -- [livre](https://www.drupal.org/project/livre) -- [mail_box_management](https://www.drupal.org/project/mail_box_management) -- [sgd_user_status](https://www.drupal.org/project/sgd_user_status) -- [sgd_watchdog_summary](https://www.drupal.org/project/sgd_watchdog_summary) -- [smileys_field](https://www.drupal.org/project/smileys_field) -- [social_auth_buttons](https://www.drupal.org/project/social_auth_buttons) -- [tmgmt_smartcat](https://www.drupal.org/project/tmgmt_smartcat) -- [track_usage](https://www.drupal.org/project/track_usage) - -### ReplaceRebuildThemeDataRector - -- [ai_components](https://www.drupal.org/project/ai_components) -- [dropsolid_rocketship_profile](https://www.drupal.org/project/dropsolid_rocketship_profile) -- [edw_healthcheck](https://www.drupal.org/project/edw_healthcheck) -- [gesso](https://www.drupal.org/project/gesso) -- [guswds](https://www.drupal.org/project/guswds) -- [l10n_update_bundled](https://www.drupal.org/project/l10n_update_bundled) -- [libraries_ui](https://www.drupal.org/project/libraries_ui) -- [mercury_editor](https://www.drupal.org/project/mercury_editor) -- [openy](https://www.drupal.org/project/openy) -- [site_guardian](https://www.drupal.org/project/site_guardian) -- [theme_file_editor](https://www.drupal.org/project/theme_file_editor) -- [theme_per_user](https://www.drupal.org/project/theme_per_user) - -### ReplaceRecipeRunnerInstallModuleRector - -- [schemadotorg](https://www.drupal.org/project/schemadotorg) - -### ReplaceRequestTimeConstantRector - -- [automatic_updates](https://www.drupal.org/project/automatic_updates) -- [computed_field](https://www.drupal.org/project/computed_field) -- [google_analytics_counter](https://www.drupal.org/project/google_analytics_counter) - -### ReplaceSessionManagerDeleteRector - -- [activity](https://www.drupal.org/project/activity) -- [anonymoussession](https://www.drupal.org/project/anonymoussession) -- [brightcove](https://www.drupal.org/project/brightcove) -- [bulk_copy_fields](https://www.drupal.org/project/bulk_copy_fields) -- [bulk_update_fields](https://www.drupal.org/project/bulk_update_fields) -- [change_author_action](https://www.drupal.org/project/change_author_action) -- [cookie_samesite_support](https://www.drupal.org/project/cookie_samesite_support) -- [devel](https://www.drupal.org/project/devel) -- [drupal_saml_bridge](https://www.drupal.org/project/drupal_saml_bridge) -- [entity_visibility_preview](https://www.drupal.org/project/entity_visibility_preview) -- [externalauth_force](https://www.drupal.org/project/externalauth_force) -- [facebook_pixel](https://www.drupal.org/project/facebook_pixel) -- [kamihaya_cms](https://www.drupal.org/project/kamihaya_cms) -- [loginnotification](https://www.drupal.org/project/loginnotification) -- [node_export](https://www.drupal.org/project/node_export) -- [oidc](https://www.drupal.org/project/oidc) -- [oidc_mcpf](https://www.drupal.org/project/oidc_mcpf) -- [page_hits](https://www.drupal.org/project/page_hits) -- [quicker_login](https://www.drupal.org/project/quicker_login) -- [recently_read](https://www.drupal.org/project/recently_read) -- [restrict_by_ip](https://www.drupal.org/project/restrict_by_ip) -- [rules](https://www.drupal.org/project/rules) -- [session_inspector](https://www.drupal.org/project/session_inspector) -- [session_management](https://www.drupal.org/project/session_management) -- [simpleavs](https://www.drupal.org/project/simpleavs) -- [stenographer](https://www.drupal.org/project/stenographer) -- [user_logout](https://www.drupal.org/project/user_logout) - -### ReplaceSessionWritesWithRequestSessionRector - -- [drd](https://www.drupal.org/project/drd) -- [entity_visibility_preview](https://www.drupal.org/project/entity_visibility_preview) -- [intercept](https://www.drupal.org/project/intercept) -- [session_entity](https://www.drupal.org/project/session_entity) -- [simplesamlphp_sp](https://www.drupal.org/project/simplesamlphp_sp) -- [telega](https://www.drupal.org/project/telega) -- [views_extras](https://www.drupal.org/project/views_extras) - -### ReplaceSystemPerformanceGzipKeyRector - -- [ai_agents_experimental_collection](https://www.drupal.org/project/ai_agents_experimental_collection) -- [audit](https://www.drupal.org/project/audit) -- [background_image](https://www.drupal.org/project/background_image) -- [bootstrap4](https://www.drupal.org/project/bootstrap4) -- [bootstrap5](https://www.drupal.org/project/bootstrap5) -- [drd](https://www.drupal.org/project/drd) -- [settingsphp](https://www.drupal.org/project/settingsphp) -- [tone](https://www.drupal.org/project/tone) - -### ReplaceThemeGetSettingRector - -- [bootstrap3](https://www.drupal.org/project/bootstrap3) -- [bootstrap_italia](https://www.drupal.org/project/bootstrap_italia) -- [diba_clean](https://www.drupal.org/project/diba_clean) -- [dsfr](https://www.drupal.org/project/dsfr) -- [dxpr_theme](https://www.drupal.org/project/dxpr_theme) -- [edux](https://www.drupal.org/project/edux) -- [kamihaya_cms](https://www.drupal.org/project/kamihaya_cms) -- [kart](https://www.drupal.org/project/kart) -- [mahi](https://www.drupal.org/project/mahi) -- [marvelous](https://www.drupal.org/project/marvelous) -- [mili](https://www.drupal.org/project/mili) -- [nava](https://www.drupal.org/project/nava) -- [pets_clinic](https://www.drupal.org/project/pets_clinic) -- [ruhi](https://www.drupal.org/project/ruhi) -- [saar](https://www.drupal.org/project/saar) -- [tara](https://www.drupal.org/project/tara) -- [uni](https://www.drupal.org/project/uni) -- [vani](https://www.drupal.org/project/vani) -- [xara](https://www.drupal.org/project/xara) -- [zuvi](https://www.drupal.org/project/zuvi) - -### ReplaceUserSessionNamePropertyRector - -- [acquia_contenthub](https://www.drupal.org/project/acquia_contenthub) -- [acquia_vwo](https://www.drupal.org/project/acquia_vwo) -- [apigee_m10n](https://www.drupal.org/project/apigee_m10n) -- [clu](https://www.drupal.org/project/clu) -- [drupal_content_repository](https://www.drupal.org/project/drupal_content_repository) -- [drupalfit](https://www.drupal.org/project/drupalfit) -- [entity_mesh](https://www.drupal.org/project/entity_mesh) -- [miniorange_oauth_client](https://www.drupal.org/project/miniorange_oauth_client) -- [monitoring](https://www.drupal.org/project/monitoring) -- [riddler](https://www.drupal.org/project/riddler) -- [role_inheritance](https://www.drupal.org/project/role_inheritance) -- [search_api_exclude_lb](https://www.drupal.org/project/search_api_exclude_lb) -- [session_inspector](https://www.drupal.org/project/session_inspector) -- [session_management](https://www.drupal.org/project/session_management) -- [synonyms](https://www.drupal.org/project/synonyms) - -### ReplaceViewsProceduralFunctionsRector - -- [abinbev_gmap](https://www.drupal.org/project/abinbev_gmap) -- [api](https://www.drupal.org/project/api) -- [custom_field](https://www.drupal.org/project/custom_field) -- [knowledge](https://www.drupal.org/project/knowledge) -- [next_views_entity_reference](https://www.drupal.org/project/next_views_entity_reference) -- [quicktabs](https://www.drupal.org/project/quicktabs) -- [simple_sitemap](https://www.drupal.org/project/simple_sitemap) -- [simple_sitemap_authenticated](https://www.drupal.org/project/simple_sitemap_authenticated) -- [social](https://www.drupal.org/project/social) -- [sshop](https://www.drupal.org/project/sshop) -- [twig_tweak](https://www.drupal.org/project/twig_tweak) -- [viewfield](https://www.drupal.org/project/viewfield) - -### StripMigrationDependenciesExpandArgRector - -- [crm_migrate_node](https://www.drupal.org/project/crm_migrate_node) -- [entity_import](https://www.drupal.org/project/entity_import) -- [geolocation](https://www.drupal.org/project/geolocation) -- [migrate_from_services](https://www.drupal.org/project/migrate_from_services) -- [migrate_plus](https://www.drupal.org/project/migrate_plus) -- [migrate_plus_ui](https://www.drupal.org/project/migrate_plus_ui) -- [migrate_queue_importer](https://www.drupal.org/project/migrate_queue_importer) -- [migrate_tools](https://www.drupal.org/project/migrate_tools) -- [paragraphs](https://www.drupal.org/project/paragraphs) -- [smart_migrate_cli](https://www.drupal.org/project/smart_migrate_cli) -- [wordpress_migrate](https://www.drupal.org/project/wordpress_migrate) - -### SystemTimeZonesRector - -- [crema](https://www.drupal.org/project/crema) -- [daterange_simplify](https://www.drupal.org/project/daterange_simplify) -- [intl_date](https://www.drupal.org/project/intl_date) -- [mtc](https://www.drupal.org/project/mtc) -- [openfed](https://www.drupal.org/project/openfed) -- [openid_connect](https://www.drupal.org/project/openid_connect) -- [salesforce_push_queue_ui](https://www.drupal.org/project/salesforce_push_queue_ui) -- [smart_date](https://www.drupal.org/project/smart_date) -- [time_clock](https://www.drupal.org/project/time_clock) -- [tzfield](https://www.drupal.org/project/tzfield) - -### UseEntityTypeHasIntegerIdRector - -- [apigee_m10n](https://www.drupal.org/project/apigee_m10n) -- [association](https://www.drupal.org/project/association) -- [commerce_eta](https://www.drupal.org/project/commerce_eta) -- [commerce_invoice](https://www.drupal.org/project/commerce_invoice) -- [display_builder](https://www.drupal.org/project/display_builder) -- [easy_email](https://www.drupal.org/project/easy_email) -- [entity](https://www.drupal.org/project/entity) -- [homebox](https://www.drupal.org/project/homebox) -- [intercept](https://www.drupal.org/project/intercept) -- [localgov_alert_banner](https://www.drupal.org/project/localgov_alert_banner) -- [paragraphs_edit](https://www.drupal.org/project/paragraphs_edit) -- [role_request](https://www.drupal.org/project/role_request) -- [workbench_moderation](https://www.drupal.org/project/workbench_moderation) -- [workflow_participants](https://www.drupal.org/project/workflow_participants) - -### ViewsPluginHandlerManagerRector - -- [a12s_locations](https://www.drupal.org/project/a12s_locations) -- [acquia_dam](https://www.drupal.org/project/acquia_dam) -- [ai_agents](https://www.drupal.org/project/ai_agents) -- [api](https://www.drupal.org/project/api) -- [basket](https://www.drupal.org/project/basket) -- [bat](https://www.drupal.org/project/bat) -- [calendar](https://www.drupal.org/project/calendar) -- [civicrm_entity](https://www.drupal.org/project/civicrm_entity) -- [cloud](https://www.drupal.org/project/cloud) -- [cms_content_sync](https://www.drupal.org/project/cms_content_sync) -- [config_pages](https://www.drupal.org/project/config_pages) -- [consent_management](https://www.drupal.org/project/consent_management) -- [diboo_core](https://www.drupal.org/project/diboo_core) -- [entity_hierarchy](https://www.drupal.org/project/entity_hierarchy) -- [entity_reference_uuid](https://www.drupal.org/project/entity_reference_uuid) -- [entityqueue](https://www.drupal.org/project/entityqueue) -- [expirable_content](https://www.drupal.org/project/expirable_content) -- [friendship](https://www.drupal.org/project/friendship) -- [geolocation](https://www.drupal.org/project/geolocation) -- [ggroup](https://www.drupal.org/project/ggroup) -- [grant](https://www.drupal.org/project/grant) -- [group](https://www.drupal.org/project/group) -- [group_domain](https://www.drupal.org/project/group_domain) -- [islandora](https://www.drupal.org/project/islandora) -- [itunes_rss](https://www.drupal.org/project/itunes_rss) -- [lms](https://www.drupal.org/project/lms) -- [mdp](https://www.drupal.org/project/mdp) -- [media_filter](https://www.drupal.org/project/media_filter) -- [media_views_filter](https://www.drupal.org/project/media_views_filter) -- [meta_entity](https://www.drupal.org/project/meta_entity) -- [metatag](https://www.drupal.org/project/metatag) -- [moderation_team](https://www.drupal.org/project/moderation_team) -- [multilingual_plus](https://www.drupal.org/project/multilingual_plus) -- [muser](https://www.drupal.org/project/muser) -- [nodehive_core](https://www.drupal.org/project/nodehive_core) -- [og](https://www.drupal.org/project/og) -- [past](https://www.drupal.org/project/past) -- [plugin](https://www.drupal.org/project/plugin) -- [private_message](https://www.drupal.org/project/private_message) -- [search_api](https://www.drupal.org/project/search_api) -- [searchstax](https://www.drupal.org/project/searchstax) -- [social](https://www.drupal.org/project/social) -- [tally](https://www.drupal.org/project/tally) -- [taxonomy_parents_index](https://www.drupal.org/project/taxonomy_parents_index) -- [thunder](https://www.drupal.org/project/thunder) -- [tmgmt](https://www.drupal.org/project/tmgmt) -- [tmgmt_deepl](https://www.drupal.org/project/tmgmt_deepl) -- [translation_views](https://www.drupal.org/project/translation_views) -- [trash](https://www.drupal.org/project/trash) -- [unused_media_filter](https://www.drupal.org/project/unused_media_filter) -- [usage_data](https://www.drupal.org/project/usage_data) -- [views_entity_embed](https://www.drupal.org/project/views_entity_embed) -- [views_exclude_previous](https://www.drupal.org/project/views_exclude_previous) -- [views_linkarea](https://www.drupal.org/project/views_linkarea) -- [views_migration](https://www.drupal.org/project/views_migration) -- [views_moderation_state_weights](https://www.drupal.org/project/views_moderation_state_weights) -- [views_natural_sort](https://www.drupal.org/project/views_natural_sort) -- [views_override_viewmode](https://www.drupal.org/project/views_override_viewmode) -- [views_selective_filters](https://www.drupal.org/project/views_selective_filters) -- [workbench_moderation](https://www.drupal.org/project/workbench_moderation) - -### Rectors with no D11 contrib module found - -These had zero search hits across all search terms: - -- `ErrorCurrentErrorHandlerRector` -- `RemoveAutomatedCronSubmitHandlerRector` -- `RemoveLinkWidgetValidateTitleElementRector` -- `RenameStopProceduralHookScanRector` -- `ReplaceLocaleConfigBatchFunctionsRector` -- `StatementPrefetchIteratorFetchColumnRector` - ---- - -## By Module — covering 3+ rectors - -Modules that are good candidates for testing multiple rectors at once: - -### [social](https://www.drupal.org/project/social) — 4 rectors -- ReplaceCommentUriRector -- ReplaceNodeModuleProceduralFunctionsRector -- ReplaceViewsProceduralFunctionsRector -- ViewsPluginHandlerManagerRector - -### [acquia_contenthub](https://www.drupal.org/project/acquia_contenthub) — 4 rectors -- RemoveModuleHandlerAddModuleCallsRector -- ReplaceEditorLoadRector -- ReplacePdoFetchConstantsRector -- ReplaceUserSessionNamePropertyRector - -### [drd](https://www.drupal.org/project/drd) — 4 rectors -- ReplaceEntityOriginalPropertyRector -- ReplaceModuleHandlerGetNameRector -- ReplaceSessionWritesWithRequestSessionRector -- ReplaceSystemPerformanceGzipKeyRector - -### [og](https://www.drupal.org/project/og) — 3 rectors -- RemoveStateCacheSettingRector -- RemoveTrustDataCallRector -- ViewsPluginHandlerManagerRector - -### [searchstax](https://www.drupal.org/project/searchstax) — 3 rectors -- RemoveStateCacheSettingRector -- RemoveTwigNodeTransTagArgumentRector -- ViewsPluginHandlerManagerRector - -### [search_api](https://www.drupal.org/project/search_api) — 3 rectors -- PluginBaseIsConfigurableRector -- RemoveTwigNodeTransTagArgumentRector -- ViewsPluginHandlerManagerRector - -### [group](https://www.drupal.org/project/group) — 3 rectors -- RemoveTrustDataCallRector -- RemoveUpdaterPostInstallMethodsRector -- ViewsPluginHandlerManagerRector - -### [metatag](https://www.drupal.org/project/metatag) — 3 rectors -- PluginBaseIsConfigurableRector -- RemoveViewsRowCacheKeysRector -- ViewsPluginHandlerManagerRector - -### [ai_agents_experimental_collection](https://www.drupal.org/project/ai_agents_experimental_collection) — 3 rectors -- ReplaceEditorLoadRector -- ReplaceNodeSetPreviewModeRector -- ReplaceSystemPerformanceGzipKeyRector - -### [entity_embed](https://www.drupal.org/project/entity_embed) — 3 rectors -- ReplaceEditorLoadRector -- ReplaceEntityOriginalPropertyRector -- ReplaceEntityReferenceRecursiveLimitRector - -### [api](https://www.drupal.org/project/api) — 3 rectors -- PluginBaseIsConfigurableRector -- ReplaceViewsProceduralFunctionsRector -- ViewsPluginHandlerManagerRector From 7890bded138ebb9cf79c344050c3d4696aa115d0 Mon Sep 17 00:00:00 2001 From: bjorn Date: Mon, 11 May 2026 16:24:07 +0200 Subject: [PATCH 186/256] chore: remove --depth=1 from repo clone/fetch to avoid shallow checkouts --- .claude/scripts/setup-repos.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.claude/scripts/setup-repos.sh b/.claude/scripts/setup-repos.sh index d1449bcbd..62a044a0d 100755 --- a/.claude/scripts/setup-repos.sh +++ b/.claude/scripts/setup-repos.sh @@ -4,7 +4,7 @@ # Usage: bash .claude/scripts/setup-repos.sh [--update] # # Without --update: skips repos that are already cloned. -# With --update: runs `git fetch --depth=1` on existing clones. +# With --update: runs `git fetch` on existing clones. # # Repos are cloned into repos/ (gitignored) so they are accessible from # inside the ddev container at /var/www/html/repos/. @@ -23,11 +23,11 @@ clone_or_update() { if [ -d "$dest/.git" ]; then echo "==> Updating $name..." - git -C "$dest" fetch --depth=1 ${branch:+origin "$branch"} 2>&1 | tail -3 + git -C "$dest" fetch ${branch:+origin "$branch"} 2>&1 | tail -3 git -C "$dest" reset --hard FETCH_HEAD else echo "==> Cloning $name..." - local clone_args=(--depth=1) + local clone_args=() [ -n "$branch" ] && clone_args+=(--branch "$branch" --single-branch) git clone "${clone_args[@]}" "$url" "$dest" fi From c4f9c391635b9537b0155b4ee032ae27c8988884 Mon Sep 17 00:00:00 2001 From: bjorn Date: Mon, 11 May 2026 17:04:14 +0200 Subject: [PATCH 187/256] fix(rector-live-test): use config file instead of --only; diagnose zero-match modules MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Replace --only/--no-cache with a dedicated rector-live-test.php config file that always includes fileExtensions() — Rector silently skips .module and .install files without it, making misses impossible to distinguish from true no-ops - Make zero-match diagnosis mandatory: grep the call site, show ±8 lines of surrounding code, identify the cause, report inline - Update causes table with "How to spot it" and "Verdict" columns, add rows for chained unresolvable returns, broken use imports, and already-migrated modules --- .claude/skills/rector-live-test/SKILL.md | 65 ++++++++++++++++++++---- 1 file changed, 54 insertions(+), 11 deletions(-) diff --git a/.claude/skills/rector-live-test/SKILL.md b/.claude/skills/rector-live-test/SKILL.md index 8c45ae721..3a639cc32 100644 --- a/.claude/skills/rector-live-test/SKILL.md +++ b/.claude/skills/rector-live-test/SKILL.md @@ -138,20 +138,43 @@ ddev composer require drupal/ --no-interaction - `src/Drupal10/…` → `DrupalRector\Drupal10\Rector\Deprecation\` - `src/Rector/…` → `DrupalRector\Rector\Deprecation\` +**Write a minimal config file** — do NOT use `--only` (it loads the project's default rector.php +which may be broken) and do NOT omit `fileExtensions` (Rector only processes `.php` by default, +silently skipping `.module`, `.install`, etc.): + +```bash +cat > ~/projects/drupal-rector-test/rector-live-test.php << 'RECTOR_EOF' +; +use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; +use Rector\Config\RectorConfig; + +return static function (RectorConfig $rectorConfig): void { + $rectorConfig->fileExtensions(['php', 'module', 'theme', 'install', 'profile', 'inc']); + $rectorConfig->ruleWithConfiguration(::class, [ + new DrupalIntroducedVersionConfiguration(''), + ]); +}; +RECTOR_EOF +``` + **Run rector** against the found modules: ```bash cd ~/projects/drupal-rector-test ddev exec -d /var/www/html \ vendor/bin/rector process \ web/modules/contrib/ web/modules/contrib/ \ - --only="DrupalRector\\Drupal11\\Rector\\Deprecation\\" \ - --no-cache 2>&1 + --config rector-live-test.php \ + --clear-cache 2>&1 ``` -**Inspect the diff**, then reset for the next run: +**Inspect the diff**, then reset and clean up: ```bash git -C ~/projects/drupal-rector-test diff web/modules/contrib/ git -C ~/projects/drupal-rector-test checkout -- web/modules/contrib/ +rm ~/projects/drupal-rector-test/rector-live-test.php ``` ### 5. Report results @@ -162,15 +185,35 @@ For each tested module, report: Transformations: ``` +For every module with **zero changes**, do not just say "no match" — always show the actual +code and explain why. See step 6. + ### 6. Diagnose zero-match results -Common causes: +For **every** module that produced no changes, you must: + +1. **Find the exact call site:** + ```bash + grep -n "" ~/projects/drupal-rector-test/web/modules/contrib// + ``` + +2. **Show the surrounding code** (±8 lines): + ```bash + sed -n ',p' ~/projects/drupal-rector-test/web/modules/contrib// + ``` + +3. **Diagnose** by reading the code and identifying the cause from the table below. + +4. **Report** the code snippet and diagnosis inline — do not skip this even if the cause seems obvious. + +**Common causes:** -| Cause | Diagnosis | Fix | -|-------|-----------|-----| -| Untyped code | The variable calling the deprecated method has no type annotation | The rector is working correctly — untyped code is intentionally skipped to avoid false positives | -| Wrong module version | The module has already updated its code | Try an older tagged version | -| Rector class mismatch | Wrong rector class was run | Verify the rector targets the exact deprecated API used in the module | -| Rector cache | Old cache silently skips files | Already handled by `--no-cache` | -| getNodeTypes mismatch | The node type returned by the rector doesn't match the actual AST node | Read the digest rule and the actual module code to compare | +| Cause | How to spot it | Verdict | +|-------|---------------|---------| +| Untyped receiver | No `@var` annotation and no type-hinted parameter for the variable | Rector is correct to skip — would cause false positives on unrelated classes | +| Chained call, return type unresolvable | `$foo->something()->getOriginalClass()` where `something()` has no known return type | Rector correctly skips — add phpstan-drupal or a stub to fix | +| Broken `use` import | File imports a class from a module that isn't installed | PHPStan can't resolve the import, degrades type inference for the whole file | +| `.module` file silently skipped | File extension is `.module`, `.install`, etc. | Config is missing `fileExtensions()` — this should not happen if step 4 was followed | +| Module already updated | The call site no longer uses the deprecated API | Expected — the module has already migrated | +| Wrong rector class | The rector targets a different method/function | Verify the rector's `isName()` matches the actual call in the module | From f1764aa2ef2d3b66581cbd381ef47e9ff94197dc Mon Sep 17 00:00:00 2001 From: bjorn Date: Mon, 11 May 2026 17:05:00 +0200 Subject: [PATCH 188/256] feat(Drupal11): Add GetOriginalClassToGetDecoratedClassesRector for issue #3557461 Replaces deprecated EntityTypeInterface::getOriginalClass() with getDecoratedClasses()[0]. The new method was introduced alongside the deprecation in Drupal 11.4, so the rector uses AbstractDrupalCoreRector for BC wrapping. https://www.drupal.org/node/3557461 https://www.drupal.org/node/3587853 --- config/drupal-11/drupal-11.4-deprecations.php | 9 ++ ...iginalClassToGetDecoratedClassesRector.php | 82 +++++++++++++++++++ ...alClassToGetDecoratedClassesRectorTest.php | 54 ++++++++++++ .../config/configured_rule.php | 14 ++++ .../fixture-below-version/basic.php.inc | 11 +++ .../fixture/basic.php.inc | 11 +++ .../fixture/no_change_unrelated.php.inc | 11 +++ 7 files changed, 192 insertions(+) create mode 100644 src/Drupal11/Rector/Deprecation/GetOriginalClassToGetDecoratedClassesRector.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/GetOriginalClassToGetDecoratedClassesRector/GetOriginalClassToGetDecoratedClassesRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/GetOriginalClassToGetDecoratedClassesRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/GetOriginalClassToGetDecoratedClassesRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/GetOriginalClassToGetDecoratedClassesRector/fixture/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/GetOriginalClassToGetDecoratedClassesRector/fixture/no_change_unrelated.php.inc diff --git a/config/drupal-11/drupal-11.4-deprecations.php b/config/drupal-11/drupal-11.4-deprecations.php index d49a6736e..02683213e 100644 --- a/config/drupal-11/drupal-11.4-deprecations.php +++ b/config/drupal-11/drupal-11.4-deprecations.php @@ -4,6 +4,7 @@ use DrupalRector\Drupal11\Rector\Deprecation\DeprecatedFilterFunctionsRector; use DrupalRector\Drupal11\Rector\Deprecation\FilterFormatFunctionsToServiceRector; +use DrupalRector\Drupal11\Rector\Deprecation\GetOriginalClassToGetDecoratedClassesRector; use DrupalRector\Drupal11\Rector\Deprecation\MediaFilterFormatEditFormValidateRector; use DrupalRector\Drupal11\Rector\Deprecation\NodeAccessRebuildFunctionsRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveAutomatedCronSubmitHandlerRector; @@ -295,6 +296,14 @@ new DrupalIntroducedVersionConfiguration('11.4.0'), ]); + // https://www.drupal.org/node/3557461 + // https://www.drupal.org/node/3587853 (change record) + // EntityTypeInterface::getOriginalClass() deprecated in drupal:11.4.0, removed in drupal:12.0.0. + // Replaced by getDecoratedClasses()[0]. + $rectorConfig->ruleWithConfiguration(GetOriginalClassToGetDecoratedClassesRector::class, [ + new DrupalIntroducedVersionConfiguration('11.4.0'), + ]); + // https://www.drupal.org/node/3566801 // https://www.drupal.org/node/3566814 (change record) // getEntityTypeIdKeyType() === 'integer', entityTypeSupportsComments(), and hasIntegerId($entityType) diff --git a/src/Drupal11/Rector/Deprecation/GetOriginalClassToGetDecoratedClassesRector.php b/src/Drupal11/Rector/Deprecation/GetOriginalClassToGetDecoratedClassesRector.php new file mode 100644 index 000000000..df304e03f --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/GetOriginalClassToGetDecoratedClassesRector.php @@ -0,0 +1,82 @@ +> */ + public function getNodeTypes(): array + { + return [MethodCall::class]; + } + + public function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node + { + if (!$node instanceof MethodCall) { + return null; + } + + if (!$this->isName($node->name, 'getOriginalClass')) { + return null; + } + + if (!$this->isObjectType($node->var, new ObjectType('Drupal\Core\Entity\EntityTypeInterface'))) { + return null; + } + + $newMethodCall = new MethodCall($node->var, 'getDecoratedClasses', []); + + return new ArrayDimFetch($newMethodCall, new Int_(0)); + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition( + 'Replace deprecated EntityTypeInterface::getOriginalClass() with getDecoratedClasses()[0].', + [ + new ConfiguredCodeSample( + <<<'CODE_BEFORE' +$originalClass = $entityType->getOriginalClass(); +CODE_BEFORE, + <<<'CODE_AFTER' +$originalClass = $entityType->getDecoratedClasses()[0]; +CODE_AFTER, + [new DrupalIntroducedVersionConfiguration('11.4.0')] + ), + ] + ); + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/GetOriginalClassToGetDecoratedClassesRector/GetOriginalClassToGetDecoratedClassesRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/GetOriginalClassToGetDecoratedClassesRector/GetOriginalClassToGetDecoratedClassesRectorTest.php new file mode 100644 index 000000000..f516ff659 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/GetOriginalClassToGetDecoratedClassesRector/GetOriginalClassToGetDecoratedClassesRectorTest.php @@ -0,0 +1,54 @@ +make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } + } + + /** + * @return \Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/GetOriginalClassToGetDecoratedClassesRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/GetOriginalClassToGetDecoratedClassesRector/config/configured_rule.php new file mode 100644 index 000000000..b1b4fe348 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/GetOriginalClassToGetDecoratedClassesRector/config/configured_rule.php @@ -0,0 +1,14 @@ +getOriginalClass(); +?> +----- +getOriginalClass(); +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/GetOriginalClassToGetDecoratedClassesRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/GetOriginalClassToGetDecoratedClassesRector/fixture/basic.php.inc new file mode 100644 index 000000000..bf891c8ce --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/GetOriginalClassToGetDecoratedClassesRector/fixture/basic.php.inc @@ -0,0 +1,11 @@ +getOriginalClass(); +?> +----- + $entityType->getDecoratedClasses()[0], fn() => $entityType->getOriginalClass()); +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/GetOriginalClassToGetDecoratedClassesRector/fixture/no_change_unrelated.php.inc b/tests/src/Drupal11/Rector/Deprecation/GetOriginalClassToGetDecoratedClassesRector/fixture/no_change_unrelated.php.inc new file mode 100644 index 000000000..a0c0fb5a7 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/GetOriginalClassToGetDecoratedClassesRector/fixture/no_change_unrelated.php.inc @@ -0,0 +1,11 @@ +getOriginalClass(); +?> +----- +getOriginalClass(); +?> From 962c6a551f4b44a465c855aea2a11c8f46bb956e Mon Sep 17 00:00:00 2001 From: bjorn Date: Mon, 11 May 2026 17:20:23 +0200 Subject: [PATCH 189/256] fix(rector-index): double checked for missing digests. Seems the index script missed a few. Script was expanded to look a little more loosely. --- .claude/scripts/generate-rector-index.php | 70 +++++++++++++++++++---- 1 file changed, 59 insertions(+), 11 deletions(-) diff --git a/.claude/scripts/generate-rector-index.php b/.claude/scripts/generate-rector-index.php index a98df399f..ce91e2092 100644 --- a/.claude/scripts/generate-rector-index.php +++ b/.claude/scripts/generate-rector-index.php @@ -26,7 +26,9 @@ 'RenameClassRector' => 'unknown', ]; -const SCOPE_PATTERN = '/^(replace-deprecated|remove-deprecated|replace-removed|strip-removed)/'; +// Files with these prefixes add new capability (constructor args, type hints, DI wiring) +// rather than removing deprecated APIs. Keep them out of scope even when they mention @deprecated. +const FORWARD_COMPAT_PREFIXES = ['add-', 'fix-', 'guard-', 'pass-', 'update-']; main($argv); @@ -113,16 +115,17 @@ function scanDigestFiles(string $rulesDir): array foreach (glob($rulesDir . '/*.php') as $file) { $filename = basename($file); - if (!preg_match(SCOPE_PATTERN, $filename)) { - continue; - } - $issueNumber = extractIssueNumber($filename); if ($issueNumber === null) { continue; } $content = file_get_contents($file); + + if (!isDeprecationDigest($filename, $content)) { + continue; + } + $phase = classifyPhaseFromDigest($content, $filename); $entries[$issueNumber] = [ @@ -148,6 +151,42 @@ function extractIssueNumber(string $filename): ?string return null; } +/** + * Returns true when a digest file documents a Drupal deprecation or removal. + * + * Two-pass check: + * 1. Canonical prefixes (replace-deprecated-*, remove-deprecated-*, replace-removed-*, + * strip-removed-*) are always in scope — this includes Twig/library deprecations + * that don't use the "@deprecated drupal:" marker. + * 2. Non-canonical prefixes are included when the file content contains + * "@deprecated drupal:" or "deprecated in drupal:" — the standard Drupal core + * notation. This catches files like "rename-deprecated-*", "replace-filesysteminterface-*", + * "remove-overrides-of-deprecated-*", etc. + * + * Exception: files with forward-compatibility prefixes (add new constructor args, + * fix type signatures, etc.) are excluded even when they mention a deprecated signature. + */ +function isDeprecationDigest(string $filename, string $content): bool +{ + // Always in scope: canonical deprecation/removal/rename prefixes. + // rename- is included unconditionally because renaming a class or hook is inherently + // a breaking API change — there is no "forward-compat" meaning for a rename. + if (preg_match('/^(replace-deprecated|remove-deprecated|replace-removed|strip-removed|rename-)/', $filename)) { + return true; + } + + // Never in scope: forward-compatibility files (add args, fix signatures, etc.). + foreach (FORWARD_COMPAT_PREFIXES as $prefix) { + if (str_starts_with($filename, $prefix)) { + return false; + } + } + + // Also in scope: non-canonical prefix but explicitly Drupal-deprecated APIs. + return str_contains($content, '@deprecated drupal:') + || str_contains($content, 'deprecated in drupal:'); +} + /** * Classifies phase from digest file content by inspecting getNodeTypes(). */ @@ -162,27 +201,33 @@ function classifyPhaseFromDigest(string $content, string $filename): string $hasFuncCall = str_contains($nodeTypes, 'FuncCall'); $hasMethodCall = str_contains($nodeTypes, 'MethodCall') || str_contains($nodeTypes, 'NullsafeMethodCall'); + $hasStaticCall = str_contains($nodeTypes, 'StaticCall'); $hasClassConst = str_contains($nodeTypes, 'ClassConstFetch') || str_contains($nodeTypes, 'ConstFetch'); $hasExpression = str_contains($nodeTypes, 'Expression'); $hasRemoveNode = str_contains($content, 'REMOVE_NODE'); // Phase 3: removes the node entirely. - if ($hasRemoveNode || ($hasExpression && !$hasFuncCall && !$hasMethodCall)) { + if ($hasRemoveNode || ($hasExpression && !$hasFuncCall && !$hasMethodCall && !$hasStaticCall)) { return '3'; } // Pure FuncCall — Phase 1a or 1b. - if ($hasFuncCall && !$hasMethodCall && !$hasClassConst) { + if ($hasFuncCall && !$hasMethodCall && !$hasStaticCall && !$hasClassConst) { return classifyFuncCallSubPhase($content); } // ClassConstFetch / ConstFetch — Phase 1c. - if ($hasClassConst && !$hasFuncCall && !$hasMethodCall) { + if ($hasClassConst && !$hasFuncCall && !$hasMethodCall && !$hasStaticCall) { return '1c'; } // MethodCall/NullsafeMethodCall — Phase 2. - if ($hasMethodCall && !$hasFuncCall && !$hasClassConst && !$hasExpression) { + if ($hasMethodCall && !$hasFuncCall && !$hasStaticCall && !$hasClassConst && !$hasExpression) { + return '2'; + } + + // StaticCall — Phase 2 (custom transformation of a typed static call, same complexity as MethodCall). + if ($hasStaticCall && !$hasFuncCall && !$hasMethodCall && !$hasClassConst && !$hasExpression) { return '2'; } @@ -385,8 +430,11 @@ function parseConfigBlock(string $content, string $relFile, array &$entries, arr continue; } - // On ruleWithConfiguration(...), process the pending issues. - if (preg_match('/\$rectorConfig->ruleWithConfiguration\s*\(\s*([A-Za-z0-9_\\\\]+)::class/', $trimmed, $m)) { + // On ruleWithConfiguration(...) or rule(...), process the pending issues. + $isRuleCall = preg_match('/\$rectorConfig->ruleWithConfiguration\s*\(\s*([A-Za-z0-9_\\\\]+)::class/', $trimmed, $m) + || preg_match('/\$rectorConfig->rule\s*\(\s*([A-Za-z0-9_\\\\]+)::class/', $trimmed, $m); + + if ($isRuleCall) { $shortClass = extractShortClassName($m[1]); if (isset(GENERIC_RECTORS[$shortClass])) { From 0809db8a28013db06d8d1858ddb6f69b7013e78e Mon Sep 17 00:00:00 2001 From: bjorn Date: Mon, 11 May 2026 17:39:40 +0200 Subject: [PATCH 190/256] feat(Drupal11): Add FunctionToServiceRector config for views_add_contextual_links #2571679 views_add_contextual_links() deprecated in drupal:11.4.0, removed in drupal:13.0.0. Replaced by \Drupal\views\ContextualLinksHelper::addLinks(). --- config/drupal-11/drupal-11.4-deprecations.php | 8 ++++++++ .../FunctionToServiceRector/config/configured_rule.php | 2 ++ .../fixture/views-add-contextual-links-2571679.php.inc | 9 +++++++++ 3 files changed, 19 insertions(+) create mode 100644 tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/views-add-contextual-links-2571679.php.inc diff --git a/config/drupal-11/drupal-11.4-deprecations.php b/config/drupal-11/drupal-11.4-deprecations.php index 02683213e..839bec193 100644 --- a/config/drupal-11/drupal-11.4-deprecations.php +++ b/config/drupal-11/drupal-11.4-deprecations.php @@ -372,6 +372,14 @@ new FunctionToServiceConfiguration('11.4.0', 'locale_translate_get_interface_translation_files', 'Drupal\locale\File\LocaleFileManager', 'getInterfaceTranslationFiles'), ]); + // https://www.drupal.org/node/2571679 + // https://www.drupal.org/node/3382344 (change record) + // views_add_contextual_links() deprecated in drupal:11.4.0, removed in drupal:13.0.0. + // Replaced by \Drupal\views\ContextualLinksHelper::addLinks() service call. + $rectorConfig->ruleWithConfiguration(FunctionToServiceRector::class, [ + new FunctionToServiceConfiguration('11.4.0', 'views_add_contextual_links', 'Drupal\views\ContextualLinksHelper', 'addLinks', true), + ]); + // https://www.drupal.org/node/3567618 // IMAGE_DERIVATIVE_TOKEN deprecated in drupal:11.4.0, removed in drupal:13.0.0. // Replaced by \Drupal\image\ImageStyleInterface::TOKEN. diff --git a/tests/src/Rector/Deprecation/FunctionToServiceRector/config/configured_rule.php b/tests/src/Rector/Deprecation/FunctionToServiceRector/config/configured_rule.php index 280842776..8fb8dcb6d 100644 --- a/tests/src/Rector/Deprecation/FunctionToServiceRector/config/configured_rule.php +++ b/tests/src/Rector/Deprecation/FunctionToServiceRector/config/configured_rule.php @@ -71,5 +71,7 @@ new FunctionToServiceConfiguration('11.4.0', 'user_form_process_password_confirm', 'Drupal\user\Hook\UserThemeHooks', 'processPasswordConfirm'), // https://www.drupal.org/node/2473041 (Drupal 11.4) new FunctionToServiceConfiguration('11.4.0', 'node_access_grants', 'Drupal\node\NodeGrantsHelper', 'nodeAccessGrants', true), + // https://www.drupal.org/node/2571679 (Drupal 11.4) + new FunctionToServiceConfiguration('11.4.0', 'views_add_contextual_links', 'Drupal\views\ContextualLinksHelper', 'addLinks', true), ]); }; diff --git a/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/views-add-contextual-links-2571679.php.inc b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/views-add-contextual-links-2571679.php.inc new file mode 100644 index 000000000..e11ae19b0 --- /dev/null +++ b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/views-add-contextual-links-2571679.php.inc @@ -0,0 +1,9 @@ + +----- + \Drupal::service(\Drupal\views\ContextualLinksHelper::class)->addLinks($element, 'view', $display_id), fn() => views_add_contextual_links($element, 'view', $display_id)); +?> From 4bde6be427a43635468154000270def4b6fa0bfa Mon Sep 17 00:00:00 2001 From: bjorn Date: Mon, 11 May 2026 17:44:50 +0200 Subject: [PATCH 191/256] chore(rector-live-test): Don't always start ddev when testing. --- .claude/skills/rector-live-test/SKILL.md | 10 ++++++++-- .claude/skills/rector-live-test/setup-rector-test.sh | 9 +++++++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/.claude/skills/rector-live-test/SKILL.md b/.claude/skills/rector-live-test/SKILL.md index 3a639cc32..fce351163 100644 --- a/.claude/skills/rector-live-test/SKILL.md +++ b/.claude/skills/rector-live-test/SKILL.md @@ -124,8 +124,14 @@ ls ~/projects/drupal-rector-test/.ddev 2>/dev/null && echo "exists" || echo "not bash .claude/skills/rector-live-test/setup-rector-test.sh ``` This creates a Drupal 11 site at `~/projects/drupal-rector-test` with a broad set of -contrib modules pre-installed. Running the script again is safe — it detects the existing -project and just ensures DDEV is started. +contrib modules pre-installed. + +**If found**, check whether DDEV is running and start it only if needed: +```bash +cd ~/projects/drupal-rector-test +DDEV_STATUS=$(ddev status --json-output 2>/dev/null | python3 -c "import json,sys; print(json.load(sys.stdin).get('raw',{}).get('status','stopped'))" 2>/dev/null || echo "stopped") +[ "$DDEV_STATUS" = "running" ] || ddev start -y +``` **If a module found in step 2 is not pre-installed**, add it before running: ```bash diff --git a/.claude/skills/rector-live-test/setup-rector-test.sh b/.claude/skills/rector-live-test/setup-rector-test.sh index 39cc54c5d..5a2f5cd7d 100755 --- a/.claude/skills/rector-live-test/setup-rector-test.sh +++ b/.claude/skills/rector-live-test/setup-rector-test.sh @@ -22,9 +22,14 @@ echo "" # Idempotency: skip full setup if the DDEV project already exists. if [ -d "$TARGET_DIR/.ddev" ]; then - echo "==> Project already exists — starting DDEV if needed." + echo "==> Project already exists — checking DDEV status." cd "$TARGET_DIR" - ddev start -y + DDEV_STATUS=$(ddev status --json-output 2>/dev/null | python3 -c "import json,sys; print(json.load(sys.stdin).get('raw',{}).get('status','stopped'))" 2>/dev/null || echo "stopped") + if [ "$DDEV_STATUS" = "running" ]; then + echo "==> DDEV already running." + else + ddev start -y + fi echo "" echo " To run a single rector:" echo " ddev exec -d /var/www/html vendor/bin/rector process web/modules/contrib/ \\" From 38620e4786c11f94fd6d1a7b11d6a6122861dee2 Mon Sep 17 00:00:00 2001 From: bjorn Date: Mon, 11 May 2026 17:52:36 +0200 Subject: [PATCH 192/256] feat(Drupal11): Add SystemRegionFunctionsRector for issue #3015812 Replace deprecated system_region_list() and system_default_region() with Theme object methods via \Drupal::service('theme_handler')->getTheme(). --- config/drupal-11/drupal-11.4-deprecations.php | 8 ++ .../SystemRegionFunctionsRector.php | 133 ++++++++++++++++++ .../SystemRegionFunctionsRectorTest.php | 50 +++++++ .../config/configured_rule.php | 14 ++ .../fixture-below-version/basic.php.inc | 13 ++ .../fixture/basic.php.inc | 13 ++ .../fixture/no_change_unrelated.php.inc | 13 ++ 7 files changed, 244 insertions(+) create mode 100644 src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector/SystemRegionFunctionsRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector/fixture/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector/fixture/no_change_unrelated.php.inc diff --git a/config/drupal-11/drupal-11.4-deprecations.php b/config/drupal-11/drupal-11.4-deprecations.php index 839bec193..2acdc7e47 100644 --- a/config/drupal-11/drupal-11.4-deprecations.php +++ b/config/drupal-11/drupal-11.4-deprecations.php @@ -19,6 +19,7 @@ use DrupalRector\Drupal11\Rector\Deprecation\ReplaceSessionManagerDeleteRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceSystemPerformanceGzipKeyRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceViewsProceduralFunctionsRector; +use DrupalRector\Drupal11\Rector\Deprecation\SystemRegionFunctionsRector; use DrupalRector\Drupal11\Rector\Deprecation\UseEntityTypeHasIntegerIdRector; use DrupalRector\Drupal11\Rector\Deprecation\ViewsPluginHandlerManagerRector; use DrupalRector\Rector\Deprecation\ClassConstantToClassConstantRector; @@ -393,4 +394,11 @@ $rectorConfig->ruleWithConfiguration(ReplaceEntityReferenceRecursiveLimitRector::class, [ new DrupalIntroducedVersionConfiguration('11.4.0'), ]); + + // https://www.drupal.org/node/3015812 + // system_region_list() and system_default_region() deprecated in drupal:11.4.0, removed in drupal:13.0.0. + // Replaced by Theme object methods via \Drupal::service('theme_handler')->getTheme(). + $rectorConfig->ruleWithConfiguration(SystemRegionFunctionsRector::class, [ + new DrupalIntroducedVersionConfiguration('11.4.0'), + ]); }; diff --git a/src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector.php b/src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector.php new file mode 100644 index 000000000..8206618b3 --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector.php @@ -0,0 +1,133 @@ +> */ + public function getNodeTypes(): array + { + return [FuncCall::class]; + } + + protected function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node + { + assert($node instanceof FuncCall); + + if (!$node->name instanceof Name) { + return null; + } + + return match ($node->name->toString()) { + 'system_region_list' => $this->refactorSystemRegionList($node), + 'system_default_region' => $this->refactorSystemDefaultRegion($node), + default => null, + }; + } + + private function refactorSystemRegionList(FuncCall $node): ?MethodCall + { + if (empty($node->args) || !$node->args[0] instanceof Arg) { + return null; + } + + $themeExpr = $node->args[0]->value; + $method = 'listAllRegions'; + + if (isset($node->args[1]) && $node->args[1] instanceof Arg) { + $showArg = $node->args[1]->value; + if ( + ($showArg instanceof ConstFetch && in_array($this->getName($showArg), ['REGIONS_VISIBLE', 'visible'], true)) + || ($showArg instanceof String_ && $showArg->value === 'visible') + ) { + $method = 'listVisibleRegions'; + } + } + + return $this->buildThemeChainCall($themeExpr, $method); + } + + private function refactorSystemDefaultRegion(FuncCall $node): ?MethodCall + { + if (empty($node->args) || !$node->args[0] instanceof Arg) { + return null; + } + + return $this->buildThemeChainCall($node->args[0]->value, 'getDefaultRegion'); + } + + private function buildThemeChainCall(Expr $themeExpr, string $method): MethodCall + { + $serviceCall = new StaticCall( + new FullyQualified('Drupal'), + 'service', + [new Arg(new String_('theme_handler'))] + ); + $getTheme = new MethodCall($serviceCall, 'getTheme', [new Arg($themeExpr)]); + + return new MethodCall($getTheme, $method, []); + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition( + 'Replace deprecated system_region_list() and system_default_region() with Theme object methods via the theme_handler service.', + [ + new ConfiguredCodeSample( + 'system_region_list($theme);', + "\Drupal::service('theme_handler')->getTheme(\$theme)->listAllRegions();", + [new DrupalIntroducedVersionConfiguration('11.4.0')] + ), + new ConfiguredCodeSample( + 'system_region_list($theme, REGIONS_VISIBLE);', + "\Drupal::service('theme_handler')->getTheme(\$theme)->listVisibleRegions();", + [new DrupalIntroducedVersionConfiguration('11.4.0')] + ), + new ConfiguredCodeSample( + 'system_default_region($theme);', + "\Drupal::service('theme_handler')->getTheme(\$theme)->getDefaultRegion();", + [new DrupalIntroducedVersionConfiguration('11.4.0')] + ), + ] + ); + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector/SystemRegionFunctionsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector/SystemRegionFunctionsRectorTest.php new file mode 100644 index 000000000..15ea7efec --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector/SystemRegionFunctionsRectorTest.php @@ -0,0 +1,50 @@ +make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } + } + + /** @return \Iterator> */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } + } + + /** @return \Iterator> */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector/config/configured_rule.php new file mode 100644 index 000000000..eb46ef3e4 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector/config/configured_rule.php @@ -0,0 +1,14 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector/fixture/basic.php.inc new file mode 100644 index 000000000..6c96a2f5e --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector/fixture/basic.php.inc @@ -0,0 +1,13 @@ + +----- + \Drupal::service('theme_handler')->getTheme($theme)->listAllRegions(), fn() => system_region_list($theme)); +$visible = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('theme_handler')->getTheme($theme)->listVisibleRegions(), fn() => system_region_list($theme, REGIONS_VISIBLE)); +$default = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('theme_handler')->getTheme($theme)->getDefaultRegion(), fn() => system_default_region($theme)); +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector/fixture/no_change_unrelated.php.inc b/tests/src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector/fixture/no_change_unrelated.php.inc new file mode 100644 index 000000000..5a05595e8 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector/fixture/no_change_unrelated.php.inc @@ -0,0 +1,13 @@ + +----- + From d06bab48df821bbe9e5a24a0c267cc991c1f9b32 Mon Sep 17 00:00:00 2001 From: bjorn Date: Mon, 11 May 2026 18:01:30 +0200 Subject: [PATCH 193/256] test(Drupal11): Expand SystemRegionFunctionsRector fixtures for REGIONS_ALL and string 'visible' cases --- .../fixture-below-version/basic.php.inc | 4 ++++ .../SystemRegionFunctionsRector/fixture/basic.php.inc | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/tests/src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector/fixture-below-version/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector/fixture-below-version/basic.php.inc index 37fda211c..671236040 100644 --- a/tests/src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector/fixture-below-version/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector/fixture-below-version/basic.php.inc @@ -1,13 +1,17 @@ ----- diff --git a/tests/src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector/fixture/basic.php.inc index 6c96a2f5e..252b45026 100644 --- a/tests/src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector/fixture/basic.php.inc @@ -1,13 +1,17 @@ ----- \Drupal::service('theme_handler')->getTheme($theme)->listAllRegions(), fn() => system_region_list($theme)); +$all_explicit = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('theme_handler')->getTheme($theme)->listAllRegions(), fn() => system_region_list($theme, REGIONS_ALL)); $visible = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('theme_handler')->getTheme($theme)->listVisibleRegions(), fn() => system_region_list($theme, REGIONS_VISIBLE)); +$visible_string = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('theme_handler')->getTheme($theme)->listVisibleRegions(), fn() => system_region_list($theme, 'visible')); $default = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('theme_handler')->getTheme($theme)->getDefaultRegion(), fn() => system_default_region($theme)); ?> From 47c5c648001931cfb47f16bc245d308ae90aaa23 Mon Sep 17 00:00:00 2001 From: bjorn Date: Mon, 11 May 2026 18:08:39 +0200 Subject: [PATCH 194/256] fix(Drupal11): Handle BlockRepositoryInterface::REGIONS_VISIBLE in SystemRegionFunctionsRector --- src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector.php | 2 ++ .../fixture-below-version/basic.php.inc | 2 ++ .../SystemRegionFunctionsRector/fixture/basic.php.inc | 2 ++ 3 files changed, 6 insertions(+) diff --git a/src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector.php b/src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector.php index 8206618b3..00a4f8709 100644 --- a/src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector.php +++ b/src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector.php @@ -10,6 +10,7 @@ use PhpParser\Node; use PhpParser\Node\Arg; use PhpParser\Node\Expr; +use PhpParser\Node\Expr\ClassConstFetch; use PhpParser\Node\Expr\ConstFetch; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\MethodCall; @@ -78,6 +79,7 @@ private function refactorSystemRegionList(FuncCall $node): ?MethodCall if ( ($showArg instanceof ConstFetch && in_array($this->getName($showArg), ['REGIONS_VISIBLE', 'visible'], true)) || ($showArg instanceof String_ && $showArg->value === 'visible') + || ($showArg instanceof ClassConstFetch && $this->isName($showArg->name, 'REGIONS_VISIBLE')) ) { $method = 'listVisibleRegions'; } diff --git a/tests/src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector/fixture-below-version/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector/fixture-below-version/basic.php.inc index 671236040..536051c2d 100644 --- a/tests/src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector/fixture-below-version/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector/fixture-below-version/basic.php.inc @@ -3,6 +3,7 @@ $all = system_region_list($theme); $all_explicit = system_region_list($theme, REGIONS_ALL); $visible = system_region_list($theme, REGIONS_VISIBLE); +$visible_class_const = system_region_list($theme, \Drupal\block\BlockRepositoryInterface::REGIONS_VISIBLE); $visible_string = system_region_list($theme, 'visible'); $default = system_default_region($theme); ?> @@ -12,6 +13,7 @@ $default = system_default_region($theme); $all = system_region_list($theme); $all_explicit = system_region_list($theme, REGIONS_ALL); $visible = system_region_list($theme, REGIONS_VISIBLE); +$visible_class_const = system_region_list($theme, \Drupal\block\BlockRepositoryInterface::REGIONS_VISIBLE); $visible_string = system_region_list($theme, 'visible'); $default = system_default_region($theme); ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector/fixture/basic.php.inc index 252b45026..5115e08fe 100644 --- a/tests/src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector/fixture/basic.php.inc @@ -3,6 +3,7 @@ $all = system_region_list($theme); $all_explicit = system_region_list($theme, REGIONS_ALL); $visible = system_region_list($theme, REGIONS_VISIBLE); +$visible_class_const = system_region_list($theme, \Drupal\block\BlockRepositoryInterface::REGIONS_VISIBLE); $visible_string = system_region_list($theme, 'visible'); $default = system_default_region($theme); ?> @@ -12,6 +13,7 @@ $default = system_default_region($theme); $all = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('theme_handler')->getTheme($theme)->listAllRegions(), fn() => system_region_list($theme)); $all_explicit = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('theme_handler')->getTheme($theme)->listAllRegions(), fn() => system_region_list($theme, REGIONS_ALL)); $visible = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('theme_handler')->getTheme($theme)->listVisibleRegions(), fn() => system_region_list($theme, REGIONS_VISIBLE)); +$visible_class_const = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('theme_handler')->getTheme($theme)->listVisibleRegions(), fn() => system_region_list($theme, \Drupal\block\BlockRepositoryInterface::REGIONS_VISIBLE)); $visible_string = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('theme_handler')->getTheme($theme)->listVisibleRegions(), fn() => system_region_list($theme, 'visible')); $default = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('theme_handler')->getTheme($theme)->getDefaultRegion(), fn() => system_default_region($theme)); ?> From db5eec382c8452e7ef16f01d00aa1d80d0a4e833 Mon Sep 17 00:00:00 2001 From: bjorn Date: Mon, 11 May 2026 18:12:44 +0200 Subject: [PATCH 195/256] fix(Drupal11): Use ::class syntax for node_mass_update FunctionToServiceRector config #3533083 The FunctionToServiceConfiguration entry was missing the 5th `true` argument, causing the output to use a string service ID instead of the FQCN ::class form as specified in the deprecation and the digest rule. --- config/drupal-11/drupal-11.3-deprecations.php | 2 +- .../FunctionToServiceRector/config/configured_rule.php | 2 +- .../FunctionToServiceRector/fixture/node_mass_update.php.inc | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/config/drupal-11/drupal-11.3-deprecations.php b/config/drupal-11/drupal-11.3-deprecations.php index 2011dee97..aec5524ed 100644 --- a/config/drupal-11/drupal-11.3-deprecations.php +++ b/config/drupal-11/drupal-11.3-deprecations.php @@ -60,7 +60,7 @@ // Replaced by \Drupal::service(TwigThemeEngine::class)->renderTemplate(). // twig_extension() is handled by ReplaceTwigExtensionRector below. $rectorConfig->ruleWithConfiguration(FunctionToServiceRector::class, [ - new FunctionToServiceConfiguration('11.3.0', 'node_mass_update', 'Drupal\node\NodeBulkUpdate', 'process'), + new FunctionToServiceConfiguration('11.3.0', 'node_mass_update', 'Drupal\node\NodeBulkUpdate', 'process', true), new FunctionToServiceConfiguration('11.3.0', 'twig_render_template', 'Drupal\Core\Template\TwigThemeEngine', 'renderTemplate'), ]); diff --git a/tests/src/Rector/Deprecation/FunctionToServiceRector/config/configured_rule.php b/tests/src/Rector/Deprecation/FunctionToServiceRector/config/configured_rule.php index 8fb8dcb6d..a7bf46aa6 100644 --- a/tests/src/Rector/Deprecation/FunctionToServiceRector/config/configured_rule.php +++ b/tests/src/Rector/Deprecation/FunctionToServiceRector/config/configured_rule.php @@ -24,7 +24,7 @@ new FunctionToServiceConfiguration('11.2.0', 'template_preprocess_html', 'Drupal\Core\Theme\ThemePreprocess', 'preprocessHtml'), new FunctionToServiceConfiguration('11.2.0', 'template_preprocess_page', 'Drupal\Core\Theme\ThemePreprocess', 'preprocessPage'), // https://www.drupal.org/node/3571623 (Drupal 11.3) - new FunctionToServiceConfiguration('11.3.0', 'node_mass_update', 'Drupal\node\NodeBulkUpdate', 'process'), + new FunctionToServiceConfiguration('11.3.0', 'node_mass_update', 'Drupal\node\NodeBulkUpdate', 'process', true), // https://www.drupal.org/node/3571382 (Drupal 11.3) new FunctionToServiceConfiguration('11.3.0', 'template_preprocess_layout', 'Drupal\layout_discovery\Hook\LayoutDiscoveryThemeHooks', 'preprocessLayout', true), // https://www.drupal.org/node/1685492 (Drupal 11.3) diff --git a/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/node_mass_update.php.inc b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/node_mass_update.php.inc index 5d19b40cd..5809dcdbb 100644 --- a/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/node_mass_update.php.inc +++ b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/node_mass_update.php.inc @@ -8,6 +8,6 @@ function example($nids, $updates, $langcode) { \Drupal::service('Drupal\node\NodeBulkUpdate')->process($nids, $updates, $langcode, true, false), fn() => node_mass_update($nids, $updates, $langcode, true, false)); + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => \Drupal::service(\Drupal\node\NodeBulkUpdate::class)->process($nids, $updates, $langcode, true, false), fn() => node_mass_update($nids, $updates, $langcode, true, false)); } ?> From d3ff4c9c3b8348892cff36d6862bf37a96e559c5 Mon Sep 17 00:00:00 2001 From: bjorn Date: Mon, 11 May 2026 18:31:44 +0200 Subject: [PATCH 196/256] feat(Drupal11): Add FunctionToServiceRector config for field_ui_form_manage_field_form_submit #3567163 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit No contrib modules found using this function — it was field_ui's own submit handler, not called directly by third-party code. --- config/drupal-11/drupal-11.4-deprecations.php | 5 +++++ .../FunctionToServiceRector/config/configured_rule.php | 2 ++ .../field_ui_form_manage_field_form_submit.php.inc | 9 +++++++++ 3 files changed, 16 insertions(+) create mode 100644 tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/field_ui_form_manage_field_form_submit.php.inc diff --git a/config/drupal-11/drupal-11.4-deprecations.php b/config/drupal-11/drupal-11.4-deprecations.php index 2acdc7e47..9afcf9778 100644 --- a/config/drupal-11/drupal-11.4-deprecations.php +++ b/config/drupal-11/drupal-11.4-deprecations.php @@ -208,6 +208,11 @@ new FunctionToServiceConfiguration('11.4.0', 'menu_ui_form_node_type_form_builder', 'Drupal\menu_ui\Hook\MenuUiHooks', 'formNodeTypeFormBuilder'), new FunctionToServiceConfiguration('11.4.0', 'text_summary', 'Drupal\text\TextSummary', 'generate'), new FunctionToServiceConfiguration('11.4.0', 'user_form_process_password_confirm', 'Drupal\user\Hook\UserThemeHooks', 'processPasswordConfirm'), + // https://www.drupal.org/node/3567163 + // https://www.drupal.org/node/3566774 (change record) + // field_ui_form_manage_field_form_submit() deprecated in drupal:11.4.0, removed in drupal:12.0.0. + // Replaced by \Drupal\field_ui\Hook\FieldUiHooks::manageFieldFormSubmit(). + new FunctionToServiceConfiguration('11.4.0', 'field_ui_form_manage_field_form_submit', 'Drupal\field_ui\Hook\FieldUiHooks', 'manageFieldFormSubmit', true), ]); // https://www.drupal.org/node/3035340 diff --git a/tests/src/Rector/Deprecation/FunctionToServiceRector/config/configured_rule.php b/tests/src/Rector/Deprecation/FunctionToServiceRector/config/configured_rule.php index a7bf46aa6..5daa9f4bf 100644 --- a/tests/src/Rector/Deprecation/FunctionToServiceRector/config/configured_rule.php +++ b/tests/src/Rector/Deprecation/FunctionToServiceRector/config/configured_rule.php @@ -73,5 +73,7 @@ new FunctionToServiceConfiguration('11.4.0', 'node_access_grants', 'Drupal\node\NodeGrantsHelper', 'nodeAccessGrants', true), // https://www.drupal.org/node/2571679 (Drupal 11.4) new FunctionToServiceConfiguration('11.4.0', 'views_add_contextual_links', 'Drupal\views\ContextualLinksHelper', 'addLinks', true), + // https://www.drupal.org/node/3567163 (Drupal 11.4) + new FunctionToServiceConfiguration('11.4.0', 'field_ui_form_manage_field_form_submit', 'Drupal\field_ui\Hook\FieldUiHooks', 'manageFieldFormSubmit', true), ]); }; diff --git a/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/field_ui_form_manage_field_form_submit.php.inc b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/field_ui_form_manage_field_form_submit.php.inc new file mode 100644 index 000000000..7beb65fb3 --- /dev/null +++ b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/field_ui_form_manage_field_form_submit.php.inc @@ -0,0 +1,9 @@ + +----- + \Drupal::service(\Drupal\field_ui\Hook\FieldUiHooks::class)->manageFieldFormSubmit($form, $form_state), fn() => field_ui_form_manage_field_form_submit($form, $form_state)); +?> From b0681ef1406efb2724ef5c2403768151a9e6f032 Mon Sep 17 00:00:00 2001 From: bjorn Date: Mon, 11 May 2026 20:13:40 +0200 Subject: [PATCH 197/256] feat(Drupal11): Add FunctionToStaticRector config for entity_test bundle functions #3495966 entity_test_create_bundle() and entity_test_delete_bundle() deprecated in drupal:11.2.0 and removed in drupal:12.0.0. Replaced by static methods on \Drupal\entity_test\EntityTestHelper. The entity_test module is widely used as a test dependency across contrib, so this rule covers a broad set of test code migrations. Tested: scheduler_field (1 file changed), search_api (already migrated) --- .../memory/feedback_commits.md | 19 +++++++++++++++++ config/drupal-11/drupal-11.2-deprecations.php | 6 ++++++ .../config/configured_rule.php | 3 +++ .../entity_test_bundle_functions.php.inc | 21 +++++++++++++++++++ 4 files changed, 49 insertions(+) create mode 100644 .claude/projects/-Users-bjorn-projects-drupal-rector/memory/feedback_commits.md create mode 100644 tests/src/Rector/Deprecation/FunctionToStaticRector/fixture/entity_test_bundle_functions.php.inc diff --git a/.claude/projects/-Users-bjorn-projects-drupal-rector/memory/feedback_commits.md b/.claude/projects/-Users-bjorn-projects-drupal-rector/memory/feedback_commits.md new file mode 100644 index 000000000..d886c211b --- /dev/null +++ b/.claude/projects/-Users-bjorn-projects-drupal-rector/memory/feedback_commits.md @@ -0,0 +1,19 @@ +--- +name: Commit style +description: Rules about what to include (or not) in git commits and pushes in this project +type: feedback +--- + +Never add "Co-Authored-By" or any AI attribution to commits. + +**Why:** User preference — keep commit history clean. + +**How to apply:** Omit any Co-Authored-By trailer from all commit messages. + +--- + +Never push or commit without explicit user instruction. + +**Why:** User wants to control when code is committed and pushed. Do not commit after implementing a feature or running tests unless the user explicitly says to commit. + +**How to apply:** Complete the implementation and tests, then stop. Do not run `git commit` or `git push` unless the user says so. diff --git a/config/drupal-11/drupal-11.2-deprecations.php b/config/drupal-11/drupal-11.2-deprecations.php index 8e4453bb2..e178be58b 100644 --- a/config/drupal-11/drupal-11.2-deprecations.php +++ b/config/drupal-11/drupal-11.2-deprecations.php @@ -91,8 +91,14 @@ // https://www.drupal.org/node/3410938 // drupal_requirements_severity() deprecated in drupal:11.2.0, removed in drupal:12.0.0. // Replaced by RequirementSeverity::maxSeverityFromRequirements(). + // https://www.drupal.org/node/3495966 + // https://www.drupal.org/node/3497049 (change record) + // entity_test_create_bundle() and entity_test_delete_bundle() deprecated in drupal:11.2.0, removed in drupal:12.0.0. + // Replaced by EntityTestHelper::createBundle() and EntityTestHelper::deleteBundle(). $rectorConfig->ruleWithConfiguration(FunctionToStaticRector::class, [ new FunctionToStaticConfiguration('11.2.0', 'drupal_requirements_severity', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'maxSeverityFromRequirements'), + new FunctionToStaticConfiguration('11.2.0', 'entity_test_create_bundle', 'Drupal\entity_test\EntityTestHelper', 'createBundle'), + new FunctionToStaticConfiguration('11.2.0', 'entity_test_delete_bundle', 'Drupal\entity_test\EntityTestHelper', 'deleteBundle'), ]); // https://www.drupal.org/node/3489415 diff --git a/tests/src/Rector/Deprecation/FunctionToStaticRector/config/configured_rule.php b/tests/src/Rector/Deprecation/FunctionToStaticRector/config/configured_rule.php index 63223c942..7f87682e4 100644 --- a/tests/src/Rector/Deprecation/FunctionToStaticRector/config/configured_rule.php +++ b/tests/src/Rector/Deprecation/FunctionToStaticRector/config/configured_rule.php @@ -23,5 +23,8 @@ new FunctionToStaticConfiguration('11.4.0', 'views_ui_nojs_submit', 'Drupal\views\ViewsFormAjaxHelperTrait', 'noJsSubmit'), // https://www.drupal.org/node/3534089 (Drupal 11.3) new FunctionToStaticConfiguration('11.3.0', 'file_managed_file_submit', 'Drupal\file\Element\ManagedFile', 'submit'), + // https://www.drupal.org/node/3495966 (Drupal 11.2) + new FunctionToStaticConfiguration('11.2.0', 'entity_test_create_bundle', 'Drupal\entity_test\EntityTestHelper', 'createBundle'), + new FunctionToStaticConfiguration('11.2.0', 'entity_test_delete_bundle', 'Drupal\entity_test\EntityTestHelper', 'deleteBundle'), ]); }; diff --git a/tests/src/Rector/Deprecation/FunctionToStaticRector/fixture/entity_test_bundle_functions.php.inc b/tests/src/Rector/Deprecation/FunctionToStaticRector/fixture/entity_test_bundle_functions.php.inc new file mode 100644 index 000000000..d7387d743 --- /dev/null +++ b/tests/src/Rector/Deprecation/FunctionToStaticRector/fixture/entity_test_bundle_functions.php.inc @@ -0,0 +1,21 @@ + +----- + \Drupal\entity_test\EntityTestHelper::createBundle($bundle, $text, $entity_type), fn() => entity_test_create_bundle($bundle, $text, $entity_type)); +} + +function example_delete() { + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => \Drupal\entity_test\EntityTestHelper::deleteBundle($bundle, $entity_type), fn() => entity_test_delete_bundle($bundle, $entity_type)); +} +?> From 93ca7cdb419943b413074115196edc34f1673091 Mon Sep 17 00:00:00 2001 From: bjorn Date: Mon, 11 May 2026 20:26:45 +0200 Subject: [PATCH 198/256] fix(Drupal11): Correct issue reference for node_mass_update FunctionToServiceRector config #3533083 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update config comment and test config comment from #3571623 to the correct issue #3533083 (node_mass_update → NodeBulkUpdate service). --- config/drupal-11/drupal-11.3-deprecations.php | 3 +-- .../FunctionToServiceRector/config/configured_rule.php | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/config/drupal-11/drupal-11.3-deprecations.php b/config/drupal-11/drupal-11.3-deprecations.php index aec5524ed..a4486e6e4 100644 --- a/config/drupal-11/drupal-11.3-deprecations.php +++ b/config/drupal-11/drupal-11.3-deprecations.php @@ -51,10 +51,9 @@ // Replaced by equivalent entity queries. $rectorConfig->rule(NodeStorageDeprecatedMethodsRector::class); - // https://www.drupal.org/node/3571623 + // https://www.drupal.org/node/3533083 // node_mass_update() deprecated in drupal:11.3.0, removed in drupal:13.0.0. // Replaced by \Drupal\node\NodeBulkUpdate::process(). - // node_type_get_names() and node_get_type_label() deprecated in drupal:11.3.0, removed in drupal:13.0.0. // https://www.drupal.org/node/1685492 // twig_render_template() deprecated in drupal:11.3.0, removed in drupal:12.0.0. // Replaced by \Drupal::service(TwigThemeEngine::class)->renderTemplate(). diff --git a/tests/src/Rector/Deprecation/FunctionToServiceRector/config/configured_rule.php b/tests/src/Rector/Deprecation/FunctionToServiceRector/config/configured_rule.php index 5daa9f4bf..693683b2d 100644 --- a/tests/src/Rector/Deprecation/FunctionToServiceRector/config/configured_rule.php +++ b/tests/src/Rector/Deprecation/FunctionToServiceRector/config/configured_rule.php @@ -23,7 +23,7 @@ new FunctionToServiceConfiguration('11.2.0', 'template_preprocess_container', 'Drupal\Core\Theme\ThemePreprocess', 'preprocessContainer'), new FunctionToServiceConfiguration('11.2.0', 'template_preprocess_html', 'Drupal\Core\Theme\ThemePreprocess', 'preprocessHtml'), new FunctionToServiceConfiguration('11.2.0', 'template_preprocess_page', 'Drupal\Core\Theme\ThemePreprocess', 'preprocessPage'), - // https://www.drupal.org/node/3571623 (Drupal 11.3) + // https://www.drupal.org/node/3533083 (Drupal 11.3) new FunctionToServiceConfiguration('11.3.0', 'node_mass_update', 'Drupal\node\NodeBulkUpdate', 'process', true), // https://www.drupal.org/node/3571382 (Drupal 11.3) new FunctionToServiceConfiguration('11.3.0', 'template_preprocess_layout', 'Drupal\layout_discovery\Hook\LayoutDiscoveryThemeHooks', 'preprocessLayout', true), From dbb71d64f17befaaeff3c63e59bde102bd48ceaa Mon Sep 17 00:00:00 2001 From: bjorn Date: Mon, 11 May 2026 20:30:24 +0200 Subject: [PATCH 199/256] refactor(Drupal11): Remove node_mass_update from ReplaceNodeModuleProceduralFunctionsRector MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit node_mass_update is already covered by FunctionToServiceRector config (#3533083). Having both handle the same function was redundant — whichever ran first won and the other was a no-op. Remove the case from the custom multi-function rector and its two associated test fixtures. --- ...aceNodeModuleProceduralFunctionsRector.php | 25 ------------------- ...no_change_mass_update_too_few_args.php.inc | 11 -------- .../fixture/node_mass_update.php.inc | 13 ---------- 3 files changed, 49 deletions(-) delete mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/fixture/no_change_mass_update_too_few_args.php.inc delete mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/fixture/node_mass_update.php.inc diff --git a/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector.php b/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector.php index 1aa199fd3..d4c5865e2 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector.php @@ -9,7 +9,6 @@ use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use PhpParser\Node; use PhpParser\Node\Arg; -use PhpParser\Node\Expr\ClassConstFetch; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\StaticCall; @@ -59,11 +58,6 @@ public function getRuleDefinition(): RuleDefinition '$node->getBundleEntity()->label();', [new DrupalIntroducedVersionConfiguration('11.3.0')] ), - new ConfiguredCodeSample( - 'node_mass_update($nids, $updates, NULL, TRUE);', - '\\Drupal::service(\\Drupal\\node\\NodeBulkUpdate::class)->process($nids, $updates, NULL, TRUE);', - [new DrupalIntroducedVersionConfiguration('11.3.0')] - ), ] ); } @@ -85,7 +79,6 @@ protected function refactorWithConfiguration(Node $node, VersionedConfigurationI return match ($node->name->toString()) { 'node_type_get_names' => $this->refactorNodeTypeGetNames(), 'node_get_type_label' => $this->refactorNodeGetTypeLabel($node), - 'node_mass_update' => $this->refactorNodeMassUpdate($node), default => null, }; } @@ -113,22 +106,4 @@ private function refactorNodeGetTypeLabel(FuncCall $node): ?Node 'label' ); } - - private function refactorNodeMassUpdate(FuncCall $node): ?Node - { - if (count($node->args) < 2) { - return null; - } - - $serviceCall = new StaticCall( - new FullyQualified('Drupal'), - 'service', - [new Arg(new ClassConstFetch( - new FullyQualified('Drupal\node\NodeBulkUpdate'), - 'class' - ))] - ); - - return new MethodCall($serviceCall, 'process', $node->args); - } } diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/fixture/no_change_mass_update_too_few_args.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/fixture/no_change_mass_update_too_few_args.php.inc deleted file mode 100644 index 43d06632e..000000000 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/fixture/no_change_mass_update_too_few_args.php.inc +++ /dev/null @@ -1,11 +0,0 @@ - ------ - diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/fixture/node_mass_update.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/fixture/node_mass_update.php.inc deleted file mode 100644 index c4c11b4dc..000000000 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/fixture/node_mass_update.php.inc +++ /dev/null @@ -1,13 +0,0 @@ - ------ - \Drupal::service(\Drupal\node\NodeBulkUpdate::class)->process($nids, $updates), fn() => node_mass_update($nids, $updates)); -\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => \Drupal::service(\Drupal\node\NodeBulkUpdate::class)->process($nids, $updates, 'en', TRUE, FALSE), fn() => node_mass_update($nids, $updates, 'en', TRUE, FALSE)); - -?> From 73c5bacb82c4fce1cc20b1cf8eb9c380a6bf3427 Mon Sep 17 00:00:00 2001 From: bjorn Date: Mon, 11 May 2026 20:33:44 +0200 Subject: [PATCH 200/256] feat(Drupal11): Add FunctionToFirstArgMethodRector config for node_type_get_description #3531944 node_type_get_description($node_type) deprecated in drupal:11.3.0, removed in drupal:12.0.0. Replaced by $node_type->getDescription(). --- config/drupal-11/drupal-11.3-deprecations.php | 4 ++++ .../config/configured_rule.php | 1 + .../node_type_get_description_basic.php.inc | 11 +++++++++++ .../fixture/node_type_get_description_basic.php.inc | 11 +++++++++++ ...type_get_description_no_change_zero_args.php.inc | 13 +++++++++++++ 5 files changed, 40 insertions(+) create mode 100644 tests/src/Rector/Deprecation/FunctionToFirstArgMethodRector/fixture-below-version/node_type_get_description_basic.php.inc create mode 100644 tests/src/Rector/Deprecation/FunctionToFirstArgMethodRector/fixture/node_type_get_description_basic.php.inc create mode 100644 tests/src/Rector/Deprecation/FunctionToFirstArgMethodRector/fixture/node_type_get_description_no_change_zero_args.php.inc diff --git a/config/drupal-11/drupal-11.3-deprecations.php b/config/drupal-11/drupal-11.3-deprecations.php index a4486e6e4..4e28bbe42 100644 --- a/config/drupal-11/drupal-11.3-deprecations.php +++ b/config/drupal-11/drupal-11.3-deprecations.php @@ -90,8 +90,12 @@ // https://www.drupal.org/node/2010202 // comment_uri($comment) deprecated in drupal:11.3.0, removed in drupal:12.0.0. // Replaced by $comment->permalink(). + // https://www.drupal.org/node/3531944 + // node_type_get_description($node_type) deprecated in drupal:11.3.0, removed in drupal:12.0.0. + // Replaced by $node_type->getDescription(). $rectorConfig->ruleWithConfiguration(FunctionToFirstArgMethodRector::class, [ new FunctionToFirstArgMethodConfiguration('11.3.0', 'comment_uri', 'permalink'), + new FunctionToFirstArgMethodConfiguration('11.3.0', 'node_type_get_description', 'getDescription'), ]); // https://www.drupal.org/node/3038908 diff --git a/tests/src/Rector/Deprecation/FunctionToFirstArgMethodRector/config/configured_rule.php b/tests/src/Rector/Deprecation/FunctionToFirstArgMethodRector/config/configured_rule.php index a4119a37b..fc231e8d0 100644 --- a/tests/src/Rector/Deprecation/FunctionToFirstArgMethodRector/config/configured_rule.php +++ b/tests/src/Rector/Deprecation/FunctionToFirstArgMethodRector/config/configured_rule.php @@ -10,6 +10,7 @@ return static function (RectorConfig $rectorConfig): void { DeprecationBase::addClass(FunctionToFirstArgMethodRector::class, $rectorConfig, false, [ new FunctionToFirstArgMethodConfiguration('11.3.0', 'comment_uri', 'permalink'), + new FunctionToFirstArgMethodConfiguration('11.3.0', 'node_type_get_description', 'getDescription'), new FunctionToFirstArgMethodConfiguration('11.2.0', 'file_get_content_headers', 'getDownloadHeaders'), ]); }; diff --git a/tests/src/Rector/Deprecation/FunctionToFirstArgMethodRector/fixture-below-version/node_type_get_description_basic.php.inc b/tests/src/Rector/Deprecation/FunctionToFirstArgMethodRector/fixture-below-version/node_type_get_description_basic.php.inc new file mode 100644 index 000000000..121ddf342 --- /dev/null +++ b/tests/src/Rector/Deprecation/FunctionToFirstArgMethodRector/fixture-below-version/node_type_get_description_basic.php.inc @@ -0,0 +1,11 @@ + +----- + diff --git a/tests/src/Rector/Deprecation/FunctionToFirstArgMethodRector/fixture/node_type_get_description_basic.php.inc b/tests/src/Rector/Deprecation/FunctionToFirstArgMethodRector/fixture/node_type_get_description_basic.php.inc new file mode 100644 index 000000000..5c56b9645 --- /dev/null +++ b/tests/src/Rector/Deprecation/FunctionToFirstArgMethodRector/fixture/node_type_get_description_basic.php.inc @@ -0,0 +1,11 @@ + +----- + $node_type->getDescription(), fn() => node_type_get_description($node_type)); + +?> diff --git a/tests/src/Rector/Deprecation/FunctionToFirstArgMethodRector/fixture/node_type_get_description_no_change_zero_args.php.inc b/tests/src/Rector/Deprecation/FunctionToFirstArgMethodRector/fixture/node_type_get_description_no_change_zero_args.php.inc new file mode 100644 index 000000000..586625d3a --- /dev/null +++ b/tests/src/Rector/Deprecation/FunctionToFirstArgMethodRector/fixture/node_type_get_description_no_change_zero_args.php.inc @@ -0,0 +1,13 @@ + +----- + From c3d2512b4c13a2a03d7940a91aa3336f1a5152dd Mon Sep 17 00:00:00 2001 From: bjorn Date: Mon, 11 May 2026 21:19:30 +0200 Subject: [PATCH 201/256] chore: remove memory --- .../memory/feedback_commits.md | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 .claude/projects/-Users-bjorn-projects-drupal-rector/memory/feedback_commits.md diff --git a/.claude/projects/-Users-bjorn-projects-drupal-rector/memory/feedback_commits.md b/.claude/projects/-Users-bjorn-projects-drupal-rector/memory/feedback_commits.md deleted file mode 100644 index d886c211b..000000000 --- a/.claude/projects/-Users-bjorn-projects-drupal-rector/memory/feedback_commits.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -name: Commit style -description: Rules about what to include (or not) in git commits and pushes in this project -type: feedback ---- - -Never add "Co-Authored-By" or any AI attribution to commits. - -**Why:** User preference — keep commit history clean. - -**How to apply:** Omit any Co-Authored-By trailer from all commit messages. - ---- - -Never push or commit without explicit user instruction. - -**Why:** User wants to control when code is committed and pushed. Do not commit after implementing a feature or running tests unless the user explicitly says to commit. - -**How to apply:** Complete the implementation and tests, then stop. Do not run `git commit` or `git push` unless the user says so. From b68ced2a6aaad2afac64067ce903ae16ac0adca9 Mon Sep 17 00:00:00 2001 From: bjorn Date: Tue, 12 May 2026 10:02:50 +0200 Subject: [PATCH 202/256] feat(Drupal11): Add GetNameToNameRector for PHPUnit compatibility --- config/drupal-11/drupal-11.0-deprecations.php | 6 ++ .../Deprecation/GetNameToNameRector.php | 76 +++++++++++++++++++ .../GetNameToNameRectorTest.php | 26 +++++++ .../config/configured_rule.php | 11 +++ .../GetNameToNameRector/fixture/basic.php.inc | 31 ++++++++ .../fixture/no_change_unrelated.php.inc | 31 ++++++++ 6 files changed, 181 insertions(+) create mode 100644 src/Drupal11/Rector/Deprecation/GetNameToNameRector.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/GetNameToNameRector/GetNameToNameRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/GetNameToNameRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/GetNameToNameRector/fixture/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/GetNameToNameRector/fixture/no_change_unrelated.php.inc diff --git a/config/drupal-11/drupal-11.0-deprecations.php b/config/drupal-11/drupal-11.0-deprecations.php index 8e16d8ccc..1bfda948d 100644 --- a/config/drupal-11/drupal-11.0-deprecations.php +++ b/config/drupal-11/drupal-11.0-deprecations.php @@ -3,6 +3,7 @@ declare(strict_types=1); use DrupalRector\Drupal10\Rector\Deprecation\ReplaceRequestTimeConstantRector; +use DrupalRector\Drupal11\Rector\Deprecation\GetNameToNameRector; use DrupalRector\Drupal11\Rector\Deprecation\MigrateSqlGetMigrationPluginManagerRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveStateCacheSettingRector; use DrupalRector\Drupal11\Rector\Deprecation\StripMigrationDependenciesExpandArgRector; @@ -10,6 +11,11 @@ use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { + // https://www.drupal.org/node/3217904 + // TestCase::getName() deprecated in drupal:10.1.0, removed in drupal:11.0.0. + // Replaced by name(). + $rectorConfig->rule(GetNameToNameRector::class); + // https://www.drupal.org/node/3436954 // https://www.drupal.org/node/2575105 (change record) // $settings['state_cache'] deprecated in drupal:11.0.0. diff --git a/src/Drupal11/Rector/Deprecation/GetNameToNameRector.php b/src/Drupal11/Rector/Deprecation/GetNameToNameRector.php new file mode 100644 index 000000000..ac8d43509 --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/GetNameToNameRector.php @@ -0,0 +1,76 @@ +getName()', + '$this->name()' + ), + ] + ); + } + + /** @return array> */ + public function getNodeTypes(): array + { + return [MethodCall::class]; + } + + /** @param MethodCall $node */ + public function refactor(Node $node): ?Node + { + if (!$this->isName($node->name, 'getName')) { + return null; + } + + if (!$this->isObjectType($node->var, new ObjectType('PHPUnit\\Framework\\TestCase'))) { + return null; + } + + $args = $node->args; + if (count($args) === 0) { + // No args — replace directly. + } elseif (count($args) === 1) { + $arg = $args[0]; + if (!$arg instanceof Node\Arg) { + return null; + } + if (!$arg->value instanceof Node\Expr\ConstFetch) { + return null; + } + $constName = $this->getName($arg->value->name); + if (strtolower((string) $constName) !== 'false') { + return null; + } + } else { + return null; + } + + $node->name = new Identifier('name'); + $node->args = []; + + return $node; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/GetNameToNameRector/GetNameToNameRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/GetNameToNameRector/GetNameToNameRectorTest.php new file mode 100644 index 000000000..276824201 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/GetNameToNameRector/GetNameToNameRectorTest.php @@ -0,0 +1,26 @@ +doTestFile($filePath); + } + + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/GetNameToNameRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/GetNameToNameRector/config/configured_rule.php new file mode 100644 index 000000000..579f5262a --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/GetNameToNameRector/config/configured_rule.php @@ -0,0 +1,11 @@ +getName(); + } + + public function testGetNameWithFalse(): void + { + $name = $this->getName(false); + } +} +?> +----- +name(); + } + + public function testGetNameWithFalse(): void + { + $name = $this->name(); + } +} +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/GetNameToNameRector/fixture/no_change_unrelated.php.inc b/tests/src/Drupal11/Rector/Deprecation/GetNameToNameRector/fixture/no_change_unrelated.php.inc new file mode 100644 index 000000000..8e9525127 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/GetNameToNameRector/fixture/no_change_unrelated.php.inc @@ -0,0 +1,31 @@ +getName(); + } +} +?> +----- +getName(); + } +} +?> From 6d62e04e6b0defd594325adacfdbc42f28464435 Mon Sep 17 00:00:00 2001 From: bjorn Date: Tue, 12 May 2026 13:26:29 +0200 Subject: [PATCH 203/256] feat: In order to allow BC we need to make sure we can actually set the required version. This way we can run on d11 but still to proper support for earlier. This is needed for tproject update bot. By default we are disabling the BC rectors, so for normal operations it doesnt really matter. --- src/Rector/AbstractDrupalCoreRector.php | 2 +- .../fixture/system_time_zones.php.inc | 8 ++--- .../system_time_zones_dynamic_grouped.php.inc | 2 +- .../fixture/watchdog_exception.php.inc | 6 ++-- .../AbstractDrupalCoreRectorBcTest.php | 30 +++++++++++++++++++ .../config/configured_rule_bc.php | 16 ++++++++++ .../fixture-bc/class_const_fetch.php.inc | 13 ++++++++ .../fixture/class_const_fetch.php.inc | 2 +- .../fixture/drupal_theme_rebuild.php.inc | 2 +- .../fixture/function_to_static_call.php.inc | 2 +- 10 files changed, 71 insertions(+), 12 deletions(-) create mode 100644 tests/src/Rector/AbstractDrupalCoreRector/AbstractDrupalCoreRectorBcTest.php create mode 100644 tests/src/Rector/AbstractDrupalCoreRector/config/configured_rule_bc.php create mode 100644 tests/src/Rector/AbstractDrupalCoreRector/fixture-bc/class_const_fetch.php.inc diff --git a/src/Rector/AbstractDrupalCoreRector.php b/src/Rector/AbstractDrupalCoreRector.php index 2ac8b1061..1c39958e6 100644 --- a/src/Rector/AbstractDrupalCoreRector.php +++ b/src/Rector/AbstractDrupalCoreRector.php @@ -159,6 +159,6 @@ public function supportBackwardsCompatibility(VersionedConfigurationInterface $c $minimumVersion = $this->drupalRectorSettings->getMinimumCoreVersionSupported(); - return !(version_compare($minimumVersion, '10.1.0', '<') || version_compare($configuration->getIntroducedVersion(), '10.0.0', '<')); + return !(version_compare($minimumVersion, '10.1.0', '<') || version_compare($configuration->getIntroducedVersion(), '10.0.0', '<') || version_compare($minimumVersion, $configuration->getIntroducedVersion(), '>=')); } } diff --git a/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/fixture/system_time_zones.php.inc b/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/fixture/system_time_zones.php.inc index ca8669f41..60a1fdd9f 100644 --- a/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/fixture/system_time_zones.php.inc +++ b/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/fixture/system_time_zones.php.inc @@ -15,12 +15,12 @@ function simple_example() { \Drupal\Core\Datetime\TimeZoneFormHelper::getOptionsList(), fn() => system_time_zones()); + \Drupal\Core\Datetime\TimeZoneFormHelper::getOptionsList(); - \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '10.1.0', fn() => \Drupal\Core\Datetime\TimeZoneFormHelper::getOptionsListByRegion(), fn() => system_time_zones(FALSE, TRUE)); + \Drupal\Core\Datetime\TimeZoneFormHelper::getOptionsListByRegion(); - \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '10.1.0', fn() => \Drupal\Core\Datetime\TimeZoneFormHelper::getOptionsList(NULL), fn() => system_time_zones(NULL, FALSE)); + \Drupal\Core\Datetime\TimeZoneFormHelper::getOptionsList(NULL); - \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '10.1.0', fn() => \Drupal\Core\Datetime\TimeZoneFormHelper::getOptionsList(TRUE), fn() => system_time_zones(TRUE, FALSE)); + \Drupal\Core\Datetime\TimeZoneFormHelper::getOptionsList(TRUE); } ?> diff --git a/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/fixture/system_time_zones_dynamic_grouped.php.inc b/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/fixture/system_time_zones_dynamic_grouped.php.inc index 8968304eb..35e4ebb5a 100644 --- a/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/fixture/system_time_zones_dynamic_grouped.php.inc +++ b/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/fixture/system_time_zones_dynamic_grouped.php.inc @@ -13,7 +13,7 @@ function dynamic_grouped_example() { // Second arg is a variable — must not silently drop it. function dynamic_grouped_example() { $grouped = TRUE; - \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '10.1.0', fn() => $grouped ? \Drupal\Core\Datetime\TimeZoneFormHelper::getOptionsListByRegion(FALSE) : \Drupal\Core\Datetime\TimeZoneFormHelper::getOptionsList(FALSE), fn() => system_time_zones(FALSE, $grouped)); + $grouped ? \Drupal\Core\Datetime\TimeZoneFormHelper::getOptionsListByRegion(FALSE) : \Drupal\Core\Datetime\TimeZoneFormHelper::getOptionsList(FALSE); } ?> diff --git a/tests/src/Drupal10/Rector/Deprecation/WatchdogExceptionRector/fixture/watchdog_exception.php.inc b/tests/src/Drupal10/Rector/Deprecation/WatchdogExceptionRector/fixture/watchdog_exception.php.inc index b3219444c..2231af2ad 100644 --- a/tests/src/Drupal10/Rector/Deprecation/WatchdogExceptionRector/fixture/watchdog_exception.php.inc +++ b/tests/src/Drupal10/Rector/Deprecation/WatchdogExceptionRector/fixture/watchdog_exception.php.inc @@ -19,16 +19,16 @@ function advanced() { \Drupal\Core\Utility\Error::logException(\Drupal::logger('update'), $exception), fn() => watchdog_exception('update', $exception)); + \Drupal\Core\Utility\Error::logException(\Drupal::logger('update'), $exception); } /** * A simple example. */ function advanced() { - \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '10.1.0', fn() => \Drupal\Core\Utility\Error::logException(\Drupal::logger('update'), $exception, 'My custom message @foo', ['@foo' => 'bar', 'link' => 'http://example.com'], RfcLogLevel::CRITICAL), fn() => watchdog_exception('update', $exception, 'My custom message @foo', ['@foo' => 'bar', 'link' => 'http://example.com'], RfcLogLevel::CRITICAL, 'http://example.com')); + \Drupal\Core\Utility\Error::logException(\Drupal::logger('update'), $exception, 'My custom message @foo', ['@foo' => 'bar', 'link' => 'http://example.com'], RfcLogLevel::CRITICAL); - \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '10.1.0', fn() => \Drupal\Core\Utility\Error::logException(\Drupal::logger('update'), $exception, 'My custom message @foo', ['@foo' => 'bar']), fn() => watchdog_exception('update', $exception, 'My custom message @foo', ['@foo' => 'bar'])); + \Drupal\Core\Utility\Error::logException(\Drupal::logger('update'), $exception, 'My custom message @foo', ['@foo' => 'bar']); \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '10.1.0', fn() => \Drupal\Core\Utility\Error::logException(\Drupal::logger('update'), $exception), fn() => watchdog_exception('update', $exception)); } diff --git a/tests/src/Rector/AbstractDrupalCoreRector/AbstractDrupalCoreRectorBcTest.php b/tests/src/Rector/AbstractDrupalCoreRector/AbstractDrupalCoreRectorBcTest.php new file mode 100644 index 000000000..bae14fa6e --- /dev/null +++ b/tests/src/Rector/AbstractDrupalCoreRector/AbstractDrupalCoreRectorBcTest.php @@ -0,0 +1,30 @@ +doTestFile($filePath); + } + + /** + * @return Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-bc'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule_bc.php'; + } +} diff --git a/tests/src/Rector/AbstractDrupalCoreRector/config/configured_rule_bc.php b/tests/src/Rector/AbstractDrupalCoreRector/config/configured_rule_bc.php new file mode 100644 index 000000000..0950d6657 --- /dev/null +++ b/tests/src/Rector/AbstractDrupalCoreRector/config/configured_rule_bc.php @@ -0,0 +1,16 @@ +singleton(DrupalRectorSettings::class, fn () => (new DrupalRectorSettings())->setMinimumCoreVersionSupported('10.1.0')); + + $rectorConfig->ruleWithConfiguration(ClassConstFetchBCRector::class, [ + new DrupalIntroducedVersionConfiguration('11.0.0'), + ]); +}; diff --git a/tests/src/Rector/AbstractDrupalCoreRector/fixture-bc/class_const_fetch.php.inc b/tests/src/Rector/AbstractDrupalCoreRector/fixture-bc/class_const_fetch.php.inc new file mode 100644 index 000000000..509e38baf --- /dev/null +++ b/tests/src/Rector/AbstractDrupalCoreRector/fixture-bc/class_const_fetch.php.inc @@ -0,0 +1,13 @@ + +----- + \NewClass::NEW_CONST, fn() => OldClass::OLD_CONST); +} +?> diff --git a/tests/src/Rector/AbstractDrupalCoreRector/fixture/class_const_fetch.php.inc b/tests/src/Rector/AbstractDrupalCoreRector/fixture/class_const_fetch.php.inc index 727e342a9..a5e55aeb3 100644 --- a/tests/src/Rector/AbstractDrupalCoreRector/fixture/class_const_fetch.php.inc +++ b/tests/src/Rector/AbstractDrupalCoreRector/fixture/class_const_fetch.php.inc @@ -8,6 +8,6 @@ function simple_example() { \NewClass::NEW_CONST, fn() => OldClass::OLD_CONST); + $value = \NewClass::NEW_CONST; } ?> diff --git a/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/drupal_theme_rebuild.php.inc b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/drupal_theme_rebuild.php.inc index b3eb1fc3d..30df79a25 100644 --- a/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/drupal_theme_rebuild.php.inc +++ b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/drupal_theme_rebuild.php.inc @@ -16,6 +16,6 @@ function append_file_info_install() { */ function append_file_info_install() { require_once DRUPAL_ROOT . '/includes/theme.inc'; - \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '10.1.0', fn() => \Drupal::service('theme.registry')->reset(), fn() => drupal_theme_rebuild()); + \Drupal::service('theme.registry')->reset(); } diff --git a/tests/src/Rector/Deprecation/FunctionToStaticRector/fixture/function_to_static_call.php.inc b/tests/src/Rector/Deprecation/FunctionToStaticRector/fixture/function_to_static_call.php.inc index 3191188a6..fbe2baa78 100644 --- a/tests/src/Rector/Deprecation/FunctionToStaticRector/fixture/function_to_static_call.php.inc +++ b/tests/src/Rector/Deprecation/FunctionToStaticRector/fixture/function_to_static_call.php.inc @@ -33,7 +33,7 @@ function simple_example_file_icon_class() { function simple_example() { $settings = []; $filename = 'simple_filename.yaml'; - \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '10.1.0', fn() => \Drupal\Core\Site\SettingsEditor::rewrite($filename, $settings), fn() => drupal_rewrite_settings($settings, $filename)); + \Drupal\Core\Site\SettingsEditor::rewrite($filename, $settings); } /** From e43791a036d29816577f66eafb279c85a693aebb Mon Sep 17 00:00:00 2001 From: bjorn Date: Tue, 12 May 2026 13:26:39 +0200 Subject: [PATCH 204/256] feat: add 11 setlist to defaults --- rector.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rector.php b/rector.php index c8c2a6316..1d3b89b42 100644 --- a/rector.php +++ b/rector.php @@ -3,6 +3,7 @@ declare(strict_types=1); use DrupalRector\Services\DrupalRectorSettings; +use DrupalRector\Set\Drupal11SetList; use DrupalRector\Set\Drupal10SetList; use DrupalRector\Set\Drupal8SetList; use DrupalRector\Set\Drupal9SetList; @@ -19,6 +20,7 @@ Drupal8SetList::DRUPAL_8, Drupal9SetList::DRUPAL_9, Drupal10SetList::DRUPAL_10, + Drupal11SetList::DRUPAL_11, ]); // Configure DrupalRectorSettings to control rule behaviour. From 764aaea266da89e72cc9515939047e78f3f1ebee Mon Sep 17 00:00:00 2001 From: bjorn Date: Wed, 13 May 2026 12:39:44 +0200 Subject: [PATCH 205/256] feat: remove the unused class VersionedFunctionToServiceRector --- config/drupal-10/drupal-10.2-deprecations.php | 8 ++-- docs/rules_overview.md | 15 ------- .../VersionedFunctionToServiceRector.php | 41 ------------------- ...ersionedFunctionToServiceConfiguration.php | 11 ----- .../VersionedFunctionToServiceRectorTest.php | 32 --------------- .../config/configured_rule.php | 14 ------- 6 files changed, 4 insertions(+), 117 deletions(-) delete mode 100644 src/Drupal10/Rector/Deprecation/VersionedFunctionToServiceRector.php delete mode 100644 src/Drupal10/Rector/ValueObject/VersionedFunctionToServiceConfiguration.php delete mode 100644 tests/src/Drupal10/Rector/Deprecation/VersionedFunctionToServiceRector/VersionedFunctionToServiceRectorTest.php delete mode 100644 tests/src/Drupal10/Rector/Deprecation/VersionedFunctionToServiceRector/config/configured_rule.php diff --git a/config/drupal-10/drupal-10.2-deprecations.php b/config/drupal-10/drupal-10.2-deprecations.php index ec6539ac0..ee48b96ce 100644 --- a/config/drupal-10/drupal-10.2-deprecations.php +++ b/config/drupal-10/drupal-10.2-deprecations.php @@ -2,9 +2,9 @@ declare(strict_types=1); -use DrupalRector\Drupal10\Rector\Deprecation\VersionedFunctionToServiceRector; -use DrupalRector\Drupal10\Rector\ValueObject\VersionedFunctionToServiceConfiguration; +use DrupalRector\Rector\Deprecation\FunctionToServiceRector; use DrupalRector\Rector\Deprecation\FunctionToStaticRector; +use DrupalRector\Rector\ValueObject\FunctionToServiceConfiguration; use DrupalRector\Rector\Deprecation\MethodToMethodWithCheckRector; use DrupalRector\Rector\ValueObject\FunctionToStaticConfiguration; use DrupalRector\Rector\ValueObject\MethodToMethodWithCheckConfiguration; @@ -28,7 +28,7 @@ ]); // https://www.drupal.org/node/3358337 - $rectorConfig->ruleWithConfiguration(VersionedFunctionToServiceRector::class, [ - new VersionedFunctionToServiceConfiguration('10.2.0', '_drupal_flush_css_js', 'asset.query_string', 'reset'), + $rectorConfig->ruleWithConfiguration(FunctionToServiceRector::class, [ + new FunctionToServiceConfiguration('10.2.0', '_drupal_flush_css_js', 'asset.query_string', 'reset'), ]); }; diff --git a/docs/rules_overview.md b/docs/rules_overview.md index e57fbac02..26260dee3 100644 --- a/docs/rules_overview.md +++ b/docs/rules_overview.md @@ -72,21 +72,6 @@ Fixes deprecated `system_time_zones()` calls
-### VersionedFunctionToServiceRector - -Fixes deprecated function to service calls, used in Drupal 8 and 9 deprecations - -:wrench: **configure it!** - -- class: [`DrupalRector\Drupal10\Rector\Deprecation\VersionedFunctionToServiceRector`](../src/Drupal10/Rector/Deprecation/VersionedFunctionToServiceRector.php) - -```diff --_drupal_flush_css_js(); -+\Drupal::service('asset.query_string')->reset(); -``` - -
- ### WatchdogExceptionRector Fixes deprecated watchdog_exception('update', `$exception)` calls diff --git a/src/Drupal10/Rector/Deprecation/VersionedFunctionToServiceRector.php b/src/Drupal10/Rector/Deprecation/VersionedFunctionToServiceRector.php deleted file mode 100644 index 785ad152c..000000000 --- a/src/Drupal10/Rector/Deprecation/VersionedFunctionToServiceRector.php +++ /dev/null @@ -1,41 +0,0 @@ -reset(); -CODE_AFTER, - [ - new VersionedFunctionToServiceConfiguration('10.2.0', '_drupal_flush_css_js', 'asset.query_string', 'reset'), - ] - ), - ]); - } -} diff --git a/src/Drupal10/Rector/ValueObject/VersionedFunctionToServiceConfiguration.php b/src/Drupal10/Rector/ValueObject/VersionedFunctionToServiceConfiguration.php deleted file mode 100644 index 8a6db935f..000000000 --- a/src/Drupal10/Rector/ValueObject/VersionedFunctionToServiceConfiguration.php +++ /dev/null @@ -1,11 +0,0 @@ -doTestFile($filePath); - } - - /** - * @return Iterator<> - */ - public static function provideData(): \Iterator - { - return self::yieldFilesFromDirectory(__DIR__.'/fixture'); - } - - public function provideConfigFilePath(): string - { - // must be implemented - return __DIR__.'/config/configured_rule.php'; - } -} diff --git a/tests/src/Drupal10/Rector/Deprecation/VersionedFunctionToServiceRector/config/configured_rule.php b/tests/src/Drupal10/Rector/Deprecation/VersionedFunctionToServiceRector/config/configured_rule.php deleted file mode 100644 index 24b63efdb..000000000 --- a/tests/src/Drupal10/Rector/Deprecation/VersionedFunctionToServiceRector/config/configured_rule.php +++ /dev/null @@ -1,14 +0,0 @@ - Date: Fri, 15 May 2026 09:10:12 +0200 Subject: [PATCH 206/256] fix: call stack bugfix when nesting DeprecationHelper. --- .claude/settings.local.json | 12 ----------- src/Rector/AbstractDrupalCoreRector.php | 27 ++++++++++++------------- 2 files changed, 13 insertions(+), 26 deletions(-) delete mode 100644 .claude/settings.local.json diff --git a/.claude/settings.local.json b/.claude/settings.local.json deleted file mode 100644 index a16628c8c..000000000 --- a/.claude/settings.local.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "permissions": { - "allow": [ - "Skill(rector-qa)", - "Skill(rector-discover)", - "Skill(rector-implement)", - "WebFetch(domain:www.drupal.org)", - "Bash(ddev composer *)", - "Bash(rg *)" - ] - } -} diff --git a/src/Rector/AbstractDrupalCoreRector.php b/src/Rector/AbstractDrupalCoreRector.php index 1c39958e6..6e6c3ed6f 100644 --- a/src/Rector/AbstractDrupalCoreRector.php +++ b/src/Rector/AbstractDrupalCoreRector.php @@ -44,21 +44,20 @@ protected function isInBackwardsCompatibleCall(Node $node): bool $scope = $node->getAttribute(AttributeKey::SCOPE); - $callStack = $scope->getFunctionCallStackWithParameters(); - if (count($callStack) === 0) { - return false; - } - [$function, $parameter] = $callStack[0]; - if (!$function instanceof MethodReflection) { - return false; - } - if ($function->getName() !== 'backwardsCompatibleCall' - || $function->getDeclaringClass()->getName() !== DeprecationHelper::class - ) { - return false; + foreach ($scope->getFunctionCallStackWithParameters() as [$function, $parameter]) { + if (!$function instanceof MethodReflection) { + continue; + } + if ($function->getName() !== 'backwardsCompatibleCall' + || $function->getDeclaringClass()->getName() !== DeprecationHelper::class + ) { + continue; + } + if ($parameter !== null && $parameter->getName() === 'deprecatedCallable') { + return true; + } } - - return $parameter !== null && $parameter->getName() === 'deprecatedCallable'; + return false; } public function refactor(Node $node) From f0cefc1ff005e9e458442a20618498a9222fdad0 Mon Sep 17 00:00:00 2001 From: bjorn Date: Sat, 16 May 2026 08:27:45 +0200 Subject: [PATCH 207/256] feat: add renderPlain() to renderInIsolation() rector for drupal:10.3.0 deprecation --- config/drupal-10/drupal-10.3-deprecations.php | 9 +++++ stubs/Drupal/Core/Render/Renderer.php | 20 +++++++++++ .../Drupal/Core/Render/RendererInterface.php | 16 +++++++++ .../config/configured_rule.php | 1 + .../fixture/renderer_render_plain.php.inc | 33 +++++++++++++++++++ .../fixture/renderer_renderer_class.php.inc | 15 +++++++++ 6 files changed, 94 insertions(+) create mode 100644 stubs/Drupal/Core/Render/Renderer.php create mode 100644 stubs/Drupal/Core/Render/RendererInterface.php create mode 100644 tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture/renderer_render_plain.php.inc create mode 100644 tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture/renderer_renderer_class.php.inc diff --git a/config/drupal-10/drupal-10.3-deprecations.php b/config/drupal-10/drupal-10.3-deprecations.php index 6244bc191..3e8a4c195 100644 --- a/config/drupal-10/drupal-10.3-deprecations.php +++ b/config/drupal-10/drupal-10.3-deprecations.php @@ -6,12 +6,21 @@ use DrupalRector\Drupal10\Rector\Deprecation\ReplaceRebuildThemeDataRector; use DrupalRector\Rector\Deprecation\ClassConstantToClassConstantRector; use DrupalRector\Rector\Deprecation\FunctionToStaticRector; +use DrupalRector\Rector\Deprecation\MethodToMethodWithCheckRector; use DrupalRector\Rector\ValueObject\ClassConstantToClassConstantConfiguration; use DrupalRector\Rector\ValueObject\DrupalIntroducedVersionConfiguration; use DrupalRector\Rector\ValueObject\FunctionToStaticConfiguration; +use DrupalRector\Rector\ValueObject\MethodToMethodWithCheckConfiguration; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { + // https://www.drupal.org/node/3407994 + // RendererInterface::renderPlain() deprecated in drupal:10.3.0, removed in drupal:12.0.0. + // Replaced by RendererInterface::renderInIsolation(). + $rectorConfig->ruleWithConfiguration(MethodToMethodWithCheckRector::class, [ + new MethodToMethodWithCheckConfiguration('Drupal\Core\Render\RendererInterface', 'renderPlain', 'renderInIsolation'), + ]); + // https://www.drupal.org/node/3411269 file_icon_class, file_icon_map $rectorConfig->ruleWithConfiguration(FunctionToStaticRector::class, [ new FunctionToStaticConfiguration('10.3.0', 'file_icon_class', 'Drupal\file\IconMimeTypes', 'getIconClass'), diff --git a/stubs/Drupal/Core/Render/Renderer.php b/stubs/Drupal/Core/Render/Renderer.php new file mode 100644 index 000000000..bd2ec1f10 --- /dev/null +++ b/stubs/Drupal/Core/Render/Renderer.php @@ -0,0 +1,20 @@ + 'Hello']; + $renderer->renderPlain($elements); +} + +// \Drupal::service() with @var RendererInterface docblock. +function service_locator_example() { + /** @var \Drupal\Core\Render\RendererInterface $renderer */ + $renderer = \Drupal::service('renderer'); + $elements = ['#markup' => 'Hello']; + $renderer->renderPlain($elements); +} +?> +----- + 'Hello']; + $renderer->renderInIsolation($elements); +} + +// \Drupal::service() with @var RendererInterface docblock. +function service_locator_example() { + /** @var \Drupal\Core\Render\RendererInterface $renderer */ + $renderer = \Drupal::service('renderer'); + $elements = ['#markup' => 'Hello']; + $renderer->renderInIsolation($elements); +} +?> diff --git a/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture/renderer_renderer_class.php.inc b/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture/renderer_renderer_class.php.inc new file mode 100644 index 000000000..a6b48076f --- /dev/null +++ b/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture/renderer_renderer_class.php.inc @@ -0,0 +1,15 @@ + 'Hello']; + $renderer->renderPlain($elements); +} +?> +----- + 'Hello']; + $renderer->renderInIsolation($elements); +} +?> From 1e13524d69a93ec423b73e98bbfc8cdf01482994 Mon Sep 17 00:00:00 2001 From: bjorn Date: Sat, 16 May 2026 08:28:43 +0200 Subject: [PATCH 208/256] build: fix codestyle --- config/drupal-10/drupal-10.2-deprecations.php | 2 +- src/Rector/AbstractDrupalCoreRector.php | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/config/drupal-10/drupal-10.2-deprecations.php b/config/drupal-10/drupal-10.2-deprecations.php index ee48b96ce..7ae7aab2a 100644 --- a/config/drupal-10/drupal-10.2-deprecations.php +++ b/config/drupal-10/drupal-10.2-deprecations.php @@ -4,8 +4,8 @@ use DrupalRector\Rector\Deprecation\FunctionToServiceRector; use DrupalRector\Rector\Deprecation\FunctionToStaticRector; -use DrupalRector\Rector\ValueObject\FunctionToServiceConfiguration; use DrupalRector\Rector\Deprecation\MethodToMethodWithCheckRector; +use DrupalRector\Rector\ValueObject\FunctionToServiceConfiguration; use DrupalRector\Rector\ValueObject\FunctionToStaticConfiguration; use DrupalRector\Rector\ValueObject\MethodToMethodWithCheckConfiguration; use Rector\Config\RectorConfig; diff --git a/src/Rector/AbstractDrupalCoreRector.php b/src/Rector/AbstractDrupalCoreRector.php index 6e6c3ed6f..21e42be06 100644 --- a/src/Rector/AbstractDrupalCoreRector.php +++ b/src/Rector/AbstractDrupalCoreRector.php @@ -57,6 +57,7 @@ protected function isInBackwardsCompatibleCall(Node $node): bool return true; } } + return false; } From 3fc602cece95357b28f406a9963ad317a93aece8 Mon Sep 17 00:00:00 2001 From: bjorn Date: Sat, 16 May 2026 10:19:49 +0200 Subject: [PATCH 209/256] feat: add some extra patterns to MethodToMethodWithCheckRector --- .../MethodToMethodWithCheckRector.php | 14 ++++++++++++-- .../cache_invalidate_all_service.php.inc | 17 +++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture/cache_invalidate_all_service.php.inc diff --git a/src/Rector/Deprecation/MethodToMethodWithCheckRector.php b/src/Rector/Deprecation/MethodToMethodWithCheckRector.php index 5d8f237cc..d2b976a11 100644 --- a/src/Rector/Deprecation/MethodToMethodWithCheckRector.php +++ b/src/Rector/Deprecation/MethodToMethodWithCheckRector.php @@ -9,7 +9,6 @@ use PhpParser\Node; use PHPStan\Type\ObjectType; use Rector\Contract\Rector\ConfigurableRectorInterface; -use Rector\Exception\ShouldNotHappenException; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -134,8 +133,19 @@ public function refactorNode(Node\Expr\MethodCall $node, ?Node\Stmt\Expression $ } elseif ($node->var instanceof Node\Expr\MethodCall) { $node_var = $node->var->name; $node_var = "$node_var()"; + } elseif ($node->var instanceof Node\Expr\StaticCall) { + $class = $node->var->class instanceof Node\Name ? $node->var->class->toString() : '(expression)'; + $method = $node->var->name instanceof Node\Identifier ? $node->var->name->toString() : '(method)'; + $node_var = "$class::$method(...)"; + } elseif ($node->var instanceof Node\Expr\PropertyFetch) { + $obj = $node->var->var instanceof Node\Expr\Variable ? '$' . $node->var->var->name : '(expression)'; + $prop = $node->var->name instanceof Node\Identifier ? $node->var->name->toString() : '(property)'; + $node_var = "$obj->$prop"; + } elseif ($node->var instanceof Node\Expr\NullsafeMethodCall) { + $method = $node->var->name instanceof Node\Identifier ? $node->var->name->toString() : '(method)'; + $node_var = "$method?->()"; } else { - throw new ShouldNotHappenException('Unexpected node type: '.get_class($node->var)); + $node_var = '(expression)'; } $className = $configuration->getClassName(); diff --git a/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture/cache_invalidate_all_service.php.inc b/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture/cache_invalidate_all_service.php.inc new file mode 100644 index 000000000..d37d30842 --- /dev/null +++ b/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture/cache_invalidate_all_service.php.inc @@ -0,0 +1,17 @@ +invalidateAll(); + +Drupal::service('cache.render')->invalidateAll(); +?> +----- +deleteAll(); + +// TODO: Drupal Rector Notice: Please delete the following comment after you've made any necessary changes. +// Please confirm that `Drupal::service(...)` is an instance of `Drupal\Core\Cache\CacheBackendInterface`. Only the method name and not the class name was checked for this replacement, so this may be a false positive. +Drupal::service('cache.render')->deleteAll(); +?> From b429e9a2ffd962846d5f915717734148d68df0a5 Mon Sep 17 00:00:00 2001 From: bjorn Date: Sat, 16 May 2026 10:20:48 +0200 Subject: [PATCH 210/256] build: codestyle, oops --- src/Rector/Deprecation/MethodToMethodWithCheckRector.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Rector/Deprecation/MethodToMethodWithCheckRector.php b/src/Rector/Deprecation/MethodToMethodWithCheckRector.php index d2b976a11..0b987540e 100644 --- a/src/Rector/Deprecation/MethodToMethodWithCheckRector.php +++ b/src/Rector/Deprecation/MethodToMethodWithCheckRector.php @@ -138,7 +138,7 @@ public function refactorNode(Node\Expr\MethodCall $node, ?Node\Stmt\Expression $ $method = $node->var->name instanceof Node\Identifier ? $node->var->name->toString() : '(method)'; $node_var = "$class::$method(...)"; } elseif ($node->var instanceof Node\Expr\PropertyFetch) { - $obj = $node->var->var instanceof Node\Expr\Variable ? '$' . $node->var->var->name : '(expression)'; + $obj = $node->var->var instanceof Node\Expr\Variable ? '$'.$node->var->var->name : '(expression)'; $prop = $node->var->name instanceof Node\Identifier ? $node->var->name->toString() : '(property)'; $node_var = "$obj->$prop"; } elseif ($node->var instanceof Node\Expr\NullsafeMethodCall) { From b6d580d3db3fb478632656f8628485735062e33a Mon Sep 17 00:00:00 2001 From: bjorn Date: Mon, 18 May 2026 08:04:22 +0200 Subject: [PATCH 211/256] fix: ReplacePdoFetchConstantsRector skipped BC when inside array item. Which can be refactored. --- .../ReplacePdoFetchConstantsRector.php | 20 ++++++++++++++++--- src/Rector/AbstractDrupalCoreRector.php | 2 +- .../fixture/basic.php.inc | 2 +- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector.php b/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector.php index f25a33a8a..2363c61b5 100644 --- a/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector.php @@ -82,8 +82,6 @@ public function getNodeTypes(): array public function refactor(Node $node): ?Node { if ($node instanceof ArrayItem) { - // ArrayItem nodes cannot be BC-wrapped as standalone expressions. - // Apply the transformation directly without version-gating wrapper. foreach ($this->configuration as $configuration) { if (!$this->rectorShouldApplyToDrupalVersion($configuration)) { continue; @@ -92,7 +90,23 @@ public function refactor(Node $node): ?Node continue; } - return $this->refactorArrayItem($node); + $result = $this->refactorArrayItem($node); + if ($result === null) { + return null; + } + + if ($this->supportBackwardsCompatibility($configuration)) { + $cloned = clone $result; + $cloned->value = $this->createBcCallOnExpr( + $node->value, + $result->value, + $configuration->getIntroducedVersion() + ); + + return $cloned; + } + + return $result; } return null; diff --git a/src/Rector/AbstractDrupalCoreRector.php b/src/Rector/AbstractDrupalCoreRector.php index 21e42be06..f5d5f3367 100644 --- a/src/Rector/AbstractDrupalCoreRector.php +++ b/src/Rector/AbstractDrupalCoreRector.php @@ -106,7 +106,7 @@ public function refactor(Node $node) */ abstract protected function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration); - private function createBcCallOnExpr(Node\Expr $node, Node\Expr $result, string $introducedVersion): Node\Expr\StaticCall + protected function createBcCallOnExpr(Node\Expr $node, Node\Expr $result, string $introducedVersion): Node\Expr\StaticCall { $clonedNode = clone $node; diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/basic.php.inc index 017045d46..c3b467986 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/basic.php.inc @@ -16,7 +16,7 @@ $pdo = $statement->getClientStatement()->fetchAll(\PDO::FETCH_ASSOC); \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => $statement->fetch(\Drupal\Core\Database\Statement\FetchAs::Object), fn() => $statement->fetch(\PDO::FETCH_OBJ)); $rows = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => $statement->fetchAll(\Drupal\Core\Database\Statement\FetchAs::List), fn() => $statement->fetchAll(\PDO::FETCH_NUM)); $data = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => $statement->fetchAllAssoc('id', \Drupal\Core\Database\Statement\FetchAs::Associative), fn() => $statement->fetchAllAssoc('id', \PDO::FETCH_ASSOC)); -$result = $db->query('SELECT name FROM {test}', [], ['fetch' => \Drupal\Core\Database\Statement\FetchAs::Associative]); +$result = $db->query('SELECT name FROM {test}', [], ['fetch' => \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => \Drupal\Core\Database\Statement\FetchAs::Associative, fn() => \PDO::FETCH_ASSOC)]); // Raw PDO: leave unchanged $pdo = $statement->getClientStatement()->fetchAll(\PDO::FETCH_ASSOC); From 742ea3c6bffe720411ba1ea2f6ae819ec11d349e Mon Sep 17 00:00:00 2001 From: bjorn Date: Mon, 18 May 2026 08:04:38 +0200 Subject: [PATCH 212/256] fix: update prompts to reflect how to handle arrayitem changes --- .../skills/prompts/digest-to-rector-prompt.md | 37 +++++++++++++------ 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/.claude/skills/prompts/digest-to-rector-prompt.md b/.claude/skills/prompts/digest-to-rector-prompt.md index 4ccb1e607..f197dd4e1 100644 --- a/.claude/skills/prompts/digest-to-rector-prompt.md +++ b/.claude/skills/prompts/digest-to-rector-prompt.md @@ -120,11 +120,11 @@ Answer these questions using the information gathered: - If **both** the input node and the returned node are `Node\Expr` subtypes → BC wrapping is **eligible**. - `Node\Expr` subtypes include: `FuncCall`, `MethodCall`, `StaticCall`, `NullsafeMethodCall`, `New_`, `Array_`, `ClassConstFetch`, `ConstFetch`, `String_`, `Int_`, `PropertyFetch`, and more. -- `Class_` (structural node) and `ArrayItem` are **not** `Node\Expr` → BC wrapping is not applicable. -- Exception: `ArrayItem` cannot appear as an arrow function body in PHP syntax, so even though - `Node\Expr\ArrayItem` exists, it cannot be BC-wrapped. If a rector handles `ArrayItem` nodes - alongside BC-wrappable nodes, override `refactor()` to apply the ArrayItem transform directly - while letting the parent handle BC for other node types (see edge case note in Template B). +- `Class_` (structural node) is **not** a `Node\Expr` → BC wrapping is not applicable. +- `ArrayItem` (`Node\Expr\ArrayItem`) extends `Node\Expr`, but the **ArrayItem node itself** cannot + be replaced by a `StaticCall` — doing so would remove the `key => value` structure from the + array. However, the **value inside** an ArrayItem can be wrapped in a BC call. Override + `refactor()` to handle this manually (see edge case note in Template B). **Q3: Was the deprecation introduced in Drupal >= 10.1.0?** - Compare the introduced version from Step 2 against `10.1.0`. @@ -170,7 +170,8 @@ Ask: *Could the transformed code run unchanged on a Drupal version that predates | `FuncCall` | `FuncCall` (modified args) | pure PHP / no new API | any | `AbstractRector` | No | | `MethodCall` | `FuncCall` | native PHP function | any | `AbstractRector` | No | | `FuncCall` | `StaticCall` | any | < 10.1.0 | `AbstractRector` | No | -| `ArrayItem` | `ArrayItem` | any | any | `AbstractRector` | No (PHP syntax limit) | +| `ArrayItem` | `ArrayItem` | new Drupal API | >= 10.1.0 | `AbstractDrupalCoreRector` | Yes (wrap value, not the node) | +| `ArrayItem` | `ArrayItem` | version-agnostic | any | `AbstractRector` | No | | `Class_` (structural) | `Class_` | any | any | `AbstractRector` | No (not an Expr) | --- @@ -444,14 +445,13 @@ $cloned->args[$index] = $newArg; This applies to any child node you modify: `Arg`, `ArrayItem`, `Node\Identifier`, etc. **ArrayItem edge case:** -`ArrayItem` (`Node\Expr\ArrayItem`) cannot appear as an arrow function body in valid PHP. If a -rector handles `ArrayItem` nodes alongside BC-wrappable nodes (e.g. `MethodCall`), override -`refactor()` to apply ArrayItem transforms directly and skip the BC path for that node type: +`ArrayItem` (`Node\Expr\ArrayItem`) is an `Expr` node but the **node itself** cannot be replaced +by a `StaticCall` — that would destroy the `key => value` structure. However, the **value** inside +the ArrayItem can be wrapped in a BC call. Override `refactor()` and wrap only `$result->value`: ```php public function refactor(Node $node): ?Node { if ($node instanceof ArrayItem) { - // Apply directly; BC wrapping is not applicable for ArrayItem. foreach ($this->configuration as $configuration) { if (!$this->rectorShouldApplyToDrupalVersion($configuration)) { continue; @@ -459,7 +459,21 @@ public function refactor(Node $node): ?Node if ($this->isInBackwardsCompatibleCall($node)) { continue; } - return $this->refactorArrayItem($node); + $result = $this->refactorArrayItem($node); + if ($result === null) { + return null; + } + if ($this->supportBackwardsCompatibility($configuration)) { + // Wrap the VALUE in DeprecationHelper, not the ArrayItem itself. + $cloned = clone $result; + $cloned->value = $this->createBcCallOnExpr( + $node->value, + $result->value, + $configuration->getIntroducedVersion() + ); + return $cloned; + } + return $result; } return null; } @@ -467,6 +481,7 @@ public function refactor(Node $node): ?Node return parent::refactor($node); } ``` +Result: `['fetch' => DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => FetchAs::Associative, fn() => \PDO::FETCH_ASSOC)]` — the array item is preserved, only its value is version-gated. --- From 6d67ed39ea72a039e03ab91d03541e1209799c41 Mon Sep 17 00:00:00 2001 From: bjorn Date: Mon, 18 May 2026 09:32:05 +0200 Subject: [PATCH 213/256] feat: ConstantToClassConstantRector can be a generic rector. --- config/drupal-11/drupal-11.2-deprecations.php | 10 +-- config/drupal-11/drupal-11.3-deprecations.php | 8 +-- config/drupal-11/drupal-11.4-deprecations.php | 2 +- .../ConstantToClassConstantRector.php | 63 +++++-------------- .../ConstantToClassConfiguration.php | 12 +++- .../ConstantToClassConstantRectorTest.php | 20 ++++++ .../config/configured_rule.php | 20 +++--- .../drupal_11_constants.php.inc | 21 +++++++ .../fixture/drupal_11_constants.php.inc | 18 +++--- 9 files changed, 98 insertions(+), 76 deletions(-) create mode 100644 tests/src/Rector/Deprecation/ConstantToClassConstantRector/fixture-below-version/drupal_11_constants.php.inc diff --git a/config/drupal-11/drupal-11.2-deprecations.php b/config/drupal-11/drupal-11.2-deprecations.php index e178be58b..ec608373d 100644 --- a/config/drupal-11/drupal-11.2-deprecations.php +++ b/config/drupal-11/drupal-11.2-deprecations.php @@ -120,11 +120,11 @@ // LOCALE_TRANSLATION_DEFAULT_SERVER_PATTERN deprecated in drupal:11.2.0, removed in drupal:12.0.0. // Replaced by \Drupal::TRANSLATION_DEFAULT_SERVER_PATTERN. $rectorConfig->ruleWithConfiguration(ConstantToClassConstantRector::class, [ - new ConstantToClassConfiguration('REQUIREMENT_INFO', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'Info'), - new ConstantToClassConfiguration('REQUIREMENT_OK', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'OK'), - new ConstantToClassConfiguration('REQUIREMENT_WARNING', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'Warning'), - new ConstantToClassConfiguration('REQUIREMENT_ERROR', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'Error'), - new ConstantToClassConfiguration('LOCALE_TRANSLATION_DEFAULT_SERVER_PATTERN', 'Drupal', 'TRANSLATION_DEFAULT_SERVER_PATTERN'), + new ConstantToClassConfiguration('REQUIREMENT_INFO', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'Info', '11.2.0'), + new ConstantToClassConfiguration('REQUIREMENT_OK', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'OK', '11.2.0'), + new ConstantToClassConfiguration('REQUIREMENT_WARNING', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'Warning', '11.2.0'), + new ConstantToClassConfiguration('REQUIREMENT_ERROR', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'Error', '11.2.0'), + new ConstantToClassConfiguration('LOCALE_TRANSLATION_DEFAULT_SERVER_PATTERN', 'Drupal', 'TRANSLATION_DEFAULT_SERVER_PATTERN', '11.2.0'), ]); // https://www.drupal.org/node/3473440 diff --git a/config/drupal-11/drupal-11.3-deprecations.php b/config/drupal-11/drupal-11.3-deprecations.php index 4e28bbe42..d282025cf 100644 --- a/config/drupal-11/drupal-11.3-deprecations.php +++ b/config/drupal-11/drupal-11.3-deprecations.php @@ -157,10 +157,10 @@ // JSONAPI_FILTER_AMONG_* global constants deprecated in drupal:11.3.0, removed in drupal:13.0.0. // Replaced by \Drupal\jsonapi\JsonApiFilter::AMONG_* class constants. $rectorConfig->ruleWithConfiguration(ConstantToClassConstantRector::class, [ - new ConstantToClassConfiguration('JSONAPI_FILTER_AMONG_ALL', 'Drupal\jsonapi\JsonApiFilter', 'AMONG_ALL'), - new ConstantToClassConfiguration('JSONAPI_FILTER_AMONG_PUBLISHED', 'Drupal\jsonapi\JsonApiFilter', 'AMONG_PUBLISHED'), - new ConstantToClassConfiguration('JSONAPI_FILTER_AMONG_ENABLED', 'Drupal\jsonapi\JsonApiFilter', 'AMONG_ENABLED'), - new ConstantToClassConfiguration('JSONAPI_FILTER_AMONG_OWN', 'Drupal\jsonapi\JsonApiFilter', 'AMONG_OWN'), + new ConstantToClassConfiguration('JSONAPI_FILTER_AMONG_ALL', 'Drupal\jsonapi\JsonApiFilter', 'AMONG_ALL', '11.3.0'), + new ConstantToClassConfiguration('JSONAPI_FILTER_AMONG_PUBLISHED', 'Drupal\jsonapi\JsonApiFilter', 'AMONG_PUBLISHED', '11.3.0'), + new ConstantToClassConfiguration('JSONAPI_FILTER_AMONG_ENABLED', 'Drupal\jsonapi\JsonApiFilter', 'AMONG_ENABLED', '11.3.0'), + new ConstantToClassConfiguration('JSONAPI_FILTER_AMONG_OWN', 'Drupal\jsonapi\JsonApiFilter', 'AMONG_OWN', '11.3.0'), ]); // https://www.drupal.org/node/3538277 diff --git a/config/drupal-11/drupal-11.4-deprecations.php b/config/drupal-11/drupal-11.4-deprecations.php index 9afcf9778..18b3220e1 100644 --- a/config/drupal-11/drupal-11.4-deprecations.php +++ b/config/drupal-11/drupal-11.4-deprecations.php @@ -390,7 +390,7 @@ // IMAGE_DERIVATIVE_TOKEN deprecated in drupal:11.4.0, removed in drupal:13.0.0. // Replaced by \Drupal\image\ImageStyleInterface::TOKEN. $rectorConfig->ruleWithConfiguration(ConstantToClassConstantRector::class, [ - new ConstantToClassConfiguration('IMAGE_DERIVATIVE_TOKEN', 'Drupal\image\ImageStyleInterface', 'TOKEN'), + new ConstantToClassConfiguration('IMAGE_DERIVATIVE_TOKEN', 'Drupal\image\ImageStyleInterface', 'TOKEN', '11.4.0'), ]); // https://www.drupal.org/node/2940605 diff --git a/src/Rector/Deprecation/ConstantToClassConstantRector.php b/src/Rector/Deprecation/ConstantToClassConstantRector.php index 0ac8b670e..61b93e0e7 100644 --- a/src/Rector/Deprecation/ConstantToClassConstantRector.php +++ b/src/Rector/Deprecation/ConstantToClassConstantRector.php @@ -4,10 +4,10 @@ namespace DrupalRector\Rector\Deprecation; +use DrupalRector\Contract\VersionedConfigurationInterface; +use DrupalRector\Rector\AbstractDrupalCoreRector; use DrupalRector\Rector\ValueObject\ConstantToClassConfiguration; use PhpParser\Node; -use Rector\Contract\Rector\ConfigurableRectorInterface; -use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -17,13 +17,8 @@ * What is covered: * - Replacement with a use statement. */ -class ConstantToClassConstantRector extends AbstractRector implements ConfigurableRectorInterface +class ConstantToClassConstantRector extends AbstractDrupalCoreRector { - /** - * @var ConstantToClassConfiguration[] - */ - private array $constantToClassRenames; - public function configure(array $configuration): void { foreach ($configuration as $value) { @@ -32,61 +27,37 @@ public function configure(array $configuration): void } } - $this->constantToClassRenames = $configuration; + parent::configure($configuration); } - /** - * {@inheritdoc} - */ public function getRuleDefinition(): RuleDefinition { - return new RuleDefinition('Fixes deprecated contant use, used in Drupal 8 and 9 deprecations', [ + return new RuleDefinition('Fixes deprecated constant use, used in Drupal 8 and later deprecations', [ new ConfiguredCodeSample( - <<<'CODE_BEFORE' -$result = file_unmanaged_copy($source, $destination, DEPRECATED_CONSTANT); -CODE_BEFORE, - <<<'CODE_AFTER' -$result = file_unmanaged_copy($source, $destination, \Drupal\MyClass::CONSTANT); -CODE_AFTER, - [ - new ConstantToClassConfiguration( - 'DEPRECATED_CONSTANT', - 'Drupal\MyClass', - 'CONSTANT' - ), - ] + '$result = file_unmanaged_copy($source, $destination, DEPRECATED_CONSTANT);', + '$result = file_unmanaged_copy($source, $destination, \Drupal\MyClass::CONSTANT);', + [new ConstantToClassConfiguration('DEPRECATED_CONSTANT', 'Drupal\MyClass', 'CONSTANT', '8.0.0')] ), ]); } - /** - * {@inheritdoc} - */ public function getNodeTypes(): array { - return [ - Node\Expr\ConstFetch::class, - ]; + return [Node\Expr\ConstFetch::class]; } - /** - * {@inheritdoc} - */ - public function refactor(Node $node): ?Node + protected function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { assert($node instanceof Node\Expr\ConstFetch); + assert($configuration instanceof ConstantToClassConfiguration); - foreach ($this->constantToClassRenames as $constantToClassRename) { - if ($this->getName($node->name) === $constantToClassRename->getDeprecated()) { - // We add a fully qualified class name and the parameters in `rector.php` adds the use statement. - $fully_qualified_class = new Node\Name\FullyQualified($constantToClassRename->getClass()); - - $name = new Node\Identifier($constantToClassRename->getConstant()); - - return new Node\Expr\ClassConstFetch($fully_qualified_class, $name); - } + if ($this->getName($node->name) !== $configuration->getDeprecated()) { + return null; } - return null; + return new Node\Expr\ClassConstFetch( + new Node\Name\FullyQualified($configuration->getClass()), + new Node\Identifier($configuration->getConstant()) + ); } } diff --git a/src/Rector/ValueObject/ConstantToClassConfiguration.php b/src/Rector/ValueObject/ConstantToClassConfiguration.php index 98a5c16d4..8d505d83d 100644 --- a/src/Rector/ValueObject/ConstantToClassConfiguration.php +++ b/src/Rector/ValueObject/ConstantToClassConfiguration.php @@ -4,19 +4,22 @@ namespace DrupalRector\Rector\ValueObject; +use DrupalRector\Contract\VersionedConfigurationInterface; use Rector\Validation\RectorAssert; -final class ConstantToClassConfiguration +final class ConstantToClassConfiguration implements VersionedConfigurationInterface { private string $deprecated; private string $class; private string $constant; + private string $introducedVersion; - public function __construct(string $deprecated, string $class, string $constant) + public function __construct(string $deprecated, string $class, string $constant, string $introducedVersion) { $this->deprecated = $deprecated; $this->class = $class; $this->constant = $constant; + $this->introducedVersion = $introducedVersion; RectorAssert::className($class); RectorAssert::constantName($deprecated); @@ -37,4 +40,9 @@ public function getConstant(): string { return $this->constant; } + + public function getIntroducedVersion(): string + { + return $this->introducedVersion; + } } diff --git a/tests/src/Rector/Deprecation/ConstantToClassConstantRector/ConstantToClassConstantRectorTest.php b/tests/src/Rector/Deprecation/ConstantToClassConstantRector/ConstantToClassConstantRectorTest.php index d8f94f8ce..70f3b2c0e 100644 --- a/tests/src/Rector/Deprecation/ConstantToClassConstantRector/ConstantToClassConstantRectorTest.php +++ b/tests/src/Rector/Deprecation/ConstantToClassConstantRector/ConstantToClassConstantRectorTest.php @@ -4,6 +4,7 @@ namespace DrupalRector\Rector\Deprecation\ConstantToClassConstantRector; +use DrupalRector\Services\DrupalRectorSettings; use Iterator; use Rector\Testing\PHPUnit\AbstractRectorTestCase; @@ -24,6 +25,25 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } + } + + /** + * @return Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); + } + public function provideConfigFilePath(): string { // must be implemented diff --git a/tests/src/Rector/Deprecation/ConstantToClassConstantRector/config/configured_rule.php b/tests/src/Rector/Deprecation/ConstantToClassConstantRector/config/configured_rule.php index 1bfe77e76..7e4f0dd7e 100644 --- a/tests/src/Rector/Deprecation/ConstantToClassConstantRector/config/configured_rule.php +++ b/tests/src/Rector/Deprecation/ConstantToClassConstantRector/config/configured_rule.php @@ -13,6 +13,7 @@ 'DATETIME_STORAGE_TIMEZONE', 'Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface', 'STORAGE_TIMEZONE', + '8.5.0', ), ]); DeprecationBase::addClass(ConstantToClassConstantRector::class, $rectorConfig, false, [ @@ -20,17 +21,18 @@ 'FILE_STATUS_PERMANENT', 'Drupal\file\FileInterface', 'STATUS_PERMANENT', + '9.3.0', ), ]); DeprecationBase::addClass(ConstantToClassConstantRector::class, $rectorConfig, false, [ - new ConstantToClassConfiguration('REQUIREMENT_INFO', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'Info'), - new ConstantToClassConfiguration('REQUIREMENT_OK', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'OK'), - new ConstantToClassConfiguration('REQUIREMENT_WARNING', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'Warning'), - new ConstantToClassConfiguration('REQUIREMENT_ERROR', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'Error'), - new ConstantToClassConfiguration('LOCALE_TRANSLATION_DEFAULT_SERVER_PATTERN', 'Drupal', 'TRANSLATION_DEFAULT_SERVER_PATTERN'), - new ConstantToClassConfiguration('JSONAPI_FILTER_AMONG_ALL', 'Drupal\jsonapi\JsonApiFilter', 'AMONG_ALL'), - new ConstantToClassConfiguration('JSONAPI_FILTER_AMONG_PUBLISHED', 'Drupal\jsonapi\JsonApiFilter', 'AMONG_PUBLISHED'), - new ConstantToClassConfiguration('JSONAPI_FILTER_AMONG_ENABLED', 'Drupal\jsonapi\JsonApiFilter', 'AMONG_ENABLED'), - new ConstantToClassConfiguration('JSONAPI_FILTER_AMONG_OWN', 'Drupal\jsonapi\JsonApiFilter', 'AMONG_OWN'), + new ConstantToClassConfiguration('REQUIREMENT_INFO', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'Info', '11.2.0'), + new ConstantToClassConfiguration('REQUIREMENT_OK', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'OK', '11.2.0'), + new ConstantToClassConfiguration('REQUIREMENT_WARNING', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'Warning', '11.2.0'), + new ConstantToClassConfiguration('REQUIREMENT_ERROR', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'Error', '11.2.0'), + new ConstantToClassConfiguration('LOCALE_TRANSLATION_DEFAULT_SERVER_PATTERN', 'Drupal', 'TRANSLATION_DEFAULT_SERVER_PATTERN', '11.2.0'), + new ConstantToClassConfiguration('JSONAPI_FILTER_AMONG_ALL', 'Drupal\jsonapi\JsonApiFilter', 'AMONG_ALL', '11.3.0'), + new ConstantToClassConfiguration('JSONAPI_FILTER_AMONG_PUBLISHED', 'Drupal\jsonapi\JsonApiFilter', 'AMONG_PUBLISHED', '11.3.0'), + new ConstantToClassConfiguration('JSONAPI_FILTER_AMONG_ENABLED', 'Drupal\jsonapi\JsonApiFilter', 'AMONG_ENABLED', '11.3.0'), + new ConstantToClassConfiguration('JSONAPI_FILTER_AMONG_OWN', 'Drupal\jsonapi\JsonApiFilter', 'AMONG_OWN', '11.3.0'), ]); }; diff --git a/tests/src/Rector/Deprecation/ConstantToClassConstantRector/fixture-below-version/drupal_11_constants.php.inc b/tests/src/Rector/Deprecation/ConstantToClassConstantRector/fixture-below-version/drupal_11_constants.php.inc new file mode 100644 index 000000000..89892d0a3 --- /dev/null +++ b/tests/src/Rector/Deprecation/ConstantToClassConstantRector/fixture-below-version/drupal_11_constants.php.inc @@ -0,0 +1,21 @@ + +----- + diff --git a/tests/src/Rector/Deprecation/ConstantToClassConstantRector/fixture/drupal_11_constants.php.inc b/tests/src/Rector/Deprecation/ConstantToClassConstantRector/fixture/drupal_11_constants.php.inc index 464c7c865..9056c77f4 100644 --- a/tests/src/Rector/Deprecation/ConstantToClassConstantRector/fixture/drupal_11_constants.php.inc +++ b/tests/src/Rector/Deprecation/ConstantToClassConstantRector/fixture/drupal_11_constants.php.inc @@ -20,18 +20,18 @@ $filter4 = JSONAPI_FILTER_AMONG_OWN; \Drupal\Core\Extension\Requirement\RequirementSeverity::Info, fn() => REQUIREMENT_INFO); +$b = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => \Drupal\Core\Extension\Requirement\RequirementSeverity::OK, fn() => REQUIREMENT_OK); +$c = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => \Drupal\Core\Extension\Requirement\RequirementSeverity::Warning, fn() => REQUIREMENT_WARNING); +$d = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => \Drupal\Core\Extension\Requirement\RequirementSeverity::Error, fn() => REQUIREMENT_ERROR); // Drupal 11.2: LOCALE_TRANSLATION_DEFAULT_SERVER_PATTERN → \Drupal::TRANSLATION_DEFAULT_SERVER_PATTERN -$pattern = \Drupal::TRANSLATION_DEFAULT_SERVER_PATTERN; +$pattern = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => \Drupal::TRANSLATION_DEFAULT_SERVER_PATTERN, fn() => LOCALE_TRANSLATION_DEFAULT_SERVER_PATTERN); // Drupal 11.3: JSONAPI_FILTER_AMONG_* → JsonApiFilter class constants -$filter1 = \Drupal\jsonapi\JsonApiFilter::AMONG_ALL; -$filter2 = \Drupal\jsonapi\JsonApiFilter::AMONG_PUBLISHED; -$filter3 = \Drupal\jsonapi\JsonApiFilter::AMONG_ENABLED; -$filter4 = \Drupal\jsonapi\JsonApiFilter::AMONG_OWN; +$filter1 = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => \Drupal\jsonapi\JsonApiFilter::AMONG_ALL, fn() => JSONAPI_FILTER_AMONG_ALL); +$filter2 = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => \Drupal\jsonapi\JsonApiFilter::AMONG_PUBLISHED, fn() => JSONAPI_FILTER_AMONG_PUBLISHED); +$filter3 = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => \Drupal\jsonapi\JsonApiFilter::AMONG_ENABLED, fn() => JSONAPI_FILTER_AMONG_ENABLED); +$filter4 = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => \Drupal\jsonapi\JsonApiFilter::AMONG_OWN, fn() => JSONAPI_FILTER_AMONG_OWN); ?> From ba6f5aaa586cf4fdc0c2a46370dc3200f7df3b35 Mon Sep 17 00:00:00 2001 From: bjorn Date: Mon, 18 May 2026 09:39:19 +0200 Subject: [PATCH 214/256] docs(prompts): ConstantToClassConstantRector can be a generic rector, make sure the skills know. --- .claude/skills/prompts/digest-to-rector-prompt.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.claude/skills/prompts/digest-to-rector-prompt.md b/.claude/skills/prompts/digest-to-rector-prompt.md index f197dd4e1..e9a27183b 100644 --- a/.claude/skills/prompts/digest-to-rector-prompt.md +++ b/.claude/skills/prompts/digest-to-rector-prompt.md @@ -239,8 +239,8 @@ new ClassConstantToClassConstantConfiguration('[OldClass\\FQCN]', '[OLD_CONST]', // no introducedVersion — applies unconditionally; no BC wrapping // ConstantToClassConstantRector — replaces bare global constant (ConstFetch) with class constant -new ConstantToClassConfiguration('[GLOBAL_CONSTANT_NAME]', '[TargetClass\\FQCN]', '[CONST_NAME]'), -// no introducedVersion — applies unconditionally; no BC wrapping +new ConstantToClassConfiguration('[GLOBAL_CONSTANT_NAME]', '[TargetClass\\FQCN]', '[CONST_NAME]', '[introducedVersion]'), +// introducedVersion is required; triggers DeprecationHelper BC wrapping for versions >= 10.1.0 // FunctionToFirstArgMethodRector — fn($obj) → $obj->method(); first arg must be the receiver new FunctionToFirstArgMethodConfiguration('[introducedVersion]', '[deprecatedFunctionName]', '[methodName]'), From ddc6ec7f89c58214be9d26f3e51a9f83fec86482 Mon Sep 17 00:00:00 2001 From: bjorn Date: Mon, 18 May 2026 15:02:51 +0200 Subject: [PATCH 215/256] feat: ConstantToClassConstantRector config was wrong for drupal 8/9 --- config/drupal-8/drupal-8.5-deprecations.php | 6 +++--- config/drupal-8/drupal-8.7-deprecations.php | 8 ++++---- config/drupal-9/drupal-9.3-deprecations.php | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/config/drupal-8/drupal-8.5-deprecations.php b/config/drupal-8/drupal-8.5-deprecations.php index f04301792..6ed1a5517 100644 --- a/config/drupal-8/drupal-8.5-deprecations.php +++ b/config/drupal-8/drupal-8.5-deprecations.php @@ -20,8 +20,8 @@ * See https://www.drupal.org/node/2912980 for change record. */ $rectorConfig->ruleWithConfiguration(ConstantToClassConstantRector::class, [ - new ConstantToClassConfiguration('DATETIME_DATE_STORAGE_FORMAT', 'Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface', 'DATE_STORAGE_FORMAT'), - new ConstantToClassConfiguration('DATETIME_DATETIME_STORAGE_FORMAT', 'Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface', 'DATETIME_STORAGE_FORMAT'), - new ConstantToClassConfiguration('DATETIME_STORAGE_TIMEZONE', 'Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface', 'STORAGE_TIMEZONE'), + new ConstantToClassConfiguration('DATETIME_DATE_STORAGE_FORMAT', 'Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface', 'DATE_STORAGE_FORMAT', '8.5.0'), + new ConstantToClassConfiguration('DATETIME_DATETIME_STORAGE_FORMAT', 'Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface', 'DATETIME_STORAGE_FORMAT', '8.5.0'), + new ConstantToClassConfiguration('DATETIME_STORAGE_TIMEZONE', 'Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface', 'STORAGE_TIMEZONE', '8.5.0'), ]); }; diff --git a/config/drupal-8/drupal-8.7-deprecations.php b/config/drupal-8/drupal-8.7-deprecations.php index 1942122ba..9e115eba0 100644 --- a/config/drupal-8/drupal-8.7-deprecations.php +++ b/config/drupal-8/drupal-8.7-deprecations.php @@ -25,22 +25,22 @@ * * No change record found. */ - $constantToClassFileCreateDirectory = new ConstantToClassConfiguration('FILE_CREATE_DIRECTORY', 'Drupal\Core\File\FileSystemInterface', 'CREATE_DIRECTORY'); + $constantToClassFileCreateDirectory = new ConstantToClassConfiguration('FILE_CREATE_DIRECTORY', 'Drupal\Core\File\FileSystemInterface', 'CREATE_DIRECTORY', '8.7.0'); /** * Replaces deprecated FILE_EXISTS_REPLACE, FILE_EXISTS_RENAME constant use. * * See https://www.drupal.org/node/3006851 for change record. */ - $constantToClassFileExistReplace = new ConstantToClassConfiguration('FILE_EXISTS_REPLACE', 'Drupal\Core\File\FileSystemInterface', 'EXISTS_REPLACE'); - $constantToClassFileExistsRename = new ConstantToClassConfiguration('FILE_EXISTS_RENAME', 'Drupal\Core\File\FileSystemInterface', 'EXISTS_RENAME'); + $constantToClassFileExistReplace = new ConstantToClassConfiguration('FILE_EXISTS_REPLACE', 'Drupal\Core\File\FileSystemInterface', 'EXISTS_REPLACE', '8.7.0'); + $constantToClassFileExistsRename = new ConstantToClassConfiguration('FILE_EXISTS_RENAME', 'Drupal\Core\File\FileSystemInterface', 'EXISTS_RENAME', '8.7.0'); /** * Replaces deprecated FILE_MODIFY_PERMISSIONS constant use. * * No change record found. */ - $constantToClassFileModifyPermissions = new ConstantToClassConfiguration('FILE_MODIFY_PERMISSIONS', 'Drupal\Core\File\FileSystemInterface', 'MODIFY_PERMISSIONS'); + $constantToClassFileModifyPermissions = new ConstantToClassConfiguration('FILE_MODIFY_PERMISSIONS', 'Drupal\Core\File\FileSystemInterface', 'MODIFY_PERMISSIONS', '8.7.0'); $rectorConfig->ruleWithConfiguration(ConstantToClassConstantRector::class, [ $constantToClassFileCreateDirectory, diff --git a/config/drupal-9/drupal-9.3-deprecations.php b/config/drupal-9/drupal-9.3-deprecations.php index c51996a42..7f60ca18c 100644 --- a/config/drupal-9/drupal-9.3-deprecations.php +++ b/config/drupal-9/drupal-9.3-deprecations.php @@ -75,6 +75,7 @@ 'FILE_STATUS_PERMANENT', 'Drupal\file\FileInterface', 'STATUS_PERMANENT', + '9.3.0', ), ]); }; From b04bed22e341f4b948de5ece8edc61969d811f64 Mon Sep 17 00:00:00 2001 From: bjorn Date: Mon, 18 May 2026 15:09:19 +0200 Subject: [PATCH 216/256] build: refactor conditions so phpstan is less confused --- .../Deprecation/EntityInterfaceLinkRector.php | 20 +++++++------------ 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/src/Drupal8/Rector/Deprecation/EntityInterfaceLinkRector.php b/src/Drupal8/Rector/Deprecation/EntityInterfaceLinkRector.php index 78ca41d91..017c2ce76 100644 --- a/src/Drupal8/Rector/Deprecation/EntityInterfaceLinkRector.php +++ b/src/Drupal8/Rector/Deprecation/EntityInterfaceLinkRector.php @@ -67,26 +67,20 @@ public function refactor(Node $node): ?Node { assert($node instanceof Node\Stmt\Expression); - if (!($node->expr instanceof Node\Expr\MethodCall) && !($node->expr instanceof Node\Expr\Assign && $node->expr->expr instanceof Node\Expr\MethodCall)) { - return null; - } - - if ($node->expr instanceof Node\Expr\MethodCall && $this->getName($node->expr->name) !== 'link') { - return null; - } - - if (($node->expr instanceof Node\Expr\Assign && $node->expr->expr instanceof Node\Expr\MethodCall) && $this->getName($node->expr->expr->name) !== 'link') { - return null; - } - if ($node->expr instanceof Node\Expr\MethodCall) { + if ($this->getName($node->expr->name) !== 'link') { + return null; + } $methodCall = $this->getMethodCall($node->expr, $node); $node->expr = $methodCall; return $node; } - if ($node->expr->expr instanceof Node\Expr\MethodCall) { + if ($node->expr instanceof Node\Expr\Assign && $node->expr->expr instanceof Node\Expr\MethodCall) { + if ($this->getName($node->expr->expr->name) !== 'link') { + return null; + } $methodCall = $this->getMethodCall($node->expr->expr, $node); $node->expr->expr = $methodCall; From 52346e25348f8258c30ced99835f6e7ec3ae8392 Mon Sep 17 00:00:00 2001 From: bjorn Date: Mon, 18 May 2026 15:42:40 +0200 Subject: [PATCH 217/256] feat: implement CheckMarkupToProcessedTextRector for #455724 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replaces deprecated check_markup() calls (drupal:11.4.0) with the equivalent ['#type' => 'processed_text', ...] render array. Handles positional and named arguments. No BC wrapping needed — the render array is version-agnostic. --- .../CheckMarkupToProcessedTextRector.php | 97 +++++++++++++++++++ .../CheckMarkupToProcessedTextRectorTest.php | 26 +++++ .../config/configured_rule.php | 11 +++ .../fixture/basic.php.inc | 19 ++++ .../fixture/no_change_unrelated.php.inc | 19 ++++ 5 files changed, 172 insertions(+) create mode 100644 src/Drupal11/Rector/Deprecation/CheckMarkupToProcessedTextRector.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/CheckMarkupToProcessedTextRector/CheckMarkupToProcessedTextRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/CheckMarkupToProcessedTextRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/CheckMarkupToProcessedTextRector/fixture/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/CheckMarkupToProcessedTextRector/fixture/no_change_unrelated.php.inc diff --git a/src/Drupal11/Rector/Deprecation/CheckMarkupToProcessedTextRector.php b/src/Drupal11/Rector/Deprecation/CheckMarkupToProcessedTextRector.php new file mode 100644 index 000000000..fcfe30ee9 --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/CheckMarkupToProcessedTextRector.php @@ -0,0 +1,97 @@ + '#text', + 'format_id' => '#format', + 'langcode' => '#langcode', + 'filter_types_to_skip' => '#filter_types_to_skip', + ]; + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition( + 'Replace deprecated check_markup() calls with a processed_text render array.', + [ + new CodeSample( + <<<'CODE_BEFORE' +check_markup($text, $format_id); +CODE_BEFORE, + <<<'CODE_AFTER' +['#type' => 'processed_text', '#text' => $text, '#format' => $format_id]; +CODE_AFTER + ), + ] + ); + } + + /** @return array> */ + public function getNodeTypes(): array + { + return [FuncCall::class]; + } + + public function refactor(Node $node): ?Node + { + assert($node instanceof FuncCall); + + if (!$this->isName($node->name, 'check_markup')) { + return null; + } + + $args = $node->args; + if (count($args) === 0) { + return null; + } + + $items = [ + new ArrayItem(new String_('processed_text'), new String_('#type')), + ]; + + $paramNames = array_keys(self::PARAM_MAP); + $positionalIndex = 0; + + foreach ($args as $arg) { + if (!$arg instanceof Arg) { + continue; + } + + if ($arg->name !== null) { + $paramName = $arg->name->toString(); + if (isset(self::PARAM_MAP[$paramName])) { + $items[] = new ArrayItem($arg->value, new String_(self::PARAM_MAP[$paramName])); + } + } else { + if (isset($paramNames[$positionalIndex])) { + $key = self::PARAM_MAP[$paramNames[$positionalIndex]]; + $items[] = new ArrayItem($arg->value, new String_($key)); + } + + ++$positionalIndex; + } + } + + return new Array_($items); + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/CheckMarkupToProcessedTextRector/CheckMarkupToProcessedTextRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/CheckMarkupToProcessedTextRector/CheckMarkupToProcessedTextRectorTest.php new file mode 100644 index 000000000..fc0fd636c --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/CheckMarkupToProcessedTextRector/CheckMarkupToProcessedTextRectorTest.php @@ -0,0 +1,26 @@ +doTestFile($filePath); + } + + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/CheckMarkupToProcessedTextRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/CheckMarkupToProcessedTextRector/config/configured_rule.php new file mode 100644 index 000000000..69f712c9a --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/CheckMarkupToProcessedTextRector/config/configured_rule.php @@ -0,0 +1,11 @@ + +----- + 'processed_text', '#text' => $text, '#format' => $format_id]; + $full = ['#type' => 'processed_text', '#text' => $text, '#format' => $format_id, '#langcode' => $langcode, '#filter_types_to_skip' => $filter_types_to_skip]; + $named = ['#type' => 'processed_text', '#text' => $text, '#format' => $format_id]; +} +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/CheckMarkupToProcessedTextRector/fixture/no_change_unrelated.php.inc b/tests/src/Drupal11/Rector/Deprecation/CheckMarkupToProcessedTextRector/fixture/no_change_unrelated.php.inc new file mode 100644 index 000000000..fc1832e15 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/CheckMarkupToProcessedTextRector/fixture/no_change_unrelated.php.inc @@ -0,0 +1,19 @@ + +----- + From 825a4110caaac00897bc82a8eea7661134ac8424 Mon Sep 17 00:00:00 2001 From: bjorn Date: Mon, 18 May 2026 15:43:42 +0200 Subject: [PATCH 218/256] feat: add LocaleCompareIncToServiceRector for Drupal issue #3037031 Replaces deprecated locale_translation_flush_projects(), locale_translation_build_projects(), locale_translation_check_projects(), and locale_translation_check_projects_local() with service calls to LocaleProjectRepository and LocaleProjectChecker, deprecated in drupal:11.4.0 and removed in drupal:13.0.0. --- config/drupal-11/drupal-11.4-deprecations.php | 9 ++ .../LocaleCompareIncToServiceRector.php | 132 ++++++++++++++++++ .../LocaleCompareIncToServiceRectorTest.php | 50 +++++++ .../config/configured_rule.php | 14 ++ .../fixture-below-version/basic.php.inc | 17 +++ .../fixture/basic.php.inc | 17 +++ 6 files changed, 239 insertions(+) create mode 100644 src/Drupal11/Rector/Deprecation/LocaleCompareIncToServiceRector.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/LocaleCompareIncToServiceRector/LocaleCompareIncToServiceRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/LocaleCompareIncToServiceRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/LocaleCompareIncToServiceRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/LocaleCompareIncToServiceRector/fixture/basic.php.inc diff --git a/config/drupal-11/drupal-11.4-deprecations.php b/config/drupal-11/drupal-11.4-deprecations.php index 18b3220e1..5d6606069 100644 --- a/config/drupal-11/drupal-11.4-deprecations.php +++ b/config/drupal-11/drupal-11.4-deprecations.php @@ -5,6 +5,7 @@ use DrupalRector\Drupal11\Rector\Deprecation\DeprecatedFilterFunctionsRector; use DrupalRector\Drupal11\Rector\Deprecation\FilterFormatFunctionsToServiceRector; use DrupalRector\Drupal11\Rector\Deprecation\GetOriginalClassToGetDecoratedClassesRector; +use DrupalRector\Drupal11\Rector\Deprecation\LocaleCompareIncToServiceRector; use DrupalRector\Drupal11\Rector\Deprecation\MediaFilterFormatEditFormValidateRector; use DrupalRector\Drupal11\Rector\Deprecation\NodeAccessRebuildFunctionsRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveAutomatedCronSubmitHandlerRector; @@ -406,4 +407,12 @@ $rectorConfig->ruleWithConfiguration(SystemRegionFunctionsRector::class, [ new DrupalIntroducedVersionConfiguration('11.4.0'), ]); + + // https://www.drupal.org/node/3037031 + // locale_translation_flush_projects(), locale_translation_build_projects(), locale_translation_check_projects(), + // and locale_translation_check_projects_local() deprecated in drupal:11.4.0, removed in drupal:13.0.0. + // Replaced by LocaleProjectRepository and LocaleProjectChecker service methods. + $rectorConfig->ruleWithConfiguration(LocaleCompareIncToServiceRector::class, [ + new DrupalIntroducedVersionConfiguration('11.4.0'), + ]); }; diff --git a/src/Drupal11/Rector/Deprecation/LocaleCompareIncToServiceRector.php b/src/Drupal11/Rector/Deprecation/LocaleCompareIncToServiceRector.php new file mode 100644 index 000000000..284c28116 --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/LocaleCompareIncToServiceRector.php @@ -0,0 +1,132 @@ +> */ + public function getNodeTypes(): array + { + return [FuncCall::class]; + } + + protected function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node + { + assert($node instanceof FuncCall); + + if (!$node->name instanceof Name) { + return null; + } + + return match ($node->name->toString()) { + 'locale_translation_flush_projects' => $this->buildServiceCall(self::LOCALE_PROJECT_REPOSITORY, 'deleteAll', $node->args), + 'locale_translation_build_projects' => $this->buildServiceCall(self::LOCALE_PROJECT_REPOSITORY, 'buildProjects', $node->args), + 'locale_translation_check_projects' => $this->buildCheckerCall('checkProjects', $node->args), + 'locale_translation_check_projects_local' => $this->buildCheckerCall('checkLocalProjects', $node->args), + default => null, + }; + } + + /** + * Builds a checker service call, expanding empty $projects to array_keys(getAll()). + * + * @param Arg[] $args + */ + private function buildCheckerCall(string $method, array $args): MethodCall + { + if (count($args) === 0) { + $getAll = new MethodCall( + $this->buildDrupalServiceCall(self::LOCALE_PROJECT_REPOSITORY), + 'getAll', + [] + ); + $args = [new Arg(new FuncCall(new Name('array_keys'), [new Arg($getAll)]))]; + } + + return $this->buildServiceCall(self::LOCALE_PROJECT_CHECKER, $method, $args); + } + + /** @param Arg[] $args */ + private function buildServiceCall(string $serviceClass, string $method, array $args): MethodCall + { + return new MethodCall($this->buildDrupalServiceCall($serviceClass), $method, $args); + } + + private function buildDrupalServiceCall(string $serviceClass): StaticCall + { + return new StaticCall( + new FullyQualified('Drupal'), + 'service', + [new Arg(new ClassConstFetch(new FullyQualified($serviceClass), 'class'))] + ); + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition( + 'Replace deprecated locale.compare.inc functions with LocaleProjectRepository and LocaleProjectChecker service methods.', + [ + new ConfiguredCodeSample( + 'locale_translation_flush_projects();', + '\Drupal::service(\Drupal\locale\LocaleProjectRepository::class)->deleteAll();', + [new DrupalIntroducedVersionConfiguration('11.4.0')] + ), + new ConfiguredCodeSample( + 'locale_translation_build_projects();', + '\Drupal::service(\Drupal\locale\LocaleProjectRepository::class)->buildProjects();', + [new DrupalIntroducedVersionConfiguration('11.4.0')] + ), + new ConfiguredCodeSample( + 'locale_translation_check_projects();', + '\Drupal::service(\Drupal\locale\LocaleProjectChecker::class)->checkProjects(array_keys(\Drupal::service(\Drupal\locale\LocaleProjectRepository::class)->getAll()));', + [new DrupalIntroducedVersionConfiguration('11.4.0')] + ), + new ConfiguredCodeSample( + "locale_translation_check_projects_local(['drupal'], ['de']);", + "\Drupal::service(\Drupal\locale\LocaleProjectChecker::class)->checkLocalProjects(['drupal'], ['de']);", + [new DrupalIntroducedVersionConfiguration('11.4.0')] + ), + ] + ); + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/LocaleCompareIncToServiceRector/LocaleCompareIncToServiceRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/LocaleCompareIncToServiceRector/LocaleCompareIncToServiceRectorTest.php new file mode 100644 index 000000000..2d1e708d8 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/LocaleCompareIncToServiceRector/LocaleCompareIncToServiceRectorTest.php @@ -0,0 +1,50 @@ +make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } + } + + /** @return \Iterator> */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } + } + + /** @return \Iterator> */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/LocaleCompareIncToServiceRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/LocaleCompareIncToServiceRector/config/configured_rule.php new file mode 100644 index 000000000..ca706b8a2 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/LocaleCompareIncToServiceRector/config/configured_rule.php @@ -0,0 +1,14 @@ + +----- + diff --git a/tests/src/Drupal11/Rector/Deprecation/LocaleCompareIncToServiceRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/LocaleCompareIncToServiceRector/fixture/basic.php.inc new file mode 100644 index 000000000..45cefcaa5 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/LocaleCompareIncToServiceRector/fixture/basic.php.inc @@ -0,0 +1,17 @@ + +----- + \Drupal::service(\Drupal\locale\LocaleProjectRepository::class)->deleteAll(), fn() => locale_translation_flush_projects()); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service(\Drupal\locale\LocaleProjectRepository::class)->buildProjects(), fn() => locale_translation_build_projects()); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service(\Drupal\locale\LocaleProjectChecker::class)->checkProjects(array_keys(\Drupal::service(\Drupal\locale\LocaleProjectRepository::class)->getAll())), fn() => locale_translation_check_projects()); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service(\Drupal\locale\LocaleProjectChecker::class)->checkProjects(['drupal'], ['de']), fn() => locale_translation_check_projects(['drupal'], ['de'])); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service(\Drupal\locale\LocaleProjectChecker::class)->checkLocalProjects(['drupal'], ['de']), fn() => locale_translation_check_projects_local(['drupal'], ['de'])); +?> From 2e4552e0b53b4e851f46aa89bff2b42abc16597e Mon Sep 17 00:00:00 2001 From: bjorn Date: Mon, 18 May 2026 16:00:45 +0200 Subject: [PATCH 219/256] feat: add ReplaceAddCachedDiscoveryMethodCallRector for Drupal issue #3432827 Replaces deprecated addMethodCall('addCachedDiscovery', [new Reference($id)]) calls on the plugin.cache_clearer service definition with the plugin_manager_cache_clear tag approach introduced in drupal:11.1.0. Adds Symfony DI stubs (Definition, ContainerBuilder, Reference) to support type-guard inference in tests. --- ...laceAddCachedDiscoveryMethodCallRector.php | 127 ++++++++++++++++++ .../DependencyInjection/ContainerBuilder.php | 14 ++ .../DependencyInjection/Definition.php | 16 +++ .../DependencyInjection/Reference.php | 14 ++ ...AddCachedDiscoveryMethodCallRectorTest.php | 50 +++++++ .../config/configured_rule.php | 14 ++ .../fixture-below-version/basic.php.inc | 23 ++++ .../fixture/basic.php.inc | 23 ++++ .../fixture/no_change_unrelated.php.inc | 11 ++ 9 files changed, 292 insertions(+) create mode 100644 src/Drupal11/Rector/Deprecation/ReplaceAddCachedDiscoveryMethodCallRector.php create mode 100644 stubs/Symfony/Component/DependencyInjection/ContainerBuilder.php create mode 100644 stubs/Symfony/Component/DependencyInjection/Definition.php create mode 100644 stubs/Symfony/Component/DependencyInjection/Reference.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceAddCachedDiscoveryMethodCallRector/ReplaceAddCachedDiscoveryMethodCallRectorTest.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceAddCachedDiscoveryMethodCallRector/config/configured_rule.php create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceAddCachedDiscoveryMethodCallRector/fixture-below-version/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceAddCachedDiscoveryMethodCallRector/fixture/basic.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplaceAddCachedDiscoveryMethodCallRector/fixture/no_change_unrelated.php.inc diff --git a/src/Drupal11/Rector/Deprecation/ReplaceAddCachedDiscoveryMethodCallRector.php b/src/Drupal11/Rector/Deprecation/ReplaceAddCachedDiscoveryMethodCallRector.php new file mode 100644 index 000000000..f8784b485 --- /dev/null +++ b/src/Drupal11/Rector/Deprecation/ReplaceAddCachedDiscoveryMethodCallRector.php @@ -0,0 +1,127 @@ +> */ + public function getNodeTypes(): array + { + return [MethodCall::class]; + } + + protected function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node + { + assert($node instanceof MethodCall); + + if (!$this->isName($node->name, 'addMethodCall')) { + return null; + } + + if (!$this->isObjectType($node->var, new ObjectType('Symfony\Component\DependencyInjection\Definition'))) { + return null; + } + + $args = $node->getArgs(); + if (count($args) < 2) { + return null; + } + + $firstArg = $args[0]->value; + if (!$firstArg instanceof String_ || $firstArg->value !== 'addCachedDiscovery') { + return null; + } + + $secondArg = $args[1]->value; + if (!$secondArg instanceof Node\Expr\Array_) { + return null; + } + + $serviceIdNode = null; + foreach ($secondArg->items as $item) { + $itemValue = $item->value; + if ($itemValue instanceof New_) { + $className = $itemValue->class; + if ($className instanceof Name) { + $shortName = $className->getLast(); + if ($shortName === 'Reference' && count($itemValue->getArgs()) >= 1) { + $serviceIdNode = $itemValue->getArgs()[0]->value; + break; + } + } + } + } + + if ($serviceIdNode === null) { + return null; + } + + $containerVar = new Variable('container'); + + $getDefinitionCall = new MethodCall( + $containerVar, + 'getDefinition', + [new Arg($serviceIdNode)] + ); + + return new MethodCall( + $getDefinitionCall, + 'addTag', + [new Arg(new String_('plugin_manager_cache_clear'))] + ); + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition( + "Replace deprecated \$def->addMethodCall('addCachedDiscovery', [new Reference(\$id)]) with \$container->getDefinition(\$id)->addTag('plugin_manager_cache_clear')", + [ + new ConfiguredCodeSample( + <<<'CODE_BEFORE' +$container->getDefinition('plugin.cache_clearer') + ->addMethodCall('addCachedDiscovery', [new Reference('my.plugin.manager')]); +CODE_BEFORE, + <<<'CODE_AFTER' +$container->getDefinition('my.plugin.manager')->addTag('plugin_manager_cache_clear'); +CODE_AFTER, + [new DrupalIntroducedVersionConfiguration('11.1.0')] + ), + ] + ); + } +} diff --git a/stubs/Symfony/Component/DependencyInjection/ContainerBuilder.php b/stubs/Symfony/Component/DependencyInjection/ContainerBuilder.php new file mode 100644 index 000000000..96247bd47 --- /dev/null +++ b/stubs/Symfony/Component/DependencyInjection/ContainerBuilder.php @@ -0,0 +1,14 @@ +make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } + } + + /** @return \Iterator> */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); + try { + $this->doTestFile($filePath); + } finally { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); + } + } + + /** @return \Iterator> */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceAddCachedDiscoveryMethodCallRector/config/configured_rule.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceAddCachedDiscoveryMethodCallRector/config/configured_rule.php new file mode 100644 index 000000000..5ddc0ad9e --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceAddCachedDiscoveryMethodCallRector/config/configured_rule.php @@ -0,0 +1,14 @@ +getDefinition('plugin.cache_clearer') + ->addMethodCall('addCachedDiscovery', [new Reference('my.plugin.manager')]); +} +?> +----- +getDefinition('plugin.cache_clearer') + ->addMethodCall('addCachedDiscovery', [new Reference('my.plugin.manager')]); +} +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceAddCachedDiscoveryMethodCallRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceAddCachedDiscoveryMethodCallRector/fixture/basic.php.inc new file mode 100644 index 000000000..88a652281 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceAddCachedDiscoveryMethodCallRector/fixture/basic.php.inc @@ -0,0 +1,23 @@ +getDefinition('plugin.cache_clearer') + ->addMethodCall('addCachedDiscovery', [new Reference('my.plugin.manager')]); +} +?> +----- + $container->getDefinition('my.plugin.manager')->addTag('plugin_manager_cache_clear'), fn() => $container->getDefinition('plugin.cache_clearer') + ->addMethodCall('addCachedDiscovery', [new Reference('my.plugin.manager')])); +} +?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceAddCachedDiscoveryMethodCallRector/fixture/no_change_unrelated.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplaceAddCachedDiscoveryMethodCallRector/fixture/no_change_unrelated.php.inc new file mode 100644 index 000000000..e31ebfc57 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceAddCachedDiscoveryMethodCallRector/fixture/no_change_unrelated.php.inc @@ -0,0 +1,11 @@ +addMethodCall('addCachedDiscovery', [new \Symfony\Component\DependencyInjection\Reference('my.plugin.manager')]); +?> +----- +addMethodCall('addCachedDiscovery', [new \Symfony\Component\DependencyInjection\Reference('my.plugin.manager')]); +?> From e9ad0adc6d3abc00a2fd954c0d694fb5b1b06d34 Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 21 May 2026 11:47:57 +0200 Subject: [PATCH 220/256] fix: HookConvertRector fix for void return type and add unit tests. --- src/Rector/Convert/HookConvertRector.php | 3 +- .../HookConvertRectorFixtureTest.php | 26 ++++ .../HookConvertRectorTest.php | 126 ++++++++++++++++++ .../Stub/TestHookConvertRector.php | 22 +++ .../config/configured_rule.php | 11 ++ .../hookconvertrector/bare_return.module.inc | 25 ++++ .../hookconvertrector.info.yml | 3 + .../hookconvertrector/no_return.module.inc | 22 +++ .../hookconvertrector/value_return.module.inc | 22 +++ .../void_return_type.module.inc | 22 +++ 10 files changed, 281 insertions(+), 1 deletion(-) create mode 100644 tests/src/Rector/Convert/HookConvertRector/HookConvertRectorFixtureTest.php create mode 100644 tests/src/Rector/Convert/HookConvertRector/HookConvertRectorTest.php create mode 100644 tests/src/Rector/Convert/HookConvertRector/Stub/TestHookConvertRector.php create mode 100644 tests/src/Rector/Convert/HookConvertRector/config/configured_rule.php create mode 100644 tests/src/Rector/Convert/HookConvertRector/fixture/hookconvertrector/bare_return.module.inc create mode 100644 tests/src/Rector/Convert/HookConvertRector/fixture/hookconvertrector/hookconvertrector.info.yml create mode 100644 tests/src/Rector/Convert/HookConvertRector/fixture/hookconvertrector/no_return.module.inc create mode 100644 tests/src/Rector/Convert/HookConvertRector/fixture/hookconvertrector/value_return.module.inc create mode 100644 tests/src/Rector/Convert/HookConvertRector/fixture/hookconvertrector/void_return_type.module.inc diff --git a/src/Rector/Convert/HookConvertRector.php b/src/Rector/Convert/HookConvertRector.php index 786298743..8358dd266 100644 --- a/src/Rector/Convert/HookConvertRector.php +++ b/src/Rector/Convert/HookConvertRector.php @@ -366,7 +366,8 @@ protected function getMethodName(Function_ $node): string public function getLegacyHookFunction(Function_ $node): Function_ { $methodCall = new Node\Expr\MethodCall($this->drupalServiceCall, $this->getMethodName($node), self::convertParamsToArgs($node)); - $hasReturn = (new NodeFinder())->findFirstInstanceOf([$node], Node\Stmt\Return_::class); + $isVoid = $node->returnType instanceof Node\Identifier && $node->returnType->toString() === 'void'; + $hasReturn = !$isVoid && (new NodeFinder())->findFirst([$node], fn (Node $n) => $n instanceof Node\Stmt\Return_ && $n->expr !== null); $node->stmts = [$hasReturn ? new Node\Stmt\Return_($methodCall) : new Node\Stmt\Expression($methodCall)]; // Mark this function as a legacy hook. $node->attrGroups[] = new Node\AttributeGroup([new Node\Attribute(new FullyQualified('Drupal\Core\Hook\Attribute\LegacyHook'))]); diff --git a/tests/src/Rector/Convert/HookConvertRector/HookConvertRectorFixtureTest.php b/tests/src/Rector/Convert/HookConvertRector/HookConvertRectorFixtureTest.php new file mode 100644 index 000000000..9baeabb5a --- /dev/null +++ b/tests/src/Rector/Convert/HookConvertRector/HookConvertRectorFixtureTest.php @@ -0,0 +1,26 @@ +doTestFile($filePath); + } + + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture', '*.module.inc'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Rector/Convert/HookConvertRector/HookConvertRectorTest.php b/tests/src/Rector/Convert/HookConvertRector/HookConvertRectorTest.php new file mode 100644 index 000000000..d05b5807f --- /dev/null +++ b/tests/src/Rector/Convert/HookConvertRector/HookConvertRectorTest.php @@ -0,0 +1,126 @@ +rector = new HookConvertRector($printer); + + $ref = new \ReflectionClass($this->rector); + + $module = $ref->getProperty('module'); + $module->setAccessible(true); + $module->setValue($this->rector, 'mymodule'); + + $classConst = new Node\Expr\ClassConstFetch( + new FullyQualified('Drupal\\mymodule\\Hook\\MymoduleHooks'), + 'class' + ); + $drupalServiceCall = new Node\Expr\StaticCall( + new FullyQualified('Drupal'), + 'service', + [new Node\Arg($classConst)] + ); + $dsc = $ref->getProperty('drupalServiceCall'); + $dsc->setAccessible(true); + $dsc->setValue($this->rector, $drupalServiceCall); + + $hookClass = $ref->getProperty('hookClass'); + $hookClass->setAccessible(true); + $hookClass->setValue($this->rector, new Class_(new Identifier('MymoduleHooks'))); + } + + private function parseFunction(string $code): Function_ + { + $stmts = (new ParserFactory())->createForNewestSupportedVersion()->parse($code); + foreach ($stmts as $stmt) { + if ($stmt instanceof Function_) { + return $stmt; + } + } + throw new \RuntimeException('No function found in code snippet.'); + } + + public function testExplicitVoidReturnTypeGeneratesExpression(): void + { + $fn = $this->parseFunction('rector->getLegacyHookFunction($fn); + $this->assertInstanceOf(Node\Stmt\Expression::class, $result->stmts[0]); + } + + public function testBareReturnGeneratesExpression(): void + { + $fn = $this->parseFunction('rector->getLegacyHookFunction($fn); + $this->assertInstanceOf(Node\Stmt\Expression::class, $result->stmts[0]); + } + + public function testValueReturnGeneratesReturnStatement(): void + { + $fn = $this->parseFunction('rector->getLegacyHookFunction($fn); + $this->assertInstanceOf(Node\Stmt\Return_::class, $result->stmts[0]); + } + + public function testNoReturnGeneratesExpression(): void + { + $fn = $this->parseFunction('block(); }'); + $result = $this->rector->getLegacyHookFunction($fn); + $this->assertInstanceOf(Node\Stmt\Expression::class, $result->stmts[0]); + } + + public function testLegacyHookAttributeIsAdded(): void + { + $fn = $this->parseFunction('rector->getLegacyHookFunction($fn); + + $found = false; + foreach ($result->attrGroups as $attrGroup) { + foreach ($attrGroup->attrs as $attr) { + if (str_ends_with((string) $attr->name, 'LegacyHook')) { + $found = true; + } + } + } + $this->assertTrue($found, 'Expected #[LegacyHook] attribute on the function.'); + } + + public function testReturnStatementForwardsMethodCall(): void + { + $fn = $this->parseFunction('rector->getLegacyHookFunction($fn); + + /** @var Node\Stmt\Return_ $returnStmt */ + $returnStmt = $result->stmts[0]; + $this->assertInstanceOf(Node\Expr\MethodCall::class, $returnStmt->expr); + } + + public function testExpressionStatementForwardsMethodCall(): void + { + $fn = $this->parseFunction('rector->getLegacyHookFunction($fn); + + /** @var Node\Stmt\Expression $exprStmt */ + $exprStmt = $result->stmts[0]; + $this->assertInstanceOf(Node\Expr\MethodCall::class, $exprStmt->expr); + } +} diff --git a/tests/src/Rector/Convert/HookConvertRector/Stub/TestHookConvertRector.php b/tests/src/Rector/Convert/HookConvertRector/Stub/TestHookConvertRector.php new file mode 100644 index 000000000..6b40e90be --- /dev/null +++ b/tests/src/Rector/Convert/HookConvertRector/Stub/TestHookConvertRector.php @@ -0,0 +1,22 @@ +.php and a services + * YAML file. Those writes are irrelevant to the transformation under test and + * would pollute the fixture directory, so this subclass skips them. + */ +final class TestHookConvertRector extends HookConvertRector +{ + public function __destruct() + { + $this->module = ''; + } +} diff --git a/tests/src/Rector/Convert/HookConvertRector/config/configured_rule.php b/tests/src/Rector/Convert/HookConvertRector/config/configured_rule.php new file mode 100644 index 000000000..6831d9093 --- /dev/null +++ b/tests/src/Rector/Convert/HookConvertRector/config/configured_rule.php @@ -0,0 +1,11 @@ +rule(TestHookConvertRector::class); + $rectorConfig->fileExtensions(['module']); +}; diff --git a/tests/src/Rector/Convert/HookConvertRector/fixture/hookconvertrector/bare_return.module.inc b/tests/src/Rector/Convert/HookConvertRector/fixture/hookconvertrector/bare_return.module.inc new file mode 100644 index 000000000..07d2cbcf4 --- /dev/null +++ b/tests/src/Rector/Convert/HookConvertRector/fixture/hookconvertrector/bare_return.module.inc @@ -0,0 +1,25 @@ + +----- +pageAttachments($page); +} +?> diff --git a/tests/src/Rector/Convert/HookConvertRector/fixture/hookconvertrector/hookconvertrector.info.yml b/tests/src/Rector/Convert/HookConvertRector/fixture/hookconvertrector/hookconvertrector.info.yml new file mode 100644 index 000000000..f8da32606 --- /dev/null +++ b/tests/src/Rector/Convert/HookConvertRector/fixture/hookconvertrector/hookconvertrector.info.yml @@ -0,0 +1,3 @@ +name: 'Hook Convert Rector' +type: module +core_version_requirement: ^10 || ^11 diff --git a/tests/src/Rector/Convert/HookConvertRector/fixture/hookconvertrector/no_return.module.inc b/tests/src/Rector/Convert/HookConvertRector/fixture/hookconvertrector/no_return.module.inc new file mode 100644 index 000000000..45d934017 --- /dev/null +++ b/tests/src/Rector/Convert/HookConvertRector/fixture/hookconvertrector/no_return.module.inc @@ -0,0 +1,22 @@ +block(); +} +?> +----- +userCancel($edit, $account, $method); +} +?> diff --git a/tests/src/Rector/Convert/HookConvertRector/fixture/hookconvertrector/value_return.module.inc b/tests/src/Rector/Convert/HookConvertRector/fixture/hookconvertrector/value_return.module.inc new file mode 100644 index 000000000..85194c2c3 --- /dev/null +++ b/tests/src/Rector/Convert/HookConvertRector/fixture/hookconvertrector/value_return.module.inc @@ -0,0 +1,22 @@ + +----- +nodeAccess($node, $op, $account); +} +?> diff --git a/tests/src/Rector/Convert/HookConvertRector/fixture/hookconvertrector/void_return_type.module.inc b/tests/src/Rector/Convert/HookConvertRector/fixture/hookconvertrector/void_return_type.module.inc new file mode 100644 index 000000000..2657d5918 --- /dev/null +++ b/tests/src/Rector/Convert/HookConvertRector/fixture/hookconvertrector/void_return_type.module.inc @@ -0,0 +1,22 @@ + +----- +cacheFlush(); +} +?> From d005aa9b93992f47fc1eddb83e5b0e3fcfc0f4a9 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 22 May 2026 13:33:26 +0200 Subject: [PATCH 221/256] chore: add REAME improvements and remove old doc generation that was deprecated by rector itself --- README.md | 162 ++---- composer.json | 1 - docs/rules_overview.md | 1195 ---------------------------------------- 3 files changed, 56 insertions(+), 1302 deletions(-) delete mode 100644 docs/rules_overview.md diff --git a/README.md b/README.md index e49660ce4..7842a644c 100644 --- a/README.md +++ b/README.md @@ -4,36 +4,30 @@ Automate fixing deprecated Drupal code. ## Status -[![Packagist Version](https://img.shields.io/packagist/v/palantirnet/drupal-rector)](https://packagist.org/packages/palantirnet/drupal-rector) ![Functional test: Rector examples](https://img.shields.io/github/actions/workflow/status/palantirnet/drupal-rector/functional_test__rector_examples.yml?logo=github&label=Functional%20tests) ![Unit tests](https://img.shields.io/github/actions/workflow/status/palantirnet/drupal-rector/phpunit.yml?logo=github&label=Unit%20tests) ![PHPStan](https://img.shields.io/github/actions/workflow/status/palantirnet/drupal-rector/phpstan.yml?logo=github&label=PHPStan) +[![Packagist Version](https://img.shields.io/packagist/v/palantirnet/drupal-rector)](https://packagist.org/packages/palantirnet/drupal-rector) ![Functional tests](https://img.shields.io/github/actions/workflow/status/palantirnet/drupal-rector/functional_test__single_rectors.yml?logo=github&label=Functional%20tests) ![Unit tests](https://img.shields.io/github/actions/workflow/status/palantirnet/drupal-rector/phpunit.yml?logo=github&label=Unit%20tests) ![PHPStan](https://img.shields.io/github/actions/workflow/status/palantirnet/drupal-rector/phpstan.yml?logo=github&label=PHPStan) -### Release notes - -* The 0.18.0 and higher releases of drupal-rector will include Rector 0.18+. The upgrade path should be as simple as re-copying the configuration file. `cp vendor/palantirnet/drupal-rector/rector.php`. - -* The 0.13.0 and higher releases of drupal-rector will include Rector 0.13.8+. The upgrade path should be as simple as re-copying the configuration file. `cp vendor/palantirnet/drupal-rector/rector.php` - -*Note that GitHub does not let us have different default homepage and merge branches. If you checked out the project using packagist/composer, read the docs for your version.* +If upgrading from an older version, refresh `rector.php` by copying from the vendor copy: `cp vendor/palantirnet/drupal-rector/rector.php .` ## Introduction -You can read more details in the following blog post: +Originally created to automate Drupal 9 upgrades; Drupal 8 and 9 rules are still included for legacy projects. You can read more details in the following blog post: https://www.palantir.net/blog/jumpstart-your-drupal-9-upgrade-drupal-rector ## Documentation -Development guides, individual deprecation overviews, and other resources can be found here: +Development guides and other resources: https://www.palantir.net/rector -List of all rules with examples: +Changelog and release history: -[Rule overview in docs/rules_overview.md](docs%2Frules_overview.md) +https://github.com/palantirnet/drupal-rector/releases ## Scope and limitations -The development of this tool is prioritized by the perceived impact of the deprecations and updates. There are many deprecations that often involve several components and for each of these there are several ways to address the deprecation. +Drupal 10 and 11 are the primary targets (Drupal 8/9 rules are included for legacy projects). The development of this tool is prioritized by the perceived impact of the deprecations and updates. There are many deprecations that often involve several components and for each of these there are several ways to address the deprecation. We've tried to determine impact based on: - The use of the deprecated functionality in the contributed modules on Drupal.org @@ -61,7 +55,7 @@ For contribution suggestions, please see the later section of this document. ## Installation -**NOTE**: To have the best experience with Drupal Rector, your Drupal site should be running version 8.9 or higher. +**NOTE**: To have the best experience with Drupal Rector, your Drupal site should be running Drupal 10 or higher. ### Install Drupal Rector inside a Drupal project. @@ -82,19 +76,19 @@ cp vendor/palantirnet/drupal-rector/rector.php . ``` By default, Drupal Rector will fix deprecated code for all versions of Drupal. If you want to change this behavior, modify -the sets used in the `rector.php` config. For example, if your site is still on Drupal 9.3, and you cannot fix deprecations -made in Drupal 9.4, use the following configuration: +the sets used in the `rector.php` config. For example, if your site is still on Drupal 10.3, and you cannot fix deprecations +made in Drupal 10.4, use the following configuration: ```php $rectorConfig->sets([ - Drupal9SetList::DRUPAL_90, - Drupal9SetList::DRUPAL_91, - Drupal9SetList::DRUPAL_92, - Drupal9SetList::DRUPAL_93, + Drupal10SetList::DRUPAL_100, + Drupal10SetList::DRUPAL_101, + Drupal10SetList::DRUPAL_102, + Drupal10SetList::DRUPAL_103, ]); ``` -This is more granular than the `Drupal9SetList::DRUPAL_9` set. +This is more granular than the `Drupal10SetList::DRUPAL_10` set. ### DrupalRectorSettings @@ -119,72 +113,51 @@ $rectorConfig->singleton(DrupalRectorSettings::class, fn () => ); ``` -## Suggested workflow +### Cleaning up BC wrappers (contrib modules) -1. Analyze your code with Rector and review suggested changes: - -```sh -$ vendor/bin/rector process web/modules/contrib/[YOUR_MODULE] --dry-run -``` +If you previously used backward-compatibility wrapping and have since raised your module's minimum supported Drupal version, use `DeprecationHelperRemoveRector` to strip the now-redundant wrappers. It replaces each `DeprecationHelper::backwardsCompatibleCall()` with the new API call directly, for any deprecation introduced before your configured minimum version. -2. Apply suggested changes: +```php +use DrupalRector\Rector\Deprecation\DeprecationHelperRemoveRector; +use DrupalRector\Rector\ValueObject\DeprecationHelperRemoveConfiguration; -```sh -$ vendor/bin/rector process web/modules/contrib/[YOUR_MODULE] +$rectorConfig->ruleWithConfiguration(DeprecationHelperRemoveRector::class, [ + new DeprecationHelperRemoveConfiguration('10.3.0'), +]); ``` -You can find more information about Rector [here](https://github.com/rectorphp/rector). - -## Troubleshooting - -### PhpStan composer issues - -You may need to upgrade `phpstan/phpstan` with Composer before installing this package. - -Rector itself has conflicts with older versions of PhpStan. - -### Unable to find Rector rule classes - -If you are getting errors like +With the above, a wrapper like: -`[ERROR] Class "DrupalRector\Drupal8\Rector\Deprecation\EntityManagerRector" was not found while loading` - -You may need to rebuild your autoload file. - -`composer dump-autoload` - -### FileLocator::locate() must be compatible with FileLocatorInterface::locate() - -If you are getting errors like - -``` -PHP Fatal error: Declaration of _HumbugBox3630ef99eac4\Symfony\Component\HttpKernel\Config\FileLocator::locate($file, $currentPath = NULL, $first = true) must be compatible with _HumbugBox3630ef99eac4\Symfony\Component\Config\FileLocatorInterface::locate(string $name, ?string $currentPath = NULL, bool $first = true) in phar:///var/www/html/vendor/rector/rector-prefixed/rector/vendor/symfony/http-kernel/Config/FileLocator.php on line 20 -Fatal error: Declaration of _HumbugBox3630ef99eac4\Symfony\Component\HttpKernel\Config\FileLocator::locate($file, $currentPath = NULL, $first = true) must be compatible with _HumbugBox3630ef99eac4\Symfony\Component\Config\FileLocatorInterface::locate(string $name, ?string $currentPath = NULL, bool $first = true) in phar:///var/www/html/vendor/rector/rector-prefixed/rector/vendor/symfony/http-kernel/Config/FileLocator.php on line 20 +```php +DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '9.1.0', + fn() => \Drupal::service('password_generator')->generate(), + fn() => user_password() +); ``` -You may need to check that you are -- Running `composer install` from an environment that supports Php 7.2 or greater -- Running Drupal Rector from an environment that supports Php 7.2 or greater +becomes: -Sometimes people install composer dependencies from one machine (host machine) and run Drupal Rector from another (such as a Lando VM). +```php +\Drupal::service('password_generator')->generate(); +``` -If you are having these issues try running Rector from the environment that has Php 7.2 or greater. Drupal Rector does not need a fully functional web server, it only (more or less) needs Php and access to a standard Drupal set of files. +Wrappers for deprecations introduced at or after your minimum version are left untouched. The rule is commented out in `rector.php` — uncomment and set the version when you are ready to clean up. -### Iconv error when running Rector in Alpine Docker +## Suggested workflow -If you are getting errors like +1. Analyze your code with Rector and review suggested changes: -`iconv(): Wrong charset, conversion from UTF-8 to ASCII//TRANSLIT//IGNORE is not allowed` +```sh +$ vendor/bin/rector process web/modules/contrib/[YOUR_MODULE] --dry-run +``` -You can fix it in Dockerfile with +2. Apply suggested changes: -``` -# fix work iconv library with alphine -RUN apk add --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/community/ --allow-untrusted gnu-libiconv -ENV LD_PRELOAD /usr/lib/preloadable_libiconv.so php +```sh +$ vendor/bin/rector process web/modules/contrib/[YOUR_MODULE] ``` -Credits to @zolotov88 in https://github.com/nunomaduro/phpinsights/issues/43#issuecomment-498108857 +You can find more information about Rector [here](https://github.com/rectorphp/rector). ## Development and contribution suggestions @@ -192,30 +165,22 @@ Thanks for your interest in contributing! Our goal is to make contributing to this project easy for people. While we've made certain architectural decisions here to hopefully achieve that goal, it's a work in progress and feedback is appreciated. -### Development environment - -See the instructions in [README](https://github.com/palantirnet/drupal-rector-sandbox/blob/master/README.md#developing-with-drupal-rector) - ### Adding a Rector rule If you would like to submit a Rector rule, we are looking for the following: -- A Rector rule class, see `/src/Rector/Deprecation` for existing rules -- An example file or files that show(s) the before and after, see `/rector_examples` and `/rector_examples_updated` -- An updated configuration file that registers the Rector rule, see `/config/drupal-8` -- A listing in the index file, see `/deprecation-index.yml` +- A Rector rule class, see `src/Rector/Deprecation` for existing rules. Copy an existing class as a starting point. +- A test class in `tests/src/Drupal{8,9,10,11}/Rector/` and fixture files in `tests/src/Drupal*/Rector/**/fixture/` +- An updated configuration file that registers the Rector rule, see `config/drupal-{8,9,10,11}/` #### Guides A few guides are currently available and we encourage people to create additional guides to provide their perspective and help us better understand this tool together. -##### Video guide on creating a rector rule -[https://www.palantir.net/rector/creating-drupal-rector-rule](https://www.palantir.net/rector/creating-drupal-rector-rule) - ##### Additional documentation and links [https://www.palantir.net/rector](https://www.palantir.net/rector) -#### Quick(?) overview +#### Quick overview ##### Create a Rector rule class @@ -226,40 +191,24 @@ Rector rules should be named after the deprecation, including the class name. We would like one Rector rule per deprecation. Some deprecations include updating multiple things and those would be separate rules. -To avoid duplication, we have created base classes for simple repeated patterns where possible. These end in `Base.php` and are located in `/src/Rector/Deprecation/Base`. In many of these rules, you will extend the base class, define class properties, add a class comment, and define the definition. - -Rector supports passing parameters to rules and you can also define your rules in a variety of ways. To avoid confusion for new developers, we're trying to avoid these advanced features so that someone with limited familiarity with the tool can easily determine where things are located and what they are doing. If the copy & paste challenge isn't worth this trade-off, we can re-evaluate it as we go. Suggestions appreciated. - -##### Create examples - -We are creating pairs of example files. - -These should be named the same thing as the deprecation. So, `DrupalUrlRector` has a `rector_examples/drupal_url.php` example. An example `rector_examples_updated/drupal_url.php` should also be created to show the updated code. You can run Drupal Rector on this file to show the update. +All drupal-rector rules extend `AbstractDrupalCoreRector` (found in `src/Rector/AbstractDrupalCoreRector.php`) rather than Rector's own `AbstractRector`. This base class provides three things automatically: -Example +- **Version gating** — skips the rule if the installed Drupal version predates the deprecation via `rectorShouldApplyToDrupalVersion()` +- **BC wrapping** — when backward-compatibility mode is enabled, wraps `Expr`→`Expr` results in `DeprecationHelper::backwardsCompatibleCall()` automatically +- **Configuration pattern** — you implement `refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration)` instead of `refactor()` -`DrupalUrlRector` -> `rector_examples/drupal_url.php` and `rector_examples_updated/drupal_url.php` +To avoid duplication, we have created base classes for simple repeated patterns where possible. These end in `Base.php` and are located in `src/Rector/Deprecation/Base`. In many of these rules, you will extend the base class, define class properties, add a class comment, and define the definition. -If you would like to show how the code is used in a class, you can add the class to the appropriate place in the `/rector_examples/src` or `/rector_examples/test` directories. Most of the examples in the example module are `services` in that they are stand alone classes. - -Since these classes can use static calls, dependency injection, or traits to get access to services, constants, etc, we have added more details to some class names. For example, `*Static` to indicate that the class is not using dependency injection. - -Example - -`DrupalUrlRector` -> `rector_examples/src/DrupalUrlStatic.php` and `rector_examples_updated/src/DrupalUrlStatic.php` +Rector supports passing parameters to rules and you can also define your rules in a variety of ways. To avoid confusion for new developers, we're trying to avoid these advanced features so that someone with limited familiarity with the tool can easily determine where things are located and what they are doing. If the copy & paste challenge isn't worth this trade-off, we can re-evaluate it as we go. Suggestions appreciated. ##### Create / Update a configuration file -The configuration files in `/config/drupal-8` are broken down by Drupal minor versions. +The configuration files in `config/drupal-{8,9,10,11}/` are broken down by Drupal minor versions. -Add your Rector rule to the relevant file. +Add your Rector rule to the relevant file. Always add a comment with a link to the issue and change record. The key is the fully qualified class name of the Rector rule. The key is the yaml null value `~`. -##### Update the index file - -The index file is used in part to provide automated updates to https://dev.acquia.com/drupal9/deprecation_status/errors which is a helpful way to track coverage. The `PHPStan` messages are listed there as well as in the change record comments throughout the Drupal codebase. - ## Pinning dev dependencies If there are conflicts with Rector, the package version can be conflicted with `conflict` on `rector/rector` and `phpstan/phpstan`. @@ -269,5 +218,6 @@ If there are conflicts with Rector, the package version can be conflicted with ` ## Credits +Current development is sponsored by [SWIS.nl](https://www.swis.nl).
Current development is sponsored by [Palantir.net](https://www.palantir.net).
Initial development is sponsored by [Pronovix](https://pronovix.com). diff --git a/composer.json b/composer.json index f202b80f8..b9a23bdb6 100644 --- a/composer.json +++ b/composer.json @@ -87,7 +87,6 @@ "symplify/vendor-patches": "^12.0.6" }, "scripts": { - "docs": "composer remove friendsofphp/php-cs-fixer --dev && composer require symplify/rule-doc-generator --dev && vendor/bin/rule-doc-generator generate src/ --categorize=3 && composer remove symplify/rule-doc-generator --dev && composer require friendsofphp/php-cs-fixer --dev", "test": "vendor/bin/phpunit", "phpstan": "vendor/bin/phpstan analyse --memory-limit=2G", "check-style": "vendor/bin/php-cs-fixer check", diff --git a/docs/rules_overview.md b/docs/rules_overview.md deleted file mode 100644 index 26260dee3..000000000 --- a/docs/rules_overview.md +++ /dev/null @@ -1,1195 +0,0 @@ -# 56 Rules Overview - -
- -## Categories - -- [Drupal10](#drupal10) (4) - -- [Drupal8](#drupal8) (18) - -- [Drupal9](#drupal9) (26) - -- [DrupalRector](#drupalrector) (8) - -
- -## Drupal10 - -### AnnotationToAttributeRector - -Change annotations with value to attribute - -:wrench: **configure it!** - -- class: [`DrupalRector\Drupal10\Rector\Deprecation\AnnotationToAttributeRector`](../src/Drupal10/Rector/Deprecation/AnnotationToAttributeRector.php) - -```diff - namespace Drupal\Core\Action\Plugin\Action; - -+use Drupal\Core\Action\Plugin\Action\Derivative\EntityPublishedActionDeriver; -+use Drupal\Core\Action\Attribute\Action; - use Drupal\Core\Session\AccountInterface; -+use Drupal\Core\StringTranslation\TranslatableMarkup; - - /** - * Publishes an entity. -- * -- * @Action( -- * id = "entity:publish_action", -- * action_label = @Translation("Publish"), -- * deriver = "Drupal\Core\Action\Plugin\Action\Derivative\EntityPublishedActionDeriver", -- * ) - */ -+#[Action( -+ id: 'entity:publish_action', -+ action_label: new TranslatableMarkup('Publish'), -+ deriver: EntityPublishedActionDeriver::class -+)] - class PublishAction extends EntityActionBase { -``` - -
- -### SystemTimeZonesRector - -Fixes deprecated `system_time_zones()` calls - -:wrench: **configure it!** - -- class: [`DrupalRector\Drupal10\Rector\Deprecation\SystemTimeZonesRector`](../src/Drupal10/Rector/Deprecation/SystemTimeZonesRector.php) - -```diff --system_time_zones(); --system_time_zones(FALSE, TRUE); --system_time_zones(NULL, FALSE); --system_time_zones(TRUE, FALSE); -+\Drupal\Core\Datetime\TimeZoneFormHelper::getOptionsList(); -+\Drupal\Core\Datetime\TimeZoneFormHelper::getOptionsListByRegion(); -+\Drupal\Core\Datetime\TimeZoneFormHelper::getOptionsList(NULL); -+\Drupal\Core\Datetime\TimeZoneFormHelper::getOptionsList(TRUE); -``` - -
- -### WatchdogExceptionRector - -Fixes deprecated watchdog_exception('update', `$exception)` calls - -:wrench: **configure it!** - -- class: [`DrupalRector\Drupal10\Rector\Deprecation\WatchdogExceptionRector`](../src/Drupal10/Rector/Deprecation/WatchdogExceptionRector.php) - -```diff --watchdog_exception('update', $exception); -+use \Drupal\Core\Utility\Error; -+$logger = \Drupal::logger('update'); -+Error::logException($logger, $exception); -``` - -
- -## Drupal8 - -### DBRector - -Fixes deprecated `db_delete()` calls - -:wrench: **configure it!** - -- class: [`DrupalRector\Drupal8\Rector\Deprecation\DBRector`](../src/Drupal8/Rector/Deprecation/DBRector.php) - -```diff --db_delete($table, $options); -+\Drupal::database()->delete($table, $options); -``` - -
- -```diff --db_insert($table, $options); -+\Drupal::database()->insert($table, $options); -``` - -
- -```diff --db_query($query, $args, $options); -+\Drupal::database()->query($query, $args, $options); -``` - -
- -```diff --db_select($table, $alias, $options); -+\Drupal::database()->select($table, $alias, $options); -``` - -
- -```diff --db_update($table, $options); -+\Drupal::database()->update($table, $options); -``` - -
- -### DrupalLRector - -Fixes deprecated `\Drupal::l()` calls - -- class: [`DrupalRector\Drupal8\Rector\Deprecation\DrupalLRector`](../src/Drupal8/Rector/Deprecation/DrupalLRector.php) - -```diff --\Drupal::l('User Login', \Drupal\Core\Url::fromRoute('user.login')); -+\Drupal\Core\Link::fromTextAndUrl('User Login', \Drupal\Core\Url::fromRoute('user.login')); -``` - -
- -### DrupalServiceRenameRector - -Renames the IDs in `Drupal::service()` calls - -:wrench: **configure it!** - -- class: [`DrupalRector\Drupal8\Rector\Deprecation\DrupalServiceRenameRector`](../src/Drupal8/Rector/Deprecation/DrupalServiceRenameRector.php) - -```diff --\Drupal::service('old')->foo(); -+\Drupal::service('bar')->foo(); -``` - -
- -### DrupalSetMessageRector - -Fixes deprecated `drupal_set_message()` calls - -- class: [`DrupalRector\Drupal8\Rector\Deprecation\DrupalSetMessageRector`](../src/Drupal8/Rector/Deprecation/DrupalSetMessageRector.php) - -```diff --drupal_set_message('example status', 'status'); -+\Drupal::messenger()->addStatus('example status'); -``` - -
- -### DrupalURLRector - -Fixes deprecated `\Drupal::url()` calls - -- class: [`DrupalRector\Drupal8\Rector\Deprecation\DrupalURLRector`](../src/Drupal8/Rector/Deprecation/DrupalURLRector.php) - -```diff --\Drupal::url('user.login'); -+\Drupal\Core\Url::fromRoute('user.login')->toString(); -``` - -
- -### EntityCreateRector - -Fixes deprecated `entity_create()` calls - -- class: [`DrupalRector\Drupal8\Rector\Deprecation\EntityCreateRector`](../src/Drupal8/Rector/Deprecation/EntityCreateRector.php) - -```diff --entity_create('node', ['bundle' => 'page', 'title' => 'Hello world']); -+\Drupal::service('entity_type.manager)->getStorage('node')->create(['bundle' => 'page', 'title' => 'Hello world']); -``` - -
- -### EntityDeleteMultipleRector - -Fixes deprecated `entity_delete_multiple()` calls - -- class: [`DrupalRector\Drupal8\Rector\Deprecation\EntityDeleteMultipleRector`](../src/Drupal8/Rector/Deprecation/EntityDeleteMultipleRector.php) - -```diff --entity_delete_multiple('node', [1, 2, 42]); -+\Drupal::service('entity_type.manager')->getStorage('node')->delete(\Drupal::service('entity_type.manager')->getStorage('node')->loadMultiple(1, 2, 42)); -``` - -
- -### EntityInterfaceLinkRector - -Fixes deprecated `link()` calls - -- class: [`DrupalRector\Drupal8\Rector\Deprecation\EntityInterfaceLinkRector`](../src/Drupal8/Rector/Deprecation/EntityInterfaceLinkRector.php) - -```diff --$url = $entity->link(); -+$url = $entity->toLink()->toString(); -``` - -
- -### EntityLoadRector - -Fixes deprecated `ENTITY_TYPE_load()` or `entity_load()` use - -:wrench: **configure it!** - -- class: [`DrupalRector\Drupal8\Rector\Deprecation\EntityLoadRector`](../src/Drupal8/Rector/Deprecation/EntityLoadRector.php) - -```diff --$entity = ENTITY_TYPE_load(123); --$node = entity_load('node', 123); -+$entity = \Drupal::entityManager()->getStorage('ENTITY_TYPE')->load(123); -+$node = \Drupal::entityManager()->getStorage('node')->load(123); -``` - -
- -### EntityManagerRector - -Fixes deprecated `\Drupal::entityManager()` calls - -- class: [`DrupalRector\Drupal8\Rector\Deprecation\EntityManagerRector`](../src/Drupal8/Rector/Deprecation/EntityManagerRector.php) - -```diff --$entity_manager = \Drupal::entityManager(); -+$entity_manager = \Drupal::entityTypeManager(); -``` - -
- -### EntityViewRector - -Fixes deprecated `entity_view()` use - -- class: [`DrupalRector\Drupal8\Rector\Deprecation\EntityViewRector`](../src/Drupal8/Rector/Deprecation/EntityViewRector.php) - -```diff --$rendered = entity_view($entity, 'default'); -+$rendered = \Drupal::entityTypeManager()->getViewBuilder($entity -+ ->getEntityTypeId())->view($entity, 'default'); -``` - -
- -### FileDefaultSchemeRector - -Fixes deprecated file_default_scheme calls - -- class: [`DrupalRector\Drupal8\Rector\Deprecation\FileDefaultSchemeRector`](../src/Drupal8/Rector/Deprecation/FileDefaultSchemeRector.php) - -```diff --$file_default_scheme = file_default_scheme(); -+$file_default_scheme = \Drupal::config('system.file')->get('default_scheme'); -``` - -
- -### FunctionalTestDefaultThemePropertyRector - -Adds `$defaultTheme` property to Functional and FunctionalJavascript tests which do not have them. - -- class: [`DrupalRector\Drupal8\Rector\Deprecation\FunctionalTestDefaultThemePropertyRector`](../src/Drupal8/Rector/Deprecation/FunctionalTestDefaultThemePropertyRector.php) - -```diff - class SomeClassTest { -+ protected $defaultTheme = 'stark' - } -``` - -
- -### GetMockRector - -Fixes deprecated `getMock()` calls - -:wrench: **configure it!** - -- class: [`DrupalRector\Drupal8\Rector\Deprecation\GetMockRector`](../src/Drupal8/Rector/Deprecation/GetMockRector.php) - -```diff --$this->entityTypeManager = $this->getMock(EntityTypeManagerInterface::class); -+$this->entityTypeManager = $this->createMock(EntityTypeManagerInterface::class); -``` - -
- -### LinkGeneratorTraitLRector - -Fixes deprecated `l()` calls - -- class: [`DrupalRector\Drupal8\Rector\Deprecation\LinkGeneratorTraitLRector`](../src/Drupal8/Rector/Deprecation/LinkGeneratorTraitLRector.php) - -```diff --$this->l($text, $url); -+\Drupal\Core\Link::fromTextAndUrl($text, $url); -``` - -
- -### RequestTimeConstRector - -Fixes deprecated REQUEST_TIME calls - -- class: [`DrupalRector\Drupal8\Rector\Deprecation\RequestTimeConstRector`](../src/Drupal8/Rector/Deprecation/RequestTimeConstRector.php) - -```diff --$request_time = REQUEST_TIME; -+$request_time = \Drupal::time()->getRequestTime(); -``` - -
- -### SafeMarkupFormatRector - -Fixes deprecated `SafeMarkup::format()` calls - -- class: [`DrupalRector\Drupal8\Rector\Deprecation\SafeMarkupFormatRector`](../src/Drupal8/Rector/Deprecation/SafeMarkupFormatRector.php) - -```diff --$safe_string_markup_object = \Drupal\Component\Utility\SafeMarkup::format('hello world'); -+$safe_string_markup_object = new \Drupal\Component\Render\FormattableMarkup('hello world'); -``` - -
- -### StaticToFunctionRector - -Fixes deprecated `\Drupal\Component\Utility\Unicode::strlen()` calls - -:wrench: **configure it!** - -- class: [`DrupalRector\Drupal8\Rector\Deprecation\StaticToFunctionRector`](../src/Drupal8/Rector/Deprecation/StaticToFunctionRector.php) - -```diff --$length = \Drupal\Component\Utility\Unicode::strlen('example'); -+$length = mb_strlen('example'); -``` - -
- -```diff --$string = \Drupal\Component\Utility\Unicode::strtolower('example'); -+$string = mb_strtolower('example'); -``` - -
- -```diff --$string = \Drupal\Component\Utility\Unicode::substr('example', 0, 2); -+$string = mb_substr('example', 0, 2); -``` - -
- -## Drupal9 - -### AssertFieldByIdRector - -Fixes deprecated `AssertLegacyTrait::assertFieldById()` calls - -- class: [`DrupalRector\Drupal9\Rector\Deprecation\AssertFieldByIdRector`](../src/Drupal9/Rector/Deprecation/AssertFieldByIdRector.php) - -```diff --$this->assertFieldById('edit-name', NULL); -- $this->assertFieldById('edit-name', 'Test name'); -- $this->assertFieldById('edit-description', NULL); -- $this->assertFieldById('edit-description'); -+$this->assertSession()->fieldExists('edit-name'); -+ $this->assertSession()->fieldValueEquals('edit-name', 'Test name'); -+ $this->assertSession()->fieldExists('edit-description'); -+ $this->assertSession()->fieldValueEquals('edit-description', ''); -``` - -
- -### AssertFieldByNameRector - -Fixes deprecated `AssertLegacyTrait::assertFieldByName()` calls - -- class: [`DrupalRector\Drupal9\Rector\Deprecation\AssertFieldByNameRector`](../src/Drupal9/Rector/Deprecation/AssertFieldByNameRector.php) - -```diff --$this->assertFieldByName('field_name', 'expected_value'); --$this->assertFieldByName("field_name[0][value][date]", '', 'Date element found.'); --$this->assertFieldByName("field_name[0][value][time]", null, 'Time element found.'); -+$this->assertSession()->fieldValueEquals('field_name', 'expected_value'); -+$this->assertSession()->fieldValueEquals("field_name[0][value][date]", ''); -+$this->assertSession()->fieldExists("field_name[0][value][time]"); -``` - -
- -### AssertLegacyTraitRector - -Fixes deprecated `AssertLegacyTrait::METHOD()` calls - -:wrench: **configure it!** - -- class: [`DrupalRector\Drupal9\Rector\Deprecation\AssertLegacyTraitRector`](../src/Drupal9/Rector/Deprecation/AssertLegacyTraitRector.php) - -```diff --$this->assertLinkByHref('user/1/translations'); -+$this->assertSession()->linkByHrefExists('user/1/translations'); -``` - -
- -```diff --$this->assertLink('Anonymous comment title'); -+$this->assertSession()->linkExists('Anonymous comment title'); -``` - -
- -```diff --$this->assertNoEscaped('
'); -+$this->assertSession()->assertNoEscaped('
'); -``` - -
- -```diff --$this->assertNoFieldChecked('edit-settings-view-mode', 'default'); -+$this->assertSession()->checkboxNotChecked('edit-settings-view-mode', 'default'); -``` - -
- -```diff --$this->assertNoField('files[upload]', 'Found file upload field.'); -+$this->assertSession()->fieldNotExists('files[upload]', 'Found file upload field.'); -``` - -
- -```diff --$this->assertNoLinkByHref('user/2/translations'); -+$this->assertSession()->linkByHrefNotExists('user/2/translations'); -``` - -
- -```diff --$this->assertNoLink('Anonymous comment title'); -+$this->assertSession()->linkNotExists('Anonymous comment title'); -``` - -
- -```diff --$this->assertNoOption('edit-settings-view-mode', 'default'); -+$this->assertSession()->optionNotExists('edit-settings-view-mode', 'default'); -``` - -
- -```diff --$this->assertNoPattern('|]*>|', 'No empty H4 element found.'); -+$this->assertSession()->responseNotMatches('|]*>|', 'No empty H4 element found.'); -``` - -
- -```diff --$this->assertPattern('|]*>|', 'No empty H4 element found.'); -+$this->assertSession()->responseMatches('|]*>|', 'No empty H4 element found.'); -``` - -
- -```diff --$this->assertNoRaw('bartik/logo.svg'); -+$this->assertSession()->responseNotContains('bartik/logo.svg'); -``` - -
- -```diff --$this->assertRaw('bartik/logo.svg'); -+$this->assertSession()->responseContains('bartik/logo.svg'); -``` - -
- -### AssertNoFieldByIdRector - -Fixes deprecated `AssertLegacyTrait::assertNoFieldById()` calls - -- class: [`DrupalRector\Drupal9\Rector\Deprecation\AssertNoFieldByIdRector`](../src/Drupal9/Rector/Deprecation/AssertNoFieldByIdRector.php) - -```diff --$this->assertNoFieldById('name'); -- $this->assertNoFieldById('name', 'not the value'); -- $this->assertNoFieldById('notexisting', NULL); -+$this->assertSession()->assertNoFieldById('name'); -+ $this->assertSession()->fieldValueNotEquals('name', 'not the value'); -+ $this->assertSession()->fieldNotExists('notexisting'); -``` - -
- -### AssertNoFieldByNameRector - -Fixes deprecated `AssertLegacyTrait::assertNoFieldByName()` calls - -- class: [`DrupalRector\Drupal9\Rector\Deprecation\AssertNoFieldByNameRector`](../src/Drupal9/Rector/Deprecation/AssertNoFieldByNameRector.php) - -```diff --$this->assertNoFieldByName('name'); -- $this->assertNoFieldByName('name', 'not the value'); -- $this->assertNoFieldByName('notexisting'); -- $this->assertNoFieldByName('notexisting', NULL); -+$this->assertSession()->fieldValueNotEquals('name', ''); -+ $this->assertSession()->fieldValueNotEquals('name', 'not the value'); -+ $this->assertSession()->fieldValueNotEquals('notexisting', ''); -+ $this->assertSession()->fieldNotExists('notexisting'); -``` - -
- -### AssertNoUniqueTextRector - -Fixes deprecated `AssertLegacyTrait::assertNoUniqueText()` calls - -- class: [`DrupalRector\Drupal9\Rector\Deprecation\AssertNoUniqueTextRector`](../src/Drupal9/Rector/Deprecation/AssertNoUniqueTextRector.php) - -```diff --$this->assertNoUniqueText('Duplicated message'); -+$page_text = $this->getSession()->getPage()->getText(); -+$nr_found = substr_count($page_text, 'Duplicated message'); -+$this->assertGreaterThan(1, $nr_found, "'Duplicated message' found more than once on the page"); -``` - -
- -### AssertOptionSelectedRector - -Fixes deprecated `AssertLegacyTrait::assertOptionSelected()` calls - -- class: [`DrupalRector\Drupal9\Rector\Deprecation\AssertOptionSelectedRector`](../src/Drupal9/Rector/Deprecation/AssertOptionSelectedRector.php) - -```diff --$this->assertOptionSelected('options', 2); -+$this->assertTrue($this->assertSession()->optionExists('options', 2)->hasAttribute('selected')); -``` - -
- -### ConstructFieldXpathRector - -Fixes deprecated `AssertLegacyTrait::constructFieldXpath()` calls - -- class: [`DrupalRector\Drupal9\Rector\Deprecation\ConstructFieldXpathRector`](../src/Drupal9/Rector/Deprecation/ConstructFieldXpathRector.php) - -```diff --$this->constructFieldXpath('id', 'edit-preferred-admin-langcode'); -+$this->getSession()->getPage()->findField('edit-preferred-admin-langcode'); -``` - -
- -### ExtensionPathRector - -Fixes deprecated `drupal_get_filename()` calls - -:wrench: **configure it!** - -- class: [`DrupalRector\Drupal9\Rector\Deprecation\ExtensionPathRector`](../src/Drupal9/Rector/Deprecation/ExtensionPathRector.php) - -```diff --drupal_get_filename('module', 'node'); --drupal_get_filename('theme', 'seven'); --drupal_get_filename('profile', 'standard'); -+\Drupal::service('extension.list.module')->getPathname('node'); -+\Drupal::service('extension.list.theme')->getPathname('seven'); -+\Drupal::service('extension.list.profile')->getPathname('standard'); -``` - -
- -```diff --drupal_get_path('module', 'node'); --drupal_get_path('theme', 'seven'); --drupal_get_path('profile', 'standard'); -+\Drupal::service('extension.list.module')->getPath('node'); -+\Drupal::service('extension.list.theme')->getPath('seven'); -+\Drupal::service('extension.list.profile')->getPath('standard'); -``` - -
- -### FileBuildUriRector - -Fixes deprecated `file_build_uri()` calls - -- class: [`DrupalRector\Drupal9\Rector\Deprecation\FileBuildUriRector`](../src/Drupal9/Rector/Deprecation/FileBuildUriRector.php) - -```diff --$uri1 = file_build_uri('path/to/file.txt'); -+$uri1 = \Drupal::service('stream_wrapper_manager')->normalizeUri(\Drupal::config('system.file')->get('default_scheme') . ('://' . 'path/to/file.txt')); - $path = 'path/to/other/file.png'; --$uri2 = file_build_uri($path); -+$uri2 = \Drupal::service('stream_wrapper_manager')->normalizeUri(\Drupal::config('system.file')->get('default_scheme') . ('://' . $path)); -``` - -
- -### FileCreateUrlRector - -Fixes deprecated `file_create_url()` calls - -- class: [`DrupalRector\Drupal9\Rector\Deprecation\FileCreateUrlRector`](../src/Drupal9/Rector/Deprecation/FileCreateUrlRector.php) - -```diff --file_create_url($uri); -+\Drupal::service('file_url_generator')->generateAbsoluteString($uri); -``` - -
- -### FileUrlTransformRelativeRector - -Fixes deprecated `file_url_transform_relative()` calls - -- class: [`DrupalRector\Drupal9\Rector\Deprecation\FileUrlTransformRelativeRector`](../src/Drupal9/Rector/Deprecation/FileUrlTransformRelativeRector.php) - -```diff --file_url_transform_relative($uri); -+\Drupal::service('file_url_generator')->transformRelative($uri); -``` - -
- -### FromUriRector - -Fixes deprecated `file_create_url()` calls from `\Drupal\Core\Url::fromUri().` - -- class: [`DrupalRector\Drupal9\Rector\Deprecation\FromUriRector`](../src/Drupal9/Rector/Deprecation/FromUriRector.php) - -```diff --\Drupal\Core\Url::fromUri(file_create_url($uri)); -+\Drupal::service('file_url_generator')->generate($uri); -``` - -
- -### FunctionToEntityTypeStorageMethod - -Refactor function call to an entity storage method - -:wrench: **configure it!** - -- class: [`DrupalRector\Drupal9\Rector\Deprecation\FunctionToEntityTypeStorageMethod`](../src/Drupal9/Rector/Deprecation/FunctionToEntityTypeStorageMethod.php) - -```diff --taxonomy_terms_static_reset(); -+\Drupal::entityTypeManager()->getStorage('taxonomy_term')->resetCache(); - --taxonomy_vocabulary_static_reset($vids); -+\Drupal::entityTypeManager()->getStorage('taxonomy_vocabulary')->resetCache($vids); -``` - -
- -### FunctionToFirstArgMethodRector - -Fixes deprecated `taxonomy_implode_tags()` calls - -:wrench: **configure it!** - -- class: [`DrupalRector\Drupal9\Rector\Deprecation\FunctionToFirstArgMethodRector`](../src/Drupal9/Rector/Deprecation/FunctionToFirstArgMethodRector.php) - -```diff --$url = taxonomy_term_uri($term); --$name = taxonomy_term_title($term); -+$url = $term->toUrl(); -+$name = $term->label(); -``` - -
- -### GetAllOptionsRector - -Fixes deprecated `AssertLegacyTrait::getAllOptions()` calls - -- class: [`DrupalRector\Drupal9\Rector\Deprecation\GetAllOptionsRector`](../src/Drupal9/Rector/Deprecation/GetAllOptionsRector.php) - -```diff - $this->drupalGet('/form-test/select'); -- $this->assertCount(6, $this->getAllOptions($this->cssSelect('select[name="opt_groups"]')[0])); -+ $this->assertCount(6, $this->cssSelect('select[name="opt_groups"]')[0]->findAll('xpath', '//option')); -``` - -
- -### GetRawContentRector - -Fixes deprecated `AssertLegacyTrait::getRawContent()` calls - -- class: [`DrupalRector\Drupal9\Rector\Deprecation\GetRawContentRector`](../src/Drupal9/Rector/Deprecation/GetRawContentRector.php) - -```diff --$this->getRawContent(); -+$this->getSession()->getPage()->getContent(); -``` - -
- -### ModuleLoadRector - -Fixes deprecated `module_load_install()` calls - -- class: [`DrupalRector\Drupal9\Rector\Deprecation\ModuleLoadRector`](../src/Drupal9/Rector/Deprecation/ModuleLoadRector.php) - -```diff --module_load_install('example'); -+\Drupal::moduleHandler()->loadInclude('example', 'install'); - $type = 'install'; - $module = 'example'; - $name = 'name'; --module_load_include($type, $module, $name); --module_load_include($type, $module); -+\Drupal::moduleHandler()->loadInclude($module, $type, $name); -+\Drupal::moduleHandler()->loadInclude($module, $type); -``` - -
- -### PassRector - -Fixes deprecated `AssertLegacyTrait::pass()` calls - -- class: [`DrupalRector\Drupal9\Rector\Deprecation\PassRector`](../src/Drupal9/Rector/Deprecation/PassRector.php) - -```diff --// Check for pass --$this->pass('The whole transaction is rolled back when a duplicate key insert occurs.'); -+// Check for pass -``` - -
- -### ProtectedStaticModulesPropertyRector - -"public static `$modules"` will have its visibility changed to protected. - -- class: [`DrupalRector\Drupal9\Rector\Property\ProtectedStaticModulesPropertyRector`](../src/Drupal9/Rector/Property/ProtectedStaticModulesPropertyRector.php) - -```diff - class SomeClassTest { -- public static $modules = []; -+ protected static $modules = []; - } -``` - -
- -### SystemSortByInfoNameRector - -Fixes deprecated `system_sort_modules_by_info_name()` calls - -- class: [`DrupalRector\Drupal9\Rector\Deprecation\SystemSortByInfoNameRector`](../src/Drupal9/Rector/Deprecation/SystemSortByInfoNameRector.php) - -```diff --uasort($modules, 'system_sort_modules_by_info_name'); -+uasort($modules, [ModuleExtensionList::class, 'sortByName']); -``` - -
- -### TaxonomyTermLoadMultipleByNameRector - -Refactor function call to an entity storage method - -- class: [`DrupalRector\Drupal9\Rector\Deprecation\TaxonomyTermLoadMultipleByNameRector`](../src/Drupal9/Rector/Deprecation/TaxonomyTermLoadMultipleByNameRector.php) - -```diff --$terms = taxonomy_term_load_multiple_by_name( -- 'Foo', -- 'topics' --); -+$terms = \Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadByProperties([ -+ 'name' => 'Foo', -+ 'vid' => 'topics', -+]); -``` - -
- -### TaxonomyVocabularyGetNamesDrupalStaticResetRector - -Refactor drupal_static_reset('taxonomy_vocabulary_get_names') to entity storage reset cache - -- class: [`DrupalRector\Drupal9\Rector\Deprecation\TaxonomyVocabularyGetNamesDrupalStaticResetRector`](../src/Drupal9/Rector/Deprecation/TaxonomyVocabularyGetNamesDrupalStaticResetRector.php) - -```diff --drupal_static_reset('taxonomy_vocabulary_get_names'); -+\Drupal::entityTypeManager()->getStorage('taxonomy_vocabulary')->resetCache(); -``` - -
- -### TaxonomyVocabularyGetNamesRector - -Refactor function call to an entity storage method - -- class: [`DrupalRector\Drupal9\Rector\Deprecation\TaxonomyVocabularyGetNamesRector`](../src/Drupal9/Rector/Deprecation/TaxonomyVocabularyGetNamesRector.php) - -```diff --$vids = taxonomy_vocabulary_get_names(); -+$vids = \Drupal::entityQuery('taxonomy_vocabulary')->execute(); -``` - -
- -### UiHelperTraitDrupalPostFormRector - -Fixes deprecated `UiHelperTrait::drupalPostForm()` calls - -- class: [`DrupalRector\Drupal9\Rector\Deprecation\UiHelperTraitDrupalPostFormRector`](../src/Drupal9/Rector/Deprecation/UiHelperTraitDrupalPostFormRector.php) - -```diff - $edit = []; - $edit['action'] = 'action_goto_action'; --$this->drupalPostForm('admin/config/system/actions', $edit, 'Create'); -+$this->drupalGet('admin/config/system/actions'); -+$this->submitForm($edit, 'Create'); - $edit['action'] = 'action_goto_action_1'; --$this->drupalPostForm(null, $edit, 'Edit'); -+$this->submitForm($edit, 'Edit'); -``` - -
- -### UserPasswordRector - -Fixes deprecated `user_password()` calls - -- class: [`DrupalRector\Drupal9\Rector\Deprecation\UserPasswordRector`](../src/Drupal9/Rector/Deprecation/UserPasswordRector.php) - -```diff --$pass = user_password(); --$shorter_pass = user_password(8); -+$pass = \Drupal::service('password_generator')->generate(); -+$shorter_pass = \Drupal::service('password_generator')->generate(8); -``` - -
- -## DrupalRector - -### ClassConstantToClassConstantRector - -Fixes deprecated class contant use, used in Drupal 9.1 deprecations - -:wrench: **configure it!** - -- class: [`DrupalRector\Rector\Deprecation\ClassConstantToClassConstantRector`](../src/Rector/Deprecation/ClassConstantToClassConstantRector.php) - -```diff --$value = Symfony\Cmf\Component\Routing\RouteObjectInterface::ROUTE_NAME; --$value2 = Symfony\Cmf\Component\Routing\RouteObjectInterface::ROUTE_OBJECT; --$value3 = Symfony\Cmf\Component\Routing\RouteObjectInterface::CONTROLLER_NAME; -+$value = \Drupal\Core\Routing\RouteObjectInterface::ROUTE_NAME; -+$value2 = \Drupal\Core\Routing\RouteObjectInterface::ROUTE_OBJECT; -+$value3 = \Drupal\Core\Routing\RouteObjectInterface::CONTROLLER_NAME; -``` - -
- -### ConstantToClassConstantRector - -Fixes deprecated contant use, used in Drupal 8 and 9 deprecations - -:wrench: **configure it!** - -- class: [`DrupalRector\Rector\Deprecation\ConstantToClassConstantRector`](../src/Rector/Deprecation/ConstantToClassConstantRector.php) - -```diff --$result = file_unmanaged_copy($source, $destination, DEPRECATED_CONSTANT); -+$result = file_unmanaged_copy($source, $destination, \Drupal\MyClass::CONSTANT); -``` - -
- -### DeprecationHelperRemoveRector - -Remove DeprecationHelper calls for versions before configured minimum requirement - -:wrench: **configure it!** - -- class: [`DrupalRector\Rector\Deprecation\DeprecationHelperRemoveRector`](../src/Rector/Deprecation/DeprecationHelperRemoveRector.php) - -```diff - $settings = []; - $filename = 'simple_filename.yaml'; --DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '9.1.0', fn() => new_function(), fn() => old_function()); --DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '10.5.0', fn() => SettingsEditor::rewrite($filename, $settings), fn() => drupal_rewrite_settings($settings, $filename)); -+drupal_rewrite_settings($settings, $filename); - DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.1.0', fn() => new_function(), fn() => old_function()); -``` - -
- -### FunctionToServiceRector - -Fixes deprecated function to service calls, used in Drupal 8 and 9 deprecations - -:wrench: **configure it!** - -- class: [`DrupalRector\Rector\Deprecation\FunctionToServiceRector`](../src/Rector/Deprecation/FunctionToServiceRector.php) - -```diff --$path = drupal_realpath($path); -+$path = \Drupal::service('file_system') -+ ->realpath($path); -``` - -
- -```diff --$result = drupal_render($elements); -+$result = \Drupal::service('renderer')->render($elements); -``` - -
- -```diff --$result = drupal_render_root($elements); -+$result = \Drupal::service('renderer')->renderRoot($elements); -``` - -
- -```diff --$display = entity_get_display($entity_type, $bundle, $view_mode) -+$display = \Drupal::service('entity_display.repository') -+ ->getViewDisplay($entity_type, $bundle, $view_mode); -``` - -
- -```diff --$display = entity_get_form_display($entity_type, $bundle, $form_mode) -+$display = \Drupal::service('entity_display.repository') -+ ->getFormDisplay($entity_type, $bundle, $form_mode); -``` - -
- -```diff --file_copy(); -+\Drupal::service('file.repository')->copy(); -``` - -
- -```diff --$dir = file_directory_temp(); -+$dir = \Drupal::service('file_system')->getTempDirectory(); -``` - -
- -```diff --file_move(); -+\Drupal::service('file.repository')->move(); -``` - -
- -```diff --$result = file_prepare_directory($directory, $options); -+$result = \Drupal::service('file_system')->prepareDirectory($directory, $options); -``` - -
- -```diff --file_save_data($data); -+\Drupal::service('file.repository')->writeData($data); -``` - -
- -```diff --$files = file_scan_directory($directory); -+$files = \Drupal::service('file_system')->scanDirectory($directory); -``` - -
- -```diff --$result = file_unmanaged_save_data($data, $destination, $replace); -+$result = \Drupal::service('file_system')->saveData($data, $destination, $replace); -``` - -
- -```diff --$result = file_uri_target($uri) -+$result = \Drupal::service('stream_wrapper_manager')->getTarget($uri); -``` - -
- -```diff --$date = format_date($timestamp, $type, $format, $timezone, $langcode); -+$date = \Drupal::service('date.formatter')->format($timestamp, $type, $format, $timezone, $langcode); -``` - -
- -```diff --$date = format_date($timestamp, $type, $format, $timezone, $langcode); -+$date = \Drupal::service('date.formatter')->format($timestamp, $type, $format, $timezone, $langcode); -``` - -
- -```diff --$output = render($build); -+$output = \Drupal::service('renderer')->render($build); -``` - -
- -### FunctionToStaticRector - -Fixes deprecated `file_directory_os_temp()` calls, used in Drupal 8, 9 and 10 deprecations - -:wrench: **configure it!** - -- class: [`DrupalRector\Rector\Deprecation\FunctionToStaticRector`](../src/Rector/Deprecation/FunctionToStaticRector.php) - -```diff --$dir = file_directory_os_temp(); -+$dir = \Drupal\Component\FileSystem\FileSystem::getOsTemporaryDirectory(); -``` - -
- -```diff - $settings = []; - $filename = 'simple_filename.yaml'; --drupal_rewrite_settings($settings, $filename); -+SettingsEditor::rewrite($filename, $settings); -``` - -
- -```diff - $settings = []; - $filename = 'simple_filename.yaml'; --drupal_rewrite_settings($settings, $filename); -+SettingsEditor::rewrite($filename, $settings); -``` - -
- -### HookConvertRector - -Hook conversion script - -- class: [`DrupalRector\Rector\Convert\HookConvertRector`](../src/Rector/Convert/HookConvertRector.php) - -```diff - /** -- * Implements hook_user_cancel(). -+ * Hook implementations for hookconvertrector. - */ --function hookconvertrector_user_cancel($edit, UserInterface $account, $method) { -- $red = 'red'; -- $method = ['red', 'green', 'blue']; -- $edit = [ -- 'red' => 'red', -- 'green' => 'green', -- 'blue' => 'blue', -- ]; -+class HookconvertrectorHooks -+{ -+ /** -+ * Implements hook_user_cancel(). -+ */ -+ #[Hook('user_cancel')] -+ public function userCancel($edit, \UserInterface $account, $method) -+ { -+ $red = 'red'; -+ $method = [ -+ 'red', -+ 'green', -+ 'blue', -+ ]; -+ $edit = [ -+ 'red' => 'red', -+ 'green' => 'green', -+ 'blue' => 'blue', -+ ]; -+ } - } -``` - -
- -### MethodToMethodWithCheckRector - -Fixes deprecated `MetadataBag::clearCsrfTokenSeed()` calls, used in Drupal 8 and 9 deprecations - -:wrench: **configure it!** - -- class: [`DrupalRector\Rector\Deprecation\MethodToMethodWithCheckRector`](../src/Rector/Deprecation/MethodToMethodWithCheckRector.php) - -```diff - $metadata_bag = new \Drupal\Core\Session\MetadataBag(new \Drupal\Core\Site\Settings([])); --$metadata_bag->clearCsrfTokenSeed(); -+$metadata_bag->stampNew(); -``` - -
- -```diff --$url = $entity->urlInfo(); -+$url = $entity->toUrl(); -``` - -
- -```diff - /* @var \Drupal\node\Entity\Node $node */ - $node = \Drupal::entityTypeManager()->getStorage('node')->load(123); - $entity_type = $node->getEntityType(); --$entity_type->getLowercaseLabel(); -+$entity_type->getSingularLabel(); -``` - -
- -### ShouldCallParentMethodsRector - -PHPUnit based tests should call parent methods (setUp, tearDown) - -- class: [`DrupalRector\Rector\PHPUnit\ShouldCallParentMethodsRector`](../src/Rector/PHPUnit/ShouldCallParentMethodsRector.php) - -```diff - namespace Drupal\Tests\Rector\Deprecation\PHPUnit\ShouldCallParentMethodsRector\fixture; - - use Drupal\KernelTests\KernelTestBase; - - final class SetupVoidTest extends KernelTestBase { - - protected function setUp(): void - { -+ parent::setUp(); - $test = 'doing things'; - } - - protected function tearDown(): void - { -+ parent::tearDown(); - $test = 'doing things'; - } - - } -``` - -
From d0fb43fd8b215473dfab5d0cbc369575a3caf24c Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 22 May 2026 13:33:41 +0200 Subject: [PATCH 222/256] chore: add scripts to php-cs-fixer --- .php-cs-fixer.dist.php | 1 + 1 file changed, 1 insertion(+) diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php index 64f7498a4..60a4f6577 100644 --- a/.php-cs-fixer.dist.php +++ b/.php-cs-fixer.dist.php @@ -5,6 +5,7 @@ __DIR__.'/src', __DIR__.'/tests', __DIR__.'/config/drupal-*', + __DIR__.'/scripts', ]) ->exclude([ 'functional/hookconvertrector/fixture', From 1d233c3730134967f94c7acf28259e7c68c824f6 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 22 May 2026 13:33:58 +0200 Subject: [PATCH 223/256] chore: fix references to change records --- config/drupal-10/drupal-10.3-deprecations.php | 6 ++--- config/drupal-11/drupal-11.1-deprecations.php | 4 +-- config/drupal-11/drupal-11.2-deprecations.php | 16 ++++++------ config/drupal-11/drupal-11.3-deprecations.php | 14 +++++----- config/drupal-11/drupal-11.4-deprecations.php | 26 +++++++++---------- config/drupal-8/drupal-8.2-deprecations.php | 2 +- .../ReplaceModuleHandlerGetNameRector.php | 2 +- .../ReplaceRebuildThemeDataRector.php | 2 +- .../DeprecatedFilterFunctionsRector.php | 2 +- ...iginalClassToGetDecoratedClassesRector.php | 2 +- .../NodeAccessRebuildFunctionsRector.php | 2 +- .../PluginBaseIsConfigurableRector.php | 2 +- ...emoveModuleHandlerAddModuleCallsRector.php | 2 +- ...veModuleHandlerDeprecatedMethodsRector.php | 2 +- .../ReplaceDateTimeRangeConstantsRector.php | 2 +- .../ReplaceEntityOriginalPropertyRector.php | 2 +- ...eplaceLocaleConfigBatchFunctionsRector.php | 2 +- ...aceNodeModuleProceduralFunctionsRector.php | 2 +- .../ReplaceSessionManagerDeleteRector.php | 2 +- ...eSessionWritesWithRequestSessionRector.php | 2 +- .../ReplaceThemeGetSettingRector.php | 2 +- .../ReplaceTwigExtensionRector.php | 2 +- .../ReplaceUserSessionNamePropertyRector.php | 2 +- 23 files changed, 51 insertions(+), 51 deletions(-) diff --git a/config/drupal-10/drupal-10.3-deprecations.php b/config/drupal-10/drupal-10.3-deprecations.php index 3e8a4c195..f743ed1e3 100644 --- a/config/drupal-10/drupal-10.3-deprecations.php +++ b/config/drupal-10/drupal-10.3-deprecations.php @@ -27,20 +27,20 @@ new FunctionToStaticConfiguration('10.3.0', 'file_icon_map', 'Drupal\file\IconMimeTypes', 'getGenericMimeType'), ]); - // https://www.drupal.org/node/3571068 + // https://www.drupal.org/node/3413196 // ThemeHandlerInterface::rebuildThemeData() deprecated in drupal:10.3.0, removed in drupal:12.0.0. // Replaced by \Drupal::service('extension.list.theme')->reset()->getList(). $rectorConfig->ruleWithConfiguration(ReplaceRebuildThemeDataRector::class, [ new DrupalIntroducedVersionConfiguration('10.3.0'), ]); - // https://www.drupal.org/node/3571063 + // https://www.drupal.org/node/3310017 // ModuleHandlerInterface::getName() deprecated in drupal:10.3.0, removed in drupal:12.0.0. $rectorConfig->ruleWithConfiguration(ReplaceModuleHandlerGetNameRector::class, [ new DrupalIntroducedVersionConfiguration('10.3.0'), ]); - // https://www.drupal.org/node/3575575 + // https://www.drupal.org/node/3426517 // FileSystemInterface::EXISTS_* deprecated in drupal:10.3.0, removed in drupal:12.0.0. // Replaced by \Drupal\Core\File\FileExists enum cases. $rectorConfig->ruleWithConfiguration(ClassConstantToClassConstantRector::class, [ diff --git a/config/drupal-11/drupal-11.1-deprecations.php b/config/drupal-11/drupal-11.1-deprecations.php index 00f94957a..525d44a60 100644 --- a/config/drupal-11/drupal-11.1-deprecations.php +++ b/config/drupal-11/drupal-11.1-deprecations.php @@ -23,7 +23,7 @@ new DrupalIntroducedVersionConfiguration('11.1.0'), ]); - // https://www.drupal.org/node/3151086 + // https://www.drupal.org/node/3467559 // AliasWhitelist and AliasWhitelistInterface deprecated in drupal:11.1.0, removed in drupal:12.0.0. // Replaced by AliasPrefixList and AliasPrefixListInterface. // AliasManager::pathAliasWhitelistRebuild() deprecated in drupal:11.1.0, removed in drupal:12.0.0. @@ -60,7 +60,7 @@ // https://www.drupal.org/node/3488176 // drupal_common_theme() removed in drupal:11.1.0. // Replaced by \Drupal\Core\Theme\ThemeCommonElements::commonElements(). - // https://www.drupal.org/node/3574424 + // https://www.drupal.org/node/3268441 // image_filter_keyword() deprecated in drupal:11.1.0, removed in drupal:12.0.0. // Replaced by \Drupal\Component\Utility\Image::getKeywordOffset(). $rectorConfig->ruleWithConfiguration(FunctionToStaticRector::class, [ diff --git a/config/drupal-11/drupal-11.2-deprecations.php b/config/drupal-11/drupal-11.2-deprecations.php index ec608373d..386980504 100644 --- a/config/drupal-11/drupal-11.2-deprecations.php +++ b/config/drupal-11/drupal-11.2-deprecations.php @@ -41,14 +41,14 @@ new DrupalIntroducedVersionConfiguration('11.2.0'), ]); - // https://www.drupal.org/node/3498947 + // https://www.drupal.org/node/3500622 // CacheBackendInterface::invalidateAll() deprecated in drupal:11.2.0, removed in drupal:12.0.0. // Replaced by deleteAll(). $rectorConfig->ruleWithConfiguration(MethodToMethodWithCheckRector::class, [ new MethodToMethodWithCheckConfiguration('Drupal\Core\Cache\CacheBackendInterface', 'invalidateAll', 'deleteAll'), ]); - // https://www.drupal.org/node/3501136 + // https://www.drupal.org/node/3504125 // template_preprocess_*() functions deprecated in drupal:11.2.0, removed in drupal:12.0.0. // Replaced by ThemePreprocess and DatePreprocess service methods. $rectorConfig->ruleWithConfiguration(FunctionToServiceRector::class, [ @@ -63,7 +63,7 @@ // https://www.drupal.org/node/3501136 // template_preprocess() deprecated in drupal:11.2.0, removed in drupal:12.0.0. - // https://www.drupal.org/node/3499559 + // https://www.drupal.org/node/3522119 // update_clear_update_disk_cache(), update_delete_file_if_stale(), // _update_manager_cache_directory(), _update_manager_extract_directory(), // and _update_manager_unique_identifier() deprecated in drupal:11.2.0, removed in drupal:13.0.0. @@ -104,7 +104,7 @@ // https://www.drupal.org/node/3489415 // views_field_default_views_data() and _views_field_get_entity_type_storage() deprecated in drupal:11.2.0, removed in drupal:12.0.0. // Replaced by views.field_data_provider service methods. - // https://www.drupal.org/node/3069442 + // https://www.drupal.org/node/3489411 // views_entity_field_label() deprecated in drupal:11.2.0, removed in drupal:12.0.0. // Replaced by entity_field.manager::getFieldLabels(). $rectorConfig->ruleWithConfiguration(FunctionToServiceRector::class, [ @@ -116,7 +116,7 @@ // https://www.drupal.org/node/3575841 // REQUIREMENT_INFO/OK/WARNING/ERROR global constants deprecated in drupal:11.2.0, removed in drupal:12.0.0. // Replaced by RequirementSeverity enum cases. - // https://www.drupal.org/node/3477277 + // https://www.drupal.org/node/3488133 // LOCALE_TRANSLATION_DEFAULT_SERVER_PATTERN deprecated in drupal:11.2.0, removed in drupal:12.0.0. // Replaced by \Drupal::TRANSLATION_DEFAULT_SERVER_PATTERN. $rectorConfig->ruleWithConfiguration(ConstantToClassConstantRector::class, [ @@ -168,7 +168,7 @@ new DrupalIntroducedVersionConfiguration('11.2.0'), ]); - // https://www.drupal.org/node/3494126 + // https://www.drupal.org/node/3494172 // file_get_content_headers($file) deprecated in drupal:11.2.0, removed in drupal:12.0.0. // Replaced by $file->getDownloadHeaders(). $rectorConfig->ruleWithConfiguration(FunctionToFirstArgMethodRector::class, [ @@ -207,7 +207,7 @@ // Moved to Drupal\pgsql\EntityQuery\*. // https://www.drupal.org/node/3472008 // Drupal\jsonapi\EventSubscriber\ResourceResponseValidator moved to jsonapi_response_validator submodule. - // https://www.drupal.org/node/3498915 + // https://www.drupal.org/node/3498916 // Drupal\migrate_drupal\Plugin\migrate\source\ContentEntity/ContentEntityDeriver deprecated in drupal:11.2.0, // removed in drupal:12.0.0. Moved to Drupal\migrate namespace. $rectorConfig->ruleWithConfiguration(RenameClassRector::class, [ @@ -218,7 +218,7 @@ 'Drupal\migrate_drupal\Plugin\migrate\source\ContentEntityDeriver' => 'Drupal\migrate\Plugin\migrate\source\ContentEntityDeriver', ]); - // https://www.drupal.org/node/3575841 + // https://www.drupal.org/node/3410939 // SystemManager::REQUIREMENT_* deprecated in drupal:11.2.0, removed in drupal:12.0.0. // Replaced by \Drupal\Core\Extension\Requirement\RequirementSeverity enum cases. $rectorConfig->ruleWithConfiguration(ClassConstantToClassConstantRector::class, [ diff --git a/config/drupal-11/drupal-11.3-deprecations.php b/config/drupal-11/drupal-11.3-deprecations.php index d282025cf..2401edcc1 100644 --- a/config/drupal-11/drupal-11.3-deprecations.php +++ b/config/drupal-11/drupal-11.3-deprecations.php @@ -54,7 +54,7 @@ // https://www.drupal.org/node/3533083 // node_mass_update() deprecated in drupal:11.3.0, removed in drupal:13.0.0. // Replaced by \Drupal\node\NodeBulkUpdate::process(). - // https://www.drupal.org/node/1685492 + // https://www.drupal.org/node/3547356 // twig_render_template() deprecated in drupal:11.3.0, removed in drupal:12.0.0. // Replaced by \Drupal::service(TwigThemeEngine::class)->renderTemplate(). // twig_extension() is handled by ReplaceTwigExtensionRector below. @@ -63,7 +63,7 @@ new FunctionToServiceConfiguration('11.3.0', 'twig_render_template', 'Drupal\Core\Template\TwigThemeEngine', 'renderTemplate'), ]); - // https://www.drupal.org/node/3571382 + // https://www.drupal.org/node/3504125 // template_preprocess_layout() deprecated in drupal:11.3.0, removed in drupal:12.0.0. // Replaced by \Drupal\layout_discovery\Hook\LayoutDiscoveryThemeHooks::preprocessLayout(). $rectorConfig->ruleWithConfiguration(FunctionToServiceRector::class, [ @@ -80,7 +80,7 @@ new DrupalIntroducedVersionConfiguration('11.3.0'), ]); - // https://www.drupal.org/node/3504005 + // https://www.drupal.org/node/3535528 // block_content_add_body_field() deprecated in drupal:11.3.0, removed in drupal:13.0.0. // The body field is now added via config. $rectorConfig->ruleWithConfiguration(FunctionCallRemovalRector::class, [ @@ -90,7 +90,7 @@ // https://www.drupal.org/node/2010202 // comment_uri($comment) deprecated in drupal:11.3.0, removed in drupal:12.0.0. // Replaced by $comment->permalink(). - // https://www.drupal.org/node/3531944 + // https://www.drupal.org/node/3531945 // node_type_get_description($node_type) deprecated in drupal:11.3.0, removed in drupal:12.0.0. // Replaced by $node_type->getDescription(). $rectorConfig->ruleWithConfiguration(FunctionToFirstArgMethodRector::class, [ @@ -107,7 +107,7 @@ new DrupalIntroducedVersionConfiguration('11.3.0'), ]); - // https://www.drupal.org/node/3574424 + // https://www.drupal.org/node/3548329 // responsive_image_* functions deprecated in drupal:11.3.0, removed in drupal:12.0.0. // Replaced by \Drupal::service(ResponsiveImageBuilder::class)->method() calls. $rectorConfig->ruleWithConfiguration(FunctionToServiceRector::class, [ @@ -153,7 +153,7 @@ new DrupalIntroducedVersionConfiguration('11.3.0'), ]); - // https://www.drupal.org/node/3495600 + // https://www.drupal.org/node/3495601 // JSONAPI_FILTER_AMONG_* global constants deprecated in drupal:11.3.0, removed in drupal:13.0.0. // Replaced by \Drupal\jsonapi\JsonApiFilter::AMONG_* class constants. $rectorConfig->ruleWithConfiguration(ConstantToClassConstantRector::class, [ @@ -203,7 +203,7 @@ new DrupalIntroducedVersionConfiguration('11.3.0'), ]); - // https://www.drupal.org/node/3551446 + // https://www.drupal.org/node/3551450 // workspaces.association service and WorkspaceAssociationInterface renamed in drupal:11.3.0. // Replaced by workspaces.tracker and WorkspaceTrackerInterface. $rectorConfig->ruleWithConfiguration(RenameClassRector::class, [ diff --git a/config/drupal-11/drupal-11.4-deprecations.php b/config/drupal-11/drupal-11.4-deprecations.php index 5d6606069..b7903c1e0 100644 --- a/config/drupal-11/drupal-11.4-deprecations.php +++ b/config/drupal-11/drupal-11.4-deprecations.php @@ -45,7 +45,7 @@ new DrupalIntroducedVersionConfiguration('11.4.0'), ]); - // https://www.drupal.org/node/2473041 + // https://www.drupal.org/node/3578055 // node_access_grants() deprecated in drupal:11.4.0, removed in drupal:13.0.0. // Replaced by \Drupal\node\NodeGrantsHelper::nodeAccessGrants(). $rectorConfig->ruleWithConfiguration(FunctionToServiceRector::class, [ @@ -53,7 +53,7 @@ ]); // https://www.drupal.org/node/3533299 - // https://www.drupal.org/node/3575096 (change record) + // https://www.drupal.org/node/3534610 (change record) // node_access_rebuild() and node_access_needs_rebuild() deprecated in drupal:11.4.0, removed in drupal:13.0.0. // Replaced by \Drupal\node\NodeAccessRebuild service. $rectorConfig->ruleWithConfiguration(NodeAccessRebuildFunctionsRector::class, [ @@ -78,7 +78,7 @@ ]); // https://www.drupal.org/node/3226806 - // https://www.drupal.org/node/3566536 (change record) + // https://www.drupal.org/node/3566774 (change record) // _filter_autop(), _filter_html_escape(), and _filter_html_image_secure_process() // deprecated in drupal:11.4.0, removed in drupal:13.0.0. // Replaced by plugin.manager.filter createInstance() chain. @@ -86,7 +86,7 @@ new DrupalIntroducedVersionConfiguration('11.4.0'), ]); - // https://www.drupal.org/node/3577376 + // https://www.drupal.org/node/3570851 // SessionManager::delete() deprecated in drupal:11.4.0, removed in drupal:12.0.0. // Replaced by \Drupal\Core\Session\UserSessionRepositoryInterface::deleteAll(). $rectorConfig->ruleWithConfiguration(ReplaceSessionManagerDeleteRector::class, [ @@ -96,7 +96,7 @@ // https://www.drupal.org/node/3550054 // CommentItemInterface::FORM_BELOW and FORM_SEPARATE_PAGE deprecated in 11.4.0, // removed in 13.0.0. Replaced by FormLocation enum cases. - // https://www.drupal.org/node/3574661 + // https://www.drupal.org/node/3547352 // CommentItemInterface::HIDDEN/CLOSED/OPEN and CommentInterface::ANONYMOUS_* // deprecated in 11.4.0, removed in 13.0.0. Replaced by CommentingStatus and // AnonymousContact enum cases. @@ -176,7 +176,7 @@ // menu_ui.module procedural functions deprecated in 11.4.0, removed in 12.0.0/13.0.0. // https://www.drupal.org/node/3568387 // text_summary() deprecated in 11.4.0, removed in 13.0.0. Replaced by TextSummary service. - // https://www.drupal.org/node/3582106 + // https://www.drupal.org/node/3582107 // user_form_process_password_confirm() deprecated in 11.4.0, removed in 13.0.0. $rectorConfig->ruleWithConfiguration(FunctionToServiceRector::class, [ new FunctionToServiceConfiguration('11.4.0', 'language_process_language_select', 'Drupal\language\Hook\LanguageHooks', 'processLanguageSelect'), @@ -223,7 +223,7 @@ // https://www.drupal.org/node/3566774 (change record) // automated_cron_settings_submit() deprecated in drupal:11.4.0, removed in drupal:13.0.0. // Config saving is now handled automatically via #config_target on the interval element. - // https://www.drupal.org/node/3566782 + // https://www.drupal.org/node/3566783 // block_theme_initialize() deprecated in drupal:11.4.0, removed in drupal:13.0.0. // Logic moved to protected BlockHooks::themeInitialize(); external callers must drop the call. $rectorConfig->ruleWithConfiguration(FunctionCallRemovalRector::class, [ @@ -304,7 +304,7 @@ ]); // https://www.drupal.org/node/3557461 - // https://www.drupal.org/node/3587853 (change record) + // https://www.drupal.org/node/3557464 (change record) // EntityTypeInterface::getOriginalClass() deprecated in drupal:11.4.0, removed in drupal:12.0.0. // Replaced by getDecoratedClasses()[0]. $rectorConfig->ruleWithConfiguration(GetOriginalClassToGetDecoratedClassesRector::class, [ @@ -329,7 +329,7 @@ // https://www.drupal.org/node/2907780 // field_purge_batch() deprecated in drupal:11.4.0, removed in drupal:13.0.0. // Replaced by \Drupal::service(FieldPurger::class)->purgeBatch(). - // https://www.drupal.org/node/3570839 + // https://www.drupal.org/node/3566774 // _media_library_media_type_form_submit() and _media_library_views_form_media_library_after_build() // deprecated in drupal:11.4.0, removed in drupal:12.0.0. Replaced by MediaLibraryHooks service. $rectorConfig->ruleWithConfiguration(FunctionToServiceRector::class, [ @@ -340,7 +340,7 @@ new FunctionToServiceConfiguration('11.4.0', '_media_library_views_form_media_library_after_build', 'Drupal\media_library\Hook\MediaLibraryHooks', 'viewsFormAfterBuild'), ]); - // https://www.drupal.org/node/3570839 + // https://www.drupal.org/node/3566774 // _media_library_configure_form_display() and _media_library_configure_view_display() // deprecated in drupal:11.4.0, removed in drupal:12.0.0. // Replaced by MediaLibraryDisplayManager static methods. @@ -352,7 +352,7 @@ // https://www.drupal.org/node/3574727 // language_configuration_element_submit() deprecated in 11.4.0, removed in 13.0.0. // Replaced by LanguageConfiguration::submit(). - // https://www.drupal.org/node/3035340 + // https://www.drupal.org/node/3566774 // views_ui/admin.inc static trait functions deprecated in 11.4.0, removed in 13.0.0. $rectorConfig->ruleWithConfiguration(FunctionToStaticRector::class, [ new FunctionToStaticConfiguration('11.4.0', 'language_configuration_element_submit', 'Drupal\language\Element\LanguageConfiguration', 'submit'), @@ -368,7 +368,7 @@ // https://www.drupal.org/node/3567618 // image_path_flush() and image_style_options() deprecated in drupal:11.4.0, removed in drupal:13.0.0. // Replaced by ImageDerivativeUtilities service. - // https://www.drupal.org/node/3577671 + // https://www.drupal.org/node/3577675 // locale_translate_get_interface_translation_files() deprecated in drupal:11.4.0, removed in drupal:13.0.0. // Replaced by LocaleFileManager::getInterfaceTranslationFiles(). $rectorConfig->ruleWithConfiguration(FunctionToServiceRector::class, [ @@ -387,7 +387,7 @@ new FunctionToServiceConfiguration('11.4.0', 'views_add_contextual_links', 'Drupal\views\ContextualLinksHelper', 'addLinks', true), ]); - // https://www.drupal.org/node/3567618 + // https://www.drupal.org/node/3567619 // IMAGE_DERIVATIVE_TOKEN deprecated in drupal:11.4.0, removed in drupal:13.0.0. // Replaced by \Drupal\image\ImageStyleInterface::TOKEN. $rectorConfig->ruleWithConfiguration(ConstantToClassConstantRector::class, [ diff --git a/config/drupal-8/drupal-8.2-deprecations.php b/config/drupal-8/drupal-8.2-deprecations.php index 439256bee..6094a0a5f 100644 --- a/config/drupal-8/drupal-8.2-deprecations.php +++ b/config/drupal-8/drupal-8.2-deprecations.php @@ -10,7 +10,7 @@ $rectorConfig->singleton(AddCommentService::class, function () { return new AddCommentService(); }); - // https://www.drupal.org/node/2802569 + // https://www.drupal.org/node/2418133 $rectorConfig->ruleWithConfiguration(FunctionToStaticRector::class, [ new DrupalRector\Rector\ValueObject\FunctionToStaticConfiguration( '8.2.0', diff --git a/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector.php b/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector.php index 6bdb0e876..96da5ab4d 100644 --- a/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector.php +++ b/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector.php @@ -15,7 +15,7 @@ /** * Replaces deprecated ModuleHandlerInterface::getName() calls. * - * @see https://www.drupal.org/node/3571063 + * @see https://www.drupal.org/node/3310017 */ final class ReplaceModuleHandlerGetNameRector extends AbstractDrupalCoreRector { diff --git a/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector.php b/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector.php index 87d13c10e..9e26f391f 100644 --- a/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector.php +++ b/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector.php @@ -15,7 +15,7 @@ /** * Replaces deprecated ThemeHandlerInterface::rebuildThemeData() with the extension.list.theme service. * - * @see https://www.drupal.org/node/3571068 + * @see https://www.drupal.org/node/3413196 */ final class ReplaceRebuildThemeDataRector extends AbstractDrupalCoreRector { diff --git a/src/Drupal11/Rector/Deprecation/DeprecatedFilterFunctionsRector.php b/src/Drupal11/Rector/Deprecation/DeprecatedFilterFunctionsRector.php index 7e11475a3..b3b71ac62 100644 --- a/src/Drupal11/Rector/Deprecation/DeprecatedFilterFunctionsRector.php +++ b/src/Drupal11/Rector/Deprecation/DeprecatedFilterFunctionsRector.php @@ -24,7 +24,7 @@ * chain. * * @see https://www.drupal.org/node/3226806 - * @see https://www.drupal.org/node/3566536 + * @see https://www.drupal.org/node/3566774 */ final class DeprecatedFilterFunctionsRector extends AbstractDrupalCoreRector { diff --git a/src/Drupal11/Rector/Deprecation/GetOriginalClassToGetDecoratedClassesRector.php b/src/Drupal11/Rector/Deprecation/GetOriginalClassToGetDecoratedClassesRector.php index df304e03f..997571408 100644 --- a/src/Drupal11/Rector/Deprecation/GetOriginalClassToGetDecoratedClassesRector.php +++ b/src/Drupal11/Rector/Deprecation/GetOriginalClassToGetDecoratedClassesRector.php @@ -19,7 +19,7 @@ * Replaces deprecated EntityTypeInterface::getOriginalClass() with getDecoratedClasses()[0]. * * @see https://www.drupal.org/node/3557461 - * @see https://www.drupal.org/node/3587853 + * @see https://www.drupal.org/node/3557464 */ class GetOriginalClassToGetDecoratedClassesRector extends AbstractDrupalCoreRector { diff --git a/src/Drupal11/Rector/Deprecation/NodeAccessRebuildFunctionsRector.php b/src/Drupal11/Rector/Deprecation/NodeAccessRebuildFunctionsRector.php index 1fcd6a9ce..2043878b4 100644 --- a/src/Drupal11/Rector/Deprecation/NodeAccessRebuildFunctionsRector.php +++ b/src/Drupal11/Rector/Deprecation/NodeAccessRebuildFunctionsRector.php @@ -24,7 +24,7 @@ * Deprecated in drupal:11.4.0 and removed in drupal:13.0.0. * * @see https://www.drupal.org/node/3533299 - * @see https://www.drupal.org/node/3575096 + * @see https://www.drupal.org/node/3534610 */ class NodeAccessRebuildFunctionsRector extends AbstractDrupalCoreRector { diff --git a/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector.php b/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector.php index 17448f978..b7aa8f9ed 100644 --- a/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector.php +++ b/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector.php @@ -16,7 +16,7 @@ * Replaces deprecated PluginBase::isConfigurable() with an instanceof check. * * @see https://www.drupal.org/node/3459533 - * @see https://www.drupal.org/node/2946122 + * @see https://www.drupal.org/node/3198285 */ final class PluginBaseIsConfigurableRector extends AbstractDrupalCoreRector { diff --git a/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector.php b/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector.php index 2477bd5e5..e071816aa 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector.php @@ -17,7 +17,7 @@ * These methods are no-ops since drupal:11.2.0 and removed in drupal:12.0.0. * * @see https://www.drupal.org/node/3528899 - * @see https://www.drupal.org/node/3550193 + * @see https://www.drupal.org/node/3491200 */ final class RemoveModuleHandlerAddModuleCallsRector extends AbstractRector { diff --git a/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector.php b/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector.php index 06e64679a..6720bf260 100644 --- a/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector.php +++ b/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector.php @@ -21,7 +21,7 @@ * Both are deprecated in drupal:11.1.0 and removed in drupal:12.0.0. * * @see https://www.drupal.org/node/3442009 - * @see https://www.drupal.org/node/3368812 + * @see https://www.drupal.org/node/3442349 */ final class RemoveModuleHandlerDeprecatedMethodsRector extends AbstractRector { diff --git a/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector.php b/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector.php index a47833640..bc05f1aaf 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector.php @@ -27,7 +27,7 @@ * * Deprecated in drupal:11.2.0 and removed in drupal:12.0.0. * - * @see https://www.drupal.org/node/3574901 + * @see https://www.drupal.org/node/3495241 */ final class ReplaceDateTimeRangeConstantsRector extends AbstractDrupalCoreRector { diff --git a/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector.php b/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector.php index 3bef73d22..499cdd4db 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector.php @@ -26,7 +26,7 @@ * Deprecated in drupal:11.2.0, removed in drupal:12.0.0. * Skips $this->original to avoid false positives on non-entity classes. * - * @see https://www.drupal.org/node/3571065 + * @see https://www.drupal.org/node/3295826 */ final class ReplaceEntityOriginalPropertyRector extends AbstractDrupalCoreRector { diff --git a/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector.php b/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector.php index 10af59e4d..d783e1f1f 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector.php @@ -19,7 +19,7 @@ * - locale_config_batch_set_config_langcodes() => locale_config_batch_update_default_config_langcodes() * - locale_config_batch_refresh_name() => locale_config_batch_update_config_translations() * - * @see https://www.drupal.org/node/3575254 + * @see https://www.drupal.org/node/3475054 */ final class ReplaceLocaleConfigBatchFunctionsRector extends AbstractDrupalCoreRector { diff --git a/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector.php b/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector.php index d4c5865e2..a8495e706 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector.php @@ -24,7 +24,7 @@ * node_type_get_names(), node_get_type_label(), and node_mass_update() are * deprecated in drupal:11.3.0 and removed in drupal:13.0.0. * - * @see https://www.drupal.org/node/3571623 + * @see https://www.drupal.org/node/3534849 */ final class ReplaceNodeModuleProceduralFunctionsRector extends AbstractDrupalCoreRector { diff --git a/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector.php b/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector.php index 125ef005c..ea9e1152f 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector.php @@ -15,7 +15,7 @@ /** * Replaces deprecated SessionManager::delete() with UserSessionRepositoryInterface::deleteAll(). * - * @see https://www.drupal.org/node/3577376 + * @see https://www.drupal.org/node/3570851 */ final class ReplaceSessionManagerDeleteRector extends AbstractDrupalCoreRector { diff --git a/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector.php b/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector.php index 68766286f..fb87a6a6d 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector.php @@ -23,8 +23,8 @@ * * Deprecated in drupal:11.2.0. * - * @see https://www.drupal.org/node/3518527 * @see https://www.drupal.org/node/3518914 + * @see https://www.drupal.org/node/3518527 */ final class ReplaceSessionWritesWithRequestSessionRector extends AbstractDrupalCoreRector { diff --git a/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector.php b/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector.php index ee5f71ca0..5396a061b 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector.php @@ -23,7 +23,7 @@ * * Both are deprecated in drupal:11.3.0 and removed in drupal:13.0.0. * - * @see https://www.drupal.org/node/3573896 + * @see https://www.drupal.org/node/3035289 */ final class ReplaceThemeGetSettingRector extends AbstractDrupalCoreRector { diff --git a/src/Drupal11/Rector/Deprecation/ReplaceTwigExtensionRector.php b/src/Drupal11/Rector/Deprecation/ReplaceTwigExtensionRector.php index f46de6a39..85d6083b2 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceTwigExtensionRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceTwigExtensionRector.php @@ -16,7 +16,7 @@ /** * Replaces deprecated twig_extension() with the '.html.twig' string literal. * - * @see https://www.drupal.org/node/1685492 + * @see https://www.drupal.org/node/3547356 */ final class ReplaceTwigExtensionRector extends AbstractDrupalCoreRector { diff --git a/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector.php b/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector.php index 83484f3e4..ce4e777f0 100644 --- a/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector.php @@ -18,8 +18,8 @@ * * Deprecated in drupal:11.3.0, removed in drupal:12.0.0. * - * @see https://www.drupal.org/node/3513856 * @see https://www.drupal.org/node/3513877 + * @see https://www.drupal.org/node/3513856 */ final class ReplaceUserSessionNamePropertyRector extends AbstractDrupalCoreRector { From fb498179b3d5682e4bbedf9e22014e4a2ccc6e31 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 22 May 2026 13:34:21 +0200 Subject: [PATCH 224/256] feat: add back phpstan drupal to rector.php since that changed --- rector.php | 38 +++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/rector.php b/rector.php index 1d3b89b42..5b6e7ef65 100644 --- a/rector.php +++ b/rector.php @@ -2,15 +2,16 @@ declare(strict_types=1); +use DrupalRector\Rector\Deprecation\DeprecationHelperRemoveRector; +use DrupalRector\Rector\ValueObject\DeprecationHelperRemoveConfiguration; use DrupalRector\Services\DrupalRectorSettings; -use DrupalRector\Set\Drupal11SetList; use DrupalRector\Set\Drupal10SetList; +use DrupalRector\Set\Drupal11SetList; use DrupalRector\Set\Drupal8SetList; use DrupalRector\Set\Drupal9SetList; use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { - // Adjust the set lists to be more granular to your Drupal requirements. // @todo find out how to only load the relevant rector rules. // Should we try and load \Drupal::VERSION and check? @@ -27,14 +28,29 @@ // By default, backward-compatibility wrapping is disabled (recommended for // projects that target a single Drupal version). Enable it if you need to // support multiple Drupal versions simultaneously. - $rectorConfig->singleton(DrupalRectorSettings::class, fn () => - (new DrupalRectorSettings()) + $rectorConfig->singleton(DrupalRectorSettings::class, fn () => (new DrupalRectorSettings()) ->disableBackwardCompatibility() - // Contrib module developers: set the minimum Drupal version your - // module needs to support so that BC wrappers are emitted correctly. - // Example: ->setMinimumCoreVersionSupported('10.5.0') + // Contrib module developers: set the minimum Drupal version your + // module needs to support so that BC wrappers are emitted correctly. + // Example: ->setMinimumCoreVersionSupported('10.5.0') ); + // Contrib modules: once you raise your minimum supported Drupal version, + // uncomment and configure this rule to strip DeprecationHelper BC wrappers + // for any deprecation introduced before that version. The wrappers are + // replaced with the new API call directly. + // + // $rectorConfig->ruleWithConfiguration(DeprecationHelperRemoveRector::class, [ + // new DeprecationHelperRemoveConfiguration('10.3.0'), + // ]); + + // When phsptan-drupal is available, we should load it to get better type + // inference to use in rectors. + $phpstanDrupalExtension = __DIR__.'/vendor/mglaman/phpstan-drupal/extension.neon'; + if (file_exists($phpstanDrupalExtension)) { + $rectorConfig->phpstanConfigs([$phpstanDrupalExtension]); + } + if (class_exists('DrupalFinder\DrupalFinderComposerRuntime')) { $drupalFinder = new DrupalFinder\DrupalFinderComposerRuntime(); } else { @@ -43,10 +59,10 @@ } $drupalRoot = $drupalFinder->getDrupalRoot(); $rectorConfig->autoloadPaths([ - $drupalRoot . '/core', - $drupalRoot . '/modules', - $drupalRoot . '/profiles', - $drupalRoot . '/themes' + $drupalRoot.'/core', + $drupalRoot.'/modules', + $drupalRoot.'/profiles', + $drupalRoot.'/themes', ]); $rectorConfig->skip(['*/upgrade_status/tests/modules/*']); From 19f50f02bff11a0945a6915372245744e54e4410 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 22 May 2026 14:22:21 +0200 Subject: [PATCH 225/256] add a few helper scripts --- scripts/README.md | 3 + scripts/check-rector-coverage.php | 715 +++++++++++++++++++++ scripts/generate-deprecation-map.php | 911 +++++++++++++++++++++++++++ 3 files changed, 1629 insertions(+) create mode 100644 scripts/README.md create mode 100644 scripts/check-rector-coverage.php create mode 100755 scripts/generate-deprecation-map.php diff --git a/scripts/README.md b/scripts/README.md new file mode 100644 index 000000000..fad952938 --- /dev/null +++ b/scripts/README.md @@ -0,0 +1,3 @@ +# Do not use + +Some analysis scripts that were used to check for coverage, etc. They are not complete, but are useful to keep around. diff --git a/scripts/check-rector-coverage.php b/scripts/check-rector-coverage.php new file mode 100644 index 000000000..0eec8b79f --- /dev/null +++ b/scripts/check-rector-coverage.php @@ -0,0 +1,715 @@ +#!/usr/bin/env php +/*.patch files. + Defaults to: /Users/bjorn/Downloads/artifacts 6/phpstan-results + +Options: + --csv Output results as CSV instead of a human-readable table. + --verbose, -v Show extra debug output. + --help, -h Show this help message. + +How it works: + For each rector in three tiers (config files → custom rector classes → fixture diffs), + the script extracts the "before" patterns the rector looks for. It then scans the removed + lines (-) of every .patch file in patches-dir and counts how many distinct modules contain + each pattern. The final table is sorted by match count descending. + +Tiers of pattern extraction: + 1. Config files (config/drupal-*/*.php) — FunctionToService, ConstantToClass, etc. + 2. Custom rector classes (src/Drupal*/Rector/Deprecation/*.php) — match/case/getName patterns. + 3. Fixture diffs (tests/src/Rector/*/fixture/*.php.inc) — fallback for anything not covered above. + +HELP; + exit(0); + } elseif ($arg === '--verbose' || $arg === '-v') { + $verbose = true; + } elseif ($arg === '--csv') { + $csvMode = true; + } elseif (!str_starts_with($arg, '-')) { + $patchesDir = $arg; + } +} + +$patchesDir ??= '/Users/bjorn/Downloads/artifacts 6/phpstan-results'; + +if (!is_dir($patchesDir)) { + fwrite(STDERR, "Patches directory not found: $patchesDir\n"); + exit(1); +} + +// ============================================================ +// Registry: key => ['label', 'patterns', 'version', 'class', 'source', 'configuration'] +// ============================================================ + +$registry = []; + +function reg(array &$registry, string $key, string $label, string $pattern, string $version, string $class, string $source, string $configEntry = ''): void +{ + if (!isset($registry[$key])) { + $registry[$key] = [ + 'label' => $label, + 'patterns' => [], + 'version' => $version, + 'class' => $class, + 'source' => $source, + 'configuration' => [], + ]; + } + if (!in_array($pattern, $registry[$key]['patterns'], true)) { + $registry[$key]['patterns'][] = $pattern; + } + if ($configEntry !== '' && !in_array($configEntry, $registry[$key]['configuration'], true)) { + $registry[$key]['configuration'][] = $configEntry; + } +} + +// ============================================================ +// TIER 1: Config files +// ============================================================ + +$configFiles = glob("$rootDir/config/drupal-*/*.php") ?: []; +sort($configFiles); + +// Build short-class → FQCN map from use statements in config files. +$fqcnMap = []; +foreach ($configFiles as $f) { + if (preg_match_all('/^use\s+([\w\\\\]+);/m', file_get_contents($f), $um)) { + foreach ($um[1] as $fqcn) { + $short = substr($fqcn, strrpos($fqcn, '\\') + 1); + $fqcnMap[$short] = $fqcn; + } + } +} + +foreach ($configFiles as $configFile) { + $base = basename($configFile); + + // Skip "all" aggregate files to avoid double-counting + if (str_contains($base, '-all-')) { + continue; + } + + // Extract Drupal version from filename: drupal-11.4-deprecations.php → "11.4" + if (!preg_match('/drupal-(\d+(?:\.\d+)*)-/', $base, $vm)) { + continue; + } + $version = $vm[1]; + + $content = file_get_contents($configFile); + + // --- FunctionToServiceConfiguration / FunctionToStaticConfiguration --- + // Format: new FunctionToServiceConfiguration('version', 'func_name', 'Service\\Class', 'method') + // The first string is always the version, the second is always the function name. + if (preg_match_all( + '/new FunctionTo(Service|Static)Configuration\(\s*[\'"][^\'\"]+[\'"],\s*[\'"]([a-z_][a-zA-Z0-9_]*)[\'"],\s*[\'"]([^\'\"]+)[\'"],\s*[\'"]([^\'\"]+)[\'"]/', + $content, + $matches, + PREG_SET_ORDER + )) { + foreach ($matches as $m) { + $rClass = 'FunctionTo'.$m[1].'Rector'; + $key = $rClass.'@'.$version; + $configEntry = $m[2].'( → '.$m[3].'::'.$m[4].'()'; + reg($registry, $key, "$rClass [$version]", $m[2].'(', $version, $fqcnMap[$rClass] ?? $rClass, 'config', $configEntry); + } + } + + // --- FunctionCallRemovalConfiguration --- + // Format: new FunctionCallRemovalConfiguration('func_name') — no version prefix + if (preg_match_all( + '/new FunctionCallRemovalConfiguration\(\s*[\'"]([a-z_][a-zA-Z0-9_]*)[\'"]/', + $content, + $matches + )) { + foreach ($matches[1] as $funcName) { + $rClass = 'FunctionCallRemovalRector'; + $key = $rClass.'@'.$version; + $configEntry = $funcName.'( → (removed)'; + reg($registry, $key, "$rClass [$version]", $funcName.'(', $version, $fqcnMap[$rClass] ?? $rClass, 'config', $configEntry); + } + } + + // --- FunctionToFirstArgMethodConfiguration --- + // Old format (D8/D9): ('func_name', 'method') + // New format (D11+): ('version', 'func_name', '$arg', 'method') + if (preg_match_all( + '/new FunctionToFirstArgMethodConfiguration\(\s*[\'"]([^\'\"]+)[\'"],\s*[\'"]([^\'\"]+)[\'"],\s*(?:[\'"][^\'\"]*[\'"],\s*)?[\'"]([a-zA-Z][a-zA-Z0-9_]*)[\'"]/', + $content, + $matches, + PREG_SET_ORDER + )) { + foreach ($matches as $m) { + // If the first arg looks like a version string (starts with digit), use second as func name + $funcName = preg_match('/^\d+\.\d+/', $m[1]) ? $m[2] : $m[1]; + $methodArg = $m[3]; + if (preg_match('/^\d/', $funcName)) { + continue; // skip if still a version string + } + $rClass = 'FunctionToFirstArgMethodRector'; + $key = $rClass.'@'.$version; + $configEntry = $funcName.'($arg) → $arg->'.$methodArg.'()'; + reg($registry, $key, "$rClass [$version]", $funcName.'(', $version, $fqcnMap[$rClass] ?? $rClass, 'config', $configEntry); + } + } + + // --- FunctionToEntityTypeStorageConfiguration --- + // Format: new FunctionToEntityTypeStorageConfiguration('func_name', ...) + if (preg_match_all( + '/new FunctionToEntityTypeStorageConfiguration\(\s*[\'"]([a-z_][a-zA-Z0-9_]*)[\'"]/', + $content, + $matches + )) { + foreach ($matches[1] as $funcName) { + $rClass = 'FunctionToEntityTypeStorageRector'; + $key = $rClass.'@'.$version; + reg($registry, $key, "$rClass [$version]", $funcName.'(', $version, $fqcnMap[$rClass] ?? $rClass, 'config'); + } + } + + // --- ConstantToClassConfiguration --- + // Format: new ConstantToClassConfiguration('CONST_NAME', 'Target\\Class', 'NEW_CONST') + if (preg_match_all( + '/new ConstantToClass(?:Constant)?Configuration\(\s*[\'"]([A-Z_][A-Z0-9_]{3,})[\'"],\s*[\'"]([^\'\"]+)[\'"],\s*[\'"]([^\'\"]+)[\'"]/', + $content, + $matches, + PREG_SET_ORDER + )) { + foreach ($matches as $m) { + $constName = $m[1]; + $rClass = 'ConstantToClassConstantRector'; + $key = $rClass.'@'.$version; + $shortTarget = substr($m[2], strrpos($m[2], '\\') + 1); + $configEntry = $constName.' → '.$shortTarget.'::'.$m[3]; + reg($registry, $key, "$rClass [$version]", $constName, $version, $fqcnMap[$rClass] ?? $rClass, 'config', $configEntry); + } + } + + // --- ClassConstantToClassConstantConfiguration --- + // Format: new ClassConstantToClassConstantConfiguration('OldClass', 'OLD_CONST', 'NewClass', 'NEW_CONST') + if (preg_match_all( + '/new ClassConstantToClassConstantConfiguration\(\s*[\'"]([^\'\"]+)[\'"],\s*[\'"]([A-Z_][A-Z0-9_]{2,})[\'"],\s*[\'"]([^\'\"]+)[\'"],\s*[\'"]([^\'\"]+)[\'"]/', + $content, + $matches, + PREG_SET_ORDER + )) { + foreach ($matches as $m) { + $oldClass = $m[1]; + $oldConst = $m[2]; + $shortOld = substr($oldClass, strrpos($oldClass, '\\') + 1); + $shortNew = substr($m[3], strrpos($m[3], '\\') + 1); + $rClass = 'ClassConstantToClassConstantRector'; + $key = $rClass.'@'.$version; + $configEntry = $shortOld.'::'.$oldConst.' → '.$shortNew.'::'.$m[4]; + reg($registry, $key, "$rClass [$version]", $shortOld.'::'.$oldConst, $version, $fqcnMap[$rClass] ?? $rClass, 'config', $configEntry); + } + } + + // --- MethodToMethodWithCheckConfiguration --- + // Format: new MethodToMethodWithCheckConfiguration('ClassName', 'old_method', 'new_method') + if (preg_match_all( + '/new MethodToMethodWithCheckConfiguration\(\s*[\'"][^\'\"]+[\'"],\s*[\'"]([a-z][a-zA-Z0-9_]{2,})[\'"],\s*[\'"]([a-z][a-zA-Z0-9_]{2,})[\'"]/', + $content, + $matches, + PREG_SET_ORDER + )) { + foreach ($matches as $m) { + $rClass = 'MethodToMethodWithCheckRector'; + $key = $rClass.'@'.$version; + $configEntry = '->'.$m[1].'() → ->'.$m[2].'()'; + reg($registry, $key, "$rClass [$version]", '->'.$m[1].'(', $version, $fqcnMap[$rClass] ?? $rClass, 'config', $configEntry); + } + } + + // --- RenameClassRector --- + // Format: ['Old\\ClassName' => 'New\\ClassName'] inside ruleWithConfiguration blocks + if (preg_match_all( + '/[\'"]([A-Z][a-zA-Z0-9]*(?:\\\\[A-Z][a-zA-Z0-9]+)+)[\'"][\s\n]*=>[\s\n]*[\'"](?:[A-Z][a-zA-Z0-9\\\\]+)[\'"]/', + $content, + $matches + )) { + foreach ($matches[1] as $oldFqcn) { + $shortClass = substr($oldFqcn, strrpos($oldFqcn, '\\') + 1); + if (strlen($shortClass) < 5) { + continue; + } + $key = 'RenameClassRector@'.$version; + reg($registry, $key, "RenameClassRector [$version]", $shortClass, $version, 'RenameClassRector', 'config'); + } + } +} + +// ============================================================ +// TIER 2: Custom rector classes +// ============================================================ + +// Explicit pattern overrides for rectors where generic AST-based extraction +// produces wrong results — typically because the heuristics pick up internal +// node-accessor names or new service-method names instead of the deprecated +// user-facing function/method calls we actually want to find in patches. +// [] means "skip tracking entirely" (e.g. addition-only rectors where no +// lines are removed and removed-line scanning cannot detect the transformation). +$patternOverrides = [ + // Generic extraction picks up 'stmts' (an AST node accessor) instead of + // the deprecated method name. + 'LoadAllIncludesRector' => ['loadAllIncludes('], + // Generic extraction picks up the new service method names ('rebuild', + // 'needsRebuild', 'setNeedsRebuild') rather than the deprecated procedural + // function names that will appear in the removed lines of a patch. + 'NodeAccessRebuildFunctionsRector' => ['node_access_rebuild(', 'node_access_needs_rebuild('], + // This rector only adds parent::setUp()/tearDown() calls — nothing is + // removed, so removed-line scanning produces only fixture noise. Skip it. + 'ShouldCallParentMethodsRector' => [], + // Generic extraction picks up the new service method names (getRoles, + // getAllFormats, getFallbackFormatId, …) from the replacement values in the + // function-name → service-call map. Only the map keys are the deprecated + // user-facing functions that appear in removed patch lines. + 'FilterFormatFunctionsToServiceRector' => [ + 'filter_fallback_format(', + 'filter_formats(', + 'filter_get_roles_by_format(', + 'filter_get_formats_by_role(', + 'filter_default_format(', + ], +]; + +// Classes with an empty override are excluded from all tiers so Tier 3 does +// not accidentally pick them up via fixture diffs. +$skippedClasses = array_keys(array_filter($patternOverrides, fn ($p) => $p === [])); + +$customRectorFiles = array_merge( + glob("$rootDir/src/Drupal*/Rector/Deprecation/*.php") ?: [], + glob("$rootDir/src/Drupal*/Rector/Convert/*.php") ?: [] +); + +// Build short class name → FQCN map from namespace declarations in rector files. +$customRectorFqcnMap = []; +foreach ($customRectorFiles as $rf) { + $cn = basename($rf, '.php'); + if (preg_match('/^namespace\s+([\w\\\\]+);/m', file_get_contents($rf), $nm)) { + $customRectorFqcnMap[$cn] = $nm[1].'\\'.$cn; + } +} + +// Track which custom rector classes are already covered by config entries +$configClasses = array_unique(array_column($registry, 'class')); + +foreach ($customRectorFiles as $rectorFile) { + $className = basename($rectorFile, '.php'); + + // Skip if this rector is already represented as a config-driven entry + // (the generic rectors like FunctionToServiceRector are config-only) + if (in_array($className, $configClasses, true)) { + continue; + } + + $content = file_get_contents($rectorFile); + + // Extract version from the first version string in the class + preg_match('/\'(\d+\.\d+)\.\d+\'/', $content, $vm); + $version = $vm[1] ?? '?'; + + // Use explicit override if available; skip addition-only rectors entirely. + if (array_key_exists($className, $patternOverrides)) { + $patterns = $patternOverrides[$className]; + if (empty($patterns)) { + continue; // not trackable via removed-line scanning + } + $key = $className.'@'.$version; + if (!isset($registry[$key])) { + $registry[$key] = [ + 'label' => $className.' ['.$version.']', + 'patterns' => $patterns, + 'version' => $version, + 'class' => $customRectorFqcnMap[$className] ?? $className, + 'source' => 'custom-rector', + 'configuration' => [], + ]; + } + continue; + } + + $patterns = []; + + // Extract from match($node->name->toString()) style: 'function_name' => ... + if (preg_match_all('/match\s*\([^)]+toString\(\)[^)]*\)[^{]*\{([^}]+)\}/s', $content, $blocks)) { + foreach ($blocks[1] as $block) { + if (preg_match_all('/[\'"]([a-z_][a-zA-Z0-9_]{4,})[\'"]/', $block, $fm)) { + foreach ($fm[1] as $name) { + $patterns[] = $name.'('; + } + } + } + } + + // Extract from case 'function_name': style + if (preg_match_all('/case\s+[\'"]([a-z_][a-zA-Z0-9_]{4,})[\'"]/', $content, $fm)) { + foreach ($fm[1] as $name) { + $patterns[] = $name.'('; + } + } + + // Extract from getName() === 'function_name' style + if (preg_match_all('/getName\(\)[^=]*===\s*[\'"]([a-z_][a-zA-Z0-9_]{4,})[\'"]/', $content, $fm)) { + foreach ($fm[1] as $name) { + $patterns[] = $name.'('; + } + } + + // Extract from string array keys: 'function_name' => SomeClass::method(...) + if (preg_match_all('/[\'"]([a-z_][a-zA-Z0-9_]{4,})[\'"][\s\n]*=>[\s\n]*(?:new |fn\s*\(|\[|\'|Drupal)/', $content, $fm)) { + foreach ($fm[1] as $name) { + $patterns[] = $name.'('; + } + } + + $patterns = array_values(array_unique($patterns)); + if (empty($patterns)) { + continue; + } + + $key = $className.'@'.$version; + if (!isset($registry[$key])) { + $registry[$key] = [ + 'label' => $className.' ['.$version.']', + 'patterns' => $patterns, + 'version' => $version, + 'class' => $customRectorFqcnMap[$className] ?? $className, + 'source' => 'custom-rector', + 'configuration' => [], + ]; + } +} + +// ============================================================ +// TIER 3: Fixture file diffs (fallback for remaining rectors) +// ============================================================ + +$fixtureDirs = array_merge( + glob("$rootDir/tests/src/Rector/*/fixture", GLOB_ONLYDIR) ?: [], + glob("$rootDir/tests/src/Rector/*/*/fixture", GLOB_ONLYDIR) ?: [] +); + +// Custom rectors already registered, plus addition-only rectors that are +// intentionally skipped so Tier 3 does not process their fixture diffs. +$registeredClasses = array_unique(array_merge( + array_column($registry, 'class'), + $skippedClasses +)); + +foreach ($fixtureDirs as $fixtureDir) { + // Skip bc/below-version variant dirs + if (str_contains($fixtureDir, 'fixture-')) { + continue; + } + + // Derive rector name from path + $parts = explode('/', rtrim($fixtureDir, '/')); + $fixtureIdx = array_search('fixture', $parts); + $rectorName = $parts[$fixtureIdx - 1] ?? ''; + + // Skip if already covered + if (in_array($rectorName, $registeredClasses, true)) { + continue; + } + + // Skip generic/abstract rectors + if (in_array($rectorName, ['AbstractDrupalCoreRector', 'FunctionToServiceRector', 'FunctionToStaticRector'], true)) { + continue; + } + + $patterns = []; + + foreach (glob("$fixtureDir/*.php.inc") ?: [] as $fixture) { + $fixtureContent = file_get_contents($fixture); + $parts = explode("\n-----\n", $fixtureContent, 2); + if (count($parts) < 2) { + continue; + } + + [$before, $after] = $parts; + + // Write temp files and diff to find removed lines + $tmpBefore = tempnam(sys_get_temp_dir(), 'before_'); + $tmpAfter = tempnam(sys_get_temp_dir(), 'after_'); + file_put_contents($tmpBefore, $before); + file_put_contents($tmpAfter, $after); + + exec(sprintf('diff %s %s', escapeshellarg($tmpBefore), escapeshellarg($tmpAfter)), $diffLines); + + foreach ($diffLines as $line) { + if (!str_starts_with($line, '< ')) { + continue; + } + $removed = ltrim(substr($line, 2)); + + // Skip trivial lines + if ( + strlen($removed) < 10 + || in_array($removed, ['', '{', '}', ''], true) + || str_starts_with($removed, '//') + || str_starts_with($removed, '*') + || str_starts_with($removed, 'namespace ') + || str_starts_with($removed, 'use ') + ) { + continue; + } + + $patterns[] = trim($removed); + } + + unlink($tmpBefore); + unlink($tmpAfter); + } + + $patterns = array_values(array_unique($patterns)); + if (empty($patterns)) { + continue; + } + + // Infer a plausible version from the patterns (look for rector class in src/) + $version = 'unknown'; + + $key = $rectorName.'@fixture'; + if (!isset($registry[$key])) { + $registry[$key] = [ + 'label' => $rectorName.' [fixture]', + 'patterns' => $patterns, + 'version' => $version, + 'class' => $customRectorFqcnMap[$rectorName] ?? $rectorName, + 'source' => 'fixture', + 'configuration' => [], + ]; + } +} + +// ============================================================ +// Scan patch files +// ============================================================ + +$patchFiles = glob("$patchesDir/*/*.patch") ?: []; +$totalPatches = count($patchFiles); + +if ($totalPatches === 0) { + fwrite(STDERR, "No .patch files found in: $patchesDir\n"); + exit(1); +} + +// Build a flat pattern → keys lookup for efficiency +$patternIndex = []; +foreach ($registry as $key => $entry) { + foreach (array_unique($entry['patterns']) as $pattern) { + $patternIndex[$pattern][] = $key; + } +} + +// $results[key] = [ +// 'modules' => [module => true], // which modules this rector matched +// 'patterns' => [pattern => moduleCount], // how many modules each pattern hit +// ] +$results = []; +$processed = 0; +$startTime = microtime(true); + +foreach ($patchFiles as $patchFile) { + $moduleName = basename(dirname($patchFile)); + $patchContent = file_get_contents($patchFile); + + $removedLines = extractPhpRemovedLines($patchContent); + if (empty($removedLines)) { + ++$processed; + continue; + } + + $removedText = implode("\n", $removedLines); + + foreach ($patternIndex as $pattern => $keys) { + if (str_contains($removedText, $pattern)) { + foreach ($keys as $key) { + $results[$key]['modules'][$moduleName] = true; + $results[$key]['patterns'][$pattern] = ($results[$key]['patterns'][$pattern] ?? 0) + 1; + } + } + } + + ++$processed; + if ($processed % 1000 === 0) { + $elapsed = round(microtime(true) - $startTime, 1); + fwrite(STDERR, "Processed $processed/$totalPatches patches ({$elapsed}s)...\r"); + } +} + +$elapsed = round(microtime(true) - $startTime, 1); +fwrite(STDERR, "Processed $totalPatches patches in {$elapsed}s. \n"); + +// ============================================================ +// Compile & sort output +// ============================================================ + +$rows = []; +foreach ($registry as $key => $entry) { + $res = $results[$key] ?? []; + $modules = array_keys($res['modules'] ?? []); + sort($modules); + + // Build per-pattern hit counts; patterns with 0 hits get 0 + $patternHits = []; + foreach (array_unique($entry['patterns']) as $p) { + $patternHits[$p] = $res['patterns'][$p] ?? 0; + } + arsort($patternHits); // highest hit count first + + $rows[] = [ + 'key' => $key, + 'class' => $entry['class'], + 'version' => $entry['version'], + 'label' => $entry['label'], + 'patternCount' => count($patternHits), + 'count' => count($modules), + 'modules' => $modules, + 'source' => $entry['source'], + 'patternHits' => $patternHits, + 'configuration' => $entry['configuration'] ?? [], + ]; +} + +// Sort by count descending, then by version, then by class name +usort($rows, static function (array $a, array $b): int { + if ($b['count'] !== $a['count']) { + return $b['count'] <=> $a['count']; + } + + return strnatcmp($a['label'], $b['label']); +}); + +// ============================================================ +// Output +// ============================================================ + +if ($csvMode) { + echo "rector,version,source,pattern_count,match_count,matched_patterns,sample_modules\n"; + foreach ($rows as $row) { + $matchedPatterns = implode(';', array_keys(array_filter($row['patternHits']))); + $sample = implode(';', array_slice($row['modules'], 0, 20)); + printf( + '"%s","%s","%s",%d,%d,"%s","%s"'."\n", + $row['class'], + $row['version'], + $row['source'], + $row['patternCount'], + $row['count'], + $matchedPatterns, + $sample + ); + } +} else { + $labelWidth = 52; + $verWidth = 6; + $matchWidth = 8; + + printf("%-{$labelWidth}s %-{$verWidth}s %-{$matchWidth}s %s\n", + 'Rector', 'Ver', 'Matches', 'Sample modules (first 5)'); + echo str_repeat('─', 120)."\n"; + + foreach ($rows as $row) { + $label = $row['class']; + if (strlen($label) > $labelWidth) { + $label = '…'.substr($label, -($labelWidth - 1)); + } + + if ($row['count'] === 0) { + $moduleStr = '—'; + } else { + $sample = array_slice($row['modules'], 0, 5); + $moduleStr = implode(', ', $sample); + if ($row['count'] > 5) { + $moduleStr .= ' … (+'.($row['count'] - 5).' more)'; + } + } + + printf("%-{$labelWidth}s %-{$verWidth}s %-{$matchWidth}d %s\n", + $label, $row['version'], $row['count'], $moduleStr); + + // Show "from" patterns with per-pattern hit count + foreach ($row['patternHits'] as $pattern => $hits) { + $indicator = $hits > 0 ? ' ✓' : ' ✗'; + $hitStr = $hits > 0 ? sprintf('%5d hits', $hits) : ' 0 hits'; + // Truncate long patterns (fixture-sourced full lines) + $displayPattern = strlen($pattern) > 60 ? substr($pattern, 0, 57).'...' : $pattern; + printf(" %s %-62s %s\n", $indicator, $displayPattern, $hitStr); + } + + foreach ($row['configuration'] as $cfg) { + printf(" · %s\n", $cfg); + } + + if (!empty($row['patternHits']) || !empty($row['configuration'])) { + echo "\n"; + } + } + + $withMatches = count(array_filter($rows, fn ($r) => $r['count'] > 0)); + printf("Patches: %d | Rectors tracked: %d | With matches: %d | Time: %ss\n", + $totalPatches, count($rows), $withMatches, $elapsed); +} + +// ============================================================ +// Helper: extract removed lines from .php/.module/.inc hunks only +// ============================================================ + +function extractPhpRemovedLines(string $patchContent): array +{ + static $phpExtensions = ['php', 'module', 'inc', 'install', 'theme', 'profile', 'engine']; + + $lines = explode("\n", $patchContent); + $result = []; + $inPhpHunk = false; + + foreach ($lines as $line) { + if (str_starts_with($line, 'diff --git ')) { + $inPhpHunk = false; + // "diff --git a/path/to/file.php b/path/to/file.php" + if (preg_match('/diff --git a\/(\S+)/', $line, $m)) { + $ext = strtolower(pathinfo($m[1], PATHINFO_EXTENSION)); + $inPhpHunk = in_array($ext, $phpExtensions, true); + } + continue; + } + + if (!$inPhpHunk) { + continue; + } + + // Collect removed lines (starts with - but NOT ---) + if (isset($line[0]) && $line[0] === '-' && (!isset($line[1]) || $line[1] !== '-')) { + $result[] = substr($line, 1); + } + } + + return $result; +} diff --git a/scripts/generate-deprecation-map.php b/scripts/generate-deprecation-map.php new file mode 100755 index 000000000..8b1f6b0a6 --- /dev/null +++ b/scripts/generate-deprecation-map.php @@ -0,0 +1,911 @@ +#!/usr/bin/env php + $phpArray = true, + '--debug' => $debug = true, + '--verify' => $verify = true, + '--help', '-h' => exitHelp(), + default => null, + }; +} + +function exitHelp(): never +{ + echo <<<'HELP' +Usage: + php scripts/generate-deprecation-map.php [--php-array] [--debug] [--verify] + +Options: + --php-array Output a PHP array keyed by deprecation message string. + --debug Print extracted URLs and index sizes to stderr. + --verify Run correctness assertions and exit non-zero on failure. + --help, -h Show this help. + +HELP; + exit(0); +} + +// ============================================================ +// U5 helpers: resolve git SHA → earliest containing tag. +// ============================================================ + +$tagCache = []; + +function resolveTag(string $rootDir, string $sha, array &$tagCache): string +{ + if (isset($tagCache[$sha])) { + return $tagCache[$sha]; + } + exec( + sprintf('git -C %s tag --contains %s 2>/dev/null | sort -V | head -1', + escapeshellarg($rootDir), escapeshellarg($sha)), + $out + ); + $tag = trim($out[0] ?? ''); + $result = $tag !== '' ? $tag : 'unreleased'; + + return $tagCache[$sha] = $result; +} + +function introducedForFile(string $rootDir, string $relPath, array &$tagCache): string +{ + exec( + sprintf('git -C %s log --diff-filter=A --format="%%H" -- %s 2>/dev/null | tail -1', + escapeshellarg($rootDir), escapeshellarg($relPath)), + $out + ); + $sha = trim($out[0] ?? ''); + + return $sha !== '' ? resolveTag($rootDir, $sha, $tagCache) : 'unreleased'; +} + +function relPath(string $rootDir, string $absPath): string +{ + return ltrim(str_replace($rootDir, '', $absPath), '/'); +} + +// ============================================================ +// U1: Rector source file crawler +// ============================================================ + +$rectorIndex = []; + +$customRectorFiles = array_merge( + glob("$rootDir/src/Drupal*/Rector/Deprecation/*.php") ?: [], + glob("$rootDir/src/Drupal*/Rector/Convert/*.php") ?: [] +); + +foreach ($customRectorFiles as $absPath) { + $content = file_get_contents($absPath); + + // Derive major version from directory (src/Drupal11/... → 11) + if (!preg_match('/\/Drupal(\d+)\//', $absPath, $vm)) { + continue; + } + $major = $vm[1]; + + // Extract the class-level docblock — the /** ... */ immediately before the class declaration. + if (!preg_match('/\/\*\*(.*?)\*\/\s*(?:(?:final|abstract|readonly)\s+)*class\s+/s', $content, $dm)) { + continue; + } + $docblock = $dm[1]; + + // All @see https://www.drupal.org/node/XXXXXX lines in the docblock. + if (!preg_match_all('/@see\s+https:\/\/www\.drupal\.org\/node\/(\d+)/', $docblock, $sm)) { + if ($debug) { + fwrite(STDERR, 'UNMAPPED (no @see): '.basename($absPath, '.php')."\n"); + } + continue; + } + + $nodeIds = $sm[1]; + // Convention: last @see = change record (appears in trigger_error strings), + // first @see = issue (may equal change_record when there's only one URL). + $changeRecordId = end($nodeIds); + $issueId = $nodeIds[0]; + + // FQCN from namespace declaration. + preg_match('/^namespace\s+([\w\\\\]+);/m', $content, $nm); + $namespace = $nm[1] ?? ''; + $className = basename($absPath, '.php'); + $fqcn = $namespace !== '' ? $namespace.'\\'.$className : $className; + $relPath = relPath($rootDir, $absPath); + + $rectorIndex[$className] = [ + 'class' => $className, + 'fqcn' => $fqcn, + 'file' => $relPath, + 'major' => $major, + 'issue_id' => $issueId, + 'change_record_id' => $changeRecordId, + 'type' => 'custom', + 'introduced' => introducedForFile($rootDir, $relPath, $tagCache), + 'configuration_class' => null, + 'configuration' => [], + 'source_content' => $content, + ]; +} + +// ============================================================ +// U2: Config file crawler for generic (config-driven) rector entries +// ============================================================ + +$configFiles = glob("$rootDir/config/drupal-*/*.php") ?: []; +sort($configFiles); + +$configIntroducedCache = []; + +foreach ($configFiles as $absPath) { + $base = basename($absPath); + + // Skip aggregate "all" files to avoid double-counting. + if (str_contains($base, '-all-')) { + continue; + } + + // Major version from filename (e.g. drupal-11.4-deprecations.php → 11). + if (!preg_match('/drupal-(\d+)(?:\.\d+)*-/', $base, $vm)) { + continue; + } + $major = $vm[1]; + $relPath = relPath($rootDir, $absPath); + $lines = file($absPath, FILE_IGNORE_NEW_LINES); + + $urlBuffer = []; + $configAccum = null; // non-null while buffering a ruleWithConfiguration([...]) body + $configIndexKey = null; // rector index key to attach configuration to + + foreach ($lines as $line) { + $trimmed = trim($line); + + // Inside a configuration array block: accumulate until ']);' + if ($configAccum !== null) { + $configAccum .= $line."\n"; + if (str_contains($trimmed, ']);')) { + // Extract configuration class name (first 'new XxxClass(' hit) + $cfgClass = null; + if (preg_match('/new\s+(\w+)\s*\(/', $configAccum, $cm)) { + $cfgClass = $cm[1]; + } + // Extract one entry per 'new XxxClass(args)' call: keep only string args in order + $cfgEntries = []; + if (preg_match_all('/new\s+\w+\s*\(([^)]*)\)/', $configAccum, $calls)) { + foreach ($calls[1] as $argsStr) { + preg_match_all('/[\'"]([^\'"]*)[\'"]/', $argsStr, $am); + $cfgEntries[] = $am[1]; + } + } + if ($configIndexKey !== null && isset($rectorIndex[$configIndexKey])) { + // Keep the first non-null class name seen; accumulate entries across + // multiple ruleWithConfiguration() blocks that share the same key + // (same rector + same CR appearing in several config file sections). + $rectorIndex[$configIndexKey]['configuration_class'] ??= $cfgClass; + $rectorIndex[$configIndexKey]['configuration'] = array_merge( + $rectorIndex[$configIndexKey]['configuration'], + $cfgEntries + ); + } + $configAccum = null; + $configIndexKey = null; + $urlBuffer = []; + } + continue; + } + + // Buffer every // https://www.drupal.org/node/XXXXXX comment. + if (preg_match('#^\s*//\s*https://www\.drupal\.org/node/(\d+)#', $line, $cm)) { + $urlBuffer[] = $cm[1]; + continue; + } + + // Other comment lines — preserve buffer (descriptive text between URL lines). + if (str_starts_with($trimmed, '//')) { + continue; + } + + // Blank lines — preserve buffer. + if ($trimmed === '') { + continue; + } + + // Code line: check if it's a rule() or ruleWithConfiguration() call. + if (preg_match('/\$rectorConfig->(rule|ruleWithConfiguration)\s*\(\s*(\w+)::class/', $line, $rm)) { + $rectorClass = $rm[2]; + $configIndexKey = null; + + if (!empty($urlBuffer)) { + // Last buffered URL = change record; first = issue. + $changeRecordId = end($urlBuffer); + $issueId = $urlBuffer[0]; + + // Skip if already indexed as a custom rector (its class docblock takes precedence). + if (!isset($rectorIndex[$rectorClass])) { + $key = $rectorClass.'@'.$changeRecordId; + if (!isset($rectorIndex[$key])) { + $configIntroducedCache[$relPath] ??= introducedForFile($rootDir, $relPath, $tagCache); + $rectorIndex[$key] = [ + 'class' => $rectorClass, + 'fqcn' => $rectorClass, + 'file' => $relPath, + 'major' => $major, + 'issue_id' => $issueId, + 'change_record_id' => $changeRecordId, + 'type' => 'config', + 'introduced' => $configIntroducedCache[$relPath], + 'configuration_class' => null, + 'configuration' => [], + ]; + } + $configIndexKey = $rectorClass.'@'.$changeRecordId; + } else { + // Custom rector from U1: attach configuration to its index entry. + $configIndexKey = $rectorClass; + } + } + + // For ruleWithConfiguration, start buffering the configuration array body. + if ($rm[1] === 'ruleWithConfiguration') { + $configAccum = $line."\n"; + continue; // URL buffer reset happens when the block closes + } + } + + // Any non-comment code line resets the buffer. + $urlBuffer = []; + } +} + +if ($debug) { + fwrite(STDERR, sprintf("Rector index: %d entries\n", count($rectorIndex))); + foreach (array_slice($rectorIndex, 0, 5, true) as $key => $e) { + fwrite(STDERR, sprintf(" %s: issue=%s change_record=%s major=%s\n", + $key, $e['issue_id'], $e['change_record_id'], $e['major'])); + } +} + +// ============================================================ +// U3: Drupal core trigger_error index (per major branch) +// ============================================================ + +$coreDir = "$rootDir/repos/drupal-core"; +$coreIndex = []; // $coreIndex[$major][$nodeId][] = $message + +function ensureCoreBranch(string $coreDir, string $major): string +{ + exec(sprintf('git -C %s branch -a 2>/dev/null', escapeshellarg($coreDir)), $rawBranches); + + $localBranches = []; + foreach ($rawBranches as $b) { + $b = trim($b, " *\t"); + // Strip remote tracking prefix (remotes/origin/...) + if (str_starts_with($b, 'remotes/')) { + $b = preg_replace('@^remotes/[^/]+/@', '', $b); + } + $localBranches[] = $b; + } + $localBranches = array_unique($localBranches); + + // 1. Prefer exact X.x branch (Drupal 11 development branch style). + if (in_array($major.'.x', $localBranches, true)) { + return $major.'.x'; + } + + // 2. Find the highest locally available X.Y.x branch for this major. + $minorCandidates = []; + foreach ($localBranches as $b) { + if (preg_match('/^'.preg_quote($major, '/').'\.(\d+)\.x$/', $b, $vm)) { + $minorCandidates[(int) $vm[1]] = $b; + } + } + if (!empty($minorCandidates)) { + krsort($minorCandidates); + + return array_values($minorCandidates)[0]; + } + + // 3. Not found locally: attempt to fetch X.x from origin. + $branch = $major.'.x'; + fwrite(STDERR, "Fetching $branch from origin (local gitcache)...\n"); + exec(sprintf('git -C %s fetch origin %s 2>&1', escapeshellarg($coreDir), escapeshellarg($branch)), $out, $rc); + if ($rc !== 0) { + fwrite(STDERR, "Warning: could not fetch $branch: ".implode("\n", $out)."\n"); + } + + return $branch; +} + +function buildCoreIndex(string $coreDir, string $major, bool $debug): array +{ + $branch = ensureCoreBranch($coreDir, $major); + $index = []; // $index[$nodeId][$message] = true — flattened to arrays at return + + $cmd = sprintf( + 'git -C %s grep -p "_DEPRECATED" %s -- "*.php" "*.module" "*.inc" 2>/dev/null', + escapeshellarg($coreDir), + escapeshellarg($branch) + ); + exec($cmd, $lines); + + $currentFunction = ''; + $currentFile = ''; + $matched = 0; + + foreach ($lines as $line) { + // Split on the first two colons: BRANCH:PATH:CONTENT (match) or BRANCH:PATH=DECL (context). + // Context lines always have = after the filepath; match lines have :. + $colonPos = strpos($line, ':'); + if ($colonPos === false) { + continue; + } + $rest = substr($line, $colonPos + 1); + + // Context line: rest = "filepath=function_decl" + $eqPos = strpos($rest, '='); + $coPos = strpos($rest, ':'); + + if ($eqPos !== false && ($coPos === false || $eqPos < $coPos)) { + $currentFile = substr($rest, 0, $eqPos); + // Extract function name from the declaration after '='. + $decl = substr($rest, $eqPos + 1); + if (preg_match('/function\s+([a-zA-Z_][a-zA-Z0-9_]*)\s*\(/', $decl, $fm)) { + $currentFunction = $fm[1]; + } + continue; + } + + // Match line: rest = "filepath:content" + if ($coPos === false) { + continue; + } + $currentFile = substr($rest, 0, $coPos); + $content = substr($rest, $coPos + 1); + + if (!str_contains($content, '_DEPRECATED')) { + continue; + } + + // Skip @see docblock lines (they contain the node ID but are not trigger_error calls). + if (str_contains($content, '@see ')) { + continue; + } + + $message = extractTriggerErrorMessage($content, $currentFunction, $currentFile); + if ($message === null) { + continue; + } + + // The message must end with "See https://www.drupal.org/node/XXXXXX". + if (!preg_match('/See https:\/\/www\.drupal\.org\/node\/(\d+)/', $message, $nm)) { + continue; + } + + $nodeId = $nm[1]; + ++$matched; + + $index[$nodeId][$message] = true; + } + + if ($debug) { + fwrite(STDERR, sprintf("Core index [%s]: %d node IDs, %d messages\n", + $major, count($index), $matched)); + } + + return array_map('array_keys', $index); +} + +function classFromFilePath(string $filePath): string +{ + $className = basename($filePath, '.php'); + + // core/lib/Drupal/Ns1/.../Class.php → Drupal\Ns1\...\Class + if (preg_match('#core/lib/(.+)/[^/]+\.php$#', $filePath, $m)) { + return str_replace('/', '\\', $m[1]).'\\'.$className; + } + + // core/modules/M/src/[Sub/...]Class.php → Drupal\M[\Sub\...]\Class + if (preg_match('#core/modules/([^/]+)/src(/.*?)?/[^/]+\.php$#', $filePath, $m)) { + $sub = !empty($m[2]) ? str_replace('/', '\\', $m[2]) : ''; + + return 'Drupal\\'.$m[1].$sub.'\\'.$className; + } + + return $className; +} + +function resolveMethod(string $filePath, string $currentFunction): string +{ + if ($filePath === '' || $currentFunction === '') { + return '__METHOD__'; + } + + return classFromFilePath($filePath).'::'.$currentFunction; +} + +function extractTriggerErrorMessage(string $content, string $currentFunction, string $currentFile = ''): ?string +{ + // Case 0: __CLASS__ . '::' . __FUNCTION__ . 'rest' — class::method context + if (preg_match( + '/\@?trigger_error\s*\(\s*__CLASS__\s*\.\s*[\'"]::[\'"]\s*\.\s*__FUNCTION__\s*\.\s*([\'"])(.+?)\1\s*,\s*E_(?:USER_)?DEPRECATED/s', + $content, $m + )) { + return $currentFunction !== '' ? $currentFunction.$m[2] : $m[2]; + } + + // Case 1: __FUNCTION__ . 'rest' or __FUNCTION__ . "rest" + if (preg_match( + '/\@?trigger_error\s*\(\s*__FUNCTION__\s*\.\s*([\'"])(.+?)\1\s*,\s*E_(?:USER_)?DEPRECATED/s', + $content, $m + )) { + if ($currentFunction === '') { + return null; + } + $suffix = $m[2]; + // A trigger_error may concatenate __FUNCTION__ twice, e.g.: + // __FUNCTION__ . '() is deprecated ... ' . __FUNCTION__ . '() may also ...' + // The regex captures the suffix between the first quote pair, which can still + // contain the literal string ' . __FUNCTION__ . ' — resolve it here. + if (str_contains($suffix, '__FUNCTION__')) { + $suffix = preg_replace("/'\\s*\\.\\s*__FUNCTION__\\s*\\.\\s*'/", $currentFunction, $suffix); + $suffix = str_replace('__FUNCTION__', $currentFunction, $suffix); + } + + return $currentFunction.$suffix; + } + + // Case 2: __METHOD__ . 'rest' — resolve to ClassName::method using file path + function context + if (preg_match( + '/\@?trigger_error\s*\(\s*__METHOD__\s*\.\s*([\'"])(.+?)\1\s*,\s*E_(?:USER_)?DEPRECATED/s', + $content, $m + )) { + return resolveMethod($currentFile, $currentFunction).$m[2]; + } + + // Case 3: static string (single or double quote) — may embed magic constants literally + if (preg_match( + '/\@?trigger_error\s*\(\s*([\'"])(.+?)\1\s*,\s*E_(?:USER_)?DEPRECATED/s', + $content, $m + )) { + $message = $m[2]; + // Resolve embedded ' . __METHOD__ . ' / ' . __CLASS__ . ' / ' . __FUNCTION__ . ' patterns. + foreach ([ + '__METHOD__' => resolveMethod($currentFile, $currentFunction), + '__CLASS__' => classFromFilePath($currentFile), + '__FUNCTION__' => $currentFunction, + ] as $magic => $replacement) { + if ($replacement !== '' && str_contains($message, $magic)) { + $message = preg_replace( + "/'\\s*\\.\\s*".preg_quote($magic, '/')."\\s*\\.\\s*'/", + $replacement, + $message + ); + $message = str_replace($magic, $replacement, $message); + } + } + + return $message; + } + + // Case 4: sprintf(format, ...) — URL is embedded in the format string + if (preg_match( + '/\@?trigger_error\s*\(\s*sprintf\s*\(\s*([\'"])(.+?)\1/s', + $content, $m + )) { + $message = $m[2]; + if (str_contains($message, '%s') && $currentFunction !== '') { + // Replace first %s with resolved method name (common pattern: sprintf("Calling %s()...", __METHOD__)) + $method = resolveMethod($currentFile, $currentFunction); + $message = preg_replace('/%s/', $method, $message, 1); + } + + return $message; + } + + return null; +} + +// ============================================================ +// U3b: Drupal core @deprecated annotation index (per major branch) +// ============================================================ + +function buildDeprecatedAnnotationIndex(string $coreDir, string $major, bool $debug): array +{ + $branch = ensureCoreBranch($coreDir, $major); + $index = []; + + // Grep for @deprecated docblocks, capturing 20 lines of context after each match. + // This is enough to reach the @see URL that appears later in the same docblock. + $cmd = sprintf( + 'git -C %s grep -A 20 "@deprecated in drupal:" %s -- "*.php" "*.module" "*.inc" 2>/dev/null', + escapeshellarg($coreDir), + escapeshellarg($branch) + ); + + $handle = popen($cmd, 'r'); + if ($handle === false) { + return []; + } + + $pending = false; // true = inside a @deprecated docblock, scanning for @see + $annotation = ''; + $matched = 0; + + while (false !== ($line = fgets($handle))) { + $line = rtrim($line, "\n\r"); + + // Section separator between match groups. + if ($line === '--') { + $pending = false; + $annotation = ''; + continue; + } + + if (str_contains($line, '@deprecated in drupal:')) { + $pending = true; + // Capture the "in drupal:X.Y.0 ..." fragment as the human-readable message. + $annotation = '@deprecated annotation'; + if (preg_match('/@deprecated (in drupal:[^*\n]+)/', $line, $am)) { + $annotation = '@deprecated '.rtrim(trim($am[1]), ". \t"); + } + // @see may appear on the same line as @deprecated (rare, handle anyway). + if (preg_match('/@see\s+https:\/\/www\.drupal\.org\/node\/(\d+)/', $line, $sm)) { + $index[$sm[1]][$annotation] = true; + ++$matched; + $pending = false; + $annotation = ''; + } + continue; + } + + if (!$pending) { + continue; + } + + // End of docblock reached without finding @see. + if (str_contains($line, '*/')) { + $pending = false; + $annotation = ''; + continue; + } + + if (preg_match('/@see\s+https:\/\/www\.drupal\.org\/node\/(\d+)/', $line, $sm)) { + $index[$sm[1]][$annotation] = true; + ++$matched; + $pending = false; + $annotation = ''; + continue; + } + + // Accumulate continuation lines of the @deprecated text (e.g. " * Use Foo instead."). + // Stop accumulating at any new docblock tag (@param, @see, etc.). + if (preg_match('/\*\s+(\S.*)/', $line, $cm) && !str_starts_with(trim($cm[1]), '@')) { + $annotation = rtrim($annotation, ". \t").' '.trim($cm[1]); + } + } + + pclose($handle); + + if ($debug) { + fwrite(STDERR, sprintf("@deprecated annotation index [%s]: %d node IDs, %d entries\n", + $major, count($index), $matched)); + } + + return array_map('array_keys', $index); +} + +// Build core indices for all major versions referenced by our rector index. +$majorsNeeded = array_unique(array_column($rectorIndex, 'major')); +foreach ($majorsNeeded as $major) { + $triggerIndex = buildCoreIndex($coreDir, $major, $debug); + $annotIndex = buildDeprecatedAnnotationIndex($coreDir, $major, $debug); + // Merge annotation entries alongside trigger_error entries. + foreach ($annotIndex as $nodeId => $messages) { + foreach ($messages as $message) { + if (!in_array($message, $triggerIndex[$nodeId] ?? [], true)) { + $triggerIndex[$nodeId][] = $message; + } + } + } + $coreIndex[$major] = $triggerIndex; +} + +// ============================================================ +// U4: Join rector index with core index and build output rows +// ============================================================ + +/** + * Extract the pure snake_case function name from the start of a deprecation message. + * Returns '' for annotation messages, class::method patterns, or anything unrecognisable. + * We deliberately only filter on plain function names — FQCN/method messages are rarely + * the source of shared-CR false positives and are harder to match in source files. + * + * Handles three Drupal core trigger_error patterns: + * "func_name() is deprecated..." — normal + * "func_name is deprecated..." — no parens + * "func_nameis deprecated..." — Drupal core typo (missing space+parens) + */ +function extractFunctionName(string $message): string +{ + if (str_starts_with($message, '@deprecated')) { + return ''; + } + // Lazy match: stop as soon as we see () OR a lookahead for "is deprecated" + // (with or without a preceding space/parens). + if (preg_match('/^([a-z_][a-z0-9_]*?)(?:\(\)|(?=is\s+deprecated)|(?=\s+is\s+deprecated))/', $message, $m)) { + return $m[1]; + } + return ''; +} + +/** + * Return true if this rector entry is known to handle the given plain function name. + * + * Only custom rectors are filtered: their source file is the definitive record of + * which function(s) they target, so str_contains() is reliable. + * + * Config rectors are NOT filtered here because many use omnibus + * ruleWithConfiguration() blocks that span functions from multiple change records. + * The CR attached to the block may not match the trigger_error CR for every function + * listed, so excluding them would silently drop valid coverage rows. + */ +function rectorHandlesFunction(array $entry, string $funcName): bool +{ + if ($entry['type'] !== 'custom') { + return true; + } + + return isset($entry['source_content']) && str_contains($entry['source_content'], $funcName); +} + +$csvRows = []; + +foreach ($rectorIndex as $entry) { + $major = $entry['major']; + $changeRecordId = $entry['change_record_id']; + $messages = $coreIndex[$major][$changeRecordId] ?? []; + + if (empty($messages)) { + fwrite(STDERR, sprintf("UNMAPPED: %s (change_record: [%s](https://www.drupal.org/node/%s), major: %s, introduced: %s)\n", + $entry['class'], $changeRecordId, $changeRecordId, $major, $entry['introduced'])); + continue; + } + + foreach ($messages as $message) { + // When multiple rectors share a CR, each rector only covers a subset of the + // deprecation messages for that CR. Filter out messages whose deprecated + // function name does not appear in this rector's source or configuration. + $funcName = extractFunctionName($message); + if ($funcName !== '' && !rectorHandlesFunction($entry, $funcName)) { + continue; + } + + $csvRows[] = [ + 'rector_class' => $entry['class'], + 'fqcn' => $entry['fqcn'], + 'source_path' => $entry['file'], + 'issue_node_id' => $entry['issue_id'], + 'change_record_node_id' => $changeRecordId, + 'deprecation_message' => $message, + 'introduced' => $entry['introduced'], + 'configuration_class' => $entry['configuration_class'] ?? null, + 'configuration' => $entry['configuration'] ?? [], + ]; + } +} + +// ============================================================ +// Output dispatch +// ============================================================ + +if ($verify) { + runVerify($csvRows, $coreIndex, $rectorIndex); +} elseif ($phpArray) { + outputPhpArray($csvRows); +} else { + outputCsv($csvRows); +} + +// ============================================================ +// Output: CSV +// ============================================================ + +function outputCsv(array $rows): void +{ + echo "rector_class,source_path,issue_node_id,change_record_node_id,deprecation_message,introduced\n"; + foreach ($rows as $row) { + printf( + '"%s","%s","%s","%s","%s","%s"'."\n", + csvEsc($row['rector_class']), + csvEsc($row['source_path']), + csvEsc($row['issue_node_id']), + csvEsc($row['change_record_node_id']), + csvEsc($row['deprecation_message']), + csvEsc($row['introduced']) + ); + } +} + +function csvEsc(string $s): string +{ + return str_replace('"', '""', $s); +} + +// ============================================================ +// Output: PHP array +// ============================================================ + +function phpSqEsc(string $s): string +{ + return str_replace(['\\', "'"], ['\\\\', "\\'"], $s); +} + +function outputPhpArray(array $rows): void +{ + echo " [\n"; + echo " 'class' => '$cls',\n"; + echo " 'issue' => '{$row['issue_node_id']}',\n"; + echo " 'change_record' => '{$row['change_record_node_id']}',\n"; + echo " 'introduced' => '$introduced',\n"; + if ($row['configuration_class'] !== null) { + $cfgCls = phpSqEsc($row['configuration_class']); + echo " 'configuration_class' => '$cfgCls',\n"; + if (!empty($row['configuration'])) { + echo " 'configuration' => [\n"; + foreach ($row['configuration'] as $args) { + $parts = array_map(static fn ($a) => "'".phpSqEsc((string) $a)."'", $args); + echo ' ['.implode(', ', $parts)."],\n"; + } + echo " ],\n"; + } + } + echo " ],\n"; + } + echo "];\n"; +} + +// ============================================================ +// U6: --verify mode +// ============================================================ + +function runVerify(array $csvRows, array $coreIndex, array $rectorIndex): never +{ + $passes = 0; + $fails = 0; + + $check = static function (bool $ok, string $desc) use (&$passes, &$fails): void { + if ($ok) { + echo "[PASS] $desc\n"; + ++$passes; + } else { + echo "[FAIL] $desc\n"; + ++$fails; + } + }; + + // Index rows by rector class for easy lookup. + $byClass = []; + foreach ($csvRows as $row) { + $byClass[$row['rector_class']][] = $row; + } + + // A1: CheckMarkupToProcessedTextRector has correct issue and change_record IDs. + $cmRows = $byClass['CheckMarkupToProcessedTextRector'] ?? []; + $check( + !empty($cmRows) + && ($cmRows[0]['issue_node_id'] ?? '') === '455724' + && ($cmRows[0]['change_record_node_id'] ?? '') === '3588040', + 'CheckMarkupToProcessedTextRector: issue=455724 https://www.drupal.org/i/455724, change_record=3588040 https://www.drupal.org/i/3588040' + ); + + // A2: CheckMarkupToProcessedTextRector deprecation message starts with expected prefix. + $cmMsg = $cmRows[0]['deprecation_message'] ?? ''; + $check( + str_starts_with($cmMsg, 'check_markup() is deprecated in drupal:11.4.0'), + 'CheckMarkupToProcessedTextRector: message starts with "check_markup() is deprecated in drupal:11.4.0"' + ); + + // A3: change_record 3588040 is indexed under major 11 (confirming 11.x branch was used). + $check( + isset($coreIndex['11']['3588040']), + 'CheckMarkupToProcessedTextRector: change record 3588040 https://www.drupal.org/i/3588040 sourced from 11.x branch' + ); + + // A4: FilterFormatFunctionsToServiceRector has ≥5 rows for change_record 3035368. + $ffRows = array_filter( + $byClass['FilterFormatFunctionsToServiceRector'] ?? [], + static fn ($r) => $r['change_record_node_id'] === '3035368' + ); + $check(count($ffRows) >= 5, sprintf( + 'FilterFormatFunctionsToServiceRector: ≥5 rows for change_record=3035368 https://www.drupal.org/i/3035368 (found %d)', + count($ffRows) + )); + + // A5: All five expected filter function message prefixes appear. + $expectedPrefixes = [ + 'filter_formats(', + 'filter_fallback_format(', + 'filter_get_roles_by_format(', + 'filter_get_formats_by_role(', + 'filter_default_format(', + ]; + $foundPrefixes = []; + foreach ($ffRows as $r) { + foreach ($expectedPrefixes as $prefix) { + if (str_starts_with($r['deprecation_message'], $prefix)) { + $foundPrefixes[$prefix] = true; + } + } + } + $check( + count($foundPrefixes) === count($expectedPrefixes), + sprintf('FilterFormatFunctionsToServiceRector: all 5 expected function message prefixes found (%d/5)', + count($foundPrefixes)) + ); + + // A6: All rows have non-empty introduced value. + $emptyIntroduced = array_filter($csvRows, static fn ($r) => trim($r['introduced']) === ''); + $check(empty($emptyIntroduced), sprintf( + 'All %d rows have non-empty introduced value', + count($csvRows) + )); + + // A7: All rows have non-empty deprecation_message (catches silent join failures). + $emptyMsg = array_filter($csvRows, static fn ($r) => trim($r['deprecation_message']) === ''); + $check(empty($emptyMsg), sprintf( + 'All %d rows have non-empty deprecation_message', + count($csvRows) + )); + + // A8: Total row count ≥ 350 (342 trigger_error rows + annotation entries). + $check(count($csvRows) >= 350, sprintf('Total rows: %d (≥ 350)', count($csvRows))); + + // A9: No date-shaped introduced values (all should be tags or "unreleased"). + $dateRows = array_filter($csvRows, static fn ($r) => (bool) preg_match('/^\d{4}-\d{2}-\d{2}/', $r['introduced'])); + $check(empty($dateRows), 'No date-shaped introduced values (all are version tags or "unreleased")'); + + // A10: A known D10 deprecation is indexed from 10.x branch but absent from 11.x. + // Uses watchdog_exception() (change_record=2932520, deprecated in 10.1.0, removed in 11.0.0) + // as the routing test: it must appear in coreIndex[10] but not coreIndex[11]. + $d10InTen = isset($coreIndex['10']['2932520']); + $d10NotInElev = !isset($coreIndex['11']['2932520']); + $check( + $d10InTen && $d10NotInElev, + 'watchdog_exception() (change_record=2932520 https://www.drupal.org/i/2932520): found in 10.x branch index, absent from 11.x (confirms branch routing)' + ); + + $total = $passes + $fails; + echo "\n$passes/$total checks passed.\n"; + exit($fails > 0 ? 1 : 0); +} From 31a69ba0b5c0ef5e87f72fe8a281dcbc10dfa186 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 22 May 2026 14:22:28 +0200 Subject: [PATCH 226/256] ignore docs plans --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 37dbea0a2..d2680e282 100644 --- a/.gitignore +++ b/.gitignore @@ -21,4 +21,5 @@ .worktrees/ rector-decision.log docs/rector-index.yml +docs/plans/ /repos/ From 2303db200c8845a79da18e1339f2e1cbbcc58852 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 22 May 2026 15:35:59 +0200 Subject: [PATCH 227/256] feat: add missing tests and a skipped function --- config/drupal-11/drupal-11.4-deprecations.php | 7 +++-- .../config/configured_rule.php | 28 +++++++++++++++++++ .../contextual_procedural_functions.php.inc | 15 ++++++++++ .../editor_procedural_functions.php.inc | 15 ++++++++++ .../fixture/field_purge_batch.php.inc | 13 +++++++++ .../image_procedural_functions.php.inc | 15 ++++++++++ .../locale_file_manager_functions.php.inc | 19 +++++++++++++ ...media_library_procedural_functions.php.inc | 15 ++++++++++ .../responsive_image_functions.php.inc | 19 +++++++++++++ .../views_procedural_functions.php.inc | 17 +++++++++++ 10 files changed, 161 insertions(+), 2 deletions(-) create mode 100644 tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/contextual_procedural_functions.php.inc create mode 100644 tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/editor_procedural_functions.php.inc create mode 100644 tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/field_purge_batch.php.inc create mode 100644 tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/image_procedural_functions.php.inc create mode 100644 tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/locale_file_manager_functions.php.inc create mode 100644 tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/media_library_procedural_functions.php.inc create mode 100644 tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/responsive_image_functions.php.inc create mode 100644 tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/views_procedural_functions.php.inc diff --git a/config/drupal-11/drupal-11.4-deprecations.php b/config/drupal-11/drupal-11.4-deprecations.php index b7903c1e0..bc895166b 100644 --- a/config/drupal-11/drupal-11.4-deprecations.php +++ b/config/drupal-11/drupal-11.4-deprecations.php @@ -372,11 +372,14 @@ // locale_translate_get_interface_translation_files() deprecated in drupal:11.4.0, removed in drupal:13.0.0. // Replaced by LocaleFileManager::getInterfaceTranslationFiles(). $rectorConfig->ruleWithConfiguration(FunctionToServiceRector::class, [ - new FunctionToServiceConfiguration('11.4.0', 'contextual_links_to_id', 'Drupal\contextual\ContextualLinksSerializer', 'linksToId'), - new FunctionToServiceConfiguration('11.4.0', 'contextual_id_to_links', 'Drupal\contextual\ContextualLinksSerializer', 'idToLinks'), + new FunctionToServiceConfiguration('11.4.0', '_contextual_links_to_id', 'Drupal\contextual\ContextualLinksSerializer', 'linksToId'), + new FunctionToServiceConfiguration('11.4.0', '_contextual_id_to_links', 'Drupal\contextual\ContextualLinksSerializer', 'idToLinks'), new FunctionToServiceConfiguration('11.4.0', 'image_path_flush', 'Drupal\image\ImageDerivativeUtilities', 'pathFlush'), new FunctionToServiceConfiguration('11.4.0', 'image_style_options', 'Drupal\image\ImageDerivativeUtilities', 'styleOptions'), new FunctionToServiceConfiguration('11.4.0', 'locale_translate_get_interface_translation_files', 'Drupal\locale\File\LocaleFileManager', 'getInterfaceTranslationFiles'), + new FunctionToServiceConfiguration('11.4.0', 'locale_translation_http_check', 'Drupal\locale\File\LocaleFileManager', 'checkRemoteFileStatus'), + new FunctionToServiceConfiguration('11.4.0', 'locale_translate_delete_translation_files', 'Drupal\locale\File\LocaleFileManager', 'deleteTranslationFiles'), + new FunctionToServiceConfiguration('11.4.0', 'locale_translation_download_source', 'Drupal\locale\File\LocaleFileManager', 'downloadTranslationSource'), ]); // https://www.drupal.org/node/2571679 diff --git a/tests/src/Rector/Deprecation/FunctionToServiceRector/config/configured_rule.php b/tests/src/Rector/Deprecation/FunctionToServiceRector/config/configured_rule.php index 693683b2d..e9470ee86 100644 --- a/tests/src/Rector/Deprecation/FunctionToServiceRector/config/configured_rule.php +++ b/tests/src/Rector/Deprecation/FunctionToServiceRector/config/configured_rule.php @@ -15,6 +15,10 @@ new FunctionToServiceConfiguration('9.3.0', 'file_save_data', 'file.repository', 'writeData'), new FunctionToServiceConfiguration('10.1.0', 'drupal_theme_rebuild', 'theme.registry', 'reset'), new FunctionToServiceConfiguration('10.2.0', '_drupal_flush_css_js', 'asset.query_string', 'reset'), + // https://www.drupal.org/node/3489502 (Drupal 11.2) + new FunctionToServiceConfiguration('11.2.0', '_views_field_get_entity_type_storage', 'views.field_data_provider', 'getSqlStorageForField'), + new FunctionToServiceConfiguration('11.2.0', 'views_entity_field_label', 'entity_field.manager', 'getFieldLabels'), + new FunctionToServiceConfiguration('11.2.0', 'views_field_default_views_data', 'views.field_data_provider', 'defaultFieldImplementation'), // https://www.drupal.org/node/3501136 (Drupal 11.2) new FunctionToServiceConfiguration('11.2.0', 'template_preprocess_time', 'Drupal\Core\Datetime\DatePreprocess', 'preprocessTime'), new FunctionToServiceConfiguration('11.2.0', 'template_preprocess_datetime_form', 'Drupal\Core\Datetime\DatePreprocess', 'preprocessDatetimeForm'), @@ -23,12 +27,36 @@ new FunctionToServiceConfiguration('11.2.0', 'template_preprocess_container', 'Drupal\Core\Theme\ThemePreprocess', 'preprocessContainer'), new FunctionToServiceConfiguration('11.2.0', 'template_preprocess_html', 'Drupal\Core\Theme\ThemePreprocess', 'preprocessHtml'), new FunctionToServiceConfiguration('11.2.0', 'template_preprocess_page', 'Drupal\Core\Theme\ThemePreprocess', 'preprocessPage'), + // https://www.drupal.org/node/3548329 (Drupal 11.3) + new FunctionToServiceConfiguration('11.3.0', '_responsive_image_build_source_attributes', 'Drupal\responsive_image\ResponsiveImageBuilder', 'buildSourceAttributes'), + new FunctionToServiceConfiguration('11.3.0', '_responsive_image_image_style_url', 'Drupal\responsive_image\ResponsiveImageBuilder', 'getImageStyleUrl'), + new FunctionToServiceConfiguration('11.3.0', 'responsive_image_get_image_dimensions', 'Drupal\responsive_image\ResponsiveImageBuilder', 'getImageDimensions'), + new FunctionToServiceConfiguration('11.3.0', 'responsive_image_get_mime_type', 'Drupal\responsive_image\ResponsiveImageBuilder', 'getMimeType'), // https://www.drupal.org/node/3533083 (Drupal 11.3) new FunctionToServiceConfiguration('11.3.0', 'node_mass_update', 'Drupal\node\NodeBulkUpdate', 'process', true), // https://www.drupal.org/node/3571382 (Drupal 11.3) new FunctionToServiceConfiguration('11.3.0', 'template_preprocess_layout', 'Drupal\layout_discovery\Hook\LayoutDiscoveryThemeHooks', 'preprocessLayout', true), // https://www.drupal.org/node/1685492 (Drupal 11.3) new FunctionToServiceConfiguration('11.3.0', 'twig_render_template', 'Drupal\Core\Template\TwigThemeEngine', 'renderTemplate'), + // https://www.drupal.org/node/3568088 (Drupal 11.4) + new FunctionToServiceConfiguration('11.4.0', '_contextual_links_to_id', 'Drupal\contextual\ContextualLinksSerializer', 'linksToId'), + new FunctionToServiceConfiguration('11.4.0', '_contextual_id_to_links', 'Drupal\contextual\ContextualLinksSerializer', 'idToLinks'), + // https://www.drupal.org/node/3570917 (Drupal 11.4) + new FunctionToServiceConfiguration('11.4.0', 'editor_filter_xss', 'element.editor', 'filterXss'), + new FunctionToServiceConfiguration('11.4.0', 'editor_image_upload_settings_form', 'Drupal\editor\EditorImageUploadSettings', 'getForm'), + // https://www.drupal.org/node/3494023 (Drupal 11.4) + new FunctionToServiceConfiguration('11.4.0', 'field_purge_batch', 'Drupal\Core\Field\FieldPurger', 'purgeBatch'), + // https://www.drupal.org/node/3567619 (Drupal 11.4) + new FunctionToServiceConfiguration('11.4.0', 'image_path_flush', 'Drupal\image\ImageDerivativeUtilities', 'pathFlush'), + new FunctionToServiceConfiguration('11.4.0', 'image_style_options', 'Drupal\image\ImageDerivativeUtilities', 'styleOptions'), + // https://www.drupal.org/node/3577675 (Drupal 11.4) + new FunctionToServiceConfiguration('11.4.0', 'locale_translate_get_interface_translation_files', 'Drupal\locale\File\LocaleFileManager', 'getInterfaceTranslationFiles'), + new FunctionToServiceConfiguration('11.4.0', 'locale_translation_http_check', 'Drupal\locale\File\LocaleFileManager', 'checkRemoteFileStatus'), + new FunctionToServiceConfiguration('11.4.0', 'locale_translate_delete_translation_files', 'Drupal\locale\File\LocaleFileManager', 'deleteTranslationFiles'), + new FunctionToServiceConfiguration('11.4.0', 'locale_translation_download_source', 'Drupal\locale\File\LocaleFileManager', 'downloadTranslationSource'), + // https://www.drupal.org/node/3566774 (Drupal 11.4) + new FunctionToServiceConfiguration('11.4.0', '_media_library_media_type_form_submit', 'Drupal\media_library\Hook\MediaLibraryHooks', 'mediaTypeFormSubmit'), + new FunctionToServiceConfiguration('11.4.0', '_media_library_views_form_media_library_after_build', 'Drupal\media_library\Hook\MediaLibraryHooks', 'viewsFormAfterBuild'), // https://www.drupal.org/node/3574727 (Drupal 11.4) new FunctionToServiceConfiguration('11.4.0', 'language_process_language_select', 'Drupal\language\Hook\LanguageHooks', 'processLanguageSelect'), // https://www.drupal.org/node/3566792 (Drupal 11.4) diff --git a/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/contextual_procedural_functions.php.inc b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/contextual_procedural_functions.php.inc new file mode 100644 index 000000000..c875a7aff --- /dev/null +++ b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/contextual_procedural_functions.php.inc @@ -0,0 +1,15 @@ + +----- + \Drupal::service('Drupal\contextual\ContextualLinksSerializer')->linksToId($contextual_links), fn() => _contextual_links_to_id($contextual_links)); + $links = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('Drupal\contextual\ContextualLinksSerializer')->idToLinks($id), fn() => _contextual_id_to_links($id)); +} +?> diff --git a/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/editor_procedural_functions.php.inc b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/editor_procedural_functions.php.inc new file mode 100644 index 000000000..b239149e5 --- /dev/null +++ b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/editor_procedural_functions.php.inc @@ -0,0 +1,15 @@ + +----- + \Drupal::service('element.editor')->filterXss($html, $format, $original_format), fn() => editor_filter_xss($html, $format, $original_format)); + $form = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('Drupal\editor\EditorImageUploadSettings')->getForm($editor), fn() => editor_image_upload_settings_form($editor)); +} +?> diff --git a/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/field_purge_batch.php.inc b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/field_purge_batch.php.inc new file mode 100644 index 000000000..e0b7bbbd6 --- /dev/null +++ b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/field_purge_batch.php.inc @@ -0,0 +1,13 @@ + +----- + \Drupal::service('Drupal\Core\Field\FieldPurger')->purgeBatch($batch_size, $field_storage_unique_id), fn() => field_purge_batch($batch_size, $field_storage_unique_id)); +} +?> diff --git a/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/image_procedural_functions.php.inc b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/image_procedural_functions.php.inc new file mode 100644 index 000000000..7eadf3eac --- /dev/null +++ b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/image_procedural_functions.php.inc @@ -0,0 +1,15 @@ + +----- + \Drupal::service('Drupal\image\ImageDerivativeUtilities')->pathFlush($path), fn() => image_path_flush($path)); + $options = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('Drupal\image\ImageDerivativeUtilities')->styleOptions($include_empty), fn() => image_style_options($include_empty)); +} +?> diff --git a/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/locale_file_manager_functions.php.inc b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/locale_file_manager_functions.php.inc new file mode 100644 index 000000000..1928b027a --- /dev/null +++ b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/locale_file_manager_functions.php.inc @@ -0,0 +1,19 @@ + +----- + \Drupal::service('Drupal\locale\File\LocaleFileManager')->getInterfaceTranslationFiles($projects, $langcodes), fn() => locale_translate_get_interface_translation_files($projects, $langcodes)); + $status = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('Drupal\locale\File\LocaleFileManager')->checkRemoteFileStatus($uri), fn() => locale_translation_http_check($uri)); + $result = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('Drupal\locale\File\LocaleFileManager')->deleteTranslationFiles($projects, $langcodes), fn() => locale_translate_delete_translation_files($projects, $langcodes)); + $downloaded = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('Drupal\locale\File\LocaleFileManager')->downloadTranslationSource($source_file, $directory), fn() => locale_translation_download_source($source_file, $directory)); +} +?> diff --git a/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/media_library_procedural_functions.php.inc b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/media_library_procedural_functions.php.inc new file mode 100644 index 000000000..e48c132f8 --- /dev/null +++ b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/media_library_procedural_functions.php.inc @@ -0,0 +1,15 @@ + +----- + \Drupal::service('Drupal\media_library\Hook\MediaLibraryHooks')->mediaTypeFormSubmit($form, $form_state), fn() => _media_library_media_type_form_submit($form, $form_state)); + $result = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal::service('Drupal\media_library\Hook\MediaLibraryHooks')->viewsFormAfterBuild($form, $form_state), fn() => _media_library_views_form_media_library_after_build($form, $form_state)); +} +?> diff --git a/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/responsive_image_functions.php.inc b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/responsive_image_functions.php.inc new file mode 100644 index 000000000..a5cef4c79 --- /dev/null +++ b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/responsive_image_functions.php.inc @@ -0,0 +1,19 @@ + +----- + \Drupal::service('Drupal\responsive_image\ResponsiveImageBuilder')->buildSourceAttributes($variables, $breakpoint, $multipliers), fn() => _responsive_image_build_source_attributes($variables, $breakpoint, $multipliers)); + $dims = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => \Drupal::service('Drupal\responsive_image\ResponsiveImageBuilder')->getImageDimensions($image_style_name, $dimensions, $uri), fn() => responsive_image_get_image_dimensions($image_style_name, $dimensions, $uri)); + $mime = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => \Drupal::service('Drupal\responsive_image\ResponsiveImageBuilder')->getMimeType($image_style_name, $extension), fn() => responsive_image_get_mime_type($image_style_name, $extension)); + $url = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.3.0', fn() => \Drupal::service('Drupal\responsive_image\ResponsiveImageBuilder')->getImageStyleUrl($style_name, $path), fn() => _responsive_image_image_style_url($style_name, $path)); +} +?> diff --git a/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/views_procedural_functions.php.inc b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/views_procedural_functions.php.inc new file mode 100644 index 000000000..3dcfae473 --- /dev/null +++ b/tests/src/Rector/Deprecation/FunctionToServiceRector/fixture/views_procedural_functions.php.inc @@ -0,0 +1,17 @@ + +----- + \Drupal::service('views.field_data_provider')->getSqlStorageForField($field_storage), fn() => _views_field_get_entity_type_storage($field_storage)); + $labels = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => \Drupal::service('entity_field.manager')->getFieldLabels($entity_type, $field_name), fn() => views_entity_field_label($entity_type, $field_name)); + $data = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => \Drupal::service('views.field_data_provider')->defaultFieldImplementation($field_storage), fn() => views_field_default_views_data($field_storage)); +} +?> From cc64db8fe618929ceca974e5e1e5a45eb2fb4fe9 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 22 May 2026 15:47:40 +0200 Subject: [PATCH 228/256] feat: add missing tests --- .../config/configured_rule.php | 1 + .../drupal_11_4_image_constants.php.inc | 11 +++++++++++ .../fixture/drupal_11_4_image_constants.php.inc | 13 +++++++++++++ .../config/configured_rule.php | 5 +++++ .../fixture/block_theme_initialize.php.inc | 14 ++++++++++++++ .../fixture/syslog_functions.php.inc | 15 +++++++++++++++ .../fixture/taxonomy_node_index_functions.php.inc | 15 +++++++++++++++ .../config/configured_rule.php | 5 +++++ .../fixture/file_system_settings_submit.php.inc | 13 +++++++++++++ ...brary_display_manager_static_functions.php.inc | 15 +++++++++++++++ 10 files changed, 107 insertions(+) create mode 100644 tests/src/Rector/Deprecation/ConstantToClassConstantRector/fixture-below-version/drupal_11_4_image_constants.php.inc create mode 100644 tests/src/Rector/Deprecation/ConstantToClassConstantRector/fixture/drupal_11_4_image_constants.php.inc create mode 100644 tests/src/Rector/Deprecation/FunctionCallRemovalRector/fixture/block_theme_initialize.php.inc create mode 100644 tests/src/Rector/Deprecation/FunctionCallRemovalRector/fixture/syslog_functions.php.inc create mode 100644 tests/src/Rector/Deprecation/FunctionCallRemovalRector/fixture/taxonomy_node_index_functions.php.inc create mode 100644 tests/src/Rector/Deprecation/FunctionToStaticRector/fixture/file_system_settings_submit.php.inc create mode 100644 tests/src/Rector/Deprecation/FunctionToStaticRector/fixture/media_library_display_manager_static_functions.php.inc diff --git a/tests/src/Rector/Deprecation/ConstantToClassConstantRector/config/configured_rule.php b/tests/src/Rector/Deprecation/ConstantToClassConstantRector/config/configured_rule.php index 7e4f0dd7e..a1e4ec518 100644 --- a/tests/src/Rector/Deprecation/ConstantToClassConstantRector/config/configured_rule.php +++ b/tests/src/Rector/Deprecation/ConstantToClassConstantRector/config/configured_rule.php @@ -34,5 +34,6 @@ new ConstantToClassConfiguration('JSONAPI_FILTER_AMONG_PUBLISHED', 'Drupal\jsonapi\JsonApiFilter', 'AMONG_PUBLISHED', '11.3.0'), new ConstantToClassConfiguration('JSONAPI_FILTER_AMONG_ENABLED', 'Drupal\jsonapi\JsonApiFilter', 'AMONG_ENABLED', '11.3.0'), new ConstantToClassConfiguration('JSONAPI_FILTER_AMONG_OWN', 'Drupal\jsonapi\JsonApiFilter', 'AMONG_OWN', '11.3.0'), + new ConstantToClassConfiguration('IMAGE_DERIVATIVE_TOKEN', 'Drupal\image\ImageStyleInterface', 'TOKEN', '11.4.0'), ]); }; diff --git a/tests/src/Rector/Deprecation/ConstantToClassConstantRector/fixture-below-version/drupal_11_4_image_constants.php.inc b/tests/src/Rector/Deprecation/ConstantToClassConstantRector/fixture-below-version/drupal_11_4_image_constants.php.inc new file mode 100644 index 000000000..e9c345185 --- /dev/null +++ b/tests/src/Rector/Deprecation/ConstantToClassConstantRector/fixture-below-version/drupal_11_4_image_constants.php.inc @@ -0,0 +1,11 @@ + +----- + diff --git a/tests/src/Rector/Deprecation/ConstantToClassConstantRector/fixture/drupal_11_4_image_constants.php.inc b/tests/src/Rector/Deprecation/ConstantToClassConstantRector/fixture/drupal_11_4_image_constants.php.inc new file mode 100644 index 000000000..b8f7aa7c8 --- /dev/null +++ b/tests/src/Rector/Deprecation/ConstantToClassConstantRector/fixture/drupal_11_4_image_constants.php.inc @@ -0,0 +1,13 @@ + +----- + \Drupal\image\ImageStyleInterface::TOKEN, fn() => IMAGE_DERIVATIVE_TOKEN); + +?> diff --git a/tests/src/Rector/Deprecation/FunctionCallRemovalRector/config/configured_rule.php b/tests/src/Rector/Deprecation/FunctionCallRemovalRector/config/configured_rule.php index 06460cb8d..db062706c 100644 --- a/tests/src/Rector/Deprecation/FunctionCallRemovalRector/config/configured_rule.php +++ b/tests/src/Rector/Deprecation/FunctionCallRemovalRector/config/configured_rule.php @@ -20,5 +20,10 @@ new FunctionCallRemovalConfiguration('views_ui_contextual_links_suppress_push'), new FunctionCallRemovalConfiguration('views_ui_contextual_links_suppress_pop'), new FunctionCallRemovalConfiguration('automated_cron_settings_submit'), + new FunctionCallRemovalConfiguration('block_theme_initialize'), + new FunctionCallRemovalConfiguration('syslog_facility_list'), + new FunctionCallRemovalConfiguration('syslog_logging_settings_submit'), + new FunctionCallRemovalConfiguration('taxonomy_build_node_index'), + new FunctionCallRemovalConfiguration('taxonomy_delete_node_index'), ]); }; diff --git a/tests/src/Rector/Deprecation/FunctionCallRemovalRector/fixture/block_theme_initialize.php.inc b/tests/src/Rector/Deprecation/FunctionCallRemovalRector/fixture/block_theme_initialize.php.inc new file mode 100644 index 000000000..11c44ebd0 --- /dev/null +++ b/tests/src/Rector/Deprecation/FunctionCallRemovalRector/fixture/block_theme_initialize.php.inc @@ -0,0 +1,14 @@ + +----- + diff --git a/tests/src/Rector/Deprecation/FunctionCallRemovalRector/fixture/syslog_functions.php.inc b/tests/src/Rector/Deprecation/FunctionCallRemovalRector/fixture/syslog_functions.php.inc new file mode 100644 index 000000000..7b37ca6e2 --- /dev/null +++ b/tests/src/Rector/Deprecation/FunctionCallRemovalRector/fixture/syslog_functions.php.inc @@ -0,0 +1,15 @@ + +----- + diff --git a/tests/src/Rector/Deprecation/FunctionCallRemovalRector/fixture/taxonomy_node_index_functions.php.inc b/tests/src/Rector/Deprecation/FunctionCallRemovalRector/fixture/taxonomy_node_index_functions.php.inc new file mode 100644 index 000000000..35291ba1c --- /dev/null +++ b/tests/src/Rector/Deprecation/FunctionCallRemovalRector/fixture/taxonomy_node_index_functions.php.inc @@ -0,0 +1,15 @@ + +----- + diff --git a/tests/src/Rector/Deprecation/FunctionToStaticRector/config/configured_rule.php b/tests/src/Rector/Deprecation/FunctionToStaticRector/config/configured_rule.php index 7f87682e4..64f0d2168 100644 --- a/tests/src/Rector/Deprecation/FunctionToStaticRector/config/configured_rule.php +++ b/tests/src/Rector/Deprecation/FunctionToStaticRector/config/configured_rule.php @@ -21,8 +21,13 @@ new FunctionToStaticConfiguration('11.4.0', 'views_ui_add_limited_validation', 'Drupal\views\ViewsFormAjaxHelperTrait', 'addLimitedValidation'), new FunctionToStaticConfiguration('11.4.0', 'views_ui_add_ajax_wrapper', 'Drupal\views\ViewsFormAjaxHelperTrait', 'addAjaxWrapper'), new FunctionToStaticConfiguration('11.4.0', 'views_ui_nojs_submit', 'Drupal\views\ViewsFormAjaxHelperTrait', 'noJsSubmit'), + // https://www.drupal.org/node/3534092 (Drupal 11.3) + new FunctionToStaticConfiguration('11.3.0', 'file_system_settings_submit', 'Drupal\file\Hook\FileHooks', 'settingsSubmit'), // https://www.drupal.org/node/3534089 (Drupal 11.3) new FunctionToStaticConfiguration('11.3.0', 'file_managed_file_submit', 'Drupal\file\Element\ManagedFile', 'submit'), + // https://www.drupal.org/node/3566774 (Drupal 11.4) + new FunctionToStaticConfiguration('11.4.0', '_media_library_configure_form_display', 'Drupal\media_library\MediaLibraryDisplayManager', 'configureFormDisplay'), + new FunctionToStaticConfiguration('11.4.0', '_media_library_configure_view_display', 'Drupal\media_library\MediaLibraryDisplayManager', 'configureViewDisplay'), // https://www.drupal.org/node/3495966 (Drupal 11.2) new FunctionToStaticConfiguration('11.2.0', 'entity_test_create_bundle', 'Drupal\entity_test\EntityTestHelper', 'createBundle'), new FunctionToStaticConfiguration('11.2.0', 'entity_test_delete_bundle', 'Drupal\entity_test\EntityTestHelper', 'deleteBundle'), diff --git a/tests/src/Rector/Deprecation/FunctionToStaticRector/fixture/file_system_settings_submit.php.inc b/tests/src/Rector/Deprecation/FunctionToStaticRector/fixture/file_system_settings_submit.php.inc new file mode 100644 index 000000000..60cd333c1 --- /dev/null +++ b/tests/src/Rector/Deprecation/FunctionToStaticRector/fixture/file_system_settings_submit.php.inc @@ -0,0 +1,13 @@ + +----- + \Drupal\file\Hook\FileHooks::settingsSubmit($form, $form_state), fn() => file_system_settings_submit($form, $form_state)); +} +?> diff --git a/tests/src/Rector/Deprecation/FunctionToStaticRector/fixture/media_library_display_manager_static_functions.php.inc b/tests/src/Rector/Deprecation/FunctionToStaticRector/fixture/media_library_display_manager_static_functions.php.inc new file mode 100644 index 000000000..ee73df690 --- /dev/null +++ b/tests/src/Rector/Deprecation/FunctionToStaticRector/fixture/media_library_display_manager_static_functions.php.inc @@ -0,0 +1,15 @@ + +----- + \Drupal\media_library\MediaLibraryDisplayManager::configureFormDisplay($type), fn() => _media_library_configure_form_display($type)); + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal\media_library\MediaLibraryDisplayManager::configureViewDisplay($type), fn() => _media_library_configure_view_display($type)); +} +?> From c44c796903f09dd2a2a112451b080f8286508712 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 22 May 2026 18:38:26 +0200 Subject: [PATCH 229/256] test: fix test, no sense to have a return here. --- .../fixture/hookconvertrector_updated/hookconvertrector.module | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/functional/hookconvertrector/fixture/hookconvertrector_updated/hookconvertrector.module b/tests/functional/hookconvertrector/fixture/hookconvertrector_updated/hookconvertrector.module index 573e647bd..5cc35874e 100644 --- a/tests/functional/hookconvertrector/fixture/hookconvertrector_updated/hookconvertrector.module +++ b/tests/functional/hookconvertrector/fixture/hookconvertrector_updated/hookconvertrector.module @@ -36,5 +36,5 @@ function hookconvertrector_user_add($edit, UserInterface $account, $method) { #[LegacyHook] function hookconvertrector_page_attachments(array &$page) { - return \Drupal::service(HookconvertrectorHooks::class)->pageAttachments($page); + \Drupal::service(HookconvertrectorHooks::class)->pageAttachments($page); } From e0de4b19112869df89048baacdd03117cab4afd3 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 22 May 2026 18:54:43 +0200 Subject: [PATCH 230/256] docs: small readme fix --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7842a644c..bd359778c 100644 --- a/README.md +++ b/README.md @@ -76,7 +76,7 @@ cp vendor/palantirnet/drupal-rector/rector.php . ``` By default, Drupal Rector will fix deprecated code for all versions of Drupal. If you want to change this behavior, modify -the sets used in the `rector.php` config. For example, if your site is still on Drupal 10.3, and you cannot fix deprecations +the sets used in the `rector.php` config. For example, if your site is still on Drupal 10.3, and you do not want to fix deprecations made in Drupal 10.4, use the following configuration: ```php @@ -88,7 +88,7 @@ $rectorConfig->sets([ ]); ``` -This is more granular than the `Drupal10SetList::DRUPAL_10` set. +This is more granular than the `Drupal10SetList::DRUPAL_10` set. Since Drupal 10.1 there is not real reason not to include later versions. It will detect the installed Drupal version and supply BC wrappers as needed if you enable it in the config. ### DrupalRectorSettings From 4ecf61e3502654d07dc080ae9f3c35aa6d0504e0 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 22 May 2026 18:55:10 +0200 Subject: [PATCH 231/256] build: Add .gitattributes make packages cleaner --- .gitattributes | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..6ed4397e6 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,16 @@ +/.claude export-ignore +/.github export-ignore +/.editorconfig export-ignore +/.gitattributes export-ignore +/.gitignore export-ignore +/.php-cs-fixer.dist.php export-ignore +/behat.yml export-ignore +/phpstan.neon export-ignore +/phpstan-baseline.neon export-ignore +/phpunit.xml export-ignore +/tests export-ignore +/fixtures export-ignore +/scripts export-ignore +/docs export-ignore +/rector.php export-ignore +/README-automated-testing.md export-ignore From 02b0abb5a2cecd0a6a59757b948c868a4c58e2da Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 22 May 2026 18:58:10 +0200 Subject: [PATCH 232/256] build: fix codestyle --- scripts/generate-deprecation-map.php | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/scripts/generate-deprecation-map.php b/scripts/generate-deprecation-map.php index 8b1f6b0a6..26a0d3f26 100755 --- a/scripts/generate-deprecation-map.php +++ b/scripts/generate-deprecation-map.php @@ -131,17 +131,17 @@ function relPath(string $rootDir, string $absPath): string $relPath = relPath($rootDir, $absPath); $rectorIndex[$className] = [ - 'class' => $className, - 'fqcn' => $fqcn, - 'file' => $relPath, - 'major' => $major, - 'issue_id' => $issueId, - 'change_record_id' => $changeRecordId, - 'type' => 'custom', - 'introduced' => introducedForFile($rootDir, $relPath, $tagCache), + 'class' => $className, + 'fqcn' => $fqcn, + 'file' => $relPath, + 'major' => $major, + 'issue_id' => $issueId, + 'change_record_id' => $changeRecordId, + 'type' => 'custom', + 'introduced' => introducedForFile($rootDir, $relPath, $tagCache), 'configuration_class' => null, - 'configuration' => [], - 'source_content' => $content, + 'configuration' => [], + 'source_content' => $content, ]; } @@ -652,6 +652,7 @@ function extractFunctionName(string $message): string if (preg_match('/^([a-z_][a-z0-9_]*?)(?:\(\)|(?=is\s+deprecated)|(?=\s+is\s+deprecated))/', $message, $m)) { return $m[1]; } + return ''; } From 6a4b5d7b688951f9cfbba0e318186b34e53d6203 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 22 May 2026 19:00:35 +0200 Subject: [PATCH 233/256] test: lets try and fix the functional test, since gitattributes remove the tests folder --- .github/workflows/functional_test__single_rectors.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/functional_test__single_rectors.yml b/.github/workflows/functional_test__single_rectors.yml index 549316913..72c0ef91e 100644 --- a/.github/workflows/functional_test__single_rectors.yml +++ b/.github/workflows/functional_test__single_rectors.yml @@ -36,7 +36,7 @@ jobs: run: | cd ~/drupal mkdir -p web/modules/custom - cp -R vendor/palantirnet/drupal-rector/tests/functional/hookconvertrector/fixture/hookconvertrector web/modules/custom/hookconvertrector + cp -R tests/functional/hookconvertrector/fixture/hookconvertrector web/modules/custom/hookconvertrector # dry-run is expected to return exit code 2 if there are changes, which we are expecting to happen, here. # an error code of 1 represents other errors. # @see \Rector\Core\Console\ExitCode::CHANGED_CODE @@ -46,7 +46,7 @@ jobs: for d in web/modules/custom/*; do if [ -d "$d" ]; then echo "Processing $d" - cp vendor/palantirnet/drupal-rector/tests/functional/$(basename ${d})/rector.php . + cp tests/functional/$(basename ${d})/rector.php . vendor/bin/rector process $d --dry-run --debug || if (($? == 2)); then true; else exit 1; fi fi done @@ -56,7 +56,7 @@ jobs: for d in web/modules/custom/*; do if [ -d "$d" ]; then echo "Processing $d" - cp vendor/palantirnet/drupal-rector/tests/functional/$(basename ${d})/rector.php . + cp tests/functional/$(basename ${d})/rector.php . vendor/bin/rector process $d --debug fi done @@ -71,6 +71,6 @@ jobs: cd ~/drupal for d in web/modules/custom/*; do if [ -d "$d" ]; then - diff --color -rubB "$d" "vendor/palantirnet/drupal-rector/tests/functional/$(basename ${d})/fixture/$(basename ${d})_updated" + diff --color -rubB "$d" "tests/functional/$(basename ${d})/fixture/$(basename ${d})_updated" fi done From 44f4c6f805c85ba9bc5e29b98c573c34e704f389 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Brala?= Date: Fri, 22 May 2026 19:16:24 +0200 Subject: [PATCH 234/256] Update src/Services/DrupalRectorSettings.php Co-authored-by: Matt Glaman --- src/Services/DrupalRectorSettings.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Services/DrupalRectorSettings.php b/src/Services/DrupalRectorSettings.php index bf6c819ed..63c2dddca 100644 --- a/src/Services/DrupalRectorSettings.php +++ b/src/Services/DrupalRectorSettings.php @@ -6,7 +6,7 @@ class DrupalRectorSettings { - private bool $backwardCompatibilityEnabled = true; + private bool $backwardCompatibilityEnabled = false; private string $minimumCoreVersionSupported = '10.1.0'; From 0b05014cad6ba2eea7232da6bbc0be216d5c7283 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 22 May 2026 19:13:45 +0200 Subject: [PATCH 235/256] fix: ReplacePdoFetchConstantsRector was missing a typeguard --- .../ReplacePdoFetchConstantsRector.php | 5 +++ .../fixture-below-version/basic.php.inc | 34 +++++++++++-------- .../fetch_column_and_class.php.inc | 20 +++++++---- .../no_change_native_pdo.php.inc | 4 +++ .../no_type_guard_native_pdo.php.inc | 17 ---------- .../fixture/basic.php.inc | 34 +++++++++++-------- .../fixture/fetch_column_and_class.php.inc | 20 +++++++---- .../fixture/no_change_native_pdo.php.inc | 4 +++ .../fixture/no_type_guard_native_pdo.php.inc | 17 ---------- 9 files changed, 81 insertions(+), 74 deletions(-) create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture-below-version/no_change_native_pdo.php.inc delete mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture-below-version/no_type_guard_native_pdo.php.inc create mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/no_change_native_pdo.php.inc delete mode 100644 tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/no_type_guard_native_pdo.php.inc diff --git a/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector.php b/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector.php index 2363c61b5..1b4181aec 100644 --- a/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector.php +++ b/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector.php @@ -14,6 +14,7 @@ use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Name\FullyQualified; use PhpParser\Node\Scalar\String_; +use PHPStan\Type\ObjectType; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -131,6 +132,10 @@ private function refactorMethodCall(MethodCall $node): ?MethodCall return null; } + if (!$this->isObjectType($node->var, new ObjectType('Drupal\Core\Database\StatementInterface'))) { + return null; + } + if ($node->var instanceof MethodCall) { $calleeName = $this->getName($node->var->name); if ($calleeName !== null && in_array($calleeName, self::PDO_RETURN_METHODS, true)) { diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture-below-version/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture-below-version/basic.php.inc index 2e50bc85a..3aba20453 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture-below-version/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture-below-version/basic.php.inc @@ -1,23 +1,29 @@ setFetchMode(\PDO::FETCH_ASSOC); -$statement->fetch(\PDO::FETCH_OBJ); -$rows = $statement->fetchAll(\PDO::FETCH_NUM); -$data = $statement->fetchAllAssoc('id', \PDO::FETCH_ASSOC); -$result = $db->query('SELECT name FROM {test}', [], ['fetch' => \PDO::FETCH_ASSOC]); -// Raw PDO: leave unchanged -$pdo = $statement->getClientStatement()->fetchAll(\PDO::FETCH_ASSOC); +use Drupal\Core\Database\StatementInterface; +function example(StatementInterface $statement, $db): void { + $statement->setFetchMode(\PDO::FETCH_ASSOC); + $statement->fetch(\PDO::FETCH_OBJ); + $rows = $statement->fetchAll(\PDO::FETCH_NUM); + $data = $statement->fetchAllAssoc('id', \PDO::FETCH_ASSOC); + $result = $db->query('SELECT name FROM {test}', [], ['fetch' => \PDO::FETCH_ASSOC]); + // Raw PDO: leave unchanged + $pdo = $statement->getClientStatement()->fetchAll(\PDO::FETCH_ASSOC); +} ?> ----- setFetchMode(\PDO::FETCH_ASSOC); -$statement->fetch(\PDO::FETCH_OBJ); -$rows = $statement->fetchAll(\PDO::FETCH_NUM); -$data = $statement->fetchAllAssoc('id', \PDO::FETCH_ASSOC); -$result = $db->query('SELECT name FROM {test}', [], ['fetch' => \PDO::FETCH_ASSOC]); -// Raw PDO: leave unchanged -$pdo = $statement->getClientStatement()->fetchAll(\PDO::FETCH_ASSOC); +use Drupal\Core\Database\StatementInterface; +function example(StatementInterface $statement, $db): void { + $statement->setFetchMode(\PDO::FETCH_ASSOC); + $statement->fetch(\PDO::FETCH_OBJ); + $rows = $statement->fetchAll(\PDO::FETCH_NUM); + $data = $statement->fetchAllAssoc('id', \PDO::FETCH_ASSOC); + $result = $db->query('SELECT name FROM {test}', [], ['fetch' => \PDO::FETCH_ASSOC]); + // Raw PDO: leave unchanged + $pdo = $statement->getClientStatement()->fetchAll(\PDO::FETCH_ASSOC); +} ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture-below-version/fetch_column_and_class.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture-below-version/fetch_column_and_class.php.inc index eae6cbd98..91324c449 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture-below-version/fetch_column_and_class.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture-below-version/fetch_column_and_class.php.inc @@ -1,15 +1,23 @@ setFetchMode(\PDO::FETCH_COLUMN); -$statement->fetch(\PDO::FETCH_CLASS); -$rows = $statement->fetchAll(\PDO::FETCH_COLUMN); +use Drupal\Core\Database\StatementInterface; + +function example(StatementInterface $statement): void { + $statement->setFetchMode(\PDO::FETCH_COLUMN); + $statement->fetch(\PDO::FETCH_CLASS); + $rows = $statement->fetchAll(\PDO::FETCH_COLUMN); +} ?> ----- setFetchMode(\PDO::FETCH_COLUMN); -$statement->fetch(\PDO::FETCH_CLASS); -$rows = $statement->fetchAll(\PDO::FETCH_COLUMN); +use Drupal\Core\Database\StatementInterface; + +function example(StatementInterface $statement): void { + $statement->setFetchMode(\PDO::FETCH_COLUMN); + $statement->fetch(\PDO::FETCH_CLASS); + $rows = $statement->fetchAll(\PDO::FETCH_COLUMN); +} ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture-below-version/no_change_native_pdo.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture-below-version/no_change_native_pdo.php.inc new file mode 100644 index 000000000..f8c596974 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture-below-version/no_change_native_pdo.php.inc @@ -0,0 +1,4 @@ +fetchAll(\PDO::FETCH_ASSOC); diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture-below-version/no_type_guard_native_pdo.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture-below-version/no_type_guard_native_pdo.php.inc deleted file mode 100644 index fc2cd5698..000000000 --- a/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture-below-version/no_type_guard_native_pdo.php.inc +++ /dev/null @@ -1,17 +0,0 @@ -fetchAll(\PDO::FETCH_ASSOC); - -?> ------ -fetchAll(\PDO::FETCH_ASSOC); - -?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/basic.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/basic.php.inc index c3b467986..38b8e8c9d 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/basic.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/basic.php.inc @@ -1,23 +1,29 @@ setFetchMode(\PDO::FETCH_ASSOC); -$statement->fetch(\PDO::FETCH_OBJ); -$rows = $statement->fetchAll(\PDO::FETCH_NUM); -$data = $statement->fetchAllAssoc('id', \PDO::FETCH_ASSOC); -$result = $db->query('SELECT name FROM {test}', [], ['fetch' => \PDO::FETCH_ASSOC]); -// Raw PDO: leave unchanged -$pdo = $statement->getClientStatement()->fetchAll(\PDO::FETCH_ASSOC); +use Drupal\Core\Database\StatementInterface; +function example(StatementInterface $statement, $db): void { + $statement->setFetchMode(\PDO::FETCH_ASSOC); + $statement->fetch(\PDO::FETCH_OBJ); + $rows = $statement->fetchAll(\PDO::FETCH_NUM); + $data = $statement->fetchAllAssoc('id', \PDO::FETCH_ASSOC); + $result = $db->query('SELECT name FROM {test}', [], ['fetch' => \PDO::FETCH_ASSOC]); + // Raw PDO: leave unchanged + $pdo = $statement->getClientStatement()->fetchAll(\PDO::FETCH_ASSOC); +} ?> ----- $statement->setFetchMode(\Drupal\Core\Database\Statement\FetchAs::Associative), fn() => $statement->setFetchMode(\PDO::FETCH_ASSOC)); -\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => $statement->fetch(\Drupal\Core\Database\Statement\FetchAs::Object), fn() => $statement->fetch(\PDO::FETCH_OBJ)); -$rows = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => $statement->fetchAll(\Drupal\Core\Database\Statement\FetchAs::List), fn() => $statement->fetchAll(\PDO::FETCH_NUM)); -$data = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => $statement->fetchAllAssoc('id', \Drupal\Core\Database\Statement\FetchAs::Associative), fn() => $statement->fetchAllAssoc('id', \PDO::FETCH_ASSOC)); -$result = $db->query('SELECT name FROM {test}', [], ['fetch' => \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => \Drupal\Core\Database\Statement\FetchAs::Associative, fn() => \PDO::FETCH_ASSOC)]); -// Raw PDO: leave unchanged -$pdo = $statement->getClientStatement()->fetchAll(\PDO::FETCH_ASSOC); +use Drupal\Core\Database\StatementInterface; +function example(StatementInterface $statement, $db): void { + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => $statement->setFetchMode(\Drupal\Core\Database\Statement\FetchAs::Associative), fn() => $statement->setFetchMode(\PDO::FETCH_ASSOC)); + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => $statement->fetch(\Drupal\Core\Database\Statement\FetchAs::Object), fn() => $statement->fetch(\PDO::FETCH_OBJ)); + $rows = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => $statement->fetchAll(\Drupal\Core\Database\Statement\FetchAs::List), fn() => $statement->fetchAll(\PDO::FETCH_NUM)); + $data = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => $statement->fetchAllAssoc('id', \Drupal\Core\Database\Statement\FetchAs::Associative), fn() => $statement->fetchAllAssoc('id', \PDO::FETCH_ASSOC)); + $result = $db->query('SELECT name FROM {test}', [], ['fetch' => \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => \Drupal\Core\Database\Statement\FetchAs::Associative, fn() => \PDO::FETCH_ASSOC)]); + // Raw PDO: leave unchanged + $pdo = $statement->getClientStatement()->fetchAll(\PDO::FETCH_ASSOC); +} ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/fetch_column_and_class.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/fetch_column_and_class.php.inc index 4b634c5e3..364b85994 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/fetch_column_and_class.php.inc +++ b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/fetch_column_and_class.php.inc @@ -1,15 +1,23 @@ setFetchMode(\PDO::FETCH_COLUMN); -$statement->fetch(\PDO::FETCH_CLASS); -$rows = $statement->fetchAll(\PDO::FETCH_COLUMN); +use Drupal\Core\Database\StatementInterface; + +function example(StatementInterface $statement): void { + $statement->setFetchMode(\PDO::FETCH_COLUMN); + $statement->fetch(\PDO::FETCH_CLASS); + $rows = $statement->fetchAll(\PDO::FETCH_COLUMN); +} ?> ----- $statement->setFetchMode(\Drupal\Core\Database\Statement\FetchAs::Column), fn() => $statement->setFetchMode(\PDO::FETCH_COLUMN)); -\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => $statement->fetch(\Drupal\Core\Database\Statement\FetchAs::ClassObject), fn() => $statement->fetch(\PDO::FETCH_CLASS)); -$rows = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => $statement->fetchAll(\Drupal\Core\Database\Statement\FetchAs::Column), fn() => $statement->fetchAll(\PDO::FETCH_COLUMN)); +use Drupal\Core\Database\StatementInterface; + +function example(StatementInterface $statement): void { + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => $statement->setFetchMode(\Drupal\Core\Database\Statement\FetchAs::Column), fn() => $statement->setFetchMode(\PDO::FETCH_COLUMN)); + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => $statement->fetch(\Drupal\Core\Database\Statement\FetchAs::ClassObject), fn() => $statement->fetch(\PDO::FETCH_CLASS)); + $rows = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => $statement->fetchAll(\Drupal\Core\Database\Statement\FetchAs::Column), fn() => $statement->fetchAll(\PDO::FETCH_COLUMN)); +} ?> diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/no_change_native_pdo.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/no_change_native_pdo.php.inc new file mode 100644 index 000000000..f8c596974 --- /dev/null +++ b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/no_change_native_pdo.php.inc @@ -0,0 +1,4 @@ +fetchAll(\PDO::FETCH_ASSOC); diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/no_type_guard_native_pdo.php.inc b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/no_type_guard_native_pdo.php.inc deleted file mode 100644 index ab858b44b..000000000 --- a/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/fixture/no_type_guard_native_pdo.php.inc +++ /dev/null @@ -1,17 +0,0 @@ -fetchAll(\PDO::FETCH_ASSOC); - -?> ------ - $pdoStatement->fetchAll(\Drupal\Core\Database\Statement\FetchAs::Associative), fn() => $pdoStatement->fetchAll(\PDO::FETCH_ASSOC)); - -?> From 46a59841ca0ccbc9de7ca8b1621cb94c31d57b95 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 22 May 2026 19:14:09 +0200 Subject: [PATCH 236/256] test: lets try and fix the functional test again, assuming a absolute path will work --- .github/workflows/functional_test__single_rectors.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/functional_test__single_rectors.yml b/.github/workflows/functional_test__single_rectors.yml index 72c0ef91e..f3d8d9dec 100644 --- a/.github/workflows/functional_test__single_rectors.yml +++ b/.github/workflows/functional_test__single_rectors.yml @@ -36,7 +36,7 @@ jobs: run: | cd ~/drupal mkdir -p web/modules/custom - cp -R tests/functional/hookconvertrector/fixture/hookconvertrector web/modules/custom/hookconvertrector + cp -R ${GITHUB_WORKSPACE}/tests/functional/hookconvertrector/fixture/hookconvertrector web/modules/custom/hookconvertrector # dry-run is expected to return exit code 2 if there are changes, which we are expecting to happen, here. # an error code of 1 represents other errors. # @see \Rector\Core\Console\ExitCode::CHANGED_CODE @@ -46,7 +46,7 @@ jobs: for d in web/modules/custom/*; do if [ -d "$d" ]; then echo "Processing $d" - cp tests/functional/$(basename ${d})/rector.php . + cp ${GITHUB_WORKSPACE}/tests/functional/$(basename ${d})/rector.php . vendor/bin/rector process $d --dry-run --debug || if (($? == 2)); then true; else exit 1; fi fi done @@ -56,7 +56,7 @@ jobs: for d in web/modules/custom/*; do if [ -d "$d" ]; then echo "Processing $d" - cp tests/functional/$(basename ${d})/rector.php . + cp ${GITHUB_WORKSPACE}/tests/functional/$(basename ${d})/rector.php . vendor/bin/rector process $d --debug fi done @@ -71,6 +71,6 @@ jobs: cd ~/drupal for d in web/modules/custom/*; do if [ -d "$d" ]; then - diff --color -rubB "$d" "tests/functional/$(basename ${d})/fixture/$(basename ${d})_updated" + diff --color -rubB "$d" "${GITHUB_WORKSPACE}/tests/functional/$(basename ${d})/fixture/$(basename ${d})_updated" fi done From 0a4d6e8e10746e7f9d3cf2e9a07ea1b7f2c9f305 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 22 May 2026 19:29:24 +0200 Subject: [PATCH 237/256] chore: enable BC by default again to minimize behavioural changes --- src/Services/DrupalRectorSettings.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Services/DrupalRectorSettings.php b/src/Services/DrupalRectorSettings.php index 63c2dddca..bf6c819ed 100644 --- a/src/Services/DrupalRectorSettings.php +++ b/src/Services/DrupalRectorSettings.php @@ -6,7 +6,7 @@ class DrupalRectorSettings { - private bool $backwardCompatibilityEnabled = false; + private bool $backwardCompatibilityEnabled = true; private string $minimumCoreVersionSupported = '10.1.0'; From 1fe3c0e2ccbb31afc353fc110bdb43dbfb0ac681 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 22 May 2026 19:40:58 +0200 Subject: [PATCH 238/256] fix: register 8 unimplemented Drupal 11 rectors in deprecation config sets Wires up 8 rector classes that had tests but no config entry, so they were never triggered when running drupal-rector against a project. - drupal-11.1: BlockContentTestBaseStringToArrayRector, MovePointerToMouseOverRector, ReplaceAddCachedDiscoveryMethodCallRector - drupal-11.2: RemoveCacheTagChecksumAssertionsRector, RemoveRootFromCreateConnectionOptionsFromUrlRector - drupal-11.4: CheckMarkupToProcessedTextRector, RemoveFilterTipsLongParamRector, SystemSortThemesRector --- config/drupal-11/drupal-11.1-deprecations.php | 23 +++++++++++++++++++ config/drupal-11/drupal-11.2-deprecations.php | 13 +++++++++++ config/drupal-11/drupal-11.4-deprecations.php | 20 ++++++++++++++++ 3 files changed, 56 insertions(+) diff --git a/config/drupal-11/drupal-11.1-deprecations.php b/config/drupal-11/drupal-11.1-deprecations.php index 525d44a60..f10884043 100644 --- a/config/drupal-11/drupal-11.1-deprecations.php +++ b/config/drupal-11/drupal-11.1-deprecations.php @@ -2,9 +2,12 @@ declare(strict_types=1); +use DrupalRector\Drupal11\Rector\Deprecation\BlockContentTestBaseStringToArrayRector; +use DrupalRector\Drupal11\Rector\Deprecation\MovePointerToMouseOverRector; use DrupalRector\Drupal11\Rector\Deprecation\PluginBaseIsConfigurableRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveModuleHandlerDeprecatedMethodsRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveUpdaterPostInstallMethodsRector; +use DrupalRector\Drupal11\Rector\Deprecation\ReplaceAddCachedDiscoveryMethodCallRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceLocaleConfigBatchFunctionsRector; use DrupalRector\Rector\Deprecation\FunctionToStaticRector; use DrupalRector\Rector\Deprecation\MethodToMethodWithCheckRector; @@ -57,6 +60,26 @@ // The entire install-via-URL flow was eliminated; overrides are dead code. $rectorConfig->rule(RemoveUpdaterPostInstallMethodsRector::class); + // https://www.drupal.org/node/3196937 + // https://www.drupal.org/node/3473739 (change record) + // BlockContentTestBase::createBlockContentType() $values deprecated in drupal:11.1.0, removed in drupal:12.0.0. + // Callers must pass an explicit array such as ['id' => 'basic'] instead of a plain string. + $rectorConfig->rule(BlockContentTestBaseStringToArrayRector::class); + + // https://www.drupal.org/node/3421202 + // https://www.drupal.org/node/3460567 (change record) + // movePointerTo() deprecated in drupal:11.1.0, removed in drupal:12.0.0. + // Replaced by getSession()->getDriver()->mouseOver() with an XPath selector. + $rectorConfig->rule(MovePointerToMouseOverRector::class); + + // https://www.drupal.org/node/3432827 + // https://www.drupal.org/node/3442229 (change record) + // addMethodCall('addCachedDiscovery', ...) on plugin.cache_clearer deprecated in drupal:11.1.0, removed in drupal:12.0.0. + // Replaced by the plugin_manager_cache_clear tag approach. + $rectorConfig->ruleWithConfiguration(ReplaceAddCachedDiscoveryMethodCallRector::class, [ + new DrupalIntroducedVersionConfiguration('11.1.0'), + ]); + // https://www.drupal.org/node/3488176 // drupal_common_theme() removed in drupal:11.1.0. // Replaced by \Drupal\Core\Theme\ThemeCommonElements::commonElements(). diff --git a/config/drupal-11/drupal-11.2-deprecations.php b/config/drupal-11/drupal-11.2-deprecations.php index 386980504..9f3d2e768 100644 --- a/config/drupal-11/drupal-11.2-deprecations.php +++ b/config/drupal-11/drupal-11.2-deprecations.php @@ -2,7 +2,9 @@ declare(strict_types=1); +use DrupalRector\Drupal11\Rector\Deprecation\RemoveCacheTagChecksumAssertionsRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveHandlerBaseDefineExtraOptionsRector; +use DrupalRector\Drupal11\Rector\Deprecation\RemoveRootFromCreateConnectionOptionsFromUrlRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveModuleHandlerAddModuleCallsRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveTwigNodeTransTagArgumentRector; use DrupalRector\Drupal11\Rector\Deprecation\RenameStopProceduralHookScanRector; @@ -218,6 +220,17 @@ 'Drupal\migrate_drupal\Plugin\migrate\source\ContentEntityDeriver' => 'Drupal\migrate\Plugin\migrate\source\ContentEntityDeriver', ]); + // https://www.drupal.org/node/3511123 + // https://www.drupal.org/node/3511149 (change record) + // CacheTagChecksumCount and CacheTagIsValidCount deprecated in drupal:11.2.0, removed in drupal:12.0.0. No replacement. + $rectorConfig->rule(RemoveCacheTagChecksumAssertionsRector::class); + + // https://www.drupal.org/node/3506931 + // https://www.drupal.org/node/3511287 (change record) + // Connection::createConnectionOptionsFromUrl() $root parameter deprecated in drupal:11.2.0, removed in drupal:12.0.0. + // Pass NULL explicitly instead of the root path argument. + $rectorConfig->rule(RemoveRootFromCreateConnectionOptionsFromUrlRector::class); + // https://www.drupal.org/node/3410939 // SystemManager::REQUIREMENT_* deprecated in drupal:11.2.0, removed in drupal:12.0.0. // Replaced by \Drupal\Core\Extension\Requirement\RequirementSeverity enum cases. diff --git a/config/drupal-11/drupal-11.4-deprecations.php b/config/drupal-11/drupal-11.4-deprecations.php index bc895166b..86e4ba575 100644 --- a/config/drupal-11/drupal-11.4-deprecations.php +++ b/config/drupal-11/drupal-11.4-deprecations.php @@ -2,7 +2,10 @@ declare(strict_types=1); +use DrupalRector\Drupal11\Rector\Deprecation\CheckMarkupToProcessedTextRector; use DrupalRector\Drupal11\Rector\Deprecation\DeprecatedFilterFunctionsRector; +use DrupalRector\Drupal11\Rector\Deprecation\RemoveFilterTipsLongParamRector; +use DrupalRector\Drupal11\Rector\Deprecation\SystemSortThemesRector; use DrupalRector\Drupal11\Rector\Deprecation\FilterFormatFunctionsToServiceRector; use DrupalRector\Drupal11\Rector\Deprecation\GetOriginalClassToGetDecoratedClassesRector; use DrupalRector\Drupal11\Rector\Deprecation\LocaleCompareIncToServiceRector; @@ -411,6 +414,23 @@ new DrupalIntroducedVersionConfiguration('11.4.0'), ]); + // https://www.drupal.org/node/455724 + // https://www.drupal.org/node/3588040 (change record) + // check_markup() deprecated in drupal:11.4.0, removed in drupal:12.0.0. + // Replaced by a processed_text render array. + $rectorConfig->rule(CheckMarkupToProcessedTextRector::class); + + // https://www.drupal.org/node/3505370 + // https://www.drupal.org/node/3567879 (change record) + // FilterInterface::tips() $long parameter deprecated in drupal:11.4.0, removed in drupal:12.0.0. + $rectorConfig->rule(RemoveFilterTipsLongParamRector::class); + + // https://www.drupal.org/node/3571172 + // https://www.drupal.org/node/3566774 (change record) + // system_sort_themes() string callback deprecated in drupal:11.4.0, removed in drupal:12.0.0. + // Replaced by an inline static closure. + $rectorConfig->rule(SystemSortThemesRector::class); + // https://www.drupal.org/node/3037031 // locale_translation_flush_projects(), locale_translation_build_projects(), locale_translation_check_projects(), // and locale_translation_check_projects_local() deprecated in drupal:11.4.0, removed in drupal:13.0.0. From c40d3c814cf49fd3c160884a479f73afe816234b Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 22 May 2026 20:37:00 +0200 Subject: [PATCH 239/256] build: phpcs --- config/drupal-11/drupal-11.2-deprecations.php | 2 +- config/drupal-11/drupal-11.4-deprecations.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/config/drupal-11/drupal-11.2-deprecations.php b/config/drupal-11/drupal-11.2-deprecations.php index 9f3d2e768..e8dac77f2 100644 --- a/config/drupal-11/drupal-11.2-deprecations.php +++ b/config/drupal-11/drupal-11.2-deprecations.php @@ -4,8 +4,8 @@ use DrupalRector\Drupal11\Rector\Deprecation\RemoveCacheTagChecksumAssertionsRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveHandlerBaseDefineExtraOptionsRector; -use DrupalRector\Drupal11\Rector\Deprecation\RemoveRootFromCreateConnectionOptionsFromUrlRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveModuleHandlerAddModuleCallsRector; +use DrupalRector\Drupal11\Rector\Deprecation\RemoveRootFromCreateConnectionOptionsFromUrlRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveTwigNodeTransTagArgumentRector; use DrupalRector\Drupal11\Rector\Deprecation\RenameStopProceduralHookScanRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceAlphadecimalToIntNullRector; diff --git a/config/drupal-11/drupal-11.4-deprecations.php b/config/drupal-11/drupal-11.4-deprecations.php index 86e4ba575..a4b52fdde 100644 --- a/config/drupal-11/drupal-11.4-deprecations.php +++ b/config/drupal-11/drupal-11.4-deprecations.php @@ -4,8 +4,6 @@ use DrupalRector\Drupal11\Rector\Deprecation\CheckMarkupToProcessedTextRector; use DrupalRector\Drupal11\Rector\Deprecation\DeprecatedFilterFunctionsRector; -use DrupalRector\Drupal11\Rector\Deprecation\RemoveFilterTipsLongParamRector; -use DrupalRector\Drupal11\Rector\Deprecation\SystemSortThemesRector; use DrupalRector\Drupal11\Rector\Deprecation\FilterFormatFunctionsToServiceRector; use DrupalRector\Drupal11\Rector\Deprecation\GetOriginalClassToGetDecoratedClassesRector; use DrupalRector\Drupal11\Rector\Deprecation\LocaleCompareIncToServiceRector; @@ -14,6 +12,7 @@ use DrupalRector\Drupal11\Rector\Deprecation\RemoveAutomatedCronSubmitHandlerRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveCacheExpireOverrideRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveConfigSaveTrustedDataArgRector; +use DrupalRector\Drupal11\Rector\Deprecation\RemoveFilterTipsLongParamRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveLinkWidgetValidateTitleElementRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveSetUriCallbackRector; use DrupalRector\Drupal11\Rector\Deprecation\RemoveTrustDataCallRector; @@ -24,6 +23,7 @@ use DrupalRector\Drupal11\Rector\Deprecation\ReplaceSystemPerformanceGzipKeyRector; use DrupalRector\Drupal11\Rector\Deprecation\ReplaceViewsProceduralFunctionsRector; use DrupalRector\Drupal11\Rector\Deprecation\SystemRegionFunctionsRector; +use DrupalRector\Drupal11\Rector\Deprecation\SystemSortThemesRector; use DrupalRector\Drupal11\Rector\Deprecation\UseEntityTypeHasIntegerIdRector; use DrupalRector\Drupal11\Rector\Deprecation\ViewsPluginHandlerManagerRector; use DrupalRector\Rector\Deprecation\ClassConstantToClassConstantRector; From 0f418480c1a1f01d1a1e583fe186ba77558768cf Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 22 May 2026 20:41:30 +0200 Subject: [PATCH 240/256] fix: address tooling gaps flagged in PR review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remove dangling /rector-type-check-review entry from README (skill file never existed) - Replace rector-type-specificity-checklist.md references in rector-qa with a direct find command; bulk mode no longer depends on missing file - Add Pass 5 (registration check) to rector-qa — verifies rector is wired into a config/drupal-11/*.php deprecation set - Add type-guard reminder to Step 6 template in digest-to-rector-prompt.md so isObjectType() guards are part of the generation step, not a post-hoc gate --- .claude/skills/README.md | 12 ----- .../skills/prompts/digest-to-rector-prompt.md | 10 ++++ .claude/skills/rector-qa/SKILL.md | 46 +++++++++++++------ 3 files changed, 42 insertions(+), 26 deletions(-) diff --git a/.claude/skills/README.md b/.claude/skills/README.md index be85b0104..3138e699f 100644 --- a/.claude/skills/README.md +++ b/.claude/skills/README.md @@ -63,18 +63,6 @@ Results report files changed per module and flag zero-match cases with a diagnos --- -### `/rector-type-check-review [RectorClassName|all]` - -Audits rector rules for type-specificity: ensures every `MethodCall`, `NullsafeMethodCall`, and `PropertyFetch` node is guarded by `isObjectType()` so unrelated classes with the same method/property name are not accidentally transformed. - -Run on a single rector, or pass `all` (or no argument) to walk through every AT-RISK row in `.claude/skills/prompts/rector-type-specificity-checklist.md`. For each AT-RISK rector it finds the owning Drupal interface in `repos/drupal-core`, creates a stub if needed, adds the guard, and updates fixtures. - -``` -/rector-type-check-review ReplaceSessionManagerDeleteRector -/rector-type-check-review all -``` - ---- ## Supporting scripts diff --git a/.claude/skills/prompts/digest-to-rector-prompt.md b/.claude/skills/prompts/digest-to-rector-prompt.md index e9a27183b..db351a612 100644 --- a/.claude/skills/prompts/digest-to-rector-prompt.md +++ b/.claude/skills/prompts/digest-to-rector-prompt.md @@ -335,6 +335,16 @@ CODE_AFTER public function refactor(Node $node): ?Node { // [copy refactor() body from the digests rule unchanged] + + // TYPE GUARD — required for every MethodCall/NullsafeMethodCall/PropertyFetch handler. + // Add an isObjectType() check so unrelated classes with the same method/property name + // are not accidentally transformed. Add it *after* the name check: + // + // if (!$this->isName($node->name, 'theMethod')) { return null; } + // if (!$this->isObjectType($node->var, new ObjectType('Fully\Qualified\InterfaceName'))) { return null; } + // + // Look up the FQCN in repos/drupal-core; prefer the interface over the concrete class. + // Omit only for FuncCall (global functions), ClassConst, or class-declaration nodes. } } ``` diff --git a/.claude/skills/rector-qa/SKILL.md b/.claude/skills/rector-qa/SKILL.md index 82925e9d7..183812899 100644 --- a/.claude/skills/rector-qa/SKILL.md +++ b/.claude/skills/rector-qa/SKILL.md @@ -72,13 +72,7 @@ Only add this fallback when real-world testing shows `isObjectType` silently mis **Output:** `Pass 1: [SAFE|AT-RISK|EXEMPT] — ` -**If AT-RISK:** Apply the fix (see patterns below), then update `.claude/skills/prompts/rector-type-specificity-checklist.md`: - -```bash -grep -n "" .claude/skills/prompts/rector-type-specificity-checklist.md -``` - -Update the verdict column from `⚠️ AT-RISK` to `✅ SAFE` after fixing. +**If AT-RISK:** Apply the fix (see patterns below). ### Finding the right class/interface @@ -137,13 +131,13 @@ Place it at `stubs/Drupal/Some/Namespace/ClassName.php`, then run `composer dump ## Bulk mode (`all`) -When `$ARGUMENTS` is `all`, open `.claude/skills/prompts/rector-type-specificity-checklist.md` and work through every row marked `⚠️ AT-RISK`, one by one. For each: +When `$ARGUMENTS` is `all`, find every rector in `src/Drupal11/Rector/Deprecation/` and run Pass 1 on each: -1. Locate the rector source with `find src -name ".php"`. -2. Apply the Pass 1 steps above. -3. Fix any AT-RISK rectors and tick the checklist row. +1. List all rector classes: `find src -name "*.php" -path "*/Rector/Deprecation/*"` +2. For each class, apply the Pass 1 steps above. +3. Fix any AT-RISK rectors before moving to the next. -Do not run the other three passes in bulk mode. +Do not run the other passes in bulk mode. --- @@ -280,9 +274,32 @@ consecutively, issue first: --- +## Pass 5 — Registration Audit + +**Goal:** The rector must be wired into a `config/drupal-11/drupal-11.N-deprecations.php` file so it actually runs when users invoke drupal-rector. + +**Steps:** + +1. Check if the class is referenced in any config file: + ```bash + grep -rq "" config/ && echo "REGISTERED" || echo "FAIL — not registered" + ``` + +2. If unregistered, identify the correct config file from the deprecation version in the rector docblock (e.g. `drupal:11.2.0` → `config/drupal-11/drupal-11.2-deprecations.php`). + +3. Determine the entry type: + - Extends `AbstractDrupalCoreRector` → `$rectorConfig->ruleWithConfiguration(::class, [new DrupalIntroducedVersionConfiguration('11.N.0')])` + - Extends `AbstractRector` → `$rectorConfig->rule(::class)` + +**Output:** `Pass 5: [PASS|FAIL] — ` + +**If FAIL:** Add the `use` statement and `rule`/`ruleWithConfiguration` entry to the correct config file. + +--- + ## Final Summary -After all four passes, produce a summary checklist: +After all five passes, produce a summary checklist: ``` === QA Summary: === @@ -291,6 +308,7 @@ Pass 1 — Type Guard: [SAFE|AT-RISK|EXEMPT] Pass 2 — Fixtures: [PASS|WARN] — Pass 3 — BC Decision: [PASS|FAIL] — Pass 4 — @see URL: [PASS|WARN|FAIL] — issue: CR: +Pass 5 — Registration: [PASS|FAIL] — Overall: [PASS — ready to merge | NEEDS FIXES — see above] ``` @@ -301,4 +319,4 @@ If any pass shows AT-RISK or FAIL, do not declare the rector ready to merge. App ## Running on a "known good" rector -To verify the skill works correctly, run it on `ReplaceSessionManagerDeleteRector` — all four passes should be PASS/SAFE. +To verify the skill works correctly, run it on `ReplaceSessionManagerDeleteRector` — all five passes should be PASS/SAFE. From 5ca746fc878950fd2043c099bb6564704d1315a0 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 22 May 2026 21:03:05 +0200 Subject: [PATCH 241/256] docs: document usage of DeprecationHelperRemoveRector configuration --- rector.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/rector.php b/rector.php index 5b6e7ef65..173c97422 100644 --- a/rector.php +++ b/rector.php @@ -44,6 +44,13 @@ // new DeprecationHelperRemoveConfiguration('10.3.0'), // ]); + // If you wish to remove all DeprecationHelper BC wrappers based on your + // installed Drupal version, you can use the following rule instead: + // + // $rectorConfig->ruleWithConfiguration(DeprecationHelperRemoveRector::class, [ + // new DeprecationHelperRemoveConfiguration(\Drupal::VERSION), + // ]); + // When phsptan-drupal is available, we should load it to get better type // inference to use in rectors. $phpstanDrupalExtension = __DIR__.'/vendor/mglaman/phpstan-drupal/extension.neon'; From ac96e647cb8a988f86462c1f0714e69c1dddb276 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 22 May 2026 21:03:13 +0200 Subject: [PATCH 242/256] fix: remove unnecessary return statement in hook implementation --- .../fixture/hookconvertrector_updated/hookconvertrector.theme | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/functional/hookconvertrector/fixture/hookconvertrector_updated/hookconvertrector.theme b/tests/functional/hookconvertrector/fixture/hookconvertrector_updated/hookconvertrector.theme index 295e09c03..5a1be5fa9 100644 --- a/tests/functional/hookconvertrector/fixture/hookconvertrector_updated/hookconvertrector.theme +++ b/tests/functional/hookconvertrector/fixture/hookconvertrector_updated/hookconvertrector.theme @@ -37,5 +37,5 @@ function hookconvertrector_theme_suggestions_form_alter(array &$attachments): vo #[LegacyHook] function hookconvertrector_page_attachments_alter(array &$page) { - return \Drupal::service(HookconvertrectorHooks1::class)->pageAttachmentsAlter($page); + \Drupal::service(HookconvertrectorHooks1::class)->pageAttachmentsAlter($page); } From f56287c5dbacc36ec4a8f0988bd78f90120e86fc Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 22 May 2026 21:22:02 +0200 Subject: [PATCH 243/256] fix: front matter of script --- .claude/scripts/generate-rector-index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.claude/scripts/generate-rector-index.php b/.claude/scripts/generate-rector-index.php index ce91e2092..759c51ab3 100644 --- a/.claude/scripts/generate-rector-index.php +++ b/.claude/scripts/generate-rector-index.php @@ -9,7 +9,7 @@ * Usage: php .claude/scripts/generate-rector-index.php [--digests-path=PATH] * * Options: - * --digests-path=PATH Path to drupal-digests repo (default: ~/projects/drupal-digests) + * --digests-path=PATH Path to drupal-digests repo (default: repos//drupal-digests) * --help Show this help */ From ae5bec3df38837e6583050bc1f2cab2e828db235 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 22 May 2026 21:22:17 +0200 Subject: [PATCH 244/256] fix: remove personal paths --- scripts/check-rector-coverage.php | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/scripts/check-rector-coverage.php b/scripts/check-rector-coverage.php index 0eec8b79f..14d931b94 100644 --- a/scripts/check-rector-coverage.php +++ b/scripts/check-rector-coverage.php @@ -10,9 +10,10 @@ * how many patch files contain those patterns in their removed (-) lines. * * Usage (must run with host PHP, not ddev — patches dir is outside the container): - * /opt/homebrew/opt/php@8.2/bin/php scripts/check-rector-coverage.php [patches-dir] [--csv] + * /opt/homebrew/opt/php@8.2/bin/php scripts/check-rector-coverage.php [--csv] * - * Defaults to /Users/bjorn/Downloads/artifacts 6/phpstan-results + * The patches directory can also be provided via the RECTOR_PATCHES_DIR + * environment variable. */ $rootDir = dirname(__DIR__); $patchesDir = null; @@ -23,11 +24,11 @@ if ($arg === '--help' || $arg === '-h') { echo <<<'HELP' Usage: - php scripts/check-rector-coverage.php [patches-dir] [--csv] [--verbose] + php scripts/check-rector-coverage.php [--csv] [--verbose] Arguments: patches-dir Directory containing /*.patch files. - Defaults to: /Users/bjorn/Downloads/artifacts 6/phpstan-results + May also be supplied via the RECTOR_PATCHES_DIR env var. Options: --csv Output results as CSV instead of a human-readable table. @@ -56,7 +57,12 @@ } } -$patchesDir ??= '/Users/bjorn/Downloads/artifacts 6/phpstan-results'; +$patchesDir ??= getenv('RECTOR_PATCHES_DIR') ?: null; + +if ($patchesDir === null) { + fwrite(STDERR, "Error: patches directory is required.\nRun with: php scripts/check-rector-coverage.php \nOr set RECTOR_PATCHES_DIR.\n"); + exit(1); +} if (!is_dir($patchesDir)) { fwrite(STDERR, "Patches directory not found: $patchesDir\n"); From 3af733e7da943a3416767fd7a02d1831db7edb6c Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 22 May 2026 21:22:34 +0200 Subject: [PATCH 245/256] doc: better description in rector.php --- rector.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/rector.php b/rector.php index 173c97422..d2e82bc5a 100644 --- a/rector.php +++ b/rector.php @@ -25,9 +25,8 @@ ]); // Configure DrupalRectorSettings to control rule behaviour. - // By default, backward-compatibility wrapping is disabled (recommended for - // projects that target a single Drupal version). Enable it if you need to - // support multiple Drupal versions simultaneously. + // By default, backward-compatibility wrapping is enabled. Disable it if + // you don't need to support multiple Drupal versions simultaneously. $rectorConfig->singleton(DrupalRectorSettings::class, fn () => (new DrupalRectorSettings()) ->disableBackwardCompatibility() // Contrib module developers: set the minimum Drupal version your From 7e026c6b2e835b199dee0b0e33ddf53f5298e65d Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 22 May 2026 21:26:44 +0200 Subject: [PATCH 246/256] chore: cleanup tests with tearDown and fix the skills to use that pattern --- .../skills/prompts/digest-to-rector-prompt.md | 9 +++++---- .../prompts/recipes/func-to-class-service-bc.md | 16 ++++------------ .claude/skills/rector-implement/SKILL.md | 16 ++++------------ .../ActionAnnotationToAttributeRectorTest.php | 4 ++-- ...lityActionAnnotationToAttributeRectorTest.php | 4 ++-- .../ReplaceModuleHandlerGetNameRectorTest.php | 16 ++++------------ .../ReplaceRebuildThemeDataRectorTest.php | 16 ++++------------ .../ReplaceRequestTimeConstantRectorTest.php | 16 ++++------------ .../SystemTimeZonesRectorTest.php | 16 ++++------------ .../WatchdogExceptionRectorTest.php | 16 ++++------------ ...ockContentTestBaseStringToArrayRectorTest.php | 4 ++-- .../CheckMarkupToProcessedTextRectorTest.php | 4 ++-- .../DeprecatedFilterFunctionsRectorTest.php | 16 ++++------------ .../ErrorCurrentErrorHandlerRectorTest.php | 16 ++++------------ .../FileManagedFileSubmitRectorTest.php | 16 ++++------------ .../FileSystemBasenameToNativeRectorTest.php | 16 ++++------------ .../FilterFormatFunctionsToServiceRectorTest.php | 16 ++++------------ .../GetNameToNameRectorTest.php | 4 ++-- ...ginalClassToGetDecoratedClassesRectorTest.php | 16 ++++------------ .../LoadAllIncludesRectorTest.php | 4 ++-- .../LocaleCompareIncToServiceRectorTest.php | 16 ++++------------ ...diaFilterFormatEditFormValidateRectorTest.php | 16 ++++------------ ...ateSqlGetMigrationPluginManagerRectorTest.php | 16 ++++------------ .../MovePointerToMouseOverRectorTest.php | 4 ++-- .../NodeAccessRebuildFunctionsRectorTest.php | 16 ++++------------ .../NodeStorageDeprecatedMethodsRectorTest.php | 4 ++-- .../PluginBaseIsConfigurableRectorTest.php | 16 ++++------------ ...emoveAutomatedCronSubmitHandlerRectorTest.php | 4 ++-- .../RemoveCacheExpireOverrideRectorTest.php | 4 ++-- ...emoveCacheTagChecksumAssertionsRectorTest.php | 4 ++-- .../RemoveConfigSaveTrustedDataArgRectorTest.php | 16 ++++------------ .../RemoveFilterTipsLongParamRectorTest.php | 4 ++-- ...veHandlerBaseDefineExtraOptionsRectorTest.php | 4 ++-- ...eLinkWidgetValidateTitleElementRectorTest.php | 4 ++-- ...moveModuleHandlerAddModuleCallsRectorTest.php | 4 ++-- ...eModuleHandlerDeprecatedMethodsRectorTest.php | 4 ++-- .../RemoveRootFromConvertDbUrlRectorTest.php | 16 ++++------------ ...mCreateConnectionOptionsFromUrlRectorTest.php | 4 ++-- .../RemoveSetUriCallbackRectorTest.php | 4 ++-- .../RemoveStateCacheSettingRectorTest.php | 4 ++-- .../RemoveTrustDataCallRectorTest.php | 16 ++++------------ .../RemoveTwigNodeTransTagArgumentRectorTest.php | 16 ++++------------ ...RemoveUpdaterPostInstallMethodsRectorTest.php | 4 ++-- .../RemoveViewsRowCacheKeysRectorTest.php | 4 ++-- .../RenameStopProceduralHookScanRectorTest.php | 4 ++-- ...aceAddCachedDiscoveryMethodCallRectorTest.php | 16 ++++------------ .../ReplaceAlphadecimalToIntNullRectorTest.php | 16 ++++------------ ...mmentManagerGetCountNewCommentsRectorTest.php | 16 ++++------------ .../ReplaceDateTimeRangeConstantsRectorTest.php | 16 ++++------------ .../ReplaceEditorLoadRectorTest.php | 16 ++++------------ .../ReplaceEntityOriginalPropertyRectorTest.php | 16 ++++------------ ...ceEntityReferenceRecursiveLimitRectorTest.php | 16 ++++------------ .../ReplaceFieldgroupToFieldsetRectorTest.php | 16 ++++------------ ...placeLocaleConfigBatchFunctionsRectorTest.php | 16 ++++------------ .../ReplaceNodeAccessViewAllNodesRectorTest.php | 16 ++++------------ .../ReplaceNodeAddBodyFieldRectorTest.php | 16 ++++------------ ...ceNodeModuleProceduralFunctionsRectorTest.php | 16 ++++------------ .../ReplaceNodeSetPreviewModeRectorTest.php | 16 ++++------------ .../ReplacePdoFetchConstantsRectorTest.php | 16 ++++------------ ...eplaceRecipeRunnerInstallModuleRectorTest.php | 16 ++++------------ .../ReplaceSessionManagerDeleteRectorTest.php | 16 ++++------------ ...SessionWritesWithRequestSessionRectorTest.php | 16 ++++------------ ...ReplaceSystemPerformanceGzipKeyRectorTest.php | 16 ++++------------ .../ReplaceThemeGetSettingRectorTest.php | 16 ++++------------ .../ReplaceTwigExtensionRectorTest.php | 16 ++++------------ .../ReplaceUserSessionNamePropertyRectorTest.php | 16 ++++------------ ...ReplaceViewsProceduralFunctionsRectorTest.php | 16 ++++------------ ...mentPrefetchIteratorFetchColumnRectorTest.php | 16 ++++------------ ...pMigrationDependenciesExpandArgRectorTest.php | 16 ++++------------ .../SystemRegionFunctionsRectorTest.php | 16 ++++------------ .../SystemSortThemesRectorTest.php | 4 ++-- .../UseEntityTypeHasIntegerIdRectorTest.php | 16 ++++------------ .../ViewsPluginHandlerManagerRectorTest.php | 16 ++++------------ .../DrupalSetMessageRectorTest.php | 4 ++-- .../EntityDeleteMultipleRectorTest.php | 4 ++-- .../EntityManagerRectorTest.php | 4 ++-- .../EntityViewRector/EntityViewRectorTest.php | 4 ++-- ...ctionalTestDefaultThemePropertyRectorTest.php | 4 ++-- .../GetMockRector/GetMockRectorTest.php | 4 ++-- .../AssertFieldByIdRectorTest.php | 4 ++-- .../AssertFieldByNameRectorTest.php | 4 ++-- .../AssertLegacyTraitRectorTest.php | 4 ++-- .../AssertNoFieldByNameRectorTest.php | 4 ++-- .../AssertNoUniqueTextRector.php | 4 ++-- .../ExtensionPathRectorTest.php | 4 ++-- .../FileFunctionRectorTest.php | 4 ++-- .../FileUrlGeneratorRectorTest.php | 4 ++-- .../ModuleLoadRector/ModuleLoadRectorTest.php | 4 ++-- .../Deprecation/PassRector/PassRectorTest.php | 4 ++-- .../SystemSortByInfoNameRectorTest.php | 4 ++-- .../TaxonomyRectorCollectionTest.php | 4 ++-- .../UiHelperTraitDrupalPostFormRectorTest.php | 4 ++-- .../UserPasswordRectorTest.php | 4 ++-- .../ProtectedStaticModulesPropertyRectorTest.php | 4 ++-- .../AbstractDrupalCoreRectorBcTest.php | 4 ++-- .../AbstractDrupalCoreRectorTest.php | 4 ++-- .../HookConvertRectorFixtureTest.php | 4 ++-- .../ConstantToClassConstantRectorTest.php | 4 ++-- .../ConstantToClassConstantRectorTest.php | 10 +++------- .../DeprecationHelperRemoveRectorTest.php | 4 ++-- .../FunctionCallRemovalRectorTest.php | 4 ++-- .../FunctionToFirstArgMethodRectorTest.php | 16 ++++------------ .../FunctionToServiceRectorTest.php | 4 ++-- .../FunctionToStaticRectorTest.php | 4 ++-- .../MethodToMethodWithCheckRectorTest.php | 4 ++-- .../ShouldCallParentMethodsRectorTest.php | 4 ++-- 106 files changed, 316 insertions(+), 719 deletions(-) diff --git a/.claude/skills/prompts/digest-to-rector-prompt.md b/.claude/skills/prompts/digest-to-rector-prompt.md index db351a612..90f5d06f3 100644 --- a/.claude/skills/prompts/digest-to-rector-prompt.md +++ b/.claude/skills/prompts/digest-to-rector-prompt.md @@ -28,8 +28,9 @@ disable all Drupal 11 rules in the test suite. For tests that need to simulate a specific Drupal version (e.g., to verify a rule does NOT fire on an older version), use `DrupalRectorSettings::setDrupalVersion($version)` via the service -container, and reset it in a `finally` block. Standard conversion tests do not need this — the -stub default (`11.99.x-dev`) is sufficient for normal fixture testing. +container. Cleanup is handled automatically by `AbstractDrupalRectorTestCase::tearDown()` — do +not add a `try`/`finally` block. Standard conversion tests do not need this — the stub default +(`11.99.x-dev`) is sufficient for normal fixture testing. --- @@ -537,9 +538,9 @@ declare(strict_types=1); namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\[ClassName]; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class [ClassName]Test extends AbstractRectorTestCase +class [ClassName]Test extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/.claude/skills/prompts/recipes/func-to-class-service-bc.md b/.claude/skills/prompts/recipes/func-to-class-service-bc.md index c028d08ce..ad4123527 100644 --- a/.claude/skills/prompts/recipes/func-to-class-service-bc.md +++ b/.claude/skills/prompts/recipes/func-to-class-service-bc.md @@ -146,19 +146,15 @@ declare(strict_types=1); namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\{{ClassName}}; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class {{ClassName}}Test extends AbstractRectorTestCase +class {{ClassName}}Test extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @return \Iterator> */ @@ -171,11 +167,7 @@ class {{ClassName}}Test extends AbstractRectorTestCase public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @return \Iterator> */ diff --git a/.claude/skills/rector-implement/SKILL.md b/.claude/skills/rector-implement/SKILL.md index 92b91545b..249e77ac6 100644 --- a/.claude/skills/rector-implement/SKILL.md +++ b/.claude/skills/rector-implement/SKILL.md @@ -118,19 +118,15 @@ declare(strict_types=1); namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\[ClassName]; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class [ClassName]Test extends AbstractRectorTestCase +class [ClassName]Test extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @@ -145,11 +141,7 @@ class [ClassName]Test extends AbstractRectorTestCase public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Drupal10/Rector/Deprecation/ActionAnnotationToAttributeRector/ActionAnnotationToAttributeRectorTest.php b/tests/src/Drupal10/Rector/Deprecation/ActionAnnotationToAttributeRector/ActionAnnotationToAttributeRectorTest.php index d52a9b2de..405abc137 100644 --- a/tests/src/Drupal10/Rector/Deprecation/ActionAnnotationToAttributeRector/ActionAnnotationToAttributeRectorTest.php +++ b/tests/src/Drupal10/Rector/Deprecation/ActionAnnotationToAttributeRector/ActionAnnotationToAttributeRectorTest.php @@ -5,10 +5,10 @@ namespace DrupalRector\Tests\Drupal10\Rector\Deprecation\ActionAnnotationToAttributeRector; use Iterator; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] -class ActionAnnotationToAttributeRectorTest extends AbstractRectorTestCase +class ActionAnnotationToAttributeRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Drupal10/Rector/Deprecation/ActionAnnotationToAttributeRector/BackwardsCompatibilityActionAnnotationToAttributeRectorTest.php b/tests/src/Drupal10/Rector/Deprecation/ActionAnnotationToAttributeRector/BackwardsCompatibilityActionAnnotationToAttributeRectorTest.php index c751d7874..dd3d10edc 100644 --- a/tests/src/Drupal10/Rector/Deprecation/ActionAnnotationToAttributeRector/BackwardsCompatibilityActionAnnotationToAttributeRectorTest.php +++ b/tests/src/Drupal10/Rector/Deprecation/ActionAnnotationToAttributeRector/BackwardsCompatibilityActionAnnotationToAttributeRectorTest.php @@ -5,7 +5,7 @@ namespace DrupalRector\Tests\Drupal10\Rector\Deprecation\ActionAnnotationToAttributeRector; use Iterator; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; class Drupal { @@ -13,7 +13,7 @@ class Drupal } #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] -class BackwardsCompatibilityActionAnnotationToAttributeRectorTest extends AbstractRectorTestCase +class BackwardsCompatibilityActionAnnotationToAttributeRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector/ReplaceModuleHandlerGetNameRectorTest.php b/tests/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector/ReplaceModuleHandlerGetNameRectorTest.php index 4b8518cf3..822588999 100644 --- a/tests/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector/ReplaceModuleHandlerGetNameRectorTest.php +++ b/tests/src/Drupal10/Rector/Deprecation/ReplaceModuleHandlerGetNameRector/ReplaceModuleHandlerGetNameRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal10\Rector\Deprecation\ReplaceModuleHandlerGetNameRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class ReplaceModuleHandlerGetNameRectorTest extends AbstractRectorTestCase +class ReplaceModuleHandlerGetNameRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @@ -32,11 +28,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/ReplaceRebuildThemeDataRectorTest.php b/tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/ReplaceRebuildThemeDataRectorTest.php index 277dffb22..341bf92be 100644 --- a/tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/ReplaceRebuildThemeDataRectorTest.php +++ b/tests/src/Drupal10/Rector/Deprecation/ReplaceRebuildThemeDataRector/ReplaceRebuildThemeDataRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal10\Rector\Deprecation\ReplaceRebuildThemeDataRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class ReplaceRebuildThemeDataRectorTest extends AbstractRectorTestCase +class ReplaceRebuildThemeDataRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @@ -32,11 +28,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/ReplaceRequestTimeConstantRectorTest.php b/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/ReplaceRequestTimeConstantRectorTest.php index 0258d4a62..a154da2df 100644 --- a/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/ReplaceRequestTimeConstantRectorTest.php +++ b/tests/src/Drupal10/Rector/Deprecation/ReplaceRequestTimeConstantRector/ReplaceRequestTimeConstantRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal10\Rector\Deprecation\ReplaceRequestTimeConstantRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class ReplaceRequestTimeConstantRectorTest extends AbstractRectorTestCase +class ReplaceRequestTimeConstantRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @@ -32,11 +28,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/SystemTimeZonesRectorTest.php b/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/SystemTimeZonesRectorTest.php index 6ab33d245..0897e9188 100644 --- a/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/SystemTimeZonesRectorTest.php +++ b/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/SystemTimeZonesRectorTest.php @@ -6,20 +6,16 @@ use DrupalRector\Services\DrupalRectorSettings; use Iterator; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] -class SystemTimeZonesRectorTest extends AbstractRectorTestCase +class SystemTimeZonesRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @@ -34,11 +30,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Drupal10/Rector/Deprecation/WatchdogExceptionRector/WatchdogExceptionRectorTest.php b/tests/src/Drupal10/Rector/Deprecation/WatchdogExceptionRector/WatchdogExceptionRectorTest.php index b6c2ce96c..b35ab9b25 100644 --- a/tests/src/Drupal10/Rector/Deprecation/WatchdogExceptionRector/WatchdogExceptionRectorTest.php +++ b/tests/src/Drupal10/Rector/Deprecation/WatchdogExceptionRector/WatchdogExceptionRectorTest.php @@ -6,20 +6,16 @@ use DrupalRector\Services\DrupalRectorSettings; use Iterator; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] -class WatchdogExceptionRectorTest extends AbstractRectorTestCase +class WatchdogExceptionRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @@ -34,11 +30,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector/BlockContentTestBaseStringToArrayRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector/BlockContentTestBaseStringToArrayRectorTest.php index bdce8a81c..a0d0c49f0 100644 --- a/tests/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector/BlockContentTestBaseStringToArrayRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/BlockContentTestBaseStringToArrayRector/BlockContentTestBaseStringToArrayRectorTest.php @@ -4,9 +4,9 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\BlockContentTestBaseStringToArrayRector; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class BlockContentTestBaseStringToArrayRectorTest extends AbstractRectorTestCase +class BlockContentTestBaseStringToArrayRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Drupal11/Rector/Deprecation/CheckMarkupToProcessedTextRector/CheckMarkupToProcessedTextRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/CheckMarkupToProcessedTextRector/CheckMarkupToProcessedTextRectorTest.php index fc0fd636c..7d408f572 100644 --- a/tests/src/Drupal11/Rector/Deprecation/CheckMarkupToProcessedTextRector/CheckMarkupToProcessedTextRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/CheckMarkupToProcessedTextRector/CheckMarkupToProcessedTextRectorTest.php @@ -4,9 +4,9 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\CheckMarkupToProcessedTextRector; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class CheckMarkupToProcessedTextRectorTest extends AbstractRectorTestCase +class CheckMarkupToProcessedTextRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Drupal11/Rector/Deprecation/DeprecatedFilterFunctionsRector/DeprecatedFilterFunctionsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/DeprecatedFilterFunctionsRector/DeprecatedFilterFunctionsRectorTest.php index c63bcc291..875a2979a 100644 --- a/tests/src/Drupal11/Rector/Deprecation/DeprecatedFilterFunctionsRector/DeprecatedFilterFunctionsRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/DeprecatedFilterFunctionsRector/DeprecatedFilterFunctionsRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\DeprecatedFilterFunctionsRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class DeprecatedFilterFunctionsRectorTest extends AbstractRectorTestCase +class DeprecatedFilterFunctionsRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @@ -32,11 +28,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/ErrorCurrentErrorHandlerRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/ErrorCurrentErrorHandlerRectorTest.php index 644232d16..21dfd3c0f 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/ErrorCurrentErrorHandlerRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ErrorCurrentErrorHandlerRector/ErrorCurrentErrorHandlerRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ErrorCurrentErrorHandlerRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class ErrorCurrentErrorHandlerRectorTest extends AbstractRectorTestCase +class ErrorCurrentErrorHandlerRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @@ -32,11 +28,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Drupal11/Rector/Deprecation/FileManagedFileSubmitRector/FileManagedFileSubmitRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/FileManagedFileSubmitRector/FileManagedFileSubmitRectorTest.php index 75fd55002..bb0491945 100644 --- a/tests/src/Drupal11/Rector/Deprecation/FileManagedFileSubmitRector/FileManagedFileSubmitRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/FileManagedFileSubmitRector/FileManagedFileSubmitRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\FileManagedFileSubmitRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class FileManagedFileSubmitRectorTest extends AbstractRectorTestCase +class FileManagedFileSubmitRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @@ -32,11 +28,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/FileSystemBasenameToNativeRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/FileSystemBasenameToNativeRectorTest.php index 1f25b1121..180580eb5 100644 --- a/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/FileSystemBasenameToNativeRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/FileSystemBasenameToNativeRector/FileSystemBasenameToNativeRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\FileSystemBasenameToNativeRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class FileSystemBasenameToNativeRectorTest extends AbstractRectorTestCase +class FileSystemBasenameToNativeRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @@ -32,11 +28,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Drupal11/Rector/Deprecation/FilterFormatFunctionsToServiceRector/FilterFormatFunctionsToServiceRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/FilterFormatFunctionsToServiceRector/FilterFormatFunctionsToServiceRectorTest.php index cbfb632e0..fd2d759cb 100644 --- a/tests/src/Drupal11/Rector/Deprecation/FilterFormatFunctionsToServiceRector/FilterFormatFunctionsToServiceRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/FilterFormatFunctionsToServiceRector/FilterFormatFunctionsToServiceRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\FilterFormatFunctionsToServiceRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class FilterFormatFunctionsToServiceRectorTest extends AbstractRectorTestCase +class FilterFormatFunctionsToServiceRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @return \Iterator> */ @@ -30,11 +26,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @return \Iterator> */ diff --git a/tests/src/Drupal11/Rector/Deprecation/GetNameToNameRector/GetNameToNameRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/GetNameToNameRector/GetNameToNameRectorTest.php index 276824201..09862c60b 100644 --- a/tests/src/Drupal11/Rector/Deprecation/GetNameToNameRector/GetNameToNameRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/GetNameToNameRector/GetNameToNameRectorTest.php @@ -4,9 +4,9 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\GetNameToNameRector; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class GetNameToNameRectorTest extends AbstractRectorTestCase +class GetNameToNameRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Drupal11/Rector/Deprecation/GetOriginalClassToGetDecoratedClassesRector/GetOriginalClassToGetDecoratedClassesRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/GetOriginalClassToGetDecoratedClassesRector/GetOriginalClassToGetDecoratedClassesRectorTest.php index f516ff659..f35f54c8e 100644 --- a/tests/src/Drupal11/Rector/Deprecation/GetOriginalClassToGetDecoratedClassesRector/GetOriginalClassToGetDecoratedClassesRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/GetOriginalClassToGetDecoratedClassesRector/GetOriginalClassToGetDecoratedClassesRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\GetOriginalClassToGetDecoratedClassesRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class GetOriginalClassToGetDecoratedClassesRectorTest extends AbstractRectorTestCase +class GetOriginalClassToGetDecoratedClassesRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @@ -32,11 +28,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector/LoadAllIncludesRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector/LoadAllIncludesRectorTest.php index 3790f2b34..49416e1b3 100644 --- a/tests/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector/LoadAllIncludesRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/LoadAllIncludesRector/LoadAllIncludesRectorTest.php @@ -4,9 +4,9 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\LoadAllIncludesRector; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class LoadAllIncludesRectorTest extends AbstractRectorTestCase +class LoadAllIncludesRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Drupal11/Rector/Deprecation/LocaleCompareIncToServiceRector/LocaleCompareIncToServiceRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/LocaleCompareIncToServiceRector/LocaleCompareIncToServiceRectorTest.php index 2d1e708d8..15a308ef0 100644 --- a/tests/src/Drupal11/Rector/Deprecation/LocaleCompareIncToServiceRector/LocaleCompareIncToServiceRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/LocaleCompareIncToServiceRector/LocaleCompareIncToServiceRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\LocaleCompareIncToServiceRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class LocaleCompareIncToServiceRectorTest extends AbstractRectorTestCase +class LocaleCompareIncToServiceRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @return \Iterator> */ @@ -30,11 +26,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @return \Iterator> */ diff --git a/tests/src/Drupal11/Rector/Deprecation/MediaFilterFormatEditFormValidateRector/MediaFilterFormatEditFormValidateRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/MediaFilterFormatEditFormValidateRector/MediaFilterFormatEditFormValidateRectorTest.php index 009bb1ea5..2c834c870 100644 --- a/tests/src/Drupal11/Rector/Deprecation/MediaFilterFormatEditFormValidateRector/MediaFilterFormatEditFormValidateRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/MediaFilterFormatEditFormValidateRector/MediaFilterFormatEditFormValidateRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\MediaFilterFormatEditFormValidateRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class MediaFilterFormatEditFormValidateRectorTest extends AbstractRectorTestCase +class MediaFilterFormatEditFormValidateRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @@ -32,11 +28,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/MigrateSqlGetMigrationPluginManagerRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/MigrateSqlGetMigrationPluginManagerRectorTest.php index 5fd47704b..199500249 100644 --- a/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/MigrateSqlGetMigrationPluginManagerRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/MigrateSqlGetMigrationPluginManagerRector/MigrateSqlGetMigrationPluginManagerRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\MigrateSqlGetMigrationPluginManagerRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class MigrateSqlGetMigrationPluginManagerRectorTest extends AbstractRectorTestCase +class MigrateSqlGetMigrationPluginManagerRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @@ -32,11 +28,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Drupal11/Rector/Deprecation/MovePointerToMouseOverRector/MovePointerToMouseOverRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/MovePointerToMouseOverRector/MovePointerToMouseOverRectorTest.php index ba85c4d05..1f195fbd4 100644 --- a/tests/src/Drupal11/Rector/Deprecation/MovePointerToMouseOverRector/MovePointerToMouseOverRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/MovePointerToMouseOverRector/MovePointerToMouseOverRectorTest.php @@ -4,9 +4,9 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\MovePointerToMouseOverRector; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class MovePointerToMouseOverRectorTest extends AbstractRectorTestCase +class MovePointerToMouseOverRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Drupal11/Rector/Deprecation/NodeAccessRebuildFunctionsRector/NodeAccessRebuildFunctionsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/NodeAccessRebuildFunctionsRector/NodeAccessRebuildFunctionsRectorTest.php index 8b48b958d..3aa98ebfd 100644 --- a/tests/src/Drupal11/Rector/Deprecation/NodeAccessRebuildFunctionsRector/NodeAccessRebuildFunctionsRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/NodeAccessRebuildFunctionsRector/NodeAccessRebuildFunctionsRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\NodeAccessRebuildFunctionsRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class NodeAccessRebuildFunctionsRectorTest extends AbstractRectorTestCase +class NodeAccessRebuildFunctionsRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @return \Iterator> */ @@ -30,11 +26,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @return \Iterator> */ diff --git a/tests/src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector/NodeStorageDeprecatedMethodsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector/NodeStorageDeprecatedMethodsRectorTest.php index 826325019..3f908f110 100644 --- a/tests/src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector/NodeStorageDeprecatedMethodsRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/NodeStorageDeprecatedMethodsRector/NodeStorageDeprecatedMethodsRectorTest.php @@ -4,9 +4,9 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\NodeStorageDeprecatedMethodsRector; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class NodeStorageDeprecatedMethodsRectorTest extends AbstractRectorTestCase +class NodeStorageDeprecatedMethodsRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/PluginBaseIsConfigurableRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/PluginBaseIsConfigurableRectorTest.php index dbaa274be..38d7b8560 100644 --- a/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/PluginBaseIsConfigurableRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/PluginBaseIsConfigurableRector/PluginBaseIsConfigurableRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\PluginBaseIsConfigurableRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class PluginBaseIsConfigurableRectorTest extends AbstractRectorTestCase +class PluginBaseIsConfigurableRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @@ -32,11 +28,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector/RemoveAutomatedCronSubmitHandlerRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector/RemoveAutomatedCronSubmitHandlerRectorTest.php index 0d78543ad..4cc0431a2 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector/RemoveAutomatedCronSubmitHandlerRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveAutomatedCronSubmitHandlerRector/RemoveAutomatedCronSubmitHandlerRectorTest.php @@ -4,9 +4,9 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\RemoveAutomatedCronSubmitHandlerRector; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class RemoveAutomatedCronSubmitHandlerRectorTest extends AbstractRectorTestCase +class RemoveAutomatedCronSubmitHandlerRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/RemoveCacheExpireOverrideRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/RemoveCacheExpireOverrideRectorTest.php index c99162cd8..4ea86b2bf 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/RemoveCacheExpireOverrideRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveCacheExpireOverrideRector/RemoveCacheExpireOverrideRectorTest.php @@ -4,9 +4,9 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\RemoveCacheExpireOverrideRector; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class RemoveCacheExpireOverrideRectorTest extends AbstractRectorTestCase +class RemoveCacheExpireOverrideRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveCacheTagChecksumAssertionsRector/RemoveCacheTagChecksumAssertionsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveCacheTagChecksumAssertionsRector/RemoveCacheTagChecksumAssertionsRectorTest.php index 1ae0d132f..f6fda0f08 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveCacheTagChecksumAssertionsRector/RemoveCacheTagChecksumAssertionsRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveCacheTagChecksumAssertionsRector/RemoveCacheTagChecksumAssertionsRectorTest.php @@ -4,9 +4,9 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\RemoveCacheTagChecksumAssertionsRector; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class RemoveCacheTagChecksumAssertionsRectorTest extends AbstractRectorTestCase +class RemoveCacheTagChecksumAssertionsRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector/RemoveConfigSaveTrustedDataArgRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector/RemoveConfigSaveTrustedDataArgRectorTest.php index 9f7fb2865..c101fc642 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector/RemoveConfigSaveTrustedDataArgRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveConfigSaveTrustedDataArgRector/RemoveConfigSaveTrustedDataArgRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\RemoveConfigSaveTrustedDataArgRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class RemoveConfigSaveTrustedDataArgRectorTest extends AbstractRectorTestCase +class RemoveConfigSaveTrustedDataArgRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @@ -32,11 +28,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveFilterTipsLongParamRector/RemoveFilterTipsLongParamRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveFilterTipsLongParamRector/RemoveFilterTipsLongParamRectorTest.php index 692ba3c17..eec7ac4ab 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveFilterTipsLongParamRector/RemoveFilterTipsLongParamRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveFilterTipsLongParamRector/RemoveFilterTipsLongParamRectorTest.php @@ -4,9 +4,9 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\RemoveFilterTipsLongParamRector; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class RemoveFilterTipsLongParamRectorTest extends AbstractRectorTestCase +class RemoveFilterTipsLongParamRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/RemoveHandlerBaseDefineExtraOptionsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/RemoveHandlerBaseDefineExtraOptionsRectorTest.php index ec7092a7a..e017a37bc 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/RemoveHandlerBaseDefineExtraOptionsRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveHandlerBaseDefineExtraOptionsRector/RemoveHandlerBaseDefineExtraOptionsRectorTest.php @@ -4,9 +4,9 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\RemoveHandlerBaseDefineExtraOptionsRector; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class RemoveHandlerBaseDefineExtraOptionsRectorTest extends AbstractRectorTestCase +class RemoveHandlerBaseDefineExtraOptionsRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector/RemoveLinkWidgetValidateTitleElementRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector/RemoveLinkWidgetValidateTitleElementRectorTest.php index 9b0c17e3b..73c93b3aa 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector/RemoveLinkWidgetValidateTitleElementRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveLinkWidgetValidateTitleElementRector/RemoveLinkWidgetValidateTitleElementRectorTest.php @@ -4,9 +4,9 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\RemoveLinkWidgetValidateTitleElementRector; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class RemoveLinkWidgetValidateTitleElementRectorTest extends AbstractRectorTestCase +class RemoveLinkWidgetValidateTitleElementRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector/RemoveModuleHandlerAddModuleCallsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector/RemoveModuleHandlerAddModuleCallsRectorTest.php index d90c5e5df..70f0b0091 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector/RemoveModuleHandlerAddModuleCallsRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerAddModuleCallsRector/RemoveModuleHandlerAddModuleCallsRectorTest.php @@ -4,9 +4,9 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\RemoveModuleHandlerAddModuleCallsRector; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class RemoveModuleHandlerAddModuleCallsRectorTest extends AbstractRectorTestCase +class RemoveModuleHandlerAddModuleCallsRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector/RemoveModuleHandlerDeprecatedMethodsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector/RemoveModuleHandlerDeprecatedMethodsRectorTest.php index 5671be3b8..81f708653 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector/RemoveModuleHandlerDeprecatedMethodsRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveModuleHandlerDeprecatedMethodsRector/RemoveModuleHandlerDeprecatedMethodsRectorTest.php @@ -4,9 +4,9 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\RemoveModuleHandlerDeprecatedMethodsRector; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class RemoveModuleHandlerDeprecatedMethodsRectorTest extends AbstractRectorTestCase +class RemoveModuleHandlerDeprecatedMethodsRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/RemoveRootFromConvertDbUrlRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/RemoveRootFromConvertDbUrlRectorTest.php index df03bd545..e2850d67a 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/RemoveRootFromConvertDbUrlRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromConvertDbUrlRector/RemoveRootFromConvertDbUrlRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\RemoveRootFromConvertDbUrlRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class RemoveRootFromConvertDbUrlRectorTest extends AbstractRectorTestCase +class RemoveRootFromConvertDbUrlRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @@ -32,11 +28,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromCreateConnectionOptionsFromUrlRector/RemoveRootFromCreateConnectionOptionsFromUrlRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromCreateConnectionOptionsFromUrlRector/RemoveRootFromCreateConnectionOptionsFromUrlRectorTest.php index 1474131c9..a8f9eb9fe 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromCreateConnectionOptionsFromUrlRector/RemoveRootFromCreateConnectionOptionsFromUrlRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveRootFromCreateConnectionOptionsFromUrlRector/RemoveRootFromCreateConnectionOptionsFromUrlRectorTest.php @@ -4,9 +4,9 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\RemoveRootFromCreateConnectionOptionsFromUrlRector; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class RemoveRootFromCreateConnectionOptionsFromUrlRectorTest extends AbstractRectorTestCase +class RemoveRootFromCreateConnectionOptionsFromUrlRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/RemoveSetUriCallbackRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/RemoveSetUriCallbackRectorTest.php index 0868759fd..76e6a7b83 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/RemoveSetUriCallbackRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveSetUriCallbackRector/RemoveSetUriCallbackRectorTest.php @@ -4,9 +4,9 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\RemoveSetUriCallbackRector; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class RemoveSetUriCallbackRectorTest extends AbstractRectorTestCase +class RemoveSetUriCallbackRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector/RemoveStateCacheSettingRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector/RemoveStateCacheSettingRectorTest.php index 2b506309c..a1529595e 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector/RemoveStateCacheSettingRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveStateCacheSettingRector/RemoveStateCacheSettingRectorTest.php @@ -4,9 +4,9 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\RemoveStateCacheSettingRector; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class RemoveStateCacheSettingRectorTest extends AbstractRectorTestCase +class RemoveStateCacheSettingRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/RemoveTrustDataCallRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/RemoveTrustDataCallRectorTest.php index c617769b8..f304d1994 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/RemoveTrustDataCallRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveTrustDataCallRector/RemoveTrustDataCallRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\RemoveTrustDataCallRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class RemoveTrustDataCallRectorTest extends AbstractRectorTestCase +class RemoveTrustDataCallRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @@ -32,11 +28,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/RemoveTwigNodeTransTagArgumentRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/RemoveTwigNodeTransTagArgumentRectorTest.php index 40b48c994..12883a804 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/RemoveTwigNodeTransTagArgumentRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveTwigNodeTransTagArgumentRector/RemoveTwigNodeTransTagArgumentRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\RemoveTwigNodeTransTagArgumentRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class RemoveTwigNodeTransTagArgumentRectorTest extends AbstractRectorTestCase +class RemoveTwigNodeTransTagArgumentRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @@ -32,11 +28,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector/RemoveUpdaterPostInstallMethodsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector/RemoveUpdaterPostInstallMethodsRectorTest.php index f111ec57e..d94e3d385 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector/RemoveUpdaterPostInstallMethodsRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveUpdaterPostInstallMethodsRector/RemoveUpdaterPostInstallMethodsRectorTest.php @@ -4,9 +4,9 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\RemoveUpdaterPostInstallMethodsRector; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class RemoveUpdaterPostInstallMethodsRectorTest extends AbstractRectorTestCase +class RemoveUpdaterPostInstallMethodsRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/RemoveViewsRowCacheKeysRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/RemoveViewsRowCacheKeysRectorTest.php index 381e17082..3e06a54ae 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/RemoveViewsRowCacheKeysRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/RemoveViewsRowCacheKeysRector/RemoveViewsRowCacheKeysRectorTest.php @@ -4,9 +4,9 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\RemoveViewsRowCacheKeysRector; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class RemoveViewsRowCacheKeysRectorTest extends AbstractRectorTestCase +class RemoveViewsRowCacheKeysRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector/RenameStopProceduralHookScanRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector/RenameStopProceduralHookScanRectorTest.php index a102fe59c..86b883691 100644 --- a/tests/src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector/RenameStopProceduralHookScanRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/RenameStopProceduralHookScanRector/RenameStopProceduralHookScanRectorTest.php @@ -4,9 +4,9 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\RenameStopProceduralHookScanRector; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class RenameStopProceduralHookScanRectorTest extends AbstractRectorTestCase +class RenameStopProceduralHookScanRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceAddCachedDiscoveryMethodCallRector/ReplaceAddCachedDiscoveryMethodCallRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceAddCachedDiscoveryMethodCallRector/ReplaceAddCachedDiscoveryMethodCallRectorTest.php index a7ddbb8d7..c23bcb889 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceAddCachedDiscoveryMethodCallRector/ReplaceAddCachedDiscoveryMethodCallRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceAddCachedDiscoveryMethodCallRector/ReplaceAddCachedDiscoveryMethodCallRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceAddCachedDiscoveryMethodCallRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class ReplaceAddCachedDiscoveryMethodCallRectorTest extends AbstractRectorTestCase +class ReplaceAddCachedDiscoveryMethodCallRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @return \Iterator> */ @@ -30,11 +26,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @return \Iterator> */ diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/ReplaceAlphadecimalToIntNullRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/ReplaceAlphadecimalToIntNullRectorTest.php index 6674338cd..1debde023 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/ReplaceAlphadecimalToIntNullRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceAlphadecimalToIntNullRector/ReplaceAlphadecimalToIntNullRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceAlphadecimalToIntNullRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class ReplaceAlphadecimalToIntNullRectorTest extends AbstractRectorTestCase +class ReplaceAlphadecimalToIntNullRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @@ -32,11 +28,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/ReplaceCommentManagerGetCountNewCommentsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/ReplaceCommentManagerGetCountNewCommentsRectorTest.php index ccefc3251..aec26b80b 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/ReplaceCommentManagerGetCountNewCommentsRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceCommentManagerGetCountNewCommentsRector/ReplaceCommentManagerGetCountNewCommentsRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceCommentManagerGetCountNewCommentsRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class ReplaceCommentManagerGetCountNewCommentsRectorTest extends AbstractRectorTestCase +class ReplaceCommentManagerGetCountNewCommentsRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @@ -32,11 +28,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/ReplaceDateTimeRangeConstantsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/ReplaceDateTimeRangeConstantsRectorTest.php index c45979ac9..db8f0a1d1 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/ReplaceDateTimeRangeConstantsRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceDateTimeRangeConstantsRector/ReplaceDateTimeRangeConstantsRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceDateTimeRangeConstantsRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class ReplaceDateTimeRangeConstantsRectorTest extends AbstractRectorTestCase +class ReplaceDateTimeRangeConstantsRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @@ -32,11 +28,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/ReplaceEditorLoadRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/ReplaceEditorLoadRectorTest.php index 84694396a..9aea19411 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/ReplaceEditorLoadRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEditorLoadRector/ReplaceEditorLoadRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceEditorLoadRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class ReplaceEditorLoadRectorTest extends AbstractRectorTestCase +class ReplaceEditorLoadRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @@ -32,11 +28,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/ReplaceEntityOriginalPropertyRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/ReplaceEntityOriginalPropertyRectorTest.php index b13b09582..ff61a698b 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/ReplaceEntityOriginalPropertyRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityOriginalPropertyRector/ReplaceEntityOriginalPropertyRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceEntityOriginalPropertyRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class ReplaceEntityOriginalPropertyRectorTest extends AbstractRectorTestCase +class ReplaceEntityOriginalPropertyRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @@ -32,11 +28,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/ReplaceEntityReferenceRecursiveLimitRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/ReplaceEntityReferenceRecursiveLimitRectorTest.php index 3dd09b256..c2cc1b060 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/ReplaceEntityReferenceRecursiveLimitRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceEntityReferenceRecursiveLimitRector/ReplaceEntityReferenceRecursiveLimitRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceEntityReferenceRecursiveLimitRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class ReplaceEntityReferenceRecursiveLimitRectorTest extends AbstractRectorTestCase +class ReplaceEntityReferenceRecursiveLimitRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @@ -32,11 +28,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/ReplaceFieldgroupToFieldsetRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/ReplaceFieldgroupToFieldsetRectorTest.php index 33fc0739c..98ba5696b 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/ReplaceFieldgroupToFieldsetRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceFieldgroupToFieldsetRector/ReplaceFieldgroupToFieldsetRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceFieldgroupToFieldsetRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class ReplaceFieldgroupToFieldsetRectorTest extends AbstractRectorTestCase +class ReplaceFieldgroupToFieldsetRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @@ -32,11 +28,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/ReplaceLocaleConfigBatchFunctionsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/ReplaceLocaleConfigBatchFunctionsRectorTest.php index 7f64594ac..46c2f46b5 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/ReplaceLocaleConfigBatchFunctionsRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceLocaleConfigBatchFunctionsRector/ReplaceLocaleConfigBatchFunctionsRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceLocaleConfigBatchFunctionsRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class ReplaceLocaleConfigBatchFunctionsRectorTest extends AbstractRectorTestCase +class ReplaceLocaleConfigBatchFunctionsRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @@ -32,11 +28,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/ReplaceNodeAccessViewAllNodesRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/ReplaceNodeAccessViewAllNodesRectorTest.php index 02f41d5d2..bf75d17ce 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/ReplaceNodeAccessViewAllNodesRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAccessViewAllNodesRector/ReplaceNodeAccessViewAllNodesRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceNodeAccessViewAllNodesRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class ReplaceNodeAccessViewAllNodesRectorTest extends AbstractRectorTestCase +class ReplaceNodeAccessViewAllNodesRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @@ -32,11 +28,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/ReplaceNodeAddBodyFieldRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/ReplaceNodeAddBodyFieldRectorTest.php index dc46b2d49..edbdaa6cd 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/ReplaceNodeAddBodyFieldRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeAddBodyFieldRector/ReplaceNodeAddBodyFieldRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceNodeAddBodyFieldRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class ReplaceNodeAddBodyFieldRectorTest extends AbstractRectorTestCase +class ReplaceNodeAddBodyFieldRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @@ -32,11 +28,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/ReplaceNodeModuleProceduralFunctionsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/ReplaceNodeModuleProceduralFunctionsRectorTest.php index 69f1791b1..3de036586 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/ReplaceNodeModuleProceduralFunctionsRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeModuleProceduralFunctionsRector/ReplaceNodeModuleProceduralFunctionsRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceNodeModuleProceduralFunctionsRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class ReplaceNodeModuleProceduralFunctionsRectorTest extends AbstractRectorTestCase +class ReplaceNodeModuleProceduralFunctionsRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @@ -32,11 +28,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/ReplaceNodeSetPreviewModeRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/ReplaceNodeSetPreviewModeRectorTest.php index adcc365f0..d6871e82b 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/ReplaceNodeSetPreviewModeRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceNodeSetPreviewModeRector/ReplaceNodeSetPreviewModeRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceNodeSetPreviewModeRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class ReplaceNodeSetPreviewModeRectorTest extends AbstractRectorTestCase +class ReplaceNodeSetPreviewModeRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @@ -32,11 +28,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/ReplacePdoFetchConstantsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/ReplacePdoFetchConstantsRectorTest.php index 78235ad31..71184476c 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/ReplacePdoFetchConstantsRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplacePdoFetchConstantsRector/ReplacePdoFetchConstantsRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplacePdoFetchConstantsRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class ReplacePdoFetchConstantsRectorTest extends AbstractRectorTestCase +class ReplacePdoFetchConstantsRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @@ -32,11 +28,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/ReplaceRecipeRunnerInstallModuleRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/ReplaceRecipeRunnerInstallModuleRectorTest.php index 9c0ed3dde..d618dabe3 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/ReplaceRecipeRunnerInstallModuleRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceRecipeRunnerInstallModuleRector/ReplaceRecipeRunnerInstallModuleRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceRecipeRunnerInstallModuleRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class ReplaceRecipeRunnerInstallModuleRectorTest extends AbstractRectorTestCase +class ReplaceRecipeRunnerInstallModuleRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @@ -32,11 +28,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/ReplaceSessionManagerDeleteRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/ReplaceSessionManagerDeleteRectorTest.php index b440694b0..7e9bff552 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/ReplaceSessionManagerDeleteRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionManagerDeleteRector/ReplaceSessionManagerDeleteRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceSessionManagerDeleteRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class ReplaceSessionManagerDeleteRectorTest extends AbstractRectorTestCase +class ReplaceSessionManagerDeleteRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @@ -32,11 +28,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/ReplaceSessionWritesWithRequestSessionRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/ReplaceSessionWritesWithRequestSessionRectorTest.php index 9eb794c2f..971539e44 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/ReplaceSessionWritesWithRequestSessionRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceSessionWritesWithRequestSessionRector/ReplaceSessionWritesWithRequestSessionRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceSessionWritesWithRequestSessionRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class ReplaceSessionWritesWithRequestSessionRectorTest extends AbstractRectorTestCase +class ReplaceSessionWritesWithRequestSessionRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @@ -32,11 +28,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/ReplaceSystemPerformanceGzipKeyRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/ReplaceSystemPerformanceGzipKeyRectorTest.php index bc6acab77..ceb3d2322 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/ReplaceSystemPerformanceGzipKeyRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceSystemPerformanceGzipKeyRector/ReplaceSystemPerformanceGzipKeyRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceSystemPerformanceGzipKeyRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class ReplaceSystemPerformanceGzipKeyRectorTest extends AbstractRectorTestCase +class ReplaceSystemPerformanceGzipKeyRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @@ -32,11 +28,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/ReplaceThemeGetSettingRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/ReplaceThemeGetSettingRectorTest.php index fa4ee255d..29276dd50 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/ReplaceThemeGetSettingRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceThemeGetSettingRector/ReplaceThemeGetSettingRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceThemeGetSettingRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class ReplaceThemeGetSettingRectorTest extends AbstractRectorTestCase +class ReplaceThemeGetSettingRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @@ -32,11 +28,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceTwigExtensionRector/ReplaceTwigExtensionRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceTwigExtensionRector/ReplaceTwigExtensionRectorTest.php index 9607ca95e..de3b06443 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceTwigExtensionRector/ReplaceTwigExtensionRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceTwigExtensionRector/ReplaceTwigExtensionRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceTwigExtensionRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class ReplaceTwigExtensionRectorTest extends AbstractRectorTestCase +class ReplaceTwigExtensionRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @@ -32,11 +28,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/ReplaceUserSessionNamePropertyRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/ReplaceUserSessionNamePropertyRectorTest.php index 86b9cbad3..49aa1a26e 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/ReplaceUserSessionNamePropertyRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceUserSessionNamePropertyRector/ReplaceUserSessionNamePropertyRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceUserSessionNamePropertyRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class ReplaceUserSessionNamePropertyRectorTest extends AbstractRectorTestCase +class ReplaceUserSessionNamePropertyRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @@ -32,11 +28,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/ReplaceViewsProceduralFunctionsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/ReplaceViewsProceduralFunctionsRectorTest.php index 74cf94905..ea24c6c8c 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/ReplaceViewsProceduralFunctionsRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ReplaceViewsProceduralFunctionsRector/ReplaceViewsProceduralFunctionsRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ReplaceViewsProceduralFunctionsRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class ReplaceViewsProceduralFunctionsRectorTest extends AbstractRectorTestCase +class ReplaceViewsProceduralFunctionsRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @@ -32,11 +28,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('11.3.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/StatementPrefetchIteratorFetchColumnRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/StatementPrefetchIteratorFetchColumnRectorTest.php index 4432042ba..1eccee390 100644 --- a/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/StatementPrefetchIteratorFetchColumnRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/StatementPrefetchIteratorFetchColumnRector/StatementPrefetchIteratorFetchColumnRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\StatementPrefetchIteratorFetchColumnRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class StatementPrefetchIteratorFetchColumnRectorTest extends AbstractRectorTestCase +class StatementPrefetchIteratorFetchColumnRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @@ -32,11 +28,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/StripMigrationDependenciesExpandArgRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/StripMigrationDependenciesExpandArgRectorTest.php index 69606b0f4..9a4f086ac 100644 --- a/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/StripMigrationDependenciesExpandArgRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/StripMigrationDependenciesExpandArgRector/StripMigrationDependenciesExpandArgRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\StripMigrationDependenciesExpandArgRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class StripMigrationDependenciesExpandArgRectorTest extends AbstractRectorTestCase +class StripMigrationDependenciesExpandArgRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @@ -32,11 +28,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector/SystemRegionFunctionsRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector/SystemRegionFunctionsRectorTest.php index 15ea7efec..cceabdbb6 100644 --- a/tests/src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector/SystemRegionFunctionsRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/SystemRegionFunctionsRector/SystemRegionFunctionsRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\SystemRegionFunctionsRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class SystemRegionFunctionsRectorTest extends AbstractRectorTestCase +class SystemRegionFunctionsRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @return \Iterator> */ @@ -30,11 +26,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @return \Iterator> */ diff --git a/tests/src/Drupal11/Rector/Deprecation/SystemSortThemesRector/SystemSortThemesRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/SystemSortThemesRector/SystemSortThemesRectorTest.php index 19e49a056..3c02529df 100644 --- a/tests/src/Drupal11/Rector/Deprecation/SystemSortThemesRector/SystemSortThemesRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/SystemSortThemesRector/SystemSortThemesRectorTest.php @@ -4,9 +4,9 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\SystemSortThemesRector; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class SystemSortThemesRectorTest extends AbstractRectorTestCase +class SystemSortThemesRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/UseEntityTypeHasIntegerIdRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/UseEntityTypeHasIntegerIdRectorTest.php index 1bed6f966..4b235dc89 100644 --- a/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/UseEntityTypeHasIntegerIdRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/UseEntityTypeHasIntegerIdRector/UseEntityTypeHasIntegerIdRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\UseEntityTypeHasIntegerIdRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class UseEntityTypeHasIntegerIdRectorTest extends AbstractRectorTestCase +class UseEntityTypeHasIntegerIdRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @@ -32,11 +28,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/ViewsPluginHandlerManagerRectorTest.php b/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/ViewsPluginHandlerManagerRectorTest.php index d99351b9b..d2971c106 100644 --- a/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/ViewsPluginHandlerManagerRectorTest.php +++ b/tests/src/Drupal11/Rector/Deprecation/ViewsPluginHandlerManagerRector/ViewsPluginHandlerManagerRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Drupal11\Rector\Deprecation\ViewsPluginHandlerManagerRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class ViewsPluginHandlerManagerRectorTest extends AbstractRectorTestCase +class ViewsPluginHandlerManagerRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @@ -32,11 +28,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Drupal8/Rector/Deprecation/DrupalSetMessageRector/DrupalSetMessageRectorTest.php b/tests/src/Drupal8/Rector/Deprecation/DrupalSetMessageRector/DrupalSetMessageRectorTest.php index 093f38aa9..578b8d407 100644 --- a/tests/src/Drupal8/Rector/Deprecation/DrupalSetMessageRector/DrupalSetMessageRectorTest.php +++ b/tests/src/Drupal8/Rector/Deprecation/DrupalSetMessageRector/DrupalSetMessageRectorTest.php @@ -5,10 +5,10 @@ namespace Drupal8\Rector\Deprecation\DrupalSetMessageRector; use Iterator; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] -class DrupalSetMessageRectorTest extends AbstractRectorTestCase +class DrupalSetMessageRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Drupal8/Rector/Deprecation/EntityDeleteMultipleRector/EntityDeleteMultipleRectorTest.php b/tests/src/Drupal8/Rector/Deprecation/EntityDeleteMultipleRector/EntityDeleteMultipleRectorTest.php index cbbb3f1a7..9d2ea07a7 100644 --- a/tests/src/Drupal8/Rector/Deprecation/EntityDeleteMultipleRector/EntityDeleteMultipleRectorTest.php +++ b/tests/src/Drupal8/Rector/Deprecation/EntityDeleteMultipleRector/EntityDeleteMultipleRectorTest.php @@ -5,10 +5,10 @@ namespace Drupal8\Rector\Deprecation\EntityDeleteMultipleRector; use Iterator; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] -class EntityDeleteMultipleRectorTest extends AbstractRectorTestCase +class EntityDeleteMultipleRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Drupal8/Rector/Deprecation/EntityManagerRector/EntityManagerRectorTest.php b/tests/src/Drupal8/Rector/Deprecation/EntityManagerRector/EntityManagerRectorTest.php index a5e3bb702..0130c1b07 100644 --- a/tests/src/Drupal8/Rector/Deprecation/EntityManagerRector/EntityManagerRectorTest.php +++ b/tests/src/Drupal8/Rector/Deprecation/EntityManagerRector/EntityManagerRectorTest.php @@ -5,10 +5,10 @@ namespace Drupal8\Rector\Deprecation\EntityManagerRector; use Iterator; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] -class EntityManagerRectorTest extends AbstractRectorTestCase +class EntityManagerRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Drupal8/Rector/Deprecation/EntityViewRector/EntityViewRectorTest.php b/tests/src/Drupal8/Rector/Deprecation/EntityViewRector/EntityViewRectorTest.php index feaa57582..a4e9feefd 100644 --- a/tests/src/Drupal8/Rector/Deprecation/EntityViewRector/EntityViewRectorTest.php +++ b/tests/src/Drupal8/Rector/Deprecation/EntityViewRector/EntityViewRectorTest.php @@ -5,10 +5,10 @@ namespace Drupal8\Rector\Deprecation\EntityViewRector; use Iterator; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] -class EntityViewRectorTest extends AbstractRectorTestCase +class EntityViewRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Drupal8/Rector/Deprecation/FunctionalTestDefaultThemePropertyRector/FunctionalTestDefaultThemePropertyRectorTest.php b/tests/src/Drupal8/Rector/Deprecation/FunctionalTestDefaultThemePropertyRector/FunctionalTestDefaultThemePropertyRectorTest.php index 7c66485a9..c6b9405dc 100644 --- a/tests/src/Drupal8/Rector/Deprecation/FunctionalTestDefaultThemePropertyRector/FunctionalTestDefaultThemePropertyRectorTest.php +++ b/tests/src/Drupal8/Rector/Deprecation/FunctionalTestDefaultThemePropertyRector/FunctionalTestDefaultThemePropertyRectorTest.php @@ -5,9 +5,9 @@ namespace DrupalRector\Tests\Drupal8\Rector\Deprecation\FunctionalTestDefaultThemePropertyRector; use DrupalRector\Tests\Rector\Class_\FunctionalTestDefaultThemePropertyRector\Iterator; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -final class FunctionalTestDefaultThemePropertyRectorTest extends AbstractRectorTestCase +final class FunctionalTestDefaultThemePropertyRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Drupal8/Rector/Deprecation/GetMockRector/GetMockRectorTest.php b/tests/src/Drupal8/Rector/Deprecation/GetMockRector/GetMockRectorTest.php index 56ec15b7a..678df59e6 100644 --- a/tests/src/Drupal8/Rector/Deprecation/GetMockRector/GetMockRectorTest.php +++ b/tests/src/Drupal8/Rector/Deprecation/GetMockRector/GetMockRectorTest.php @@ -5,9 +5,9 @@ namespace Drupal8\Rector\Deprecation\GetMockRector; use Iterator; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class GetMockRectorTest extends AbstractRectorTestCase +class GetMockRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Drupal9/Rector/Deprecation/AssertFieldByIdRector/AssertFieldByIdRectorTest.php b/tests/src/Drupal9/Rector/Deprecation/AssertFieldByIdRector/AssertFieldByIdRectorTest.php index 36f5189f7..bcb82ce90 100644 --- a/tests/src/Drupal9/Rector/Deprecation/AssertFieldByIdRector/AssertFieldByIdRectorTest.php +++ b/tests/src/Drupal9/Rector/Deprecation/AssertFieldByIdRector/AssertFieldByIdRectorTest.php @@ -5,10 +5,10 @@ namespace DrupalRector\Tests\Drupal9\Rector\Deprecation\AssertFieldByIdRector; use Iterator; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] -class AssertFieldByIdRectorTest extends AbstractRectorTestCase +class AssertFieldByIdRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Drupal9/Rector/Deprecation/AssertFieldByNameRector/AssertFieldByNameRectorTest.php b/tests/src/Drupal9/Rector/Deprecation/AssertFieldByNameRector/AssertFieldByNameRectorTest.php index e40acf492..16dc64285 100644 --- a/tests/src/Drupal9/Rector/Deprecation/AssertFieldByNameRector/AssertFieldByNameRectorTest.php +++ b/tests/src/Drupal9/Rector/Deprecation/AssertFieldByNameRector/AssertFieldByNameRectorTest.php @@ -5,10 +5,10 @@ namespace DrupalRector\Tests\Drupal9\Rector\Deprecation\AssertFieldByNameRector; use Iterator; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] -class AssertFieldByNameRectorTest extends AbstractRectorTestCase +class AssertFieldByNameRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Drupal9/Rector/Deprecation/AssertLegacyTraitRector/AssertLegacyTraitRectorTest.php b/tests/src/Drupal9/Rector/Deprecation/AssertLegacyTraitRector/AssertLegacyTraitRectorTest.php index 41684cfad..4c7c84fce 100644 --- a/tests/src/Drupal9/Rector/Deprecation/AssertLegacyTraitRector/AssertLegacyTraitRectorTest.php +++ b/tests/src/Drupal9/Rector/Deprecation/AssertLegacyTraitRector/AssertLegacyTraitRectorTest.php @@ -5,10 +5,10 @@ namespace Drupal9\Rector\Deprecation\AssertLegacyTraitRector; use Iterator; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] -class AssertLegacyTraitRectorTest extends AbstractRectorTestCase +class AssertLegacyTraitRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Drupal9/Rector/Deprecation/AssertNoFieldByNameRector/AssertNoFieldByNameRectorTest.php b/tests/src/Drupal9/Rector/Deprecation/AssertNoFieldByNameRector/AssertNoFieldByNameRectorTest.php index 22fb22807..71546f321 100644 --- a/tests/src/Drupal9/Rector/Deprecation/AssertNoFieldByNameRector/AssertNoFieldByNameRectorTest.php +++ b/tests/src/Drupal9/Rector/Deprecation/AssertNoFieldByNameRector/AssertNoFieldByNameRectorTest.php @@ -5,10 +5,10 @@ namespace Drupal9\Rector\Deprecation\AssertNoFieldByNameRector; use Iterator; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] -class AssertNoFieldByNameRectorTest extends AbstractRectorTestCase +class AssertNoFieldByNameRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Drupal9/Rector/Deprecation/AssertNoUniqueTextRector/AssertNoUniqueTextRector.php b/tests/src/Drupal9/Rector/Deprecation/AssertNoUniqueTextRector/AssertNoUniqueTextRector.php index 2b7bc29fe..fc5578a98 100644 --- a/tests/src/Drupal9/Rector/Deprecation/AssertNoUniqueTextRector/AssertNoUniqueTextRector.php +++ b/tests/src/Drupal9/Rector/Deprecation/AssertNoUniqueTextRector/AssertNoUniqueTextRector.php @@ -5,10 +5,10 @@ namespace Drupal9\Rector\Deprecation\AssertNoUniqueTextRector; use Iterator; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] -class AssertNoUniqueTextRector extends AbstractRectorTestCase +class AssertNoUniqueTextRector extends AbstractDrupalRectorTestCase { public function __construct() { diff --git a/tests/src/Drupal9/Rector/Deprecation/ExtensionPathRector/ExtensionPathRectorTest.php b/tests/src/Drupal9/Rector/Deprecation/ExtensionPathRector/ExtensionPathRectorTest.php index b78402133..911affc9c 100644 --- a/tests/src/Drupal9/Rector/Deprecation/ExtensionPathRector/ExtensionPathRectorTest.php +++ b/tests/src/Drupal9/Rector/Deprecation/ExtensionPathRector/ExtensionPathRectorTest.php @@ -5,10 +5,10 @@ namespace Drupal9\Rector\Deprecation\ExtensionPathRector; use Iterator; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] -class ExtensionPathRectorTest extends AbstractRectorTestCase +class ExtensionPathRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Drupal9/Rector/Deprecation/FileFunctionRector/FileFunctionRectorTest.php b/tests/src/Drupal9/Rector/Deprecation/FileFunctionRector/FileFunctionRectorTest.php index a125220ad..c81bb1c3b 100644 --- a/tests/src/Drupal9/Rector/Deprecation/FileFunctionRector/FileFunctionRectorTest.php +++ b/tests/src/Drupal9/Rector/Deprecation/FileFunctionRector/FileFunctionRectorTest.php @@ -5,10 +5,10 @@ namespace Drupal9\Rector\Deprecation\FileFunctionRector; use Iterator; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] -class FileFunctionRectorTest extends AbstractRectorTestCase +class FileFunctionRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Drupal9/Rector/Deprecation/FileUrlGeneratorRector/FileUrlGeneratorRectorTest.php b/tests/src/Drupal9/Rector/Deprecation/FileUrlGeneratorRector/FileUrlGeneratorRectorTest.php index 3e19262e6..8e1a02dce 100644 --- a/tests/src/Drupal9/Rector/Deprecation/FileUrlGeneratorRector/FileUrlGeneratorRectorTest.php +++ b/tests/src/Drupal9/Rector/Deprecation/FileUrlGeneratorRector/FileUrlGeneratorRectorTest.php @@ -5,10 +5,10 @@ namespace Drupal9\Rector\Deprecation\FileUrlGeneratorRector; use Iterator; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] -class FileUrlGeneratorRectorTest extends AbstractRectorTestCase +class FileUrlGeneratorRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Drupal9/Rector/Deprecation/ModuleLoadRector/ModuleLoadRectorTest.php b/tests/src/Drupal9/Rector/Deprecation/ModuleLoadRector/ModuleLoadRectorTest.php index 7ed233037..f700de7a7 100644 --- a/tests/src/Drupal9/Rector/Deprecation/ModuleLoadRector/ModuleLoadRectorTest.php +++ b/tests/src/Drupal9/Rector/Deprecation/ModuleLoadRector/ModuleLoadRectorTest.php @@ -5,10 +5,10 @@ namespace Drupal9\Rector\Deprecation\ModuleLoadRector; use Iterator; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] -class ModuleLoadRectorTest extends AbstractRectorTestCase +class ModuleLoadRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Drupal9/Rector/Deprecation/PassRector/PassRectorTest.php b/tests/src/Drupal9/Rector/Deprecation/PassRector/PassRectorTest.php index 1da0a0d38..f601cb35e 100644 --- a/tests/src/Drupal9/Rector/Deprecation/PassRector/PassRectorTest.php +++ b/tests/src/Drupal9/Rector/Deprecation/PassRector/PassRectorTest.php @@ -5,10 +5,10 @@ namespace Drupal9\Rector\Deprecation\PassRector; use Iterator; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] -class PassRectorTest extends AbstractRectorTestCase +class PassRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Drupal9/Rector/Deprecation/SystemSortByInfoName/SystemSortByInfoNameRectorTest.php b/tests/src/Drupal9/Rector/Deprecation/SystemSortByInfoName/SystemSortByInfoNameRectorTest.php index f0ea3c798..115bb0615 100644 --- a/tests/src/Drupal9/Rector/Deprecation/SystemSortByInfoName/SystemSortByInfoNameRectorTest.php +++ b/tests/src/Drupal9/Rector/Deprecation/SystemSortByInfoName/SystemSortByInfoNameRectorTest.php @@ -5,10 +5,10 @@ namespace Drupal9\Rector\Deprecation\SystemSortByInfoName; use Iterator; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] -class SystemSortByInfoNameRectorTest extends AbstractRectorTestCase +class SystemSortByInfoNameRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Drupal9/Rector/Deprecation/TaxonomyRectorCollection/TaxonomyRectorCollectionTest.php b/tests/src/Drupal9/Rector/Deprecation/TaxonomyRectorCollection/TaxonomyRectorCollectionTest.php index 79b90c983..08809afec 100644 --- a/tests/src/Drupal9/Rector/Deprecation/TaxonomyRectorCollection/TaxonomyRectorCollectionTest.php +++ b/tests/src/Drupal9/Rector/Deprecation/TaxonomyRectorCollection/TaxonomyRectorCollectionTest.php @@ -5,10 +5,10 @@ namespace Drupal9\Rector\Deprecation\TaxonomyRectorCollection; use Iterator; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] -class TaxonomyRectorCollectionTest extends AbstractRectorTestCase +class TaxonomyRectorCollectionTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Drupal9/Rector/Deprecation/UiHelperTraitDrupalPostFormRector/UiHelperTraitDrupalPostFormRectorTest.php b/tests/src/Drupal9/Rector/Deprecation/UiHelperTraitDrupalPostFormRector/UiHelperTraitDrupalPostFormRectorTest.php index eeda58606..c4a311f5d 100644 --- a/tests/src/Drupal9/Rector/Deprecation/UiHelperTraitDrupalPostFormRector/UiHelperTraitDrupalPostFormRectorTest.php +++ b/tests/src/Drupal9/Rector/Deprecation/UiHelperTraitDrupalPostFormRector/UiHelperTraitDrupalPostFormRectorTest.php @@ -5,10 +5,10 @@ namespace Drupal9\Rector\Deprecation\UiHelperTraitDrupalPostFormRector; use Iterator; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] -class UiHelperTraitDrupalPostFormRectorTest extends AbstractRectorTestCase +class UiHelperTraitDrupalPostFormRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Drupal9/Rector/Deprecation/UserPasswordRector/UserPasswordRectorTest.php b/tests/src/Drupal9/Rector/Deprecation/UserPasswordRector/UserPasswordRectorTest.php index 59516da5a..6a61303c6 100644 --- a/tests/src/Drupal9/Rector/Deprecation/UserPasswordRector/UserPasswordRectorTest.php +++ b/tests/src/Drupal9/Rector/Deprecation/UserPasswordRector/UserPasswordRectorTest.php @@ -5,10 +5,10 @@ namespace DrupalRector\Tests\Drupal9\Rector\Deprecation\UserPasswordRector; use Iterator; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] -class UserPasswordRectorTest extends AbstractRectorTestCase +class UserPasswordRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Drupal9/Rector/Property/ProtectedStaticModulesPropertyRector/ProtectedStaticModulesPropertyRectorTest.php b/tests/src/Drupal9/Rector/Property/ProtectedStaticModulesPropertyRector/ProtectedStaticModulesPropertyRectorTest.php index 007de43a2..29302f735 100644 --- a/tests/src/Drupal9/Rector/Property/ProtectedStaticModulesPropertyRector/ProtectedStaticModulesPropertyRectorTest.php +++ b/tests/src/Drupal9/Rector/Property/ProtectedStaticModulesPropertyRector/ProtectedStaticModulesPropertyRectorTest.php @@ -5,9 +5,9 @@ namespace DrupalRector\Tests\Drupal9\Rector\Property\ProtectedStaticModulesPropertyRector; use Iterator; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -final class ProtectedStaticModulesPropertyRectorTest extends AbstractRectorTestCase +final class ProtectedStaticModulesPropertyRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Rector/AbstractDrupalCoreRector/AbstractDrupalCoreRectorBcTest.php b/tests/src/Rector/AbstractDrupalCoreRector/AbstractDrupalCoreRectorBcTest.php index bae14fa6e..923b4c699 100644 --- a/tests/src/Rector/AbstractDrupalCoreRector/AbstractDrupalCoreRectorBcTest.php +++ b/tests/src/Rector/AbstractDrupalCoreRector/AbstractDrupalCoreRectorBcTest.php @@ -5,9 +5,9 @@ namespace DrupalRector\Tests\Rector\AbstractDrupalCoreRector; use Iterator; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class AbstractDrupalCoreRectorBcTest extends AbstractRectorTestCase +class AbstractDrupalCoreRectorBcTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Rector/AbstractDrupalCoreRector/AbstractDrupalCoreRectorTest.php b/tests/src/Rector/AbstractDrupalCoreRector/AbstractDrupalCoreRectorTest.php index d06c33050..8ea7d6719 100644 --- a/tests/src/Rector/AbstractDrupalCoreRector/AbstractDrupalCoreRectorTest.php +++ b/tests/src/Rector/AbstractDrupalCoreRector/AbstractDrupalCoreRectorTest.php @@ -5,9 +5,9 @@ namespace DrupalRector\Tests\Rector\AbstractDrupalCoreRector; use Iterator; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class AbstractDrupalCoreRectorTest extends AbstractRectorTestCase +class AbstractDrupalCoreRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Rector/Convert/HookConvertRector/HookConvertRectorFixtureTest.php b/tests/src/Rector/Convert/HookConvertRector/HookConvertRectorFixtureTest.php index 9baeabb5a..67b1e55c9 100644 --- a/tests/src/Rector/Convert/HookConvertRector/HookConvertRectorFixtureTest.php +++ b/tests/src/Rector/Convert/HookConvertRector/HookConvertRectorFixtureTest.php @@ -4,9 +4,9 @@ namespace DrupalRector\Tests\Rector\Convert\HookConvertRector; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class HookConvertRectorFixtureTest extends AbstractRectorTestCase +class HookConvertRectorFixtureTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/ConstantToClassConstantRectorTest.php b/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/ConstantToClassConstantRectorTest.php index b3ac95c6d..123cd183b 100644 --- a/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/ConstantToClassConstantRectorTest.php +++ b/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/ConstantToClassConstantRectorTest.php @@ -5,10 +5,10 @@ namespace DrupalRector\Rector\Deprecation\ClassConstantToClassConstantRector; use Iterator; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] -class ClassConstantToClassConstantRectorTest extends AbstractRectorTestCase +class ClassConstantToClassConstantRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Rector/Deprecation/ConstantToClassConstantRector/ConstantToClassConstantRectorTest.php b/tests/src/Rector/Deprecation/ConstantToClassConstantRector/ConstantToClassConstantRectorTest.php index 70f3b2c0e..abbf55ef7 100644 --- a/tests/src/Rector/Deprecation/ConstantToClassConstantRector/ConstantToClassConstantRectorTest.php +++ b/tests/src/Rector/Deprecation/ConstantToClassConstantRector/ConstantToClassConstantRectorTest.php @@ -6,10 +6,10 @@ use DrupalRector\Services\DrupalRectorSettings; use Iterator; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] -class ConstantToClassConstantRectorTest extends AbstractRectorTestCase +class ConstantToClassConstantRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void @@ -29,11 +29,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Rector/Deprecation/DeprecationHelperRemoveRector/DeprecationHelperRemoveRectorTest.php b/tests/src/Rector/Deprecation/DeprecationHelperRemoveRector/DeprecationHelperRemoveRectorTest.php index 7eec03bad..532c06e33 100644 --- a/tests/src/Rector/Deprecation/DeprecationHelperRemoveRector/DeprecationHelperRemoveRectorTest.php +++ b/tests/src/Rector/Deprecation/DeprecationHelperRemoveRector/DeprecationHelperRemoveRectorTest.php @@ -5,10 +5,10 @@ namespace DrupalRector\Tests\Rector\Deprecation\DeprecationHelperRemoveRector; use Iterator; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] -class DeprecationHelperRemoveRectorTest extends AbstractRectorTestCase +class DeprecationHelperRemoveRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Rector/Deprecation/FunctionCallRemovalRector/FunctionCallRemovalRectorTest.php b/tests/src/Rector/Deprecation/FunctionCallRemovalRector/FunctionCallRemovalRectorTest.php index cd43a0468..28d0c0f71 100644 --- a/tests/src/Rector/Deprecation/FunctionCallRemovalRector/FunctionCallRemovalRectorTest.php +++ b/tests/src/Rector/Deprecation/FunctionCallRemovalRector/FunctionCallRemovalRectorTest.php @@ -4,9 +4,9 @@ namespace DrupalRector\Tests\Rector\Deprecation\FunctionCallRemovalRector; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class FunctionCallRemovalRectorTest extends AbstractRectorTestCase +class FunctionCallRemovalRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Rector/Deprecation/FunctionToFirstArgMethodRector/FunctionToFirstArgMethodRectorTest.php b/tests/src/Rector/Deprecation/FunctionToFirstArgMethodRector/FunctionToFirstArgMethodRectorTest.php index 87c872b2e..fccf95dac 100644 --- a/tests/src/Rector/Deprecation/FunctionToFirstArgMethodRector/FunctionToFirstArgMethodRectorTest.php +++ b/tests/src/Rector/Deprecation/FunctionToFirstArgMethodRector/FunctionToFirstArgMethodRectorTest.php @@ -5,19 +5,15 @@ namespace DrupalRector\Tests\Rector\Deprecation\FunctionToFirstArgMethodRector; use DrupalRector\Services\DrupalRectorSettings; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; -class FunctionToFirstArgMethodRectorTest extends AbstractRectorTestCase +class FunctionToFirstArgMethodRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function testAboveVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('99.99.99'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** @@ -32,11 +28,7 @@ public static function provideData(): \Iterator public function testBelowVersion(string $filePath): void { static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); - try { - $this->doTestFile($filePath); - } finally { - static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion(null); - } + $this->doTestFile($filePath); } /** diff --git a/tests/src/Rector/Deprecation/FunctionToServiceRector/FunctionToServiceRectorTest.php b/tests/src/Rector/Deprecation/FunctionToServiceRector/FunctionToServiceRectorTest.php index 536cf2695..5aca244c5 100644 --- a/tests/src/Rector/Deprecation/FunctionToServiceRector/FunctionToServiceRectorTest.php +++ b/tests/src/Rector/Deprecation/FunctionToServiceRector/FunctionToServiceRectorTest.php @@ -5,10 +5,10 @@ namespace DrupalRector\Tests\Rector\Deprecation\FunctionToServiceRector; use Iterator; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] -class FunctionToServiceRectorTest extends AbstractRectorTestCase +class FunctionToServiceRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Rector/Deprecation/FunctionToStaticRector/FunctionToStaticRectorTest.php b/tests/src/Rector/Deprecation/FunctionToStaticRector/FunctionToStaticRectorTest.php index 644c24069..ec0101b00 100644 --- a/tests/src/Rector/Deprecation/FunctionToStaticRector/FunctionToStaticRectorTest.php +++ b/tests/src/Rector/Deprecation/FunctionToStaticRector/FunctionToStaticRectorTest.php @@ -5,10 +5,10 @@ namespace DrupalRector\Tests\Rector\Deprecation\FunctionToStaticRector; use Iterator; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] -class FunctionToStaticRectorTest extends AbstractRectorTestCase +class FunctionToStaticRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/MethodToMethodWithCheckRectorTest.php b/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/MethodToMethodWithCheckRectorTest.php index 2a8d13b6e..5e458e88f 100644 --- a/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/MethodToMethodWithCheckRectorTest.php +++ b/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/MethodToMethodWithCheckRectorTest.php @@ -5,10 +5,10 @@ namespace DrupalRector\Tests\Rector\Deprecation\MethodToMethodWithCheckRector; use Iterator; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] -class MethodToMethodWithCheckRectorTest extends AbstractRectorTestCase +class MethodToMethodWithCheckRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void diff --git a/tests/src/Rector/PHPUnit/ShouldCallParentMethodsRector/ShouldCallParentMethodsRectorTest.php b/tests/src/Rector/PHPUnit/ShouldCallParentMethodsRector/ShouldCallParentMethodsRectorTest.php index 86ac13c4c..3026ea914 100644 --- a/tests/src/Rector/PHPUnit/ShouldCallParentMethodsRector/ShouldCallParentMethodsRectorTest.php +++ b/tests/src/Rector/PHPUnit/ShouldCallParentMethodsRector/ShouldCallParentMethodsRectorTest.php @@ -5,10 +5,10 @@ namespace DrupalRector\Tests\Rector\PHPUnit\ShouldCallParentMethodsRector; use Iterator; -use Rector\Testing\PHPUnit\AbstractRectorTestCase; +use DrupalRector\Tests\AbstractDrupalRectorTestCase; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] -class ShouldCallParentMethodsRectorTest extends AbstractRectorTestCase +class ShouldCallParentMethodsRectorTest extends AbstractDrupalRectorTestCase { #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void From 15c3a789e38294cf29442fc76c64fa3959178b25 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 22 May 2026 21:32:32 +0200 Subject: [PATCH 247/256] test: add AbstractDrupalCoreRectorTest --- tests/src/AbstractDrupalRectorTestCase.php | 24 +++++ .../Rector/AbstractDrupalCoreRectorTest.php | 93 +++++++++++++++++++ 2 files changed, 117 insertions(+) create mode 100644 tests/src/AbstractDrupalRectorTestCase.php create mode 100644 tests/src/Rector/AbstractDrupalCoreRectorTest.php diff --git a/tests/src/AbstractDrupalRectorTestCase.php b/tests/src/AbstractDrupalRectorTestCase.php new file mode 100644 index 000000000..2f9a9c549 --- /dev/null +++ b/tests/src/AbstractDrupalRectorTestCase.php @@ -0,0 +1,24 @@ +make(DrupalRectorSettings::class) + ->setDrupalVersion(null) + ->enableBackwardCompatibility() + ->setMinimumCoreVersionSupported('10.1.0'); + + parent::tearDown(); + } +} diff --git a/tests/src/Rector/AbstractDrupalCoreRectorTest.php b/tests/src/Rector/AbstractDrupalCoreRectorTest.php new file mode 100644 index 000000000..fb5ad1401 --- /dev/null +++ b/tests/src/Rector/AbstractDrupalCoreRectorTest.php @@ -0,0 +1,93 @@ +enableBackwardCompatibility() : $settings->disableBackwardCompatibility(); + $settings->setMinimumCoreVersionSupported($minimumVersion); + + $rector = self::makeRector($settings); + $configuration = self::makeConfiguration($introducedVersion); + + self::assertSame($expected, $rector->supportBackwardsCompatibility($configuration)); + } + + /** + * @return \Iterator + */ + public static function provideSupportBackwardsCompatibility(): \Iterator + { + // BC disabled wins regardless of versions. + yield 'bc disabled returns false' => [false, '10.1.0', '10.2.0', false]; + + // Minimum supported version below the BC-eligible floor (10.1.0). + yield 'minimum 10.0.0 below floor' => [true, '10.0.0', '10.2.0', false]; + yield 'minimum 9.5.0 below floor' => [true, '9.5.0', '10.2.0', false]; + + // Introduced version below 10.0.0 — no BC wrappers for pre-10 deprecations. + yield 'introduced 9.5.0 too old' => [true, '10.1.0', '9.5.0', false]; + + // Project minimum already covers the introduced version — wrap unnecessary. + yield 'minimum equal to introduced' => [true, '10.2.0', '10.2.0', false]; + yield 'minimum above introduced' => [true, '11.0.0', '10.2.0', false]; + yield 'minimum 10.1.0 equal to introduced floor' => [true, '10.1.0', '10.1.0', false]; + + // Happy paths. + yield 'minimum 10.1.0 introduced 10.2.0' => [true, '10.1.0', '10.2.0', true]; + yield 'minimum 10.1.0 introduced 11.4.0' => [true, '10.1.0', '11.4.0', true]; + yield 'minimum 10.5.0 introduced 11.2.0' => [true, '10.5.0', '11.2.0', true]; + } + + private static function makeRector(DrupalRectorSettings $settings): AbstractDrupalCoreRector + { + return new class($settings) extends AbstractDrupalCoreRector { + public function getNodeTypes(): array + { + return []; + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition('test', []); + } + + protected function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration) + { + return null; + } + }; + } + + private static function makeConfiguration(string $introducedVersion): VersionedConfigurationInterface + { + return new class($introducedVersion) implements VersionedConfigurationInterface { + public function __construct(private readonly string $introducedVersion) + { + } + + public function getIntroducedVersion(): string + { + return $this->introducedVersion; + } + }; + } +} From bdde7f25431e41df615594375cc413e52d600207 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 22 May 2026 21:34:12 +0200 Subject: [PATCH 248/256] build: fix codesstyle --- .../ActionAnnotationToAttributeRectorTest.php | 2 +- ...kwardsCompatibilityActionAnnotationToAttributeRectorTest.php | 2 +- .../SystemTimeZonesRector/SystemTimeZonesRectorTest.php | 2 +- .../WatchdogExceptionRector/WatchdogExceptionRectorTest.php | 2 +- .../DrupalSetMessageRector/DrupalSetMessageRectorTest.php | 2 +- .../EntityDeleteMultipleRectorTest.php | 2 +- .../Deprecation/EntityManagerRector/EntityManagerRectorTest.php | 2 +- .../Deprecation/EntityViewRector/EntityViewRectorTest.php | 2 +- .../FunctionalTestDefaultThemePropertyRectorTest.php | 2 +- .../Rector/Deprecation/GetMockRector/GetMockRectorTest.php | 2 +- .../AssertFieldByIdRector/AssertFieldByIdRectorTest.php | 2 +- .../AssertFieldByNameRector/AssertFieldByNameRectorTest.php | 2 +- .../AssertLegacyTraitRector/AssertLegacyTraitRectorTest.php | 2 +- .../AssertNoFieldByNameRector/AssertNoFieldByNameRectorTest.php | 2 +- .../AssertNoUniqueTextRector/AssertNoUniqueTextRector.php | 2 +- .../Deprecation/ExtensionPathRector/ExtensionPathRectorTest.php | 2 +- .../Deprecation/FileFunctionRector/FileFunctionRectorTest.php | 2 +- .../FileUrlGeneratorRector/FileUrlGeneratorRectorTest.php | 2 +- .../Deprecation/ModuleLoadRector/ModuleLoadRectorTest.php | 2 +- .../Drupal9/Rector/Deprecation/PassRector/PassRectorTest.php | 2 +- .../SystemSortByInfoName/SystemSortByInfoNameRectorTest.php | 2 +- .../TaxonomyRectorCollection/TaxonomyRectorCollectionTest.php | 2 +- .../UiHelperTraitDrupalPostFormRectorTest.php | 2 +- .../Deprecation/UserPasswordRector/UserPasswordRectorTest.php | 2 +- .../ProtectedStaticModulesPropertyRectorTest.php | 2 +- .../AbstractDrupalCoreRector/AbstractDrupalCoreRectorBcTest.php | 2 +- .../AbstractDrupalCoreRector/AbstractDrupalCoreRectorTest.php | 2 +- .../ConstantToClassConstantRectorTest.php | 2 +- .../ConstantToClassConstantRectorTest.php | 2 +- .../DeprecationHelperRemoveRectorTest.php | 2 +- .../FunctionToServiceRector/FunctionToServiceRectorTest.php | 2 +- .../FunctionToStaticRector/FunctionToStaticRectorTest.php | 2 +- .../MethodToMethodWithCheckRectorTest.php | 2 +- .../ShouldCallParentMethodsRectorTest.php | 2 +- 34 files changed, 34 insertions(+), 34 deletions(-) diff --git a/tests/src/Drupal10/Rector/Deprecation/ActionAnnotationToAttributeRector/ActionAnnotationToAttributeRectorTest.php b/tests/src/Drupal10/Rector/Deprecation/ActionAnnotationToAttributeRector/ActionAnnotationToAttributeRectorTest.php index 405abc137..037c3ef68 100644 --- a/tests/src/Drupal10/Rector/Deprecation/ActionAnnotationToAttributeRector/ActionAnnotationToAttributeRectorTest.php +++ b/tests/src/Drupal10/Rector/Deprecation/ActionAnnotationToAttributeRector/ActionAnnotationToAttributeRectorTest.php @@ -4,8 +4,8 @@ namespace DrupalRector\Tests\Drupal10\Rector\Deprecation\ActionAnnotationToAttributeRector; -use Iterator; use DrupalRector\Tests\AbstractDrupalRectorTestCase; +use Iterator; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class ActionAnnotationToAttributeRectorTest extends AbstractDrupalRectorTestCase diff --git a/tests/src/Drupal10/Rector/Deprecation/ActionAnnotationToAttributeRector/BackwardsCompatibilityActionAnnotationToAttributeRectorTest.php b/tests/src/Drupal10/Rector/Deprecation/ActionAnnotationToAttributeRector/BackwardsCompatibilityActionAnnotationToAttributeRectorTest.php index dd3d10edc..8ed8483a2 100644 --- a/tests/src/Drupal10/Rector/Deprecation/ActionAnnotationToAttributeRector/BackwardsCompatibilityActionAnnotationToAttributeRectorTest.php +++ b/tests/src/Drupal10/Rector/Deprecation/ActionAnnotationToAttributeRector/BackwardsCompatibilityActionAnnotationToAttributeRectorTest.php @@ -4,8 +4,8 @@ namespace DrupalRector\Tests\Drupal10\Rector\Deprecation\ActionAnnotationToAttributeRector; -use Iterator; use DrupalRector\Tests\AbstractDrupalRectorTestCase; +use Iterator; class Drupal { diff --git a/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/SystemTimeZonesRectorTest.php b/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/SystemTimeZonesRectorTest.php index 0897e9188..af2892fea 100644 --- a/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/SystemTimeZonesRectorTest.php +++ b/tests/src/Drupal10/Rector/Deprecation/SystemTimeZonesRector/SystemTimeZonesRectorTest.php @@ -5,8 +5,8 @@ namespace DrupalRector\Tests\Drupal10\Rector\Deprecation\SystemTimeZonesRector; use DrupalRector\Services\DrupalRectorSettings; -use Iterator; use DrupalRector\Tests\AbstractDrupalRectorTestCase; +use Iterator; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class SystemTimeZonesRectorTest extends AbstractDrupalRectorTestCase diff --git a/tests/src/Drupal10/Rector/Deprecation/WatchdogExceptionRector/WatchdogExceptionRectorTest.php b/tests/src/Drupal10/Rector/Deprecation/WatchdogExceptionRector/WatchdogExceptionRectorTest.php index b35ab9b25..b7610eff4 100644 --- a/tests/src/Drupal10/Rector/Deprecation/WatchdogExceptionRector/WatchdogExceptionRectorTest.php +++ b/tests/src/Drupal10/Rector/Deprecation/WatchdogExceptionRector/WatchdogExceptionRectorTest.php @@ -5,8 +5,8 @@ namespace DrupalRector\Tests\Drupal10\Rector\Deprecation\WatchdogExceptionRector; use DrupalRector\Services\DrupalRectorSettings; -use Iterator; use DrupalRector\Tests\AbstractDrupalRectorTestCase; +use Iterator; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class WatchdogExceptionRectorTest extends AbstractDrupalRectorTestCase diff --git a/tests/src/Drupal8/Rector/Deprecation/DrupalSetMessageRector/DrupalSetMessageRectorTest.php b/tests/src/Drupal8/Rector/Deprecation/DrupalSetMessageRector/DrupalSetMessageRectorTest.php index 578b8d407..e17037eac 100644 --- a/tests/src/Drupal8/Rector/Deprecation/DrupalSetMessageRector/DrupalSetMessageRectorTest.php +++ b/tests/src/Drupal8/Rector/Deprecation/DrupalSetMessageRector/DrupalSetMessageRectorTest.php @@ -4,8 +4,8 @@ namespace Drupal8\Rector\Deprecation\DrupalSetMessageRector; -use Iterator; use DrupalRector\Tests\AbstractDrupalRectorTestCase; +use Iterator; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class DrupalSetMessageRectorTest extends AbstractDrupalRectorTestCase diff --git a/tests/src/Drupal8/Rector/Deprecation/EntityDeleteMultipleRector/EntityDeleteMultipleRectorTest.php b/tests/src/Drupal8/Rector/Deprecation/EntityDeleteMultipleRector/EntityDeleteMultipleRectorTest.php index 9d2ea07a7..441f02ba2 100644 --- a/tests/src/Drupal8/Rector/Deprecation/EntityDeleteMultipleRector/EntityDeleteMultipleRectorTest.php +++ b/tests/src/Drupal8/Rector/Deprecation/EntityDeleteMultipleRector/EntityDeleteMultipleRectorTest.php @@ -4,8 +4,8 @@ namespace Drupal8\Rector\Deprecation\EntityDeleteMultipleRector; -use Iterator; use DrupalRector\Tests\AbstractDrupalRectorTestCase; +use Iterator; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class EntityDeleteMultipleRectorTest extends AbstractDrupalRectorTestCase diff --git a/tests/src/Drupal8/Rector/Deprecation/EntityManagerRector/EntityManagerRectorTest.php b/tests/src/Drupal8/Rector/Deprecation/EntityManagerRector/EntityManagerRectorTest.php index 0130c1b07..e51cc5b56 100644 --- a/tests/src/Drupal8/Rector/Deprecation/EntityManagerRector/EntityManagerRectorTest.php +++ b/tests/src/Drupal8/Rector/Deprecation/EntityManagerRector/EntityManagerRectorTest.php @@ -4,8 +4,8 @@ namespace Drupal8\Rector\Deprecation\EntityManagerRector; -use Iterator; use DrupalRector\Tests\AbstractDrupalRectorTestCase; +use Iterator; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class EntityManagerRectorTest extends AbstractDrupalRectorTestCase diff --git a/tests/src/Drupal8/Rector/Deprecation/EntityViewRector/EntityViewRectorTest.php b/tests/src/Drupal8/Rector/Deprecation/EntityViewRector/EntityViewRectorTest.php index a4e9feefd..0776c09e6 100644 --- a/tests/src/Drupal8/Rector/Deprecation/EntityViewRector/EntityViewRectorTest.php +++ b/tests/src/Drupal8/Rector/Deprecation/EntityViewRector/EntityViewRectorTest.php @@ -4,8 +4,8 @@ namespace Drupal8\Rector\Deprecation\EntityViewRector; -use Iterator; use DrupalRector\Tests\AbstractDrupalRectorTestCase; +use Iterator; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class EntityViewRectorTest extends AbstractDrupalRectorTestCase diff --git a/tests/src/Drupal8/Rector/Deprecation/FunctionalTestDefaultThemePropertyRector/FunctionalTestDefaultThemePropertyRectorTest.php b/tests/src/Drupal8/Rector/Deprecation/FunctionalTestDefaultThemePropertyRector/FunctionalTestDefaultThemePropertyRectorTest.php index c6b9405dc..9b0d579a3 100644 --- a/tests/src/Drupal8/Rector/Deprecation/FunctionalTestDefaultThemePropertyRector/FunctionalTestDefaultThemePropertyRectorTest.php +++ b/tests/src/Drupal8/Rector/Deprecation/FunctionalTestDefaultThemePropertyRector/FunctionalTestDefaultThemePropertyRectorTest.php @@ -4,8 +4,8 @@ namespace DrupalRector\Tests\Drupal8\Rector\Deprecation\FunctionalTestDefaultThemePropertyRector; -use DrupalRector\Tests\Rector\Class_\FunctionalTestDefaultThemePropertyRector\Iterator; use DrupalRector\Tests\AbstractDrupalRectorTestCase; +use DrupalRector\Tests\Rector\Class_\FunctionalTestDefaultThemePropertyRector\Iterator; final class FunctionalTestDefaultThemePropertyRectorTest extends AbstractDrupalRectorTestCase { diff --git a/tests/src/Drupal8/Rector/Deprecation/GetMockRector/GetMockRectorTest.php b/tests/src/Drupal8/Rector/Deprecation/GetMockRector/GetMockRectorTest.php index 678df59e6..8806eeab6 100644 --- a/tests/src/Drupal8/Rector/Deprecation/GetMockRector/GetMockRectorTest.php +++ b/tests/src/Drupal8/Rector/Deprecation/GetMockRector/GetMockRectorTest.php @@ -4,8 +4,8 @@ namespace Drupal8\Rector\Deprecation\GetMockRector; -use Iterator; use DrupalRector\Tests\AbstractDrupalRectorTestCase; +use Iterator; class GetMockRectorTest extends AbstractDrupalRectorTestCase { diff --git a/tests/src/Drupal9/Rector/Deprecation/AssertFieldByIdRector/AssertFieldByIdRectorTest.php b/tests/src/Drupal9/Rector/Deprecation/AssertFieldByIdRector/AssertFieldByIdRectorTest.php index bcb82ce90..589c68877 100644 --- a/tests/src/Drupal9/Rector/Deprecation/AssertFieldByIdRector/AssertFieldByIdRectorTest.php +++ b/tests/src/Drupal9/Rector/Deprecation/AssertFieldByIdRector/AssertFieldByIdRectorTest.php @@ -4,8 +4,8 @@ namespace DrupalRector\Tests\Drupal9\Rector\Deprecation\AssertFieldByIdRector; -use Iterator; use DrupalRector\Tests\AbstractDrupalRectorTestCase; +use Iterator; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class AssertFieldByIdRectorTest extends AbstractDrupalRectorTestCase diff --git a/tests/src/Drupal9/Rector/Deprecation/AssertFieldByNameRector/AssertFieldByNameRectorTest.php b/tests/src/Drupal9/Rector/Deprecation/AssertFieldByNameRector/AssertFieldByNameRectorTest.php index 16dc64285..a695696c3 100644 --- a/tests/src/Drupal9/Rector/Deprecation/AssertFieldByNameRector/AssertFieldByNameRectorTest.php +++ b/tests/src/Drupal9/Rector/Deprecation/AssertFieldByNameRector/AssertFieldByNameRectorTest.php @@ -4,8 +4,8 @@ namespace DrupalRector\Tests\Drupal9\Rector\Deprecation\AssertFieldByNameRector; -use Iterator; use DrupalRector\Tests\AbstractDrupalRectorTestCase; +use Iterator; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class AssertFieldByNameRectorTest extends AbstractDrupalRectorTestCase diff --git a/tests/src/Drupal9/Rector/Deprecation/AssertLegacyTraitRector/AssertLegacyTraitRectorTest.php b/tests/src/Drupal9/Rector/Deprecation/AssertLegacyTraitRector/AssertLegacyTraitRectorTest.php index 4c7c84fce..3dfd03bba 100644 --- a/tests/src/Drupal9/Rector/Deprecation/AssertLegacyTraitRector/AssertLegacyTraitRectorTest.php +++ b/tests/src/Drupal9/Rector/Deprecation/AssertLegacyTraitRector/AssertLegacyTraitRectorTest.php @@ -4,8 +4,8 @@ namespace Drupal9\Rector\Deprecation\AssertLegacyTraitRector; -use Iterator; use DrupalRector\Tests\AbstractDrupalRectorTestCase; +use Iterator; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class AssertLegacyTraitRectorTest extends AbstractDrupalRectorTestCase diff --git a/tests/src/Drupal9/Rector/Deprecation/AssertNoFieldByNameRector/AssertNoFieldByNameRectorTest.php b/tests/src/Drupal9/Rector/Deprecation/AssertNoFieldByNameRector/AssertNoFieldByNameRectorTest.php index 71546f321..fa5c07676 100644 --- a/tests/src/Drupal9/Rector/Deprecation/AssertNoFieldByNameRector/AssertNoFieldByNameRectorTest.php +++ b/tests/src/Drupal9/Rector/Deprecation/AssertNoFieldByNameRector/AssertNoFieldByNameRectorTest.php @@ -4,8 +4,8 @@ namespace Drupal9\Rector\Deprecation\AssertNoFieldByNameRector; -use Iterator; use DrupalRector\Tests\AbstractDrupalRectorTestCase; +use Iterator; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class AssertNoFieldByNameRectorTest extends AbstractDrupalRectorTestCase diff --git a/tests/src/Drupal9/Rector/Deprecation/AssertNoUniqueTextRector/AssertNoUniqueTextRector.php b/tests/src/Drupal9/Rector/Deprecation/AssertNoUniqueTextRector/AssertNoUniqueTextRector.php index fc5578a98..f9c9ecf8f 100644 --- a/tests/src/Drupal9/Rector/Deprecation/AssertNoUniqueTextRector/AssertNoUniqueTextRector.php +++ b/tests/src/Drupal9/Rector/Deprecation/AssertNoUniqueTextRector/AssertNoUniqueTextRector.php @@ -4,8 +4,8 @@ namespace Drupal9\Rector\Deprecation\AssertNoUniqueTextRector; -use Iterator; use DrupalRector\Tests\AbstractDrupalRectorTestCase; +use Iterator; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class AssertNoUniqueTextRector extends AbstractDrupalRectorTestCase diff --git a/tests/src/Drupal9/Rector/Deprecation/ExtensionPathRector/ExtensionPathRectorTest.php b/tests/src/Drupal9/Rector/Deprecation/ExtensionPathRector/ExtensionPathRectorTest.php index 911affc9c..c71c3431e 100644 --- a/tests/src/Drupal9/Rector/Deprecation/ExtensionPathRector/ExtensionPathRectorTest.php +++ b/tests/src/Drupal9/Rector/Deprecation/ExtensionPathRector/ExtensionPathRectorTest.php @@ -4,8 +4,8 @@ namespace Drupal9\Rector\Deprecation\ExtensionPathRector; -use Iterator; use DrupalRector\Tests\AbstractDrupalRectorTestCase; +use Iterator; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class ExtensionPathRectorTest extends AbstractDrupalRectorTestCase diff --git a/tests/src/Drupal9/Rector/Deprecation/FileFunctionRector/FileFunctionRectorTest.php b/tests/src/Drupal9/Rector/Deprecation/FileFunctionRector/FileFunctionRectorTest.php index c81bb1c3b..759c07528 100644 --- a/tests/src/Drupal9/Rector/Deprecation/FileFunctionRector/FileFunctionRectorTest.php +++ b/tests/src/Drupal9/Rector/Deprecation/FileFunctionRector/FileFunctionRectorTest.php @@ -4,8 +4,8 @@ namespace Drupal9\Rector\Deprecation\FileFunctionRector; -use Iterator; use DrupalRector\Tests\AbstractDrupalRectorTestCase; +use Iterator; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class FileFunctionRectorTest extends AbstractDrupalRectorTestCase diff --git a/tests/src/Drupal9/Rector/Deprecation/FileUrlGeneratorRector/FileUrlGeneratorRectorTest.php b/tests/src/Drupal9/Rector/Deprecation/FileUrlGeneratorRector/FileUrlGeneratorRectorTest.php index 8e1a02dce..0e2c27da6 100644 --- a/tests/src/Drupal9/Rector/Deprecation/FileUrlGeneratorRector/FileUrlGeneratorRectorTest.php +++ b/tests/src/Drupal9/Rector/Deprecation/FileUrlGeneratorRector/FileUrlGeneratorRectorTest.php @@ -4,8 +4,8 @@ namespace Drupal9\Rector\Deprecation\FileUrlGeneratorRector; -use Iterator; use DrupalRector\Tests\AbstractDrupalRectorTestCase; +use Iterator; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class FileUrlGeneratorRectorTest extends AbstractDrupalRectorTestCase diff --git a/tests/src/Drupal9/Rector/Deprecation/ModuleLoadRector/ModuleLoadRectorTest.php b/tests/src/Drupal9/Rector/Deprecation/ModuleLoadRector/ModuleLoadRectorTest.php index f700de7a7..fbb3ace45 100644 --- a/tests/src/Drupal9/Rector/Deprecation/ModuleLoadRector/ModuleLoadRectorTest.php +++ b/tests/src/Drupal9/Rector/Deprecation/ModuleLoadRector/ModuleLoadRectorTest.php @@ -4,8 +4,8 @@ namespace Drupal9\Rector\Deprecation\ModuleLoadRector; -use Iterator; use DrupalRector\Tests\AbstractDrupalRectorTestCase; +use Iterator; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class ModuleLoadRectorTest extends AbstractDrupalRectorTestCase diff --git a/tests/src/Drupal9/Rector/Deprecation/PassRector/PassRectorTest.php b/tests/src/Drupal9/Rector/Deprecation/PassRector/PassRectorTest.php index f601cb35e..5deaabcec 100644 --- a/tests/src/Drupal9/Rector/Deprecation/PassRector/PassRectorTest.php +++ b/tests/src/Drupal9/Rector/Deprecation/PassRector/PassRectorTest.php @@ -4,8 +4,8 @@ namespace Drupal9\Rector\Deprecation\PassRector; -use Iterator; use DrupalRector\Tests\AbstractDrupalRectorTestCase; +use Iterator; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class PassRectorTest extends AbstractDrupalRectorTestCase diff --git a/tests/src/Drupal9/Rector/Deprecation/SystemSortByInfoName/SystemSortByInfoNameRectorTest.php b/tests/src/Drupal9/Rector/Deprecation/SystemSortByInfoName/SystemSortByInfoNameRectorTest.php index 115bb0615..aa2e3e608 100644 --- a/tests/src/Drupal9/Rector/Deprecation/SystemSortByInfoName/SystemSortByInfoNameRectorTest.php +++ b/tests/src/Drupal9/Rector/Deprecation/SystemSortByInfoName/SystemSortByInfoNameRectorTest.php @@ -4,8 +4,8 @@ namespace Drupal9\Rector\Deprecation\SystemSortByInfoName; -use Iterator; use DrupalRector\Tests\AbstractDrupalRectorTestCase; +use Iterator; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class SystemSortByInfoNameRectorTest extends AbstractDrupalRectorTestCase diff --git a/tests/src/Drupal9/Rector/Deprecation/TaxonomyRectorCollection/TaxonomyRectorCollectionTest.php b/tests/src/Drupal9/Rector/Deprecation/TaxonomyRectorCollection/TaxonomyRectorCollectionTest.php index 08809afec..c6b667686 100644 --- a/tests/src/Drupal9/Rector/Deprecation/TaxonomyRectorCollection/TaxonomyRectorCollectionTest.php +++ b/tests/src/Drupal9/Rector/Deprecation/TaxonomyRectorCollection/TaxonomyRectorCollectionTest.php @@ -4,8 +4,8 @@ namespace Drupal9\Rector\Deprecation\TaxonomyRectorCollection; -use Iterator; use DrupalRector\Tests\AbstractDrupalRectorTestCase; +use Iterator; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class TaxonomyRectorCollectionTest extends AbstractDrupalRectorTestCase diff --git a/tests/src/Drupal9/Rector/Deprecation/UiHelperTraitDrupalPostFormRector/UiHelperTraitDrupalPostFormRectorTest.php b/tests/src/Drupal9/Rector/Deprecation/UiHelperTraitDrupalPostFormRector/UiHelperTraitDrupalPostFormRectorTest.php index c4a311f5d..39d80f3e1 100644 --- a/tests/src/Drupal9/Rector/Deprecation/UiHelperTraitDrupalPostFormRector/UiHelperTraitDrupalPostFormRectorTest.php +++ b/tests/src/Drupal9/Rector/Deprecation/UiHelperTraitDrupalPostFormRector/UiHelperTraitDrupalPostFormRectorTest.php @@ -4,8 +4,8 @@ namespace Drupal9\Rector\Deprecation\UiHelperTraitDrupalPostFormRector; -use Iterator; use DrupalRector\Tests\AbstractDrupalRectorTestCase; +use Iterator; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class UiHelperTraitDrupalPostFormRectorTest extends AbstractDrupalRectorTestCase diff --git a/tests/src/Drupal9/Rector/Deprecation/UserPasswordRector/UserPasswordRectorTest.php b/tests/src/Drupal9/Rector/Deprecation/UserPasswordRector/UserPasswordRectorTest.php index 6a61303c6..ba9aa404d 100644 --- a/tests/src/Drupal9/Rector/Deprecation/UserPasswordRector/UserPasswordRectorTest.php +++ b/tests/src/Drupal9/Rector/Deprecation/UserPasswordRector/UserPasswordRectorTest.php @@ -4,8 +4,8 @@ namespace DrupalRector\Tests\Drupal9\Rector\Deprecation\UserPasswordRector; -use Iterator; use DrupalRector\Tests\AbstractDrupalRectorTestCase; +use Iterator; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class UserPasswordRectorTest extends AbstractDrupalRectorTestCase diff --git a/tests/src/Drupal9/Rector/Property/ProtectedStaticModulesPropertyRector/ProtectedStaticModulesPropertyRectorTest.php b/tests/src/Drupal9/Rector/Property/ProtectedStaticModulesPropertyRector/ProtectedStaticModulesPropertyRectorTest.php index 29302f735..d32475692 100644 --- a/tests/src/Drupal9/Rector/Property/ProtectedStaticModulesPropertyRector/ProtectedStaticModulesPropertyRectorTest.php +++ b/tests/src/Drupal9/Rector/Property/ProtectedStaticModulesPropertyRector/ProtectedStaticModulesPropertyRectorTest.php @@ -4,8 +4,8 @@ namespace DrupalRector\Tests\Drupal9\Rector\Property\ProtectedStaticModulesPropertyRector; -use Iterator; use DrupalRector\Tests\AbstractDrupalRectorTestCase; +use Iterator; final class ProtectedStaticModulesPropertyRectorTest extends AbstractDrupalRectorTestCase { diff --git a/tests/src/Rector/AbstractDrupalCoreRector/AbstractDrupalCoreRectorBcTest.php b/tests/src/Rector/AbstractDrupalCoreRector/AbstractDrupalCoreRectorBcTest.php index 923b4c699..f23331b47 100644 --- a/tests/src/Rector/AbstractDrupalCoreRector/AbstractDrupalCoreRectorBcTest.php +++ b/tests/src/Rector/AbstractDrupalCoreRector/AbstractDrupalCoreRectorBcTest.php @@ -4,8 +4,8 @@ namespace DrupalRector\Tests\Rector\AbstractDrupalCoreRector; -use Iterator; use DrupalRector\Tests\AbstractDrupalRectorTestCase; +use Iterator; class AbstractDrupalCoreRectorBcTest extends AbstractDrupalRectorTestCase { diff --git a/tests/src/Rector/AbstractDrupalCoreRector/AbstractDrupalCoreRectorTest.php b/tests/src/Rector/AbstractDrupalCoreRector/AbstractDrupalCoreRectorTest.php index 8ea7d6719..8bc5a0abb 100644 --- a/tests/src/Rector/AbstractDrupalCoreRector/AbstractDrupalCoreRectorTest.php +++ b/tests/src/Rector/AbstractDrupalCoreRector/AbstractDrupalCoreRectorTest.php @@ -4,8 +4,8 @@ namespace DrupalRector\Tests\Rector\AbstractDrupalCoreRector; -use Iterator; use DrupalRector\Tests\AbstractDrupalRectorTestCase; +use Iterator; class AbstractDrupalCoreRectorTest extends AbstractDrupalRectorTestCase { diff --git a/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/ConstantToClassConstantRectorTest.php b/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/ConstantToClassConstantRectorTest.php index 123cd183b..eaa553bbd 100644 --- a/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/ConstantToClassConstantRectorTest.php +++ b/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/ConstantToClassConstantRectorTest.php @@ -4,8 +4,8 @@ namespace DrupalRector\Rector\Deprecation\ClassConstantToClassConstantRector; -use Iterator; use DrupalRector\Tests\AbstractDrupalRectorTestCase; +use Iterator; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class ClassConstantToClassConstantRectorTest extends AbstractDrupalRectorTestCase diff --git a/tests/src/Rector/Deprecation/ConstantToClassConstantRector/ConstantToClassConstantRectorTest.php b/tests/src/Rector/Deprecation/ConstantToClassConstantRector/ConstantToClassConstantRectorTest.php index abbf55ef7..127b2a1cf 100644 --- a/tests/src/Rector/Deprecation/ConstantToClassConstantRector/ConstantToClassConstantRectorTest.php +++ b/tests/src/Rector/Deprecation/ConstantToClassConstantRector/ConstantToClassConstantRectorTest.php @@ -5,8 +5,8 @@ namespace DrupalRector\Rector\Deprecation\ConstantToClassConstantRector; use DrupalRector\Services\DrupalRectorSettings; -use Iterator; use DrupalRector\Tests\AbstractDrupalRectorTestCase; +use Iterator; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class ConstantToClassConstantRectorTest extends AbstractDrupalRectorTestCase diff --git a/tests/src/Rector/Deprecation/DeprecationHelperRemoveRector/DeprecationHelperRemoveRectorTest.php b/tests/src/Rector/Deprecation/DeprecationHelperRemoveRector/DeprecationHelperRemoveRectorTest.php index 532c06e33..1bdb89b50 100644 --- a/tests/src/Rector/Deprecation/DeprecationHelperRemoveRector/DeprecationHelperRemoveRectorTest.php +++ b/tests/src/Rector/Deprecation/DeprecationHelperRemoveRector/DeprecationHelperRemoveRectorTest.php @@ -4,8 +4,8 @@ namespace DrupalRector\Tests\Rector\Deprecation\DeprecationHelperRemoveRector; -use Iterator; use DrupalRector\Tests\AbstractDrupalRectorTestCase; +use Iterator; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class DeprecationHelperRemoveRectorTest extends AbstractDrupalRectorTestCase diff --git a/tests/src/Rector/Deprecation/FunctionToServiceRector/FunctionToServiceRectorTest.php b/tests/src/Rector/Deprecation/FunctionToServiceRector/FunctionToServiceRectorTest.php index 5aca244c5..feeb54d56 100644 --- a/tests/src/Rector/Deprecation/FunctionToServiceRector/FunctionToServiceRectorTest.php +++ b/tests/src/Rector/Deprecation/FunctionToServiceRector/FunctionToServiceRectorTest.php @@ -4,8 +4,8 @@ namespace DrupalRector\Tests\Rector\Deprecation\FunctionToServiceRector; -use Iterator; use DrupalRector\Tests\AbstractDrupalRectorTestCase; +use Iterator; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class FunctionToServiceRectorTest extends AbstractDrupalRectorTestCase diff --git a/tests/src/Rector/Deprecation/FunctionToStaticRector/FunctionToStaticRectorTest.php b/tests/src/Rector/Deprecation/FunctionToStaticRector/FunctionToStaticRectorTest.php index ec0101b00..3585ecdb9 100644 --- a/tests/src/Rector/Deprecation/FunctionToStaticRector/FunctionToStaticRectorTest.php +++ b/tests/src/Rector/Deprecation/FunctionToStaticRector/FunctionToStaticRectorTest.php @@ -4,8 +4,8 @@ namespace DrupalRector\Tests\Rector\Deprecation\FunctionToStaticRector; -use Iterator; use DrupalRector\Tests\AbstractDrupalRectorTestCase; +use Iterator; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class FunctionToStaticRectorTest extends AbstractDrupalRectorTestCase diff --git a/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/MethodToMethodWithCheckRectorTest.php b/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/MethodToMethodWithCheckRectorTest.php index 5e458e88f..606fe0d59 100644 --- a/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/MethodToMethodWithCheckRectorTest.php +++ b/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/MethodToMethodWithCheckRectorTest.php @@ -4,8 +4,8 @@ namespace DrupalRector\Tests\Rector\Deprecation\MethodToMethodWithCheckRector; -use Iterator; use DrupalRector\Tests\AbstractDrupalRectorTestCase; +use Iterator; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class MethodToMethodWithCheckRectorTest extends AbstractDrupalRectorTestCase diff --git a/tests/src/Rector/PHPUnit/ShouldCallParentMethodsRector/ShouldCallParentMethodsRectorTest.php b/tests/src/Rector/PHPUnit/ShouldCallParentMethodsRector/ShouldCallParentMethodsRectorTest.php index 3026ea914..14da9386b 100644 --- a/tests/src/Rector/PHPUnit/ShouldCallParentMethodsRector/ShouldCallParentMethodsRectorTest.php +++ b/tests/src/Rector/PHPUnit/ShouldCallParentMethodsRector/ShouldCallParentMethodsRectorTest.php @@ -4,8 +4,8 @@ namespace DrupalRector\Tests\Rector\PHPUnit\ShouldCallParentMethodsRector; -use Iterator; use DrupalRector\Tests\AbstractDrupalRectorTestCase; +use Iterator; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] class ShouldCallParentMethodsRectorTest extends AbstractDrupalRectorTestCase From b5a8b8185ac95fd501b8d6732a1a6b4e2435004a Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 22 May 2026 21:39:06 +0200 Subject: [PATCH 249/256] build: fix fixture warning for class names --- composer.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index b9a23bdb6..635b960d5 100644 --- a/composer.json +++ b/composer.json @@ -52,7 +52,8 @@ "stubs" ], "exclude-from-classmap": [ - "**/fixture/**" + "**/fixture/**", + "**/fixture-*/**" ] }, "config": { @@ -91,5 +92,5 @@ "phpstan": "vendor/bin/phpstan analyse --memory-limit=2G", "check-style": "vendor/bin/php-cs-fixer check", "fix-style": "vendor/bin/php-cs-fixer fix" - } + } } From 6b8bf23948d0a3149f58256364bffe6d0f4dcc87 Mon Sep 17 00:00:00 2001 From: bjorn Date: Fri, 22 May 2026 21:48:52 +0200 Subject: [PATCH 250/256] build: fix fixture warning for class names. This ment changing some test files and fixtures to be consistent. --- composer.json | 3 ++- .../DrupalSetMessageRectorTest.php | 2 +- .../EntityDeleteMultipleRectorTest.php | 2 +- .../EntityManagerRector/EntityManagerRectorTest.php | 2 +- .../EntityViewRector/EntityViewRectorTest.php | 2 +- .../Deprecation/GetMockRector/GetMockRectorTest.php | 2 +- .../AssertLegacyTraitRectorTest.php | 2 +- .../AssertNoFieldByNameRectorTest.php | 2 +- ...ueTextRector.php => AssertNoUniqueTextRectorTest.php} | 9 ++------- .../fixture/assert_no_unique_text.php.inc | 3 ++- .../fixture/assert_no_unique_text_by_var.php.inc | 4 ++++ .../fixture/kerneltest_assert_no_unique_text.php.inc | 2 ++ .../ExtensionPathRector/ExtensionPathRectorTest.php | 2 +- .../FileFunctionRector/FileFunctionRectorTest.php | 2 +- .../FileUrlGeneratorRectorTest.php | 2 +- .../ModuleLoadRector/ModuleLoadRectorTest.php | 2 +- .../Rector/Deprecation/PassRector/PassRectorTest.php | 2 +- .../SystemSortByInfoNameRectorTest.php | 2 +- .../TaxonomyRectorCollectionTest.php | 2 +- .../UiHelperTraitDrupalPostFormRectorTest.php | 2 +- ...st.php => ClassConstantToClassConstantRectorTest.php} | 2 +- .../ConstantToClassConstantRectorTest.php | 2 +- 22 files changed, 29 insertions(+), 26 deletions(-) rename tests/src/Drupal9/Rector/Deprecation/AssertNoUniqueTextRector/{AssertNoUniqueTextRector.php => AssertNoUniqueTextRectorTest.php} (74%) rename tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/{ConstantToClassConstantRectorTest.php => ClassConstantToClassConstantRectorTest.php} (89%) diff --git a/composer.json b/composer.json index 635b960d5..1de2aec64 100644 --- a/composer.json +++ b/composer.json @@ -53,7 +53,8 @@ ], "exclude-from-classmap": [ "**/fixture/**", - "**/fixture-*/**" + "**/fixture-*/**", + "**/Fixture/**" ] }, "config": { diff --git a/tests/src/Drupal8/Rector/Deprecation/DrupalSetMessageRector/DrupalSetMessageRectorTest.php b/tests/src/Drupal8/Rector/Deprecation/DrupalSetMessageRector/DrupalSetMessageRectorTest.php index e17037eac..aa3f512a4 100644 --- a/tests/src/Drupal8/Rector/Deprecation/DrupalSetMessageRector/DrupalSetMessageRectorTest.php +++ b/tests/src/Drupal8/Rector/Deprecation/DrupalSetMessageRector/DrupalSetMessageRectorTest.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Drupal8\Rector\Deprecation\DrupalSetMessageRector; +namespace DrupalRector\Tests\Drupal8\Rector\Deprecation\DrupalSetMessageRector; use DrupalRector\Tests\AbstractDrupalRectorTestCase; use Iterator; diff --git a/tests/src/Drupal8/Rector/Deprecation/EntityDeleteMultipleRector/EntityDeleteMultipleRectorTest.php b/tests/src/Drupal8/Rector/Deprecation/EntityDeleteMultipleRector/EntityDeleteMultipleRectorTest.php index 441f02ba2..24ea512cc 100644 --- a/tests/src/Drupal8/Rector/Deprecation/EntityDeleteMultipleRector/EntityDeleteMultipleRectorTest.php +++ b/tests/src/Drupal8/Rector/Deprecation/EntityDeleteMultipleRector/EntityDeleteMultipleRectorTest.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Drupal8\Rector\Deprecation\EntityDeleteMultipleRector; +namespace DrupalRector\Tests\Drupal8\Rector\Deprecation\EntityDeleteMultipleRector; use DrupalRector\Tests\AbstractDrupalRectorTestCase; use Iterator; diff --git a/tests/src/Drupal8/Rector/Deprecation/EntityManagerRector/EntityManagerRectorTest.php b/tests/src/Drupal8/Rector/Deprecation/EntityManagerRector/EntityManagerRectorTest.php index e51cc5b56..03078f0ae 100644 --- a/tests/src/Drupal8/Rector/Deprecation/EntityManagerRector/EntityManagerRectorTest.php +++ b/tests/src/Drupal8/Rector/Deprecation/EntityManagerRector/EntityManagerRectorTest.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Drupal8\Rector\Deprecation\EntityManagerRector; +namespace DrupalRector\Tests\Drupal8\Rector\Deprecation\EntityManagerRector; use DrupalRector\Tests\AbstractDrupalRectorTestCase; use Iterator; diff --git a/tests/src/Drupal8/Rector/Deprecation/EntityViewRector/EntityViewRectorTest.php b/tests/src/Drupal8/Rector/Deprecation/EntityViewRector/EntityViewRectorTest.php index 0776c09e6..690f24e51 100644 --- a/tests/src/Drupal8/Rector/Deprecation/EntityViewRector/EntityViewRectorTest.php +++ b/tests/src/Drupal8/Rector/Deprecation/EntityViewRector/EntityViewRectorTest.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Drupal8\Rector\Deprecation\EntityViewRector; +namespace DrupalRector\Tests\Drupal8\Rector\Deprecation\EntityViewRector; use DrupalRector\Tests\AbstractDrupalRectorTestCase; use Iterator; diff --git a/tests/src/Drupal8/Rector/Deprecation/GetMockRector/GetMockRectorTest.php b/tests/src/Drupal8/Rector/Deprecation/GetMockRector/GetMockRectorTest.php index 8806eeab6..f48485909 100644 --- a/tests/src/Drupal8/Rector/Deprecation/GetMockRector/GetMockRectorTest.php +++ b/tests/src/Drupal8/Rector/Deprecation/GetMockRector/GetMockRectorTest.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Drupal8\Rector\Deprecation\GetMockRector; +namespace DrupalRector\Tests\Drupal8\Rector\Deprecation\GetMockRector; use DrupalRector\Tests\AbstractDrupalRectorTestCase; use Iterator; diff --git a/tests/src/Drupal9/Rector/Deprecation/AssertLegacyTraitRector/AssertLegacyTraitRectorTest.php b/tests/src/Drupal9/Rector/Deprecation/AssertLegacyTraitRector/AssertLegacyTraitRectorTest.php index 3dfd03bba..fac69eaf8 100644 --- a/tests/src/Drupal9/Rector/Deprecation/AssertLegacyTraitRector/AssertLegacyTraitRectorTest.php +++ b/tests/src/Drupal9/Rector/Deprecation/AssertLegacyTraitRector/AssertLegacyTraitRectorTest.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Drupal9\Rector\Deprecation\AssertLegacyTraitRector; +namespace DrupalRector\Tests\Drupal9\Rector\Deprecation\AssertLegacyTraitRector; use DrupalRector\Tests\AbstractDrupalRectorTestCase; use Iterator; diff --git a/tests/src/Drupal9/Rector/Deprecation/AssertNoFieldByNameRector/AssertNoFieldByNameRectorTest.php b/tests/src/Drupal9/Rector/Deprecation/AssertNoFieldByNameRector/AssertNoFieldByNameRectorTest.php index fa5c07676..cc8c7ed42 100644 --- a/tests/src/Drupal9/Rector/Deprecation/AssertNoFieldByNameRector/AssertNoFieldByNameRectorTest.php +++ b/tests/src/Drupal9/Rector/Deprecation/AssertNoFieldByNameRector/AssertNoFieldByNameRectorTest.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Drupal9\Rector\Deprecation\AssertNoFieldByNameRector; +namespace DrupalRector\Tests\Drupal9\Rector\Deprecation\AssertNoFieldByNameRector; use DrupalRector\Tests\AbstractDrupalRectorTestCase; use Iterator; diff --git a/tests/src/Drupal9/Rector/Deprecation/AssertNoUniqueTextRector/AssertNoUniqueTextRector.php b/tests/src/Drupal9/Rector/Deprecation/AssertNoUniqueTextRector/AssertNoUniqueTextRectorTest.php similarity index 74% rename from tests/src/Drupal9/Rector/Deprecation/AssertNoUniqueTextRector/AssertNoUniqueTextRector.php rename to tests/src/Drupal9/Rector/Deprecation/AssertNoUniqueTextRector/AssertNoUniqueTextRectorTest.php index f9c9ecf8f..13c9b29ad 100644 --- a/tests/src/Drupal9/Rector/Deprecation/AssertNoUniqueTextRector/AssertNoUniqueTextRector.php +++ b/tests/src/Drupal9/Rector/Deprecation/AssertNoUniqueTextRector/AssertNoUniqueTextRectorTest.php @@ -2,19 +2,14 @@ declare(strict_types=1); -namespace Drupal9\Rector\Deprecation\AssertNoUniqueTextRector; +namespace DrupalRector\Tests\Drupal9\Rector\Deprecation\AssertNoUniqueTextRector; use DrupalRector\Tests\AbstractDrupalRectorTestCase; use Iterator; #[\PHPUnit\Framework\Attributes\CoversFunction('refactor')] -class AssertNoUniqueTextRector extends AbstractDrupalRectorTestCase +class AssertNoUniqueTextRectorTest extends AbstractDrupalRectorTestCase { - public function __construct() - { - parent::__construct(static::class); - } - #[\PHPUnit\Framework\Attributes\DataProvider('provideData')] public function test(string $filePath): void { diff --git a/tests/src/Drupal9/Rector/Deprecation/AssertNoUniqueTextRector/fixture/assert_no_unique_text.php.inc b/tests/src/Drupal9/Rector/Deprecation/AssertNoUniqueTextRector/fixture/assert_no_unique_text.php.inc index 47e87c475..c19d6bb56 100644 --- a/tests/src/Drupal9/Rector/Deprecation/AssertNoUniqueTextRector/fixture/assert_no_unique_text.php.inc +++ b/tests/src/Drupal9/Rector/Deprecation/AssertNoUniqueTextRector/fixture/assert_no_unique_text.php.inc @@ -22,7 +22,8 @@ class BrowserTestBaseGetMock extends BrowserTestBase { /** * A simple example using the class property. */ - public function example() { + public function example() + { $page_text = $this->getSession()->getPage()->getText(); $nr_found = substr_count($page_text, 'Duplicated message'); $this->assertGreaterThan(1, $nr_found, "'Duplicated message' found more than once on the page"); diff --git a/tests/src/Drupal9/Rector/Deprecation/AssertNoUniqueTextRector/fixture/assert_no_unique_text_by_var.php.inc b/tests/src/Drupal9/Rector/Deprecation/AssertNoUniqueTextRector/fixture/assert_no_unique_text_by_var.php.inc index 301b3f87b..a8b8e5980 100644 --- a/tests/src/Drupal9/Rector/Deprecation/AssertNoUniqueTextRector/fixture/assert_no_unique_text_by_var.php.inc +++ b/tests/src/Drupal9/Rector/Deprecation/AssertNoUniqueTextRector/fixture/assert_no_unique_text_by_var.php.inc @@ -20,6 +20,10 @@ class BrowserTestBaseGetMock extends BrowserTestBase { ----- Date: Mon, 25 May 2026 12:11:12 +0200 Subject: [PATCH 251/256] fix: clone node in DrupalServiceRenameRector to preserve BC wrapper fallback MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit refactorWithConfiguration mutated the incoming $node in place, then returned it. AbstractDrupalCoreRector::refactor reuses that same node to build the deprecated branch of createBcCallOnExpr, so both branches of DeprecationHelper::backwardsCompatibleCall ended up calling the renamed service ID — the old-Drupal fallback was lost. Clone before mutating, and add a fixture exercising BC wrapping so the regression cannot reappear silently. --- .../Deprecation/DrupalServiceRenameRector.php | 5 ++-- .../DrupalServiceRenameRectorTest.php | 30 +++++++++++++++++++ .../config/configured_rule.php | 14 +++++++++ .../fixture/basic.php.inc | 15 ++++++++++ 4 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 tests/src/Rector/Deprecation/DrupalServiceRenameRector/DrupalServiceRenameRectorTest.php create mode 100644 tests/src/Rector/Deprecation/DrupalServiceRenameRector/config/configured_rule.php create mode 100644 tests/src/Rector/Deprecation/DrupalServiceRenameRector/fixture/basic.php.inc diff --git a/src/Rector/Deprecation/DrupalServiceRenameRector.php b/src/Rector/Deprecation/DrupalServiceRenameRector.php index fa65b5e0d..cbf9a2497 100644 --- a/src/Rector/Deprecation/DrupalServiceRenameRector.php +++ b/src/Rector/Deprecation/DrupalServiceRenameRector.php @@ -51,9 +51,10 @@ public function refactorWithConfiguration(Node $node, VersionedConfigurationInte return null; } - $node->args[0] = new Node\Arg(new Node\Scalar\String_($configuration->getNewService())); + $newNode = clone $node; + $newNode->args[0] = new Node\Arg(new Node\Scalar\String_($configuration->getNewService())); - return $node; + return $newNode; } public function getRuleDefinition(): RuleDefinition diff --git a/tests/src/Rector/Deprecation/DrupalServiceRenameRector/DrupalServiceRenameRectorTest.php b/tests/src/Rector/Deprecation/DrupalServiceRenameRector/DrupalServiceRenameRectorTest.php new file mode 100644 index 000000000..f9319e3a6 --- /dev/null +++ b/tests/src/Rector/Deprecation/DrupalServiceRenameRector/DrupalServiceRenameRectorTest.php @@ -0,0 +1,30 @@ +doTestFile($filePath); + } + + /** + * @return Iterator<> + */ + public static function provideData(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__.'/config/configured_rule.php'; + } +} diff --git a/tests/src/Rector/Deprecation/DrupalServiceRenameRector/config/configured_rule.php b/tests/src/Rector/Deprecation/DrupalServiceRenameRector/config/configured_rule.php new file mode 100644 index 000000000..dc6edc410 --- /dev/null +++ b/tests/src/Rector/Deprecation/DrupalServiceRenameRector/config/configured_rule.php @@ -0,0 +1,14 @@ + +----- + \Drupal::service('new.service'), fn() => \Drupal::service('old.service')); + $other = \Drupal::service('untouched.service'); +} +?> From 00efcd69aae824f5b38671513f91ac5fda2af98d Mon Sep 17 00:00:00 2001 From: bjorn Date: Mon, 25 May 2026 12:12:07 +0200 Subject: [PATCH 252/256] docs: clean up rector-qa stale checklist reference and rector-implement hint - rector-qa/SKILL.md: drop the dangling reference to rector-type-specificity-checklist.md (which was never shipped) in the bulk-mode description; describe the actual behaviour (walks src/). - rector-implement/SKILL.md: align argument-hint with the repos/ layout produced by setup-repos.sh instead of an absolute home path. --- .claude/skills/rector-implement/SKILL.md | 2 +- .claude/skills/rector-qa/SKILL.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.claude/skills/rector-implement/SKILL.md b/.claude/skills/rector-implement/SKILL.md index 249e77ac6..93f5a7ff5 100644 --- a/.claude/skills/rector-implement/SKILL.md +++ b/.claude/skills/rector-implement/SKILL.md @@ -1,7 +1,7 @@ --- name: rector-implement description: Converts a single drupal-digests rule to a drupal-rector-compliant implementation. Follows .claude/skills/prompts/digest-to-rector-prompt.md steps 1–14 and adds quality gates for type guards (QG-A) and version-gating tests (QG-B). Pass the path to the digests rule file as argument. -argument-hint: "~/projects/drupal-digests/rector/rules/.php" +argument-hint: "repos/drupal-digests/rector/rules/.php" allowed-tools: Read, Write, Edit, Bash, Glob --- diff --git a/.claude/skills/rector-qa/SKILL.md b/.claude/skills/rector-qa/SKILL.md index 183812899..fe09d4c90 100644 --- a/.claude/skills/rector-qa/SKILL.md +++ b/.claude/skills/rector-qa/SKILL.md @@ -13,7 +13,7 @@ Comprehensive four-pass quality review for a drupal-rector implementation. `$ARGUMENTS` — one of: - Rector class name, e.g. `ReplaceSessionManagerDeleteRector` — runs all four passes on that rector. -- `all` — walks every row marked `AT-RISK` in `.claude/skills/prompts/rector-type-specificity-checklist.md` and runs Pass 1 only, fixing each rector in sequence. +- `all` — walks every Drupal-rector source file under `src/` and runs Pass 1 (type-guard audit) on each, fixing as it goes. ## Finding the files From 9618dd92b16b73dd7ea86ba60f6db21c029e2d93 Mon Sep 17 00:00:00 2001 From: bjorn Date: Mon, 25 May 2026 13:43:30 +0200 Subject: [PATCH 253/256] docs: add CHANGELOG.md with full release history Introduces a Keep-a-Changelog-formatted CHANGELOG.md that: - Documents the upcoming 1.0.0-beta1 release in detail (highlights, the D10.3 and per-minor D11 deprecation rule tables, infrastructure / generic shared rectors / tooling subsections, changed deps, removed Rector 1 support, fixed bugs, compatibility matrix, and upgrade notes). - Backfills all 43 historical GitHub releases (0.21.2 down to 0.3.1) verbatim from the Releases page, with stray H1/H2 headings inside the release bodies demoted to H3 so the document's heading hierarchy stays consistent. --- CHANGELOG.md | 1044 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1044 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 000000000..639de4fac --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,1044 @@ +# Changelog + +All notable changes to **drupal-rector** are documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +Historical entries (≤ 0.21.2) are reproduced from the +[GitHub Releases page](https://github.com/palantirnet/drupal-rector/releases) as +they were originally published; their format and level of detail varies +release-by-release. + +## [1.0.0-beta1] — 2026-05-25 + +First beta of the 1.0 line. Adds full Drupal 11 deprecation coverage (versions 11.0 +through 11.4), a new container-managed settings service that gives users explicit +control over backward-compatibility wrapping, a documented set of Claude Code skills +for building further rectors, and drops support for Rector 1. + +Real-world validated end-to-end: + +- Applied to [Drupal Canvas](https://www.drupal.org/project/canvas) on the + `canvas-3589155` branch — the full Canvas test suite passed + ([pipeline 825601](https://git.drupalcode.org/issue/canvas-3589155/-/pipelines/825601)). +- Run across **the whole of Drupal contrib** via + [project_analysis](https://git.drupalcode.org/project/project_analysis) — code + branch [`master-next`](https://git.drupalcode.org/project/project_analysis/-/tree/master-next?ref_type=heads), + generated patches under + [`results-next`](https://git.drupalcode.org/project/project_analysis/-/tree/results-next?ref_type=heads). + Spot-checking those patches surfaced and drove the late-PR fixes (PDO receiver + guard, BC-wrapper mutation, `ConstantToClassConstantRector` generalisation, + extra `MethodToMethodWithCheckRector` patterns). + +### Highlights + +- **Drupal 11.0–11.4 coverage.** 72 rectors wired across five per-minor-version + deprecation set lists, covering function → service / function → static / function + → method-on-first-arg / class-constant → enum / class rename / argument removal + / property → method / and configuration-key rewrites. +- **Drupal 10.3 additions.** 4 new D10 rectors covering `REQUEST_TIME`, + `ThemeHandlerInterface::rebuildThemeData()`, `ModuleHandlerInterface::getName()`, + and `FileSystemInterface::EXISTS_*` → `FileExists` enum. +- **`DrupalRectorSettings` service.** Three knobs for tuning runtime behaviour: + toggle BC wrapping on/off, set a `minimumCoreVersionSupported` (contrib modules), + and override the detected Drupal version (tests). Registered via + `$rectorConfig->singleton(DrupalRectorSettings::class, …)` in the shipped + `rector.php`. +- **Generic data-driven rectors.** A new shared rector + (`FunctionCallRemovalRector`) and two extracted from per-version folders + (`DrupalServiceRenameRector`, `FunctionToFirstArgMethodRector`) now live in + `src/Rector/Deprecation/` alongside the established shared rectors, so each + Drupal version can register them via config-only entries rather than + per-version subclasses. See the **Generic shared rectors** subsection below + for a labelled list of what's new vs. refactored vs. unchanged. +- **BC wrapping covers all expression rewrites.** Previously + `AbstractDrupalCoreRector::createBcCallOnExpr()` only wrapped CallLike → CallLike + rewrites; it now wraps any `Node\Expr` → `Node\Expr` transformation + (`ClassConstFetch`, `PropertyFetch`, etc.), so mixed-type rewrites get + `DeprecationHelper::backwardsCompatibleCall()` automatically. +- **Claude Code skills.** Four `.claude/skills/` entries — `/rector-discover`, + `/rector-implement`, `/rector-qa`, `/rector-live-test` — drive the conversion + pipeline from [dbuytaert/drupal-digests](https://github.com/dbuytaert/drupal-digests) + rules into shipped rector classes with tests. Includes the 700-line canonical + conversion prompt and three reusable recipes. + +### Added + +#### Infrastructure +- **`DrupalRectorSettings`** (`src/Services/DrupalRectorSettings.php`) — container- + managed settings object with `enableBackwardCompatibility()` / + `disableBackwardCompatibility()` / `setMinimumCoreVersionSupported(string)` / + `setDrupalVersion(?string)` methods. Resolved via + `static::getContainer()->make(DrupalRectorSettings::class)` in tests. +- **`AbstractDrupalRectorTestCase`** (`tests/src/AbstractDrupalRectorTestCase.php`) + — replaces the prior namespaced-class `\Drupal` hack with a proper + `setUp`/`tearDown` pattern that resets the shared `DrupalRectorSettings` + singleton between tests, preventing version-override leaks. +- **`createBcCallOnExpr()` widened to `Node\Expr`** in + `src/Rector/AbstractDrupalCoreRector.php`, so non-CallLike rewrites are + BC-wrapped too. +- **`.gitattributes`** added with `export-ignore` entries for `.claude/`, + `.github/`, `tests/`, `fixtures/`, `docs/`, `scripts/`, `phpstan*.neon`, + `phpunit.xml`, `rector.php`, etc. — keeps the Composer dist archive small and + clean. (Verify with `git archive HEAD | tar t | grep -c .claude` — expect 0.) +- **25 PHPStan stubs** under `stubs/` covering core classes the rectors type-guard + against (`ModuleHandlerInterface`, `EntityInterface`, `ConfigEntityInterface`, + `StatementPrefetchIterator`, `CachePluginBase`, `ThemeHandlerInterface`, + `SessionManagerInterface`, …). + +#### Drupal 11 deprecation rules + +Every rule wired across `config/drupal-11/drupal-11.{0,1,2,3,4}-deprecations.php` +is listed below. Each row links to the Drupal.org change record (or, if no +dedicated change record exists, the parent issue). Configurable generic rectors +(`FunctionToServiceRector`, `FunctionToStaticRector`, `FunctionCallRemovalRector`, +`ConstantToClassConstantRector`, `ClassConstantToClassConstantRector`, +`MethodToMethodWithCheckRector`, `FunctionToFirstArgMethodRector`, +`RenameClassRector`) may appear in multiple rows when they handle several +distinct deprecations in the same minor. + +##### Drupal 11.0 + +| Rule | What it does | Change record | +|---|---|---| +| `GetNameToNameRector` | `TestCase::getName()` → `name()` | [node/3217904](https://www.drupal.org/node/3217904) | +| `RemoveStateCacheSettingRector` | Remove `$settings['state_cache']` — state caching is permanently enabled | [node/2575105](https://www.drupal.org/node/2575105) | +| `ReplaceRequestTimeConstantRector` | `REQUEST_TIME` → `\Drupal::time()->getRequestTime()` | [node/3395986](https://www.drupal.org/node/3395986) | +| `StripMigrationDependenciesExpandArgRector` | `getMigrationDependencies($expand)` → drop the boolean arg | [node/3442785](https://www.drupal.org/node/3442785) | +| `MigrateSqlGetMigrationPluginManagerRector` | `Sql::getMigrationPluginManager()` → `$this->migrationPluginManager` property | [node/3282894](https://www.drupal.org/node/3282894) | + +##### Drupal 11.1 + +| Rule | What it does | Change record | +|---|---|---| +| `PluginBaseIsConfigurableRector` | `PluginBase::isConfigurable()` → `instanceof ConfigurableInterface` check | [node/2946122](https://www.drupal.org/node/2946122) | +| `RenameClassRector` | `AliasWhitelist[Interface]` → `AliasPrefixList[Interface]`; `MatchingRouteNotFoundException` → `ResourceNotFoundException` | [node/3467559](https://www.drupal.org/node/3467559) | +| `MethodToMethodWithCheckRector` | `AliasManager::pathAliasWhitelistRebuild()` → `pathAliasPrefixListRebuild()` | [node/3467559](https://www.drupal.org/node/3467559) | +| `RemoveModuleHandlerDeprecatedMethodsRector` | `ModuleHandler::writeCache()` removed; `getHookInfo()` returns `[]` | [node/3368812](https://www.drupal.org/node/3368812) | +| `ReplaceLocaleConfigBatchFunctionsRector` | Rename `locale_config_batch_set_config_langcodes()` and `locale_config_batch_refresh_name()` | [node/3575254](https://www.drupal.org/node/3575254) | +| `RemoveUpdaterPostInstallMethodsRector` | Remove `Updater::postInstall*()` methods (no replacement) | [node/3461934](https://www.drupal.org/node/3461934) | +| `BlockContentTestBaseStringToArrayRector` | `BlockContentTestBase::createBlockContentType($string)` → array arg | [node/3473739](https://www.drupal.org/node/3473739) | +| `MovePointerToMouseOverRector` | `movePointerTo($css)` → `getSession()->getDriver()->mouseOver($xpath)` | [node/3460567](https://www.drupal.org/node/3460567) | +| `ReplaceAddCachedDiscoveryMethodCallRector` | `addMethodCall('addCachedDiscovery', …)` on `plugin.cache_clearer` removed | [node/3442229](https://www.drupal.org/node/3442229) | +| `FunctionToStaticRector` | `drupal_common_theme()` → `ThemeCommonElements::commonElements()` | [node/3488176](https://www.drupal.org/node/3488176) | + +##### Drupal 11.2 + +| Rule | What it does | Change record | +|---|---|---| +| `StatementPrefetchIteratorFetchColumnRector` | `StatementPrefetchIterator::fetchColumn()` → `fetchField()` | [node/3490312](https://www.drupal.org/node/3490312) | +| `MethodToMethodWithCheckRector` | `CacheBackendInterface::invalidateAll()` → `deleteAll()` | [node/3500622](https://www.drupal.org/node/3500622) | +| `FunctionToServiceRector` | `template_preprocess_{html,page,container,links,time,datetime_form,datetime_wrapper}()` → `ThemePreprocess` / `DatePreprocess` service methods | [node/3504125](https://www.drupal.org/node/3504125) | +| `FunctionCallRemovalRector` | Remove `template_preprocess()`, `update_clear_update_disk_cache()`, `update_delete_file_if_stale()`, `_update_manager_{cache_directory,extract_directory,unique_identifier}()` | [node/3501136](https://www.drupal.org/node/3501136) | +| `RemoveModuleHandlerAddModuleCallsRector` | Remove `ModuleHandler::addModule()` / `addProfile()` (no-ops) | [node/3550193](https://www.drupal.org/node/3550193) | +| `RemoveHandlerBaseDefineExtraOptionsRector` | Remove `HandlerBase::defineExtraOptions()` overrides (dead code) | [node/3486781](https://www.drupal.org/node/3486781) | +| `FunctionToStaticRector` | `drupal_requirements_severity()` → `RequirementSeverity::maxSeverityFromRequirements()` | [node/3497049](https://www.drupal.org/node/3497049) | +| `FunctionToServiceRector` | `views_field_default_views_data()` and `_views_field_get_entity_type_storage()` → services | [node/3489415](https://www.drupal.org/node/3489415) | +| `ConstantToClassConstantRector` | Global `REQUIREMENT_INFO/OK/WARNING/ERROR` → `RequirementSeverity::*` | [node/3575841](https://www.drupal.org/node/3575841) | +| `RemoveTwigNodeTransTagArgumentRector` | Drop the 6th `$tag` argument from `TwigNodeTrans` constructor calls | [node/3474692](https://www.drupal.org/node/3474692) | +| `ReplaceAlphadecimalToIntNullRector` | `Number::alphadecimalToInt(null\|'')` → `0` | [node/3494472](https://www.drupal.org/node/3494472) | +| `ReplaceFieldgroupToFieldsetRector` | Render-array `'#type' => 'fieldgroup'` → `'fieldset'` | [node/3515272](https://www.drupal.org/node/3515272) | +| `ReplacePdoFetchConstantsRector` | `\PDO::FETCH_*` → `\Drupal\Core\Database\Statement\FetchAs::*` (StatementInterface receiver only) | [node/3488338](https://www.drupal.org/node/3488338) | +| `ReplaceDateTimeRangeConstantsRector` | `DateTimeRangeConstantsInterface::{BOTH,START_DATE,END_DATE}` → enum `->value`; `datetime_type_field_views_data_helper()` → service | [node/3574901](https://www.drupal.org/node/3574901) | +| `FunctionToFirstArgMethodRector` | `file_get_content_headers($file)` → `$file->getDownloadHeaders()` | [node/3494172](https://www.drupal.org/node/3494172) | +| `ReplaceSessionWritesWithRequestSessionRector` | `$_SESSION['key'] = $value` → `\Drupal::request()->getSession()->set(...)` | [node/3518914](https://www.drupal.org/node/3518914) | +| `ReplaceEditorLoadRector` | `editor_load($format_id)` → `entityTypeManager()->getStorage('editor')->load($format_id)` | [node/3509245](https://www.drupal.org/node/3509245) | +| `ReplaceEntityOriginalPropertyRector` | `$entity->original` magic property → `$entity->getOriginal()` / `setOriginal()`; nullsafe-aware | [node/3571065](https://www.drupal.org/node/3571065) | +| `RenameStopProceduralHookScanRector` | `#[StopProceduralHookScan]` → `#[ProceduralHookScanStop]` | [node/3495943](https://www.drupal.org/node/3495943) | +| `RenameClassRector` | `Drupal\Core\Entity\Query\Sql\pgsql\*` → `Drupal\pgsql\Entity\Query\*`; `jsonapi` ResourceResponseValidator move | [node/3488572](https://www.drupal.org/node/3488572) | +| `RemoveCacheTagChecksumAssertionsRector` | Remove `CacheTagChecksumCount` / `CacheTagIsValidCount` performance-trait assertions | [node/3511149](https://www.drupal.org/node/3511149) | +| `RemoveRootFromCreateConnectionOptionsFromUrlRector` | `Connection::createConnectionOptionsFromUrl()` — drop `$root` parameter | [node/3511287](https://www.drupal.org/node/3511287) | +| `ClassConstantToClassConstantRector` | `SystemManager::REQUIREMENT_*` → `RequirementSeverity::*` | [node/3410939](https://www.drupal.org/node/3410939) | + +##### Drupal 11.3 + +| Rule | What it does | Change record | +|---|---|---| +| `ReplaceCommentManagerGetCountNewCommentsRector` | `CommentManager::getCountNewComments()` → `HistoryManager::getCountNewComments()` | [node/3551729](https://www.drupal.org/node/3551729) | +| `LoadAllIncludesRector` | `ModuleHandler::loadAllIncludes()` → explicit `foreach (getModuleList() …) loadInclude()` | [node/3536432](https://www.drupal.org/node/3536432) | +| `NodeStorageDeprecatedMethodsRector` | `NodeStorage::revisionIds()` / `userRevisionIds()` → entity query chains; `countDefaultLanguageRevisions()` removed | [node/3519187](https://www.drupal.org/node/3519187) | +| `FunctionToServiceRector` | `node_mass_update()` → `NodeBulkUpdate::process()` | [node/3533083](https://www.drupal.org/node/3533083) | +| `FunctionToServiceRector` | `template_preprocess_layout()` → `LayoutDiscoveryThemeHooks::preprocessLayout()` | [node/3504125](https://www.drupal.org/node/3504125) | +| `ReplaceTwigExtensionRector` | `twig_extension()` → `'.html.twig'` string literal | [node/1685492](https://www.drupal.org/node/1685492) | +| `ReplaceNodeModuleProceduralFunctionsRector` | `node_type_get_names()` → `entity_type.bundle.info` service; `node_get_type_label($node)` → `$node->getBundleEntity()->label()` | [node/3516778](https://www.drupal.org/node/3516778) | +| `FunctionCallRemovalRector` | Remove `block_content_add_body_field()` calls (replaced by config) | [node/3535528](https://www.drupal.org/node/3535528) | +| `FunctionToFirstArgMethodRector` | `comment_uri($comment)` → `$comment->permalink()` | [node/2010202](https://www.drupal.org/node/2010202) | +| `ReplaceNodeAccessViewAllNodesRector` | `node_access_view_all_nodes()` → entity-type-manager access-control chain | [node/3038909](https://www.drupal.org/node/3038909) | +| `FunctionToServiceRector` | `responsive_image_*()` helpers → `responsive_image.builder` service | [node/3548329](https://www.drupal.org/node/3548329) | +| `ReplaceNodeAddBodyFieldRector` | `node_add_body_field()` → `$this->createBodyField()` (BodyFieldCreationTrait) | [node/3516778](https://www.drupal.org/node/3516778) | +| `ReplaceUserSessionNamePropertyRector` | `$userSession->name` read → `getAccountName()` | [node/3513877](https://www.drupal.org/node/3513877) | +| `FunctionToStaticRector` | `file_system_settings_submit()` → `FileSystemSettingsForm::submit()` | [node/3534091](https://www.drupal.org/node/3534091) | +| `FileManagedFileSubmitRector` | `'file_managed_file_submit'` string callback → `[ManagedFile::class, 'submit']` array callable | [node/3534091](https://www.drupal.org/node/3534091) | +| `ConstantToClassConstantRector` | Global `JSONAPI_FILTER_AMONG_*` → `\Drupal\jsonapi\JsonApiFilter::AMONG_*` | [node/3495601](https://www.drupal.org/node/3495601) | +| `ReplaceNodeSetPreviewModeRector` | `DRUPAL_DISABLED/OPTIONAL/REQUIRED` (and integers) in `setPreviewMode()` → `NodePreviewMode` enum | [node/3538666](https://www.drupal.org/node/3538666) | +| `FileSystemBasenameToNativeRector` | `FileSystem::basename()` → PHP native `basename()` | [node/3530869](https://www.drupal.org/node/3530869) | +| `ErrorCurrentErrorHandlerRector` | `Error::currentErrorHandler()` → PHP `get_error_handler()` | [node/3529500](https://www.drupal.org/node/3529500) | +| `ReplaceThemeGetSettingRector` | `theme_get_setting()` → `ThemeSettingsProvider` service; `_system_default_theme_features()` → `ThemeSettingsProvider::DEFAULT_THEME_FEATURES` | [node/3573896](https://www.drupal.org/node/3573896) | +| `RemoveRootFromConvertDbUrlRector` | `Database::convertDbUrlToConnectionInfo($url, $root, …)` — drop the `$root` arg | [node/3511287](https://www.drupal.org/node/3511287) | +| `RenameClassRector` | `workspaces.association` service / `WorkspaceAssociation*` → `workspaces.tracker` / `WorkspaceTracker*` | [node/3551450](https://www.drupal.org/node/3551450) | + +##### Drupal 11.4 + +| Rule | What it does | Change record | +|---|---|---| +| `ViewsPluginHandlerManagerRector` | `Views::pluginManager()` / `handlerManager()` → `plugin.manager.views.*` services | [node/3566982](https://www.drupal.org/node/3566982) | +| `FunctionToServiceRector` | `node_access_grants()` → `NodeGrantsHelper::nodeAccessGrants()` | [node/3578055](https://www.drupal.org/node/3578055) | +| `NodeAccessRebuildFunctionsRector` | `node_access_rebuild()` / `node_access_needs_rebuild()` → `NodeAccessRebuild` service | [node/3534610](https://www.drupal.org/node/3534610) | +| `FilterFormatFunctionsToServiceRector` | `filter_formats()`, `filter_get_roles_by_format()`, `filter_get_formats_by_role()`, `filter_default_format()`, `filter_fallback_format()` → `FilterFormatRepositoryInterface` service | [node/3035368](https://www.drupal.org/node/3035368) | +| `MediaFilterFormatEditFormValidateRector` | `media_filter_format_edit_form_validate()` → `MediaHooks::formatEditFormValidate()` | [node/3566774](https://www.drupal.org/node/3566774) | +| `DeprecatedFilterFunctionsRector` | `_filter_autop()` / `_filter_html_escape()` / `_filter_html_image_secure_process()` → `plugin.manager.filter` createInstance chain | [node/3566774](https://www.drupal.org/node/3566774) | +| `ReplaceSessionManagerDeleteRector` | `SessionManager::delete($uid)` → `UserSessionRepositoryInterface::deleteAll($uid)` | [node/3570851](https://www.drupal.org/node/3570851) | +| `ClassConstantToClassConstantRector` | `CommentItemInterface::{FORM_BELOW,FORM_SEPARATE_PAGE,HIDDEN,CLOSED,OPEN}` and `CommentInterface::ANONYMOUS_*` → `FormLocation` / `CommentingStatus` / `AnonymousContact` enums | [node/3550054](https://www.drupal.org/node/3550054) | +| `FunctionToServiceRector` | `language_configuration_element_submit()` → `LanguageConfiguration::submit()` | [node/3574727](https://www.drupal.org/node/3574727) | +| `FunctionCallRemovalRector` | Remove `field_ui_form_manage_field_form_submit()`, `automated_cron_settings_submit()`, `syslog_facility_list()`, `syslog_logging_settings_submit()`, `taxonomy_build_node_index()`, `taxonomy_delete_node_index()`, views_ui contextual-suppress functions | [node/3566774](https://www.drupal.org/node/3566774) | +| `RemoveSetUriCallbackRector` | Remove `EntityTypeInterface::setUriCallback()` calls — use `link_templates` instead | [node/3575062](https://www.drupal.org/node/3575062) | +| `ReplaceRecipeRunnerInstallModuleRector` | `RecipeRunner::installModule($module)` → `installModules([$module])` | [node/3579527](https://www.drupal.org/node/3579527) | +| `ReplaceSystemPerformanceGzipKeyRector` | `system.performance` `css.gzip` / `js.gzip` config keys → `css.compress` / `js.compress` | [node/3526344](https://www.drupal.org/node/3526344) | +| `RemoveViewsRowCacheKeysRector` | Remove `CachePluginBase::getRowCacheKeys()` / `getRowId()` overrides | [node/3564958](https://www.drupal.org/node/3564958) | +| `RemoveCacheExpireOverrideRector` | Remove `CachePluginBase::cacheExpire()` subclass overrides | [node/3576855](https://www.drupal.org/node/3576855) | +| `RemoveTrustDataCallRector` | Strip `->trustData()` from `Config` fluent chains | [node/3348180](https://www.drupal.org/node/3348180) | +| `RemoveConfigSaveTrustedDataArgRector` | `Config::save($has_trusted_data)` — drop the boolean arg | [node/3348180](https://www.drupal.org/node/3348180) | +| `RemoveLinkWidgetValidateTitleElementRector` | Remove `LinkWidget::validateTitleElement()` — now handled by `LinkTitleRequiredConstraint` | [node/3554139](https://www.drupal.org/node/3554139) | +| `RemoveAutomatedCronSubmitHandlerRector` | Drop `'automated_cron_settings_submit'` from `$form['#submit']` — `#config_target` now handles config save | [node/3566774](https://www.drupal.org/node/3566774) | +| `ReplaceViewsProceduralFunctionsRector` | `views_view_is_{enabled,disabled}()`, `views_{enable,disable}_view()`, `views_get_view*()` → entity-storage / `Views::*` static calls | [node/3572594](https://www.drupal.org/node/3572594) | +| `GetOriginalClassToGetDecoratedClassesRector` | `EntityTypeInterface::getOriginalClass()` → `getDecoratedClasses()` array access | [node/3557464](https://www.drupal.org/node/3557464) | +| `UseEntityTypeHasIntegerIdRector` | `getEntityTypeIdKeyType() === 'integer'`, `entityTypeSupportsComments()`, `hasIntegerId($entityType)` → `EntityTypeInterface::hasIntegerId()` | [node/3566814](https://www.drupal.org/node/3566814) | +| `FunctionToServiceRector` | `editor_filter_xss()` → `EditorXssFilterInterface` service | [node/3568144](https://www.drupal.org/node/3568144) | +| `FunctionToStaticRector` | `_media_library_configure_form_display()` / `_media_library_configure_view_display()` → static helpers | [node/3566774](https://www.drupal.org/node/3566774) | +| `FunctionToStaticRector` | `language_configuration_element_submit()` static-call form → `LanguageConfiguration::submit()` | [node/3574727](https://www.drupal.org/node/3574727) | +| `FunctionToServiceRector` | `contextual_links_to_id()` / `contextual_id_to_links()` → `ContextualLinksSerializer` | [node/3568087](https://www.drupal.org/node/3568087) | +| `FunctionToServiceRector` | `views_add_contextual_links()` → `views.contextual_links` service | [node/3382344](https://www.drupal.org/node/3382344) | +| `ConstantToClassConstantRector` | `IMAGE_DERIVATIVE_TOKEN` → `ImageStyleInterface::TOKEN` | [node/3567619](https://www.drupal.org/node/3567619) | +| `ReplaceEntityReferenceRecursiveLimitRector` | `EntityReferenceEntityFormatter::RECURSIVE_RENDER_LIMIT` → literal `20` | [node/2940605](https://www.drupal.org/node/2940605) | +| `SystemRegionFunctionsRector` | `system_region_list()` / `system_default_region()` → `theme.region.manager` service | [node/3015812](https://www.drupal.org/node/3015812) | +| `CheckMarkupToProcessedTextRector` | `check_markup()` → processed-text render array | [node/3588040](https://www.drupal.org/node/3588040) | +| `RemoveFilterTipsLongParamRector` | `FilterInterface::tips()` — drop the `$long` parameter | [node/3567879](https://www.drupal.org/node/3567879) | +| `SystemSortThemesRector` | `'system_sort_themes'` string callback → `Closure` (closure callable) | [node/3566774](https://www.drupal.org/node/3566774) | +| `LocaleCompareIncToServiceRector` | `locale_translation_flush_projects()` / `locale_translation_build_projects()` / `locale_translation_check_projects*()` etc. → `locale.project` and `LocaleSource` services | [node/3037031](https://www.drupal.org/node/3037031) | + +#### Drupal 10.3 deprecation rules + +Wired in `config/drupal-10/drupal-10.3-deprecations.php`. + +| Rule | What it does | Change record | +|---|---|---| +| `MethodToMethodWithCheckRector` | `RendererInterface::renderPlain()` → `renderInIsolation()` | [node/3407994](https://www.drupal.org/node/3407994) | +| `FunctionToStaticRector` | `file_icon_class()` → `IconMimeTypes::getIconClass()`; `file_icon_map()` → `IconMimeTypes::getGenericMimeType()` | [node/3411269](https://www.drupal.org/node/3411269) | +| `ReplaceRebuildThemeDataRector` | `ThemeHandlerInterface::rebuildThemeData()` → `extension.list.theme` service | [node/3413196](https://www.drupal.org/node/3413196) | +| `ReplaceModuleHandlerGetNameRector` | `ModuleHandlerInterface::getName()` → `extension.list.module` service | [node/3310017](https://www.drupal.org/node/3310017) | +| `ClassConstantToClassConstantRector` | `FileSystemInterface::EXISTS_*` → `\Drupal\Core\File\FileExists` enum | [node/3426517](https://www.drupal.org/node/3426517) | + +#### Generic shared rectors + +All eight live under `src/Rector/Deprecation/`. Each row labels what changed in +this release: `(new)` introduced in this PR, `(refactored)` existing class +restructured, `(enhanced)` new feature added, `(moved)` relocated from a +per-version folder, `(pre-existing)` unchanged but used by new D10.3 / D11 +configs. + +| Rector | Status in this release | Notes | +|---|---|---| +| `FunctionCallRemovalRector` | **(new)** | Removes deprecated function-call *statements* that have no direct replacement. Supports an accumulating configuration so per-version config files each contribute their own function list. | +| `ConstantToClassConstantRector` | **(refactored)** | Now extends `AbstractDrupalCoreRector` so it participates in BC wrapping when a `VersionedConfiguration` is supplied. Three previously-bespoke rectors (`ReplaceRequirementSeverityConstantsRector`, `ReplaceJsonApiFilterConstantsRector`, `ReplaceLocaleTranslationDefaultServerPatternRector`) were collapsed into config entries against this class. | +| `FunctionToServiceRector` | **(enhanced)** | New `useClassSyntax` option on `FunctionToServiceConfiguration` emits `\Drupal::service(ClassName::class)` instead of a string service ID. | +| `MethodToMethodWithCheckRector` | **(enhanced)** | Additional patterns matched (statement-level, assignment, fluent-chain) so it covers more configurations found during contrib-wide analysis. | +| `DrupalServiceRenameRector` | **(moved + bugfix)** | Lifted from `src/Drupal8/` into `src/Rector/Deprecation/`. The previous in-place `$node` mutation that broke the BC wrapper fallback is fixed — now clones before mutating, with a regression fixture. The legacy `Drupal8\Rector\Deprecation\DrupalServiceRenameRector` is kept as a thin subclass that re-validates the D8 configuration value object. | +| `FunctionToFirstArgMethodRector` | **(moved)** | Lifted from `src/Drupal9/` into `src/Rector/Deprecation/`. The legacy `Drupal9\Rector\Deprecation\FunctionToFirstArgMethodRector` is kept as a thin subclass. | +| `FunctionToStaticRector` | **(pre-existing)** | Unchanged class; new configurations added in D10.3 and D11.{1,2,3,4} configs. | +| `ClassConstantToClassConstantRector` | **(pre-existing)** | Unchanged class (introduced in PR #282); new configurations added in D10.3 (`FileSystemInterface::EXISTS_*` → `FileExists` enum) and D11.4 (`CommentItemInterface::*` enums). | + +#### Tooling and scripts +- **`.claude/skills/rector-discover/SKILL.md`** — lists unimplemented + drupal-digests rules by implementation phase; regenerates + `docs/rector-index.yml` when stale. +- **`.claude/skills/rector-implement/SKILL.md`** — 14-step canonical conversion + workflow from a digest rule to a finished rector class + test + fixture + + config entry, with type-guard and version-gating quality gates. +- **`.claude/skills/rector-qa/SKILL.md`** — five-pass quality review (type + guards, fixture coverage, BC decision correctness, `@see` URL accuracy, + registration audit). Supports `all` mode for branch-wide scans. +- **`.claude/skills/rector-live-test/SKILL.md`** + `setup-rector-test.sh` — + finds real contrib modules that use the deprecated API a rector targets and + runs the rector against them to validate end-to-end. Uses + [search.tresbien.tech](https://search.tresbien.tech) as primary source with + GitLab API fallback. +- **`.claude/scripts/generate-rector-index.php`** — regenerates + `docs/rector-index.yml` from the digests source. +- **`.claude/scripts/setup-repos.sh`** — clones `repos/drupal-digests` and + `repos/drupal-core` for local development of new rectors. +- **`scripts/check-rector-coverage.php`** — evaluates real-world coverage by + matching shipped rectors against real contrib patches. +- **`scripts/generate-deprecation-map.php`** — extracts `@trigger_error` + deprecations from Drupal core into a structured YAML map. + +### Changed + +- **Shipped `rector.php` disables BC wrapping by default.** New users get clean + one-version rewrites out of the box. Contrib modules and projects that need to + run on multiple Drupal versions should call `->enableBackwardCompatibility()` + and optionally `->setMinimumCoreVersionSupported(...)` on the + `DrupalRectorSettings` singleton. + + The `DrupalRectorSettings` class default for `backwardCompatibilityEnabled` + remains `true` (avoids silently changing behaviour for existing users who do + not call either method on the service); the shipped `rector.php` invokes + `disableBackwardCompatibility()` explicitly to surface the project-level + recommended default. +- **PHPUnit test setup** — tests now extend `AbstractDrupalRectorTestCase` + instead of `AbstractRectorTestCase` directly so `DrupalRectorSettings` + mutations don't leak between tests. +- **`composer.json` dev-dependency bumps**: + - `phpunit/phpunit` `^10.0` → `^12.5.24` + - `phpstan/phpstan` `^1.12 || ^2.0` → `^2.1.54` + - `phpstan/phpstan-deprecation-rules` `^1.2 || ^2.0` → `^2.0.4` + - `friendsofphp/php-cs-fixer` `^3.58` → `^3.95.1` + - `symplify/vendor-patches` `^11.0` → `^12.0.6` + - `cweagans/composer-patches` `^1.7.2` → `^2.0` + - `symfony/yaml` `^5 || ^6 || ^7` → `^5 || ^6 || ^7.4.8` +- **CI matrix simplified** to PHP 8.3 + Rector 2 (previously also tested PHP 8.2 + + Rector 1). +- **Drupal stub `VERSION`** bumped from `10.99.x-dev` to `11.99.x-dev` so D11 + rules fire in tests by default; D11 tests opt out via + `DrupalRectorSettings::setDrupalVersion('1.0.0')` for below-version cases. +- **Composer autoload `exclude-from-classmap`** entries added for + `**/fixture/**`, `**/fixture-*/**`, `**/Fixture/**` so fixtures don't pollute + consuming projects' class maps. + +### Removed + +- **Rector 1 support.** `composer.json` now requires `rector/rector:^2`. Drupal + 10 EOL is August 2026; Rector 1 was already EOL upstream. +- **`docs/rules_overview.md`** (1,210 lines, auto-generated). Replaced by + on-demand generation via `.claude/scripts/generate-rector-index.php` → + `docs/rector-index.yml`. The composer `docs` script that produced the file + is also removed. +- Three single-purpose constant rectors collapsed into + `ConstantToClassConstantRector` config entries: + `ReplaceRequirementSeverityConstantsRector`, + `ReplaceJsonApiFilterConstantsRector`, + `ReplaceLocaleTranslationDefaultServerPatternRector`. + +### Fixed + +- **`DrupalServiceRenameRector` BC wrapper fallback.** `refactorWithConfiguration` + used to mutate the input `$node` in place; the parent's `createBcCallOnExpr` + reused that same already-mutated node as the deprecated branch of the + `DeprecationHelper::backwardsCompatibleCall(...)`, so **both branches** ended + up calling the renamed service and the legacy fallback was silently lost. Now + clones before mutating; a regression fixture exercises the BC wrapping. +- **`ReplacePdoFetchConstantsRector` native-PDO receiver guard.** The original + matcher rewrote `setFetchMode` / `fetch*` calls on **any** object whose + argument was `\PDO::FETCH_*`, which would break native PDO statements. Now + guards the receiver with + `isObjectType($node->var, new ObjectType('Drupal\Core\Database\StatementInterface'))`. +- **`NodeStorageDeprecatedMethodsRector` missing `countDefaultLanguageRevisions`** + — the statement-level REMOVE_NODE case was missing entirely; now covered. +- **`ReplaceEntityOriginalPropertyRector` nullsafe support** — added + `NullsafePropertyFetch` to the node types and refactor logic so + `$entity?->original` is rewritten to `$entity?->getOriginal()`. +- **`ReplaceEditorLoadRector` argument count** — added an arg-count guard so + `editor_load()` (no args) and `editor_load($a, $b)` (two args) are not + incorrectly transformed. +- **`RemoveCacheExpireOverrideRector`** — handles Time/Tag/None cache plugin + subclasses, FQCN imports, aliased imports, and ignores side-effects in the + method body. +- **8 unregistered rectors wired into deprecation configs** — eight new D11 + rector classes shipped with tests but no `config/` references in earlier + drafts; now all wired into the matching `drupal-11.X-deprecations.php`. +- **`AbstractDrupalCoreRector::createBcCallOnExpr` visibility** — changed from + private to protected so subclasses can call it directly when they have to + build manual BC wraps for non-Expr top-level nodes (e.g., + `ReplacePdoFetchConstantsRector::refactor()`'s `ArrayItem` branch). + +### Compatibility + +| Dimension | Supported | +|---|---| +| **PHP** | `^8.2` (CI runs 8.3) | +| **Rector** | `^2` only — Rector 1 is dropped | +| **Drupal core** | 8, 9, 10, 11 (10 and 11 are the primary targets; 8 and 9 rules retained for legacy projects) | + +### Upgrade notes + +#### Refresh `rector.php` + +The shipped `rector.php` was rewritten to register the `DrupalRectorSettings` +singleton. Refresh your project's copy: + +```sh +cp vendor/palantirnet/drupal-rector/rector.php . +``` + +If you have local customisations, merge them by hand. The notable new block is: + +```php +$rectorConfig->singleton(DrupalRectorSettings::class, fn () => + (new DrupalRectorSettings()) + ->disableBackwardCompatibility() +); +``` + +#### Contrib modules running against an older minimum Drupal version + +If your module must keep running on (e.g.) Drupal 10.5 while the development +environment runs 11.x, enable BC wrapping and tell the settings the minimum core +version you support so the wrappers are emitted correctly: + +```php +$rectorConfig->singleton(DrupalRectorSettings::class, fn () => + (new DrupalRectorSettings()) + ->enableBackwardCompatibility() + ->setMinimumCoreVersionSupported('10.5.0') +); +``` + +#### Cleaning up old BC wrappers + +Once you raise your module's minimum supported Drupal version, the existing +`DeprecationHelper::backwardsCompatibleCall()` wrappers in your code become +redundant. Strip them with `DeprecationHelperRemoveRector` (commented example in +the shipped `rector.php`): + +```php +$rectorConfig->ruleWithConfiguration(DeprecationHelperRemoveRector::class, [ + new DeprecationHelperRemoveConfiguration('10.3.0'), +]); +``` + +This rewrites every wrapper whose `introducedVersion` is below `10.3.0` back to +the new API call directly. + +#### Drupal 8 / 9 legacy rectors + +Still included for legacy projects. The classes +`Drupal8\Rector\Deprecation\DrupalServiceRenameRector` and +`Drupal9\Rector\Deprecation\FunctionToFirstArgMethodRector` are thin subclasses +re-validating their D8/D9 configuration value objects; behaviour is unchanged. + +[1.0.0-beta1]: https://github.com/palantirnet/drupal-rector/releases/tag/1.0.0-beta1 +## [0.21.2] — 2026-05-08 + +### What's Changed +* build: fix codestyle by @bbrala in https://github.com/palantirnet/drupal-rector/pull/322 +* fix: Fix phpstan issues and update pipeline actions to current versions by @bbrala in https://github.com/palantirnet/drupal-rector/pull/324 +* Allow rector ^2.4.1 and replace file with getFile() if method exists by @samsonasik in https://github.com/palantirnet/drupal-rector/pull/326 +* Add theme extension by @nlighteneddesign in https://github.com/palantirnet/drupal-rector/pull/325 +* fix: fix theme hook test by @bbrala in https://github.com/palantirnet/drupal-rector/pull/328 + + +**Full Changelog**: https://github.com/palantirnet/drupal-rector/compare/0.21.1...0.21.2 + +[0.21.2]: https://github.com/palantirnet/drupal-rector/releases/tag/0.21.2 + +## [0.21.1] — 2025-11-07 + +### What's Changed +* Fix method not found on GetDeclaringSourceTrait::getDeclaringSource() by @samsonasik in https://github.com/palantirnet/drupal-rector/pull/317 +* Update Deny list to include to missing hooks and remove preprocess by @nlighteneddesign in https://github.com/palantirnet/drupal-rector/pull/318 +* Better replacement for dynamic uppercase parts in Implements hook_xy by @Berdir in https://github.com/palantirnet/drupal-rector/pull/320 + +### New Contributors +* @Berdir made their first contribution in https://github.com/palantirnet/drupal-rector/pull/320 + +**Full Changelog**: https://github.com/palantirnet/drupal-rector/compare/0.21.0...0.21.1 + +[0.21.1]: https://github.com/palantirnet/drupal-rector/releases/tag/0.21.1 + +## [0.21.0] — 2025-05-23 + +This release adds Rector 2 support. FOr now we support both 1 and 2, for now this seems like a reasonable goal. If we start running into to many issues we will split the repo into a 1 and 2 release. + +### What's Changed +* feat: Drop Drupal 8 support by @bbrala in https://github.com/palantirnet/drupal-rector/pull/311 +* feat: Add support for PHPstan 2 and Rector 2 by @ptmkenny in https://github.com/palantirnet/drupal-rector/pull/312 +* feat: Add new HookConvert rector to convert legacy hooks to new OOP hooks. by @nlighteneddesign in https://github.com/palantirnet/drupal-rector/pull/308 +* chore: Remove use of protected property NodeNameResolver on HookConvertRector by @samsonasik in https://github.com/palantirnet/drupal-rector/pull/316 + +### New Contributors +* @ptmkenny made their first contribution in https://github.com/palantirnet/drupal-rector/pull/312 +* @nlighteneddesign made their first contribution in https://github.com/palantirnet/drupal-rector/pull/308 +* @samsonasik made their first contribution in https://github.com/palantirnet/drupal-rector/pull/316 + +**Full Changelog**: https://github.com/palantirnet/drupal-rector/compare/0.20.3...0.21.0 + +[0.21.0]: https://github.com/palantirnet/drupal-rector/releases/tag/0.21.0 + +## [0.20.3] — 2024-06-10 + +### New rectors +* New rector (10.3): Add rule for file_icon_class() and file_icon_map() by @timohuisman in https://github.com/palantirnet/drupal-rector/pull/304 +* Add common PHPUnit 10 deprecations by @bbrala in https://github.com/palantirnet/drupal-rector/pull/307 + +### Bugfixes +* symplify/rule-doc-generator doesnt like cs-fixer a lot of times. Adju… by @bbrala in https://github.com/palantirnet/drupal-rector/pull/306 + +**Full Changelog**: https://github.com/palantirnet/drupal-rector/compare/0.20.2...0.20.3 + +[0.20.3]: https://github.com/palantirnet/drupal-rector/releases/tag/0.20.3 + +## [0.20.2] — 2024-05-31 + +### New rectors +* New rector (10.1): drupal_theme_rebuild is deprecated by @bbrala in https://github.com/palantirnet/drupal-rector/pull/297 +* New rector (10.2): Rector for _drupal_flush_css_js through new VersionedFunctionToServiceRector by @bbrala in https://github.com/palantirnet/drupal-rector/pull/302 + +### Bugfixes +* bugfix: remove extra \ from Drupal\Core\StringTranslation\ByteSizeMarkup rector by @bbrala in https://github.com/palantirnet/drupal-rector/pull/301 + +### What's Changed +* Update core_plugin_conversion.md by @bbrala in https://github.com/palantirnet/drupal-rector/pull/298 +* doc: Fix doc for AnnotationToAttributeRector and generate new docs. by @bbrala in https://github.com/palantirnet/drupal-rector/pull/299 +* Upgrade project tooling to PHP 8.2 by @agentrickard in https://github.com/palantirnet/drupal-rector/pull/300 + +**Full Changelog**: https://github.com/palantirnet/drupal-rector/compare/0.20.1...0.20.2 + +[0.20.2]: https://github.com/palantirnet/drupal-rector/releases/tag/0.20.2 + +## [0.20.1] — 2024-03-09 + +This release adds the code to move from annotations to attributes which currently is being done in core. For now this code is not added by default until things settle down. If you want to use the rector check out [AnnotationToAttributeRector](https://github.com/palantirnet/drupal-rector/blob/main/src/Drupal10/Rector/Deprecation/AnnotationToAttributeRector.php). + +If you want to contribute to core in the migration, [check out these docs](https://github.com/palantirnet/drupal-rector/blob/main/docs/core_plugin_conversion.md) or go help out in [#3396165](https://www.drupal.org/project/drupal/issues/3396165). + +### New rectors +* New rector: Rule to convert action to attributes by @andypost in https://github.com/palantirnet/drupal-rector/pull/257 +* New rector (9.1): ClassConstantToClassConstantRector to rename class constants to a new class. by @bbrala in https://github.com/palantirnet/drupal-rector/pull/282 +* feat: Optimize AnnotationToAttributeRector by @bbrala in https://github.com/palantirnet/drupal-rector/pull/296 + +### What's Changed +* Add bbrala to authors by @bbrala in https://github.com/palantirnet/drupal-rector/pull/294 +* Add agentrickard to authors. by @agentrickard in https://github.com/palantirnet/drupal-rector/pull/295 + +### New Contributors +* @andypost made their first contribution in https://github.com/palantirnet/drupal-rector/pull/257 + +**Full Changelog**: https://github.com/palantirnet/drupal-rector/compare/0.20.0...0.20.1 + +[0.20.1]: https://github.com/palantirnet/drupal-rector/releases/tag/0.20.1 + +## [0.20.0] — 2024-03-05 + +### New Rector + +* feat: add rector rule for deprecated GDToolkit by @timohuisman in https://github.com/palantirnet/drupal-rector/pull/289 + +### What's Changed +* refactor: Replace deprecated LevelSetLists for version specific PHPUnit, Symfony and Twig sets by @timohuisman in https://github.com/palantirnet/drupal-rector/pull/290 +* feat: upgrade to rector 1.0 by @bbrala in https://github.com/palantirnet/drupal-rector/pull/292 +* fix: Add proper levels for all symfony versions deprecated in the different versions of Drupal by @bbrala in https://github.com/palantirnet/drupal-rector/pull/293 + + +**Full Changelog**: https://github.com/palantirnet/drupal-rector/compare/0.19.2...0.20.0 + +[0.20.0]: https://github.com/palantirnet/drupal-rector/releases/tag/0.20.0 + +## [0.19.2] — 2024-01-17 + +### Fixed + +* Fix: Double deprecated calls when already refactored by @bbrala in https://github.com/palantirnet/drupal-rector/pull/288 + + +**Full Changelog**: https://github.com/palantirnet/drupal-rector/compare/0.19.1...0.19.2 + +[0.19.2]: https://github.com/palantirnet/drupal-rector/releases/tag/0.19.2 + +## [0.19.1] — 2024-01-12 + +### What's Changed +* bugfix: switch arguments of AbstractDrupalCoreRector by @timohuisman in https://github.com/palantirnet/drupal-rector/pull/287 + + +**Full Changelog**: https://github.com/palantirnet/drupal-rector/compare/0.19.0...0.19.1 + +[0.19.1]: https://github.com/palantirnet/drupal-rector/releases/tag/0.19.1 + +## [0.19.0] — 2024-01-11 + +### New rector +* feat: Add rector rule for format_size in 10.2 by @timohuisman in https://github.com/palantirnet/drupal-rector/pull/286 + +### What's Changed +* feat: Upgrade rector to 0.19 and fix phpstan incompatiblities by @bbrala in https://github.com/palantirnet/drupal-rector/pull/284 + +### New Contributors +* @timohuisman made their first contribution in https://github.com/palantirnet/drupal-rector/pull/286 + +**Full Changelog**: https://github.com/palantirnet/drupal-rector/compare/0.18.6...0.19. + +[0.19.0]: https://github.com/palantirnet/drupal-rector/releases/tag/0.19.0 + +## [0.18.6] — 2023-12-28 + +### What's Changed +* Hotfix: New rector FILE_STATUS_PERMANENT was not added to deprecation list. … by @bbrala in https://github.com/palantirnet/drupal-rector/pull/280 + + +**Full Changelog**: https://github.com/palantirnet/drupal-rector/compare/0.18.5...0.18.6 + +[0.18.6]: https://github.com/palantirnet/drupal-rector/releases/tag/0.18.6 + +## [0.18.5] — 2023-12-28 + +### New rector +* New rector (9.3): Support FILE_STATUS_PERMANENT deprecation by @bbrala in https://github.com/palantirnet/drupal-rector/pull/278 +* New rector (9.1): \Drupal\Component\Utility\Bytes::toInt() is deprecated by @bbrala in https://github.com/palantirnet/drupal-rector/pull/279 + + +**Full Changelog**: https://github.com/palantirnet/drupal-rector/compare/0.18.4...0.18.5 + +[0.18.5]: https://github.com/palantirnet/drupal-rector/releases/tag/0.18.5 + +## [0.18.4] — 2023-12-18 + +### New rector + +* New rector: Support for module_load_include deprecation (Drupal 9) by @bbrala in https://github.com/palantirnet/drupal-rector/pull/277 + +**Full Changelog**: https://github.com/palantirnet/drupal-rector/compare/0.18.3...0.18.4 + +[0.18.4]: https://github.com/palantirnet/drupal-rector/releases/tag/0.18.4 + +## [0.18.3] — 2023-12-06 + +### New rector +* PHPUnit: Rector to fix missing parent::setUp and parent::tearDown methods by @bbrala in https://github.com/palantirnet/drupal-rector/pull/273 + +### Bugfix +* Fix EntityManagerRector based on project_analysis results by @bbrala in https://github.com/palantirnet/drupal-rector/pull/274 + +### Other changes +* Remove latest release from readme, unneeded maintainance, its already… by @bbrala in https://github.com/palantirnet/drupal-rector/pull/270 +* Better workflows by @bbrala in https://github.com/palantirnet/drupal-rector/pull/275 + + +**Full Changelog**: https://github.com/palantirnet/drupal-rector/compare/0.18.2...0.18.3 + +[0.18.3]: https://github.com/palantirnet/drupal-rector/releases/tag/0.18.3 + +## [0.18.2] — 2023-11-24 + +### New rector +* Add rector for system_time_zones by @bbrala in https://github.com/palantirnet/drupal-rector/pull/271 + +### What's Changed +* Link packagist version shield to package on packagist.org by @kasperg in https://github.com/palantirnet/drupal-rector/pull/269 + +### New Contributors +* @kasperg made their first contribution in https://github.com/palantirnet/drupal-rector/pull/269 + +**Full Changelog**: https://github.com/palantirnet/drupal-rector/compare/0.18.1...0.18.2 + +[0.18.2]: https://github.com/palantirnet/drupal-rector/releases/tag/0.18.2 + +## [0.18.1] — 2023-11-21 + +### New rector +* Add $defaultTheme property if missing on BrowserTestBase by @mglaman in https://github.com/palantirnet/drupal-rector/pull/211 + +### What's Changed +* Update README.md by @bbrala in https://github.com/palantirnet/drupal-rector/pull/264 +* Restructure rules by major and generate rule list (docs) by @bbrala in https://github.com/palantirnet/drupal-rector/pull/267 +* Fix db_query.php expected test. by @bbrala in https://github.com/palantirnet/drupal-rector/pull/268 +* Update README-automated-testing.md by @bbrala in https://github.com/palantirnet/drupal-rector/pull/266 +* Add php-cs-fixer by @bbrala in https://github.com/palantirnet/drupal-rector/pull/265 +* Add $defaultTheme property if missing on BrowserTestBase by @mglaman in https://github.com/palantirnet/drupal-rector/pull/211 + + +**Full Changelog**: https://github.com/palantirnet/drupal-rector/compare/0.18.0...0.18.1 + +[0.18.1]: https://github.com/palantirnet/drupal-rector/releases/tag/0.18.1 + +## [0.18.0] — 2023-11-10 + +### Release highlights +This release of Drupal Rector introduces backwards compatible fixes for new rectors that target deprecations in Drupal 10. This is made possible by using the new `DeprecationHelper` class introduced in Drupal 10.1. + +We also worked on making the code more sustainable by employing `ConfigurableRectorInterface`. This interface allows passing configuration to a rector to set certain variables. This means it is easier to reuse rectors that for example rewrite a function to a static call without introducing new code. + +Rector has also been upgraded from 0.15 to 0.18, bringing a lot of improvement, but also making it harder to add comments to code generated by Rector. This there are instances where the previous version added comments, that the current does not. + +* Support for Drupal 10 deprecations and testing by @bbrala in https://github.com/palantirnet/drupal-rector/pull/252 +* Support for backwards compatible rector rules and version scoping of rules by @bbrala in https://github.com/palantirnet/drupal-rector/pull/250 + +### Upgrade notes + +Because rector moved to Laravel dependency injection a new version of `rector.php` must be copies/configured in your project root. + +### New rectors +* Issue #3354343: Add TwigSetList::TWIG_240 to D9 deprecations. by @m4olivei in https://github.com/palantirnet/drupal-rector/pull/223 +* Add new Rector for system_sort_modules_by_info_name() by @bbrala in https://github.com/palantirnet/drupal-rector/pull/253 +* module_load_install() is deprecated in 9.4 and removed in 10. by @bbrala in https://github.com/palantirnet/drupal-rector/pull/239 +* Implement watchdog_exception rector by @bbrala in https://github.com/palantirnet/drupal-rector/pull/262 +* 9.3 Multiple taxonomy rectors by @bbrala in https://github.com/palantirnet/drupal-rector/pull/254 + +### What's Changed +* Remove NodesToAddCollector by @bbrala in https://github.com/palantirnet/drupal-rector/pull/225 +* Remove dependency on rector-src by @bbrala in https://github.com/palantirnet/drupal-rector/pull/236 +* Update PHPUnit configuration by @agentrickard in https://github.com/palantirnet/drupal-rector/pull/237 +* Phase 1 - Refactor to support Rector 0.17 by @bbrala in https://github.com/palantirnet/drupal-rector/pull/238 +* Simplify codebase: replace EntityLoadBase with configurable rule by @bbrala in https://github.com/palantirnet/drupal-rector/pull/228 +* Refactor AssertLegacyTraitBase and ConstantToClassConstantBase to configurable rule by @bbrala in https://github.com/palantirnet/drupal-rector/pull/229 +* Improve AssertNoFieldByIdRector by @mglaman in https://github.com/palantirnet/drupal-rector/pull/213 +* Create FunctionToServiceRector to replace all function to service call deprecations by @bbrala in https://github.com/palantirnet/drupal-rector/pull/242 +* New StaticToFunctionRector to replace StaticToFunctionBase by @bbrala in https://github.com/palantirnet/drupal-rector/pull/243 +* Remove single use FunctionToImmutableConfigBase by @bbrala in https://github.com/palantirnet/drupal-rector/pull/245 +* StaticArgumentRenameBase and DrupalServiceRenameBase are now covered with StaticArgumentRenameRector by @bbrala in https://github.com/palantirnet/drupal-rector/pull/241 +* New ExtensionPathRector to replace ExtensionPathBase by @bbrala in https://github.com/palantirnet/drupal-rector/pull/244 +* New DBRector to replace DbBase with configurable rector. by @bbrala in https://github.com/palantirnet/drupal-rector/pull/246 +* GetMockRector as configurable rule by @bbrala in https://github.com/palantirnet/drupal-rector/pull/248 +* Upgrade to PHPStan level 6 by @bbrala in https://github.com/palantirnet/drupal-rector/pull/249 +* MethodToMethodWithCheckRector to replace methods with a certainty check by @bbrala in https://github.com/palantirnet/drupal-rector/pull/247 +* Refactor Base\FunctionToStatic to configurable rule. by @bbrala in https://github.com/palantirnet/drupal-rector/pull/251 +* Upgrade to Rector 0.18.x by @bbrala in https://github.com/palantirnet/drupal-rector/pull/240 +* Refactored BC rules with configuration by @bbrala in https://github.com/palantirnet/drupal-rector/pull/255 +* Add better labels to readme by @bbrala in https://github.com/palantirnet/drupal-rector/pull/256 +* Add failing unit test for ExtensionPathRector when assining by @bbrala in https://github.com/palantirnet/drupal-rector/pull/258 +* Add WatchdogExceptionRector the 10.1 setlist by @bbrala in https://github.com/palantirnet/drupal-rector/pull/263 +* PHPUnit deprecations should be checked in Drupal 9 to 10 by @bbrala in https://github.com/palantirnet/drupal-rector/pull/261 +* Fix MethodToMethodWithCheckRector by also matching on MethodCall. by @bbrala in https://github.com/palantirnet/drupal-rector/pull/260 +* ExtensionPathRector does not handle Assignments by @bbrala in https://github.com/palantirnet/drupal-rector/pull/259 + +### New Contributors +* @m4olivei made their first contribution in https://github.com/palantirnet/drupal-rector/pull/223 + +**Full Changelog**: https://github.com/palantirnet/drupal-rector/compare/0.15.1...0.18.0 + +[0.18.0]: https://github.com/palantirnet/drupal-rector/releases/tag/0.18.0 + +## [0.15.1] — 2023-03-23 + +### What's Changed +* Update rector config to resolve bootstrap issues with recent rector releases by @mglaman in https://github.com/palantirnet/drupal-rector/pull/220 +* Update rector config to resolve bootstrap issues with recent rector releases by @goba in https://github.com/palantirnet/drupal-rector/pull/219 + + +**Full Changelog**: https://github.com/palantirnet/drupal-rector/compare/0.15.0...0.15.1 + +[0.15.1]: https://github.com/palantirnet/drupal-rector/releases/tag/0.15.1 + +## [0.15.0] — 2023-01-11 + +### What's Changed +* Update to rector 15 and github setup v3. by @agentrickard in https://github.com/palantirnet/drupal-rector/pull/218 and @FlorentTorregrosa in https://github.com/palantirnet/drupal-rector/pull/217 +* Fix function signature in tests by @chrfritsch in https://github.com/palantirnet/drupal-rector/pull/216 + +### New Contributors +* @chrfritsch made their first contribution in https://github.com/palantirnet/drupal-rector/pull/216 + +**Full Changelog**: https://github.com/palantirnet/drupal-rector/compare/0.13.1...0.15.0 + +[0.15.0]: https://github.com/palantirnet/drupal-rector/releases/tag/0.15.0 + +## [0.13.1] — 2022-08-17 + +### What's Changed +* ProtectedStaticModulesProperty rule by @mglaman in https://github.com/palantirnet/drupal-rector/pull/210 +* Update rector.php so we do not use FQCN's in method arguments by @bbrala in https://github.com/palantirnet/drupal-rector/pull/209 + +### New Contributors +* @bbrala made their first contribution in https://github.com/palantirnet/drupal-rector/pull/209 + +**Full Changelog**: https://github.com/palantirnet/drupal-rector/compare/0.13.0...0.13.1 + +[0.13.1]: https://github.com/palantirnet/drupal-rector/releases/tag/0.13.1 + +## [0.13.0] — 2022-07-15 + +### What's Changed +* #3295386 Bump to rector/rector:0.13.8 by @mglaman in https://github.com/palantirnet/drupal-rector/pull/204 +* Remove unneeded assert for $pathValue by @mglaman in https://github.com/palantirnet/drupal-rector/pull/206 +* Scope may not be available when detecting delcaring source by @mglaman in https://github.com/palantirnet/drupal-rector/pull/207 +* Prevent @doesNotPerformAssertions from being added to tests by @mglaman in https://github.com/palantirnet/drupal-rector/pull/208 + + +**Full Changelog**: https://github.com/palantirnet/drupal-rector/compare/0.12.4...0.13.0 + +[0.13.0]: https://github.com/palantirnet/drupal-rector/releases/tag/0.13.0 + +## [0.12.4] — 2022-06-01 + +### Release notes + +* The 0.12.4 is a stable release pinned to Rector 0.12.21. Developers should be aware that Rector 0.12.22 introduces breaking changes to how we handle Drupal configuration. + +* The 0.12.5 release of drupal-rector will include Rector 0.12.22. The upgrade path should be as simple as re-copying the configuration file. `cp vendor/palantirnet/drupal-rector/rector.php` + +### What's Changed +* Add integration test for user_password() deprecation by @claudiu-cristea in https://github.com/palantirnet/drupal-rector/pull/201 +* Issue #3282217: file_build_uri() is deprecated by @claudiu-cristea in https://github.com/palantirnet/drupal-rector/pull/202 +* Remove remaining Rector conflicts up to 0.12.21 by @mglaman in https://github.com/palantirnet/drupal-rector/pull/203 + +**Full Changelog**: https://github.com/palantirnet/drupal-rector/compare/0.12.3...0.12.4 + +[0.12.4]: https://github.com/palantirnet/drupal-rector/releases/tag/0.12.4 + +## [0.12.3] — 2022-05-24 + +The 0.12.3 release bypasses a known conflict with Rector 0.12.18. The current preferred version is Rector 0.12.19. + +### What's Changed +* Fix PHP 8 warnings on `null` to `file_exists` by @mglaman in https://github.com/palantirnet/drupal-rector/pull/196 +* Issue #3277704: Remove PHPUNIT_75 constant in Rector by @FlorentTorregrosa in https://github.com/palantirnet/drupal-rector/pull/197 +* Issue #3280205: drupalPostForm() with 1st param NULL by @claudiu-cristea in https://github.com/palantirnet/drupal-rector/pull/198 +* user_password() deprecation by @claudiu-cristea in https://github.com/palantirnet/drupal-rector/pull/199 +* Remove conflicts on rector/rector by @mglaman in https://github.com/palantirnet/drupal-rector/pull/200 + +### New Contributors +* @claudiu-cristea made their first contribution in https://github.com/palantirnet/drupal-rector/pull/198 + +**Full Changelog**: https://github.com/palantirnet/drupal-rector/compare/0.12.2...0.12.3 + +[0.12.3]: https://github.com/palantirnet/drupal-rector/releases/tag/0.12.3 + +## [0.12.2] — 2022-05-04 + +### What's Changed +* Mark conflict on rector >=0.12.18 by @mglaman in https://github.com/palantirnet/drupal-rector/pull/195 +**Full Changelog**: https://github.com/palantirnet/drupal-rector/compare/0.12.1...0.12.2 + +[0.12.2]: https://github.com/palantirnet/drupal-rector/releases/tag/0.12.2 + +## [0.12.1] — 2022-02-21 + +Updates Drupal Rector for the most common Drupal 9.3 and 9.4 deprecations. + +* https://www.drupal.org/project/rector/issues/3261614 + +### What's Changed + +* Update composer.json for allow-plugins by @mglaman in https://github.com/palantirnet/drupal-rector/pull/186 +* Rectors for drupal_get_path & drupal_get_filename by @mglaman in https://github.com/palantirnet/drupal-rector/pull/187 +* Handle custom message types by @mglaman in https://github.com/palantirnet/drupal-rector/pull/190 +* Add Rector for deprecated `render` by @mglaman in https://github.com/palantirnet/drupal-rector/pull/188 +* Use dev-main for rector-src by @mglaman in https://github.com/palantirnet/drupal-rector/pull/193 +* Rectors for file_move, file_copy, file_save_data by @mglaman in https://github.com/palantirnet/drupal-rector/pull/189 +* file_url_generator service Rector rules by @mglaman in https://github.com/palantirnet/drupal-rector/pull/191 +* MetadataBag::clearCsrfTokenSeed replaced by stampNew by @mglaman in https://github.com/palantirnet/drupal-rector/pull/192 + +**Full Changelog**: https://github.com/palantirnet/drupal-rector/compare/0.12.0...0.12.1 + +[0.12.1]: https://github.com/palantirnet/drupal-rector/releases/tag/0.12.1 + +## [0.12.0] — 2021-11-19 + +This release updates the codebase to support: + +- PHPStan 1.0 +- Rector 0.12.x + +[0.12.0]: https://github.com/palantirnet/drupal-rector/releases/tag/0.12.0 + +## [0.11.4] — 2021-10-13 + +This is a maintenance release that includes updates to stay compatible with Rector. + +[0.11.4]: https://github.com/palantirnet/drupal-rector/releases/tag/0.11.4 + +## [0.11.3] — 2021-09-03 + +This is a maintenance release that fixes a number of issues and updates the `deprecations-index` for Drupal 9 changes. + +- Cleans up internal function doc mismatches. +- Fix entity_view(), entity_delete_multiple() and EntityTypeInterface::getLowercaseLabel deprecation message +- Issue #3228110: Improve AssertNoUniqueTextRector documentation and scope +- Adds AssertLegacy and other new items to the index. +- Issue #3229896: Fix broken params on assert cache tag Rector rules +- Ensure proper rector install on github ci. +- Issue #3221584: Use "*" over sha for sandbox test +- Issue #3228113: Make PassRector more specific and fix documentation +- Prevents stubs used for testing from breaking end user's PHPUnit tests for Drupal +- Fixes BuildXPathQuery docs. +- Fix REQUEST_TIME deprecation message. Noted by @mglaman +- Issue #3222671: Rector for assertNoFieldByName() +- Issue #3222671: Rector for assertUniqueText() and assertNoUniqueText() +- Issue #3222671: Rector for pass() + +[0.11.3]: https://github.com/palantirnet/drupal-rector/releases/tag/0.11.3 + +## [0.11.2] — 2021-07-29 + +This release corrects an error in Rector 0.11.38 that was fixed in later versions (https://github.com/rectorphp/rector-src/pull/484). + +See https://www.drupal.org/project/rector/issues/3225019 and a hat-tip to `Grimreaper` for reporting and testing this issue. + +[0.11.2]: https://github.com/palantirnet/drupal-rector/releases/tag/0.11.2 + +## [0.11.1] — 2021-07-06 + +The release prepares drupal-rector to handle Drupal 9 deprecations, using PHP 8 and rector v 0.11. + +This release also changes the file structure of the underlying code and introduced PHPUnit testing. + +Note that this version can be run in PHP 7 without PHPUnit, which is not necessary for running rector upgrades on your code. + +This release supports 8.x and 9.x code conversions and can be run with either Drupal 8 or Drupal 9. + +[0.11.1]: https://github.com/palantirnet/drupal-rector/releases/tag/0.11.1 + +## [0.11.0] — 2021-06-30 + +This release brings us up-to-date with Rector 11 and adds support for PHPUnit testing. + +PHPUnit testing requires PHP 8 and is used for development. + +Creating new Rector rules and running the Rector update requires PHP 7 or higher. + +[0.11.0]: https://github.com/palantirnet/drupal-rector/releases/tag/0.11.0 + +## [0.10.0] — 2021-06-23 + +This release updates to Rector version 0.10.0 and prepares for more substantial changes coming to prepare for Drupal 10. + +### Major changes + +- We now use `rector.php` instead of `rector.yml` for configuration. +- Adds PHPStan for static code analysis. +- We are deprecating the Behat tests in favor of PHPUnit (See #152) + +### New rules + +- entity_view + +[0.10.0]: https://github.com/palantirnet/drupal-rector/releases/tag/0.10.0 + +## [0.5.6] — 2020-06-05 + +Summary of updates in this release: + +* 3 new Rector rules: + * DatetimeDateStorageFormatRector + * DatetimeDatetimeStorageFormatRector + * DatetimeStorageTimezoneRector +* Upgrade to rector-prefixed 0.7.27 +* Fix internal Github tests + +[0.5.6]: https://github.com/palantirnet/drupal-rector/releases/tag/0.5.6 + +## [0.5.5] — 2020-05-30 + +Summary of updates in this release: +* Bug fixes for Rector rules +* Running the latest rector-prefixed +* Commented out PHPUnit8 code upgrade option in `rector.yml` +* [Drupal Rector rules documentation](https://github.com/palantirnet/drupal-rector/blob/master/docs/drupal_rector_rules.md) +* Add comments to call out edge cases in Drupal Rector code replacements (this option can be disabled through `rector.yml`) + +[0.5.5]: https://github.com/palantirnet/drupal-rector/releases/tag/0.5.5 + +## [0.5.4] — 2020-05-22 + +Using latest rector-prefixed, which would stop creating diffs with unnecessary indentation fixes. + +Added new Rector rules for the following deprecations: +* FILE_EXISTS_RENAME +* LinkGeneratorTrait::l() +* entity_create() +* SafeMarkup::format() + +[0.5.4]: https://github.com/palantirnet/drupal-rector/releases/tag/0.5.4 + +## [0.5.3] — 2020-05-17 + +Added new Rector rules for the following deprecations: + +* Unicode::strlen +* Unicode::substr +* EntityInterface:link() +* entity_load() +* node_load() +* file_load() +* file_directory_temp +* file_directory_os_temp +* drupal_realpath() +* file_uri_target() + +[0.5.3]: https://github.com/palantirnet/drupal-rector/releases/tag/0.5.3 + +## [0.5.2] — 2020-05-09 + +Added new Rector rules for the following deprecations: + +* db_update() +* file_scan_directory() +* REQUEST_TIME +* entity_get_display +* entity_get_form_display +* file_default_scheme() +* EntityInterface:urlInfo() + +[0.5.2]: https://github.com/palantirnet/drupal-rector/releases/tag/0.5.2 + +## [0.5.1] — 2020-05-04 + +Added new Rector rules for the following deprecations: + +* FILE_MODIFY_PERMISSIONS +* db_delete() + +[0.5.1]: https://github.com/palantirnet/drupal-rector/releases/tag/0.5.1 + +## [0.5.0] — 2020-04-27 + +Added new Rector rules for the following deprecations: + +* file_unmanaged_save_data() + +[0.5.0]: https://github.com/palantirnet/drupal-rector/releases/tag/0.5.0 + +## [0.4.1] — 2020-04-25 + +Rector-prefix 0.7.19 is broken - +Issue: +rectorphp/rector#3256 + +PR to prevent it from happening in the future: +rectorphp/rector#3255 (comment) + +[0.4.1]: https://github.com/palantirnet/drupal-rector/releases/tag/0.4.1 + +## [0.4.0] — 2020-04-17 + +Upgraded to latest Rector (version 0.7.x) + +Added CI test using Github Actions + +Added new Rector rules for the following deprecations: +* format_date +* Unicode::strtolower +* FILE_CREATE_DIRECTORY +* FILE_EXISTS_REPLACE +* Drupal::l() +* drupal_render() +* drupal_render_root() + +[0.4.0]: https://github.com/palantirnet/drupal-rector/releases/tag/0.4.0 + +## [0.3.3] — 2020-04-11 + +Deprecations covered: +``` +drupal_set_message() +entityManager() + Drupal::entityManager() + ControllerBase::entityManager() +db_insert +db_select +db_query +file_prepare_directory() +getMock() + BrowserTestBase::getMock() + KernelTestBase::getMock() + UnitTestCase::getMock() +Drupal::url() +``` + +[0.3.3]: https://github.com/palantirnet/drupal-rector/releases/tag/0.3.3 + +## [0.3.1] — 2020-02-17 + +Renamed package to Drupal-Rector + +[0.3.1]: https://github.com/palantirnet/drupal-rector/releases/tag/0.3.1 + From 0e2211bf378f2875cb15b37b956124d772e968cb Mon Sep 17 00:00:00 2001 From: bjorn Date: Thu, 28 May 2026 09:14:40 +0200 Subject: [PATCH 254/256] feat: convert 2 configurably rectors to support BC path --- CHANGELOG.md | 20 +++ config/drupal-10/drupal-10.2-deprecations.php | 4 +- config/drupal-10/drupal-10.3-deprecations.php | 5 +- config/drupal-11/drupal-11.1-deprecations.php | 2 +- config/drupal-11/drupal-11.2-deprecations.php | 5 +- config/drupal-11/drupal-11.4-deprecations.php | 8 + config/drupal-8/drupal-8.0-deprecations.php | 2 +- config/drupal-8/drupal-8.8-deprecations.php | 2 +- config/drupal-9/drupal-9.1-deprecations.php | 3 + config/drupal-9/drupal-9.2-deprecations.php | 2 +- .../ClassConstantToClassConstantRector.php | 42 +++--- .../MethodToMethodWithCheckRector.php | 140 +++--------------- ...ssConstantToClassConstantConfiguration.php | 13 +- .../MethodToMethodWithCheckConfiguration.php | 14 +- ...ClassConstantToClassConstantRectorTest.php | 16 ++ .../config/configured_rule.php | 18 +++ .../comment_form_location.php.inc | 15 ++ .../filesystem_exists_constants.php.inc | 21 +++ .../fixture/comment_form_location.php.inc | 4 +- .../comment_item_interface_constants.php.inc | 12 +- .../filesystem_exists_constants.php.inc | 6 +- ...stem_manager_requirement_constants.php.inc | 6 +- .../MethodToMethodWithCheckRectorTest.php | 16 ++ .../config/configured_rule.php | 16 +- .../cache_invalidate_all.php.inc | 11 ++ .../renderer_render_plain.php.inc | 15 ++ .../fixture/basic.php.inc | 4 +- .../fixture/cache_invalidate_all.php.inc | 2 +- .../cache_invalidate_all_service.php.inc | 8 +- .../path_alias_whitelist_method.php.inc | 2 +- .../fixture/renderer_render_plain.php.inc | 4 +- .../fixture/renderer_renderer_class.php.inc | 2 +- 32 files changed, 249 insertions(+), 191 deletions(-) create mode 100644 tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/fixture-below-version/comment_form_location.php.inc create mode 100644 tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/fixture-below-version/filesystem_exists_constants.php.inc create mode 100644 tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture-below-version/cache_invalidate_all.php.inc create mode 100644 tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture-below-version/renderer_render_plain.php.inc diff --git a/CHANGELOG.md b/CHANGELOG.md index 639de4fac..3561b5660 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,26 @@ Historical entries (≤ 0.21.2) are reproduced from the they were originally published; their format and level of detail varies release-by-release. +## [Unreleased] + +### Changed + +- `ClassConstantToClassConstantRector` and `MethodToMethodWithCheckRector` now + extend `AbstractDrupalCoreRector` and auto-wrap their `Expr → Expr` rewrites + via `DeprecationHelper::backwardsCompatibleCall()`. Their configuration value + objects (`ClassConstantToClassConstantConfiguration`, + `MethodToMethodWithCheckConfiguration`) gain a required `introducedVersion` + constructor argument and now implement `VersionedConfigurationInterface`. + This closes three D11 → D10 runtime regressions (Comment* enums in 11.4, + `RequirementSeverity` in 11.2, `AliasManager` method rename in 11.1) without + moving anything to a `-breaking.php` set. +- `MethodToMethodWithCheckRector` no longer attaches a "please confirm the + receiver type" TODO comment for the `maybe` type-inference case. The + comment-on-parent-statement mechanism relied on parent-node tracking that + Rector 2.x removed; the BC wrap makes both code paths runtime-safe by + selecting the right call based on `\Drupal::VERSION`, which addresses the + underlying concern. + ## [1.0.0-beta1] — 2026-05-25 First beta of the 1.0 line. Adds full Drupal 11 deprecation coverage (versions 11.0 diff --git a/config/drupal-10/drupal-10.2-deprecations.php b/config/drupal-10/drupal-10.2-deprecations.php index 7ae7aab2a..56fc97257 100644 --- a/config/drupal-10/drupal-10.2-deprecations.php +++ b/config/drupal-10/drupal-10.2-deprecations.php @@ -23,8 +23,8 @@ // https://www.drupal.org/node/3265963 $rectorConfig->ruleWithConfiguration(MethodToMethodWithCheckRector::class, [ - new MethodToMethodWithCheckConfiguration('Drupal\system\Plugin\ImageToolkit\GDToolkit', 'getResource', 'getImage'), - new MethodToMethodWithCheckConfiguration('Drupal\system\Plugin\ImageToolkit\GDToolkit', 'setResource', 'setImage'), + new MethodToMethodWithCheckConfiguration('Drupal\system\Plugin\ImageToolkit\GDToolkit', 'getResource', 'getImage', '10.2.0'), + new MethodToMethodWithCheckConfiguration('Drupal\system\Plugin\ImageToolkit\GDToolkit', 'setResource', 'setImage', '10.2.0'), ]); // https://www.drupal.org/node/3358337 diff --git a/config/drupal-10/drupal-10.3-deprecations.php b/config/drupal-10/drupal-10.3-deprecations.php index f743ed1e3..0e56f826e 100644 --- a/config/drupal-10/drupal-10.3-deprecations.php +++ b/config/drupal-10/drupal-10.3-deprecations.php @@ -18,7 +18,7 @@ // RendererInterface::renderPlain() deprecated in drupal:10.3.0, removed in drupal:12.0.0. // Replaced by RendererInterface::renderInIsolation(). $rectorConfig->ruleWithConfiguration(MethodToMethodWithCheckRector::class, [ - new MethodToMethodWithCheckConfiguration('Drupal\Core\Render\RendererInterface', 'renderPlain', 'renderInIsolation'), + new MethodToMethodWithCheckConfiguration('Drupal\Core\Render\RendererInterface', 'renderPlain', 'renderInIsolation', '10.3.0'), ]); // https://www.drupal.org/node/3411269 file_icon_class, file_icon_map @@ -49,18 +49,21 @@ 'EXISTS_RENAME', 'Drupal\Core\File\FileExists', 'Rename', + '10.3.0', ), new ClassConstantToClassConstantConfiguration( 'Drupal\Core\File\FileSystemInterface', 'EXISTS_REPLACE', 'Drupal\Core\File\FileExists', 'Replace', + '10.3.0', ), new ClassConstantToClassConstantConfiguration( 'Drupal\Core\File\FileSystemInterface', 'EXISTS_ERROR', 'Drupal\Core\File\FileExists', 'Error', + '10.3.0', ), ]); }; diff --git a/config/drupal-11/drupal-11.1-deprecations.php b/config/drupal-11/drupal-11.1-deprecations.php index f10884043..7b8ecb489 100644 --- a/config/drupal-11/drupal-11.1-deprecations.php +++ b/config/drupal-11/drupal-11.1-deprecations.php @@ -37,7 +37,7 @@ 'Drupal\Core\Routing\MatchingRouteNotFoundException' => 'Symfony\Component\Routing\Exception\ResourceNotFoundException', ]); $rectorConfig->ruleWithConfiguration(MethodToMethodWithCheckRector::class, [ - new MethodToMethodWithCheckConfiguration('Drupal\path_alias\AliasManager', 'pathAliasWhitelistRebuild', 'pathAliasPrefixListRebuild'), + new MethodToMethodWithCheckConfiguration('Drupal\path_alias\AliasManager', 'pathAliasWhitelistRebuild', 'pathAliasPrefixListRebuild', '11.1.0'), ]); // https://www.drupal.org/node/3442009 diff --git a/config/drupal-11/drupal-11.2-deprecations.php b/config/drupal-11/drupal-11.2-deprecations.php index e8dac77f2..13657d2e1 100644 --- a/config/drupal-11/drupal-11.2-deprecations.php +++ b/config/drupal-11/drupal-11.2-deprecations.php @@ -47,7 +47,7 @@ // CacheBackendInterface::invalidateAll() deprecated in drupal:11.2.0, removed in drupal:12.0.0. // Replaced by deleteAll(). $rectorConfig->ruleWithConfiguration(MethodToMethodWithCheckRector::class, [ - new MethodToMethodWithCheckConfiguration('Drupal\Core\Cache\CacheBackendInterface', 'invalidateAll', 'deleteAll'), + new MethodToMethodWithCheckConfiguration('Drupal\Core\Cache\CacheBackendInterface', 'invalidateAll', 'deleteAll', '11.2.0'), ]); // https://www.drupal.org/node/3504125 @@ -240,18 +240,21 @@ 'REQUIREMENT_OK', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'OK', + '11.2.0', ), new ClassConstantToClassConstantConfiguration( 'Drupal\system\SystemManager', 'REQUIREMENT_WARNING', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'Warning', + '11.2.0', ), new ClassConstantToClassConstantConfiguration( 'Drupal\system\SystemManager', 'REQUIREMENT_ERROR', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'Error', + '11.2.0', ), ]); }; diff --git a/config/drupal-11/drupal-11.4-deprecations.php b/config/drupal-11/drupal-11.4-deprecations.php index a4b52fdde..c020f0c22 100644 --- a/config/drupal-11/drupal-11.4-deprecations.php +++ b/config/drupal-11/drupal-11.4-deprecations.php @@ -109,48 +109,56 @@ 'FORM_BELOW', 'Drupal\comment\FormLocation', 'Below', + '11.4.0', ), new ClassConstantToClassConstantConfiguration( 'Drupal\comment\Plugin\Field\FieldType\CommentItemInterface', 'FORM_SEPARATE_PAGE', 'Drupal\comment\FormLocation', 'SeparatePage', + '11.4.0', ), new ClassConstantToClassConstantConfiguration( 'Drupal\comment\Plugin\Field\FieldType\CommentItemInterface', 'HIDDEN', 'Drupal\comment\CommentingStatus', 'Hidden', + '11.4.0', ), new ClassConstantToClassConstantConfiguration( 'Drupal\comment\Plugin\Field\FieldType\CommentItemInterface', 'CLOSED', 'Drupal\comment\CommentingStatus', 'Closed', + '11.4.0', ), new ClassConstantToClassConstantConfiguration( 'Drupal\comment\Plugin\Field\FieldType\CommentItemInterface', 'OPEN', 'Drupal\comment\CommentingStatus', 'Open', + '11.4.0', ), new ClassConstantToClassConstantConfiguration( 'Drupal\comment\CommentInterface', 'ANONYMOUS_MAYNOT_CONTACT', 'Drupal\comment\AnonymousContact', 'Forbidden', + '11.4.0', ), new ClassConstantToClassConstantConfiguration( 'Drupal\comment\CommentInterface', 'ANONYMOUS_MAY_CONTACT', 'Drupal\comment\AnonymousContact', 'Allowed', + '11.4.0', ), new ClassConstantToClassConstantConfiguration( 'Drupal\comment\CommentInterface', 'ANONYMOUS_MUST_CONTACT', 'Drupal\comment\AnonymousContact', 'Required', + '11.4.0', ), ]); diff --git a/config/drupal-8/drupal-8.0-deprecations.php b/config/drupal-8/drupal-8.0-deprecations.php index ac787c6a8..bed90f66c 100644 --- a/config/drupal-8/drupal-8.0-deprecations.php +++ b/config/drupal-8/drupal-8.0-deprecations.php @@ -56,7 +56,7 @@ $rectorConfig->ruleWithConfiguration(MethodToMethodWithCheckRector::class, [ // https://www.drupal.org/node/2614344 - new MethodToMethodWithCheckConfiguration('Drupal\Core\Entity\EntityInterface', 'urlInfo', 'toUrl'), + new MethodToMethodWithCheckConfiguration('Drupal\Core\Entity\EntityInterface', 'urlInfo', 'toUrl', '8.0.0'), ]); $rectorConfig->ruleWithConfiguration(EntityLoadRector::class, [ diff --git a/config/drupal-8/drupal-8.8-deprecations.php b/config/drupal-8/drupal-8.8-deprecations.php index ad10ee458..6a42e81f4 100644 --- a/config/drupal-8/drupal-8.8-deprecations.php +++ b/config/drupal-8/drupal-8.8-deprecations.php @@ -43,7 +43,7 @@ $rectorConfig->ruleWithConfiguration(MethodToMethodWithCheckRector::class, [ // https://www.drupal.org/node/3075567 - new MethodToMethodWithCheckConfiguration('Drupal\Core\Entity\EntityTypeInterface', 'getLowercaseLabel', 'getSingularLabel'), + new MethodToMethodWithCheckConfiguration('Drupal\Core\Entity\EntityTypeInterface', 'getLowercaseLabel', 'getSingularLabel', '8.8.0'), ]); // https://www.drupal.org/node/3083055 diff --git a/config/drupal-9/drupal-9.1-deprecations.php b/config/drupal-9/drupal-9.1-deprecations.php index 536fdb495..8878b917d 100644 --- a/config/drupal-9/drupal-9.1-deprecations.php +++ b/config/drupal-9/drupal-9.1-deprecations.php @@ -117,18 +117,21 @@ 'ROUTE_NAME', 'Drupal\Core\Routing\RouteObjectInterface', 'ROUTE_NAME', + '9.1.0', ), new ClassConstantToClassConstantConfiguration( 'Symfony\Cmf\Component\Routing\RouteObjectInterface', 'ROUTE_OBJECT', 'Drupal\Core\Routing\RouteObjectInterface', 'ROUTE_OBJECT', + '9.1.0', ), new ClassConstantToClassConstantConfiguration( 'Symfony\Cmf\Component\Routing\RouteObjectInterface', 'CONTROLLER_NAME', 'Drupal\Core\Routing\RouteObjectInterface', 'CONTROLLER_NAME', + '9.1.0', ), ]); }; diff --git a/config/drupal-9/drupal-9.2-deprecations.php b/config/drupal-9/drupal-9.2-deprecations.php index 3d093076e..a2213ab01 100644 --- a/config/drupal-9/drupal-9.2-deprecations.php +++ b/config/drupal-9/drupal-9.2-deprecations.php @@ -19,6 +19,6 @@ $rectorConfig->ruleWithConfiguration(MethodToMethodWithCheckRector::class, [ // https://www.drupal.org/node/3187914 - new MethodToMethodWithCheckConfiguration('Drupal\Core\Session\MetadataBag', 'clearCsrfTokenSeed', 'stampNew'), + new MethodToMethodWithCheckConfiguration('Drupal\Core\Session\MetadataBag', 'clearCsrfTokenSeed', 'stampNew', '9.2.0'), ]); }; diff --git a/src/Rector/Deprecation/ClassConstantToClassConstantRector.php b/src/Rector/Deprecation/ClassConstantToClassConstantRector.php index 64eed5b6d..2ce0a62ae 100644 --- a/src/Rector/Deprecation/ClassConstantToClassConstantRector.php +++ b/src/Rector/Deprecation/ClassConstantToClassConstantRector.php @@ -4,11 +4,10 @@ namespace DrupalRector\Rector\Deprecation; +use DrupalRector\Contract\VersionedConfigurationInterface; +use DrupalRector\Rector\AbstractDrupalCoreRector; use DrupalRector\Rector\ValueObject\ClassConstantToClassConstantConfiguration; -use DrupalRector\Rector\ValueObject\ConstantToClassConfiguration; use PhpParser\Node; -use Rector\Contract\Rector\ConfigurableRectorInterface; -use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -18,22 +17,17 @@ * What is covered: * - Replacement with a use statement. */ -class ClassConstantToClassConstantRector extends AbstractRector implements ConfigurableRectorInterface +class ClassConstantToClassConstantRector extends AbstractDrupalCoreRector { - /** - * @var ClassConstantToClassConstantConfiguration[] - */ - private array $constantToClassRenames; - public function configure(array $configuration): void { foreach ($configuration as $value) { if (!$value instanceof ClassConstantToClassConstantConfiguration) { - throw new \InvalidArgumentException(sprintf('Each configuration item must be an instance of "%s"', ConstantToClassConfiguration::class)); + throw new \InvalidArgumentException(sprintf('Each configuration item must be an instance of "%s"', ClassConstantToClassConstantConfiguration::class)); } } - $this->constantToClassRenames = $configuration; + parent::configure($configuration); } /** @@ -59,18 +53,21 @@ public function getRuleDefinition(): RuleDefinition 'ROUTE_NAME', 'Drupal\Core\Routing\RouteObjectInterface', 'ROUTE_NAME', + '9.1.0', ), new ClassConstantToClassConstantConfiguration( 'Symfony\Cmf\Component\Routing\RouteObjectInterface', 'ROUTE_OBJECT', 'Drupal\Core\Routing\RouteObjectInterface', 'ROUTE_OBJECT', + '9.1.0', ), new ClassConstantToClassConstantConfiguration( 'Symfony\Cmf\Component\Routing\RouteObjectInterface', 'CONTROLLER_NAME', 'Drupal\Core\Routing\RouteObjectInterface', 'CONTROLLER_NAME', + '9.1.0', ), ] ), @@ -87,24 +84,19 @@ public function getNodeTypes(): array ]; } - /** - * {@inheritdoc} - */ - public function refactor(Node $node): ?Node + protected function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { assert($node instanceof Node\Expr\ClassConstFetch); + assert($configuration instanceof ClassConstantToClassConstantConfiguration); - foreach ($this->constantToClassRenames as $constantToClassRename) { - if ($this->getName($node->name) === $constantToClassRename->getDeprecated() && $this->getName($node->class) === $constantToClassRename->getDeprecatedClass()) { - // We add a fully qualified class name and the parameters in `rector.php` adds the use statement. - $fully_qualified_class = new Node\Name\FullyQualified($constantToClassRename->getClass()); - - $name = new Node\Identifier($constantToClassRename->getConstant()); - - return new Node\Expr\ClassConstFetch($fully_qualified_class, $name); - } + if ($this->getName($node->name) !== $configuration->getDeprecated() || $this->getName($node->class) !== $configuration->getDeprecatedClass()) { + return null; } - return null; + // We add a fully qualified class name and the parameters in `rector.php` adds the use statement. + return new Node\Expr\ClassConstFetch( + new Node\Name\FullyQualified($configuration->getClass()), + new Node\Identifier($configuration->getConstant()) + ); } } diff --git a/src/Rector/Deprecation/MethodToMethodWithCheckRector.php b/src/Rector/Deprecation/MethodToMethodWithCheckRector.php index 0b987540e..588c78a4c 100644 --- a/src/Rector/Deprecation/MethodToMethodWithCheckRector.php +++ b/src/Rector/Deprecation/MethodToMethodWithCheckRector.php @@ -4,12 +4,11 @@ namespace DrupalRector\Rector\Deprecation; +use DrupalRector\Contract\VersionedConfigurationInterface; +use DrupalRector\Rector\AbstractDrupalCoreRector; use DrupalRector\Rector\ValueObject\MethodToMethodWithCheckConfiguration; -use DrupalRector\Services\AddCommentService; use PhpParser\Node; use PHPStan\Type\ObjectType; -use Rector\Contract\Rector\ConfigurableRectorInterface; -use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -17,28 +16,12 @@ * Replaces deprecated method calls with a new method. * * What is covered: - * - Changes the name of the method. - * - * Improvement opportunities: - * - Checks the variable has a certain class. + * - Changes the name of the method when the receiver type can be inferred. + * - Wraps in DeprecationHelper::backwardsCompatibleCall when the introduced + * version warrants BC support. */ -class MethodToMethodWithCheckRector extends AbstractRector implements ConfigurableRectorInterface +class MethodToMethodWithCheckRector extends AbstractDrupalCoreRector { - /** - * @var MethodToMethodWithCheckConfiguration[] - */ - private array $configuration; - - /** - * @var AddCommentService - */ - private AddCommentService $commentService; - - public function __construct(AddCommentService $commentService) - { - $this->commentService = $commentService; - } - public function configure(array $configuration): void { foreach ($configuration as $value) { @@ -47,7 +30,7 @@ public function configure(array $configuration): void } } - $this->configuration = $configuration; + parent::configure($configuration); } /** @@ -55,112 +38,30 @@ public function configure(array $configuration): void */ public function getNodeTypes(): array { - return [ - Node\Stmt\Expression::class, - Node\Expr\MethodCall::class, - ]; + return [Node\Expr\MethodCall::class]; } - /** - * {@inheritdoc} - */ - public function refactor(Node $node): ?Node + protected function refactorWithConfiguration(Node $node, VersionedConfigurationInterface $configuration): ?Node { - assert($node instanceof Node\Stmt\Expression || $node instanceof Node\Expr\MethodCall); + assert($node instanceof Node\Expr\MethodCall); + assert($configuration instanceof MethodToMethodWithCheckConfiguration); - if (!$node instanceof Node\Expr\MethodCall && !$node->expr instanceof Node\Expr\MethodCall && !($node->expr instanceof Node\Expr\Assign && $node->expr->expr instanceof Node\Expr\MethodCall)) { + if ($this->getName($node->name) !== $configuration->getDeprecatedMethodName()) { return null; } - foreach ($this->configuration as $configuration) { - if ($node instanceof Node\Expr\MethodCall && $this->getName($node->name) !== $configuration->getDeprecatedMethodName()) { - continue; - } - - if ($node instanceof Node\Stmt\Expression && $node->expr instanceof Node\Expr\MethodCall && $this->getName($node->expr->name) !== $configuration->getDeprecatedMethodName()) { - continue; - } - - if ($node instanceof Node\Stmt\Expression && $node->expr instanceof Node\Expr\Assign && $node->expr->expr instanceof Node\Expr\MethodCall && $this->getName($node->expr->expr->name) !== $configuration->getDeprecatedMethodName()) { - continue; - } - - if ($node instanceof Node\Expr\MethodCall) { - $methodNode = $this->refactorNode($node, null, $configuration); - if (is_null($methodNode)) { - continue; - } - - return $methodNode; - } - - if ($node->expr instanceof Node\Expr\MethodCall) { - $methodNode = $this->refactorNode($node->expr, $node, $configuration); - if (is_null($methodNode)) { - continue; - } - $node->expr = $methodNode; - } elseif ($node->expr instanceof Node\Expr\Assign && $node->expr->expr instanceof Node\Expr\MethodCall) { - $methodNode = $this->refactorNode($node->expr->expr, $node, $configuration); - if (is_null($methodNode)) { - continue; - } - $node->expr->expr = $methodNode; - } - - return $node; - } - - return null; - } - - public function refactorNode(Node\Expr\MethodCall $node, ?Node\Stmt\Expression $statement, MethodToMethodWithCheckConfiguration $configuration): ?Node\Expr\MethodCall - { $callerType = $this->nodeTypeResolver->getType($node->var); $expectedType = new ObjectType($configuration->getClassName()); $isSuperOf = $expectedType->isSuperTypeOf($callerType); - if ($isSuperOf->yes()) { - $node->name = new Node\Identifier($configuration->getMethodName()); - - return $node; + if (!$isSuperOf->yes() && !$isSuperOf->maybe()) { + return null; } - if ($isSuperOf->maybe()) { - if ($node->var instanceof Node\Expr\Variable) { - $node_var = $node->var->name; - $node_var = "$$node_var"; - } elseif ($node->var instanceof Node\Expr\MethodCall) { - $node_var = $node->var->name; - $node_var = "$node_var()"; - } elseif ($node->var instanceof Node\Expr\StaticCall) { - $class = $node->var->class instanceof Node\Name ? $node->var->class->toString() : '(expression)'; - $method = $node->var->name instanceof Node\Identifier ? $node->var->name->toString() : '(method)'; - $node_var = "$class::$method(...)"; - } elseif ($node->var instanceof Node\Expr\PropertyFetch) { - $obj = $node->var->var instanceof Node\Expr\Variable ? '$'.$node->var->var->name : '(expression)'; - $prop = $node->var->name instanceof Node\Identifier ? $node->var->name->toString() : '(property)'; - $node_var = "$obj->$prop"; - } elseif ($node->var instanceof Node\Expr\NullsafeMethodCall) { - $method = $node->var->name instanceof Node\Identifier ? $node->var->name->toString() : '(method)'; - $node_var = "$method?->()"; - } else { - $node_var = '(expression)'; - } - $className = $configuration->getClassName(); - - if (!is_null($statement)) { - $this->commentService->addDrupalRectorComment( - $statement, - "Please confirm that `$node_var` is an instance of `$className`. Only the method name and not the class name was checked for this replacement, so this may be a false positive." - ); - } - $node->name = new Node\Identifier($configuration->getMethodName()); - - return $node; - } + $newNode = clone $node; + $newNode->name = new Node\Identifier($configuration->getMethodName()); - return null; + return $newNode; } public function getRuleDefinition(): RuleDefinition @@ -179,7 +80,8 @@ public function getRuleDefinition(): RuleDefinition new MethodToMethodWithCheckConfiguration( 'Drupal\Core\Session\MetadataBag', 'clearCsrfTokenSeed', - 'stampNew' + 'stampNew', + '9.2.0', ), ] ), @@ -191,7 +93,7 @@ public function getRuleDefinition(): RuleDefinition $url = $entity->toUrl(); CODE_AFTER, [ - new MethodToMethodWithCheckConfiguration('Drupal\Core\Entity\EntityInterface', 'urlInfo', 'toUrl'), + new MethodToMethodWithCheckConfiguration('Drupal\Core\Entity\EntityInterface', 'urlInfo', 'toUrl', '8.0.0'), ] ), new ConfiguredCodeSample( @@ -208,7 +110,7 @@ public function getRuleDefinition(): RuleDefinition $entity_type->getSingularLabel(); CODE_AFTER, [ - new MethodToMethodWithCheckConfiguration('Drupal\Core\Entity\EntityTypeInterface', 'getLowercaseLabel', 'getSingularLabel'), + new MethodToMethodWithCheckConfiguration('Drupal\Core\Entity\EntityTypeInterface', 'getLowercaseLabel', 'getSingularLabel', '8.8.0'), ] ), ]); diff --git a/src/Rector/ValueObject/ClassConstantToClassConstantConfiguration.php b/src/Rector/ValueObject/ClassConstantToClassConstantConfiguration.php index 24a3d5745..19f26569f 100644 --- a/src/Rector/ValueObject/ClassConstantToClassConstantConfiguration.php +++ b/src/Rector/ValueObject/ClassConstantToClassConstantConfiguration.php @@ -4,9 +4,10 @@ namespace DrupalRector\Rector\ValueObject; +use DrupalRector\Contract\VersionedConfigurationInterface; use Rector\Validation\RectorAssert; -final class ClassConstantToClassConstantConfiguration +final class ClassConstantToClassConstantConfiguration implements VersionedConfigurationInterface { private string $deprecated; private string $class; @@ -14,12 +15,15 @@ final class ClassConstantToClassConstantConfiguration private string $deprecatedClass; - public function __construct(string $deprecatedClass, string $deprecated, string $class, string $constant) + private string $introducedVersion; + + public function __construct(string $deprecatedClass, string $deprecated, string $class, string $constant, string $introducedVersion) { $this->deprecatedClass = $deprecatedClass; $this->deprecated = $deprecated; $this->class = $class; $this->constant = $constant; + $this->introducedVersion = $introducedVersion; RectorAssert::className($deprecatedClass); RectorAssert::className($class); @@ -46,4 +50,9 @@ public function getDeprecatedClass(): string { return $this->deprecatedClass; } + + public function getIntroducedVersion(): string + { + return $this->introducedVersion; + } } diff --git a/src/Rector/ValueObject/MethodToMethodWithCheckConfiguration.php b/src/Rector/ValueObject/MethodToMethodWithCheckConfiguration.php index 4adb280d3..d5fa4b0f0 100644 --- a/src/Rector/ValueObject/MethodToMethodWithCheckConfiguration.php +++ b/src/Rector/ValueObject/MethodToMethodWithCheckConfiguration.php @@ -4,7 +4,9 @@ namespace DrupalRector\Rector\ValueObject; -class MethodToMethodWithCheckConfiguration +use DrupalRector\Contract\VersionedConfigurationInterface; + +class MethodToMethodWithCheckConfiguration implements VersionedConfigurationInterface { protected string $deprecatedMethodName; @@ -12,11 +14,14 @@ class MethodToMethodWithCheckConfiguration protected string $className; - public function __construct(string $className, string $deprecatedMethodName, string $methodName) + protected string $introducedVersion; + + public function __construct(string $className, string $deprecatedMethodName, string $methodName, string $introducedVersion) { $this->className = $className; $this->deprecatedMethodName = $deprecatedMethodName; $this->methodName = $methodName; + $this->introducedVersion = $introducedVersion; } public function getDeprecatedMethodName(): string @@ -33,4 +38,9 @@ public function getClassName(): string { return $this->className; } + + public function getIntroducedVersion(): string + { + return $this->introducedVersion; + } } diff --git a/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/ClassConstantToClassConstantRectorTest.php b/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/ClassConstantToClassConstantRectorTest.php index 6bf37b35a..d1a0c8bff 100644 --- a/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/ClassConstantToClassConstantRectorTest.php +++ b/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/ClassConstantToClassConstantRectorTest.php @@ -4,6 +4,7 @@ namespace DrupalRector\Tests\Rector\Deprecation\ClassConstantToClassConstantRector; +use DrupalRector\Services\DrupalRectorSettings; use DrupalRector\Tests\AbstractDrupalRectorTestCase; use Iterator; @@ -24,6 +25,21 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); + $this->doTestFile($filePath); + } + + /** + * @return Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); + } + public function provideConfigFilePath(): string { // must be implemented diff --git a/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/config/configured_rule.php b/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/config/configured_rule.php index 303b195c9..4a031c861 100644 --- a/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/config/configured_rule.php +++ b/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/config/configured_rule.php @@ -15,30 +15,36 @@ 'FORM_BELOW', 'Drupal\comment\FormLocation', 'Below', + '11.4.0', ), new ClassConstantToClassConstantConfiguration( 'Drupal\comment\Plugin\Field\FieldType\CommentItemInterface', 'FORM_SEPARATE_PAGE', 'Drupal\comment\FormLocation', 'SeparatePage', + '11.4.0', ), + // https://www.drupal.org/node/3151009 (Drupal 9.1) new ClassConstantToClassConstantConfiguration( 'Symfony\Cmf\Component\Routing\RouteObjectInterface', 'ROUTE_NAME', 'Drupal\Core\Routing\RouteObjectInterface', 'ROUTE_NAME', + '9.1.0', ), new ClassConstantToClassConstantConfiguration( 'Symfony\Cmf\Component\Routing\RouteObjectInterface', 'ROUTE_OBJECT', 'Drupal\Core\Routing\RouteObjectInterface', 'ROUTE_OBJECT', + '9.1.0', ), new ClassConstantToClassConstantConfiguration( 'Symfony\Cmf\Component\Routing\RouteObjectInterface', 'CONTROLLER_NAME', 'Drupal\Core\Routing\RouteObjectInterface', 'CONTROLLER_NAME', + '9.1.0', ), // https://www.drupal.org/node/3574661 (Drupal 11.4) new ClassConstantToClassConstantConfiguration( @@ -46,36 +52,42 @@ 'HIDDEN', 'Drupal\comment\CommentingStatus', 'Hidden', + '11.4.0', ), new ClassConstantToClassConstantConfiguration( 'Drupal\comment\Plugin\Field\FieldType\CommentItemInterface', 'CLOSED', 'Drupal\comment\CommentingStatus', 'Closed', + '11.4.0', ), new ClassConstantToClassConstantConfiguration( 'Drupal\comment\Plugin\Field\FieldType\CommentItemInterface', 'OPEN', 'Drupal\comment\CommentingStatus', 'Open', + '11.4.0', ), new ClassConstantToClassConstantConfiguration( 'Drupal\comment\CommentInterface', 'ANONYMOUS_MAYNOT_CONTACT', 'Drupal\comment\AnonymousContact', 'Forbidden', + '11.4.0', ), new ClassConstantToClassConstantConfiguration( 'Drupal\comment\CommentInterface', 'ANONYMOUS_MAY_CONTACT', 'Drupal\comment\AnonymousContact', 'Allowed', + '11.4.0', ), new ClassConstantToClassConstantConfiguration( 'Drupal\comment\CommentInterface', 'ANONYMOUS_MUST_CONTACT', 'Drupal\comment\AnonymousContact', 'Required', + '11.4.0', ), // https://www.drupal.org/node/3575575 (Drupal 10.3) new ClassConstantToClassConstantConfiguration( @@ -83,18 +95,21 @@ 'EXISTS_RENAME', 'Drupal\Core\File\FileExists', 'Rename', + '10.3.0', ), new ClassConstantToClassConstantConfiguration( 'Drupal\Core\File\FileSystemInterface', 'EXISTS_REPLACE', 'Drupal\Core\File\FileExists', 'Replace', + '10.3.0', ), new ClassConstantToClassConstantConfiguration( 'Drupal\Core\File\FileSystemInterface', 'EXISTS_ERROR', 'Drupal\Core\File\FileExists', 'Error', + '10.3.0', ), // https://www.drupal.org/node/3575841 (Drupal 11.2) new ClassConstantToClassConstantConfiguration( @@ -102,18 +117,21 @@ 'REQUIREMENT_OK', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'OK', + '11.2.0', ), new ClassConstantToClassConstantConfiguration( 'Drupal\system\SystemManager', 'REQUIREMENT_WARNING', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'Warning', + '11.2.0', ), new ClassConstantToClassConstantConfiguration( 'Drupal\system\SystemManager', 'REQUIREMENT_ERROR', 'Drupal\Core\Extension\Requirement\RequirementSeverity', 'Error', + '11.2.0', ), ]); }; diff --git a/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/fixture-below-version/comment_form_location.php.inc b/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/fixture-below-version/comment_form_location.php.inc new file mode 100644 index 000000000..d14f0f162 --- /dev/null +++ b/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/fixture-below-version/comment_form_location.php.inc @@ -0,0 +1,15 @@ + +----- + diff --git a/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/fixture-below-version/filesystem_exists_constants.php.inc b/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/fixture-below-version/filesystem_exists_constants.php.inc new file mode 100644 index 000000000..611ae98e4 --- /dev/null +++ b/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/fixture-below-version/filesystem_exists_constants.php.inc @@ -0,0 +1,21 @@ +copy($src, $dst, FileSystemInterface::EXISTS_RENAME); + $fileSystem->move($src, $dst, FileSystemInterface::EXISTS_REPLACE); + $fileSystem->saveData($data, $dst, FileSystemInterface::EXISTS_ERROR); +} +?> +----- +copy($src, $dst, FileSystemInterface::EXISTS_RENAME); + $fileSystem->move($src, $dst, FileSystemInterface::EXISTS_REPLACE); + $fileSystem->saveData($data, $dst, FileSystemInterface::EXISTS_ERROR); +} +?> diff --git a/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/fixture/comment_form_location.php.inc b/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/fixture/comment_form_location.php.inc index 95aed87f4..b9318e0bc 100644 --- a/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/fixture/comment_form_location.php.inc +++ b/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/fixture/comment_form_location.php.inc @@ -10,6 +10,6 @@ $other = CommentItemInterface::FORM_SEPARATE_PAGE; use Drupal\comment\Plugin\Field\FieldType\CommentItemInterface; -$location = \Drupal\comment\FormLocation::Below; -$other = \Drupal\comment\FormLocation::SeparatePage; +$location = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal\comment\FormLocation::Below, fn() => CommentItemInterface::FORM_BELOW); +$other = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal\comment\FormLocation::SeparatePage, fn() => CommentItemInterface::FORM_SEPARATE_PAGE); ?> diff --git a/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/fixture/comment_item_interface_constants.php.inc b/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/fixture/comment_item_interface_constants.php.inc index b0a86e29d..19e3243f6 100644 --- a/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/fixture/comment_item_interface_constants.php.inc +++ b/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/fixture/comment_item_interface_constants.php.inc @@ -16,10 +16,10 @@ $required = CommentInterface::ANONYMOUS_MUST_CONTACT; use Drupal\comment\Plugin\Field\FieldType\CommentItemInterface; use Drupal\comment\CommentInterface; -$status = \Drupal\comment\CommentingStatus::Hidden; -$closed = \Drupal\comment\CommentingStatus::Closed; -$open = \Drupal\comment\CommentingStatus::Open; -$forbidden = \Drupal\comment\AnonymousContact::Forbidden; -$allowed = \Drupal\comment\AnonymousContact::Allowed; -$required = \Drupal\comment\AnonymousContact::Required; +$status = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal\comment\CommentingStatus::Hidden, fn() => CommentItemInterface::HIDDEN); +$closed = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal\comment\CommentingStatus::Closed, fn() => CommentItemInterface::CLOSED); +$open = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal\comment\CommentingStatus::Open, fn() => CommentItemInterface::OPEN); +$forbidden = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal\comment\AnonymousContact::Forbidden, fn() => CommentInterface::ANONYMOUS_MAYNOT_CONTACT); +$allowed = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal\comment\AnonymousContact::Allowed, fn() => CommentInterface::ANONYMOUS_MAY_CONTACT); +$required = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.4.0', fn() => \Drupal\comment\AnonymousContact::Required, fn() => CommentInterface::ANONYMOUS_MUST_CONTACT); ?> diff --git a/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/fixture/filesystem_exists_constants.php.inc b/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/fixture/filesystem_exists_constants.php.inc index 6da291247..2deac287c 100644 --- a/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/fixture/filesystem_exists_constants.php.inc +++ b/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/fixture/filesystem_exists_constants.php.inc @@ -14,8 +14,8 @@ function example($fileSystem, $src, $dst, $data) { use Drupal\Core\File\FileSystemInterface; function example($fileSystem, $src, $dst, $data) { - $fileSystem->copy($src, $dst, \Drupal\Core\File\FileExists::Rename); - $fileSystem->move($src, $dst, \Drupal\Core\File\FileExists::Replace); - $fileSystem->saveData($data, $dst, \Drupal\Core\File\FileExists::Error); + $fileSystem->copy($src, $dst, \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '10.3.0', fn() => \Drupal\Core\File\FileExists::Rename, fn() => FileSystemInterface::EXISTS_RENAME)); + $fileSystem->move($src, $dst, \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '10.3.0', fn() => \Drupal\Core\File\FileExists::Replace, fn() => FileSystemInterface::EXISTS_REPLACE)); + $fileSystem->saveData($data, $dst, \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '10.3.0', fn() => \Drupal\Core\File\FileExists::Error, fn() => FileSystemInterface::EXISTS_ERROR)); } ?> diff --git a/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/fixture/system_manager_requirement_constants.php.inc b/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/fixture/system_manager_requirement_constants.php.inc index 51c5f784a..d72e93e1a 100644 --- a/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/fixture/system_manager_requirement_constants.php.inc +++ b/tests/src/Rector/Deprecation/ClassConstantToClassConstantRector/fixture/system_manager_requirement_constants.php.inc @@ -14,8 +14,8 @@ function example() { use Drupal\system\SystemManager; function example() { - $requirements['check']['severity'] = \Drupal\Core\Extension\Requirement\RequirementSeverity::OK; - $requirements['check']['severity'] = \Drupal\Core\Extension\Requirement\RequirementSeverity::Warning; - $requirements['check']['severity'] = \Drupal\Core\Extension\Requirement\RequirementSeverity::Error; + $requirements['check']['severity'] = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => \Drupal\Core\Extension\Requirement\RequirementSeverity::OK, fn() => SystemManager::REQUIREMENT_OK); + $requirements['check']['severity'] = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => \Drupal\Core\Extension\Requirement\RequirementSeverity::Warning, fn() => SystemManager::REQUIREMENT_WARNING); + $requirements['check']['severity'] = \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => \Drupal\Core\Extension\Requirement\RequirementSeverity::Error, fn() => SystemManager::REQUIREMENT_ERROR); } ?> diff --git a/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/MethodToMethodWithCheckRectorTest.php b/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/MethodToMethodWithCheckRectorTest.php index 606fe0d59..24867e25e 100644 --- a/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/MethodToMethodWithCheckRectorTest.php +++ b/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/MethodToMethodWithCheckRectorTest.php @@ -4,6 +4,7 @@ namespace DrupalRector\Tests\Rector\Deprecation\MethodToMethodWithCheckRector; +use DrupalRector\Services\DrupalRectorSettings; use DrupalRector\Tests\AbstractDrupalRectorTestCase; use Iterator; @@ -24,6 +25,21 @@ public static function provideData(): \Iterator return self::yieldFilesFromDirectory(__DIR__.'/fixture'); } + #[\PHPUnit\Framework\Attributes\DataProvider('provideDataBelowVersion')] + public function testBelowVersion(string $filePath): void + { + static::getContainer()->make(DrupalRectorSettings::class)->setDrupalVersion('1.0.0'); + $this->doTestFile($filePath); + } + + /** + * @return Iterator<> + */ + public static function provideDataBelowVersion(): \Iterator + { + return self::yieldFilesFromDirectory(__DIR__.'/fixture-below-version'); + } + public function provideConfigFilePath(): string { // must be implemented diff --git a/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/config/configured_rule.php b/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/config/configured_rule.php index 4d5053bc6..e023819ec 100644 --- a/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/config/configured_rule.php +++ b/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/config/configured_rule.php @@ -8,13 +8,13 @@ use Rector\Config\RectorConfig; return static function (RectorConfig $rectorConfig): void { - DeprecationBase::addClass(MethodToMethodWithCheckRector::class, $rectorConfig, true, [ - new MethodToMethodWithCheckConfiguration('Drupal\Core\Session\MetadataBag', 'clearCsrfTokenSeed', 'stampNew'), - new MethodToMethodWithCheckConfiguration('Drupal\Core\Entity\EntityInterface', 'urlInfo', 'toUrl'), - new MethodToMethodWithCheckConfiguration('Drupal\system\Plugin\ImageToolkit\GDToolkit', 'getResource', 'getImage'), - new MethodToMethodWithCheckConfiguration('Drupal\system\Plugin\ImageToolkit\GDToolkit', 'setResource', 'setImage'), - new MethodToMethodWithCheckConfiguration('Drupal\path_alias\AliasManager', 'pathAliasWhitelistRebuild', 'pathAliasPrefixListRebuild'), - new MethodToMethodWithCheckConfiguration('Drupal\Core\Cache\CacheBackendInterface', 'invalidateAll', 'deleteAll'), - new MethodToMethodWithCheckConfiguration('Drupal\Core\Render\RendererInterface', 'renderPlain', 'renderInIsolation'), + DeprecationBase::addClass(MethodToMethodWithCheckRector::class, $rectorConfig, false, [ + new MethodToMethodWithCheckConfiguration('Drupal\Core\Session\MetadataBag', 'clearCsrfTokenSeed', 'stampNew', '9.2.0'), + new MethodToMethodWithCheckConfiguration('Drupal\Core\Entity\EntityInterface', 'urlInfo', 'toUrl', '8.0.0'), + new MethodToMethodWithCheckConfiguration('Drupal\system\Plugin\ImageToolkit\GDToolkit', 'getResource', 'getImage', '10.2.0'), + new MethodToMethodWithCheckConfiguration('Drupal\system\Plugin\ImageToolkit\GDToolkit', 'setResource', 'setImage', '10.2.0'), + new MethodToMethodWithCheckConfiguration('Drupal\path_alias\AliasManager', 'pathAliasWhitelistRebuild', 'pathAliasPrefixListRebuild', '11.1.0'), + new MethodToMethodWithCheckConfiguration('Drupal\Core\Cache\CacheBackendInterface', 'invalidateAll', 'deleteAll', '11.2.0'), + new MethodToMethodWithCheckConfiguration('Drupal\Core\Render\RendererInterface', 'renderPlain', 'renderInIsolation', '10.3.0'), ]); }; diff --git a/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture-below-version/cache_invalidate_all.php.inc b/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture-below-version/cache_invalidate_all.php.inc new file mode 100644 index 000000000..83fd06e5c --- /dev/null +++ b/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture-below-version/cache_invalidate_all.php.inc @@ -0,0 +1,11 @@ +invalidateAll(); +?> +----- +invalidateAll(); +?> diff --git a/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture-below-version/renderer_render_plain.php.inc b/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture-below-version/renderer_render_plain.php.inc new file mode 100644 index 000000000..a5c75d48a --- /dev/null +++ b/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture-below-version/renderer_render_plain.php.inc @@ -0,0 +1,15 @@ + 'Hello']; + $renderer->renderPlain($elements); +} +?> +----- + 'Hello']; + $renderer->renderPlain($elements); +} +?> diff --git a/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture/basic.php.inc b/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture/basic.php.inc index c4d2afddc..9845bf8e6 100644 --- a/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture/basic.php.inc +++ b/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture/basic.php.inc @@ -25,7 +25,7 @@ function simple_example() { $form_state->setRedirectUrl($untranslated_entity->toUrl('canonical')); $toolkit = new \Drupal\system\Plugin\ImageToolkit\GDToolkit; - $toolkit->getImage(); - $toolkit->setImage(); + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '10.2.0', fn() => $toolkit->getImage(), fn() => $toolkit->getResource()); + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '10.2.0', fn() => $toolkit->setImage(), fn() => $toolkit->setResource()); } ?> diff --git a/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture/cache_invalidate_all.php.inc b/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture/cache_invalidate_all.php.inc index dead84d92..f4d4a5cb3 100644 --- a/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture/cache_invalidate_all.php.inc +++ b/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture/cache_invalidate_all.php.inc @@ -7,5 +7,5 @@ $cache->invalidateAll(); deleteAll(); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => $cache->deleteAll(), fn() => $cache->invalidateAll()); ?> diff --git a/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture/cache_invalidate_all_service.php.inc b/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture/cache_invalidate_all_service.php.inc index d37d30842..bc63809cf 100644 --- a/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture/cache_invalidate_all_service.php.inc +++ b/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture/cache_invalidate_all_service.php.inc @@ -7,11 +7,7 @@ Drupal::service('cache.render')->invalidateAll(); ----- deleteAll(); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => \Drupal::service('cache.render')->deleteAll(), fn() => \Drupal::service('cache.render')->invalidateAll()); -// TODO: Drupal Rector Notice: Please delete the following comment after you've made any necessary changes. -// Please confirm that `Drupal::service(...)` is an instance of `Drupal\Core\Cache\CacheBackendInterface`. Only the method name and not the class name was checked for this replacement, so this may be a false positive. -Drupal::service('cache.render')->deleteAll(); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => Drupal::service('cache.render')->deleteAll(), fn() => Drupal::service('cache.render')->invalidateAll()); ?> diff --git a/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture/path_alias_whitelist_method.php.inc b/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture/path_alias_whitelist_method.php.inc index 448190455..5f46d5547 100644 --- a/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture/path_alias_whitelist_method.php.inc +++ b/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture/path_alias_whitelist_method.php.inc @@ -7,5 +7,5 @@ $alias_manager->pathAliasWhitelistRebuild($path); pathAliasPrefixListRebuild($path); +\Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.1.0', fn() => $alias_manager->pathAliasPrefixListRebuild($path), fn() => $alias_manager->pathAliasWhitelistRebuild($path)); ?> diff --git a/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture/renderer_render_plain.php.inc b/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture/renderer_render_plain.php.inc index 4e2068d5b..3de7f29ac 100644 --- a/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture/renderer_render_plain.php.inc +++ b/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture/renderer_render_plain.php.inc @@ -20,7 +20,7 @@ function service_locator_example() { // DI with RendererInterface type hint (constructor injection). function di_interface_example(\Drupal\Core\Render\RendererInterface $renderer) { $elements = ['#markup' => 'Hello']; - $renderer->renderInIsolation($elements); + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '10.3.0', fn() => $renderer->renderInIsolation($elements), fn() => $renderer->renderPlain($elements)); } // \Drupal::service() with @var RendererInterface docblock. @@ -28,6 +28,6 @@ function service_locator_example() { /** @var \Drupal\Core\Render\RendererInterface $renderer */ $renderer = \Drupal::service('renderer'); $elements = ['#markup' => 'Hello']; - $renderer->renderInIsolation($elements); + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '10.3.0', fn() => $renderer->renderInIsolation($elements), fn() => $renderer->renderPlain($elements)); } ?> diff --git a/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture/renderer_renderer_class.php.inc b/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture/renderer_renderer_class.php.inc index a6b48076f..3fec4369c 100644 --- a/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture/renderer_renderer_class.php.inc +++ b/tests/src/Rector/Deprecation/MethodToMethodWithCheckRector/fixture/renderer_renderer_class.php.inc @@ -10,6 +10,6 @@ function renderer_class_example(\Drupal\Core\Render\Renderer $renderer) { function renderer_class_example(\Drupal\Core\Render\Renderer $renderer) { $elements = ['#markup' => 'Hello']; - $renderer->renderInIsolation($elements); + \Drupal\Component\Utility\DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '10.3.0', fn() => $renderer->renderInIsolation($elements), fn() => $renderer->renderPlain($elements)); } ?> From 5c8943c63628f9522c16b3ca1552f3851edb1691 Mon Sep 17 00:00:00 2001 From: bjorn Date: Wed, 27 May 2026 15:26:08 +0200 Subject: [PATCH 255/256] test(HookConvertRector): fix construction after rector 2.4.5 ExprAnalyzer change MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit rector/rector 2.4.5 (PR rectorphp/rector-src#8006) added a NodeNameResolver constructor argument to Rector\NodeAnalyzer\ExprAnalyzer, breaking the manual instantiation of BetterStandardPrinter in HookConvertRectorTest::setUp(). getLegacyHookFunction() never touches the printer, so bypass the constructor with ReflectionClass::newInstanceWithoutConstructor() rather than tracking upstream's transitive dependency chain (NodeNameResolver → ClassNaming / CallAnalyzer → ReflectionProvider). --- .../Convert/HookConvertRector/HookConvertRectorTest.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tests/src/Rector/Convert/HookConvertRector/HookConvertRectorTest.php b/tests/src/Rector/Convert/HookConvertRector/HookConvertRectorTest.php index d05b5807f..95390375d 100644 --- a/tests/src/Rector/Convert/HookConvertRector/HookConvertRectorTest.php +++ b/tests/src/Rector/Convert/HookConvertRector/HookConvertRectorTest.php @@ -12,9 +12,7 @@ use PhpParser\Node\Stmt\Function_; use PhpParser\ParserFactory; use PHPUnit\Framework\TestCase; -use Rector\NodeAnalyzer\ExprAnalyzer; use Rector\PhpParser\Printer\BetterStandardPrinter; -use Rector\Util\Reflection\PrivatesAccessor; class HookConvertRectorTest extends TestCase { @@ -22,7 +20,11 @@ class HookConvertRectorTest extends TestCase protected function setUp(): void { - $printer = new BetterStandardPrinter(new ExprAnalyzer(), new PrivatesAccessor()); + // getLegacyHookFunction() doesn't use the printer; bypassing the + // constructor avoids rector's internal dependency chain (>=2.4.5 + // ExprAnalyzer now requires NodeNameResolver, which transitively + // needs ReflectionProvider). + $printer = (new \ReflectionClass(BetterStandardPrinter::class))->newInstanceWithoutConstructor(); $this->rector = new HookConvertRector($printer); $ref = new \ReflectionClass($this->rector); From 2356fd3f2787064b6467d91f1d40e30cabef7332 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Brala?= Date: Fri, 29 May 2026 20:12:47 +0200 Subject: [PATCH 256/256] Revise CHANGELOG for Rector updates Updated CHANGELOG to reflect changes in Rector's functionality and configuration requirements. --- CHANGELOG.md | 42 ++++++++++++++++++++---------------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3561b5660..954b508e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,28 +14,10 @@ release-by-release. ### Changed -- `ClassConstantToClassConstantRector` and `MethodToMethodWithCheckRector` now - extend `AbstractDrupalCoreRector` and auto-wrap their `Expr → Expr` rewrites - via `DeprecationHelper::backwardsCompatibleCall()`. Their configuration value - objects (`ClassConstantToClassConstantConfiguration`, - `MethodToMethodWithCheckConfiguration`) gain a required `introducedVersion` - constructor argument and now implement `VersionedConfigurationInterface`. - This closes three D11 → D10 runtime regressions (Comment* enums in 11.4, - `RequirementSeverity` in 11.2, `AliasManager` method rename in 11.1) without - moving anything to a `-breaking.php` set. -- `MethodToMethodWithCheckRector` no longer attaches a "please confirm the - receiver type" TODO comment for the `maybe` type-inference case. The - comment-on-parent-statement mechanism relied on parent-node tracking that - Rector 2.x removed; the BC wrap makes both code paths runtime-safe by - selecting the right call based on `\Drupal::VERSION`, which addresses the - underlying concern. - -## [1.0.0-beta1] — 2026-05-25 - -First beta of the 1.0 line. Adds full Drupal 11 deprecation coverage (versions 11.0 -through 11.4), a new container-managed settings service that gives users explicit -control over backward-compatibility wrapping, a documented set of Claude Code skills -for building further rectors, and drops support for Rector 1. +This will be the first beta of the 1.0 line. Adds full Drupal 11 deprecation coverage +(versions 11.0 through 11.4), a new container-managed settings service that gives users +explicit control over backward-compatibility wrapping, a documented set of Claude Code +skills for building further rectors, and drops support for Rector 1. Real-world validated end-to-end: @@ -294,6 +276,22 @@ configs. ### Changed + +- `ClassConstantToClassConstantRector` and `MethodToMethodWithCheckRector` now + extend `AbstractDrupalCoreRector` and auto-wrap their `Expr → Expr` rewrites + via `DeprecationHelper::backwardsCompatibleCall()`. Their configuration value + objects (`ClassConstantToClassConstantConfiguration`, + `MethodToMethodWithCheckConfiguration`) gain a required `introducedVersion` + constructor argument and now implement `VersionedConfigurationInterface`. + This closes three D11 → D10 runtime regressions (Comment* enums in 11.4, + `RequirementSeverity` in 11.2, `AliasManager` method rename in 11.1) without + moving anything to a `-breaking.php` set. +- `MethodToMethodWithCheckRector` no longer attaches a "please confirm the + receiver type" TODO comment for the `maybe` type-inference case. The + comment-on-parent-statement mechanism relied on parent-node tracking that + Rector 2.x removed; the BC wrap makes both code paths runtime-safe by + selecting the right call based on `\Drupal::VERSION`, which addresses the + underlying concern. - **Shipped `rector.php` disables BC wrapping by default.** New users get clean one-version rewrites out of the box. Contrib modules and projects that need to run on multiple Drupal versions should call `->enableBackwardCompatibility()`