You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
3.6 KiB
103 lines
3.6 KiB
8 years ago
|
'use strict'
|
||
4 years ago
|
const { AstWalker } = require('@remix-project/remix-astwalker')
|
||
8 years ago
|
|
||
|
/**
|
||
|
* 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
|
||
|
*/
|
||
8 years ago
|
function extractContractDefinitions (sourcesList) {
|
||
5 years ago
|
const ret = {
|
||
8 years ago
|
contractsById: {},
|
||
8 years ago
|
contractsByName: {},
|
||
|
sourcesByContract: {}
|
||
8 years ago
|
}
|
||
5 years ago
|
const walker = new AstWalker()
|
||
|
for (let k in sourcesList) {
|
||
4 years ago
|
walker.walkFull(sourcesList[k].ast, (node) => {
|
||
|
if (node.nodeType === 'ContractDefinition') {
|
||
|
ret.contractsById[node.id] = node
|
||
|
ret.sourcesByContract[node.id] = k
|
||
|
ret.contractsByName[k + ':' + node.name] = node
|
||
|
}
|
||
|
})
|
||
8 years ago
|
}
|
||
8 years ago
|
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.
|
||
|
*/
|
||
8 years ago
|
function getLinearizedBaseContracts (id, contractsById) {
|
||
5 years ago
|
return contractsById[id].linearizedBaseContracts.map(function (id) { return contractsById[id] })
|
||
8 years ago
|
}
|
||
|
|
||
|
/**
|
||
|
* 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)
|
||
8 years ago
|
* @param {Object} [contracts] - map of contract definitions (contains contractsById, contractsByName)
|
||
8 years ago
|
* @return {Object} - return an object containing: stateItems - list of all the children node of the @arg contractName
|
||
|
* stateVariables - list of all the variable declaration of the @arg contractName
|
||
8 years ago
|
*/
|
||
8 years ago
|
function extractStateDefinitions (contractName, sourcesList, contracts) {
|
||
|
if (!contracts) {
|
||
|
contracts = extractContractDefinitions(sourcesList)
|
||
|
}
|
||
5 years ago
|
const node = contracts.contractsByName[contractName]
|
||
5 years ago
|
if (!node) {
|
||
|
return null
|
||
|
}
|
||
|
const stateItems = []
|
||
|
const stateVar = []
|
||
|
const baseContracts = getLinearizedBaseContracts(node.id, contracts.contractsById)
|
||
|
baseContracts.reverse()
|
||
|
for (let k in baseContracts) {
|
||
|
const ctr = baseContracts[k]
|
||
5 years ago
|
for (let i in ctr.nodes) {
|
||
|
const item = ctr.nodes[i]
|
||
5 years ago
|
stateItems.push(item)
|
||
5 years ago
|
if (item.nodeType === 'VariableDeclaration') {
|
||
5 years ago
|
stateVar.push(item)
|
||
8 years ago
|
}
|
||
|
}
|
||
|
}
|
||
5 years ago
|
return {stateDefinitions: stateItems, stateVariables: stateVar}
|
||
8 years ago
|
}
|
||
|
|
||
8 years ago
|
/**
|
||
|
* return state var and type definition of all the contracts from the given @args sourcesList
|
||
|
*
|
||
|
* @param {Object} sourcesList - sources list (containing root AST node)
|
||
8 years ago
|
* @param {Object} [contracts] - map of contract definitions (contains contractsById, contractsByName)
|
||
8 years ago
|
* @return {Object} - returns a mapping between contract name and contract state
|
||
|
*/
|
||
8 years ago
|
function extractStatesDefinitions (sourcesList, contracts) {
|
||
|
if (!contracts) {
|
||
|
contracts = extractContractDefinitions(sourcesList)
|
||
|
}
|
||
5 years ago
|
const ret = {}
|
||
|
for (let contract in contracts.contractsById) {
|
||
5 years ago
|
const name = contracts.contractsById[contract].name
|
||
5 years ago
|
const source = contracts.sourcesByContract[contract]
|
||
|
const fullName = source + ':' + name
|
||
|
const state = extractStateDefinitions(fullName, sourcesList, contracts)
|
||
8 years ago
|
ret[fullName] = state
|
||
|
ret[name] = state // solc < 0.4.9
|
||
8 years ago
|
}
|
||
|
return ret
|
||
|
}
|
||
|
|
||
8 years ago
|
module.exports = {
|
||
8 years ago
|
extractStatesDefinitions: extractStatesDefinitions,
|
||
|
extractStateDefinitions: extractStateDefinitions,
|
||
8 years ago
|
extractContractDefinitions: extractContractDefinitions,
|
||
8 years ago
|
getLinearizedBaseContracts: getLinearizedBaseContracts
|
||
|
}
|