build(gulp): lazy-require modules in order to improve startup time
Closes #5498
This commit is contained in:
@ -9,114 +9,111 @@ var util = require('./util');
|
||||
var yaml = require('js-yaml');
|
||||
|
||||
module.exports = function(gulp, plugins, config) {
|
||||
return function() {
|
||||
var travisFoldEnd = travisFoldStart(`dartanalyzer-${config.use_ddc ? 'ddc' : ''}-${config.dest}`);
|
||||
var tempFile = '_analyzer.dart';
|
||||
var travisFoldEnd = travisFoldStart(`dartanalyzer-${config.use_ddc ? 'ddc' : ''}-${config.dest}`);
|
||||
var tempFile = '_analyzer.dart';
|
||||
|
||||
return util.forEachSubDirSequential(config.dest, function(dir) {
|
||||
var pubspecContents = fs.readFileSync(path.join(dir, 'pubspec.yaml'));
|
||||
var pubspec = yaml.safeLoad(pubspecContents);
|
||||
var packageName = pubspec.name;
|
||||
return util.forEachSubDirSequential(config.dest, function(dir) {
|
||||
var pubspecContents = fs.readFileSync(path.join(dir, 'pubspec.yaml'));
|
||||
var pubspec = yaml.safeLoad(pubspecContents);
|
||||
var packageName = pubspec.name;
|
||||
|
||||
var libFiles = [].slice.call(glob.sync('lib/**/*.dart', {cwd: dir}));
|
||||
var webFiles = [].slice.call(glob.sync('web/**/*.dart', {cwd: dir}));
|
||||
var testFiles = [].slice.call(glob.sync('test/**/*_spec.dart', {cwd: dir}));
|
||||
var libFiles = [].slice.call(glob.sync('lib/**/*.dart', {cwd: dir}));
|
||||
var webFiles = [].slice.call(glob.sync('web/**/*.dart', {cwd: dir}));
|
||||
var testFiles = [].slice.call(glob.sync('test/**/*_spec.dart', {cwd: dir}));
|
||||
|
||||
var analyzeFile = ['library _analyzer;'];
|
||||
libFiles.concat(testFiles).concat(webFiles).forEach(function(fileName, index) {
|
||||
if (fileName !== tempFile && fileName.indexOf("/packages/") === -1) {
|
||||
if (fileName.indexOf('lib') == 0) {
|
||||
fileName = 'package:' + packageName + '/' + path.relative('lib', fileName).replace(/\\/g, '/');
|
||||
}
|
||||
analyzeFile.push('import "' + fileName + '" as mod' + index + ';');
|
||||
}
|
||||
});
|
||||
fs.writeFileSync(path.join(dir, tempFile), analyzeFile.join('\n'));
|
||||
var defer = Q.defer();
|
||||
if (config.use_ddc) {
|
||||
analyze(dir, defer.makeNodeResolver(), true);
|
||||
} else {
|
||||
analyze(dir, defer.makeNodeResolver());
|
||||
}
|
||||
return defer.promise;
|
||||
}).then(travisFoldEnd);
|
||||
var analyzeFile = ['library _analyzer;'];
|
||||
libFiles.concat(testFiles).concat(webFiles).forEach(function(fileName, index) {
|
||||
if (fileName !== tempFile && fileName.indexOf("/packages/") === -1) {
|
||||
if (fileName.indexOf('lib') == 0) {
|
||||
fileName = 'package:' + packageName + '/' +
|
||||
path.relative('lib', fileName).replace(/\\/g, '/');
|
||||
}
|
||||
analyzeFile.push('import "' + fileName + '" as mod' + index + ';');
|
||||
}
|
||||
});
|
||||
fs.writeFileSync(path.join(dir, tempFile), analyzeFile.join('\n'));
|
||||
var defer = Q.defer();
|
||||
if (config.use_ddc) {
|
||||
analyze(dir, defer.makeNodeResolver(), true);
|
||||
} else {
|
||||
analyze(dir, defer.makeNodeResolver());
|
||||
}
|
||||
return defer.promise;
|
||||
}).then(travisFoldEnd);
|
||||
|
||||
function analyze(dirName, done, useDdc) {
|
||||
// TODO remove --package-warnings once dartanalyzer handles transitive libraries
|
||||
var flags = ['--fatal-warnings', '--package-warnings', '--format=machine'];
|
||||
function analyze(dirName, done, useDdc) {
|
||||
// TODO remove --package-warnings once dartanalyzer handles transitive libraries
|
||||
var flags = ['--fatal-warnings', '--package-warnings', '--format=machine'];
|
||||
|
||||
if (useDdc) {
|
||||
console.log('Using DDC analyzer to analyze', dirName);
|
||||
flags.push('--strong');
|
||||
}
|
||||
|
||||
var args = flags.concat(tempFile);
|
||||
|
||||
var stream = spawn(config.command, args, {
|
||||
// inherit stdin and stderr, but filter stdout
|
||||
stdio: [process.stdin, process.stdout, 'pipe'],
|
||||
cwd: dirName
|
||||
});
|
||||
// Filter out unused imports from our generated file.
|
||||
// We don't reexports from the generated file
|
||||
// as this could lead to name clashes when two files
|
||||
// export the same thing.
|
||||
var rl = readline.createInterface(
|
||||
{input: stream.stderr, output: process.stdout, terminal: false});
|
||||
var hintCount = 0;
|
||||
var errorCount = 0;
|
||||
var warningCount = 0;
|
||||
rl.on('line', function(line) {
|
||||
if (line == "find: > bin [: No such file or directory") {
|
||||
//Skip bad output from Dart SDK .bat files on Windows
|
||||
return;
|
||||
}
|
||||
var parsedLine = _AnalyzerOutputLine.parse(line);
|
||||
if (!parsedLine) {
|
||||
errorCount++;
|
||||
console.log('Unexpected output: ' + line);
|
||||
return;
|
||||
}
|
||||
// TODO remove once dartanalyzer handles transitive libraries
|
||||
// skip errors in third-party packages
|
||||
if (parsedLine.sourcePath.indexOf(dirName) == -1) {
|
||||
return;
|
||||
}
|
||||
if (parsedLine.shouldIgnore()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (parsedLine.isHint) {
|
||||
hintCount++;
|
||||
} else if (parsedLine.isWarning) {
|
||||
warningCount++;
|
||||
} else {
|
||||
errorCount++;
|
||||
}
|
||||
console.log(dirName + ':' + parsedLine);
|
||||
});
|
||||
stream.on('close', function() {
|
||||
var error;
|
||||
var report = [];
|
||||
if (errorCount > 0) {
|
||||
report.push(errorCount + ' error(s)');
|
||||
}
|
||||
if (warningCount > 0) {
|
||||
report.push(warningCount + ' warning(s)');
|
||||
}
|
||||
if (hintCount > 0) {
|
||||
report.push(hintCount + ' hint(s)');
|
||||
}
|
||||
if (report.length > 0) {
|
||||
error = 'Dartanalyzer showed ' + report.join(', ');
|
||||
}
|
||||
done(error);
|
||||
});
|
||||
stream.on('error', function(error) {
|
||||
done(error);
|
||||
});
|
||||
if (useDdc) {
|
||||
console.log('Using DDC analyzer to analyze', dirName);
|
||||
flags.push('--strong');
|
||||
}
|
||||
};
|
||||
|
||||
var args = flags.concat(tempFile);
|
||||
|
||||
var stream = spawn(config.command, args, {
|
||||
// inherit stdin and stderr, but filter stdout
|
||||
stdio: [process.stdin, process.stdout, 'pipe'],
|
||||
cwd: dirName
|
||||
});
|
||||
// Filter out unused imports from our generated file.
|
||||
// We don't reexports from the generated file
|
||||
// as this could lead to name clashes when two files
|
||||
// export the same thing.
|
||||
var rl =
|
||||
readline.createInterface({input: stream.stderr, output: process.stdout, terminal: false});
|
||||
var hintCount = 0;
|
||||
var errorCount = 0;
|
||||
var warningCount = 0;
|
||||
rl.on('line', function(line) {
|
||||
if (line == "find: > bin [: No such file or directory") {
|
||||
// Skip bad output from Dart SDK .bat files on Windows
|
||||
return;
|
||||
}
|
||||
var parsedLine = _AnalyzerOutputLine.parse(line);
|
||||
if (!parsedLine) {
|
||||
errorCount++;
|
||||
console.log('Unexpected output: ' + line);
|
||||
return;
|
||||
}
|
||||
// TODO remove once dartanalyzer handles transitive libraries
|
||||
// skip errors in third-party packages
|
||||
if (parsedLine.sourcePath.indexOf(dirName) == -1) {
|
||||
return;
|
||||
}
|
||||
if (parsedLine.shouldIgnore()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (parsedLine.isHint) {
|
||||
hintCount++;
|
||||
} else if (parsedLine.isWarning) {
|
||||
warningCount++;
|
||||
} else {
|
||||
errorCount++;
|
||||
}
|
||||
console.log(dirName + ':' + parsedLine);
|
||||
});
|
||||
stream.on('close', function() {
|
||||
var error;
|
||||
var report = [];
|
||||
if (errorCount > 0) {
|
||||
report.push(errorCount + ' error(s)');
|
||||
}
|
||||
if (warningCount > 0) {
|
||||
report.push(warningCount + ' warning(s)');
|
||||
}
|
||||
if (hintCount > 0) {
|
||||
report.push(hintCount + ' hint(s)');
|
||||
}
|
||||
if (report.length > 0) {
|
||||
error = 'Dartanalyzer showed ' + report.join(', ');
|
||||
}
|
||||
done(error);
|
||||
});
|
||||
stream.on('error', function(error) { done(error); });
|
||||
}
|
||||
};
|
||||
|
||||
// See https://github.com/dart-lang/analyzer_cli/blob/master/lib/src/error_formatter.dart
|
||||
|
Reference in New Issue
Block a user