drupal-rector icon indicating copy to clipboard operation
drupal-rector copied to clipboard

Draft Add HookConvert

Open nlighteneddesign opened this issue 1 year ago • 15 comments

Description

Explain the technical implementation of the work done.

To Test

  • Add steps to test this feature

Drupal.org issue

Provide a link to the issue from https://www.drupal.org/project/rector/issues. If no issue exists, please create one and link to this PR.

nlighteneddesign avatar Oct 17 '24 20:10 nlighteneddesign

Thanks for working on this. A few things.

We don't need the whole config and setlist changes. We just need the rule, and we need some unit tests to cover the fule (hopefully those will work).

If this wont work, we need to add somefunctional testing, but lets try and avoid that. Unit tests are superior.

I'll push a few changes to help out (hopefully you allowed maintainer edits on the fork)

bbrala avatar Oct 20 '24 09:10 bbrala

I think we will need a new way to test this, since this also creates extra files. Not sure yet how, but i have some ideas.

bbrala avatar Oct 20 '24 10:10 bbrala

What you could do it create a few before and after files somewhere and share those. Perhaps a simple module would do with a few hooks that would be converted. I have a plan for functionally testing that. :)

bbrala avatar Oct 20 '24 10:10 bbrala

How would I run this locally? Since the last three commits it does not execute against core locally now. I think it's from 5fdfdbb1ee887a95b5c20fe926557a9c81e3d884

nlighteneddesign avatar Oct 21 '24 13:10 nlighteneddesign

You need to do the following steps:

composer config repositories.nlighteneddesign vcs https://github.com/nlighteneddesign/drupal-rector
composer require palantirnet/drupal-rector:dev-rectorOOPHooks

Then create a file rector.php with:

<?php

declare(strict_types=1);

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?
  $rectorConfig->rule(\DrupalRector\Rector\Convert\HookConvertRector::class);

  if (class_exists('DrupalFinder\DrupalFinderComposerRuntime')) {
    $drupalFinder = new \DrupalFinder\DrupalFinderComposerRuntime();
  } else {
    $drupalFinder = new \DrupalFinder\DrupalFinder();
    $drupalFinder->locateRoot(__DIR__);
  }
  $drupalRoot = $drupalFinder->getDrupalRoot();
  $rectorConfig->autoloadPaths([
    $drupalRoot . '/core',
    $drupalRoot . '/modules',
    $drupalRoot . '/profiles',
    $drupalRoot . '/themes'
  ]);

  $rectorConfig->skip(['*/upgrade_status/tests/modules/*']);
  $rectorConfig->fileExtensions(['php', 'module', 'theme', 'install', 'profile', 'inc', 'engine']);
  $rectorConfig->importNames(true, false);
  $rectorConfig->importShortClasses(false);
};

Then just run rector

vendor/bin/rector process core/modules/user/ --dry-run

bbrala avatar Oct 21 '24 14:10 bbrala

Magic ^^

image

bbrala avatar Oct 21 '24 14:10 bbrala

You could also use $rectorConfig->importShortClasses(true); so it will use imports for class names, but this will also mean you will get extra changes, like \Drupal::Xxx becomes Drupal::Xxx with an import.

bbrala avatar Oct 21 '24 14:10 bbrala

Thanks! I'll try that.

nlighteneddesign avatar Oct 21 '24 14:10 nlighteneddesign

That worked, but it's expanding all class names even with $rectorConfig->importShortClasses(true);

public function help($route_name, \Drupal\Core\Routing\RouteMatchInterface $route_match)

Any other changes? The older version was importing them as expected if you review the user conversion issue: https://git.drupalcode.org/project/drupal/-/merge_requests/9890/diffs

nlighteneddesign avatar Oct 21 '24 15:10 nlighteneddesign

importNames might help there. Che k the docs of that method.

bbrala avatar Oct 21 '24 16:10 bbrala

A rebase would be great since that would fixup the tests.

bbrala avatar Oct 25 '24 11:10 bbrala

Rebased and fixed codestyle and some glaring phpstan issues.

bbrala avatar Oct 26 '24 11:10 bbrala

phpstan is wrong this is a php-parser v4 codebase not a v5 one. It doesn't work with v5 , I tried already.

chx avatar Oct 26 '24 18:10 chx

@bbrala we had to revert your last two commits cause it broke the core vs contrib detection as well as some conversions

nlighteneddesign avatar Oct 26 '24 18:10 nlighteneddesign

Sorry :) thanks.

bbrala avatar Oct 26 '24 18:10 bbrala

THink everything kinda works now, did quite some work to get tests running.

Only question i have; do we really need the final thing? Seems it is final anyways, so why bother? It trips up phpstan :x

bbrala avatar Jan 17 '25 16:01 bbrala

Thank you for your help! I am testing it against webform now, I will post links to compare when done.

Unfortunately we do want to keep that final bit, we sed the final off that class in my helper script so we can format arrays properly.

nlighteneddesign avatar Jan 17 '25 16:01 nlighteneddesign

Didnt get LegacyHook detection to work, although i think it should. Need to debug with real install instead on tests, but cannot do that right now. There is a comment in the class that is a hint how it should work.

The bigpipe seems all good tbh. So thats a good thing, and all without the custom printer ;)

bbrala avatar Jan 18 '25 21:01 bbrala

Merged, thanks all! Maybe create a new PR to work on how we will toggle the BC part of this code.

bbrala avatar May 12 '25 07:05 bbrala