Skip to content

Commit

Permalink
Merge pull request #11137 from davejtoews/bugfix-v4-textcollector-traits
Browse files Browse the repository at this point in the history
FIX Handle __TRAIT__ in i18nTextCollector
  • Loading branch information
GuySartorelli authored Feb 14, 2024
2 parents c406029 + 51fd1d6 commit 621be04
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 5 deletions.
10 changes: 5 additions & 5 deletions src/i18n/TextCollection/i18nTextCollector.php
Original file line number Diff line number Diff line change
Expand Up @@ -625,14 +625,14 @@ public function collectFromCode($content, $fileName, Module $module)
}
}

// Check class
if ($id === T_CLASS) {
// Check class and trait
if ($id === T_CLASS || $id === T_TRAIT) {
// Skip if previous token was '::'. E.g. 'Object::class'
if (is_array($previousToken) && $previousToken[0] === T_DOUBLE_COLON) {
if ($inSelf) {
// Handle self::class by allowing logic further down
// for __CLASS__ to handle an array of class parts
$id = T_CLASS_C;
// for __CLASS__/__TRAIT__ to handle an array of class parts
$id = $id === T_TRAIT ? T_TRAIT_C : T_CLASS_C;
$inSelf = false;
} elseif ($potentialClassName) {
$id = T_CONSTANT_ENCAPSED_STRING;
Expand Down Expand Up @@ -722,7 +722,7 @@ function ($input) {
} else {
throw new LogicException("Invalid string escape: " . $text);
}
} elseif ($id === T_CLASS_C) {
} elseif ($id === T_CLASS_C || $id === T_TRAIT_C) {
// Evaluate __CLASS__ . '.KEY' and self::class concatenation
$text = implode('\\', $currentClass);
} else {
Expand Down
33 changes: 33 additions & 0 deletions tests/php/i18n/i18nTextCollectorTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -407,6 +407,39 @@ public function pointlessFunction4()
);
}

public function testCollectFromTrait()
{
$c = i18nTextCollector::create();
$mymodule = ModuleLoader::inst()->getManifest()->getModule('i18ntestmodule');
$php = <<<PHP
<?php
namespace SilverStripe\Framework\Core;
use SilverStripe\ORM\DataObject;
class MyTrait extends Base implements SomeService {
public function getNewLines(\$class) {
if (
!is_subclass_of(\$class, DataObject::class)
|| !Object::has_extension(\$class, \SilverStripe\Versioned\Versioned::class)
) {
return null;
}
return _t(
__TRAIT__.'.NEWLINES',
'New Lines'
);
}
}
PHP;
$this->assertEquals(
[
'SilverStripe\\Framework\\Core\\MyTrait.NEWLINES' => "New Lines",
],
$c->collectFromCode($php, null, $mymodule)
);
}

public function testNewlinesInEntityValues()
{
$c = i18nTextCollector::create();
Expand Down

0 comments on commit 621be04

Please sign in to comment.