1
0
Fork 0
mirror of https://we.phorge.it/source/arcanist.git synced 2024-11-25 08:12:40 +01:00

Implement lint check that filename matches only declared interface/class.

Differential Revision: 201593
Reviewed By: epriestley
This commit is contained in:
adonohue 2011-01-14 14:28:01 -08:00
parent 59f48f7901
commit 026a322dd2
4 changed files with 49 additions and 0 deletions

View file

@ -38,6 +38,8 @@ class ArcanistXHPASTLinter extends ArcanistLinter {
const LINT_TODO_COMMENT = 16; const LINT_TODO_COMMENT = 16;
const LINT_EXIT_EXPRESSION = 17; const LINT_EXIT_EXPRESSION = 17;
const LINT_COMMENT_STYLE = 18; const LINT_COMMENT_STYLE = 18;
const LINT_CLASS_FILENAME_MISMATCH = 19;
public function getLintNameMap() { public function getLintNameMap() {
return array( return array(
@ -59,6 +61,7 @@ class ArcanistXHPASTLinter extends ArcanistLinter {
self::LINT_TODO_COMMENT => 'TODO Comment', self::LINT_TODO_COMMENT => 'TODO Comment',
self::LINT_EXIT_EXPRESSION => 'Exit Used as Expression', self::LINT_EXIT_EXPRESSION => 'Exit Used as Expression',
self::LINT_COMMENT_STYLE => 'Comment Style', self::LINT_COMMENT_STYLE => 'Comment Style',
self::LINT_CLASS_FILENAME_MISMATCH => 'Class-Filename Mismatch',
); );
} }
@ -128,6 +131,7 @@ class ArcanistXHPASTLinter extends ArcanistLinter {
$this->lintUndeclaredVariables($root); $this->lintUndeclaredVariables($root);
$this->lintArrayIndexWhitespace($root); $this->lintArrayIndexWhitespace($root);
$this->lintHashComments($root); $this->lintHashComments($root);
$this->lintPrimaryDeclarationFilenameMatch($root);
} }
protected function lintHashComments($root) { protected function lintHashComments($root) {
@ -880,6 +884,48 @@ class ArcanistXHPASTLinter extends ArcanistLinter {
} }
} }
/**
* Lint that if the file declares exactly one interface or class,
* the name of the file matches the name of the class,
* unless the classname is funky like an XHP element.
*/
private function lintPrimaryDeclarationFilenameMatch($root) {
$classes = $root->selectDescendantsOfType('n_CLASS_DECLARATION');
$interfaces = $root->selectDescendantsOfType('n_INTERFACE_DECLARATION');
if (count($classes) + count($interfaces) != 1) {
return;
}
$declarations = count($classes) ? $classes : $interfaces;
$declarations->rewind();
$declaration = $declarations->current();
$decl_name = $declaration->getChildByIndex(1);
$decl_string = $decl_name->getConcreteString();
//Exclude strangely named classes.
if (!preg_match('/\w+/', $decl_string)) {
return;
}
$rename = $decl_string.'.php';
$path = $this->getActivePath();
$filename = basename($path);
if ($rename == $filename) {
return;
}
$this->raiseLintAtNode(
$decl_name,
self::LINT_CLASS_FILENAME_MISMATCH,
"The name of this file differs from the name of the class or interface ".
"it declares. Rename the file to '{$rename}'."
);
}
protected function raiseLintAtToken( protected function raiseLintAtToken(
XHPASTToken $token, XHPASTToken $token,
$code, $code,

View file

@ -35,6 +35,7 @@ warning:14:10
warning:14:19 warning:14:19
warning:15:12 warning:15:12
warning:15:15 warning:15:15
error:16:7 XHP19 Class-Filename Mismatch
warning:17:21 warning:17:21
warning:17:24 warning:17:24
warning:20:10 warning:20:10

View file

@ -5,4 +5,5 @@ class Platypus {
} }
} }
~~~~~~~~~~ ~~~~~~~~~~
error:2:7 XHP19 Class-Filename Mismatch
error:3:19 error:3:19

View file

@ -10,4 +10,5 @@ class A {
} }
~~~~~~~~~~ ~~~~~~~~~~
error:3:7 XHP19 Class-Filename Mismatch
error:8:5 Use of $this in a static method. error:8:5 Use of $this in a static method.