From 341938b1932bd038980c99fc24d2bfc63daa80bc Mon Sep 17 00:00:00 2001 From: Klaus Date: Mon, 21 Jul 2025 16:39:11 +0100 Subject: [PATCH 1/2] migrating `Identifier` and `YulIdentifier` to `TerminalNode` --- src/slang-nodes/AbicoderPragma.ts | 6 ++--- src/slang-nodes/AssignmentExpression.ts | 5 ++-- src/slang-nodes/CatchClauseError.ts | 6 ++--- src/slang-nodes/ConstantDefinition.ts | 6 ++--- src/slang-nodes/ContractDefinition.ts | 6 ++--- src/slang-nodes/EnumDefinition.ts | 6 ++--- src/slang-nodes/EnumMembers.ts | 6 ++--- src/slang-nodes/ErrorDefinition.ts | 6 ++--- src/slang-nodes/ErrorParameter.ts | 6 ++--- src/slang-nodes/EventDefinition.ts | 6 ++--- src/slang-nodes/EventParameter.ts | 6 ++--- src/slang-nodes/ExperimentalFeature.ts | 13 ++++++---- src/slang-nodes/Expression.ts | 17 +++++++------ src/slang-nodes/FunctionName.ts | 6 ++--- src/slang-nodes/Identifier.ts | 20 ---------------- src/slang-nodes/IdentifierPath.ts | 6 ++--- src/slang-nodes/ImportAlias.ts | 6 ++--- src/slang-nodes/ImportDeconstructionSymbol.ts | 6 ++--- src/slang-nodes/InterfaceDefinition.ts | 6 ++--- src/slang-nodes/LibraryDefinition.ts | 6 ++--- src/slang-nodes/MappingKey.ts | 6 ++--- src/slang-nodes/MappingValue.ts | 6 ++--- src/slang-nodes/MemberAccessExpression.ts | 6 ++--- src/slang-nodes/ModifierDefinition.ts | 6 ++--- src/slang-nodes/NamedArgument.ts | 6 ++--- src/slang-nodes/Parameter.ts | 6 ++--- src/slang-nodes/StateVariableDefinition.ts | 6 ++--- src/slang-nodes/StructDefinition.ts | 6 ++--- src/slang-nodes/StructMember.ts | 6 ++--- src/slang-nodes/TerminalNode.ts | 24 +++++++++++++++++++ src/slang-nodes/TupleValues.ts | 5 ++-- src/slang-nodes/TypedTupleMember.ts | 6 ++--- src/slang-nodes/UntypedTupleMember.ts | 6 ++--- .../UserDefinedValueTypeDefinition.ts | 6 ++--- .../VariableDeclarationStatement.ts | 6 ++--- src/slang-nodes/YulFunctionDefinition.ts | 6 ++--- src/slang-nodes/YulIdentifier.ts | 20 ---------------- src/slang-nodes/YulLabel.ts | 6 ++--- src/slang-nodes/YulParameters.ts | 6 ++--- src/slang-nodes/YulPath.ts | 6 ++--- .../YulStackAssignmentStatement.ts | 6 ++--- src/slang-nodes/YulVariableNames.ts | 6 ++--- src/slang-nodes/types.d.ts | 10 ++++---- .../create-binary-operation-printer.ts | 5 ++-- src/slang-utils/create-hug-function.ts | 5 ++-- 45 files changed, 163 insertions(+), 171 deletions(-) delete mode 100644 src/slang-nodes/Identifier.ts create mode 100644 src/slang-nodes/TerminalNode.ts delete mode 100644 src/slang-nodes/YulIdentifier.ts diff --git a/src/slang-nodes/AbicoderPragma.ts b/src/slang-nodes/AbicoderPragma.ts index 4ac460a1f..50e9a45b9 100644 --- a/src/slang-nodes/AbicoderPragma.ts +++ b/src/slang-nodes/AbicoderPragma.ts @@ -1,6 +1,6 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst'; import { SlangNode } from './SlangNode.js'; -import { Identifier } from './Identifier.js'; +import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; import type { AstPath, Doc } from 'prettier'; @@ -9,12 +9,12 @@ import type { PrintFunction } from '../types.d.ts'; export class AbicoderPragma extends SlangNode { readonly kind = NonterminalKind.AbicoderPragma; - version: Identifier; + version: TerminalNode; constructor(ast: ast.AbicoderPragma) { super(ast); - this.version = new Identifier(ast.version); + this.version = new TerminalNode(ast.version); } print(path: AstPath, print: PrintFunction): Doc { diff --git a/src/slang-nodes/AssignmentExpression.ts b/src/slang-nodes/AssignmentExpression.ts index 38aa55e19..c485651af 100644 --- a/src/slang-nodes/AssignmentExpression.ts +++ b/src/slang-nodes/AssignmentExpression.ts @@ -1,8 +1,9 @@ -import { NonterminalKind, TerminalKind } from '@nomicfoundation/slang/cst'; +import { NonterminalKind } from '@nomicfoundation/slang/cst'; import { isBinaryOperation } from '../slang-utils/is-binary-operation.js'; import { printIndentedGroupOrSpacedDocument } from '../slang-printers/print-indented-group-or-spaced-document.js'; import { SlangNode } from './SlangNode.js'; import { Expression } from './Expression.js'; +import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; import type { AstPath, Doc, ParserOptions } from 'prettier'; @@ -35,7 +36,7 @@ export class AssignmentExpression extends SlangNode { ` ${this.operator}`, printIndentedGroupOrSpacedDocument( path.call(print, 'rightOperand'), - rightOperandVariant.kind !== TerminalKind.Identifier && + !(rightOperandVariant instanceof TerminalNode) && isBinaryOperation(rightOperandVariant) ) ]; diff --git a/src/slang-nodes/CatchClauseError.ts b/src/slang-nodes/CatchClauseError.ts index 5646f2534..0b208d998 100644 --- a/src/slang-nodes/CatchClauseError.ts +++ b/src/slang-nodes/CatchClauseError.ts @@ -1,7 +1,7 @@ import { doc } from 'prettier'; import { NonterminalKind } from '@nomicfoundation/slang/cst'; import { SlangNode } from './SlangNode.js'; -import { Identifier } from './Identifier.js'; +import { TerminalNode } from './TerminalNode.js'; import { ParametersDeclaration } from './ParametersDeclaration.js'; import type * as ast from '@nomicfoundation/slang/ast'; @@ -14,7 +14,7 @@ const { group } = doc.builders; export class CatchClauseError extends SlangNode { readonly kind = NonterminalKind.CatchClauseError; - name?: Identifier; + name?: TerminalNode; parameters: ParametersDeclaration; @@ -22,7 +22,7 @@ export class CatchClauseError extends SlangNode { super(ast); if (ast.name) { - this.name = new Identifier(ast.name); + this.name = new TerminalNode(ast.name); } this.parameters = new ParametersDeclaration(ast.parameters, options); diff --git a/src/slang-nodes/ConstantDefinition.ts b/src/slang-nodes/ConstantDefinition.ts index 529bd2eb5..a80d6d2e9 100644 --- a/src/slang-nodes/ConstantDefinition.ts +++ b/src/slang-nodes/ConstantDefinition.ts @@ -1,7 +1,7 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst'; import { SlangNode } from './SlangNode.js'; import { TypeName } from './TypeName.js'; -import { Identifier } from './Identifier.js'; +import { TerminalNode } from './TerminalNode.js'; import { Expression } from './Expression.js'; import type * as ast from '@nomicfoundation/slang/ast'; @@ -14,7 +14,7 @@ export class ConstantDefinition extends SlangNode { typeName: TypeName; - name: Identifier; + name: TerminalNode; value: Expression; @@ -22,7 +22,7 @@ export class ConstantDefinition extends SlangNode { super(ast); this.typeName = new TypeName(ast.typeName, options); - this.name = new Identifier(ast.name); + this.name = new TerminalNode(ast.name); this.value = new Expression(ast.value, options); this.updateMetadata(this.typeName, this.value); diff --git a/src/slang-nodes/ContractDefinition.ts b/src/slang-nodes/ContractDefinition.ts index 363746997..084b3a0a1 100644 --- a/src/slang-nodes/ContractDefinition.ts +++ b/src/slang-nodes/ContractDefinition.ts @@ -2,7 +2,7 @@ import { doc } from 'prettier'; import { satisfies } from 'semver'; import { NonterminalKind } from '@nomicfoundation/slang/cst'; import { SlangNode } from './SlangNode.js'; -import { Identifier } from './Identifier.js'; +import { TerminalNode } from './TerminalNode.js'; import { ContractSpecifiers } from './ContractSpecifiers.js'; import { ContractMembers } from './ContractMembers.js'; @@ -18,7 +18,7 @@ export class ContractDefinition extends SlangNode { abstractKeyword?: string; - name: Identifier; + name: TerminalNode; specifiers: ContractSpecifiers; @@ -28,7 +28,7 @@ export class ContractDefinition extends SlangNode { super(ast); this.abstractKeyword = ast.abstractKeyword?.unparse(); - this.name = new Identifier(ast.name); + this.name = new TerminalNode(ast.name); this.specifiers = new ContractSpecifiers(ast.specifiers, options); this.members = new ContractMembers(ast.members, options); diff --git a/src/slang-nodes/EnumDefinition.ts b/src/slang-nodes/EnumDefinition.ts index 7df5b8fe7..a0b287b23 100644 --- a/src/slang-nodes/EnumDefinition.ts +++ b/src/slang-nodes/EnumDefinition.ts @@ -1,6 +1,6 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst'; import { SlangNode } from './SlangNode.js'; -import { Identifier } from './Identifier.js'; +import { TerminalNode } from './TerminalNode.js'; import { EnumMembers } from './EnumMembers.js'; import type * as ast from '@nomicfoundation/slang/ast'; @@ -10,14 +10,14 @@ import type { PrintFunction } from '../types.d.ts'; export class EnumDefinition extends SlangNode { readonly kind = NonterminalKind.EnumDefinition; - name: Identifier; + name: TerminalNode; members: EnumMembers; constructor(ast: ast.EnumDefinition) { super(ast); - this.name = new Identifier(ast.name); + this.name = new TerminalNode(ast.name); this.members = new EnumMembers(ast.members); this.updateMetadata(this.members); diff --git a/src/slang-nodes/EnumMembers.ts b/src/slang-nodes/EnumMembers.ts index 1925635d6..32ed21076 100644 --- a/src/slang-nodes/EnumMembers.ts +++ b/src/slang-nodes/EnumMembers.ts @@ -2,7 +2,7 @@ import { doc } from 'prettier'; import { NonterminalKind } from '@nomicfoundation/slang/cst'; import { printSeparatedList } from '../slang-printers/print-separated-list.js'; import { SlangNode } from './SlangNode.js'; -import { Identifier } from './Identifier.js'; +import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; import type { AstPath, Doc } from 'prettier'; @@ -13,12 +13,12 @@ const { hardline } = doc.builders; export class EnumMembers extends SlangNode { readonly kind = NonterminalKind.EnumMembers; - items: Identifier[]; + items: TerminalNode[]; constructor(ast: ast.EnumMembers) { super(ast, true); - this.items = ast.items.map((item) => new Identifier(item)); + this.items = ast.items.map((item) => new TerminalNode(item)); } print(path: AstPath, print: PrintFunction): Doc { diff --git a/src/slang-nodes/ErrorDefinition.ts b/src/slang-nodes/ErrorDefinition.ts index e1534cd3c..4fcbd2890 100644 --- a/src/slang-nodes/ErrorDefinition.ts +++ b/src/slang-nodes/ErrorDefinition.ts @@ -1,6 +1,6 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst'; import { SlangNode } from './SlangNode.js'; -import { Identifier } from './Identifier.js'; +import { TerminalNode } from './TerminalNode.js'; import { ErrorParametersDeclaration } from './ErrorParametersDeclaration.js'; import type * as ast from '@nomicfoundation/slang/ast'; @@ -11,14 +11,14 @@ import type { PrintFunction } from '../types.d.ts'; export class ErrorDefinition extends SlangNode { readonly kind = NonterminalKind.ErrorDefinition; - name: Identifier; + name: TerminalNode; members: ErrorParametersDeclaration; constructor(ast: ast.ErrorDefinition, options: ParserOptions) { super(ast); - this.name = new Identifier(ast.name); + this.name = new TerminalNode(ast.name); this.members = new ErrorParametersDeclaration(ast.members, options); this.updateMetadata(this.members); diff --git a/src/slang-nodes/ErrorParameter.ts b/src/slang-nodes/ErrorParameter.ts index 4f65a94f4..b7bfcf22f 100644 --- a/src/slang-nodes/ErrorParameter.ts +++ b/src/slang-nodes/ErrorParameter.ts @@ -2,7 +2,7 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst'; import { joinExisting } from '../slang-utils/join-existing.js'; import { SlangNode } from './SlangNode.js'; import { TypeName } from './TypeName.js'; -import { Identifier } from './Identifier.js'; +import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; import type { AstPath, Doc, ParserOptions } from 'prettier'; @@ -14,14 +14,14 @@ export class ErrorParameter extends SlangNode { typeName: TypeName; - name?: Identifier; + name?: TerminalNode; constructor(ast: ast.ErrorParameter, options: ParserOptions) { super(ast); this.typeName = new TypeName(ast.typeName, options); if (ast.name) { - this.name = new Identifier(ast.name); + this.name = new TerminalNode(ast.name); } this.updateMetadata(this.typeName); diff --git a/src/slang-nodes/EventDefinition.ts b/src/slang-nodes/EventDefinition.ts index f981bece9..8b83715b2 100644 --- a/src/slang-nodes/EventDefinition.ts +++ b/src/slang-nodes/EventDefinition.ts @@ -1,7 +1,7 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst'; import { SlangNode } from './SlangNode.js'; import { EventParametersDeclaration } from './EventParametersDeclaration.js'; -import { Identifier } from './Identifier.js'; +import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; import type { AstPath, Doc, ParserOptions } from 'prettier'; @@ -11,7 +11,7 @@ import type { PrintFunction } from '../types.d.ts'; export class EventDefinition extends SlangNode { readonly kind = NonterminalKind.EventDefinition; - name: Identifier; + name: TerminalNode; parameters: EventParametersDeclaration; @@ -20,7 +20,7 @@ export class EventDefinition extends SlangNode { constructor(ast: ast.EventDefinition, options: ParserOptions) { super(ast); - this.name = new Identifier(ast.name); + this.name = new TerminalNode(ast.name); this.parameters = new EventParametersDeclaration(ast.parameters, options); this.anonymousKeyword = ast.anonymousKeyword?.unparse(); diff --git a/src/slang-nodes/EventParameter.ts b/src/slang-nodes/EventParameter.ts index 43b917691..5f7109b6b 100644 --- a/src/slang-nodes/EventParameter.ts +++ b/src/slang-nodes/EventParameter.ts @@ -2,7 +2,7 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst'; import { joinExisting } from '../slang-utils/join-existing.js'; import { SlangNode } from './SlangNode.js'; import { TypeName } from './TypeName.js'; -import { Identifier } from './Identifier.js'; +import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; import type { AstPath, Doc, ParserOptions } from 'prettier'; @@ -16,7 +16,7 @@ export class EventParameter extends SlangNode { indexedKeyword?: string; - name?: Identifier; + name?: TerminalNode; constructor(ast: ast.EventParameter, options: ParserOptions) { super(ast); @@ -24,7 +24,7 @@ export class EventParameter extends SlangNode { this.typeName = new TypeName(ast.typeName, options); this.indexedKeyword = ast.indexedKeyword?.unparse(); if (ast.name) { - this.name = new Identifier(ast.name); + this.name = new TerminalNode(ast.name); } this.updateMetadata(this.typeName); diff --git a/src/slang-nodes/ExperimentalFeature.ts b/src/slang-nodes/ExperimentalFeature.ts index b6fa3fad8..7364b0cc3 100644 --- a/src/slang-nodes/ExperimentalFeature.ts +++ b/src/slang-nodes/ExperimentalFeature.ts @@ -1,7 +1,10 @@ -import { NonterminalKind, TerminalNode } from '@nomicfoundation/slang/cst'; +import { + NonterminalKind, + TerminalNode as SlangTerminalNode +} from '@nomicfoundation/slang/cst'; import { SlangNode } from './SlangNode.js'; import { StringLiteral } from './StringLiteral.js'; -import { Identifier } from './Identifier.js'; +import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; import type { AstPath, Doc, ParserOptions } from 'prettier'; @@ -11,14 +14,14 @@ import type { PrintFunction } from '../types.d.ts'; export class ExperimentalFeature extends SlangNode { readonly kind = NonterminalKind.ExperimentalFeature; - variant: StringLiteral | Identifier; + variant: StringLiteral | TerminalNode; constructor(ast: ast.ExperimentalFeature, options: ParserOptions) { super(ast); const variant = ast.variant; - if (variant instanceof TerminalNode) { - this.variant = new Identifier(variant); + if (variant instanceof SlangTerminalNode) { + this.variant = new TerminalNode(variant); return; } this.variant = new StringLiteral(variant, options); diff --git a/src/slang-nodes/Expression.ts b/src/slang-nodes/Expression.ts index 0d21154e0..9a36fd982 100644 --- a/src/slang-nodes/Expression.ts +++ b/src/slang-nodes/Expression.ts @@ -1,5 +1,8 @@ import * as ast from '@nomicfoundation/slang/ast'; -import { NonterminalKind, TerminalNode } from '@nomicfoundation/slang/cst'; +import { + NonterminalKind, + TerminalNode as SlangTerminalNode +} from '@nomicfoundation/slang/cst'; import { SlangNode } from './SlangNode.js'; import { AssignmentExpression } from './AssignmentExpression.js'; import { ConditionalExpression } from './ConditionalExpression.js'; @@ -28,16 +31,16 @@ import { HexNumberExpression } from './HexNumberExpression.js'; import { DecimalNumberExpression } from './DecimalNumberExpression.js'; import { StringExpression } from './StringExpression.js'; import { ElementaryType } from './ElementaryType.js'; -import { Identifier } from './Identifier.js'; +import { TerminalNode } from './TerminalNode.js'; import type { AstPath, Doc, ParserOptions } from 'prettier'; import type { AstNode } from './types.d.ts'; import type { PrintFunction } from '../types.d.ts'; function createNonterminalVariant( - variant: Exclude, + variant: Exclude, options: ParserOptions -): Exclude { +): Exclude { if (variant instanceof ast.AssignmentExpression) { return new AssignmentExpression(variant, options); } @@ -154,14 +157,14 @@ export class Expression extends SlangNode { | DecimalNumberExpression | StringExpression | ElementaryType - | Identifier; + | TerminalNode; constructor(ast: ast.Expression, options: ParserOptions) { super(ast); const variant = ast.variant; - if (variant instanceof TerminalNode) { - this.variant = new Identifier(variant); + if (variant instanceof SlangTerminalNode) { + this.variant = new TerminalNode(variant); return; } this.variant = createNonterminalVariant(variant, options); diff --git a/src/slang-nodes/FunctionName.ts b/src/slang-nodes/FunctionName.ts index aadb33458..6c559aaaf 100644 --- a/src/slang-nodes/FunctionName.ts +++ b/src/slang-nodes/FunctionName.ts @@ -1,6 +1,6 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst'; import { SlangNode } from './SlangNode.js'; -import { Identifier } from './Identifier.js'; +import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; import type { AstPath, Doc } from 'prettier'; @@ -9,12 +9,12 @@ import type { PrintFunction } from '../types.d.ts'; export class FunctionName extends SlangNode { readonly kind = NonterminalKind.FunctionName; - variant: Identifier; + variant: TerminalNode; constructor(ast: ast.FunctionName) { super(ast); - this.variant = new Identifier(ast.variant); + this.variant = new TerminalNode(ast.variant); } print(path: AstPath, print: PrintFunction): Doc { diff --git a/src/slang-nodes/Identifier.ts b/src/slang-nodes/Identifier.ts deleted file mode 100644 index 4adeef1b0..000000000 --- a/src/slang-nodes/Identifier.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { TerminalKind, TerminalNode } from '@nomicfoundation/slang/cst'; -import { SlangNode } from './SlangNode.js'; - -import type { Doc } from 'prettier'; - -export class Identifier extends SlangNode { - readonly kind = TerminalKind.Identifier; - - value: string; - - constructor(ast: TerminalNode) { - super(ast); - - this.value = ast.unparse(); - } - - print(): Doc { - return this.value; - } -} diff --git a/src/slang-nodes/IdentifierPath.ts b/src/slang-nodes/IdentifierPath.ts index 5406c7909..603341e41 100644 --- a/src/slang-nodes/IdentifierPath.ts +++ b/src/slang-nodes/IdentifierPath.ts @@ -1,7 +1,7 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst'; import { doc } from 'prettier'; import { SlangNode } from './SlangNode.js'; -import { Identifier } from './Identifier.js'; +import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; import type { AstPath, Doc } from 'prettier'; @@ -12,12 +12,12 @@ const { join } = doc.builders; export class IdentifierPath extends SlangNode { readonly kind = NonterminalKind.IdentifierPath; - items: Identifier[]; + items: TerminalNode[]; constructor(ast: ast.IdentifierPath) { super(ast); - this.items = ast.items.map((item) => new Identifier(item)); + this.items = ast.items.map((item) => new TerminalNode(item)); } print(path: AstPath, print: PrintFunction): Doc { diff --git a/src/slang-nodes/ImportAlias.ts b/src/slang-nodes/ImportAlias.ts index 0287674d5..41784d029 100644 --- a/src/slang-nodes/ImportAlias.ts +++ b/src/slang-nodes/ImportAlias.ts @@ -1,6 +1,6 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst'; import { SlangNode } from './SlangNode.js'; -import { Identifier } from './Identifier.js'; +import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; import type { AstPath, Doc } from 'prettier'; @@ -9,12 +9,12 @@ import type { PrintFunction } from '../types.d.ts'; export class ImportAlias extends SlangNode { readonly kind = NonterminalKind.ImportAlias; - identifier: Identifier; + identifier: TerminalNode; constructor(ast: ast.ImportAlias) { super(ast); - this.identifier = new Identifier(ast.identifier); + this.identifier = new TerminalNode(ast.identifier); } print(path: AstPath, print: PrintFunction): Doc { diff --git a/src/slang-nodes/ImportDeconstructionSymbol.ts b/src/slang-nodes/ImportDeconstructionSymbol.ts index 250a28c1d..a2764196e 100644 --- a/src/slang-nodes/ImportDeconstructionSymbol.ts +++ b/src/slang-nodes/ImportDeconstructionSymbol.ts @@ -1,6 +1,6 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst'; import { SlangNode } from './SlangNode.js'; -import { Identifier } from './Identifier.js'; +import { TerminalNode } from './TerminalNode.js'; import { ImportAlias } from './ImportAlias.js'; import type * as ast from '@nomicfoundation/slang/ast'; @@ -10,14 +10,14 @@ import type { PrintFunction } from '../types.d.ts'; export class ImportDeconstructionSymbol extends SlangNode { readonly kind = NonterminalKind.ImportDeconstructionSymbol; - name: Identifier; + name: TerminalNode; alias?: ImportAlias; constructor(ast: ast.ImportDeconstructionSymbol) { super(ast); - this.name = new Identifier(ast.name); + this.name = new TerminalNode(ast.name); if (ast.alias) { this.alias = new ImportAlias(ast.alias); } diff --git a/src/slang-nodes/InterfaceDefinition.ts b/src/slang-nodes/InterfaceDefinition.ts index 547668125..dfdb42990 100644 --- a/src/slang-nodes/InterfaceDefinition.ts +++ b/src/slang-nodes/InterfaceDefinition.ts @@ -1,7 +1,7 @@ import { doc } from 'prettier'; import { NonterminalKind } from '@nomicfoundation/slang/cst'; import { SlangNode } from './SlangNode.js'; -import { Identifier } from './Identifier.js'; +import { TerminalNode } from './TerminalNode.js'; import { InheritanceSpecifier } from './InheritanceSpecifier.js'; import { InterfaceMembers } from './InterfaceMembers.js'; @@ -15,7 +15,7 @@ const { group, line } = doc.builders; export class InterfaceDefinition extends SlangNode { readonly kind = NonterminalKind.InterfaceDefinition; - name: Identifier; + name: TerminalNode; inheritance?: InheritanceSpecifier; @@ -24,7 +24,7 @@ export class InterfaceDefinition extends SlangNode { constructor(ast: ast.InterfaceDefinition, options: ParserOptions) { super(ast); - this.name = new Identifier(ast.name); + this.name = new TerminalNode(ast.name); if (ast.inheritance) { this.inheritance = new InheritanceSpecifier(ast.inheritance, options); } diff --git a/src/slang-nodes/LibraryDefinition.ts b/src/slang-nodes/LibraryDefinition.ts index 01fff5014..25ed97746 100644 --- a/src/slang-nodes/LibraryDefinition.ts +++ b/src/slang-nodes/LibraryDefinition.ts @@ -1,7 +1,7 @@ import { doc } from 'prettier'; import { NonterminalKind } from '@nomicfoundation/slang/cst'; import { SlangNode } from './SlangNode.js'; -import { Identifier } from './Identifier.js'; +import { TerminalNode } from './TerminalNode.js'; import { LibraryMembers } from './LibraryMembers.js'; import type * as ast from '@nomicfoundation/slang/ast'; @@ -14,14 +14,14 @@ const { group, line } = doc.builders; export class LibraryDefinition extends SlangNode { readonly kind = NonterminalKind.LibraryDefinition; - name: Identifier; + name: TerminalNode; members: LibraryMembers; constructor(ast: ast.LibraryDefinition, options: ParserOptions) { super(ast); - this.name = new Identifier(ast.name); + this.name = new TerminalNode(ast.name); this.members = new LibraryMembers(ast.members, options); this.updateMetadata(this.members); diff --git a/src/slang-nodes/MappingKey.ts b/src/slang-nodes/MappingKey.ts index 6b35477d2..07a53fe46 100644 --- a/src/slang-nodes/MappingKey.ts +++ b/src/slang-nodes/MappingKey.ts @@ -2,7 +2,7 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst'; import { joinExisting } from '../slang-utils/join-existing.js'; import { SlangNode } from './SlangNode.js'; import { MappingKeyType } from './MappingKeyType.js'; -import { Identifier } from './Identifier.js'; +import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; import type { AstPath, Doc } from 'prettier'; @@ -13,14 +13,14 @@ export class MappingKey extends SlangNode { keyType: MappingKeyType; - name?: Identifier; + name?: TerminalNode; constructor(ast: ast.MappingKey) { super(ast); this.keyType = new MappingKeyType(ast.keyType); if (ast.name) { - this.name = new Identifier(ast.name); + this.name = new TerminalNode(ast.name); } this.updateMetadata(this.keyType); diff --git a/src/slang-nodes/MappingValue.ts b/src/slang-nodes/MappingValue.ts index 5b266d5d5..ba459b26c 100644 --- a/src/slang-nodes/MappingValue.ts +++ b/src/slang-nodes/MappingValue.ts @@ -2,7 +2,7 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst'; import { joinExisting } from '../slang-utils/join-existing.js'; import { SlangNode } from './SlangNode.js'; import { TypeName } from './TypeName.js'; -import { Identifier } from './Identifier.js'; +import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; import type { AstPath, Doc, ParserOptions } from 'prettier'; @@ -14,14 +14,14 @@ export class MappingValue extends SlangNode { typeName: TypeName; - name?: Identifier; + name?: TerminalNode; constructor(ast: ast.MappingValue, options: ParserOptions) { super(ast); this.typeName = new TypeName(ast.typeName, options); if (ast.name) { - this.name = new Identifier(ast.name); + this.name = new TerminalNode(ast.name); } this.updateMetadata(this.typeName); diff --git a/src/slang-nodes/MemberAccessExpression.ts b/src/slang-nodes/MemberAccessExpression.ts index 159644f24..ee2fb9da0 100644 --- a/src/slang-nodes/MemberAccessExpression.ts +++ b/src/slang-nodes/MemberAccessExpression.ts @@ -4,7 +4,7 @@ import { isLabel } from '../slang-utils/is-label.js'; import { createKindCheckFunction } from '../slang-utils/create-kind-check-function.js'; import { SlangNode } from './SlangNode.js'; import { Expression } from './Expression.js'; -import { Identifier } from './Identifier.js'; +import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; import type { AstPath, Doc, ParserOptions } from 'prettier'; @@ -116,7 +116,7 @@ export class MemberAccessExpression extends SlangNode { operand: Expression; - member: Identifier; + member: TerminalNode; constructor( ast: ast.MemberAccessExpression, @@ -125,7 +125,7 @@ export class MemberAccessExpression extends SlangNode { super(ast); this.operand = new Expression(ast.operand, options); - this.member = new Identifier(ast.member); + this.member = new TerminalNode(ast.member); this.updateMetadata(this.operand); } diff --git a/src/slang-nodes/ModifierDefinition.ts b/src/slang-nodes/ModifierDefinition.ts index f3f1d52ff..739bdd866 100644 --- a/src/slang-nodes/ModifierDefinition.ts +++ b/src/slang-nodes/ModifierDefinition.ts @@ -1,7 +1,7 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst'; import { printFunction } from '../slang-printers/print-function.js'; import { SlangNode } from './SlangNode.js'; -import { Identifier } from './Identifier.js'; +import { TerminalNode } from './TerminalNode.js'; import { ParametersDeclaration } from './ParametersDeclaration.js'; import { Parameters } from './Parameters.js'; import { ModifierAttributes } from './ModifierAttributes.js'; @@ -15,7 +15,7 @@ import type { PrintFunction } from '../types.d.ts'; export class ModifierDefinition extends SlangNode { readonly kind = NonterminalKind.ModifierDefinition; - name: Identifier; + name: TerminalNode; parameters?: ParametersDeclaration; @@ -26,7 +26,7 @@ export class ModifierDefinition extends SlangNode { constructor(ast: ast.ModifierDefinition, options: ParserOptions) { super(ast); - this.name = new Identifier(ast.name); + this.name = new TerminalNode(ast.name); if (ast.parameters) { this.parameters = new ParametersDeclaration(ast.parameters, options); } diff --git a/src/slang-nodes/NamedArgument.ts b/src/slang-nodes/NamedArgument.ts index 3d00709f8..de89e2d91 100644 --- a/src/slang-nodes/NamedArgument.ts +++ b/src/slang-nodes/NamedArgument.ts @@ -1,6 +1,6 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst'; import { SlangNode } from './SlangNode.js'; -import { Identifier } from './Identifier.js'; +import { TerminalNode } from './TerminalNode.js'; import { Expression } from './Expression.js'; import type * as ast from '@nomicfoundation/slang/ast'; @@ -11,14 +11,14 @@ import type { PrintFunction } from '../types.d.ts'; export class NamedArgument extends SlangNode { readonly kind = NonterminalKind.NamedArgument; - name: Identifier; + name: TerminalNode; value: Expression; constructor(ast: ast.NamedArgument, options: ParserOptions) { super(ast); - this.name = new Identifier(ast.name); + this.name = new TerminalNode(ast.name); this.value = new Expression(ast.value, options); this.updateMetadata(this.value); diff --git a/src/slang-nodes/Parameter.ts b/src/slang-nodes/Parameter.ts index 45b693048..df9038ca4 100644 --- a/src/slang-nodes/Parameter.ts +++ b/src/slang-nodes/Parameter.ts @@ -4,7 +4,7 @@ import { joinExisting } from '../slang-utils/join-existing.js'; import { SlangNode } from './SlangNode.js'; import { TypeName } from './TypeName.js'; import { StorageLocation } from './StorageLocation.js'; -import { Identifier } from './Identifier.js'; +import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; import type { AstPath, Doc, ParserOptions } from 'prettier'; @@ -20,7 +20,7 @@ export class Parameter extends SlangNode { storageLocation?: StorageLocation; - name?: Identifier; + name?: TerminalNode; constructor(ast: ast.Parameter, options: ParserOptions) { super(ast); @@ -30,7 +30,7 @@ export class Parameter extends SlangNode { this.storageLocation = new StorageLocation(ast.storageLocation); } if (ast.name) { - this.name = new Identifier(ast.name); + this.name = new TerminalNode(ast.name); } this.updateMetadata(this.typeName, this.storageLocation); diff --git a/src/slang-nodes/StateVariableDefinition.ts b/src/slang-nodes/StateVariableDefinition.ts index 49bb4e628..f0985cdb6 100644 --- a/src/slang-nodes/StateVariableDefinition.ts +++ b/src/slang-nodes/StateVariableDefinition.ts @@ -4,7 +4,7 @@ import { printGroupAndIndentIfBreakPair } from '../slang-printers/print-group-an import { SlangNode } from './SlangNode.js'; import { TypeName } from './TypeName.js'; import { StateVariableAttributes } from './StateVariableAttributes.js'; -import { Identifier } from './Identifier.js'; +import { TerminalNode } from './TerminalNode.js'; import { StateVariableDefinitionValue } from './StateVariableDefinitionValue.js'; import type * as ast from '@nomicfoundation/slang/ast'; @@ -21,7 +21,7 @@ export class StateVariableDefinition extends SlangNode { attributes: StateVariableAttributes; - name: Identifier; + name: TerminalNode; value?: StateVariableDefinitionValue; @@ -33,7 +33,7 @@ export class StateVariableDefinition extends SlangNode { this.typeName = new TypeName(ast.typeName, options); this.attributes = new StateVariableAttributes(ast.attributes); - this.name = new Identifier(ast.name); + this.name = new TerminalNode(ast.name); if (ast.value) { this.value = new StateVariableDefinitionValue(ast.value, options); } diff --git a/src/slang-nodes/StructDefinition.ts b/src/slang-nodes/StructDefinition.ts index 3ad3a4c00..30173765f 100644 --- a/src/slang-nodes/StructDefinition.ts +++ b/src/slang-nodes/StructDefinition.ts @@ -1,6 +1,6 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst'; import { SlangNode } from './SlangNode.js'; -import { Identifier } from './Identifier.js'; +import { TerminalNode } from './TerminalNode.js'; import { StructMembers } from './StructMembers.js'; import type * as ast from '@nomicfoundation/slang/ast'; @@ -11,14 +11,14 @@ import type { PrintFunction } from '../types.d.ts'; export class StructDefinition extends SlangNode { readonly kind = NonterminalKind.StructDefinition; - name: Identifier; + name: TerminalNode; members: StructMembers; constructor(ast: ast.StructDefinition, options: ParserOptions) { super(ast); - this.name = new Identifier(ast.name); + this.name = new TerminalNode(ast.name); this.members = new StructMembers(ast.members, options); this.updateMetadata(this.members); diff --git a/src/slang-nodes/StructMember.ts b/src/slang-nodes/StructMember.ts index a6e5e5f91..06deb4555 100644 --- a/src/slang-nodes/StructMember.ts +++ b/src/slang-nodes/StructMember.ts @@ -1,7 +1,7 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst'; import { SlangNode } from './SlangNode.js'; import { TypeName } from './TypeName.js'; -import { Identifier } from './Identifier.js'; +import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; import type { AstPath, Doc, ParserOptions } from 'prettier'; @@ -13,13 +13,13 @@ export class StructMember extends SlangNode { typeName: TypeName; - name: Identifier; + name: TerminalNode; constructor(ast: ast.StructMember, options: ParserOptions) { super(ast); this.typeName = new TypeName(ast.typeName, options); - this.name = new Identifier(ast.name); + this.name = new TerminalNode(ast.name); this.updateMetadata(this.typeName); } diff --git a/src/slang-nodes/TerminalNode.ts b/src/slang-nodes/TerminalNode.ts new file mode 100644 index 000000000..f5f8b12a0 --- /dev/null +++ b/src/slang-nodes/TerminalNode.ts @@ -0,0 +1,24 @@ +import { + TerminalKind, + TerminalNode as SlangTerminalNode +} from '@nomicfoundation/slang/cst'; +import { SlangNode } from './SlangNode.js'; + +import type { Doc } from 'prettier'; + +export class TerminalNode extends SlangNode { + kind: TerminalKind; + + value: string; + + constructor(ast: SlangTerminalNode) { + super(ast); + + this.kind = ast.kind; + this.value = ast.unparse(); + } + + print(): Doc { + return this.value; + } +} diff --git a/src/slang-nodes/TupleValues.ts b/src/slang-nodes/TupleValues.ts index fb707fb61..c27972f79 100644 --- a/src/slang-nodes/TupleValues.ts +++ b/src/slang-nodes/TupleValues.ts @@ -1,8 +1,9 @@ -import { NonterminalKind, TerminalKind } from '@nomicfoundation/slang/cst'; +import { NonterminalKind } from '@nomicfoundation/slang/cst'; import { printSeparatedList } from '../slang-printers/print-separated-list.js'; import { isBinaryOperation } from '../slang-utils/is-binary-operation.js'; import { SlangNode } from './SlangNode.js'; import { TupleValue } from './TupleValue.js'; +import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; import type { AstPath, Doc, ParserOptions } from 'prettier'; @@ -32,7 +33,7 @@ export class TupleValues extends SlangNode { const singleExpressionVariant = this.getSingleExpression()?.variant; const items = path.map(print, 'items'); return singleExpressionVariant && - singleExpressionVariant.kind !== TerminalKind.Identifier && + !(singleExpressionVariant instanceof TerminalNode) && isBinaryOperation(singleExpressionVariant) ? items : printSeparatedList(items); diff --git a/src/slang-nodes/TypedTupleMember.ts b/src/slang-nodes/TypedTupleMember.ts index 691f05445..53b32d058 100644 --- a/src/slang-nodes/TypedTupleMember.ts +++ b/src/slang-nodes/TypedTupleMember.ts @@ -3,7 +3,7 @@ import { joinExisting } from '../slang-utils/join-existing.js'; import { SlangNode } from './SlangNode.js'; import { TypeName } from './TypeName.js'; import { StorageLocation } from './StorageLocation.js'; -import { Identifier } from './Identifier.js'; +import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; import type { AstPath, Doc, ParserOptions } from 'prettier'; @@ -17,7 +17,7 @@ export class TypedTupleMember extends SlangNode { storageLocation?: StorageLocation; - name: Identifier; + name: TerminalNode; constructor(ast: ast.TypedTupleMember, options: ParserOptions) { super(ast); @@ -26,7 +26,7 @@ export class TypedTupleMember extends SlangNode { if (ast.storageLocation) { this.storageLocation = new StorageLocation(ast.storageLocation); } - this.name = new Identifier(ast.name); + this.name = new TerminalNode(ast.name); this.updateMetadata(this.typeName, this.storageLocation); } diff --git a/src/slang-nodes/UntypedTupleMember.ts b/src/slang-nodes/UntypedTupleMember.ts index bdd157831..3220fe913 100644 --- a/src/slang-nodes/UntypedTupleMember.ts +++ b/src/slang-nodes/UntypedTupleMember.ts @@ -2,7 +2,7 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst'; import { joinExisting } from '../slang-utils/join-existing.js'; import { SlangNode } from './SlangNode.js'; import { StorageLocation } from './StorageLocation.js'; -import { Identifier } from './Identifier.js'; +import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; import type { AstPath, Doc } from 'prettier'; @@ -13,7 +13,7 @@ export class UntypedTupleMember extends SlangNode { storageLocation?: StorageLocation; - name: Identifier; + name: TerminalNode; constructor(ast: ast.UntypedTupleMember) { super(ast); @@ -21,7 +21,7 @@ export class UntypedTupleMember extends SlangNode { if (ast.storageLocation) { this.storageLocation = new StorageLocation(ast.storageLocation); } - this.name = new Identifier(ast.name); + this.name = new TerminalNode(ast.name); this.updateMetadata(this.storageLocation); } diff --git a/src/slang-nodes/UserDefinedValueTypeDefinition.ts b/src/slang-nodes/UserDefinedValueTypeDefinition.ts index 3bdd73c08..ee8c7ecfc 100644 --- a/src/slang-nodes/UserDefinedValueTypeDefinition.ts +++ b/src/slang-nodes/UserDefinedValueTypeDefinition.ts @@ -1,6 +1,6 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst'; import { SlangNode } from './SlangNode.js'; -import { Identifier } from './Identifier.js'; +import { TerminalNode } from './TerminalNode.js'; import { ElementaryType } from './ElementaryType.js'; import type * as ast from '@nomicfoundation/slang/ast'; @@ -10,14 +10,14 @@ import type { PrintFunction } from '../types.d.ts'; export class UserDefinedValueTypeDefinition extends SlangNode { readonly kind = NonterminalKind.UserDefinedValueTypeDefinition; - name: Identifier; + name: TerminalNode; valueType: ElementaryType; constructor(ast: ast.UserDefinedValueTypeDefinition) { super(ast); - this.name = new Identifier(ast.name); + this.name = new TerminalNode(ast.name); this.valueType = new ElementaryType(ast.valueType); this.updateMetadata(this.valueType); diff --git a/src/slang-nodes/VariableDeclarationStatement.ts b/src/slang-nodes/VariableDeclarationStatement.ts index e808e47db..605124477 100644 --- a/src/slang-nodes/VariableDeclarationStatement.ts +++ b/src/slang-nodes/VariableDeclarationStatement.ts @@ -4,7 +4,7 @@ import { printGroupAndIndentIfBreakPair } from '../slang-printers/print-group-an import { SlangNode } from './SlangNode.js'; import { VariableDeclarationType } from './VariableDeclarationType.js'; import { StorageLocation } from './StorageLocation.js'; -import { Identifier } from './Identifier.js'; +import { TerminalNode } from './TerminalNode.js'; import { VariableDeclarationValue } from './VariableDeclarationValue.js'; import type * as ast from '@nomicfoundation/slang/ast'; @@ -21,7 +21,7 @@ export class VariableDeclarationStatement extends SlangNode { storageLocation?: StorageLocation; - name: Identifier; + name: TerminalNode; value?: VariableDeclarationValue; @@ -35,7 +35,7 @@ export class VariableDeclarationStatement extends SlangNode { if (ast.storageLocation) { this.storageLocation = new StorageLocation(ast.storageLocation); } - this.name = new Identifier(ast.name); + this.name = new TerminalNode(ast.name); if (ast.value) { this.value = new VariableDeclarationValue(ast.value, options); } diff --git a/src/slang-nodes/YulFunctionDefinition.ts b/src/slang-nodes/YulFunctionDefinition.ts index dbc381e94..559f858ad 100644 --- a/src/slang-nodes/YulFunctionDefinition.ts +++ b/src/slang-nodes/YulFunctionDefinition.ts @@ -1,6 +1,6 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst'; import { SlangNode } from './SlangNode.js'; -import { YulIdentifier } from './YulIdentifier.js'; +import { TerminalNode } from './TerminalNode.js'; import { YulParametersDeclaration } from './YulParametersDeclaration.js'; import { YulReturnsDeclaration } from './YulReturnsDeclaration.js'; import { YulBlock } from './YulBlock.js'; @@ -13,7 +13,7 @@ import type { PrintFunction } from '../types.d.ts'; export class YulFunctionDefinition extends SlangNode { readonly kind = NonterminalKind.YulFunctionDefinition; - name: YulIdentifier; + name: TerminalNode; parameters: YulParametersDeclaration; @@ -24,7 +24,7 @@ export class YulFunctionDefinition extends SlangNode { constructor(ast: ast.YulFunctionDefinition, options: ParserOptions) { super(ast); - this.name = new YulIdentifier(ast.name); + this.name = new TerminalNode(ast.name); this.parameters = new YulParametersDeclaration(ast.parameters); if (ast.returns) { this.returns = new YulReturnsDeclaration(ast.returns); diff --git a/src/slang-nodes/YulIdentifier.ts b/src/slang-nodes/YulIdentifier.ts deleted file mode 100644 index fac6a0d1a..000000000 --- a/src/slang-nodes/YulIdentifier.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { TerminalKind, TerminalNode } from '@nomicfoundation/slang/cst'; -import { SlangNode } from './SlangNode.js'; - -import type { Doc } from 'prettier'; - -export class YulIdentifier extends SlangNode { - readonly kind = TerminalKind.YulIdentifier; - - value: string; - - constructor(ast: TerminalNode) { - super(ast); - - this.value = ast.unparse(); - } - - print(): Doc { - return this.value; - } -} diff --git a/src/slang-nodes/YulLabel.ts b/src/slang-nodes/YulLabel.ts index 12e12b1df..0922b1e97 100644 --- a/src/slang-nodes/YulLabel.ts +++ b/src/slang-nodes/YulLabel.ts @@ -1,7 +1,7 @@ import { doc } from 'prettier'; import { NonterminalKind } from '@nomicfoundation/slang/cst'; import { SlangNode } from './SlangNode.js'; -import { YulIdentifier } from './YulIdentifier.js'; +import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; import type { AstPath, Doc } from 'prettier'; @@ -12,12 +12,12 @@ const { dedent, line } = doc.builders; export class YulLabel extends SlangNode { readonly kind = NonterminalKind.YulLabel; - label: YulIdentifier; + label: TerminalNode; constructor(ast: ast.YulLabel) { super(ast); - this.label = new YulIdentifier(ast.label); + this.label = new TerminalNode(ast.label); } print(path: AstPath, print: PrintFunction): Doc { diff --git a/src/slang-nodes/YulParameters.ts b/src/slang-nodes/YulParameters.ts index 8492a6352..435ddc110 100644 --- a/src/slang-nodes/YulParameters.ts +++ b/src/slang-nodes/YulParameters.ts @@ -1,7 +1,7 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst'; import { printSeparatedList } from '../slang-printers/print-separated-list.js'; import { SlangNode } from './SlangNode.js'; -import { YulIdentifier } from './YulIdentifier.js'; +import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; import type { AstPath, Doc } from 'prettier'; @@ -10,12 +10,12 @@ import type { PrintFunction } from '../types.d.ts'; export class YulParameters extends SlangNode { readonly kind = NonterminalKind.YulParameters; - items: YulIdentifier[]; + items: TerminalNode[]; constructor(ast: ast.YulParameters) { super(ast, true); - this.items = ast.items.map((item) => new YulIdentifier(item)); + this.items = ast.items.map((item) => new TerminalNode(item)); } print(path: AstPath, print: PrintFunction): Doc { diff --git a/src/slang-nodes/YulPath.ts b/src/slang-nodes/YulPath.ts index 6719693f8..137cbee6a 100644 --- a/src/slang-nodes/YulPath.ts +++ b/src/slang-nodes/YulPath.ts @@ -1,7 +1,7 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst'; import { doc } from 'prettier'; import { SlangNode } from './SlangNode.js'; -import { YulIdentifier } from './YulIdentifier.js'; +import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; import type { AstPath, Doc } from 'prettier'; @@ -12,12 +12,12 @@ const { join } = doc.builders; export class YulPath extends SlangNode { readonly kind = NonterminalKind.YulPath; - items: YulIdentifier[]; + items: TerminalNode[]; constructor(ast: ast.YulPath) { super(ast, true); - this.items = ast.items.map((item) => new YulIdentifier(item)); + this.items = ast.items.map((item) => new TerminalNode(item)); } print(path: AstPath, print: PrintFunction): Doc { diff --git a/src/slang-nodes/YulStackAssignmentStatement.ts b/src/slang-nodes/YulStackAssignmentStatement.ts index 1b0cd4cc1..faf8503d4 100644 --- a/src/slang-nodes/YulStackAssignmentStatement.ts +++ b/src/slang-nodes/YulStackAssignmentStatement.ts @@ -3,7 +3,7 @@ import { doc } from 'prettier'; import { printSeparatedItem } from '../slang-printers/print-separated-item.js'; import { SlangNode } from './SlangNode.js'; import { YulStackAssignmentOperator } from './YulStackAssignmentOperator.js'; -import { YulIdentifier } from './YulIdentifier.js'; +import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; import type { AstPath, Doc } from 'prettier'; @@ -16,13 +16,13 @@ export class YulStackAssignmentStatement extends SlangNode { assignment: YulStackAssignmentOperator; - variable: YulIdentifier; + variable: TerminalNode; constructor(ast: ast.YulStackAssignmentStatement) { super(ast); this.assignment = new YulStackAssignmentOperator(ast.assignment); - this.variable = new YulIdentifier(ast.variable); + this.variable = new TerminalNode(ast.variable); this.updateMetadata(this.assignment); } diff --git a/src/slang-nodes/YulVariableNames.ts b/src/slang-nodes/YulVariableNames.ts index 6b2ae7626..823302471 100644 --- a/src/slang-nodes/YulVariableNames.ts +++ b/src/slang-nodes/YulVariableNames.ts @@ -2,7 +2,7 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst'; import { doc } from 'prettier'; import { printSeparatedList } from '../slang-printers/print-separated-list.js'; import { SlangNode } from './SlangNode.js'; -import { YulIdentifier } from './YulIdentifier.js'; +import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; import type { AstPath, Doc } from 'prettier'; @@ -13,12 +13,12 @@ const { line } = doc.builders; export class YulVariableNames extends SlangNode { readonly kind = NonterminalKind.YulVariableNames; - items: YulIdentifier[]; + items: TerminalNode[]; constructor(ast: ast.YulVariableNames) { super(ast, true); - this.items = ast.items.map((item) => new YulIdentifier(item)); + this.items = ast.items.map((item) => new TerminalNode(item)); } print(path: AstPath, print: PrintFunction): Doc { diff --git a/src/slang-nodes/types.d.ts b/src/slang-nodes/types.d.ts index 3f2571d82..cdb3fd9ce 100644 --- a/src/slang-nodes/types.d.ts +++ b/src/slang-nodes/types.d.ts @@ -70,7 +70,6 @@ import type { FunctionTypeAttributes } from './FunctionTypeAttributes.ts'; import type { HexNumberExpression } from './HexNumberExpression.ts'; import type { HexStringLiteral } from './HexStringLiteral.ts'; import type { HexStringLiterals } from './HexStringLiterals.ts'; -import type { Identifier } from './Identifier.ts'; import type { IdentifierPath } from './IdentifierPath.ts'; import type { IfStatement } from './IfStatement.ts'; import type { ImportAlias } from './ImportAlias.ts'; @@ -149,6 +148,7 @@ import type { StringLiterals } from './StringLiterals.ts'; import type { StructDefinition } from './StructDefinition.ts'; import type { StructMember } from './StructMember.ts'; import type { StructMembers } from './StructMembers.ts'; +import type { TerminalNode } from './TerminalNode.ts'; import type { ThrowStatement } from './ThrowStatement.ts'; import type { TryStatement } from './TryStatement.ts'; import type { TupleDeconstructionElement } from './TupleDeconstructionElement.ts'; @@ -201,7 +201,6 @@ import type { YulExpression } from './YulExpression.ts'; import type { YulForStatement } from './YulForStatement.ts'; import type { YulFunctionCallExpression } from './YulFunctionCallExpression.ts'; import type { YulFunctionDefinition } from './YulFunctionDefinition.ts'; -import type { YulIdentifier } from './YulIdentifier.ts'; import type { YulIfStatement } from './YulIfStatement.ts'; import type { YulLabel } from './YulLabel.ts'; import type { YulLeaveStatement } from './YulLeaveStatement.ts'; @@ -464,14 +463,14 @@ export type PolymorphicNode = Extract; export type StrictPolymorphicNode = Extract< StrictAstNode, - { variant: StrictAstNode | Identifier | YulIdentifier } + { variant: StrictAstNode | TerminalNode } >; export type Collection = Extract; export type NodeCollection = Extract< Collection, - { items: StrictAstNode[] | Identifier[] | YulIdentifier[] } + { items: StrictAstNode[] | TerminalNode[] } >; export type LineCollection = Extract< @@ -491,7 +490,6 @@ export type BinaryOperation = Extract< export type AstNode = | StrictAstNode | Comment - | Identifier - | YulIdentifier + | TerminalNode | string | undefined; diff --git a/src/slang-printers/create-binary-operation-printer.ts b/src/slang-printers/create-binary-operation-printer.ts index f0fda3855..64e00d250 100644 --- a/src/slang-printers/create-binary-operation-printer.ts +++ b/src/slang-printers/create-binary-operation-printer.ts @@ -1,6 +1,7 @@ -import { NonterminalKind, TerminalKind } from '@nomicfoundation/slang/cst'; +import { NonterminalKind } from '@nomicfoundation/slang/cst'; import { doc } from 'prettier'; import { isBinaryOperation } from '../slang-utils/is-binary-operation.js'; +import { TerminalNode } from '../slang-nodes/TerminalNode.js'; import type { AstPath, Doc, ParserOptions } from 'prettier'; import type { @@ -29,7 +30,7 @@ function rightOperandPrint( const leftOperandVariant = leftOperand.variant; const grandparentNode = path.grandparent as StrictAstNode; const shouldGroup = - (leftOperandVariant.kind === TerminalKind.Identifier || + (leftOperandVariant instanceof TerminalNode || !isBinaryOperation(leftOperandVariant)) && (!isBinaryOperation(grandparentNode) || grandparentNode.kind === NonterminalKind.AssignmentExpression); diff --git a/src/slang-utils/create-hug-function.ts b/src/slang-utils/create-hug-function.ts index 7e316550d..c7584b5da 100644 --- a/src/slang-utils/create-hug-function.ts +++ b/src/slang-utils/create-hug-function.ts @@ -1,9 +1,10 @@ -import { NonterminalKind, TerminalKind } from '@nomicfoundation/slang/cst'; +import { NonterminalKind } from '@nomicfoundation/slang/cst'; import { isBinaryOperation } from './is-binary-operation.js'; import { Expression } from '../slang-nodes/Expression.js'; import { TupleExpression } from '../slang-nodes/TupleExpression.js'; import { TupleValues } from '../slang-nodes/TupleValues.js'; import { TupleValue } from '../slang-nodes/TupleValue.js'; +import { TerminalNode } from '../slang-nodes/TerminalNode.js'; export function createHugFunction( huggableOperators: string[] @@ -12,7 +13,7 @@ export function createHugFunction( return (node: Expression): Expression => { const variant = node.variant; if ( - variant.kind !== TerminalKind.Identifier && + !(variant instanceof TerminalNode) && isBinaryOperation(variant) && operators.has(variant.operator) ) { From 0cf7f97f845b055ff20c5fff1484300ebac1ba9a Mon Sep 17 00:00:00 2001 From: Klaus Date: Tue, 15 Jul 2025 15:53:03 +0100 Subject: [PATCH 2/2] Migrating all `variant` values with the possibility to be a string to TerminalNode for easier printing logic --- src/slang-nodes/ConstructorAttribute.ts | 15 ++++++---- src/slang-nodes/ElementaryType.ts | 15 ++++++---- src/slang-nodes/FallbackFunctionAttribute.ts | 19 +++++++------ src/slang-nodes/ForStatementCondition.ts | 15 ++++++---- src/slang-nodes/ForStatementInitialization.ts | 22 +++++++++------ src/slang-nodes/FunctionAttribute.ts | 19 +++++++------ src/slang-nodes/FunctionBody.ts | 15 ++++++---- src/slang-nodes/FunctionTypeAttribute.ts | 12 ++++---- src/slang-nodes/ModifierAttribute.ts | 15 ++++++---- src/slang-nodes/ReceiveFunctionAttribute.ts | 19 +++++++------ src/slang-nodes/SlangNode.ts | 28 +++++++++---------- src/slang-nodes/StateVariableAttribute.ts | 15 ++++++---- src/slang-nodes/UnnamedFunctionAttribute.ts | 15 ++++++---- src/slang-nodes/UnnamedFunctionDefinition.ts | 2 +- src/slang-nodes/UsingTarget.ts | 15 ++++++---- src/slang-nodes/VariableDeclarationType.ts | 15 ++++++---- src/slang-nodes/VersionLiteral.ts | 15 ++++++---- src/slang-nodes/YulAssignmentOperator.ts | 15 ++++++---- src/slang-nodes/YulLiteral.ts | 19 +++++++------ src/slang-nodes/YulStackAssignmentOperator.ts | 15 ++++++---- src/slang-printers/print-function.ts | 5 +++- src/slang-printers/print-variant.ts | 11 -------- src/slang-utils/sort-function-attributes.ts | 13 +++++---- 23 files changed, 199 insertions(+), 150 deletions(-) delete mode 100644 src/slang-printers/print-variant.ts diff --git a/src/slang-nodes/ConstructorAttribute.ts b/src/slang-nodes/ConstructorAttribute.ts index 5de3cf4fc..f73f08f4b 100644 --- a/src/slang-nodes/ConstructorAttribute.ts +++ b/src/slang-nodes/ConstructorAttribute.ts @@ -1,7 +1,10 @@ -import { NonterminalKind, TerminalNode } from '@nomicfoundation/slang/cst'; -import { printVariant } from '../slang-printers/print-variant.js'; +import { + NonterminalKind, + TerminalNode as SlangTerminalNode +} from '@nomicfoundation/slang/cst'; import { SlangNode } from './SlangNode.js'; 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'; @@ -11,14 +14,14 @@ import type { PrintFunction } from '../types.d.ts'; export class ConstructorAttribute extends SlangNode { readonly kind = NonterminalKind.ConstructorAttribute; - variant: ModifierInvocation | string; + variant: ModifierInvocation | TerminalNode; constructor(ast: ast.ConstructorAttribute, options: ParserOptions) { super(ast); const variant = ast.variant; - if (variant instanceof TerminalNode) { - this.variant = variant.unparse(); + if (variant instanceof SlangTerminalNode) { + this.variant = new TerminalNode(variant); return; } this.variant = new ModifierInvocation(variant, options); @@ -27,6 +30,6 @@ export class ConstructorAttribute extends SlangNode { } print(path: AstPath, print: PrintFunction): Doc { - return printVariant(this, path, print); + return path.call(print, 'variant'); } } diff --git a/src/slang-nodes/ElementaryType.ts b/src/slang-nodes/ElementaryType.ts index db4c63f19..4c5e6557d 100644 --- a/src/slang-nodes/ElementaryType.ts +++ b/src/slang-nodes/ElementaryType.ts @@ -1,7 +1,10 @@ -import { NonterminalKind, TerminalNode } from '@nomicfoundation/slang/cst'; -import { printVariant } from '../slang-printers/print-variant.js'; +import { + NonterminalKind, + TerminalNode as SlangTerminalNode +} from '@nomicfoundation/slang/cst'; import { SlangNode } from './SlangNode.js'; import { AddressType } from './AddressType.js'; +import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; import type { AstPath, Doc } from 'prettier'; @@ -10,14 +13,14 @@ import type { PrintFunction } from '../types.d.ts'; export class ElementaryType extends SlangNode { readonly kind = NonterminalKind.ElementaryType; - variant: AddressType | string; + variant: AddressType | TerminalNode; constructor(ast: ast.ElementaryType) { super(ast); const variant = ast.variant; - if (variant instanceof TerminalNode) { - this.variant = variant.unparse(); + if (variant instanceof SlangTerminalNode) { + this.variant = new TerminalNode(variant); return; } this.variant = new AddressType(variant); @@ -26,6 +29,6 @@ export class ElementaryType extends SlangNode { } print(path: AstPath, print: PrintFunction): Doc { - return printVariant(this, path, print); + return path.call(print, 'variant'); } } diff --git a/src/slang-nodes/FallbackFunctionAttribute.ts b/src/slang-nodes/FallbackFunctionAttribute.ts index 0b65983a1..4fb270f3a 100644 --- a/src/slang-nodes/FallbackFunctionAttribute.ts +++ b/src/slang-nodes/FallbackFunctionAttribute.ts @@ -1,18 +1,21 @@ import * as ast from '@nomicfoundation/slang/ast'; -import { NonterminalKind, TerminalNode } from '@nomicfoundation/slang/cst'; -import { printVariant } from '../slang-printers/print-variant.js'; +import { + NonterminalKind, + TerminalNode as SlangTerminalNode +} from '@nomicfoundation/slang/cst'; import { SlangNode } from './SlangNode.js'; import { ModifierInvocation } from './ModifierInvocation.js'; import { OverrideSpecifier } from './OverrideSpecifier.js'; +import { TerminalNode } from './TerminalNode.js'; import type { AstPath, Doc, ParserOptions } from 'prettier'; import type { AstNode } from './types.d.ts'; import type { PrintFunction } from '../types.d.ts'; function createNonterminalVariant( - variant: Exclude, + variant: Exclude, options: ParserOptions -): Exclude { +): Exclude { if (variant instanceof ast.ModifierInvocation) { return new ModifierInvocation(variant, options); } @@ -26,7 +29,7 @@ function createNonterminalVariant( export class FallbackFunctionAttribute extends SlangNode { readonly kind = NonterminalKind.FallbackFunctionAttribute; - variant: ModifierInvocation | OverrideSpecifier | string; + variant: ModifierInvocation | OverrideSpecifier | TerminalNode; constructor( ast: ast.FallbackFunctionAttribute, @@ -35,8 +38,8 @@ export class FallbackFunctionAttribute extends SlangNode { super(ast); const variant = ast.variant; - if (variant instanceof TerminalNode) { - this.variant = variant.unparse(); + if (variant instanceof SlangTerminalNode) { + this.variant = new TerminalNode(variant); return; } this.variant = createNonterminalVariant(variant, options); @@ -45,6 +48,6 @@ export class FallbackFunctionAttribute extends SlangNode { } print(path: AstPath, print: PrintFunction): Doc { - return printVariant(this, path, print); + return path.call(print, 'variant'); } } diff --git a/src/slang-nodes/ForStatementCondition.ts b/src/slang-nodes/ForStatementCondition.ts index 15c95a31b..94c01c5f4 100644 --- a/src/slang-nodes/ForStatementCondition.ts +++ b/src/slang-nodes/ForStatementCondition.ts @@ -1,5 +1,7 @@ -import { NonterminalKind, TerminalNode } from '@nomicfoundation/slang/cst'; -import { printVariant } from '../slang-printers/print-variant.js'; +import { + NonterminalKind, + TerminalNode as SlangTerminalNode +} from '@nomicfoundation/slang/cst'; import { SlangNode } from './SlangNode.js'; import { ExpressionStatement } from './ExpressionStatement.js'; @@ -7,18 +9,19 @@ 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 { TerminalNode } from './TerminalNode.js'; export class ForStatementCondition extends SlangNode { readonly kind = NonterminalKind.ForStatementCondition; - variant: ExpressionStatement | string; + variant: ExpressionStatement | TerminalNode; constructor(ast: ast.ForStatementCondition, options: ParserOptions) { super(ast); const variant = ast.variant; - if (variant instanceof TerminalNode) { - this.variant = variant.unparse(); + if (variant instanceof SlangTerminalNode) { + this.variant = new TerminalNode(variant); return; } this.variant = new ExpressionStatement(variant, options); @@ -27,6 +30,6 @@ export class ForStatementCondition extends SlangNode { } print(path: AstPath, print: PrintFunction): Doc { - return printVariant(this, path, print); + return path.call(print, 'variant'); } } diff --git a/src/slang-nodes/ForStatementInitialization.ts b/src/slang-nodes/ForStatementInitialization.ts index 48d3c2b40..db6ad487e 100644 --- a/src/slang-nodes/ForStatementInitialization.ts +++ b/src/slang-nodes/ForStatementInitialization.ts @@ -1,19 +1,25 @@ import * as ast from '@nomicfoundation/slang/ast'; -import { NonterminalKind, TerminalNode } from '@nomicfoundation/slang/cst'; -import { printVariant } from '../slang-printers/print-variant.js'; +import { + NonterminalKind, + TerminalNode as SlangTerminalNode +} from '@nomicfoundation/slang/cst'; import { SlangNode } from './SlangNode.js'; import { ExpressionStatement } from './ExpressionStatement.js'; import { VariableDeclarationStatement } from './VariableDeclarationStatement.js'; import { TupleDeconstructionStatement } from './TupleDeconstructionStatement.js'; +import { TerminalNode } from './TerminalNode.js'; import type { AstPath, Doc, ParserOptions } from 'prettier'; import type { AstNode } from './types.d.ts'; import type { PrintFunction } from '../types.d.ts'; function createNonterminalVariant( - variant: Exclude, + variant: Exclude< + ast.ForStatementInitialization['variant'], + SlangTerminalNode + >, options: ParserOptions -): Exclude { +): Exclude { if (variant instanceof ast.ExpressionStatement) { return new ExpressionStatement(variant, options); } @@ -34,7 +40,7 @@ export class ForStatementInitialization extends SlangNode { | ExpressionStatement | VariableDeclarationStatement | TupleDeconstructionStatement - | string; + | TerminalNode; constructor( ast: ast.ForStatementInitialization, @@ -43,8 +49,8 @@ export class ForStatementInitialization extends SlangNode { super(ast); const variant = ast.variant; - if (variant instanceof TerminalNode) { - this.variant = variant.unparse(); + if (variant instanceof SlangTerminalNode) { + this.variant = new TerminalNode(variant); return; } this.variant = createNonterminalVariant(variant, options); @@ -53,6 +59,6 @@ export class ForStatementInitialization extends SlangNode { } print(path: AstPath, print: PrintFunction): Doc { - return printVariant(this, path, print); + return path.call(print, 'variant'); } } diff --git a/src/slang-nodes/FunctionAttribute.ts b/src/slang-nodes/FunctionAttribute.ts index e1035622c..5290d968b 100644 --- a/src/slang-nodes/FunctionAttribute.ts +++ b/src/slang-nodes/FunctionAttribute.ts @@ -1,18 +1,21 @@ import * as ast from '@nomicfoundation/slang/ast'; -import { NonterminalKind, TerminalNode } from '@nomicfoundation/slang/cst'; -import { printVariant } from '../slang-printers/print-variant.js'; +import { + NonterminalKind, + TerminalNode as SlangTerminalNode +} from '@nomicfoundation/slang/cst'; import { SlangNode } from './SlangNode.js'; import { ModifierInvocation } from './ModifierInvocation.js'; import { OverrideSpecifier } from './OverrideSpecifier.js'; +import { TerminalNode } from './TerminalNode.js'; import type { AstPath, Doc, ParserOptions } from 'prettier'; import type { AstNode } from './types.d.ts'; import type { PrintFunction } from '../types.d.ts'; function createNonterminalVariant( - variant: Exclude, + variant: Exclude, options: ParserOptions -): Exclude { +): Exclude { if (variant instanceof ast.ModifierInvocation) { return new ModifierInvocation(variant, options); } @@ -26,14 +29,14 @@ function createNonterminalVariant( export class FunctionAttribute extends SlangNode { readonly kind = NonterminalKind.FunctionAttribute; - variant: ModifierInvocation | OverrideSpecifier | string; + variant: ModifierInvocation | OverrideSpecifier | TerminalNode; constructor(ast: ast.FunctionAttribute, options: ParserOptions) { super(ast); const variant = ast.variant; - if (variant instanceof TerminalNode) { - this.variant = variant.unparse(); + if (variant instanceof SlangTerminalNode) { + this.variant = new TerminalNode(variant); return; } this.variant = createNonterminalVariant(variant, options); @@ -42,6 +45,6 @@ export class FunctionAttribute extends SlangNode { } print(path: AstPath, print: PrintFunction): Doc { - return printVariant(this, path, print); + return path.call(print, 'variant'); } } diff --git a/src/slang-nodes/FunctionBody.ts b/src/slang-nodes/FunctionBody.ts index 94322bae0..658b88502 100644 --- a/src/slang-nodes/FunctionBody.ts +++ b/src/slang-nodes/FunctionBody.ts @@ -1,7 +1,10 @@ -import { NonterminalKind, TerminalNode } from '@nomicfoundation/slang/cst'; -import { printVariant } from '../slang-printers/print-variant.js'; +import { + NonterminalKind, + TerminalNode as SlangTerminalNode +} from '@nomicfoundation/slang/cst'; import { SlangNode } from './SlangNode.js'; 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'; @@ -11,14 +14,14 @@ import type { PrintFunction } from '../types.d.ts'; export class FunctionBody extends SlangNode { readonly kind = NonterminalKind.FunctionBody; - variant: Block | string; + variant: Block | TerminalNode; constructor(ast: ast.FunctionBody, options: ParserOptions) { super(ast); const variant = ast.variant; - if (variant instanceof TerminalNode) { - this.variant = variant.unparse(); + if (variant instanceof SlangTerminalNode) { + this.variant = new TerminalNode(variant); return; } this.variant = new Block(variant, options); @@ -27,6 +30,6 @@ export class FunctionBody extends SlangNode { } print(path: AstPath, print: PrintFunction): Doc { - return printVariant(this, path, print); + return path.call(print, 'variant'); } } diff --git a/src/slang-nodes/FunctionTypeAttribute.ts b/src/slang-nodes/FunctionTypeAttribute.ts index a0c4efb8f..61ac4a32d 100644 --- a/src/slang-nodes/FunctionTypeAttribute.ts +++ b/src/slang-nodes/FunctionTypeAttribute.ts @@ -1,21 +1,23 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst'; import { SlangNode } from './SlangNode.js'; +import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; -import type { Doc } from 'prettier'; +import type { AstPath, Doc } from 'prettier'; +import type { PrintFunction } from '../types.d.ts'; export class FunctionTypeAttribute extends SlangNode { readonly kind = NonterminalKind.FunctionTypeAttribute; - variant: string; + variant: TerminalNode; constructor(ast: ast.FunctionTypeAttribute) { super(ast); - this.variant = ast.variant.unparse(); + this.variant = new TerminalNode(ast.variant); } - print(): Doc { - return 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 a2f647ee8..23fcde6ac 100644 --- a/src/slang-nodes/ModifierAttribute.ts +++ b/src/slang-nodes/ModifierAttribute.ts @@ -1,7 +1,10 @@ -import { NonterminalKind, TerminalNode } from '@nomicfoundation/slang/cst'; -import { printVariant } from '../slang-printers/print-variant.js'; +import { + NonterminalKind, + TerminalNode as SlangTerminalNode +} from '@nomicfoundation/slang/cst'; import { SlangNode } from './SlangNode.js'; import { OverrideSpecifier } from './OverrideSpecifier.js'; +import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; import type { AstPath, Doc } from 'prettier'; @@ -10,14 +13,14 @@ import type { PrintFunction } from '../types.d.ts'; export class ModifierAttribute extends SlangNode { readonly kind = NonterminalKind.ModifierAttribute; - variant: OverrideSpecifier | string; + variant: OverrideSpecifier | TerminalNode; constructor(ast: ast.ModifierAttribute) { super(ast); const variant = ast.variant; - if (variant instanceof TerminalNode) { - this.variant = variant.unparse(); + if (variant instanceof SlangTerminalNode) { + this.variant = new TerminalNode(variant); return; } this.variant = new OverrideSpecifier(variant); @@ -26,6 +29,6 @@ export class ModifierAttribute extends SlangNode { } print(path: AstPath, print: PrintFunction): Doc { - return printVariant(this, path, print); + return path.call(print, 'variant'); } } diff --git a/src/slang-nodes/ReceiveFunctionAttribute.ts b/src/slang-nodes/ReceiveFunctionAttribute.ts index 6f2f6cc0d..4a7e4ee8d 100644 --- a/src/slang-nodes/ReceiveFunctionAttribute.ts +++ b/src/slang-nodes/ReceiveFunctionAttribute.ts @@ -1,18 +1,21 @@ import * as ast from '@nomicfoundation/slang/ast'; -import { NonterminalKind, TerminalNode } from '@nomicfoundation/slang/cst'; -import { printVariant } from '../slang-printers/print-variant.js'; +import { + NonterminalKind, + TerminalNode as SlangTerminalNode +} from '@nomicfoundation/slang/cst'; import { SlangNode } from './SlangNode.js'; import { ModifierInvocation } from './ModifierInvocation.js'; import { OverrideSpecifier } from './OverrideSpecifier.js'; +import { TerminalNode } from './TerminalNode.js'; import type { AstPath, Doc, ParserOptions } from 'prettier'; import type { AstNode } from './types.d.ts'; import type { PrintFunction } from '../types.d.ts'; function createNonterminalVariant( - variant: Exclude, + variant: Exclude, options: ParserOptions -): Exclude { +): Exclude { if (variant instanceof ast.ModifierInvocation) { return new ModifierInvocation(variant, options); } @@ -26,7 +29,7 @@ function createNonterminalVariant( export class ReceiveFunctionAttribute extends SlangNode { readonly kind = NonterminalKind.ReceiveFunctionAttribute; - variant: ModifierInvocation | OverrideSpecifier | string; + variant: ModifierInvocation | OverrideSpecifier | TerminalNode; constructor( ast: ast.ReceiveFunctionAttribute, @@ -35,8 +38,8 @@ export class ReceiveFunctionAttribute extends SlangNode { super(ast); const variant = ast.variant; - if (variant instanceof TerminalNode) { - this.variant = variant.unparse(); + if (variant instanceof SlangTerminalNode) { + this.variant = new TerminalNode(variant); return; } this.variant = createNonterminalVariant(variant, options); @@ -45,6 +48,6 @@ export class ReceiveFunctionAttribute extends SlangNode { } print(path: AstPath, print: PrintFunction): Doc { - return printVariant(this, path, print); + return path.call(print, 'variant'); } } diff --git a/src/slang-nodes/SlangNode.ts b/src/slang-nodes/SlangNode.ts index 4a9d936cf..93a42550a 100644 --- a/src/slang-nodes/SlangNode.ts +++ b/src/slang-nodes/SlangNode.ts @@ -1,4 +1,8 @@ -import { TerminalKind, TerminalNode } from '@nomicfoundation/slang/cst'; +import { + TerminalKind, + TerminalNode, + TerminalKindExtensions +} from '@nomicfoundation/slang/cst'; import { createKindCheckFunction } from '../slang-utils/create-kind-check-function.js'; import { MultiLineComment } from '../slang-nodes/MultiLineComment.js'; import { MultiLineNatSpecComment } from '../slang-nodes/MultiLineNatSpecComment.js'; @@ -91,11 +95,15 @@ export class SlangNode { let offset = initialOffset; for (const { node } of children) { - const { id, kind, textLength } = node; - if (node.isNonterminalNode()) { - offsets.set(id, offset); + if ( + node.isNonterminalNode() || + !TerminalKindExtensions.isTrivia(node.kind) + ) { + // Also tracking TerminalNodes since some variants that were not + // Identifier or YulIdentifier but were upgraded to TerminalNode + offsets.set(node.id, offset); } else { - switch (kind) { + switch (node.kind) { // Since the fetching the comments and calculating offsets are both done // as we iterate over the children and the comment also depends on the // offset, it's hard to separate these responsibilities into different @@ -112,18 +120,10 @@ export class SlangNode { case TerminalKind.SingleLineNatSpecComment: this.comments.push(new SingleLineNatSpecComment(node, offset)); break; - case TerminalKind.Identifier: - case TerminalKind.YulIdentifier: - // Identifiers usually are user provided names for variables, - // functions, etc... - // Since a user can add comments to this section of the code as well, - // we need to track the offsets. - offsets.set(id, offset); - break; } } - offset += textLength.utf16; + offset += node.textLength.utf16; } const [leadingOffset, trailingOffset] = enclosePeripheralComments diff --git a/src/slang-nodes/StateVariableAttribute.ts b/src/slang-nodes/StateVariableAttribute.ts index b64b33554..e45131655 100644 --- a/src/slang-nodes/StateVariableAttribute.ts +++ b/src/slang-nodes/StateVariableAttribute.ts @@ -1,7 +1,10 @@ -import { NonterminalKind, TerminalNode } from '@nomicfoundation/slang/cst'; -import { printVariant } from '../slang-printers/print-variant.js'; +import { + NonterminalKind, + TerminalNode as SlangTerminalNode +} from '@nomicfoundation/slang/cst'; import { SlangNode } from './SlangNode.js'; import { OverrideSpecifier } from './OverrideSpecifier.js'; +import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; import type { AstPath, Doc } from 'prettier'; @@ -10,14 +13,14 @@ import type { PrintFunction } from '../types.d.ts'; export class StateVariableAttribute extends SlangNode { readonly kind = NonterminalKind.StateVariableAttribute; - variant: OverrideSpecifier | string; + variant: OverrideSpecifier | TerminalNode; constructor(ast: ast.StateVariableAttribute) { super(ast); const variant = ast.variant; - if (variant instanceof TerminalNode) { - this.variant = variant.unparse(); + if (variant instanceof SlangTerminalNode) { + this.variant = new TerminalNode(variant); return; } this.variant = new OverrideSpecifier(variant); @@ -26,6 +29,6 @@ export class StateVariableAttribute extends SlangNode { } print(path: AstPath, print: PrintFunction): Doc { - return printVariant(this, path, print); + return path.call(print, 'variant'); } } diff --git a/src/slang-nodes/UnnamedFunctionAttribute.ts b/src/slang-nodes/UnnamedFunctionAttribute.ts index a829e18c7..d22dd58ad 100644 --- a/src/slang-nodes/UnnamedFunctionAttribute.ts +++ b/src/slang-nodes/UnnamedFunctionAttribute.ts @@ -1,7 +1,10 @@ -import { NonterminalKind, TerminalNode } from '@nomicfoundation/slang/cst'; -import { printVariant } from '../slang-printers/print-variant.js'; +import { + NonterminalKind, + TerminalNode as SlangTerminalNode +} from '@nomicfoundation/slang/cst'; import { SlangNode } from './SlangNode.js'; 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'; @@ -11,7 +14,7 @@ import type { PrintFunction } from '../types.d.ts'; export class UnnamedFunctionAttribute extends SlangNode { readonly kind = NonterminalKind.UnnamedFunctionAttribute; - variant: ModifierInvocation | string; + variant: ModifierInvocation | TerminalNode; constructor( ast: ast.UnnamedFunctionAttribute, @@ -20,8 +23,8 @@ export class UnnamedFunctionAttribute extends SlangNode { super(ast); const variant = ast.variant; - if (variant instanceof TerminalNode) { - this.variant = variant.unparse(); + if (variant instanceof SlangTerminalNode) { + this.variant = new TerminalNode(variant); return; } this.variant = new ModifierInvocation(variant, options); @@ -30,6 +33,6 @@ export class UnnamedFunctionAttribute extends SlangNode { } print(path: AstPath, print: PrintFunction): Doc { - return printVariant(this, path, print); + return path.call(print, 'variant'); } } diff --git a/src/slang-nodes/UnnamedFunctionDefinition.ts b/src/slang-nodes/UnnamedFunctionDefinition.ts index ca235104f..50b4180fb 100644 --- a/src/slang-nodes/UnnamedFunctionDefinition.ts +++ b/src/slang-nodes/UnnamedFunctionDefinition.ts @@ -36,7 +36,7 @@ export class UnnamedFunctionDefinition extends SlangNode { cleanModifierInvocationArguments(): void { for (const { variant: attribute } of this.attributes.items) { - if (typeof attribute !== 'string') { + if (attribute.kind === NonterminalKind.ModifierInvocation) { attribute.cleanModifierInvocationArguments(); } } diff --git a/src/slang-nodes/UsingTarget.ts b/src/slang-nodes/UsingTarget.ts index 792645c63..be6234e1a 100644 --- a/src/slang-nodes/UsingTarget.ts +++ b/src/slang-nodes/UsingTarget.ts @@ -1,7 +1,10 @@ -import { NonterminalKind, TerminalNode } from '@nomicfoundation/slang/cst'; -import { printVariant } from '../slang-printers/print-variant.js'; +import { + NonterminalKind, + TerminalNode as SlangTerminalNode +} from '@nomicfoundation/slang/cst'; import { SlangNode } from './SlangNode.js'; 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'; @@ -11,14 +14,14 @@ import type { PrintFunction } from '../types.d.ts'; export class UsingTarget extends SlangNode { readonly kind = NonterminalKind.UsingTarget; - variant: TypeName | string; + variant: TypeName | TerminalNode; constructor(ast: ast.UsingTarget, options: ParserOptions) { super(ast); const variant = ast.variant; - if (variant instanceof TerminalNode) { - this.variant = variant.unparse(); + if (variant instanceof SlangTerminalNode) { + this.variant = new TerminalNode(variant); return; } this.variant = new TypeName(variant, options); @@ -27,6 +30,6 @@ export class UsingTarget extends SlangNode { } print(path: AstPath, print: PrintFunction): Doc { - return printVariant(this, path, print); + return path.call(print, 'variant'); } } diff --git a/src/slang-nodes/VariableDeclarationType.ts b/src/slang-nodes/VariableDeclarationType.ts index 759208dc6..24855a51f 100644 --- a/src/slang-nodes/VariableDeclarationType.ts +++ b/src/slang-nodes/VariableDeclarationType.ts @@ -1,7 +1,10 @@ -import { NonterminalKind, TerminalNode } from '@nomicfoundation/slang/cst'; -import { printVariant } from '../slang-printers/print-variant.js'; +import { + NonterminalKind, + TerminalNode as SlangTerminalNode +} from '@nomicfoundation/slang/cst'; import { SlangNode } from './SlangNode.js'; 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'; @@ -11,7 +14,7 @@ import type { PrintFunction } from '../types.d.ts'; export class VariableDeclarationType extends SlangNode { readonly kind = NonterminalKind.VariableDeclarationType; - variant: TypeName | string; + variant: TypeName | TerminalNode; constructor( ast: ast.VariableDeclarationType, @@ -20,8 +23,8 @@ export class VariableDeclarationType extends SlangNode { super(ast); const variant = ast.variant; - if (variant instanceof TerminalNode) { - this.variant = variant.unparse(); + if (variant instanceof SlangTerminalNode) { + this.variant = new TerminalNode(variant); return; } this.variant = new TypeName(variant, options); @@ -30,6 +33,6 @@ export class VariableDeclarationType extends SlangNode { } print(path: AstPath, print: PrintFunction): Doc { - return printVariant(this, path, print); + return path.call(print, 'variant'); } } diff --git a/src/slang-nodes/VersionLiteral.ts b/src/slang-nodes/VersionLiteral.ts index 5ee3e9008..40c64f8d4 100644 --- a/src/slang-nodes/VersionLiteral.ts +++ b/src/slang-nodes/VersionLiteral.ts @@ -1,7 +1,10 @@ -import { NonterminalKind, TerminalNode } from '@nomicfoundation/slang/cst'; -import { printVariant } from '../slang-printers/print-variant.js'; +import { + NonterminalKind, + TerminalNode as SlangTerminalNode +} from '@nomicfoundation/slang/cst'; import { SlangNode } from './SlangNode.js'; import { SimpleVersionLiteral } from './SimpleVersionLiteral.js'; +import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; import type { AstPath, Doc } from 'prettier'; @@ -10,14 +13,14 @@ import type { PrintFunction } from '../types.d.ts'; export class VersionLiteral extends SlangNode { readonly kind = NonterminalKind.VersionLiteral; - variant: SimpleVersionLiteral | string; + variant: SimpleVersionLiteral | TerminalNode; constructor(ast: ast.VersionLiteral) { super(ast); const variant = ast.variant; - if (variant instanceof TerminalNode) { - this.variant = variant.unparse(); + if (variant instanceof SlangTerminalNode) { + this.variant = new TerminalNode(variant); return; } this.variant = new SimpleVersionLiteral(variant); @@ -26,6 +29,6 @@ export class VersionLiteral extends SlangNode { } print(path: AstPath, print: PrintFunction): Doc { - return printVariant(this, path, print); + return path.call(print, 'variant'); } } diff --git a/src/slang-nodes/YulAssignmentOperator.ts b/src/slang-nodes/YulAssignmentOperator.ts index 193ff3710..5a6a94b18 100644 --- a/src/slang-nodes/YulAssignmentOperator.ts +++ b/src/slang-nodes/YulAssignmentOperator.ts @@ -1,7 +1,10 @@ -import { NonterminalKind, TerminalNode } from '@nomicfoundation/slang/cst'; -import { printVariant } from '../slang-printers/print-variant.js'; +import { + NonterminalKind, + TerminalNode as SlangTerminalNode +} from '@nomicfoundation/slang/cst'; import { SlangNode } from './SlangNode.js'; import { YulColonAndEqual } from './YulColonAndEqual.js'; +import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; import type { AstPath, Doc } from 'prettier'; @@ -10,14 +13,14 @@ import type { PrintFunction } from '../types.d.ts'; export class YulAssignmentOperator extends SlangNode { readonly kind = NonterminalKind.YulAssignmentOperator; - variant: YulColonAndEqual | string; + variant: YulColonAndEqual | TerminalNode; constructor(ast: ast.YulAssignmentOperator) { super(ast); const variant = ast.variant; - if (variant instanceof TerminalNode) { - this.variant = variant.unparse(); + if (variant instanceof SlangTerminalNode) { + this.variant = new TerminalNode(variant); return; } this.variant = new YulColonAndEqual(variant); @@ -26,6 +29,6 @@ export class YulAssignmentOperator extends SlangNode { } print(path: AstPath, print: PrintFunction): Doc { - return printVariant(this, path, print); + return path.call(print, 'variant'); } } diff --git a/src/slang-nodes/YulLiteral.ts b/src/slang-nodes/YulLiteral.ts index 8666c0dad..1954cb8d6 100644 --- a/src/slang-nodes/YulLiteral.ts +++ b/src/slang-nodes/YulLiteral.ts @@ -1,18 +1,21 @@ import * as ast from '@nomicfoundation/slang/ast'; -import { NonterminalKind, TerminalNode } from '@nomicfoundation/slang/cst'; -import { printVariant } from '../slang-printers/print-variant.js'; +import { + NonterminalKind, + TerminalNode as SlangTerminalNode +} from '@nomicfoundation/slang/cst'; import { SlangNode } from './SlangNode.js'; import { HexStringLiteral } from './HexStringLiteral.js'; import { StringLiteral } from './StringLiteral.js'; +import { TerminalNode } from './TerminalNode.js'; import type { AstPath, Doc, ParserOptions } from 'prettier'; import type { AstNode } from './types.d.ts'; import type { PrintFunction } from '../types.d.ts'; function createNonterminalVariant( - variant: Exclude, + variant: Exclude, options: ParserOptions -): Exclude { +): Exclude { if (variant instanceof ast.HexStringLiteral) { return new HexStringLiteral(variant, options); } @@ -26,14 +29,14 @@ function createNonterminalVariant( export class YulLiteral extends SlangNode { readonly kind = NonterminalKind.YulLiteral; - variant: HexStringLiteral | StringLiteral | string; + variant: HexStringLiteral | StringLiteral | TerminalNode; constructor(ast: ast.YulLiteral, options: ParserOptions) { super(ast); const variant = ast.variant; - if (variant instanceof TerminalNode) { - this.variant = variant.unparse(); + if (variant instanceof SlangTerminalNode) { + this.variant = new TerminalNode(variant); return; } this.variant = createNonterminalVariant(variant, options); @@ -42,6 +45,6 @@ export class YulLiteral extends SlangNode { } print(path: AstPath, print: PrintFunction): Doc { - return printVariant(this, path, print); + return path.call(print, 'variant'); } } diff --git a/src/slang-nodes/YulStackAssignmentOperator.ts b/src/slang-nodes/YulStackAssignmentOperator.ts index 658e4bf02..a76b11421 100644 --- a/src/slang-nodes/YulStackAssignmentOperator.ts +++ b/src/slang-nodes/YulStackAssignmentOperator.ts @@ -1,7 +1,10 @@ -import { NonterminalKind, TerminalNode } from '@nomicfoundation/slang/cst'; -import { printVariant } from '../slang-printers/print-variant.js'; +import { + NonterminalKind, + TerminalNode as SlangTerminalNode +} from '@nomicfoundation/slang/cst'; import { SlangNode } from './SlangNode.js'; import { YulEqualAndColon } from './YulEqualAndColon.js'; +import { TerminalNode } from './TerminalNode.js'; import type * as ast from '@nomicfoundation/slang/ast'; import type { AstPath, Doc } from 'prettier'; @@ -10,14 +13,14 @@ import type { PrintFunction } from '../types.d.ts'; export class YulStackAssignmentOperator extends SlangNode { readonly kind = NonterminalKind.YulStackAssignmentOperator; - variant: YulEqualAndColon | string; + variant: YulEqualAndColon | TerminalNode; constructor(ast: ast.YulStackAssignmentOperator) { super(ast); const variant = ast.variant; - if (variant instanceof TerminalNode) { - this.variant = variant.unparse(); + if (variant instanceof SlangTerminalNode) { + this.variant = new TerminalNode(variant); return; } this.variant = new YulEqualAndColon(variant); @@ -26,6 +29,6 @@ export class YulStackAssignmentOperator extends SlangNode { } print(path: AstPath, print: PrintFunction): Doc { - return printVariant(this, path, print); + return path.call(print, 'variant'); } } diff --git a/src/slang-printers/print-function.ts b/src/slang-printers/print-function.ts index a379de4c6..745fca53c 100644 --- a/src/slang-printers/print-function.ts +++ b/src/slang-printers/print-function.ts @@ -1,3 +1,4 @@ +import { NonterminalKind } from '@nomicfoundation/slang/cst'; import { doc } from 'prettier'; import { joinExisting } from '../slang-utils/join-existing.js'; @@ -25,7 +26,9 @@ export function printFunction( path.call(print, 'returns') ]), (node as FunctionDefinition).body && - (node as FunctionDefinition).body.variant !== ';' + (!(node as FunctionDefinition).body.variant || + (node as FunctionDefinition).body.variant.kind === + NonterminalKind.Block) ? dedent(line) : '' ]) diff --git a/src/slang-printers/print-variant.ts b/src/slang-printers/print-variant.ts deleted file mode 100644 index 9dced13d2..000000000 --- a/src/slang-printers/print-variant.ts +++ /dev/null @@ -1,11 +0,0 @@ -import type { AstPath, Doc } from 'prettier'; -import type { PolymorphicNode } from '../slang-nodes/types.d.ts'; -import type { PrintFunction } from '../types.d.ts'; - -export function printVariant( - { variant }: PolymorphicNode, - path: AstPath, - print: PrintFunction -): Doc { - return typeof variant === 'string' ? variant : path.call(print, 'variant'); -} diff --git a/src/slang-utils/sort-function-attributes.ts b/src/slang-utils/sort-function-attributes.ts index 3b39415d4..337a706ce 100644 --- a/src/slang-utils/sort-function-attributes.ts +++ b/src/slang-utils/sort-function-attributes.ts @@ -1,4 +1,5 @@ import { NonterminalKind } from '@nomicfoundation/slang/cst'; +import { TerminalNode } from '../slang-nodes/TerminalNode.js'; import type { SortableAttribute } from './types.d.ts'; @@ -15,8 +16,8 @@ export function sortFunctionAttributes( { variant: aVariant }: SortableAttribute, { variant: bVariant }: SortableAttribute ): number { - const aIsString = typeof aVariant === 'string'; - const bIsString = typeof bVariant === 'string'; + const aIsString = aVariant instanceof TerminalNode; + const bIsString = bVariant instanceof TerminalNode; if (aIsString && !bIsString) return -1; if (bIsString && !aIsString) return 1; @@ -24,11 +25,11 @@ export function sortFunctionAttributes( // Both are strings if (aIsString && bIsString) { // Visibility First - if (visibilityKeyWords.has(aVariant)) return -1; - if (visibilityKeyWords.has(bVariant)) return 1; + if (visibilityKeyWords.has(aVariant.value)) return -1; + if (visibilityKeyWords.has(bVariant.value)) return 1; // State Mutability Second - if (mutabilityKeyWords.has(aVariant)) return -1; - if (mutabilityKeyWords.has(bVariant)) return 1; + if (mutabilityKeyWords.has(aVariant.value)) return -1; + if (mutabilityKeyWords.has(bVariant.value)) return 1; // Virtual keyword last } // Both are nodes