UNPKG

solidity-antlr4

Version:

Solidity Lang Lexer and Parser by official ANTLR4 grammar

103 lines (100 loc) 3.39 kB
"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" } }); });