From 986b7a62ee91a3dbbf475bfcf81a0f0a33109ffa Mon Sep 17 00:00:00 2001 From: Slava Kim Date: Mon, 20 Apr 2015 10:06:21 -0700 Subject: [PATCH] Run appropriate linters --- packages/jshint/plugin/lint-jshint.js | 2 +- tools/build-plugin.js | 1 + tools/compiler.js | 38 ++++++++++++++++++++++++++- tools/linter-plugin.js | 9 +++++-- 4 files changed, 46 insertions(+), 4 deletions(-) diff --git a/packages/jshint/plugin/lint-jshint.js b/packages/jshint/plugin/lint-jshint.js index e6d8295639..a2ae45db84 100644 --- a/packages/jshint/plugin/lint-jshint.js +++ b/packages/jshint/plugin/lint-jshint.js @@ -30,7 +30,7 @@ JsHintLinter.prototype.processFilesForTarget = function (files) { return; } // require configuration file to be called '.jshintrc' - if (path.extname(file.getBaseName()) !== 'js') { + if (path.extname(file.getBasename()) !== 'js') { file.error("Unrecognized configuration file name. Configuration file should be called .jshintrc"); return; } diff --git a/tools/build-plugin.js b/tools/build-plugin.js index c51cd6419c..37fcc5cf62 100644 --- a/tools/build-plugin.js +++ b/tools/build-plugin.js @@ -1,6 +1,7 @@ var archinfo = require('./archinfo.js'); var buildmessage = require('./buildmessage.js'); var files = require('./files.js'); +var buildmessage = require('./buildmessage.js'); var _ = require('underscore'); exports.BuildPluginDefintion = function (options, factoryFunction) { diff --git a/tools/compiler.js b/tools/compiler.js index d794a93b96..5304915824 100644 --- a/tools/compiler.js +++ b/tools/compiler.js @@ -11,6 +11,7 @@ var watch = require('./watch.js'); var Console = require('./console.js').Console; var files = require('./files.js'); var colonConverter = require('./colon-converter.js'); +var linterPluginModule = require('./linter-plugin.js'); var compiler = exports; @@ -395,8 +396,43 @@ var compileUnibuild = function (options) { }; }); + // For each file choose the longest extension handled by linters. + var longestMatchingExt = {}; + _.each(wrappedSourceItems, function (wrappedSource) { + var filename = files.pathBasename(wrappedSource.relPath); + var parts = filename.split('.'); + for (var i = 1; i < parts.length; i++) { + var extension = parts.slice(i).join('.'); + if (_.has(linterPluginsByExtension, extension)) { + longestMatchingExt[wrappedSource.relPath] = extension; + break; + } + } + }); + // Run linters on files. _.each(linterPluginsByExtension, function (linters, ext) { - // XXX would run linters here + var sourcesToLint = []; + _.each(wrappedSourceItems, function (wrappedSource) { + var relPath = wrappedSource.relPath; + var hash = wrappedSource.hash; + var fileWatchSet = wrappedSource.watchset; + var source = wrappedSource.source; + + // only run linters matching the longest handled extension + if (longestMatchingExt[relPath] !== ext) + return; + + sourcesToLint.push(new linterPluginModule.LintingFile(wrappedSource)); + }); + + _.each(linters, function (linterDef) { + // skip linters not relevant to the arch we are compiling for + if (! linterDef.relevantForArch(inputSourceArch.arch)) + return; + + var linter = linterDef.instantiatePlugin(); + linter.run(sourcesToLint); + }); }); _.each(wrappedSourceItems, function (wrappedSource) { diff --git a/tools/linter-plugin.js b/tools/linter-plugin.js index 64d145ce18..97eee34741 100644 --- a/tools/linter-plugin.js +++ b/tools/linter-plugin.js @@ -8,10 +8,15 @@ exports.LinterPlugin = function (pluginDefinition, userPlugin) { self.pluginDefinition = pluginDefinition; }; _.extend(exports.LinterPlugin.prototype, { - run: function () {} + run: function (lintingFiles) { + var self = this; + self.userPlugin.processFilesForTarget(lintingFiles); + } }); -var LintingFile = function (source) { +var LintingFile = exports.LintingFile = function (source) { + buildPluginModule.InputFile.call(this); + var self = this; self._source = source; };