diff --git a/CHANGELOG.md b/CHANGELOG.md index c3dba07..9d18540 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ All notable changes to the "solidity-visual-auditor" extension will be documente ## v0.0.22 - update: solidity parser, surya (#41 #42) - fix: linter warnings (#40) +- fix: configuration changes now take effect immediately (#43) ## v0.0.21 - fix: Support VSCode for Windows (#38, #35) diff --git a/README.md b/README.md index 738e127..8bf6e91 100644 --- a/README.md +++ b/README.md @@ -272,7 +272,6 @@ This feature is provided by [Inline Bookmarks](https://marketplace.visualstudio. ## Known Issues -* changing settings may require a vscode reload. * outline view does not always refresh. **TempFix**: modify and save the file to trigger a refresh. * codelenses do not appear. **TempFix**: modify and save the file to trigger a refresh. * [github issues](https://github.com/tintinweb/vscode-solidity-auditor/issues) @@ -288,6 +287,7 @@ This feature is provided by [Inline Bookmarks](https://marketplace.visualstudio. ## v0.0.22 - update: solidity parser, surya (#41 #42) - fix: linter warnings (#40) +- fix: configuration changes now take effect immediately (#43) ## v0.0.21 - fix: Support VSCode for Windows (#38, #35) diff --git a/package.json b/package.json index 2697e41..3e6358b 100644 --- a/package.json +++ b/package.json @@ -263,7 +263,7 @@ "dependencies": { "c3-linearization": "^0.3.0", "keccak": "^2.0.0", - "solidity-parser-diligence": "0.4.14", - "surya": "0.3.2" + "solidity-parser-diligence": "0.4.15", + "surya": "0.3.3" } } diff --git a/src/extension.js b/src/extension.js index 8aefb88..89d83ba 100644 --- a/src/extension.js +++ b/src/extension.js @@ -24,7 +24,6 @@ const settings = require('./settings'); /** globals - const */ const languageId = settings.languageId; const docSelector = settings.docSelector; -const solidityVAConfig = vscode.workspace.getConfiguration('solidity-va'); const g_parser = new SolidityParser(); var activeEditor; @@ -71,8 +70,7 @@ async function setDecorations(editor, decorations){ /*** EVENTS *********************************************** */ function onInitModules(context, type){ - //mod_codelens.init(context, type, solidityVAConfig); - mod_decorator.init(context, solidityVAConfig); + mod_decorator.init(context); //globals init g_diagnostics = new DiliDiagnosticCollection(context, vscode.workspace.rootPath); @@ -369,11 +367,11 @@ function analyzeSourceUnit(cancellationToken, document){ } //annotate external calls? }); - if (solidityVAConfig.deco.arguments) { + if (settings.extensionConfig().deco.arguments) { decorations = decorations.concat(mod_decorator.semanticHighlightFunctionParameters(highlightIdentifiers)); } - if (solidityVAConfig.deco.warn.reserved){ + if (settings.extensionConfig().deco.warn.reserved){ decorations = decorations.concat(checkReservedIdentifiers(insights.contracts[contract].functions[functionName].identifiers)); decorations = decorations.concat(checkReservedIdentifiers(insights.contracts[contract].functions[functionName].arguments)); decorations = decorations.concat(checkReservedIdentifiers(insights.contracts[contract].functions[functionName].returns)); @@ -519,11 +517,11 @@ function analyzeSourceUnit(cancellationToken, document){ } //annotate external calls? }); - if (solidityVAConfig.deco.arguments) { + if (settings.extensionConfig().deco.arguments) { decorations = decorations.concat(mod_decorator.semanticHighlightFunctionParameters(highlightIdentifiers)); } - if (solidityVAConfig.deco.warn.reserved){ + if (settings.extensionConfig().deco.warn.reserved){ decorations = decorations.concat(checkReservedIdentifiers(insights.contracts[contract].modifiers[functionName].identifiers)); decorations = decorations.concat(checkReservedIdentifiers(insights.contracts[contract].modifiers[functionName].arguments)); decorations = decorations.concat(checkReservedIdentifiers(insights.contracts[contract].modifiers[functionName].returns)); @@ -532,7 +530,7 @@ function analyzeSourceUnit(cancellationToken, document){ } //decorate events for (var functionName in insights.contracts[contract].events){ - if (solidityVAConfig.deco.warn.reserved){ + if (settings.extensionConfig().deco.warn.reserved){ decorations = decorations.concat(checkReservedIdentifiers(insights.contracts[contract].events[functionName].identifiers)); decorations = decorations.concat(checkReservedIdentifiers(insights.contracts[contract].events[functionName].arguments)); decorations = decorations.concat(checkReservedIdentifiers(insights.contracts[contract].events[functionName].returns)); @@ -546,7 +544,7 @@ function analyzeSourceUnit(cancellationToken, document){ return; } - if (solidityVAConfig.deco.statevars) { + if (settings.extensionConfig().deco.statevars) { setDecorations(activeEditor, decorations); } console.log("✓ apply decorations - scope"); @@ -558,7 +556,7 @@ function onDidSave(document){ currentCancellationTokens.onDidSave.dispose(); currentCancellationTokens.onDidSave = new CancellationTokenSource(); // check if there are any - if(solidityVAConfig.diagnostics.cdili_json.import && g_diagnostics){ + if(settings.extensionConfig().diagnostics.cdili_json.import && g_diagnostics){ g_diagnostics.updateIssues(currentCancellationTokens.onDidSave.token); } @@ -599,7 +597,7 @@ function onActivate(context) { vscode.languages.reg ); - if(!solidityVAConfig.mode.active){ + if(!settings.extensionConfig().mode.active){ console.log("ⓘ activate extension: entering passive mode. not registering any active code augmentation support."); return; } @@ -793,7 +791,7 @@ function onActivate(context) { /** experimental */ //onDidChange() // forces inspection and makes sure data is ready for symbolprovider - if(solidityVAConfig.outline.enable){ + if(settings.extensionConfig().outline.enable){ context.subscriptions.push( vscode.languages.registerDocumentSymbolProvider( docSel, @@ -802,7 +800,7 @@ function onActivate(context) { ); } - if(solidityVAConfig.codelens.enable){ + if(settings.extensionConfig().codelens.enable){ context.subscriptions.push( vscode.languages.registerCodeLensProvider( docSel, diff --git a/src/features/commands.js b/src/features/commands.js index 3b49d63..a5a0824 100644 --- a/src/features/commands.js +++ b/src/features/commands.js @@ -19,7 +19,6 @@ const mod_symbols = require('./symbols.js'); const surya = require('surya'); -const solidityVAConfig = vscode.workspace.getConfiguration('solidity-va'); const suryaDefaultColorSchemeDark = { digraph : { @@ -125,7 +124,7 @@ class Commands{ let files; - if(solidityVAConfig.tools.surya.input.contracts=="workspace"){ + if(settings.extensionConfig().tools.surya.input.contracts=="workspace"){ await vscode.workspace.findFiles("**/*.sol",'**/node_modules', 500) .then(uris => { files = uris.map(function (uri) { @@ -147,7 +146,7 @@ class Commands{ //solidity-va.preview.render.markdown vscode.workspace.openTextDocument({content: ret, language: "dot"}) .then(doc => { - if(solidityVAConfig.preview.dot){ + if(settings.extensionConfig().preview.dot){ vscode.commands.executeCommand("interactive-graphviz.preview.beside", {document: doc, content:ret, callback:null}) .catch(error =>{ vscode.commands.executeCommand("graphviz.previewToSide", doc.uri) @@ -176,7 +175,7 @@ class Commands{ ret = surya.inheritance(files,{draggable:false}); vscode.workspace.openTextDocument({content: ret, language: "dot"}) .then(doc => { - if(solidityVAConfig.preview.dot){ + if(settings.extensionConfig().preview.dot){ vscode.commands.executeCommand("interactive-graphviz.preview.beside", {document: doc, content:ret, callback:null}) .catch(error =>{ vscode.commands.executeCommand("graphviz.previewToSide", doc.uri) @@ -245,7 +244,7 @@ class Commands{ ret = surya.mdreport(files); vscode.workspace.openTextDocument({content: ret, language: "markdown"}) .then(doc => { - if(solidityVAConfig.preview.markdown){ + if(settings.extensionConfig().preview.markdown){ vscode.commands.executeCommand("markdown-preview-enhanced.openPreview", doc.uri) .catch(error => { //command does not exist @@ -550,8 +549,8 @@ ${topLevelContractsText}`; let content = `@startuml ' -- for auto-render install: https://marketplace.visualstudio.com/items?itemName=jebbs.plantuml ' -- options -- -${solidityVAConfig.uml.options} -${solidityVAConfig.uml.actors.enable ? "allowmixing": ""} +${settings.extensionConfig().uml.options} +${settings.extensionConfig().uml.actors.enable ? "allowmixing": ""} ' -- classes -- `; @@ -595,7 +594,7 @@ ${Object.values(contractObj.functions).reduce((umlFuncTxt, funcObj) => { }, ""); - if(solidityVAConfig.uml.actors.enable){ + if(settings.extensionConfig().uml.actors.enable){ //lets see if we can get actors as well :) let addresses = []; diff --git a/src/features/deco.js b/src/features/deco.js index a634b22..7cbde3a 100644 --- a/src/features/deco.js +++ b/src/features/deco.js @@ -268,7 +268,7 @@ function semanticHighlightFunctionParameters(arrIdents){ return decorations; } -function init(context, config){ +function init(context){ [...Array(15).keys()].forEach(function(idx){ styles["styleArgument"+idx] = vscode.window.createTextEditorDecorationType({ //cursor: 'crosshair', diff --git a/src/features/hover.js b/src/features/hover.js index dd1cbf0..0085d15 100644 --- a/src/features/hover.js +++ b/src/features/hover.js @@ -9,8 +9,7 @@ const vscode = require('vscode'); const builtinsArr = require('./hover/builtins.json'); const asmArr = require('./hover/asm.json'); - -const solidityVAConfig = vscode.workspace.getConfiguration('solidity-va'); +const settings = require('../settings.js'); function createHover(name, snippet, type) { var text = []; @@ -79,7 +78,7 @@ function createHover(name, snippet, type) { } function provideHoverHandler(document, position, token, type, g_parser) { - if (solidityVAConfig.hover === false) { + if (settings.extensionConfig().hover === false) { return; } const range = document.getWordRangeAtPosition(position, /(tx\.gasprice|tx\.origin|msg\.data|msg\.sender|msg\.sig|msg\.value|block\.coinbase|block\.difficulty|block\.gaslimit|block\.number|block\.timestamp|abi\.encodePacked|abi\.encodeWithSelector|abi\.encodeWithSignature|abi\.decode|abi\.encode|\.?[0-9_\w>]+)/); diff --git a/src/features/parser.js b/src/features/parser.js index 057b1c4..dfbdf44 100644 --- a/src/features/parser.js +++ b/src/features/parser.js @@ -12,8 +12,7 @@ const parserHelpers = require("./parser/parserHelpers"); const { linearize } = require('c3-linearization'); const crypto = require('crypto'); const {CommentMapperRex} = require('./utils'); - -const solidityVAConfig = vscode.workspace.getConfiguration('solidity-va'); +const settings = require('../settings.js'); //https://github.com/ethereum/solidity/blob/c5879589af646bee899745c1a21d065537ad0ea5/test/libsolidity/SolidityParser.cpp#L509 const reservedKeywords = [ @@ -98,7 +97,7 @@ class SolidityParser{ this.contracts[contractName] = sourceUnit.contracts[contractName]; } - if (solidityVAConfig.parser.parseImports){ + if (settings.extensionConfig().parser.parseImports){ /** parse imports */ sourceUnit.imports.forEach(function(imp){ diff --git a/src/features/symbols.js b/src/features/symbols.js index 3d4cebf..7e6ddd9 100644 --- a/src/features/symbols.js +++ b/src/features/symbols.js @@ -7,7 +7,7 @@ * */ const vscode = require('vscode'); -const solidityVAConfig = vscode.workspace.getConfiguration('solidity-va'); +const settings = require('../settings.js'); function getFakeNode(name, line){ return { @@ -149,7 +149,7 @@ function getSymbolKindForDeclaration(node){ result.prefix += "Ⓜ "; - if (solidityVAConfig.outline.decorations){ + if (settings.extensionConfig().outline.decorations){ result.prefix += getVisibilityToIcon(astnode.visibility); result.prefix += getStateMutabilityToIcon(astnode.stateMutability); } @@ -164,12 +164,12 @@ function getSymbolKindForDeclaration(node){ } else { result.symbol = vscode.SymbolKind.Function; } - if (solidityVAConfig.outline.decorations){ + if (settings.extensionConfig().outline.decorations){ result.prefix += getVisibilityToIcon(astnode.visibility); result.prefix += getStateMutabilityToIcon(astnode.stateMutability); } - if (solidityVAConfig.outline.extras){ + if (settings.extensionConfig().outline.extras){ result.suffix += " ( ", result.suffix += " complex: " + node.complexity; result.suffix += " state: " + (node.accesses_svar?"☑":"☐"); @@ -183,7 +183,7 @@ function getSymbolKindForDeclaration(node){ result.symbol = vscode.SymbolKind.Struct; break; case "VariableDeclaration": - if(solidityVAConfig.outline.var.storage_annotations){ + if(settings.extensionConfig().outline.var.storage_annotations){ if(astnode.storageLocation=="memory"){ result.prefix +="💾"; result.details += astnode.storageLocation; @@ -205,7 +205,7 @@ function getSymbolKindForDeclaration(node){ result.symbol = getVariableDeclarationTypeAsSymbolKind(astnode, vscode.SymbolKind.Variable); break; case "Parameter": - if(solidityVAConfig.outline.var.storage_annotations){ + if(settings.extensionConfig().outline.var.storage_annotations){ if(astnode.storageLocation=="memory"){ result.prefix +="💾"; result.details += astnode.storageLocation; @@ -286,7 +286,7 @@ class SolidityDocumentSymbolProvider{ var topLevelNode; - if(solidityVAConfig.outline.pragmas.show){ + if(settings.extensionConfig().outline.pragmas.show){ topLevelNode = astNodeAsDocumentSymbol( document, getFakeNode("pragma",1), @@ -305,7 +305,7 @@ class SolidityDocumentSymbolProvider{ console.log("✓ pragmas "); } - if(solidityVAConfig.outline.imports.show){ + if(settings.extensionConfig().outline.imports.show){ topLevelNode = astNodeAsDocumentSymbol( document, getFakeNode("imports",1), @@ -515,7 +515,7 @@ class SolidityDocumentSymbolProvider{ } console.log("✓ events"); /** functions - may include constructor / fallback */ - if(solidityVAConfig.outline.inheritance.show){ + if(settings.extensionConfig().outline.inheritance.show){ var inheritedLevelNode = astNodeAsDocumentSymbol( document, diff --git a/src/settings.js b/src/settings.js index 435355c..d13725e 100644 --- a/src/settings.js +++ b/src/settings.js @@ -5,12 +5,18 @@ * * */ /** globals - const */ +const vscode = require('vscode'); const languageId = "solidity"; const docSelector = { language: languageId }; +function extensionConfig() { + return vscode.workspace.getConfiguration('solidity-va'); +} + module.exports = { - languageId:languageId, - docSelector:docSelector + extensionConfig: extensionConfig, + languageId: languageId, + docSelector: docSelector }; \ No newline at end of file