A tool for exploring the abstrax syntrax tree generated by solc.
Project description
solc-ast
A tool for exploring the Solidity abstrax syntrax tree as generated by the solc compiler.
Installation
You can install the latest release via pip
:
$ pip install py-solc-ast
Or clone the repo and use setuptools
:
$ python setup.py install
Usage
First, use py-solc-x to compile your contracts to the standard JSON output format.
>>> import json
>>> import solcx
>>> input_json = json.load(open('input.json'))
>>> output_json = solcx.compile_standard(input_json)
Next, import solcast
and initialize using from_standard_output_json
or from_standard_output
. This returns a list of SourceUnit
objects, which each represent the base AST node in a Solidity source file.
>>> import solcast
>>> nodes = solcast.from_standard_output(output_json)
>>> nodes
[<SourceUnit iterable 'contracts/Token.sol'>, <SourceUnit iterable 'contracts/SafeMath.sol'>]
Interacting with Nodes
Each node has the following attributes:
>>> node
<FunctionDefinition iterable 'mul'>
>>> node.depth # Number of nodes between this node and the SourceUnit
2
>>> node.offset # Absolute source offsets as a (start, stop) tuple
(1693, 2151)
>>> node.contract_id # Contract ID as given by the standard compiler JSON
2
>>> node.fields # List of fields for this node
['baseNodeType', 'documentation', 'id', 'implemented', 'kind', 'modifiers', 'name', 'nodeType', 'nodes', 'parameters', 'returnParameters', 'scope', 'src', 'stateMutability', 'superFunction', 'visibility']
Fields mostly follow the expected AST grammar, with the following differences:
Block
nodes are omitted, the body of eachBlock
is available within it's parent asnodes
.ExpressionStatement
nodes are replaced with their underlyingExpression
The following additional fields are also available:
- Most nodes have a
baseNodeType
field as defined in grammar.py ContractDefinition
nodes havedependencies
andlibraries
fields that point to relatedContractDefition
nodes
When a node has a nodes
field, it is iterable and can be accessed with list-like syntax. Additionally, any child node with a name
field is accessible using dict-like syntax.
Some Examples:
>>> source_node
<SourceUnit iterable 'contracts/math/SafeMath.sol'>
>>> source_node.keys()
['absolutePath', 'children', 'contract_id', 'depth', 'exportedSymbols', 'id', 'is_child_of', 'is_parent_of', 'keys', 'nodeType', 'nodes', 'offset', 'parent', 'parents', 'src']
>>> source_node.nodes
[<PragmaDirective object>, <ContractDefinition iterable 'SafeMath'>]
>>> source_node[1]
<ContractDefinition iterable 'SafeMath'>
>>> source_node['SafeMath']
<ContractDefinition iterable 'SafeMath'>
>>> source_node['SafeMath'].keys()
['baseContracts', 'children', 'contractDependencies', 'contractKind', 'contract_id', 'dependencies', 'depth', 'documentation', 'fullyImplemented', 'id', 'is_child_of', 'is_parent_of', 'keys', 'libraries', 'linearizedBaseContracts', 'name', 'nodeType', 'nodes', 'offset', 'parent', 'parents', 'scope', 'src']
>>> source_node['SafeMath'].nodes
[<FunctionDefinition iterable 'add'>, <FunctionDefinition iterable 'sub'>, <FunctionDefinition iterable 'mul'>, <FunctionDefinition iterable 'div'>, <FunctionDefinition iterable 'mod'>]
>>> source_node['SafeMath']['mul']
<FunctionDefinition iterable 'mul'>
>>> source_node['SafeMath']['mul']
[<IfStatement object>, <VariableDeclarationStatement object>, <FunctionCall object>, <Return object>]
Exploring the Tree
The Node.children()
method is used to search and filter through child nodes of a given node. It takes any of the following keyword arguments:
depth
: Number of levels of children to traverse.0
returns only this node.include_self
: Includes this node in the results.include_parents
: Includes nodes that match in the results, when they also have child nodes that match.include_children
: If True, as soon as a match is found it's children will not be included in the search.required_offset
: Only match nodes with a source offset that contains this offset.offset_limits
: Only match nodes when their source offset is contained inside this source offset.filters
: Dictionary of{'attribute': "value"}
that children must match. Can also be given as a list of dicts, children that match any of the dicts will be returned.exclude_filter
: Dictionary of{'attribute': "value"}
that children cannot match.
>>> node = s['Token']['transfer']
>>> node.children(
include_children=False,
filters={'nodeType': "FunctionCall", "expression.name": "require"}
)
[<FunctionCall>]
Node.parent()
and Node.parents()
are used to travel back up the tree. They take the following arguments:
depth
: Depth limit. If given as a negative value, it will be subtracted from this object's depth.filters
: Dictionary of{'attribute': "value"}
that parents must match.
Node.parent()
returns one result, Node.parents()
returns a list of matches.
>>> node.parents()
[<ContractDefinition iterable 'Token'>, <SourceUnit iterable object 'contracts/Token.sol'>]
Tests
To run the test suite:
$ tox
Development
Comments, questions, criticisms and pull requests are welcomed! Feel free to open an issue if you encounter a problem or would like to suggest a new feature.
License
This project is licensed under the MIT license.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file py-solc-ast-1.0.0.tar.gz
.
File metadata
- Download URL: py-solc-ast-1.0.0.tar.gz
- Upload date:
- Size: 8.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.6.2 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.6.8
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 81f42b8b608a161e2281c0d1ae7ed39f0851a90a82ce9e254a3411a4964aed9a |
|
MD5 | 75a270b0452d116a5c666aa5454aaf42 |
|
BLAKE2b-256 | 2de70b2696d48970613f84c3f705aee0b695c4c3951c9700f8552b4bbca07929 |
File details
Details for the file py_solc_ast-1.0.0-py3-none-any.whl
.
File metadata
- Download URL: py_solc_ast-1.0.0-py3-none-any.whl
- Upload date:
- Size: 9.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.6.2 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.6.8
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | f79c4fd10dbc64b06d47bbc48bb73061d995416cae1834247cca4553789e930e |
|
MD5 | d7db4762842f5523a242851afcf9ffc1 |
|
BLAKE2b-256 | f5894ae3ef2fff977675de7c731f6ee34337dad0f7efb0b05b3c40cb047d9279 |