From 9b1a7712a151affb5064648d591537110f63716e Mon Sep 17 00:00:00 2001 From: Klaus Date: Mon, 23 Jun 2025 22:35:51 +0100 Subject: [PATCH 1/3] adding tests for import directives --- .../ImportDirective/ImportDirectives.sol | 16 +++ .../__snapshots__/format.test.js.snap | 109 +++++++++++++++++- tests/format/ImportDirective/format.test.js | 1 + 3 files changed, 123 insertions(+), 3 deletions(-) diff --git a/tests/format/ImportDirective/ImportDirectives.sol b/tests/format/ImportDirective/ImportDirectives.sol index 78c55b4ea..03fa6ef9d 100644 --- a/tests/format/ImportDirective/ImportDirectives.sol +++ b/tests/format/ImportDirective/ImportDirectives.sol @@ -3,3 +3,19 @@ import "SomeFile.sol" as SomeOtherFile; import * as SomeSymbol from "AnotherFile.sol"; import {symbol1 as alias1, symbol2} from "File.sol"; import {symbol1 as alias1, symbol2 as alias2, symbol3 as alias3, symbol4} from "File2.sol"; +import { + GovernorVotesSuperQuorumFraction +} from "../../../contracts/governance/extensions/GovernorVotesSuperQuorumFraction.sol"; +import { + IAccessControl +} from "@openzeppelin/contracts/access/IAccessControl.sol"; +import { + IERC7579Module, + IERC7579Validator, + IERC7579Execution, + IERC7579AccountConfig, + IERC7579ModuleConfig, + MODULE_TYPE_VALIDATOR, + MODULE_TYPE_EXECUTOR, + MODULE_TYPE_FALLBACK +} from "../../interfaces/draft-IERC7579.sol"; \ No newline at end of file diff --git a/tests/format/ImportDirective/__snapshots__/format.test.js.snap b/tests/format/ImportDirective/__snapshots__/format.test.js.snap index 7f76e6463..48aa94387 100644 --- a/tests/format/ImportDirective/__snapshots__/format.test.js.snap +++ b/tests/format/ImportDirective/__snapshots__/format.test.js.snap @@ -1,4 +1,4 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing exports[`ImportDirectives.sol - {"bracketSpacing":true} format 1`] = ` ====================================options===================================== @@ -12,7 +12,22 @@ import "SomeFile.sol" as SomeOtherFile; import * as SomeSymbol from "AnotherFile.sol"; import {symbol1 as alias1, symbol2} from "File.sol"; import {symbol1 as alias1, symbol2 as alias2, symbol3 as alias3, symbol4} from "File2.sol"; - +import { + GovernorVotesSuperQuorumFraction +} from "../../../contracts/governance/extensions/GovernorVotesSuperQuorumFraction.sol"; +import { + IAccessControl +} from "@openzeppelin/contracts/access/IAccessControl.sol"; +import { + IERC7579Module, + IERC7579Validator, + IERC7579Execution, + IERC7579AccountConfig, + IERC7579ModuleConfig, + MODULE_TYPE_VALIDATOR, + MODULE_TYPE_EXECUTOR, + MODULE_TYPE_FALLBACK +} from "../../interfaces/draft-IERC7579.sol"; =====================================output===================================== import "SomeFile.sol"; import "SomeFile.sol" as SomeOtherFile; @@ -24,12 +39,29 @@ import { symbol3 as alias3, symbol4 } from "File2.sol"; +import { + GovernorVotesSuperQuorumFraction +} from "../../../contracts/governance/extensions/GovernorVotesSuperQuorumFraction.sol"; +import { + IAccessControl +} from "@openzeppelin/contracts/access/IAccessControl.sol"; +import { + IERC7579Module, + IERC7579Validator, + IERC7579Execution, + IERC7579AccountConfig, + IERC7579ModuleConfig, + MODULE_TYPE_VALIDATOR, + MODULE_TYPE_EXECUTOR, + MODULE_TYPE_FALLBACK +} from "../../interfaces/draft-IERC7579.sol"; ================================================================================ `; -exports[`ImportDirectives.sol format 1`] = ` +exports[`ImportDirectives.sol - {"compiler":"0.7.3"} format 1`] = ` ====================================options===================================== +compiler: "0.7.3" parsers: ["slang"] printWidth: 80 | printWidth @@ -39,7 +71,62 @@ import "SomeFile.sol" as SomeOtherFile; import * as SomeSymbol from "AnotherFile.sol"; import {symbol1 as alias1, symbol2} from "File.sol"; import {symbol1 as alias1, symbol2 as alias2, symbol3 as alias3, symbol4} from "File2.sol"; +import { + GovernorVotesSuperQuorumFraction +} from "../../../contracts/governance/extensions/GovernorVotesSuperQuorumFraction.sol"; +import { + IAccessControl +} from "@openzeppelin/contracts/access/IAccessControl.sol"; +import { + IERC7579Module, + IERC7579Validator, + IERC7579Execution, + IERC7579AccountConfig, + IERC7579ModuleConfig, + MODULE_TYPE_VALIDATOR, + MODULE_TYPE_EXECUTOR, + MODULE_TYPE_FALLBACK +} from "../../interfaces/draft-IERC7579.sol"; +=====================================output===================================== +import "SomeFile.sol"; +import "SomeFile.sol" as SomeOtherFile; +import * as SomeSymbol from "AnotherFile.sol"; +import {symbol1 as alias1, symbol2} from "File.sol"; +import {symbol1 as alias1, symbol2 as alias2, symbol3 as alias3, symbol4} from "File2.sol"; +import {GovernorVotesSuperQuorumFraction} from "../../../contracts/governance/extensions/GovernorVotesSuperQuorumFraction.sol"; +import {IAccessControl} from "@openzeppelin/contracts/access/IAccessControl.sol"; +import {IERC7579Module, IERC7579Validator, IERC7579Execution, IERC7579AccountConfig, IERC7579ModuleConfig, MODULE_TYPE_VALIDATOR, MODULE_TYPE_EXECUTOR, MODULE_TYPE_FALLBACK} from "../../interfaces/draft-IERC7579.sol"; +================================================================================ +`; + +exports[`ImportDirectives.sol format 1`] = ` +====================================options===================================== +parsers: ["slang"] +printWidth: 80 + | printWidth +=====================================input====================================== +import "SomeFile.sol"; +import "SomeFile.sol" as SomeOtherFile; +import * as SomeSymbol from "AnotherFile.sol"; +import {symbol1 as alias1, symbol2} from "File.sol"; +import {symbol1 as alias1, symbol2 as alias2, symbol3 as alias3, symbol4} from "File2.sol"; +import { + GovernorVotesSuperQuorumFraction +} from "../../../contracts/governance/extensions/GovernorVotesSuperQuorumFraction.sol"; +import { + IAccessControl +} from "@openzeppelin/contracts/access/IAccessControl.sol"; +import { + IERC7579Module, + IERC7579Validator, + IERC7579Execution, + IERC7579AccountConfig, + IERC7579ModuleConfig, + MODULE_TYPE_VALIDATOR, + MODULE_TYPE_EXECUTOR, + MODULE_TYPE_FALLBACK +} from "../../interfaces/draft-IERC7579.sol"; =====================================output===================================== import "SomeFile.sol"; import "SomeFile.sol" as SomeOtherFile; @@ -51,6 +138,22 @@ import { symbol3 as alias3, symbol4 } from "File2.sol"; +import { + GovernorVotesSuperQuorumFraction +} from "../../../contracts/governance/extensions/GovernorVotesSuperQuorumFraction.sol"; +import { + IAccessControl +} from "@openzeppelin/contracts/access/IAccessControl.sol"; +import { + IERC7579Module, + IERC7579Validator, + IERC7579Execution, + IERC7579AccountConfig, + IERC7579ModuleConfig, + MODULE_TYPE_VALIDATOR, + MODULE_TYPE_EXECUTOR, + MODULE_TYPE_FALLBACK +} from "../../interfaces/draft-IERC7579.sol"; ================================================================================ `; diff --git a/tests/format/ImportDirective/format.test.js b/tests/format/ImportDirective/format.test.js index e49333cd8..f9bd3f730 100644 --- a/tests/format/ImportDirective/format.test.js +++ b/tests/format/ImportDirective/format.test.js @@ -1,2 +1,3 @@ runFormatTest(import.meta, ['slang']); runFormatTest(import.meta, ['slang'], { bracketSpacing: true }); +runFormatTest(import.meta, ['slang'], { compiler: '0.7.3' }); From 125445ddd8222569ca14926214abb536452015ed Mon Sep 17 00:00:00 2001 From: Klaus Date: Mon, 23 Jun 2025 22:29:56 +0100 Subject: [PATCH 2/3] only break import deconstruction if the list of items is longer than 1 --- src/slang-nodes/ImportDeconstructionSymbols.ts | 2 +- .../__snapshots__/format.test.js.snap | 16 ++++------------ 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/src/slang-nodes/ImportDeconstructionSymbols.ts b/src/slang-nodes/ImportDeconstructionSymbols.ts index 32a09130c..10f271afc 100644 --- a/src/slang-nodes/ImportDeconstructionSymbols.ts +++ b/src/slang-nodes/ImportDeconstructionSymbols.ts @@ -43,7 +43,7 @@ export class ImportDeconstructionSymbols implements SlangNode { const compiler = coerce(options.compiler); return printSeparatedList( path.map(print, 'items'), - compiler && satisfies(compiler, '>=0.7.4') + compiler && satisfies(compiler, '>=0.7.4') && this.items.length > 1 ? { // if the compiler exists and is greater than or equal to 0.7.4 we will // split the ImportDirective. diff --git a/tests/format/ImportDirective/__snapshots__/format.test.js.snap b/tests/format/ImportDirective/__snapshots__/format.test.js.snap index 48aa94387..b4a7dbbfd 100644 --- a/tests/format/ImportDirective/__snapshots__/format.test.js.snap +++ b/tests/format/ImportDirective/__snapshots__/format.test.js.snap @@ -39,12 +39,8 @@ import { symbol3 as alias3, symbol4 } from "File2.sol"; -import { - GovernorVotesSuperQuorumFraction -} from "../../../contracts/governance/extensions/GovernorVotesSuperQuorumFraction.sol"; -import { - IAccessControl -} from "@openzeppelin/contracts/access/IAccessControl.sol"; +import { GovernorVotesSuperQuorumFraction } from "../../../contracts/governance/extensions/GovernorVotesSuperQuorumFraction.sol"; +import { IAccessControl } from "@openzeppelin/contracts/access/IAccessControl.sol"; import { IERC7579Module, IERC7579Validator, @@ -138,12 +134,8 @@ import { symbol3 as alias3, symbol4 } from "File2.sol"; -import { - GovernorVotesSuperQuorumFraction -} from "../../../contracts/governance/extensions/GovernorVotesSuperQuorumFraction.sol"; -import { - IAccessControl -} from "@openzeppelin/contracts/access/IAccessControl.sol"; +import {GovernorVotesSuperQuorumFraction} from "../../../contracts/governance/extensions/GovernorVotesSuperQuorumFraction.sol"; +import {IAccessControl} from "@openzeppelin/contracts/access/IAccessControl.sol"; import { IERC7579Module, IERC7579Validator, From 6032dfce69925a610d47a911cba3409687a65af8 Mon Sep 17 00:00:00 2001 From: Klaus Date: Mon, 23 Jun 2025 22:59:53 +0100 Subject: [PATCH 3/3] update `antlr` parser --- src/nodes/ImportDirective.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/nodes/ImportDirective.js b/src/nodes/ImportDirective.js index a4c68cfbe..cc5a34d23 100644 --- a/src/nodes/ImportDirective.js +++ b/src/nodes/ImportDirective.js @@ -30,7 +30,11 @@ export const ImportDirective = { let firstSeparator; let separator; - if (compiler && satisfies(compiler, '>=0.7.4')) { + if ( + compiler && + satisfies(compiler, '>=0.7.4') && + symbolAliases.length > 1 + ) { // if the compiler exists and is greater than or equal to 0.7.4 we will // split the ImportDirective. firstSeparator = options.bracketSpacing ? line : softline;