Skip to content

Commit 47f4721

Browse files
committed
Slang - Hierarchical indentation and grouping of binary expressions.
1 parent 01ba0ba commit 47f4721

17 files changed

+278
-241
lines changed

src/slang-nodes/AdditiveExpression.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { NonterminalKind } from '@nomicfoundation/slang/cst';
22
import { printBinaryOperation } from '../slang-printers/print-binary-operation.js';
33
import { createHugFunction } from '../slang-utils/create-hug-function.js';
4+
import { createKindCheckFunction } from '../slang-utils/create-kind-check-function.js';
45
import { getNodeMetadata, updateMetadata } from '../slang-utils/metadata.js';
56
import { Expression } from './Expression.js';
67

@@ -11,6 +12,19 @@ import type { PrintFunction, SlangNode } from '../types.d.ts';
1112

1213
const tryToHug = createHugFunction(['%']);
1314

15+
const printAdditiveExpression = printBinaryOperation(
16+
createKindCheckFunction([
17+
NonterminalKind.ShiftExpression,
18+
NonterminalKind.BitwiseAndExpression,
19+
NonterminalKind.BitwiseOrExpression,
20+
NonterminalKind.BitwiseXorExpression,
21+
NonterminalKind.InequalityExpression,
22+
NonterminalKind.EqualityExpression,
23+
NonterminalKind.AndExpression,
24+
NonterminalKind.OrExpression
25+
])
26+
);
27+
1428
export class AdditiveExpression implements SlangNode {
1529
readonly kind = NonterminalKind.AdditiveExpression;
1630

@@ -45,6 +59,6 @@ export class AdditiveExpression implements SlangNode {
4559
print: PrintFunction,
4660
options: ParserOptions<AstNode>
4761
): Doc {
48-
return printBinaryOperation(this, path, print, options);
62+
return printAdditiveExpression(this, path, print, options);
4963
}
5064
}

src/slang-nodes/BitwiseAndExpression.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { NonterminalKind } from '@nomicfoundation/slang/cst';
22
import { printBinaryOperation } from '../slang-printers/print-binary-operation.js';
33
import { createHugFunction } from '../slang-utils/create-hug-function.js';
4+
import { createKindCheckFunction } from '../slang-utils/create-kind-check-function.js';
45
import { getNodeMetadata, updateMetadata } from '../slang-utils/metadata.js';
56
import { Expression } from './Expression.js';
67

@@ -11,6 +12,15 @@ import type { PrintFunction, SlangNode } from '../types.d.ts';
1112

1213
const tryToHug = createHugFunction(['+', '-', '*', '/', '**', '<<', '>>']);
1314

15+
const printBitwiseAndExpression = printBinaryOperation(
16+
createKindCheckFunction([
17+
NonterminalKind.InequalityExpression,
18+
NonterminalKind.EqualityExpression,
19+
NonterminalKind.AndExpression,
20+
NonterminalKind.OrExpression
21+
])
22+
);
23+
1424
export class BitwiseAndExpression implements SlangNode {
1525
readonly kind = NonterminalKind.BitwiseAndExpression;
1626

@@ -45,6 +55,6 @@ export class BitwiseAndExpression implements SlangNode {
4555
print: PrintFunction,
4656
options: ParserOptions<AstNode>
4757
): Doc {
48-
return printBinaryOperation(this, path, print, options);
58+
return printBitwiseAndExpression(this, path, print, options);
4959
}
5060
}

src/slang-nodes/BitwiseOrExpression.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { NonterminalKind } from '@nomicfoundation/slang/cst';
22
import { printBinaryOperation } from '../slang-printers/print-binary-operation.js';
33
import { createHugFunction } from '../slang-utils/create-hug-function.js';
4+
import { createKindCheckFunction } from '../slang-utils/create-kind-check-function.js';
45
import { getNodeMetadata, updateMetadata } from '../slang-utils/metadata.js';
56
import { Expression } from './Expression.js';
67

@@ -21,6 +22,15 @@ const tryToHug = createHugFunction([
2122
'^'
2223
]);
2324

25+
const printBitwiseOrExpression = printBinaryOperation(
26+
createKindCheckFunction([
27+
NonterminalKind.InequalityExpression,
28+
NonterminalKind.EqualityExpression,
29+
NonterminalKind.AndExpression,
30+
NonterminalKind.OrExpression
31+
])
32+
);
33+
2434
export class BitwiseOrExpression implements SlangNode {
2535
readonly kind = NonterminalKind.BitwiseOrExpression;
2636

@@ -55,6 +65,6 @@ export class BitwiseOrExpression implements SlangNode {
5565
print: PrintFunction,
5666
options: ParserOptions<AstNode>
5767
): Doc {
58-
return printBinaryOperation(this, path, print, options);
68+
return printBitwiseOrExpression(this, path, print, options);
5969
}
6070
}

