What is @solidity-parser/parser?
@solidity-parser/parser is an npm package designed to parse Solidity source code into an Abstract Syntax Tree (AST). This allows developers to analyze, transform, and manipulate Solidity code programmatically. It is particularly useful for building tools that need to understand the structure of Solidity code, such as linters, code formatters, and static analysis tools.
What are @solidity-parser/parser's main functionalities?
Parsing Solidity Code
This feature allows you to parse Solidity source code into an Abstract Syntax Tree (AST). The code sample demonstrates how to parse a simple Solidity contract and print the resulting AST.
const parser = require('@solidity-parser/parser');
const sourceCode = 'contract MyContract { uint256 public value; }';
const ast = parser.parse(sourceCode);
console.log(JSON.stringify(ast, null, 2));
Handling Parse Errors
This feature allows you to handle errors that occur during parsing. The code sample demonstrates how to catch and handle a parse error when the Solidity source code is incomplete or malformed.
const parser = require('@solidity-parser/parser');
const sourceCode = 'contract MyContract { uint256 public value;'; // Missing closing brace
try {
const ast = parser.parse(sourceCode);
} catch (error) {
console.error('Parse error:', error);
}
Traversing the AST
This feature allows you to traverse the AST and perform actions on specific nodes. The code sample demonstrates how to traverse the AST and print the name of each contract defined in the Solidity source code.
const parser = require('@solidity-parser/parser');
const sourceCode = 'contract MyContract { uint256 public value; }';
const ast = parser.parse(sourceCode);
parser.visit(ast, {
ContractDefinition: (node) => {
console.log('Contract name:', node.name);
}
});
Other packages similar to @solidity-parser/parser
solidity-ast
solidity-ast is a package that provides utilities for working with the AST produced by the Solidity compiler. It is more tightly integrated with the Solidity compiler itself and is useful for tasks that require detailed information from the compiler's output. Compared to @solidity-parser/parser, it is more focused on post-compilation analysis.
solparse
solparse is another Solidity parser that converts Solidity code into an AST. It is similar to @solidity-parser/parser but is less actively maintained. It provides basic parsing capabilities but may lack some of the more advanced features and error handling provided by @solidity-parser/parser.
solidity-parser
This is a fork of (@federicobond)'s original repo,
with some extra features taken from Consensys Diligence's alternative fork.
Usage
import parser from '@solidity-parser/parser';
var input = `
contract test {
uint256 a;
function f() {}
}
`
try {
parser.parse(input)
} catch (e) {
if (e instanceof parser.ParserError) {
console.log(e.errors)
}
}
The parse
method also accepts a second argument which lets you specify the
following options, in a style similar to the esprima API:
Key | Type | Default | Description |
---|
tolerant | Boolean | false | When set to true it will collect syntax errors and place them in a list under the key errors inside the root node of the returned AST. Otherwise, it will raise a parser.ParserError . |
loc | Boolean | false | When set to true , it will add location information to each node, with start and stop keys that contain the corresponding line and column numbers. Column numbers start from 0, lines start from 1. |
range | Boolean | false | When set to true , it will add range information to each node, which consists of a two-element array with start and stop character indexes in the input. |
Example with location information
parser.parse('contract test { uint a; }', { loc: true })
Example using a visitor to walk over the AST
var ast = parser.parse('contract test { uint a; }')
parser.visit(ast, {
ImportDirective: function(node) {
console.log(node.path)
}
})
Authors
Gonçalo Sá (@gnsps)
Federico Bond (@federicobond)
License
MIT