Skip to content

Commit 8363b9a

Browse files
committed
Remove solidity-parser-sc completely
1 parent 95b099a commit 8363b9a

File tree

4 files changed

+113
-214
lines changed

4 files changed

+113
-214
lines changed

lib/instrumentSolidity.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
const SolidityParser = require('solidity-parser-sc');
2-
const SolidityParserAntlr = require('solidity-parser-antlr');
1+
const SolidityParser = require('solidity-parser-antlr');
32
const preprocessor = require('./preprocessor');
43
const injector = require('./injector');
54
const parse = require('./parse');
@@ -21,7 +20,7 @@ module.exports = function instrumentSolidity(contractSource, fileName) {
2120
contract.injectionPoints = {};
2221

2322
// First, we run over the original contract to get the source mapping.
24-
let ast = SolidityParserAntlr.parse(contract.source, {range: true});
23+
let ast = SolidityParser.parse(contract.source, {range: true});
2524
parse[ast.type](contract, ast);
2625
const retValue = JSON.parse(JSON.stringify(contract));
2726

@@ -37,7 +36,7 @@ module.exports = function instrumentSolidity(contractSource, fileName) {
3736

3837
contract.preprocessed = preprocessor.run(contract.source);
3938
contract.instrumented = contract.preprocessed;
40-
ast = SolidityParserAntlr.parse(contract.preprocessed, {range: true});
39+
ast = SolidityParser.parse(contract.preprocessed, {range: true});
4140
const contractStatement = ast.children.filter(node => (node.type === 'ContractDefinition' ||
4241
node.type === 'LibraryDefinition' ||
4342
node.type === 'InterfaceDefinition'));

lib/preprocessor.js

Lines changed: 48 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
const SolExplore = require('sol-explore');
2-
const SolidityParser = require('solidity-parser-sc');
2+
const SolidityParser = require('solidity-parser-antlr');
33

44
const crRegex = /[\r\n ]+$/g;
55
/**
@@ -9,21 +9,27 @@ const crRegex = /[\r\n ]+$/g;
99
* @return {String} contract
1010
*/
1111
function blockWrap(contract, expression) {
12-
return contract.slice(0, expression.start) + '{' + contract.slice(expression.start, expression.end) + '}' + contract.slice(expression.end);
12+
return contract.slice(0, expression.range[0]) + '{' + contract.slice(expression.range[0], expression.range[1] + 1) + '}' + contract.slice(expression.range[1] + 1);
1313
}
1414

15-
16-
/**
17-
* Captures carriage returns at modifiers we'll remove. These need to be re-injected into the
18-
* source to keep line report alignments accurate.
15+
/** Remove 'pure' and 'view' from the function declaration.
1916
* @param {String} contract solidity source
20-
* @param {Object} modifier AST node
21-
* @return {String} whitespace around the modifier
22-
*/
23-
function getModifierWhitespace(contract, modifier){
24-
const source = contract.slice(modifier.start, modifier.end);
25-
const whitespace = source.match(crRegex) || [];
26-
return whitespace.join('');
17+
* @param {Object} function AST node
18+
* @return {String} contract with the modifiers removed from the given function.
19+
*/
20+
function removePureView(contract, node){
21+
let fDefStart = node.range[0];
22+
if (node.body){
23+
fDefEnd = node.body.range[0];
24+
} else if (node.returnParameters) {
25+
fDefEnd = node.returnParameters.range[0];
26+
} else {
27+
fDefEnd = node.range[1];
28+
}
29+
let fDef = contract.slice(fDefStart, fDefEnd + 1);
30+
fDef = fDef.replace(/\bview\b/i, ' ');
31+
fDef = fDef.replace(/\bpure\b/i, ' ');
32+
return contract.slice(0, fDefStart) + fDef + contract.slice(fDefEnd + 1);
2733
}
2834

2935
/**
@@ -42,47 +48,42 @@ module.exports.run = function r(contract) {
4248

4349
while (keepRunning) {
4450
try {
45-
const ast = SolidityParser.parse(contract);
51+
const ast = SolidityParser.parse(contract, { range: true });
4652
keepRunning = false;
47-
SolExplore.traverse(ast, {
48-
enter(node, parent) { // eslint-disable-line no-loop-func
49-
// If consequents
50-
if (node.type === 'IfStatement' && node.consequent.type !== 'BlockStatement') {
51-
contract = blockWrap(contract, node.consequent);
53+
SolidityParser.visit(ast, {
54+
IfStatement: function(node) {
55+
if (node.trueBody.type !== 'Block') {
56+
contract = blockWrap(contract, node.trueBody);
5257
keepRunning = true;
53-
this.stopTraversal();
54-
// If alternates
55-
} else if (
56-
node.type === 'IfStatement' &&
57-
node.alternate &&
58-
node.alternate.type !== 'BlockStatement') {
59-
contract = blockWrap(contract, node.alternate);
58+
return false;
59+
} else if (node.falseBody && node.falseBody.type !== 'Block'){
60+
contract = blockWrap(contract, node.falseBody);
6061
keepRunning = true;
61-
this.stopTraversal();
62-
// Loops
63-
} else if (
64-
(node.type === 'ForStatement' || node.type === 'WhileStatement') &&
65-
node.body.type !== 'BlockStatement') {
62+
return false;
63+
}
64+
},
65+
ForStatement: function(node){
66+
if (node.body.type !== 'Block'){
6667
contract = blockWrap(contract, node.body);
6768
keepRunning = true;
68-
this.stopTraversal();
69-
} else if (node.type === 'FunctionDeclaration' && node.modifiers) {
70-
// We want to remove constant / pure / view from functions
71-
for (let i = 0; i < node.modifiers.length; i++) {
72-
if (['pure', 'constant', 'view'].indexOf(node.modifiers[i].name) > -1) {
73-
let whitespace = getModifierWhitespace(contract, node.modifiers[i]);
74-
75-
contract = contract.slice(0, node.modifiers[i].start) +
76-
whitespace +
77-
contract.slice(node.modifiers[i].end);
78-
79-
keepRunning = true;
80-
this.stopTraversal();
81-
}
82-
}
69+
return false;
8370
}
8471
},
85-
});
72+
WhileStatement: function(node){
73+
if (node.body.type !== 'Block'){
74+
contract = blockWrap(contract, node.body);
75+
keepRunning = true;
76+
return false;
77+
}
78+
},
79+
FunctionDefinition: function(node){
80+
if (node.stateMutability === 'view' || node.stateMutability === 'pure'){
81+
contract = removePureView(contract, node);
82+
keepRunning = true;
83+
return false;
84+
}
85+
}
86+
})
8687
} catch (err) {
8788
contract = err;
8889
keepRunning = false;

0 commit comments

Comments
 (0)