Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F14842827
D9131.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
D9131.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
@@ -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
Details
Attached
Mime Type
text/plain
Expires
Mon, Feb 3, 2:12 AM (21 h, 15 m)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7085904
Default Alt Text
D9131.diff (4 KB)
Attached To
Mode
D9131: Add Closure linter to arcanist
Attached
Detach File
Event Timeline
Log In to Comment