Commit c79f285c authored by Zoltan Attila Horvath's avatar Zoltan Attila Horvath Committed by Zoltan Attila Horvath
Browse files

Issue #3277823 by huzooka: Self references in camouflage classes should be replaced with FQCN

parent 745e71a0
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -128,7 +128,7 @@ final class ClassCamouflage {
    // statement.
    $classes_in_use_statements =
      array_merge(
        [ClassCamouflageTokenParser::getName($camouflage_tokens)],
        [$name = ClassCamouflageTokenParser::getName($camouflage_tokens)],
        ClassCamouflageTokenParser::getClassNamesFromUseStatements($camouflage_tokens)
    );
    $classes_with_direct_usage = ClassCamouflageTokenParser::getClassNamesWithDirectUsage($camouflage_tokens);
@@ -195,6 +195,14 @@ final class ClassCamouflage {
      );
    }

    // Replace every occurrence of the original relative self class name with a
    // fully qualified class name.
    foreach ($classes_with_direct_usage as $key => $cn) {
      if ($cn === $name) {
        $camouflage_tokens[$key] = '\\' . $original_namespace . '\\' . $name;
      }
    }

    // If there are classes in the file, then we must ensure they are declared
    // as abstract.
    if ($class_index = ClassCamouflageTokenParser::getNameIndex($camouflage_tokens, T_CLASS)) {
@@ -211,6 +219,7 @@ final class ClassCamouflage {
            'abstract',
          ];
        }

        $remaining_tokens = ClassCamouflageTokenParser::getTokensBetween($remaining_tokens, $class_index + 1);
      } while ($class_index = ClassCamouflageTokenParser::getNameIndex($remaining_tokens, T_CLASS));
    }
+3 −3
Original line number Diff line number Diff line
@@ -266,15 +266,15 @@ class ClassCamouflageTokenParser {
      }

      if (self::mayBeRelativeClassNameReference($tokens, $key)) {
        $du_classnames[$token[1]] = $token[1];
        $du_classnames[$key] = $token[1];
      }
      elseif (($tokens[$key - 2][0] ?? NULL) === T_INSTANCEOF) {
        // Token is used in an instanceof check.
        $du_classnames[$token[1]] = $token[1];
        $du_classnames[$key] = $token[1];
      }
      // Token is a single type declaration (in function argument).
      elseif (self::tokenIsRelativeTypeDeclaration($tokens, $key)) {
        $du_classnames[$token[1]] = $token[1];
        $du_classnames[$key] = $token[1];
      }
    }

+6 −0
Original line number Diff line number Diff line
name: Crema Interface Override Test
type: module
package: Testing
class_replacements:
  'Drupal\user\Entity\User': 'src/user/User.php'
  'Drupal\user\UserInterface': 'src/user/UserInterface.php'
+19 −0
Original line number Diff line number Diff line
<?php

namespace Crema\user\Entity;

use Drupal\user\Entity\User as OriginalUser;

/**
 * Class override.
 */
class User extends OriginalUser {

  /**
   * {@inheritdoc}
   */
  public function forgetInitialEmail(): void {
    $this->set('init', $this->getEmail());
  }

}
+17 −0
Original line number Diff line number Diff line
<?php

namespace Crema\user;

use Drupal\user\UserInterface as OriginalUserInterface;

/**
 * Interface override.
 */
interface UserInterface extends OriginalUserInterface {

  /**
   * User forgets initial email.
   */
  public function forgetInitialEmail(): void;

}
Loading