Skip to content

Commit 365e7e0

Browse files
authored
updating StrictAstNode so we can remove an unneeded check and multiple also unneeded type castings (#1439)
1 parent dd23da0 commit 365e7e0

8 files changed

Lines changed: 24 additions & 34 deletions

src/slang-nodes/ConditionalExpression.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@ const { group, hardline, ifBreak, indent, line } = doc.builders;
1414

1515
function experimentalTernaries(
1616
node: ConditionalExpression,
17-
path: AstPath<ConditionalExpression>,
17+
path: AstPath<StrictAstNode>,
1818
print: PrintFunction,
1919
{ useTabs, tabWidth }: ParserOptions<AstNode>
2020
): Doc {
21-
const parent = path.parent as StrictAstNode;
21+
const parent = path.parent!;
2222
const isNested = parent.kind === NonterminalKind.ConditionalExpression;
2323
const isNestedAsTrueExpression = isNested && parent.trueExpression === node;
2424
const falseExpressionVariantKind = node.falseExpression.kind;
@@ -77,16 +77,15 @@ function experimentalTernaries(
7777
}
7878

7979
function traditionalTernaries(
80-
path: AstPath<ConditionalExpression>,
80+
path: AstPath<StrictAstNode>,
8181
print: PrintFunction
8282
): Doc {
8383
return group([
8484
path.call(print, 'operand'),
8585
indent([
8686
// Nested trueExpression and falseExpression are always printed in a new
8787
// line
88-
(path.parent as StrictAstNode).kind ===
89-
NonterminalKind.ConditionalExpression
88+
path.parent!.kind === NonterminalKind.ConditionalExpression
9089
? hardline
9190
: line,
9291
'? ',

src/slang-nodes/MemberAccessExpression.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@ import { TerminalNode } from './TerminalNode.js';
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, ChainableExpression } from './types.d.ts';
13+
import type { AstNode, ChainableExpression, StrictAstNode } from './types.d.ts';
1414

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

1717
function isEndOfChain(
1818
node: ChainableExpression,
19-
path: AstPath<Expression['variant']>
19+
path: AstPath<StrictAstNode>
2020
): boolean {
2121
for (let i = 1, current = node, parent; ; i++, current = parent) {
2222
parent = path.getNode(i)!;

src/slang-nodes/TupleValues.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import { printSeparatedList } from '../slang-printers/print-separated-list.js';
33
import { isBinaryOperation } from '../slang-utils/is-binary-operation.js';
44
import { SlangNode } from './SlangNode.js';
55
import { TupleValue } from './TupleValue.js';
6-
import { TerminalNode } from './TerminalNode.js';
76

87
import type * as ast from '@nomicfoundation/slang/ast';
98
import type { AstPath, Doc, ParserOptions } from 'prettier';
@@ -36,9 +35,7 @@ export class TupleValues extends SlangNode {
3635
print(path: AstPath<TupleValues>, print: PrintFunction): Doc {
3736
const singleExpression = this.getSingleExpression();
3837
const items = path.map(print, 'items');
39-
return singleExpression &&
40-
!(singleExpression instanceof TerminalNode) &&
41-
isBinaryOperation(singleExpression)
38+
return singleExpression && isBinaryOperation(singleExpression)
4239
? items
4340
: printSeparatedList(items);
4441
}

src/slang-nodes/types.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,7 @@ export type LineComment = SingleLineComment | SingleLineNatSpecComment;
240240
export type Comment = BlockComment | LineComment;
241241

242242
export type StrictAstNode =
243+
| TerminalNode
243244
| SourceUnit
244245
| PragmaDirective
245246
| AbicoderPragma

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

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { NonterminalKind } from '@nomicfoundation/slang/cst';
22
import { doc } from 'prettier';
33
import { isBinaryOperation } from '../slang-utils/is-binary-operation.js';
4-
import { TerminalNode } from '../slang-nodes/TerminalNode.js';
54

65
import type { AstPath, Doc, ParserOptions } from 'prettier';
76
import type {
@@ -15,7 +14,7 @@ const { group, line } = doc.builders;
1514

1615
function rightOperandPrint(
1716
{ operator, leftOperand }: BinaryOperation,
18-
path: AstPath<BinaryOperation>,
17+
path: AstPath<StrictAstNode>,
1918
print: PrintFunction,
2019
options: ParserOptions<AstNode>
2120
): Doc {
@@ -27,9 +26,9 @@ function rightOperandPrint(
2726

2827
// If there's only a single binary expression, we want to create a group in
2928
// order to avoid having a small right part like -1 be on its own line.
30-
const parent = path.parent as StrictAstNode;
29+
const parent = path.parent!;
3130
const shouldGroup =
32-
(leftOperand instanceof TerminalNode || !isBinaryOperation(leftOperand)) &&
31+
!isBinaryOperation(leftOperand) &&
3332
(!isBinaryOperation(parent) ||
3433
parent.kind === NonterminalKind.AssignmentExpression);
3534

@@ -38,17 +37,15 @@ function rightOperandPrint(
3837

3938
export const createBinaryOperationPrinter =
4039
(
41-
groupRulesBuilder: (
42-
path: AstPath<BinaryOperation>
43-
) => (document: Doc) => Doc,
40+
groupRulesBuilder: (path: AstPath<StrictAstNode>) => (document: Doc) => Doc,
4441
indentRulesBuilder: (
4542
node: BinaryOperation,
4643
path: AstPath<StrictAstNode>
4744
) => (document: Doc) => Doc
4845
) =>
4946
(
5047
node: BinaryOperation,
51-
path: AstPath<BinaryOperation>,
48+
path: AstPath<StrictAstNode>,
5249
print: PrintFunction,
5350
options: ParserOptions<AstNode>
5451
): Doc => {

src/slang-printers/print-binary-operation.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ const { group, indent } = doc.builders;
1616

1717
export const binaryGroupRulesBuilder =
1818
(shouldGroup: (node: BinaryOperation) => boolean) =>
19-
(path: AstPath<BinaryOperation>) =>
19+
(path: AstPath<StrictAstNode>) =>
2020
(document: Doc): Doc => {
21-
const parent = path.parent as StrictAstNode;
21+
const parent = path.parent!;
2222
if (!isBinaryOperation(parent)) return group(document);
2323
if (shouldGroup(parent)) return group(document);
2424
return document;
@@ -37,8 +37,7 @@ export const shouldNotIndent = (
3737
): boolean =>
3838
isStatementWithoutIndentedOperation(node) ||
3939
(node.kind === NonterminalKind.ExpressionStatement &&
40-
(path.getNode(index + 1) as StrictAstNode).kind ===
41-
NonterminalKind.ForStatement);
40+
path.getNode(index + 1)!.kind === NonterminalKind.ForStatement);
4241

4342
export const binaryIndentRulesBuilder =
4443
(shouldIndent: (node: BinaryOperation) => boolean) =>
@@ -55,10 +54,10 @@ export const binaryIndentRulesBuilder =
5554
};
5655

5756
export const printBinaryOperation = (
58-
shouldGroupAndIndent: (node: StrictAstNode) => boolean
57+
shouldGroupAndIndent: (node: BinaryOperation) => boolean
5958
): ((
6059
node: BinaryOperation,
61-
path: AstPath<BinaryOperation>,
60+
path: AstPath<StrictAstNode>,
6261
print: PrintFunction,
6362
options: ParserOptions<AstNode>
6463
) => Doc) =>

src/slang-utils/create-hug-function.ts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst';
22
import { TupleExpression } from '../slang-nodes/TupleExpression.js';
33
import { TupleValues } from '../slang-nodes/TupleValues.js';
44
import { TupleValue } from '../slang-nodes/TupleValue.js';
5-
import { TerminalNode } from '../slang-nodes/TerminalNode.js';
65
import { isBinaryOperation } from './is-binary-operation.js';
76

87
import type { Expression } from '../slang-nodes/Expression.ts';
@@ -12,11 +11,7 @@ export function createHugFunction(
1211
): (node: Expression['variant']) => Expression['variant'] {
1312
const operators = new Set(huggableOperators);
1413
return (node: Expression['variant']): Expression['variant'] => {
15-
if (
16-
!(node instanceof TerminalNode) &&
17-
isBinaryOperation(node) &&
18-
operators.has(node.operator)
19-
) {
14+
if (isBinaryOperation(node) && operators.has(node.operator)) {
2015
const loc = node.loc;
2116
return Object.assign(
2217
Object.create(TupleExpression.prototype) as TupleExpression,
Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import { NonterminalKind } from '@nomicfoundation/slang/cst';
22
import { createKindCheckFunction } from './create-kind-check-function.js';
33

4-
import type { ChainableExpression } from '../slang-nodes/types.js';
5-
import type { Expression } from '../slang-nodes/Expression.js';
4+
import type {
5+
ChainableExpression,
6+
StrictAstNode
7+
} from '../slang-nodes/types.js';
68

79
export const isChainableExpression = createKindCheckFunction([
810
NonterminalKind.FunctionCallExpression,
911
NonterminalKind.IndexAccessExpression,
1012
NonterminalKind.MemberAccessExpression
11-
]) as (node: Expression['variant']) => node is ChainableExpression;
13+
]) as (node: StrictAstNode) => node is ChainableExpression;

0 commit comments

Comments
 (0)