src/slang-nodes/BitwiseXorExpression.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { NonterminalKind } from '@nomicfoundation/slang/cst';
22
import { printBinaryOperation } from '../slang-printers/print-binary-operation.js';
33
import { createHugFunction } from '../slang-utils/create-hug-function.js';
4+
import { createKindCheckFunction } from '../slang-utils/create-kind-check-function.js';
45
import { getNodeMetadata, updateMetadata } from '../slang-utils/metadata.js';
56
import { Expression } from './Expression.js';
67

@@ -11,6 +12,15 @@ import type { PrintFunction, SlangNode } from '../types.d.ts';
1112

1213
const tryToHug = createHugFunction(['+', '-', '*', '/', '**', '<<', '>>', '&']);
1314

15+
const printBitwiseXorExpression = printBinaryOperation(
16+
createKindCheckFunction([
17+
NonterminalKind.InequalityExpression,
18+
NonterminalKind.EqualityExpression,
19+
NonterminalKind.AndExpression,
20+
NonterminalKind.OrExpression
21+
])
22+
);
23+
1424
export class BitwiseXorExpression implements SlangNode {
1525
readonly kind = NonterminalKind.BitwiseXorExpression;
1626

@@ -45,6 +55,6 @@ export class BitwiseXorExpression implements SlangNode {
4555
print: PrintFunction,
4656
options: ParserOptions<AstNode>
4757
): Doc {
48-
return printBinaryOperation(this, path, print, options);
58+
return printBitwiseXorExpression(this, path, print, options);
4959
}
5060
}

src/slang-nodes/EqualityExpression.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { NonterminalKind } from '@nomicfoundation/slang/cst';
2-
import { printComparisonOperation } from '../slang-printers/print-comparison-operation.js';
2+
import { createKindCheckFunction } from '../slang-utils/create-kind-check-function.js';
3+
import { printBinaryOperation } from '../slang-printers/print-binary-operation.js';
34
import { getNodeMetadata, updateMetadata } from '../slang-utils/metadata.js';
45
import { Expression } from './Expression.js';
56

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

12+
const printEqualityExpression = printBinaryOperation(
13+
createKindCheckFunction([
14+
NonterminalKind.AndExpression,
15+
NonterminalKind.OrExpression
16+
])
17+
);
18+
1119
export class EqualityExpression implements SlangNode {
1220
readonly kind = NonterminalKind.EqualityExpression;
1321

@@ -39,6 +47,6 @@ export class EqualityExpression implements SlangNode {
3947
print: PrintFunction,
4048
options: ParserOptions<AstNode>
4149
): Doc {
42-
return printComparisonOperation(this, path, print, options);
50+
return printEqualityExpression(this, path, print, options);
4351
}
4452
}

src/slang-nodes/ExponentiationExpression.ts

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import { doc } from 'prettier';
22
import { NonterminalKind } from '@nomicfoundation/slang/cst';
33
import { createBinaryOperationPrinter } from '../slang-printers/create-binary-operation-printer.js';
4+
import { binaryIndentRulesBuilder } from '../slang-printers/print-binary-operation.js';
45
import { createHugFunction } from '../slang-utils/create-hug-function.js';
6+
import { createKindCheckFunction } from '../slang-utils/create-kind-check-function.js';
57
import { getNodeMetadata, updateMetadata } from '../slang-utils/metadata.js';
68
import { Expression } from './Expression.js';
79

@@ -10,17 +12,28 @@ import type { AstPath, Doc, ParserOptions } from 'prettier';
1012
import type { AstNode } from './types.d.ts';
1113
import type { PrintFunction, SlangNode } from '../types.d.ts';
1214

13-
const { group, indent } = doc.builders;
15+
const { group } = doc.builders;
1416

1517
const tryToHug = createHugFunction(['**']);
1618

19+
const shouldIndent = createKindCheckFunction([
20+
NonterminalKind.MultiplicativeExpression,
21+
NonterminalKind.AdditiveExpression,
22+
NonterminalKind.ShiftExpression,
23+
NonterminalKind.BitwiseAndExpression,
24+
NonterminalKind.BitwiseOrExpression,
25+
NonterminalKind.BitwiseXorExpression,
26+
NonterminalKind.InequalityExpression,
27+
NonterminalKind.EqualityExpression,
28+
NonterminalKind.AndExpression,
29+
NonterminalKind.OrExpression
30+
]);
31+
1732
const printExponentiationExpression = createBinaryOperationPrinter(
1833
() =>
1934
(document: Doc): Doc =>
2035
group(document), // always group
21-
() =>
22-
(document: Doc): Doc =>
23-
indent(document) // always indent
36+
binaryIndentRulesBuilder(shouldIndent) // indent as a binary operation with some exceptions
2437
);
2538

