mirror of
https://we.phorge.it/source/arcanist.git
synced 2025-02-22 11:39:03 +01:00
Lint libraries without __init__
Summary: After D2207. Test Plan: `arc lint` on D2208. `arc lint` on mistyped class name. Reviewers: epriestley Reviewed By: epriestley CC: aran, Koolvin Maniphest Tasks: T1103 Differential Revision: https://secure.phabricator.com/D2306
This commit is contained in:
parent
9c4c1de512
commit
cc1e4d4676
1 changed files with 48 additions and 25 deletions
|
@ -86,6 +86,11 @@ final class ArcanistPhutilModuleLinter extends ArcanistLinter {
|
|||
return $info['module'];
|
||||
}
|
||||
|
||||
private function isModuleStandalone($key) {
|
||||
$info = $this->moduleInfo[$key];
|
||||
return $info['standalone'];
|
||||
}
|
||||
|
||||
private function isPhutilLibraryMetadata($path) {
|
||||
$file = basename($path);
|
||||
return !strncmp('__phutil_library_', $file, strlen('__phutil_library_'));
|
||||
|
@ -123,14 +128,16 @@ final class ArcanistPhutilModuleLinter extends ArcanistLinter {
|
|||
if ($path == $library_root) {
|
||||
continue;
|
||||
}
|
||||
$map = PhutilBootloader::getInstance()->getLibraryMap($library_name);
|
||||
$module_name = Filesystem::readablePath($path, $library_root);
|
||||
$module_key = $library_name.':'.$module_name;
|
||||
if (empty($modules[$module_key])) {
|
||||
$modules[$module_key] = $module_key;
|
||||
$this->setModuleInfo($module_key, array(
|
||||
'library' => $library_name,
|
||||
'root' => $library_root,
|
||||
'module' => $module_name,
|
||||
'library' => $library_name,
|
||||
'root' => $library_root,
|
||||
'module' => $module_name,
|
||||
'standalone' => !empty($map['standalone']),
|
||||
));
|
||||
}
|
||||
}
|
||||
|
@ -169,6 +176,10 @@ final class ArcanistPhutilModuleLinter extends ArcanistLinter {
|
|||
foreach ($requirements as $key => $requirement) {
|
||||
foreach ($requirement['messages'] as $message) {
|
||||
list($where, $text, $code, $description) = $message;
|
||||
if ($this->isModuleStandalone($key) &&
|
||||
$code == self::LINT_ANALYZER_NO_INIT) {
|
||||
continue;
|
||||
}
|
||||
if ($where) {
|
||||
$where = array($where);
|
||||
}
|
||||
|
@ -186,10 +197,12 @@ final class ArcanistPhutilModuleLinter extends ArcanistLinter {
|
|||
} else {
|
||||
list($library_name, $module_name) = explode(':', $req_module);
|
||||
$library_root = phutil_get_library_root($library_name);
|
||||
$map = PhutilBootloader::getInstance()->getLibraryMap($library_name);
|
||||
$this->setModuleInfo($req_module, array(
|
||||
'library' => $library_name,
|
||||
'root' => $library_root,
|
||||
'module' => $module_name,
|
||||
'library' => $library_name,
|
||||
'root' => $library_root,
|
||||
'module' => $module_name,
|
||||
'standalone' => !empty($map['standalone']),
|
||||
));
|
||||
$disk_path = $this->getModulePathOnDisk($req_module);
|
||||
if (Filesystem::pathExists($disk_path)) {
|
||||
|
@ -235,13 +248,15 @@ final class ArcanistPhutilModuleLinter extends ArcanistLinter {
|
|||
$name,
|
||||
$deps);
|
||||
if (!$declared) {
|
||||
$module = $this->getModuleDisplayName($key);
|
||||
$message = $this->raiseLintInModule(
|
||||
$key,
|
||||
$lint_code,
|
||||
"Module '{$module}' uses {$type} '{$name}' but does not include ".
|
||||
"any module which declares it.",
|
||||
$places);
|
||||
if (!$this->isModuleStandalone($key)) {
|
||||
$module = $this->getModuleDisplayName($key);
|
||||
$message = $this->raiseLintInModule(
|
||||
$key,
|
||||
$lint_code,
|
||||
"Module '{$module}' uses {$type} '{$name}' but does not include ".
|
||||
"any module which declares it.",
|
||||
$places);
|
||||
}
|
||||
|
||||
if ($type == 'class' || $type == 'interface') {
|
||||
$loader = new PhutilSymbolLoader();
|
||||
|
@ -259,8 +274,10 @@ final class ArcanistPhutilModuleLinter extends ArcanistLinter {
|
|||
$loaded = false;
|
||||
}
|
||||
if ($loaded) {
|
||||
$resolvable[] = $message;
|
||||
$need_classes[$name] = $class_spec;
|
||||
if (!$this->isModuleStandalone($key)) {
|
||||
$resolvable[] = $message;
|
||||
$need_classes[$name] = $class_spec;
|
||||
}
|
||||
} else {
|
||||
if (empty($this->unknownClasses[$name])) {
|
||||
$this->unknownClasses[$name] = true;
|
||||
|
@ -302,8 +319,12 @@ final class ArcanistPhutilModuleLinter extends ArcanistLinter {
|
|||
$loaded = false;
|
||||
}
|
||||
if ($loaded) {
|
||||
$resolvable[] = $message;
|
||||
$need_functions[$name] = $func_spec;
|
||||
// TODO: Check if the function is loaded in
|
||||
// __phutil_library_init__.php for standalone modules.
|
||||
if (!$this->isModuleStandalone($key)) {
|
||||
$resolvable[] = $message;
|
||||
$need_functions[$name] = $func_spec;
|
||||
}
|
||||
} else {
|
||||
if (empty($this->unknownFunctions[$name])) {
|
||||
$this->unknownFunctions[$name] = true;
|
||||
|
@ -360,14 +381,16 @@ final class ArcanistPhutilModuleLinter extends ArcanistLinter {
|
|||
}
|
||||
}
|
||||
|
||||
foreach ($spec['declares']['source'] as $file => $ignored) {
|
||||
if (empty($spec['requires']['source'][$file])) {
|
||||
$module = $this->getModuleDisplayName($key);
|
||||
$resolvable[] = $this->raiseLintInModule(
|
||||
$key,
|
||||
self::LINT_UNUSED_SOURCE,
|
||||
"Module '{$module}' does not include source file '{$file}'.",
|
||||
null);
|
||||
if (!$this->isModuleStandalone($key)) {
|
||||
foreach ($spec['declares']['source'] as $file => $ignored) {
|
||||
if (empty($spec['requires']['source'][$file])) {
|
||||
$module = $this->getModuleDisplayName($key);
|
||||
$resolvable[] = $this->raiseLintInModule(
|
||||
$key,
|
||||
self::LINT_UNUSED_SOURCE,
|
||||
"Module '{$module}' does not include source file '{$file}'.",
|
||||
null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue