From bb597651d3c2a5116f1d8b2ecde6c1c012d877d2 Mon Sep 17 00:00:00 2001 From: Klaus Date: Wed, 11 Mar 2026 22:59:18 -0300 Subject: [PATCH 1/4] Edge case for assignments --- .../print-assignment-right-side.ts | 1 + tests/format/Assignments/Assignments.sol | 8 +++ .../__snapshots__/format.test.js.snap | 56 +++++++++++++++++++ tests/format/Assignments/format.test.js | 1 + 4 files changed, 66 insertions(+) create mode 100644 tests/format/Assignments/Assignments.sol create mode 100644 tests/format/Assignments/__snapshots__/format.test.js.snap create mode 100644 tests/format/Assignments/format.test.js diff --git a/src/slang-printers/print-assignment-right-side.ts b/src/slang-printers/print-assignment-right-side.ts index 6d6d3bcd2..65a57b6d1 100644 --- a/src/slang-printers/print-assignment-right-side.ts +++ b/src/slang-printers/print-assignment-right-side.ts @@ -12,6 +12,7 @@ export function printAssignmentRightSide( return printIndentedGroupOrSpacedDocument( document, value.kind !== NonterminalKind.ArrayExpression && + value.kind !== NonterminalKind.TupleExpression && !isChainableExpression(value) ); } diff --git a/tests/format/Assignments/Assignments.sol b/tests/format/Assignments/Assignments.sol new file mode 100644 index 000000000..6694bf263 --- /dev/null +++ b/tests/format/Assignments/Assignments.sol @@ -0,0 +1,8 @@ +contract Assignments { + address payable public inParentheses = (contractPointer.functionCall(data.data1,data.data2,IERC20(data.token).decimals(),currency)); + uint[] internal longArray = [item1,item2,item3,item4,item5,item6,item7,item8,item9,itema,itemb,itemc,itemd,iteme]; + // TODO research what we want to do with chained assignments + function chainedAssignments() returns (bytes32 variableA, bytes32 variableB) { + variableA = variableB = 0x1234567890abcdef1234567890abcdef ^ 0x1234567890abcdef1234567890abcdef; + } +} diff --git a/tests/format/Assignments/__snapshots__/format.test.js.snap b/tests/format/Assignments/__snapshots__/format.test.js.snap new file mode 100644 index 000000000..b6f8206b1 --- /dev/null +++ b/tests/format/Assignments/__snapshots__/format.test.js.snap @@ -0,0 +1,56 @@ +// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing + +exports[`Assignments.sol format 1`] = ` +====================================options===================================== +parsers: ["slang"] +printWidth: 80 + | printWidth +=====================================input====================================== +contract Assignments { + address payable public inParentheses = (contractPointer.functionCall(data.data1,data.data2,IERC20(data.token).decimals(),currency)); + uint[] internal longArray = [item1,item2,item3,item4,item5,item6,item7,item8,item9,itema,itemb,itemc,itemd,iteme]; + // TODO research what we want to do with chained assignments + function chainedAssignments() returns (bytes32 variableA, bytes32 variableB) { + variableA = variableB = 0x1234567890abcdef1234567890abcdef ^ 0x1234567890abcdef1234567890abcdef; + } +} + +=====================================output===================================== +contract Assignments { + address payable public inParentheses = ( + contractPointer.functionCall( + data.data1, + data.data2, + IERC20(data.token).decimals(), + currency + ) + ); + uint[] internal longArray = [ + item1, + item2, + item3, + item4, + item5, + item6, + item7, + item8, + item9, + itema, + itemb, + itemc, + itemd, + iteme + ]; + // TODO research what we want to do with chained assignments + function chainedAssignments() + returns (bytes32 variableA, bytes32 variableB) + { + variableA = + variableB = + 0x1234567890abcdef1234567890abcdef ^ + 0x1234567890abcdef1234567890abcdef; + } +} + +================================================================================ +`; diff --git a/tests/format/Assignments/format.test.js b/tests/format/Assignments/format.test.js new file mode 100644 index 000000000..6021bbb0d --- /dev/null +++ b/tests/format/Assignments/format.test.js @@ -0,0 +1 @@ +runFormatTest(import.meta, ['slang']); From d0370c8170a6fe889a7aa29e432dd3c87f4f95f7 Mon Sep 17 00:00:00 2001 From: Klaus Date: Wed, 11 Mar 2026 23:00:42 -0300 Subject: [PATCH 2/4] patch version --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 65e5352f2..f849d8ddd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "prettier-plugin-solidity", - "version": "2.3.0", + "version": "2.3.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "prettier-plugin-solidity", - "version": "2.3.0", + "version": "2.3.1", "license": "MIT", "dependencies": { "@nomicfoundation/slang": "1.3.4", diff --git a/package.json b/package.json index c8b0f2984..015db74b6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "prettier-plugin-solidity", - "version": "2.3.0", + "version": "2.3.1", "description": "A Prettier Plugin for automatically formatting your Solidity code.", "type": "module", "main": "./dist/index.js", From 881e730bfb33fd073fc02a78e120fbd847b59e5b Mon Sep 17 00:00:00 2001 From: Klaus Date: Wed, 11 Mar 2026 23:14:18 -0300 Subject: [PATCH 3/4] fix lint --- src/slang-printers/print-assignment-right-side.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slang-printers/print-assignment-right-side.ts b/src/slang-printers/print-assignment-right-side.ts index 65a57b6d1..d75958f67 100644 --- a/src/slang-printers/print-assignment-right-side.ts +++ b/src/slang-printers/print-assignment-right-side.ts @@ -12,7 +12,7 @@ export function printAssignmentRightSide( return printIndentedGroupOrSpacedDocument( document, value.kind !== NonterminalKind.ArrayExpression && - value.kind !== NonterminalKind.TupleExpression && + value.kind !== NonterminalKind.TupleExpression && !isChainableExpression(value) ); } From 8ce3b9862913429bd8b4cf90ae7e01a000a1ccdb Mon Sep 17 00:00:00 2001 From: Klaus Date: Wed, 11 Mar 2026 23:19:12 -0300 Subject: [PATCH 4/4] ignoring comparison with ANTLR --- tests/config/run-format-test.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/config/run-format-test.js b/tests/config/run-format-test.js index 4e0af1597..037b2584d 100644 --- a/tests/config/run-format-test.js +++ b/tests/config/run-format-test.js @@ -85,6 +85,8 @@ const antlrMismatchTests = new Map( // ANTLR doesn't support UntypedTupleMember with a storage location, which // is valid Slang, but not in Solidity. "AllSolidityFeaturesV0.4.26/AllSolidityFeatures.sol", + // TODO Review how ANTLR is formatting chained assignments + "Assignments/Assignments.sol", ].map((fixture) => { const [file, compareBytecode = () => true] = Array.isArray(fixture) ? fixture