From a2f6367fe46b569a738e4e5cc4f369198cf955fc Mon Sep 17 00:00:00 2001 From: Klaus Date: Tue, 29 Jul 2025 18:24:31 +0100 Subject: [PATCH 1/4] getting rid of all print functions of classes that only print a variant --- src/slang-nodes/ArgumentsDeclaration.ts | 7 +------ src/slang-nodes/ConstructorAttribute.ts | 7 +------ src/slang-nodes/ContractDefinition.ts | 8 ++++---- src/slang-nodes/ContractMember.ts | 7 +------ src/slang-nodes/ContractSpecifier.ts | 7 +------ src/slang-nodes/ElementaryType.ts | 6 ------ src/slang-nodes/ExperimentalFeature.ts | 7 +------ src/slang-nodes/Expression.ts | 7 +------ src/slang-nodes/FallbackFunctionAttribute.ts | 7 +------ src/slang-nodes/ForStatementCondition.ts | 9 ++------- src/slang-nodes/ForStatementInitialization.ts | 7 +------ src/slang-nodes/FunctionAttribute.ts | 7 +------ src/slang-nodes/FunctionBody.ts | 7 +------ src/slang-nodes/FunctionName.ts | 6 ------ src/slang-nodes/FunctionTypeAttribute.ts | 6 ------ src/slang-nodes/ImportClause.ts | 7 +------ src/slang-nodes/MappingKeyType.ts | 7 ------- src/slang-nodes/ModifierAttribute.ts | 6 ------ src/slang-nodes/Pragma.ts | 7 +------ src/slang-nodes/ReceiveFunctionAttribute.ts | 7 +------ src/slang-nodes/SourceUnitMember.ts | 7 +------ src/slang-nodes/StateVariableAttribute.ts | 6 ------ src/slang-nodes/Statement.ts | 7 +------ src/slang-nodes/StringExpression.ts | 7 +------ src/slang-nodes/TupleMember.ts | 7 +------ src/slang-nodes/TypeName.ts | 7 +------ src/slang-nodes/UnnamedFunctionAttribute.ts | 7 +------ src/slang-nodes/UsingClause.ts | 7 ------- src/slang-nodes/UsingTarget.ts | 7 +------ src/slang-nodes/VariableDeclarationType.ts | 7 +------ src/slang-nodes/VersionExpression.ts | 7 ------- src/slang-nodes/VersionLiteral.ts | 6 ------ src/slang-nodes/YulAssignmentOperator.ts | 6 ------ src/slang-nodes/YulExpression.ts | 7 +------ src/slang-nodes/YulLiteral.ts | 7 +------ src/slang-nodes/YulStackAssignmentOperator.ts | 6 ------ src/slang-nodes/YulStatement.ts | 7 +------ src/slang-nodes/YulSwitchCase.ts | 7 +------ src/slang-utils/is-polymorphic-node.ts | 7 +++++++ src/slangPrinter.ts | 5 ++++- 40 files changed, 42 insertions(+), 231 deletions(-) create mode 100644 src/slang-utils/is-polymorphic-node.ts diff --git a/src/slang-nodes/ArgumentsDeclaration.ts b/src/slang-nodes/ArgumentsDeclaration.ts index ce6eb22ca..b896b17ed 100644 --- a/src/slang-nodes/ArgumentsDeclaration.ts +++ b/src/slang-nodes/ArgumentsDeclaration.ts @@ -4,9 +4,8 @@ import { SlangNode } from './SlangNode.js'; import { PositionalArgumentsDeclaration } from './PositionalArgumentsDeclaration.js'; import { NamedArgumentsDeclaration } from './NamedArgumentsDeclaration.js'; -import type { AstPath, Doc, ParserOptions } from 'prettier'; +import type { ParserOptions } from 'prettier'; import type { AstNode } from './types.d.ts'; -import type { PrintFunction } from '../types.d.ts'; function createNonterminalVariant( variant: ast.ArgumentsDeclaration['variant'], @@ -34,8 +33,4 @@ export class ArgumentsDeclaration extends SlangNode { this.updateMetadata(this.variant); } - - print(path: AstPath, print: PrintFunction): Doc { - return path.call(print, 'variant'); - } } diff --git a/src/slang-nodes/ConstructorAttribute.ts b/src/slang-nodes/ConstructorAttribute.ts index f73f08f4b..5414d6d5c 100644 --- a/src/slang-nodes/ConstructorAttribute.ts +++ b/src/slang-nodes/ConstructorAttribute.ts @@ -7,9 +7,8 @@ import { ModifierInvocation } from './ModifierInvocation.js'; import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; -import type { AstPath, Doc, ParserOptions } from 'prettier'; +import type { ParserOptions } from 'prettier'; import type { AstNode } from './types.d.ts'; -import type { PrintFunction } from '../types.d.ts'; export class ConstructorAttribute extends SlangNode { readonly kind = NonterminalKind.ConstructorAttribute; @@ -28,8 +27,4 @@ export class ConstructorAttribute extends SlangNode { this.updateMetadata(this.variant); } - - print(path: AstPath, print: PrintFunction): Doc { - return path.call(print, 'variant'); - } } diff --git a/src/slang-nodes/ContractDefinition.ts b/src/slang-nodes/ContractDefinition.ts index 084b3a0a1..862a356bf 100644 --- a/src/slang-nodes/ContractDefinition.ts +++ b/src/slang-nodes/ContractDefinition.ts @@ -41,12 +41,12 @@ export class ContractDefinition extends SlangNode { // Older versions of Solidity defined a constructor as a function having // the same name as the contract. if (!satisfies(options.compiler, '>=0.5.0')) { - for (const { variant: member } of this.members.items) { + for (const { variant } of this.members.items) { if ( - member.kind === NonterminalKind.FunctionDefinition && - member.name.variant.value !== this.name.value + variant.kind === NonterminalKind.FunctionDefinition && + variant.name.variant.value !== this.name.value ) { - member.cleanModifierInvocationArguments(); + variant.cleanModifierInvocationArguments(); } } } diff --git a/src/slang-nodes/ContractMember.ts b/src/slang-nodes/ContractMember.ts index fa41a309c..71d2ccebb 100644 --- a/src/slang-nodes/ContractMember.ts +++ b/src/slang-nodes/ContractMember.ts @@ -15,9 +15,8 @@ import { StateVariableDefinition } from './StateVariableDefinition.js'; import { ErrorDefinition } from './ErrorDefinition.js'; import { UserDefinedValueTypeDefinition } from './UserDefinedValueTypeDefinition.js'; -import type { AstPath, Doc, ParserOptions } from 'prettier'; +import type { ParserOptions } from 'prettier'; import type { AstNode } from './types.d.ts'; -import type { PrintFunction } from '../types.d.ts'; function createNonterminalVariant( variant: ast.ContractMember['variant'], @@ -91,8 +90,4 @@ export class ContractMember extends SlangNode { this.updateMetadata(this.variant); } - - print(path: AstPath, print: PrintFunction): Doc { - return path.call(print, 'variant'); - } } diff --git a/src/slang-nodes/ContractSpecifier.ts b/src/slang-nodes/ContractSpecifier.ts index a46015215..e8498bfb3 100644 --- a/src/slang-nodes/ContractSpecifier.ts +++ b/src/slang-nodes/ContractSpecifier.ts @@ -4,9 +4,8 @@ import { SlangNode } from './SlangNode.js'; import { InheritanceSpecifier } from './InheritanceSpecifier.js'; import { StorageLayoutSpecifier } from './StorageLayoutSpecifier.js'; -import type { AstPath, Doc, ParserOptions } from 'prettier'; +import type { ParserOptions } from 'prettier'; import type { AstNode } from './types.d.ts'; -import type { PrintFunction } from '../types.d.ts'; function createNonterminalVariant( variant: ast.ContractSpecifier['variant'], @@ -34,8 +33,4 @@ export class ContractSpecifier extends SlangNode { this.updateMetadata(this.variant); } - - print(path: AstPath, print: PrintFunction): Doc { - return path.call(print, 'variant'); - } } diff --git a/src/slang-nodes/ElementaryType.ts b/src/slang-nodes/ElementaryType.ts index 4c5e6557d..5f958e5b3 100644 --- a/src/slang-nodes/ElementaryType.ts +++ b/src/slang-nodes/ElementaryType.ts @@ -7,8 +7,6 @@ import { AddressType } from './AddressType.js'; import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; -import type { AstPath, Doc } from 'prettier'; -import type { PrintFunction } from '../types.d.ts'; export class ElementaryType extends SlangNode { readonly kind = NonterminalKind.ElementaryType; @@ -27,8 +25,4 @@ export class ElementaryType extends SlangNode { this.updateMetadata(this.variant); } - - print(path: AstPath, print: PrintFunction): Doc { - return path.call(print, 'variant'); - } } diff --git a/src/slang-nodes/ExperimentalFeature.ts b/src/slang-nodes/ExperimentalFeature.ts index 7364b0cc3..b07563fa2 100644 --- a/src/slang-nodes/ExperimentalFeature.ts +++ b/src/slang-nodes/ExperimentalFeature.ts @@ -7,9 +7,8 @@ import { StringLiteral } from './StringLiteral.js'; import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; -import type { AstPath, Doc, ParserOptions } from 'prettier'; +import type { ParserOptions } from 'prettier'; import type { AstNode } from './types.d.ts'; -import type { PrintFunction } from '../types.d.ts'; export class ExperimentalFeature extends SlangNode { readonly kind = NonterminalKind.ExperimentalFeature; @@ -28,8 +27,4 @@ export class ExperimentalFeature extends SlangNode { this.updateMetadata(this.variant); } - - print(path: AstPath, print: PrintFunction): Doc { - return path.call(print, 'variant'); - } } diff --git a/src/slang-nodes/Expression.ts b/src/slang-nodes/Expression.ts index 9a36fd982..1ef53eb9c 100644 --- a/src/slang-nodes/Expression.ts +++ b/src/slang-nodes/Expression.ts @@ -33,9 +33,8 @@ import { StringExpression } from './StringExpression.js'; import { ElementaryType } from './ElementaryType.js'; import { TerminalNode } from './TerminalNode.js'; -import type { AstPath, Doc, ParserOptions } from 'prettier'; +import type { ParserOptions } from 'prettier'; import type { AstNode } from './types.d.ts'; -import type { PrintFunction } from '../types.d.ts'; function createNonterminalVariant( variant: Exclude, @@ -171,8 +170,4 @@ export class Expression extends SlangNode { this.updateMetadata(this.variant); } - - print(path: AstPath, print: PrintFunction): Doc { - return path.call(print, 'variant'); - } } diff --git a/src/slang-nodes/FallbackFunctionAttribute.ts b/src/slang-nodes/FallbackFunctionAttribute.ts index 4fb270f3a..e696e7e41 100644 --- a/src/slang-nodes/FallbackFunctionAttribute.ts +++ b/src/slang-nodes/FallbackFunctionAttribute.ts @@ -8,9 +8,8 @@ import { ModifierInvocation } from './ModifierInvocation.js'; import { OverrideSpecifier } from './OverrideSpecifier.js'; import { TerminalNode } from './TerminalNode.js'; -import type { AstPath, Doc, ParserOptions } from 'prettier'; +import type { ParserOptions } from 'prettier'; import type { AstNode } from './types.d.ts'; -import type { PrintFunction } from '../types.d.ts'; function createNonterminalVariant( variant: Exclude, @@ -46,8 +45,4 @@ export class FallbackFunctionAttribute extends SlangNode { this.updateMetadata(this.variant); } - - print(path: AstPath, print: PrintFunction): Doc { - return path.call(print, 'variant'); - } } diff --git a/src/slang-nodes/ForStatementCondition.ts b/src/slang-nodes/ForStatementCondition.ts index 94c01c5f4..0c75d9c94 100644 --- a/src/slang-nodes/ForStatementCondition.ts +++ b/src/slang-nodes/ForStatementCondition.ts @@ -4,12 +4,11 @@ import { } from '@nomicfoundation/slang/cst'; import { SlangNode } from './SlangNode.js'; import { ExpressionStatement } from './ExpressionStatement.js'; +import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; -import type { AstPath, Doc, ParserOptions } from 'prettier'; +import type { ParserOptions } from 'prettier'; import type { AstNode } from './types.d.ts'; -import type { PrintFunction } from '../types.d.ts'; -import { TerminalNode } from './TerminalNode.js'; export class ForStatementCondition extends SlangNode { readonly kind = NonterminalKind.ForStatementCondition; @@ -28,8 +27,4 @@ export class ForStatementCondition extends SlangNode { this.updateMetadata(this.variant); } - - print(path: AstPath, print: PrintFunction): Doc { - return path.call(print, 'variant'); - } } diff --git a/src/slang-nodes/ForStatementInitialization.ts b/src/slang-nodes/ForStatementInitialization.ts index db6ad487e..a26489a0f 100644 --- a/src/slang-nodes/ForStatementInitialization.ts +++ b/src/slang-nodes/ForStatementInitialization.ts @@ -9,9 +9,8 @@ import { VariableDeclarationStatement } from './VariableDeclarationStatement.js' import { TupleDeconstructionStatement } from './TupleDeconstructionStatement.js'; import { TerminalNode } from './TerminalNode.js'; -import type { AstPath, Doc, ParserOptions } from 'prettier'; +import type { ParserOptions } from 'prettier'; import type { AstNode } from './types.d.ts'; -import type { PrintFunction } from '../types.d.ts'; function createNonterminalVariant( variant: Exclude< @@ -57,8 +56,4 @@ export class ForStatementInitialization extends SlangNode { this.updateMetadata(this.variant); } - - print(path: AstPath, print: PrintFunction): Doc { - return path.call(print, 'variant'); - } } diff --git a/src/slang-nodes/FunctionAttribute.ts b/src/slang-nodes/FunctionAttribute.ts index 5290d968b..a4d36f472 100644 --- a/src/slang-nodes/FunctionAttribute.ts +++ b/src/slang-nodes/FunctionAttribute.ts @@ -8,9 +8,8 @@ import { ModifierInvocation } from './ModifierInvocation.js'; import { OverrideSpecifier } from './OverrideSpecifier.js'; import { TerminalNode } from './TerminalNode.js'; -import type { AstPath, Doc, ParserOptions } from 'prettier'; +import type { ParserOptions } from 'prettier'; import type { AstNode } from './types.d.ts'; -import type { PrintFunction } from '../types.d.ts'; function createNonterminalVariant( variant: Exclude, @@ -43,8 +42,4 @@ export class FunctionAttribute extends SlangNode { this.updateMetadata(this.variant); } - - print(path: AstPath, print: PrintFunction): Doc { - return path.call(print, 'variant'); - } } diff --git a/src/slang-nodes/FunctionBody.ts b/src/slang-nodes/FunctionBody.ts index 658b88502..364a0923f 100644 --- a/src/slang-nodes/FunctionBody.ts +++ b/src/slang-nodes/FunctionBody.ts @@ -7,9 +7,8 @@ import { Block } from './Block.js'; import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; -import type { AstPath, Doc, ParserOptions } from 'prettier'; +import type { ParserOptions } from 'prettier'; import type { AstNode } from './types.d.ts'; -import type { PrintFunction } from '../types.d.ts'; export class FunctionBody extends SlangNode { readonly kind = NonterminalKind.FunctionBody; @@ -28,8 +27,4 @@ export class FunctionBody extends SlangNode { this.updateMetadata(this.variant); } - - print(path: AstPath, print: PrintFunction): Doc { - return path.call(print, 'variant'); - } } diff --git a/src/slang-nodes/FunctionName.ts b/src/slang-nodes/FunctionName.ts index 6c559aaaf..59cd6325d 100644 --- a/src/slang-nodes/FunctionName.ts +++ b/src/slang-nodes/FunctionName.ts @@ -3,8 +3,6 @@ import { SlangNode } from './SlangNode.js'; import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; -import type { AstPath, Doc } from 'prettier'; -import type { PrintFunction } from '../types.d.ts'; export class FunctionName extends SlangNode { readonly kind = NonterminalKind.FunctionName; @@ -16,8 +14,4 @@ export class FunctionName extends SlangNode { this.variant = new TerminalNode(ast.variant); } - - print(path: AstPath, print: PrintFunction): Doc { - return path.call(print, 'variant'); - } } diff --git a/src/slang-nodes/FunctionTypeAttribute.ts b/src/slang-nodes/FunctionTypeAttribute.ts index 61ac4a32d..5e0b2d18d 100644 --- a/src/slang-nodes/FunctionTypeAttribute.ts +++ b/src/slang-nodes/FunctionTypeAttribute.ts @@ -3,8 +3,6 @@ import { SlangNode } from './SlangNode.js'; import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; -import type { AstPath, Doc } from 'prettier'; -import type { PrintFunction } from '../types.d.ts'; export class FunctionTypeAttribute extends SlangNode { readonly kind = NonterminalKind.FunctionTypeAttribute; @@ -16,8 +14,4 @@ export class FunctionTypeAttribute extends SlangNode { this.variant = new TerminalNode(ast.variant); } - - print(path: AstPath, print: PrintFunction): Doc { - return path.call(print, 'variant'); - } } diff --git a/src/slang-nodes/ImportClause.ts b/src/slang-nodes/ImportClause.ts index b0bfaa645..58f3cd96b 100644 --- a/src/slang-nodes/ImportClause.ts +++ b/src/slang-nodes/ImportClause.ts @@ -5,9 +5,8 @@ import { PathImport } from './PathImport.js'; import { NamedImport } from './NamedImport.js'; import { ImportDeconstruction } from './ImportDeconstruction.js'; -import type { AstPath, Doc, ParserOptions } from 'prettier'; +import type { ParserOptions } from 'prettier'; import type { AstNode } from './types.d.ts'; -import type { PrintFunction } from '../types.d.ts'; function createNonterminalVariant( variant: ast.ImportClause['variant'], @@ -38,8 +37,4 @@ export class ImportClause extends SlangNode { this.updateMetadata(this.variant); } - - print(path: AstPath, print: PrintFunction): Doc { - return path.call(print, 'variant'); - } } diff --git a/src/slang-nodes/MappingKeyType.ts b/src/slang-nodes/MappingKeyType.ts index 7096eaf2f..0eef27057 100644 --- a/src/slang-nodes/MappingKeyType.ts +++ b/src/slang-nodes/MappingKeyType.ts @@ -4,9 +4,6 @@ import { SlangNode } from './SlangNode.js'; import { ElementaryType } from './ElementaryType.js'; import { IdentifierPath } from './IdentifierPath.js'; -import type { AstPath, Doc } from 'prettier'; -import type { PrintFunction } from '../types.d.ts'; - function createNonterminalVariant( variant: ast.MappingKeyType['variant'] ): MappingKeyType['variant'] { @@ -32,8 +29,4 @@ export class MappingKeyType extends SlangNode { this.updateMetadata(this.variant); } - - print(path: AstPath, print: PrintFunction): Doc { - return path.call(print, 'variant'); - } } diff --git a/src/slang-nodes/ModifierAttribute.ts b/src/slang-nodes/ModifierAttribute.ts index 23fcde6ac..bc4310c34 100644 --- a/src/slang-nodes/ModifierAttribute.ts +++ b/src/slang-nodes/ModifierAttribute.ts @@ -7,8 +7,6 @@ import { OverrideSpecifier } from './OverrideSpecifier.js'; import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; -import type { AstPath, Doc } from 'prettier'; -import type { PrintFunction } from '../types.d.ts'; export class ModifierAttribute extends SlangNode { readonly kind = NonterminalKind.ModifierAttribute; @@ -27,8 +25,4 @@ export class ModifierAttribute extends SlangNode { this.updateMetadata(this.variant); } - - print(path: AstPath, print: PrintFunction): Doc { - return path.call(print, 'variant'); - } } diff --git a/src/slang-nodes/Pragma.ts b/src/slang-nodes/Pragma.ts index efb6a940c..9d06b2a43 100644 --- a/src/slang-nodes/Pragma.ts +++ b/src/slang-nodes/Pragma.ts @@ -5,9 +5,8 @@ import { AbicoderPragma } from './AbicoderPragma.js'; import { ExperimentalPragma } from './ExperimentalPragma.js'; import { VersionPragma } from './VersionPragma.js'; -import type { AstPath, Doc, ParserOptions } from 'prettier'; +import type { ParserOptions } from 'prettier'; import type { AstNode } from './types.d.ts'; -import type { PrintFunction } from '../types.d.ts'; function createNonterminalVariant( variant: ast.Pragma['variant'], @@ -38,8 +37,4 @@ export class Pragma extends SlangNode { this.updateMetadata(this.variant); } - - print(path: AstPath, print: PrintFunction): Doc { - return path.call(print, 'variant'); - } } diff --git a/src/slang-nodes/ReceiveFunctionAttribute.ts b/src/slang-nodes/ReceiveFunctionAttribute.ts index 4a7e4ee8d..9745d34fb 100644 --- a/src/slang-nodes/ReceiveFunctionAttribute.ts +++ b/src/slang-nodes/ReceiveFunctionAttribute.ts @@ -8,9 +8,8 @@ import { ModifierInvocation } from './ModifierInvocation.js'; import { OverrideSpecifier } from './OverrideSpecifier.js'; import { TerminalNode } from './TerminalNode.js'; -import type { AstPath, Doc, ParserOptions } from 'prettier'; +import type { ParserOptions } from 'prettier'; import type { AstNode } from './types.d.ts'; -import type { PrintFunction } from '../types.d.ts'; function createNonterminalVariant( variant: Exclude, @@ -46,8 +45,4 @@ export class ReceiveFunctionAttribute extends SlangNode { this.updateMetadata(this.variant); } - - print(path: AstPath, print: PrintFunction): Doc { - return path.call(print, 'variant'); - } } diff --git a/src/slang-nodes/SourceUnitMember.ts b/src/slang-nodes/SourceUnitMember.ts index cb9d349bf..07e74b736 100644 --- a/src/slang-nodes/SourceUnitMember.ts +++ b/src/slang-nodes/SourceUnitMember.ts @@ -15,9 +15,8 @@ import { UserDefinedValueTypeDefinition } from './UserDefinedValueTypeDefinition import { UsingDirective } from './UsingDirective.js'; import { EventDefinition } from './EventDefinition.js'; -import type { AstPath, Doc, ParserOptions } from 'prettier'; +import type { ParserOptions } from 'prettier'; import type { AstNode } from './types.d.ts'; -import type { PrintFunction } from '../types.d.ts'; function createNonterminalVariant( variant: ast.SourceUnitMember['variant'], @@ -91,8 +90,4 @@ export class SourceUnitMember extends SlangNode { this.updateMetadata(this.variant); } - - print(path: AstPath, print: PrintFunction): Doc { - return path.call(print, 'variant'); - } } diff --git a/src/slang-nodes/StateVariableAttribute.ts b/src/slang-nodes/StateVariableAttribute.ts index e45131655..4cfa43602 100644 --- a/src/slang-nodes/StateVariableAttribute.ts +++ b/src/slang-nodes/StateVariableAttribute.ts @@ -7,8 +7,6 @@ import { OverrideSpecifier } from './OverrideSpecifier.js'; import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; -import type { AstPath, Doc } from 'prettier'; -import type { PrintFunction } from '../types.d.ts'; export class StateVariableAttribute extends SlangNode { readonly kind = NonterminalKind.StateVariableAttribute; @@ -27,8 +25,4 @@ export class StateVariableAttribute extends SlangNode { this.updateMetadata(this.variant); } - - print(path: AstPath, print: PrintFunction): Doc { - return path.call(print, 'variant'); - } } diff --git a/src/slang-nodes/Statement.ts b/src/slang-nodes/Statement.ts index 3b5916222..783ed3ac5 100644 --- a/src/slang-nodes/Statement.ts +++ b/src/slang-nodes/Statement.ts @@ -19,9 +19,8 @@ import { AssemblyStatement } from './AssemblyStatement.js'; import { Block } from './Block.js'; import { UncheckedBlock } from './UncheckedBlock.js'; -import type { AstPath, Doc, ParserOptions } from 'prettier'; +import type { ParserOptions } from 'prettier'; import type { AstNode } from './types.d.ts'; -import type { PrintFunction } from '../types.d.ts'; function createNonterminalVariant( variant: ast.Statement['variant'], @@ -111,8 +110,4 @@ export class Statement extends SlangNode { this.updateMetadata(this.variant); } - - print(path: AstPath, print: PrintFunction): Doc { - return path.call(print, 'variant'); - } } diff --git a/src/slang-nodes/StringExpression.ts b/src/slang-nodes/StringExpression.ts index c7edb758d..7dac815db 100644 --- a/src/slang-nodes/StringExpression.ts +++ b/src/slang-nodes/StringExpression.ts @@ -7,9 +7,8 @@ import { HexStringLiteral } from './HexStringLiteral.js'; import { HexStringLiterals } from './HexStringLiterals.js'; import { UnicodeStringLiterals } from './UnicodeStringLiterals.js'; -import type { AstPath, Doc, ParserOptions } from 'prettier'; +import type { ParserOptions } from 'prettier'; import type { AstNode } from './types.d.ts'; -import type { PrintFunction } from '../types.d.ts'; function createNonterminalVariant( variant: ast.StringExpression['variant'], @@ -51,8 +50,4 @@ export class StringExpression extends SlangNode { this.updateMetadata(this.variant); } - - print(path: AstPath, print: PrintFunction): Doc { - return path.call(print, 'variant'); - } } diff --git a/src/slang-nodes/TupleMember.ts b/src/slang-nodes/TupleMember.ts index 2da49eeb9..4eb3bbe0b 100644 --- a/src/slang-nodes/TupleMember.ts +++ b/src/slang-nodes/TupleMember.ts @@ -4,9 +4,8 @@ import { SlangNode } from './SlangNode.js'; import { TypedTupleMember } from './TypedTupleMember.js'; import { UntypedTupleMember } from './UntypedTupleMember.js'; -import type { AstPath, Doc, ParserOptions } from 'prettier'; +import type { ParserOptions } from 'prettier'; import type { AstNode } from './types.d.ts'; -import type { PrintFunction } from '../types.d.ts'; function createNonterminalVariant( variant: ast.TupleMember['variant'], @@ -34,8 +33,4 @@ export class TupleMember extends SlangNode { this.updateMetadata(this.variant); } - - print(path: AstPath, print: PrintFunction): Doc { - return path.call(print, 'variant'); - } } diff --git a/src/slang-nodes/TypeName.ts b/src/slang-nodes/TypeName.ts index 931d1ea25..02c9508a7 100644 --- a/src/slang-nodes/TypeName.ts +++ b/src/slang-nodes/TypeName.ts @@ -7,9 +7,8 @@ import { MappingType } from './MappingType.js'; import { ElementaryType } from './ElementaryType.js'; import { IdentifierPath } from './IdentifierPath.js'; -import type { AstPath, Doc, ParserOptions } from 'prettier'; +import type { ParserOptions } from 'prettier'; import type { AstNode } from './types.d.ts'; -import type { PrintFunction } from '../types.d.ts'; function createNonterminalVariant( variant: ast.TypeName['variant'], @@ -51,8 +50,4 @@ export class TypeName extends SlangNode { this.updateMetadata(this.variant); } - - print(path: AstPath, print: PrintFunction): Doc { - return path.call(print, 'variant'); - } } diff --git a/src/slang-nodes/UnnamedFunctionAttribute.ts b/src/slang-nodes/UnnamedFunctionAttribute.ts index d22dd58ad..caaf4e447 100644 --- a/src/slang-nodes/UnnamedFunctionAttribute.ts +++ b/src/slang-nodes/UnnamedFunctionAttribute.ts @@ -7,9 +7,8 @@ import { ModifierInvocation } from './ModifierInvocation.js'; import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; -import type { AstPath, Doc, ParserOptions } from 'prettier'; +import type { ParserOptions } from 'prettier'; import type { AstNode } from './types.d.ts'; -import type { PrintFunction } from '../types.d.ts'; export class UnnamedFunctionAttribute extends SlangNode { readonly kind = NonterminalKind.UnnamedFunctionAttribute; @@ -31,8 +30,4 @@ export class UnnamedFunctionAttribute extends SlangNode { this.updateMetadata(this.variant); } - - print(path: AstPath, print: PrintFunction): Doc { - return path.call(print, 'variant'); - } } diff --git a/src/slang-nodes/UsingClause.ts b/src/slang-nodes/UsingClause.ts index 03ae7a09c..e619b60c9 100644 --- a/src/slang-nodes/UsingClause.ts +++ b/src/slang-nodes/UsingClause.ts @@ -4,9 +4,6 @@ import { SlangNode } from './SlangNode.js'; import { IdentifierPath } from './IdentifierPath.js'; import { UsingDeconstruction } from './UsingDeconstruction.js'; -import type { AstPath, Doc } from 'prettier'; -import type { PrintFunction } from '../types.d.ts'; - function createNonterminalVariant( variant: ast.UsingClause['variant'] ): UsingClause['variant'] { @@ -32,8 +29,4 @@ export class UsingClause extends SlangNode { this.updateMetadata(this.variant); } - - print(path: AstPath, print: PrintFunction): Doc { - return path.call(print, 'variant'); - } } diff --git a/src/slang-nodes/UsingTarget.ts b/src/slang-nodes/UsingTarget.ts index be6234e1a..215dfeac3 100644 --- a/src/slang-nodes/UsingTarget.ts +++ b/src/slang-nodes/UsingTarget.ts @@ -7,9 +7,8 @@ import { TypeName } from './TypeName.js'; import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; -import type { AstPath, Doc, ParserOptions } from 'prettier'; +import type { ParserOptions } from 'prettier'; import type { AstNode } from './types.d.ts'; -import type { PrintFunction } from '../types.d.ts'; export class UsingTarget extends SlangNode { readonly kind = NonterminalKind.UsingTarget; @@ -28,8 +27,4 @@ export class UsingTarget extends SlangNode { this.updateMetadata(this.variant); } - - print(path: AstPath, print: PrintFunction): Doc { - return path.call(print, 'variant'); - } } diff --git a/src/slang-nodes/VariableDeclarationType.ts b/src/slang-nodes/VariableDeclarationType.ts index 24855a51f..691ce2291 100644 --- a/src/slang-nodes/VariableDeclarationType.ts +++ b/src/slang-nodes/VariableDeclarationType.ts @@ -7,9 +7,8 @@ import { TypeName } from './TypeName.js'; import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; -import type { AstPath, Doc, ParserOptions } from 'prettier'; +import type { ParserOptions } from 'prettier'; import type { AstNode } from './types.d.ts'; -import type { PrintFunction } from '../types.d.ts'; export class VariableDeclarationType extends SlangNode { readonly kind = NonterminalKind.VariableDeclarationType; @@ -31,8 +30,4 @@ export class VariableDeclarationType extends SlangNode { this.updateMetadata(this.variant); } - - print(path: AstPath, print: PrintFunction): Doc { - return path.call(print, 'variant'); - } } diff --git a/src/slang-nodes/VersionExpression.ts b/src/slang-nodes/VersionExpression.ts index 76ae215a9..1385e3ee3 100644 --- a/src/slang-nodes/VersionExpression.ts +++ b/src/slang-nodes/VersionExpression.ts @@ -4,9 +4,6 @@ import { SlangNode } from './SlangNode.js'; import { VersionRange } from './VersionRange.js'; import { VersionTerm } from './VersionTerm.js'; -import type { AstPath, Doc } from 'prettier'; -import type { PrintFunction } from '../types.d.ts'; - function createNonterminalVariant( variant: ast.VersionExpression['variant'] ): VersionExpression['variant'] { @@ -32,8 +29,4 @@ export class VersionExpression extends SlangNode { this.updateMetadata(this.variant); } - - print(path: AstPath, print: PrintFunction): Doc { - return path.call(print, 'variant'); - } } diff --git a/src/slang-nodes/VersionLiteral.ts b/src/slang-nodes/VersionLiteral.ts index 40c64f8d4..6d13cfb2a 100644 --- a/src/slang-nodes/VersionLiteral.ts +++ b/src/slang-nodes/VersionLiteral.ts @@ -7,8 +7,6 @@ import { SimpleVersionLiteral } from './SimpleVersionLiteral.js'; import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; -import type { AstPath, Doc } from 'prettier'; -import type { PrintFunction } from '../types.d.ts'; export class VersionLiteral extends SlangNode { readonly kind = NonterminalKind.VersionLiteral; @@ -27,8 +25,4 @@ export class VersionLiteral extends SlangNode { this.updateMetadata(this.variant); } - - print(path: AstPath, print: PrintFunction): Doc { - return path.call(print, 'variant'); - } } diff --git a/src/slang-nodes/YulAssignmentOperator.ts b/src/slang-nodes/YulAssignmentOperator.ts index 5a6a94b18..e23ebed1b 100644 --- a/src/slang-nodes/YulAssignmentOperator.ts +++ b/src/slang-nodes/YulAssignmentOperator.ts @@ -7,8 +7,6 @@ import { YulColonAndEqual } from './YulColonAndEqual.js'; import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; -import type { AstPath, Doc } from 'prettier'; -import type { PrintFunction } from '../types.d.ts'; export class YulAssignmentOperator extends SlangNode { readonly kind = NonterminalKind.YulAssignmentOperator; @@ -27,8 +25,4 @@ export class YulAssignmentOperator extends SlangNode { this.updateMetadata(this.variant); } - - print(path: AstPath, print: PrintFunction): Doc { - return path.call(print, 'variant'); - } } diff --git a/src/slang-nodes/YulExpression.ts b/src/slang-nodes/YulExpression.ts index 42acf09ce..a4f0094f6 100644 --- a/src/slang-nodes/YulExpression.ts +++ b/src/slang-nodes/YulExpression.ts @@ -5,9 +5,8 @@ import { YulFunctionCallExpression } from './YulFunctionCallExpression.js'; import { YulLiteral } from './YulLiteral.js'; import { YulPath } from './YulPath.js'; -import type { AstPath, Doc, ParserOptions } from 'prettier'; +import type { ParserOptions } from 'prettier'; import type { AstNode } from './types.d.ts'; -import type { PrintFunction } from '../types.d.ts'; function createNonterminalVariant( variant: ast.YulExpression['variant'], @@ -38,8 +37,4 @@ export class YulExpression extends SlangNode { this.updateMetadata(this.variant); } - - print(path: AstPath, print: PrintFunction): Doc { - return path.call(print, 'variant'); - } } diff --git a/src/slang-nodes/YulLiteral.ts b/src/slang-nodes/YulLiteral.ts index 1954cb8d6..72ef74856 100644 --- a/src/slang-nodes/YulLiteral.ts +++ b/src/slang-nodes/YulLiteral.ts @@ -8,9 +8,8 @@ import { HexStringLiteral } from './HexStringLiteral.js'; import { StringLiteral } from './StringLiteral.js'; import { TerminalNode } from './TerminalNode.js'; -import type { AstPath, Doc, ParserOptions } from 'prettier'; +import type { ParserOptions } from 'prettier'; import type { AstNode } from './types.d.ts'; -import type { PrintFunction } from '../types.d.ts'; function createNonterminalVariant( variant: Exclude, @@ -43,8 +42,4 @@ export class YulLiteral extends SlangNode { this.updateMetadata(this.variant); } - - print(path: AstPath, print: PrintFunction): Doc { - return path.call(print, 'variant'); - } } diff --git a/src/slang-nodes/YulStackAssignmentOperator.ts b/src/slang-nodes/YulStackAssignmentOperator.ts index a76b11421..0318ae8bf 100644 --- a/src/slang-nodes/YulStackAssignmentOperator.ts +++ b/src/slang-nodes/YulStackAssignmentOperator.ts @@ -7,8 +7,6 @@ import { YulEqualAndColon } from './YulEqualAndColon.js'; import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; -import type { AstPath, Doc } from 'prettier'; -import type { PrintFunction } from '../types.d.ts'; export class YulStackAssignmentOperator extends SlangNode { readonly kind = NonterminalKind.YulStackAssignmentOperator; @@ -27,8 +25,4 @@ export class YulStackAssignmentOperator extends SlangNode { this.updateMetadata(this.variant); } - - print(path: AstPath, print: PrintFunction): Doc { - return path.call(print, 'variant'); - } } diff --git a/src/slang-nodes/YulStatement.ts b/src/slang-nodes/YulStatement.ts index fa8f4b414..efe91c786 100644 --- a/src/slang-nodes/YulStatement.ts +++ b/src/slang-nodes/YulStatement.ts @@ -15,9 +15,8 @@ import { YulContinueStatement } from './YulContinueStatement.js'; import { YulLabel } from './YulLabel.js'; import { YulExpression } from './YulExpression.js'; -import type { AstPath, Doc, ParserOptions } from 'prettier'; +import type { ParserOptions } from 'prettier'; import type { AstNode } from './types.d.ts'; -import type { PrintFunction } from '../types.d.ts'; function createNonterminalVariant( variant: ast.YulStatement['variant'], @@ -91,8 +90,4 @@ export class YulStatement extends SlangNode { this.updateMetadata(this.variant); } - - print(path: AstPath, print: PrintFunction): Doc { - return path.call(print, 'variant'); - } } diff --git a/src/slang-nodes/YulSwitchCase.ts b/src/slang-nodes/YulSwitchCase.ts index 366ca6d44..3c629e55b 100644 --- a/src/slang-nodes/YulSwitchCase.ts +++ b/src/slang-nodes/YulSwitchCase.ts @@ -4,9 +4,8 @@ import { SlangNode } from './SlangNode.js'; import { YulDefaultCase } from './YulDefaultCase.js'; import { YulValueCase } from './YulValueCase.js'; -import type { AstPath, Doc, ParserOptions } from 'prettier'; +import type { ParserOptions } from 'prettier'; import type { AstNode } from './types.d.ts'; -import type { PrintFunction } from '../types.d.ts'; function createNonterminalVariant( variant: ast.YulSwitchCase['variant'], @@ -34,8 +33,4 @@ export class YulSwitchCase extends SlangNode { this.updateMetadata(this.variant); } - - print(path: AstPath, print: PrintFunction): Doc { - return path.call(print, 'variant'); - } } diff --git a/src/slang-utils/is-polymorphic-node.ts b/src/slang-utils/is-polymorphic-node.ts new file mode 100644 index 000000000..ba7663e80 --- /dev/null +++ b/src/slang-utils/is-polymorphic-node.ts @@ -0,0 +1,7 @@ +import type { PolymorphicNode, StrictAstNode } from '../slang-nodes/types.d.ts'; + +export function isPolymorphicNode( + node: StrictAstNode +): node is PolymorphicNode { + return typeof (node as PolymorphicNode).variant !== 'undefined'; +} diff --git a/src/slangPrinter.ts b/src/slangPrinter.ts index 11de3e62a..0e6899755 100644 --- a/src/slangPrinter.ts +++ b/src/slangPrinter.ts @@ -1,5 +1,6 @@ import { isBlockComment } from './slang-utils/is-comment.js'; import { locEnd, locStart } from './slang-utils/loc.js'; +import { isPolymorphicNode } from './slang-utils/is-polymorphic-node.js'; import type { AstPath, Doc, ParserOptions } from 'prettier'; import type { AstNode, StrictAstNode } from './slang-nodes/types.d.ts'; @@ -28,7 +29,6 @@ function ignoreComments(path: AstPath): void { // parser. `updateMetadata` is an internal function. case 'kind': case 'loc': - case 'print': case 'updateMetadata': break; // The key `comments` will contain every comment for this node. @@ -58,12 +58,15 @@ function genericPrint( ): Doc { const node = path.node; + if (typeof node === 'string') return node; + if (hasNodeIgnoreComment(node)) { ignoreComments(path); return options.originalText.slice(locStart(node), locEnd(node)); } + if (isPolymorphicNode(node)) return path.call(print, 'variant'); // Since each node has a print function with a specific AstPath, the union of // all nodes into AstNode creates a print function with an AstPath of the // intersection of all nodes. This forces us to cast this with a never type. From caac0454e4010e0778c988b6e181325bbd6df83f Mon Sep 17 00:00:00 2001 From: Klaus Date: Tue, 29 Jul 2025 18:26:15 +0100 Subject: [PATCH 2/4] Creating a hub class for PolymorphicNodes with a non-string variant so we can prepare to override the storing of comments --- src/slang-nodes/ArgumentsDeclaration.ts | 4 ++-- src/slang-nodes/ConstructorAttribute.ts | 4 ++-- src/slang-nodes/ContractMember.ts | 4 ++-- src/slang-nodes/ContractSpecifier.ts | 4 ++-- src/slang-nodes/ElementaryType.ts | 4 ++-- src/slang-nodes/ExperimentalFeature.ts | 4 ++-- src/slang-nodes/Expression.ts | 4 ++-- src/slang-nodes/FallbackFunctionAttribute.ts | 4 ++-- src/slang-nodes/ForStatementCondition.ts | 4 ++-- src/slang-nodes/ForStatementInitialization.ts | 4 ++-- src/slang-nodes/FunctionAttribute.ts | 4 ++-- src/slang-nodes/FunctionBody.ts | 4 ++-- src/slang-nodes/FunctionName.ts | 4 ++-- src/slang-nodes/FunctionTypeAttribute.ts | 4 ++-- src/slang-nodes/ImportClause.ts | 4 ++-- src/slang-nodes/MappingKeyType.ts | 4 ++-- src/slang-nodes/ModifierAttribute.ts | 4 ++-- src/slang-nodes/PolymorphicNode.ts | 9 +++++++++ src/slang-nodes/Pragma.ts | 4 ++-- src/slang-nodes/ReceiveFunctionAttribute.ts | 4 ++-- src/slang-nodes/SourceUnitMember.ts | 4 ++-- src/slang-nodes/StateVariableAttribute.ts | 4 ++-- src/slang-nodes/Statement.ts | 4 ++-- src/slang-nodes/StringExpression.ts | 4 ++-- src/slang-nodes/TupleMember.ts | 4 ++-- src/slang-nodes/TypeName.ts | 4 ++-- src/slang-nodes/UnnamedFunctionAttribute.ts | 4 ++-- src/slang-nodes/UsingClause.ts | 4 ++-- src/slang-nodes/UsingTarget.ts | 4 ++-- src/slang-nodes/VariableDeclarationType.ts | 4 ++-- src/slang-nodes/VersionExpression.ts | 4 ++-- src/slang-nodes/VersionLiteral.ts | 4 ++-- src/slang-nodes/YulAssignmentOperator.ts | 4 ++-- src/slang-nodes/YulExpression.ts | 4 ++-- src/slang-nodes/YulLiteral.ts | 4 ++-- src/slang-nodes/YulStackAssignmentOperator.ts | 4 ++-- src/slang-nodes/YulStatement.ts | 4 ++-- src/slang-nodes/YulSwitchCase.ts | 4 ++-- src/slang-utils/is-polymorphic-node.ts | 3 ++- src/slangPrinter.ts | 2 -- 40 files changed, 85 insertions(+), 77 deletions(-) create mode 100644 src/slang-nodes/PolymorphicNode.ts diff --git a/src/slang-nodes/ArgumentsDeclaration.ts b/src/slang-nodes/ArgumentsDeclaration.ts index b896b17ed..34b5f288a 100644 --- a/src/slang-nodes/ArgumentsDeclaration.ts +++ b/src/slang-nodes/ArgumentsDeclaration.ts @@ -1,6 +1,6 @@ import * as ast from '@nomicfoundation/slang/ast'; import { NonterminalKind } from '@nomicfoundation/slang/cst'; -import { SlangNode } from './SlangNode.js'; +import { PolymorphicNode } from './PolymorphicNode.js'; import { PositionalArgumentsDeclaration } from './PositionalArgumentsDeclaration.js'; import { NamedArgumentsDeclaration } from './NamedArgumentsDeclaration.js'; @@ -21,7 +21,7 @@ function createNonterminalVariant( return exhaustiveCheck; } -export class ArgumentsDeclaration extends SlangNode { +export class ArgumentsDeclaration extends PolymorphicNode { readonly kind = NonterminalKind.ArgumentsDeclaration; variant: PositionalArgumentsDeclaration | NamedArgumentsDeclaration; diff --git a/src/slang-nodes/ConstructorAttribute.ts b/src/slang-nodes/ConstructorAttribute.ts index 5414d6d5c..c65382dc6 100644 --- a/src/slang-nodes/ConstructorAttribute.ts +++ b/src/slang-nodes/ConstructorAttribute.ts @@ -2,7 +2,7 @@ import { NonterminalKind, TerminalNode as SlangTerminalNode } from '@nomicfoundation/slang/cst'; -import { SlangNode } from './SlangNode.js'; +import { PolymorphicNode } from './PolymorphicNode.js'; import { ModifierInvocation } from './ModifierInvocation.js'; import { TerminalNode } from './TerminalNode.js'; @@ -10,7 +10,7 @@ import type * as ast from '@nomicfoundation/slang/ast'; import type { ParserOptions } from 'prettier'; import type { AstNode } from './types.d.ts'; -export class ConstructorAttribute extends SlangNode { +export class ConstructorAttribute extends PolymorphicNode { readonly kind = NonterminalKind.ConstructorAttribute; variant: ModifierInvocation | TerminalNode; diff --git a/src/slang-nodes/ContractMember.ts b/src/slang-nodes/ContractMember.ts index 71d2ccebb..1661cef24 100644 --- a/src/slang-nodes/ContractMember.ts +++ b/src/slang-nodes/ContractMember.ts @@ -1,6 +1,6 @@ import * as ast from '@nomicfoundation/slang/ast'; import { NonterminalKind } from '@nomicfoundation/slang/cst'; -import { SlangNode } from './SlangNode.js'; +import { PolymorphicNode } from './PolymorphicNode.js'; import { UsingDirective } from './UsingDirective.js'; import { FunctionDefinition } from './FunctionDefinition.js'; import { ConstructorDefinition } from './ConstructorDefinition.js'; @@ -65,7 +65,7 @@ function createNonterminalVariant( return exhaustiveCheck; } -export class ContractMember extends SlangNode { +export class ContractMember extends PolymorphicNode { readonly kind = NonterminalKind.ContractMember; variant: diff --git a/src/slang-nodes/ContractSpecifier.ts b/src/slang-nodes/ContractSpecifier.ts index e8498bfb3..a3c6d28d4 100644 --- a/src/slang-nodes/ContractSpecifier.ts +++ b/src/slang-nodes/ContractSpecifier.ts @@ -1,6 +1,6 @@ import * as ast from '@nomicfoundation/slang/ast'; import { NonterminalKind } from '@nomicfoundation/slang/cst'; -import { SlangNode } from './SlangNode.js'; +import { PolymorphicNode } from './PolymorphicNode.js'; import { InheritanceSpecifier } from './InheritanceSpecifier.js'; import { StorageLayoutSpecifier } from './StorageLayoutSpecifier.js'; @@ -21,7 +21,7 @@ function createNonterminalVariant( return exhaustiveCheck; } -export class ContractSpecifier extends SlangNode { +export class ContractSpecifier extends PolymorphicNode { readonly kind = NonterminalKind.ContractSpecifier; variant: InheritanceSpecifier | StorageLayoutSpecifier; diff --git a/src/slang-nodes/ElementaryType.ts b/src/slang-nodes/ElementaryType.ts index 5f958e5b3..d75ade091 100644 --- a/src/slang-nodes/ElementaryType.ts +++ b/src/slang-nodes/ElementaryType.ts @@ -2,13 +2,13 @@ import { NonterminalKind, TerminalNode as SlangTerminalNode } from '@nomicfoundation/slang/cst'; -import { SlangNode } from './SlangNode.js'; +import { PolymorphicNode } from './PolymorphicNode.js'; import { AddressType } from './AddressType.js'; import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; -export class ElementaryType extends SlangNode { +export class ElementaryType extends PolymorphicNode { readonly kind = NonterminalKind.ElementaryType; variant: AddressType | TerminalNode; diff --git a/src/slang-nodes/ExperimentalFeature.ts b/src/slang-nodes/ExperimentalFeature.ts index b07563fa2..e37807de7 100644 --- a/src/slang-nodes/ExperimentalFeature.ts +++ b/src/slang-nodes/ExperimentalFeature.ts @@ -2,7 +2,7 @@ import { NonterminalKind, TerminalNode as SlangTerminalNode } from '@nomicfoundation/slang/cst'; -import { SlangNode } from './SlangNode.js'; +import { PolymorphicNode } from './PolymorphicNode.js'; import { StringLiteral } from './StringLiteral.js'; import { TerminalNode } from './TerminalNode.js'; @@ -10,7 +10,7 @@ import type * as ast from '@nomicfoundation/slang/ast'; import type { ParserOptions } from 'prettier'; import type { AstNode } from './types.d.ts'; -export class ExperimentalFeature extends SlangNode { +export class ExperimentalFeature extends PolymorphicNode { readonly kind = NonterminalKind.ExperimentalFeature; variant: StringLiteral | TerminalNode; diff --git a/src/slang-nodes/Expression.ts b/src/slang-nodes/Expression.ts index 1ef53eb9c..f59fe5e21 100644 --- a/src/slang-nodes/Expression.ts +++ b/src/slang-nodes/Expression.ts @@ -3,7 +3,7 @@ import { NonterminalKind, TerminalNode as SlangTerminalNode } from '@nomicfoundation/slang/cst'; -import { SlangNode } from './SlangNode.js'; +import { PolymorphicNode } from './PolymorphicNode.js'; import { AssignmentExpression } from './AssignmentExpression.js'; import { ConditionalExpression } from './ConditionalExpression.js'; import { OrExpression } from './OrExpression.js'; @@ -125,7 +125,7 @@ function createNonterminalVariant( return exhaustiveCheck; } -export class Expression extends SlangNode { +export class Expression extends PolymorphicNode { readonly kind = NonterminalKind.Expression; variant: diff --git a/src/slang-nodes/FallbackFunctionAttribute.ts b/src/slang-nodes/FallbackFunctionAttribute.ts index e696e7e41..40d89314a 100644 --- a/src/slang-nodes/FallbackFunctionAttribute.ts +++ b/src/slang-nodes/FallbackFunctionAttribute.ts @@ -3,7 +3,7 @@ import { NonterminalKind, TerminalNode as SlangTerminalNode } from '@nomicfoundation/slang/cst'; -import { SlangNode } from './SlangNode.js'; +import { PolymorphicNode } from './PolymorphicNode.js'; import { ModifierInvocation } from './ModifierInvocation.js'; import { OverrideSpecifier } from './OverrideSpecifier.js'; import { TerminalNode } from './TerminalNode.js'; @@ -25,7 +25,7 @@ function createNonterminalVariant( return exhaustiveCheck; } -export class FallbackFunctionAttribute extends SlangNode { +export class FallbackFunctionAttribute extends PolymorphicNode { readonly kind = NonterminalKind.FallbackFunctionAttribute; variant: ModifierInvocation | OverrideSpecifier | TerminalNode; diff --git a/src/slang-nodes/ForStatementCondition.ts b/src/slang-nodes/ForStatementCondition.ts index 0c75d9c94..852a57bfc 100644 --- a/src/slang-nodes/ForStatementCondition.ts +++ b/src/slang-nodes/ForStatementCondition.ts @@ -2,7 +2,7 @@ import { NonterminalKind, TerminalNode as SlangTerminalNode } from '@nomicfoundation/slang/cst'; -import { SlangNode } from './SlangNode.js'; +import { PolymorphicNode } from './PolymorphicNode.js'; import { ExpressionStatement } from './ExpressionStatement.js'; import { TerminalNode } from './TerminalNode.js'; @@ -10,7 +10,7 @@ import type * as ast from '@nomicfoundation/slang/ast'; import type { ParserOptions } from 'prettier'; import type { AstNode } from './types.d.ts'; -export class ForStatementCondition extends SlangNode { +export class ForStatementCondition extends PolymorphicNode { readonly kind = NonterminalKind.ForStatementCondition; variant: ExpressionStatement | TerminalNode; diff --git a/src/slang-nodes/ForStatementInitialization.ts b/src/slang-nodes/ForStatementInitialization.ts index a26489a0f..a1f88c986 100644 --- a/src/slang-nodes/ForStatementInitialization.ts +++ b/src/slang-nodes/ForStatementInitialization.ts @@ -3,7 +3,7 @@ import { NonterminalKind, TerminalNode as SlangTerminalNode } from '@nomicfoundation/slang/cst'; -import { SlangNode } from './SlangNode.js'; +import { PolymorphicNode } from './PolymorphicNode.js'; import { ExpressionStatement } from './ExpressionStatement.js'; import { VariableDeclarationStatement } from './VariableDeclarationStatement.js'; import { TupleDeconstructionStatement } from './TupleDeconstructionStatement.js'; @@ -32,7 +32,7 @@ function createNonterminalVariant( return exhaustiveCheck; } -export class ForStatementInitialization extends SlangNode { +export class ForStatementInitialization extends PolymorphicNode { readonly kind = NonterminalKind.ForStatementInitialization; variant: diff --git a/src/slang-nodes/FunctionAttribute.ts b/src/slang-nodes/FunctionAttribute.ts index a4d36f472..c42c7337b 100644 --- a/src/slang-nodes/FunctionAttribute.ts +++ b/src/slang-nodes/FunctionAttribute.ts @@ -3,7 +3,7 @@ import { NonterminalKind, TerminalNode as SlangTerminalNode } from '@nomicfoundation/slang/cst'; -import { SlangNode } from './SlangNode.js'; +import { PolymorphicNode } from './PolymorphicNode.js'; import { ModifierInvocation } from './ModifierInvocation.js'; import { OverrideSpecifier } from './OverrideSpecifier.js'; import { TerminalNode } from './TerminalNode.js'; @@ -25,7 +25,7 @@ function createNonterminalVariant( return exhaustiveCheck; } -export class FunctionAttribute extends SlangNode { +export class FunctionAttribute extends PolymorphicNode { readonly kind = NonterminalKind.FunctionAttribute; variant: ModifierInvocation | OverrideSpecifier | TerminalNode; diff --git a/src/slang-nodes/FunctionBody.ts b/src/slang-nodes/FunctionBody.ts index 364a0923f..7a297fdcc 100644 --- a/src/slang-nodes/FunctionBody.ts +++ b/src/slang-nodes/FunctionBody.ts @@ -2,7 +2,7 @@ import { NonterminalKind, TerminalNode as SlangTerminalNode } from '@nomicfoundation/slang/cst'; -import { SlangNode } from './SlangNode.js'; +import { PolymorphicNode } from './PolymorphicNode.js'; import { Block } from './Block.js'; import { TerminalNode } from './TerminalNode.js'; @@ -10,7 +10,7 @@ import type * as ast from '@nomicfoundation/slang/ast'; import type { ParserOptions } from 'prettier'; import type { AstNode } from './types.d.ts'; -export class FunctionBody extends SlangNode { +export class FunctionBody extends PolymorphicNode { readonly kind = NonterminalKind.FunctionBody; variant: Block | TerminalNode; diff --git a/src/slang-nodes/FunctionName.ts b/src/slang-nodes/FunctionName.ts index 59cd6325d..b3f9620e3 100644 --- a/src/slang-nodes/FunctionName.ts +++ b/src/slang-nodes/FunctionName.ts @@ -1,10 +1,10 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst'; -import { SlangNode } from './SlangNode.js'; +import { PolymorphicNode } from './PolymorphicNode.js'; import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; -export class FunctionName extends SlangNode { +export class FunctionName extends PolymorphicNode { readonly kind = NonterminalKind.FunctionName; variant: TerminalNode; diff --git a/src/slang-nodes/FunctionTypeAttribute.ts b/src/slang-nodes/FunctionTypeAttribute.ts index 5e0b2d18d..a13cf97cf 100644 --- a/src/slang-nodes/FunctionTypeAttribute.ts +++ b/src/slang-nodes/FunctionTypeAttribute.ts @@ -1,10 +1,10 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst'; -import { SlangNode } from './SlangNode.js'; +import { PolymorphicNode } from './PolymorphicNode.js'; import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; -export class FunctionTypeAttribute extends SlangNode { +export class FunctionTypeAttribute extends PolymorphicNode { readonly kind = NonterminalKind.FunctionTypeAttribute; variant: TerminalNode; diff --git a/src/slang-nodes/ImportClause.ts b/src/slang-nodes/ImportClause.ts index 58f3cd96b..3c721dc53 100644 --- a/src/slang-nodes/ImportClause.ts +++ b/src/slang-nodes/ImportClause.ts @@ -1,6 +1,6 @@ import * as ast from '@nomicfoundation/slang/ast'; import { NonterminalKind } from '@nomicfoundation/slang/cst'; -import { SlangNode } from './SlangNode.js'; +import { PolymorphicNode } from './PolymorphicNode.js'; import { PathImport } from './PathImport.js'; import { NamedImport } from './NamedImport.js'; import { ImportDeconstruction } from './ImportDeconstruction.js'; @@ -25,7 +25,7 @@ function createNonterminalVariant( return exhaustiveCheck; } -export class ImportClause extends SlangNode { +export class ImportClause extends PolymorphicNode { readonly kind = NonterminalKind.ImportClause; variant: PathImport | NamedImport | ImportDeconstruction; diff --git a/src/slang-nodes/MappingKeyType.ts b/src/slang-nodes/MappingKeyType.ts index 0eef27057..5f8474f24 100644 --- a/src/slang-nodes/MappingKeyType.ts +++ b/src/slang-nodes/MappingKeyType.ts @@ -1,6 +1,6 @@ import * as ast from '@nomicfoundation/slang/ast'; import { NonterminalKind } from '@nomicfoundation/slang/cst'; -import { SlangNode } from './SlangNode.js'; +import { PolymorphicNode } from './PolymorphicNode.js'; import { ElementaryType } from './ElementaryType.js'; import { IdentifierPath } from './IdentifierPath.js'; @@ -17,7 +17,7 @@ function createNonterminalVariant( return exhaustiveCheck; } -export class MappingKeyType extends SlangNode { +export class MappingKeyType extends PolymorphicNode { readonly kind = NonterminalKind.MappingKeyType; variant: ElementaryType | IdentifierPath; diff --git a/src/slang-nodes/ModifierAttribute.ts b/src/slang-nodes/ModifierAttribute.ts index bc4310c34..9f2dbfa72 100644 --- a/src/slang-nodes/ModifierAttribute.ts +++ b/src/slang-nodes/ModifierAttribute.ts @@ -2,13 +2,13 @@ import { NonterminalKind, TerminalNode as SlangTerminalNode } from '@nomicfoundation/slang/cst'; -import { SlangNode } from './SlangNode.js'; +import { PolymorphicNode } from './PolymorphicNode.js'; import { OverrideSpecifier } from './OverrideSpecifier.js'; import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; -export class ModifierAttribute extends SlangNode { +export class ModifierAttribute extends PolymorphicNode { readonly kind = NonterminalKind.ModifierAttribute; variant: OverrideSpecifier | TerminalNode; diff --git a/src/slang-nodes/PolymorphicNode.ts b/src/slang-nodes/PolymorphicNode.ts new file mode 100644 index 000000000..bb04b2df6 --- /dev/null +++ b/src/slang-nodes/PolymorphicNode.ts @@ -0,0 +1,9 @@ +import { SlangNode } from './SlangNode.js'; + +import type { SlangAstNode } from '../types.d.ts'; + +export class PolymorphicNode extends SlangNode { + constructor(ast: SlangAstNode) { + super(ast); + } +} diff --git a/src/slang-nodes/Pragma.ts b/src/slang-nodes/Pragma.ts index 9d06b2a43..1206e2bbd 100644 --- a/src/slang-nodes/Pragma.ts +++ b/src/slang-nodes/Pragma.ts @@ -1,6 +1,6 @@ import * as ast from '@nomicfoundation/slang/ast'; import { NonterminalKind } from '@nomicfoundation/slang/cst'; -import { SlangNode } from './SlangNode.js'; +import { PolymorphicNode } from './PolymorphicNode.js'; import { AbicoderPragma } from './AbicoderPragma.js'; import { ExperimentalPragma } from './ExperimentalPragma.js'; import { VersionPragma } from './VersionPragma.js'; @@ -25,7 +25,7 @@ function createNonterminalVariant( return exhaustiveCheck; } -export class Pragma extends SlangNode { +export class Pragma extends PolymorphicNode { readonly kind = NonterminalKind.Pragma; variant: AbicoderPragma | ExperimentalPragma | VersionPragma; diff --git a/src/slang-nodes/ReceiveFunctionAttribute.ts b/src/slang-nodes/ReceiveFunctionAttribute.ts index 9745d34fb..74a52cff1 100644 --- a/src/slang-nodes/ReceiveFunctionAttribute.ts +++ b/src/slang-nodes/ReceiveFunctionAttribute.ts @@ -3,7 +3,7 @@ import { NonterminalKind, TerminalNode as SlangTerminalNode } from '@nomicfoundation/slang/cst'; -import { SlangNode } from './SlangNode.js'; +import { PolymorphicNode } from './PolymorphicNode.js'; import { ModifierInvocation } from './ModifierInvocation.js'; import { OverrideSpecifier } from './OverrideSpecifier.js'; import { TerminalNode } from './TerminalNode.js'; @@ -25,7 +25,7 @@ function createNonterminalVariant( return exhaustiveCheck; } -export class ReceiveFunctionAttribute extends SlangNode { +export class ReceiveFunctionAttribute extends PolymorphicNode { readonly kind = NonterminalKind.ReceiveFunctionAttribute; variant: ModifierInvocation | OverrideSpecifier | TerminalNode; diff --git a/src/slang-nodes/SourceUnitMember.ts b/src/slang-nodes/SourceUnitMember.ts index 07e74b736..683238e34 100644 --- a/src/slang-nodes/SourceUnitMember.ts +++ b/src/slang-nodes/SourceUnitMember.ts @@ -1,6 +1,6 @@ import * as ast from '@nomicfoundation/slang/ast'; import { NonterminalKind } from '@nomicfoundation/slang/cst'; -import { SlangNode } from './SlangNode.js'; +import { PolymorphicNode } from './PolymorphicNode.js'; import { PragmaDirective } from './PragmaDirective.js'; import { ImportDirective } from './ImportDirective.js'; import { ContractDefinition } from './ContractDefinition.js'; @@ -65,7 +65,7 @@ function createNonterminalVariant( return exhaustiveCheck; } -export class SourceUnitMember extends SlangNode { +export class SourceUnitMember extends PolymorphicNode { readonly kind = NonterminalKind.SourceUnitMember; variant: diff --git a/src/slang-nodes/StateVariableAttribute.ts b/src/slang-nodes/StateVariableAttribute.ts index 4cfa43602..6ddf3295c 100644 --- a/src/slang-nodes/StateVariableAttribute.ts +++ b/src/slang-nodes/StateVariableAttribute.ts @@ -2,13 +2,13 @@ import { NonterminalKind, TerminalNode as SlangTerminalNode } from '@nomicfoundation/slang/cst'; -import { SlangNode } from './SlangNode.js'; +import { PolymorphicNode } from './PolymorphicNode.js'; import { OverrideSpecifier } from './OverrideSpecifier.js'; import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; -export class StateVariableAttribute extends SlangNode { +export class StateVariableAttribute extends PolymorphicNode { readonly kind = NonterminalKind.StateVariableAttribute; variant: OverrideSpecifier | TerminalNode; diff --git a/src/slang-nodes/Statement.ts b/src/slang-nodes/Statement.ts index 783ed3ac5..3b3a6d72d 100644 --- a/src/slang-nodes/Statement.ts +++ b/src/slang-nodes/Statement.ts @@ -1,6 +1,6 @@ import * as ast from '@nomicfoundation/slang/ast'; import { NonterminalKind } from '@nomicfoundation/slang/cst'; -import { SlangNode } from './SlangNode.js'; +import { PolymorphicNode } from './PolymorphicNode.js'; import { ExpressionStatement } from './ExpressionStatement.js'; import { VariableDeclarationStatement } from './VariableDeclarationStatement.js'; import { TupleDeconstructionStatement } from './TupleDeconstructionStatement.js'; @@ -81,7 +81,7 @@ function createNonterminalVariant( return exhaustiveCheck; } -export class Statement extends SlangNode { +export class Statement extends PolymorphicNode { readonly kind = NonterminalKind.Statement; variant: diff --git a/src/slang-nodes/StringExpression.ts b/src/slang-nodes/StringExpression.ts index 7dac815db..5b074af51 100644 --- a/src/slang-nodes/StringExpression.ts +++ b/src/slang-nodes/StringExpression.ts @@ -1,6 +1,6 @@ import * as ast from '@nomicfoundation/slang/ast'; import { NonterminalKind } from '@nomicfoundation/slang/cst'; -import { SlangNode } from './SlangNode.js'; +import { PolymorphicNode } from './PolymorphicNode.js'; import { StringLiteral } from './StringLiteral.js'; import { StringLiterals } from './StringLiterals.js'; import { HexStringLiteral } from './HexStringLiteral.js'; @@ -33,7 +33,7 @@ function createNonterminalVariant( return exhaustiveCheck; } -export class StringExpression extends SlangNode { +export class StringExpression extends PolymorphicNode { readonly kind = NonterminalKind.StringExpression; variant: diff --git a/src/slang-nodes/TupleMember.ts b/src/slang-nodes/TupleMember.ts index 4eb3bbe0b..19b3b378b 100644 --- a/src/slang-nodes/TupleMember.ts +++ b/src/slang-nodes/TupleMember.ts @@ -1,6 +1,6 @@ import * as ast from '@nomicfoundation/slang/ast'; import { NonterminalKind } from '@nomicfoundation/slang/cst'; -import { SlangNode } from './SlangNode.js'; +import { PolymorphicNode } from './PolymorphicNode.js'; import { TypedTupleMember } from './TypedTupleMember.js'; import { UntypedTupleMember } from './UntypedTupleMember.js'; @@ -21,7 +21,7 @@ function createNonterminalVariant( return exhaustiveCheck; } -export class TupleMember extends SlangNode { +export class TupleMember extends PolymorphicNode { readonly kind = NonterminalKind.TupleMember; variant: TypedTupleMember | UntypedTupleMember; diff --git a/src/slang-nodes/TypeName.ts b/src/slang-nodes/TypeName.ts index 02c9508a7..a3c83328b 100644 --- a/src/slang-nodes/TypeName.ts +++ b/src/slang-nodes/TypeName.ts @@ -1,6 +1,6 @@ import * as ast from '@nomicfoundation/slang/ast'; import { NonterminalKind } from '@nomicfoundation/slang/cst'; -import { SlangNode } from './SlangNode.js'; +import { PolymorphicNode } from './PolymorphicNode.js'; import { ArrayTypeName } from './ArrayTypeName.js'; import { FunctionType } from './FunctionType.js'; import { MappingType } from './MappingType.js'; @@ -33,7 +33,7 @@ function createNonterminalVariant( return exhaustiveCheck; } -export class TypeName extends SlangNode { +export class TypeName extends PolymorphicNode { readonly kind = NonterminalKind.TypeName; variant: diff --git a/src/slang-nodes/UnnamedFunctionAttribute.ts b/src/slang-nodes/UnnamedFunctionAttribute.ts index caaf4e447..c67898e2c 100644 --- a/src/slang-nodes/UnnamedFunctionAttribute.ts +++ b/src/slang-nodes/UnnamedFunctionAttribute.ts @@ -2,7 +2,7 @@ import { NonterminalKind, TerminalNode as SlangTerminalNode } from '@nomicfoundation/slang/cst'; -import { SlangNode } from './SlangNode.js'; +import { PolymorphicNode } from './PolymorphicNode.js'; import { ModifierInvocation } from './ModifierInvocation.js'; import { TerminalNode } from './TerminalNode.js'; @@ -10,7 +10,7 @@ import type * as ast from '@nomicfoundation/slang/ast'; import type { ParserOptions } from 'prettier'; import type { AstNode } from './types.d.ts'; -export class UnnamedFunctionAttribute extends SlangNode { +export class UnnamedFunctionAttribute extends PolymorphicNode { readonly kind = NonterminalKind.UnnamedFunctionAttribute; variant: ModifierInvocation | TerminalNode; diff --git a/src/slang-nodes/UsingClause.ts b/src/slang-nodes/UsingClause.ts index e619b60c9..a1f8f8215 100644 --- a/src/slang-nodes/UsingClause.ts +++ b/src/slang-nodes/UsingClause.ts @@ -1,6 +1,6 @@ import * as ast from '@nomicfoundation/slang/ast'; import { NonterminalKind } from '@nomicfoundation/slang/cst'; -import { SlangNode } from './SlangNode.js'; +import { PolymorphicNode } from './PolymorphicNode.js'; import { IdentifierPath } from './IdentifierPath.js'; import { UsingDeconstruction } from './UsingDeconstruction.js'; @@ -17,7 +17,7 @@ function createNonterminalVariant( return exhaustiveCheck; } -export class UsingClause extends SlangNode { +export class UsingClause extends PolymorphicNode { readonly kind = NonterminalKind.UsingClause; variant: IdentifierPath | UsingDeconstruction; diff --git a/src/slang-nodes/UsingTarget.ts b/src/slang-nodes/UsingTarget.ts index 215dfeac3..8eaeb1490 100644 --- a/src/slang-nodes/UsingTarget.ts +++ b/src/slang-nodes/UsingTarget.ts @@ -2,7 +2,7 @@ import { NonterminalKind, TerminalNode as SlangTerminalNode } from '@nomicfoundation/slang/cst'; -import { SlangNode } from './SlangNode.js'; +import { PolymorphicNode } from './PolymorphicNode.js'; import { TypeName } from './TypeName.js'; import { TerminalNode } from './TerminalNode.js'; @@ -10,7 +10,7 @@ import type * as ast from '@nomicfoundation/slang/ast'; import type { ParserOptions } from 'prettier'; import type { AstNode } from './types.d.ts'; -export class UsingTarget extends SlangNode { +export class UsingTarget extends PolymorphicNode { readonly kind = NonterminalKind.UsingTarget; variant: TypeName | TerminalNode; diff --git a/src/slang-nodes/VariableDeclarationType.ts b/src/slang-nodes/VariableDeclarationType.ts index 691ce2291..d17312222 100644 --- a/src/slang-nodes/VariableDeclarationType.ts +++ b/src/slang-nodes/VariableDeclarationType.ts @@ -2,7 +2,7 @@ import { NonterminalKind, TerminalNode as SlangTerminalNode } from '@nomicfoundation/slang/cst'; -import { SlangNode } from './SlangNode.js'; +import { PolymorphicNode } from './PolymorphicNode.js'; import { TypeName } from './TypeName.js'; import { TerminalNode } from './TerminalNode.js'; @@ -10,7 +10,7 @@ import type * as ast from '@nomicfoundation/slang/ast'; import type { ParserOptions } from 'prettier'; import type { AstNode } from './types.d.ts'; -export class VariableDeclarationType extends SlangNode { +export class VariableDeclarationType extends PolymorphicNode { readonly kind = NonterminalKind.VariableDeclarationType; variant: TypeName | TerminalNode; diff --git a/src/slang-nodes/VersionExpression.ts b/src/slang-nodes/VersionExpression.ts index 1385e3ee3..abb1cb85c 100644 --- a/src/slang-nodes/VersionExpression.ts +++ b/src/slang-nodes/VersionExpression.ts @@ -1,6 +1,6 @@ import * as ast from '@nomicfoundation/slang/ast'; import { NonterminalKind } from '@nomicfoundation/slang/cst'; -import { SlangNode } from './SlangNode.js'; +import { PolymorphicNode } from './PolymorphicNode.js'; import { VersionRange } from './VersionRange.js'; import { VersionTerm } from './VersionTerm.js'; @@ -17,7 +17,7 @@ function createNonterminalVariant( return exhaustiveCheck; } -export class VersionExpression extends SlangNode { +export class VersionExpression extends PolymorphicNode { readonly kind = NonterminalKind.VersionExpression; variant: VersionRange | VersionTerm; diff --git a/src/slang-nodes/VersionLiteral.ts b/src/slang-nodes/VersionLiteral.ts index 6d13cfb2a..fa809017f 100644 --- a/src/slang-nodes/VersionLiteral.ts +++ b/src/slang-nodes/VersionLiteral.ts @@ -2,13 +2,13 @@ import { NonterminalKind, TerminalNode as SlangTerminalNode } from '@nomicfoundation/slang/cst'; -import { SlangNode } from './SlangNode.js'; +import { PolymorphicNode } from './PolymorphicNode.js'; import { SimpleVersionLiteral } from './SimpleVersionLiteral.js'; import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; -export class VersionLiteral extends SlangNode { +export class VersionLiteral extends PolymorphicNode { readonly kind = NonterminalKind.VersionLiteral; variant: SimpleVersionLiteral | TerminalNode; diff --git a/src/slang-nodes/YulAssignmentOperator.ts b/src/slang-nodes/YulAssignmentOperator.ts index e23ebed1b..c8453b73b 100644 --- a/src/slang-nodes/YulAssignmentOperator.ts +++ b/src/slang-nodes/YulAssignmentOperator.ts @@ -2,13 +2,13 @@ import { NonterminalKind, TerminalNode as SlangTerminalNode } from '@nomicfoundation/slang/cst'; -import { SlangNode } from './SlangNode.js'; +import { PolymorphicNode } from './PolymorphicNode.js'; import { YulColonAndEqual } from './YulColonAndEqual.js'; import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; -export class YulAssignmentOperator extends SlangNode { +export class YulAssignmentOperator extends PolymorphicNode { readonly kind = NonterminalKind.YulAssignmentOperator; variant: YulColonAndEqual | TerminalNode; diff --git a/src/slang-nodes/YulExpression.ts b/src/slang-nodes/YulExpression.ts index a4f0094f6..6afa8526f 100644 --- a/src/slang-nodes/YulExpression.ts +++ b/src/slang-nodes/YulExpression.ts @@ -1,6 +1,6 @@ import * as ast from '@nomicfoundation/slang/ast'; import { NonterminalKind } from '@nomicfoundation/slang/cst'; -import { SlangNode } from './SlangNode.js'; +import { PolymorphicNode } from './PolymorphicNode.js'; import { YulFunctionCallExpression } from './YulFunctionCallExpression.js'; import { YulLiteral } from './YulLiteral.js'; import { YulPath } from './YulPath.js'; @@ -25,7 +25,7 @@ function createNonterminalVariant( return exhaustiveCheck; } -export class YulExpression extends SlangNode { +export class YulExpression extends PolymorphicNode { readonly kind = NonterminalKind.YulExpression; variant: YulFunctionCallExpression | YulLiteral | YulPath; diff --git a/src/slang-nodes/YulLiteral.ts b/src/slang-nodes/YulLiteral.ts index 72ef74856..e79a7c97b 100644 --- a/src/slang-nodes/YulLiteral.ts +++ b/src/slang-nodes/YulLiteral.ts @@ -3,7 +3,7 @@ import { NonterminalKind, TerminalNode as SlangTerminalNode } from '@nomicfoundation/slang/cst'; -import { SlangNode } from './SlangNode.js'; +import { PolymorphicNode } from './PolymorphicNode.js'; import { HexStringLiteral } from './HexStringLiteral.js'; import { StringLiteral } from './StringLiteral.js'; import { TerminalNode } from './TerminalNode.js'; @@ -25,7 +25,7 @@ function createNonterminalVariant( return exhaustiveCheck; } -export class YulLiteral extends SlangNode { +export class YulLiteral extends PolymorphicNode { readonly kind = NonterminalKind.YulLiteral; variant: HexStringLiteral | StringLiteral | TerminalNode; diff --git a/src/slang-nodes/YulStackAssignmentOperator.ts b/src/slang-nodes/YulStackAssignmentOperator.ts index 0318ae8bf..9bcf338bd 100644 --- a/src/slang-nodes/YulStackAssignmentOperator.ts +++ b/src/slang-nodes/YulStackAssignmentOperator.ts @@ -2,13 +2,13 @@ import { NonterminalKind, TerminalNode as SlangTerminalNode } from '@nomicfoundation/slang/cst'; -import { SlangNode } from './SlangNode.js'; +import { PolymorphicNode } from './PolymorphicNode.js'; import { YulEqualAndColon } from './YulEqualAndColon.js'; import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; -export class YulStackAssignmentOperator extends SlangNode { +export class YulStackAssignmentOperator extends PolymorphicNode { readonly kind = NonterminalKind.YulStackAssignmentOperator; variant: YulEqualAndColon | TerminalNode; diff --git a/src/slang-nodes/YulStatement.ts b/src/slang-nodes/YulStatement.ts index efe91c786..234988692 100644 --- a/src/slang-nodes/YulStatement.ts +++ b/src/slang-nodes/YulStatement.ts @@ -1,6 +1,6 @@ import * as ast from '@nomicfoundation/slang/ast'; import { NonterminalKind } from '@nomicfoundation/slang/cst'; -import { SlangNode } from './SlangNode.js'; +import { PolymorphicNode } from './PolymorphicNode.js'; import { YulBlock } from './YulBlock.js'; import { YulFunctionDefinition } from './YulFunctionDefinition.js'; import { YulVariableDeclarationStatement } from './YulVariableDeclarationStatement.js'; @@ -65,7 +65,7 @@ function createNonterminalVariant( return exhaustiveCheck; } -export class YulStatement extends SlangNode { +export class YulStatement extends PolymorphicNode { readonly kind = NonterminalKind.YulStatement; variant: diff --git a/src/slang-nodes/YulSwitchCase.ts b/src/slang-nodes/YulSwitchCase.ts index 3c629e55b..12fedd3fb 100644 --- a/src/slang-nodes/YulSwitchCase.ts +++ b/src/slang-nodes/YulSwitchCase.ts @@ -1,6 +1,6 @@ import * as ast from '@nomicfoundation/slang/ast'; import { NonterminalKind } from '@nomicfoundation/slang/cst'; -import { SlangNode } from './SlangNode.js'; +import { PolymorphicNode } from './PolymorphicNode.js'; import { YulDefaultCase } from './YulDefaultCase.js'; import { YulValueCase } from './YulValueCase.js'; @@ -21,7 +21,7 @@ function createNonterminalVariant( return exhaustiveCheck; } -export class YulSwitchCase extends SlangNode { +export class YulSwitchCase extends PolymorphicNode { readonly kind = NonterminalKind.YulSwitchCase; variant: YulDefaultCase | YulValueCase; diff --git a/src/slang-utils/is-polymorphic-node.ts b/src/slang-utils/is-polymorphic-node.ts index ba7663e80..f549c66e6 100644 --- a/src/slang-utils/is-polymorphic-node.ts +++ b/src/slang-utils/is-polymorphic-node.ts @@ -1,7 +1,8 @@ +import { PolymorphicNode as PolymorphicNodeBase } from '../slang-nodes/PolymorphicNode.js'; import type { PolymorphicNode, StrictAstNode } from '../slang-nodes/types.d.ts'; export function isPolymorphicNode( node: StrictAstNode ): node is PolymorphicNode { - return typeof (node as PolymorphicNode).variant !== 'undefined'; + return node instanceof PolymorphicNodeBase; } diff --git a/src/slangPrinter.ts b/src/slangPrinter.ts index 0e6899755..6ce722030 100644 --- a/src/slangPrinter.ts +++ b/src/slangPrinter.ts @@ -58,8 +58,6 @@ function genericPrint( ): Doc { const node = path.node; - if (typeof node === 'string') return node; - if (hasNodeIgnoreComment(node)) { ignoreComments(path); From ff96bb7cfd8f77b2364edb8b0d465393d673f3a7 Mon Sep 17 00:00:00 2001 From: Klaus Date: Fri, 8 Aug 2025 16:57:37 +0100 Subject: [PATCH 3/4] PolymorphicNode now has a `print` function so there's no need for printing variant logic in `genericPrint` --- src/slang-nodes/PolymorphicNode.ts | 12 ++++++++++-- src/slang-utils/is-polymorphic-node.ts | 8 -------- src/slangPrinter.ts | 3 +-- 3 files changed, 11 insertions(+), 12 deletions(-) delete mode 100644 src/slang-utils/is-polymorphic-node.ts diff --git a/src/slang-nodes/PolymorphicNode.ts b/src/slang-nodes/PolymorphicNode.ts index bb04b2df6..e7ad45675 100644 --- a/src/slang-nodes/PolymorphicNode.ts +++ b/src/slang-nodes/PolymorphicNode.ts @@ -1,9 +1,17 @@ import { SlangNode } from './SlangNode.js'; -import type { SlangAstNode } from '../types.d.ts'; +import type { AstPath, Doc } from 'prettier'; +import type { PrintFunction, SlangAstNode } from '../types.d.ts'; +import type { StrictPolymorphicNode } from './types.js'; + +export abstract class PolymorphicNode extends SlangNode { + abstract variant: StrictPolymorphicNode['variant']; -export class PolymorphicNode extends SlangNode { constructor(ast: SlangAstNode) { super(ast); } + + print(path: AstPath, print: PrintFunction): Doc { + return path.call(print, 'variant'); + } } diff --git a/src/slang-utils/is-polymorphic-node.ts b/src/slang-utils/is-polymorphic-node.ts deleted file mode 100644 index f549c66e6..000000000 --- a/src/slang-utils/is-polymorphic-node.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { PolymorphicNode as PolymorphicNodeBase } from '../slang-nodes/PolymorphicNode.js'; -import type { PolymorphicNode, StrictAstNode } from '../slang-nodes/types.d.ts'; - -export function isPolymorphicNode( - node: StrictAstNode -): node is PolymorphicNode { - return node instanceof PolymorphicNodeBase; -} diff --git a/src/slangPrinter.ts b/src/slangPrinter.ts index 6ce722030..11de3e62a 100644 --- a/src/slangPrinter.ts +++ b/src/slangPrinter.ts @@ -1,6 +1,5 @@ import { isBlockComment } from './slang-utils/is-comment.js'; import { locEnd, locStart } from './slang-utils/loc.js'; -import { isPolymorphicNode } from './slang-utils/is-polymorphic-node.js'; import type { AstPath, Doc, ParserOptions } from 'prettier'; import type { AstNode, StrictAstNode } from './slang-nodes/types.d.ts'; @@ -29,6 +28,7 @@ function ignoreComments(path: AstPath): void { // parser. `updateMetadata` is an internal function. case 'kind': case 'loc': + case 'print': case 'updateMetadata': break; // The key `comments` will contain every comment for this node. @@ -64,7 +64,6 @@ function genericPrint( return options.originalText.slice(locStart(node), locEnd(node)); } - if (isPolymorphicNode(node)) return path.call(print, 'variant'); // Since each node has a print function with a specific AstPath, the union of // all nodes into AstNode creates a print function with an AstPath of the // intersection of all nodes. This forces us to cast this with a never type. From 2f27c0286598eeeab209c2642b54afea316b3732 Mon Sep 17 00:00:00 2001 From: Klaus Date: Fri, 8 Aug 2025 17:07:05 +0100 Subject: [PATCH 4/4] fixing extension --- .../handlers/handle-source-unit-members-comments.ts | 2 +- src/slang-nodes/PolymorphicNode.ts | 2 +- src/slang-nodes/TupleValues.ts | 2 +- src/slang-utils/sort-contract-specifiers.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/slang-comments/handlers/handle-source-unit-members-comments.ts b/src/slang-comments/handlers/handle-source-unit-members-comments.ts index 7b38df78a..d892ed9de 100644 --- a/src/slang-comments/handlers/handle-source-unit-members-comments.ts +++ b/src/slang-comments/handlers/handle-source-unit-members-comments.ts @@ -2,7 +2,7 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst'; import addCollectionFirstComment from './add-collection-first-comment.js'; import addCollectionLastComment from './add-collection-last-comment.js'; -import type { HandlerParams } from './types.js'; +import type { HandlerParams } from './types.d.ts'; export default function handleSourceUnitMembersComments({ precedingNode, diff --git a/src/slang-nodes/PolymorphicNode.ts b/src/slang-nodes/PolymorphicNode.ts index e7ad45675..2ff2cbbcf 100644 --- a/src/slang-nodes/PolymorphicNode.ts +++ b/src/slang-nodes/PolymorphicNode.ts @@ -2,7 +2,7 @@ import { SlangNode } from './SlangNode.js'; import type { AstPath, Doc } from 'prettier'; import type { PrintFunction, SlangAstNode } from '../types.d.ts'; -import type { StrictPolymorphicNode } from './types.js'; +import type { StrictPolymorphicNode } from './types.d.ts'; export abstract class PolymorphicNode extends SlangNode { abstract variant: StrictPolymorphicNode['variant']; diff --git a/src/slang-nodes/TupleValues.ts b/src/slang-nodes/TupleValues.ts index c27972f79..fe7ce741c 100644 --- a/src/slang-nodes/TupleValues.ts +++ b/src/slang-nodes/TupleValues.ts @@ -9,7 +9,7 @@ import type * as ast from '@nomicfoundation/slang/ast'; import type { AstPath, Doc, ParserOptions } from 'prettier'; import type { AstNode } from './types.d.ts'; import type { PrintFunction } from '../types.d.ts'; -import type { Expression } from './Expression.js'; +import type { Expression } from './Expression.ts'; export class TupleValues extends SlangNode { readonly kind = NonterminalKind.TupleValues; diff --git a/src/slang-utils/sort-contract-specifiers.ts b/src/slang-utils/sort-contract-specifiers.ts index 7f0614b65..4188c1353 100644 --- a/src/slang-utils/sort-contract-specifiers.ts +++ b/src/slang-utils/sort-contract-specifiers.ts @@ -1,6 +1,6 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst'; -import type { ContractSpecifier } from '../slang-nodes/ContractSpecifier.js'; +import type { ContractSpecifier } from '../slang-nodes/ContractSpecifier.ts'; export function sortContractSpecifiers( { variant: { kind: aKind } }: ContractSpecifier,