Commit 324a8778 authored by yann300's avatar yann300

move solidity compiler to compile tab

parent 398e123c
'use strict' 'use strict'
var $ = require('jquery')
var csjs = require('csjs-inject') var csjs = require('csjs-inject')
var yo = require('yo-yo') var yo = require('yo-yo')
var async = require('async') var async = require('async')
var request = require('request') var request = require('request')
var remixLib = require('remix-lib') var remixLib = require('remix-lib')
var remixTests = require('remix-tests')
var EventManager = require('./lib/events') var EventManager = require('./lib/events')
var registry = require('./global/registry') var registry = require('./global/registry')
...@@ -14,7 +12,6 @@ var UniversalDApp = require('./universal-dapp.js') ...@@ -14,7 +12,6 @@ var UniversalDApp = require('./universal-dapp.js')
var UniversalDAppUI = require('./universal-dapp-ui.js') var UniversalDAppUI = require('./universal-dapp-ui.js')
var Remixd = require('./lib/remixd') var Remixd = require('./lib/remixd')
var OffsetToLineColumnConverter = require('./lib/offsetToLineColumnConverter') var OffsetToLineColumnConverter = require('./lib/offsetToLineColumnConverter')
var QueryParams = require('./lib/query-params') var QueryParams = require('./lib/query-params')
var GistHandler = require('./lib/gist-handler') var GistHandler = require('./lib/gist-handler')
var helper = require('./lib/helper') var helper = require('./lib/helper')
...@@ -24,7 +21,6 @@ var BrowserfilesTree = require('./app/files/browser-files-tree') ...@@ -24,7 +21,6 @@ var BrowserfilesTree = require('./app/files/browser-files-tree')
var SharedFolder = require('./app/files/shared-folder') var SharedFolder = require('./app/files/shared-folder')
var Config = require('./config') var Config = require('./config')
var Renderer = require('./app/ui/renderer') var Renderer = require('./app/ui/renderer')
var Compiler = require('remix-solidity').Compiler
var executionContext = require('./execution-context') var executionContext = require('./execution-context')
var FilePanel = require('./app/panels/file-panel') var FilePanel = require('./app/panels/file-panel')
var EditorPanel = require('./app/panels/editor-panel') var EditorPanel = require('./app/panels/editor-panel')
...@@ -34,7 +30,6 @@ var modalDialogCustom = require('./app/ui/modal-dialog-custom') ...@@ -34,7 +30,6 @@ var modalDialogCustom = require('./app/ui/modal-dialog-custom')
var TxLogger = require('./app/execution/txLogger') var TxLogger = require('./app/execution/txLogger')
var Txlistener = remixLib.execution.txListener var Txlistener = remixLib.execution.txListener
var EventsDecoder = remixLib.execution.EventsDecoder var EventsDecoder = remixLib.execution.EventsDecoder
var CompilerImport = require('./app/compiler/compiler-imports')
var FileManager = require('./app/files/fileManager') var FileManager = require('./app/files/fileManager')
var BasicReadOnlyExplorer = require('./app/files/basicReadOnlyExplorer') var BasicReadOnlyExplorer = require('./app/files/basicReadOnlyExplorer')
var NotPersistedExplorer = require('./app/files/NotPersistedExplorer') var NotPersistedExplorer = require('./app/files/NotPersistedExplorer')
...@@ -125,8 +120,6 @@ class App { ...@@ -125,8 +120,6 @@ class App {
executionContext.init(self._components.config) executionContext.init(self._components.config)
executionContext.listenOnLastBlock() executionContext.listenOnLastBlock()
self._components.compilerImport = new CompilerImport()
registry.put({api: self._components.compilerImport, name: 'compilerimport'})
self._components.gistHandler = new GistHandler() self._components.gistHandler = new GistHandler()
self._components.filesProviders = {} self._components.filesProviders = {}
...@@ -270,55 +263,6 @@ class App { ...@@ -270,55 +263,6 @@ class App {
if (callback) callback(error) if (callback) callback(error)
}) })
} }
importExternal (url, cb) {
const self = this
self._components.compilerImport.import(url,
(loadingMsg) => {
toolTip(loadingMsg)
},
(error, content, cleanUrl, type, url) => {
if (!error) {
if (self._components.filesProviders[type]) {
self._components.filesProviders[type].addReadOnly(cleanUrl, content, url)
}
cb(null, content)
} else {
cb(error)
}
})
}
importFileCb (url, filecb) {
const self = this
if (url.indexOf('/remix_tests.sol') !== -1) {
return filecb(null, remixTests.assertLibCode)
}
var provider = self._components.fileManager.fileProviderOf(url)
if (provider) {
if (provider.type === 'localhost' && !provider.isConnected()) {
return filecb(`file provider ${provider.type} not available while trying to resolve ${url}`)
}
provider.exists(url, (error, exist) => {
if (error) return filecb(error)
if (exist) {
return provider.get(url, filecb)
} else {
self.importExternal(url, filecb)
}
})
} else if (self._components.compilerImport.isRelativeImport(url)) {
// try to resolve localhost modules (aka truffle imports)
var splitted = /([^/]+)\/(.*)$/g.exec(url)
async.tryEach([
(cb) => { self.importFileCb('localhost/installed_contracts/' + url, cb) },
(cb) => { if (!splitted) { cb('URL not parseable: ' + url) } else { self.importFileCb('localhost/installed_contracts/' + splitted[1] + '/contracts/' + splitted[2], cb) } },
(cb) => { self.importFileCb('localhost/node_modules/' + url, cb) },
(cb) => { if (!splitted) { cb('URL not parseable: ' + url) } else { self.importFileCb('localhost/node_modules/' + splitted[1] + '/contracts/' + splitted[2], cb) } }],
(error, result) => { filecb(error, result) }
)
} else {
self.importExternal(url, filecb)
}
}
} }
module.exports = App module.exports = App
...@@ -350,13 +294,11 @@ Please make a backup of your contracts and start using http://remix.ethereum.org ...@@ -350,13 +294,11 @@ Please make a backup of your contracts and start using http://remix.ethereum.org
registry.put({api: msg => self._components.editorpanel.logHtmlMessage(msg), name: 'logCallback'}) registry.put({api: msg => self._components.editorpanel.logHtmlMessage(msg), name: 'logCallback'})
// ----------------- Compiler ----------------- // helper for converting offset to line/column
self._components.compiler = new Compiler((url, cb) => self.importFileCb(url, cb)) var offsetToLineColumnConverter = new OffsetToLineColumnConverter()
registry.put({api: self._components.compiler, name: 'compiler'})
var offsetToLineColumnConverter = new OffsetToLineColumnConverter(self._components.compiler.event)
registry.put({api: offsetToLineColumnConverter, name: 'offsettolinecolumnconverter'}) registry.put({api: offsetToLineColumnConverter, name: 'offsettolinecolumnconverter'})
// json structure for hosting the last compilattion result
self._components.compilersArtefacts = {} // store all the possible compilation data (key represent a compiler name) self._components.compilersArtefacts = {} // store all the possible compilation data (key represent a compiler name)
registry.put({api: self._components.compilersArtefacts, name: 'compilersartefacts'}) registry.put({api: self._components.compilersArtefacts, name: 'compilersartefacts'})
......
/* global Worker */ /* global Worker */
const async = require('async')
const $ = require('jquery')
const yo = require('yo-yo') const yo = require('yo-yo')
const csjs = require('csjs-inject') const csjs = require('csjs-inject')
const copy = require('clipboard-copy') const copy = require('clipboard-copy')
var minixhr = require('minixhr') var minixhr = require('minixhr')
var remixTests = require('remix-tests')
var Compiler = require('remix-solidity').Compiler
var CompilerImport = require('../compiler/compiler-imports')
var tooltip = require('../ui/tooltip') var tooltip = require('../ui/tooltip')
var QueryParams = require('../../lib/query-params') var QueryParams = require('../../lib/query-params')
var globalRegistry = require('../../global/registry') var globalRegistry = require('../../global/registry')
...@@ -40,14 +45,17 @@ module.exports = class CompileTab { ...@@ -40,14 +45,17 @@ module.exports = class CompileTab {
self._components = {} self._components = {}
self._components.registry = localRegistry || globalRegistry self._components.registry = localRegistry || globalRegistry
self._components.queryParams = new QueryParams() self._components.queryParams = new QueryParams()
self._components.compilerImport = new CompilerImport()
self._components.compiler = new Compiler((url, cb) => self.importFileCb(url, cb))
// dependencies // dependencies
self._deps = { self._deps = {
editor: self._components.registry.get('editor').api, editor: self._components.registry.get('editor').api,
config: self._components.registry.get('config').api, config: self._components.registry.get('config').api,
compiler: self._components.registry.get('compiler').api,
renderer: self._components.registry.get('renderer').api, renderer: self._components.registry.get('renderer').api,
swarmfileProvider: self._components.registry.get('fileproviders/swarm').api, swarmfileProvider: self._components.registry.get('fileproviders/swarm').api,
fileManager: self._components.registry.get('filemanager').api fileManager: self._components.registry.get('filemanager').api,
fileProviders: self._components.registry.get('fileproviders').api,
} }
self.data = { self.data = {
hideWarnings: self._deps.config.get('hideWarnings') || false, hideWarnings: self._deps.config.get('hideWarnings') || false,
...@@ -63,7 +71,7 @@ module.exports = class CompileTab { ...@@ -63,7 +71,7 @@ module.exports = class CompileTab {
self.data.optimize = self._components.queryParams.get().optimize self.data.optimize = self._components.queryParams.get().optimize
self.data.optimize = self.data.optimize === 'true' self.data.optimize = self.data.optimize === 'true'
self._components.queryParams.update({ optimize: self.data.optimize }) self._components.queryParams.update({ optimize: self.data.optimize })
self._deps.compiler.setOptimize(self.data.optimize) self._components.compiler.setOptimize(self.data.optimize)
self._deps.editor.event.register('contentChanged', scheduleCompilation) self._deps.editor.event.register('contentChanged', scheduleCompilation)
self._deps.editor.event.register('sessionSwitched', scheduleCompilation) self._deps.editor.event.register('sessionSwitched', scheduleCompilation)
...@@ -72,7 +80,7 @@ module.exports = class CompileTab { ...@@ -72,7 +80,7 @@ module.exports = class CompileTab {
if (self.data.compileTimeout) window.clearTimeout(self.data.compileTimeout) if (self.data.compileTimeout) window.clearTimeout(self.data.compileTimeout)
self.data.compileTimeout = window.setTimeout(() => self.runCompiler(), self.data.timeout) self.data.compileTimeout = window.setTimeout(() => self.runCompiler(), self.data.timeout)
} }
self._deps.compiler.event.register('compilationDuration', function tabHighlighting (speed) { self._components.compiler.event.register('compilationDuration', function tabHighlighting (speed) {
if (!self._view.warnCompilationSlow) return if (!self._view.warnCompilationSlow) return
if (speed > self.data.maxTime) { if (speed > self.data.maxTime) {
const msg = `Last compilation took ${speed}ms. We suggest to turn off autocompilation.` const msg = `Last compilation took ${speed}ms. We suggest to turn off autocompilation.`
...@@ -86,13 +94,13 @@ module.exports = class CompileTab { ...@@ -86,13 +94,13 @@ module.exports = class CompileTab {
if (!self._view.compileIcon) return if (!self._view.compileIcon) return
self._view.compileIcon.classList.add(`${css.bouncingIcon}`) // @TODO: compileView tab self._view.compileIcon.classList.add(`${css.bouncingIcon}`) // @TODO: compileView tab
}) })
self._deps.compiler.event.register('loadingCompiler', function start () { self._components.compiler.event.register('loadingCompiler', function start () {
if (!self._view.compileIcon) return if (!self._view.compileIcon) return
self._view.compileIcon.classList.add(`${css.spinningIcon}`) self._view.compileIcon.classList.add(`${css.spinningIcon}`)
self._view.warnCompilationSlow.style.visibility = 'hidden' self._view.warnCompilationSlow.style.visibility = 'hidden'
self._view.compileIcon.setAttribute('title', 'compiler is loading, please wait a few moments.') self._view.compileIcon.setAttribute('title', 'compiler is loading, please wait a few moments.')
}) })
self._deps.compiler.event.register('compilationStarted', function start () { self._components.compiler.event.register('compilationStarted', function start () {
if (!self._view.compileIcon) return if (!self._view.compileIcon) return
self._view.errorContainer.innerHTML = '' self._view.errorContainer.innerHTML = ''
self._view.errorContainerHead.innerHTML = '' self._view.errorContainerHead.innerHTML = ''
...@@ -100,12 +108,12 @@ module.exports = class CompileTab { ...@@ -100,12 +108,12 @@ module.exports = class CompileTab {
self._view.compileIcon.classList.add(`${css.spinningIcon}`) self._view.compileIcon.classList.add(`${css.spinningIcon}`)
self._view.compileIcon.setAttribute('title', 'compiling...') self._view.compileIcon.setAttribute('title', 'compiling...')
}) })
self._deps.compiler.event.register('compilerLoaded', function loaded () { self._components.compiler.event.register('compilerLoaded', function loaded () {
if (!self._view.compileIcon) return if (!self._view.compileIcon) return
self._view.compileIcon.classList.remove(`${css.spinningIcon}`) self._view.compileIcon.classList.remove(`${css.spinningIcon}`)
self._view.compileIcon.setAttribute('title', '') self._view.compileIcon.setAttribute('title', '')
}) })
self._deps.compiler.event.register('compilationFinished', function finish (success, data, source) { self._components.compiler.event.register('compilationFinished', function finish (success, data, source) {
if (self._view.compileIcon) { if (self._view.compileIcon) {
const compileTab = document.querySelector('.compileView') const compileTab = document.querySelector('.compileView')
compileTab.style.color = styles.colors.black compileTab.style.color = styles.colors.black
...@@ -120,8 +128,8 @@ module.exports = class CompileTab { ...@@ -120,8 +128,8 @@ module.exports = class CompileTab {
self._view.contractNames.innerHTML = '' self._view.contractNames.innerHTML = ''
if (success) { if (success) {
self._view.contractNames.removeAttribute('disabled') self._view.contractNames.removeAttribute('disabled')
self._deps.compiler.visitContracts(contract => { self._components.compiler.visitContracts(contract => {
self.data.contractsDetails[contract.name] = parseContracts(contract.name, contract.object, self._deps.compiler.getSource(contract.file)) self.data.contractsDetails[contract.name] = parseContracts(contract.name, contract.object, self._components.compiler.getSource(contract.file))
var contractName = yo`<option>${contract.name}</option>` var contractName = yo`<option>${contract.name}</option>`
self._view.contractNames.appendChild(contractName) self._view.contractNames.appendChild(contractName)
}) })
...@@ -159,7 +167,7 @@ module.exports = class CompileTab { ...@@ -159,7 +167,7 @@ module.exports = class CompileTab {
}) })
} }
if (!error && data.contracts) { if (!error && data.contracts) {
self._deps.compiler.visitContracts((contract) => { self._components.compiler.visitContracts((contract) => {
self._deps.renderer.error(contract.name, self._view.errorContainer, {type: 'success'}) self._deps.renderer.error(contract.name, self._view.errorContainer, {type: 'success'})
}) })
} }
...@@ -190,11 +198,11 @@ module.exports = class CompileTab { ...@@ -190,11 +198,11 @@ module.exports = class CompileTab {
function onchangeOptimize (event) { function onchangeOptimize (event) {
self.data.optimize = !!self._view.optimize.checked self.data.optimize = !!self._view.optimize.checked
self._components.queryParams.update({ optimize: self.data.optimize }) self._components.queryParams.update({ optimize: self.data.optimize })
self._deps.compiler.setOptimize(self.data.optimize) self._components.compiler.setOptimize(self.data.optimize)
self.runCompiler() self.runCompiler()
} }
self._deps.compiler.event.register('compilerLoaded', (version) => self.setVersionText(version)) self._components.compiler.event.register('compilerLoaded', (version) => self.setVersionText(version))
self.fetchAllVersion((allversions, selectedVersion) => { self.fetchAllVersion((allversions, selectedVersion) => {
self.data.allversions = allversions self.data.allversions = allversions
self.data.selectedVersion = selectedVersion self.data.selectedVersion = selectedVersion
...@@ -432,10 +440,10 @@ module.exports = class CompileTab { ...@@ -432,10 +440,10 @@ module.exports = class CompileTab {
// Workers cannot load js on "file:"-URLs and we get a // Workers cannot load js on "file:"-URLs and we get a
// "Uncaught RangeError: Maximum call stack size exceeded" error on Chromium, // "Uncaught RangeError: Maximum call stack size exceeded" error on Chromium,
// resort to non-worker version in that case. // resort to non-worker version in that case.
self._deps.compiler.loadVersion(true, url) self._components.compiler.loadVersion(true, url)
self.setVersionText('(loading using worker)') self.setVersionText('(loading using worker)')
} else { } else {
self._deps.compiler.loadVersion(false, url) self._components.compiler.loadVersion(false, url)
self.setVersionText('(loading)') self.setVersionText('(loading)')
} }
} }
...@@ -477,7 +485,7 @@ module.exports = class CompileTab { ...@@ -477,7 +485,7 @@ module.exports = class CompileTab {
console.log(error) console.log(error)
} else { } else {
sources[target] = { content } sources[target] = { content }
self.compiler.compile(sources, target) self._components.compiler.compile(sources, target)
} }
}) })
} else { } else {
...@@ -486,6 +494,55 @@ module.exports = class CompileTab { ...@@ -486,6 +494,55 @@ module.exports = class CompileTab {
} }
} }
} }
importExternal (url, cb) {
const self = this
self._components.compilerImport.import(url,
(loadingMsg) => {
toolTip(loadingMsg)
},
(error, content, cleanUrl, type, url) => {
if (!error) {
if (self._deps.filesProviders[type]) {
self._deps.filesProviders[type].addReadOnly(cleanUrl, content, url)
}
cb(null, content)
} else {
cb(error)
}
})
}
importFileCb (url, filecb) {
const self = this
if (url.indexOf('/remix_tests.sol') !== -1) {
return filecb(null, remixTests.assertLibCode)
}
var provider = self._deps.fileManager.fileProviderOf(url)
if (provider) {
if (provider.type === 'localhost' && !provider.isConnected()) {
return filecb(`file provider ${provider.type} not available while trying to resolve ${url}`)
}
provider.exists(url, (error, exist) => {
if (error) return filecb(error)
if (exist) {
return provider.get(url, filecb)
} else {
self.importExternal(url, filecb)
}
})
} else if (self._components.compilerImport.isRelativeImport(url)) {
// try to resolve localhost modules (aka truffle imports)
var splitted = /([^/]+)\/(.*)$/g.exec(url)
async.tryEach([
(cb) => { self.importFileCb('localhost/installed_contracts/' + url, cb) },
(cb) => { if (!splitted) { cb('URL not parseable: ' + url) } else { self.importFileCb('localhost/installed_contracts/' + splitted[1] + '/contracts/' + splitted[2], cb) } },
(cb) => { self.importFileCb('localhost/node_modules/' + url, cb) },
(cb) => { if (!splitted) { cb('URL not parseable: ' + url) } else { self.importFileCb('localhost/node_modules/' + splitted[1] + '/contracts/' + splitted[2], cb) } }],
(error, result) => { filecb(error, result) }
)
} else {
self.importExternal(url, filecb)
}
}
} }
const css = csjs` const css = csjs`
......
'use strict' 'use strict'
var SourceMappingDecoder = require('remix-lib').SourceMappingDecoder var SourceMappingDecoder = require('remix-lib').SourceMappingDecoder
function offsetToColumnConverter (compilerEvent) { function offsetToColumnConverter () {
this.lineBreakPositionsByContent = {} this.lineBreakPositionsByContent = {}
this.sourceMappingDecoder = new SourceMappingDecoder() this.sourceMappingDecoder = new SourceMappingDecoder()
var self = this var self = this
compilerEvent.register('compilationFinished', function (success, data, source) { // we don't listen anymore on compilation result for clearing the cache
self.clear()
})
} }
offsetToColumnConverter.prototype.offsetToLineColumn = function (rawLocation, file, sources, asts) { offsetToColumnConverter.prototype.offsetToLineColumn = function (rawLocation, file, sources, asts) {
......
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