diff --git a/src/lint/linter/ArcanistExternalLinter.php b/src/lint/linter/ArcanistExternalLinter.php index d25c10a2..a394528f 100644 --- a/src/lint/linter/ArcanistExternalLinter.php +++ b/src/lint/linter/ArcanistExternalLinter.php @@ -410,7 +410,7 @@ abstract class ArcanistExternalLinter extends ArcanistFutureLinter { return csprintf('%s', $path); } - final protected function buildFutures(array $paths) { + protected function buildFutures(array $paths) { $executable = $this->getExecutableCommand(); $bin = csprintf('%C %Ls', $executable, $this->getCommandFlags()); @@ -428,7 +428,7 @@ abstract class ArcanistExternalLinter extends ArcanistFutureLinter { return $futures; } - final protected function resolveFuture($path, Future $future) { + protected function resolveFuture($path, Future $future) { list($err, $stdout, $stderr) = $future->resolve(); if ($err && !$this->shouldExpectCommandErrors()) { $future->resolvex(); diff --git a/src/lint/linter/ArcanistLinter.php b/src/lint/linter/ArcanistLinter.php index 6bb02e5d..afb8cbe3 100644 --- a/src/lint/linter/ArcanistLinter.php +++ b/src/lint/linter/ArcanistLinter.php @@ -214,9 +214,6 @@ abstract class ArcanistLinter extends Phobject { return 1.0; } - /** - * TODO: This should be `final`. - */ public function setCustomSeverityMap(array $map) { $this->customSeverityMap = $map; return $this; @@ -227,7 +224,7 @@ abstract class ArcanistLinter extends Phobject { return $this; } - final public function setCustomSeverityRules(array $rules) { + public function setCustomSeverityRules(array $rules) { $this->customSeverityRules = $rules; return $this; } diff --git a/src/lint/linter/ArcanistPyLintLinter.php b/src/lint/linter/ArcanistPyLintLinter.php index 44793a50..f8cc279a 100644 --- a/src/lint/linter/ArcanistPyLintLinter.php +++ b/src/lint/linter/ArcanistPyLintLinter.php @@ -38,7 +38,7 @@ final class ArcanistPyLintLinter extends ArcanistExternalLinter { list($stdout) = execx('%C --version', $this->getExecutableCommand()); $matches = array(); - $regex = '/^pylint (?P\d+\.\d+\.\d+),/'; + $regex = '/^pylint (?P\d+\.\d+\.\d+)/'; if (preg_match($regex, $stdout, $matches)) { return $matches['version']; } else { diff --git a/src/lint/linter/__tests__/ArcanistLinterTestCase.php b/src/lint/linter/__tests__/ArcanistLinterTestCase.php index a6eba567..b86a43b2 100644 --- a/src/lint/linter/__tests__/ArcanistLinterTestCase.php +++ b/src/lint/linter/__tests__/ArcanistLinterTestCase.php @@ -114,6 +114,7 @@ abstract class ArcanistLinterTestCase extends PhutilTestCase { $path_name = idx($config, 'path', $path); $engine->setPaths(array($path_name)); + $linter->setEngine($engine); $linter->addPath($path_name); $linter->addData($path_name, $data); diff --git a/src/lint/linter/xhpast/rules/ArcanistClassNameLiteralXHPASTLinterRule.php b/src/lint/linter/xhpast/rules/ArcanistClassNameLiteralXHPASTLinterRule.php index a22a9859..288fc05c 100644 --- a/src/lint/linter/xhpast/rules/ArcanistClassNameLiteralXHPASTLinterRule.php +++ b/src/lint/linter/xhpast/rules/ArcanistClassNameLiteralXHPASTLinterRule.php @@ -17,6 +17,9 @@ final class ArcanistClassNameLiteralXHPASTLinterRule $class_declarations = $root->selectDescendantsOfType('n_CLASS_DECLARATION'); foreach ($class_declarations as $class_declaration) { + if ($class_declaration->getChildByIndex(1)->getTypeName() == 'n_EMPTY') { + continue; + } $class_name = $class_declaration ->getChildOfType(1, 'n_CLASS_NAME') ->getConcreteString(); diff --git a/src/lint/linter/xhpast/rules/ArcanistConstructorParenthesesXHPASTLinterRule.php b/src/lint/linter/xhpast/rules/ArcanistConstructorParenthesesXHPASTLinterRule.php index d18f0335..4179c899 100644 --- a/src/lint/linter/xhpast/rules/ArcanistConstructorParenthesesXHPASTLinterRule.php +++ b/src/lint/linter/xhpast/rules/ArcanistConstructorParenthesesXHPASTLinterRule.php @@ -20,7 +20,9 @@ final class ArcanistConstructorParenthesesXHPASTLinterRule $class = $node->getChildByIndex(0); $params = $node->getChildByIndex(1); - if ($params->getTypeName() == 'n_EMPTY') { + if ($class->getTypeName() != 'n_CLASS_DECLARATION' && + $params->getTypeName() == 'n_EMPTY') { + $this->raiseLintAtNode( $class, pht('Use parentheses when invoking a constructor.'), diff --git a/src/lint/linter/xhpast/rules/ArcanistSelfClassReferenceXHPASTLinterRule.php b/src/lint/linter/xhpast/rules/ArcanistSelfClassReferenceXHPASTLinterRule.php index 7ad7c238..c87974d7 100644 --- a/src/lint/linter/xhpast/rules/ArcanistSelfClassReferenceXHPASTLinterRule.php +++ b/src/lint/linter/xhpast/rules/ArcanistSelfClassReferenceXHPASTLinterRule.php @@ -17,6 +17,9 @@ final class ArcanistSelfClassReferenceXHPASTLinterRule $class_declarations = $root->selectDescendantsOfType('n_CLASS_DECLARATION'); foreach ($class_declarations as $class_declaration) { + if ($class_declaration->getChildByIndex(1)->getTypeName() == 'n_EMPTY') { + continue; + } $class_name = $class_declaration ->getChildOfType(1, 'n_CLASS_NAME') ->getConcreteString(); diff --git a/src/lint/linter/xhpast/rules/ArcanistUnnecessaryFinalModifierXHPASTLinterRule.php b/src/lint/linter/xhpast/rules/ArcanistUnnecessaryFinalModifierXHPASTLinterRule.php index 1abbaa01..5c197a60 100644 --- a/src/lint/linter/xhpast/rules/ArcanistUnnecessaryFinalModifierXHPASTLinterRule.php +++ b/src/lint/linter/xhpast/rules/ArcanistUnnecessaryFinalModifierXHPASTLinterRule.php @@ -17,6 +17,9 @@ final class ArcanistUnnecessaryFinalModifierXHPASTLinterRule $classes = $root->selectDescendantsOfType('n_CLASS_DECLARATION'); foreach ($classes as $class) { + if ($class->getChildByIndex(0)->getTypeName() == 'n_EMPTY') { + continue; + } $attributes = $class->getChildOfType(0, 'n_CLASS_ATTRIBUTES'); $is_final = false; diff --git a/src/lint/linter/xhpast/rules/__tests__/class-name-literal/class-name-literal.lint-test b/src/lint/linter/xhpast/rules/__tests__/class-name-literal/class-name-literal.lint-test index f6050e6f..263fa6bc 100644 --- a/src/lint/linter/xhpast/rules/__tests__/class-name-literal/class-name-literal.lint-test +++ b/src/lint/linter/xhpast/rules/__tests__/class-name-literal/class-name-literal.lint-test @@ -11,6 +11,12 @@ class MyClass { return __CLASS__; } } + +$c = new class { + public function someMethod() { + return __CLASS__; + } +}; ~~~~~~~~~~ advice:5:12 advice:9:10 @@ -28,3 +34,9 @@ class MyClass { return __CLASS__; } } + +$c = new class { + public function someMethod() { + return __CLASS__; + } +}; diff --git a/src/lint/linter/xhpast/rules/__tests__/constructor-parentheses/constructor-parentheses.lint-test b/src/lint/linter/xhpast/rules/__tests__/constructor-parentheses/constructor-parentheses.lint-test index fa4ede7b..5bfa198d 100644 --- a/src/lint/linter/xhpast/rules/__tests__/constructor-parentheses/constructor-parentheses.lint-test +++ b/src/lint/linter/xhpast/rules/__tests__/constructor-parentheses/constructor-parentheses.lint-test @@ -3,6 +3,7 @@ new Foo; new Bar(); new Foo\Bar; +new class {}; ~~~~~~~~~~ advice:3:5 advice:5:5 @@ -12,3 +13,4 @@ advice:5:5 new Foo(); new Bar(); new Foo\Bar(); +new class {}; diff --git a/src/lint/linter/xhpast/rules/__tests__/self-class-reference/self-class-references.lint-test b/src/lint/linter/xhpast/rules/__tests__/self-class-reference/self-class-references.lint-test index 2f2c1978..33c30f4d 100644 --- a/src/lint/linter/xhpast/rules/__tests__/self-class-reference/self-class-references.lint-test +++ b/src/lint/linter/xhpast/rules/__tests__/self-class-reference/self-class-references.lint-test @@ -9,6 +9,12 @@ class Foo extends Bar { return new self(); } } + +$c = new class { + public function newInstance() { + return new self(); + } +}; ~~~~~~~~~~ warning:5:16 ~~~~~~~~~~ @@ -23,3 +29,9 @@ class Foo extends Bar { return new self(); } } + +$c = new class { + public function newInstance() { + return new self(); + } +}; diff --git a/src/lint/linter/xhpast/rules/__tests__/unnecessary-final-modifier/unnecessary-final-modifier.lint-test b/src/lint/linter/xhpast/rules/__tests__/unnecessary-final-modifier/unnecessary-final-modifier.lint-test index 22185c01..0859d5ab 100644 --- a/src/lint/linter/xhpast/rules/__tests__/unnecessary-final-modifier/unnecessary-final-modifier.lint-test +++ b/src/lint/linter/xhpast/rules/__tests__/unnecessary-final-modifier/unnecessary-final-modifier.lint-test @@ -4,5 +4,6 @@ final class Foo { public function bar() {} final public function baz() {} } +$c = new class {}; ~~~~~~~~~~ advice:5:3 diff --git a/src/workflow/ArcanistLandWorkflow.php b/src/workflow/ArcanistLandWorkflow.php index a3115872..7ca0028e 100644 --- a/src/workflow/ArcanistLandWorkflow.php +++ b/src/workflow/ArcanistLandWorkflow.php @@ -1376,6 +1376,7 @@ EOTEXT // if this one doesn't work out. try { $this->checkForBuildablesWithPlanBehaviors($diff_phid); + return; } catch (ArcanistUserAbortException $abort_ex) { throw $abort_ex; } catch (Exception $ex) {