Merge pull request #1781 from ethereum/statusAPI_remixplugin

status API
pull/3094/head
yann300 6 years ago committed by GitHub
commit 2359294653
  1. 61
      src/app/components/vertical-icons-component.js
  2. 3
      src/app/editor/contextualListener.js
  3. 1
      src/app/staticanalysis/staticAnalysisView.js
  4. 9
      src/app/tabs/analysis-tab.js
  5. 4
      src/app/tabs/compile-tab.js

@ -1,5 +1,6 @@
var yo = require('yo-yo')
var csjs = require('csjs-inject')
var helper = require('../../lib/helper')
const EventEmitter = require('events')
@ -11,33 +12,75 @@ class VerticalIconComponent {
this.events = new EventEmitter()
this.icons = {}
this.iconKind = {}
this.iconStatus = {}
this.name = name
this.store.event.on('activate', (name) => {
const { profile } = this.store.getOne(name)
if (!profile.icon) return
if (profile.location === this.name || !profile.location) {
this.addIcon(profile)
const api = this.store.getOne(name)
if (!api.profile.icon) return
if (api.profile.location === this.name || !api.profile.location) {
this.addIcon(api.profile)
this.listenOnStatus(api)
}
})
this.store.event.on('deactivate', (name) => {
const api = this.store.getOne(name)
if (api && this.icons[name]) this.removeIcon(api.profile)
if (api && this.icons[name]) {
this.removeIcon(api.profile)
this.stopListenOnStatus(api)
}
})
this.store.event.on('add', (api) => { })
this.store.event.on('remove', (api) => { })
}
stopListenOnStatus (api) {
if (!api.events) return
let fn = this.iconStatus[api.profile.name]
if (fn) {
api.events.remove('statusChanged', fn)
delete this.iconStatus[api.profile.name]
}
}
listenOnStatus (api) {
if (!api.events) return
const fn = (status) => {
this.setIconStatus(api.profile.name, status)
}
this.iconStatus[api.profile.name] = fn
api.events.on('statusChanged', this.iconStatus[api.profile.name])
}
/**
* Add an icon to the map
* @param {ModuleProfile} profile The profile of the module
*/
addIcon ({kind, name, icon}) {
this.icons[name] = yo`<div class="${css.icon}" onclick="${(e) => { this._iconClick(name) }}" title="${name}" ><img src="${icon}" alt="${name}" /></div>`
this.iconKind[kind || 'other'].appendChild(this.icons[name])
}
/**
* Set a new status for the @arg name
* @param {String} name
* @param {Object} status
*/
setIconStatus (name, status) {
const el = this.icons[name]
if (!el) return
let statusEl = el.querySelector('i')
if (statusEl) {
el.removeChild(statusEl)
}
if (status.key) {
let key = helper.checkSpecialChars(status.key) ? '' : status.key
let type = helper.checkSpecialChars(status.type) ? '' : status.type
let title = helper.checkSpecialChars(status.title) ? '' : status.title
el.appendChild(yo`<i title="${title}" class="fa fa-${key} ${css.status} text-${type}" aria-hidden="true"></i>`)
}
}
/**
* Remove an icon from the map
* @param {ModuleProfile} profile The profile of the module
@ -136,6 +179,7 @@ const css = csjs`
width: 36px;
height: 36px;
padding: 3px;
position: relative;
}
.icon img {
width: 28px;
@ -157,4 +201,9 @@ const css = csjs`
position: absolute;
bottom: 0;
}
.status {
position: absolute;
bottom: 0;
right: 0;
}
`

@ -69,6 +69,7 @@ class ContextualListener {
this.currentPosition = cursorPosition
return
}
this._stopHighlighting()
this.currentPosition = cursorPosition
this.currentFile = file
if (compilationResult && compilationResult.data && compilationResult.data.sources[file]) {
@ -78,7 +79,7 @@ class ContextualListener {
this._highlightExpressions(nodes[nodes.length - 1], compilationResult)
}
this.event.trigger('contextChanged', [nodes])
} else this._stopHighlighting()
}
}
_buildIndex (compilationResult, source) {

@ -125,6 +125,7 @@ staticAnalysisView.prototype.run = function () {
})
} else {
warningContainer.html('No compiled AST available')
self.event.trigger('staticAnaysisWarning', [0])
}
}

@ -4,12 +4,14 @@ var EventManager = require('../../lib/events')
var css = require('./styles/analysis-tab-styles')
import { ApiFactory } from 'remix-plugin'
import { EventEmitter } from 'events'
class AnalysisTab extends ApiFactory {
constructor (registry) {
super()
this.event = new EventManager()
this.events = new EventEmitter()
this.registry = registry
}
@ -27,6 +29,13 @@ class AnalysisTab extends ApiFactory {
render () {
var staticanalysis = new StaticAnalysis()
staticanalysis.event.register('staticAnaysisWarning', (count) => {
if (count) {
this.events.emit('statusChanged', {key: 'exclamation-triangle', title: count + ' warnings', type: 'warning'})
} else {
this.events.emit('statusChanged', {key: 'check', title: 'no warning', type: 'success'})
}
})
this.registry.put({api: staticanalysis, name: 'staticanalysis'})
if (this.el) return this.el

@ -79,6 +79,7 @@ class CompileTab extends ApiFactory {
if (this._view.errorContainer) {
this._view.errorContainer.innerHTML = ''
}
this.events.emit('statusChanged', {key: 'spinner', title: 'compiling...', type: 'info'})
})
this.fileManager.events.on('currentFileChanged', (name) => {
@ -88,6 +89,7 @@ class CompileTab extends ApiFactory {
if (success) {
// forwarding the event to the appManager infra
this.events.emit('compilationFinished', source.target, source, 'soljson', data)
this.events.emit('statusChanged', {key: 'check', title: 'compilation successful', type: 'success'})
// Store the contracts
this.data.contractsDetails = {}
this.compiler.visitContracts((contract) => {
@ -97,6 +99,8 @@ class CompileTab extends ApiFactory {
this.compiler.getSource(contract.file)
)
})
} else {
this.events.emit('statusChanged', {key: 'exclamation', title: 'compilation failed', type: 'danger'})
}
// Update contract Selection
let contractMap = {}

Loading…
Cancel
Save