parent
2eb0e58e69
commit
f82b812939
@ -1,57 +0,0 @@ |
||||
'use strict' |
||||
/** |
||||
* Crawl the given AST through the function walk(ast, callback) |
||||
*/ |
||||
function AstWalker () {} // eslint-disable-line
|
||||
|
||||
/** |
||||
* visit all the AST nodes |
||||
* |
||||
* @param {Object} ast - AST node |
||||
* @param {Object or Function} callback - if (Function) the function will be called for every node. |
||||
* - if (Object) callback[<Node Type>] will be called for |
||||
* every node of type <Node Type>. callback["*"] will be called for all other nodes. |
||||
* in each case, if the callback returns false it does not descend into children. |
||||
* If no callback for the current type, children are visited. |
||||
*/ |
||||
AstWalker.prototype.walk = function (ast, callback) { |
||||
if (callback instanceof Function) { |
||||
callback = { '*': callback } |
||||
} |
||||
if (!('*' in callback)) { |
||||
callback['*'] = function () { return true } |
||||
} |
||||
const nodes = ast.nodes || (ast.body && ast.body.statements) || ast.declarations || ast.statements |
||||
if (nodes && ast.initializationExpression) { // 'for' loop handling
|
||||
nodes.push(ast.initializationExpression) |
||||
} |
||||
if (manageCallBack(ast, callback) && nodes && nodes.length > 0) { |
||||
for (let k in nodes) { |
||||
const child = nodes[k] |
||||
this.walk(child, callback) |
||||
} |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* walk the given @astList |
||||
* |
||||
* @param {Object} sourcesList - sources list (containing root AST node) |
||||
* @param {Function} - callback used by AstWalker to compute response |
||||
*/ |
||||
AstWalker.prototype.walkAstList = function (sourcesList, callback) { |
||||
const walker = new AstWalker() |
||||
for (let k in sourcesList) { |
||||
walker.walk(sourcesList[k].ast, callback) |
||||
} |
||||
} |
||||
|
||||
function manageCallBack (node, callback) { |
||||
if (node.nodeType in callback) { |
||||
return callback[node.nodeType](node) |
||||
} else { |
||||
return callback['*'](node) |
||||
} |
||||
} |
||||
|
||||
module.exports = AstWalker |
@ -1,61 +0,0 @@ |
||||
'use strict' |
||||
const tape = require('tape') |
||||
const AstWalker = require('../src/source/astWalker') |
||||
const node = require('./resources/ast') |
||||
|
||||
tape('ASTWalker', function (t) { |
||||
t.test('ASTWalker.walk', function (st) { |
||||
st.plan(24) |
||||
const astwalker = new AstWalker() |
||||
|
||||
astwalker.walk(node.ast.ast, function (node) { |
||||
if (node.nodeType === 'ContractDefinition') { |
||||
checkContract(st, node) |
||||
} |
||||
if (node.nodeType === 'FunctionDefinition') { |
||||
checkSetFunction(st, node) |
||||
} |
||||
return true |
||||
}) |
||||
|
||||
const callback = {} |
||||
callback.FunctionDefinition = function (node) { |
||||
st.equal(node.nodeType, 'FunctionDefinition') |
||||
st.equal(node.name === 'set' || node.name === 'get', true) |
||||
return true |
||||
} |
||||
astwalker.walk(node.ast.ast, callback) |
||||
}) |
||||
}) |
||||
|
||||
function checkContract (st, node) { |
||||
st.equal(node.name, 'test') |
||||
st.equal(node.nodes[0].name, 'x') |
||||
st.equal(node.nodes[0].typeDescriptions.typeString, 'int256') |
||||
st.equal(node.nodes[1].name, 'y') |
||||
st.equal(node.nodes[1].typeDescriptions.typeString, 'int256') |
||||
st.equal(node.nodes[2].nodeType, 'FunctionDefinition') |
||||
st.equal(node.nodes[2].stateMutability, 'nonpayable') |
||||
st.equal(node.nodes[2].name, 'set') |
||||
st.equal(node.nodes[2].visibility, 'public') |
||||
} |
||||
|
||||
function checkSetFunction (st, node) { |
||||
if (node.name === 'set') { |
||||
st.equal(node.parameters.nodeType, 'ParameterList') |
||||
st.equal(node.returnParameters.nodeType, 'ParameterList') |
||||
st.equal(node.body.nodeType, 'Block') |
||||
st.equal(node.body.statements[0].nodeType, 'ExpressionStatement') |
||||
checkExpressionStatement(st, node.body.statements[0]) |
||||
} |
||||
} |
||||
|
||||
function checkExpressionStatement (st, node) { |
||||
st.equal(node.expression.nodeType, 'Assignment') |
||||
st.equal(node.expression.operator, '=') |
||||
st.equal(node.expression.typeDescriptions.typeString, 'int256') |
||||
st.equal(node.expression.leftHandSide.nodeType, 'Identifier') |
||||
st.equal(node.expression.leftHandSide.name, 'x') |
||||
st.equal(node.expression.rightHandSide.nodeType, 'Identifier') |
||||
st.equal(node.expression.rightHandSide.name, '_x') |
||||
} |
Loading…
Reference in new issue