diff --git a/apps/remix-ide/src/app/tabs/analysis-tab.js b/apps/remix-ide/src/app/tabs/analysis-tab.js index d718943408..6dbf725fcd 100644 --- a/apps/remix-ide/src/app/tabs/analysis-tab.js +++ b/apps/remix-ide/src/app/tabs/analysis-tab.js @@ -10,8 +10,8 @@ var EventManager = require('../../lib/events') const profile = { name: 'solidityStaticAnalysis', - displayName: 'Solidity Analyzers', - methods: [], + displayName: 'Solidity static analysis', + methods: ['changedStatus'], events: [], icon: 'assets/img/staticAnalysis.webp', description: 'Checks the contract code for security vulnerabilities and bad practices.', @@ -27,6 +27,16 @@ class AnalysisTab extends ViewPlugin { super(profile) this.event = new EventManager() this.events = new EventEmitter() + /** + * @type {Array<{ + formattedMessage: string; + type: "warning" | "error"; + column: number; + line: number; + }>} + * @description Array of objects containing the results of Linting + */ + this.hints = [] this.registry = Registry.getInstance() this.element = document.createElement('div') this.element.setAttribute('id', 'staticAnalyserView') @@ -47,9 +57,20 @@ class AnalysisTab extends ViewPlugin { } this.event.register('staticAnaysisWarning', (count) => { - if (count > 0) { - this.emit('statusChanged', { key: count, title: `${count} warning${count === 1 ? '' : 's'}`, type: 'warning' }) - } else if (count === 0) { + let payloadType = '' + this.hints.forEach(hint => { + if (hint.type === 'error') { + payloadType = 'error' + } else if (hint.type === 'warning' && payloadType !== 'error') { + payloadType = 'warning' + } + }) + console.log('what is payload type?', payloadType) + console.log('Is hints updated yet?', this.hints) + if (count > 0 && this.hints.length > 0) { + const totalCount = count === this.hints.length ? count : count + this.hints.length + this.emit('statusChanged', { key: totalCount, title: `${totalCount} warning${totalCount === 1 ? '' : 's'}`, type: payloadType }) + } else if (count === 0 && this.hints.length === 0) { this.emit('statusChanged', { key: 'succeed', title: 'no warning', type: 'success' }) } else { // count ==-1 no compilation result @@ -58,6 +79,24 @@ class AnalysisTab extends ViewPlugin { }) } + /** + * Takes payload (an Array of Objects) emitted by Solhint and raises the status changed event. + * The payload sent has to be a result which should at a minimum have + * type which could be error || warning. + * @param {Array} payload + */ + async changedStatus (payload) { + let payloadType = `${payload.includes(p => p.type === 'error') ? 'error' : 'warning'}` + if(payload.length > 0) { + this.emit('statusChanged', + { key: payload.length, title: `${payload.length} warning${payload.length === 1 ? '' : 's'} or errors`, type: payloadType}) + } else if (payload.length === 0) { + this.emit('statusChanged', { key: 'succeed', title: 'no warning or errors', type: 'success' }) + } else { + this.emit('statusChanged', { key: 'none' }) + } + } + setDispatch (dispatch) { this.dispatch = dispatch this.renderComponent()