From 21d78d1a6c2be93e570c28f9a7a6b8ffbcdd9012 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Thu, 8 Dec 2016 11:02:05 +0000 Subject: [PATCH] Move import processing from the compiler --- src/app.js | 29 ++++++++++++++++- src/app/compiler.js | 79 ++++++++++++++++++--------------------------- 2 files changed, 59 insertions(+), 49 deletions(-) diff --git a/src/app.js b/src/app.js index 478add9b83..7a43d795a2 100644 --- a/src/app.js +++ b/src/app.js @@ -424,8 +424,35 @@ var run = function () { cb(err || 'Unknown transport error') }) } + + // FIXME: at some point we should invalidate the cache + var cachedRemoteFiles = {} + + function handleImportCall (url, cb) { + var githubMatch + if (editor.hasFile(url)) { + cb(null, editor.getFile(url)) + } else if (url in cachedRemoteFiles) { + cb(null, cachedRemoteFiles[url]) + } else if ((githubMatch = /^(https?:\/\/)?(www.)?github.com\/([^/]*\/[^/]*)\/(.*)/.exec(url))) { + handleGithubCall(githubMatch[3], githubMatch[4], function (err, content) { + if (err) { + cb('Unable to import "' + url + '": ' + err) + return + } + + cachedRemoteFiles[url] = content + cb(null, content) + }) + } else if (/^[^:]*:\/\//.exec(url)) { + cb('Unable to import "' + url + '": Unsupported URL') + } else { + cb('Unable to import "' + url + '": File not found') + } + } + var executionContext = new ExecutionContext() - var compiler = new Compiler(editor, handleGithubCall) + var compiler = new Compiler(editor, handleImportCall) var formalVerification = new FormalVerification($('#verificationView'), compiler.event) var offsetToLineColumnConverter = new OffsetToLineColumnConverter(compiler.event) diff --git a/src/app/compiler.js b/src/app/compiler.js index 0dcb077297..f3b447983b 100644 --- a/src/app/compiler.js +++ b/src/app/compiler.js @@ -11,14 +11,13 @@ var EventManager = require('../lib/eventManager') /* trigger compilationFinished, compilerLoaded, compilationStarted */ -function Compiler (editor, handleGithubCall) { +function Compiler (editor, handleImportCall) { var self = this this.event = new EventManager() var compileJSON var compilerAcceptsMultipleFiles - var cachedRemoteFiles = {} var worker = null var currentVersion @@ -219,61 +218,45 @@ function Compiler (editor, handleGithubCall) { cb(null, files[editor.getCacheFile()]) return } + // FIXME: This will only match imports if the file begins with one. // It should tokenize by lines and check each. // eslint-disable-next-line no-useless-escape var importRegex = /^\s*import\s*[\'\"]([^\'\"]+)[\'\"];/g - var reloop = false - var githubMatch - do { - reloop = false - for (var fileName in files) { - var match - while ((match = importRegex.exec(files[fileName]))) { - var importFilePath = match[1] - if (importFilePath.startsWith('./')) { - importFilePath = importFilePath.slice(2) - } - // FIXME: should be using includes or sets, but there's also browser compatibility.. - if (importHints.indexOf(importFilePath) === -1) { - importHints.push(importFilePath) - } + for (var fileName in files) { + var match + while ((match = importRegex.exec(files[fileName]))) { + var importFilePath = match[1] + if (importFilePath.startsWith('./')) { + importFilePath = importFilePath.slice(2) } - } - while (importHints.length > 0) { - var m = importHints.pop() - if (m in files) { - continue + + // FIXME: should be using includes or sets, but there's also browser compatibility.. + if (importHints.indexOf(importFilePath) === -1) { + importHints.push(importFilePath) } - if (editor.hasFile(m)) { - files[m] = editor.getFile(m) - reloop = true - } else if (m in cachedRemoteFiles) { - files[m] = cachedRemoteFiles[m] - reloop = true - } else if ((githubMatch = /^(https?:\/\/)?(www.)?github.com\/([^/]*\/[^/]*)\/(.*)/.exec(m))) { - handleGithubCall(githubMatch[3], githubMatch[4], function (err, content) { - if (err) { - cb('Unable to import "' + m + '": ' + err) - return - } - - cachedRemoteFiles[m] = content - files[m] = content - - gatherImports(files, importHints, cb) - }) - return - } else if (/^[^:]*:\/\//.exec(m)) { - cb('Unable to import "' + m + '": Unsupported URL') - return + } + } + + while (importHints.length > 0) { + var m = importHints.pop() + if (m in files) { + continue + } + + handleImportCall(m, function (err, content) { + if (err) { + cb(err) } else { - cb('Unable to import "' + m + '": File not found') - return + files[m] = content + gatherImports(files, importHints, cb) } - } - } while (reloop) + }) + + return + } + cb(null, { 'sources': files }) }