Page MenuHomePhabricator

D14562.diff
No OneTemporary

D14562.diff

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
@@ -178,6 +178,8 @@
'ArcanistInstallCertificateWorkflow' => 'workflow/ArcanistInstallCertificateWorkflow.php',
'ArcanistInstanceOfOperatorXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistInstanceOfOperatorXHPASTLinterRule.php',
'ArcanistInstanceofOperatorXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistInstanceofOperatorXHPASTLinterRuleTestCase.php',
+ 'ArcanistInterfaceAbstractMethodXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistInterfaceAbstractMethodXHPASTLinterRule.php',
+ 'ArcanistInterfaceAbstractMethodXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistInterfaceAbstractMethodXHPASTLinterRuleTestCase.php',
'ArcanistInterfaceMethodBodyXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistInterfaceMethodBodyXHPASTLinterRule.php',
'ArcanistInterfaceMethodBodyXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistInterfaceMethodBodyXHPASTLinterRuleTestCase.php',
'ArcanistInvalidDefaultParameterXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistInvalidDefaultParameterXHPASTLinterRule.php',
@@ -568,6 +570,8 @@
'ArcanistInstallCertificateWorkflow' => 'ArcanistWorkflow',
'ArcanistInstanceOfOperatorXHPASTLinterRule' => 'ArcanistXHPASTLinterRule',
'ArcanistInstanceofOperatorXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase',
+ 'ArcanistInterfaceAbstractMethodXHPASTLinterRule' => 'ArcanistXHPASTLinterRule',
+ 'ArcanistInterfaceAbstractMethodXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase',
'ArcanistInterfaceMethodBodyXHPASTLinterRule' => 'ArcanistXHPASTLinterRule',
'ArcanistInterfaceMethodBodyXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase',
'ArcanistInvalidDefaultParameterXHPASTLinterRule' => 'ArcanistXHPASTLinterRule',
diff --git a/src/lint/linter/xhpast/rules/ArcanistInterfaceAbstractMethodXHPASTLinterRule.php b/src/lint/linter/xhpast/rules/ArcanistInterfaceAbstractMethodXHPASTLinterRule.php
new file mode 100644
--- /dev/null
+++ b/src/lint/linter/xhpast/rules/ArcanistInterfaceAbstractMethodXHPASTLinterRule.php
@@ -0,0 +1,34 @@
+<?php
+
+final class ArcanistInterfaceAbstractMethodXHPASTLinterRule
+ extends ArcanistXHPASTLinterRule {
+
+ const ID = 114;
+
+ public function getLintName() {
+ return pht('`%s` Methods Cannot Be Marked `%s`', 'interface', 'abstract');
+ }
+
+ public function process(XHPASTNode $root) {
+ $interfaces = $root->selectDescendantsOfType('n_INTERFACE_DECLARATION');
+
+ foreach ($interfaces as $interface) {
+ $methods = $interface->selectDescendantsOfType('n_METHOD_DECLARATION');
+
+ foreach ($methods as $method) {
+ $modifiers = $this->getModifiers($method);
+
+ if (idx($modifiers, 'abstract')) {
+ $this->raiseLintAtNode(
+ $method,
+ pht(
+ '`%s` methods cannot be marked as `%s`. This construct will '.
+ 'cause a fatal error.',
+ 'interface',
+ 'abstract'));
+ }
+ }
+ }
+ }
+
+}
diff --git a/src/lint/linter/xhpast/rules/__tests__/ArcanistInterfaceAbstractMethodXHPASTLinterRuleTestCase.php b/src/lint/linter/xhpast/rules/__tests__/ArcanistInterfaceAbstractMethodXHPASTLinterRuleTestCase.php
new file mode 100644
--- /dev/null
+++ b/src/lint/linter/xhpast/rules/__tests__/ArcanistInterfaceAbstractMethodXHPASTLinterRuleTestCase.php
@@ -0,0 +1,11 @@
+<?php
+
+final class ArcanistInterfaceAbstractMethodXHPASTLinterRuleTestCase
+ extends ArcanistXHPASTLinterRuleTestCase {
+
+ public function testLinter() {
+ $this->executeTestsInDirectory(
+ dirname(__FILE__).'/interface-abstract-method/');
+ }
+
+}
diff --git a/src/lint/linter/xhpast/rules/__tests__/interface-abstract-method/abstract.lint-test b/src/lint/linter/xhpast/rules/__tests__/interface-abstract-method/abstract.lint-test
new file mode 100644
--- /dev/null
+++ b/src/lint/linter/xhpast/rules/__tests__/interface-abstract-method/abstract.lint-test
@@ -0,0 +1,7 @@
+<?php
+
+interface SomeInterface {
+ abstract public function someMethod();
+}
+~~~~~~~~~~
+error:4:3
diff --git a/src/lint/linter/xhpast/rules/__tests__/interface-abstract-method/no-abstract.lint-test b/src/lint/linter/xhpast/rules/__tests__/interface-abstract-method/no-abstract.lint-test
new file mode 100644
--- /dev/null
+++ b/src/lint/linter/xhpast/rules/__tests__/interface-abstract-method/no-abstract.lint-test
@@ -0,0 +1,6 @@
+<?php
+
+interface SomeInterface {
+ public function someMethod();
+}
+~~~~~~~~~~

File Metadata

Mime Type
text/plain
Expires
Sat, Mar 15, 7:37 PM (3 w, 4 d ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7702554
Default Alt Text
D14562.diff (4 KB)

Event Timeline