From 2b3572075199484e980b413af1675ac3ee869241 Mon Sep 17 00:00:00 2001 From: Klaus Date: Mon, 2 Mar 2026 21:06:27 -0300 Subject: [PATCH] updating `StrictAstNode` so we can remove an unneeded check and multiple also unneeded type castings --- src/slang-nodes/ConditionalExpression.ts | 9 ++++----- src/slang-nodes/MemberAccessExpression.ts | 4 ++-- src/slang-nodes/TupleValues.ts | 5 +---- src/slang-nodes/types.d.ts | 1 + .../create-binary-operation-printer.ts | 13 +++++-------- src/slang-printers/print-binary-operation.ts | 11 +++++------ src/slang-utils/create-hug-function.ts | 7 +------ src/slang-utils/is-chainable-expression.ts | 8 +++++--- 8 files changed, 24 insertions(+), 34 deletions(-) diff --git a/src/slang-nodes/ConditionalExpression.ts b/src/slang-nodes/ConditionalExpression.ts index 27821b35c..21b6eb432 100644 --- a/src/slang-nodes/ConditionalExpression.ts +++ b/src/slang-nodes/ConditionalExpression.ts @@ -14,11 +14,11 @@ const { group, hardline, ifBreak, indent, line } = doc.builders; function experimentalTernaries( node: ConditionalExpression, - path: AstPath, + path: AstPath, print: PrintFunction, { useTabs, tabWidth }: ParserOptions ): Doc { - const parent = path.parent as StrictAstNode; + const parent = path.parent!; const isNested = parent.kind === NonterminalKind.ConditionalExpression; const isNestedAsTrueExpression = isNested && parent.trueExpression === node; const falseExpressionVariantKind = node.falseExpression.kind; @@ -77,7 +77,7 @@ function experimentalTernaries( } function traditionalTernaries( - path: AstPath, + path: AstPath, print: PrintFunction ): Doc { return group([ @@ -85,8 +85,7 @@ function traditionalTernaries( indent([ // Nested trueExpression and falseExpression are always printed in a new // line - (path.parent as StrictAstNode).kind === - NonterminalKind.ConditionalExpression + path.parent!.kind === NonterminalKind.ConditionalExpression ? hardline : line, '? ', diff --git a/src/slang-nodes/MemberAccessExpression.ts b/src/slang-nodes/MemberAccessExpression.ts index 2573a4c33..c0759b746 100644 --- a/src/slang-nodes/MemberAccessExpression.ts +++ b/src/slang-nodes/MemberAccessExpression.ts @@ -10,13 +10,13 @@ import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; import type { AstPath, Doc, ParserOptions } from 'prettier'; import type { CollectedMetadata, PrintFunction } from '../types.d.ts'; -import type { AstNode, ChainableExpression } from './types.d.ts'; +import type { AstNode, ChainableExpression, StrictAstNode } from './types.d.ts'; const { group, indent, label, softline } = doc.builders; function isEndOfChain( node: ChainableExpression, - path: AstPath + path: AstPath ): boolean { for (let i = 1, current = node, parent; ; i++, current = parent) { parent = path.getNode(i)!; diff --git a/src/slang-nodes/TupleValues.ts b/src/slang-nodes/TupleValues.ts index a490a437a..ea2e46aa1 100644 --- a/src/slang-nodes/TupleValues.ts +++ b/src/slang-nodes/TupleValues.ts @@ -3,7 +3,6 @@ import { printSeparatedList } from '../slang-printers/print-separated-list.js'; import { isBinaryOperation } from '../slang-utils/is-binary-operation.js'; import { SlangNode } from './SlangNode.js'; import { TupleValue } from './TupleValue.js'; -import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; import type { AstPath, Doc, ParserOptions } from 'prettier'; @@ -36,9 +35,7 @@ export class TupleValues extends SlangNode { print(path: AstPath, print: PrintFunction): Doc { const singleExpression = this.getSingleExpression(); const items = path.map(print, 'items'); - return singleExpression && - !(singleExpression instanceof TerminalNode) && - isBinaryOperation(singleExpression) + return singleExpression && isBinaryOperation(singleExpression) ? items : printSeparatedList(items); } diff --git a/src/slang-nodes/types.d.ts b/src/slang-nodes/types.d.ts index 7dc916cfd..0762e9166 100644 --- a/src/slang-nodes/types.d.ts +++ b/src/slang-nodes/types.d.ts @@ -240,6 +240,7 @@ export type LineComment = SingleLineComment | SingleLineNatSpecComment; export type Comment = BlockComment | LineComment; export type StrictAstNode = + | TerminalNode | SourceUnit | PragmaDirective | AbicoderPragma diff --git a/src/slang-printers/create-binary-operation-printer.ts b/src/slang-printers/create-binary-operation-printer.ts index b2fe7e9da..b9f8c0b94 100644 --- a/src/slang-printers/create-binary-operation-printer.ts +++ b/src/slang-printers/create-binary-operation-printer.ts @@ -1,7 +1,6 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst'; import { doc } from 'prettier'; import { isBinaryOperation } from '../slang-utils/is-binary-operation.js'; -import { TerminalNode } from '../slang-nodes/TerminalNode.js'; import type { AstPath, Doc, ParserOptions } from 'prettier'; import type { @@ -15,7 +14,7 @@ const { group, line } = doc.builders; function rightOperandPrint( { operator, leftOperand }: BinaryOperation, - path: AstPath, + path: AstPath, print: PrintFunction, options: ParserOptions ): Doc { @@ -27,9 +26,9 @@ function rightOperandPrint( // If there's only a single binary expression, we want to create a group in // order to avoid having a small right part like -1 be on its own line. - const parent = path.parent as StrictAstNode; + const parent = path.parent!; const shouldGroup = - (leftOperand instanceof TerminalNode || !isBinaryOperation(leftOperand)) && + !isBinaryOperation(leftOperand) && (!isBinaryOperation(parent) || parent.kind === NonterminalKind.AssignmentExpression); @@ -38,9 +37,7 @@ function rightOperandPrint( export const createBinaryOperationPrinter = ( - groupRulesBuilder: ( - path: AstPath - ) => (document: Doc) => Doc, + groupRulesBuilder: (path: AstPath) => (document: Doc) => Doc, indentRulesBuilder: ( node: BinaryOperation, path: AstPath @@ -48,7 +45,7 @@ export const createBinaryOperationPrinter = ) => ( node: BinaryOperation, - path: AstPath, + path: AstPath, print: PrintFunction, options: ParserOptions ): Doc => { diff --git a/src/slang-printers/print-binary-operation.ts b/src/slang-printers/print-binary-operation.ts index a9d21891d..3bf1fb909 100644 --- a/src/slang-printers/print-binary-operation.ts +++ b/src/slang-printers/print-binary-operation.ts @@ -16,9 +16,9 @@ const { group, indent } = doc.builders; export const binaryGroupRulesBuilder = (shouldGroup: (node: BinaryOperation) => boolean) => - (path: AstPath) => + (path: AstPath) => (document: Doc): Doc => { - const parent = path.parent as StrictAstNode; + const parent = path.parent!; if (!isBinaryOperation(parent)) return group(document); if (shouldGroup(parent)) return group(document); return document; @@ -37,8 +37,7 @@ export const shouldNotIndent = ( ): boolean => isStatementWithoutIndentedOperation(node) || (node.kind === NonterminalKind.ExpressionStatement && - (path.getNode(index + 1) as StrictAstNode).kind === - NonterminalKind.ForStatement); + path.getNode(index + 1)!.kind === NonterminalKind.ForStatement); export const binaryIndentRulesBuilder = (shouldIndent: (node: BinaryOperation) => boolean) => @@ -55,10 +54,10 @@ export const binaryIndentRulesBuilder = }; export const printBinaryOperation = ( - shouldGroupAndIndent: (node: StrictAstNode) => boolean + shouldGroupAndIndent: (node: BinaryOperation) => boolean ): (( node: BinaryOperation, - path: AstPath, + path: AstPath, print: PrintFunction, options: ParserOptions ) => Doc) => diff --git a/src/slang-utils/create-hug-function.ts b/src/slang-utils/create-hug-function.ts index 64a42363e..2e343cd0a 100644 --- a/src/slang-utils/create-hug-function.ts +++ b/src/slang-utils/create-hug-function.ts @@ -2,7 +2,6 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst'; import { TupleExpression } from '../slang-nodes/TupleExpression.js'; import { TupleValues } from '../slang-nodes/TupleValues.js'; import { TupleValue } from '../slang-nodes/TupleValue.js'; -import { TerminalNode } from '../slang-nodes/TerminalNode.js'; import { isBinaryOperation } from './is-binary-operation.js'; import type { Expression } from '../slang-nodes/Expression.ts'; @@ -12,11 +11,7 @@ export function createHugFunction( ): (node: Expression['variant']) => Expression['variant'] { const operators = new Set(huggableOperators); return (node: Expression['variant']): Expression['variant'] => { - if ( - !(node instanceof TerminalNode) && - isBinaryOperation(node) && - operators.has(node.operator) - ) { + if (isBinaryOperation(node) && operators.has(node.operator)) { const loc = node.loc; return Object.assign( Object.create(TupleExpression.prototype) as TupleExpression, diff --git a/src/slang-utils/is-chainable-expression.ts b/src/slang-utils/is-chainable-expression.ts index fa400d3e9..e2ce22583 100644 --- a/src/slang-utils/is-chainable-expression.ts +++ b/src/slang-utils/is-chainable-expression.ts @@ -1,11 +1,13 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst'; import { createKindCheckFunction } from './create-kind-check-function.js'; -import type { ChainableExpression } from '../slang-nodes/types.js'; -import type { Expression } from '../slang-nodes/Expression.js'; +import type { + ChainableExpression, + StrictAstNode +} from '../slang-nodes/types.js'; export const isChainableExpression = createKindCheckFunction([ NonterminalKind.FunctionCallExpression, NonterminalKind.IndexAccessExpression, NonterminalKind.MemberAccessExpression -]) as (node: Expression['variant']) => node is ChainableExpression; +]) as (node: StrictAstNode) => node is ChainableExpression;