2639
export class ExponentiationExpression implements SlangNode {

src/slang-nodes/InequalityExpression.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { NonterminalKind } from '@nomicfoundation/slang/cst';
2-
import { printComparisonOperation } from '../slang-printers/print-comparison-operation.js';
2+
import { createKindCheckFunction } from '../slang-utils/create-kind-check-function.js';
3+
import { printBinaryOperation } from '../slang-printers/print-binary-operation.js';
34
import { getNodeMetadata, updateMetadata } from '../slang-utils/metadata.js';
45
import { Expression } from './Expression.js';
56

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

12+
const printComparisonExpression = printBinaryOperation(
13+
createKindCheckFunction([
14+
NonterminalKind.EqualityExpression,
15+
NonterminalKind.AndExpression,
16+
NonterminalKind.OrExpression
17+
])
18+
);
19+
1120
export class InequalityExpression implements SlangNode {
1221
readonly kind = NonterminalKind.InequalityExpression;
1322

@@ -39,6 +48,6 @@ export class InequalityExpression implements SlangNode {
3948
print: PrintFunction,
4049
options: ParserOptions<AstNode>
4150
): Doc {
42-
return printComparisonOperation(this, path, print, options);
51+
return printComparisonExpression(this, path, print, options);
4352
}
4453
}

src/slang-nodes/MultiplicativeExpression.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { NonterminalKind } from '@nomicfoundation/slang/cst';
22
import { printBinaryOperation } from '../slang-printers/print-binary-operation.js';
33
import { createHugFunction } from '../slang-utils/create-hug-function.js';
4+
import { createKindCheckFunction } from '../slang-utils/create-kind-check-function.js';
45
import { getNodeMetadata, updateMetadata } from '../slang-utils/metadata.js';
56
import { Expression } from './Expression.js';
67

@@ -13,6 +14,20 @@ const multiplicationTryToHug = createHugFunction(['/', '%']);
1314
const divisionTryToHug = createHugFunction(['*', '%']);
1415
const moduloTryToHug = createHugFunction(['*', '/', '%']);
1516

17+
export const printMultiplicativeExpression = printBinaryOperation(
18+
createKindCheckFunction([
19+
NonterminalKind.AdditiveExpression,
20+
NonterminalKind.ShiftExpression,
21+
NonterminalKind.BitwiseAndExpression,
22+
NonterminalKind.BitwiseOrExpression,
23+
NonterminalKind.BitwiseXorExpression,
24+
NonterminalKind.InequalityExpression,
25+
NonterminalKind.EqualityExpression,
26+
NonterminalKind.AndExpression,
27+
NonterminalKind.OrExpression
28+
])
29+
);
30+
1631
export class MultiplicativeExpression implements SlangNode {
1732
readonly kind = NonterminalKind.MultiplicativeExpression;
1833

@@ -61,6 +76,6 @@ export class MultiplicativeExpression implements SlangNode {
6176
print: PrintFunction,
6277
options: ParserOptions<AstNode>
6378
): Doc {
64-
return printBinaryOperation(this, path, print, options);
79+
return printMultiplicativeExpression(this, path, print, options);
6580
}
6681
}

src/slang-nodes/ShiftExpression.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { NonterminalKind } from '@nomicfoundation/slang/cst';
22
import { printBinaryOperation } from '../slang-printers/print-binary-operation.js';
33
import { createHugFunction } from '../slang-utils/create-hug-function.js';
4+
import { createKindCheckFunction } from '../slang-utils/create-kind-check-function.js';
45
import { getNodeMetadata, updateMetadata } from '../slang-utils/metadata.js';
56
import { Expression } from './Expression.js';
67

@@ -20,6 +21,18 @@ const tryToHugLeftOperand = createHugFunction([
2021
]);
2122
const tryToHugRightOperand = createHugFunction(['+', '-', '*', '/', '**']);
2223

24+
const printShiftExpression = printBinaryOperation(
25+
createKindCheckFunction([
26+
NonterminalKind.BitwiseAndExpression,
27+
NonterminalKind.BitwiseOrExpression,
28+
NonterminalKind.BitwiseXorExpression,
29+
NonterminalKind.InequalityExpression,
30+
NonterminalKind.EqualityExpression,
31+
NonterminalKind.AndExpression,
32+
NonterminalKind.OrExpression
33+
])
34+
);
35+
2336
export class ShiftExpression implements SlangNode {
2437
readonly kind = NonterminalKind.ShiftExpression;
2538

@@ -54,6 +67,6 @@ export class ShiftExpression implements SlangNode {
5467
print: PrintFunction,
5568
options: ParserOptions<AstNode>
5669
): Doc {
57-
return printBinaryOperation(this, path, print, options);
70+
return printShiftExpression(this, path, print, options);
5871
}
5972
}

src/slang-printers/create-binary-operation-printer.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,11 @@ function rightOperandPrint(
1717
path: AstPath<BinaryOperation>,
1818
print: PrintFunction
1919
): Doc {
20-
const rightOperand = [line, path.call(print, 'rightOperand')];
21-
20+
const rightOperand = [
21+
` ${node.operator}`,
22+
line,
23+
path.call(print, 'rightOperand')
24+
];
2225
// If it's a single binary operation, avoid having a small right
2326
// operand like - 1 on its own line
2427
const shouldGroup =
@@ -51,7 +54,6 @@ export const createBinaryOperationPrinter =
5154

5255
return groupRules([
5356
path.call(print, 'leftOperand'),
54-
` ${node.operator}`,
5557
indentRules(rightOperandPrint(node, path, print))
5658
]);
5759
};

0 commit comments

Comments
 (0)