Skip to content

Commit 29647cb

Browse files
authored
standardising all assignment types (#1437)
1 parent a83dcff commit 29647cb

21 files changed

Lines changed: 336 additions & 303 deletions

src/binary-operator-printers/assignment.js

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { doc } from 'prettier';
2+
import { printAssignmentRightSide } from '../common/printer-helpers.js';
23

34
const { group, line, indent } = doc.builders;
45

@@ -19,10 +20,7 @@ export const assignment = {
1920
].includes(op),
2021
print: (node, path, print) => [
2122
path.call(print, 'left'),
22-
' ',
23-
node.operator,
24-
node.right.type === 'BinaryOperation'
25-
? group(indent([line, path.call(print, 'right')]))
26-
: [' ', path.call(print, 'right')]
23+
` ${node.operator}`,
24+
printAssignmentRightSide(path.call(print, 'right'), node.right)
2725
]
2826
};

src/common/printer-helpers.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,3 +98,14 @@ export const printSeparatedList = (
9898
lastSeparator,
9999
grouped
100100
});
101+
102+
export const printAssignmentRightSide = (document, value) =>
103+
[
104+
'TupleExpression',
105+
'FunctionCall',
106+
'IndexAccess',
107+
'NameValueExpression',
108+
'MemberAccess'
109+
].includes(value.type)
110+
? [' ', document]
111+
: group(indent([line, document]));

src/nodes/Conditional.js

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,7 @@ const experimentalTernaries = (node, path, print, options) => {
5555
})
5656
];
5757

58-
const document = group([conditionAndTrueExpressionGroup, falseExpressionDoc]);
59-
60-
return parent.type === 'VariableDeclarationStatement'
61-
? indent([softline, document])
62-
: document;
58+
return group([conditionAndTrueExpressionGroup, falseExpressionDoc]);
6359
};
6460

6561
const traditionalTernaries = (path, print) =>

src/nodes/FileLevelConstant.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
1+
import { printAssignmentRightSide } from '../common/printer-helpers.js';
2+
13
export const FileLevelConstant = {
24
print: ({ node, path, print }) => [
35
path.call(print, 'typeName'),
46
' constant ',
57
node.name,
6-
' = ',
7-
path.call(print, 'initialValue'),
8+
' =',
9+
printAssignmentRightSide(
10+
path.call(print, 'initialValue'),
11+
node.initialValue
12+
),
813
';'
914
]
1015
};

src/nodes/StateVariableDeclaration.js

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
1-
import { doc } from 'prettier';
2-
3-
const { group, indent, line } = doc.builders;
1+
import { printAssignmentRightSide } from '../common/printer-helpers.js';
42

53
const initialValue = (node, path, print) => {
64
if (!node.initialValue) {
75
return '';
86
}
97

10-
if (node.initialValue.type === 'TupleExpression') {
11-
return [' = ', path.call(print, 'initialValue')];
12-
}
13-
14-
return group([' =', indent([line, path.call(print, 'initialValue')])]);
8+
return [
9+
' =',
10+
printAssignmentRightSide(
11+
path.call(print, 'initialValue'),
12+
node.initialValue
13+
)
14+
];
1515
};
1616

