From 835b3af17a9c3cf3fde8e0219a9c3444f959362e Mon Sep 17 00:00:00 2001 From: Arzhan Kinzhalin Date: Fri, 3 Jan 2014 17:10:44 -0300 Subject: [PATCH] Bare async provider implementation. Not working due to an issue in code inspection implementation (html template is displayed before it's rendered). --- src/language/CodeInspection.js | 59 ++++++++++++++++++++++------------ 1 file changed, 39 insertions(+), 20 deletions(-) diff --git a/src/language/CodeInspection.js b/src/language/CodeInspection.js index 26309e0be85..0187c92349c 100644 --- a/src/language/CodeInspection.js +++ b/src/language/CodeInspection.js @@ -170,29 +170,48 @@ define(function (require, exports, module) { response.resolve(null); return response.promise(); } - + DocumentManager.getDocumentText(file) .done(function (fileText) { - var perfTimerInspector = PerfUtils.markStart("CodeInspection:\t" + file.fullPath); - - providerList.forEach(function (provider) { - var perfTimerProvider = PerfUtils.markStart("CodeInspection '" + provider.name + "':\t" + file.fullPath); - - try { - var scanResult = provider.scanFile(fileText, file.fullPath); - results.push({provider: provider, result: scanResult}); - } catch (err) { - console.error("[CodeInspection] Provider " + provider.name + " threw an error: " + err); - response.reject(err); - return; + var perfTimerInspector = PerfUtils.markStart("CodeInspection:\t" + file.fullPath), + masterPromise; + + masterPromise = Async.doInParallel(providerList, function (provider) { + var perfTimerProvider = PerfUtils.markStart("CodeInspection '" + provider.name + "':\t" + file.fullPath), + runPromise = new $.Deferred(); + + if (provider.scanFileAsync) { + provider.scanFileAsync(fileText, file.fullPath) + .then(function (scanResult) { + results.push({provider: provider, result: scanResult}); + PerfUtils.addMeasurement(perfTimerProvider); + runPromise.resolve(); + }) + .fail(function (err) { + console.error("[CodeInpsection] Provider " + provider.name + " (async) failed: " + err); + runPromise.reject(err); + }); + } else { + try { + var scanResult = provider.scanFile(fileText, file.fullPath); + results.push({provider: provider, result: scanResult}); + PerfUtils.addMeasurement(perfTimerProvider); + runPromise.resolve(); + } catch (err) { + console.error("[CodeInspection] Provider " + provider.name + " (sync) threw an error: " + err); + runPromise.reject(err); + return; + } } + return runPromise.promise(); - PerfUtils.addMeasurement(perfTimerProvider); + }, false); + + masterPromise.then(function () { + PerfUtils.addMeasurement(perfTimerInspector); + response.resolve(results); }); - PerfUtils.addMeasurement(perfTimerInspector); - - response.resolve(results); }) .fail(function (err) { console.error("[CodeInspection] Could not read file for inspection: " + file.fullPath); @@ -328,7 +347,7 @@ define(function (require, exports, module) { html = Mustache.render(ResultsTemplate, {reportList: allErrors}); }); - + // Update results table var perfTimerDOM = PerfUtils.markStart("ProblemsPanel render:\t" + currentDoc.file.fullPath); @@ -377,7 +396,7 @@ define(function (require, exports, module) { if (!_providers[languageId]) { _providers[languageId] = []; } - + if (languageId === "javascript") { // This is a special case to enable extension provider to replace the JSLint provider // in favor of their own implementation @@ -385,7 +404,7 @@ define(function (require, exports, module) { return registeredProvider.name === "JSLint"; }); } - + _providers[languageId].push(provider); run();