Page MenuHomePhabricator

D9131.id21692.diff
No OneTemporary

D9131.id21692.diff

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,109 @@
+<?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) {
+ if (preg_match('/^W/', $code)) {
+ return ArcanistLintSeverity::SEVERITY_WARNING;
+ } else {
+ return ArcanistLintSeverity::SEVERITY_ERROR;
+ }
+ }
+
+ public function getDefaultBinary() {
+ $prefix = $this->getDeprecatedConfiguration('lint.closure.prefix');
+ $bin = $this->getDeprecatedConfiguration('lint.closure.bin', 'gjslint');
+
+ if ($prefix) {
+ return $prefix.'/'.$bin;
+ } else {
+ return $bin;
+ }
+ }
+
+ public function shouldUseInterpreter() {
+ return true;
+ }
+
+ public function getDefaultInterpreter() {
+ return 'python';
+ }
+
+ 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 getDefaultFlags() {
+ $options = $this->getDeprecatedConfiguration(
+ 'lint.closure.options',
+ array());
+
+ return $options;
+ }
+
+ 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;
+ }
+}

File Metadata

Mime Type
text/plain
Expires
Sun, Aug 17, 7:28 AM (1 w, 3 d ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
9448152
Default Alt Text
D9131.id21692.diff (2 KB)

Event Timeline