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
4 changes: 4 additions & 0 deletions src/parser.js
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,10 @@ function parse(text, _parsers, options = _parsers) {
'&'
]);
break;
case '==':
case '!=':
ctx.left = tryHug(ctx.left, ['==', '!=']);
break;
case '||':
ctx.left = tryHug(ctx.left, ['&&']);
ctx.right = tryHug(ctx.right, ['&&']);
Expand Down
5 changes: 5 additions & 0 deletions src/slang-nodes/EqualityExpression.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { NonterminalKind } from '@nomicfoundation/slang/cst';
import { printComparisonOperation } from '../slang-printers/print-comparison-operation.js';
import { createHugFunction } from '../slang-utils/create-hug-function.js';
import { getNodeMetadata, updateMetadata } from '../slang-utils/metadata.js';
import { Expression } from './Expression.js';

Expand All @@ -8,6 +9,8 @@ import type { AstPath, Doc, ParserOptions } from 'prettier';
import type { AstNode } from './types.d.ts';
import type { PrintFunction, SlangNode } from '../types.d.ts';

const tryToHug = createHugFunction(['==', '!=']);

export class EqualityExpression implements SlangNode {
readonly kind = NonterminalKind.EqualityExpression;

Expand All @@ -32,6 +35,8 @@ export class EqualityExpression implements SlangNode {

this.comments = metadata.comments;
this.loc = metadata.loc;

this.leftOperand = tryToHug(this.leftOperand);
}

print(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1029,10 +1029,10 @@ contract Group {
veryVeryVeryLongUint256A ==
veryVeryVeryLongUint256B ^ veryVeryVeryLongUint256C;
resultBoolean =
veryVeryVeryLongUint256A == veryVeryVeryLongUint256B ==
(veryVeryVeryLongUint256A == veryVeryVeryLongUint256B) ==
veryVeryVeryLongBooleanC;
resultBoolean =
veryVeryVeryLongUint256A == veryVeryVeryLongUint256B !=
(veryVeryVeryLongUint256A == veryVeryVeryLongUint256B) !=
veryVeryVeryLongBooleanC;
resultBoolean =
veryVeryVeryLongBooleanA ==
Expand Down Expand Up @@ -1083,10 +1083,10 @@ contract Group {
veryVeryVeryLongUint256A !=
veryVeryVeryLongUint256B ^ veryVeryVeryLongUint256C;
resultBoolean =
veryVeryVeryLongUint256A != veryVeryVeryLongUint256B ==
(veryVeryVeryLongUint256A != veryVeryVeryLongUint256B) ==
veryVeryVeryLongBooleanC;
resultBoolean =
veryVeryVeryLongUint256A != veryVeryVeryLongUint256B !=
(veryVeryVeryLongUint256A != veryVeryVeryLongUint256B) !=
veryVeryVeryLongBooleanC;
resultBoolean =
veryVeryVeryLongBooleanA !=
Expand Down Expand Up @@ -2515,12 +2515,12 @@ contract Indent {
veryVeryVeryExtremelyExtremelyLongUint256B ^
veryVeryVeryExtremelyExtremelyLongUint256C;
resultBoolean =
veryVeryVeryExtremelyExtremelyLongUint256A ==
veryVeryVeryExtremelyExtremelyLongUint256B ==
(veryVeryVeryExtremelyExtremelyLongUint256A ==
veryVeryVeryExtremelyExtremelyLongUint256B) ==
veryVeryVeryExtremelyExtremelyLongBooleanC;
resultBoolean =
veryVeryVeryExtremelyExtremelyLongUint256A ==
veryVeryVeryExtremelyExtremelyLongUint256B !=
(veryVeryVeryExtremelyExtremelyLongUint256A ==
veryVeryVeryExtremelyExtremelyLongUint256B) !=
veryVeryVeryExtremelyExtremelyLongBooleanC;
resultBoolean =
veryVeryVeryExtremelyExtremelyLongBooleanA ==
Expand Down Expand Up @@ -2586,12 +2586,12 @@ contract Indent {
veryVeryVeryExtremelyExtremelyLongUint256B ^
veryVeryVeryExtremelyExtremelyLongUint256C;
resultBoolean =
veryVeryVeryExtremelyExtremelyLongUint256A !=
veryVeryVeryExtremelyExtremelyLongUint256B ==
(veryVeryVeryExtremelyExtremelyLongUint256A !=
veryVeryVeryExtremelyExtremelyLongUint256B) ==
veryVeryVeryExtremelyExtremelyLongBooleanC;
resultBoolean =
veryVeryVeryExtremelyExtremelyLongUint256A !=
veryVeryVeryExtremelyExtremelyLongUint256B !=
(veryVeryVeryExtremelyExtremelyLongUint256A !=
veryVeryVeryExtremelyExtremelyLongUint256B) !=
veryVeryVeryExtremelyExtremelyLongBooleanC;
resultBoolean =
veryVeryVeryExtremelyExtremelyLongBooleanA !=
Expand Down
108 changes: 108 additions & 0 deletions tests/format/Parentheses/EqualParentheses.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.28;

contract EqualParentheses {
function notEqualAdd(uint256 a, uint256 b, uint256 c)
public
pure
returns (bool)
{
return a == b + c;
}

function notEqualSub(uint256 a, uint256 b, uint256 c)
public
pure
returns (bool)
{
return a == b - c;
}

function notEqualMul(uint256 a, uint256 b, uint256 c)
public
pure
returns (bool)
{
return a == b * c;
}

function notEqualDiv(uint256 a, uint256 b, uint256 c)
public
pure
returns (bool)
{
return a == b / c;
}

function notEqualMod(uint256 a, uint256 b, uint256 c)
public
pure
returns (bool)
{
return a == b % c;
}

function notEqualExp(uint256 a, uint256 b, uint256 c)
public
pure
returns (bool)
{
return a == b ** c;
}

function notEqualShiftL(uint256 a, uint256 b, uint256 c)
public
pure
returns (bool)
{
return a == b << c;
}

function notEqualShiftR(uint256 a, uint256 b, uint256 c)
public
pure
returns (bool)
{
return a == b >> c;
}

function notEqualBitAnd(uint256 a, uint256 b, uint256 c)
public
pure
returns (bool)
{
return a == b & c;
}

function notEqualBitOr(uint256 a, uint256 b, uint256 c)
public
pure
returns (bool)
{
return a == b | c;
}

function notEqualBitXor(uint256 a, uint256 b, uint256 c)
public
pure
returns (bool)
{
return a == b ^ c;
}

function notEqualEqual(bool a, bool b, bool c)
public
pure
returns (bool)
{
return a == b == c;
}

function notEqualNotEqual(bool a, bool b, bool c)
public
pure
returns (bool)
{
return a == b != c;
}
}
16 changes: 16 additions & 0 deletions tests/format/Parentheses/LogicNoParentheses.sol
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,20 @@ contract LogicNoParentheses {
function andAnd(bool a, bool b, bool c) public pure returns (bool) {
return a && b && c;
}

function equalEqual(bool a, bool b, bool c) public pure returns (bool) {
return a == b == c;
}

function equalNotEqual(bool a, bool b, bool c) public pure returns (bool) {
return a == b != c;
}

function notEqualEqual(bool a, bool b, bool c) public pure returns (bool) {
return a != b == c;
}

function notEqualNotEqual(bool a, bool b, bool c) public pure returns (bool) {
return a != b != c;
}
}
108 changes: 108 additions & 0 deletions tests/format/Parentheses/NotEqualParentheses.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
// SPDX-License-Identifier: MIT
pragma solidity 0.8.28;

contract NotEqualParentheses {
function notEqualAdd(uint256 a, uint256 b, uint256 c)
public
pure
returns (bool)
{
return a != b + c;
}

function notEqualSub(uint256 a, uint256 b, uint256 c)
public
pure
returns (bool)
{
return a != b - c;
}

function notEqualMul(uint256 a, uint256 b, uint256 c)
public
pure
returns (bool)
{
return a != b * c;
}

function notEqualDiv(uint256 a, uint256 b, uint256 c)
public
pure
returns (bool)
{
return a != b / c;
}

function notEqualMod(uint256 a, uint256 b, uint256 c)
public
pure
returns (bool)
{
return a != b % c;
}

function notEqualExp(uint256 a, uint256 b, uint256 c)
public
pure
returns (bool)
{
return a != b ** c;
}

function notEqualShiftL(uint256 a, uint256 b, uint256 c)
public
pure
returns (bool)
{
return a != b << c;
}

function notEqualShiftR(uint256 a, uint256 b, uint256 c)
public
pure
returns (bool)
{
return a != b >> c;
}

function notEqualBitAnd(uint256 a, uint256 b, uint256 c)
public
pure
returns (bool)
{
return a != b & c;
}

function notEqualBitOr(uint256 a, uint256 b, uint256 c)
public
pure
returns (bool)
{
return a != b | c;
}

function notEqualBitXor(uint256 a, uint256 b, uint256 c)
public
pure
returns (bool)
{
return a != b ^ c;
}

function notEqualEqual(bool a, bool b, bool c)
public
pure
returns (bool)
{
return a != b == c;
}

function notEqualNotEqual(bool a, bool b, bool c)
public
pure
returns (bool)
{
return a != b != c;
}
}
Loading