Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 3 additions & 5 deletions src/slang-nodes/ContractDefinition.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { NonterminalKind } from '@nomicfoundation/slang/cst';
import { doc } from 'prettier';
import { satisfies } from 'semver';
import { NonterminalKind } from '@nomicfoundation/slang/cst';
import { SlangNode } from './SlangNode.js';
import { TerminalNode } from './TerminalNode.js';
import { ContractSpecifiers } from './ContractSpecifiers.js';
Expand Down Expand Up @@ -42,12 +42,10 @@ export class ContractDefinition extends SlangNode {

this.updateMetadata(this.specifiers, this.members);

this.cleanModifierInvocationArguments(options);
}

cleanModifierInvocationArguments(options: ParserOptions<AstNode>): void {
// Older versions of Solidity defined a constructor as a function having
// the same name as the contract.
// So we delegate to the parents the responsibility of cleaning the
// arguments of modifier invocations.
if (!satisfies(options.compiler, '>=0.5.0')) {
for (const member of this.members.items) {
if (
Expand Down
9 changes: 1 addition & 8 deletions src/slang-nodes/FallbackFunctionDefinition.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,15 +52,8 @@ export class FallbackFunctionDefinition extends SlangNode {
this.body
);

this.cleanModifierInvocationArguments();
}

cleanModifierInvocationArguments(): void {
for (const attribute of this.attributes.items) {
if (
typeof attribute !== 'string' &&
attribute.kind === NonterminalKind.ModifierInvocation
) {
if (attribute.kind === NonterminalKind.ModifierInvocation) {
attribute.cleanModifierInvocationArguments();
}
}
Expand Down
9 changes: 4 additions & 5 deletions src/slang-nodes/FunctionDefinition.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { satisfies } from 'semver';
import { NonterminalKind } from '@nomicfoundation/slang/cst';
import { satisfies } from 'semver';
import { printFunctionWithBody } from '../slang-printers/print-function.js';
import { extractVariant } from '../slang-utils/extract-variant.js';
import { SlangNode } from './SlangNode.js';
Expand Down Expand Up @@ -60,17 +60,16 @@ export class FunctionDefinition extends SlangNode {

// Older versions of Solidity defined a constructor as a function having
// the same name as the contract.
// So we delegate to the parents the responsibility of cleaning the
// arguments of modifier invocations.
if (satisfies(options.compiler, '>=0.5.0')) {
this.cleanModifierInvocationArguments();
}
}

cleanModifierInvocationArguments(): void {
for (const attribute of this.attributes.items) {
if (
typeof attribute !== 'string' &&
attribute.kind === NonterminalKind.ModifierInvocation
) {
if (attribute.kind === NonterminalKind.ModifierInvocation) {
attribute.cleanModifierInvocationArguments();
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/slang-nodes/ImportDeconstructionSymbols.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { NonterminalKind } from '@nomicfoundation/slang/cst';
import { doc } from 'prettier';
import { satisfies } from 'semver';
import { NonterminalKind } from '@nomicfoundation/slang/cst';
import { printSeparatedList } from '../slang-printers/print-separated-list.js';
import { SlangNode } from './SlangNode.js';
import { ImportDeconstructionSymbol } from './ImportDeconstructionSymbol.js';
Expand Down
13 changes: 13 additions & 0 deletions src/slang-nodes/LibraryDefinition.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { NonterminalKind } from '@nomicfoundation/slang/cst';
import { doc } from 'prettier';
import { satisfies } from 'semver';
import { SlangNode } from './SlangNode.js';
import { TerminalNode } from './TerminalNode.js';
import { LibraryMembers } from './LibraryMembers.js';
Expand Down Expand Up @@ -29,6 +30,18 @@ export class LibraryDefinition extends SlangNode {
this.members = new LibraryMembers(ast.members, collected, options);

this.updateMetadata(this.members);

// Older versions of Solidity defined a constructor as a function having
// the same name as the contract.
// So we delegate to the parents the responsibility of cleaning the
// arguments of modifier invocations.
if (!satisfies(options.compiler, '>=0.5.0')) {
for (const member of this.members.items) {
if (member.kind === NonterminalKind.FunctionDefinition) {
member.cleanModifierInvocationArguments();
}
}
}
}

print(path: AstPath<LibraryDefinition>, print: PrintFunction): Doc {
Expand Down
9 changes: 1 addition & 8 deletions src/slang-nodes/ReceiveFunctionDefinition.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,15 +41,8 @@ export class ReceiveFunctionDefinition extends SlangNode {

this.updateMetadata(this.parameters, this.attributes, this.body);

this.cleanModifierInvocationArguments();
}

cleanModifierInvocationArguments(): void {
for (const attribute of this.attributes.items) {
if (
typeof attribute !== 'string' &&
attribute.kind === NonterminalKind.ModifierInvocation
) {
if (attribute.kind === NonterminalKind.ModifierInvocation) {
attribute.cleanModifierInvocationArguments();
}
}
Expand Down
4 changes: 0 additions & 4 deletions src/slang-nodes/UnnamedFunctionDefinition.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,6 @@ export class UnnamedFunctionDefinition extends SlangNode {

this.updateMetadata(this.parameters, this.attributes, this.body);

this.cleanModifierInvocationArguments();
}

cleanModifierInvocationArguments(): void {
for (const attribute of this.attributes.items) {
if (attribute.kind === NonterminalKind.ModifierInvocation) {
attribute.cleanModifierInvocationArguments();
Expand Down
18 changes: 18 additions & 0 deletions tests/format/ModifierInvocations/ModifierInvocations.sol
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,21 @@ contract ModifierInvocations is ModifierDefinitions {
// We remove parentheses in modifiers without arguments.
function test() public emptyParams noParams() {}
}

library ModifierInvocationsLibrary {
// We enforce the use of parentheses in modifiers without parameters.
modifier emptyParams {_;}
modifier noParams() {_;}

modifier nonZero (uint x) {
require (x != 0);
_;
}

function isPrime (uint x) public nonZero (x) returns (bool) {
// Complicated logic here
}

// We remove parentheses in modifiers without arguments.
function test() public emptyParams noParams() {}
}
40 changes: 40 additions & 0 deletions tests/format/ModifierInvocations/__snapshots__/format.test.js.snap
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,24 @@ contract ModifierInvocations is ModifierDefinitions {
function test() public emptyParams noParams() {}
}

library ModifierInvocationsLibrary {
// We enforce the use of parentheses in modifiers without parameters.
modifier emptyParams {_;}
modifier noParams() {_;}

modifier nonZero (uint x) {
require (x != 0);
_;
}

function isPrime (uint x) public nonZero (x) returns (bool) {
// Complicated logic here
}

// We remove parentheses in modifiers without arguments.
function test() public emptyParams noParams() {}
}

=====================================output=====================================
// SPDX-License-Identifier: MIT
pragma solidity 0.8.34;
Expand All @@ -47,5 +65,27 @@ contract ModifierInvocations is ModifierDefinitions {
function test() public emptyParams noParams {}
}

library ModifierInvocationsLibrary {
// We enforce the use of parentheses in modifiers without parameters.
modifier emptyParams() {
_;
}
modifier noParams() {
_;
}

modifier nonZero(uint x) {
require(x != 0);
_;
}

function isPrime(uint x) public nonZero(x) returns (bool) {
// Complicated logic here
}

// We remove parentheses in modifiers without arguments.
function test() public emptyParams noParams {}
}

================================================================================
`;
35 changes: 35 additions & 0 deletions tests/format/ModifierInvocationsV0.4.26/ModifierInvocations.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.4.26;

contract ModifierDefinitions {
// We enforce the use of parentheses in modifiers without parameters.
modifier emptyParams {_;}
modifier noParams() {_;}
}

contract ModifierInvocations is ModifierDefinitions {
// We can't differentiate between constructor calls or modifiers, so we keep
// parentheses untouched in constructors.
function ModifierInvocations () emptyParams noParams() ModifierDefinitions() {}

// We remove parentheses in modifiers without arguments.
function test() public emptyParams noParams() {}
}

library ModifierInvocationsLibrary {
// We enforce the use of parentheses in modifiers without parameters.
modifier emptyParams {_;}
modifier noParams() {_;}

modifier nonZero (uint x) {
require (x != 0);
_;
}

function isPrime (uint x) public nonZero (x) returns (bool) {
// Complicated logic here
}

// We remove parentheses in modifiers without arguments.
function test() public emptyParams noParams() {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing

exports[`ModifierInvocations.sol - {"compiler":"0.4.26"} format 1`] = `
====================================options=====================================
compiler: "0.4.26"
parsers: ["slang"]
printWidth: 80
| printWidth
=====================================input======================================
// SPDX-License-Identifier: MIT
pragma solidity 0.4.26;

contract ModifierDefinitions {
// We enforce the use of parentheses in modifiers without parameters.
modifier emptyParams {_;}
modifier noParams() {_;}
}

contract ModifierInvocations is ModifierDefinitions {
// We can't differentiate between constructor calls or modifiers, so we keep
// parentheses untouched in constructors.
function ModifierInvocations () emptyParams noParams() ModifierDefinitions() {}

// We remove parentheses in modifiers without arguments.
function test() public emptyParams noParams() {}
}

library ModifierInvocationsLibrary {
// We enforce the use of parentheses in modifiers without parameters.
modifier emptyParams {_;}
modifier noParams() {_;}

modifier nonZero (uint x) {
require (x != 0);
_;
}

function isPrime (uint x) public nonZero (x) returns (bool) {
// Complicated logic here
}

// We remove parentheses in modifiers without arguments.
function test() public emptyParams noParams() {}
}

=====================================output=====================================
// SPDX-License-Identifier: MIT
pragma solidity 0.4.26;

contract ModifierDefinitions {
// We enforce the use of parentheses in modifiers without parameters.
modifier emptyParams() {
_;
}
modifier noParams() {
_;
}
}

contract ModifierInvocations is ModifierDefinitions {
// We can't differentiate between constructor calls or modifiers, so we keep
// parentheses untouched in constructors.
function ModifierInvocations()
emptyParams
noParams()
ModifierDefinitions()
{}

// We remove parentheses in modifiers without arguments.
function test() public emptyParams noParams {}
}

library ModifierInvocationsLibrary {
// We enforce the use of parentheses in modifiers without parameters.
modifier emptyParams() {
_;
}
modifier noParams() {
_;
}

modifier nonZero(uint x) {
require(x != 0);
_;
}

function isPrime(uint x) public nonZero(x) returns (bool) {
// Complicated logic here
}

// We remove parentheses in modifiers without arguments.
function test() public emptyParams noParams {}
}

================================================================================
`;
1 change: 1 addition & 0 deletions tests/format/ModifierInvocationsV0.4.26/format.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
runFormatTest(import.meta, ['slang'], { compiler: '0.4.26' });