From 26a9df2efd0ab6577bc42614434a0024f49013a1 Mon Sep 17 00:00:00 2001 From: Klaus Date: Wed, 22 Apr 2026 02:00:42 -0400 Subject: [PATCH 1/2] move indented preserved empty lines logic into it's own function --- src/slang-nodes/ContractMembers.ts | 13 ++----------- src/slang-nodes/InterfaceMembers.ts | 13 ++----------- src/slang-nodes/LibraryMembers.ts | 13 ++----------- src/slang-nodes/Statements.ts | 13 ++----------- src/slang-nodes/YulStatements.ts | 13 ++----------- .../print-preserving-empty-lines.ts | 15 +++++++++++++++ 6 files changed, 25 insertions(+), 55 deletions(-) diff --git a/src/slang-nodes/ContractMembers.ts b/src/slang-nodes/ContractMembers.ts index 440510529..b9302d8c8 100644 --- a/src/slang-nodes/ContractMembers.ts +++ b/src/slang-nodes/ContractMembers.ts @@ -1,7 +1,5 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst'; -import { doc } from 'prettier'; -import { printSeparatedItem } from '../slang-printers/print-separated-item.js'; -import { printPreservingEmptyLines } from '../slang-printers/print-preserving-empty-lines.js'; +import { printIndentedPreservingEmptyLines } from '../slang-printers/print-preserving-empty-lines.js'; import { extractVariant } from '../slang-utils/extract-variant.js'; import { SlangNode } from './SlangNode.js'; import { ContractMember } from './ContractMember.js'; @@ -11,8 +9,6 @@ import type { AstPath, Doc, ParserOptions } from 'prettier'; import type { CollectedMetadata, PrintFunction } from '../types.d.ts'; import type { PrintableNode } from './types.d.ts'; -const { hardline } = doc.builders; - export class ContractMembers extends SlangNode { readonly kind = NonterminalKind.ContractMembers; @@ -35,11 +31,6 @@ export class ContractMembers extends SlangNode { path: AstPath, options: ParserOptions ): Doc { - return this.items.length > 0 || (this.comments?.length || 0) > 0 - ? printSeparatedItem( - printPreservingEmptyLines(this, path, print, options), - { firstSeparator: hardline } - ) - : ''; + return printIndentedPreservingEmptyLines(this, path, print, options); } } diff --git a/src/slang-nodes/InterfaceMembers.ts b/src/slang-nodes/InterfaceMembers.ts index 92fb0833c..e019bb31c 100644 --- a/src/slang-nodes/InterfaceMembers.ts +++ b/src/slang-nodes/InterfaceMembers.ts @@ -1,7 +1,5 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst'; -import { doc } from 'prettier'; -import { printSeparatedItem } from '../slang-printers/print-separated-item.js'; -import { printPreservingEmptyLines } from '../slang-printers/print-preserving-empty-lines.js'; +import { printIndentedPreservingEmptyLines } from '../slang-printers/print-preserving-empty-lines.js'; import { extractVariant } from '../slang-utils/extract-variant.js'; import { SlangNode } from './SlangNode.js'; import { ContractMember } from './ContractMember.js'; @@ -11,8 +9,6 @@ import type { AstPath, Doc, ParserOptions } from 'prettier'; import type { CollectedMetadata, PrintFunction } from '../types.d.ts'; import type { PrintableNode } from './types.d.ts'; -const { hardline } = doc.builders; - export class InterfaceMembers extends SlangNode { readonly kind = NonterminalKind.InterfaceMembers; @@ -35,11 +31,6 @@ export class InterfaceMembers extends SlangNode { path: AstPath, options: ParserOptions ): Doc { - return this.items.length > 0 || (this.comments?.length || 0) > 0 - ? printSeparatedItem( - printPreservingEmptyLines(this, path, print, options), - { firstSeparator: hardline } - ) - : ''; + return printIndentedPreservingEmptyLines(this, path, print, options); } } diff --git a/src/slang-nodes/LibraryMembers.ts b/src/slang-nodes/LibraryMembers.ts index fb2f012d7..484edd352 100644 --- a/src/slang-nodes/LibraryMembers.ts +++ b/src/slang-nodes/LibraryMembers.ts @@ -1,7 +1,5 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst'; -import { doc } from 'prettier'; -import { printSeparatedItem } from '../slang-printers/print-separated-item.js'; -import { printPreservingEmptyLines } from '../slang-printers/print-preserving-empty-lines.js'; +import { printIndentedPreservingEmptyLines } from '../slang-printers/print-preserving-empty-lines.js'; import { extractVariant } from '../slang-utils/extract-variant.js'; import { SlangNode } from './SlangNode.js'; import { ContractMember } from './ContractMember.js'; @@ -11,8 +9,6 @@ import type { AstPath, Doc, ParserOptions } from 'prettier'; import type { CollectedMetadata, PrintFunction } from '../types.d.ts'; import type { PrintableNode } from './types.d.ts'; -const { hardline } = doc.builders; - export class LibraryMembers extends SlangNode { readonly kind = NonterminalKind.LibraryMembers; @@ -35,11 +31,6 @@ export class LibraryMembers extends SlangNode { path: AstPath, options: ParserOptions ): Doc { - return this.items.length > 0 || (this.comments?.length || 0) > 0 - ? printSeparatedItem( - printPreservingEmptyLines(this, path, print, options), - { firstSeparator: hardline } - ) - : ''; + return printIndentedPreservingEmptyLines(this, path, print, options); } } diff --git a/src/slang-nodes/Statements.ts b/src/slang-nodes/Statements.ts index 587902dbf..4225ec45d 100644 --- a/src/slang-nodes/Statements.ts +++ b/src/slang-nodes/Statements.ts @@ -1,7 +1,5 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst'; -import { doc } from 'prettier'; -import { printSeparatedItem } from '../slang-printers/print-separated-item.js'; -import { printPreservingEmptyLines } from '../slang-printers/print-preserving-empty-lines.js'; +import { printIndentedPreservingEmptyLines } from '../slang-printers/print-preserving-empty-lines.js'; import { extractVariant } from '../slang-utils/extract-variant.js'; import { SlangNode } from './SlangNode.js'; import { Statement } from './Statement.js'; @@ -11,8 +9,6 @@ import type { AstPath, Doc, ParserOptions } from 'prettier'; import type { CollectedMetadata, PrintFunction } from '../types.d.ts'; import type { PrintableNode } from './types.d.ts'; -const { hardline } = doc.builders; - export class Statements extends SlangNode { readonly kind = NonterminalKind.Statements; @@ -35,11 +31,6 @@ export class Statements extends SlangNode { path: AstPath, options: ParserOptions ): Doc { - return this.items.length > 0 || (this.comments?.length || 0) > 0 - ? printSeparatedItem( - printPreservingEmptyLines(this, path, print, options), - { firstSeparator: hardline } - ) - : ''; + return printIndentedPreservingEmptyLines(this, path, print, options); } } diff --git a/src/slang-nodes/YulStatements.ts b/src/slang-nodes/YulStatements.ts index fdb0324ce..6647b55c3 100644 --- a/src/slang-nodes/YulStatements.ts +++ b/src/slang-nodes/YulStatements.ts @@ -1,7 +1,5 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst'; -import { doc } from 'prettier'; -import { printSeparatedItem } from '../slang-printers/print-separated-item.js'; -import { printPreservingEmptyLines } from '../slang-printers/print-preserving-empty-lines.js'; +import { printIndentedPreservingEmptyLines } from '../slang-printers/print-preserving-empty-lines.js'; import { extractVariant } from '../slang-utils/extract-variant.js'; import { SlangNode } from './SlangNode.js'; import { YulStatement } from './YulStatement.js'; @@ -11,8 +9,6 @@ import type { AstPath, Doc, ParserOptions } from 'prettier'; import type { CollectedMetadata, PrintFunction } from '../types.d.ts'; import type { PrintableNode } from './types.d.ts'; -const { hardline } = doc.builders; - export class YulStatements extends SlangNode { readonly kind = NonterminalKind.YulStatements; @@ -35,11 +31,6 @@ export class YulStatements extends SlangNode { path: AstPath, options: ParserOptions ): Doc { - return this.items.length > 0 || (this.comments?.length || 0) > 0 - ? printSeparatedItem( - printPreservingEmptyLines(this, path, print, options), - { firstSeparator: hardline } - ) - : ''; + return printIndentedPreservingEmptyLines(this, path, print, options); } } diff --git a/src/slang-printers/print-preserving-empty-lines.ts b/src/slang-printers/print-preserving-empty-lines.ts index ad79894c8..dcfb9e8fc 100644 --- a/src/slang-printers/print-preserving-empty-lines.ts +++ b/src/slang-printers/print-preserving-empty-lines.ts @@ -2,6 +2,7 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst'; import { doc, util } from 'prettier'; import { locEnd } from '../slang-utils/loc.js'; import { printComments } from './print-comments.js'; +import { printSeparatedItem } from './print-separated-item.js'; import type { AstPath, Doc, ParserOptions } from 'prettier'; import type { LineCollection, PrintableNode } from '../slang-nodes/types.d.ts'; @@ -36,3 +37,17 @@ export function printPreservingEmptyLines( }, 'items') : printComments(node, path, options); } + +export function printIndentedPreservingEmptyLines( + node: LineCollection, + path: AstPath, + print: PrintFunction, + options: ParserOptions +): Doc { + return node.items.length > 0 || (node.comments?.length || 0) > 0 + ? printSeparatedItem( + printPreservingEmptyLines(node, path, print, options), + { firstSeparator: hardline } + ) + : ''; +} From 7f4d289afb99cfc15291cf88972583b062cd3b00 Mon Sep 17 00:00:00 2001 From: Klaus Date: Wed, 22 Apr 2026 13:19:02 -0400 Subject: [PATCH 2/2] Nullish Coalescing Operator is more accurate for describing undefined comments length --- src/slang-printers/print-comments.ts | 2 +- src/slang-printers/print-preserving-empty-lines.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/slang-printers/print-comments.ts b/src/slang-printers/print-comments.ts index ce8e5a887..18c063086 100644 --- a/src/slang-printers/print-comments.ts +++ b/src/slang-printers/print-comments.ts @@ -17,7 +17,7 @@ export function printComments( path: AstPath, options: ParserOptions ): Doc[] { - const lastPrintableIndex = (node.comments ?? []).findLastIndex(isPrintable); + const lastPrintableIndex = node.comments?.findLastIndex(isPrintable) ?? -1; if (lastPrintableIndex === -1) { return []; } diff --git a/src/slang-printers/print-preserving-empty-lines.ts b/src/slang-printers/print-preserving-empty-lines.ts index dcfb9e8fc..74151be65 100644 --- a/src/slang-printers/print-preserving-empty-lines.ts +++ b/src/slang-printers/print-preserving-empty-lines.ts @@ -44,7 +44,7 @@ export function printIndentedPreservingEmptyLines( print: PrintFunction, options: ParserOptions ): Doc { - return node.items.length > 0 || (node.comments?.length || 0) > 0 + return node.items.length > 0 || (node.comments?.length ?? 0) > 0 ? printSeparatedItem( printPreservingEmptyLines(node, path, print, options), { firstSeparator: hardline }