-
Notifications
You must be signed in to change notification settings - Fork 85
Expand file tree
/
Copy pathprint-binary-operation.ts
More file actions
60 lines (54 loc) · 2.08 KB
/
print-binary-operation.ts
File metadata and controls
60 lines (54 loc) · 2.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import { NonterminalKind } from '@nomicfoundation/slang/cst';
import { doc } from 'prettier';
import { createBinaryOperationPrinter } from './create-binary-operation-printer.js';
import { createKindCheckFunction } from '../slang-utils/create-kind-check-function.js';
import type { AstPath, Doc } from 'prettier';
import type { BinaryOperation, StrictAstNode } from '../slang-nodes/types.d.ts';
import type { EqualityExpression } from '../slang-nodes/EqualityExpression.ts';
import type { InequalityExpression } from '../slang-nodes/InequalityExpression.ts';
const { group, indent } = doc.builders;
const isBinaryOperationWithoutComparison = createKindCheckFunction([
NonterminalKind.AdditiveExpression,
NonterminalKind.MultiplicativeExpression,
NonterminalKind.ExponentiationExpression,
NonterminalKind.AssignmentExpression,
NonterminalKind.BitwiseAndExpression,
NonterminalKind.BitwiseOrExpression,
NonterminalKind.BitwiseXorExpression,
NonterminalKind.AndExpression,
NonterminalKind.OrExpression,
NonterminalKind.ShiftExpression
]) as (
node: StrictAstNode
) => node is Exclude<
BinaryOperation,
EqualityExpression | InequalityExpression
>;
const binaryGroupRulesBuilder =
(path: AstPath<BinaryOperation>) =>
(document: Doc): Doc => {
const grandparentNode = path.getNode(2) as StrictAstNode;
if (isBinaryOperationWithoutComparison(grandparentNode)) {
return document;
}
return group(document);
};
const binaryIndentRulesBuilder =
(path: AstPath<BinaryOperation>) =>
(document: Doc): Doc => {
let node = path.getNode() as StrictAstNode;
for (let i = 2; ; i += 2) {
const grandparentNode = path.getNode(i) as StrictAstNode;
if (grandparentNode.kind === NonterminalKind.ReturnStatement) break;
if (!isBinaryOperationWithoutComparison(grandparentNode)) {
return indent(document);
}
if (node === grandparentNode.rightOperand.variant) break;
node = grandparentNode;
}
return document;
};
export const printBinaryOperation = createBinaryOperationPrinter(
binaryGroupRulesBuilder,
binaryIndentRulesBuilder
);