Commit 8cdbed92 authored by yann300's avatar yann300

solidity asthelpers, decodeinfo

parent 54581749
'use strict'
var AstWalker = require('../util/astWalker')
/**
* return all contract definitions of the given @astList
*
* @param {Object} sourcesList - sources list (containing root AST node)
* @return {Object} - returns a mapping from AST node ids to AST nodes for the contracts
*/
function extractContractsDefinition (sourcesList) {
var ret = {
contractsIds: {},
contractsNames: {}
}
var walker = new AstWalker()
walker.walkAstList(sourcesList, { 'ContractDefinition': function (node) {
ret.contractsIds[node.id] = node
ret.contractsNames[node.attributes.name] = node.id
return false
}})
return ret
}
/**
* returns the linearized base contracts of the contract @arg id
*
* @param {Int} id - contract id to resolve
* @param {Map} contracts - all contracts defined in the current context
* @return {Array} - array of base contracts in derived to base order as AST nodes.
*/
function getLinearizedBaseContracts (id, contracts) {
return contracts[id].attributes.linearizedBaseContracts.map(function (id) { return contracts[id] })
}
/**
* return state var and type definition of the given contract
*
* @param {String} contractName - contract for which state var should be resolved
* @param {Object} sourcesList - sources list (containing root AST node)
* @return {Array} - return an array of AST node of all state variables (including inherited) (this will include all enum/struct declarations)
*/
function extractStateVariables (contractName, sourcesList) {
var contracts = extractContractsDefinition(sourcesList)
var id = contracts.contractsNames[contractName]
if (id) {
var stateVar = []
var baseContracts = getLinearizedBaseContracts(id, contracts.contractsIds)
baseContracts.reverse()
for (var k in baseContracts) {
var ctr = baseContracts[k]
for (var i in ctr.children) {
stateVar.push(ctr.children[i])
}
}
return stateVar
}
return null
}
module.exports = {
extractStateVariables: extractStateVariables,
extractContractsDefinition: extractContractsDefinition,
getLinearizedBaseContracts: getLinearizedBaseContracts
}
This diff is collapsed.
...@@ -30,6 +30,19 @@ AstWalker.prototype.walk = function (ast, callback) { ...@@ -30,6 +30,19 @@ AstWalker.prototype.walk = function (ast, 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) {
var walker = new AstWalker()
for (var k in sourcesList) {
walker.walk(sourcesList[k].AST, callback)
}
}
function manageCallBack (node, callback) { function manageCallBack (node, callback) {
if (node.name in callback) { if (node.name in callback) {
return callback[node.name](node) return callback[node.name](node)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment