Commit ec1ab032 authored by chriseth's avatar chriseth Committed by GitHub

Merge pull request #291 from ethereum/import-fixes

Fix compilation with import trees
parents e1f531d4 9b62fc2d
...@@ -26,6 +26,17 @@ function Compiler (editor, handleGithubCall) { ...@@ -26,6 +26,17 @@ function Compiler (editor, handleGithubCall) {
optimize = _optimize optimize = _optimize
} }
var internalCompile = function (files, missingInputs) {
gatherImports(files, missingInputs, function (error, input) {
if (error) {
self.lastCompilationResult = null
self.event.trigger('compilationFinished', [false, { 'error': error }, files])
} else {
compileJSON(input, optimize ? 1 : 0)
}
})
}
var compile = function (missingInputs) { var compile = function (missingInputs) {
editor.clearAnnotations() editor.clearAnnotations()
self.event.trigger('compilationStarted', []) self.event.trigger('compilationStarted', [])
...@@ -34,14 +45,7 @@ function Compiler (editor, handleGithubCall) { ...@@ -34,14 +45,7 @@ function Compiler (editor, handleGithubCall) {
var files = {} var files = {}
files[utils.fileNameFromKey(editor.getCacheFile())] = input files[utils.fileNameFromKey(editor.getCacheFile())] = input
gatherImports(files, missingInputs, function (input, error) { internalCompile(files, missingInputs)
if (input === null) {
self.lastCompilationResult = null
self.event.trigger('compilationFinished', [false, { 'error': error }, files])
} else {
compileJSON(input, optimize ? 1 : 0)
}
})
} }
this.compile = compile this.compile = compile
...@@ -118,7 +122,8 @@ function Compiler (editor, handleGithubCall) { ...@@ -118,7 +122,8 @@ function Compiler (editor, handleGithubCall) {
self.lastCompilationResult = null self.lastCompilationResult = null
self.event.trigger('compilationFinished', [false, data, source]) self.event.trigger('compilationFinished', [false, data, source])
} else if (missingInputs !== undefined && missingInputs.length > 0) { } else if (missingInputs !== undefined && missingInputs.length > 0) {
compile(missingInputs) // try compiling again with the new set of inputs
internalCompile(source.sources, missingInputs)
} else { } else {
self.lastCompilationResult = { self.lastCompilationResult = {
data: data, data: data,
...@@ -207,9 +212,11 @@ function Compiler (editor, handleGithubCall) { ...@@ -207,9 +212,11 @@ function Compiler (editor, handleGithubCall) {
function gatherImports (files, importHints, cb) { function gatherImports (files, importHints, cb) {
importHints = importHints || [] importHints = importHints || []
if (!compilerAcceptsMultipleFiles) { if (!compilerAcceptsMultipleFiles) {
cb(files[editor.getCacheFile()]) cb(null, files[editor.getCacheFile()])
return 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 // eslint-disable-next-line no-useless-escape
var importRegex = /^\s*import\s*[\'\"]([^\'\"]+)[\'\"];/g var importRegex = /^\s*import\s*[\'\"]([^\'\"]+)[\'\"];/g
var reloop = false var reloop = false
...@@ -223,7 +230,11 @@ function Compiler (editor, handleGithubCall) { ...@@ -223,7 +230,11 @@ function Compiler (editor, handleGithubCall) {
if (importFilePath.startsWith('./')) { if (importFilePath.startsWith('./')) {
importFilePath = importFilePath.slice(2) importFilePath = importFilePath.slice(2)
} }
importHints.push(importFilePath)
// FIXME: should be using includes or sets, but there's also browser compatibility..
if (importHints.indexOf(importFilePath) === -1) {
importHints.push(importFilePath)
}
} }
} }
while (importHints.length > 0) { while (importHints.length > 0) {
...@@ -240,7 +251,7 @@ function Compiler (editor, handleGithubCall) { ...@@ -240,7 +251,7 @@ function Compiler (editor, handleGithubCall) {
} else if ((githubMatch = /^(https?:\/\/)?(www.)?github.com\/([^\/]*\/[^\/]*)\/(.*)/.exec(m))) { } else if ((githubMatch = /^(https?:\/\/)?(www.)?github.com\/([^\/]*\/[^\/]*)\/(.*)/.exec(m))) {
handleGithubCall(githubMatch[3], githubMatch[4], function (err, content) { handleGithubCall(githubMatch[3], githubMatch[4], function (err, content) {
if (err) { if (err) {
cb(null, 'Unable to import "' + m + '": ' + err) cb('Unable to import "' + m + '": ' + err)
return return
} }
...@@ -251,15 +262,15 @@ function Compiler (editor, handleGithubCall) { ...@@ -251,15 +262,15 @@ function Compiler (editor, handleGithubCall) {
}) })
return return
} else if (/^[^:]*:\/\//.exec(m)) { } else if (/^[^:]*:\/\//.exec(m)) {
cb(null, 'Unable to import "' + m + '": Unsupported URL') cb('Unable to import "' + m + '": Unsupported URL')
return return
} else { } else {
cb(null, 'Unable to import "' + m + '": File not found') cb('Unable to import "' + m + '": File not found')
return return
} }
} }
} while (reloop) } while (reloop)
cb({ 'sources': files }) cb(null, { 'sources': files })
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment