mirror of
https://we.phorge.it/source/arcanist.git
synced 2025-01-11 07:11:03 +01:00
Merge pull request #15 from disqus/comprehensive-linter
Implement Comprehensive Lint Engine
This commit is contained in:
commit
9be9554f2d
4 changed files with 175 additions and 1 deletions
|
@ -99,6 +99,7 @@ phutil_register_library_map(array(
|
|||
'ArcanistXHPASTLinter' => 'lint/linter/xhpast',
|
||||
'ArcanistXHPASTLinterTestCase' => 'lint/linter/xhpast/__tests__',
|
||||
'BranchInfo' => 'branch',
|
||||
'ComprehensiveEngine' => 'lint/engine/comprehensive',
|
||||
'ExampleLintEngine' => 'lint/engine/example',
|
||||
'PhutilLintEngine' => 'lint/engine/phutil',
|
||||
'PhutilModuleRequirements' => 'parser/phutilmodule',
|
||||
|
@ -165,6 +166,7 @@ phutil_register_library_map(array(
|
|||
'ArcanistUserAbortException' => 'ArcanistUsageException',
|
||||
'ArcanistXHPASTLinter' => 'ArcanistLinter',
|
||||
'ArcanistXHPASTLinterTestCase' => 'ArcanistLinterTestCase',
|
||||
'ComprehensiveEngine' => 'ArcanistLintEngine',
|
||||
'ExampleLintEngine' => 'ArcanistLintEngine',
|
||||
'PhutilLintEngine' => 'ArcanistLintEngine',
|
||||
'PhutilUnitTestEngine' => 'ArcanistBaseUnitTestEngine',
|
||||
|
|
148
src/lint/engine/comprehensive/ComprehensiveLintEngine.php
Normal file
148
src/lint/engine/comprehensive/ComprehensiveLintEngine.php
Normal file
|
@ -0,0 +1,148 @@
|
|||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2012 Facebook, Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Basic lint engine which just applies several linters based on the file types
|
||||
*
|
||||
* @group linter
|
||||
*/
|
||||
class ComprehensiveLintEngine extends ArcanistLintEngine {
|
||||
|
||||
public function buildLinters() {
|
||||
$linters = array();
|
||||
|
||||
$paths = $this->getPaths();
|
||||
|
||||
// This needs to go first so that changes to generated files cause module
|
||||
// linting. This linter also operates on removed files, because removing
|
||||
// a file changes the static properties of a module.
|
||||
$module_linter = new ArcanistPhutilModuleLinter();
|
||||
$linters[] = $module_linter;
|
||||
foreach ($paths as $path) {
|
||||
$module_linter->addPath($path);
|
||||
}
|
||||
|
||||
// Remaining lint engines operate on file contents and ignore removed
|
||||
// files.
|
||||
foreach ($paths as $key => $path) {
|
||||
if (!$this->pathExists($path)) {
|
||||
unset($paths[$key]);
|
||||
}
|
||||
if (preg_match('@^externals/@', $path)) {
|
||||
// Third-party stuff lives in /externals/; don't run lint engines
|
||||
// against it.
|
||||
unset($paths[$key]);
|
||||
}
|
||||
}
|
||||
|
||||
$generated_linter = new ArcanistGeneratedLinter();
|
||||
$linters[] = $generated_linter;
|
||||
|
||||
$nolint_linter = new ArcanistNoLintLinter();
|
||||
$linters[] = $nolint_linter;
|
||||
|
||||
$text_linter = new ArcanistTextLinter();
|
||||
$linters[] = $text_linter;
|
||||
foreach ($paths as $path) {
|
||||
$is_text = false;
|
||||
if (preg_match('/\.(php|css|hpp|cpp|l|y)$/', $path)) {
|
||||
$is_text = true;
|
||||
}
|
||||
if ($is_text) {
|
||||
$generated_linter->addPath($path);
|
||||
$generated_linter->addData($path, $this->loadData($path));
|
||||
|
||||
$nolint_linter->addPath($path);
|
||||
$nolint_linter->addData($path, $this->loadData($path));
|
||||
|
||||
$text_linter->addPath($path);
|
||||
$text_linter->addData($path, $this->loadData($path));
|
||||
}
|
||||
}
|
||||
|
||||
$name_linter = new ArcanistFilenameLinter();
|
||||
$linters[] = $name_linter;
|
||||
foreach ($paths as $path) {
|
||||
$name_linter->addPath($path);
|
||||
}
|
||||
|
||||
$xhpast_linter = new ArcanistXHPASTLinter();
|
||||
$linters[] = $xhpast_linter;
|
||||
foreach ($paths as $path) {
|
||||
if (preg_match('/\.php$/', $path)) {
|
||||
$xhpast_linter->addPath($path);
|
||||
$xhpast_linter->addData($path, $this->loadData($path));
|
||||
}
|
||||
}
|
||||
|
||||
$linters = array_merge($linters, $this->buildLicenseLinters($paths));
|
||||
$linters = array_merge($linters, $this->buildPythonLinters($paths));
|
||||
$linters = array_merge($linters, $this->buildJSLinters($paths));
|
||||
|
||||
return $linters;
|
||||
}
|
||||
|
||||
public function buildLicenseLinters($paths) {
|
||||
$license_linter = new ArcanistApacheLicenseLinter();
|
||||
|
||||
$linters = array();
|
||||
$linters[] = $license_linter;
|
||||
foreach ($paths as $path) {
|
||||
if (preg_match('/\.(php|cpp|hpp|l|y)$/', $path)) {
|
||||
if (!preg_match('@^externals/@', $path)) {
|
||||
$license_linter->addPath($path);
|
||||
$license_linter->addData($path, $this->loadData($path));
|
||||
}
|
||||
}
|
||||
}
|
||||
return $linters;
|
||||
}
|
||||
|
||||
public function buildPythonLinters($paths) {
|
||||
$pyflakes_linter = new ArcanistPyFlakesLinter();
|
||||
$pep8_linter = new ArcanistPEP8Linter();
|
||||
|
||||
$linters = array();
|
||||
$linters[] = $pyflakes_linter;
|
||||
$linters[] = $pep8_linter;
|
||||
foreach ($paths as $path) {
|
||||
if (preg_match('/\.py$/', $path)) {
|
||||
$pyflakes_linter->addPath($path);
|
||||
$pyflakes_linter->addData($path, $this->loadData($path));
|
||||
$pep8_linter->addPath($path);
|
||||
$pep8_linter->addData($path, $this->loadData($path));
|
||||
}
|
||||
}
|
||||
return $linters;
|
||||
}
|
||||
|
||||
public function buildJSLinters($paths) {
|
||||
$js_linter = new ArcanistJSHintLinter();
|
||||
|
||||
$linters = array();
|
||||
$linters[] = $js_linter;
|
||||
foreach ($paths as $path) {
|
||||
if (preg_match('/\.js$/', $path)) {
|
||||
$js_linter->addPath($path);
|
||||
$js_linter->addData($path, $this->loadData($path));
|
||||
}
|
||||
}
|
||||
return $linters;
|
||||
}
|
||||
|
||||
}
|
22
src/lint/engine/comprehensive/__init__.php
Normal file
22
src/lint/engine/comprehensive/__init__.php
Normal file
|
@ -0,0 +1,22 @@
|
|||
<?php
|
||||
/**
|
||||
* This file is automatically generated. Lint this module to rebuild it.
|
||||
* @generated
|
||||
*/
|
||||
|
||||
|
||||
|
||||
phutil_require_module('arcanist', 'lint/engine/base');
|
||||
phutil_require_module('arcanist', 'lint/linter/apachelicense');
|
||||
phutil_require_module('arcanist', 'lint/linter/filename');
|
||||
phutil_require_module('arcanist', 'lint/linter/generated');
|
||||
phutil_require_module('arcanist', 'lint/linter/jshint');
|
||||
phutil_require_module('arcanist', 'lint/linter/nolint');
|
||||
phutil_require_module('arcanist', 'lint/linter/pep8');
|
||||
phutil_require_module('arcanist', 'lint/linter/phutilmodule');
|
||||
phutil_require_module('arcanist', 'lint/linter/pyflakes');
|
||||
phutil_require_module('arcanist', 'lint/linter/text');
|
||||
phutil_require_module('arcanist', 'lint/linter/xhpast');
|
||||
|
||||
|
||||
phutil_require_source('ComprehensiveLintEngine.php');
|
|
@ -6,10 +6,12 @@
|
|||
|
||||
|
||||
|
||||
phutil_require_module('arcanist', 'exception/usage');
|
||||
phutil_require_module('arcanist', 'lint/linter/base');
|
||||
phutil_require_module('arcanist', 'lint/message');
|
||||
phutil_require_module('arcanist', 'lint/severity');
|
||||
|
||||
phutil_require_module('phutil', 'filesystem');
|
||||
phutil_require_module('phutil', 'future');
|
||||
phutil_require_module('phutil', 'future/exec');
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue