Consensys / surya

A set of utilities for exploring Solidity contracts
Apache License 2.0
1.06k stars 118 forks source link

Adding Tolerance, Location Range and FunctionCall information to be Parsed in AST #168

Closed MatthewEthanTam closed 2 years ago

MatthewEthanTam commented 2 years ago

Feature Description:

Adding information such as tolerance, location and range in parser.parse using flags -t --tolerane, -l --loc, and -r --range respectively and adding -c --callinfo this will add information to the start of the AST this is information for FunctionCall.

Why I need this:

Using Surya in a project to parse Solidity contract to JSON format and it would be great to have the option to see line numbers, ranges and information about function calls in the parsing of the contract to AST format.

Example usage 1:

surya parse -jtlr contracts/Migration.sol 

Example output 1:

{"type":"SourceUnit","children":[{"type":"PragmaDirective","name":"solidity","value":"^0.8.0","loc":{"start":{"line":3,"column":1},"end":{"line":3,"column":23}},"range":[39,61]},{"type":"ContractDefinition","name":"Additive","baseContracts":[],"subNodes":[{"type":"FunctionDefinition","name":"Foo","parameters":[{"type":"VariableDeclaration","typeName":{"type":"ElementaryTypeName","name":"uint256","stateMutability":null,"loc":{"start":{"line":7,"column":17},"end":{"line":7,"column":17}},"range":[102,108]},"name":"argc","identifier":{"type":"Identifier","name":"argc","loc":{"start":{"line":7,"column":25},"end":{"line":7,"column":25}},"range":[110,113]},"storageLocation":null,"isStateVar":false,"isIndexed":false,"expression":null,"loc":{"start":{"line":7,"column":17},"end":{"line":7,"column":25}},"range":[102,113]},{"type":"VariableDeclaration","typeName":{"type":"ElementaryTypeName","name":"string","stateMutability":null,"loc":{"start":{"line":7,"column":31},"end":{"line":7,"column":31}},"range":[116,121]},"name":"argv","identifier":{"type":"Identifier","name":"argv","loc":{"start":{"line":7,"column":45},"end":{"line":7,"column":45}},"range":[130,133]},"storageLocation":"memory","isStateVar":false,"isIndexed":false,"expression":null,"loc":{"start":{"line":7,"column":31},"end":{"line":7,"column":45}},"range":[116,133]}],"returnParameters":null,"body":{"type":"Block","statements":[{"type":"VariableDeclarationStatement","variables":[{"type":"VariableDeclaration","typeName":{"type":"ElementaryTypeName","name":"int256","stateMutability":null,"loc":{"start":{"line":8,"column":8},"end":{"line":8,"column":8}},"range":[159,164]},"name":"a","identifier":{"type":"Identifier","name":"a","loc":{"start":{"line":8,"column":15},"end":{"line":8,"column":15}},"range":[166,166]},"storageLocation":null,"isStateVar":false,"isIndexed":false,"expression":null,"loc":{"start":{"line":8,"column":8},"end":{"line":8,"column":15}},"range":[159,166]}],"initialValue":{"type":"NumberLiteral","number":"3","subdenomination":null,"loc":{"start":{"line":8,"column":19},"end":{"line":8,"column":19}},"range":[170,170]},"loc":{"start":{"line":8,"column":8},"end":{"line":8,"column":20}},"range":[159,171]},{"type":"VariableDeclarationStatement","variables":[{"type":"VariableDeclaration","typeName":{"type":"ElementaryTypeName","name":"int256","stateMutability":null,"loc":{"start":{"line":9,"column":8},"end":{"line":9,"column":8}},"range":[181,186]},"name":"b","identifier":{"type":"Identifier","name":"b","loc":{"start":{"line":9,"column":15},"end":{"line":9,"column":15}},"range":[188,188]},"storageLocation":null,"isStateVar":false,"isIndexed":false,"expression":null,"loc":{"start":{"line":9,"column":8},"end":{"line":9,"column":15}},"range":[181,188]}],"initialValue":{"type":"NumberLiteral","number":"2.0","subdenomination":null,"loc":{"start":{"line":9,"column":19},"end":{"line":9,"column":19}},"range":[192,194]},"loc":{"start":{"line":9,"column":8},"end":{"line":9,"column":22}},"range":[181,195]},{"type":"VariableDeclarationStatement","variables":[{"type":"VariableDeclaration","typeName":{"type":"ElementaryTypeName","name":"int256","stateMutability":null,"loc":{"start":{"line":10,"column":8},"end":{"line":10,"column":8}},"range":[205,210]},"name":"c","identifier":{"type":"Identifier","name":"c","loc":{"start":{"line":10,"column":15},"end":{"line":10,"column":15}},"range":[212,212]},"storageLocation":null,"isStateVar":false,"isIndexed":false,"expression":null,"loc":{"start":{"line":10,"column":8},"end":{"line":10,"column":15}},"range":[205,212]}],"initialValue":{"type":"BinaryOperation","operator":"+","left":{"type":"Identifier","name":"a","loc":{"start":{"line":10,"column":19},"end":{"line":10,"column":19}},"range":[216,216]},"right":{"type":"Identifier","name":"b","loc":{"start":{"line":10,"column":23},"end":{"line":10,"column":23}},"range":[220,220]},"loc":{"start":{"line":10,"column":19},"end":{"line":10,"column":23}},"range":[216,220]},"loc":{"start":{"line":10,"column":8},"end":{"line":10,"column":24}},"range":[205,221]},{"type":"VariableDeclarationStatement","variables":[{"type":"VariableDeclaration","typeName":{"type":"ElementaryTypeName","name":"int256","stateMutability":null,"loc":{"start":{"line":11,"column":8},"end":{"line":11,"column":8}},"range":[231,236]},"name":"e","identifier":{"type":"Identifier","name":"e","loc":{"start":{"line":11,"column":15},"end":{"line":11,"column":15}},"range":[238,238]},"storageLocation":null,"isStateVar":false,"isIndexed":false,"expression":null,"loc":{"start":{"line":11,"column":8},"end":{"line":11,"column":15}},"range":[231,238]}],"initialValue":{"type":"BinaryOperation","operator":"*","left":{"type":"Identifier","name":"a","loc":{"start":{"line":11,"column":19},"end":{"line":11,"column":19}},"range":[242,242]},"right":{"type":"Identifier","name":"b","loc":{"start":{"line":11,"column":23},"end":{"line":11,"column":23}},"range":[246,246]},"loc":{"start":{"line":11,"column":19},"end":{"line":11,"column":23}},"range":[242,246]},"loc":{"start":{"line":11,"column":8},"end":{"line":11,"column":24}},"range":[231,247]},{"type":"VariableDeclarationStatement","variables":[{"type":"VariableDeclaration","typeName":{"type":"ElementaryTypeName","name":"int256","stateMutability":null,"loc":{"start":{"line":12,"column":8},"end":{"line":12,"column":8}},"range":[257,262]},"name":"f","identifier":{"type":"Identifier","name":"f","loc":{"start":{"line":12,"column":15},"end":{"line":12,"column":15}},"range":[264,264]},"storageLocation":null,"isStateVar":false,"isIndexed":false,"expression":null,"loc":{"start":{"line":12,"column":8},"end":{"line":12,"column":15}},"range":[257,264]}],"initialValue":{"type":"BinaryOperation","operator":"/","left":{"type":"Identifier","name":"b","loc":{"start":{"line":12,"column":19},"end":{"line":12,"column":19}},"range":[268,268]},"right":{"type":"Identifier","name":"a","loc":{"start":{"line":12,"column":21},"end":{"line":12,"column":21}},"range":[270,270]},"loc":{"start":{"line":12,"column":19},"end":{"line":12,"column":21}},"range":[268,270]},"loc":{"start":{"line":12,"column":8},"end":{"line":12,"column":22}},"range":[257,271]}],"loc":{"start":{"line":7,"column":64},"end":{"line":13,"column":4}},"range":[149,277]},"visibility":"public","modifiers":[],"override":null,"isConstructor":false,"isReceiveEther":false,"isFallback":false,"isVirtual":false,"stateMutability":"pure","loc":{"start":{"line":7,"column":4},"end":{"line":13,"column":4}},"range":[89,277]}],"kind":"contract","loc":{"start":{"line":5,"column":1},"end":{"line":15,"column":1}},"range":[65,281]}],"loc":{"start":{"line":3,"column":1},"end":{"line":16,"column":4}},"range":[39,286]}

Example usage 2:

surya parse -jc contracts/Migration.sol 

Example output 2:

Contract: Reentrancy;
Global variables: {"balances":"mapping (address => uint) default balances"};
Global variables: {"contribute":"Reentrancy.contribute:void()","withdraw":"Reentrancy.withdraw:void()","getFunds":"Reentrancy.getFunds:uint()"};
{"type":"SourceUnit","children":[{"type":"PragmaDirective","name":"solidity","value":"^0.4.8"},{"type":"ContractDefinition","name":"Reentrancy","baseContracts":[],"subNodes":[{"type":"StateVariableDeclaration","variables":[{"type":"VariableDeclaration","typeName":{"type":"Mapping","keyType":{"type":"ElementaryTypeName","name":"address","stateMutability":null},"valueType":{"type":"ElementaryTypeName","name":"uint","stateMutability":null}},"name":"balances","identifier":{"type":"Identifier","name":"balances"},"expression":null,"visibility":"default","isStateVar":true,"isDeclaredConst":false,"isIndexed":false,"isImmutable":false,"override":null,"storageLocation":null}],"initialValue":null},{"type":"FunctionDefinition","name":"contribute","parameters":[],"returnParameters":null,"body":{"type":"Block","statements":[{"type":"ExpressionStatement","expression":{"type":"BinaryOperation","operator":"+=","left":{"type":"IndexAccess","base":{"type":"Identifier","name":"balances"},"index":{"type":"MemberAccess","expression":{"type":"Identifier","name":"msg"},"memberName":"sender"}},"right":{"type":"MemberAccess","expression":{"type":"Identifier","name":"msg"},"memberName":"value"}}}]},"visibility":"external","modifiers":[],"override":null,"isConstructor":false,"isReceiveEther":false,"isFallback":false,"isVirtual":false,"stateMutability":"payable"},{"type":"FunctionDefinition","name":"withdraw","parameters":[],"returnParameters":null,"body":{"type":"Block","statements":[{"type":"IfStatement","condition":{"type":"BinaryOperation","operator":"==","left":{"type":"IndexAccess","base":{"type":"Identifier","name":"balances"},"index":{"type":"MemberAccess","expression":{"type":"Identifier","name":"msg"},"memberName":"sender"}},"right":{"type":"NumberLiteral","number":"0","subdenomination":null}},"trueBody":{"type":"Block","statements":[{"type":"ThrowStatement"}]},"falseBody":null},{"type":"IfStatement","condition":{"type":"FunctionCall","expression":{"type":"FunctionCall","expression":{"type":"MemberAccess","expression":{"type":"MemberAccess","expression":{"type":"MemberAccess","expression":{"type":"Identifier","name":"msg"},"memberName":"sender"},"memberName":"call"},"memberName":"value"},"arguments":[{"type":"IndexAccess","base":{"type":"Identifier","name":"balances"},"index":{"type":"MemberAccess","expression":{"type":"Identifier","name":"msg"},"memberName":"sender"}}],"names":[],"identifiers":[]},"arguments":[],"names":[],"identifiers":[]},"trueBody":{"type":"Block","statements":[{"type":"ExpressionStatement","expression":{"type":"BinaryOperation","operator":"=","left":{"type":"IndexAccess","base":{"type":"Identifier","name":"balances"},"index":{"type":"MemberAccess","expression":{"type":"Identifier","name":"msg"},"memberName":"sender"}},"right":{"type":"NumberLiteral","number":"0","subdenomination":null}}}]},"falseBody":{"type":"Block","statements":[{"type":"ThrowStatement"}]}}]},"visibility":"public","modifiers":[],"override":null,"isConstructor":false,"isReceiveEther":false,"isFallback":false,"isVirtual":false,"stateMutability":null},{"type":"FunctionDefinition","name":"getFunds","parameters":[],"returnParameters":[{"type":"VariableDeclaration","typeName":{"type":"ElementaryTypeName","name":"uint","stateMutability":null},"name":null,"identifier":null,"storageLocation":null,"isStateVar":false,"isIndexed":false,"expression":null}],"body":{"type":"Block","statements":[{"type":"ReturnStatement","expression":{"type":"MemberAccess","expression":{"type":"FunctionCall","expression":{"type":"TypeNameExpression","typeName":{"type":"ElementaryTypeName","name":"address","stateMutability":null}},"arguments":[{"type":"Identifier","name":"this"}],"names":[],"identifiers":[]},"memberName":"balance"}}]},"visibility":"public","modifiers":[],"override":null,"isConstructor":false,"isReceiveEther":false,"isFallback":false,"isVirtual":false,"stateMutability":null}],"kind":"contract"}]}