1717
export const StateVariableDeclaration = {

src/nodes/VariableDeclarationStatement.js

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,27 @@
11
import { doc } from 'prettier';
2-
import { printSeparatedList } from '../common/printer-helpers.js';
2+
import {
3+
printAssignmentRightSide,
4+
printSeparatedList
5+
} from '../common/printer-helpers.js';
36

4-
const { group, indentIfBreak } = doc.builders;
7+
const { group, indentIfBreak, line } = doc.builders;
58

69
const embraceVariables = (document, embrace) =>
710
embrace ? ['(', printSeparatedList(document), ')'] : document;
811

9-
const initialValue = (node, path, print) =>
10-
node.initialValue ? [' = ', path.call(print, 'initialValue')] : '';
12+
const initialValue = (node, path, print) => {
13+
if (!node.initialValue) {
14+
return '';
15+
}
16+
17+
return [
18+
' =',
19+
printAssignmentRightSide(
20+
path.call(print, 'initialValue'),
21+
node.initialValue
22+
)
23+
];
24+
};
1125

1226
export const VariableDeclarationStatement = {
1327
print: ({ node, path, print }) => {

src/slang-nodes/AssignmentExpression.ts

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
import { NonterminalKind } from '@nomicfoundation/slang/cst';
2-
import { isBinaryOperation } from '../slang-utils/is-binary-operation.js';
3-
import { printIndentedGroupOrSpacedDocument } from '../slang-printers/print-indented-group-or-spaced-document.js';
42
import { extractVariant } from '../slang-utils/extract-variant.js';
5-
import { isMultilineString } from '../slang-utils/is-multiline-string.js';
3+
import { printAssignmentRightSide } from '../slang-printers/print-assignment-right-side.js';
64
import { SlangNode } from './SlangNode.js';
75
import { Expression } from './Expression.js';
8-
import { TerminalNode } from './TerminalNode.js';
96

107
import type * as ast from '@nomicfoundation/slang/ast';
118
import type { AstPath, Doc, ParserOptions } from 'prettier';
@@ -43,11 +40,9 @@ export class AssignmentExpression extends SlangNode {
4340
return [
4441
path.call(print, 'leftOperand'),
4542
` ${this.operator}`,
46-
printIndentedGroupOrSpacedDocument(
43+
printAssignmentRightSide(
4744
path.call(print, 'rightOperand'),
48-
!(this.rightOperand instanceof TerminalNode) &&
49-
(isBinaryOperation(this.rightOperand) ||
50-
isMultilineString(this.rightOperand))
45+
this.rightOperand
5146
)
5247
];
5348
}

src/slang-nodes/ConditionalExpression.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import type { AstPath, Doc, ParserOptions } from 'prettier';
1010
import type { CollectedMetadata, PrintFunction } from '../types.d.ts';
1111
import type { AstNode, StrictAstNode } from './types.d.ts';
1212

13-
const { group, hardline, ifBreak, indent, line, softline } = doc.builders;
13+
const { group, hardline, ifBreak, indent, line } = doc.builders;
1414

1515
function experimentalTernaries(
1616
node: ConditionalExpression,
@@ -73,11 +73,7 @@ function experimentalTernaries(
7373
)
7474
];
7575

76-
const document = group([conditionAndTrueExpressionGroup, falseExpressionDoc]);
77-
78-
return parent.kind === NonterminalKind.VariableDeclarationValue
79-
? group(indent([softline, document]))
80-
: document;
76+
return group([conditionAndTrueExpressionGroup, falseExpressionDoc]);
8177
}
8278

8379
function traditionalTernaries(

src/slang-nodes/ConstantDefinition.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { NonterminalKind } from '@nomicfoundation/slang/cst';
22
import { extractVariant } from '../slang-utils/extract-variant.js';
3+
import { printAssignmentRightSide } from '../slang-printers/print-assignment-right-side.js';
34
import { SlangNode } from './SlangNode.js';
45
import { TypeName } from './TypeName.js';
56
import { TerminalNode } from './TerminalNode.js';
@@ -40,8 +41,8 @@ export class ConstantDefinition extends SlangNode {
4041
path.call(print, 'typeName'),
4142
' constant ',
4243
path.call(print, 'name'),
43-
' = ',
44-
path.call(print, 'value'),
44+
' =',
45+
printAssignmentRightSide(path.call(print, 'value'), this.value),
4546
';'
4647
];
4748
}

src/slang-nodes/MemberAccessExpression.ts

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,25 @@
11
import { NonterminalKind } from '@nomicfoundation/slang/cst';
22
import { doc } from 'prettier';
33
import { isLabel } from '../slang-utils/is-label.js';
4-
import { createKindCheckFunction } from '../slang-utils/create-kind-check-function.js';
54
import { extractVariant } from '../slang-utils/extract-variant.js';
5+
import { isChainableExpression } from '../slang-utils/is-chainable-expression.js';
66
import { SlangNode } from './SlangNode.js';
77
import { Expression } from './Expression.js';
88
import { TerminalNode } from './TerminalNode.js';
99

1010
import type * as ast from '@nomicfoundation/slang/ast';
1111
import type { AstPath, Doc, ParserOptions } from 'prettier';
1212
import type { CollectedMetadata, PrintFunction } from '../types.d.ts';
13-
import type { AstNode, StrictAstNode } from './types.d.ts';
13+
import type { AstNode } from './types.d.ts';
1414

1515
const { group, indent, label, softline } = doc.builders;
1616

17-
const isChainableExpression = createKindCheckFunction([
18-
NonterminalKind.FunctionCallExpression,
19-
NonterminalKind.IndexAccessExpression,
20-
NonterminalKind.MemberAccessExpression
21-
]);
22-
2317
function isEndOfChain(
2418
node: MemberAccessExpression,
25-
path: AstPath<StrictAstNode>
19+
path: AstPath<Expression['variant']>
2620
): boolean {
2721
for (
28-
let i = 1, current: StrictAstNode = node, parent = path.getNode(i);
22+
let i = 1, current: Expression['variant'] = node, parent = path.getNode(i);
2923
parent && isChainableExpression(parent);
3024
i++, current = parent, parent = path.getNode(i)
3125
) {

0 commit comments

Comments
 (0)