1
0
Fork 0
mirror of https://we.phorge.it/source/arcanist.git synced 2024-09-16 15:08:49 +02:00

Arc liberate: support traits

Summary:
Looks like this is all that's needed?

Ref T15751

Test Plan:
R12 has some scenarios for testing this.
Also ran `arc liberate --clean` on arc and phorge repos, and the generated map did not change.

Reviewers: O1 Blessed Committers, valerio.bozzolan

Reviewed By: O1 Blessed Committers, valerio.bozzolan

Subscribers: tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Maniphest Tasks: T15751

Differential Revision: https://we.phorge.it/D25551
This commit is contained in:
Aviv Eyal 2024-03-15 10:49:33 +02:00
parent 7c5e607e97
commit f6261dc614
3 changed files with 32 additions and 21 deletions

View file

@ -332,11 +332,16 @@ final class PhutilLibraryMapBuilder extends Phobject {
'xmap' => array(),
);
$type_translation = array(
'interface' => 'class',
'trait' => 'class',
);
// Detect duplicate symbols within the library.
foreach ($symbol_map as $file => $info) {
foreach ($info['have'] as $type => $symbols) {
foreach ($symbols as $symbol => $declaration) {
$lib_type = ($type == 'interface') ? 'class' : $type;
$lib_type = idx($type_translation, $type, $type);
if (!empty($library_map[$lib_type][$symbol])) {
$prior = $library_map[$lib_type][$symbol];
throw new Exception(

View file

@ -398,6 +398,12 @@ final class PhutilSymbolLoader {
}
private static function classLikeExists($name) {
return class_exists($name, false) ||
interface_exists($name, false) ||
trait_exists($name, false);
}
/**
* @task internal
*/
@ -411,7 +417,7 @@ final class PhutilSymbolLoader {
return;
}
} else {
if (class_exists($name, false) || interface_exists($name, false)) {
if (self::classLikeExists($name)) {
return;
}
}
@ -431,7 +437,7 @@ final class PhutilSymbolLoader {
$load_failed = pht('function');
}
} else {
if (!class_exists($name, false) && !interface_exists($name, false)) {
if (!self::classLikeExists($name)) {
$load_failed = pht('class or interface');
}
}

View file

@ -112,18 +112,6 @@ foreach ($namespaces as $namespace) {
$namespace, $path, pht('namespace `%s` statements', 'use'));
}
$possible_traits = $root->selectDescendantsOfType('n_CLASS_DECLARATION');
foreach ($possible_traits as $possible_trait) {
$attributes = $possible_trait->getChildByIndex(0);
// Can't use getChildByIndex here because not all classes have attributes
foreach ($attributes->getChildren() as $attribute) {
if (strtolower($attribute->getConcreteString()) === 'trait') {
phutil_fail_on_unsupported_feature($possible_trait, $path, pht('traits'));
}
}
}
// -( Marked Externals )------------------------------------------------------
@ -256,17 +244,29 @@ foreach ($calls as $call) {
// Find classes declared by this file.
// This is "class X ... { ... }".
$classes = $root->selectDescendantsOfType('n_CLASS_DECLARATION');
foreach ($classes as $class) {
$class_name = $class->getChildByIndex(1);
$have[] = array(
'type' => 'class',
function build_have_element_for_class_declaration(XHPASTNode $class_node) {
$class_name = $class_node->getChildByIndex(1);
$type = 'class';
$attributes = $class_node->getChildByIndex(0);
foreach ($attributes->getChildren() as $attribute) {
if (strtolower($attribute->getConcreteString()) === 'trait') {
$type = 'trait';
}
}
return array(
'type' => $type,
'symbol' => $class_name,
);
}
$classes = $root->selectDescendantsOfType('n_CLASS_DECLARATION');
foreach ($classes as $class) {
$have[] = build_have_element_for_class_declaration($class);
}
// Find classes used by this file. We identify these:
//