Added relationships between contracts

This commit is contained in:
Richard Ramos 2018-03-22 17:11:11 -04:00
parent 01eaa0fe7f
commit 403f2daee2
1 changed files with 47 additions and 14 deletions

View File

@ -9,44 +9,77 @@ class GraphGenerator {
generate() { generate() {
let id = 0; let id = 0;
let contractString = ""; let contractString = "";
let relationshipString = "";
let idMapping = {};
let contractInheritance = {};
for (let contract in this.engine.contractsManager.contracts) { for (let contract in this.engine.contractsManager.contracts) {
id++; id++;
idMapping[contract] = id;
let contractLabel = ""; let contractLabel = "";
contractLabel += `${contract}`; contractLabel += `${contract}`;
if(this.engine.contractsManager.contracts[contract].instanceOf !== undefined &&
this.engine.contractsManager.contracts[this.engine.contractsManager.contracts[contract].instanceOf] !== undefined){
contractInheritance[contract] = this.engine.contractsManager.contracts[contract].instanceOf;
}
contractLabel += "|";
for(let i = 0; i < this.engine.contractsManager.contracts[contract].abiDefinition.length; i++){
switch(this.engine.contractsManager.contracts[contract].abiDefinition[i].type){
case 'fallback':
contractLabel += "«fallback»()" + '\\l';
break;
case 'constructor':
contractLabel += "«constructor»(";
for(let j = 0; j < this.engine.contractsManager.contracts[contract].abiDefinition[i].inputs.length; j++){
contractLabel += (j == 0 ? "" : ", ") + this.engine.contractsManager.contracts[contract].abiDefinition[i].inputs[j].type;
}
contractLabel += ")\\l";
break;
default: break;
}
}
let fHashes = this.engine.contractsManager.contracts[contract].functionHashes; let fHashes = this.engine.contractsManager.contracts[contract].functionHashes;
if(fHashes != {} && fHashes != undefined){ if(fHashes != {} && fHashes != undefined){
contractLabel += "|";
for(let method in this.engine.contractsManager.contracts[contract].functionHashes){ for(let method in this.engine.contractsManager.contracts[contract].functionHashes){
contractLabel += method + '\\l'; contractLabel += method + '\\l';
} }
} }
for(let i = 0; i < this.engine.contractsManager.contracts[contract].abiDefinition.length; i++){
if(this.engine.contractsManager.contracts[contract].abiDefinition[i].type == 'fallback')
contractLabel += "«fallback»()" + '\\l';
}
/*if(c.methods.length > 0){
contractLabel += "|";
c.methods.forEach(function(a){
contractLabel += a + '\\l';
})
} */
contractString += `${id}[label = "{${contractLabel}}"]` contractString += `${id}[label = "{${contractLabel}}"]`
contractString += "\n"; contractString += "\n";
} }
for (let c in this.engine.contractsManager.contractDependencies){
let contractDependencies = Array.from(new Set(this.engine.contractsManager.contractDependencies[c]));
contractDependencies.forEach(function(d){
if(idMapping[c] !== undefined && idMapping[d] !== undefined){
relationshipString += `${idMapping[d]}->${idMapping[c]}[constraint=true, arrowtail=diamond]`
relationshipString += "\n";
}
});
}
for (let c in contractInheritance){
relationshipString += `${idMapping[contractInheritance[c]]}->${idMapping[c]}`
relationshipString += "\n";
}
let dot = ` let dot = `
digraph hierarchy { digraph hierarchy {
node[shape=record,style=filled,fillcolor=gray95] node[shape=record,style=filled,fillcolor=gray95]
edge[dir=back, arrowtail=empty] edge[dir=back, arrowtail=empty]
${contractString} ${contractString}
${relationshipString}
}`; }`;
let svg = Viz(dot); let svg = Viz(dot);