Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F15370181
D20857.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
4 KB
Referenced Files
None
Subscribers
None
D20857.diff
View Options
diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php
--- a/src/__phutil_library_map__.php
+++ b/src/__phutil_library_map__.php
@@ -185,6 +185,8 @@
'ArcanistImplicitFallthroughXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistImplicitFallthroughXHPASTLinterRuleTestCase.php',
'ArcanistImplicitVisibilityXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistImplicitVisibilityXHPASTLinterRule.php',
'ArcanistImplicitVisibilityXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistImplicitVisibilityXHPASTLinterRuleTestCase.php',
+ 'ArcanistImplodeArgumentOrderXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistImplodeArgumentOrderXHPASTLinterRule.php',
+ 'ArcanistImplodeArgumentOrderXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistImplodeArgumentOrderXHPASTLinterRuleTestCase.php',
'ArcanistInlineHTMLXHPASTLinterRule' => 'lint/linter/ArcanistInlineHTMLXHPASTLinterRule.php',
'ArcanistInlineHTMLXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistInlineHTMLXHPASTLinterRuleTestCase.php',
'ArcanistInnerFunctionXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistInnerFunctionXHPASTLinterRule.php',
@@ -608,6 +610,8 @@
'ArcanistImplicitFallthroughXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase',
'ArcanistImplicitVisibilityXHPASTLinterRule' => 'ArcanistXHPASTLinterRule',
'ArcanistImplicitVisibilityXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase',
+ 'ArcanistImplodeArgumentOrderXHPASTLinterRule' => 'ArcanistXHPASTLinterRule',
+ 'ArcanistImplodeArgumentOrderXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase',
'ArcanistInlineHTMLXHPASTLinterRule' => 'ArcanistXHPASTLinterRule',
'ArcanistInlineHTMLXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase',
'ArcanistInnerFunctionXHPASTLinterRule' => 'ArcanistXHPASTLinterRule',
diff --git a/src/lint/linter/xhpast/rules/ArcanistImplodeArgumentOrderXHPASTLinterRule.php b/src/lint/linter/xhpast/rules/ArcanistImplodeArgumentOrderXHPASTLinterRule.php
new file mode 100644
--- /dev/null
+++ b/src/lint/linter/xhpast/rules/ArcanistImplodeArgumentOrderXHPASTLinterRule.php
@@ -0,0 +1,39 @@
+<?php
+
+final class ArcanistImplodeArgumentOrderXHPASTLinterRule
+ extends ArcanistXHPASTLinterRule {
+
+ const ID = 129;
+
+ public function getLintName() {
+ return pht('Implode With Glue First');
+ }
+
+ public function getLintSeverity() {
+ return ArcanistLintSeverity::SEVERITY_ERROR;
+ }
+
+ public function process(XHPASTNode $root) {
+ $implosions = $this->getFunctionCalls($root, array('implode'));
+ foreach ($implosions as $implosion) {
+ $parameters = $implosion->getChildOfType(1, 'n_CALL_PARAMETER_LIST');
+
+ if (count($parameters->getChildren()) != 2) {
+ continue;
+ }
+
+ $parameter = $parameters->getChildByIndex(1);
+ if (!$parameter->isStaticScalar()) {
+ continue;
+ }
+
+ $this->raiseLintAtNode(
+ $implosion,
+ pht(
+ 'When calling "implode()", pass the "glue" argument first. (The '.
+ 'other parameter order is deprecated in PHP 7.4 and raises a '.
+ 'warning.)'));
+ }
+ }
+
+}
diff --git a/src/lint/linter/xhpast/rules/__tests__/ArcanistImplodeArgumentOrderXHPASTLinterRuleTestCase.php b/src/lint/linter/xhpast/rules/__tests__/ArcanistImplodeArgumentOrderXHPASTLinterRuleTestCase.php
new file mode 100644
--- /dev/null
+++ b/src/lint/linter/xhpast/rules/__tests__/ArcanistImplodeArgumentOrderXHPASTLinterRuleTestCase.php
@@ -0,0 +1,11 @@
+<?php
+
+final class ArcanistImplodeArgumentOrderXHPASTLinterRuleTestCase
+ extends ArcanistXHPASTLinterRuleTestCase {
+
+ public function testLinter() {
+ $this->executeTestsInDirectory(
+ dirname(__FILE__).'/implode-argument-order/');
+ }
+
+}
diff --git a/src/lint/linter/xhpast/rules/__tests__/implode-argument-order/implode.lint-test b/src/lint/linter/xhpast/rules/__tests__/implode-argument-order/implode.lint-test
new file mode 100644
--- /dev/null
+++ b/src/lint/linter/xhpast/rules/__tests__/implode-argument-order/implode.lint-test
@@ -0,0 +1,18 @@
+<?php
+
+// This is the correct argument order.
+implode(' ', $x);
+
+// This is the legacy argument order which warns in PHP 7.4+.
+implode($x, ' ');
+
+// No warning: we can't statically tell which one is the glue.
+implode($x, $y);
+
+// No warning: these are likely wrong, but not a glue order problem.
+implode();
+implode($x);
+implode($x, $y, $z);
+
+~~~~~~~~~~
+error:7:1:XHP129:Implode With Glue First
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Thu, Mar 13, 9:27 AM (12 h, 57 m)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7370957
Default Alt Text
D20857.diff (4 KB)
Attached To
Mode
D20857: Add a lint check for deprecated argument order to "implode()"
Attached
Detach File
Event Timeline
Log In to Comment