add staticAnalysis runner, viewer

pull/1/head
yann300 8 years ago
parent 21d1a5db2d
commit 31fa63e257
  1. 30
      src/app/staticanalysis/staticAnalysisRunner.js
  2. 79
      src/app/staticanalysis/staticAnalysisView.js

@ -0,0 +1,30 @@
'use strict'
var AstWalker = require('ethereum-remix').util.AstWalker
var list = require('./modules/list')
function staticAnalysisRunner () {
}
staticAnalysisRunner.prototype.run = function (ast, toRun, callback) {
var walker = new AstWalker()
for (var k in ast) {
walker.walk(ast[k].AST, {'*': function (node) {
toRun.map(function (item, i) {
item.visit(node)
})
return true
}})
}
var reports = []
toRun.map(function (item, i) {
reports.push(item.report())
})
callback(reports)
}
staticAnalysisRunner.prototype.modules = function () {
return list
}
module.exports = staticAnalysisRunner

@ -0,0 +1,79 @@
'use strict'
var StaticAnalysisRunner = require('./staticAnalysisRunner.js')
var yo = require('yo-yo')
var $ = require('jquery')
function staticAnalysisView (compiler, renderer) {
this.view = null
this.renderer = renderer
this.runner = new StaticAnalysisRunner()
this.modulesView = renderModules(this.runner.modules())
this.lastASTs = null
var self = this
compiler.event.register('compilationFinished', function (success, data, source) {
self.lastASTs = null
if (success) {
self.lastASTs = data.sources
}
})
}
staticAnalysisView.prototype.render = function () {
var self = this
var view = yo`<div>
<strong>Static Analysis</strong>
<div>Select analyser to run against current compiled contracts</div>
${this.modulesView}
<div>
<button onclick=${function () { self.run() }} >Run</button>
</div>
<div id='staticanalysisresult'></div>
</div>`
if (!this.view) {
this.view = view
}
return view
}
staticAnalysisView.prototype.selectedModules = function () {
if (!this.view) {
return []
}
var selected = this.view.querySelectorAll('[name="staticanalysismodule"]')
var toRun = []
for (var i = 0; i < selected.length; i++) {
var el = selected[i]
if (el.checked) {
var analyser = this.runner.modules()[el.attributes['index'].value]
toRun.push(new analyser.Module())
}
}
return toRun
}
staticAnalysisView.prototype.run = function () {
if (!this.view) {
return
}
var selected = this.selectedModules()
var warningContainer = $('#staticanalysisresult')
warningContainer.html('')
if (this.lastASTs) {
var self = this
this.runner.run(this.lastASTs, selected, function (results) {
results.map(function (item, i) {
self.renderer.error(item.name + ':\n\n' + item.report, warningContainer, null, 'warning')
})
})
} else {
warningContainer.html('No compiled AST available')
}
}
function renderModules (modules) {
return modules.map(function (item, i) {
return yo`<div><input type="checkbox" name="staticanalysismodule" checked='true' index=${i} >${item.name} (${item.description})</div>`
})
}
module.exports = staticAnalysisView
Loading…
Cancel
Save