solidity-antlr4
Version:
Solidity Lang Lexer and Parser by official ANTLR4 grammar
220 lines (219 loc) • 6.75 kB
JavaScript
"use strict";
var _utils = require("./utils.test.cjs");
var _vitest = require("vitest");
(0, _vitest.test)("variableDeclaration", () => {
(0, _vitest.expect)((0, _utils.createParse)(p => p.variableDeclaration())(`address memory user`)).toMatchObject({
name: "user",
dataLocation: "memory",
typeName: "address"
});
(0, _vitest.expect)((0, _utils.createParse)(p => p.parameterDeclaration())(`address memory user`)).toMatchObject({
name: "user",
dataLocation: "memory",
typeName: "address"
});
});
(0, _vitest.test)("stateVariableDeclaration", () => {
(0, _vitest.expect)((0, _utils.createParse)(p => p.stateVariableDeclaration())(`uint internal immutable override(Foo) amount = 1;`)).toMatchObject({
name: "amount",
typeName: "uint",
internal: true,
immutable: true,
override: ["Foo"],
expression: {
value: "1"
}
});
(0, _vitest.expect)((0, _utils.createParse)(p => p.stateVariableDeclaration())(`uint public constant amount = 2;`)).toMatchObject({
name: "amount",
typeName: "uint",
public: true,
constant: true,
override: null,
expression: {
value: "2"
}
});
});
(0, _vitest.test)("constantVariableDeclaration", () => {
(0, _vitest.expect)((0, _utils.createParse)(p => p.constantVariableDeclaration())(`uint128 constant amount = 100;`)).toMatchObject({
name: "amount",
typeName: "uint128"
});
});
(0, _vitest.test)("libraryDefinition", () => {
(0, _vitest.expect)((0, _utils.createParse)(p => p.libraryDefinition())(`library Foo { address name; }`)).toMatchObject({
type: "ContractDefinition",
contractKind: "library",
name: "Foo",
nodes: [{
type: "VariableDeclaration"
}]
});
});
(0, _vitest.test)("interfaceDefinition", () => {
(0, _vitest.expect)((0, _utils.createParse)(p => p.interfaceDefinition())(`interface Foo { address name; }`)).toMatchObject({
type: "ContractDefinition",
contractKind: "interface",
name: "Foo",
nodes: [{
type: "VariableDeclaration"
}]
});
});
(0, _vitest.test)("contractDefinition", () => {
const pContract = (0, _utils.createParse)(p => p.contractDefinition());
(0, _vitest.expect)(pContract(`contract Foo { address name; }`)).toMatchObject({
type: "ContractDefinition",
contractKind: "contract",
name: "Foo",
abstract: false,
nodes: [{
type: "VariableDeclaration"
}]
});
(0, _vitest.expect)(pContract(`contract Foo { address name; }`)).toMatchObject({
name: "Foo",
contractKind: "contract",
abstract: false,
nodes: [{
type: "VariableDeclaration"
}]
});
(0, _vitest.expect)(pContract(`abstract contract Bar { }`)).toMatchObject({
name: "Bar",
contractKind: "contract",
abstract: true,
nodes: []
});
(0, _vitest.expect)(pContract(`contract Foo is X, Y.Z(100) { }`)).toMatchObject({
name: "Foo",
contractKind: "contract",
baseContracts: [{
baseName: "X"
}, {
baseName: "Y.Z"
}]
});
});
(0, _vitest.test)("enumDefinition", () => {
(0, _vitest.expect)((0, _utils.createParse)(p => p.enumDefinition())(`enum TokenType { Fungible, NonFungible }`)).toMatchObject({
name: "TokenType",
members: ["Fungible", "NonFungible"]
});
});
(0, _vitest.test)("errorDefinition", () => {
(0, _vitest.expect)((0, _utils.createParse)(p => p.errorDefinition())(`error MyError(address, uint amount);`)).toMatchObject({
name: "MyError",
parameters: [{
typeName: "address"
}, {
typeName: "uint",
name: "amount"
}]
});
});
(0, _vitest.test)("eventDefinition", () => {
(0, _vitest.expect)((0, _utils.createParse)(p => p.eventDefinition())(`event Transfer() anonymous;`)).toMatchObject({
name: "Transfer",
anonymous: true
});
(0, _vitest.expect)((0, _utils.createParse)(p => p.eventDefinition())(`event Transfer(address, uint indexed amount);`)).toMatchObject({
name: "Transfer",
parameters: [{
indexed: false,
typeName: "address"
}, {
indexed: true,
typeName: "uint",
name: "amount"
}]
});
});
(0, _vitest.test)("functionDefinition", () => {
(0, _vitest.expect)((0, _utils.createParse)(p => p.functionDefinition())(`function transfer(address calldata recipient, uint256 amount) public virtual override(Foo, Bar) onlyAdmin returns (bool) {}`)).toMatchObject({
name: "transfer",
functionKind: "function",
override: ["Foo", "Bar"],
virtual: true,
visibility: "public",
stateMutability: null,
modifiers: [{
name: "onlyAdmin"
}],
returnParameters: [{
typeName: "bool"
}],
parameters: [{
name: "recipient",
typeName: "address",
dataLocation: "calldata"
}, {
name: "amount",
typeName: "uint256"
}],
body: {}
});
(0, _vitest.expect)((0, _utils.createParse)(p => p.contractDefinition().contractBodyElement(0).constructorDefinition())(`contract F { constructor(string memory _name, string memory _text) X(_name) Y(_text) {} }`)).toMatchObject({
name: null,
functionKind: "constructor",
override: null,
virtual: false,
visibility: null,
stateMutability: "payable",
modifiers: [{
name: "X"
}, {
name: "Y"
}],
parameters: [{
name: "_name",
dataLocation: "memory",
typeName: "string"
}, {
name: "_text",
dataLocation: "memory",
typeName: "string"
}]
});
});
(0, _vitest.test)("modifierDefinition", () => {
(0, _vitest.expect)((0, _utils.createParse)(p => p.modifierDefinition())(`modifier onlyAdmin(address sender) virtual override(Foo, Bar) {}`)).toMatchObject({
name: "onlyAdmin",
override: ["Foo", "Bar"],
virtual: true,
parameters: [{
name: "sender",
typeName: "address"
}],
body: {}
});
});
(0, _vitest.test)("userDefinedValueTypeDefinition", () => {
(0, _vitest.expect)((0, _utils.createParse)(p => p.userDefinedValueTypeDefinition())(`type Foo is uint256;`)).toMatchObject({
name: "Foo",
typeName: "uint256"
});
});
(0, _vitest.test)("variableDeclarationTuple", () => {
(0, _vitest.expect)((0, _utils.createParse)(p => p.variableDeclarationTuple())(`(address calldata user, uint256 amount)`)).toMatchObject([{
name: "user",
typeName: "address",
dataLocation: "calldata"
}, {
name: "amount",
typeName: "uint256"
}]);
});
(0, _vitest.test)("structDefinition", () => {
(0, _vitest.expect)((0, _utils.createParse)(p => p.structDefinition())(`struct Coin { string obverse; string reverse; }`)).toMatchObject({
name: "Coin",
members: [{
name: "obverse",
typeName: "string"
}, {
name: "reverse",
typeName: "string"
}]
});
});