solidity-antlr4
Version:
Solidity Lang Lexer and Parser by official ANTLR4 grammar
103 lines (100 loc) • 3.39 kB
JavaScript
"use strict";
var _vitest = require("vitest");
var _parser = require("../parser/index.cjs");
var _traverse = require("../traverse/index.cjs");
(0, _vitest.test)("traverse", () => {
const ast = (0, _parser.parse)(`// SPDX-License-Identifier: MIT
// compiler version must be greater than or equal to 0.8.20 and less than 0.9.0
pragma solidity ^0.8.20;
contract HelloWorld {
string public greet = "Hello World!";
}`);
const enterNames = [];
const exitNames = [];
(0, _traverse.visit)(ast, {
enter: ({
node
}) => {
if (node.type === "ContractDefinition") {
enterNames.push(node.name.name);
}
},
exit: ({
node
}) => {
if (node.type === "ContractDefinition") {
exitNames.push(node.name.name);
}
}
});
(0, _vitest.expect)(enterNames).toEqual(["HelloWorld"]);
(0, _vitest.expect)(exitNames).toEqual(["HelloWorld"]);
(0, _vitest.expect)((0, _traverse.serialize)(ast, p => ({
...p.node,
_flag: true
}))._flag).toEqual(true);
(0, _traverse.traverse)(ast, p => {
if (p.matches({
name: "greet"
})) {
(0, _vitest.expect)(p.node.type).toBe("Identifier");
}
});
(0, _traverse.traverse)(ast, p => {
if (p.node.type === "ContractDefinition") {
(0, _vitest.expect)(p.getFlattenParents().length).toBe(1);
(0, _vitest.expect)(p.getFlattenParents(1).length).toBe(1);
}
});
(0, _vitest.expect)((0, _traverse.visitNodes)(ast, p => p.depth === 1).length).toBe(2);
});
(0, _vitest.test)("selector", () => {
const ast = (0, _parser.parse)(`// SPDX-License-Identifier: MIT
// compiler version must be greater than or equal to 0.8.20 and less than 0.9.0
pragma solidity ^0.8.20;
contract HelloWorld {
string public greet = "Hello World!";
}`);
(0, _vitest.expect)((0, _traverse.querySelector)(ast, (0, _traverse.createSelector)("*")).node).toMatchObject({
type: "SourceUnit"
});
(0, _vitest.expect)((0, _traverse.querySelectorAll)(ast, (0, _traverse.createSelector)("*")).length).toBe(8);
(0, _vitest.expect)((0, _traverse.querySelectorAll)(ast, (0, _traverse.createSelector)("ContractDefinition").child("Identifier"))).toMatchObject([{
node: {
type: "Identifier",
name: "HelloWorld"
}
}]);
(0, _vitest.expect)((0, _traverse.querySelectorAll)(ast, (0, _traverse.createSelector)("ContractDefinition").inside("Identifier"))).toMatchObject([{
node: {
type: "Identifier",
name: "HelloWorld"
}
}, {
node: {
type: "Identifier",
name: "greet"
}
}]);
(0, _vitest.expect)((0, _traverse.query)(ast, (0, _traverse.createSelector)("ContractDefinition").inside("Identifier"), {
queryAll: true,
order: "desc"
})).toMatchObject([{
node: {
type: "Identifier",
name: "greet"
}
}, {
node: {
type: "Identifier",
name: "HelloWorld"
}
}]);
(0, _vitest.expect)((0, _traverse.querySelectorAll)(ast, [(0, _traverse.createSelector)("ContractDefinition"), (0, _traverse.createSelector)("PragmaDirective")]).length).toBe(2);
(0, _vitest.expect)((0, _traverse.querySelector)(ast, (0, _traverse.createSelector)("ContractDefinition", 1))).toBe(null);
(0, _vitest.expect)((0, _traverse.querySelector)(ast, (0, _traverse.createSelector)("ContractDefinition", 139))).toMatchObject({
node: {
type: "ContractDefinition"
}
});
});