From f6cc4756a84022a856053925ce3ae395575983b1 Mon Sep 17 00:00:00 2001 From: Klaus Date: Sun, 10 Aug 2025 08:52:35 +0100 Subject: [PATCH 1/3] storing comments in a singleton --- .../PositionalArgumentsDeclaration.ts | 4 ++- src/slang-nodes/SlangNode.ts | 34 ++++++------------- src/slang-nodes/SourceUnit.ts | 4 --- src/slangSolidityParser.ts | 6 +++- 4 files changed, 19 insertions(+), 29 deletions(-) diff --git a/src/slang-nodes/PositionalArgumentsDeclaration.ts b/src/slang-nodes/PositionalArgumentsDeclaration.ts index 0e1962e62..4e4593058 100644 --- a/src/slang-nodes/PositionalArgumentsDeclaration.ts +++ b/src/slang-nodes/PositionalArgumentsDeclaration.ts @@ -27,9 +27,11 @@ export class PositionalArgumentsDeclaration extends SlangNode { // We need to check the comments at this point because they will be removed // from this node into the root node. + // Since we are collecting comments in a different array, we have to query + // the ast directly for possible block comments. this.isEmpty = this.arguments.items.length === 0 && // no arguments - !this.comments.some((comment) => isBlockComment(comment)); // no block comments + !ast.cst.children().some(({ node }) => isBlockComment(node)); // no block comments } print( diff --git a/src/slang-nodes/SlangNode.ts b/src/slang-nodes/SlangNode.ts index feaf71f2a..96fd499f6 100644 --- a/src/slang-nodes/SlangNode.ts +++ b/src/slang-nodes/SlangNode.ts @@ -12,10 +12,16 @@ import type { Comment, StrictAstNode } from '../slang-nodes/types.d.ts'; import type { AstLocation, SlangAstNode } from '../types.d.ts'; const offsets = new Map(); +const comments: Comment[] = []; + export function clearOffsets(): void { offsets.clear(); } +export function clearComments(): Comment[] { + return comments.splice(0); +} + function reversedIterator(children: T[]): Iterable { return { [Symbol.iterator](): Iterator { @@ -30,21 +36,6 @@ function reversedIterator(children: T[]): Iterable { }; } -function collectComments( - comments: Comment[], - node: StrictAstNode | StrictAstNode[] | undefined -): Comment[] { - if (node) { - if (Array.isArray(node)) { - return node.reduce(collectComments, comments); - } - if (node.comments.length > 0) { - comments.push(...node.comments.splice(0)); - } - } - return comments; -} - export class SlangNode { comments: Comment[] = []; @@ -98,16 +89,16 @@ export class SlangNode { // offset, it's hard to separate these responsibilities into different // functions without doing the iteration twice. case TerminalKind.MultiLineComment: - this.comments.push(new MultiLineComment(node, offset)); + comments.push(new MultiLineComment(node, offset)); break; case TerminalKind.MultiLineNatSpecComment: - this.comments.push(new MultiLineNatSpecComment(node, offset)); + comments.push(new MultiLineNatSpecComment(node, offset)); break; case TerminalKind.SingleLineComment: - this.comments.push(new SingleLineComment(node, offset)); + comments.push(new SingleLineComment(node, offset)); break; case TerminalKind.SingleLineNatSpecComment: - this.comments.push(new SingleLineNatSpecComment(node, offset)); + comments.push(new SingleLineNatSpecComment(node, offset)); break; } // We accumulate the trivia length @@ -133,10 +124,7 @@ export class SlangNode { updateMetadata( ...childNodes: (StrictAstNode | StrictAstNode[] | undefined)[] ): void { - const { comments, loc } = this; - // Collect comments - this.comments = childNodes.reduce(collectComments, comments); - + const { loc } = this; // calculate correct loc object if (loc.leadingOffset === 0) { for (const childNode of childNodes) { diff --git a/src/slang-nodes/SourceUnit.ts b/src/slang-nodes/SourceUnit.ts index 56a3e5f55..25ac24609 100644 --- a/src/slang-nodes/SourceUnit.ts +++ b/src/slang-nodes/SourceUnit.ts @@ -21,10 +21,6 @@ export class SourceUnit extends SlangNode { this.members = new SourceUnitMembers(ast.members, options); this.updateMetadata(this.members); - - // Because of comments being extracted like a russian doll, the order needs - // to be fixed at the end. - this.comments = this.comments.sort((a, b) => a.loc.start - b.loc.start); } print( diff --git a/src/slangSolidityParser.ts b/src/slangSolidityParser.ts index e52da506f..8ef252ec8 100644 --- a/src/slangSolidityParser.ts +++ b/src/slangSolidityParser.ts @@ -1,6 +1,6 @@ // https://prettier.io/docs/en/plugins.html#parsers import { SourceUnit as SlangSourceUnit } from '@nomicfoundation/slang/ast'; -import { clearOffsets } from './slang-nodes/SlangNode.js'; +import { clearOffsets, clearComments } from './slang-nodes/SlangNode.js'; import { createParser } from './slang-utils/create-parser.js'; import { SourceUnit } from './slang-nodes/SourceUnit.js'; @@ -19,6 +19,10 @@ export default function parse( new SlangSourceUnit(parseOutput.tree.asNonterminalNode()), options ); + + // Because of comments being extracted like a russian doll, the order needs + // to be fixed at the end. + parsed.comments = clearComments().sort((a, b) => a.loc.start - b.loc.start); clearOffsets(); return parsed; } From 08030a98ca35bd3d93a9507f9dfe497ca125d28c Mon Sep 17 00:00:00 2001 From: Klaus Date: Sun, 10 Aug 2025 09:00:33 +0100 Subject: [PATCH 2/3] no need to initiate an empty `comments` array for every single node, prettier will create them if needed and only a few places need to check if it's defined --- src/slang-nodes/ContractMembers.ts | 2 +- src/slang-nodes/IfStatement.ts | 2 +- src/slang-nodes/InterfaceMembers.ts | 2 +- src/slang-nodes/LibraryMembers.ts | 2 +- src/slang-nodes/SlangNode.ts | 2 +- src/slang-nodes/Statements.ts | 2 +- src/slang-nodes/YulStatements.ts | 2 +- src/slang-printers/print-comments.ts | 9 +++++++-- src/slangPrinter.ts | 12 +++++++----- 9 files changed, 21 insertions(+), 14 deletions(-) diff --git a/src/slang-nodes/ContractMembers.ts b/src/slang-nodes/ContractMembers.ts index 90ddcde58..14acea7c6 100644 --- a/src/slang-nodes/ContractMembers.ts +++ b/src/slang-nodes/ContractMembers.ts @@ -30,7 +30,7 @@ export class ContractMembers extends SlangNode { print: PrintFunction, options: ParserOptions ): Doc { - return this.items.length > 0 || this.comments.length > 0 + return this.items.length > 0 || (this.comments?.length || 0) > 0 ? printSeparatedItem(printPreservingEmptyLines(path, print, options), { firstSeparator: hardline }) diff --git a/src/slang-nodes/IfStatement.ts b/src/slang-nodes/IfStatement.ts index 0ffa8dd60..00a9b6249 100644 --- a/src/slang-nodes/IfStatement.ts +++ b/src/slang-nodes/IfStatement.ts @@ -51,7 +51,7 @@ export class IfStatement extends SlangNode { this.elseBranch ? [ bodyKind !== NonterminalKind.Block || // else on a new line if body is not a block - bodyComments.some( + bodyComments?.some( (comment) => !isBlockComment(comment) || comment.placement === 'ownLine' ) // or if body has trailing single line comments or a block comment on a new line diff --git a/src/slang-nodes/InterfaceMembers.ts b/src/slang-nodes/InterfaceMembers.ts index 657078bc4..e15ddf061 100644 --- a/src/slang-nodes/InterfaceMembers.ts +++ b/src/slang-nodes/InterfaceMembers.ts @@ -30,7 +30,7 @@ export class InterfaceMembers extends SlangNode { print: PrintFunction, options: ParserOptions ): Doc { - return this.items.length > 0 || this.comments.length > 0 + return this.items.length > 0 || (this.comments?.length || 0) > 0 ? printSeparatedItem(printPreservingEmptyLines(path, print, options), { firstSeparator: hardline }) diff --git a/src/slang-nodes/LibraryMembers.ts b/src/slang-nodes/LibraryMembers.ts index 8cb97a6b0..b21ffaaf0 100644 --- a/src/slang-nodes/LibraryMembers.ts +++ b/src/slang-nodes/LibraryMembers.ts @@ -30,7 +30,7 @@ export class LibraryMembers extends SlangNode { print: PrintFunction, options: ParserOptions ): Doc { - return this.items.length > 0 || this.comments.length > 0 + return this.items.length > 0 || (this.comments?.length || 0) > 0 ? printSeparatedItem(printPreservingEmptyLines(path, print, options), { firstSeparator: hardline }) diff --git a/src/slang-nodes/SlangNode.ts b/src/slang-nodes/SlangNode.ts index 96fd499f6..842458d08 100644 --- a/src/slang-nodes/SlangNode.ts +++ b/src/slang-nodes/SlangNode.ts @@ -37,7 +37,7 @@ function reversedIterator(children: T[]): Iterable { } export class SlangNode { - comments: Comment[] = []; + comments?: Comment[]; loc: AstLocation; diff --git a/src/slang-nodes/Statements.ts b/src/slang-nodes/Statements.ts index 1f56baaf9..4bb92f7a1 100644 --- a/src/slang-nodes/Statements.ts +++ b/src/slang-nodes/Statements.ts @@ -30,7 +30,7 @@ export class Statements extends SlangNode { print: PrintFunction, options: ParserOptions ): Doc { - return this.items.length > 0 || this.comments.length > 0 + return this.items.length > 0 || (this.comments?.length || 0) > 0 ? printSeparatedItem(printPreservingEmptyLines(path, print, options), { firstSeparator: hardline }) diff --git a/src/slang-nodes/YulStatements.ts b/src/slang-nodes/YulStatements.ts index 6afaca46c..de55471fe 100644 --- a/src/slang-nodes/YulStatements.ts +++ b/src/slang-nodes/YulStatements.ts @@ -30,7 +30,7 @@ export class YulStatements extends SlangNode { print: PrintFunction, options: ParserOptions ): Doc { - return this.items.length > 0 || this.comments.length > 0 + return this.items.length > 0 || (this.comments?.length || 0) > 0 ? printSeparatedItem(printPreservingEmptyLines(path, print, options), { firstSeparator: hardline }) diff --git a/src/slang-printers/print-comments.ts b/src/slang-printers/print-comments.ts index 596cc7d14..1b07f187a 100644 --- a/src/slang-printers/print-comments.ts +++ b/src/slang-printers/print-comments.ts @@ -3,7 +3,11 @@ import { printComment } from '../slang-comments/printer.js'; import { joinExisting } from '../slang-utils/join-existing.js'; import type { AstPath, Doc, ParserOptions } from 'prettier'; -import type { AstNode, Comment } from '../slang-nodes/types.d.ts'; +import type { + AstNode, + Comment, + StrictAstNode +} from '../slang-nodes/types.d.ts'; import { locEnd } from '../slang-utils/loc.js'; const { hardline, line } = doc.builders; @@ -13,9 +17,10 @@ function isPrintable(comment: Comment): boolean { } export function printComments( - path: AstPath, + path: AstPath, options: ParserOptions ): Doc[] { + if (typeof path.node.comments === 'undefined') return []; return joinExisting( line, path.map((commentPath, index, comments: Comment[]) => { diff --git a/src/slangPrinter.ts b/src/slangPrinter.ts index 11de3e62a..497e3c7fd 100644 --- a/src/slangPrinter.ts +++ b/src/slangPrinter.ts @@ -8,11 +8,13 @@ import type { PrintFunction } from './types.d.ts'; function hasNodeIgnoreComment({ comments }: StrictAstNode): boolean { // Prettier sets SourceUnit's comments to undefined after assigning comments // to each node. - return comments?.some( - (comment) => - comment.value - .slice(2, isBlockComment(comment) ? -2 : undefined) - .trim() === 'prettier-ignore' + return Boolean( + comments?.some( + (comment) => + comment.value + .slice(2, isBlockComment(comment) ? -2 : undefined) + .trim() === 'prettier-ignore' + ) ); } From eb411f35b1f3d2eec8c7ceb87159732d1acf899d Mon Sep 17 00:00:00 2001 From: Klaus Date: Sun, 10 Aug 2025 09:39:27 +0100 Subject: [PATCH 3/3] `updateMetadata` now doesn't need to process collections --- src/slang-nodes/ArrayExpression.ts | 2 -- src/slang-nodes/ArrayValues.ts | 2 -- src/slang-nodes/AssemblyFlags.ts | 2 -- src/slang-nodes/CallOptions.ts | 2 -- src/slang-nodes/CatchClauses.ts | 2 -- src/slang-nodes/ConstructorAttributes.ts | 2 -- src/slang-nodes/ContractMembers.ts | 2 -- src/slang-nodes/ContractSpecifiers.ts | 2 -- src/slang-nodes/ErrorParameters.ts | 2 -- src/slang-nodes/EventParameters.ts | 2 -- src/slang-nodes/FallbackFunctionAttributes.ts | 2 -- src/slang-nodes/FunctionAttributes.ts | 2 -- src/slang-nodes/FunctionTypeAttributes.ts | 2 -- src/slang-nodes/HexStringLiterals.ts | 2 -- src/slang-nodes/ImportDeconstructionSymbols.ts | 2 -- src/slang-nodes/InheritanceTypes.ts | 2 -- src/slang-nodes/InterfaceMembers.ts | 2 -- src/slang-nodes/LibraryMembers.ts | 2 -- src/slang-nodes/ModifierAttributes.ts | 2 -- src/slang-nodes/NamedArguments.ts | 2 -- src/slang-nodes/OverridePaths.ts | 2 -- src/slang-nodes/Parameters.ts | 2 -- src/slang-nodes/PositionalArguments.ts | 2 -- src/slang-nodes/ReceiveFunctionAttributes.ts | 2 -- src/slang-nodes/SlangNode.ts | 10 +++------- src/slang-nodes/SourceUnitMembers.ts | 2 -- src/slang-nodes/StateVariableAttributes.ts | 2 -- src/slang-nodes/Statements.ts | 2 -- src/slang-nodes/StringLiterals.ts | 2 -- src/slang-nodes/StructMembers.ts | 2 -- src/slang-nodes/TupleDeconstructionElements.ts | 2 -- src/slang-nodes/TupleExpression.ts | 2 -- src/slang-nodes/TupleValues.ts | 2 -- src/slang-nodes/UnicodeStringLiterals.ts | 2 -- src/slang-nodes/UnnamedFunctionAttributes.ts | 2 -- src/slang-nodes/UsingDeconstructionSymbols.ts | 2 -- src/slang-nodes/VersionExpressionSet.ts | 2 -- src/slang-nodes/VersionExpressionSets.ts | 2 -- src/slang-nodes/YulArguments.ts | 2 -- src/slang-nodes/YulPaths.ts | 2 -- src/slang-nodes/YulStatements.ts | 2 -- src/slang-nodes/YulSwitchCases.ts | 2 -- 42 files changed, 3 insertions(+), 89 deletions(-) diff --git a/src/slang-nodes/ArrayExpression.ts b/src/slang-nodes/ArrayExpression.ts index 27ac10d45..12ac77ad8 100644 --- a/src/slang-nodes/ArrayExpression.ts +++ b/src/slang-nodes/ArrayExpression.ts @@ -16,8 +16,6 @@ export class ArrayExpression extends SlangNode { super(ast); this.items = new ArrayValues(ast.items, options); - - this.updateMetadata(this.items); } print(path: AstPath, print: PrintFunction): Doc { diff --git a/src/slang-nodes/ArrayValues.ts b/src/slang-nodes/ArrayValues.ts index b985034ab..4bbe861a5 100644 --- a/src/slang-nodes/ArrayValues.ts +++ b/src/slang-nodes/ArrayValues.ts @@ -17,8 +17,6 @@ export class ArrayValues extends SlangNode { super(ast, true); this.items = ast.items.map((item) => new Expression(item, options)); - - this.updateMetadata(this.items); } print(path: AstPath, print: PrintFunction): Doc { diff --git a/src/slang-nodes/AssemblyFlags.ts b/src/slang-nodes/AssemblyFlags.ts index 3ca2c8013..0a461c17e 100644 --- a/src/slang-nodes/AssemblyFlags.ts +++ b/src/slang-nodes/AssemblyFlags.ts @@ -17,8 +17,6 @@ export class AssemblyFlags extends SlangNode { super(ast, true); this.items = ast.items.map((item) => new StringLiteral(item, options)); - - this.updateMetadata(this.items); } print(path: AstPath, print: PrintFunction): Doc { diff --git a/src/slang-nodes/CallOptions.ts b/src/slang-nodes/CallOptions.ts index 936af9da6..fd196b0d8 100644 --- a/src/slang-nodes/CallOptions.ts +++ b/src/slang-nodes/CallOptions.ts @@ -20,8 +20,6 @@ export class CallOptions extends SlangNode { super(ast, true); this.items = ast.items.map((item) => new NamedArgument(item, options)); - - this.updateMetadata(this.items); } print( diff --git a/src/slang-nodes/CatchClauses.ts b/src/slang-nodes/CatchClauses.ts index dbac2e255..27d24f7a0 100644 --- a/src/slang-nodes/CatchClauses.ts +++ b/src/slang-nodes/CatchClauses.ts @@ -19,8 +19,6 @@ export class CatchClauses extends SlangNode { super(ast, true); this.items = ast.items.map((item) => new CatchClause(item, options)); - - this.updateMetadata(this.items); } print(path: AstPath, print: PrintFunction): Doc { diff --git a/src/slang-nodes/ConstructorAttributes.ts b/src/slang-nodes/ConstructorAttributes.ts index 003b4dbe2..d8d51eb85 100644 --- a/src/slang-nodes/ConstructorAttributes.ts +++ b/src/slang-nodes/ConstructorAttributes.ts @@ -23,8 +23,6 @@ export class ConstructorAttributes extends SlangNode { (item) => new ConstructorAttribute(item, options) ); - this.updateMetadata(this.items); - this.items = this.items.sort(sortFunctionAttributes); } diff --git a/src/slang-nodes/ContractMembers.ts b/src/slang-nodes/ContractMembers.ts index 14acea7c6..55481473f 100644 --- a/src/slang-nodes/ContractMembers.ts +++ b/src/slang-nodes/ContractMembers.ts @@ -21,8 +21,6 @@ export class ContractMembers extends SlangNode { super(ast, true); this.items = ast.items.map((item) => new ContractMember(item, options)); - - this.updateMetadata(this.items); } print( diff --git a/src/slang-nodes/ContractSpecifiers.ts b/src/slang-nodes/ContractSpecifiers.ts index b94f514f3..94bc74d58 100644 --- a/src/slang-nodes/ContractSpecifiers.ts +++ b/src/slang-nodes/ContractSpecifiers.ts @@ -22,8 +22,6 @@ export class ContractSpecifiers extends SlangNode { this.items = ast.items.map((item) => new ContractSpecifier(item, options)); - this.updateMetadata(this.items); - this.items = this.items.sort(sortContractSpecifiers); } diff --git a/src/slang-nodes/ErrorParameters.ts b/src/slang-nodes/ErrorParameters.ts index bbbdaf711..b52cde926 100644 --- a/src/slang-nodes/ErrorParameters.ts +++ b/src/slang-nodes/ErrorParameters.ts @@ -17,8 +17,6 @@ export class ErrorParameters extends SlangNode { super(ast, true); this.items = ast.items.map((item) => new ErrorParameter(item, options)); - - this.updateMetadata(this.items); } print(path: AstPath, print: PrintFunction): Doc { diff --git a/src/slang-nodes/EventParameters.ts b/src/slang-nodes/EventParameters.ts index 6c03aaba1..ab1e0e9c8 100644 --- a/src/slang-nodes/EventParameters.ts +++ b/src/slang-nodes/EventParameters.ts @@ -17,8 +17,6 @@ export class EventParameters extends SlangNode { super(ast, true); this.items = ast.items.map((item) => new EventParameter(item, options)); - - this.updateMetadata(this.items); } print(path: AstPath, print: PrintFunction): Doc { diff --git a/src/slang-nodes/FallbackFunctionAttributes.ts b/src/slang-nodes/FallbackFunctionAttributes.ts index 0f48bfdb6..b2b35d278 100644 --- a/src/slang-nodes/FallbackFunctionAttributes.ts +++ b/src/slang-nodes/FallbackFunctionAttributes.ts @@ -26,8 +26,6 @@ export class FallbackFunctionAttributes extends SlangNode { (item) => new FallbackFunctionAttribute(item, options) ); - this.updateMetadata(this.items); - this.items = this.items.sort(sortFunctionAttributes); } diff --git a/src/slang-nodes/FunctionAttributes.ts b/src/slang-nodes/FunctionAttributes.ts index 6ecac12b4..41c0e906c 100644 --- a/src/slang-nodes/FunctionAttributes.ts +++ b/src/slang-nodes/FunctionAttributes.ts @@ -21,8 +21,6 @@ export class FunctionAttributes extends SlangNode { this.items = ast.items.map((item) => new FunctionAttribute(item, options)); - this.updateMetadata(this.items); - this.items = this.items.sort(sortFunctionAttributes); } diff --git a/src/slang-nodes/FunctionTypeAttributes.ts b/src/slang-nodes/FunctionTypeAttributes.ts index 06a17acfe..9b830fc7c 100644 --- a/src/slang-nodes/FunctionTypeAttributes.ts +++ b/src/slang-nodes/FunctionTypeAttributes.ts @@ -20,8 +20,6 @@ export class FunctionTypeAttributes extends SlangNode { this.items = ast.items.map((item) => new FunctionTypeAttribute(item)); - this.updateMetadata(this.items); - this.items = this.items.sort(sortFunctionAttributes); } diff --git a/src/slang-nodes/HexStringLiterals.ts b/src/slang-nodes/HexStringLiterals.ts index 1b6fefed9..154dfcbea 100644 --- a/src/slang-nodes/HexStringLiterals.ts +++ b/src/slang-nodes/HexStringLiterals.ts @@ -19,8 +19,6 @@ export class HexStringLiterals extends SlangNode { super(ast, true); this.items = ast.items.map((item) => new HexStringLiteral(item, options)); - - this.updateMetadata(this.items); } print(path: AstPath, print: PrintFunction): Doc { diff --git a/src/slang-nodes/ImportDeconstructionSymbols.ts b/src/slang-nodes/ImportDeconstructionSymbols.ts index bcdb32dee..7abbc37df 100644 --- a/src/slang-nodes/ImportDeconstructionSymbols.ts +++ b/src/slang-nodes/ImportDeconstructionSymbols.ts @@ -21,8 +21,6 @@ export class ImportDeconstructionSymbols extends SlangNode { super(ast, true); this.items = ast.items.map((item) => new ImportDeconstructionSymbol(item)); - - this.updateMetadata(this.items); } print( diff --git a/src/slang-nodes/InheritanceTypes.ts b/src/slang-nodes/InheritanceTypes.ts index e9b04e66d..45f4af638 100644 --- a/src/slang-nodes/InheritanceTypes.ts +++ b/src/slang-nodes/InheritanceTypes.ts @@ -20,8 +20,6 @@ export class InheritanceTypes extends SlangNode { super(ast, true); this.items = ast.items.map((item) => new InheritanceType(item, options)); - - this.updateMetadata(this.items); } print(path: AstPath, print: PrintFunction): Doc { diff --git a/src/slang-nodes/InterfaceMembers.ts b/src/slang-nodes/InterfaceMembers.ts index e15ddf061..32844cd01 100644 --- a/src/slang-nodes/InterfaceMembers.ts +++ b/src/slang-nodes/InterfaceMembers.ts @@ -21,8 +21,6 @@ export class InterfaceMembers extends SlangNode { super(ast, true); this.items = ast.items.map((item) => new ContractMember(item, options)); - - this.updateMetadata(this.items); } print( diff --git a/src/slang-nodes/LibraryMembers.ts b/src/slang-nodes/LibraryMembers.ts index b21ffaaf0..68e743b08 100644 --- a/src/slang-nodes/LibraryMembers.ts +++ b/src/slang-nodes/LibraryMembers.ts @@ -21,8 +21,6 @@ export class LibraryMembers extends SlangNode { super(ast, true); this.items = ast.items.map((item) => new ContractMember(item, options)); - - this.updateMetadata(this.items); } print( diff --git a/src/slang-nodes/ModifierAttributes.ts b/src/slang-nodes/ModifierAttributes.ts index 6340fdb4d..21dbaf5b4 100644 --- a/src/slang-nodes/ModifierAttributes.ts +++ b/src/slang-nodes/ModifierAttributes.ts @@ -20,8 +20,6 @@ export class ModifierAttributes extends SlangNode { this.items = ast.items.map((item) => new ModifierAttribute(item)); - this.updateMetadata(this.items); - this.items = this.items.sort(sortFunctionAttributes); } diff --git a/src/slang-nodes/NamedArguments.ts b/src/slang-nodes/NamedArguments.ts index 521f40ece..b6931927d 100644 --- a/src/slang-nodes/NamedArguments.ts +++ b/src/slang-nodes/NamedArguments.ts @@ -20,8 +20,6 @@ export class NamedArguments extends SlangNode { super(ast, true); this.items = ast.items.map((item) => new NamedArgument(item, options)); - - this.updateMetadata(this.items); } print( diff --git a/src/slang-nodes/OverridePaths.ts b/src/slang-nodes/OverridePaths.ts index 3feb11dd1..6f8e328b0 100644 --- a/src/slang-nodes/OverridePaths.ts +++ b/src/slang-nodes/OverridePaths.ts @@ -16,8 +16,6 @@ export class OverridePaths extends SlangNode { super(ast, true); this.items = ast.items.map((item) => new IdentifierPath(item)); - - this.updateMetadata(this.items); } print(path: AstPath, print: PrintFunction): Doc { diff --git a/src/slang-nodes/Parameters.ts b/src/slang-nodes/Parameters.ts index 9c32afa3e..daf4eb362 100644 --- a/src/slang-nodes/Parameters.ts +++ b/src/slang-nodes/Parameters.ts @@ -19,8 +19,6 @@ export class Parameters extends SlangNode { super(ast, true); this.items = ast.items.map((item) => new Parameter(item, options)); - - this.updateMetadata(this.items); } print( diff --git a/src/slang-nodes/PositionalArguments.ts b/src/slang-nodes/PositionalArguments.ts index c56346575..df455045b 100644 --- a/src/slang-nodes/PositionalArguments.ts +++ b/src/slang-nodes/PositionalArguments.ts @@ -19,8 +19,6 @@ export class PositionalArguments extends SlangNode { super(ast, true); this.items = ast.items.map((item) => new Expression(item, options)); - - this.updateMetadata(this.items); } print( diff --git a/src/slang-nodes/ReceiveFunctionAttributes.ts b/src/slang-nodes/ReceiveFunctionAttributes.ts index 7ec5c13a4..3d2a0e2ef 100644 --- a/src/slang-nodes/ReceiveFunctionAttributes.ts +++ b/src/slang-nodes/ReceiveFunctionAttributes.ts @@ -26,8 +26,6 @@ export class ReceiveFunctionAttributes extends SlangNode { (item) => new ReceiveFunctionAttribute(item, options) ); - this.updateMetadata(this.items); - this.items = this.items.sort(sortFunctionAttributes); } diff --git a/src/slang-nodes/SlangNode.ts b/src/slang-nodes/SlangNode.ts index 842458d08..1c581abd4 100644 --- a/src/slang-nodes/SlangNode.ts +++ b/src/slang-nodes/SlangNode.ts @@ -121,15 +121,12 @@ export class SlangNode { }; } - updateMetadata( - ...childNodes: (StrictAstNode | StrictAstNode[] | undefined)[] - ): void { + updateMetadata(...childNodes: (StrictAstNode | undefined)[]): void { const { loc } = this; // calculate correct loc object if (loc.leadingOffset === 0) { for (const childNode of childNodes) { - if (typeof childNode === 'undefined' || Array.isArray(childNode)) - continue; + if (typeof childNode === 'undefined') continue; const { leadingOffset, start } = childNode.loc; if (start - leadingOffset === loc.start) { @@ -142,8 +139,7 @@ export class SlangNode { if (loc.trailingOffset === 0) { for (const childNode of reversedIterator(childNodes)) { - if (typeof childNode === 'undefined' || Array.isArray(childNode)) - continue; + if (typeof childNode === 'undefined') continue; const { trailingOffset, end } = childNode.loc; if (end + trailingOffset === loc.end) { diff --git a/src/slang-nodes/SourceUnitMembers.ts b/src/slang-nodes/SourceUnitMembers.ts index 6f60c9e42..6bf7e888e 100644 --- a/src/slang-nodes/SourceUnitMembers.ts +++ b/src/slang-nodes/SourceUnitMembers.ts @@ -17,8 +17,6 @@ export class SourceUnitMembers extends SlangNode { super(ast, true); this.items = ast.items.map((item) => new SourceUnitMember(item, options)); - - this.updateMetadata(this.items); } print( diff --git a/src/slang-nodes/StateVariableAttributes.ts b/src/slang-nodes/StateVariableAttributes.ts index f59439def..dbca71f6c 100644 --- a/src/slang-nodes/StateVariableAttributes.ts +++ b/src/slang-nodes/StateVariableAttributes.ts @@ -20,8 +20,6 @@ export class StateVariableAttributes extends SlangNode { this.items = ast.items.map((item) => new StateVariableAttribute(item)); - this.updateMetadata(this.items); - this.items = this.items.sort(sortFunctionAttributes); } diff --git a/src/slang-nodes/Statements.ts b/src/slang-nodes/Statements.ts index 4bb92f7a1..622485894 100644 --- a/src/slang-nodes/Statements.ts +++ b/src/slang-nodes/Statements.ts @@ -21,8 +21,6 @@ export class Statements extends SlangNode { super(ast, true); this.items = ast.items.map((item) => new Statement(item, options)); - - this.updateMetadata(this.items); } print( diff --git a/src/slang-nodes/StringLiterals.ts b/src/slang-nodes/StringLiterals.ts index a99d3ca48..ee8f32692 100644 --- a/src/slang-nodes/StringLiterals.ts +++ b/src/slang-nodes/StringLiterals.ts @@ -19,8 +19,6 @@ export class StringLiterals extends SlangNode { super(ast, true); this.items = ast.items.map((item) => new StringLiteral(item, options)); - - this.updateMetadata(this.items); } print(path: AstPath, print: PrintFunction): Doc { diff --git a/src/slang-nodes/StructMembers.ts b/src/slang-nodes/StructMembers.ts index 2d8a8060c..cc6c415ed 100644 --- a/src/slang-nodes/StructMembers.ts +++ b/src/slang-nodes/StructMembers.ts @@ -20,8 +20,6 @@ export class StructMembers extends SlangNode { super(ast, true); this.items = ast.items.map((item) => new StructMember(item, options)); - - this.updateMetadata(this.items); } print(path: AstPath, print: PrintFunction): Doc { diff --git a/src/slang-nodes/TupleDeconstructionElements.ts b/src/slang-nodes/TupleDeconstructionElements.ts index 674f62a4f..d2fafa021 100644 --- a/src/slang-nodes/TupleDeconstructionElements.ts +++ b/src/slang-nodes/TupleDeconstructionElements.ts @@ -22,8 +22,6 @@ export class TupleDeconstructionElements extends SlangNode { this.items = ast.items.map( (item) => new TupleDeconstructionElement(item, options) ); - - this.updateMetadata(this.items); } print(path: AstPath, print: PrintFunction): Doc { diff --git a/src/slang-nodes/TupleExpression.ts b/src/slang-nodes/TupleExpression.ts index d3c75a086..1c78e27d4 100644 --- a/src/slang-nodes/TupleExpression.ts +++ b/src/slang-nodes/TupleExpression.ts @@ -16,8 +16,6 @@ export class TupleExpression extends SlangNode { super(ast); this.items = new TupleValues(ast.items, options); - - this.updateMetadata(this.items); } print(path: AstPath, print: PrintFunction): Doc { diff --git a/src/slang-nodes/TupleValues.ts b/src/slang-nodes/TupleValues.ts index fe7ce741c..13618f431 100644 --- a/src/slang-nodes/TupleValues.ts +++ b/src/slang-nodes/TupleValues.ts @@ -20,8 +20,6 @@ export class TupleValues extends SlangNode { super(ast, true); this.items = ast.items.map((item) => new TupleValue(item, options)); - - this.updateMetadata(this.items); } getSingleExpression(): Expression | undefined { diff --git a/src/slang-nodes/UnicodeStringLiterals.ts b/src/slang-nodes/UnicodeStringLiterals.ts index 025957424..0b8e3d015 100644 --- a/src/slang-nodes/UnicodeStringLiterals.ts +++ b/src/slang-nodes/UnicodeStringLiterals.ts @@ -21,8 +21,6 @@ export class UnicodeStringLiterals extends SlangNode { this.items = ast.items.map( (item) => new UnicodeStringLiteral(item, options) ); - - this.updateMetadata(this.items); } print(path: AstPath, print: PrintFunction): Doc { diff --git a/src/slang-nodes/UnnamedFunctionAttributes.ts b/src/slang-nodes/UnnamedFunctionAttributes.ts index 82f45d924..18532ca51 100644 --- a/src/slang-nodes/UnnamedFunctionAttributes.ts +++ b/src/slang-nodes/UnnamedFunctionAttributes.ts @@ -26,8 +26,6 @@ export class UnnamedFunctionAttributes extends SlangNode { (item) => new UnnamedFunctionAttribute(item, options) ); - this.updateMetadata(this.items); - this.items = this.items.sort(sortFunctionAttributes); } diff --git a/src/slang-nodes/UsingDeconstructionSymbols.ts b/src/slang-nodes/UsingDeconstructionSymbols.ts index b73d9d3f5..2c4aba570 100644 --- a/src/slang-nodes/UsingDeconstructionSymbols.ts +++ b/src/slang-nodes/UsingDeconstructionSymbols.ts @@ -20,8 +20,6 @@ export class UsingDeconstructionSymbols extends SlangNode { super(ast, true); this.items = ast.items.map((item) => new UsingDeconstructionSymbol(item)); - - this.updateMetadata(this.items); } print( diff --git a/src/slang-nodes/VersionExpressionSet.ts b/src/slang-nodes/VersionExpressionSet.ts index b8a6dc275..b4cb98f62 100644 --- a/src/slang-nodes/VersionExpressionSet.ts +++ b/src/slang-nodes/VersionExpressionSet.ts @@ -18,8 +18,6 @@ export class VersionExpressionSet extends SlangNode { super(ast, true); this.items = ast.items.map((item) => new VersionExpression(item)); - - this.updateMetadata(this.items); } print(path: AstPath, print: PrintFunction): Doc { diff --git a/src/slang-nodes/VersionExpressionSets.ts b/src/slang-nodes/VersionExpressionSets.ts index 1b880571b..4a7e2f317 100644 --- a/src/slang-nodes/VersionExpressionSets.ts +++ b/src/slang-nodes/VersionExpressionSets.ts @@ -18,8 +18,6 @@ export class VersionExpressionSets extends SlangNode { super(ast, true); this.items = ast.items.map((item) => new VersionExpressionSet(item)); - - this.updateMetadata(this.items); } print(path: AstPath, print: PrintFunction): Doc { diff --git a/src/slang-nodes/YulArguments.ts b/src/slang-nodes/YulArguments.ts index 69a6539d5..aad0e0278 100644 --- a/src/slang-nodes/YulArguments.ts +++ b/src/slang-nodes/YulArguments.ts @@ -17,8 +17,6 @@ export class YulArguments extends SlangNode { super(ast, true); this.items = ast.items.map((item) => new YulExpression(item, options)); - - this.updateMetadata(this.items); } print(path: AstPath, print: PrintFunction): Doc { diff --git a/src/slang-nodes/YulPaths.ts b/src/slang-nodes/YulPaths.ts index 22161d5a7..f655df8e9 100644 --- a/src/slang-nodes/YulPaths.ts +++ b/src/slang-nodes/YulPaths.ts @@ -18,8 +18,6 @@ export class YulPaths extends SlangNode { super(ast, true); this.items = ast.items.map((item) => new YulPath(item)); - - this.updateMetadata(this.items); } print(path: AstPath, print: PrintFunction): Doc { diff --git a/src/slang-nodes/YulStatements.ts b/src/slang-nodes/YulStatements.ts index de55471fe..b979210a8 100644 --- a/src/slang-nodes/YulStatements.ts +++ b/src/slang-nodes/YulStatements.ts @@ -21,8 +21,6 @@ export class YulStatements extends SlangNode { super(ast, true); this.items = ast.items.map((item) => new YulStatement(item, options)); - - this.updateMetadata(this.items); } print( diff --git a/src/slang-nodes/YulSwitchCases.ts b/src/slang-nodes/YulSwitchCases.ts index b5510c929..b89c9633f 100644 --- a/src/slang-nodes/YulSwitchCases.ts +++ b/src/slang-nodes/YulSwitchCases.ts @@ -19,8 +19,6 @@ export class YulSwitchCases extends SlangNode { super(ast, true); this.items = ast.items.map((item) => new YulSwitchCase(item, options)); - - this.updateMetadata(this.items); } print(path: AstPath, print: PrintFunction): Doc {