Page MenuHomePhabricator

D12472.diff
No OneTemporary

D12472.diff

diff --git a/src/lint/linter/ArcanistBaseXHPASTLinter.php b/src/lint/linter/ArcanistBaseXHPASTLinter.php
--- a/src/lint/linter/ArcanistBaseXHPASTLinter.php
+++ b/src/lint/linter/ArcanistBaseXHPASTLinter.php
@@ -196,6 +196,35 @@
return idx($this->exceptions, $path);
}
+
+/* -( Utility )------------------------------------------------------------ */
+
+ /**
+ * Retrieve all calls to some specified function(s).
+ *
+ * Returns all descendant nodes which represent a function call to one of the
+ * specified functions.
+ *
+ * @param XHPASTNode Root node.
+ * @param list<string> Function names.
+ * @return AASTNodeList
+ */
+ protected function getFunctionCalls(XHPASTNode $root, array $function_names) {
+ $calls = $root->selectDescendantsOfType('n_FUNCTION_CALL');
+ $nodes = array();
+
+ foreach ($calls as $call) {
+ $node = $call->getChildByIndex(0);
+ $name = strtolower($node->getConcreteString());
+
+ if (in_array($name, $function_names)) {
+ $nodes[] = $call;
+ }
+ }
+
+ return AASTNodeList::newFromTreeAndNodes($root->getTree(), $nodes);
+ }
+
public function getSuperGlobalNames() {
return array(
'$GLOBALS',
diff --git a/src/lint/linter/ArcanistPhutilXHPASTLinter.php b/src/lint/linter/ArcanistPhutilXHPASTLinter.php
--- a/src/lint/linter/ArcanistPhutilXHPASTLinter.php
+++ b/src/lint/linter/ArcanistPhutilXHPASTLinter.php
@@ -21,21 +21,6 @@
'linter is intended for use in Phabricator libraries and extensions.');
}
- public function setDeprecatedFunctions(array $map) {
- $this->deprecatedFunctions = $map;
- return $this;
- }
-
- public function setDynamicStringFunctions(array $map) {
- $this->dynamicStringFunctions = $map;
- return $this;
- }
-
- public function setDynamicStringClasses(array $map) {
- $this->dynamicStringClasses = $map;
- return $this;
- }
-
public function getLintNameMap() {
return array(
self::LINT_ARRAY_COMBINE => pht(
@@ -49,16 +34,6 @@
);
}
- public function getLintSeverityMap() {
- $warning = ArcanistLintSeverity::SEVERITY_WARNING;
- return array(
- self::LINT_ARRAY_COMBINE => $warning,
- self::LINT_DEPRECATED_FUNCTION => $warning,
- self::LINT_UNSAFE_DYNAMIC_STRING => $warning,
- self::LINT_RAGGED_CLASSTREE_EDGE => $warning,
- );
- }
-
public function getLinterName() {
return 'PHLXHP';
}
@@ -67,9 +42,15 @@
return 'phutil-xhpast';
}
- public function getVersion() {
- // The version number should be incremented whenever a new rule is added.
- return '3';
+ public function getLintSeverityMap() {
+ $warning = ArcanistLintSeverity::SEVERITY_WARNING;
+
+ return array(
+ self::LINT_ARRAY_COMBINE => $warning,
+ self::LINT_DEPRECATED_FUNCTION => $warning,
+ self::LINT_UNSAFE_DYNAMIC_STRING => $warning,
+ self::LINT_RAGGED_CLASSTREE_EDGE => $warning,
+ );
}
public function getLinterConfigurationOptions() {
@@ -107,9 +88,15 @@
case 'phutil-xhpast.dynamic-string.classes':
$this->setDynamicStringClasses($value);
return;
+ default:
+ parent::setLinterConfigurationValue($key, $value);
+ return;
}
+ }
- return parent::setLinterConfigurationValue($key, $value);
+ public function getVersion() {
+ // The version number should be incremented whenever a new rule is added.
+ return '3';
}
protected function resolveFuture($path, Future $future) {
@@ -137,6 +124,27 @@
}
}
+
+/* -( Setters )------------------------------------------------------------ */
+
+ public function setDeprecatedFunctions(array $map) {
+ $this->deprecatedFunctions = $map;
+ return $this;
+ }
+
+ public function setDynamicStringClasses(array $map) {
+ $this->dynamicStringClasses = $map;
+ return $this;
+ }
+
+ public function setDynamicStringFunctions(array $map) {
+ $this->dynamicStringFunctions = $map;
+ return $this;
+ }
+
+
+/* -( Linter Rules )------------------------------------------------------- */
+
private function lintUnsafeDynamicString(XHPASTNode $root) {
$safe = $this->dynamicStringFunctions + array(
'pht' => 0,
@@ -206,40 +214,42 @@
}
private function lintArrayCombine(XHPASTNode $root) {
- $function_calls = $root->selectDescendantsOfType('n_FUNCTION_CALL');
+ $function_calls = $this->getFunctionCalls($root, array('array_combine'));
+
foreach ($function_calls as $call) {
$name = $call->getChildByIndex(0)->getConcreteString();
- if (strcasecmp($name, 'array_combine') == 0) {
- $parameter_list = $call->getChildOfType(1, 'n_CALL_PARAMETER_LIST');
- if (count($parameter_list->getChildren()) !== 2) {
- // Wrong number of parameters, but raise that elsewhere if we want.
- continue;
- }
+ $parameter_list = $call->getChildOfType(1, 'n_CALL_PARAMETER_LIST');
- $first = $parameter_list->getChildByIndex(0);
- $second = $parameter_list->getChildByIndex(1);
-
- if ($first->getConcreteString() == $second->getConcreteString()) {
- $this->raiseLintAtNode(
- $call,
- self::LINT_ARRAY_COMBINE,
- pht(
- 'Prior to PHP 5.4, `%s` fails when given empty arrays. '.
- 'Prefer to write `%s` as `%s`.',
- 'array_combine()',
- 'array_combine(x, x)',
- 'array_fuse(x)'));
- }
+ if (count($parameter_list->getChildren()) !== 2) {
+ // Wrong number of parameters, but raise that elsewhere if we want.
+ continue;
+ }
+
+ $first = $parameter_list->getChildByIndex(0);
+ $second = $parameter_list->getChildByIndex(1);
+
+ if ($first->getConcreteString() == $second->getConcreteString()) {
+ $this->raiseLintAtNode(
+ $call,
+ self::LINT_ARRAY_COMBINE,
+ pht(
+ 'Prior to PHP 5.4, `%s` fails when given empty arrays. '.
+ 'Prefer to write `%s` as `%s`.',
+ 'array_combine()',
+ 'array_combine(x, x)',
+ 'array_fuse(x)'));
}
}
}
private function lintDeprecatedFunctions(XHPASTNode $root) {
$map = $this->deprecatedFunctions;
+ $function_calls = $this->getFunctionCalls($root, array_keys($map));
- $function_calls = $root->selectDescendantsOfType('n_FUNCTION_CALL');
foreach ($function_calls as $call) {
- $name = $call->getChildByIndex(0)->getConcreteString();
+ $name = $call
+ ->getChildByIndex(0)
+ ->getConcreteString();
$name = strtolower($name);
if (empty($map[$name])) {
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
@@ -4298,31 +4298,4 @@
}
}
-
- /**
- * Retrieve all calls to some specified function(s).
- *
- * Returns all descendant nodes which represent a function call to one of the
- * specified functions.
- *
- * @param XHPASTNode Root node.
- * @param list<string> Function names.
- * @return AASTNodeList
- */
- protected function getFunctionCalls(XHPASTNode $root, array $function_names) {
- $calls = $root->selectDescendantsOfType('n_FUNCTION_CALL');
- $nodes = array();
-
- foreach ($calls as $call) {
- $node = $call->getChildByIndex(0);
- $name = strtolower($node->getConcreteString());
-
- if (in_array($name, $function_names)) {
- $nodes[] = $call;
- }
- }
-
- return AASTNodeList::newFromTreeAndNodes($root->getTree(), $nodes);
- }
-
}

File Metadata

Mime Type
text/plain
Expires
Wed, Mar 19, 3:35 AM (3 d, 11 h ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7634293
Default Alt Text
D12472.diff (7 KB)

Event Timeline