diff --git a/apps/remix-ide/src/app/tabs/staticanalysis/staticAnalysisView.js b/apps/remix-ide/src/app/tabs/staticanalysis/staticAnalysisView.js
deleted file mode 100644
index 668adab89e..0000000000
--- a/apps/remix-ide/src/app/tabs/staticanalysis/staticAnalysisView.js
+++ /dev/null
@@ -1,302 +0,0 @@
-'use strict'
-var StaticAnalysisRunner = require('@remix-project/remix-analyzer').CodeAnalysis
-var yo = require('yo-yo')
-var $ = require('jquery')
-var remixLib = require('@remix-project/remix-lib')
-var utils = remixLib.util
-var css = require('./styles/staticAnalysisView-styles')
-var Renderer = require('../../ui/renderer')
-const SourceHighlighter = require('../../editor/sourceHighlighter')
-
-var EventManager = require('../../../lib/events')
-
-function staticAnalysisView (localRegistry, analysisModule) {
- var self = this
- this.event = new EventManager()
- this.view = null
- this.runner = new StaticAnalysisRunner()
- this.modulesView = this.renderModules()
- this.lastCompilationResult = null
- this.lastCompilationSource = null
- this.currentFile = 'No file compiled'
- this.sourceHighlighter = new SourceHighlighter()
- this.analysisModule = analysisModule
- self._components = {
- renderer: new Renderer(analysisModule)
- }
- self._components.registry = localRegistry
- // dependencies
- self._deps = {
- offsetToLineColumnConverter: self._components.registry.get('offsettolinecolumnconverter').api
- }
-
- analysisModule.on('solidity', 'compilationFinished', (file, source, languageVersion, data) => {
- self.lastCompilationResult = null
- self.lastCompilationSource = null
- if (languageVersion.indexOf('soljson') !== 0) return
- self.lastCompilationResult = data
- self.lastCompilationSource = source
- self.currentFile = file
- self.correctRunBtnDisabled()
- if (self.view && self.view.querySelector('#autorunstaticanalysis').checked) {
- self.run()
- }
- })
-}
-
-staticAnalysisView.prototype.render = function () {
- this.runBtn = yo``
- const view = yo`
-
-
-
- ${this.modulesView}
-
-
- last results for:
- ${this.currentFile}
-
-
-
- `
-
- if (!this.view) {
- this.view = view
- }
- this.correctRunBtnDisabled()
- return view
-}
-
-staticAnalysisView.prototype.selectedModules = function () {
- if (!this.view) {
- return []
- }
- const selected = this.view.querySelectorAll('[name="staticanalysismodule"]:checked')
- var toRun = []
- for (var i = 0; i < selected.length; i++) {
- toRun.push(selected[i].attributes.index.value)
- }
- return toRun
-}
-
-staticAnalysisView.prototype.run = function () {
- if (!this.view) {
- return
- }
- const highlightLocation = async (location, fileName) => {
- await this.analysisModule.call('editor', 'discardHighlight')
- await this.analysisModule.call('editor', 'highlight', location, fileName)
- }
- const selected = this.selectedModules()
- const warningContainer = $('#staticanalysisresult')
- warningContainer.empty()
- this.view.querySelector('#staticAnalysisCurrentFile').innerText = this.currentFile
- var self = this
- if (this.lastCompilationResult && selected.length) {
- this.runBtn.removeAttribute('disabled')
- let warningCount = 0
- this.runner.run(this.lastCompilationResult, selected, (results) => {
- const groupedModules = utils.groupBy(preProcessModules(this.runner.modules()), 'categoryId')
- results.map((result, j) => {
- let moduleName
- Object.keys(groupedModules).map((key) => {
- groupedModules[key].forEach((el) => {
- if (el.name === result.name) {
- moduleName = groupedModules[key][0].categoryDisplayName
- }
- })
- })
- const alreadyExistedEl = this.view.querySelector(`[id="staticAnalysisModule${moduleName}"]`)
- if (!alreadyExistedEl) {
- warningContainer.append(`
-
- ${moduleName}
-
- `)
- }
-
- result.report.map((item, i) => {
- let location = ''
- let locationString = 'not available'
- let column = 0
- let row = 0
- let fileName = this.currentFile
- if (item.location) {
- var split = item.location.split(':')
- var file = split[2]
- location = {
- start: parseInt(split[0]),
- length: parseInt(split[1])
- }
- location = self._deps.offsetToLineColumnConverter.offsetToLineColumn(
- location,
- parseInt(file),
- self.lastCompilationSource.sources,
- self.lastCompilationResult.sources
- )
- row = location.start.line
- column = location.start.column
- locationString = (row + 1) + ':' + column + ':'
- fileName = Object.keys(self.lastCompilationResult.contracts)[file]
- }
- warningCount++
- const msg = yo`
-
- ${result.name}
- ${item.warning}
- ${item.more ? yo`more` : yo``}
- Pos: ${locationString}
- `
- self._components.renderer.error(
- msg,
- this.view.querySelector(`[id="staticAnalysisModule${moduleName}"]`),
- {
- click: () => highlightLocation(location, fileName),
- type: 'warning',
- useSpan: true,
- errFile: fileName,
- errLine: row,
- errCol: column
- }
- )
- })
- })
- // hide empty staticAnalysisModules sections
- this.view.querySelectorAll('[name="staticAnalysisModules"]').forEach((section) => {
- if (!section.getElementsByClassName('alert-warning').length) section.hidden = true
- })
- self.event.trigger('staticAnaysisWarning', [warningCount])
- })
- } else {
- this.runBtn.setAttribute('disabled', 'disabled')
- if (selected.length) {
- warningContainer.html('No compiled AST available')
- }
- self.event.trigger('staticAnaysisWarning', [-1])
- }
-}
-staticAnalysisView.prototype.checkModule = function (event) {
- const selected = this.view.querySelectorAll('[name="staticanalysismodule"]:checked')
- const checkAll = this.view.querySelector('[id="checkAllEntries"]')
- this.correctRunBtnDisabled()
- if (event.target.checked) {
- checkAll.checked = true
- } else if (!selected.length) {
- checkAll.checked = false
- }
-}
-staticAnalysisView.prototype.correctRunBtnDisabled = function () {
- if (!this.view) {
- return
- }
- const selected = this.view.querySelectorAll('[name="staticanalysismodule"]:checked')
- if (this.lastCompilationResult && selected.length !== 0) {
- this.runBtn.removeAttribute('disabled')
- } else {
- this.runBtn.setAttribute('disabled', 'disabled')
- }
-}
-staticAnalysisView.prototype.checkAll = function (event) {
- if (!this.view) {
- return
- }
- // checks/unchecks all
- const checkBoxes = this.view.querySelectorAll('[name="staticanalysismodule"]')
- checkBoxes.forEach((checkbox) => { checkbox.checked = event.target.checked })
- this.correctRunBtnDisabled()
-}
-
-staticAnalysisView.prototype.handleCollapse = function (e) {
- const downs = e.toElement.parentElement.getElementsByClassName('fas fa-angle-double-right')
- const iEls = document.getElementsByTagName('i')
- for (var i = 0; i < iEls.length; i++) { iEls[i].hidden = false }
- downs[0].hidden = true
-}
-
-staticAnalysisView.prototype.renderModules = function () {
- const groupedModules = utils.groupBy(preProcessModules(this.runner.modules()), 'categoryId')
- const moduleEntries = Object.keys(groupedModules).map((categoryId, i) => {
- const category = groupedModules[categoryId]
- const entriesDom = category.map((item, i) => {
- return yo`
-
- `
- })
- return yo`
-
-
this.handleCollapse(e)}"/>
-
-
- ${entriesDom}
-
-
- `
- })
- // collaps first module
- moduleEntries[0].getElementsByTagName('input')[0].checked = true
- moduleEntries[0].getElementsByTagName('i')[0].hidden = true
- return yo`
-
- ${moduleEntries}
-
`
-}
-
-module.exports = staticAnalysisView
-
-/**
- * @dev Process & categorize static analysis modules to show them on UI
- * @param arr list of static analysis modules received from remix-analyzer module
- */
-function preProcessModules (arr) {
- return arr.map((Item, i) => {
- const itemObj = new Item()
- itemObj._index = i
- itemObj.categoryDisplayName = itemObj.category.displayName
- itemObj.categoryId = itemObj.category.id
- return itemObj
- })
-}
diff --git a/apps/remix-ide/src/app/tabs/staticanalysis/styles/staticAnalysisView-styles.js b/apps/remix-ide/src/app/tabs/staticanalysis/styles/staticAnalysisView-styles.js
deleted file mode 100644
index bd277a03aa..0000000000
--- a/apps/remix-ide/src/app/tabs/staticanalysis/styles/staticAnalysisView-styles.js
+++ /dev/null
@@ -1,36 +0,0 @@
-var csjs = require('csjs-inject')
-
-var css = csjs`
- .analysis {
- display: flex;
- flex-direction: column;
- }
- .result {
- margin-top: 1%;
- max-height: 300px;
- word-break: break-word;
- }
- .buttons {
- margin: 1rem 0;
- }
- .label {
- display: flex;
- align-items: center;
- }
- .label {
- display: flex;
- align-items: center;
- user-select: none;
- }
- .block input[type='radio']:checked ~ .entries{
- height: auto;
- transition: .5s ease-in;
- }
- .entries{
- height: 0;
- overflow: hidden;
- transition: .5s ease-out;
- }
-`
-
-module.exports = css
diff --git a/libs/remix-ui/static-analyser/src/lib/remix-ui-static-analyser.tsx b/libs/remix-ui/static-analyser/src/lib/remix-ui-static-analyser.tsx
index 7bcdd9d0a3..8cae6c9e60 100644
--- a/libs/remix-ui/static-analyser/src/lib/remix-ui-static-analyser.tsx
+++ b/libs/remix-ui/static-analyser/src/lib/remix-ui-static-analyser.tsx
@@ -81,27 +81,30 @@ export const RemixUiStaticAnalyser = (props: RemixUiStaticAnalyserProps) => {
})
const [warningState, setWarningState] = useState([])
- useEffect(() => {
- if (autoRun) {
- const setCompilationResult = async (data, source, file) => {
- await setResult({ lastCompilationResult: data, lastCompilationSource: source, currentFile: file })
- }
+ const executeCompilation = () => {
+ const setCompilationResult = async (data, source, file) => {
+ await setResult({ lastCompilationResult: data, lastCompilationSource: source, currentFile: file })
+ }
- if (props.analysisModule) {
- props.analysisModule.on(
- 'solidity',
- 'compilationFinished',
- (file, source, languageVersion, data) => {
- if (languageVersion.indexOf('soljson') !== 0) return
- setCompilationResult(data, source, file)
- if (categoryIndex.length > 0) {
- run(data, source, file)
- }
+ if (props.analysisModule) {
+ props.analysisModule.on(
+ 'solidity',
+ 'compilationFinished',
+ (file, source, languageVersion, data) => {
+ if (languageVersion.indexOf('soljson') !== 0) return
+ setCompilationResult(data, source, file)
+ if (categoryIndex.length > 0) {
+ run(data, source, file)
}
- )
- }
+ }
+ )
}
+ }
+ useEffect(() => {
+ if (autoRun) {
+ executeCompilation()
+ }
return () => { }
}, [autoRun, categoryIndex])
@@ -270,6 +273,7 @@ export const RemixUiStaticAnalyser = (props: RemixUiStaticAnalyserProps) => {
label={item.description}
onClick={event => handleCheckSingle(event, item._index)}
checked={categoryIndex.includes(item._index.toString())}
+ onChange={() => {}}
/>
)
@@ -297,7 +301,7 @@ export const RemixUiStaticAnalyser = (props: RemixUiStaticAnalyserProps) => {
expand={false}
>
- handleCheckOrUncheckCategory(category)} id={categoryId} inputType="checkbox" label={`Select ${category[0].categoryDisplayName}`} name='checkCategoryEntry' checked={category.map(x => x._index.toString()).every(el => categoryIndex.includes(el))} />
+ handleCheckOrUncheckCategory(category)} id={categoryId} inputType="checkbox" label={`Select ${category[0].categoryDisplayName}`} name='checkCategoryEntry' checked={category.map(x => x._index.toString()).every(el => categoryIndex.includes(el))} onChange={() => {}}/>
{category.map((item, i) => {
@@ -327,6 +331,7 @@ export const RemixUiStaticAnalyser = (props: RemixUiStaticAnalyserProps) => {
}).flat().every(el => categoryIndex.includes(el))}
label="Select all"
onClick={() => handleCheckAllModules(groupedModules)}
+ onChange={() => {}}
/>
{
onClick={handleAutoRun}
checked={autoRun}
label="Autorun"
+ onChange={() => {}}
/>