Page MenuHomePhabricator

D12605.id30269.diff
No OneTemporary

D12605.id30269.diff

diff --git a/src/lint/linter/ArcanistXHPASTLinter.php b/src/lint/linter/ArcanistXHPASTLinter.php
--- a/src/lint/linter/ArcanistXHPASTLinter.php
+++ b/src/lint/linter/ArcanistXHPASTLinter.php
@@ -61,6 +61,7 @@
const LINT_INNER_FUNCTION = 59;
const LINT_DEFAULT_PARAMETERS = 60;
const LINT_LOWERCASE_FUNCTIONS = 61;
+ const LINT_CLASS_NAME_LITERAL = 62;
private $blacklistedFunctions = array();
private $naminghook;
@@ -191,6 +192,8 @@
=> pht('Default Parameters'),
self::LINT_LOWERCASE_FUNCTIONS
=> pht('Lowercase Functions'),
+ self::LINT_CLASS_NAME_LITERAL
+ => pht('Class Name Literal'),
);
}
@@ -240,6 +243,7 @@
self::LINT_INNER_FUNCTION => $warning,
self::LINT_DEFAULT_PARAMETERS => $warning,
self::LINT_LOWERCASE_FUNCTIONS => $advice,
+ self::LINT_CLASS_NAME_LITERAL => $advice,
);
}
@@ -307,7 +311,7 @@
public function getVersion() {
// The version number should be incremented whenever a new rule is added.
- return '24';
+ return '25';
}
protected function resolveFuture($path, Future $future) {
@@ -395,6 +399,7 @@
'lintInnerFunctions' => self::LINT_INNER_FUNCTION,
'lintDefaultParameters' => self::LINT_DEFAULT_PARAMETERS,
'lintLowercaseFunctions' => self::LINT_LOWERCASE_FUNCTIONS,
+ 'lintClassNameLiteral' => self::LINT_CLASS_NAME_LITERAL,
);
foreach ($method_codes as $method => $codes) {
@@ -3727,6 +3732,37 @@
}
}
+ private function lintClassNameLiteral(XHPASTNode $root) {
+ $class_declarations = $root->selectDescendantsOfType('n_CLASS_DECLARATION');
+
+ foreach ($class_declarations as $class_declaration) {
+ $class_name = $class_declaration
+ ->getChildOfType(1, 'n_CLASS_NAME')
+ ->getConcreteString();
+
+ $strings = $class_declaration->selectDescendantsOfType('n_STRING_SCALAR');
+
+ foreach ($strings as $string) {
+ $contents = substr($string->getSemanticString(), 1, -1);
+ $replacement = null;
+
+ if ($contents == $class_name) {
+ $replacement = '__CLASS__';
+ }
+
+ if (strpos($contents, $class_name) === false) {
+ continue;
+ }
+
+ $this->raiseLintAtNode(
+ $string,
+ self::LINT_CLASS_NAME_LITERAL,
+ pht("Don't hardcode class names."),
+ $replacement);
+ }
+ }
+ }
+
/**
* Retrieve all calls to some specified function(s).
*
diff --git a/src/lint/linter/__tests__/xhpast/class-name-literal.lint-test b/src/lint/linter/__tests__/xhpast/class-name-literal.lint-test
new file mode 100644
--- /dev/null
+++ b/src/lint/linter/__tests__/xhpast/class-name-literal.lint-test
@@ -0,0 +1,25 @@
+<?php
+class MyClass {
+ public function someMethod() {
+ return 'MyClass';
+ }
+
+ public function someOtherMethod() {
+ return 'MyClass is awesome';
+ }
+}
+~~~~~~~~~~
+error:2:7
+advice:4:12
+advice:8:12
+~~~~~~~~~~
+<?php
+class MyClass {
+ public function someMethod() {
+ return __CLASS__;
+ }
+
+ public function someOtherMethod() {
+ return 'MyClass is awesome';
+ }
+}

File Metadata

Mime Type
text/plain
Expires
Wed, May 22, 12:37 PM (3 w, 3 d ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
6305874
Default Alt Text
D12605.id30269.diff (3 KB)

Event Timeline