Page MenuHomePhabricator

D9131.diff
No OneTemporary

D9131.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
@@ -36,6 +36,8 @@
'ArcanistChooseNoRevisionsException' => 'exception/ArcanistChooseNoRevisionsException.php',
'ArcanistCloseRevisionWorkflow' => 'workflow/ArcanistCloseRevisionWorkflow.php',
'ArcanistCloseWorkflow' => 'workflow/ArcanistCloseWorkflow.php',
+ 'ArcanistClosureLinter' => 'lint/linter/ArcanistClosureLinter.php',
+ 'ArcanistClosureLinterTestCase' => 'lint/linter/__tests__/ArcanistClosureLinterTestCase.php',
'ArcanistCommentRemover' => 'parser/ArcanistCommentRemover.php',
'ArcanistCommentRemoverTestCase' => 'parser/__tests__/ArcanistCommentRemoverTestCase.php',
'ArcanistCommitWorkflow' => 'workflow/ArcanistCommitWorkflow.php',
@@ -222,6 +224,8 @@
'ArcanistChooseNoRevisionsException' => 'Exception',
'ArcanistCloseRevisionWorkflow' => 'ArcanistBaseWorkflow',
'ArcanistCloseWorkflow' => 'ArcanistBaseWorkflow',
+ 'ArcanistClosureLinter' => 'ArcanistExternalLinter',
+ 'ArcanistClosureLinterTestCase' => 'ArcanistArcanistLinterTestCase',
'ArcanistCommentRemoverTestCase' => 'ArcanistTestCase',
'ArcanistCommitWorkflow' => 'ArcanistBaseWorkflow',
'ArcanistConduitLinter' => 'ArcanistLinter',
diff --git a/src/lint/linter/ArcanistClosureLinter.php b/src/lint/linter/ArcanistClosureLinter.php
new file mode 100644
--- /dev/null
+++ b/src/lint/linter/ArcanistClosureLinter.php
@@ -0,0 +1,82 @@
+<?php
+
+/**
+ * Uses gJSLint to detect errors and potential problems in JavaScript code.
+ */
+final class ArcanistClosureLinter extends ArcanistExternalLinter {
+
+ public function getInfoName() {
+ return 'Closure Linter';
+ }
+
+ public function getInfoURI() {
+ return 'https://developers.google.com/closure/utilities/';
+ }
+
+ public function getInfoDescription() {
+ return pht(
+ 'Uses Google\'s Closure Linter to check Javascript code.');
+ }
+
+ public function getLinterName() {
+ return 'Closure Linter';
+ }
+
+ public function getLinterConfigurationName() {
+ return 'gjslint';
+ }
+
+ protected function getDefaultMessageSeverity($code) {
+ return ArcanistLintSeverity::SEVERITY_ERROR;
+ }
+
+ public function getDefaultBinary() {
+ return 'gjslint';
+ }
+
+ public function getInstallInstructions() {
+ return pht('Install gJSLint using `sudo easy_install http://closure-linter'.
+ '.googlecode.com/files/closure_linter-latest.tar.gz`');
+ }
+
+ public function shouldExpectCommandErrors() {
+ return true;
+ }
+
+ public function supportsReadDataFromStdin() {
+ return false;
+ }
+
+ protected function parseLinterOutput($path, $err, $stdout, $stderr) {
+ // Each line looks like this:
+ // Line 46, E:0110: Line too long (87 characters).
+ $regex = '/^Line (\d+), (E:\d+): (.*)/';
+ $severity_code = ArcanistLintSeverity::SEVERITY_ERROR;
+
+ $lines = explode("\n", $stdout);
+
+ $messages = array();
+ foreach ($lines as $line) {
+ $line = trim($line);
+ $matches = null;
+ if (!preg_match($regex, $line, $matches)) {
+ continue;
+ }
+ foreach ($matches as $key => $match) {
+ $matches[$key] = trim($match);
+ }
+
+ $message = new ArcanistLintMessage();
+ $message->setPath($path);
+ $message->setLine($matches[1]);
+ $message->setName($matches[2]);
+ $message->setCode($this->getLinterName());
+ $message->setDescription($matches[3]);
+ $message->setSeverity($severity_code);
+
+ $messages[] = $message;
+ }
+
+ return $messages;
+ }
+}
diff --git a/src/lint/linter/__tests__/ArcanistClosureLinterTestCase.php b/src/lint/linter/__tests__/ArcanistClosureLinterTestCase.php
new file mode 100644
--- /dev/null
+++ b/src/lint/linter/__tests__/ArcanistClosureLinterTestCase.php
@@ -0,0 +1,15 @@
+<?php
+
+final class ArcanistClosureLinterTestCase
+ extends ArcanistArcanistLinterTestCase {
+
+ public function testClosureLinter() {
+ $linter = new ArcanistClosureLinter();
+ $linter->setFlags(array("--additional_extensions=lint-test"));
+
+ $this->executeTestsInDirectory(
+ dirname(__FILE__).'/gjslint/',
+ $linter);
+ }
+
+}
diff --git a/src/lint/linter/__tests__/gjslint/gjslint.lint-test b/src/lint/linter/__tests__/gjslint/gjslint.lint-test
new file mode 100644
--- /dev/null
+++ b/src/lint/linter/__tests__/gjslint/gjslint.lint-test
@@ -0,0 +1,20 @@
+var x = 'some really really really really really really really long string';
+var y = 'some really really really really really really really really really long string',
+ z = 14;
+var obj = {name : 'vm'};
+var x
+var result = true
+ || false;
+/**
+ * @param x
+ * @return {string}
+ */
+function foo(x) {
+ return 'bar';
+}
+~~~~~~~~~~
+error:2:
+error:4:
+error:5:
+error:7:
+error:9:
\ No newline at end of file

File Metadata

Mime Type
text/plain
Expires
Mon, May 20, 4:05 AM (3 w, 6 d ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
6281785
Default Alt Text
D9131.diff (4 KB)

Event Timeline